From b6ab792db29f627749ae76d929e914e01379c363 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Wed, 1 Oct 2025 03:17:11 +0700 Subject: [PATCH 1/6] Update tag_and_release.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --- .github/workflows/tag_and_release.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tag_and_release.yml b/.github/workflows/tag_and_release.yml index d96e0d46fef..681f171f631 100644 --- a/.github/workflows/tag_and_release.yml +++ b/.github/workflows/tag_and_release.yml @@ -3,7 +3,10 @@ on: push: branches: - 'main' - +permissions: + contents: write + issues: write + pull-requests: write jobs: deploy-to-prod: runs-on: ubuntu-latest @@ -33,7 +36,7 @@ jobs: - name: 🪽 Release uses: actions/create-release@c9ba6969f07ed90fae07e2e66100dd03f9b1a50e env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Or use your PAT with: tag_name: ${{ steps.github-tag-action.outputs.new_tag }} release_name: Release ${{ steps.github-tag-action.outputs.new_tag }} From 23a7ec12c5f593200df3681e0d32a112948b5720 Mon Sep 17 00:00:00 2001 From: Uniswap Labs Service Account Date: Tue, 28 Oct 2025 19:55:37 +0000 Subject: [PATCH 2/6] ci(release): publish latest release --- .gitignore | 7 +- RELEASE | 52 +- VERSION | 2 +- apps/extension/package.json | 1 + apps/extension/src/app/apollo.tsx | 10 +- .../src/app/components/AutoLockProvider.tsx | 3 +- .../src/app/core/StatsigProvider.tsx | 3 +- .../app/core/initStatSigForBrowserScripts.tsx | 3 +- .../useShouldShowBiometricUnlock.ts | 3 +- .../useShouldShowBiometricUnlockEnrollment.ts | 3 +- .../SignTypedDataRequestContent.tsx | 3 +- .../src/app/features/dappRequests/saga.ts | 3 +- .../src/app/features/home/HomeScreen.tsx | 3 +- .../features/home/PortfolioActionButtons.tsx | 3 +- .../src/app/features/home/PortfolioHeader.tsx | 2 +- .../onboarding/import/SelectWallets.tsx | 3 +- .../onboarding/scan/ScanToOnboard.tsx | 2 +- .../app/features/settings/SettingsScreen.tsx | 3 +- .../useIsExtensionPasskeyImportEnabled.ts | 3 +- .../src/entrypoints/sidepanel/main.tsx | 3 + apps/extension/tsconfig.json | 3 + .../deeplinks/deeplink-comprehensive.yaml | 128 +- .../flows/restore/restore-new-device.yaml | 21 +- .../shared-flows/navigate-to-explore.yaml | 23 +- apps/mobile/package.json | 1 + apps/mobile/src/app/App.tsx | 25 +- .../app/MobileWalletNavigationProvider.tsx | 3 +- .../app/modals/BridgedAssetWarningWrapper.tsx | 3 +- apps/mobile/src/app/navigation/navigation.tsx | 3 +- .../tabs/CustomTabBar/CustomTabBar.tsx | 1 + .../navigation/tabs/SwapLongPressModal.tsx | 3 +- .../PriceExplorer/PriceExplorer.tsx | 19 +- .../src/components/PriceExplorer/Text.tsx | 43 +- .../__snapshots__/Text.test.tsx.snap | 9 +- .../components/PriceExplorer/useFiatDelta.tsx | 116 ++ .../src/components/PriceExplorer/usePrice.tsx | 2 +- .../PriceExplorer/usePriceHistory.ts | 2 +- .../ModalWithOverlay/ModalWithOverlay.tsx | 3 +- .../WalletConnectRequestModal.tsx | 3 +- .../Requests/ScanSheet/WalletConnectModal.tsx | 3 +- .../Requests/ScanSheet/util.test.ts | 84 ++ .../src/components/Requests/ScanSheet/util.ts | 29 +- .../src/components/Requests/Uwulink/utils.ts | 14 +- .../TokenDetailsBridgedAssetSection.tsx | 4 +- .../src/components/accounts/AccountHeader.tsx | 5 +- .../components/activity/ActivityContent.tsx | 11 +- .../src/components/carousel/Carousel.tsx | 4 +- .../ExploreSections/ExploreSections.tsx | 3 +- .../search/ExploreScreenSearchResultsList.tsx | 3 +- .../src/components/home/HomeExploreTab.tsx | 3 +- apps/mobile/src/components/home/TokensTab.tsx | 3 +- apps/mobile/src/components/home/hooks.tsx | 17 +- .../home/introCards/FundWalletModal.tsx | 3 +- .../introCards/OnboardingIntroCardStack.tsx | 3 +- .../src/components/layout/TabHelpers.tsx | 3 +- .../components/loading/parts/WaveLoader.tsx | 1 - .../datadog/DatadogProviderWrapper.tsx | 10 +- .../src/features/deepLinking/configUtils.ts | 4 +- .../src/features/deepLinking/deepLinkUtils.ts | 2 +- .../deepLinking/handleDeepLinkSaga.test.ts | 6 +- .../deepLinking/handleDeepLinkSaga.ts | 3 +- .../deepLinking/handleOnRampReturnLinkSaga.ts | 3 +- .../deepLinking/handleTransactionLinkSaga.ts | 3 +- .../features/lockScreen/LockScreenModal.tsx | 3 +- .../src/features/send/SendFormButton.tsx | 3 +- .../src/features/wallet/useWalletRestore.ts | 3 +- .../walletConnect/batchedTransactionSaga.ts | 3 +- .../mobile/src/features/walletConnect/saga.ts | 3 +- apps/mobile/src/screens/ActivityScreen.tsx | 11 +- apps/mobile/src/screens/AppLoadingScreen.tsx | 3 +- apps/mobile/src/screens/ExploreScreen.tsx | 5 +- .../src/screens/HomeScreen/HomeScreen.tsx | 3 +- .../HomeScreen/HomeScreenQuickActions.tsx | 3 +- .../src/screens/Import/ImportMethodScreen.tsx | 3 +- .../screens/Import/OnDeviceRecoveryScreen.tsx | 3 +- .../screens/Import/RestoreMethodScreen.tsx | 3 +- .../src/screens/Import/SelectWalletScreen.tsx | 3 +- .../src/screens/Onboarding/LandingScreen.tsx | 5 +- apps/mobile/src/screens/SettingsScreen.tsx | 3 +- .../mobile/src/screens/TokenDetailsScreen.tsx | 9 +- .../ViewPrivateKeys/ViewPrivateKeysScreen.tsx | 3 +- apps/mobile/tsconfig.json | 3 + apps/web/.eslintrc.js | 26 + apps/web/package.json | 3 +- apps/web/project.json | 4 +- .../images/portfolio_page_promo/dark.png | Bin 0 -> 232460 bytes .../images/portfolio_page_promo/light.png | Bin 0 -> 279063 bytes apps/web/public/pools-sitemap.xml | 20 + apps/web/public/tokens-sitemap.xml | 90 ++ apps/web/src/appGraphql/data/util.tsx | 6 + .../images/portfolio-page-promo/dark.svg | 778 +++++++++++ .../images/portfolio-page-promo/light.svg | 778 +++++++++++ apps/web/src/assets/svg/Emblem/A.svg | 4 + apps/web/src/assets/svg/Emblem/B.svg | 3 + apps/web/src/assets/svg/Emblem/C.svg | 18 + apps/web/src/assets/svg/Emblem/D.svg | 4 + apps/web/src/assets/svg/Emblem/E.svg | 3 + apps/web/src/assets/svg/Emblem/F.svg | 3 + apps/web/src/assets/svg/Emblem/G.svg | 3 + apps/web/src/assets/svg/Emblem/default.svg | 3 + .../AccountDrawer/AuthenticatedHeader.tsx | 3 +- .../AccountDrawer/DisconnectButton.tsx | 3 +- .../Activity/ActivityTab.anvil.e2e.test.ts | 1 + .../MiniPortfolio/ExtensionDeeplinks.tsx | 2 +- .../MiniPortfolio/Pools/PoolsTab.tsx | 2 +- .../MiniPortfolio/PortfolioRow.tsx | 60 +- .../ActivityTable/ActivityAddressCell.tsx | 27 + .../ActivityTable/ActivityAmountCell.tsx | 255 ++++ .../ActivityTable/ActivityTable.tsx | 123 ++ .../ActivityTable/AddressWithAvatar.tsx | 42 + .../src/components/ActivityTable/TimeCell.tsx | 15 + .../ActivityTable/TokenAmountDisplay.tsx | 32 + .../ActivityTable/TransactionTypeCell.tsx | 30 + .../ActivityTable/activityTableModels.ts | 61 + .../src/components/ActivityTable/registry.ts | 246 ++++ .../BridgingPopularTokensBanner.tsx | 108 ++ .../src/components/Banner/shared/Banners.tsx | 13 +- .../D3LiquidityRangeChart.tsx | 10 +- .../components/D3LiquidityMinMaxInput.tsx | 17 +- .../D3LiquidityRangeChart/store/types.ts | 2 +- .../D3LiquidityRangeChart/utils/tickUtils.ts | 2 +- .../D3LiquidityRangeInput.tsx | 7 +- .../Charts/LiquidityChart/index.tsx | 2 +- .../LiquidityPositionRangeChart.tsx | 2 +- .../LiquidityRangeInput.tsx | 2 +- .../Charts/LiquidityRangeInput/hooks.ts | 2 +- .../components/Charts/PriceChart/index.tsx | 66 +- apps/web/src/components/Expand/index.tsx | 59 +- .../FeatureFlagModal/FeatureFlagModal.tsx | 24 +- .../src/components/HelpModal/HelpContent.tsx | 3 +- .../src/components/HelpModal/HelpModal.tsx | 26 +- .../components/Liquidity/ClaimFeeModal.tsx | 2 +- .../components/Liquidity/Create/AddHook.tsx | 2 +- .../components/Liquidity/Create/EditStep.tsx | 2 +- .../Liquidity/Create/FormWrapper.tsx | 2 +- .../Create/PositionOutOfRangeError.tsx | 2 +- .../Liquidity/Create/RangeSelectionStep.tsx | 6 +- .../Liquidity/Create/SelectTokenStep.tsx | 16 +- .../Create/hooks/useDepositInfo.test.ts | 6 +- .../Liquidity/Create/hooks/useDepositInfo.tsx | 2 +- .../hooks/useDerivedPositionInfo.test.ts | 8 +- .../Create/hooks/useDerivedPositionInfo.tsx | 5 +- .../Create/hooks/useLPSlippageValues.test.ts | 6 +- .../Create/hooks/useLPSlippageValues.ts | 5 +- ...seNativeTokenPercentageBufferExperiment.ts | 3 +- .../src/components/Liquidity/Create/types.ts | 14 +- apps/web/src/components/Liquidity/Deposit.tsx | 2 +- .../Liquidity/DisplayCurrentPrice.tsx | 3 +- .../Liquidity/FeeTierSearchModal.tsx | 3 +- .../Liquidity/LiquidityPositionCard.tsx | 5 +- .../Liquidity/LiquidityPositionFeeStats.tsx | 2 +- .../Liquidity/LiquidityPositionInfo.test.tsx | 2 +- .../Liquidity/LiquidityPositionInfo.tsx | 2 +- .../LiquidityPositionInfoBadges.test.tsx | 2 +- .../Liquidity/LiquidityPositionInfoBadges.tsx | 2 +- .../LiquidityPositionStatusIndicator.test.tsx | 2 +- .../LiquidityPositionStatusIndicator.tsx | 2 +- .../Liquidity/PositionPageActionButtons.tsx | 2 +- .../components/Liquidity/PositionsHeader.tsx | 2 +- .../src/components/Liquidity/TokenInfo.tsx | 2 +- .../web/src/components/Liquidity/analytics.ts | 2 +- .../web/src/components/Liquidity/constants.ts | 2 +- .../hooks/useAllFeeTierPoolData.test.tsx | 2 +- .../Liquidity/hooks/useAllFeeTierPoolData.ts | 2 +- apps/web/src/components/Liquidity/types.ts | 2 +- .../Liquidity/utils/currency.test.ts | 2 +- .../components/Liquidity/utils/currency.ts | 2 +- .../Liquidity/utils/feeTiers.test.ts | 2 +- .../components/Liquidity/utils/feeTiers.ts | 2 +- ...etPoolIdOrAddressFromCreatePositionInfo.ts | 2 +- .../Liquidity/utils/getPositionUrl.test.ts | 2 +- .../Liquidity/utils/getPositionUrl.ts | 2 +- .../utils/hasLPFoTTransferError.test.ts | 2 +- .../Liquidity/utils/hasLPFoTTransferError.ts | 2 +- .../Liquidity/utils/parseFromRest.test.ts | 2 +- .../Liquidity/utils/parseFromRest.ts | 2 +- .../Liquidity/utils/priceRangeInfo.test.ts | 2 +- .../Liquidity/utils/priceRangeInfo.ts | 2 +- .../Liquidity/utils/protocolVersion.test.ts | 2 +- .../Liquidity/utils/protocolVersion.ts | 2 +- .../NavBar/CompanyMenu/MenuDropdown.tsx | 27 +- .../NavBar/CompanyMenu/MobileMenuDrawer.tsx | 22 +- .../components/NavBar/CompanyMenu/index.tsx | 2 +- .../NavBar/DownloadApp/Modal/GetStarted.tsx | 3 +- .../NavBar/DownloadApp/Modal/index.tsx | 3 +- .../DownloadApp/NewUserCTAButton.test.tsx | 11 +- .../NavBar/DownloadApp/NewUserCTAButton.tsx | 3 +- .../NavBar/LegalAndPrivacyMenu/index.tsx | 6 +- .../NavBar/NavDropdown/NavDropdown.tsx | 7 +- .../NavBar/SearchBar/SearchModal.tsx | 3 +- .../src/components/NavBar/SearchBar/index.tsx | 3 +- .../NavBar/SearchBar/useIsSearchBarVisible.ts | 3 +- .../components/NavBar/Tabs/TabsContent.tsx | 3 +- apps/web/src/components/NavBar/index.tsx | 3 +- .../Pools/PoolDetails/ChartSection/index.tsx | 4 +- .../Pools/PoolDetails/PoolDetailsHeader.tsx | 3 +- .../PoolDetails/PoolDetailsStatsButtons.tsx | 2 +- .../components/Pools/PoolTable/PoolTable.tsx | 3 +- apps/web/src/components/Popups/PopupItem.tsx | 1 + .../components/Popups/ToastRegularSimple.tsx | 6 +- .../src/components/StatusIcon/index.test.tsx | 11 +- apps/web/src/components/Table/index.tsx | 72 +- .../Tokens/TokenDetails/BalanceSummary.tsx | 7 +- .../TokenDetails/BridgedAssetSection.tsx | 3 +- .../components/Tokens/TokenDetails/Delta.tsx | 26 +- .../__snapshots__/Delta.test.tsx.snap | 10 +- .../components/Tokens/TokenDetails/index.tsx | 2 +- .../WalletModal/DownloadWalletOption.tsx | 3 +- .../WalletModal/UniswapWalletOptions.test.tsx | 30 +- .../WalletModal/WalletConnectorOption.tsx | 3 +- .../UniswapWalletOptions.test.tsx.snap | 4 +- apps/web/src/components/WalletModal/index.tsx | 3 +- .../Web3Provider/WebUniswapContext.tsx | 3 +- .../Web3Provider/rejectableConnector.ts | 52 + .../Web3Provider/wagmiAutoConnect.ts | 4 +- .../components/Web3Provider/wagmiConfig.ts | 5 +- .../Web3Status/RecentlyConnectedModal.tsx | 3 +- apps/web/src/components/Web3Status/index.tsx | 3 +- apps/web/src/dev/DevFlagsBox.tsx | 5 +- .../src/featureFlags/flags/outageBanner.ts | 3 +- .../useFeatureFlagUrlOverrides.tsx | 3 +- .../features/accounts/store/provider.test.tsx | 8 +- .../src/features/accounts/store/provider.tsx | 3 +- .../src/features/accounts/store/updater.tsx | 3 +- .../connection/connectors/solana.test.ts | 3 +- .../hooks/useOrderedWalletConnectors.test.ts | 14 +- .../hooks/useOrderedWalletConnectors.ts | 3 +- .../providers/ExternalWalletProvider.tsx | 3 +- apps/web/src/hooks/useConfirmModalState.ts | 20 +- .../hooks/useIsUniswapExtensionConnected.ts | 3 +- .../src/hooks/useIsUniswapXSupportedChain.ts | 3 +- .../hooks/useLpIncentivesFormattedEarnings.ts | 5 +- apps/web/src/hooks/usePoolTickData.ts | 2 +- apps/web/src/hooks/usePositionTokenURI.ts | 2 +- apps/web/src/index.tsx | 5 +- .../hooks/routing/useRoutingAPIArguments.ts | 3 +- apps/web/src/lib/utils/analytics.ts | 8 +- .../pages/App/WalletConnection.e2e.test.ts | 2 +- .../CreateLiquidityContextProvider.tsx | 5 +- .../CreatePosition.anvil.e2e.test.ts | 7 +- .../CreatePosition/CreatePosition.e2e.test.ts | 8 +- .../pages/CreatePosition/CreatePosition.tsx | 2 +- .../CreatePosition/CreatePositionModal.tsx | 2 +- .../CreatePositionTxContext.test.ts | 2 +- .../CreatePositionTxContext.tsx | 2 +- apps/web/src/pages/Errors.anvil.e2e.test.ts | 18 +- apps/web/src/pages/Explore/ProtocolFilter.tsx | 2 +- apps/web/src/pages/Explore/redirects.tsx | 3 +- .../useExternallyConnectableExtensionId.ts | 3 +- .../IncreaseLiquidity.anvil.e2e.test.ts | 2 +- .../IncreaseLiquidityForm.tsx | 2 +- .../IncreaseLiquidityReview.tsx | 2 +- .../IncreaseLiquidityTxContext.tsx | 2 +- .../hooks/useDerivedIncreaseLiquidityInfo.ts | 2 +- .../web/src/pages/Landing/sections/Footer.tsx | 6 +- apps/web/src/pages/Landing/sections/Hero.tsx | 2 +- apps/web/src/pages/LegacyPool/redirects.tsx | 2 +- .../web/src/pages/MigrateV2/MigrateV2Pair.tsx | 2 +- .../MigrateV3/MigrateV3.anvil.e2e.test.ts | 2 +- .../src/pages/MigrateV3/MigrateV3.e2e.test.ts | 2 +- .../MigrateV3/MigrateV3LiquidityTxContext.tsx | 2 +- .../MigrateV3/hooks/useInitialPosition.ts | 2 +- apps/web/src/pages/MigrateV3/index.tsx | 2 +- apps/web/src/pages/PoolDetails/index.tsx | 3 +- .../src/pages/Portfolio/Activity/Activity.tsx | 137 +- .../pages/Portfolio/Activity/Filters/utils.ts | 104 +- .../pages/Portfolio/ConnectWalletBanner.tsx | 124 ++ .../Portfolio/ConnectWalletBottomOverlay.tsx | 47 + .../src/pages/Portfolio/ConnectWalletView.tsx | 41 - .../web/src/pages/Portfolio/Header/Header.tsx | 30 +- .../ConnectedAddressDisplay.tsx | 39 + .../DemoAddressDisplay.tsx | 37 + .../PortfolioAddressDisplay.tsx | 9 + .../Portfolio/Header/hooks/useIsConnected.ts | 7 + apps/web/src/pages/Portfolio/NFTs/NFTCard.tsx | 144 ++ apps/web/src/pages/Portfolio/NFTs/Nfts.tsx | 75 + .../Portfolio/NFTs/utils/filterNfts.test.ts | 257 ++++ .../pages/Portfolio/NFTs/utils/filterNfts.ts | 32 + apps/web/src/pages/Portfolio/Nfts.tsx | 30 - apps/web/src/pages/Portfolio/Portfolio.tsx | 101 +- .../src/pages/Portfolio/PortfolioContent.tsx | 42 + .../Portfolio/PortfolioDisconnectedView.tsx | 105 ++ .../Tokens/Table/TokensContextMenuWrapper.tsx | 4 +- .../Portfolio/Tokens/Table/TokensTable.tsx | 56 + .../Table/{Table.tsx => TokensTableInner.tsx} | 73 +- .../Tokens/Table/columns/Balance.tsx | 2 +- .../web/src/pages/Portfolio/Tokens/Tokens.tsx | 121 +- .../hooks/useTransformTokenTableData.ts | 74 +- .../Tokens/utils/filterTokensBySearch.test.ts | 280 ++++ .../Tokens/utils/filterTokensBySearch.ts | 28 + .../Portfolio/hooks/usePortfolioAddress.ts | 13 + .../Positions/ClaimFees.anvil.e2e.test.ts | 2 +- apps/web/src/pages/Positions/PositionPage.tsx | 5 +- apps/web/src/pages/Positions/TopPools.tsx | 3 +- .../src/pages/Positions/V2PositionPage.tsx | 5 +- apps/web/src/pages/Positions/index.tsx | 5 +- .../RemoveLiquidity.anvil.e2e.test.ts | 2 +- .../RemoveLiquidityModalContext.tsx | 2 +- .../RemoveLiquidity/RemoveLiquidityReview.tsx | 2 +- .../hooks/useRemoveLiquidityTxAndGasInfo.ts | 2 +- apps/web/src/pages/RouteDefinitions.tsx | 3 +- apps/web/src/pages/Swap/Buy/Buy.e2e.test.ts | 3 + apps/web/src/pages/Swap/Buy/hooks.ts | 3 +- .../web/src/pages/Swap/Fees.anvil.e2e.test.ts | 1 + apps/web/src/pages/Swap/Fees.e2e.test.ts | 4 +- apps/web/src/pages/Swap/Limit/LimitForm.tsx | 3 +- .../src/pages/Swap/Logging.anvil.e2e.test.ts | 1 + .../Swap/Send/NewAddressSpeedBump.test.tsx | 3 +- apps/web/src/pages/Swap/Send/SendForm.tsx | 3 +- .../web/src/pages/Swap/Swap.anvil.e2e.test.ts | 22 +- apps/web/src/pages/Swap/index.tsx | 46 +- .../pages/Swap/settings/useWebSwapSettings.ts | 3 +- .../web/src/playwright/anvil/anvil-manager.ts | 4 +- apps/web/src/playwright/fixtures/anvil.ts | 13 +- .../web/src/playwright/fixtures/tradingApi.ts | 12 +- apps/web/src/setupTests.ts | 7 +- .../state/activity/polling/transactions.ts | 3 +- .../src/state/explore/protocolStats.test.tsx | 9 +- apps/web/src/state/explore/topPools.ts | 2 +- apps/web/src/state/limit/hooks.ts | 3 +- .../state/routing/useRoutingAPITrade.test.ts | 3 +- .../state/sagas/liquidity/liquiditySaga.ts | 3 +- apps/web/src/state/sagas/root.ts | 2 + apps/web/src/state/sagas/transactions/5792.ts | 4 +- .../src/state/sagas/transactions/solana.ts | 72 +- .../src/state/sagas/transactions/swapSaga.ts | 104 +- .../src/state/sagas/transactions/uniswapx.ts | 2 +- .../web/src/state/sagas/transactions/utils.ts | 45 +- .../src/state/sagas/transactions/wrapSaga.ts | 4 +- apps/web/src/state/swap/hooks.test.tsx | 114 +- apps/web/src/state/swap/hooks.tsx | 25 +- apps/web/src/state/transactions/types.ts | 6 +- .../hooks/useMismatchAccount.ts | 3 +- .../hooks/useWalletGetCapabilitiesMutation.ts | 3 +- .../src/utils/computeSurroundingTicks.test.ts | 2 +- apps/web/src/utils/computeSurroundingTicks.ts | 2 +- apps/web/tsconfig.json | 3 + apps/web/vite.config.mts | 2 +- bun.lock | 300 ++-- config/jest-presets/jest/jest-preset.js | 2 +- config/jest-presets/jest/setup.js | 54 +- config/vitest-presets/vitest/vitest-preset.js | 1 - dangerfile.ts | 2 +- nx.json | 30 +- package.json | 41 +- packages/api/package.json | 3 +- .../api/src/clients/graphql/queries.graphql | 6 + .../api/src/clients/graphql/schema.graphql | 59 +- .../createNotificationsApiClient.ts | 49 + .../api/src/clients/notifications/types.ts | 38 + .../api/src/clients/trading/tradeTypes.ts | 4 +- packages/api/src/connectRpc/utils.ts | 2 +- packages/api/src/index.ts | 12 +- packages/biome-config/base.jsonc | 12 +- packages/gating/.eslintrc.js | 46 + packages/gating/README.md | 3 + packages/gating/package.json | 31 + packages/gating/project.json | 16 + .../src}/LocalOverrideAdapterWrapper.ts | 2 +- .../features/gating => gating/src}/configs.ts | 61 +- .../gating => gating/src}/constants.ts | 0 .../gating => gating/src}/experiments.ts | 10 + .../features/gating => gating/src}/flags.ts | 2 + .../src}/getStatsigEnvName.ts | 0 .../features/gating => gating/src}/hooks.ts | 10 +- packages/gating/src/index.ts | 86 ++ .../src}/sdk/statsig.native.ts | 6 +- .../gating => gating/src}/sdk/statsig.ts | 2 +- .../features/gating => gating/src}/utils.ts | 2 +- packages/gating/tsconfig.json | 19 + packages/gating/tsconfig.lint.json | 8 + packages/notifications/.eslintrc.js | 45 + packages/notifications/README.md | 73 + packages/notifications/package.json | 18 + packages/notifications/project.json | 16 + packages/notifications/src/index.ts | 0 packages/notifications/tsconfig.json | 12 + packages/notifications/tsconfig.lint.json | 8 + .../graphics/bridged-assets-v2-web-banner.png | Bin 0 -> 128449 bytes packages/ui/src/assets/index.ts | 1 + .../components/swipeablecards/BaseCard.tsx | 2 +- .../src/components/switch/Switch.native.tsx | 2 +- packages/ui/src/loading/Shine.native.tsx | 2 +- packages/ui/src/loading/Skeleton.native.tsx | 1 - .../ui/src/loading/SpinningLoader.native.tsx | 2 +- packages/uniswap/jest-package-mocks.js | 6 +- packages/uniswap/package.json | 10 +- .../BridgedAsset/BridgedAssetModal.tsx | 10 +- .../components/BridgedAsset/WormholeModal.tsx | 17 +- .../src/components/BridgedAsset/utils.ts | 23 - .../AmountInputPresets/AmountInputPresets.tsx | 37 +- .../AmountInputPresets/types.ts | 13 +- .../CurrencyInputPanel/CurrencyInputPanel.tsx | 31 +- .../CurrencyInputPanelHeader.tsx | 31 +- .../TokenSelector/TokenSelector.tsx | 3 +- .../TokenSelector/TokenSelectorList.tsx | 3 +- .../components/TokenSelector/hooks.test.ts | 31 +- .../details/TransactionDetailsModal.test.tsx | 3 +- .../SwapTransactionDetails.test.tsx | 3 +- .../TransferTransactionDetails.test.tsx | 3 +- .../gating/DynamicConfigDropdown.tsx | 4 +- .../src/components/gating/GatingOverrides.tsx | 23 +- .../uniswap/src/components/gating/Rows.tsx | 3 +- .../gating/dynamicConfigOverrides.tsx | 2 +- .../lists/items/pools/PoolOptionItem.tsx | 2 +- .../items/pools/PoolOptionItemContextMenu.tsx | 2 +- .../usePoolSearchResultsToPoolOptions.tsx | 2 +- .../items/pools/usePoolStatsToPoolOptions.tsx | 2 +- .../src/components/lists/items/types.ts | 2 +- .../uniswap/src/components/nfts/NftView.tsx | 6 +- .../uniswap/src/components/nfts/NftsList.tsx | 7 +- .../src/components/nfts/NftsList.web.tsx | 66 +- .../NotificationToast.native.tsx | 4 +- .../apiClients/tradingApi/TradingApiClient.ts | 3 +- .../apiClients/uniswapApi/useGasFeeQuery.ts | 2 +- .../conversionTracking/useConversionProxy.ts | 3 +- .../useConversionTracking.ts | 3 +- packages/uniswap/src/data/rest/getPair.ts | 19 - packages/uniswap/src/data/rest/getPools.ts | 4 +- .../uniswap/src/data/rest/getPoolsRewards.ts | 4 +- .../uniswap/src/data/rest/getPortfolio.ts | 5 +- packages/uniswap/src/data/rest/getPosition.ts | 4 +- .../uniswap/src/data/rest/getPositions.ts | 6 +- .../data/rest/portfolioBalanceOverrides.ts | 21 +- .../src/data/rest/searchTokensAndPools.ts | 61 +- .../activity/formatTransactionsByDate.ts | 21 +- .../src/features/behaviorHistory/slice.ts | 6 + .../src/features/chains/evm/info/avalanche.ts | 2 +- .../src/features/chains/evm/info/celo.ts | 2 +- .../src/features/chains/evm/info/mainnet.ts | 2 +- .../src/features/chains/evm/info/monad.ts | 2 +- .../src/features/chains/evm/info/polygon.ts | 2 +- .../src/features/chains/gasDefaults.ts | 2 +- .../chains/hooks/useFeatureFlaggedChainIds.ts | 3 +- .../features/chains/hooks/useNewChainIds.ts | 3 +- .../chains/hooks/useOrderedChainIds.ts | 3 +- packages/uniswap/src/features/chains/types.ts | 2 +- .../src/features/dataApi/balances/balances.ts | 31 +- .../features/dataApi/balances/balancesRest.ts | 3 +- .../tokenProjects/tokenProjects.test.tsx | 14 +- .../utils/tokenProjectToCurrencyInfos.test.ts | 2 + .../utils/tokenProjectToCurrencyInfos.ts | 5 +- .../uniswap/src/features/dataApi/types.ts | 5 + .../utils/gqlTokenToCurrencyInfo.test.ts | 2 + .../dataApi/utils/gqlTokenToCurrencyInfo.ts | 5 +- .../hooks/useFormatChartFiatDelta.ts | 31 + .../priceChart/formatters/shared/types.ts | 37 + .../priceChart/formatters/shared/utils.ts | 93 ++ .../formatters/stablecoinFormatter.ts | 84 ++ .../formatters/standardFormatter.ts | 88 ++ .../priceChart/priceChartConversion.test.ts | 1204 +++++++++++++++++ .../priceChart/priceChartConversion.ts | 42 + .../hooks/useForceUpgradeStatus.ts | 3 +- .../hooks/useForceUpgradeTranslations.ts | 8 +- packages/uniswap/src/features/gas/hooks.ts | 3 +- .../gas/hooks/useMaxAmountSpend.test.ts | 3 +- .../features/gas/hooks/useMaxAmountSpend.ts | 3 +- packages/uniswap/src/features/gas/utils.ts | 8 +- .../gating/StatsigProviderWrapper.tsx | 8 +- .../src/features/gating/statsigBaseConfig.ts | 3 +- .../uniswap/src/features/gating/typeGuards.ts | 2 +- .../uniswap/src/features/language/hooks.tsx | 2 +- .../nfts/hooks/useNftContextMenuItems.tsx | 3 +- .../passkey/hooks/useEmbeddedWalletBaseUrl.ts | 3 +- .../PortfolioBalance/PortfolioBalance.tsx | 35 +- .../uniswap/src/features/portfolio/api.ts | 3 +- .../isInstantTokenBalanceUpdateEnabled.ts | 3 +- .../rest/fetchOnChainBalancesRest.test.ts | 66 +- .../rest/fetchOnChainBalancesRest.ts | 87 +- ...estQueriesViaOnchainOverrideVariantSaga.ts | 16 +- .../src/features/providers/rpcUrlSelector.ts | 3 +- .../features/search/SearchHistoryResult.ts | 2 +- .../search/SearchModal/analytics/analytics.ts | 2 +- .../SearchModal/hooks/useFilterCallbacks.ts | 86 +- .../src/features/settings/hooks.test.ts | 3 +- .../smartWallet/mismatch/MismatchContext.tsx | 3 +- .../telemetry/constants/trace/element.ts | 2 + .../telemetry/constants/trace/section.ts | 1 + .../features/telemetry/constants/uniswap.ts | 7 +- .../uniswap/src/features/telemetry/types.ts | 4 + .../utils/logExperimentQualifyingEvent.ts | 9 + .../useBlockaidFeeComparisonAnalytics.ts | 3 +- .../DecimalPadInput/DecimalPad.native.tsx | 2 +- .../TransactionSettingsRow.tsx | 3 +- .../slippage/useSlippageSettings.ts | 2 +- .../transactions/components/settings/types.ts | 2 +- .../hooks/useGetCanSignPermits.ts | 3 +- .../hooks/useGetSwapDelegationAddress.ts | 3 +- .../hooks/usePollingIntervalByChain.ts | 4 +- .../features/transactions/liquidity/types.ts | 2 +- .../src/features/transactions/steps/types.ts | 49 + .../SlippageInfo/SlippageInfoCaption.tsx | 2 +- .../hooks/useSwapFormButtonText.ts | 3 +- .../TradeRoutingPreferenceScreen.tsx | 4 +- .../AnimatedTokenFlip.tsx | 2 +- .../GradientContainer.native.tsx | 2 +- .../GradientContainer.web.tsx | 2 +- .../useReceiptSuccessHandler.ts | 24 +- .../hooks/receiptFetching/utils.ts | 78 ++ .../SwapFormDecimalPad.native.tsx | 31 +- .../swap/hooks/useIsForFiltersEnabled.ts | 3 +- .../hooks/useIsUnichainFlashblocksEnabled.ts | 129 +- .../swap/hooks/useNeedsBridgedAssetWarning.ts | 10 +- .../swap/hooks/usePriceUXEnabled.ts | 3 +- .../transactions/swap/plan/planSaga.ts | 243 ++++ .../swap/plan/planStepTransformer.ts | 62 + .../features/transactions/swap/plan/utils.ts | 35 + .../hooks/useCreateSwapReviewCallbacks.tsx | 3 +- .../services/swapTxAndGasInfoService/hooks.ts | 3 +- .../swapFormStore/hooks/useDerivedSwapInfo.ts | 3 +- .../SwapTxStoreContextProvider.tsx | 3 +- .../hooks/useTransactionRequestInfo.test.ts | 4 +- .../hooks/useTransactionRequestInfo.ts | 4 +- .../features/transactions/swap/types/trade.ts | 1 + .../swap/utils/getIsWebForNudgeEnabled.ts | 3 +- .../transactions/swap/utils/protocols.test.ts | 6 +- .../transactions/swap/utils/protocols.ts | 4 +- .../transactions/swap/utils/routing.ts | 12 +- .../features/transactions/swap/utils/trade.ts | 10 + .../swap/utils/tradingApi.test.ts | 5 +- .../transactions/swap/utils/tradingApi.ts | 3 +- .../features/unitags/ClaimUnitagContent.tsx | 18 +- .../src/i18n/locales/source/en-US.json | 26 +- .../src/i18n/locales/translations/af-ZA.json | 3 +- .../src/i18n/locales/translations/ar-SA.json | 3 +- .../src/i18n/locales/translations/ca-ES.json | 3 +- .../src/i18n/locales/translations/da-DK.json | 3 +- .../src/i18n/locales/translations/el-GR.json | 3 +- .../src/i18n/locales/translations/es-ES.json | 28 +- .../src/i18n/locales/translations/fi-FI.json | 3 +- .../src/i18n/locales/translations/fil-PH.json | 28 +- .../src/i18n/locales/translations/fr-FR.json | 28 +- .../src/i18n/locales/translations/he-IL.json | 3 +- .../src/i18n/locales/translations/hi-IN.json | 3 +- .../src/i18n/locales/translations/hu-HU.json | 3 +- .../src/i18n/locales/translations/id-ID.json | 28 +- .../src/i18n/locales/translations/it-IT.json | 3 +- .../src/i18n/locales/translations/ja-JP.json | 28 +- .../src/i18n/locales/translations/ko-KR.json | 28 +- .../src/i18n/locales/translations/ms-MY.json | 3 +- .../src/i18n/locales/translations/nl-NL.json | 28 +- .../src/i18n/locales/translations/pl-PL.json | 3 +- .../src/i18n/locales/translations/pt-PT.json | 28 +- .../src/i18n/locales/translations/ru-RU.json | 28 +- .../src/i18n/locales/translations/sl-SI.json | 3 +- .../src/i18n/locales/translations/sr-SP.json | 3 +- .../src/i18n/locales/translations/sv-SE.json | 3 +- .../src/i18n/locales/translations/sw-TZ.json | 3 +- .../src/i18n/locales/translations/tr-TR.json | 28 +- .../src/i18n/locales/translations/uk-UA.json | 3 +- .../src/i18n/locales/translations/ur-PK.json | 3 +- .../src/i18n/locales/translations/vi-VN.json | 28 +- .../src/i18n/locales/translations/zh-CN.json | 28 +- .../src/i18n/locales/translations/zh-TW.json | 28 +- packages/uniswap/src/state/oldTypes.ts | 2 +- .../src/test/fixtures/gql/assets/tokens.ts | 2 + packages/uniswap/src/test/fixtures/testIDs.ts | 2 + packages/uniswap/src/test/mocks/gql/mocks.ts | 2 + packages/uniswap/src/utils/datadog.web.ts | 17 +- .../search/doesTokenMatchSearchTerm.test.ts | 419 ++++++ .../utils/search/doesTokenMatchSearchTerm.ts | 37 + ...etPossibleChainMatchFromSearchWord.test.ts | 437 ++++++ .../getPossibleChainMatchFromSearchWord.ts | 47 + .../parseChainFromTokenSearchQuery.test.ts | 138 ++ .../search/parseChainFromTokenSearchQuery.ts | 81 ++ packages/uniswap/tsconfig.json | 3 + packages/wallet/package.json | 3 +- .../components/landing/LandingBackground.tsx | 4 +- .../smartWallet/smartAccounts/hooks.ts | 3 +- .../src/features/gating/userPropertyHooks.ts | 2 +- .../smartWallet/hooks/useNetworkBalances.tsx | 2 +- .../contexts/WalletUniswapContext.tsx | 3 +- .../services/featureFlagService.ts | 4 +- .../services/featureFlagServiceImpl.ts | 4 +- .../transactionConfigServiceImpl.test.ts | 2 +- .../services/transactionConfigServiceImpl.ts | 3 +- .../executeTransaction/tryGetNonce.ts | 12 +- .../transactions/send/TokenSelectorPanel.tsx | 1 - .../transactions/swap/confirmation.ts | 3 +- .../transactions/swap/executeSwapSaga.ts | 3 +- .../swap/hooks/useSwapHandlers.ts | 3 +- .../swap/modals/QueuedOrderModal.tsx | 3 +- .../swap/prepareAndSignSwapSaga.test.ts | 3 +- .../swap/prepareAndSignSwapSaga.ts | 3 +- .../swap/settings/SwapProtection.tsx | 2 +- .../transactions/swap/swapSaga.test.ts | 3 +- .../features/transactions/swap/swapSaga.ts | 22 +- .../watcher/transactionFinalizationSaga.ts | 3 +- .../watchOnChainTransactionSaga.test.ts | 3 +- .../watcher/watchOnChainTransactionSaga.ts | 3 +- packages/wallet/tsconfig.json | 3 + scripts/clean.sh | 88 +- scripts/remove-local-packages.sh | 14 + .../src/generators/package/files/biome.json | 6 - .../generators/package/files/tsconfig.json | 2 +- .../src/generators/package/package.ts | 28 +- tsconfig.base.json | 4 +- tsconfig.json | 6 + 598 files changed, 11278 insertions(+), 2162 deletions(-) create mode 100644 apps/mobile/src/components/PriceExplorer/useFiatDelta.tsx create mode 100644 apps/web/public/images/portfolio_page_promo/dark.png create mode 100644 apps/web/public/images/portfolio_page_promo/light.png create mode 100644 apps/web/src/assets/images/portfolio-page-promo/dark.svg create mode 100644 apps/web/src/assets/images/portfolio-page-promo/light.svg create mode 100644 apps/web/src/assets/svg/Emblem/A.svg create mode 100644 apps/web/src/assets/svg/Emblem/B.svg create mode 100644 apps/web/src/assets/svg/Emblem/C.svg create mode 100644 apps/web/src/assets/svg/Emblem/D.svg create mode 100644 apps/web/src/assets/svg/Emblem/E.svg create mode 100644 apps/web/src/assets/svg/Emblem/F.svg create mode 100644 apps/web/src/assets/svg/Emblem/G.svg create mode 100644 apps/web/src/assets/svg/Emblem/default.svg create mode 100644 apps/web/src/components/ActivityTable/ActivityAddressCell.tsx create mode 100644 apps/web/src/components/ActivityTable/ActivityAmountCell.tsx create mode 100644 apps/web/src/components/ActivityTable/ActivityTable.tsx create mode 100644 apps/web/src/components/ActivityTable/AddressWithAvatar.tsx create mode 100644 apps/web/src/components/ActivityTable/TimeCell.tsx create mode 100644 apps/web/src/components/ActivityTable/TokenAmountDisplay.tsx create mode 100644 apps/web/src/components/ActivityTable/TransactionTypeCell.tsx create mode 100644 apps/web/src/components/ActivityTable/activityTableModels.ts create mode 100644 apps/web/src/components/ActivityTable/registry.ts create mode 100644 apps/web/src/components/Banner/BridgingPopularTokens/BridgingPopularTokensBanner.tsx create mode 100644 apps/web/src/components/Web3Provider/rejectableConnector.ts create mode 100644 apps/web/src/pages/Portfolio/ConnectWalletBanner.tsx create mode 100644 apps/web/src/pages/Portfolio/ConnectWalletBottomOverlay.tsx delete mode 100644 apps/web/src/pages/Portfolio/ConnectWalletView.tsx create mode 100644 apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/ConnectedAddressDisplay.tsx create mode 100644 apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/DemoAddressDisplay.tsx create mode 100644 apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/PortfolioAddressDisplay.tsx create mode 100644 apps/web/src/pages/Portfolio/Header/hooks/useIsConnected.ts create mode 100644 apps/web/src/pages/Portfolio/NFTs/NFTCard.tsx create mode 100644 apps/web/src/pages/Portfolio/NFTs/Nfts.tsx create mode 100644 apps/web/src/pages/Portfolio/NFTs/utils/filterNfts.test.ts create mode 100644 apps/web/src/pages/Portfolio/NFTs/utils/filterNfts.ts delete mode 100644 apps/web/src/pages/Portfolio/Nfts.tsx create mode 100644 apps/web/src/pages/Portfolio/PortfolioContent.tsx create mode 100644 apps/web/src/pages/Portfolio/PortfolioDisconnectedView.tsx create mode 100644 apps/web/src/pages/Portfolio/Tokens/Table/TokensTable.tsx rename apps/web/src/pages/Portfolio/Tokens/Table/{Table.tsx => TokensTableInner.tsx} (66%) create mode 100644 apps/web/src/pages/Portfolio/Tokens/utils/filterTokensBySearch.test.ts create mode 100644 apps/web/src/pages/Portfolio/Tokens/utils/filterTokensBySearch.ts create mode 100644 apps/web/src/pages/Portfolio/hooks/usePortfolioAddress.ts create mode 100644 packages/api/src/clients/notifications/createNotificationsApiClient.ts create mode 100644 packages/api/src/clients/notifications/types.ts create mode 100644 packages/gating/.eslintrc.js create mode 100644 packages/gating/README.md create mode 100644 packages/gating/package.json create mode 100644 packages/gating/project.json rename packages/{uniswap/src/features/gating => gating/src}/LocalOverrideAdapterWrapper.ts (95%) rename packages/{uniswap/src/features/gating => gating/src}/configs.ts (81%) rename packages/{uniswap/src/features/gating => gating/src}/constants.ts (100%) rename packages/{uniswap/src/features/gating => gating/src}/experiments.ts (83%) rename packages/{uniswap/src/features/gating => gating/src}/flags.ts (98%) rename packages/{uniswap/src/features/gating => gating/src}/getStatsigEnvName.ts (100%) rename packages/{uniswap/src/features/gating => gating/src}/hooks.ts (95%) create mode 100644 packages/gating/src/index.ts rename packages/{uniswap/src/features/gating => gating/src}/sdk/statsig.native.ts (83%) rename packages/{uniswap/src/features/gating => gating/src}/sdk/statsig.ts (92%) rename packages/{uniswap/src/features/gating => gating/src}/utils.ts (92%) create mode 100644 packages/gating/tsconfig.json create mode 100644 packages/gating/tsconfig.lint.json create mode 100644 packages/notifications/.eslintrc.js create mode 100644 packages/notifications/README.md create mode 100644 packages/notifications/package.json create mode 100644 packages/notifications/project.json create mode 100644 packages/notifications/src/index.ts create mode 100644 packages/notifications/tsconfig.json create mode 100644 packages/notifications/tsconfig.lint.json create mode 100644 packages/ui/src/assets/graphics/bridged-assets-v2-web-banner.png delete mode 100644 packages/uniswap/src/components/BridgedAsset/utils.ts delete mode 100644 packages/uniswap/src/data/rest/getPair.ts create mode 100644 packages/uniswap/src/features/fiatCurrency/hooks/useFormatChartFiatDelta.ts create mode 100644 packages/uniswap/src/features/fiatCurrency/priceChart/formatters/shared/types.ts create mode 100644 packages/uniswap/src/features/fiatCurrency/priceChart/formatters/shared/utils.ts create mode 100644 packages/uniswap/src/features/fiatCurrency/priceChart/formatters/stablecoinFormatter.ts create mode 100644 packages/uniswap/src/features/fiatCurrency/priceChart/formatters/standardFormatter.ts create mode 100644 packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.test.ts create mode 100644 packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.ts create mode 100644 packages/uniswap/src/features/telemetry/utils/logExperimentQualifyingEvent.ts create mode 100644 packages/uniswap/src/features/transactions/swap/plan/planSaga.ts create mode 100644 packages/uniswap/src/features/transactions/swap/plan/planStepTransformer.ts create mode 100644 packages/uniswap/src/features/transactions/swap/plan/utils.ts create mode 100644 packages/uniswap/src/utils/search/doesTokenMatchSearchTerm.test.ts create mode 100644 packages/uniswap/src/utils/search/doesTokenMatchSearchTerm.ts create mode 100644 packages/uniswap/src/utils/search/getPossibleChainMatchFromSearchWord.test.ts create mode 100644 packages/uniswap/src/utils/search/getPossibleChainMatchFromSearchWord.ts create mode 100644 packages/uniswap/src/utils/search/parseChainFromTokenSearchQuery.test.ts create mode 100644 packages/uniswap/src/utils/search/parseChainFromTokenSearchQuery.ts create mode 100755 scripts/remove-local-packages.sh delete mode 100644 tools/uniswap-nx/src/generators/package/files/biome.json diff --git a/.gitignore b/.gitignore index 3b3a172871a..b3c573b208b 100644 --- a/.gitignore +++ b/.gitignore @@ -76,9 +76,10 @@ CLAUDE.local.md # lefthook .lefthook/ - - +# Nx .nx/cache .nx/workspace-data -.cursor/rules/nx-rules.mdc .github/instructions/nx.instructions.md + +# Spec Workflow MCP +.spec-workflow/ diff --git a/RELEASE b/RELEASE index 80f8e3ca3e2..12680356c4b 100644 --- a/RELEASE +++ b/RELEASE @@ -1,6 +1,6 @@ IPFS hash of the deployment: -- CIDv0: `QmZmRjJXcRL1HVbuFBLX23qqmQydzmqGsLmb94qrqTU9A7` -- CIDv1: `bafybeifjzfti2rq27be42zfwqnturszxqyecs4zxklxxr4pejgcgi72eja` +- CIDv0: `QmUF5sYAgjigJ6D7nE6p12SG1rFrwYLidKxeX52qBN1Pce` +- CIDv1: `bafybeicxxeljdmh6f2s3xo43piks2h7ibgm6hbfoo3ftc5wjfmqfsngghm` The latest release is always mirrored at [app.uniswap.org](https://app.uniswap.org). @@ -10,14 +10,54 @@ You can also access the Uniswap Interface from an IPFS gateway. Your Uniswap settings are never remembered across different URLs. IPFS gateways: -- https://bafybeifjzfti2rq27be42zfwqnturszxqyecs4zxklxxr4pejgcgi72eja.ipfs.dweb.link/ -- [ipfs://QmZmRjJXcRL1HVbuFBLX23qqmQydzmqGsLmb94qrqTU9A7/](ipfs://QmZmRjJXcRL1HVbuFBLX23qqmQydzmqGsLmb94qrqTU9A7/) +- https://bafybeicxxeljdmh6f2s3xo43piks2h7ibgm6hbfoo3ftc5wjfmqfsngghm.ipfs.dweb.link/ +- [ipfs://QmUF5sYAgjigJ6D7nE6p12SG1rFrwYLidKxeX52qBN1Pce/](ipfs://QmUF5sYAgjigJ6D7nE6p12SG1rFrwYLidKxeX52qBN1Pce/) -## 5.115.0 (2025-10-24) +## 5.116.0 (2025-10-28) ### Features -* **web:** special case metamask dual vm connection flow (#24756) (#24789) b21eafd +* **web:** add activity table to the tab with real data (#23506) f00228c +* **web:** Add createRejectableMockConnector util to force tx rejection (#24574) 3b3b2b7 +* **web:** add demo account support for activity tab (#24639) 9ec0194 +* **web:** add disconnected portfolio view (#23690) 7a1b085 +* **web:** add fiat to price chart (#23577) fab99ce +* **web:** add hidden tokens table rows (#23535) 291fab3 +* **web:** add loading state to tokens table (#23544) ed5ced8 +* **web:** add more & better filtering + transaction parsing (#24579) 205c03d +* **web:** add v2 bridged asset banner (#24734) 4666868 +* **web:** disconnected view B version (#24630) 46ca828 +* **web:** Help Modal styling nits (#24547) ae252e6 +* **web:** NFTs tab (#23604) a438b54 +* **web:** small style nits for Company menu (#24318) 4d71e08 +* **web:** special case metamask dual vm connection flow (#24756) faabc72 +* **web:** tokens table search (#23509) b83fc75 +* **web:** update CompanyMenu arrangement on tablet width (#24312) 758f68d + + +### Bug Fixes + +* **web:** default to mainnet for limits flow [STAGING] (#24885) 5a8e150 +* **web:** Fix CreatePosition e2e anvil test (#24573) d68b011 +* **web:** Fix e2e anvil tests missing quote stub (#24590) 838d5bd +* **web:** Fix limit order chain switch bug (#23064) b11176d +* **web:** Fix Swap e2e anvil tests (#24662) 26adf5c +* **web:** fixes pools tab loader skeletons (#24472) 2f887aa +* **web:** Increase anvil manager timeout (#24623) 466eb69 +* **web:** log interface swap finalization results for flashblocks (#24869) bf30270 +* **web:** support chain filtering query params (#24754) 4bc3729 +* **web:** update the create flow to display the latest dependnet amount (#24676) 168c20a +* **web:** Use Mainnet instead of Base for e2e test commands (#24589) ff7dfee + + +### Continuous Integration + +* **web:** update sitemaps 4e8124b + + +### Tests + +* **web:** Disable anvil snapshots by default (#24666) 1a2903c diff --git a/VERSION b/VERSION index 885f8abd813..a4fafce7ea0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -web/5.115.0 \ No newline at end of file +web/5.116.0 \ No newline at end of file diff --git a/apps/extension/package.json b/apps/extension/package.json index 9ac9b2af0df..c93f66b93f1 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -22,6 +22,7 @@ "@uniswap/v3-sdk": "3.25.2", "@uniswap/v4-sdk": "1.21.2", "@universe/api": "workspace:^", + "@universe/gating": "workspace:^", "@wxt-dev/module-react": "1.1.3", "confusing-browser-globals": "1.0.11", "dotenv-webpack": "8.0.1", diff --git a/apps/extension/src/app/apollo.tsx b/apps/extension/src/app/apollo.tsx index 41416c70604..e006c3ed06a 100644 --- a/apps/extension/src/app/apollo.tsx +++ b/apps/extension/src/app/apollo.tsx @@ -1,8 +1,7 @@ import { ApolloProvider } from '@apollo/client/react/context' -import { PropsWithChildren, useEffect } from 'react' +import { PropsWithChildren } from 'react' import { localStorage } from 'redux-persist-webextension-storage' import { getReduxStore } from 'src/store/store' -import { initializePortfolioQueryOverrides } from 'uniswap/src/data/rest/portfolioBalanceOverrides' // biome-ignore lint/style/noRestrictedImports: Direct wallet import needed for Apollo client setup in extension context import { usePersistedApolloClient } from 'wallet/src/data/apollo/usePersistedApolloClient' @@ -16,14 +15,9 @@ export function GraphqlProvider({ children }: PropsWithChildren): JSX.E reduxStore: getReduxStore(), }) - useEffect(() => { - if (apolloClient) { - initializePortfolioQueryOverrides({ store: getReduxStore(), apolloClient }) - } - }, [apolloClient]) - if (!apolloClient) { return <> } + return {children} } diff --git a/apps/extension/src/app/components/AutoLockProvider.tsx b/apps/extension/src/app/components/AutoLockProvider.tsx index 4d7989e0fc7..8f26d940352 100644 --- a/apps/extension/src/app/components/AutoLockProvider.tsx +++ b/apps/extension/src/app/components/AutoLockProvider.tsx @@ -1,9 +1,8 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { PropsWithChildren, useEffect } from 'react' import { useSelector } from 'react-redux' import { ExtensionState } from 'src/store/extensionReducer' import { useIsChromeWindowFocusedWithTimeout } from 'uniswap/src/extension/useIsChromeWindowFocused' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { deviceAccessTimeoutToMs } from 'uniswap/src/features/settings/constants' import { ExtensionEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' diff --git a/apps/extension/src/app/core/StatsigProvider.tsx b/apps/extension/src/app/core/StatsigProvider.tsx index 63f55e72d4f..7c6aeb01b76 100644 --- a/apps/extension/src/app/core/StatsigProvider.tsx +++ b/apps/extension/src/app/core/StatsigProvider.tsx @@ -1,10 +1,9 @@ import { useQuery } from '@tanstack/react-query' import { SharedQueryClient } from '@universe/api' +import { StatsigCustomAppValue, StatsigUser } from '@universe/gating' import { useEffect, useState } from 'react' import { makeStatsigUser } from 'src/app/core/initStatSigForBrowserScripts' -import { StatsigCustomAppValue } from 'uniswap/src/features/gating/constants' import { StatsigProviderWrapper } from 'uniswap/src/features/gating/StatsigProviderWrapper' -import { StatsigUser } from 'uniswap/src/features/gating/sdk/statsig' import { initializeDatadog } from 'uniswap/src/utils/datadog' import { uniqueIdQuery } from 'utilities/src/device/uniqueIdQuery' diff --git a/apps/extension/src/app/core/initStatSigForBrowserScripts.tsx b/apps/extension/src/app/core/initStatSigForBrowserScripts.tsx index 3e3ffaaa9ba..7a495477c72 100644 --- a/apps/extension/src/app/core/initStatSigForBrowserScripts.tsx +++ b/apps/extension/src/app/core/initStatSigForBrowserScripts.tsx @@ -1,6 +1,5 @@ +import { StatsigClient, StatsigCustomAppValue, StatsigUser } from '@universe/gating' import { config } from 'uniswap/src/config' -import { StatsigCustomAppValue } from 'uniswap/src/features/gating/constants' -import { StatsigClient, StatsigUser } from 'uniswap/src/features/gating/sdk/statsig' import { statsigBaseConfig } from 'uniswap/src/features/gating/statsigBaseConfig' import { getUniqueId } from 'utilities/src/device/uniqueId' import { logger } from 'utilities/src/logger/logger' diff --git a/apps/extension/src/app/features/biometricUnlock/useShouldShowBiometricUnlock.ts b/apps/extension/src/app/features/biometricUnlock/useShouldShowBiometricUnlock.ts index 3491a94d6bb..54582813431 100644 --- a/apps/extension/src/app/features/biometricUnlock/useShouldShowBiometricUnlock.ts +++ b/apps/extension/src/app/features/biometricUnlock/useShouldShowBiometricUnlock.ts @@ -1,7 +1,6 @@ import { useQuery } from '@tanstack/react-query' +import { DynamicConfigs, ExtensionBiometricUnlockConfigKey, useDynamicConfigValue } from '@universe/gating' import { biometricUnlockCredentialQuery } from 'src/app/features/biometricUnlock/biometricUnlockCredentialQuery' -import { DynamicConfigs, ExtensionBiometricUnlockConfigKey } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' export function useShouldShowBiometricUnlock(): boolean { const isEnabled = useDynamicConfigValue({ diff --git a/apps/extension/src/app/features/biometricUnlock/useShouldShowBiometricUnlockEnrollment.ts b/apps/extension/src/app/features/biometricUnlock/useShouldShowBiometricUnlockEnrollment.ts index 7c496296c1d..f642af2d9ad 100644 --- a/apps/extension/src/app/features/biometricUnlock/useShouldShowBiometricUnlockEnrollment.ts +++ b/apps/extension/src/app/features/biometricUnlock/useShouldShowBiometricUnlockEnrollment.ts @@ -1,8 +1,7 @@ import { useQuery } from '@tanstack/react-query' +import { DynamicConfigs, ExtensionBiometricUnlockConfigKey, useDynamicConfigValue } from '@universe/gating' import { useTranslation } from 'react-i18next' import { builtInBiometricCapabilitiesQuery } from 'src/app/utils/device/builtInBiometricCapabilitiesQuery' -import { DynamicConfigs, ExtensionBiometricUnlockConfigKey } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' export function useShouldShowBiometricUnlockEnrollment({ flow }: { flow: 'onboarding' | 'settings' }): boolean { const { t } = useTranslation() 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 19606509983..b015627b61b 100644 --- a/apps/extension/src/app/features/dappRequests/requestContent/SignTypeData/SignTypedDataRequestContent.tsx +++ b/apps/extension/src/app/features/dappRequests/requestContent/SignTypeData/SignTypedDataRequestContent.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useTranslation } from 'react-i18next' import { DappRequestContent } from 'src/app/features/dappRequests/DappRequestContent' import { ActionCanNotBeCompletedContent } from 'src/app/features/dappRequests/requestContent/ActionCanNotBeCompleted/ActionCanNotBeCompletedContent' @@ -11,8 +12,6 @@ import { EIP712Message, isEIP712TypedData } from 'src/app/features/dappRequests/ import { isPermit2, isUniswapXSwapRequest } from 'src/app/features/dappRequests/types/Permit2Types' import { Flex, Text } from 'ui/src' import { toSupportedChainId } from 'uniswap/src/features/chains/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useHasAccountMismatchCallback } from 'uniswap/src/features/smartWallet/mismatch/hooks' import { ExplorerDataType, getExplorerLink } from 'uniswap/src/utils/linking' import { isEVMAddressWithChecksum } from 'utilities/src/addresses/evm/evm' diff --git a/apps/extension/src/app/features/dappRequests/saga.ts b/apps/extension/src/app/features/dappRequests/saga.ts index 8ce3f50de43..7a511bca103 100644 --- a/apps/extension/src/app/features/dappRequests/saga.ts +++ b/apps/extension/src/app/features/dappRequests/saga.ts @@ -1,6 +1,7 @@ /* eslint-disable max-lines */ import { Provider } from '@ethersproject/providers' import { providerErrors, rpcErrors, serializeError } from '@metamask/rpc-errors' +import { FeatureFlags, getFeatureFlag } from '@universe/gating' import { createSearchParams } from 'react-router' import { changeChain } from 'src/app/features/dapp/changeChain' import { DappInfo, dappStore } from 'src/app/features/dapp/store' @@ -45,8 +46,6 @@ import getCalldataInfoFromTransaction from 'src/background/utils/getCalldataInfo import { call, put, select, take } from 'typed-redux-saga' import { hexadecimalStringToInt, toSupportedChainId } from 'uniswap/src/features/chains/utils' import { DappRequestType, DappResponseType } from 'uniswap/src/features/dappRequests/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag } from 'uniswap/src/features/gating/hooks' import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' import { Platform } from 'uniswap/src/features/platforms/types/Platform' diff --git a/apps/extension/src/app/features/home/HomeScreen.tsx b/apps/extension/src/app/features/home/HomeScreen.tsx index f7a5e10a591..00145f31da7 100644 --- a/apps/extension/src/app/features/home/HomeScreen.tsx +++ b/apps/extension/src/app/features/home/HomeScreen.tsx @@ -1,5 +1,6 @@ import { useApolloClient } from '@apollo/client' import { SharedEventName } from '@uniswap/analytics-events' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { memo, useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' @@ -21,8 +22,6 @@ import { navigate } from 'src/app/navigation/state' import { Flex, Loader, styled, Text, TouchableArea } from 'ui/src' import { SMART_WALLET_UPGRADE_VIDEO } from 'ui/src/assets' import { NFTS_TAB_DATA_DEPENDENCIES } from 'uniswap/src/components/nfts/constants' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useSelectAddressHasNotifications } from 'uniswap/src/features/notifications/slice/hooks' import { setNotificationStatus } from 'uniswap/src/features/notifications/slice/slice' import { PortfolioBalance } from 'uniswap/src/features/portfolio/PortfolioBalance/PortfolioBalance' diff --git a/apps/extension/src/app/features/home/PortfolioActionButtons.tsx b/apps/extension/src/app/features/home/PortfolioActionButtons.tsx index a0ac5b56037..9a7a08625ce 100644 --- a/apps/extension/src/app/features/home/PortfolioActionButtons.tsx +++ b/apps/extension/src/app/features/home/PortfolioActionButtons.tsx @@ -1,4 +1,5 @@ import { SharedEventName } from '@uniswap/analytics-events' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { cloneElement, memo, useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import { useInterfaceBuyNavigator } from 'src/app/features/for/utils' @@ -7,8 +8,6 @@ import { navigate } from 'src/app/navigation/state' import { Flex, getTokenValue, Text, TouchableArea, useMedia } from 'ui/src' import { ArrowDownCircle, Bank, CoinConvert, SendAction } from 'ui/src/components/icons' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ElementName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { TestnetModeModal } from 'uniswap/src/features/testnets/TestnetModeModal' diff --git a/apps/extension/src/app/features/home/PortfolioHeader.tsx b/apps/extension/src/app/features/home/PortfolioHeader.tsx index 45df41829bc..b951fd5c50a 100644 --- a/apps/extension/src/app/features/home/PortfolioHeader.tsx +++ b/apps/extension/src/app/features/home/PortfolioHeader.tsx @@ -55,7 +55,7 @@ const RotatingSettingsIcon = ({ onPressSettings }: { onPressSettings(): void }): }), ) } - }, [isScreenFocused, pressProgress]) + }, [isScreenFocused]) const onBegin = (): void => { pressProgress.value = withTiming(1) diff --git a/apps/extension/src/app/features/onboarding/import/SelectWallets.tsx b/apps/extension/src/app/features/onboarding/import/SelectWallets.tsx index dcf3940bb5e..3c8597824a0 100644 --- a/apps/extension/src/app/features/onboarding/import/SelectWallets.tsx +++ b/apps/extension/src/app/features/onboarding/import/SelectWallets.tsx @@ -1,4 +1,5 @@ import { useQuery } from '@tanstack/react-query' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { ComponentProps, useMemo, useState } from 'react' import { Trans, useTranslation } from 'react-i18next' import { SelectWalletsSkeleton } from 'src/app/components/loading/SelectWalletSkeleton' @@ -9,8 +10,6 @@ import { Flex, ScrollView, SpinningLoader, Square, Text, Tooltip, TouchableArea import { WalletFilled } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' import { uniswapUrls } from 'uniswap/src/constants/urls' -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 { ExtensionOnboardingFlow, ExtensionOnboardingScreens } from 'uniswap/src/types/screens/extension' import { openUri } from 'uniswap/src/utils/linking' diff --git a/apps/extension/src/app/features/onboarding/scan/ScanToOnboard.tsx b/apps/extension/src/app/features/onboarding/scan/ScanToOnboard.tsx index 30080a5b13f..3e01afb4a99 100644 --- a/apps/extension/src/app/features/onboarding/scan/ScanToOnboard.tsx +++ b/apps/extension/src/app/features/onboarding/scan/ScanToOnboard.tsx @@ -174,7 +174,7 @@ export function ScanToOnboard(): JSX.Element { ) return () => cancelAnimation(qrScale) - }, [isLoadingUUID, qrScale]) + }, [isLoadingUUID]) // Using useAnimatedStyle and AnimatedFlex because tamagui scale animation not working const qrAnimatedStyle = useAnimatedStyle(() => { return { diff --git a/apps/extension/src/app/features/settings/SettingsScreen.tsx b/apps/extension/src/app/features/settings/SettingsScreen.tsx index 4dd4947e716..ed9a068a3c1 100644 --- a/apps/extension/src/app/features/settings/SettingsScreen.tsx +++ b/apps/extension/src/app/features/settings/SettingsScreen.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' @@ -31,8 +32,6 @@ import { resetUniswapBehaviorHistory } from 'uniswap/src/features/behaviorHistor import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { FiatCurrency, ORDERED_CURRENCIES } from 'uniswap/src/features/fiatCurrency/constants' import { getFiatCurrencyName, useAppFiatCurrencyInfo } from 'uniswap/src/features/fiatCurrency/hooks' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useCurrentLanguageInfo } from 'uniswap/src/features/language/hooks' import { PasskeyManagementModal } from 'uniswap/src/features/passkey/PasskeyManagementModal' import { setCurrentFiatCurrency, setIsTestnetModeEnabled } from 'uniswap/src/features/settings/slice' diff --git a/apps/extension/src/app/hooks/useIsExtensionPasskeyImportEnabled.ts b/apps/extension/src/app/hooks/useIsExtensionPasskeyImportEnabled.ts index 8abf941051b..823ac6ba868 100644 --- a/apps/extension/src/app/hooks/useIsExtensionPasskeyImportEnabled.ts +++ b/apps/extension/src/app/hooks/useIsExtensionPasskeyImportEnabled.ts @@ -1,5 +1,4 @@ -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' export function useIsExtensionPasskeyImportEnabled(): boolean { return useFeatureFlag(FeatureFlags.EmbeddedWallet) diff --git a/apps/extension/src/entrypoints/sidepanel/main.tsx b/apps/extension/src/entrypoints/sidepanel/main.tsx index 4cbeaaa35d0..5465a71e672 100644 --- a/apps/extension/src/entrypoints/sidepanel/main.tsx +++ b/apps/extension/src/entrypoints/sidepanel/main.tsx @@ -11,8 +11,10 @@ import { createRoot } from 'react-dom/client' import SidebarApp from 'src/app/core/SidebarApp' import { onboardingMessageChannel } from 'src/background/messagePassing/messageChannels' import { OnboardingMessageType } from 'src/background/messagePassing/types/ExtensionMessages' +import { getReduxStore } from 'src/store/store' import { ExtensionAppLocation, StoreSynchronization } from 'src/store/storeSynchronization' import { initializeScrollWatcher } from 'uniswap/src/components/modals/ScrollLock' +import { initializePortfolioQueryOverrides } from 'uniswap/src/data/rest/portfolioBalanceOverrides' import { logger } from 'utilities/src/logger/logger' // biome-ignore lint/suspicious/noExplicitAny: Global polyfill cleanup requires any type for runtime modification ;(globalThis as any).regeneratorRuntime = undefined @@ -44,6 +46,7 @@ export function makeSidebar(): void { } StoreSynchronization.init(ExtensionAppLocation.SidePanel) + initializePortfolioQueryOverrides({ store: getReduxStore() }) initSidebar() initializeScrollWatcher() } diff --git a/apps/extension/tsconfig.json b/apps/extension/tsconfig.json index 007f0494490..831ce04a0d1 100644 --- a/apps/extension/tsconfig.json +++ b/apps/extension/tsconfig.json @@ -19,6 +19,9 @@ }, { "path": "../../packages/api" + }, + { + "path": "../../packages/gating" } ], "compilerOptions": { diff --git a/apps/mobile/.maestro/flows/deeplinks/deeplink-comprehensive.yaml b/apps/mobile/.maestro/flows/deeplinks/deeplink-comprehensive.yaml index 7986a843f72..71df2ffe3af 100644 --- a/apps/mobile/.maestro/flows/deeplinks/deeplink-comprehensive.yaml +++ b/apps/mobile/.maestro/flows/deeplinks/deeplink-comprehensive.yaml @@ -12,7 +12,7 @@ env: - runScript: file: ../../scripts/performance/dist/actions/start-flow.js env: - FLOW_NAME: 'deeplink-comprehensive' + FLOW_NAME: "deeplink-comprehensive" # Run prerequisite flows (tracked as sub-flows) - runFlow: ../../shared-flows/start.yaml @@ -22,15 +22,15 @@ env: - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'onramp-deeplink' - PHASE: 'start' + ACTION: "openLink" + TARGET: "onramp-deeplink" + PHASE: "start" - openLink: - link: 'uniswap://app/fiatonramp?userAddress=0xEEf806b3Cae8fcecAe1793EE1e0B2c738F61C6bB&source=push' + link: "uniswap://app/fiatonramp?userAddress=0xEEf806b3Cae8fcecAe1793EE1e0B2c738F61C6bB&source=push" autoVerify: true # Handle iOS deeplink permission dialog (optional - only appears on first run) - tapOn: - text: 'Open' + text: "Open" optional: true - waitForAnimationToEnd: timeout: 5000 @@ -41,43 +41,43 @@ env: - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'onramp-deeplink' - PHASE: 'end' + ACTION: "openLink" + TARGET: "onramp-deeplink" + PHASE: "end" - killApp # Open widget deeplink - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'widget-deeplink' - PHASE: 'start' + ACTION: "openLink" + TARGET: "widget-deeplink" + PHASE: "start" - openLink: - link: 'uniswap://widget/#/tokens/ethereum/0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984' + link: "uniswap://widget/#/tokens/ethereum/0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984" autoVerify: true - waitForAnimationToEnd: timeout: 3000 - assertVisible: id: ${output.testIds.TokenDetailsHeaderText} - text: 'Uniswap' + text: "Uniswap" - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'widget-deeplink' - PHASE: 'end' + ACTION: "openLink" + TARGET: "widget-deeplink" + PHASE: "end" - killApp # Open swap deeplink - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'swap-deeplink' - PHASE: 'start' + ACTION: "openLink" + TARGET: "swap-deeplink" + PHASE: "start" - openLink: - link: 'uniswap://redirect?screen=swap&userAddress=0xEEf806b3Cae8fcecAe1793EE1e0B2c738F61C6bB&inputCurrencyId=1-0x6B175474E89094C44Da98b954EedeAC495271d0F&outputCurrencyId=1-0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984¤cyField=input&amount=100' + link: "uniswap://redirect?screen=swap&userAddress=0xEEf806b3Cae8fcecAe1793EE1e0B2c738F61C6bB&inputCurrencyId=1-0x6B175474E89094C44Da98b954EedeAC495271d0F&outputCurrencyId=1-0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984¤cyField=input&amount=100" autoVerify: true - waitForAnimationToEnd: timeout: 3000 @@ -92,20 +92,20 @@ env: - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'swap-deeplink' - PHASE: 'end' + ACTION: "openLink" + TARGET: "swap-deeplink" + PHASE: "end" - killApp # Open token details deeplink - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'token-details-deeplink' - PHASE: 'start' + ACTION: "openLink" + TARGET: "token-details-deeplink" + PHASE: "start" - openLink: - link: 'uniswap://app/tokendetails?currencyId=10-0x6fd9d7ad17242c41f7131d257212c54a0e816691&source=push' + link: "uniswap://app/tokendetails?currencyId=10-0x6fd9d7ad17242c41f7131d257212c54a0e816691&source=push" autoVerify: true - waitForAnimationToEnd: timeout: 3000 @@ -116,20 +116,20 @@ env: - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'token-details-deeplink' - PHASE: 'end' + ACTION: "openLink" + TARGET: "token-details-deeplink" + PHASE: "end" - killApp # Open transaction history deeplink - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'transaction-history-deeplink' - PHASE: 'start' + ACTION: "openLink" + TARGET: "transaction-history-deeplink" + PHASE: "start" - openLink: - link: 'uniswap://redirect?screen=transaction&fiatOnRamp=true&userAddress=0xEEf806b3Cae8fcecAe1793EE1e0B2c738F61C6bB' + link: "uniswap://redirect?screen=transaction&fiatOnRamp=true&userAddress=0xEEf806b3Cae8fcecAe1793EE1e0B2c738F61C6bB" autoVerify: true - waitForAnimationToEnd: timeout: 3000 @@ -138,20 +138,20 @@ env: - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'transaction-history-deeplink' - PHASE: 'end' + ACTION: "openLink" + TARGET: "transaction-history-deeplink" + PHASE: "end" - killApp # Invalid deeplink (should fail gracefully and remain functional) - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'invalid-deeplink' - PHASE: 'start' + ACTION: "openLink" + TARGET: "invalid-deeplink" + PHASE: "start" - openLink: - link: 'uniswap://invalid-path' + link: "uniswap://invalid-path" autoVerify: true - waitForAnimationToEnd: timeout: 3000 @@ -160,46 +160,46 @@ env: - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'invalid-deeplink' - PHASE: 'end' + ACTION: "openLink" + TARGET: "invalid-deeplink" + PHASE: "end" - killApp # Open moonpayOnly onramp deeplink - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'moonpay-onramp-deeplink' - PHASE: 'start' + ACTION: "openLink" + TARGET: "moonpay-onramp-deeplink" + PHASE: "start" - openLink: - link: 'uniswap://app/fiatonramp?source=push&moonpayOnly=true&moonpayCurrencyCode=usdc&amount=200' + link: "uniswap://app/fiatonramp?source=push&moonpayOnly=true&moonpayCurrencyCode=usdc&amount=200" autoVerify: true - waitForAnimationToEnd: timeout: 5000 - assertVisible: id: ${output.testIds.ForFormTokenSelected} - text: 'USD Coin' + text: "USD Coin" - assertVisible: id: ${output.testIds.BuyFormAmountInput} - text: '200' + text: "200" - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'moonpay-onramp-deeplink' - PHASE: 'end' + ACTION: "openLink" + TARGET: "moonpay-onramp-deeplink" + PHASE: "end" - killApp # Open scantastic deeplink (when user scans QR code on the extension) - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'scantastic-deeplink' - PHASE: 'start' + ACTION: "openLink" + TARGET: "scantastic-deeplink" + PHASE: "start" - openLink: - link: 'uniswap://scantastic?pubKey=%7B%22alg%22%3A%22RSA-OAEP-256%22%2C%22kty%22%3A%22RSA%22%2C%22n%22%3A%224X4nRAEZ8FWoVmoQ5KrxcssIR7XpdcVo_y7yD1SgmYuXekvHMIYuLxxkxVTjsyxj2s9jctIHOhZ-g96w4oM8-HXjCJG_v55w6FZyDskllcmaGeUlZFwWkiqZ-PKkHCWxCe_dZGvL33sazS_L8P3eAxXEPEJMG9p9lxsIlPp7ki0GSyVjq4rrHgW0lIz6qy6WqHbnyJWQAMSPnZTGM697ZCdkW_GTD3MyqitBwK5xNQN8Pxgbu6S7xbQglanYNBbeMYpJ3X1PDl37sp16YwPm6ryGaX1ESDPHa3M7-_we_yQEUQvtU5t2dd8chISJX8L1D7s8iNxM1LxG_nZTwKnccRPtrzKj-osBMbfCoU4fiNS2LC7q6zsyHxgDpeFlrV--iboQ9TsaQ7RGaFOSKs0l74_dt8GvX2JtNJ0ah8K__eNg9q0xBD8DTdeY2duMTEKJZIKgEyX0KUiRpsbsNmm_76iqhhZyYvcb6mwvNnVcXPg_TabX7lQEEippd7JTWVnF2LKzldlUonchQSsbLEUlN_ALa0Nuq6GG1MVJ0JjSsNMcpin6rH9fPzmDKkqzM2qvhdyuV66vkS82Wj9tQpqXL_jkRk7bQsDlB-HiVbzM2oNPk6or5u6p5tJni0th6BZm4z-sYgmMj3D5xHeusyap-8dmS9J4mXDxGLL_NloaHY8%22%2C%22e%22%3A%22AQAB%22%7D&uuid=28c01911-8e69-46e9-b2f0-f5e719bb714b&vendor=Apple&model=Macintosh&browser=Chrome' + link: "uniswap://scantastic?pubKey=%7B%22alg%22%3A%22RSA-OAEP-256%22%2C%22kty%22%3A%22RSA%22%2C%22n%22%3A%224X4nRAEZ8FWoVmoQ5KrxcssIR7XpdcVo_y7yD1SgmYuXekvHMIYuLxxkxVTjsyxj2s9jctIHOhZ-g96w4oM8-HXjCJG_v55w6FZyDskllcmaGeUlZFwWkiqZ-PKkHCWxCe_dZGvL33sazS_L8P3eAxXEPEJMG9p9lxsIlPp7ki0GSyVjq4rrHgW0lIz6qy6WqHbnyJWQAMSPnZTGM697ZCdkW_GTD3MyqitBwK5xNQN8Pxgbu6S7xbQglanYNBbeMYpJ3X1PDl37sp16YwPm6ryGaX1ESDPHa3M7-_we_yQEUQvtU5t2dd8chISJX8L1D7s8iNxM1LxG_nZTwKnccRPtrzKj-osBMbfCoU4fiNS2LC7q6zsyHxgDpeFlrV--iboQ9TsaQ7RGaFOSKs0l74_dt8GvX2JtNJ0ah8K__eNg9q0xBD8DTdeY2duMTEKJZIKgEyX0KUiRpsbsNmm_76iqhhZyYvcb6mwvNnVcXPg_TabX7lQEEippd7JTWVnF2LKzldlUonchQSsbLEUlN_ALa0Nuq6GG1MVJ0JjSsNMcpin6rH9fPzmDKkqzM2qvhdyuV66vkS82Wj9tQpqXL_jkRk7bQsDlB-HiVbzM2oNPk6or5u6p5tJni0th6BZm4z-sYgmMj3D5xHeusyap-8dmS9J4mXDxGLL_NloaHY8%22%2C%22e%22%3A%22AQAB%22%7D&uuid=28c01911-8e69-46e9-b2f0-f5e719bb714b&vendor=Apple&model=Macintosh&browser=Chrome" autoVerify: true - waitForAnimationToEnd: timeout: 3000 @@ -207,16 +207,16 @@ env: id: ${output.testIds.ScantasticConfirmationTitle} - assertVisible: id: ${output.testIds.ScantasticDevice} - text: 'Apple Macintosh' + text: "Apple Macintosh" - assertVisible: id: ${output.testIds.ScantasticBrowser} - text: 'Chrome' + text: "Chrome" - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'scantastic-deeplink' - PHASE: 'end' + ACTION: "openLink" + TARGET: "scantastic-deeplink" + PHASE: "end" - killApp # End flow tracking @@ -228,4 +228,4 @@ env: file: ../../scripts/performance/upload-metrics.js env: DATADOG_API_KEY: ${DATADOG_API_KEY} - ENVIRONMENT: 'maestro_cloud' + ENVIRONMENT: "maestro_cloud" diff --git a/apps/mobile/.maestro/flows/restore/restore-new-device.yaml b/apps/mobile/.maestro/flows/restore/restore-new-device.yaml index 0f73d3201f3..08ab78e29fa 100644 --- a/apps/mobile/.maestro/flows/restore/restore-new-device.yaml +++ b/apps/mobile/.maestro/flows/restore/restore-new-device.yaml @@ -184,10 +184,29 @@ env: PHASE: 'end' - waitForAnimationToEnd +# Wait for cloud backup to fail - handle both possible error states +# First try waiting for "No backups found" - extendedWaitUntil: visible: text: 'No backups found' - timeout: 5000 # wait for cloud backup to fail + timeout: 5000 + optional: true + +# If that didn't appear, wait for "Error while importing backups" +- extendedWaitUntil: + visible: + text: 'Error while importing backups' + timeout: 5000 + optional: true + +# If error while importing backups appeared, tap to enter recovery phrase manually +- runFlow: + when: + visible: + text: 'Enter recovery phrase' + commands: + - tapOn: + text: 'Enter recovery phrase' # Track seed phrase input - runScript: diff --git a/apps/mobile/.maestro/shared-flows/navigate-to-explore.yaml b/apps/mobile/.maestro/shared-flows/navigate-to-explore.yaml index 3431fe0cb24..200f366aeaf 100644 --- a/apps/mobile/.maestro/shared-flows/navigate-to-explore.yaml +++ b/apps/mobile/.maestro/shared-flows/navigate-to-explore.yaml @@ -1,20 +1,37 @@ appId: com.uniswap.mobile.dev --- # This flow handles the common action of navigating to the Explore tab -# from the main wallet screen. +# from the main wallet screen. It supports both bottom tabs navigation (new) +# and the legacy floating navigation bar. # Wait for the home screen to be visible - extendedWaitUntil: - visible: 'noop' + visible: "noop" timeout: 2000 optional: true -# Tap on the Explore/Search button in the navigation bar +# OPTION 1: Try bottom tabs navigation first (new UI pattern) +# This will be available when BottomTabs feature flag is enabled +- tapOn: + id: ${output.testIds.ExploreTab} + optional: true + +# TODO: INFRA-1074 - Remove this fallback when we no longer support the legacy navigation bar +# OPTION 2: Fallback to legacy floating navigation bar +# This will be used when BottomTabs feature flag is disabled - tapOn: id: ${output.testIds.SearchTokensAndWallets} + optional: true +# Wait for tab animations to complete (200ms animation duration) - waitForAnimationToEnd # Verify we're in the Explore screen by checking for the search input +# This verification works for both navigation patterns +- extendedWaitUntil: + visible: + id: ${output.testIds.ExploreSearchInput} + timeout: 3000 + - assertVisible: id: ${output.testIds.ExploreSearchInput} diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 853a8cb2918..e013942b40c 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -111,6 +111,7 @@ "@uniswap/ethers-rs-mobile": "0.0.5", "@uniswap/sdk-core": "7.7.2", "@universe/api": "workspace:^", + "@universe/gating": "workspace:^", "@walletconnect/core": "2.21.4", "@walletconnect/react-native-compat": "2.21.4", "@walletconnect/types": "2.21.4", diff --git a/apps/mobile/src/app/App.tsx b/apps/mobile/src/app/App.tsx index 7554650723a..da7c8559205 100644 --- a/apps/mobile/src/app/App.tsx +++ b/apps/mobile/src/app/App.tsx @@ -3,6 +3,17 @@ import { loadDevMessages, loadErrorMessages } from '@apollo/client/dev' import { DdRum, RumActionType } from '@datadog/mobile-react-native' import { BottomSheetModalProvider } from '@gorhom/bottom-sheet' import { PerformanceProfiler, RenderPassReport } from '@shopify/react-native-performance' +import { + DatadogSessionSampleRateKey, + DynamicConfigs, + Experiments, + getDynamicConfigValue, + getStatsigClient, + StatsigCustomAppValue, + StatsigUser, + Storage, + WALLET_FEATURE_FLAG_NAMES, +} from '@universe/gating' import { MMKVWrapper } from 'apollo3-cache-persist' import { default as React, StrictMode, useCallback, useEffect, useMemo, useRef } from 'react' import { I18nextProvider } from 'react-i18next' @@ -55,13 +66,7 @@ import { BlankUrlProvider } from 'uniswap/src/contexts/UrlContext' import { initializePortfolioQueryOverrides } from 'uniswap/src/data/rest/portfolioBalanceOverrides' import { selectFavoriteTokens } from 'uniswap/src/features/favorites/selectors' import { useAppFiatCurrencyInfo } from 'uniswap/src/features/fiatCurrency/hooks' -import { DatadogSessionSampleRateKey, DynamicConfigs } from 'uniswap/src/features/gating/configs' -import { StatsigCustomAppValue } from 'uniswap/src/features/gating/constants' -import { Experiments } from 'uniswap/src/features/gating/experiments' -import { WALLET_FEATURE_FLAG_NAMES } from 'uniswap/src/features/gating/flags' -import { getDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { StatsigProviderWrapper } from 'uniswap/src/features/gating/StatsigProviderWrapper' -import { getStatsigClient, StatsigUser, Storage } from 'uniswap/src/features/gating/sdk/statsig' import { useCurrentLanguageInfo } from 'uniswap/src/features/language/hooks' import { LocalizationContextProvider } from 'uniswap/src/features/language/LocalizationContext' import { clearNotificationQueue } from 'uniswap/src/features/notifications/slice/slice' @@ -121,6 +126,8 @@ initDynamicIntlPolyfills() initOneSignal() initAppsFlyer() +initializePortfolioQueryOverrides({ store }) + function App(): JSX.Element | null { useEffect(() => { if (!__DEV__) { @@ -240,12 +247,6 @@ function AppOuter(): JSX.Element | null { } }, []) - useEffect(() => { - if (client) { - initializePortfolioQueryOverrides({ store, apolloClient: client }) - } - }, [client]) - if (!client) { return null } diff --git a/apps/mobile/src/app/MobileWalletNavigationProvider.tsx b/apps/mobile/src/app/MobileWalletNavigationProvider.tsx index 9e692d3fe02..6f2319b4364 100644 --- a/apps/mobile/src/app/MobileWalletNavigationProvider.tsx +++ b/apps/mobile/src/app/MobileWalletNavigationProvider.tsx @@ -1,4 +1,5 @@ import { StackActions } from '@react-navigation/native' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { PropsWithChildren, useCallback } from 'react' import { Share } from 'react-native' import { useDispatch } from 'react-redux' @@ -15,8 +16,6 @@ import { useFiatOnRampAggregatorGetCountryQuery, } from 'uniswap/src/features/fiatOnRamp/api' import { RampDirection } from 'uniswap/src/features/fiatOnRamp/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ModalName, WalletEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { TransactionState } from 'uniswap/src/features/transactions/types/transactionState' diff --git a/apps/mobile/src/app/modals/BridgedAssetWarningWrapper.tsx b/apps/mobile/src/app/modals/BridgedAssetWarningWrapper.tsx index 6b6c3ade50d..29cd1bd00a2 100644 --- a/apps/mobile/src/app/modals/BridgedAssetWarningWrapper.tsx +++ b/apps/mobile/src/app/modals/BridgedAssetWarningWrapper.tsx @@ -1,7 +1,6 @@ import { AppStackScreenProp } from 'src/app/navigation/types' import { useReactNavigationModal } from 'src/components/modals/useReactNavigationModal' import { BridgedAssetModal } from 'uniswap/src/components/BridgedAsset/BridgedAssetModal' -import { checkIsBridgedAsset } from 'uniswap/src/components/BridgedAsset/utils' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { useDismissedBridgedAssetWarnings } from 'uniswap/src/features/tokens/slice/hooks' @@ -36,7 +35,7 @@ export function BridgedAssetWarningWrapper({ return null } - const isBridgedAsset = checkIsBridgedAsset(currencyInfo) + const isBridgedAsset = Boolean(currencyInfo.isBridged) // If token is not bridged or warning was dismissed and not blocked, skip warning and proceed to SwapFlow if (!isBridgedAsset || bridgedAssetWarningDismissed) { diff --git a/apps/mobile/src/app/navigation/navigation.tsx b/apps/mobile/src/app/navigation/navigation.tsx index d59a3a4d5d1..07cbfafd88c 100644 --- a/apps/mobile/src/app/navigation/navigation.tsx +++ b/apps/mobile/src/app/navigation/navigation.tsx @@ -1,6 +1,7 @@ import { NavigationContainer, NavigationIndependentTree } from '@react-navigation/native' import { createNativeStackNavigator } from '@react-navigation/native-stack' import { createStackNavigator, TransitionPresets } from '@react-navigation/stack' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { useEffect } from 'react' import { DevSettings } from 'react-native' import { INCLUDE_PROTOTYPE_FEATURES, IS_E2E_TEST } from 'react-native-dotenv' @@ -110,8 +111,6 @@ import { ViewPrivateKeysScreen } from 'src/screens/ViewPrivateKeys/ViewPrivateKe import { WebViewScreen } from 'src/screens/WebViewScreen' import { useSporeColors } from 'ui/src' import { spacing } from 'ui/src/theme' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' import { OnboardingEntryPoint } from 'uniswap/src/types/onboarding' diff --git a/apps/mobile/src/app/navigation/tabs/CustomTabBar/CustomTabBar.tsx b/apps/mobile/src/app/navigation/tabs/CustomTabBar/CustomTabBar.tsx index dc6727df6f5..01de66c7fe1 100644 --- a/apps/mobile/src/app/navigation/tabs/CustomTabBar/CustomTabBar.tsx +++ b/apps/mobile/src/app/navigation/tabs/CustomTabBar/CustomTabBar.tsx @@ -37,6 +37,7 @@ const TabItem = ({ tab, index, isFocused, onPress, colors }: TabItemProps): JSX. return ( numberOfDigits: PriceNumberOfDigits spotPrice?: SharedValue + startingPrice?: number + shouldTreatAsStablecoin?: boolean } const PriceTextSection = memo(function PriceTextSection({ loading, numberOfDigits, spotPrice, + startingPrice, + shouldTreatAsStablecoin, }: PriceTextProps): JSX.Element { const price = useLineChartPrice(spotPrice) const currency = useAppFiatCurrencyInfo() @@ -62,9 +66,13 @@ const PriceTextSection = memo(function PriceTextSection({ We want both the animated number skeleton and the relative change skeleton to hide at the exact same time. When multiple skeletons hide in different order, it gives the feeling of things being slower than they actually are. */} - - + + ) }) @@ -144,7 +152,7 @@ const PriceExplorerInner = memo(function _PriceExplorerInner(): JSX.Element { value: convertedSpotValue, } ) - }, [data, convertedSpotValue]) + }, [data]) // Zoom out y-axis for low variance assets const shouldZoomOut = useMemo(() => { @@ -177,6 +185,9 @@ const PriceExplorerInner = memo(function _PriceExplorerInner(): JSX.Element { return } + // Get the starting price for fiat delta calculation + const startingPrice = convertedPriceHistory[0]?.value + return ( @@ -185,6 +196,8 @@ const PriceExplorerInner = memo(function _PriceExplorerInner(): JSX.Element { numberOfDigits={numberOfDigits} relativeChange={convertedSpot?.relativeChange} spotPrice={convertedSpot?.value} + startingPrice={startingPrice} + shouldTreatAsStablecoin={shouldZoomOut} /> diff --git a/apps/mobile/src/components/PriceExplorer/Text.tsx b/apps/mobile/src/components/PriceExplorer/Text.tsx index 0da167fcdcd..8cddaffd8e7 100644 --- a/apps/mobile/src/components/PriceExplorer/Text.tsx +++ b/apps/mobile/src/components/PriceExplorer/Text.tsx @@ -1,7 +1,8 @@ import React from 'react' -import { useAnimatedStyle } from 'react-native-reanimated' +import { useAnimatedStyle, useDerivedValue } from 'react-native-reanimated' import { useLineChartDatetime } from 'react-native-wagmi-charts' import { AnimatedDecimalNumber } from 'src/components/PriceExplorer/AnimatedDecimalNumber' +import { useLineChartFiatDelta } from 'src/components/PriceExplorer/useFiatDelta' import { useLineChartPrice, useLineChartRelativeChange } from 'src/components/PriceExplorer/usePrice' import { AnimatedText } from 'src/components/text/AnimatedText' import { Flex, Text, useSporeColors } from 'ui/src' @@ -39,19 +40,47 @@ export function PriceText({ maxWidth }: { loading: boolean; maxWidth?: number }) ) } -export function RelativeChangeText({ loading }: { loading: boolean }): JSX.Element { +export function RelativeChangeText({ + loading, + startingPrice, + shouldTreatAsStablecoin = false, +}: { + loading: boolean + startingPrice?: number + shouldTreatAsStablecoin?: boolean +}): JSX.Element { const colors = useSporeColors() const relativeChange = useLineChartRelativeChange() + const fiatDelta = useLineChartFiatDelta({ + startingPrice, + shouldTreatAsStablecoin, + }) + + const changeColor = useDerivedValue(() => { + if (relativeChange.value.value === 0) { + return colors.neutral3.val + } + return relativeChange.value.value > 0 ? colors.statusSuccess.val : colors.statusCritical.val + }) const styles = useAnimatedStyle(() => ({ - color: relativeChange.value.value >= 0 ? colors.statusSuccess.val : colors.statusCritical.val, + color: changeColor.value, })) const caretStyle = useAnimatedStyle(() => ({ - color: relativeChange.value.value >= 0 ? colors.statusSuccess.val : colors.statusCritical.val, + color: changeColor.value, transform: [{ rotate: relativeChange.value.value >= 0 ? '180deg' : '0deg' }], })) + // Combine fiat delta and percentage in a derived value + const combinedText = useDerivedValue(() => { + const delta = fiatDelta.formatted.value + if (delta) { + return `${delta} (${relativeChange.formatted.value})` + } + return relativeChange.formatted.value + }) + return ( = 0 ? -1 : 1 }, ]} /> - + )} @@ -93,8 +122,8 @@ export function DatetimeText({ loading }: { loading: boolean }): JSX.Element | n } return ( - - + + ) } 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 98694cc5409..4b14e906407 100644 --- a/apps/mobile/src/components/PriceExplorer/__snapshots__/Text.test.tsx.snap +++ b/apps/mobile/src/components/PriceExplorer/__snapshots__/Text.test.tsx.snap @@ -6,10 +6,9 @@ exports[`DatetimeText renders without error 1`] = ` @@ -32,9 +31,9 @@ exports[`DatetimeText renders without error 1`] = ` }, }, "fontFamily": "Basel Grotesk", - "fontSize": 19, + "fontSize": 15, "fontWeight": "400", - "lineHeight": 24.7, + "lineHeight": 19.5, "padding": 0, } } diff --git a/apps/mobile/src/components/PriceExplorer/useFiatDelta.tsx b/apps/mobile/src/components/PriceExplorer/useFiatDelta.tsx new file mode 100644 index 00000000000..ff0024319e8 --- /dev/null +++ b/apps/mobile/src/components/PriceExplorer/useFiatDelta.tsx @@ -0,0 +1,116 @@ +import { useCallback, useMemo } from 'react' +import { runOnJS, SharedValue, useAnimatedReaction, useDerivedValue, useSharedValue } from 'react-native-reanimated' +import { useLineChart } from 'react-native-wagmi-charts' +import { useFormatChartFiatDelta } from 'uniswap/src/features/fiatCurrency/hooks/useFormatChartFiatDelta' +import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' + +interface UseFiatDeltaParams { + startingPrice?: number + shouldTreatAsStablecoin?: boolean +} + +interface FiatDeltaResult { + formatted: SharedValue +} + +/** + * Hook to calculate and format fiat delta for price charts. + * Optimized to only calculate deltas on-demand during scrubbing, reducing memory usage. + */ +export function useLineChartFiatDelta({ + startingPrice, + shouldTreatAsStablecoin = false, +}: UseFiatDeltaParams): FiatDeltaResult { + const { currentIndex, data, isActive } = useLineChart() + const { conversionRate } = useLocalizationContext() + const { formatChartFiatDelta } = useFormatChartFiatDelta() + + // Shared value for the current scrubbing delta + const scrubbingDeltaSharedValue = useSharedValue('') + + // Pre-calculate only the last point's delta (for non-scrubbing state) + const lastPointDelta = useMemo(() => { + if (!startingPrice || !data || !conversionRate || data.length === 0) { + return '' + } + + const convertedStartPrice = startingPrice * conversionRate + const lastPoint = data[data.length - 1] + if (!lastPoint) { + return '' + } + const convertedEndPrice = lastPoint.value * conversionRate + + const delta = formatChartFiatDelta({ + startingPrice: convertedStartPrice, + endingPrice: convertedEndPrice, + isStablecoin: shouldTreatAsStablecoin, + }) + + return delta.formatted + }, [startingPrice, data, conversionRate, formatChartFiatDelta, shouldTreatAsStablecoin]) + + // Calculate delta for current scrubbing position + const calculateCurrentDelta = useMemo(() => { + return (index: number) => { + if (!startingPrice || !data || !conversionRate) { + return '' + } + + const currentPoint = data[index] + if (!currentPoint) { + return '' + } + + const convertedStartPrice = startingPrice * conversionRate + const convertedEndPrice = currentPoint.value * conversionRate + + const delta = formatChartFiatDelta({ + startingPrice: convertedStartPrice, + endingPrice: convertedEndPrice, + isStablecoin: shouldTreatAsStablecoin, + }) + + return delta.formatted + } + }, [startingPrice, data, conversionRate, formatChartFiatDelta, shouldTreatAsStablecoin]) + + // Callback for updating the scrubbing delta from the UI thread + const updateScrubbingDelta = useCallback( + (index: number) => { + scrubbingDeltaSharedValue.value = calculateCurrentDelta(index) + }, + [calculateCurrentDelta], + ) + + // Track current index changes with useAnimatedReaction + useAnimatedReaction( + () => { + return currentIndex.value + }, + (currentIndexValue) => { + if (data && data.length > 0) { + const safeIndex = Math.min(Math.max(0, Math.round(currentIndexValue)), data.length - 1) + runOnJS(updateScrubbingDelta)(safeIndex) + } + }, + [data, updateScrubbingDelta], + ) + + // Create a derived value that decides which delta to show + const formatted = useDerivedValue(() => { + if (!data || data.length === 0) { + return '' + } + + // When scrubbing, use the current scrubbing delta + if (isActive.value) { + return scrubbingDeltaSharedValue.value + } + + // When not scrubbing, use the pre-calculated last point delta + return lastPointDelta + }) + + return { formatted } +} diff --git a/apps/mobile/src/components/PriceExplorer/usePrice.tsx b/apps/mobile/src/components/PriceExplorer/usePrice.tsx index 3b8197599c2..0e23b3d110b 100644 --- a/apps/mobile/src/components/PriceExplorer/usePrice.tsx +++ b/apps/mobile/src/components/PriceExplorer/usePrice.tsx @@ -68,7 +68,7 @@ export function useLineChartPrice(currentSpot?: SharedValue): ValueAndFo formatted: priceFormatted, shouldAnimate, }), - [price, priceFormatted, shouldAnimate], + [], ) } diff --git a/apps/mobile/src/components/PriceExplorer/usePriceHistory.ts b/apps/mobile/src/components/PriceExplorer/usePriceHistory.ts index 5f1222aaeda..62775d74aee 100644 --- a/apps/mobile/src/components/PriceExplorer/usePriceHistory.ts +++ b/apps/mobile/src/components/PriceExplorer/usePriceHistory.ts @@ -83,7 +83,7 @@ export function useTokenPriceHistory({ relativeChange: spotRelativeChange, } : undefined, - [price, spotValue, spotRelativeChange], + [price], ) const formattedPriceHistory = useMemo(() => { diff --git a/apps/mobile/src/components/Requests/ModalWithOverlay/ModalWithOverlay.tsx b/apps/mobile/src/components/Requests/ModalWithOverlay/ModalWithOverlay.tsx index e86b139e12b..4ea51ca8353 100644 --- a/apps/mobile/src/components/Requests/ModalWithOverlay/ModalWithOverlay.tsx +++ b/apps/mobile/src/components/Requests/ModalWithOverlay/ModalWithOverlay.tsx @@ -1,4 +1,5 @@ import { BottomSheetFooter, BottomSheetScrollView, useBottomSheetInternal } from '@gorhom/bottom-sheet' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { PropsWithChildren, useCallback, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { @@ -17,8 +18,6 @@ import { Button, ButtonProps, Flex } from 'ui/src' import { spacing } from 'ui/src/theme' import { Modal } from 'uniswap/src/components/modals/Modal' import { ModalProps } from 'uniswap/src/components/modals/ModalProps' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' import { TestID } from 'uniswap/src/test/fixtures/testIDs' diff --git a/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModal.tsx b/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModal.tsx index daf85557387..768181e6026 100644 --- a/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModal.tsx +++ b/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModal.tsx @@ -1,4 +1,5 @@ import { useNetInfo } from '@react-native-community/netinfo' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { getSdkError } from '@walletconnect/utils' import { providers } from 'ethers' import React, { useMemo, useRef } from 'react' @@ -29,8 +30,6 @@ import { spacing } from 'ui/src/theme' import { EthMethod } from 'uniswap/src/features/dappRequests/types' import { isSignTypedDataRequest } from 'uniswap/src/features/dappRequests/utils' import { useTransactionGasFee } from 'uniswap/src/features/gas/hooks' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { useHasAccountMismatchCallback } from 'uniswap/src/features/smartWallet/mismatch/hooks' import { MobileEventName, ModalName } from 'uniswap/src/features/telemetry/constants' diff --git a/apps/mobile/src/components/Requests/ScanSheet/WalletConnectModal.tsx b/apps/mobile/src/components/Requests/ScanSheet/WalletConnectModal.tsx index b3d79b23c5c..d3bd8eb86a0 100644 --- a/apps/mobile/src/components/Requests/ScanSheet/WalletConnectModal.tsx +++ b/apps/mobile/src/components/Requests/ScanSheet/WalletConnectModal.tsx @@ -2,6 +2,7 @@ import React, { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { Alert } from 'react-native' import 'react-native-reanimated' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useDispatch } from 'react-redux' import { useEagerExternalProfileRootNavigation } from 'src/app/navigation/hooks' import { BackButtonView } from 'src/components/layout/BackButtonView' @@ -24,8 +25,6 @@ import { Modal } from 'uniswap/src/components/modals/Modal' import { ScannerModalState } from 'uniswap/src/components/ReceiveQRCode/constants' import { ReceiveQRCode } from 'uniswap/src/components/ReceiveQRCode/ReceiveQRCode' import { AccountType } from 'uniswap/src/features/accounts/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' import { TestID } from 'uniswap/src/test/fixtures/testIDs' diff --git a/apps/mobile/src/components/Requests/ScanSheet/util.test.ts b/apps/mobile/src/components/Requests/ScanSheet/util.test.ts index 441ed9a01a7..76993011636 100644 --- a/apps/mobile/src/components/Requests/ScanSheet/util.test.ts +++ b/apps/mobile/src/components/Requests/ScanSheet/util.test.ts @@ -1,5 +1,9 @@ import * as wcUtils from '@walletconnect/utils' import { CUSTOM_UNI_QR_CODE_PREFIX, getSupportedURI, URIType } from 'src/components/Requests/ScanSheet/util' +import { + UNISWAP_URL_SCHEME_WALLETCONNECT_AS_PARAM, + UNISWAP_WALLETCONNECT_URL, +} from 'src/features/deepLinking/constants' import { wcAsParamInUniwapScheme, wcInUniwapScheme, @@ -121,4 +125,84 @@ describe('getSupportedURI', () => { it('should return undefined for invalid metamask address', async () => { expect(await getSupportedURI('ethereum:invalid_address')).toBeUndefined() }) + + describe('URL and HTML encoded URIs', () => { + it('should handle percent-encoded WalletConnect v2 URI', async () => { + // Simulate a URI that has been percent-encoded (& becomes %26) + const encodedUri = encodeURIComponent(VALID_WC_V2_URI) + const result = await getSupportedURI(encodedUri) + expect(result).toEqual({ type: URIType.WalletConnectV2URL, value: VALID_WC_V2_URI }) + }) + + it('should handle HTML entity-encoded ampersands in WalletConnect v2 URI', async () => { + // Simulate a URI with HTML-encoded ampersands (& becomes &) + const htmlEncodedUri = VALID_WC_V2_URI.replace(/&/g, '&') + const result = await getSupportedURI(htmlEncodedUri) + expect(result).toEqual({ type: URIType.WalletConnectV2URL, value: VALID_WC_V2_URI }) + }) + + it('should handle both percent-encoded and HTML entity-encoded URI', async () => { + // First apply HTML encoding, then percent encoding + const htmlEncodedUri = VALID_WC_V2_URI.replace(/&/g, '&') + const doubleEncodedUri = encodeURIComponent(htmlEncodedUri) + const result = await getSupportedURI(doubleEncodedUri) + expect(result).toEqual({ type: URIType.WalletConnectV2URL, value: VALID_WC_V2_URI }) + }) + + it('should handle percent-encoded uniswap scheme URI with query param', async () => { + const fullUri = UNISWAP_URL_SCHEME_WALLETCONNECT_AS_PARAM + VALID_WC_V2_URI + const encodedUri = encodeURIComponent(fullUri) + const result = await getSupportedURI(encodedUri) + expect(result).toEqual({ type: URIType.WalletConnectV2URL, value: VALID_WC_V2_URI }) + }) + + it('should handle HTML entity-encoded uniswap scheme URI with query param', async () => { + const fullUri = UNISWAP_URL_SCHEME_WALLETCONNECT_AS_PARAM + VALID_WC_V2_URI + const htmlEncodedUri = fullUri.replace(/&/g, '&') + const result = await getSupportedURI(htmlEncodedUri) + expect(result).toEqual({ type: URIType.WalletConnectV2URL, value: VALID_WC_V2_URI }) + }) + + it('should handle percent-encoded uniswap app URL', async () => { + const fullUri = UNISWAP_WALLETCONNECT_URL + VALID_WC_V2_URI + const encodedUri = encodeURIComponent(fullUri) + const result = await getSupportedURI(encodedUri) + expect(result).toEqual({ type: URIType.WalletConnectV2URL, value: VALID_WC_V2_URI }) + }) + + it('should handle HTML entity-encoded uniswap app URL', async () => { + const fullUri = UNISWAP_WALLETCONNECT_URL + VALID_WC_V2_URI + const htmlEncodedUri = fullUri.replace(/&/g, '&') + const result = await getSupportedURI(htmlEncodedUri) + expect(result).toEqual({ type: URIType.WalletConnectV2URL, value: VALID_WC_V2_URI }) + }) + + it('should handle percent-encoded hello_uniwallet prefix', async () => { + const fullUri = CUSTOM_UNI_QR_CODE_PREFIX + VALID_WC_V2_URI + const encodedUri = encodeURIComponent(fullUri) + const result = await getSupportedURI(encodedUri) + expect(result).toEqual({ type: URIType.WalletConnectV2URL, value: VALID_WC_V2_URI }) + }) + + it('should handle HTML entity-encoded hello_uniwallet prefix', async () => { + const fullUri = CUSTOM_UNI_QR_CODE_PREFIX + VALID_WC_V2_URI + const htmlEncodedUri = fullUri.replace(/&/g, '&') + const result = await getSupportedURI(htmlEncodedUri) + expect(result).toEqual({ type: URIType.WalletConnectV2URL, value: VALID_WC_V2_URI }) + }) + + it('should handle malformed percent-encoded URI without crashing', async () => { + // Malformed URI with invalid percent encoding (% not followed by valid hex) + const malformedUri = 'uniswap://wc?uri=%E0%A4%A' + // Should not throw an error, even with malformed encoding + await expect(getSupportedURI(malformedUri)).resolves.not.toThrow() + }) + + it('should handle URI with standalone percent sign', async () => { + // URI with a standalone % which is invalid for decodeURIComponent + const malformedUri = 'hello_uniwallet:' + VALID_WC_V2_URI + '%' + // Should not throw an error, even with malformed encoding + await expect(getSupportedURI(malformedUri)).resolves.not.toThrow() + }) + }) }) diff --git a/apps/mobile/src/components/Requests/ScanSheet/util.ts b/apps/mobile/src/components/Requests/ScanSheet/util.ts index 140882c7d38..f8f07334473 100644 --- a/apps/mobile/src/components/Requests/ScanSheet/util.ts +++ b/apps/mobile/src/components/Requests/ScanSheet/util.ts @@ -46,6 +46,9 @@ export async function getSupportedURI( return undefined } + // Decode URI in case it's encoded (handles both percent encoding and HTML ampersand) + uri = safeDecodeURIComponent(uri).replace(/&/g, '&') + const maybeAddress = getValidAddress({ address: uri, platform: Platform.EVM, @@ -72,7 +75,7 @@ export async function getSupportedURI( (await getWcUriWithCustomPrefix(uri, CUSTOM_UNI_QR_CODE_PREFIX)) || (await getWcUriWithCustomPrefix(uri, UNISWAP_URL_SCHEME_WALLETCONNECT_AS_PARAM)) || (await getWcUriWithCustomPrefix(uri, UNISWAP_URL_SCHEME)) || - (await getWcUriWithCustomPrefix(decodeURIComponent(uri), UNISWAP_WALLETCONNECT_URL)) || + (await getWcUriWithCustomPrefix(uri, UNISWAP_WALLETCONNECT_URL)) || {} if (maybeCustomWcUri && type) { @@ -147,6 +150,22 @@ export function getScantasticQueryParams(uri: string): Nullable { return uriParts[1] || null } +function safeDecodeURIComponent(value: string): string { + try { + return decodeURIComponent(value) + } catch (e) { + logger.error(new Error('Failed to decode URI component'), { + tags: { + file: 'util.ts', + function: 'safeDecodeURIComponent', + }, + extra: { value, error: e }, + }) + // If decoding fails, return the original value + return value + } +} + const PARAM_PUB_KEY = 'pubKey' const PARAM_UUID = 'uuid' const PARAM_VENDOR = 'vendor' @@ -181,10 +200,10 @@ export function parseScantasticParams(uri: string): ScantasticParams | undefined try { return ScantasticParamsSchema.parse({ publicKey: publicKey ? JSON.parse(publicKey) : undefined, - uuid: uuid ? decodeURIComponent(uuid) : undefined, - vendor: vendor ? decodeURIComponent(vendor) : undefined, - model: model ? decodeURIComponent(model) : undefined, - browser: browser ? decodeURIComponent(browser) : undefined, + uuid: uuid ? safeDecodeURIComponent(uuid) : undefined, + vendor: vendor ? safeDecodeURIComponent(vendor) : undefined, + model: model ? safeDecodeURIComponent(model) : undefined, + browser: browser ? safeDecodeURIComponent(browser) : undefined, }) } catch (e) { const wrappedError = new Error('Invalid scantastic params', { cause: e }) diff --git a/apps/mobile/src/components/Requests/Uwulink/utils.ts b/apps/mobile/src/components/Requests/Uwulink/utils.ts index a600453c6dc..5fede7fe5ea 100644 --- a/apps/mobile/src/components/Requests/Uwulink/utils.ts +++ b/apps/mobile/src/components/Requests/Uwulink/utils.ts @@ -1,15 +1,15 @@ -import { parseEther } from 'ethers/lib/utils' -import { WalletConnectSigningRequest } from 'src/features/walletConnect/walletConnectSlice' -import { AssetType } from 'uniswap/src/entities/assets' -import { SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types' -import { EthMethod } from 'uniswap/src/features/dappRequests/types' import { DynamicConfigs, UwULinkAllowlist, UwULinkAllowlistItem, UwuLinkConfigKey, -} from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' + useDynamicConfigValue, +} from '@universe/gating' +import { parseEther } from 'ethers/lib/utils' +import { WalletConnectSigningRequest } from 'src/features/walletConnect/walletConnectSlice' +import { AssetType } from 'uniswap/src/entities/assets' +import { SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types' +import { EthMethod } from 'uniswap/src/features/dappRequests/types' import { isUwULinkAllowlistType } from 'uniswap/src/features/gating/typeGuards' import { DappRequestType, diff --git a/apps/mobile/src/components/TokenDetails/TokenDetailsBridgedAssetSection.tsx b/apps/mobile/src/components/TokenDetails/TokenDetailsBridgedAssetSection.tsx index 840d9c10050..cd3aecd60b1 100644 --- a/apps/mobile/src/components/TokenDetails/TokenDetailsBridgedAssetSection.tsx +++ b/apps/mobile/src/components/TokenDetails/TokenDetailsBridgedAssetSection.tsx @@ -1,8 +1,6 @@ -import { useMemo } from 'react' import { navigate } from 'src/app/navigation/rootNavigation' import { useTokenDetailsContext } from 'src/components/TokenDetails/TokenDetailsContext' import { BridgedAssetTDPSection } from 'uniswap/src/components/BridgedAsset/BridgedAssetTDPSection' -import { checkIsBridgedAsset } from 'uniswap/src/components/BridgedAsset/utils' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { useCurrencyInfo } from 'uniswap/src/features/tokens/useCurrencyInfo' import { CurrencyField } from 'uniswap/src/types/currency' @@ -29,7 +27,7 @@ export function TokenDetailsBridgedAssetSection(): JSX.Element | null { }, }) }) - const isBridgedAsset = useMemo(() => currencyInfo && checkIsBridgedAsset(currencyInfo), [currencyInfo]) + const isBridgedAsset = Boolean(currencyInfo?.isBridged) if (!isBridgedAsset || !currencyInfo) { return null } diff --git a/apps/mobile/src/components/accounts/AccountHeader.tsx b/apps/mobile/src/components/accounts/AccountHeader.tsx index 040684b16b8..5b29965af69 100644 --- a/apps/mobile/src/components/accounts/AccountHeader.tsx +++ b/apps/mobile/src/components/accounts/AccountHeader.tsx @@ -1,4 +1,5 @@ import { SharedEventName } from '@uniswap/analytics-events' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { useCallback, useEffect } from 'react' import { Gesture, GestureDetector, State } from 'react-native-gesture-handler' import Animated, { runOnJS, useAnimatedStyle, useSharedValue, withDelay, withTiming } from 'react-native-reanimated' @@ -11,8 +12,6 @@ import { CopyAlt, ScanHome, SettingsHome } from 'ui/src/components/icons' import { ScannerModalState } from 'uniswap/src/components/ReceiveQRCode/constants' import { AccountIcon } from 'uniswap/src/features/accounts/AccountIcon' import { AccountType, DisplayNameType } from 'uniswap/src/features/accounts/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' import { AppNotificationType, CopyNotificationType } from 'uniswap/src/features/notifications/slice/types' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' @@ -39,7 +38,7 @@ const RotatingSettingsIcon = ({ onPressSettings }: { onPressSettings(): void }): if (isScreenFocused) { pressProgress.value = withDelay(50, withTiming(0)) } - }, [isScreenFocused, pressProgress]) + }, [isScreenFocused]) const tap = Gesture.Tap() .withTestId(TestID.AccountHeaderSettings) diff --git a/apps/mobile/src/components/activity/ActivityContent.tsx b/apps/mobile/src/components/activity/ActivityContent.tsx index bdbab3bf204..ed12c5ecaaa 100644 --- a/apps/mobile/src/components/activity/ActivityContent.tsx +++ b/apps/mobile/src/components/activity/ActivityContent.tsx @@ -1,6 +1,7 @@ import type { LegendListRef } from '@legendapp/list' import { LegendList } from '@legendapp/list' import { useScrollToTop } from '@react-navigation/native' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import type { ForwardedRef } from 'react' import { forwardRef, memo, useMemo, useRef } from 'react' import type { FlatList } from 'react-native' @@ -17,14 +18,13 @@ import { openModal } from 'src/features/modals/modalSlice' import { removePendingSession } from 'src/features/walletConnect/walletConnectSlice' import { Flex, useSporeColors } from 'ui/src' import { ScannerModalState } from 'uniswap/src/components/ReceiveQRCode/constants' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { DDRumManualTiming } from 'utilities/src/logger/datadog/datadogEvents' import { usePerformanceLogger } from 'utilities/src/logger/usePerformanceLogger' import { isAndroid } from 'utilities/src/platform' +import { useEvent } from 'utilities/src/react/hooks' import { useActivityDataWallet } from 'wallet/src/features/activity/useActivityDataWallet' const ESTIMATED_ITEM_SIZE = 92 @@ -55,11 +55,11 @@ export const ActivityContent = memo( const { onContentSizeChange, adaptiveFooter } = useAdaptiveFooter(containerProps?.contentContainerStyle) - const onPressReceive = (): void => { + const onPressReceive = useEvent((): void => { // in case we received a pending session from a previous scan after closing modal dispatch(removePendingSession()) dispatch(openModal({ name: ModalName.WalletConnectScan, initialState: ScannerModalState.WalletQr })) - } + }) const { maybeEmptyComponent, renderActivityItem, sectionData, keyExtractor } = useActivityDataWallet({ evmOwner: owner, @@ -105,6 +105,9 @@ export const ActivityContent = memo( ListEmptyComponent={maybeEmptyComponent} ListFooterComponent={isExternalProfile ? null : adaptiveFooter} contentContainerStyle={containerProps?.contentContainerStyle} + refreshControl={refreshControl} + refreshing={refreshing} + onContentSizeChange={onContentSizeChange} /> ) : ( { // @ts-expect-error https://github.com/software-mansion/react-native-reanimated/issues/2976 myRef.current?._listRef._scrollRef.scrollTo({ x: Math.floor(scroll.value / fullWidth - 0.5) * fullWidth, }) - }, [fullWidth, scroll]) + }, [fullWidth]) return ( diff --git a/apps/mobile/src/components/explore/ExploreSections/ExploreSections.tsx b/apps/mobile/src/components/explore/ExploreSections/ExploreSections.tsx index 26d19b1252f..edda8bccac5 100644 --- a/apps/mobile/src/components/explore/ExploreSections/ExploreSections.tsx +++ b/apps/mobile/src/components/explore/ExploreSections/ExploreSections.tsx @@ -6,6 +6,7 @@ import { TokenStats, } from '@uniswap/client-explore/dist/uniswap/explore/v1/service_pb' import { ALL_NETWORKS_ARG } from '@universe/api' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { @@ -34,8 +35,6 @@ import { BaseCard } from 'uniswap/src/components/BaseCard/BaseCard' import { useTokenRankingsQuery } from 'uniswap/src/data/rest/tokenRankings' import type { UniverseChainId } from 'uniswap/src/features/chains/types' import { fromGraphQLChain } from 'uniswap/src/features/chains/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { MobileEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' diff --git a/apps/mobile/src/components/explore/search/ExploreScreenSearchResultsList.tsx b/apps/mobile/src/components/explore/search/ExploreScreenSearchResultsList.tsx index 1ae943b09fb..49db351bbc5 100644 --- a/apps/mobile/src/components/explore/search/ExploreScreenSearchResultsList.tsx +++ b/apps/mobile/src/components/explore/search/ExploreScreenSearchResultsList.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { memo, useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { KeyboardAvoidingView } from 'react-native-keyboard-controller' @@ -5,8 +6,6 @@ import { ESTIMATED_BOTTOM_TABS_HEIGHT } from 'src/app/navigation/tabs/CustomTabB import { Flex, flexStyles, Text, TouchableArea } from 'ui/src' import { spacing } from 'ui/src/theme' import type { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { SearchModalNoQueryList } from 'uniswap/src/features/search/SearchModal/SearchModalNoQueryList' import { SearchModalResultsList } from 'uniswap/src/features/search/SearchModal/SearchModalResultsList' import { MOBILE_SEARCH_TABS, SearchTab } from 'uniswap/src/features/search/SearchModal/types' diff --git a/apps/mobile/src/components/home/HomeExploreTab.tsx b/apps/mobile/src/components/home/HomeExploreTab.tsx index a52b9881913..899a6fddaed 100644 --- a/apps/mobile/src/components/home/HomeExploreTab.tsx +++ b/apps/mobile/src/components/home/HomeExploreTab.tsx @@ -1,5 +1,6 @@ import { ReactNavigationPerformanceView } from '@shopify/react-native-performance-navigation' import { GraphQLApi } from '@universe/api' +import { DynamicConfigs, HomeScreenExploreTokensConfigKey, useDynamicConfigValue } from '@universe/gating' import { ForwardedRef, forwardRef, memo, useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { FlatList, LayoutRectangle, RefreshControl } from 'react-native' @@ -15,8 +16,6 @@ import { SwirlyArrowDown } from 'ui/src/components/icons' import { spacing, zIndexes } from 'ui/src/theme' import { fromGraphQLChain } from 'uniswap/src/features/chains/utils' import { useAppFiatCurrency } from 'uniswap/src/features/fiatCurrency/hooks' -import { DynamicConfigs, HomeScreenExploreTokensConfigKey } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { isContractInputArrayType } from 'uniswap/src/features/gating/typeGuards' import { MobileEventName } from 'uniswap/src/features/telemetry/constants' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' diff --git a/apps/mobile/src/components/home/TokensTab.tsx b/apps/mobile/src/components/home/TokensTab.tsx index 9b41db908a6..b5da1f62cb5 100644 --- a/apps/mobile/src/components/home/TokensTab.tsx +++ b/apps/mobile/src/components/home/TokensTab.tsx @@ -1,4 +1,5 @@ import { useStartProfiler } from '@shopify/react-native-performance' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { forwardRef, memo, useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { FlatList } from 'react-native' @@ -14,8 +15,6 @@ import { NoTokens } from 'ui/src/components/icons' import { BaseCard } from 'uniswap/src/components/BaseCard/BaseCard' import { PortfolioEmptyState } from 'uniswap/src/components/portfolio/PortfolioEmptyState' import { ScannerModalState } from 'uniswap/src/components/ReceiveQRCode/constants' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { TokenBalanceListRow } from 'uniswap/src/features/portfolio/types' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { CurrencyId } from 'uniswap/src/types/currency' diff --git a/apps/mobile/src/components/home/hooks.tsx b/apps/mobile/src/components/home/hooks.tsx index c216431ac85..e5b8826f637 100644 --- a/apps/mobile/src/components/home/hooks.tsx +++ b/apps/mobile/src/components/home/hooks.tsx @@ -1,6 +1,8 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback, useEffect, useMemo } from 'react' import { StyleProp, ViewStyle } from 'react-native' import Animated, { SharedValue, useAnimatedStyle, useSharedValue } from 'react-native-reanimated' +import { ESTIMATED_BOTTOM_TABS_HEIGHT } from 'src/app/navigation/tabs/CustomTabBar/constants' import { TAB_BAR_HEIGHT } from 'src/components/layout/TabHelpers' import { useDeviceDimensions } from 'ui/src/hooks/useDeviceDimensions' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' @@ -13,6 +15,9 @@ export function useAdaptiveFooter(contentContainerStyle?: StyleProp): } { const { fullHeight } = useDeviceDimensions() const insets = useAppInsets() + const isBottomTabsEnabled = useFeatureFlag(FeatureFlags.BottomTabs) + + const HEIGHT_TO_SUBTRACT = isBottomTabsEnabled ? ESTIMATED_BOTTOM_TABS_HEIGHT : TAB_BAR_HEIGHT // Content is rendered under the navigation bar but not under the status bar const maxContentHeight = fullHeight - insets.top // Use maxContentHeight as the initial value to properly position the TabBar @@ -28,7 +33,7 @@ export function useAdaptiveFooter(contentContainerStyle?: StyleProp): } // The height of the footer added to the list can be calculated from // the following equation (for collapsed tab bar): - // maxContentHeight = TAB_BAR_HEIGHT + + footerHeight + paddingBottom + // maxContentHeight = HEIGHT_TO_SUBTRACT + + footerHeight + paddingBottom // // To get the we need to subtract padding already // added to the content container style and the footer if it's already @@ -36,17 +41,17 @@ export function useAdaptiveFooter(contentContainerStyle?: StyleProp): // = contentHeight - paddingTop - paddingBottom - footerHeight // // The resulting equation is: - // footerHeight = maxContentHeight - - TAB_BAR_HEIGHT - paddingBottom - // = maxContentHeight - (contentHeight - paddingTop - paddingBottom - footerHeight) - TAB_BAR_HEIGHT - paddingBottom - // = maxContentHeight + paddingTop + footerHeight - (contentHeight + TAB_BAR_HEIGHT) + // footerHeight = maxContentHeight - - HEIGHT_TO_SUBTRACT - paddingBottom + // = maxContentHeight - (contentHeight - paddingTop - paddingBottom - footerHeight) - HEIGHT_TO_SUBTRACT - paddingBottom + // = maxContentHeight + paddingTop + footerHeight - (contentHeight + HEIGHT_TO_SUBTRACT) const paddingTopProp = (contentContainerStyle as ViewStyle).paddingTop const paddingTop = typeof paddingTopProp === 'number' ? paddingTopProp : 0 const calculatedFooterHeight = - maxContentHeight + paddingTop + footerHeight.value - (contentHeight + TAB_BAR_HEIGHT) + maxContentHeight + paddingTop + footerHeight.value - (contentHeight + HEIGHT_TO_SUBTRACT) footerHeight.value = Math.max(0, calculatedFooterHeight) }, - [footerHeight, contentContainerStyle, maxContentHeight], + [contentContainerStyle, maxContentHeight, HEIGHT_TO_SUBTRACT], ) // biome-ignore lint/correctness/useExhaustiveDependencies: we want to recalculate this when activeAccount changes diff --git a/apps/mobile/src/components/home/introCards/FundWalletModal.tsx b/apps/mobile/src/components/home/introCards/FundWalletModal.tsx index 67565c140cf..35c592bf7ee 100644 --- a/apps/mobile/src/components/home/introCards/FundWalletModal.tsx +++ b/apps/mobile/src/components/home/introCards/FundWalletModal.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { PropsWithChildren, useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { FlatList } from 'react-native' @@ -13,8 +14,6 @@ import { ActionCard, ActionCardItem } from 'uniswap/src/components/misc/ActionCa import { Modal } from 'uniswap/src/components/modals/Modal' import { ImageUri } from 'uniswap/src/components/nfts/images/ImageUri' import { useCexTransferProviders } from 'uniswap/src/features/fiatOnRamp/useCexTransferProviders' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import { usePortfolioEmptyStateBackground } from 'wallet/src/components/portfolio/empty' diff --git a/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx b/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx index a03ea0a749d..910a539088f 100644 --- a/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx +++ b/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx @@ -1,4 +1,5 @@ import { SharedEventName } from '@uniswap/analytics-events' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' @@ -12,8 +13,6 @@ import { BRIDGED_ASSETS_CARD_BANNER, PUSH_NOTIFICATIONS_CARD_BANNER } from 'ui/s import { Buy } from 'ui/src/components/icons' import { AccountType } from 'uniswap/src/features/accounts/types' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ElementName, ModalName, WalletEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { OnboardingCardLoggingName } from 'uniswap/src/features/telemetry/types' diff --git a/apps/mobile/src/components/layout/TabHelpers.tsx b/apps/mobile/src/components/layout/TabHelpers.tsx index 3cbea4bdbc6..e09383d79f3 100644 --- a/apps/mobile/src/components/layout/TabHelpers.tsx +++ b/apps/mobile/src/components/layout/TabHelpers.tsx @@ -1,5 +1,6 @@ /* eslint-disable react-native/no-unused-styles */ import { FlashList, FlashListProps } from '@shopify/flash-list' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { RefObject, useCallback, useMemo } from 'react' import { FlatList, @@ -14,8 +15,6 @@ import Animated, { SharedValue } from 'react-native-reanimated' import { Route } from 'react-native-tab-view' import { Flex, Text } from 'ui/src' import { colorsLight, spacing } from 'ui/src/theme' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { TestIDType } from 'uniswap/src/test/fixtures/testIDs' import { PendingNotificationBadge } from 'wallet/src/features/notifications/components/PendingNotificationBadge' diff --git a/apps/mobile/src/components/loading/parts/WaveLoader.tsx b/apps/mobile/src/components/loading/parts/WaveLoader.tsx index 8eb6baa7881..202eb9da63b 100644 --- a/apps/mobile/src/components/loading/parts/WaveLoader.tsx +++ b/apps/mobile/src/components/loading/parts/WaveLoader.tsx @@ -19,7 +19,6 @@ export function WaveLoader(): JSX.Element { const yPosition = useSharedValue(0) const { chartHeight } = useChartDimensions() - // biome-ignore lint/correctness/useExhaustiveDependencies: only want to do this once on mount useEffect(() => { yPosition.value = withRepeat(withTiming(1, { duration: WAVE_DURATION }), Infinity, false) }, []) diff --git a/apps/mobile/src/features/datadog/DatadogProviderWrapper.tsx b/apps/mobile/src/features/datadog/DatadogProviderWrapper.tsx index b307753f982..33cc7e78ee6 100644 --- a/apps/mobile/src/features/datadog/DatadogProviderWrapper.tsx +++ b/apps/mobile/src/features/datadog/DatadogProviderWrapper.tsx @@ -8,15 +8,15 @@ import { UploadFrequency, } from '@datadog/mobile-react-native' import { ErrorEventMapper } from '@datadog/mobile-react-native/lib/typescript/rum/eventMappers/errorEventMapper' -import { PropsWithChildren, default as React, useEffect, useState } from 'react' -import { DatadogContext } from 'src/features/datadog/DatadogContext' -import { config } from 'uniswap/src/config' import { DatadogIgnoredErrorsConfigKey, DatadogIgnoredErrorsValType, DynamicConfigs, -} from 'uniswap/src/features/gating/configs' -import { getDynamicConfigValue } from 'uniswap/src/features/gating/hooks' + getDynamicConfigValue, +} from '@universe/gating' +import { PropsWithChildren, default as React, useEffect, useState } from 'react' +import { DatadogContext } from 'src/features/datadog/DatadogContext' +import { config } from 'uniswap/src/config' import { datadogEnabledBuild, isTestRun, localDevDatadogEnabled } from 'utilities/src/environment/constants' import { setAttributesToDatadog } from 'utilities/src/logger/datadog/Datadog' import { getDatadogEnvironment } from 'utilities/src/logger/datadog/env' diff --git a/apps/mobile/src/features/deepLinking/configUtils.ts b/apps/mobile/src/features/deepLinking/configUtils.ts index f6047a337dd..19231b35d75 100644 --- a/apps/mobile/src/features/deepLinking/configUtils.ts +++ b/apps/mobile/src/features/deepLinking/configUtils.ts @@ -2,10 +2,10 @@ import { DeepLinkUrlAllowlist, DeepLinkUrlAllowlistConfigKey, DynamicConfigs, + getDynamicConfigValue, UwULinkAllowlist, UwuLinkConfigKey, -} from 'uniswap/src/features/gating/configs' -import { getDynamicConfigValue } from 'uniswap/src/features/gating/hooks' +} from '@universe/gating' import { isUwULinkAllowlistType } from 'uniswap/src/features/gating/typeGuards' /** diff --git a/apps/mobile/src/features/deepLinking/deepLinkUtils.ts b/apps/mobile/src/features/deepLinking/deepLinkUtils.ts index a25138e2060..318a9e14845 100644 --- a/apps/mobile/src/features/deepLinking/deepLinkUtils.ts +++ b/apps/mobile/src/features/deepLinking/deepLinkUtils.ts @@ -1,3 +1,4 @@ +import { DeepLinkUrlAllowlist } from '@universe/gating' import { getScantasticQueryParams } from 'src/components/Requests/ScanSheet/util' import { UNISWAP_URL_SCHEME_UWU_LINK } from 'src/components/Requests/Uwulink/utils' import { getInAppBrowserAllowlist } from 'src/features/deepLinking/configUtils' @@ -8,7 +9,6 @@ import { UNISWAP_WALLETCONNECT_URL, } from 'src/features/deepLinking/constants' import { UNISWAP_WEB_HOSTNAME } from 'uniswap/src/constants/urls' -import { DeepLinkUrlAllowlist } from 'uniswap/src/features/gating/configs' import { isCurrencyIdValid } from 'uniswap/src/utils/currencyId' import { logger } from 'utilities/src/logger/logger' diff --git a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts index 170a0955994..9424abf457a 100644 --- a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts +++ b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts @@ -42,13 +42,11 @@ jest.mock('expo-web-browser', () => ({ FULL_SCREEN: 'fullScreen', }, })) -jest.mock('uniswap/src/features/gating/sdk/statsig', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), getStatsigClient: jest.fn(() => ({ checkGate: jest.fn(() => false), // Always return false to avoid Korea gate redirects })), -})) - -jest.mock('uniswap/src/features/gating/hooks', () => ({ getFeatureFlag: jest.fn(() => false), // Default to false for feature flags })) diff --git a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts index a9afe70a1a0..c115585ae5b 100644 --- a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts +++ b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts @@ -1,4 +1,5 @@ import { createAction } from '@reduxjs/toolkit' +import { FeatureFlags, getFeatureFlagName, getStatsigClient } from '@universe/gating' import { parseUri } from '@walletconnect/utils' import { Alert } from 'react-native' import { navigate } from 'src/app/navigation/rootNavigation' @@ -29,8 +30,6 @@ import { waitForWcWeb3WalletIsReady } from 'src/features/walletConnect/walletCon import { addRequest, setDidOpenFromDeepLink } from 'src/features/walletConnect/walletConnectSlice' import { call, delay, put, select, takeLatest } from 'typed-redux-saga' import { AccountType } from 'uniswap/src/features/accounts/types' -import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' import { MobileEventName, ModalName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import i18n from 'uniswap/src/i18n' diff --git a/apps/mobile/src/features/deepLinking/handleOnRampReturnLinkSaga.ts b/apps/mobile/src/features/deepLinking/handleOnRampReturnLinkSaga.ts index da904ede2ea..8edff2d8379 100644 --- a/apps/mobile/src/features/deepLinking/handleOnRampReturnLinkSaga.ts +++ b/apps/mobile/src/features/deepLinking/handleOnRampReturnLinkSaga.ts @@ -1,9 +1,8 @@ +import { FeatureFlags, getFeatureFlag } from '@universe/gating' import { navigate } from 'src/app/navigation/rootNavigation' import { HomeScreenTabIndex } from 'src/screens/HomeScreen/HomeScreenTabIndex' import { dismissInAppBrowser } from 'src/utils/linking' import { call, put } from 'typed-redux-saga' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag } from 'uniswap/src/features/gating/hooks' import { forceFetchFiatOnRampTransactions } from 'uniswap/src/features/transactions/slice' import { MobileScreens } from 'uniswap/src/types/screens/mobile' diff --git a/apps/mobile/src/features/deepLinking/handleTransactionLinkSaga.ts b/apps/mobile/src/features/deepLinking/handleTransactionLinkSaga.ts index fefafa0b2dd..c6e5d16b175 100644 --- a/apps/mobile/src/features/deepLinking/handleTransactionLinkSaga.ts +++ b/apps/mobile/src/features/deepLinking/handleTransactionLinkSaga.ts @@ -1,9 +1,8 @@ +import { FeatureFlags, getFeatureFlag } from '@universe/gating' import { navigate } from 'src/app/navigation/rootNavigation' import { closeAllModals } from 'src/features/modals/modalSlice' import { HomeScreenTabIndex } from 'src/screens/HomeScreen/HomeScreenTabIndex' import { call, put } from 'typed-redux-saga' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag } from 'uniswap/src/features/gating/hooks' import { MobileScreens } from 'uniswap/src/types/screens/mobile' export function* handleTransactionLink() { diff --git a/apps/mobile/src/features/lockScreen/LockScreenModal.tsx b/apps/mobile/src/features/lockScreen/LockScreenModal.tsx index e1c19214daf..91addda367a 100644 --- a/apps/mobile/src/features/lockScreen/LockScreenModal.tsx +++ b/apps/mobile/src/features/lockScreen/LockScreenModal.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { BlurView } from 'expo-blur' import React, { memo } from 'react' import { useTranslation } from 'react-i18next' @@ -15,8 +16,6 @@ import { UNISWAP_MONO_LOGO_LARGE } from 'ui/src/assets' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { useDeviceDimensions } from 'ui/src/hooks/useDeviceDimensions' import { spacing, zIndexes } from 'ui/src/theme' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' import { isAndroid } from 'utilities/src/platform' import { useEvent } from 'utilities/src/react/hooks' diff --git a/apps/mobile/src/features/send/SendFormButton.tsx b/apps/mobile/src/features/send/SendFormButton.tsx index 2b7019008c5..82bf9ea84db 100644 --- a/apps/mobile/src/features/send/SendFormButton.tsx +++ b/apps/mobile/src/features/send/SendFormButton.tsx @@ -2,7 +2,6 @@ import React, { Dispatch, SetStateAction, useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import { Button, Flex } from 'ui/src' -import { checkIsBridgedAsset } from 'uniswap/src/components/BridgedAsset/utils' import { WarningLabel } from 'uniswap/src/components/modals/WarningModal/types' import { nativeOnChain } from 'uniswap/src/constants/tokens' import { AccountType } from 'uniswap/src/features/accounts/types' @@ -60,7 +59,7 @@ export function SendFormButton({ const { tokenWarningDismissed: isCompatibleAddressDismissed } = useDismissedCompatibleAddressWarnings( currencyInInfo?.currency, ) - const isUnichainBridgedAsset = checkIsBridgedAsset(currencyInInfo ?? undefined) && !isCompatibleAddressDismissed + const isUnichainBridgedAsset = Boolean(currencyInInfo?.isBridged) && !isCompatibleAddressDismissed const insufficientGasFunds = warnings.warnings.some((warning) => warning.type === WarningLabel.InsufficientGasFunds) diff --git a/apps/mobile/src/features/wallet/useWalletRestore.ts b/apps/mobile/src/features/wallet/useWalletRestore.ts index 00c8d30154b..d0e4e6214aa 100644 --- a/apps/mobile/src/features/wallet/useWalletRestore.ts +++ b/apps/mobile/src/features/wallet/useWalletRestore.ts @@ -1,9 +1,8 @@ import { useFocusEffect } from '@react-navigation/core' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback, useEffect, useRef, useState } from 'react' import { navigate } from 'src/app/navigation/rootNavigation' import { WalletRestoreType } from 'src/components/RestoreWalletModal/RestoreWalletModalState' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { logger } from 'utilities/src/logger/logger' import { useSignerAccounts } from 'wallet/src/features/wallet/hooks' diff --git a/apps/mobile/src/features/walletConnect/batchedTransactionSaga.ts b/apps/mobile/src/features/walletConnect/batchedTransactionSaga.ts index 15cd9d3e14b..ae825ac1a3d 100644 --- a/apps/mobile/src/features/walletConnect/batchedTransactionSaga.ts +++ b/apps/mobile/src/features/walletConnect/batchedTransactionSaga.ts @@ -1,4 +1,5 @@ import { TradingApi } from '@universe/api' +import { FeatureFlags, getFeatureFlag } from '@universe/gating' import { getInternalError, getSdkError } from '@walletconnect/utils' import { navigate } from 'src/app/navigation/rootNavigation' import { wcWeb3Wallet } from 'src/features/walletConnect/walletConnectClient' @@ -7,8 +8,6 @@ import { call, put, select } from 'typed-redux-saga' import { UNISWAP_DELEGATION_ADDRESS } from 'uniswap/src/constants/addresses' import { checkWalletDelegation, TradingApiClient } from 'uniswap/src/data/apiClients/tradingApi/TradingApiClient' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag } from 'uniswap/src/features/gating/hooks' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { getEnabledChainIdsSaga } from 'uniswap/src/features/settings/saga' import { ModalName } from 'uniswap/src/features/telemetry/constants' diff --git a/apps/mobile/src/features/walletConnect/saga.ts b/apps/mobile/src/features/walletConnect/saga.ts index ed6d1af97bb..b52b1b8d603 100644 --- a/apps/mobile/src/features/walletConnect/saga.ts +++ b/apps/mobile/src/features/walletConnect/saga.ts @@ -1,6 +1,7 @@ /* eslint-disable max-lines */ import { AnyAction } from '@reduxjs/toolkit' import { WalletKitTypes } from '@reown/walletkit' +import { FeatureFlags, getFeatureFlag } from '@universe/gating' import { PendingRequestTypes, ProposalTypes, SessionTypes, Verify } from '@walletconnect/types' import { buildApprovedNamespaces, getSdkError, populateAuthPayload } from '@walletconnect/utils' import { Alert } from 'react-native' @@ -39,8 +40,6 @@ import { UniverseChainId } from 'uniswap/src/features/chains/types' import { getChainLabel } from 'uniswap/src/features/chains/utils' import { EthMethod } from 'uniswap/src/features/dappRequests/types' import { isSelfCallWithData } from 'uniswap/src/features/dappRequests/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag } from 'uniswap/src/features/gating/hooks' import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' import { Platform } from 'uniswap/src/features/platforms/types/Platform' diff --git a/apps/mobile/src/screens/ActivityScreen.tsx b/apps/mobile/src/screens/ActivityScreen.tsx index d3005fa1c06..5ab318ab1fa 100644 --- a/apps/mobile/src/screens/ActivityScreen.tsx +++ b/apps/mobile/src/screens/ActivityScreen.tsx @@ -2,16 +2,16 @@ import { useApolloClient } from '@apollo/client' import { useScrollToTop } from '@react-navigation/native' import { useQuery } from '@tanstack/react-query' import { GQLQueries } from '@universe/api' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback, useEffect, useMemo, useRef } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' import { ESTIMATED_BOTTOM_TABS_HEIGHT } from 'src/app/navigation/tabs/CustomTabBar/constants' import { ActivityContent } from 'src/components/activity/ActivityContent' import { Screen } from 'src/components/layout/Screen' +import { useAppStateTrigger } from 'src/utils/useAppStateTrigger' import { Text } from 'ui/src' import { spacing } from 'ui/src/theme' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useSelectAddressHasNotifications } from 'uniswap/src/features/notifications/slice/hooks' import { setNotificationStatus } from 'uniswap/src/features/notifications/slice/slice' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' @@ -49,6 +49,13 @@ export function ActivityScreen(): JSX.Element { const { refreshing, onRefreshActivityData } = useRefreshActivityData(activeAccount.address) + // Automatically refresh activity data when app comes to foreground + useAppStateTrigger({ + from: 'background', + to: 'active', + callback: onRefreshActivityData, + }) + const insets = useAppInsets() const isBottomTabsEnabled = useFeatureFlag(FeatureFlags.BottomTabs) diff --git a/apps/mobile/src/screens/AppLoadingScreen.tsx b/apps/mobile/src/screens/AppLoadingScreen.tsx index 27192763892..10f97edf4aa 100644 --- a/apps/mobile/src/screens/AppLoadingScreen.tsx +++ b/apps/mobile/src/screens/AppLoadingScreen.tsx @@ -1,4 +1,5 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack' +import { DynamicConfigs, OnDeviceRecoveryConfigKey, useDynamicConfigValue } from '@universe/gating' import dayjs from 'dayjs' import { isEnrolledAsync } from 'expo-local-authentication' import { useCallback, useEffect, useState } from 'react' @@ -15,8 +16,6 @@ import { import { useHideSplashScreen } from 'src/features/splashScreen/useHideSplashScreen' import { RecoveryWalletInfo, useOnDeviceRecoveryData } from 'src/screens/Import/useOnDeviceRecoveryData' import { AccountType } from 'uniswap/src/features/accounts/types' -import { DynamicConfigs, OnDeviceRecoveryConfigKey } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { MobileEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import Trace from 'uniswap/src/features/telemetry/Trace' diff --git a/apps/mobile/src/screens/ExploreScreen.tsx b/apps/mobile/src/screens/ExploreScreen.tsx index ff0cbf76986..136fc7bcaa6 100644 --- a/apps/mobile/src/screens/ExploreScreen.tsx +++ b/apps/mobile/src/screens/ExploreScreen.tsx @@ -1,5 +1,6 @@ import { useIsFocused, useNavigation, useScrollToTop } from '@react-navigation/native' import { SharedEventName } from '@uniswap/analytics-events' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { type TextInput } from 'react-native' @@ -16,8 +17,6 @@ import { HandleBar } from 'uniswap/src/components/modals/HandleBar' import { NetworkFilter, type NetworkFilterProps } from 'uniswap/src/components/network/NetworkFilter' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import type { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useFilterCallbacks } from 'uniswap/src/features/search/SearchModal/hooks/useFilterCallbacks' import { CancelBehaviorType, SearchTextInput } from 'uniswap/src/features/search/SearchTextInput' import { MobileEventName, ModalName, SectionName } from 'uniswap/src/features/telemetry/constants' @@ -98,7 +97,7 @@ export function ExploreScreen(): JSX.Element { }) return unsubscribe - }, [isBottomTabsEnabled, navigation, listRef]) + }, [isBottomTabsEnabled, navigation]) // TODO(WALL-5482): investigate list rendering performance/scrolling issue const canRenderList = useRenderNextFrame(isSheetReady && !isSearchMode) diff --git a/apps/mobile/src/screens/HomeScreen/HomeScreen.tsx b/apps/mobile/src/screens/HomeScreen/HomeScreen.tsx index c57c24a05d1..e9d87ab7df3 100644 --- a/apps/mobile/src/screens/HomeScreen/HomeScreen.tsx +++ b/apps/mobile/src/screens/HomeScreen/HomeScreen.tsx @@ -2,6 +2,7 @@ import { useApolloClient } from '@apollo/client' import { useIsFocused, useScrollToTop } from '@react-navigation/native' import { SharedQueryClient } from '@universe/api' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { Freeze } from 'react-freeze' import { useTranslation } from 'react-i18next' @@ -52,8 +53,6 @@ import { NFTS_TAB_DATA_DEPENDENCIES } from 'uniswap/src/components/nfts/constant import { getPortfolioQuery } from 'uniswap/src/data/rest/getPortfolio' import { getListTransactionsQuery } from 'uniswap/src/data/rest/listTransactions' import { AccountType } from 'uniswap/src/features/accounts/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useSelectAddressHasNotifications } from 'uniswap/src/features/notifications/slice/hooks' import { setNotificationStatus } from 'uniswap/src/features/notifications/slice/slice' import { PortfolioBalance } from 'uniswap/src/features/portfolio/PortfolioBalance/PortfolioBalance' diff --git a/apps/mobile/src/screens/HomeScreen/HomeScreenQuickActions.tsx b/apps/mobile/src/screens/HomeScreen/HomeScreenQuickActions.tsx index 30cf4f84917..44b5ac900e0 100644 --- a/apps/mobile/src/screens/HomeScreen/HomeScreenQuickActions.tsx +++ b/apps/mobile/src/screens/HomeScreen/HomeScreenQuickActions.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { FlatList, ListRenderItemInfo } from 'react-native' @@ -10,8 +11,6 @@ import { ArrowDownCircle, Bank, SendAction, SwapDotted } from 'ui/src/components import { iconSizes, spacing } from 'ui/src/theme' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { useHighestBalanceNativeCurrencyId } from 'uniswap/src/features/dataApi/balances/balances' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useHapticFeedback } from 'uniswap/src/features/settings/useHapticFeedback/useHapticFeedback' import { ElementName, MobileEventName, ModalName } from 'uniswap/src/features/telemetry/constants' import { Trace } from 'uniswap/src/features/telemetry/Trace' diff --git a/apps/mobile/src/screens/Import/ImportMethodScreen.tsx b/apps/mobile/src/screens/Import/ImportMethodScreen.tsx index 572ca36bbcc..fe00d212b5d 100644 --- a/apps/mobile/src/screens/Import/ImportMethodScreen.tsx +++ b/apps/mobile/src/screens/Import/ImportMethodScreen.tsx @@ -1,4 +1,5 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { useState } from 'react' import { useTranslation } from 'react-i18next' import { navigate } from 'src/app/navigation/rootNavigation' @@ -17,8 +18,6 @@ import { Flex, SpinningLoader, Text, TouchableArea } from 'ui/src' import { Eye, WalletFilled } from 'ui/src/components/icons' import { useIsDarkMode } from 'ui/src/hooks/useIsDarkMode' import { iconSizes } from 'ui/src/theme' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { authenticateWithPasskeyForSeedPhraseExport } from 'uniswap/src/features/passkey/embeddedWallet' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' diff --git a/apps/mobile/src/screens/Import/OnDeviceRecoveryScreen.tsx b/apps/mobile/src/screens/Import/OnDeviceRecoveryScreen.tsx index 95c14285751..0172fcfffc9 100644 --- a/apps/mobile/src/screens/Import/OnDeviceRecoveryScreen.tsx +++ b/apps/mobile/src/screens/Import/OnDeviceRecoveryScreen.tsx @@ -1,6 +1,7 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack' import { ReactNavigationPerformanceView } from '@shopify/react-native-performance-navigation' import { SharedEventName } from '@uniswap/analytics-events' +import { DynamicConfigs, OnDeviceRecoveryConfigKey, useDynamicConfigValue } from '@universe/gating' import dayjs from 'dayjs' import React, { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -20,8 +21,6 @@ import { iconSizes } from 'ui/src/theme' import { WarningSeverity } from 'uniswap/src/components/modals/WarningModal/types' import { WarningModal } from 'uniswap/src/components/modals/WarningModal/WarningModal' import { AccountType } from 'uniswap/src/features/accounts/types' -import { DynamicConfigs, OnDeviceRecoveryConfigKey } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' diff --git a/apps/mobile/src/screens/Import/RestoreMethodScreen.tsx b/apps/mobile/src/screens/Import/RestoreMethodScreen.tsx index 994f0ce214b..d4b12c53b99 100644 --- a/apps/mobile/src/screens/Import/RestoreMethodScreen.tsx +++ b/apps/mobile/src/screens/Import/RestoreMethodScreen.tsx @@ -1,4 +1,5 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React from 'react' import { useTranslation } from 'react-i18next' import { OnboardingStackParamList } from 'src/app/navigation/types' @@ -13,8 +14,6 @@ import { useNavigationHeader } from 'src/utils/useNavigationHeader' import { Flex, Text, TouchableArea } from 'ui/src' import { WalletFilled } from 'ui/src/components/icons' import { useIsDarkMode } from 'ui/src/hooks/useIsDarkMode' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' import { TestID } from 'uniswap/src/test/fixtures/testIDs' diff --git a/apps/mobile/src/screens/Import/SelectWalletScreen.tsx b/apps/mobile/src/screens/Import/SelectWalletScreen.tsx index 8e0f065ad69..a661b53a19c 100644 --- a/apps/mobile/src/screens/Import/SelectWalletScreen.tsx +++ b/apps/mobile/src/screens/Import/SelectWalletScreen.tsx @@ -1,4 +1,5 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { ComponentProps, useCallback } from 'react' import { Trans, useTranslation } from 'react-i18next' import { ScrollView } from 'react-native' @@ -10,8 +11,6 @@ import { Button, Flex, Loader, Text, TouchableArea, useLayoutAnimationOnChange } import { WalletFilled } from 'ui/src/components/icons' import { spacing } from 'ui/src/theme' import { BaseCard } from 'uniswap/src/components/BaseCard/BaseCard' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' import { TestID } from 'uniswap/src/test/fixtures/testIDs' diff --git a/apps/mobile/src/screens/Onboarding/LandingScreen.tsx b/apps/mobile/src/screens/Onboarding/LandingScreen.tsx index e18fd5f0ac5..d4871955da3 100644 --- a/apps/mobile/src/screens/Onboarding/LandingScreen.tsx +++ b/apps/mobile/src/screens/Onboarding/LandingScreen.tsx @@ -1,5 +1,6 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack' import { ReactNavigationPerformanceView } from '@shopify/react-native-performance-navigation' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { useCallback, useEffect } from 'react' import { useTranslation } from 'react-i18next' import { useAnimatedStyle, useSharedValue, withDelay, withTiming } from 'react-native-reanimated' @@ -12,8 +13,6 @@ import { TermsOfService } from 'src/screens/Onboarding/TermsOfService' import { Button, Flex, Text, TouchableArea } from 'ui/src' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { setIsTestnetModeEnabled } from 'uniswap/src/features/settings/slice' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' @@ -40,7 +39,7 @@ export function LandingScreen({ navigation }: Props): JSX.Element { useEffect(() => { // disables looping animation during e2e tests which was preventing js thread from idle actionButtonsOpacity.value = withDelay(LANDING_ANIMATION_DURATION, withTiming(1, { duration: ONE_SECOND_MS })) - }, [actionButtonsOpacity]) + }, []) // Disables testnet mode on mount if enabled (eg upon removing a wallet) useEffect(() => { diff --git a/apps/mobile/src/screens/SettingsScreen.tsx b/apps/mobile/src/screens/SettingsScreen.tsx index 87db6bed817..8f4d3e83b9c 100644 --- a/apps/mobile/src/screens/SettingsScreen.tsx +++ b/apps/mobile/src/screens/SettingsScreen.tsx @@ -1,4 +1,5 @@ import { useNavigation } from '@react-navigation/core' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { default as React, useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { ListRenderItemInfo } from 'react-native' @@ -56,8 +57,6 @@ import { iconSizes } from 'ui/src/theme' import { uniswapUrls } from 'uniswap/src/constants/urls' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { useAppFiatCurrencyInfo } from 'uniswap/src/features/fiatCurrency/hooks' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useCurrentLanguageInfo } from 'uniswap/src/features/language/hooks' import { setIsTestnetModeEnabled } from 'uniswap/src/features/settings/slice' import { useHapticFeedback } from 'uniswap/src/features/settings/useHapticFeedback/useHapticFeedback' diff --git a/apps/mobile/src/screens/TokenDetailsScreen.tsx b/apps/mobile/src/screens/TokenDetailsScreen.tsx index 37413162e96..83a20f7ec10 100644 --- a/apps/mobile/src/screens/TokenDetailsScreen.tsx +++ b/apps/mobile/src/screens/TokenDetailsScreen.tsx @@ -25,7 +25,6 @@ import { Flex, Separator } from 'ui/src' import { ArrowDownCircle, ArrowUpCircle, Bank, SendRoundedAirplane } from 'ui/src/components/icons' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { BaseCard } from 'uniswap/src/components/BaseCard/BaseCard' -import { getBridgedAsset } from 'uniswap/src/components/BridgedAsset/utils' import type { MenuOptionItem } from 'uniswap/src/components/menus/ContextMenuV2' import { PollingInterval } from 'uniswap/src/constants/misc' import { useCrossChainBalances } from 'uniswap/src/data/balances/hooks/useCrossChainBalances' @@ -296,7 +295,7 @@ const TokenDetailsActionButtonsWrapper = memo(function _TokenDetailsActionButton }, 300) // delay is needed to prevent menu from not closing properly }, [currencyInfo]) - const bridgedAsset = getBridgedAsset(currencyInfo) + const bridgedWithdrawalInfo = currencyInfo?.bridgedWithdrawalInfo const isScreenNavigationReady = useIsScreenNavigationReady({ navigation }) @@ -320,12 +319,12 @@ const TokenDetailsActionButtonsWrapper = memo(function _TokenDetailsActionButton actions.push({ label: t('common.button.buy'), Icon: Bank, onPress: () => onPressBuyFiatOnRamp() }) } - if (!!bridgedAsset && hasTokenBalance) { + if (bridgedWithdrawalInfo && hasTokenBalance) { actions.push({ label: t('common.withdraw'), Icon: ArrowUpCircle, onPress: () => onPressWithdraw(), - subheader: t('bridgedAsset.wormhole.toNativeChain', { nativeChainName: bridgedAsset.nativeChain }), + subheader: t('bridgedAsset.wormhole.toNativeChain', { nativeChainName: bridgedWithdrawalInfo.chain }), actionType: 'external-link', height: 56, }) @@ -346,7 +345,7 @@ const TokenDetailsActionButtonsWrapper = memo(function _TokenDetailsActionButton }, [ fiatOnRampCurrency, t, - bridgedAsset, + bridgedWithdrawalInfo, hasTokenBalance, onPressWithdraw, onPressSend, diff --git a/apps/mobile/src/screens/ViewPrivateKeys/ViewPrivateKeysScreen.tsx b/apps/mobile/src/screens/ViewPrivateKeys/ViewPrivateKeysScreen.tsx index 618d1ae0c4d..5d5bf6a3765 100644 --- a/apps/mobile/src/screens/ViewPrivateKeys/ViewPrivateKeysScreen.tsx +++ b/apps/mobile/src/screens/ViewPrivateKeys/ViewPrivateKeysScreen.tsx @@ -1,5 +1,6 @@ import { CommonActions } from '@react-navigation/core' import { NativeStackScreenProps } from '@react-navigation/native-stack' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { ScrollView } from 'react-native-gesture-handler' @@ -17,8 +18,6 @@ import { AlertTriangleFilled } from 'ui/src/components/icons/AlertTriangleFilled import { HiddenWordView } from 'ui/src/components/placeholders/HiddenWordView' import { AddressDisplay } from 'uniswap/src/components/accounts/AddressDisplay' import { Modal } from 'uniswap/src/components/modals/Modal' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import { Trace } from 'uniswap/src/features/telemetry/Trace' import { TestID } from 'uniswap/src/test/fixtures/testIDs' diff --git a/apps/mobile/tsconfig.json b/apps/mobile/tsconfig.json index 0f4eef55ad2..94f3a6d681f 100644 --- a/apps/mobile/tsconfig.json +++ b/apps/mobile/tsconfig.json @@ -15,6 +15,9 @@ }, { "path": "../../packages/api" + }, + { + "path": "../../packages/gating" } ], "compilerOptions": { diff --git a/apps/web/.eslintrc.js b/apps/web/.eslintrc.js index 331eff80908..3f9abcfcb2b 100644 --- a/apps/web/.eslintrc.js +++ b/apps/web/.eslintrc.js @@ -21,6 +21,32 @@ module.exports = { }, overrides: [ + { + // Portfolio pages must not use useAccount directly. Use usePortfolioAddress (or a domain-specific hook) instead. + files: ['src/pages/Portfolio/*.{ts,tsx}', 'src/pages/Portfolio/**/*.{ts,tsx}'], + rules: { + 'no-restricted-imports': [ + 'error', + { + paths: [ + { + name: 'hooks/useAccount', + message: + "Do not import 'useAccount' in portfolio pages. Use 'pages/Portfolio/hooks/usePortfolioAddress' (or a domain-specific hook) instead.", + }, + ], + }, + ], + 'no-restricted-syntax': [ + 'error', + { + selector: 'CallExpression[callee.name="useAccount"]', + message: + "Do not call 'useAccount' in portfolio pages. Use 'pages/Portfolio/hooks/usePortfolioAddress' (or a domain-specific hook) instead.", + }, + ], + }, + }, { files: [ 'src/index.tsx', diff --git a/apps/web/package.json b/apps/web/package.json index aa3129581df..e1f137ab04b 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -187,8 +187,8 @@ "@types/react-scroll-sync": "0.9.0", "@uniswap/analytics": "1.7.2", "@uniswap/analytics-events": "2.43.0", + "@uniswap/client-data-api": "0.0.18", "@uniswap/client-explore": "0.0.17", - "@uniswap/client-pools": "0.0.17", "@uniswap/merkle-distributor": "1.0.1", "@uniswap/permit2-sdk": "1.3.0", "@uniswap/router-sdk": "2.0.2", @@ -203,6 +203,7 @@ "@uniswap/v3-sdk": "3.25.2", "@uniswap/v4-sdk": "1.21.2", "@universe/api": "workspace:^", + "@universe/gating": "workspace:^", "@visx/group": "2.17.0", "@visx/responsive": "3.12.0", "@visx/shape": "2.18.0", diff --git a/apps/web/project.json b/apps/web/project.json index 9d2524a729b..a49be623dc7 100644 --- a/apps/web/project.json +++ b/apps/web/project.json @@ -19,7 +19,7 @@ "command": "nx playwright:test web", "cwd": "{projectRoot}" }, - "dependsOn": ["anvil:base", "preview", "wait-for-webserver"] + "dependsOn": ["anvil:mainnet", "preview", "wait-for-webserver"] }, "e2e:anvil": { "executor": "nx:run-commands", @@ -27,7 +27,7 @@ "command": "nx playwright:test:anvil web", "cwd": "{projectRoot}" }, - "dependsOn": ["anvil:base", "preview", "wait-for-webserver"] + "dependsOn": ["anvil:mainnet", "preview", "wait-for-webserver"] }, "e2e:no-anvil": { "executor": "nx:run-commands", diff --git a/apps/web/public/images/portfolio_page_promo/dark.png b/apps/web/public/images/portfolio_page_promo/dark.png new file mode 100644 index 0000000000000000000000000000000000000000..910c183e24deb9b43730d54843d9036769a12733 GIT binary patch literal 232460 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%0APxrg1&5$NyZKw4;**he-L2uztDq8}u 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 literal 0 HcmV?d00001 diff --git a/apps/web/public/images/portfolio_page_promo/light.png b/apps/web/public/images/portfolio_page_promo/light.png new file mode 100644 index 0000000000000000000000000000000000000000..0387c71c436244e8e3b8aa406dc0345e9dd3c1c4 GIT binary patch literal 279063 zcmeFY^;=X?_cuI>!HCpI_b>;LRuGU7aHtvSE&)Lr1nDlNa~Mjb1PSTxQbHI)q#L9= zq?>2({@(w<^IX^ayw`iZ=LeXx&)I9Oz1LoQuk~5$geWP<;6I>x00M#VkqAi@5a=Na z1R^HG#lf}=w*1+{{zECrsYzX5UmstbSXx?cZEc-joR|}+ z_10x-YTD(~_SyMAEKXfY#c@VH>-qWl?d|Ow$D4b5`(a^Wyw7+rqhp?)o(>KU@(EJ% zit?3}l>j62SKG_iI&Z!X7GJ22IM%y_(bz*b6-*R4@Sw+|LGYJDNO#l`jsAk_Mv^%6A<4c%?Q1m%XDjR&kt69(EsX& zra9>_YqWzP(Ay28ca#3t68*OHxxKc$ag|JoBv$liHC0?HY4)R4cd@?(X&UM9nNUL` zO-#{PQuy|>G!iNf&+Py(2=tplK~YRjV5^8vmIwPR-!0Rbah^{bprx1FGfsM!i+c<7 z-N|jSMLBw?W^%-#H+oT!oDu{oSdMNLIalA(Uh5uJ;c!Fi?uleald#%{bLTc7m_gsK zT^9zNJhpQ;rY`hQGG|A*M?Y`HRE*PLHgvOciqR$V7HWe1i8BA_FStCVEh7Gh(DiTw~8IC>DON4>%&g% z)k9huR#`Ox4r6BOM^P=b^feNHPdAO-iO-XJ3bSVXFX_P{C!`(R`SN}Rou4#>c3`e!5;Mc(f74AV!9_Vi*iNW*IzK<1v>7yQ5}d08CEoQm4QIJ zHIkQxdnls)(Qel5SQ^K^Vx32)JD=?r%J9UQ3pnDIuM?`3#m7w%W8Gj}OM zn%%wMz{+z_C@|$~$Es+O4l*;4^{nW0P<_{e)KH0my~`MKQ|L57P_z2zQ<4vA8uqJb z`z3zEbAyK(99&x#0W%Ddk0Ev^TXbo4o&M385v-)jmM!nMm{NIfnKA0NR!K0d3YwSCC%F*JoK%(g@eF*Rpu8Qo6K( z6VQ!v-zd}ncz1$J@iDrlvYc8RZW?mm?Uzch!o+7%M#@JJ(y}KR?+3-q{ZN~SP3swi z`9h-h^`BlOh$F%`D4@BE$^u^nRysSvj{N;Q0wg1??%zo08&#l$d;>J0L@L00cz3rK z+cOKFLW#+s&S~3wrCl8l7=c7Iky`}EUo|*wmIC3i`8CR;FOQ;~BI>cuDJHJ@z^5RQ z!&37$dIC2@c5a>v{-KZlhH(4=acq<)Iy&|V`dbuAphwcPG1T}qLQcMO8qfPAWTi7h-Vx;*k zTqU6XAUzfJTF6v+OeZGKVQp_Y`R!zF)db34GxtmgUVwV9tS}!XeSofQ@)iYdBoxKH z;Gz3`l74YU(k8f~Xb=?z4sp1H9+S|+2eY?!O4n!Qp&MPj*9E2K_e!c#Z1efYFwE;^ z>Wg28br6Laj9eNp>fc0K=z|$imT8vNrId~3E(Z8dw0f9K~w$>dx z$lEPN=bN`^tP(gqQX!;}Ij%XFYm*e>mgEtocxwNR9E!Og`oa+tY>@D);S=&V&Y1P? z-ONxKg#YTWDUEQUFfn=p3}*Z{R;@e6_q@uY3(gAD7wp29i5R8BM;m!9y;u7$jDC%% z!sngFg`8g@Xpk)5GrH$(xp71Cpdon3M-Tqn{{!sDpgGD{)O zdcAn3ah}s}l<|p~$U2Vmu(7PaqncfKy(xJYu^V;cvVvxMGs`Th#x3}#nclub*m2Lc zga$-MRIjRsnQdzf@tbXYr*;u<)2zvbLO=kH`s+ExCzyzr7#m^Mwh z-hds#UIujjD7HE7Lbw`8Suc-d`h~=dEXV~)+APZ;MU&#nvJ?daUcq=O)hM#q&OK7e zAcEgg+>N9qYSvx`W;ow4;3%2kl)(Ww@VtQTgNa~m`cgt7m>W)hic||T7-uI)x`7Bm zYx9tfzcm1+KQK}us=L&S7fmwk303w(vF#J87!qmVZ@DqS(L62^{;tny4K)ydU^kSt zjCuv=7>NH8Gchjvi88%7@Lw$X!Fd^WyehnQG{)Gk5>=NLwsd%PNQF2wVuEG!<`<-3 zS|Z=67;8f%C>*R12xnDIqL*m+LG z#TejENjoRP6u}R{#ZZqG@S26S-=+Yl7(?!eyHsmceSPa2M zS^;L{rnMwj!{x@*)BBG2VA(^FqsTZ{rfZ5J0_-gLGJP6&D=XW1cv76lqbJLF{9X}Z zjstb07ZYNxqj^!YN*1z07^A}e2?!t@aHjR@49Lt{iH!rW? zXbgbwWTv1`i`Ixdz7LUGYwXy&-k%)H3BTiaZ^z9gA@6yVE@*J1^nLfd(`LM;i?Uyry5SmiI(Nps8-;SLZ}^K zdIiv3#;LF8KV~J!G<9C11iYb9Ww{?xu8Pl2mAW)WmDW4sFnBSDE8Qm+z}bXJWiAzma&#giAT;cK-3@Q)l9jy*fVXI{ z1CKreu|a&}B1Q}ilSHm6Wh3FSh1aoBo!VQaXI^;+k_2yFMseOy^$bLEg!we<#B2`6_FhIRF5Un#d~(Rp1Cg0zQ@lj%_my#52X*b6f^t;pe|JXY{+I z9TktpTAFX-4$#SYz_!Bi+4N3v$2!SInN%D~j?=RG^1~}!u>azZ4{jA;vbBn2F>O1A9*J6^nK1*=(IVBpZ>T4N?sG%LQMRP$GzT;ZPVtd}eX2F36$wO0 zO9CQaW?6R^hO~*Du_(V5!6{Dx< z{vgC=d~yuAW%E=k%3Cpu#_c(W%?FgRl-;^5Th~f}WU_atwOB~uM>vn8Myv?(UU=qV zG%&8%s8Fi{O^hwd;tl`Y`u%;|HVI_rAa8_z$+n+60`+Nga5A9i`<_f6d)*<3m{#NUu}|K=Ua+7feR5rEbr$RjzWxtFq0m zEb0CEp=28}+gx8nAyzkTzO+u-O|7>n57=*hWO#m5hGYN|$CNR)szCKG?WkJjYqK3W zM{22z$2vHePb#=7;=Z)w8frXb8d#hr!s;toRm*e@?_8<^%bjvpBxB?(zY)+Plkq$L zjbkgEXF7URr!T_Td>)~Q)S+}m!ryX>X(1M^V9uCMA7FvI@N=hMEZ0~kXI z(T&nXjx7N>gmWHRPqV^>>hFNN#o0bsH^m)S@pDq^Ll=&rq}(K@wBC%6hl z|2KVkXRXX6k8$1nw_UJKYHKK~mD2;SZ*`*0bzrlw2;6&>zBLfNZEBxb@hPwAk_(WrfBf}jRZ z9%Dl~*DEyG?m3aY5M4mk&~dRxA~ACmm&x*_oQ0I%@(%OcfE55+$EybS10C zONU(6DGo>oDKSR$7z(WQIJ()?(( zh@)HJZz-My#FD3y;OH?rF_tqmPAa!2Wj^7E(ef{oz>{%pXJrqURJps#CtZzI>78L= zL(`Da*zj0sMBXnM^SnOETrFyii5UU(lIVxn!rh9(c(*~BPkJu~!Xi?k}+xL`g0S0cIy zn%Qq0f{D3MRt}dxKkYQy89(S~dOUYP9Qav!|0#d&o{Pg_;9T|Txxg$>HJ_9dPX3lt z>3WY-L8yKI*Q$s`DE)Xg%3oIkcHJGt<&tmmq3RvAm4r|ImlC`ywHqd&0=PLohF&5* zfE*nY;?3fbIKBl6#W0ykt~XvLEP={K|Wv1dgDB?%*P~B6X&c^nY}CVix$N z_dZ2gzktJ;zrwsd44CgqKBN`+OQijJPxSYDD^Wi@AGUuiG#H=3RrI;&(cSHwOEwc5 z@>f=qr&h~(ED%c)3=b5u9N^!^L!$!5bhbaOn<|kS;|D>G^lAjd6xt7(nc#M~7 z{th5K!)30FT2bY*ezS|P9YeIdy&$$O_1wDba(_b}j=g2_u13 z#&gx^T7je;#^Hg4)q$B0E@dOuWn zf@=j%)sF&yjx|`1?QIb~sSp1Nn7%vUhN2MnYh&Y+U$@~$pi%zM-g(B&${oVk)H&ey z`FmbRXTgnv!dDOixQG6TL_$@x5UlMj_mQWTZGrMAa+Zw;6www^E};7Gc!n z5S}WPr@r6bbD8cDH@?y~?sz^G$_O7oM8z^D%EVw;4UmQLzcC@E>))A}UjRugKqmE^3+ z2&56F3)4iYl zB_U7fpBm1nNiLHWpBFKTR=-@+`LBJkniV@qNiHVX1f54E4yAUU!g|$znWd!+5qK|1 zO_;8X`#yz+oLp}cGW-pjY<#(0KppygwhNE)AEXAdg8Wv}I2x@BMs(?W!EDTpt2C&q zBdTI_!*dRz%7?=_;VsgYvnlDch;but^$=QmVqU~glOP81fBV)h$NadiqfocyQC;Y>?W)txm@lzxgJ%hcw;5ZfeR0?)mfZg0;NA?ggl%6?cX1&h$h%pz z>GVzZp%8a}H$S}_PioPU@B?c0w`MjDoJUOszIWjNxRmfbd#_bL*P3aOXGlD4lxG>1x3fvFL_>m4#}pyU3xkduELzQ=%ZqfvYIr%JDr69E^d+L@u|`bZ^7 z#MLjn16Abh&|gkFv-%?==UUOi`zEGkmpeSovxP!D%)iPG3FvK4?&IIc=@U2Wfg@TP z{|06yE+9mzEP9gI#%6T?)u&nWd@&%pRuu9*xDxda;IDNcHB`fV8F3g7UA^t>hI=L5-A*( zi7aKA(B^wL^1AZZyXL>;y5cVW6-e*RlcZuYsDRI?JQrOxE4@J&SCQ5u<#j-*h#Mla zzM1Zr5_HLHv8BBsl!^}rWb5;T6Jn*yLs!sw%DdS79 zA5yIIop?M|54@kInPpDxHx#zoz!9MYbcxTwvd^71PF!9wNvcUc08h)y=##klqSSJw z%vg`>6?lnR1?NU@0(p>Ppv`5*u}8O2?HUV%o36AlPqAK+&9c=PJpqcQElXr)qa>fX zXq}z?BE8TL&o6fxA+N9Dyz1}YW@`5{blJa++b(2D0ZTLBx99xvKazd-kh-oWO`On2 z5@g8lvbo;K)84jy$>lvimpzz7d63ODgiJw+sq z@GuI<^Bs2k5wPR4Ijw6uuR(I}_g4zi0tT_R z+j9u-+-EA+*W4WZ6rNGs;@|2p=gQy^ZP|yW|Py#jww~* z%%JF3afsK@$hDn4Yl8KDdEORG!76QP@CRS;ROD{1y$lT1hD;?dopbdLHP&DV*?W8B z)j+tvg$JBF(?Jj*-_c1+n483X>Z%qca%8<}*~WOs;Ywec&#&v0>zbr8P4)uHQm4F8 z?)lcrN3cTt!Y;81rm)BC+Y$9^UxGQ2#HM>*EU6E(11dbfmr^2ZVuFwRT^R(y0O&h4 z0I@P~TcquM-u`|sqVS}DHkSu0>`Je^jy5Ix{Civ5sJd3){Z!|OJaGs)Q%ns$~zD^h9gX+h+IM$mB(Xj!7q)Lu}$+qj_qESUq1U4#DhH&5h4_>1Xmws_FsWaG7Y` zVX#>WKorLp?sprbPKsc*9$yCoE4JQp1klqudhP*DXsvPD221QCnIu^;u&y)3{Ji4FK?(-d^zc=` zR-=26Hhm~RWzWM1dUH42@Q%>wH|oZtKDHF&9ee^PU|Jk9pCR;DT|=l$V=mqH zp+>&A{bU(wONKbw$zJ+A^XQ19L=F!OdV}9%LR5Y{Z(99rs+3v|8pHN@pUdtG-2N(; zZL+7_^!GO&__PJ{^Z(WY82DxCr;Qan1cvuJ?35YDuV@f;DaRmCu>x>^vdY`wsgd|K zqPHSN!%*Ws(sj(guwUHX0!H~ws)Fa0S=;c$1LS_9;^_JDnqE09>%=)F>^8{t5I!c> z(=731s85x=Z$oE?HGInU!QgyP4?B&yrPyTV;R617hBPem+4>`PcHr2kyU>t{eiE%- zF-}OkiVNEP>||i~tcDRooeAH0smlJ`|0rbLivL}}Fzr^l1HVUO7Qhw7A?FT}JFlup z5uBH~i{8uKr@xI%lxey!!2x*-qG?Ew4YzE~tKEGyW~crwyOHdQrXv4 zCy_&gKH|8lhnkoK09G^JRQSMJ(4`LOd;Mebc8&IC)Lp`sKdy{mSX>nHIKb>Kx-6){ zeWfchA`ej6?Colv?5H@V37&Bs;`>r$Z5bsrYx@`_*-q|Bjl~WcLb|Kc_q)cvl{paiRx<6$#Ah>Hl!*P8U9guV38*9{9VV$I;*bR$~pcWv}&o|hItbiXxBR$ z5VEdjW9lP>sZ$Zl=zl`ANGM1)GzL{NBDS=Sj8<*Q^jdy;iK&TTyNd@H`-sqm{Xr-D zaNC{=T|==(TbRXQE*hSz8{OD_1IaFac?Xwawri+U7*@UxU5uRPp-; zs08QUFFXEeuR1?RUr`aFb))C)sgT2E-jH>_&BM z!xkbSf~5KIr0fY=Bu_|X67Q&Xy#r`0x{ewhIe463xE&_1JDPfUlJD^Z(>SB-qN5JQ zz$&$zpW7dD1CNs~nLO;*Bp4rWtyu*7%2PQNMA zQh5gM!lntn)0FcfO7yT!o2w}RmYo<|!e+exKttM`vEb()DQB-z7)Ro<6%QAd5rFom zC(ut*;re^y&B$_0RFk&dyj>b?JRTDKiw^5r(m{~YVX#K(nrBhi6Ou3t5F3^KppV6W z|5zj%=auYdVBd)ds6_d$i$%rKV5yD(|(?S2C=42WkV4WSz^f?$7Ro zvC4&F^FK%E=EVK~@^xM2Qr(!#W<}vkJskmsdiwer4HaBpvqwE?==oBWU%zVMQe>5q zTtM~`6_>Jdl!z@s`G4Q_C+9H%7DRfAm8@8!^1Rz)#ojWMylHDW?+i>Ye${z2$F<~S zbvkHkt?_WQwBF%I>$q8cy{32Lizv}p@~JY8hSO6Ia_^H9zM!ZbY-tj=y=Y^H0(Tg$ z$+5Fo#->UB1i2)5AObELLc4nn~GMeth# zJH;zrKVxO9**oZ?uY!R5ap1EMU05M~gDdm9Y;&aLKu)tT$s4QKj9dOmuH@K#_z zI{Y*}PvE{_@>_qHvJ=7E9jVa~8+FiLE&+mC_7?Q|GrpzU1IF80%RXzj5qJvs-+` zH493F52e=IYi}whf}%Me+)z9(?y!E>EZo#{eIdCo2$)Zsp-p4)@cMf zQN_swnw2>la~bXW2`ujsgc`HSvyX0LirA8>-tAeQKSynbN*tSA*^M#PZf~%M76|Ll zOwrh!9Hz_`6CNC>IXL78on&G+%RAGg?$LW|;5 z{lMe(`qE^4bssc@aI|fFHJ0w&i)(*!_4zfy^J|`~k^VUak^x^Cp;o!4*y@`GM zsDjV@KUtdIWtcdPh5-@`;Alnzc2rv$vi|C`?$Y}K!_vZb##RhIrD(3>+`MVs?taCa z(OyojnT%{ilh(Rhwf4_}BU3W$TAbD3$UFZQzE%BNLefk7K&k67LuS;I@gWNaN-`p@ z7K5(#$?cqv^16YCjbu^q+J|O5YCkWl_zuhuu_N&5cIKV3rDwkMNgI*4bOWYge3EXUoB3~tKKa9#cj8cK}Z9Aova|WS|<6n z>g;=eUsW&;ay4o*|IEF?UaZ+F?jieRGs~cU*WYJpqzL$ymx%58DJSxf_AdHa)B(5E zSuNNwfmzh?*g@SoEdAb$R8rR!?*q<6=jvZea(;`PdS}PNegGl)Sm9VhufRs%-M$rx z?f9IkX*mI7;VIMxyUX+f)j9sO!7n6(TRypLc(04=I!bM!mA)g$aHQi|LX~L)4oKw3 z+RW!>iAJGzUsayRdC3buyeEXI>2tJt{fu$RFPHg4@Pk+f0b2B5+Va!2@M*4eZHJKK z2!bQCF8)3+pq*Or{FmL~i~DFGD%>F3Oj$^f#V>PRtStQ)!cRNT{l{f1R4<4XWxO`f zEa0~|hOKS!12!b!!uNXitQ5H~@Fq{D;ui`hP6DlC8jg2=1Y@4gFL&HmwB%m!Kv9<7 z1?@J7+xtkn^71Ku1}c*Wwtv13{+SYMp@4L*=S&Pr?epOzOZg-iXr1wGFr`P-ea_^N zSl5DqbpXjAVf%&{kq1O^OyEzNFHJai!nDnQ0#s zS+22*#G8Dw$EJ7`CG$jT>AdXo_HlCliW{cTdun3c55S5vC~ogcf(Rtm|J&86ebnbJ zz_4XzjND%}1<$^#mis=pAdcq$GT-X+8;azreUe2B`ol^`INr4k)rC?$>!<=vn0~TQ+av^j{G>D60dEGR;kfGQ9bw#L%1hLH_L@i&lje~K1`jA~tQLHNZRQ6KP z_fGG{eg(yQ)gs-M4q7ya4%RsHtw{$lMdxa#)sI(uqhWNy>N8WQZ_x+OQ3oB*w`~Zn zm4g89*^yXhEIxITWa85yRd)8dD!HCI>Dc3l@HWOx=(UKE63Mt!#&3a=ty$l zK5N<&BX%%QeQ0ZNXp>D&Cqb8((``JwTvYG$js!6?-x2d{_)O6ice^Vr>!N?^6X18m9vMcN%2t>p>`<2w`k<-P) zW4E3Wi)|ZEPSk;3{9uJa=|doWZjS+VU^`hU`K$HiUb@Hr3K&*}7Prs2(z}E9rt18Q zMPICJC%UNaDc#9MF?G|IJR!feetjLs;%d#yTZK&ew7hA~Sv8dMhuT@axApbRH%gC7 zV+QSE`3A3AH31|Qf=>3@J6FY{6v+nWmvxSL7IVCld_S-G0buy_gQ;sKhUXXW3n1Uf z9b5BArV5n8+{_Z>aMm0UB9eLdWI?i~FCHP_+}({ZXlldNCke=MK{x?9|HEk(r{`w1 z>nl|*cPX0rP{}Q^N9Klqs0$gOm5YNXyMVnEsz|8=?M zp75Z-iXl6GSu0C0bu}atliM2bR5ypnbYieN|2pukUP2Q~-wMilkP@0>BiarV9a8+< zLw^T7U-&q$ZnKMpYv}f`A~UVC<9xr&>7AMlIL58ijhpv{oL=zbw776jGQ?T5PDdv7 zq6HzQMD%4A7X1Dm=Ey7X)4znoG4<9t?QKOW6o{lEN@vPJ6ckrsz{MN)c?__ zM8L7CaG>=Ifj`!z;%M&m*n-oc_AnuNprZoOfprVhp|2zH{5VJvfmuEYxIlZoyiT@v z;-t?j{OFu-X;af?ewnKs25}gEMGpj=75y`q6YKlkL-)R86D~LkGFaOTcZSGNlnz(l z>)-=#T$YOu_yhI`Y3&!cG2Ru5DVoRvg;vT9=Y`hI*o&;&7-nt{;=sR~XxDxwbWzkB zVaqAaBtjgd`c9WCqjdR{%bpv)%pA@Fjv_^RZ#dW_FfoOaO9L4ttueA{!$f38n5EpntZ@+5zE zx-va!4|}jUYwOl{>oKfpl%9Dqu$IBM+MR#gGL4CmoC%DD2no&Khj6xDJVQC=ThR{w zid=C(w5Xj}Rlas11%Y7i3=leD#`I*rU;Ttk<9ugbo5md+>fS_*)`~+Q9VRJ94U!8@ zT^y8!F*W^U+#!(PS?7Y0Pl|B?r;#xN)sfbR2{PEy!$p#J zePfiZ?}o%x5|`K108{ORe%R!1U#kpd{TRQ@t=~0SYb@(f@YjyBK+jcS%A)jD&AZ!s zzm=*M%PweKmKR)!UQy$w9Lu5RSW(1Y=l+)c)SH=x?9X(7VLu!FJg? zbVn<=H!KZ?dzVI^M>$$B=AZRDM^DvhoUrP@bagj+<&xn_;DuEaIi@(<%Z2_nLQu$O z7BX!t*35=-3^NbNpZHk|iy${SP%uB$7wG3&z>T?sE^^1zS{>PR-#w@K`2uKHl30xK z1Eyl8O_OVy3KF-e^2#i>E^)>SWnQj17UV6cF^nI}ve}kJImrzyZ+jgZh8Y=Qcb<3! zASm~C(CMes?&81Ci%J%@j@`X#nPAP#I7o_xxCY`rC~M&H=*DbyKc?1ZqP6JXe?s(f{?9s+Dim=wJmxkKJv)VxYN+&s`RW`Lc%CSwAZPh>C-LH zCyTq0dz}`~_`W9Ng3e{@Mt@r;(aEVt3G)q9ek`}#LY@ek7-qW-2NxCu8LLrzP1NVL znv^scG01skE`kr__p;{8HK`4K{!H(4sl%`~LKVirmtj$5^*FVg*Ttp&uakpc=EfK@ zJ11vQn)#lS`bOnVadNR{4rX2@DrZ-Ln`lb1kv&Kz{~a@Xg&Fce&?edq*3Km~RhW$6 zJ*6lj47`;UTESAbXwSOwoRQ^5uSI^x_9KJs}yNbrP%S&)%D>lZ5G$L zvgz-($AKLw*2SAd7T2`KEEQ%Csyh& ze%x)|DL*AwJYUOF+(GReXpn5Rlg*YgY`0Bco;Z;C92LX_O+CJWyF6no3vZI4yYjD8 zvB_6oTNU=3<_nMZzgok+8CF!-WXVN3Gq)MGY9veru(T*}{uUf@nA?SHru|J#+4!N>rYSh?u+D06I6<@2%70r==g@!s|91WsQ z9a0eN6IYt`Ml&mPCk%o?Ut*!}KW56wqPkw|c9sxK3pTUH5LL2xHnjQT?@W5yk8EcU zN=D0uv7f#lrY(YnqHgZIESC=uWY=X(D3Gs6i_xPH-6EMX&v@%w*gKWkCobJgXnOG= zfAAISNV`~o8^~3St-(wd*b9~{vz97H=B@Ka6--Q9jSsod!JEdLyu;HAor@>sn=;2I z)wfnUyO~ACPT(m5@-bU{@~J@yhbE)CL8$A-se0z(*0Ag2TZ_a^)go~+)-dfdPmf?m z1NGwZp5x|?y)PluEjH$N>i0%+ztKRrQXAPUmLnhcE=L*zB8#^Db42u4rorwu9}ouX z%^2p5*G~yQGl8Ncoz5IX+QN}Q7-^TY6PzbsKH96XSSZi{Qy`A6t(@Mi3hC7rlt%GJ%S;x-KUpjVQ7#DZsl}26U0rDQTy9_(Z~iFG)8@y zSqSA1nBJMBF1$x|x@`CKOEAS*GQz%4d?12Qer0s%qNJ!3C!zkKB^;n_-JHO0NPyF}Jc$L)lagfnd)_?M??w~U;^ODZb zMoyJo7Kz@U&E{B$*yCZl3Mb?&zX~%BS+}gL(`Fo(x{H2dfjgP6__FphEh78jrIShr z17{I2;>y0+8hI#xy=8XG@dYx&m=!&O)#yWJhR~8Y5 ze8MO>YIi=?=tWIj!0_4ghbHKKmn!pL)^uy$UD6N`K4e=v^)o9c+N={613?C3h*kGH zhdqGdO>rKlRcwo!8$)i85R_%)eTs#7X6t3N>4kth0HOk>%0)ywtY1trb%=i50d?Q0ZI8pxXp(V0`s^+zqs3R-$ph|swJ zb+^>fbA#SDJc5<@FA9Sk3P{_cyb?LW(_ZitVbFD)Y(v{U`2r|RYZW?7&vx?)c6 z-wO;bq?e%Xnw-w&^3L*TUgx09+sxnS{qeVNRN+Lh8V5E@m+C}amTnd#mBv+D`wT@> zSZpa8r8L{OA=BUr#)-NmN=n}%{sAKv<>phrzSA1QVleTz_5=3Jm=j&fP5s2D+x;jo z@^mc6_t`lWd`>!I z2;}vsYyEQvYZ8@*j}^`O44T5XId>0lw_#3x_i=ZSdn&%f(IW|~0yTxKAFOq$mS;+p zi4?!RpKjIx&G0!e7)qpq&d+IGGQ+hU!=|2XRVz?K8<^%u-DW`T;xFZj8}*Lt0beJn`BR9ZM|i8?0C7jq zrV%|W%|y~BBY1j;jurtwXhjL|(y5GC703|)(=65z`d_NmUqsda37KYgGJBVx2Y_ya zk8y!z1cP?+lNpE3Iw<3`+-uiZGGv=upwq#nB84tB`_V2VhNNc2t|xosQn$Vf>^h$g#^o$`elBds{M0456h}LI zP@2WhEvon2+Q9fXbsvcx{i+bKGYQLx2iw0A_j->RdtJ+6jG3z9ZTW940Ob0bTz|P{ zSv3_h=)szjG>Y#pE>=f&{*c#NMveZ11DqT}_cTbWc;dlGec}t@et64U)13$JND{Vq z5=X@6y{?)o{94B%v1veTr5N-U5hSL3zq8w3l~J;1@?wgIc$67nO5eI{&rWPGm1Pf~ zCx)YC0_dE2f}bc8(pMC$P^LGb?gxz6s?N)-jKr|?P6kTN&Lu!O@Wj4WvD;91fi@6oaSJJ?6kR0P$k_Gd(=zwi2sU#- z1bI?@^Npatu@j;%1Up!rjEvXN!s1wy@KdH)g5*Aox;AM3QxiKq_wz3Ecm-E&q(A@b~B?rvt zXt;e9)opo1-Z%4(j3;Xa@C^LgjMvq!_o)WBh+ZwiSHaO;OHYrH(*7<|0v%2YiSJ0Qm5q{+GSYsDUB87%0c9D= zw!Xv;4??N}{D+k3K4)YV32_9w+Y1>M@JH6(O=^r{mSn582{!h`q5! z#zRLqS}3pG9E@Q#>PzQSThlX(^p|AAr_W5R*Lj5bnTBeMwKnX+=EncY!vHO9lsk2f zSc#4)U`8V1Ng#z^8-q#E&&o!6P9i7wH{pA#6;fv#-yO2T{ObdxR3K4uTY{MP*c3hp z7wn4y;f7puo}1c1`{Ug>*nljnWm0*>ufJtVHFVp8{*v;-=AqeK1jJQhQL8bUwhDi= zu>JlS-sABBgKUwoKJ83YNx-YBuH0;F6|ze>GjIsf9uxAOpbU^i=UlC~80xcb^!_Q^ zvDZ}6Re55Jtu6Rx7AVx6w-JH5Wq3yLGBF+2OE}}(fXqY$!gb;7N5UiYaY))Eef>fU z7$e=NaJ8fv{yip+^_4#vw)px+W~|^^`Z*Q788V0E%GFfh8G9m7+`6ZzmS}vp*u!GnHnX2i|g&<1qd^XGMr*<>#EvO9&Le`FXW|M$Yj( z$+U~iX_I^K=ar8CR~7$u)xdV1ked>3QFVm#^xR84rkC*B48Ve*4praj2Qa3wfSr}i zjx?qY>{G1#j+8425pxS(78PZAa9_B_%)5tB*!^jS)06nm^@x>T)Ab?4JJ@x$i-g+? zHq`#9!G+#>JWkb}{WK!8mK6gBW1>EZpu>Lm4wuUB9{ILWJ&*!}WByJbR$d{3?8CtR zlF~gjU6pi@Zh@h*87Az<3Z^#$%>iQuWhTzei~%BuufOp#k8@Z3L=JWUtbCnKS*GrO zE@ln}M>&MGX-U9$bDzRn;>ZYyUGQB})U)(D&tTTZK0g=@;n+OB?;$Q`n-f;uw?%MY z`bL%E?WJOw90{b5`N^vyy%pu+Umn*HL@Q=|(fJdHg$H-qDWHH{HxKTsFQ#lo|BJY{ z{)_5)|A!HaQel-;V&MSN(n!11E-BrhbR*p$O4lw+ODQQWwMeVv0*Z8lG>Cw-^nF%e z@6Y#7xR)Pza5yt_^)++N%yT>MG?(`hAjUgC!h@MWJ(jA&J&nhVW005>9%aOKsA*r>7}=ky6E8*R<`1q`R~hl?o| zLC1P_L`4#?*bwI}3a*9m&YnZpCtpWnj^-$CcHSX{^e2=_?ok3}YtXdST6WWTRH9}L z%3B8|OAwh{9b%8++!$ZI2VqI<2$|=w_mjz}uIGzil}~1556p)c@QC??%GF^98jYur zPclUDp~nQ!`u9aClz9LgzT#6U3f^rKk6lA#X~CE7*^})(y-&moEy7%>-08h%srUPR zyxF8qJc?rfFbp1)nZipaBFvR197%j&0B%IVpgzs!vo!QkiPIOauP*)!T^e*I-VJ(d zPXODsm#>-;T7CE0kd++m`zoqTh5F|?0})|#w7tU}SGbuxGayG-ODL;%_65otqZIxs zwbk%lHh5TelodewhulLkK=qqZ;@OU7Un#O&5*@zE&pNavzRs{vgw9V9vSZ>ti^<-D z81w#oe=6CC+P^0QVY$??DoPU5ejfTZ6nHoW)&)FRfHIm_@3Xa;>wmQWDU2(;nzg(2 zR-WPJoV6^-yp>Tv(UQ;c;CrQG;_^;jR3Mnc*iz`>?43 zOp!X&+?f1-9ePp)ie&ppHh-SKv7VlwV2fraq7b2?@%_Ymrz48 zebtYIRj3zs3(z;4JOl`h^{P*=DHEeoMPk293z}`)Dd3=J?C+t!wLZ(+pf`NSR6+?k zWdA;NgHoh1{Aqr8h{ZR`vW#MYH`H*55Ya+AH(1V0?w^4IoLzANNJv(usU97(xOerLIRujH)vQ~XA9xEIjOwF7qmqDpdVbcs z5J%C`w=ZQIg;{$-{b@efzPfXZBkr6yiCC!CbesMOX$!k8vBH)q820Psx&2x>>zE!L zg6UI-4am}0Y_uM`f>{bsh7Hm=Xc9lj9c2JW(e+8P8MaWu;}_y-pvK&mUrs$eN=@w0 zgCY)v3^yESAGQ~%Z_H4Tqw`uH>{yb0sn#`)cmdN0(TEq%NuvX0Occ6g2Q+RGxi7tj zKrDCqK97qIWjEe{KDmQEdtsmq+XT`S;qCWM7nL-=QX0dllr~#DC21?pbbk^mwtPVO zPb@!)_!(BIYdmXL>AP!22EptcM`$n|wmb{H3kC=OWR!TuHOXBlY>Pbg^V#c5YpZ1I7M<1-kxd`d|(M@vQ4@G2fzVrIXw}J9+o6U+Nku`npN0 z9<+am3M&h9rK9@((AqXY5PPG8g*!9embLql5ieFX%s`{k>5mtePet|vkA9zp z7I+e1Uo|l^kQXg>8}k6bh-cI*u7mLREO#L}@!~p(!@b0aR;28t?>BnW$kQl@w)(yy zSk%P*do&WGHQ>#g7bbkO?R+Pb*3ikr%3=QU`qBX(IaoEvf}%q9@5thutr%w|f% zz4<#rxK3yhxq?5a4&zVA$P(3`^b5ey7L4NQM^Kwkjjznc`n?;F``L0im0*|yuYOnL zl+E_(ZeH!uARv^6ReeBBvp7%On1&cU?j(*RlTMVGb)cM&{n-`@P@x4*SFexshB|pN zLhEOx{NTF@$>Jk9zePhv@6!`Vu$QqryatPEc%>}R<1GVc`B$Mc;KZVAd18xttv|(k z0SZL#ByB*Ri@AsQcjtz-@5evcBw%h%_kW4HmOMQ+T}<`W45T&5da0tcY86?jemdfK zC33&-hXy_5-AKs15g76|$k5K70~B6$H)YgcJUSud8D9xu-Hy@>Qx4Yt71L>-8J+y6g#q8;wIZ^bQoc=T!3O@Ox zRC!AKRm4A&J2J7}6Q9iSTy;~z7${H`1Vt9oN&vl;!oVwi7U%0Fh4Ms^>rAImDH0_0 zpdcLXG&6$sQnRy7vsJdIjcYUxv;uS7U_}*`soZe&aWf?)2@uPeq9gG*8#f zp`gadgG}uSC4{mdm-o$;&Ouk+iUuz6vl{o zceUaMVdOND_jldE0G)exFwNW8&*Uplr&Y#LRq>(i0Us!z50aQI|4Bm{`%`l~eGdXm zq`pC=25Rsp*}qh*5lNtf7&ec7K5_JgKb-Jot~6%c{q)#SCM2)&PGuo76$YsvpkMg* zXZ>wL1MxJOgZkhS?NZhu%Hg>qr@& z)$jKbu9nGIz_ZSLlgMN7_-mCy1n$lIz!-(hkKv1N!ym25hO3+h)S?K+hD~#!?Hp53 zpafjTt*`?dN+G_0QHEUD($jTI4-N(U?9&4f-~+}dnxb%tVd z2K<-ILx30EqrLn2cw1H*fp_0SV-QYGpJIs}{cXv%W$cRZN#6n&IFt}pU z9G&UXpXeaLd!n`DS?8>IeSif}A19q{ftgMCq7MV#XEOr6YNv;bA+n-qh5(x3lE;Qo z<={yU1R-`u)N9>zq8z}7rkUQsE>0NHJ2C~`*+-$E)S1pl1e3{hkm|}@4#h1t;H&51 z`AhFJ%@B+GqeB<2P<4Yl*d7+}a0hc%m)Won8F+kF83ylBplT=xU)r{S|C9iHM)3NrW(Yud|LNf_ z2_nalhBs=*ml(mdUd1Q?8lOK@-~PF6wCnUC>S?85I0<6Hs58)JYB2DJeqp$UQDEl0 z6S#WZ-A8jxIM7er_IsZV1v(87$gceblE{)!*)=~hiK!B(r`I^Sw)xF8W zs^6hcebN zCVTcyA%PK7D`ELKST>PY%&m@;wPV(g6*K%PT z{EJ4x{hw9kZ@8GAER3k}%ECjQlNz@=T1eBhRBD_Mm}bA>3K%eZLkhZxe+%l2>bb3t zLlp~qW(ulQt$*!goUmVv8g2c-D<5tU0uXK39#KM+d;uPc?GInNHLvEpC68A}HnX?A znLM}=SDq+u-59PcbMtcaE)XRMTIF3bbnao1_c2qT>XWU7d*sI4t2}B~IMo+QLzXE1 zNM3Ljub%9B95Abi!FFSGi(<{E6qN2nR)*#^{_a+TJFLh5-io)#-7|vnb|u#LhsMY4 zPLWQ4@hb-&MLZT{srvdwqq%kPSc-bki1Ev$b>rQZ+*eodel){eZ6AsVh^CI&bWexM z_NM8zUQ@(my?kt~bc&jrm8l{&)>~r*?4;z6A|6^8_bf?zK!;B}%H$6X{TEeG0p<2a)F5RPOw#o)peyx(m46j;_G8>M) zuk{c83_&DV{{qz6183TA?vI#&mniYfrN$Y!1I+9sLSa5W95wER+=oAHHh}k?+B=f) z#&R4Pl`W(|cZ_KVXUDSGvN_&RQ`W_&dVTwDiuZDz0P7n7hT@1g20$7+N<3ckt+wg_ zB~ZSp9x}uRU`BpPn2&*>P5;xV6<`&(H05PkZwL?3m$f9qIzG}FVX{k z!OAQB@}!`nb(^C;)I)`Yi1_@cMKzg|vOYq7oSIC`36st*D%tzewE!>;6)*#j)S>fi z3UHP`Fw2SOSS@s(E>7B#4pZ**e!=Y{~Icytf5BF}G-@&-P&>=UUx@swLptoZRoo{~WBeK|x(SoN(<* zJ-!=YaR`H)5aghkc6w0{$5z^s?0Cb5v-(~X@^Q0KE(&WkW;~<;Y|d-Zk^r3Kd@Q0X@vX z3g4mp*Q8xlq*fG@aqLcETZ=EoMW#8d%++{vDDKCvKb z;0JngEjHc^KmDd|_<7}pE@Xt88A5yIpE04JgfRJUAAHA{iUV^|c@q6F9_Zs^qf>LN z8f!Un&esZ_7>?r9iKH2OP;=kmXB>O-HLxgv;}Bc~w7O!;W)O$!85ucSzo(Rj{^ z(~kww`KnKraq-MG3A+OUYQdhAvvrKJkf{t{u7{3w3-(JAt(`OUF4|20VXvxe+J4rn zT15+`)o!eO2m|TgGBNauBDlAY^=|ClcB?yVRrfDnTc>;$HB>Rf^Hm`DPw}PrzS->T za(Xc&c(!78OUCnJVSQSzQE`3u%zY(H(BnuPjad|9lZA3bK2_|osHb^$d-b(}iPH}6 zqAtbQl&r%4+0DyO9+hxX6u4vsEAONb2ASQ!0(M|W z_AU;??4Qi^@K1~64jVtXH2?PqjA*QU10)EYuQwKr32=mcsc)so+D%M=rj00#%ZAFT zgK-*9+FdaWT%}V#8bFuX{CI-{CBqE?F0t>X+JxoNoTTq?gNq>o!ubaVL%HB)sxTfFBt7J{KYk{o5PP|1|>%l?DZ3`%~Ds_ThR% z;0DgW)_seD%Kni9`-K2dG=xpRwY@!L8;0^jjN`;6eh+toE^Ot|GU!q7|V1;;KQq0 z^5TPMD#Xc@zEs>1BW)L#M`g^jQTJxjEQZZ%15^vh#v3M;Sv<6~fq@@x#E}m+sbdqt z0zde9s@0xXTIKMfttlZ~fsY`#87i&? z(1_p2b_dY)D z`iwDIJB9_vp=0+Nu^)4IXh*9FlFfxrp2M*s|6VI@$fKr(T`h( z)fJtb;%ni%C{ zIdA}qnK9{&W9e8xu{x1hs}Q@Y1cMh3H+_eHpgGs^ej9j_nXmGr+7Iq3`3ssBKCO0J zrGw(1g~x`rQ|PeqM*`Ty&cf$3rnGyEqi`d0cM*)k5!z&y*?CjTw^c+O2CJrtp~s9cR|9`Q;PRe>%s$FLJ^779HXYLw z*gsQWfuTL9QWMt5TsjQOQ7GKLaj`Tj>67dU-=>o)Vs$-XSn zTeLh$Z+vQ5A-Ps*I1*jP^9CBpwQ&^ME`0l4@;?u8cnFMg53S6bX?4JQD&nwH)IAnV|;!taxUlPWdSzEi1l>FQWZQr1yIV zT8YeSO>acA1CCHlWjEXvtE@fQuYP3&{=&q3N`{#!y|56H!FsT%zO$YQ2|>i@Z=402 zQ3Qg#{`-yqUo@1kj4g@+EpdeUsE={CLSNj0q2-?g;6Y9>9yx}#s}(P&{KS-Ctktj{ z1RCcS1}vNI6z2fUye8iA`S7uS7V4}MWp6pWo1HeBqpQlBvb?I+I~fc2z%5I`vZ1BB zLD1e~QVHt2qw>SHrwZRA9jc$+${q56JM5^5=NEjlmSQ$MHv0M;ZcOCRFfSaYaF{Tc zw!`qRbsB1%b)HY!m}N)%*li~jGGIH^jh1vF1}`Zc z8ln}x{?EGaLJ4Cxc_lNo24B22SBgaJ%L*j@aq@cHn>_r$-@+6ueuyf(FDH&=dhRL+ z1!}Dxvi-#z{X+uI+3CJ175GD*HR6T(E7BnaDi`dVZzCRM8a63)jH>bjCn|9tsh%bg zMyB6+lkE8~a;6hUYFL?oclB-g(jGsoe(G;ImzKPkIK>jWWF>l-(VpT5fh4?x7`k7z zQ+1V=I}C~9`bVcdG%fe*<6p*sy7q?k>VcMX`p(fqLL;s>$3sycgEclPm2V2neQv5G zAY}dvtdk7@^j#H24euK@a+iKGFUcLU1BFQcrLFJP86^LFtcw6!@f!8Z5FV(cB*?Y- z4>Jf%WMFWP89l}q1d|c?VE_oQQv6FS$|Nc`3IFbj<8rNSr?sviC&-;q39zOghI3gH+KQj=W$dLLkqLD&EmegVR z|2H}V5Cg(dfEg8h^e-Yy!@+m1{k8AElXXQ5?*Cw-zoka)`cJHXU;T%a2ND9NS=<}A zX~IAI_%{O)Cmazm`Gd=Bq>yn#_a2mH)d6EoxJ(;(kQU6mpJqcsoC%;lw_2ERNzU}@ zm&bg#72NU=#owNBvmjD**YDY^^tR_zJY6FNhl3ceIO_C*$6jUA9_J;yK}p5swkHMd zgsokbV%FBm+#@lYH|c*2(zPYEM|&^0>CQC12>f*Fcp2zXKV=-V{@8Bkc#tw^>P|`H z95_*80Dc?5G?+kn@3}pwxT%)VHQYA;J;=ZBd;QUg%$2&z&27^!8iE`A<=ld^#{_lN zceXD&yr(n;*67N&Bu;s6 z=;N<$^HUbyxs(uE)5|<WY)ux+~n#FFZ%g6DGoAhgzEXW875Zn$^Ah&Ch8E>$NSV_ z`;se4Bq@iSYP>9jkPX3nzLJYs4_t`(1TNB^z@J4nrF%Nr)%hSL@5G$$^2!_qMjxd! zJ2?mZm~oG1#$+=ceru2x^s+AHscb(TwO<*kv9`UflX7zCS=2-4$E~of?OQISUU=L- z;w_RG`%Wxm(UEaUv?bh-c2P2^dH8@zZDz@C45xn396E6Y+8UI&aAtHviasVTfTG$< zF5ts1S0o2*~-9Krr?oEY>PGS%As?xlXhxjSZ>pQhl z+aFGD{JNs8#g)xeeDd*~SBlNzS8GCuS0x3`q;W)6;H>sjI4|WzO*n8t_qtjOd(i3?o~NJp<4V%TOXu7Y@E%iWTWj6c zOZM4}xm=TL-Lu7~*F0!v(}aaKkOMe&ey?Bp-W_N*aPO&;?HC;^I3Ej7_oFo9jerJ<$Vd~*x+&5gX~2f9FWR>_fJBuDFD+Eyw= zHB~8QV=;0AdM=Rihk8a;KXh`9pHKUD;?u&BQV4K(-v*~NY523LwM1t^=yA_w*U93X zRN&caF71u`$0tdX>F*w!!e({WPGk@=i>=N6CnH!Z+;XsTB(j&?<_uE?w0Du!^?yJustRGlSPWI=)JU} zKi-+UQ;hK+^GcWa?Yx@*g~!p2M+Wl6bIPmIz?z8#u1JkOON3cCReYO&=`Le3N$zhm zQ6K2Msd6*3QiX}H;zbf$OoQEJ|7`QY!#MlrRB;3voy@(IA1mRC^;8FPbNiQ<0qNsA z6NmxBTswyC>N+cVIRfbZXZqg5s{Ze%!R?$1$(opx!^C3OZ^`h+Hy?#F1$7VxJO!D0 zeW+`YcO`V(>=pOcV>jFI@Dky_>2fvS)Y5amY9TwA_uqO@<%Bi7fmY=-)QlX(w8GZ) zJLC7u9zReGJ3Lo0wV)&NOi_4W76v^Z_b!&~nEZB}W%@0E1nzlrp6^k69n-hfC#8nx zozi@ix_ssNX%h;G(Zu?(PV6)JO}nC~zWcH2RoUqP>f=p$^Ixwh>#%wkk};-oSMeB7 zKO|bYSy7~LlhIWgxMZO7#qOb7wK5ZPgeN@&T1?Yhqsg$o%N}mGm6$Ya`YVKG$Xgm& zrnAX6^QFYFgxX%3Z#f^^+1Xm&K4dh!Wp_8z@R##hrLZo8tz3bj%lZOKerAN_)+J`j zy)0IBi>GdDJ0BhW;g+Vu)kM_f^wsi5IRU|4j{okEul)(P5Uu`wrXE4+TfSKy*{z3K77hODexqv^F#+20DeOj`ZZj;FoI(3r z6m~%;8;Kd3&U5N`c){1Uc}4SOVRSx-g)W8tdQCJ63%NdVY0EHB#tbxQ_eQ*aQSDaz z^v*+js@R(p%ORCDFpcKXX#!vsK#d2twEiw3*_i2g#8okCY7}Y4h5BPjpK@krkbcE_ z{)y$b{cWi`MID0g6OAkL)BNmv*Q<-%!?<2u`Qc5KMd#$+)69r!$}>eUOk~y6CK90G zd|!ho;0~Xt=!@UzrDR?oZ>Ss<8+~MOr}VzF$9-~iI6gwuvX}OmspV7isw=ui`jRFx z!4~C5(EGxZ-~08w^*H2VA+%k)^%jhtQ8k;(+P?G)Rfo_PQ!8*S%nWHda>eI+=(9wA zuDsVhn^(46;ze6`+ER-5c>aWC<`8jc2@+o3nJ)O`!Vbda#k};a`cnm?_Z8iUvU%Z>Nf4e zlV<#!eiH)0ewN&+`@P6?R3G%w;KqDMr`nxs=!yKB>V=6b)h8})+`2K$i}E(=1q0-A z+HE^#x3GF0h0R1*QA4}@gpY1_94U(e#=cbUi8)RLDraG_5yT-L-S3aq1dG};?%*po+3h&bsUX0k}TB0m0cxmK}bFZ5+0pq|xRxbHS ziUw{(w{BSfe7cXx6mySqtW1YlrkUxtQ|MB(B(PJqdbe+wGoK@@udL2_nj>s$GoVu5 zq7cTH5^Uq>uVD=PRX%v|Jha~eeVzHD^kgI8JBZM9Jj0aRm>XdDjg|@7G@7k0B?(@^ zGi;{yX(YlnAQSu_p^PSdEbI}DzMM$+V~BJ7u)S>3qxLNtw4Kbf&LA5Hurb=G#4Fo< z;$3-zY!01A{1pUWWeQ!7e$Se4&x?kq_wb8LWYq5`?H}@JL01*&UQ6`r3@J<5 zoge_{W9v1ZUwO4X>_m4PD1W0Nd}Ce94-!Aa!26KUt8ea+cIv+VQ({D<`?ocRuD+}%^S1vt8#ZA6C>a* zp#maF$-ZjyH~eM{a)~xAlisbqNa*W-E(&@lS^2C>{nnW9m-#l!lKAcb2V)&oe+Dwm zmic6xeLM$+!~>70D0p?~GZSb%yRmFZOB~N+b}12Hx({WmdSfbv_PCFIz2I2(uKg$% zJtbb~)`*7}-bS!(Q|;CLR(ag_SbEnvV7deOHh_V8kKh9}{MX&|gSeHZhm@vEwNsq3 zsb(ThXF)M?qmM`Wo3(?NC@T2$bLR|TXl;1%^-b(fnU~ZFhn>oVMy%YPK0UgqrFjS~ z6vYwEzgl%5B4YqoKV(}8HU^h$0Hg_9w+ujjGVv^VF(CzXYO@1ONn68Y$=$-y(E5g% z%esp{7(wHbk~++-<#@gpqmlEF0Jv~5U0ifiuut{ZM$WPPJaV+8U(0QNO#AL2d-KhJ zJ{D0iO_u@Dj4#d@%ijBLeL_||s3pRpJ0*@QXScga;e*P+py7r={6o-m@glD&&}5?F z?~zTYASop&!=e0;Ii23?=;scJfbs*~>|f0fJbRcno*6{w_yCuH7Mz&fkX9<>BFO2T ztdR+$Fyz&AG0Gy~{!qd0`s8^Y%y0MW=U4uMr@;2KJtaf;Yiqi z=veZBM<_5SIN@}qGlmO~A^ykHx#R?RH&ewgf2XrIo`S&%zY-(?UshB|@OeOt1S{GA zJM4fAWGe5*V#%Tw!h4Hs^&;Ub@GQ8EcWb`OklDw$){dDk{6b#MaDM z_dA4n6Bo5AZxjNM-R?#*Gum_RXx0Lc2b_mjBSlBFOpd-=hQ58aO9W!BIQ6Y@Gu|Wq za@F4XQxQ!dvLjV|u2S)MRZXAr1OT_Y9qOY7Y-75j%kU!&+uxli`M16{g=mDPYU-UW zn0$iUs_HKuAB5&74(*;?oP?;H7C0wjhynrMUb98Qd&%i7xu&?CnR<4wXB^G{$NxW@HE*DA_`?z++^WqZYhj z>y2^57KRwWW*Tmzj2G3_-ZsS9GSv6{iVd^8SSMCv7m`-T9`sL?e{l*04}^mr_vOX5 zjcKym9W0Y`p;}mXLFx;wYv`Q~qR1lfY}r%j`t%LmK=G^*=Bk@CQ|`Cqk{Bvb5lfrQ z>9?Irp_RPm%1-h-3Z1E~iP?r8DqA|{`QJplHkaIFy@MU7<5CkulHD!#`%U7$)!nP+ za2UjZcg7)vw|PaDnXDT|@5@61^e4{|Gbv0jYJXoouD853W*J_*a5?rg9-cMduTEb+ z?XzV@N@|zfNmWz=Z5})fjp z-eu9@<^fgcq@f9$M89Yl;K93m-EwSw%P*V0ydv}A>|{6E6Ay23$o#fyeL|wbEXsJ8 z`{x{BMv8^@gx=oB=Dyf_a2v8ZZT#)ke9Y=)QjgZPIgI zxjA^aps&!n$FFRB@=ecOyZKGwVYxZp%d3|j-|!A>%rzxl7P>1RnrC_Ji^ZsYkCO>B z7k_Ga3b~5c4Uk;BBP6hV*LuA>{^F(Ig8fGAXpqn8)O;Y}oOV88*)yv^FqRQ8tI^6` z9LJF*{$L8)uJ`$L_d+hWrv*fkuaPhMQ_`~6wsJQp3z;GPO6KgAoAJq;hk?!Dg;IoWxa+u6PPyG6(uh)=Y|5_{eA)I}!pV%s=h-j19+co6ZBbLBN$geB zkd2SV@8``NELY&@|N9Bz@joFCJU*yxmCSy{x)pg9?*Uiz*@EFj6Y^&y{U-Rg|C~S$ z{~rmTrEp^Ai#Y;3k!Lgm!V;5eUnN}9uHlWtwC~k7zI85EUWktdAz8<+p*OS{jtku{ z;zpm4D}diL`3!`LY9tmdJSoij*g%E%`+8MVlS!|5y0GrZ@V%-g?%uPreF!plr0KZ2 z)^azei2R^*IeeEAf%md(I6&?4e8(_D2*w|~$Q~|il#AkP;cZnd z$knc#e9%)=tCtte%G&XD?wLc{#q7Y19q>jhA>M~1Ze@QfWO*L$tj4kKmKn&%3tH*_j3gf)-AHD2A$$2(!RBar1ouU$rod{N+cWY%cE)>g3 z(%X!e7RBLs>N9Db zr(Dnl9^^Do8A{~nJzBA66+}cKR!h5?9MZt%IE@-)DpN*g4$W(;FTm{|U^(~9GPcPk zIZ}K~gl&7?cLvO)oHBY6pT)6SnlnUxQR2-eYQ5h))aIc!Q^^!JbQRB2NR^7siaFZf zL-)`!zzp+i`_x-J8>7q9XhSv$)gLI|=w(FsYa~kN2n(6k3g?Ks)@&6K0*ave=q6uv z_|=j7J`nt7A8cWHAGJqCS0y>Ue-Q0!RJviHqnWx!#Ok46y5*vWG_?|6Z@dNxXw3b4 zq4)}(Cs{G~gQh}>^IF2S5rc>|Gx*S!u|~|$pv>H~fF>6ppt+tq6&-*v(HU)LC3mbM zT&F7gtsN}8z5ilH)2sI_7v3|T>?gUYcXAAhP&K(_$)|a0z1K{q660fIH%E$HInxCO zo|dAFb;E-?SZftp5uvhOTQ)PAWLh|>@uQZ&8?VA=@HPb<@rkQ>PMuG5R9bs<=+q2& zPWNEPs}i?2*7F`^?W?fVZe-Gx`~5Uwi^s$ByMb<)lg;y`flr>mlqCE{Ga`Q4xI+ruWE z!4^W{d2z|xndt_5^F&AoGKy@s3%Agv29Y8)C3RJO<5+J$Q4fWUtf;p*9Uabw1&n2D z!#lHr>T;Z$J>$FZTNdfVD)p<+6~i3J7It)=o4h8p)wld3gl#Z*=YJ?6l<(#HQF=iV z$FErTiFVlu5duQ6K!j*CeqN=7Wh*IW7yGKwCqTe4@ga|95iuxUBgw6OE9H$UO`8&} zVBs=)W^Ismb9I^Vy)-`FFNT_q@EnlqWwWHR@_Us!bc8ZBHYJ?r!)P{d_q$7{8M~t~ zOtrH)v3I+Wy{B!CSPKzRu66P%+xfZDM`qCy4TboTyoPw6xQm_k;`gj)yVKoGQ7+v& z_xZ~$^+(&JWHQz~MIIdTV0T5h+zsQFCW?xqANCKo(fwMrCH%4X^njq_R~~nU`;%oC zjZ?ycn(Ba~VPg%(D|m-4Ei5^F-Bj@1=l733Gm$l^xII2my0=)VNpHU37M8KAV?tSW z>}{fLRKda8VaTJ}nEneMzGV|EdyO2N*ENgtee$CenT__R(C)eD@S`ydi}`*tY>$d* zHrMiFu~S|9)}-clLYa@L279(9@ND=Bt4ie3Imd2T2r&g~<8=bzr{ zb1$6Ucp}k0WzuT%YySc#)s?L z0f&1>c9MzxF_(K>rSKtpmSXd(f zsKDCyI7_|}3jF~Ij8 z3T`)D?nn=Y$Is0;Q%cB_L$tu1>O(?6hAM5^o$5N|8i@6>c@=R_-f5tskuF#I6|P14 z4K!O!9}yVd{tW;Y6}?kO9gC4MK?0S=f7uxaP(V_Ao(P{HG58XWnkI1+Cp**L*g0{q zEW;C!qaXRf7G->Vs^-~p5aLUszodgG-t;9&@pIK=hQbMx*C8a}wv)F9L;dukUH8I) zc*?W~b*tvlu<9m`FDX%!5w}_i;|`7CP&bz*TnkPL5^q8d51g@zwzJ0V%oL=`MbKx~t5Jwek|B+rn1hhKYx7Fla&RRP^3I!R(8fg(C>zAD&C*s-LT z&NCIor@|Of&$=n_K9%5OCDNK(^ei?8TUV`!BBft}8u=s-Ms~wPHe`sOd*3|}q5}l! z_>mNBQCT|bNK+wLk@J7em9AoYln=SHWqmBfpZ%|OFFv-*HDJzA+=PQ}*n>ZG>GV1} zsPe;P*XGftkXmxesr5#{h4;3-v)o_ew)b7r9EJGOr63~;4Rh|4LH?mjn5w|NWpm4~ zuX^)?es``Dg5tS<9bJiszCCI%tl;DcJ+8QhKAnu?OYym_GFL2bhC`c`4_;DdtS@tj z{wNf*RA7Cwcoks?+0gZj>#~n6JDPYQ8Oloz>K{aEmC|FK@V9WhfCu&6LuZ>nk5lPv z6S)gJPphO|_olCdFMY+wx^jTHnbU)jTfWg!5~%6yYv@X$~F=ZKW(@*F&P}qAp z-q<+P9?wPcHei^E<5?(&A#8z&iP-e_MZXtbO0Tw1UtS}WZ{OgY-!^>dOPs(#G@Fp6We|%0Mqj!| z!eOgP6zC+s$E61={G=w!?YF*F--r67NW1!NlvdS~ONjOx_ks!)zK%vB>FJjhraX@} zm|}%{=AfvvwQPrk+PShxtCkJtGw4$)O>nozJCI?0j*X{+%V_8%LK9ALA0BufU(r*( zZe?8+lu>OnHrp^>gv2=@2zb20e|=rjaF#9TH4%a!bGfY7OFrg1=&Qe*gY(i!s)Hua z4g&r;Pw#D@#3vx{(!A^;=*M`Ub{*8hqlZSzyg`)52N9{XGG-y5Rf3dq_DM~(`MQrc zGHsK>18WlYNM!_gL9@iUes9%8nVUlV(k*<1_(wktCfsveXE_<8Zs8*)bg_8`IhvPt{BD(7`3&h(}XF)uA{iPqs|BRh4~MC^Pxl z!}Ya^ILbX+Ken9!bQ@4Ny#{~i(3ycHCcXe-o}$^4!PeUEf(A+k$4RQUQU!BdmctwW zU^-{)Hef0Gb@p-$*AVnKPWcQQDXpRa&h(FR6|``(ew_!*1C`8wSvHILoZHhugB?}z z1?#n{1{fMzLwrI54Bj)|-dT}Pv;D}kri+&GwFzG&h-UBTs@O;fIxJ}CdT2d{3GILTe_jR zP(fj7!cb(+UR0bA8#Kp?i{_TZc*%7uUx@*a*(%EjTvWmdGiwb+0sqOHKw=4z`I~OQ zs4i~bVW`3a?<_C-M2eH@t7I-b@8mX%S9x)^OV*dc(7(|LWX~I|qQg*Bt%C8Ln!kSE zO9|H}!%_fHgcJ7 z=FSG?<&&3{2>(YlXqmr%)NUQl5dj`aHO|zGWMC@58POfj3}uvZn1T~Yyh!B##7M_f z5MxXu{c}kgP4)Eub)eTZK@F_W`Mk66-u&!%7w&Dxu+v=&+V&hH1^hOmL`R&|rJDts zOa=D-^sjN#u~EP=M~7!BFobwyp6lW@FkONP^N%?qIIp2{-Fdc78~5^mq$Gm6o4^=U ztD`gjpHhZJg+Xx~jl6Nd{P!-H!+xj>A%cPJ{$lHNN8^fiJk5_jxLl4CYX5^>e1t?C z5;#CxBTI<(>Nm>rT>=yAZ%R(rYH+k<*iXsCb|M6?4m|41 zKmFniPuhTi+MdZJrHpaHj>Cjk7UwBA!=EK#CbX-Y2vZ%Uz`W z6B(Bw-tWRHd<3~2)C0~?Xp~dTcj&ldGs__vD<@nUWH| zko&E?lm6A{ElN1vGh58@HIR8kF_3l-tA|A?3x&Z=7*H9yIVxzlWaCZC2ptA}2L{`f z{sL-lVgMIvTs*-hlNH*?T)^W22X%UVvH72#gvO6xG725B(&W zvsdxGWkkXzERPIMp%1NBC$g8Ub+84Uo^_&A!jI?kkKZLj57OUl*fkS(RkJ3cd^yA0 z-5?3gbw6DqEH<8S@}WZT5yHnuGKzo|JbAiG@GBjDB+e(XEU`@I6ippG0k2aPM$_5p z+D!WVFjbD2g+%OFI9!MN&Q>En*1f@JMBE`xx_1{RT z%gi|z#9aK+zs9!ZG`ZJorJqEX#42G+!Ai(Q+(b={w);24v$Eudn))NFJ;zw{5z&I)lDz zXkOn`^-0k3SkL@(7Uah!$ulAGvr{Ri_h0}Uu?^_bRa2cqnpVZ~|B|t_NQD+v-$jJo zY3sf4h*)|ff5HiAJze(8l4>b{q%Ae#BQ!|adUsE((L96NwwF%6=@~|R)K3WAcEcu9 z9>A-z%Bm_-EQ0eKoM=^tS^ALnZUmB6I#JA^^k7V;fn}BOKKrc?Gr#*PkmCN+-X>sl`_9oR;?k65#V4!8b?CN!_WaeM$TGfBBZ{_6`cu@aFgtCbLxCT)A-gW7i}ciDzI)Kk|KFeY2mIKk=a-tZ)XCF z)MI|B-_7Yx)Un`vU@0Do+-If9lKCX00;HP~2*^n`n~+eRu%UTBgrrdH*jvc}CA|;* zIHN46EezBK8BQQE^({0zLsZ*ylumlL zN}ACQgRcWzGp6(#?eLSqhnVMJ`w0XMMF0Y5$oB?T$5N>UOcgt?*tukUgslHu=WPSY zYm=JMvxyH~T%P7oN@AVwGEQug-M6fWvex#GK{Q+EHaP40;;F@bVfsEHdSN-_Oaf zn20zzw~K4>0#)_I`~JbDbb~YtqSD>nA)Vjq@0@d8AOG{t zGjq?}^Stj)6oct}F^mCVn~>Js-|oaVcxh_VBJ3wC8Rat!4|ZJGiG8nq-K*b~Q#zWC zH0muCBf*5NrHYd*t2qo4>h`50QD|>Z5Mak~lftwvhe?zO;JsHN2!Jp=DRE!v`4NO@ zr?2ic$st*5%R8QeBNQ@dXQjs@vW@uB(8tKWy5C9c;UJVmjOmg%8Vze8Ad4Vsb5DX# zFABps_!hX(vtJLMql0y7i{rC+?Y)4R)bSUG2P8}IEy9vEU&s6t0|IS|XQYU$el^6F zUSx!ptMnB!G(0YyZ1p_$n~GsW`)KO_L~&n?*~U6U8wr8t;kg(b;wfhWy&dYqBBA?KSeSs;3L08yRkiT5!6dJk45Oes2hZ$1Jc?Ahm{Q$CfvY8wOtqjmh)Zy6&%I@F~xN*3pbpZu0aAjiOkTrA+_G^vfw zFTV@xn_y{+!_*A$(K9!#_dQpVlJ5&qj`v7_j?{IfKo%aQf41ADPRwc|?!c6~f|g~I z10iwBYmdH>T-Md395xf8hU%4DC=DFFq?)MuhB*;l?}5>uT=jsei`h@}3&3#Lf-j!c zf`y93_}W4W8ZEUDFu8duKvd#(y2Z;lQhx;Q<`b zEc_~Oi4_AM=5``12~2Z7YTT+yyKa|GQ;7yC;H%!9<`3jv68F@q)4Eho==>PdUHdA! ztui*P*~JyOARqrgwr!KK^AXTRYI=TDGj-A_De3}}BA8vsE)u#3LIs<d_ABRmMwO zOlvU2xlKkq)?Sba)olJ_kAV6<1PD{UJjHvm;aTs6m{<}fA=AlQecJF>C!BE(Y42iQ zbu`H#0=2hew93Awiese$6H(~B>65~!tTX5#571WX3wA^48R~LYc?tu-<(7@a$Lsi`K)uIgpy}) z`6bTJabVOJnASSd)RdUzLL|}**b{`}3{gul$z;Haxop#aaif9Qh`|P<}Q@hixyx@`TVqlnk^# zQ6FcY8|j_%Bf-VnhP08SM{y#5Gk>VANwdQ!u+7iAxD}@ZD{08RbSBxx)UeIsvYj)) zUs&(Ke{AAC3gX|KzykuP*6YWoB1EX^O}*K`PZYFt^}?5T_7*prvE7H%!(Ur=q<}K6 zpiRh2a2cgSquE=Db9mr2Nt`9xi~IG)wWd=1)|~&6QMV9&nc2zg!%KT>J-s!vceMJ+ z|MH|m-$=Wc0X`4|Zr_gds9nD=sOIh;+AMt=eknuM$Koy9~)$)ykAbEbkJ$Y`nt8D=Y3(-vMY`IfP~C%c@&DTYMKyxUZl4 z=@H=%NzMA_FS}E3@?Gd#`D7+{@t8Gtd^`Qiv-jJkD4f3{9*T|TS>Xf7j#zOpasJZeMJ>5yf9gAwQ6_c;K`^tqPus}Ar=dO& z8q+)l2GYm$WHc($K@~RT?{MuJTYo>#csyGZV@e<;Aprjahno>X zNuvA>E8h2UK12~$XQrbrWoxZpOQx8fzUbEJD#G9Fp6~XQgWT)rDBynk6%Nd076lXj zh@LA#+HSgk$51KQt+A#8ycd3Mtie%CbQU`BS z39CJ;{c%5O2oE;Ep!|GmnFvY8gPjEGx&1`~Ucmq-9gL2ceDu7G^VE{wa74P!QSMiB z?$w!SndSZu>hIpQwg0h5n#BW8T$<8Bi=w-)W)Wry{y!Mxchbj`KCEIhMTxKC8aG)> zv6#G5a*1K>gq;u>j?no4s;L?~JqS7f^FjoGLgQagMBlt~7Rmj!G26ntsB|&Qh95aX zRxs)hI5`A)^uJn$Dz*>Et;x<8>T?39=vg%eg}I(wj%UokX@m2!F@1keFq>2RA4UI` zMsR+aI$$s~DeBX;9B0G*UcR<8(&W9&`IEkWZQs|XTbI1FoQuvB`#C(YPK~=|lH!B4 z5!Psva4q3#}_6`94$xv`-9p`;r*~0>m`VY=fi zHdkrin>$dd0M^7eAOpUgrfrbgT@}ycpedM=tC7}(9l1hH(lgv9l8G# z4V=SOnY3tF)>0>nlF_atNk^7r5g#VxK+Q4Hxix*AGu*5`WL%! z)&8R8FFlSUXnG$&(S;wp?kf6J|fCe0h7Z&*HG_q#9uXsTVu zD94IMZKLs{KZ8d0&B3L0?Fl!dp}i_1fRykbp-^A)rJ^;DOfR>rxS$PQw>}T#v>vl0 zny3`}lDVf*gT@pg=9l+**EcM0<^Xg6&3NsodMAl|Du570O}-U2+&q7o_OE$<)9y`V zNeYM&+dK7(euCw#(_hJagh^6v68xIo=>U>)Q$c4BZtOXrPl`BT+d5P@AN?O2tjI=Q zt5|mtK(e|5CYmNS1X@U!&qKKBq~!?TcxYJQaX+7aeOr$j349dy$PS7>{!Z7DN(q%= zu=*PiZ>{?SSwiUHq=L)p*jeoxxcm*$B?7QdT<#szHeeH9*PfRVn{4L#&2ZPHTFmsS{hoLEdr zJ>~A7LUj9WT2T;q7I=1!8M!&`?wwYtfVzMPXoLq8JI+6tSLD#^qMc-`ORLcq`qQs` z%@YCci%nYXE%hHMMBDlVdCNw0CgND9pWqXSi<%smFncIK>EZsXj1vfm*%;JbWAOF` zyXdUFeL7Zkm2Yj;4_ab}f`rzJF%$j!Wq?**`)yj&MqdzUE+mO3yNcWGl-B%TXIKIj zu+%*%omtPgi=x3@XHNEYe0FM*d;JO9cTZ;P@-mL?Vw)FimBnI;_|b>&roL2mu52^p zs%FfqvHusBa>G4GZ@9xrt2mv&z~R`@ap`2-T~1L;fbN&Ze&#a~q2M z)djY5^>s_Hd}SN28$ys}`Jt;GPDCk_^{lPsk8K30-zAj?0(w6uwPGkg<{OTV@O@G`)UU~Ra7&ym8sf{GKe013 z?YhDMjmSql@zMw_al&;Q&@9pvWcfSR65)oJj!dK86_D=FbVI5a)jRJF#k=#`Ee|+$;l{ZyHy>{Oc%QMU5&J zb&9|AzL68RxNcE6ZpEf)EW?|tho&f(S00)g$|ElH?pA%9Y9NGgh#q-{192y~Fk1wv z_U=<5R<y5nRM;nLyBag0=mB~!}_uOD{$4J}J*M%!;@*%i=6)pI*PG zvDLAm(Y-WgC{?(2em27$&@0vBHS886gGBS!6FTKV5wtpel3k8wF9(0>C!W~mfx$oL ztMO|@W&7%>YAX34$eU3tIXAayT@FN03dR%T)~8$gvX1l0V(bc zOmh+cQ~jgb4aVOmuDA1OtG0dBDNhRM+t(0x83%(CNQF5L9WlY`nV{QBR%v}qy6}b% zFVbAn`#;p`SZE~IeHC}PUeIlLGa`>fCnSpv|6wIAY%k?~RyZfZ_soJWlOl=%yI-M* zPdLzRbAD&tKOU1Jo2uM>_Wb-u(^w?IQL{>H_612mF9WxNAM~R5nb9r2R`1xi6j_cx z`Q*sb>stic?dx>f0aY6t$?u0A{v5=@Yd1oKCRpSC{d#ua{iV~!_&(y49x{(?sz!~2XV^cNYu z&+2!$*x)o^+;O2q?m~`il;+gE+s^YHmN` zEPTu?pk27J}sG0iq6k6 z`iJdoC_jDF1o23zIm6|R&(MB{o)ln`hLgc2>&UyB)cL*P0aMb06sGm>3C@9Ft_k94NAd5OghjeT&I}xY9H4 zJJ~#repat|a;s2xy14Rip<+3Znl2p^+dCPy9Pv&+vvkTWS`Vu!Q@2gYqifiEy>wx# zih~QuuJg2 zwE#pEFdu7n-8){A7V+=-iQnZ-;2BUgaIxQoTJi#pwm5}Pyf0;I70tlX!4iVV2E!V^ z=2Vk9N-PI7v?J$!VX_`wncn`r_e#{$SbnvPql3`h^1&_n0vLA5x5iiYg%GOYcl5QW z12+yRZbipyb#S0{icgB!3l9W;xQjMEJHO9k7?E9C6k_}gNW`BV@Ln97!YaP`I53{Z z=6(V;wF*0j6u@CInK;HbESl3-V8W9B$Q>pBCt{QfJazuYg9N0-Z9@cgue5liER&%> z#$RJtBH(jjLp0o*`8-4MhqZTa!|A0++z76N&BEwC%Vs%Q=olEPQ(T!t&;0ggRyKu;K;ZR zBh#=_&M+`mtfz+8(}8E35q|rY?SnX!XcUnhhBRkN_dq-H$Tc7QQD783 z^@E*tMw8#`>uUqk^q;a7!jf3tzY!{Yq9{LAMsF(E+Ss^JiWWI!HZ`+vd)E4q$Ai|7 zqLy5#*NKi!@nrzJ7%5@JlnAGtyY4Vkrn*+iP#Gj@Kqv*(-m#X)Y`lEBTY`Y<^HkLG z6D=Jk|50bIb*sS7*vA86Wjb?7d!aYK$*^&*t?k%>4h_79 zzeM2Luwc5OC?LUSIkgKg;e$jF_TK1fM{f=npcuS(NmC;qXQfob%L7!O$}0OM-O_cL zFvUf09I;TUYrbRK86ED%HBrKeT~WYB$FI#^=(sf*fl@wbrO4ndp`c=SkKq@FNF?0z z>WS-@;K~mKgoTx6U(ckl?|ETxd$l{ZraEvGTr)9{H4I80Qme<7L>nc#268vd7S`0y z^ers{U$6_|WA^pdx}3#pJx48QD3xn0hH#_w6|`;UjMAjoGU!8~TikCN@C}!Hc3sr)>*4mi00-;md+G^Yv6IOSZFm7A+>_fv};<0Ih{)sg;) zvL-iu;=FmMm*8+D3V-$N>kD9IQ5DP#JtLB|G_)o)V|NdTYkE#KO(Tn9m)~ z4Y@sUubWM8hE}LGx}S-k@0@UpL^hw%e+eS2I=wKR8PS3&tvK?WSUP2IsTBpuAmyAv zxGt)8QlUl>DQRvi)>^uQkqg64fm}u#=ewQS`Lg8Z1%}B4FJHg1 z`ur=-RKxAn2;5ZsuQFhj>XgDgy1DZN(yMC@%H(X)omMJ z5wJ8?8NduxsiG))HuwC2-3 zbqA10c`#qE8#jc*>au^!7-mnoII`&2gW}i8&D|tCNAr85{tfe?39JJZXS4Ds)%HVm zW0amYD66i}8^)pLR{r+gwz=Vmr<8T9Tv zhSSOEnn=a@WMKGbyY_&~+7`lmAW`TWXDw8qH?cO4w;mf&#P&oWu`~>_xWYPFZVqQuPZWh% zRj#iWMT^#d))pHi zCmJKtZcpH88MavSMG8}-+L=3jdGA%8CY-I-?q*@B48P^wm#p>C>xmumLwg?swTagGVlQmM zHsD`A@uZ$^cjVt}LqTdSvn?AB!KeTj+4}V>rsB7nvcHBO0QF%I#ZIe8A z$EQIu;?qKlJ0jyEC{t>ct&=l>F^CWUZX3oSk=C;ppeOh|noG=Z>&~u4XKdfa0>Rrr zxr>S|YIE(h=4%gzT_#lUdg_|o2yb^S-7on0$Y#ol+%=lsOZrqNaI>hhFeBpX-qiTF zcc5!N5L}K7c!96&ymvB^L8;zW)?R^uvG%xBIrBU&?j1?$Rg2(>E}1k*Zv5ZOmA|)p5{3T_Czy zP5!yj0)pF}i_dAGlbg>I`ua~?1MxGLUv-+fUAA08WI?x_-ZZ|bDk6u8olkrvDcvC>&(p6;2A2qLmUMQ(I3lQC>0WJow7Iui8_n296 zE>v?ByHXR54l3z<15d{k8@@uH%?}8V@tBFCgfV3#6oV$js3&Ij)*Ef2M3!UTPK#!* zi+ova#YzTvbv!(vkSDrlVLZ6DX*`>rnBhO@cx+9)lI8pS{vZ+y^KTT`R#gQmpE^v9 zEKC)?&GUYa75~(&pA5k4CVLz+U|4g*72`Nbf$H4nJ%B6(=G*9@bNpW!P8ad*_XE&AfJ4H19<=&5H0|twE3pFNxW2XrM}_1w`E0d zGoIbc#qVj%-&SCmd}a707QVkt%TdoKi%mR%Gz>PP7|qz(cai=kOaspVup&WN zA)@5NG5d90p8CjRmR|k3<%tQdzPQ?oGg2>_251g>LI~1q&~_-uh4e{%Xz- zpxoqGU-5GFVz88dHc9i`=9OlXA-{@-m^7EOf`9wuXyh(Lae|F zbCL3(P(t5%#IbP>rnR+L>jU0ICD93$@V~my5p{GwSf}cK4EGyaH+8d@e1R~N8T02# zlm2!Z-~TGuqqqP}Dw|I>vWG2OMX9Xqc)moL=j8kmv=JQvMnq@A#9?P$G?0|p`&Bu` zXyEUgrKhpzUrF~FM+@{1b@#iwOLz2T_`ntaV_!O<#>KW#a$NfqP-hk)ExaPOL&YVa zLvjT~YD7q&Xn0=WX+M|rMXWI7(*YO*vO58-57$d(V)I@>KECIay7Nvt%e$JY>3{JL z=;hq0>Tv6V`^CU(e@I%ryb`bYdT$rH0?_m&8mMBGr$S22=+e$1bV|s$tmJ-rdF82x zK!6{+qGq`3t%HnZA>(WvaPYT7=Q!Uywa(*y1Vx2F0}Yeo+}{tSLxvxBs>OLqb+J9D z=xw|cNn;r38Lv0EH`>2ABV>#!iJi?Bv~PTqP!CM?uGQa9|`p# zR_;A}TTT!2J@^LqMaGxwIfX;5TGsSP*s&vPMGb6008>i7;WR>uW)lF6;g^`c=364b zU%s$XnQcmfmgeHo3t{zHt$s`wVHsgg0SSJoHvHz=mWLf5<)jp6!i32P457o@qssC= zIl-N-S8TA+l@1fzmKt7-^bKldW#m46sU11TtK+y0=pqdL&)J`v{>-p)VD4`xJ_Vcw za05K;ZHPgy$utARzXpXr1U3x=mXk{CLB|Ac*&)k+fThW5hW36ZCumkwj#aI}C?jN+ z{=V3#=Z^f<7RdCoov#lsWPA0`CIQ2WuL+yVeT9tU( zY)vJ+g2$E=hlI=J5)G?Op6pEI+eO7mVvU&1+nKa6y8~j~6`L$;G<6mN8!7yl!f0^F zD#P+ndM2^736qFIjC>~{bnmyPy*k}rvI7lVyMo3(e-zg=8tjC2C>s~o^5+TXv>g5j z_k_(PAprwisDLvgY*Nn_Y#MWYYzdN=X2#(x4vS#!F6-#pRL0ZQC{cc1ZXgO%uo{)pWIT#&)G#3{{^gI^W9R38{UW1k0*F=D|McUpn}%F7@!Pw@G7hc%=V*h ziFy1n4v4LQj>@`@RnG3yR9=%<=wflfe=IPo%w;@zHBIc{xYfj^!5=L=q66P}QIhmG z;H><#x~3d)!tWY8sDDVaTZp&p%>uh9=egiS6iXI{*?s5i*{HixKqm8MiH!}y!&3jQ zZt%pLtI5WbB#m>(8-bIF4Ot3X#MA;D2~= zYX9{G=6_)_DSv5q?lYTNKG+cn`d;%Xo6};{`4s0A0)Tl!kbz@U%EE&hKTuCdM%71pm$BZf*IizK}^;FGK|bPB}0qUffrnT zb4PSxYx9PAKoU0D^F|>dNL~5Nbp3T>)vQItzr@49HKpFMbsaRbRrsf>`g}Zp%lMB4 ztyfzn07k;An_21h4XN7-`Q`oBdM#eG>Z&ct9f+Ju|HlYIdK3LIlNU7eUzR&Q$??7H zU_UclpOK?a5)QUHvsYG(D@+7Z{!2a<51`sI#TMB66*}l-OuFI0{P%4q60tuXx2Gh% zrZ`C;H<_t`lJ-0--8I{BgAgTWHfHE;#({aAQMh!~8~bJnM_$q%}=@|JR~} z`2Xd9GG}b0Xq-5z%F(wtkS~_(lvDLTnX2X0l0jAN#$p-t641m|gW^GV%c?21Y$8Hj zh+&RASMe1w6*p2sO`2_g>hy$6XYDy|6IzQ=)B^ydGdSJHY53PDu!kT0SFD^X-b=1g zeL{_H7sS;#!qhAfKTKKV=*IR!w(Kc$g)v*a(mT07%3e4Ou&tPv3_PMAsL;lSqrRG_ zu)HHheg6DdL@|-p=xme!xKJv<@IP@3BWhIbe}(4Px`78P{kUl-c=&Q<+5-TiaZ1N! zLIJs1sg2Li5OQk7%;8ckoBnKaKWduyYg_(x*5AbGdAu(nIHs(c?`Z$o&Z&wTz-&-O z62J<)j<&L$s4K}P`;HzJpwCERM2A%JV? zZLHho<32SJ-d9-(#rDzsoO!!5C~ruI!^ws*uraE2=Ec4|m%t_=olpsD*eY?_GBdlgvayS4z z|CU7=H4uJHHciY!RngwVIFkv8a#S$}Ox)JAVQ?BIW_S!GeWd+MK|{m%^hX(flm^rz zo}O&zgQ*DuwOAQvoF5l+&7L%(Wqv-_dUCeKA1L7U@XmsWO==L3O)w3-HsG&)6bnA5 zW6EPKmT&XRUcE}c$%`V~a;s@=y<20hI`R>o_9P>v?Hw`Cx)j54i|}*bc*D1z#9Kg(BtoR3H5;Xprr*#tT>SpRQ`Y+421=0Yo70DaQvoOL zuS}ghAL2j5WN60U!rWe_ zUeNGbmLeomT5f*Tg=Dvl*^F$-v5IxDYy7&#gV-Qdyrm=~1K5I=Dd@xKGtq&}NYMBV zKnMVBqs3uO5qd~kIxLqBN^oYb`Be1vZu#WfjGUoL%^+z&e92kvKFLK z;*mg{C-ms728Ks`P(B6-YMp1($B)@G<}FYw6}cu6BlXIZ&@5ON$IgOAu+CK1WgJ5s zRc%U7iC->D=Ew@PEPtc?5hV$k*{Ao+l}ZTHupQaSbIE*-rMoSuTQ9nlcxU}++rZo% zCMOH5xh_~1!`MQz^woy!dKFSb7KiJ84)8wxc4I;UXj34@<4O>D;+>)YwxVPCAVS~R zSFQi0S;+^<)xAI=Hxb%|sS%Z2BU5`r52f=apfs<+K*Zc|>N7`S3|Wm zkYxW%9^j7;U+a2Z-*R@w9uV~II>kW7hc0DDi;<29)WZ`q?Z39&(1 z0Le5r-!>8wHxDEm-#tFf;0j7C#)HeP^v>2hY;xCi_tTB|`C6ko@$6<9uQ20A6KZsx zYa12}kik6TDidO;IsNsw6ii4IJ-6YxV;wy-c0FeI59d+yEjOP`V+qJZ8gfBr-+Y@C zCfI8MTReTV@*{;5B0=5vT4GT0Q;mpFH9pF@n#}%^WVSI|_(W)+ZKWL0;Q)U}{CF$1 zq`xi0H)TH-xp|qpCnY#Oc?qPo!GfOtwBnf_A6;HdSDvT}AkMabpDuP>vxV)*@cWT^ z0R4T@R(l#z?P{Xy^G7^!t`EKG;Rn}$&gL*h;l;C7^B5m~nN3yn4qk*IzVw?kmxQACm3$s0q$x= zlVU&}idY@-Y<`qX`K*+zyr$K_WLo9jw+Frm34<|ZMGF>nplNZ2LFGuiLv-Qsj5y!0 zh9m)p0g4dfx^Da;q|Jjc4m+EPbj+K46gWl-;l?GhW&f7Z9nNq--5J&L5_4iZkh&+X zSTYQz|6$wq{K<+ZE}ea+dcLX};*!-=TrlKoUz&liS!#GE(ZwCpS8ft)9L%D?N$ARE zMS7P^)Bp1k2`o0$%!&j!(IAl=`BKnRZN-am#-0u=f0T+Rz|u%ZYPi5o9kVdWiyn3~ zk|cRSgG`&7Y7f(^k&W2g@(P=n*TPGx_Yl%=>^IwV9%4NDrZANzIzJi>Zr8 zvlcd!!ENzE&jmNPg-L2pBA7@AE!?AX3-H>hYx+%rsm#$~?PZQttg&dndeDZtq{(be|6>eOWkf%o!_hJJxFRV+~1u^do`ulADDhq=I{q00yvVSdeH zyEcq24n9Q8i*18jh3;fGOodHUr6u{&?`lWQTfM36F(y>jO!d2eb`^|=;&9_Bs9V6G zV=;KSO_V(8FJo;LDNVfOsIYF9&CHHzI`rF|szd|jOGC09#vWtxGj$t!=Y?_clSul{ zjB@7P#OwNcI>AWtT$bLcGd{A9L~SrhPDS>HzR^Q`i0#|<+LCWLMh_uqe&LFA)2QlX z7pLWgFW{q*UsImN#E9AvQHsxuzJQq*f=cMTiKxxJeOz;UP=GRU3c1Gz&)4j4yz%ei z$A^u5V2lXSA={QYjG`y&97P4VA&XrL*lwiXCcNm_OCcG(h&*BOske(3J`!skjOI)AMTJRngo{V zF$>GPdKeuQNMe%LM4hx|*ob3mRGY9WSDPO{ilDzeU%5ph+sVHd9u%!}nUDz_k(t>~ zwIG8r<2mk2KvV4VxM0lpoZH9J7ZDchP_xQMU%HqTNtA>Idxr4`bZXH>mbtc1MGE3EsCG|a7e)BQz19kGgx6pqGnIF>Czhsk*3Av`@5NV+NqXJnp zwCBu+Pxn@GCUuvT7~ee_K0-#bOek3IKoEt+jK@_iq(p6gRPwdY(~~Xm(0oaa$pY=% zyToUmceS}JMUcO{#41n=Sqe;`2cyEv{k0^aCNSggABl~)=_}Opb%hVL%(AiMP}v!x z*&C?=0B=DEd|Qz+Pqz)fJ0mR}y*ZCTV*5^Y3o;y`gKw42Rm81Y#6P(G^9)R=k1cFF z)MbEa%TzByzL(M6!N2tgCVi+1+R|WG{$&2eVA3qKXS@!#pj7Y_+dXQn+hk0Aw&DVw zN-bg2!7pI3NSpHHo%LB^S5hnt=7+-T_D)PVKW+J69vT%cq(*J#8`yj?lM7i7xKLq% zN-9tFmI{_>8|oHxRM#o^oeISOiITp&(dI4}`-VoTmh?$l;7<_DBL4dtrQ2Q@q6~K} zzkQ!bz^FIBOc$S<`$inGZ@u(t827#fJS}@A?q%A1Ge`5{mM}0m`+}BH47#f)bL2tf zRdf+m4LF>^Oc7{oZn(U#CNNGczu%O^sSeL- z+3JIDU&Ij*hSqNxch6@QvwqMc;-ACXaTe2eK9fPm_9FZ4^6kQ?=L}sSQmFt(RYQPe)W&eeeb(-5Yuhy78fNd6@l#?nEC!{@y1pd%&=-BR*?Xk= zIHo!di8RE9>KoN+ei9V&3!;xk0YY<(KHeH5X#tTB8FQ1o(0IBeLtcwVAdo#Js=Pyc zJJJRePu?9(a?4YdU=l9Q{@!ghWjMe(Bqr42?kMD{DFF2N-Ql9r-fVa{r!DPG%Ce6`_gh~bh{#@(M<*GE znVmQ^GMUQ2{S9U(h|SrntRhvHmijd{PP8A3nk?&Qu#7v?&{ZOLCO(9vDk_RSXJZl_ec8b8kgw#$mq&!K8U8l(IBc4CJAg7FYIep_ z+YGx@o;AeS_}D-wi=L!L0K>Wr-XtZ{H}LD6cbii0R+03j>ACW(wi!rw!A3uMmxzF# zvTbkzF*cA6DKu^dOY~HtpcO=uPM?By^8FYTncUj>?E5Q>4r-=|-rOWRm%W-0lLfHP zw<-BqMwF0N#ZDL;kxFuJP56=w{31F$w-@inu)uW0`=S>VNe!UrRUuE8!fV@}n zTtiiEXAGAFP02?tA|9346yw6MrSz`HF1VeMpdK6FebZ_R^e~{VCrdSnSj|6+KNW(1 z7#lv5twil?SbQp)I+P~qJTNE%am124Pn90C#U`EOI~9R65Wz>kfv^F_K@KKQHI>`` zfX{?<=AVBgF>_@T(tS=b0iv?NJ92iV__X2cH*N>pDzb(etGStj1-L_NZbv^UuIC=z z3lUJPZ;Aw&ADE#v)yZOmGDu%jLPfcJ)v6s)X9bPH$PK;0szgC1~6@UpGTnc^8K>X#W zVlhC1B(0hJshX&BMbc~WtEx(Y_;;9PonKgmV!WdKIkJXuiE-O+;BVcbyl*F_Uik)- zwsR~AlTa*t`*94dDpf3=e1&F>!2Xe3DcuD@`Rg{quDR>@2mdxdJYb{{u#Zgyn6|5H zNtL!(i$<$|GZ()gurFr2P@vdd$mCq|wdExNtjK{deU>M&qIcq0C+;<~PGYE)?c1eB zf{!W5t<{Q4*=eh(Wa4QUADuc7WK!`^g##C2$j33BjQ!kZ3 zVt7r1>^0P*{FGS*rt` zUS_YT-OWd5-W@uaRLelL&;Tz85Ga!cUs9|wpT=iNKtIlg_hQ=gAI^Byh=a=Ivjx2K z5;7`r`*nDLHNE8SE~vEnZm6`;tpumptv?S+-HZnvoC=3W-*%XJ*6rBQd+%!7JGZv@ zm!yIrZYVvbs5K(a)gs~pu(Vli7N`ZS5Ul=}t0OTEh3G7M*}m!P1n;R^CqH>|g>?%G z@0a?V&WrbAxCH;o#7OolW`3dq;BJ0#JJ}iZnHb3N3I}4*$JnaCEmJbLrshNuW?~ zluO3Pm-=ppS9WB~r}%N3-aFp;DCwJx2Yr^} z1p2jlr=L?XM7yCXb+Yg2FeT1^5rs|>2Sy+#aZn}oQBk_925pYAY&jqH#@tcC-W(F@ zizeWDu59M`o02S#JYDaP%vvYtTUy2v{f@euL5(CG6_XMnR!$)gvO?p2UP>+vn*#75u-w<0`mE-{NxBJdYDPJT zl9#htX$XDZhkkjez4h<#@fI=4&&s35tnMCJwOWN0!hNIS7@|U*s;*FiFA!WgR=58(MUufOq?j>ZCzZ+Y9qw=xs^3*5! z02Ck;rqd6j8$?Jf&d5;m*pZz1p0DzUcT7G|Lbv)1ed#P;N$y3&COi88DMzRIO9_DI zN3F@xG|ai$O0$BI-#-n95SuGk#|=AvwG%lh%hqGB-YGBfM@Vu_;&2j$pr#3k8g=~O z8Lj2!inmwh5(+34oiC{N_TcD7Wd%6VLJp9o7)tX8cYk(S)7Xk+rj_{^cz6W&SR$!}y}pfLyOybvRjBlu{`EZaqR%Ji`u3+|M6ZXD${5mwa=~N5UfYjjfi!uD z+sTfzJ?@G^V!e4aib|37c981M#t#vqn9cH0@J|UO?4mgNwl0WHt z`StHtDyaSX>q!zqHS`sF zJwM%MN|H#XcmdR)z#ymcaY5=Fzhvl=FVdP@$RjMY+hO%W61(N3A+#+g;2XB_`94q1 z$KZvclx-vx zj*$`m0i0>D> z)jib*UIx|TmK&=qQ(2d_G8gxK!PPMMH7ldR*Z5{iNqm=y>pC!Lz)(y;wKVna258+&mWp+IW#>fx(C-soy*Ux`g3?dyV0?)mlog6 z7+P;XtF&%cvBH}2Lm5@Xt^HXp@Fx?Z^KX$QJ>GO@XyfG2liMm~)rwsavQ?ZW(~T{? z;CN5U=HeDRZ!JSPNRRfPFR1>XmGk>vn)%o$B7JW)*Eh7WVOEY}zTOyYBg+KI)W~)@ z{}_+d{&TN)$2Ac?&fca6=gwey);hb2K#;K8j32f)is$D~vFHhCK}WVzU0Oe=#XSR? zw%V4i{B|>6;Uu5|%mv-h&^7sOP`B%)KO@dEOUWWgrW4JYe%;_`+fu{J2Nm(k4}GKO zBOWlSn8wDve>*%T5hcajrq=U2=^>c6IxIksattGp*N~lRk~#>80G`x?UkTo<#=RBX zrw(e0TP$)d$mq=0m9{NLFhZ;p29F9s)| zM!;~rTF$o|ad=m~AKX5Gk@JwP&VCT8q@8;Ban^m&cKBtq-jnX2{N9o1{U>6@-ymhF z-S{wD4D$_@aqmMOBS8C?adSfKun#kfXh`4Hvyv(h7%KlCPhY_nN3b=GyE_TCuxJP_ z!5wyScL`2#C%C)qF76V7yF+jbiv@Rw81BLOxc5Hq_YbCLs?VvOu2U5@{?Yr5oNnD0 zHBN{EvxHxonSy`dE}?hkYbiqjYG_GxzLv6Y8u9;mwi# zuZ7yGD6Fi6em+zHe&YqhCNgVq!P`fK^-}Hm=jys)6$1ytC)B^PKE`4xQE3eHu+(Fu zWkdw+qF3F}!hcLOkbjH(+1%DeY|6jPnPrRromGmvQXVy+7|I|s@ZUC`r;7+m$NjK} zm(&?O_82KcT;GW+T!v7xXW<^k++?QAaI-aW!nCzo&(faf_amzvfFoRw+GvIcR~6e$ zLw#j_FclkrA5?exXF@nZ?yJsh!>evnZR7T{XA89?(ALB;ox8~uM5-J#TQHorP)H*p zHYc2{zhT5LGoZZ!uOMbfZ2eG?8POM>!pX!ry zo~1X{{~=YcsF+Xw|A@wdI8LUEmvl!s$u#@UU^>okjbGGmIA$Tfn>KeBxmIrBmlx=N z+hFL77Ed|b&)5OljMQ}~PlT*vczh+U-c?vIo&FiQ6%rjth(iY}P_yl-OSGM!OUJC- zklrB@3nF@Nc|Np;JuV{8{-B?pxanMUR=^=J4nPKDImCY5Usta)Q#1{iezlXR)>Yz) zQ(@scp+|Q)yDPwlzmnP}1fa1CjiAHG?uL9GGAO8;mUih-|C0$I9zdNjz0q zL(kEs_KHTJf2`Ee8OxPaIoCceJ~*Y5!n2d%CI7~BJ7)Rx!vtb^atg40M*(v|1L7b4 zmUy8)xV!%5y;)#pnqRede|>S`o`!bj_988KB@`$ubFugD9OvbZKjYt>W$&-#r;PpQ zvYf?&$LH4Zb3alX@N4_|3kR&at`v;6_)_rlRA~nUSkaQjj#j7N+~Er zV5Kd_xoc$SAGr+l$X(kLTK;Lh#$#1G)M<96N?~1X2Q;=~(4wJu7zDHOe|}g!ppea~ zAK($)l=4>a8#OV1+OFQ#TMX+Lw-)<70%bF$8QuR9q@xa|jr?`xO=NpC#khfJ_sbwY z+YPO7Q8oJRG?b<&l%XFIz(8jp@uGL|^E&SR-@`+PC7RwNvrcF1f9RfR489w^)9;iwL6b5k*OtL7Cl+f*oG~ZG>n~Rg*UY`O?yi%siw)s@1?Gi=&Jn!aF3HeN zLvHKWqVh1+Dr{m=_ChOazKJNM5B_A5?y{k?suGw(;B{0*E)5mUEVrX&8J3SrnYOta z$I1XYpd0jcG-n0u70lXv8~5!!J-y4}J#zu)`a8&)Xc#){PJFah@bL`szO`Fdg5$By zx8Z@&?0~2rSbkHnIZp?OXqk{9m^P8Up&U&;O} zTwf!9TaH>2QKWoW>ia{sLlZFLqVU4-dv0HPU4(wro=`GF$)Q$R6VB;{w-i$e%_dqV z3rceN)lV`;TF!&_*gJ+?z(Yy!znh=pv53bF*2Icz@dNxXEF98`wWD2@o*4zV7X&H4 zY)JzoU6t8f1!Y5_`t_Kx@n3zvlG~OPr(ZrC-ibzJJv{ry$x`rIZ>qPxMj|7Ss4m*o zs$Y6IxFcf|Dms{iv^YhOF4#FZ&*sUJrWR*Vji$R;v2e`>B}BK^7!NIDR@UPODJ=gn zq9TLiz)u>z93*F{Ok#vZJCbPEpRegJACQ2_Vv{dT48ev&sS)ab;x!XQVA=?k8|Kf}$W3k-|1k#wJG~r%77WHF;mV1C-jnRoWxW znCa^+Ss8{5FWY{&4%y*Ir#1qP{rL7)Upo?6eWd8vW{v};r7$$b2`h`u(u_$)v+C#R zC#x?}5k46;M#x0uC^UO_d1gvxb;lM8(qw0yjj>&sNE4ZXVwn2#3-I7=ko1$U&Xw#+ z2sCv2t84d%`_RWPs=V3KIrC&w-_yFlPb8Ba>JHbc5u3PUpQUCrN+Fha-kKz(BxY%~ z0rQmyiBYYwGxV1_ z!1KeGUZI-|9JmwH|1Ip8`Ia&8b$UgIz*IJ6q+P)>jUs8|YmBVFqni<{y4r9hui}D6 zLDfN~y18l2=`8_CY&M_qEM;k2OwD=m_~&KE_Qn%heW$FHxVYGz#-$(J?vMr@aC7AX zRfD89>w{NDy`t5-?sc4o()f<>I_fky>??ZyE!R>rjqa=SE_KaaWy-Y^S2J!J57A}! zcI$nyy@fhS3oV_kgDuDz5hN{+KV+d4oZUJd@aG{29&KfoBv@wf7Bx9gqLWy+3=%!; zl;33-MB{~Xd~$&2^76?Y<&T<}&D-+18*}^Lf12Pn-S(S~%*yq_Z2xjn$l)vw71O|W zN-p5ZY*6PVpeF|4wjoL{Nm+JmLfLs((OH1T@fMXcsCwC_Ji$Mc$T149)8Lxv;S;aR zZv)B3Nm`%1O|>thkRjWzZ@F+Lr=#5#KDe(=QLsJ4A3acZZV(&2VS=;QpiAyLdsx@) z|7R<>)Q6hE@Ukezo50<6qrB+0G;CFU6@C$&vccoNVq&kU8}!*l~E-kb(-lXt%TgT~JG3 ziV(JpYv0Wv=ibcm;CTuT7Jhq@H^Z=29kGC6&}G#gh_>+pA8wokerC+CisI+ZnP2EH z-y=2c;#s}VJkgR3qcmc(-*YEjSAgL92>O-=*O19=jO8Bo(6cr5wxcBk=+oDvpD$#X8xqu6eRB672gH zfe6_!HN)I5D>%yBTKi}%X`ROrB)ETh(&f6dX8kgE;y?Pu8s*@Rsyup9o%&1 z{rU|^>or6hbp(GOBx~aJs2^73pob6%_vj^tk$a^NGn}?n?RW@qqPl#3c|^%wTETxo z!$H&&2QPHowyURFk1GmFmRIT7+xm{yXuwC(v(ZQ#IKmkK$2sUXxbq$E6b1T_Otjab zN9^1a>9b9Ym}uC!qg)8S7+(F!FRr({*JWFXu}=gk zwklT@yYDXrRV{O-tdUak^gRwJ{p~jNbQ1FTCjD=KIOq8EN$*em?z~~nSm5@KFtE0zIBvn?k4t#CX#aw~SgmC=O%;H!bVdnvMIe?t8K*CA4 zMFnW_T4)C1$(Smi?gFs-3bB=Dc~MgLyk{;wwG}eTWd8Bh7?yD>r|21}&CT~M{J=G) zLX35hj`^e}q3z!LVuf=W`fi;y-?Qw8k%$OwOp=hgiP{gNd7m+UAi56Vv~_S_QGT*{%^Vn^9%$b+;UOh*wapz=il9~TtC~{zt}|Wk zpuHWTYLDcr@9iXdkw^&}-0mB_qk0y9S>=W!yPRTx*oObaU7N5~DsN*6$|m_WJU+_; zAq`)tnw2XY*eHmq{J5^`(88!bW?h z@0hcD>G*)NyiirM$gkrDh*3+Q++GYf8=6#hN%S50Wvr++J3dWkja zv$*@!yJM57M=3mDj+fNDKb!ktLb=$6CQ%HL439kx%E!se?68etK@Xio7o?3D#)B_l zwKpYTW-HJ=XQ%>4?K}r7*rTAC*u*E|WGq4-8R9`^$na0IB)PK;hZim9p|$ic1TQHz z@z3RFPm`CuWDcXLq)vaNoO&D(AAZ<{2Y4|@jMzgnVI@=I*j=+Y3pjg^^078aq36Af z``P|z;}g{BH<-pde3^&yrW8ovnNwWcn*9q&J1!}42b8OSDla=LHIi-`S*B>MFn?QG zsJAA;+Q74L2n zXh*oplcGch6;`8x6j2cWTD`h0&Sqz{;8P0!s+6tF_8>is_Bc1u`iUF*x7=5woJ6oh zKOq}s__~?^!=QjYF}%E`G012v-|&m$KQGXSuvZuD4put11!|xX6CC!9<9mQYL0Qu; zx*tz^Fms^DLCmu;Ykr=)jq>-T$eEpJMBvVWs-yxE@Q%{Rvuld2mwm73IM*!^DTDA# z?h9>cS5y-UBNFU9ejAGYu0^B?fpRCeKroDElu_cn8rR1!qmR4-*C9Z$Oolzu_5{rD zdnIT=Z|`E>yzP4Sefl!4D=ZkEgai6mIr*K&WG8=b=rUmiMRbEIc{t^pOg2>-7={2( zJR9|~2CZ6i+wDJ|Jm0mvluGc?3H=5|(>>&HKNq&Pz{&fl)fM0VFc*b;&D+$Bxw^PK zml8F&CW_aY5hLLdHG~I?=w#;;RTC;RQ>VV}hc21e7sectc9(u1auMlYIDm(pYLh{; z+;HRASvbkq=rF2Ve*d}^e08}I3(|11q*IY>Oy+CFQBpmXW&Kz&< zqn_OVX#w=T!Q_6x+J$CtLF0kO*mwQlW6 z`xa3{JN3jLVNlZPW$`T4*C+^a>QXKIYK1y)l5RehBzi*pZpp=fxvzeKq!3T!I2m1R z5EaDub z6NN$cjJcNG$41^i25pIU@5lcf~nxoIDP3r43ut#5@v)5quArv>x%oXV?p$I(Sg1Go#Kfz zRPuapUU}~x83A5tInHPiM|;Vq9c;`;2iEiP^%6sbm6p24a=t~}E|zC> zgetiqI*2cRXZDTSKir1KQ^F|1)G&Sg@QRRkiz%gFe7Hr`rq6vb_7%~9NXQlfo92?4 zJ1(8_I7OYl8rAV%D=Trp&sVQk#ibn@*3pLB#qlJ=NK{yv7CU1W0(URHryafXFvH_z zU!Rd16iuI66)xw9qd$NCfZ|brJ)a%_q{RwaT6{xc8(b}p0n&$KV9-8GG{KLWm05EwF4SbAwxBKSgfMUzmt^ zd=_pKxwyycP80&EW1fgjqSHWLoe-%^*`&B6%VKm-!_3*^J``^hqD6duBZXBfhcXZi z2Iz4MW6O1P#8)HFeC~Jjra}bYu}Ly@t7~G2)$Ro9SWI|{@c1e@Q;TiLK0yvn-3AN8 zIfRhb@rZ(Fmz(MMUB^Oxr}-M0#|vk;LQg*gC7u@ly8dJAg1VfC$`pqfEyQ_bCxuuIaH zxddiB$ICA$c8J$xghu_U5B(Rto8`#yo~ace1bMEI4DechWJ;bpx)0`u0E5x?lJ9jox%c5>#myNfdm*<2(h&|E+NWwsgz;* zaZs-)@?O%Ki)$z9YD8{=~STeGyb6g3yjQd!jYh53d$JO@RXkBvLED3QfLEd5e z=OOzRFAel|+eClAU3J7?IT&t)?NOz_YOmg>Yu-&M1yDs!K~fRHYqK51EigitZnOdG zp&C=aBCe?6Y#mHUbsaLO2M&oaBL9|&Drq;_LXCtekG0y$A0~+f8hx0J1>n%>1|68A zfl80A1(ogf5W)TwbL?5%GUZAiCyusZ+k-NgkOW4_##(%2pacXE8l%u2vyU7+@)Z9> zyC&}2xHgUD`{rYbyT_X#2zym|BcYZ0s38a$Y3YA)Sw;V zoBIY=>csO0QdXE*vsl)r&y4t}oF47tjI`r6{j_^a=(wagz8ehaWSZ8 zgYV|_q#jA8ad`bVSHn5|KVD!y6w}r~zi8@PynqAr=ycb&GtqfuiKrp49FS#-4qZnE z{c<+c-#Ta#VoB!QOfLWpdd2Qjj)Rvk1oug2AXFixsh=xvPbQ=W_Wc-3m!4fA|?GeXKB6!@$}2m3|=lVZB3_9sLP;mzQWc|TL- z5P_(wKF8ob$`91&2|Bu?Hh6;TiPsaHqXj?tP{L%?JFfCs%<+zXh?qBV{T{^5?^X5L z+~e=SX$!_wy@oIuz2dh43DyU>3KfVRnF8Lqx(+=*bO^3>qAr=VlEVWm8*>n`V^H5M zgT_iekIE{BMi)l0ae}sqWY`n>gT)piU$B&{1Cv4fs5sUL4Qiza{F;%-71oq@ZY`{3 zIhN0@JMr8V1>^wH!M_)#D672BKZ~>akK0^_ z+9gD7mLQ@;5KkWC<7K*Nh`5hvME_OC5_ek+P5rp;B+<|A1r3*?Ll=i34Copq%#S8I zJ0b^X@fKCNYbjl?lfv7nrTdFJZMBVa!@Z6qj& zO2!@QaTFEGx1$z%?BOnY4Fxn5TD{o!9`KdnA2B@;wJO3-MAi9tPWkR?XQ5 z{yxffJ11jcOwnC#iE2CQ^9?ucP$Cg}Z>Q6@u$2n+aL9#qei3Ae7&2ZllXsGbr;y_z z=DVOXR-%o~87K9;y1^6TAsS~DyP^kVu^DrRG0c(GF_2P!vXh@nC`M-P*Euu0jM z==w0EJ(M;)PU^TWicy6jOSsEqf8?43qV5k90*Z;253g}&P5s_6Tu@W?z*Rm$ZP7Q5G8!L2W^$V!eAQl4m zo4)t|zA*r?b47Ug8Yti@nZby% z?iuAKvI~~Ozc-EWiV}T@@PV=<#4Wu3!fQg3L{3pB>hXEYKkcXW7)AFxqau>HvN|Gu zhD$he>&%OYzX^NIJqSCwrI5WCq#!y&BEkl%9&>X8X|i+K>4k!icwkiqK6nbo z>{siF@Cz$J68BoVxl+Sa%xnmq*u#@7J&|F9&gdJ5b6XEa`SEbc{KnrJYuH-Agdr)jDI(6R4dlNA!YNW1XTGw>|U;b$Z)JJh(6 z=zz4{CCE~^+X+&f@r2$Ho-yMH9dd~|dod~03I~n{dS;`;+*xb9`!J39jgVg%9J6`z zp?6pEJ9Up5734Nuf&XAoK@^tUDdTL}ox2%;2*N8ttm091sp3-irgW=@U)VVedenM} zu5+^D?v4QcUfLHGgW~|_=AUzanBo)ZY+rMvg|LBDq!GYBD}QSWwptblm$wWB$T-F< z-eBiB?cr=@OF_T*KWREW?Fh^4QrXHX8=Utz^rIg3;dI0l!lm} z2e?aaOJM~0jYITBXLqgGl0fV%p-*cjWeS_k#~p){P5DPXs*qIaQuY&)iXCPm=#^q< zk_Ijv_ICVCGb;&IXp&b<-2MXHbDh;UBAFq&iu7AO4JwjdQ-(B=C1mfT70(~GXNmC@ zl9N{%{J_%B5Q+*@8_@~eG{foC@qOhTRjV}J$|vVN=WRuuypA}NT62=zr#~|oM>y~= zh~OiCVHJ}29qagnGghGb3&$3Ly#T{3e-7`mtQuI2K)4AS$;8 zoV`D*Uhhw_O5#F2^)%M^koLc>1?1F0x2su?a`12%ZJ@IMX&AcKC)$R(jH)S>>hrjf(-R@N7wy= zB=o@7{@Ct-(85h)dIy9o(zrC-4t2v)NtwYX%hr{5uP@ex^JZQls-!I#g*f7)|E-rP^AWhTd0Lqv@>xcn_!qBJRzq4eEN&oaM0ZgP4aqSy$KyiKbt)Mz3 zDBU@NwNz88pP5wWO3a}9HSC^7&OFfG+B-ugwY#etFq2VY_kKHGllO~y;v3PBuSVJx!=cGUNq$Jr6i=dE12~clh)a1NS`Xh z(UEw+8O`^%i0~q2C6YO1B>cu%Nx%78r{U1xPdthX-3)Y?41Z`B4gdalRk9{SqGGla zw84xG@N}k_`u>CqUXlCi^^``=qoZxAMh3wm zeOL#-&dIhuo5)^#p@1=+F=QOi6H!Sw1Djqw^s(tzelwWH+ch3v#_A=S1p8`3Z4|x> z2&=PO_Aa``?+|~cCxqAW@M@nFpqkmO3{qk7(b|!ON<+K4$>hS0G%w}$ST~E(LrJt| z6_qe!P0>*0T9ZVhZMrsg)LoDge|>jF^$bDMl2T-pL~ik`Av2C{H$w=&a!U!U?eV_k zQNvJY#|tkWiX{0K%DS!w=!{bdHn#=Q;D9(Z0;oEBRFAMLjmW4(1kGs5;;L4AEjBif zpS6ElJkp(|DRbfodHXw(u{~_9{5X=Ga#j=i{ty4O?Y-Of1Hc1%?5>|6F-f#EXx5JB zC#0=$<1GSt<+UfqeK4O=fdz^&w2IDAm4YsPJ}^lbT2dX%)0oMVW320Se= zM4c$McBS`C>IE3JfBWCFu$wXZn-;d>)Nqa&-Mcggd=A=x^Hhb}LA8Oc^M5HP^rDUgY#`r?>zH2vzdF3?WZws#jhooEfKge4GE{jAKdh!J++J zU{2yaTK4Qt$KA$^@k_VYdFy4M)8M;K50Sy2A83vg#w&S%z08t1XCT2dhD37^5B*;k z1_hpvuvd4!_@grQW7(S<>Kv4~`%>WbrOcg@v(E2e;Pfb7kfCYm9mT_6*|50x_xL@j zw151L`Of^uU+xMOC2r$-YyB%lT78%4jZW?-)3PbuI7h61m34O+hUaLD&jew$^xWOn z!d9SyVIqgOJmLO%>v$Tg3^S3tgcFLh9}TjSbw!RHh?DEMq8FNb@Npd8h}}{X=T>LQ zbX8n-QYi3x_wnF>pPnu-BpYSjBmxKfkzp(-kLL}7f!jfNtv*rvf+joy@{ZUX`UwX+ ziCZ`8bsPORX6p|oThD?Pp!?b!09eAO*uHQ;H(US)SI~3a?D#SkjjBf+K(7a@eKjw;ocUulL3tZPLpUT|yv6 z-x?bYlpk0PF1DN@Mtqa0XvitC(Bj|GLm1XuC(WvILeylX#6wYm1K&f0_tLyHQDYz8 z{yuNOAAqa(^<6ZN@<|Dg`uA+qDq#x`A-j zZSGiEVJYSdx^*HF@TcKO9Ss5RGE7Zc6m%PVLx1`T0;Z+J7<^JAk_z$z#+qrS&klMY zhu$#qc!=CWv7$$OTXfTS0=u+KRzpfhHaJ4Qr(=ii#rvb1p!d!i$yp@=w2Y;)02+P3 zG(bg2Nm8PvLP*K+jTy@JUxeS^5MZT;wz9KuS;#(;kusEO7D1s@(`Z3HY|nV!;PQ0g z^(4B~ZQG|2sMU%1c{n{=maR%zIklq{_wHW!*iszSU`^kAhm__@iEU@o)ER$ToiL(` z!5keO{e!s#Miu@WMrTMt(LCj#oFGLAR-VKtCdON0q{*B!Lh2>pc7-j9tC zktA~aN_C7ic`G+RnLgAso6Ih?oL{{HP`}qE{n*W(5rNJ+*E*o1u3Q7s_guqL`aDd= z+B{97(Hs-?$kmJvq5YXn`a`hSc~TfAjk`2vRx>}{>B0V#VeR?hI=gy8Sw=2j7=wml zO0K%RPCO5oBD60k%+R42-+{7FQ6<&6fo1)7=$ z6W7=6eN^P2Jj(mx%`n=JP4+Qo^A8Z59mCwQesjHxS*x?XoZg{lOQ~*TqazJ3DlYd9#AOQJfA%M4UXqV{FJ8`XV>DE8 z^4&OO3NdpUVqV7s>G>(tM8`Q}Z@HHAc}q05iZ4u-EOK~}a&~vdTsuTCt`Z?LSbTck z^a0X^LDxUf?e*AZJ}QF%z64u`^3tsYr|sLmbs2z^5GGMQST2=eCMDp2jf{bOQ`mCu ze-DV}n4jM~Y8lUn+%k19r#uTyX)ei2hFSGp|*duSQ>%VUYQA{uHEl&guam zAr@`39E>l$zwTIw#w%;A{_)o?qFHAem*Wz0MxGqNPIhcFjUTTzoUmUdm4P3B#HBYg zW92GE?Lfm1t<)Qy={3G9ag z&Klu@H4vCnNN&5F82^TGk)-3pzdK{#_|b;!$$TiTVq?c>_K?WYI-=k=Sv)+xLe~-; z>-zGf0jI&|ZX0ZkoyadRA$1aR_U3I{FXU1FwU{g7Ve>X_j7((tY<7lA7OX-?;Qc_@2s_h4C`279Co& zKaMXwcWb|e8zy)YTHd7Z)v5qPsXy{(XA2kJB@s-KSLIgysV=)`5v@*+P$dD(CZm* zQ^nG%37J{4TD7K|$MPO~<1KmF`jwo()qqAeoMo#8A4;;O#Ak;=Zw^MhCb4UeWxN?r z%`+=6kc_tFPd2{sscc-BXEP#wMaiB9;(zzha=(+r>wOvaBLg-TCIxIoUen>FcG!;n z@vl$Ks1R|}U`u#;76_Q9r^Ur`Gx4THOu*5X1c*4SJKyYdb6quPS;};f=k381D*o>s z`Mcn^J%y5MDOOxqRo-QrbjtDCWPx~}HpP)+!R{*%}l z_vi1Oy)9$9|M?=KnN=bCU%!iR0eJ|48-!=00}v`{{MRb5j%nw&MEPEDZ<8_46WQjw z+(#)DjSG-^H(ddT*ZWG_xuN5|83>BK7md>5u{Wz;`$^uo`u(pHNTQZwdiYJkv;UH&DJ-$YX8B6ul2M;t>1mvv zXXc9z<^ee3IY+&fjPe)qMylb}&;t*9v<;39(Td_SxOHr1nW-w2@V#8%>N}bLl;|7< zRA3$M2eV*wd=z*D=)Tl|?K$YlDB@|dLr zT7xnPjKlxAVcs(qDIHKk*% zAz{KNx=F0J^URo|A1rqW_=ibSTdT>+sr*a-Ob*ZQ*1K?K#2*PncL*NZn43KqsZd{fQWCwHBTZ5*ljI^c)xy&VY{m? zDsxBwq-U}VDU{7{|A5Irb=ZoK7FAK4%1(bb2iaH7{xZ9|_A65^EDSu?LS89D@9<4H zgIhJpFm~pr<<{5bU49Q}dx5ND7g}(8I-@2P`tmBO3I@lEv(`WQ()h3MCa&-D>}Nm6 z1x&Ji9buI+XRk61VOi(y`KWo@x&DS|2ztvmV1=#JZi!v%qyk;qK*I8Ri}>zC zQ-cYv(10@7y*_u`p?_)`J|iB~?~>ih^EzHX-{7V#d9fODdF|tBhyj~#b^0qQod`mb zbapX zW(PKy5K?FH+S>m<#9<7K4!ngPTD(n{^{JoGf}_*!ZF*@YFiXh6hdoOK{EBFqyh!-T`Y1JJuq zYBYFSpa{`^Eq|>cEl98o8kg4}#_?8F+t6Xz*;nTVCfPaXrS+yqrUKOKj3Z?;1c1ll|1CxcS zeDggtwr)fs;x^br_d~`B2zw<7n1Jo3j8}N%>ENO+`>_)`Hmf^zRKje{B*{smF+BMi z7F`|ZB+)ir~um>jl@D6@_Ce_8-*T_(*AlXxt-JN@ZvbsHW54gmO6hoZ+#2!uyz7`30-ClHt4=`1X~|610i?-m?EO#^ z!-E&Za#VX4L|%9^>PbE~ zKD#frrvZL*`spkuFnOH;Y=Pu=fCg#y<+CS=E#3*wg;Tx}&ZU1nDEMNrB;QrJc&{>r z1E2HGhH|i9)xtdx(P>|-ynZP(l37(~f#hoYoOqhnxyZnsiF2lKBmVVq7- zE&3~sMm6iuD232aP6aS2ntB42yImRGNh-?1T1;KhtuyST@A#N)998B%g3#zFzjNYO zBSWh1Gfj~p0o#OI`))D}EY8 zom8|0g4=$$stIFh>l%%9e?9BML9bWw%6?#_1eX8@JLk@PC_D(Oaf#Nvy^FGuPg z`SQOx>Q6<&nw@^hA;@C)L^lv+WU{r_*hwf^z{e_rg{*V80g>HFc3Gab!Zx(ZgKvZ@ zXNm_j1N6MPv?N33%nObY3YjcKIxOiH0$NP(QA|l$x~(0vK7gX4tq@>tkF(qe@J__v ztEbx)+`tqrpy2W1+7ZC_54`~araBx+aq9B)^6rccVl}>d$`tyY#4X5B&p*)u+A}Nn zlW@`7{R`OE*;3_03{=2X*11WZ&9nGJ`VB?u%T~`|!5J*~f%^F_;?SVw5CM%Y{W5v} zJh}qr;2W|oRlxa?`3pX_@+o55!50a8U_7)fdE)WUW9N z@&SleKQfO?j6JY@{9!*@Wb)^#aR2@HOQMMs6mXtStt;m}lNsl@7S1To&&TwKSQh>R zyn17SV>d;1N?sYFZ~$e971b7nK02MjzpfrXNuE9E#?vA65h(!zl3&duB8aRX&E>Y`P#n(32ma&$Lgkz{>aH zQ$$m&;?VmRcGOHd;~Kmj*SV%4cwcAu`)ZLX| zuFkjTy*+6(z32Kf?|)6cT5=@KC-D{cOOPTc;pT6b+!p@R>T3SCgqlVvXc-_x{WNOf zZ`7w{ryZVt>n$}TAo8@dH zwbU(Q&f8@GS(lyB{6XLKe0vu<%2&ZFaPM~55&`CgJk_$*-(UnZa(Zj8X!dZG&T51| z5KJzs*;s=w>uw2B{VmsW9ja)G1kL4|L7{|Md$x;y;x8@@H#kSAxZ`s4u$0l!R!HBM zoLZxL(*Q7B`#Msyzl9B!Z6M9$9ZUtlV+`yP?X?PoNvq;R)S_%;0p{>f{Z#=z7T7Uw z-L>;1NdQJl25E;Dn3eS6WeguB*1krwhke3X#QGZam^_xON;k{F>8UJnV=Y^`FfXVEK_c#A*X&VDe3I|T!ShFV$S)U%Afab;n?mn1GwW8{X5i8Xs;yu{v>``HZ&HudXkMb$~ zS-Lozr#)uyA&pgLmvtSE$k~<>%nTIL`|+8iCNwc9E|kcgAp0)@1s7(t+XRObkuM=$ zv^4f3LEJtP`sbW{!bucZg=XUb-`7gT1!#17L^|!*NU*{q5C7k{h zNmEYf-`BQw^8x36*XjJ!iioHH-|vm67%-j`J*x=eEnIrRJ*cc@aoaB&EIYhB65Izf z&9Y&j8T!(%16-b96^#gMEen3LJE~JRTtH=tZitbY5FwZ`oVUHtzSM^ z>?W7rkmVyRdE?F?Blc0bn*YlY=nm8P5oEe{*6d$WG30iww5OA$3lMqcFGEI4$uIIj zoRxe>zpn^uPUAnuYgxBq`**_sQ`;GG*`e-O7}D478`TnPjW#F7?TTJ0Z85H1MnetJ zpWWr5$NOtt$ihma&7U3K_Nl!n&(hlSXRmI&zF(>PToEuYLgMFw3!Fg1(Q5e&f+NY3 zbo$~-6JoXSeU%ah_X*yhAVQYVT5|yDNI~SASXwyfxggX3j%_$ z>x}`nWUc6xPB-e5TRG_Q$(tzoZ~ywzCeBBdN3#} zVqW|F7}2Rr=JIYDdmY_^VnW!fXpaNcf#Ek1>~qu)E<7b+g~t;fF9Evd8GUkOQ`MZE z{}#`e?f=2zr%!!{A;^Y=-sBkn4$3;XTX)L#?KtRL@AIaa#4?TAZ{bb7{MMF=()NR! zq};Lmm4zU(*20`0Ya`5BU((TFsUav|d1?>NX4}-=cZE6!RnIdSg>sYpUxITlDuD7D zm{aDSlm@_RY>Fjiv5+U1i9klq`6#`Q9sdHa)smE`d6 z5COtbQESRRkfQu;eN4C~1DgeiYmp3FNagbCg2)KL{ae3`G!wAS%hhd=#xm{7sFm{E zUMTOGEb!#?e@x?FkTAYv}g9~0VOPb@23+plqHq-4^ zRxQ4>i-d>b&hDjju0HJWP=EWn!NsVCBvP7yjm66tA z5UQ}KQo%yYu!h1$hS{jg(geU9)_!8I(SsD7`4mZDY8?uf5l0o!nY znkm9GM@;z<;GrUbi~rwdviU#SF?RaVO!;_|7r3ze%wpkSxLTF&Ly+SKviL3|1ElTM z&3jSG2h@j}rcB(hnjFuyMk%QwyA%kczI8!8`;dLwNm7VJ$8Q&BRguc2YI|&%j?%vG zxpMlF#w)I+OuBGFP5(Z8Zcvz1(X*A9{1cY(q*LM*qUsf146}i_8R;l^Z zxL2h{PRW2txXrr`H;lC~%+-1(QcAcvwUDkAsmMYl>&xRp>DoAEr|%IBM^rO!`89aYXD#U5grc zq(%(IE>|8Ko;!Tm1*)fbX!Jb#_vnS2ctD3|>VQv-l^p_IAJ5)-Y_ zK(P4c*-|`+N;KSI#vsY)RLvl<{kP|ov)dPxQmt8;jD8~iunbcR=Rh3CwZ8Y37fYrv z=g(ccL@&(D#+S|D+e!*^X>?iJci1*MOVHfeRLLPuz86Zg^=lRV;RdmHa*gDXS{$A! z@)Ac?{&pDd<1P-zj}U&#^llr%6z&l(|Wxb)Lpj#q94YQN_OtHREsX-gBst@Z*3-TTls81nBj)~9KmgBPL#uHM~fAk{}W#VLhxU2Bj$UJWM*PyXz0T6Yh2RvScpBRODN-C<{i^QJ>#E>c&5LVVb(;nvkvhiN>; z+D<1Yx}U&b6m03@csrSQ^lV~^45XW}G~b##r}g*RGsGg76{+xo&}#`a41SS++rN#2 z)lLY4&}B}+J&u}qD|eoT)!EqKH|!>SmMCXoHU??46#xE*kA6tPo;3vw?!s!+44Dwo zbm3*HxQ9-XpZ8(|x!r++k{9RajQmDRK7nSxt!3XAqiCIXKU}1WY}p5$pM9(O!(xb`x|lVdwj2`OzW@KII;()Tx}aTS z#oe6*f9WoSX#@(s4#q={dV+x$qi%PpZRx?hI zr1j-eiO2Wi5YO^VS#1;4Yp#RjbQVVN^0Vbq{de*Yq+^ZsWZE*LKGsAEdL!@GuoeP^ zb9m->-U!4CwU>jkRy=*ndiffyk=z=V=MUJO3)u(CZRAETu{0g5!9A*uoOMG?7XSW@ z(A}F_gSQ_dxkW*U(0B_@(2g%Ka?lzFjmVHkrUB&CrEH>2%Rt7>C(F$&PX*8yX!S8MN?n9NAyKDbe2Op4^Mf0Zmy*uDjzc)_b zeew4TpdAS|<+Zm>i5%7BTX)5#B~`>67zO+^Ws1B+zEHOG9S?yV?L(6PMeV$36%r~1 z@XFi4dL(Ga!ehC9kxaXHhhsK@G$QuyU1O?dcCJL;(9KS2`adP7@s%!_dlql zM3E-lUz5e+4V%ba&8r;&Vb`DEs~Elq?(f?VUMrdS{l2@-Lh_gnH)EB;jbvp^RaDWF z&Sq~y`s710pB*(xY5I`Vkdon|zuTwzT~lJIpt)zw03kF%tNZxS{5G7L5CqvfhkgxE@fOnUo$LbVD2CMf)_-{H&D*t z31~SV!+rrBJ61rbO8Dua&nF7<;qQH^5VesDD!jH$pZdnaY);2i67dk7EBq#C|Bk@UE^vFL8fdKK9!K9_xY%f z@|2f5?G>twJu~HG${Gn-Wd(4}j3vzDS|8Op*|(BmZH_s<>5^zos=d}J(Tu)Yr;xJ@ z8A0=5AG3l*D6yZ`SlAZwx8tM2bT?ZEn-3`AR#w^QxTb5F=u1GEJ%V;Igihb|lXI|hB3b10UjGoeA8 z*%$p6|C#Qb2+PMa>^}gq2R4OJi)*_-+W(-NheZTc$O6d)gR^Q;g^)l*h@2(}{Q2-l#r&6>d`@Jw^gn31Y=${dd3fgaB!CV)pkWor7Elas zzzfrUb{^PA#=0{I;Ze81nOReQB`@zcKP^|hJm9&d7yf3&1i8dUoQKtwN@ zTTm`pHz;qcigd`%Yt2l){%p?OCusoc<>see)U&W@lXau=YGU0~xJICgw@~{fA;lrG z=Z4nYg@NmNSRt_)9giP!v7#~ZQ`TXo_5K>|M`HgPCXisCb?589Kn}!h%l3Do*YcQU z!YtfVxQMJcqX)khyE;Z&{(lRV{A=>bd#ijyji^8ZWH9wwt57^cV{*Evq^@hur5x+! zp$iEbyCtzkhOwQu#x@3PLOyS7=g;U9m*lc5>rt1e*8*ev@V*Y$fLN|XZd$qOvQ4hOy` zL3P+&z;~Yy2L*hjIV}lQbNP<)P$Bmd^>C}8Gp81tqX~%-(IHFYfFp=CmI)X~V&J9m zn=lhRxYPwxC2x)~n0oXoE8No#@yRHvQ&k@x!sqv7nT<`J!uXm9_aLd1G5U5;>{?Y8 zpoQL)2=6vpe0Nf*(PXx-jkbSZFFY@(*t-)P09Woi2+~H3 zV*X5_R3yvjhd7N=HbbiuC{loI6$LTI`<5b z#Hcw;b~Vxgud5=Mzot^#EFLLV5~jw~f@1c?mw(B)RXLjJge~Q@{iHrlIo)^SsLs$ik4n1{Gq zH$=K;z=hBgbk8Dn?Qf;T+29vhJIpa7xUs`UZ!YT9KiY=F3YOqa%Gaw0?k<9x&qC{` z;i%Jp@3j5PIR<1>vZL>_&wTlhbX_=hF8Hys1u7>lav2|@tikCqK<2Gcq6D@KmBe36 z_+ywc#sPHcoH1V8;;3hm?MS*-n&~{kD>ePpp!pzgE7IDdj~Rwnv%0IM(S%n z2fuQzsgWnSE!3Ky<%F+X&5%`xLo!*^BUlezZ~0%Pd~eBND4cyURZGBA-D*p)>#oiY z8{MFdd7UO^jO-}BokYsxuG-C){6)uW;Dn_2W}VZZ!x&%E-~D8q;R=rN$4R|eKzn+P zx`D3N zeI)U8G+B`rfAhD7J&#V`yoXIP>MqTN>xtSgEG=ZzSr67hax~)EC*0(1)S8()BO*qA ze)m&y>^N^EWkkR-Ct$1LCYip?t>lEQLwNP4i)(W!PEFve|1+M4#8h82Q0Rwt9g10E zjW=p8z9!6R_nxdp7Yi9Rh6w3cZU5L}iR*TgnIP4f^ht>|G+@aryF1uC`K8K#%Fdyv5zjl))^UAmj#| z?`;|q^40mF#J%-t`))`sqt8;~_G64o=t2HSDJ>oEW|TrI|ePb*}5+^Rpr1hFT?1N#&YbVFZCin55 zo~mD>+i29{q79PjbZv#i?8Iws^1f5$0NBe$+F)=$9j?O7a+oaD8l`xQoml9LfP>T* z$HSQ=uX;^#-Zuf$TxyDM%(KoSn8+n{G>hq?aEsuk0i=$3;9Nz}Q4HfC5R{v4ubV^u zMS9k^J-YR_k92=$ zRWy4~BE25!5dQL+wGD&q8aKLw=jJskla=*jdm08oUY#$<{KvQnaVI&0S%kxcQ*@dJ zy53))UGQ!t9HhrsE73^?gfj>|uK4pk5m6@}4z!8`H+F<2ImdB|3<{73y6l{VfXe+K z-W$|VQ9+p^8O;th7hf=H4BN;CpJ9g=gJg1MxY>5YtsFU2VeC~*ik-GaEUIulLePV2 z##5w%eFQu^j?Co!;i|0KY^H8ZZyr^FEk3I*1cOV`ocls^D>Q2}cWLUqhM$e4ZLr<= zsK*D2c{6`X#UrL6l2``J+!uMjN}U>l4W`n8jNi;+SBgzC)V-)lIc4n)f)*eC-5Z*! zV`2=*JUL^U^GAwwF8xp?A}LK9MXK$<4~OG3<>Es>2uB#t2I#_dL9(|s3i#7o9=)gyHj9<9|N~2!NLA?z(Y*x=ya7dE`-^26M$btWE%7phIFu3 z#xch%)jQ&0)t0uZ=Il>HG_#JNWwCyi8@(3Yf8?7sHzpn!WQg@-#ij0aCIcVK{H9#W z`60>D|Gp#CpivC#SSgK0Q!K$S-I7`xgY4=gqPpB+f54`qj^;LB1{sN4wjoM{LdDYV zNQZR=clC)UyQMoMlK8C)wUud9ZYb1EVuiU$rZkg#k(1;G$7ZDV)U!lRq->5`IR@8! z4F{vrJfFCI>((a}m(2@ld9^Z_CyMPq7jH*|1>zO>g=Q+DZVidc{(9lUK5tgbe)up} zBE26u$llJQ1pE}=L0I@0t}#JcqI2pe4+{aleNbx=LHf1V4<7SpIufluM-QtP#-uP$ zl~##I3{2mtKv)pJX3$+;qr`U32}tJB{cU5Jw07Z`-Fj@*(|J*2LT{uIXzBcsT!#D4 zt+%?Pu_!2++V8L+YB$ChG*P~3a;3~p_8kVGra_swz7SAsu?e6oD$RAo$DM5YJ$+(K z^F>IFFal~To+F5L4ckrh8s5Unk6HmeVrY zl_(6Uvx~D|cF6Ag`^KVn>3a_U#f4uLbFyS7$|N0Z)Pop0zvjlnI9^^iZtW11OmuL* zPnW_7a{@X|r6bM2pRNrm4YL{kUBUEco9PiKbEHiUg_jaIk1RhOMgT2phupPtFH%w>IV}Ne6H7B zcYyy)QoQ;JryY2RZpzp3*{dO~CDmc@Xq;Dun=DU1wpR4z$~nPZl5q}*p{7c4n^p^T%|ylnABSlty~+*i-ht2`*7oDnkyI=8GykKts6gpM4> zu}S;xMw*q{&ENPhoKffSny5Dt&5+%vGPPA+)KuLJ+b=9(G#+DEIXrCs*O-$A_ zzh0c2cZFBi^!PA%Vw;z6rk+e468gkGribk#cJb(U6&RB>GqF=UYS9bxP5JyxHIE zW8VOBqO*5+FS6&W2w=v7deo_|Wm4D%5=bW9@V2Ids$n^gz8*I7s$W7IJ zQu979!v~qn4U7Q?Sv8SBr3nD97-?a^jrD%Y91>Im{XB44oi(_8vn8ty_%ItciB}=e zGViV63XPX*86G}?0m-_x|5$(u`4z4mOMda+>UiCg@Vo~@zrfO8>gBE9(4aj5m&jo zO5njUzJNul9>;)-sXYo6%OQN+j9bJ?7v7Yo=->Dg@^G0m*0MH%MQpSNJl)^{twFC5 zT#_rHnF@SC9BR|ZU3h?%m`v(Eqci4MEZkVZZ?5ZD>H%`4Rd07p$Q1xmhX;)(sym%0 zdTpeHDp9_HSBla0RN%4DCwG zhe%Lm_;l&Z*)QWkkfu7gv0)*)HsvwGE!Uv55#bPn#DN5V8Nh2XtX_b1Q57H?DSakx zbf!%()m>I;zVRD7qC-4|(gQ@?V=B*-cFTM-30h&T7iXeeMp_{?EJZ&gcvSRr$aDR{W{kH%~3@BJ-Qj!UdLOX_}7bz*2|(7G~J$07pm;eF(XX zsbDV%uRtUbOh3#F{qL`lzDL~IYb%NUlOfY z*IZQ3!LTi^aZumC&5pevUAzV+i`h)4F>=IU;RZEYChlM*R4W)oB>?rY03q~-BcNMk z@YI`x!9yJ2#^wjS7RgQ9JAEF!#19t9U~y0JucOfOVQ3C1;NB8khK37i%mkWUXp$c~ zT@)-m$kHK|5VpUZ{UwL2hqIufaqlJu8du}pY6f8gx==leDFw~xxRhB+bP>z_5aJOn zniCXSRdzg6a0cFr_)24REAQ%;ro>vG`R0-Pigq zdEeb@k9WiMYBO2bWl0G2D$FzqUbfNnXqpG2&CX5G-E2Ha3-p)U8cROC&F&m3JDFL1 z^LJx_j2Ez@LLWOtubC8O7(0>6y*!@8;1w;N)iXpkW#FaFF>9G5HmDDOrO!BaTv$Xe z;tRbfp7pNUE z>!&KHD_YhKe(K_|Njn&VTRP|;lNpc9yq(5F=mB36KVg0oB|ky|)w7KmKFb`f$adR@ z2l~|o!DW5o-RQM5r`}9*5%GBt!7;+!LdL1_G#NaC$KN1V?rB@+RWwaFBT)T_295{git*)<=JF zOvr-8nnXl!$$ul&DM#K2CY1-R?}Cy3QHFFu%!RGqln)WC5s+Q+EhMufD;|Ubv(!(k z-WmX5-6YQ{_1_KXdN&)YzFu-TiI`!coNE4@xbsr3x%ueTZDEo{fK-4RDXUIAn!rFh zp~kG2fMAH>e7hu08%EPV3{Tj;!t}dEn|EE!9$ZE)b~@L&5QSK5vW z^SZ_*>_f|6Cm*||Tj^FFfjkLmk~}CzFE#CnhWqo+lq_Xcv*k7v7hPfEKlrENq=Y+L zf1mp3NNN9VTk6YNEJ#SNbeD^ThK;3=o2AnN0TZr0l#5)sX~WaW3BY?}N%wR7CF5yB zi$NZ9@bFZ0e#XCti&uCs;mC!yq&pH%(!7SG1|K5TTmnXR6qRb=*Eh*P;{<8J4-qGr zpj2260wzUeXvH;QQ0K2)r{rO^I~)x!XOP&IhEg$?61sQe5={>7%{_4-LDH5L8HV0M zt)QRz9UKO;#;nR&ic(a3V) zH(tp&S2eTPJO!wLEE2d|-y4u2o2c_n?0>Ojh;)ypc(3rDO&rp=G4N9a5_T`zA<^sg?RA zd%FrLF?5PXX#uIjQm)>m(=0q9-0`2Swc->kO5HT}DhX3sQzHfVlB~~T86-oZW|a0> z?8$z9qwP-cbM59{K9{JFQnB>S1?E^t(%+cOGJWLXI1LjdxX43(0FZ(c;YFhtestu!NN(5QFBQ;DL z0d_O}ZAq9la?k^mzg>Mp10S;|*o_Q+|065|9(LH!v5>i2KGOFz46VuoLbQpvK^B3B za59mv6G$;uV6Zw!)Vll{MI)&HJ^sn_bw~u(k9A$oilEYp9u`_gkT;iz9JxQb$8af3 zj1ZFv4J^T=69uKfVEiIa!fdRVAOVo&$BZU(|Keck?xyddLuO6zTqpr2l)gBtw2OZ9 z`|0J;h14pcL4HqWi@P9E+9HHL6KOz9c_S=cUb2O{3G7)|dxwc} z*~n^QdL>vE518zdK$Qp}pJt1r1yWezm(8S(=TbPxqvG_W4cwSMg`z4Fh>Ahzk5KHs;r#oZOV_-~Viovhmuq{>Xu*9IMK=(XxE zHP&tg7ob6(YRI(Fh?P}$4`h8W8I$NEPC-UYOoW@-AzQlh`Wl$G+6A#|CFJH$I(+MP zAU7?O&4r6AMCJFaYf=4Ng)`r@zMpv{`5>Ga$kk6TB4Q@hPcKc0RvZAsZgl z?ocTQq!WZ;r-Cv~J~sH?Uo{!)i&&6V8HGBA&Ati~x?XGkA<**OOZEIHTMp7xmTYv7i6iV^q!nqI5L`lKC}7l7 zlf=#iI)iL(saU}N{0-isP1I^_*umRd6C^#=K{*-fr43R(y??4$k)$$#VCyK7& z7suwk)bX7T39AQBSP3UH%}Qu&$3^m4b((sY}*~^b0G5!8Z-P0#XsW zl>FoF?iy4kA#bxi-mSgOwv`P*#PfW&bRkHa=l@~vJ##I)ZKk}quUTzF6Jd-GEiD4B zWs1Yvu6*(Y8C%@`DQ^vsh^%}V{|IWVMK_qH4km*?>7L))}ZQq3m+Mj zG|>V9U^mtpWsMII%JWZQe|Ve@7|F1}UOqn7C>gC$9w zoY9COrTYohKzkN385*GLoC!l!>mv*yXG8(^S2We{!9l8U4{Qf%B=`%NiKzuyAd|6KJ`OsAxyZo zZFBUGyteRY(#xqBb7qQ22)DSM*`aLv43)t+&NlA22Dvf~=8~}a>1MP4LZ6yWl&fgh zj23Y3+&bbbdHGA+L*O0MQq;ZM-eppq zmaL6YtS1bnV?n_kbU-kb$tB9eNC|_6Vyoxa)BIVDni~4XhjPS6otDa)` zvEneVDEP6yY+;xJorV?I8377-eK}ZMssC7wY?V?yWyK1G0&H`a?Wfbp<4FHy5PXPH zsRV`v+NQ97Ej*tu^DZF!jm`9ZS;V}siu^#Hf5_9&>*+UN#2gO#h?-g|`+#?T+6btB zh~4=~ZLA>wfdYP@U!#QJN(5EpE@vx9t%K=f5aGgx`D%Z(jJpy1CO96qCF;Hc04mK# zt0#=r#NR#aEpO6K<>3fDO0>=Ihj$szUOtyo1Le8iU%KY-uF{%3?9HWWb-yn6fTO{r z5*qMh^YCL9Qif_Yt^IET_nLdOa0?0E%|H|%M!>h2=0k@=_kB_sT@je zgVg>gzzDjpQDMw0OjtDAx0fBzgP)~*cY{`6!KZ}ych=T2>xh~Q8`&rl6Au>0M8hRR zl6_|NmCJ^>trVMf-v zkpcsJ8ebHE30Qs{4SSzp6!rGp2|&9ykWC2q>cWaR@t?DyTp&^?3743mO4f|_=OC9u z{BHN+ikXc$l5>*|5hsp+cerSn+hd1x589F4G0Dc9nK>UL6*QzkH9HEp62m!vOMd)o zyl6CT!UU-2Mu+LMr)7}m8;;yBNTe-p@X{o#yjpPkD1{;JEcQ@xeG`)#P8z$wks7tT z4KkcY_@p_44%UGKHw5nf)vMj9<^d^t*y=tCh5*}4V>3i9eDOC#BZEt{p}r`s8~>u) zS}fv*1A5*f3=X8+o5;ItRr#ttOqWADHYeMDumS`J)YZNZa%{AztOebEkL%F=xV;~i zu~=+x!?VxvM;_O}R7@|-7pGGXtdZd7x*a8$Xw2FTd?>9TfvGA%L zlw|rm+06S1*wR-hgu@Ydvu(Mps`B(XsocSQAwTw_l0?l=IM$@QxZN_~iTZ2NY0!Kq z*#1Kt0b)6Y=iSR<%G;&j25d?9AMK$Xu?o)7z-21cr0Jf#ZVJgc7{PG2DJhhY<`G^} zxWbRI04s3IJ22-U)YHT|s2WHVgPUB3!@@#>Y@++~Eo)W0EHghiQq(%B z{b;Cid6GOXv)KL6d!WH#&Hmn^Za=Qv=5>18#FIo09~MzFe8*otT`dtwo@H$mROR|Q z5dq~bU2dm6&yk(9HoA-6jl9va~)_m%$x>n!? zY_PX-G+0<~?q8(gjvzj=9BNQd3Uwl?w!*68bUM@w@YlRhSL8Hm#aQ?K&&8!KgK8$} zRt?RMKfEiN>>*B1TMvxJzljw73UFHa)~@6zZGBv@%8hlBtrGm|rR?#vdY7>wrzDL( zbf!VK_bfr!Bj$SeP-H zAGY1( zT>R;8EPX#HA#dHO_5|%XXxd!3tF9hZ%L551JQW%Q_&yiTdb(#dw$#03iUs<-mTEka z67*!13K~Ae1KzMJ*YIN(LZ#tR-)j1mxj>U~&{#c5cLM=HTlAtri{l&fVlQ}iu3p=H z`A{7H!4DLcS>m(YA3@{yTAh`xJj6}ave?*c!5#lWqS?l$iZy&P$;(wLXYJys*g1l< zU3dbAEOEmy$QT$&R}L*0OaF8Ia>;UM`3@zv{X-2c0@^o$*H0I%URU%^Et%n<_9^Gj zyl*wxlOW$`b{SKbuA#-C#5*h>QPn5wSBGi5iOF}EcnCwIN*4r&q_8x2nC28wkoNs( zH5W*q<+M-=mR`ku;Y*>5!R+Iwk|9G^IhK z6*uYJ@JB1;VUYLihF#w?jz_>j6JKy^dc*p%#b7ic|G)IuM4fu+p|+1IA7b zIB?Ra+r%PwrRs1np`!OyvToQh84A{`CjK~;ebH0(xhF2ZudTf@y7fs(?>#igU}=aj zHnkT|?80;SYg>p4GNcM>g7|;XrorC>#e=LgR(M zIYoMf&heP_e7tW@vp2M1co6N*(RYEkeTL;H?RL%gAXgOaltlZ;J=ne0BlhLBL;7jC z-BwC(q7+&twrS!x?)I5J@P;~NaU)aA?y$&zO>QA5{cf3t*XQYSL8l|Vb2a*beeyKu z&x+?p7BCR@hBj+=G^T-4a*JJhm~d=haf5C-a%lg;L8yhVjF3Sc7Dv;oJw5W(#f;4( zPYJ;ir2`|yd$Kn#rh@|(Z^@CI2TBWOL@q*AgZZT0F7lFl=xavDdVz0`#b2+y|S> zWS+8b@BSELTh)_${6$u|(TU4M+~ab`>wLSO>*dh3049VUT!RJ{z8;-u z``DRn2^K~;R)>TAj5~X%B!lS?zUCJ$=HozfUi*`JdJH5(8>7H0QYT&-k67?9(ef^* zMf;A{-d->py%`~d0o=Yj6Ue`xG+ce{hz1MEA?J8^y(i(I)_mp7GsjNFjYpRr?KOtZ z%t%d48&kz`&B3UU4wyEZxYiPn4%O08eP*uzQ~DkPy0{b#ILre-RChGf_J~huu)@B& zAFVfmpX?DYe9p{Hp7;&B!UwBD8ebe|aFaYgKl%B6EeUaIFT76rB|X|-6ReqO^V~z( zqyHK>IH`0&agzwo8;XoNg@bs3*gF%F+D$F7=O@l3qv0_bgbfz{wA)sp;G7El%LGem z>Ujt17$LDk>3lDF`69@2>~`9RLPh2)uD8?Om%V3f zC!K-e0=#@uUn_~<7fAwK#Og%qF#%H*_Qx#pbl!+NkB!!n^=G>zLgGRphv?$^k&-%P z9R}|?w(;MlXwCDrI)S8W#N0?U-;0BF22&ju%byBJp5L0w@zIV|ZZW|#__A~QM%#Mg zaf9aYZq^T#gNsO4&kkb8k9vdfoTR}XM5M#x0((Xg&)dEt-+N-1-<@^TNIW*Y_|&&7 zltRHiydlI)h>YQs)CNKQ0ECm#_~#@X3d*{9t^|YIde3X zDyUt?cg*ShTsZUJ6{yLV#_M=Ne0Bc3Lvx%7q7U2o_~twZ|d)q zQ;h<-bR9}1GT@uUWqp3F!X8n5AD<0J8S>$&q6~5&himy1(`h`$M-xf|GzICu``VmR zJN^6k0rinOFxCMVSu8+;?d!MBqlXd3kPVS+^`2BmoDX~;m^94xw2)-R2mfmc*2cew zfRotx#V=<;%#feB1;mzX5kI{xJT?DcFF;sM_v;)-Pr!5ctkSZ+i;2W`!iSO?0BYeC z>SHl3h8u&bL63v@8i%pW90e@!Gp=-l!7ESmfJAF$oC4UJ3gV=Auv8-~?XKN=YVU;v zBoj{d(oPYK-i;0o*Y9H{X&?1$nEFgpvx^|^219{8P(5vRyiVTW7XWI5w#*YeF^ys} zEbA&F_+a&i=e5kOR4JRG2R6U~2UJU3BJ654(Qh9jYf$Pf3FWCX%6)epzM4;cyBgat z#I*6ihkcs}K}QJJNR!5HyrnUxT4ixw>U(ZQbZ4KlqASM8ZGQy>elcb3=?UBp>Favw zsNU$qkIBnDKk`N~HxDaIGLzWWT;$la7Agb&#e%qiA1+={At}i}4iw&F1O4<}*Ast( zY&P&<4t3xGEeXfCm_%F0RsJ>7^K#rIFU!5B7fb=UV~>J$Ix+R7OiW7 zs^IbdF|sK3fx)ZKG)W(}9NB;|nfM83?4u>Pt@|?%UD&G=b!K>8zn=fF68=-|r;R;W zEq}}p78u4l`g;`R7ft{7M%5sQHYj;RS)KU)l9ieysHJU>XPDRjx!NHpAaR%mM)lt^ zCB*T8e(aZxTK&IuPPTDj^M?~obBRw&mP4Nvz%|V@cH}T^NpPYAIF{#mZDM8MTFr-av+C0hTsM5vK~bc6S0axj$g9r%rWzS;0D_x8f~>{y~bmTpR-<(UR5{vCvhU2+uzio0yE0>f+bhcOFBqsipaZ zBV|Y&Ici;HB7IX!8@uc-pnlLjtI7SEH)7-J>dC}w$<|$` z(_l4CE5$BH)bp)(_^tsE)&=Y0`tB$;VqK}G(NSrDw>#&^fB#uKr+QyA4NpX^pSLGn zKk1KdbLCk2xCxzVpb0LX7-(7(!!%SGT_Dmo)RGBXH{vU7*Or(9v$yP?zH)BnS`tf% z=m>#F=~przbFrCJZc4QTy2WFXy|uxh@zlGFVHP=ox{vM2FzefAVS|Iv6XBwg`M>QKx& zM0#{ge75sw>A?bfEU$e6b*!BZ^vCf{323Ci-g29Vr{0T3jw&5;-S4B*t5pU4A3OcT zUd}0=B;uf$D|ihrYZ0_lvf#)(Bnwq;vWWP4Cia_?3PD5iMYS|I=lx8#<`2s`Jr@rh z=$FZYr%I9(i986kpW!mNNec*OQ*8!ZK**(Env=T&E5s6aeSn6Ac&hjj2$`Qudcim) zJ%Xbov?0RMWwP%DL+Pg!zZ~1&GMW(gFRwTm7Zk-n74p#?3)qTcu4O*_T3DCDB)U8L zafZo-O)1qu z5-v@5M(GR>+hP9<+~CvkViz5VCK%cT9;|1t z_an!rNzl_inXN3Xo3LqPnMzNRD~a#rtit+G>zLgrN9UZS7JRq^&WMuD2QHxl1>VoS z1T&rp5y?9AjUq`4&&i`%RpPkREgceuie`TKW|R8PwiIt3kB&?Qi(eaGrWZc}<)3z$ zWtu3*Wt|{ejK1c8uflf0g?em0nr8z^Pjsy_@$sZ5Ak%docNvN*Rq0;bcJgOI#h<{( zAE-M*VQ`A|L}rOP5Pw}-#)3pvbm#3Cv&$Z4b7AXD@2hj{J91Y*c96atxPL@ab4niB;E43>Uh&^hsT(Z1tf(#PAUi*0-Vmi{DYw6)%qd*1&D=k0WrBdAPYSVeX8j&9D_^am zgFZ@cn@POi)uiE_$*r+gE5l0v2m6cyuB(bs%eq~!|pvkcFtD~kHFK4b@8 z_}|Y1GVs1Sa+go{;+x5BB9tu&TD4FdS>oQJ^Z4E}am%Hg9G~jsGI}m)gT>}(anFQz zf5qm4EJcgSUt9nmG;Y-_N{=AHT%-I54hLYzQ5*2@(MB9Z%egI4QwEP>Nx}o|kBW`* zELM!-&7Dv(Ks?@A{)|`WF_P^|nZSdKtz=+=t0~RjH5E3Qrz>Vq!$EjtMoBV2JtAr% z0hEjyGu*f3Ko6$~MVXeShK^hllBhdVr&1z2++v@Ac>mJzFEBGF{Ak=f7VU>^Vs(5o z9%c9qV&jW41%EI+9`x^6yJfpO=TJz<+2cezOuJwq-5JK6vaI~S@4OiRs@<47D}P({ zT5`M)i1qcu^|EjzG@gcC<_oF3zmlyjO_=WBas_1B4B*0xraHQ|=M9`#SRT=wZyHcs z;lvFnnbqC=9oMv2=4{{Bkg@+Wqz}2iIU-+e;2L3D1avOVJWC8_>qOmx)(g3H(B5wN z8i@@Rb3i@p&G87@<1nJJ}D7GUw7ik>h<5UXWx<%`p&l+$7UzHSI#d zPVp1rqloF*?{;yMlDyZ>?gja|v2N>s@!&NiK|HdAvcBv?eX$@M@}FeplHz2*r>_r3 z{yoQ3Kz&NudOp0CtVl~f9H1RsOo-;lHmD|0P%KY^$94Z=NFldFk!UK#rV6(83IrXj z(&vauk9St`2MB%pf?74}3;af6Yl2**62#pPlhZMm8-Mq)3O_;sO+Hg}^uib|EiC>S-r?PS20GCzUx~R zTX17k7RVaLp#8zftH3E=TZ(-v7o$PyHrX~mi(h|6FC=RTpIm4}vd%K-#AkR1srC`C z>t5hP(lGEf)i}%;*e!WVYC*=ML31@C4%Ya6TB)-7En3%X5$f>s_QNgl{L_pQ{gR~; z+lKD>b7TzR`yrAWTf? zy94+?zeth>s|0mqKR!Mx|Bq{s1IWnn{xmed_H(r+hSL()0?ih%v^)PT-#RFkKkoTa zqDnlshofvRmvgd(BSEEVYIl*(cYn-Ai~m$7RSxOemcmzf;O`?Pr|$QCCup1ft%~zY zy+@zL`Uzood=w-M;p=BC5P`gACiPkIiY=~E!?*G#KMZqESr2X1UK@w%L2ki%2O?E^ z=JE`+W?i(HBlRxi&gOh!+cJ4QacijZcTsVMTv~*fk&6~t^MroHyUiJg{XG?f5QQ+- z<3h^fKfjX54uE8VooxskXC9p28MFWf@^oQJqJ!ys{*vwQ{$e`VD-ImtI{vnw;LQ^j z;s0*q;%mER5pVuWB_yTj4wOenuU-mD($wYjK6hd(jFNu1I9{xZ31a<;L?C2JEbdcjb@cO# z>c=W8cIJeg&UtASue_VB2kbi}r>VI{&y^`y+&+d@;TI5RjYjUT@iDyd?+p}&vIGI( zI9d+08b)kmwc)%&RMT_(EtsW4Fxf{h>^woYG;;k0W679bAP~7V3ieUhI>)+F@T2V8 zcspEjA%4N*TFJ!L#CP)*K^6qt3#=I$WyfA{SnxqQX8|(W@q^GwTSgrpgp_h=Y;eNt^3K7sNPZ~fa`uTMR|6<3&T~G#l5tnzQ?m( zpe}SaR`llWi#<8`n947mMYs4zS3pzWU3eXzRaaiU#OLUcs-RcyFyT`NRxl|+nOB`a z##EZ`53d1x4gbbllDkk4z8tuQNvI&1G6#La`C!~^ZI+>aB_+1^lYhB8qq?Elfm(X` z4yO=%sa6A$50H+XRDD}zzvYKjK-5UuyVded4;-`S&VqVuhCAi=VeL##6&*G2iQr57 zDu$l%)@V_>JroVh_lC0IH`zQw5TwPz(`7I#Z?EqqyC0XLp_nmm){z4*+?Z&A7g`8m zXWC%zuvjDT=qZ5*Sc4EIM5Zo}a&S<6zng2#U=H$oXm0Kj-Ef)lyEY0?YG8#VX?X+7 zm_a>dGIJ73el-5be~61cg`g>*DWWi1_0*~_*`W`7xqZ{5l&I(mgqIYyj_sAU_Su-( z-~8yu&^Ai`4^v+q6-U;*4Fq?08yE=g?#>ME9$bPGEV#R6a0n3GA-G#`hXBDL1h){} zWj=P_-Ti&%^y&YmZ&%e*a(iw)MdQ-EFl4Gb-Gp*J=*T9b4EIC&A>&Jq%;|i1Urdut z_lwz7fpfK7Wf-DI)(aTGY$qdNM|=~7>#-@%qU zJei;2ihv^NWpv8knw%g$BM{j?`6$R%1}v%H%Oioh!)*zf508Gj?RV;T<3Sl-)FZR! z8u%5^Pqke`8PiEH$2tHnU^=E7nT}7O{%zwp2*5lc7!Md5b_(674H5{#*Nj_;p1eC zzM7222!I=K-qIzI4b49WLkGtN$IE!9xW;9#agwv#0!!j}iX+8(WjX|1c+i!=g1mhu zd!#{Z+OMN_9TTa$OJjq%E;1`wBWA~j2gQXP@FA={_cJ;aC?h1{Vgyz!+_-U@*Jh^`aT&(^))ve@3YtXz7 zKP&8&`@tRpVeI|U{GkBp5e|8#S0F!Jz_k z5F%sY`mhPpZP3Oj!a%KZue~SYN?Buiq&2dL|y02Y1&3olIh176Lc9#oU7cXogI%1uGU2p#5;pS0x8(fG+g=^5 z81nQ>5P0~t+W$g47Y7Wv;<2CR^f{QanU}m9su6d#$=uoWR!iSL=6B!xoQ$v!9MK`6 z(1Pb)QXPKso7VC@5gAjXtwo7zL`Kn6TW}B=9mB@L$t)`h&{pV1bU<9mPW!5L7-pLA zNj+sq{_LB3!8tOU2p(HO=N}O|I&7l_HzqR4k59CkmQ?TQNMD)(VW^)uUdgr}bFkYhX=2Zp&g+%I|AN{r-V=bK?#-92v_(mL&Wuw%&=qwx21sh8K-M7yC(CD$S|u z)0jy2bk=RpS6Bj&3_w5ZuQ<&bZpjD~HvlZJ=6ROTP`lOYigWN=4nF+#8!*9)p0D5 z>*d!u92EqlyXyIWDiCJl;707xFzQ#oW7S<&c4zt{!yFm8{L8g9uep8avr4bmN3_F+ zPIYs{rEo&!zRcr|k+hRKDvN{91?y^_uSCNi*o!Mcbn8cE$3MmNopYwI`m;VN^6b5v zkP^!hH)vO9RqAt6#f!o)>jwS=`hB?6BJ z!cBKiBWDj$$-Mpj9+&sGYo+^g(s`}nuyX(X;%?Csx4mDmHT||x<&?u)m3|PmLjKMoKOBmggnaPsz=!(YMKb~SDd$G_fJ@#a!W~h>asM+V zduQ#UwJQEb{uNlO?@cSM@D=$STL}Yk6~ev8rf9BikTb2=@9$gqUqz{1JkUpJfU$qa zUq!%uTbQMMb#wg%FbQx!(vLt#TV}&dZ!PKn`W^Feot{=uG$HbO`;c4ZE4%DNO-f&$ zd?Pu<$h>;-#<+BQ?Z&N%Lk#2_fPG%K(p)*OCMXoHo$EUpb8yO3Z!ERtyD%D~5c4Og z5bt~etp&ZDfB?sh8HcYt$o$A`Bt#_jvb0rpGu!lA#>6d*=#tg9X^7)Lv(!DW6n>FESp1A{g0m8%vtC4GKEV8?jek69bsh zO3@zJk_FmT?~{87Nj6^F*bM%4Bu7O+=JtvW#4;VK0*HQ@1U}v0*xas>3?DCVxgBoY zyFY}1F2eUK6-Fs;oAI!<{aI43{d%;7Rk!&%o$FP2;zQLna7UPa;jJE|7;~)FkN-%JA<(1=H;1 zy|=X<@mfNsDl#JVXMCc2HExyYB$Ze2H|5gVGdd9N&t#BnQKQfH>C3|xk21F*=G4a~ z#;;TCWsZu~0Qts|K3k-vk%xr8(z=*1PX9(}Gh)Zf2( zznc)ZQ>-vrzK~D?sYNQ40L2$UUt(E3T-d7Z=I2;=@t~uFELDT4df^&UT))S-V^A1F zTc{OzSuS0jbU`!-JG!GHgZfsfw>r!7Jd(jBH~ljRSkFx9(aUY&7t@dG;pONv165vK ztd-TsU=5^-`q_+7aCjXL5*}TCas>|P7Oze96Bo3KQ$kj_Ork!YIrFKcAbcd4NvbfQpMfvi=o&z%Z!tXOEw;;?ZPXRLX87MhVFee5`wzNNv_n&AdlIGhC`ar#79 zy2bN`@5Fo@KEU4GTLR%>-$x7SlUJ*laq^IUug3vOf?&nwxUOqIizy=TTQ^lbHXZTu zc)h_q3#v(fQj3a-Sd-cVIhxIrO2~FRE1Q^mqx_zcb^^gkWj3Bx6RM{WOt*1LIY{6a zTY=V2@s)uL)`auedI-DRGVDI&D&I?=>ORRv zyrz=>#fiT_ASityC*dh*({yTY`DjCjJBdi!5%rxQNyIH_f9~|;o{_4rYCb*kw!d&3 z_|U^{!kZHI7R|1{o#Kng2uXG4+Gs;lV46@Xt+yTq?|{$jnh=0V-UXJo_&Rk#1trht zLBPNOmUMO92e#;klOWWz8l2y@%28HPE69^1iovJWOy@$}{v88A%GOi_+a*^UKLL3W z$rxU}v7 z?WPO}JWT9x@lUmleTx>6*))U2GNJt(z*6c91~y&hC1{zUq9nppOvqWIX@rGdgZ_9R zNWSvk$2sIXUFytWhH;Sdz8M9|#b+E)YOLxiGrEV%;8+S#+EioUQTtroF$3kvh*u+>64sM0d8VDdV4e)!oBk+7(XLuL3^(glwwWbR2IEH;7n1 zrK)Kf+?`GP%8MCM^kTiSZAw9|;hJ)AAQ1>0ZPZmBeJ&hLo|FJ z=e0zN&_^#Wr*lI=YkD%d3-U@)ItXxzNcI7<-eddOlYKcz1Kt2e!>d>-TQVR+xYvy| z2~k>|)O&+i0pei_EL;#_^$(+;e|(6-{Zh$0$J-hm+eX*)Ks)j`MsQA zX+VleTT7 z`}*%$0CV^vM1utsxBFe|VKlJ;;vm^MVG90L`#+V~hmQ2r4N9jwi##JN{DJnIk^j?FO>7b4;t4W3< zrlO!W>_?s?GSp4g6t@(~gBd}C6Lv5?FnR#F1(h6{)?S{D<$d$M5x`aTHAxix7wrcTm#&Eaay z9^*){`ibhx(KRUc)J!$ZVP@ktDo0p*an<&IYuqa|4l1E@lsjj4@%-Hax zGT{Ci^?>gn0NTDX>C2gi=WekS&2n>N@A%>EC^u`pvZe&6qR&|0GHJ z8ac240LDhyO9D@Fy<_1H{gAXeVKlO6?-{{*CZB%Pmu0_%?R>2Nvn^DvpN z_y^H}F-4P^SPl(MG}==_bo2PMNO^V_T7&%+Cr4y?G=&bVu=z7WKH@hI47NiV>}7;O za<)`JuJkjp*N=LR5d#N8C*G=Xw6(}~aJzmDoUvcD-!mm5i^T#MB{bC0!Lppdf!S_! zfIfY*$tl4fRis2q%~FRwMW;UyQi_UW==0&C1m39TvF+QID>ci~hr-)wapS)C_vbpe z_CqwN4Js@Tigid^OjeF)8NZ@L7|S{p?%Hm>KwL4KnAm;Lfd|%BPlg79op2WqY!AE8 ztG8PVF@!%T5A1FUlUUffbKJ5*cGTbsV7A~$M{pU`02IaIT7d$H+^x&wAk>^S`7ol% z=73&^+By}!RmeNaBtKkzTG*XG=G64KM*%U5^h*g5Tzf?bM67RO{!b#@#EFHYW^4B4 zmD1&;St?Iyb9@v%MAWqN=a;U;(C=i1tp_Z$ikUOjB{cc?zsxRcG|j>5Q|a=CX;{6@t0Hn2(f5ez7JI=@%SCl<}`5gDuve2XZiXNmnrKeou*G0C2tA`xD(t z{Ohp-nVQ_))$uaOwrUzxEQ3?UfJtJ<)6x~O{A3TN@xkJPRKY412#n#bXptl`*Dl19 zZYl!a_Iz)5nZ`jl8Z^BEv@L|G4rjgXdP<+vaF+SB+ZGA4-k%s}UW+OD~T2l1l_m4W`?h6DYuINTM72B6>vsoE)0ASL44z)5(f#u^= zBSVwRtr8~oPY-%XpIAjnD7+7aZ!!*f0Uc2iY9i0fF1JXVW8q^6<2J0yf?Q)Sg>oMI z@Q9D3BZYeVcUDefmU7D?n7_Pc5aMSc;o1#QTBrqH{{CUm!DHCC9$S%t2gYzq3tC}M zf9pfCZ}-Upr?}W7FwZOjYoF4sDeey#FCuzd zd5!hl-WUDveCDKQdz2e$UGRduY4>K=Jk|x>Gl6oVFzS3L^cgZ&`7rawl1jOwr#Na6 z0Jx~BmUMFv>R(CbH3~!z1Brwm&EM*)kB~(Co^|+OA95}v6xI-S6=r`@{2r`s~294<}whS5k_#WOQgdJHLBdfiS>#K+L-!c zW#q)}|GB@D)+1MtrET;4og5oqk~adqF!_nQoqkVN#j+d)- z=9s7=Vy}(Y_%yap?0NGV`8T?>t-=|A7y8EIpm?ianR^KlvT7Zw^x?~+Fn?Snk7{M< ztVAD$oGB3ZD8YCpOWLklS=E|zzrWqdd^l_!re};%UPLiexq9>g=X#WyM39=0T|gYX_R)(r4U>M1Bl1{;1zk!bMc_`ybuaqx>6(=I~eG30gq{s0W!ht6{IIE{e3aOZ@t zdOh|_uZFRVgG;8aND}esD-7f7ZHXw#b6tsb@{n%EE%m3*V`SLQ;TB*}6ek@vvkQ>5`mYXg9GZsya1Zlk+z2Ma}ZMu!1mqAI82h2 zaYs&;Ls#HACb&eggB4Smnmqn>Pq*FfGgKJ_ZumfIMbkzTnf!IOuuyaRUOWf}JVc!| z1npz}&C(V^?`68$iB!m!m#p$3iN_G}q-Rl;(s0F2p2IOjmWa4~W&zQDuAEppx}=YW zm9#U|^IB2fw&_G@i{4L#;XR2e*8<3}&3q^CjJ$Or8dmDNB}vHM>>B(HWN2wV2H>Rk z-Xg})$X7wJ6bm^!Rx%x<_vb9WrhRJU{|rK~kpMU}0PR`9j9Q_NlB61mpKvF_w>2@b z-4-e5T+rMvs~6$~wq{dOsT&5Z8ncfg{B8;dI=_(@YEM;Zti-3c^RDFGQleO?5Xu7|ejUMGTR6;!om`p6J-b~a& zoUDjQc8C8rnWTfj`&EP>|D136t2pvK@b^oc#^rO7{6qdMBNSq{i_0guMEjh&vj5cS zTdSNv|0K(%7Jk3c*Lk#xoa3KM3|l(ADx-dc5TUWH9+L;kN0?mHW4IzF8Ty`CvvaBNZz;x9>BV|aC9 zKg!STy((zbBph>zSXpIv&>=t2Wds7^;!s&D5)bYZEy8~x4!rI75gi<>I90%ESca>+ z|4>EDL;As8MV$R}ZEj=-$N;K1xEMv-d|$u&^Tz7>2^Z=4E@IQpzWV3t#n5MVf{)mNtDT$j_J$R6`X8_|fRncD z691YC72>7(=z%{v2AP-(r_LmVd0ibPB2KPTQl;l^FOafpXj&T?>VrSJvFYS%=cByX zUDk>fVaXKnFJ@B!%RBN5f3l*^%%EzMv za{R<;s$kYg8dzyK3Ai`XaE9#Cu1LwiCxGXL^Ft6p(o$kiAnV#^ zGu|!xmA(!4aMa(bzrn#9*3Rc6lwR=7)FJTbC@?7K=&u*Jt5ozh_9+`Dr3_cWJ$hZb z9y?;kBBC<@nv@;DKb*nZYcRkT{{{E%d}_35sx^Uw0|*0ry}e$FNI=P?5?R zOwhe=MA5U|0MYK%s=jBFO-87`!nd-v5mjm&D7s9H$8$$5C#V8Hm~0}Z4_<*Ucq7EK>v(PGj#88PnPza=J4 z5(3V2MR_|vo)I)e4fG|6Q@yNq3O;EIKC@Uf*AmvLu8Odn3H$lBEg-ScI7E|2=Yt@z zFpzKGAVC0FYVc)~(sq=-ocYR%?Kj%~#Cn*BqI1kD?@PLz7+Vej8q^B?LKXhp1>dh6?W~BS#b!odg1d0UlUz_>Aw00atjRsRg$6)h*YK?yYtW9EwA6hD2z^wxig%<5gp!1l zz*6ej>6|q;Ena%m@tnb0CHtG#KWm~ie3v$;q_(&KhXdGf;0^ienOpk@d-Lo0h!bm4 zCu1xqh2(?Rz#nQ(pXweP5UFCWar#{D=TFOh1_MrxT)Cc@~nVltyMf2ycazC{9p}r(da}E;=<2q&EjGdG3 z8f*P5dj>s1S<|S^uz}pykY7yhIYas7U8i>ikwx!mHXAY30SeY&ke}kHNoZ1uQvarh z;B(vkn#rpei}XzjCuw)WhUl>9E

H0!@vNK z6CKtqz@Uzm>qgLaU?5+sB556+;$gaD8|jD3vFvWEOSCT6a8w8H8rT29XbZvc;1#jK z!GPfKLO<=EUQI1SV4H_b)MUFS?oM6h^M^izm$g{0L^s;~7zv8pK9b?!|oDXh@-JuuoZG z+~O>N5e!ozSNRkM`bpnS2 z%CjrY8w$2OHH6b*4e|NiTEM5TD`^eJ`gb?I>E4?zt^pRuf zC!>$oFolU!OD#DVrCR2{>;Ni)zKC0REw@w{^!xBY649ycuSb&PO|6JfQA32uX zd{dMzQxUlqc`DBi!t1L;w+XiRF9TaABbR-=v<|wW$K}It0`Gbpplw4CYP`Pz1uGp= za%1R=+od*s`WA`lU(GSJ1xfHKAh_t}xT* zBfMQZvG^CNpjWRdd&qT?F)W>|Sh^=AioENGTHRyCym~fb1bnk+gyna8<(zsCeNnDj z+7x-mRP$;uI?6^FcG|A6iF&1K7vao*KEH&-)hC&PWE>rRcK`_`zvl+?yVT@;k4s>PPyT2bDU;*a)- zG*b2RRCU^7^Na4*^z>klMpNq7rxyOZr9YJ}J2v-G$g1Wb?7%zd;>&8`E2G%o7DS9F ziU19@$a-RePYsPM0}H=3If=3oClS@-B)|vf5wImtL&wD8HTYx3lF*{ z>d4>@Ry?4*Ks#{)TgVzx@#dAwWv5j;*I2Nf_ce=OBL!Jtx;Z!#wW|qwh{;})fhCp# z96dbaE*3Th4CHP?rJi*!DE@heW}S$zorT;hw&-Tipng#fZAtO~Ip3cv&ZZuqo$}?=VTWBu{KtBk zKN`u*nxIMEN!5>(P_p5TnyjhoU9YB%mB3RbDiOu{jpY|>$)}Fkz{nTHQ3y=pKc?3= z)D$M68R%&vF{(;#ZarWG=^N2P1^0WlQ-dlw9_c{G)LDF@ z=WkgBJco#`#@FIC3Td8bTKJ!gd{DIV-?`sKX}a6msJL{kW{Tt_;%^jB?YA>CbsRBruw>C_kgfBOcLxSc17wcX*O3_IQphuD3>K$}) z=oaS0Nv&s0lu;!YI(TeGg6Y*;f)%<^lPK$Uyah|j`-JZg-+(#eHI*Fa>{*>2a=U$; z;6PrbbeDMY1x$8cof;ye!Abzlz1tpAXvTn2T;QSp!J7pA`>gw#k6^~k4!^VW>+5Sy zS6XS`^lPf~Q@R(?2WRTniuLcB)nOhzdLXduNn=SwiX=xMLgw%}*DYxjfV){{`LQ!* zeVOc(cSpAw&H(~y_mBN6IU7&eVrAp6E}$^lQ2~Eop5ATPO{8g_{WfaHhEdBN2Q$?~ z6?z412TsX`KcpM_Y1>~l`*9@mt31iu_&~OaaPIy|25ddXgAq~HyFsm=p z)ZWKBxUIzTw&2To;$$Tdd1(IcthMrV)p0fbLXYV(*%1XD__=l(nXJ6%L~Uk< zhjm;gNj%GQ|J+&8K=P1>W6 zf~=@3SOKTuI*!G?z12KurOL2%x7bw&Oz7S+ef-!7Q*7{cUE|s5rPT1#_kLc9w;5b% z12|C3?TvKkAwuRe(!YBdMrp2En)E<{2AY1|_XEJK9fL6lBrDE5)-eUuHQ!Q4YnG|{ zwEJFTS}d#EUh=!n1#V;hM$KQ2P@Z8TB2wjFGVnUuc)2Q=lj-TLGRHmt8zr8`5YdellAV~4Hdx`*#`BTJ4>Nk9aBWUVf1q_4pfo!uWgXqfd`_~)1S zr?)lZEj_jmHqeOZ;-0$@^$xw?@@B^!|40#I5=pe=Ril4 zj3`Oylnm3bq*y#m_i!i=$!I5i1>t>FwzG6^_gt)TXcb7%{D3~zFFw3mx|Et8-VEm+ z)?=SWEa`}Jkj#369@H-bcalN5H+Vsox>X~q&XcLrpE3A6R2j9bO5i`^Tk)hBT@p~4 zU=>4gCCf7;z=v}M_?KaiQ6Xp> zv5Y;>h4sCG-A^{VZxeK8rZ&k2>th1ulDY0CDZ6!f22T(L%@WUfL1zF?E@h@REIOKBX)>pd9rb{$4gaU8O$MKwm&|BpBcA%g?>)g=+Yj2H`x*xT*5G(N1Q|#sfU^o)b*?A#3WX(Pj8jItNZHP zN9tVx@=)b zYYqgXL7}&fT<@%U_U)Ez)l9{Vn62KROLtU&R|BY;HQgp+(29i>>2t`!tiBma(O*gm zXAOXpUY_0$ywb?P2Ou_m)?bT5L69~f|3TrJx4;d z1W+Sz5q=9Fq&gkYLw?50Mm8jY-nhku{=V$lyX@J#V?DKxinK@vzJpxZg%vHnqXE9v z7xovpGf3{T>bJ756dby=4x!_rk<D6_LVvn_}RcvOe5g+narOOCwO4@W96Prd5KlWSEKNRTn)lCC8QI?oFS&K6D+nAn@(Cn*T@fT zRYB)ciV*SkTE242Z;?mGv>=GxEu1|&YnzEOdr;Kkp{;-3OUz!RP;KfPsOXHPXkFHh%#?9Y(2+sNv3JS#@5MEs6)oSwmF=Pw<3(DPH! z%U7_{D>r@4eqiOf&3knk{mZ6y>ce?taE-7$$XXc=QN}v6ev+P(#eQG20ZzR>80R`h z$kI@nMcm>#xKx$PQ$S~f>RtUbtFf1D zY(-`ISu{3jU8y4bt}SmOjDfI0U17z*+>BVsxSEWrsaSA#a&JeFAA6I^N!st4VL&(V8*o^88%x77xgKfjiU&i5B!Qjoz0syLsh8338y0!_y1% zA#ty`Ljc#vfqd3krINJ4G(Z*9TV<__7u;jkfHBuJ{ONDIhs~>3ypmvKNqys{+eWOa zO=+4W>~!%WZhDiH0zLy3gt7j!u+HHS)LqJFArbLiz;U8UmOGHI`gdR}?)MUeA5Ctk zMt@+7*Hu243JPA}tqT{r79776Bcmu{Cd9N47XM&lgNaYuF2&^KDSe%byg?H9oVYU7 ze9`?q#`0GF>fU7TFHgD7dR28uk?w1EB`ILWj>SK4)cY8EgyXqP8pe_$#`3F49vUDj z)v!_g*kbref+GlT@&2BhCW+%YXR&M1U`Y5x9N!?^=s4iwc7IMhfU@gI?G*ZW!J)UL zP{h#=rx)%UL)2^dR()fVVSg~7!piN6HI4T(iWW7YA zlgQ1+W0oieV!w^a^6mHqrc?V6%Px_yh~+S-2m?&0L7}U|pRF~C|DvjM2pu|!% zF~*%Jza~qgECRwZL?g>0$rCW#N$E@9JFQy5v(jngubiAvM!P5&YO^)}C|^5TKV41B zcA@JBMut5uZQum5N)sNK%YuGm{N@N?!vAx8+4JkN=lV|lPq!TCzt?PJs4J(EOr!Or zmq_Zq{t?4GT}Q{gpPtrCre>?J$DqY`oOh48&3q{8VYKk2q^F8d{|tvlK;n=icnNtD zO;J?p$Di{!aR&dfD*jn^dygS<&ja%g^!nP2zUxIwa?7KiLH@Rd`F+ zk`)*@ZO>``6nJZdWRXNWq`PCvLh6wDx_Mv5YD3`ZdN6hZ!&Y!gRRpPga-qe!(8(co zQjuXwi%PVlf5J%uPSOClR=ow8r&kagEcBc*$P=D1<%8qJ z*e@;$-NXS?tnU)Y>NO0~a!h5~stWBID)eEhqM`{24=*L+b=qMv&tskh-(}G!oqG$D zDU|#pA^sseUva69_Ggvz*6+Mi!-?ug9Q98iSuFLA_o3X5d_j2ian|o4S>T<44Wgc+ zfR%DN$Cyhk2m2d?hZwk--tOhUd!Mn$r7Vx3OfAG99%G<4h#7x9f>=a z-s~)H*KiGl0ZW3o0O9Nu9%{H!9x1y3$Tx{tP~A=Dek-a`j`nkSgqV1fgEGKVYlE7T zbW9ZSN@LGo(}~4{EGZ@(_iQc1Id&svHH}HW_38WBAh2AcD+VTi8tOU?jo3yS*CLE$ zJq{^COEQj!T(y4;gIABqh~8X~+ZIBjkvzN-4C9*wvbMfwYC=KB$8F$S3PR0ZYWz8k z;tl&=@6fT-H<$ltTUaO+CC>HkfCQX>=}!Y1Q2ES7#R;LE+UDariG_O#7S( zS)dj=X~OwxEgOuF+C9qF?@O}Vdy|{{4ZkP7A9V5m=GAxzP|Ccpi+3{6f_#+Z7YLk? zVF0l}XU(SXo%H#WW^1*bq=zB}$Gk53`3d1R@Z~wk*W^PnUR_f@sv$BtKu=5GTT8aKKIAXMOI`K^vGoh+j0|%k-Y;OCL6Q|1{!Tc~>Nq zPIUe_cpW(L^ucWW6+;*I8=g<|9j(0ols~T#5P@b{64abHvo8TO3J)4?4+afjY75C6 zr+>*r{Bu4AGTlNFz~EuCAXZVGUUV7o7iq-VBxdQGdJdqky8+FU7B^ zk_qmRk5PR7N)S}thpk8cqlvwwr@`cq1#V{VOF!=00*w5&LsOfq>XuQ2$-}}OQ_*aX zav)&zxWYAbHfDli=bYf)AA6jm-g-(i$2;D36y<#f!4YDrmS;CH5q-91iR^DYmF8va zF)lo=0{ECL)!lMuHKMXdMIq{M2hwJ{fyz(#I8ZnT6}&-VNiFaYF1?|L0Vb#E(PhuX zWl!i`F`V}s;GxLB{$YWEg3FXSmRQZwn>nsO!~x|xLN6S0oXx(wAHooyO;HO}iDTOa z*l5iPY;%lu2^HDf%$bZ~DW7l?*q91k{g$=+GCFZsWvb8vH&>WrRWu3|9v#c4b9kJ{?=?jp z*7zn8Jz6d)#$+%=-gyqu$v*wC2L6^G;EozS-p2ZH4SdNicAvW<|7XvM&Sp@PN*V5g>|E$jD`^^%2XS|Fs5*gt?|GR?w+ zCBqz(UsXNDxe^p66)z6v()8Lu>dud5>zp~1vEp#oL6xZc&O_{%o}D*SXfF9M;2B|n z+zb%dH+d-rRTO~=M{UTcr3ZOxHvgBJHTVx*uM1#@-YU)o0WCV(Chj%loN4QUH}N zZ&Nsp3x11s5Dd))nBmx6MF+37hb*vhpr68Qg@N-i7yf|DT8dTc5LYQ+#;fM>iT&uQ zhBd&CCIEAA5e&?U{C9s72QeK1Vef)dfctPj-w9X}I1nvf6+XKPw9Z7dTqG9##{v?Q z8GGsQ(cGpP(Ba{De!&Y4s5GuI6+j`wen}p64I_QME&lwxkCVkpk&!fH`9nzCwUs&B z($$atbGYO=1O1f623@SFy{abjN*~qO9tTVGPHMjx$^rHb%5X8fWIL@~?9$GSWDZJl zwLV=NcSF3?yNX{ugyQi=!6%Vb& z{BAm-)EaE8T?hECqyG1ldsZ*dM<4#=GHuNXY91~b%GFvCGej|W9aYp*w!9|F-H2l))@sAPjRG~~@A zVR41y0CoLZ&88)?)SV=?WfAaN7Ggt4Fyoe(=faUf%!)iJGSytPvs++PL_8AXG=A3O z6)0mCQgu;mC%!a&*p{sDf5QoqY&RXe{dnZxOyLu>ksvL z7lr-Tyo&Z^UDc)ybzYoR)x3uiv`h!e&Ld4Y4jFcwJ*DFej-lq#Y`jy($|{Ai;Hwl$gM z@$8}oP?Lhpu}qw5r?z*8)OQ+=uNyjxDpmbGTrSz98Jptx4#C*i?tKBq)ZY{w_jXQS z&DMsC>kgL1y7+@HWy_e1j0M0y+R)-Z89&?2HAfip+}>AC>K;97zbf1dNf0hpQ9>J*9{fl4~_f@L2e%= z+%pS`lZ$aN#_#=*b+pptk{V00eqd=FSW<;geu)>f3dhAQHAf%!{Z3nG1+;giu)%WD zR$_xP``J27rW##4{rwD9Qr~%PUIn6`cW~sv3>}6oxo)5i2DS{3$z&n?DAzT`50+57 zhTi=FE7|RAy+9Y$W|I#_(Q)i0ZEr4 zA}m;#ayVDWX3~(P=k@RJm8-k3;-wbHp6Sungeu;Moz@i(4Hnj-hkCl=6aNL z28w7@BPk6Aa6(8`5M-kBW3>2`%uCCB6Vk$_bF;Dd9Y+ap%-W->ZAoW2d@tuPB`}{@&cP%qI88%NB z7s!O5zz#nR7Gfk)NZL9K>}gZpSL9WPjxNY|{MV z>=>B9-(wb-;L8s@SCE(`AKJdq-2d&$+wGmZ=>!8j0f>rO*nSj1f6R_M9>E-f_~DHg zekYty%yW>b$5aRk|Cy6A_Axe20k`I322)d6OKx%#7P9&lev(fLtH(*_t+(8z?r6gh zymRl5Z*cjvMsQlNGOh-103F-_RklDlDyo@r?Bwf@WtdkDU25GJ~lVszlqL z9!=hE^>UwJUf%f8vL}JWK9#z4q#ak!W`#{{;x(6$DB( z+Vc#*jrpbIyHgz&HeY_<{)Q>qJ$NGcF){}8c!L{8CKC>+Gjjo*{T3<}run#YZUaW# zm#yI9R&?2BI7@i7BHZuIu=+I-*6?vKpSZ4SiqY(`rvL=IEX)`eftFqPblv)p-Em1f zjz6aCl@e69yn>OBq(`M98Z=r2XH(^x>aF~_uS0a^#p*M-!RwBAZzNlW75$4djj_YF z>=n>}B?0|C2_@Ri6u~;t=Ay2GqOaePeaM9bqr+wtw_k93Or|OHR`im#ZOV;w)ua_27 zwlun>Xkb%vuXBhZ8l;&-yq(#m?-bz`vHFsY3AChN24VGMUn@IvEeQ5Wqt5Tmsg5pZ zihg+8hXEFyjgtLP<6ewjv!mIXH?`yVwVpq?0{#6>*~<3@V4C?3@_`}M@7v$TqmQL! zV^hlqPgM^_`8onfV9mUvgD02!I+iGp^kP?fY9wTEH|&7GrO30dpZvL@NxIvp(D^0? zh$3;1-EI^Ie0!((sFB=#1HF49^v`Qi!9C~(Of{;$N$W2ydm7z;`gFG%GH<_cesYxx2(j@Z>e#=hOUPT;yX{6xPqe z> zQ;&Sbc!PJ$>-KZuERh!bvXlS{51;SnyD!pv_DioalQqW!82L1i+PaNvBG@~g`fzUN z44cxIsBi(`@dM4z?cGAHHfixIzn()n<*(zE)0w=zQl#eu*YzX&SPYi@)*POJXOZNn zBLCo=x3uio@~|9#kRJGo2ARU^vsmK&^tAu{$n})(ZJ~AEfVaqXgsz>4MB*A5yYBw% zhZD8hwIPJWdG3ZDUCNdtr;*{t=iH+W&Px#;>srs4Pr_Zy%TvEDhpfy;7RfjXQkc6` z7g&JuI2bTY$K~_(Ov#wIb`D@N*i`!*cQ|B<%W^GN>lRNtQ@EGxhCW^>f6@vSA_(B1 zpyPKFunCn&D`&foS$BHj{Y5OyV$*jFNrJs}yeW~gz7mUOftAJsoHloAqD{;O%jz~$ zmKU8;pCVp*?SI_X8+K=VMx8&ivMd!*!MC+?(aOq7@X$Z2m z(XmEB>%GthJMcEs9E@FvzkI3Slk$LPSu{P#1$CZHdO(c|@$gJ)Ds7pyzf69(t6g5I zVnqi(929YH5SsK9HjY$sxSKuRh9SXOTq}n741TjMyh}IcGbVD*2#?SVxIYSTtEc$$ z#S0?h_;4UpIZpcL6T`v_>^wsNc<|>R1@^fk6mU-@66`fHgfLglj>8MT=EGdT{X)V1 zhMI^XQC9u@LcQS*)t(xwn+OvsNNuY|`#=SxK0tq*nd z6{K@m}7;vUmUW2pS>;YskeIa5}hoqej-5t8G%B?{n=Wc!$Ks?;SwR5y2rFQ zUbaS+kp1EKW=r&2?p{YXm&vj%;sm*)jqS9Dhvep^2$r){tgx$# zk?B4@Y$WnQG{YyYWR=eyuu%nS1?U!(P{)s~NZb1Y2ZT za3`H{;uxYW?FaN-hmKp$VPvhw&po-XJ-fqXY>acp&md}1*yliC& z$Q}0M)p14aQ-i+P8R}(xpG^)OxbPA^KC{vP;=`rLhle5W%H@OQriaU1FD~kgY|>os z0n0D|hT!!zv8fkO1HAx*EGm(d|C;~PfT zuG!kgk3QxyL5H;5y_yq54xMaYnzk&dcE)i14K<&&1?Mv)b}3 zO-ggdhYbd&hX%J3o~)&M1BAlJcNIgzpxdkiM>O5LXq1_i9zJOv}cniHWb9LvAf!h|?VJ zP}owsl9sX;wJ7!+wEOHNqp!|xs_ERZB?^>3!|o=)`W&{yP|WVz*>x@~Mx*BcCAIQM z@Byd8>GbA{)idxPsE>FCKZR=RGm{cm15F}t4>FjX-r~gl_|t-YmugwPdh0wfTqw`R z7R#5QDd@+>f>lEC4z!%4FEdLq=(YTyW%v2|_rnmH#NyYHPG8pmMXuy^!wjrtPtbn> zzw|HQk+3^w!n5(TwTnLuC1%aBQ=PhAhzV>h1SL54z9Riz)Yvn9B2e9rZD#N!J%9IJ z*sXq=jI%ONHmg}!O_dK%;o3NrBh5}p&x$_c4K_qU@KHEWEN|VwWXA;w$btnZcTQmg zPcu-kt1=P;L0rGxgTHb2UP#BgcOw~RePd9?#;~(qv)JmB)UN4d9XNhZdL#cHNGJky zJ)QF_{#Y45{G%K8D#r%tj%qL`rYt2`>8C-T$Gdiww|3PTGbRza4cgNRPOp779*iE0 zqiRGgd_StSd37d{2N&k?pk^t8 zh?yG)#{;=wrZ3g(R$eiPaDD0NjrkUj^UkCG$>MmFIdhmz87v#qaUgu$07D=LVRs$b9j3vbAxGlmY)W>|N4J3f*RUA=iSly;{SSJ7P~y zWvG4w0Z6>fQ0MKj|8lKSx;88^lA(-!hkTl#;w5*RPx=MXy}#kfF?mZ$6`2R*XPVTr zD+=p3sWN%;Q;A>hu8|dR_^ruX7G=?x6Ud=%tat8?Lr(n~m?#8E#)V;*DN)Kh;3}bV`RTxf~vbzvaQJQ;quDJxeKWJnh}U1MEOC9qjfXshj_&CE9o4K zbCBpy)D{tm0VYbgzA8{ll@N_E6KzM@bJO!vUV>0Rwc{I>)bHR&LK97V z^OM?OHRD=y;z8a?PP>zei4m5(D1W+a{earCLUiBI&ANS1LkZ^|>mxNo+RVN(ZYlyJ zJP+gNlDU#TH%PrC;;aVEM5BDDGW5ltBIr1?+wH?)PQ9hB$?&urZXYBf#N;@5ZHZX(2X8iVlD|rwq@rjMm?_v$$k&KH(=2ENURnBsI;oW~{0f<4`DJty;I_t8h1c38bo954IhjX?ga;YNh6yvbL7*ITR)gVDm z(VU4rSTTuM``CsH?HZ^L4~Q{jH=2RLLD(eMP?89YhPfL}X<%@^;WveOJb9Wr)YXfm zbG=URoMNOHJb8CNy;Oth!suQ+>aWLtcUBc+k5wsFs=6Zh zrri;1*>!}d@*fWSa;_YtJ?5u2d-lBPkjcN=j013>8@}~^EU6m%8GDl5<{n3EE}~=9 zSlsLC_-KYyU*{*M&0nD**(Ui|T?UM-4{0HR7Wa1r$Ph^QV9aIyhx!L#t#GxuCv?^X zsgTqy>ou7l5FUqmuAbtO+SAuV(Hrk{-=Z1}i($fqHc2-#P{I>^i+cftyk~75EBJ)9 z6LNV^WIi-4v-hS~Se{|0vCpLQCH|=sVGGna$ z@@ne;W0hz&2Bx+kRaAy^&`UO)6XmUfTo|E_t&isl`AOgIfFoHi`(`;Lugmn&(u6~dg{G&Y`%R2Oz-Fy_?xuqjLj%4M6SY|`5>lad4b z1~@F`8soCOaSfD63oa}0rA5@-?3Kn7XVC-#qbhsUJ)6ssISnVfl9u;s>FUbXl3JK_A%tv8xio(B5uu?TLfTE+7-oAqQ^e5v5?GrA4EHVFYxm{()}OI?*f~*7=zo*D=h2CEY`Ncj*8fBPw7fKMg?WbxeXZ{~~^@+Iee2 zBe6hC`FEPi#`r)--o^PK8>gx+fe7*BkG@OL?zRy@Fz1_M$;Rf}%6@rED&Y~9RlI;! zQkATgFTyX|{T3NsOoepH+l}^oX{{RTbg;@^&1sKJNvmFaw83G*> zd&FH^2`+E9yT$AmVIg2XruWYWnE+g><#f{)FSK^pm~V-@2$EH?RMg+9z7_|>7I;Bv zlZWzM8`XS7Kvvclwn6n?+Ey^g0J- z^LBQ9|MKJJ`(;3Obl@Z!1Bj3Gh>a_OHgUXUU)m9|GCPI|?q}4H!W6nXPjjk*;kgrz zpT@i6VlvDW-gu^PdUxUU;=z9`&1eDTxHiNL55&0cNI=k$W~Yzjo_}IL$|TYbc<(Hv z_hISAOUW-VMam_(C^XS=$y)W4r>yV5_nnI&`A_?|!9PUS|IH{O4Top3F`>yA$@I#4sw`;QneEp0UJ0> zR=Z?*4c32`W=`+EHiChf`ao&1%>CRrblx+TS;qR40cks#B6>aFea}UhlU2_?gItDY z__szh1;{6fTHDGv7+_b@VM(@$`4pBd1XiYBYBY}E8GmN~GT{22ZWSG1i9auAJb2yu z#iyKFuvWid^RpS)l&;WvgZ}2gSAr46xhG^rT6)+8l{AeFL6qQwCHoUlmD@2K~j}9@nOgQNnDq z@$(^LPnF4>?m6!ImZqQu0eJKnUJ~0kRtg2B`VnG^>W_t|?u<;1^^=+rBNjEwHgyR< zICvw{r_>vWm{08m!EG|hvpr6n-^bL%Wv4##-ds?)$PmpH4w)PMX?K?E;YO0HprmQ2O=DEIEdWd4M_JNICmpJ=671Ca}Vjviq=bS#m zqt$8;xw4cFPC-jXE&xRO7>uz>A=;iN@F()sxWGC%et)LDFCbvY)BB}2M@`ghe~V$H z7!u~YHgxXs^HJ3khhfqZ|Xs@+UgZZ%SFP(V}^Z5)N92jc^W|*`= zyY`QCtx<(W$Wk2!r)9JUeVT|g@!lD`$VODlfhH07owRP75<}TH`{Hd$HEx)>9>5q2 zIW4dC`@6%}0{(ZpT#rz(n>^x$+j73wswIE3NdG6y6GRXLf$AE7ZH(2I0~B*U(wx>(kM0Gt$1mYSA3_-! zLqkK%BB`Yx-PJg!LHzT@elb1r=Po5q;TR9sMe*VKDvdfUH zfdv#X1HJO%mBtn-Z+j!9UcMz2%R?6At?+BYlODG16={gbGtqD8@3W5uH~+P+C`7(a z^ctLNf}bCAksyrAssLFD!hq7Zl&yhox+i`;y?Og>zXTow^{q0Yx*hk_d*u{##*?p2 z#pLUgwO=4fmA~Wr%7WTbr0B_)Msp(TR55;w@oDT8oa@@_opy3;=i zw4$HkMl5Dnexv&2du!AeAUxbKS4gM$*>sFVj^%U5yuoz#iK?0}&+~)E8ShZ4U5)Lp z6WKFaz=~j4VG9@j{?BI2{mp;i@MLo>X%GrC+ANj`G6aEr7}h{;wyC-pVZAt=bR{kN zS-SB-HDNS}-&16YRe7;6GAKjc@ggfuP7tgp4%w*XB|L?N9*CY<9v-_D{C)1M6soVj zX6g1^?AdQFo&ECeqf=2?DWpvjVkSQlFW>xwm5Gu*l%5AUjlV%4mw5Bc{E}F7L0H%D#eK*@(~TYdvZ} ztK(g0*dOVOJcvO?pTP%OVy)j2)NDnpt}<1zPF=ZDe?CN*?P!kRf{@ZNv_RknG!kGL zp7&$uHJMMyJ~F`7stTaQ=9Axonn7|!nsEh;d9G1`alvRGqEX8xk<5^TxD`tACh9x& zC>!#meAvpltn3~!8VJeo2J1b7i3ab%@d^4#3qRVOamCcFjcVo79KjH(y5sAH`v-7|s>FMn#(Y?8Fp*(47o~ z{EKB2%r2d6R8zly|HQV!z-K+J8a-=Q6oz#_Y|~*8Hvyoxqpcc=>4^z-?WEjh9_WN5b|93%`hyFy|LG@GUt zf5zR}vgXSCxwYyJ0KkCyl%hn2?mE_jdWUu35g~}3 ze@aCkB>}D#o5ta9lR)!B62ydgtkDnBtwyn=Wvs}F}U*Xf;v-vfHcB>vb#$S$s86XfXa`hak}DB0#Q6ce2Whs&CQGgls!JJu}J-tDrN*s~~`q$MUzV16To^Lc*G(kDk?s3QuK3#cxr%yDp zL#FdBsax}5w3vkv&ca7?>p=v24@pD9=xYwbS46BK0LpB$DG8jibtuKcK5>D=bYWi( zVZ5d$M5M~9A8y|J640OKlpDk19H*q@Z|H*~AkkTovJF(B}w;M;ki#oAg;K_`@mSXxU=%w!g`1;087iZH3~xJdt) zCgRgJlR{|uFIQiWowa8;Pz>x#REsvb zmA!ZVIp05C?5&KK?vJ@Ap*9pM%G z{RHj|Lo`9V&q6s*;?iDZJX)`@Zh49`Gq&?i%l`_9k%q9iQYA$$F}|?~`mi|3f8?mz zPM$rHcX-%N=Ztz4f(MT$2{))YwOHXGftxpX(3Y&m1>uV!3=LrOFs?%urpv$B;(*08 zEU*>pyQ_wJif>V^O!j%GUZ}SVMgN!MzRN~XZB}yT<@~6pD5Uj&wj%VO##V`4GK9aH zZ2xjkt(?$qgza!wv6sF3g@5#e#ZoJER6D%%D}86mNAE>$$w`;2X&?fsV$|TfM@;m8 zfbJW~Vp_~g0U!A+W4VIY(MYuIJy5>c7Nh5gIN_HYeM8+RSy3%ti}NQxcqL&&E~aLW zYUrNlFBLk3-IJI>5M2188z+AF3Uhf@yU8>Yc48Db-Iz!YT|)cpBcThmw5}4Ld&LJk zF6YANTl$|D1%VMSwVG0|bxoJv{jhkz@0_C|gwIYVS>nO}giV&><9RuzJ$qz^?30^bI17JkSc}fGBID#MF7t@ zZb?%&vp`e6^Rj<^@tm$#-k(pC*dx~Vr)6KFV|^O36`M5f#=ZVguj|W?Wny>LRaCHq zJUk#jOLT#$$>vMex&5)CFqG7V$f}94S82zCb~lDGgDMF+by+E>ClAn_o#hOQ*EmjAClKhZwPn2lc_1$1pK;Yhv@{2c0SxcA;_Z0{ghWzy z(QGYU=Skl0?S&r-;G9fi@bqSfODC#m!5ZHo49tJN(IN4H3S%ta{bN@)Pek3t z0x=i{r;f8(`+k_x|5OYBG|NN!h2f;_N=t==VG2xQV|tFwjO-^78Ar6B26lLq8AM@| zNf=wx2}Qf9Qj@e#%dWOASKMGyn>F(_xZ*6<41z;W0z@bt;A@W$Bw9;VUvPJ(HF2G# z$<1~9W4wCv@G?fjpdm%^!S$@=wAl(m@!}35j3PC&3_k#l1hBN3?Q&0b}Z?UQN zV=a%N5&JMt_n}jUWUcmXTit7(Xp-w;hrPQ|DpiKP@WARR?L2exWXqutyM7qtKOSTu zHdXGq=5vPbjGYPGKO4Wf(^5=l%BaRH!~_PSG3V=0&oxqw-+t7Sj%-vC7vnFa&D1rw zdYxSsU-^e$RbixS`iKll_6R~9g_T?8w0F7iiv3vlUjLEZ^Q%^ zI+uPl!zzuas_+>1hrvKko4kCN)*UUGp%Z3Ob7OCH*=u8l$*Hd#L+poOGfXANsrtmq zW;{_ucIAf{dFN>%0%0ck(AWIYwrBO7-^>%VppYa%5=S#GR>YCoC8y8}yniKr#0m~^ zBsQLF!Hx$Xc``ka-s&YX_uW6<=*; zldYecCI$VUoa+MXFbi?DVR={eogrs32J2=ak1_0EF9smpYf^7}v)D4zisvLil_F$b zyPy0kU!P6s27&8q6dIuWz^@jV#5i-Ek!p8~NL~&!@&35^J8UEF5la(FNq?BHq<)3{X8;lPQ>n88*ItZY%`G_ggKM8@oarh37J*jS>1VP+y`Gsst zNBuipOVP%yR$zZ&2S{On^h031cRvS~5T#adsGM>+thHhO62JW=4uN2nc_}k;_zp*H zAtvxt+~2HzKfiRUJt}O1)b{0pEI(9{LwwRvc0g|VOLB+<1a0oQF`@{EVli2cVtg|? zl*x$quZIHwEHHr-m~fLLKRO9wH4Tqvqt2=NqI_U3w-npUY@0syASIkIaG@kie8ok+ zcqWY~jp2xLQ4ob!H;Cj<`VYrUxI^6Hrq#9L|~cvvwvsnKN99u zgnbmz+cXz{Q*W051j{N{80Nj?1;Yj3u{x?_SiXbufepkoKkYwx#uxYVw8_|+g#L)l z#E}a-LKao|)@dOjk3*wf`2Y!#_^wGbcUQdc5^h99U&xjtc#p6)2u9QOTeyhaJYHO}a*# zbf39fOnCVms5@J+m^E~SX5A@dp0xc0CjZCxRicDpYi@IrD8LqOp;4cy8AE{<9wm$A z{+-RVkf$W}fQHnMr&uq?K;^8?`H=jlP3WP?`If?&e>OFLDp$GPPM)z`km*v!4hDhv zC2@^GrSa~7>b06=K?DWwTK2K7B>*OlZ&Quto zLP5b=(VTSS4h+;~{E(2&Ve;tDDDL^9hduPw^KSbt`r9ad70&B>uV?-CMs46Fw5V;J z`YnoawR9A0B)rt>jF8tl*AoY2m)At3c03FJ;p;V|Nb>BApW8Ovmz`PeD8O<#oaL2P z`+^E{`Hv;l7;J!tz4=47ZiKnbdhJu6LpsM(uHr|!FoB~H3W>whh!Ur7!mk}C z<0y$!DBbP9`Vl`j>_uXjMrIP_m|i+3Zhr|;bdo=Tk$2` z(&Y%*dzn*KX35Kw<(hNJQb;A_Htr?(%XikgJEE*MFUPwy zTSEyeSO0p`mt z%GCLT9|Dd#%>=SbGc#v|!%HQT%zbRP12^wsuh^q~>%mlRGzzsYs&#q(Szl{rey)A6 z%!+tF0n^gQUzoTZs6m0|u9E%>JXHi(t#M_69{z{1!~?&Wndl*7C)XvFH{74O*!N+c z`DQbzyCt#Z7h&ROIwfX7$F^tJHcmZwmR8PkNS`;~P)1Y3%ZorNH8$2JiZ$0_c?)z_ zWGX2C*`+$HF|!(Mbohq~f(yH4j1*t4X=>Q%)hGdT%#eh162OQjg_Psp(%uY$wAHp>S+$)+3oKi` zO@C3TQN5j=xx<4EEPwv{%0J4Iz@5J?HA(zzA%~96HXBhpp;lLF>k;^`E-d}ca0bG8 z3xj=*Ga2u1*Ul4?UV&o;sO`6`OST4kQJZ&Xxp!fZJP}GqKmU(rGw9c(o-B|wMY`uZ z57JAzlRuXBE6k@p#N_J_eKU{#3Lr6LFmYTBbzDzzr2|V!@`3Gwa~1Uub}I;KBtw1w zaXlwwD19CqH3d^BWF4sT>ioAE@`~dOqBPU5Woe#E*O^|jC{tyNSDfE-dB-oCe})b^ z?LnGXVXp?Vomt(i4x#K1(h}T&$!kSV5TP#f}tHH3`G|L(O0ty3eECPe{YrS>@CZQr=K=cB<1p zTqXj0>mm{C1~Y0A7eW%2T57a)N)~>;){pz--T;bA#{-Xekgh!^N{kc_+1ztIKv-=5|$ksIXGBB?O=-$(n;ypW6;|m8qXH5ZG4LFZ&tif&fpw8 zJf_OmWqbiCnSuN^#kZfUh5XDs561_O>|ahf?Z&!%*B(t|vJClGaPuf(m2Z3BSJBA4 zh;!9|rk`}(EOMC!#n>?TM-U{73}ux+!P~wXR^}Rq$2A;`UK{p~U;y`(zpXw4i$1(; zWcsm`AsrscAYITHp`@DJgH!GH-Lq6phI@5u;K44D!IJeqAIAvE&IgK`m^OxCBZVoe$> ze&!T&v-b%Vhig{NC({eCHZP|IW?qB9sDH&ZZ*Z#g-&p`ep8N+TjNxJ@DA{^v_LC$y zf;p5WVE=#syx=FG?tivL_%TZ28!uv;C}kJhusC!hfjau(hftxl6NE-Fa3HaeMD+Ks zT)mrzDTiIP^}Q5NO&C^+Ya|cS9rJ%K6bSZm^=|SqIWk`e@`~+b6V2ok9Rnhoe0)n# zhhdZy?@xE3^ofQ@1T(0nQCkKmrS}y9zfpfymwM>FnAH<(V*GK83AC=+NV2gtvuXP` zK+D3^GH@U$P)`$s2?aV@$(OxhtEm-Yf+c^yVL9^yuAHfmV1 zla{T1Isy1<1O=K^5Zv6Qw>48?-~6lPU;TcHq{d?$oH$*pXCnY-lFU^2*-yb{0hnugTavqWCg){+ahf|Q{>2;Q z-OQGJ~=uQa}>qVO=uGOhk2F|SF|uH?ptTNz#a=jwCS;qi)#r2%Rf zP6VnXHxrCsA!oiuy8q;B$U^p|T%iG?O{bz3*!Iiv>qXL`Ez1AcjiW9?eq zDYs=&_T!XL)G(R-$iOD|+}Dp^f#5(ZtM%pRdXP!wH;jM%wwu3%&bH}Z5w+zUTlg9O z-Rs3%HED!*fE>+re>-w0v>o$WffcQF%-}6W4L5%Q1#DbrJI7mV3W%=7NTs6O{h41X z)tX&F@l}m9HK&sB?_{7@WZj=tyKNR)PX&T68;&>6)W;sV@m~OatZm}){sX-{%oSha zoct&@z(X|m81y>?CG6ckeMtUW*(UGkZ#2D#uJ=p@Uy>w*wC_G8z6f#+p#YBlk`^4+ zF9;rEd@pj-x9`M-Gvbu^rK0`rQuHk(Wy7nPPVZ#l3*H!rVJe-y+G!E@YJwd~0nho? zyCDJi7rT{+0KdEE?*16yADGV1R>HuQJ^_1GGa8p45KUM5a}%OgCv}@8DR(trsEA;q4dX)?3dv)f}$YrJ(x|u?!ReM-gCG` zs}``W;E8Ke@i|;fY1;Z>-zl9BJd$2IHXF9Mt|NQzN9|T(RDc;g!M-!*5-~aI1$z#3 z2*4)uLSs~cy>yPk@sZwx9VAHn7p~Mq&%%iV0=COzMe%c}oFH4hJk199ddI3EW^rIY zS(ExgNtZQRQ5rJ}l(Y5s=I_GXF{ZhHhlQxrs8zMK4_qbNqJ0c8OH<0c5df3J%{_qF z|49tuPO&J* zZYZvGz|Rt2r#;6Lnts~pnC59_vzN-H|5U54UyMl{%58RTBWv2 z?h{k_+~`JphXo$dJP*n<3H;yOQS4bVj#e!zxW&-WC*^0@KP%*cfdRj4YgoaPjxYEW zRfF*V=lugwxGBo)3?O5gBZ7hS|9j9^{{__B@8ieyMmq5J07+Uy<9g^+Gi?gS-=z0I z8*+a4g1T)1X9M}@$%S2*RlrH+gc@4SZ?jU(+( z1xf6~IOo6g{yV~X^FJi;2tnf$)u8VJ#E8dU0%yLo-Xe)T8~=wG2Br;JphV3l2Xth_ zzyD(i4>$?~<;UH=KA>ESA9O_T2A?cq*CMU1f(+n z)@!%n?1oN8mM<=gx+2H?nn)}K1wdF6&72(;VB?|S4-0Lb+xOqG>TAT|lNH-FP zVA@S9>N{m8>0vt70*toa3+&VQaGCu#cBvv zeyql(6aC*Paq^v=(5Fr3mOG^>LXUPY0yxS*1Y{gauSt@Zpw`gRI45c#tJ*vu*bbB)ydf5B_DTt+16j* zuVwQBAb1n%5mFJCoPkCcMN;wQZUQ9LFb`&`<(gcSK4C zr1hN4h7g{86!L}!&)bw5+&)sW)K;s|k6Uj!4*|SO z^po6K(VyDYonoXN9prt9Ek<*@5RRJ`hx4*BinQn16A|Eh4WL!=%~Nw!(PV8=_3F1_ zwRdI^l=OLuqFD;>(5T;`{g!OdXh193V#VbyEmIDoMsk&8xWum#$CsUHI=dO)HNGnB z`dIM2B2@;xQ9v#ftFJAluWm~INkzC<><1xA+D$&odPquC}jh&xR!Ia4x(kZ zVZwU*y4*8g4|=$E#`MEM@9sY4W(ouRT?7p}U4C%ov?WGj72PX#FuUSDi`~pyk4c-Y z586rlcW0U3iWJxOA|{j)gypSvA^@>tWtB-!86U-RDj;tlQTo$mKx+NK1hs{@cQ57aZc@V7c#a>NtbzhhTcd z_(XfvYu|3ejH=pz0sMg|R5x-4QK~(-K^rS?!B=-tEg@oO7esElADOHK!NkN6V}Gj; zchHT~>)cd-lnBoljmI3!-Ngzy+S;GvZ9LY^`8~4rd|z^$kWdzvr7=%yomDXk)gkX?1g#}eI}<$qhy~*fYx6}jjZdoOLMd4W1>`p1Nn3T z??7`ZP06l=@O&@tQ4Gk~2gqPi@y5kYqQ?Fv1G@tl7@!#_LGF>C=FMdbb}~p%;BsuNe-pHhxdRs$vhb>bq>Z0>Yvp&64i} zO^&*x(_&#eH1b*L>!XIj8}(1T(xZx%r2W+}ME|Y(F8krx@ULs++Dpn>Xk)`!;crFy zn#i@(Us=L+83Oq|KGjrmI7Na^V?lL`nSI77%zw@j!}2WxQEz^*&^abnNaA4veq9ae zUsGNa!J$^aH6y?p*kNojgS%wL;1y7TI7A}Dxw8IXTzT(oW|dwXE@be0GY!TmrP4fW znf-w;fjQ?bGDA|457s^;${9baTNAe*I#;@{R;P zk%X@?09_gKv#W9C_1qrPl$YDIo-zaiA4!5O1V9eN zQ!qV)Mi!{r{&P_wC5YI;s12`R@bQ*ylg&c4j(~V{1~{{wKTskr@?d+ITv^kT z4lEMgbs(nV<9vP!23p%iA7ySQGsxxo@gNibyY;gF6{%-4>663vvCD zW+&c+HF}^3YfBG8+C-0c$QqvaVOzw{cdA3i_9A?i0y_^1kHR59e34p7aL}<$mu+yi zGc|rbz1NvZ2^RD_cE1>P<20BI z+MQlH(;+pDqvaq9s-SdU(-6-@@bW1l`HuH72c{+rjIEB=5?)h=d?BA@fJ5=UJ0jGI zYa9z$583mrNv<$Fe|)WC2Oij?g?R*n6+PgyK^vZikk_2cY;@Zgj?SeIlzlFrrx?g7u*Y=6C>!3x*xtG&aLn|YqN-{+=aTusGHq{j$lEb zlsf02xm6$CIRHcVi^qAePEL1c&b`%m!bVIrTE((jSc9@pqc2zMH>cl< zjj{ezXRhQj-k@I?t54e#@opQDKbD{OmHKVONY{j!J+eJL8dCY0 z=?kpamKgK*r5$Ga39@zq{Q{*WqG^_cqIrZ)N_HG@p;J#n;JZJh@t8*-%t<=kjD@RD z%|6-p+PJz9J2eR7X2PVI?{g@Ek`n=>-|Kc%wgv@AT_Oe~MS~x!QqF#Wi43tweM>p$ z->TI1()Hj<;$)KB9;tKTdZ+PZz7(MBezny!-WB?N3Ayh;VS9Afq_gky-R)UbOn#9L zxTR>_JjhJNV5*r{@S2zjyuUA~(j55fd06tC-_CRB_*Xm;9>Y_f>K>^8w+GVBbw%7& zvq8T=WqKETBvUMKi`S=dbx6g``-(@wr@|ycAHjV;vr0qrFGcc!>_4)X@4O1d9DaqA zJI_r0VgwsM3211%E{eoufB~AEwYNt-?&S}$pFt1IGz}tX$I~< zmq3FLZKpP84f)T{G3ah;#`@i!ec`oR1D!=Y?|Ymktp0!O{bf*GPt-n&PJjfr!2$^~ zuz}#g-E9Vf2e;tv790{B0>cm>2^KuKyGugw;O_430nX(2f8X=@)~!=@s&3u=Vb`8r zvv;pvz4q$v)z5l*Zly;Pa&z4XeUUO-bMPtIo)^hnJ&y-?QwIaLm=3!=_L>Snm2Q<~ zo%;Ec_u9BgC;3J2`L835IKW=Z#%^2Xkq!eUaDmmkvRyFtTl6JrAMM2pzicUR(!{6b zwIcZEWH>9w(%c|WE42z|qp7?Rtb5E1mjEx-4Ok`fBHYq)R&e6%=s*;y&EFjHd(+5E z`X$u)70U;_9u4-gw`XKQx);uA-l9~g=zC|o3p;eh@ZwVTYGcY$+DI%w`TnV?rj#^( zaE@$3^;biV8D>S`Y+D=cxHfqG%7Pn{1vm*_cXQi&v{qZfyP((a;nnK_fi3+Fs0A7f zA(%ydA3q_DAgV}RUH42^o_)skHz`3;Z|UV_aL%AN6Y_yXozZ%IVkoE)4Y4f>B>a{* z-Lgy1D->%egb#3_{65_)3YQLa(uVell4)yu#Q^a6>-*00W1lQ$;IbNZ#Bj19CO#J* za7Z7iOp?{ge=}O1U71h${UwPd?yn3BVSi3b{0j7quoQa4&#g(*$Fa5ytH3t?Gjq)g zhpC!bA@M2u+B+Xl3c_J8<5IrfrKO*TYJHAYSD>>~|00p;o8$!X)eeRex&d1!gPTta zqT9?FsY~k%f#>~UsRg135`Hu{9)pv&$r7i=oh15mL*}}Xv{p)ci=k`)h>i5rcwqtT z_Eiz;nrzWT=Cilg!I9N)7L?sYz=$p0)`V-MX^D+VP%`>-Ues!DcsO`ncqOW2VN7Qd z3)omvvfBMXq7S;Ob^jg8jof5O9>>gh8Tx`}l^UVE(DS|1qRQuUDNYx*huOLHZEW zKe)drYvZ4Hw+=8W^W#+SOWUSNp5VNI>Uo8>rhpi4+Sj_~BioKdQ>OzK#~Xw2457KA zpA%Ow60_j;=8ie7*BTD*2*;|OTdu@Ib`wu zbP{B`qO$8|B5zv%6g`=zpu_tH%^IF{{j}JRLmyS(#PFw}zc6-FI{&VOYW(HKDMtH& z4A(ZQoYss|L0i;v2;29f=v%4h`c#;Wyg|ZU-NE`j5rS-V(_|F#I^|DulmWJ62hl>O zczIB|)%PzfaTu*2hgn3l%&4i;T~}V?2fKhL>968>B7t9J$al+{flG&kBIgxO>-&5e z;y`~zbYA)iI$WL=YdKa-V)w2S(r6}oteyWXw)wgq?*;iMk4ltDnZ39N#M`Ba$i+8Z z1m)O_w!v1tvsU_sGs!+Bb3fQ$5iSo3Pyxo|4^H}RKd_#ZM3r9ir+w zULV$_dUEYB@Pl1aeBt;qn?4SNNn+N-!|$bxEzu>j3OBsHe%F9cxNR0B{w*(81oI6( z_Mh(^^MmGguVLwKiHku2zpk@?2!^=iG6wbZ$$}9*@dYZxe-x87(|=#@ul?=H>`t4NtCCylF~$hEzU5zXx37?g9cWD>>4-ZrXd ziT%` zb@AaKoEkTf7`=(d^a$g1Q1cGkLELu%lt1(d_B{zVhZzL9f48A@?aq~B=1{eD{6{+< zANElUiEq{@pKi|n18gCqh5tWw90y(=Jbx19b!dQ)k5GhcbXb-(O@O#P24ef`TMZQ;d63~79lW(|51Nj~tJaiC_pwR56p z=)P7>^USd!CS9f~ z(c8ix=JZjva1ICaCKDgl?frb6MX{QW!ZD4Ljgua&{o)ID>9i5b!aDSedGpUv>I_#~ zbj_<8g%#dhg~9>yNP$wL&jVch8q2ArW%r^tdTyh)j02vafUc=LXHqkn(z#f}IauXy zug!1@at+gCGZN1(UD>?a3bqyFrQMU$9k>dvzbm&YOsr#Sb7uQ)-qdwIBSkK|b6a#s z{JsAku=gt~a*}MXr0sohhE9-Q^>29)=)<}_a3@1_^kDaehVwjR)pJm$m6$ia>IZyh z#!IlS3=^TkSn&JAMFx)iirRIn-BwSEmZA`;%+TAF-jtsz;_*VCh!kwT;-JR|wS=t>pj30(_V6%(e0?VS6BaV13kEIOX)A zUkz+u#6=40wy-`_IvaQ5Qb^XuLX^*cApFO8ocy3=_*P8l5g7A>j@FS@AxjH>#2n{*Yc*93V zezCd`TCtJ@sQgoRmi)ZdjH>w5Qc0oV<)nGQ#-TPCa6pv2rd2>`U#fb@C~39DXaBXG z{8)S7lx%4-lMjrLkKI;;mJ89@QR9w~Xf|g8yYkFhosJ2C*jqKe?K@*&ZSF;AzWs}KA1>6*2MLmh`tdy#N5rcF zBrKM6y{empHi>E}5Zt(+`Y@V;{Cz)3W~hD66vs+R`TmrlYZw;#8f>RkZ0)nw_UznS zY6u~<)O^&392K8aJ`t-T0Gjs}gWM@`?-sg4xC-i}yyHd+7Vu|eI2U#D3br-QzcgUr z#-qh4w3_pak4In*R{zJMsIn-ed{?Ke>675$*i(!H!&FvDF1pCbEK>#Zm`6EsOi(fy zDAx2&CIbxp;BPqMV&X-!qvIT;d-JC@!L4%Efw_q9)$ZF+IB-GbQry*x?KSJi3Y}Lw zA(lMxKYMaIT`#Xm`%I|@Dav28EJOc^FK5#F9l0cc!~U>Gv(jYzOxNPa#$EVyu9XmG zw4vl^ysT6+2Buw@sAT6eF+5>%Yk-++@hB_=TF!*g9*PFz5-RA!M6fS5ALm;S68HMZ z$%iN3&FQS=hD%c8n)^N7@RED0hSu!{&Et8m7Gagp%|eM&r>%*fzEguqVJNa5fePqj z_U7{_kVkSVA*C9U6phj((~pC(Kz~1&7PI+?lfKWIi$EfT{aq}X5Lx@jE9BtbigUN;x+ z+BNqg)LsiIo7JDhsU0`xGrr;@GSHA!I6>%K7!Usn^XN|Ld1p% z(U76vMY&;NE;hl4wq{LXhAqUvN3Tn~a!#c|70^~}u-{>`!M4Ey8OR|cPYO*q%C4kP z7fCLJ$NR0ANkkcN=<@E}v97V5XgF@v`JCq`X7_8AHJf16EBWQJ*_cqdLIKOUR9Dkr` z7`urq4HcgA^r@(hy#N_az!V+mu=bIfOkLlqY6>vj+opw4bSe3bt1)vc5`2+Xis~oE zhz5P_l@Ry=IXQas3V~xeg>#lk6S?r3693myx9F6yT@K6u6r_j&=6ekv*g9rtKh#6p z>*}HOND(Ff@yD8;ao{jUITsn0lf>|;iB>YJl?mzyP|SzvxM{)POdRT4 z`Uhxh)Q7=7e^xiCdWP)yz6OZ3$^Uu^s|FFI#K!N#=lzV&zJqB3%UUSFN@SR`Ud?g( zT`w^Z4w-5yjk{P(!ws1cDGcPgNB*F8YAo=eLel}BEOiQ~zy>NawjFk`$?0TeFC`sP z6v$IenM}Z6!R=<28Z~0s_*7#b&lQQL>evoHl$$v3PxZP>8I@2RlB z;KNu*FSdmS14AMgw0;|v>*7WkSKyLGkUsIRjWXkq8Xc4EycEl4ySJ5xzi~mYXvys! zd`)6{=tqhfp!v^Xal#JYepa$j0!`65sLNLH_H1O1DG^PtGcL3dQ#)L&)zA{Hu*|xq zp(juvoG`$P#X3dRb-srDN(WI;cis3H9>!?;ax4}d0x_g=j@jL2!YALt;ZK7G>^={i!=ImDdMO7asF?>dx|Rw!eiSXIx3H(~Fvj z(c=BE2uo}Si@5_?dy+NOBFeH449@%4_4)~}1uQ*8%P%))SkEO4^ifE_)c^+8OG$9d`OhS3rM6or1FD# zU0AoO{Ct2K9NMP#qv)dy(&b@+GzWCl_HYzYjv{~H&_%Ee1jLE|F#n&)4^(fBa3r4`PH5iB9VM-qzKof z7yS-_P0gqS!nf@2x5E~S`ddGKpoy<*9*v+r!~pXPw?`w=22gtYrq{l}r1ylLfC8DI z#R>wXfEw3l>sCgnqZDr3R3BT2A90UAFZl&Zn5spbO>IVW;QW<^YJ)0iY3VKHrYq6fMMjo&DuJeye7b*GX> z*U0gkF13X@=E#6_orVoBK_%!rBi;g@!K3Kw8%vw zU5m zao>CM^#CNi+QwUoV4O;DTP%qvIgwK5u4XSFG>29ztS&#KiDjHNeeX&IjcMI$XRxn@)Tg(=Dx z+LbQ3_0gyA7s&wLrornxnwbwnM(`ZmiAb6iL474o8`fAjkKdMTl}U8>=j1XQ>^*Bm z<1SQM>pP^OFTb=e@=t&ENA?MrjIE&Iv8a;S%qU78H<==k2KvyyxNyi9b!PHhzWz)m z2`>K5ga%73?%nX?F;$H5^$TcT)nGO3>K0aHLqr2>s_|c|v(+EFF#J|0QPwuOb#ytot5NkjmJK=UQGm zWi)0g1Ril`%P>`(8NOlLmw#LH^%&O;+L+Dv#>2~9SF?pgze=U{%i7R$n`Lhl*mWuU zi(N-;BxDJkG+KC@b4t49P2=g5C$!7nRLVUZ2{D)4iQX z@VJU3v!w6Jv@H4EzeITHDmrOR^Utk}(QCf3<5y8H{!2GuOhFy&>#G8*+*rewR&2>;@!J^2rPt;x)#S4sZwyoKZubyL#XEs+fo{{e@sUsT+lihb1pb_B zKN__e_ct-hdaFiXdd|Dwb2Zirsx?NtHiZM1R99;TSTR$^UY=*y-x(Y-s2*A5(kamp z27Fid9#zgaX%Yyd%~|7B)1PaNx5==g?^pg0g+%n<6TPfw?-e>3yl6EpPLY01ydrWbU{`v(&QgECsBzbbrXVb!Zf)NQwf8We zdy(znO#hV+^xQf7s!J7F{DT&4ftU9>E%VRvh(~A9Qt~K&>?GjHTKE)ZJ{-loqo>^fm`jLjo_>ck;$Dm2UqIG zhlK_ltDg_Z8!wi&>P=@AcToZc%rO%@Z4T_3=Hxk>zn)S-|E5kU(ovV~?KR5CzaQ2@ zqo!QC+$=t@DzrfFsqE7-s_`%XSQGxD)0QOMPFF!5)ShkUH`c9STUx@;>omLhzI0t` z(|Jy4D5o~KxY|J%7Ix&NDASkyH~H{~X1NVdgwxevWc^ z`+x96q;K4>t*v5i{scE<8WlK4JuH*=3qDvhE>T`F&ZbnY9r-J_8T+X*w=D(EZ7vrN zS~Z^STr3#>()Y^Rdk#A0w?*=UYW4(oYs;))_#0S>Rgbo63oqIz?-wmy7sN7eWg zEF|NLAg*HQQL)eOjs2;&SNS&I+yq4m$L4M-qwWINXu|AtaXoWQ{kHRyA-^l!?&MX}tuF&xCSUyU#>IsiP-NRrW zt*oHekSHKMBiMusn06sZ^p= z6d!FBJ3@&hyu>aEb-Y~bRkzc5e~-mOV|z?MF~yWspDeoY| z^FC*KOX?h6=AwAfee}d9%3^C`Rh(qB= zKl?kRt=n|*)RZpbPpf-FmU9)13YRvFvW#B|946b32B-K#yZy#RuqWg{3PQH)RDbq2 z{4m)Mb)p(by!Tn5w;vy36&2*8CY0A%=jW*t?28UNMD#knD^ImdPXE5q;-*dXUUG1x zkG#n>2Ln(Tdid?n#0ifOG2OTxKCdBSY|;@Zy|0|u*&{ne4(58aFHD|=Elylk3>}On zSL(v`QRQFIrBCKb5uM2<$SYYdIP&wj3Gzpnn{>T%E-{m)qaxIMW_Kp_GkTK@ex^Ew zS{T{%tzA(aeGb?ed;j{#0T=lBt-T?f9u3^INoeetQzKd}*3&ibv*RajX}GMo7tG6r zoGf7no9{%vLWz8F|1yRcWT5a=VSIrf6;=~FqreuTHa|FDN?hDsqFgdobRE_{9g4nD zOx)u5&2^ErVJuGqG0Q}I`^ruzV4=NV@RK}0(QLM36fd0Try)KWb|O6-r!oR=0c{P2 zYoYisZE+&)a$2U$AqU{f+YMT}b5bA4x?&J1f){RPG7?G!vI8oGsCwVf}S`Z%OkN>%==%I=;Ex_O6mk zPyqK&Y>L2`Z2RtZR)4m}-lmw|Q2o)H-jWE^xCLuh?vFX2!p#>Jb)^#RgTLV08Q^ek zfEV~HU9jfgQE)V-zU*}06Na`vt$TM2&vqA+qd9kW^6LV;3KA4!K*nVLgwa1ych0*MUIcxjh zh>zp<9XuP90D+%>FW%$|?rH?*%N{>{e`fqp}+2WGeTRK$r2%%4PMe;=b_T}?|BTq8 zs-PH$3MyLRbk}sAO~C$J*6eWhsgx zETl6)rfeBeT{M<#sO-p25eg^R_+oEI&AV*YH>J3(v?f4wa{yCH-x^asRML$h`rT&; zh7L`*AN>e#iK;9PG^%QiR}uwGrk|hq@C%Y9-dKZ<#X412`5koe_EhO*eZ^m8GBu5Q z>1tR`Q?QmrHyRVZ-*>9V@d)xHfev+{eAPJKCPQh}!mrF~DULonDOs0Q%V2jCHlLT~ z8fVY58X%i)wm#3sak_SIQJDM|j+G$_j~S#H9CeK^E$2r^yo&EG3XdCnq3;Hja%p&M zLBrGkk^%(JBv$!Ul8>A+@{xV1(cw24PDiAV(+Mmp?5=-?E zn!I1Sk7P3p%-wG@*2Led^eNg;&ma!Slp}mNPW$^ywvL_l)BoE;>Hp8lr&h&SL9%Hz zk|yk8fdVkNf`M?RP=b1tfd9FAq>eWcrY}E#G~)wuA`R|EFC-Dk$Y>I9y?;#J+FCoinCo(&xw*Zd zZUHcW=jBg9)bm}qvslB@#0{45cFzSbBXjm3Os$KzF{pK&4UQ@n-VcLgQJ3QnmoPsx z*@yGbkNepyeU-(=_vdzjjP7ty5If?EqU0j?h+I(Fd;ONh{sMj;zdl?T#KFOFS08zM z>pvDa(dvFWQQ>z{Tvrpmp|@_+U3lsHd?2;54=4FbM`}^>Nw#n< zdTUE_^_g+d<{b<5k^8x?t9$ElU4pm;B>?&!z0UvbRgVo_4^tFQ+X5~S$mdwJy=$}c z!Z8eVm@T@yP^A+HprHzDlMVonkAwZhF3H ze;6byPdK+C4dMGQg>D)=oI+SJ!T-%a)qxkIbgBAZ2|W^q6YXI}zcB}}dX+JID*_Cm zdXtC7BnYXec}m$NA45ae-`8pg44BIgW!956*Tntcp3G3YNo-R5JX5q2g{p! zv%@;CAS%B!x6Jqn4LJh?1rhgZ{74IMAQ`Ecms|W_EP!bx9O7MIZ^tHW8t(rh6mXo0 ziXXs+v489_Xdxt2NZ&d3?3Z$3T2NfsJ-ullZ9(z90T@f49^sH|?McaMG>t2;G-={U zNeveMvFj9VdMi>!*uX=fi>)nEIbgAoRL|cvOo53+e1Jeq2rEB8naGjM_Gec~7Xoh2 zkJ!M0t^0Yo^-g|6mKlkoqT~*IocQI_BvYX=*|G1+9#2eY^%dUPe-z{uRzSq=HDgOT z^ZS>ZANeGD{AC9NCb-IS*W_n)cCvyQ+eww&2P8-WBoVb9xtCyCXUrl>>p8{cTB%Qr z7?i6_g_wLwqn%*}isZOhfKj$E9~Rm(dcRvw%sP(G$&L!^@X$V=c3)SuEd_@=7OgaE zv;3HeT+IrrvMAF^w4YVXRj+-F1@Uc7g;b$794tZqt5Uy~BuDDV!DspmlAQ_WspA3J zb;kUN8zj->7J1Fbzk^bhmOzyh!Z*26kx28_Nt*)3X<+8{O%D1oJvc5?t?+wD&ZMw| ztaK4U3Tv{btLsli0T#K%2stISwjd-Q<3GjaKquiXd!E9+Syr@Bk_TF0G9tB&_gV3* z$@ZMykjD4AP^}nqEvTM06iP^98*Th}(6`>}9U(unzCjom5DUj42P-rbH(_JIcebX@#XMw zAsh$k3*8W!=D#t|bsUQ13?YzJ9I7vb2>q&S=6W>MfQ@$=Pt&=T%n+ohebF%z80Ab!0(p`hotIUV8RfgS*h%dIk^A$<*P}B|y z+1Vog5^_CaFz^!5%ZE1Ls7Q^&{jE=yzS7%6*2cu?CF=&z$26$GO8D0PUmS=4X~E|6 z#(RspC4hmJ{fsD3$BDm84{KdpN`h3Btnfl~Un4?0BG%>)PZ64DQc?qUGWECjBib9@ zW-O?#iDZ0oh&N8k74+tIEq{h1}%$kwwOJcU^8W|DfQAQAlZAY zuj!wRqn-%B*fMgU)19&CFYxwOfL?kV^{VV)r*I;kLPoj{-oX1TxdBV*(q~eqGjf&v z&(dC{iO7)(RmoaEEgT6)U>i1&eK-AYNzAUi7uUVo@E z4S+J+@NB7c?o+4fbdeEMI?HVwdn30{zJRh6q0PrHoFN{&DD*%g71Pjn5&`#s7* z$Y;6vFe8UOA%tu@nnjFjJDwZf5Xs)jHaNY_9Z|{OU=B=7{F;xynM)atjAbpRrnl*o z7TZ$i^iV9zqL!)u`LX4;&9oHgYWILN5A}ld^T_&}_XfW7-UdWVqHhrEd$~xY1Aeb# z-IV^L7(L)3+Y+acWPfrXWg6A~#T~)$3UDPW?^iyk)kJb@Id`+`d#~kip@;&b@(g!Z zdI;K#Y|oQy~o@D&o*6mdbB{Ps#R{E?1$b6f`5*Ax$JBR6U_ZVCI>q1*|yNikMMN@ zwBu=E@1=gfg$^te_CV7`3f(yM3}e|D$nrEDCKRPAm+4MVYmiwJ#kBfK4P}(90AP>7 znF9L=5~W5pV{3omI?`EyPRDl{c@_dBm(Y%pXbRwSV}~{rp-7!}dk`Xv1^s=*iu~el z&0O=#JHjw4Cg<^SEt8=JX;~Z!I3ANc_ zO9?gqDZl>Z!o&*LTQ)W3=!b3}Q))v`Pq!x$DPQb7?NV2e)d}GpY?TB!wX^H**%Fy}x~N2v%b)snXRIig7q)!lRu~|f0*0YomKk1eQJL!sPdptP88CtLy}hT>W37Gs}H4w#rB?qKONLAJi5Fr@|U?abW_duCZO!?bZW>$%|fXfgOQFgMkxYR0Ein(RXL`VtjGSx{$0gFae6Fnzn zL}esqI7>+uGeRA$60%X6fp-4w22F=_Zs<#dQaWaxV?xwTFjm^lw&p9~!}jUN?`q^a z7;931!;TB#RTLFsUZ+^_?h|*t4B6EU2hRVPb~h%ffQngNL7E-Cx5(jD!n7&NfjAy5 z_Gw7~StfDs!BYsK-XE^XQA&vN`y<&qQFN|(qenKi)|F*HACc0f#7Bk*!N2FC=T|Bj zXksCS0#w|)9B5~Dt5s)Hv}$$*s}FrYKCmEJ-v8M(MkI+_?pk`=$Alkfk<&(shvkV; z9g()|t8AZXzmD5G_@IU_Q58G9?|4`Su2IIkWIfFf67eI1#XtL5Am|B|GsU;4z<-U} znoa2br-dq?+Z1pfbY1FI*wU=H(ys2fGDPFt4_yv9}h`06*;s^XHLoQeHZygx8=RGyHkgnHBm! zt<(kpBD}))vBLHj)CH+xh#V$ykKTLp5Fo<1$3xm38I=5=KU#4EYtQsiZJ4*Jt}JO4 z>!=nG@NOeYvJm7L^M87}VVYmnjAkmr)M7$RfDOX4vPyJ96p%Ep>8C>W9M`B)2wAGT zb~>)VDX8s4`{Cm9;?aJm@=S4ADB{_SCTmMD53Rw+i_o^zhu4~ca;{#Q@|xR{1cd{L=YH=`v(si;Im=Tyqzh%K|zbn;=gvk){|1NbKv(o76kl9 zBq2|N+SH)day67GBe)p7#!Nui2s<~JRoQr)Tj<4U!qCh|xF0WGZY&mTT;6`vIF@;2 zKtZ6N)QT@{4KR~BeKAP_0%gcTU(OnY_N3#3sNX`1fBo1A33PWYjwu+Ct4nEVz3DC& z@t}wv3w!3BQMq4`!9k30cm<@#cZ0x&uA!H~5pXH>$}KJAu9`GJ;D4rxl*%a&F0f}m zH7qEB!f%>P0OkuOA%5@-bE%5dFHZ$BMm7qUl24(;*5`pE zyd74G-D>Hc?IcoJKk3vi*jNC*9jExbX&-U7P_Q9Z5hBOq$BTbv&L;!?yb^)Xi@EgE zCD+(l$GZx7$xhY@pK2zYE_w0_Fj1e7ReM1f-AH#=jLELw=s3nCLz+r%c)bH90Y_y! z8g#k1E6>GYMj9qGDqQpSUh^`coz`1@iXxl+i{eb=zFI{hQhSPb9AZAr{h4|>yTgfs z0HM+yJRMdh-5ClE6VDZBoqMVOQnHguKlSoTslJC`91qlPi4pl4GLtuO>F2qgrzkXU zQa$IZH_@OtJ%^O3BT8$3bkv!>3HV`HZGzCfV;d?UMZeULqHURAX=+aUyGlG)X4fpr zDsQK*lRe*TweVN1f-l9UY)OSt-3F;{v) z4svU40+;p!*ABQKl9Wgd9m+x9*S%KIOb@sgH4eu=_5)>{<&PgClF+6-?Bg5%o$7IrT(1R0%e94 zbKT9^Wak|*GK7N_nSEIzDn*qSuIy0R*B>`ZKG`?SG-C2h@O=HTYndC-$)9>0PSd*z zG~>so8z%VFbX+B@?b&*0aC4lpz0&c7Z6c}pR9@62Qn_L>l;nhm;H4Y235 zkh-ccdR%>TTdTUTI4>>0k!|-+sQF0vKEj=kE8Sl+Def2_$`s#G&{^M-kHzt^N^aST z1!$pAO_=WB`xc3JHN>E}8f54DeLjy&k0*Nz_X(eX1KA|mQP&0r?C2U+!F?I)r&MS^ zcjwXXLr!n16>4GUzg68TUr0MB@owMR7yxMNnQmKAAU7{@Udqe`d2ZF@Dn?l|zEnvy zjoyK(LN_sbGb&yrhj=^%wWkq-H@rNXYTgD6mwm)dB=#cWn^7RD^D$pR3uu-CtI3}6 zrwL>3{Bg+TkvF-)uF|9o;DX#Nxy4*kN2H&lpEYm350#l1SsN!pFciZq$8p&f40~#r z4KIT9m*=$W19J=SVCVy2guMNwgWePLgE9N3q3eGi0)%|zI?Y4I9@&Wyb(|3I;QwU7 zfTdlRH)(Lpp6xmJ^_MOrezahMh4oN`AXm7tU;-1`=~GjJ5Y9DSb@Zd0!Vkk*gk;}V ze|~H0QWzstnj=Z_ch;$Xo)%>NlaOxaiNC>Uc5VHz>hfL-;z)85K z=Q9ynKokS>c#H(>Iis#1lc}~5V!k@9qq0d1pMqfSfqU-te}9J8zpXU$oo zjMxWjT0&$m_0I)hlGn0|+cZrEc(M_LLBEN?rnDTgwu;7dz?k6E^%0)F0JDVtT21jN z2-9t>-MjO`bOMCWSNJspBTb<{@0lam$?z~}D-*SFFC>Iw9`^zdt9OeD@V%TF?Jz51 zReT}YNzJ%dQA5TTw*D!t0#93{mg2cK(qNYv$NkTk08f=DM$Gi#GAy~Kpv z@O7rMx&aFP<}7e(k6pWo6?yJ)>8Ti!^W~Ka!>#j^y^i#V#H(Y?%s(r%ke#mOzt3ncG|IX(#MXn}|kb|C<7jU9d0O`HEy9#b7fuF!SCB7$@lfMH%3 zx!sNrtKxyV(u4bsUZ|Wgu2AV{uwyr#4gk0a7gXJ&hOCbn)GA!goKop;v=Zmjz+d)P zis;*_hcOyG3}66*eFWgdoAsJH7e*ri@!w6`&a1OZpH6me9Rr_DleT$svE~ajyuQY{ zSKL#6sJ5>nZ0Dbw+PfWz{*wv2mb=b0MJ2A<`>URKm)OoofB=L)aYVkm^4lSYnYuRM z#6}>yP7*8_S8wrF^bmVBhSl>7Kj)Ju_uTjfDRA7vpcGCd?{{f__u9|MM2MPK+l_cU zmV2*f=W_8PM9ORKzf+aZ)Y+o%!yqnr`UXDc##CmjOJ_~EPH`bJ>wfE3fqoam3UMWI z1c-d(PGBn4K1L0>_(%B(bz-RY*ja;Mol*cuAcPxn{j`u8MUxuEBtZCr!D74Mj%QFj zNQ%`~4au2RqZwzt{gZaA&=9-x3i>2s6`q0(Tyr6Wvu+RFLXm4I@TJ9+vp?y$=C9v^ z7bUfAg?&kQlbzAIdFGik+e<})&31NL`)so_9THdvG6zY?H!F@v2>M; z4n9bMkI*0u*btK?R(e1&RaXb|g8HjkPU4rmKYroJfntyc7UuBtbn}uFDUm&jlqFKx zt}eY%a=E#N+_?ef8yIu2$sd**%q75&_dGonk1)V3a#<@;!ib0%t| z8v1nR;;XZLj9xmvJIhZ3c(j>W`>b)QCZ5c)t|A%JhW(m=;K&`vqTDXVjTNOFO0R=p z?T?RBDXjiWfz_1Z@@3BCtNkkBU1O3yWiMUeybG2=Losz!hu((x1;OXT;l!hw6r2^KE+nxX?^WU%nov0bP`MlgmIpWZ z;vtbS`DNdsxIYjvrg#dgRfBJKnd)w%MEH&5GgDANMYG~q? zEJb<)VhpP6^m;@nu?4wlE^8a=JG<{hr^iZ(XpAH_aU28)d$eg{JqP!;)t|czQc@Hx z$PUy`iZ&;r>7%MY!x6!(xp8DiH5?JZfbd7yEqd4w2BBoaV~(wi1( zPX0mO+BU8x-ZXLacY$@F@Z&3n;PnzGvIo9o^+Rl6&ggbC#PFoB)kC07U??*k4dLH* z*p{}HsMI*zsPC*{x$!=3S&c?_Xy8?qKwQbUL%Y2pWNiEU|Ha%}e?|3vVZ)?=h`>na z0EaFC0qKSTBqT*jknZl5&S5}0q#Km(t^rgU>F(|lc*oE8dEWovUF$tR%wo=3%)Re@ z$G*?m*L7`ln0D%)qv?6a%+DgT%=;$>U`si1Pn+!9Fcf&Bq*^_)G#DR(Bo1y;w=nvB zo(s8*ug_}>j{#^h35uo~CC3NiqwWT;4|2r0myt(ZUxqd5Q8TIWekOpF`o%xxDDql@ zNVT;4(1nPXPmJKxJGJraCSA(+vR(qtFX75y&rDNYbEQmW9UNPk`S%w}s1~Bo@(#UB zX=fi3xR%IE;BdO*|G0q87N800<$)OMdh1oW3L>C!w3b>j%Ti}obsbjx&I)UB7_f4R z-&p6TCJsW>km{qqBlXT;zBHG4JIzZOFlhs>9y;u2F;=_XFjJ4LUY+=vafwO%=3$cV zJRGly5)wN@_laAfL0jo?KRpnT*(?yJMdW(Lof>4y<9lo7J~Ku5(iP=~w;dHZ^O3Ru z5B~6(279q-aVJ)2Z_{UYGI(3y#_RIGbA@#uT^mfcJ^aDUaw12j*KZ$`umd;f)duZq zs6@7v<|4rd9rc-PxEZ*>3>`S>p!vPNT~+-9<(a%MA!Pjj?e0TD6RmCCRCYAUoowXf zwBO_Un@K6VM7g77qkS{5JVvlh7=LCmHQOwi?;HJ^iOKz_3NN{B=!h0X)_lb@Pdr!h zOrdm=j(h0E{P4EGupK%q6@N7PrPK)L%gR*g=*mJqwhaZ{r{@3y>xv2BmOEmNtrOfq zj6Zv~{M2%c>>%tj1<(3+4AI41)7gYvmR40&X>(;p(=#g1d)oFdsBQ%k*orV_ zeQQlv_i<|!?V~w0AqKx4$s{NII`Rsy3V$Ki_`z#RWU2gJxq}^QN2U^-d4+47X+J2_Pm<6vviUo%mKmc zg;LC@vumplCM4ZGwtT?ybl~*pfYGLq2K-Y~^_W8M45#t47)uSzU{7sNnj;n%mh$z98L=^G~##xK^0;^lo94a$;lGMY~`jJ3;KMX$TPdIZzsr0u9`t`SC;K?}t9;`E*q< zmMcuNhGiKWXgOd+h1-3&1eN0JV|e?LWION^LxvEg7&ya}l6e@27h6oq*y0|(&YO`z zG!O>VP{ovL%rg!DG!g_5({CT&f$HL+ZeVzTEOaT~apP^t4Ceotd~&dvjXn_`({T=>y{fAqNa@u9jD;+vZ}{i zn@0r$Mg8N-XFu)EdXxCwi?c|PEisdLP)nn;%Q!=iZqBcT|L2JbORWwYR#;zw#S{8)yaCPXwx_)G$P`vYsY!=K(?A;r@|mE?8yRm?RlGScrWg;&Yd z@8SWKMc_xONqyLcr{l&p3Kke~pr|5;bdwd2&QbYiAvVfN$+MBSw9wAwz9=*#;raav zJ)H_QKt9LB5g*bn#vhx{UiWT%#Xctj4Jqs3QqXYN=?7#R)~m{m1*oXd1t5ah-^D;6 z6efeuE&ri*>JsYX?_E}azf$vLzix_xl(pZ-zpg`I6m!k-l=d*ti{*jB`3mVo&x{;t z8u1KOwRZ9bi5`S>V@i?z?3*+S(sKZ*gVFX7>6f{~3gqt&*a)CiKnEji5I}NpC&QQf2gACNsl&HKTZzco7_r7d z8X=Yq{x8k=FKO}r)peuoQ^EiAuq^hpp`+D-ILUxuu#n>XAfMR{;4PbtMGs9!;O!>TCP&*8<2-wMXvwo zu0qgz|6LA-BT(?3Gt`9@9$3b7t zi3qX64Xkm(L#x^hV&_&U=X?3p3>ADD8=?!JV|V`Eg}DE*^CZ<$`snVtboq*ZjN8+7 zt?+j3JA;-1J;uMbg3(5BhdM;XVj_I7nNtZ72?cK4Pr4We`{QQhU`5ZpIvL9LD=+F# zT|!$rN%o&F!uXFW*3xH+MZ{Fzzg%}Vwu||e$zfhHAl+iS$6_0LyJjZim_%u!`7ard z`0?`9s!@DSo&8Lu3YsPc2q^l&vrY>#^7h<@#&Z9vm6MkpAPwHoIi*VRrTuzt)6&TN z&d@dL+~qWoAu6?Km*T&qKEMn~9kCvSBy4*M@HW2EPJd0mdSTEssBvP)VzHd5ke+xh z9l;eEGvq0LHvC&0(VH-fhrtqQ%$`K(L0n5&h;-bF7FGl|tcDI~X*S>nNka^%NOxC? zirk>M&NjZqHUW7ubjNs_VD6BKYSuCS%Fxiy?Nh-j_{N!E9vkUBw>}iVOTym~dy>^dtig ztK=juF9|zZ>r1?u9}#8x%^!rV7+6818AVGe{k4SIdUy7?G@c|+wF4UDQ<8{DxpI4A zmP_8TKl$SH54%bMpz8iOx3E#jDg6p|7z};4EgTRQy(Jw)q=E?-O4pHcnw12x0?mRi zt%FToM2~7fjRV&z47p)bl0lg8gz=JXTKCz~XROt^K_wmS5pn~xQDdF~_62n*L!pb2 zOG_I>2|w1n`cl~nmlkk?H@FU9d_n)YCc-zE-^k$0FL#TyjMdaV$ieeD_ z-85yQIDW2&kC(^=PqF|zz~Y#zxFH-McMIVbr-jucDmMGuO(!t|sU(8+Wx>*>{oy%J zv-mKZG03zWL;(}7-mNL4HvhO)xC_s;#McRgyd4|w)o$wyWk2dRuA9-KB#Kh06d=!~ zXIe2JNMH90BzmQfpo~bZyDH3{N5*ZnAHo=NV@B+c5Lp<0-g z3`wyoKO}<R=AbLQ?~lPO zMhlixefYIA@8ia@^gw-u02>}Lv|<{W~=U``sr z2{g+tiAYxC(RGo*h~@a$%bzP-aV|8y)W5b_2g$zcFD$yYW9hHA%}u#cXL?V9F6m_G zX6-7??jW{Z@oJ#pPL(1Oq0x}srB72bn?rY+QpWxzp$hjXeAuOw3D1PBq!X^mvC2`QSnV zmrHu6vLz;pHedmMlDxOxpaBu3y*6!2k1sbF@jRU4mE)16bt1}iXDbSk_IvC8i6l`N z)qcw*EmV0&;$ofV@ke%hNz^rcxvNECDwF~fo+-d8oU7A;TW|@2-J`ut+JQ(H+g)H$3>vKHML(x`C z8Z5U(vMS{Tf(7A7$WcR9R<=0g=zee)UDQcdoSz+Nnh0237DcGU^viDYUbI6mhPd`n z=eemUr>Fn}*Hg20t7LXh!}qFdhx7}~E zylzmKgSE8CyYLQfg-Ex#r3jRW=$p?8DtUi}5+ERal$k_dMK~fZ8wg=$1`sPuc$|y* z{qTqRk8uAxj(^G8MnYefDv7P*`5LS*pX7JlOC^Th(D<@nUswEW>?GfePjy`WM^NmJ=?V3;cC0V%W**g?Fr-PPYstVoOw$CDR1Em%mbFjIq= zJh-3tIpy1k;MQ*WvAVI+FmH$C2SfiN)g%A|?)9V z^ce<|cCONj7tQ+hk<87C<)Y(9bNewSbx>&Y?w5$zt4Xu?V#cz)LSBD%#p=p3p*HQR z^lvd9y23t4ot#E=&gB^&AeB!B(d(?*Sl#+2L6{ML%pqpFuB!uY90LI7^F#QJghH&e zkUqiD`;(O;r#*IyhHx4Bzv&&>S%)p*z7f1Y6b-D7Y?sZ-ef&PD{=xNH^+VgCz0u>V z^oBO2d(2-nx0;f)Yk<{EM<-FMlq5`hApLBo@HJn#NC9U3(aLJmAs+1h!Weskt|i3O z-kL!bBx$_fGJ+YQ%x|VVKfd!~qqW+;uO>3R|MNm%S8Jzj;K(+&Bk}6i*EiQ@AVkEU zVlI7K)peCF@ywM3RPxHV+(sXjZnq&qeU^E5zj&WYPpRZtFoddKo5d)q<`A5uG5C3| z;pu@9S5{bS;7T?u{`*GldYUuj7ZD;y6CJlg0n;w}l{#`ci9uJW!hV6PncYfuz?vdj zqR*%Ms*ga@$$n@2VDRYK;glc^Jg<$NWm~g?5TwaQhHK^gexNToLDJZ5?9*hseFPaI zFG)FQ>t7&q;t1jOY(7c12OD)tClN~0{XNb9^TbcZOLUZflS10nN+mMD&>43&9+wyw zJy7c(wG)1lz$IDTSn0dT0xJvIs7{#MUZaD|dU^K0V`c{!lvjV+X zj5CVtWs#+klM$EBGPa2x3J_)f_aeB(V&9BQURWX&+?XNmQ1T1y$2Z0qxht6R_!|Na zlwIF!58p&e(7M*>Q}Gb3H;(UbZ(i{CyT`4lbjy+4n|x_055{rBfsZGy=LK&d4pTlp zXx0z|%J>kLd3t()FJ@?QPXz%#q^8-c&EF}dH0RzU&~~%xXP%bhd~ZIbzZs&4$mkf$ z9DHt|Ez~W?1G%Sn)IxXqk~jaLgZ8my`1xKgc$(51>UdWf;_2z!V5|S)h4wJ(K=*d`VuGMCSKI*yx<4t;+Gqz42iLUWyCr-oukh`}#C6C0|GyCd5VZs{`!nNCKD8rqfoo)8>6k+eIl;K-e%+ z(6@nUxG)zE)aB7q{tV=E4>i)8_J}>1#q!F|XXue{t9Tg~&eXfwD*Xm;)|W-##fFO< z=$xVmPBbd=wShtWEDQw4UCKt(vnDKSu{KWuYVcvT{;fr<($#%;^x0^zzwF{_?f8(` zGGQ3v1?gK;Rt%^QC_bsGCx*Efz3U|xbhK{L)~9s>Ckh#GA3IM{tN%Q|Tsc16l2N}j zU83)?U7`BbP(aT&aHvO(8g{CP3;|<$`H*&W-MVX;z_#) zU&1-k;-T7&$dLqhtt^2^w8`w(nxeJ6duaKU^)d?3Y1L z5ibQ-oEAdT!L5JuLdQg~PQ`#nab{&i?rp;j4l$7^?CIlt_4nAr0$+RmdnNH)wR+{~ zQYut=VjCz5!nC`fTu&UJ4J?NHu5*!%8m?zVdn8=8aShK`s`>Z~_QiJ3&MoJBqsT^Z z8@V~TJ%$Bhk+|X2#_&_KT98z*E?sO`JvJ`JqLIlB1sIK;vMaU_yTODj%+8Kf^v!=I`-=Kf&p+Pz&3F}FX-3=AUI!smk1rHrm7$F(jt@BL#}Tqf{}@|CROVe9_;_0aF{V*5jo7JzU;Xb#FJ-#8?@i z>(9)!Ug7+ay{0^;i51L>|8R(aJ`o8Gl}gKZ`dwC6ij|sso6!N0@)!Q&!#?3?;wTcM z4=%H02RBO~x>$1OdW0b*A5cNuPR=~J$k2RcD|d=wh#&bbo1)ddq$+gSdfc-=kAU^T`}GQ1v^P<8kj~%WLmR zk*E)Y2V~e`ET(xbzCuxEC(Z?&n#xy6A?;ZgwchGc?=+gXT`6($1+t}stw?0k3un-U zCQV%eOoY9TCJFaVIpoY@M~^?ylh#@Pi7NDMJ$#N|{?27Sdd{r@kE=DD6r97zD{$R$ zbtNa`bv5uR0PRjq{7jDY(Mi`4+nWXV(dy>eU_{QmD8G*=6>;JpGLpn z$Ev@2dW&}SJg?2%{Qi!xr+$nkqKJO$dCnKCoD!~5r`d4}2@7%l5{^Css6{9wG{(j0 zz1^H4zY7v&Tvne3YG&`G{4T57W*ofj6f+wY_V}cyWl|uPTA%De_+E(z6)<+eCJE<` zN_i%Z;)?^`rEfw&EK-o*=c@1i^JAVIM${*XuwA+35!Zr9G$Z{TiK)4<^7;q%?wkt8 zjM%_@yRvG!2-%<)PKxPdy`|1{g=bNBbZ&Xqox5&MR)Y`U)fg4Sm>B}4GbVXjf4gA@iTa_{bBU|fTuC-J)$eZhn;qg^ zc)Hg27~uexAG(axDrv!RUsv_D&>p*y^clYPRqM$Cao7k~{QHI?8Ycr;M%E1Su}--_ zARs~GEdNEU1{D&3_a<+b>W~}zyzWkBL>i*eJYDm+9|V`h40;Tz=QXWxy~gMDUPA#C z4K{yUkRcr+L0)br>A}D5TECKmFa!io{BW#C1Jns=%h&7uf31EpM!WwZ$&wVXk^dVv z1ZtdwYvZqhgoXBV=UTd7Yk~E>13U!b#l86L;os&aVu*o-2lU#-Z}$&-{FdKkxevrSyRw(iDI=AwAeJ;k@)Kha?MBU*H5mr*i&R#cD_?Y0+yk_>Uv$<1r=k1RWzX0&gdZ4r`zsA>tP#FzzlN9N(65SVvdO4I<#aO!vcPEE>hV6u4 zEC6MQ1XbSjzR9^u&Xz=A+smk-BdDAiY&71_JE-tLw+ou>JwY5*wa1a)v!TlK&6W`c zQRyEx7V67D*b*H|?1g(xt&2?!S@4t`4QMc%6ZS&N%aG;tf`k7!q_|Zgfh_EYSPg?j zP2TT*kaPB+gKDUA=xdns{L&g6J7Xd-UhcLGEAn^_2~CjFDn(Mu9bb~6wV3zrkgv&6 z7eZ_ausgnIp!n32!Lo!x(0=tMIA5Q;yvq{d(w@MLZ;Em@ye(YQ|9o1$F^&TH_CO=g zys)CtO!NKt_v170su9^V2}B{G_-jkD1D%~<`POz75*7YJs`^;269G1nIIFLN!fa>gFVBAWT5&N z0QzDrA|4^&KI+o6+(&y53TXbE>G0~HaR8dizhzDV(a_QL|E%D<93RDQHN&(fjN&*S z_Dfq zKtK%mh@Q-jnWjnDGe|u_;V2FwWV#jeHlN!lj14h*K5LX%tYJ#fJKn#pdsylN|NGRz zzhhyJU;BBvF!OwCT8STX9+~u4UJWJZ(EMPVJFp4vA^;IQzZ52nh+J0!a^G%r;KNn~ zpYOQ_0>j|!G}B7j!>|Cf?!YuQEI{2lRYeR!FnF0JUOk%GCMf&l;mT6F^F|E~L|`Sq zyhNly{X`r|0&e1Eo#IhpY<{dvtWll++fqvsO62}16eb1V3u7@&ZcrO}K@e?}9h4c) zSAKY=%$=2HfY+y2J@(B=WgaJtZ%p_F!`G!wxfkEVHVTTz2-*Isy`9Pb#R6nE zn4&{+12(2pLgcc%YVG$V&q&2#wQntQ4i=P$+)Q$4p$Cd0?@0PhiYkep@Su3kF{|{? z#c&I=p@GJeBn;CuC@?)DOh9FF{4ne$jhru{cY50Cty9mDd~vdxsXE^qXt+=y z8VknEx_uWK#KRY>yQA?(_xzv&kv}rj#0DAiM{ke_1?zboV))gX^{g-e&C$oVIZDT+ zFS>5iK)+F87cH;rs&V?JFv{v!@gP^syci#kM)TQ4QGh+ND3-inogIp2ED+}IjO4v%1B*Iq~j?T~k$?ayHEkii&P^ zqkx#J0_qAqrak*u@gT_<*BeH8z`m~XQAoJbUtCGaPZ1Sfzo3c^BobjfnAh+s9MzMB zN|o_S5w~w8o{fP7P~fq>KHsJ#HWal@sUYE$Dm<18PFCM8swAh54+$V?2M%vlmEK6B zMhr$8J(lj4ITdzFNrt{pH2XR!ZH>!z0G|Ak7!WzsXY06Jve+UAy53Zj6{*sc31|OyLILJPxN9ud0;FFIbg|dqq|uaWZGKPJL*XH9PH3H5 zA4ioJ&A@uwso zK&QRRiwrtOMaCRE7&pw&M&EOWBiR`oWvwe~iJ%7z`gR|djM^2+6D+8Gt@s$;#2O$T zbk`ET@nHL9|i~?XB8HK5}kq2(*u#7ikGgvH>ZB#GA`rhI}R1Gy%_pUz} z#u5)|7T;@iVENmo>bdkniuOPlU zw9I@rO7xh9CT8aWS>G%$-`(gFi!rP26?Bw#d4=YO+_$ieR{_1{;RGCCf$-_IhI#6$ z{BNq>Z;}gSVCM_!wrId1r8p?RLVXd}z!pzp!PQc%Tc&*_c^8!mwu+YdGu6VJ3IXn8 z(l~3m!pDUl;=cr~gfGd@CYR!bzwr+LvF9Q}zx@I$Apd8JnnUi70&a#9$G~Dur_z@& zE@;YPkDHx=i&}03e`~T`rha^sYUQh>ZA{=^HHXr;+6M9_UC>ogi>jjj0}5KYD{8?^hHtn8TbvnFrr<;O=kIjD zD-{$T;f{I2jf}JeZFtR|5ovXE)j}ig5OR zcCu$R9qO_jj~zcyc}c{h@JLZ3<_g-A#%~2us6Hz)NW4(u!Uo1osp9NLCS788Sg%P# z+KCkrVt0RXN9xeH_`oB$tA2YmoBiQ$0$!{JNaJ8ruqsl4hK9c#R3&>!9n+LF-UYCc zU(b7LIINZK+^i(O~MQ zG~iSEqm{R%2VKAV6hrj!ShMME0(#$lmE9~RcMYI;u9cF~Kj48YZ*D*Gsy~3+pt4Gz zh;J|f6KF}R3X+#Yb)f$VSiDK9M3O&7LJkN{OJUcPP00_GCU*M*W#{+4?X~&Z`@Wn! z#P^zt8P<$*>k8j;QR8PX?sIIZ@di;}JMfC#Y^D4&{^exWywabb;kM$c%B{nh`y|I( zOo#@{q^1ah>i0ZfkAXe-q3ki|D;>1Pkv?e$d^_WM)Am!!$@^XBbT?hg_td@qjQzhA zL|NC!(AV}lv06C=SlgsJ0TOC0v)l`*b`e z#)P_Ajre$wkMm;5z?b>=<1yX&SKASG1=u09(n1hrcSPNSy&<)!rSVILkYyL!?H-Bi zR%x(=FMc9|qspAq-gt8@(J}LLWWRV7sL%(J_KNb542S`w36&i$WC|a;#NB6k2$Kog z?1yMP3F1aXtC1@Pt5yeJMHNmIH44;W{G|2kptFhJJIP_em zvCYLHM-2MrrauGqq?^gIZ9#8RR;0gHd?61p_0MjStjFQB$TKow|MTYZK=)ge#Y-^a zlr}<1pn|*?wV#XvJKim_HZXKyZan#cuK@_{4_WxCUX(v0z@MWxR+Af*I1|8TOfR(& zVL%9V#w*QzOViw-(LsTAK@%n1)p@EKM|Gar{-A_BKU!~f(IfVPxD{8&JU7^BKjeP# zEeNTT04lC(NQjEn&~#`*1xZWfdX9Trj0+DpQH|67QSoOvu5cDQmgNAom_&FiN43~@ zhtgx?zRJEtq7u)|!hO0u`0NsMR>O1!c}(0G((8aF2oaSN(-r~xKC?V>h*fKjX{GbM z*wVun{+o_?OGBGYV8X+?lOKIPIwM&>_l-T`)*(fzTI@$LCoQ^R(hvL`%$>q_e3V<~)yDieW~SpA-Ro(UON!k1qO zEV{zqaEa{I#&p~0@E?c~wkZ1il#--M9BscC)H;+2&nT%j^-g#v0tkOs(P54(w-nkX z4U*ZC8kg!usXZkO{xLMY#9-+|BN!01k_(!SB7hdN*y$(41W0>#+Ei4?c|l&A>|4$e zh~BNMPy#zN|6D?OI>?C)lzd~?Px(ldtneGhyMI=rN%{4u0DwXXc+oF^Qb#PyU8XoS)J&m%^QX0coNAovK8WJ-Uj2Q?fO< zK6R)MT6ARh03~Agajd{p?D3{^Rli=}OY6EFtGUCM2ISR*Lv6T>mm*(rd6pkkd%q0% zm5ZNIY+K9{Xks7B87igs<)&Zys9?aVg{u|L?|%QqgABRWr)d({VFU8+d*i9%+#+c! zz2;4(SZ6cU!Z3sO-9BzDdurH)4S07<6e*i+!@pin_x{=hTw<2YHlIB>)gF$heEa2t zmb@_m=`=dbrHQJ_x9R5L(W6$<$=&b3E}CS%`A8$FC71Y;BiwOR1NJ~x&u4#(4)gf) z9WtcPyf&-hm#qVoY4RN?vo-RWuxjw^)trreOm92R5+!YwEE^S*& z)wUa@BDd-Y8QB$wQB?HT;R2hU8riQKaAvLKe`!PR6gy8nxAeh}-<>C3P69Oy8aaa>?sW(qZBh96RfBLC4)gZ}oh-_Ji^vO06&LA*^IrcIwv zO0CVFsiAD8BAD5v9=P$HP+qHG-e;LV<*FH)d`(mGO1_EQed$7GuPpM-SdI@-m>bz+ z8n11#OUna-!*g+Rd2LGwvjdZ20?V8o2G<^KqJbMj4a}U2G`e{;f%%%;JSNyH*sbno zgLM+RMJVzgl!_edy}jKa+?hmN?k1W8_Kj3kQMDY<7waZ4lMY9rWyW`p%^i|wgT0F` zQ(R;tT4jaqsma>CM|zkw0Bf~ZQPb<$2V;;*@>J<%N}i?GfjtkV5h#wiTC?Gm&XW0U zqY|g__3Op-;5SqsfSSTEP`8EF($wFZ{=a_&$j1My$+%e*7amqmS@?VPnZ2x0uGw5n zuv5zpn@XlF+bUX;*wmR>Hf!^i^Ng0hq`Z1*Kc*D-^2F&6 z)b3jQFLSM1v2~`>s>6k%@4j{1c#C}FO*b03g2=D{nR4CMrEX~HPh7j^`@8a%GnejD ztQl{I?cYT$q89s?duTB0`KFJi*elHW{@1ARO$l9d?b+u>Z$%?X+GK(zWLn>{CS$}# z+1)CiGG=hVGRmOBul4r%^3JLEyxcnLq+!W~FrWK);ao|S6N;s{vq8i!Jcz@NLT%&>@6mjUQML7$12(8f=vV+GmDTIKKoiY&`Y@l?s<2?0x)Ck5#L1}o{!3q6 z`-K+8O}4GpJ71%haNOrcCmpl*x6k2x**>SQQr?tNA!j&qIq7AL`Aq~&EGZv`x%wku z)fQ-v^U_!afe0HC4iR^^3VeRJO2 zzV{u^VNOGF&8oAnbf*GyL_xY$@EPH{Z$^Wan3)0bb^F!nrCZa}`(wR!u&zA_Wc-TdP zoHYUnzVJ%E^5w#irW`{0krT9a8}hDN31f>Hf$}okzI?|pYj^k!fdcf2@=UXD;7Ybx zzM5}hiT#JM{{QpU*&&8pRx~vk#EKno0w}Sy|XsCevSAbwUaw`6e7ge7#-&seB%%snop1hH zb)w>|XW?p5Ouy+l`}CoFkNiclT=j!GC(*jadmk+^2agL?8Ua6);WJZRj-o^V4Hx&m zq1}tI8pj$AU6&Lp-gno1O8h@)BDMUKlTJrni!?vF3+rVxFYggFU+%?GAe8>)&uu8R zr{**=i#@ac&L#eO25UG(jROf;g{>(NwPb`HZMwLZya3iKjh86qcx+%A_szOqfe9{t zJ+BT$CQoj#qW8@+>u_V9N=shtNsVhI5IuzMwl`|lP#7N_jJiav3oiN8JlVF4ZS{$0 z8{QuFeL+HcJA=xGVXZk8FHCMnwv7r$m4V^iTfraKs^^y}_(X2~8vMCB2q4u=| zHEESw*#r^8;;zm6g$wzoU8EeEFPQ<$Z+7lHJU~#Z=FPd6$F3Zu_Ir zv5hymT+{0V*TUayWZ0KnQC)NxO=@-7r4LVH_Bel1P;cmMxhvd`tj*lXC}5M|?FCVL zbH@L85dqv4)`*IZK{ndFXEoLvv0%?O0S1}g`n(I2pbt(yL_q0Pv=u)4gD{BF<_i_q z!&m3UyZPm?$PMp##G}!!tr8_yo2Jl{Ma-t-V^dJr27Y5WBbQ~=bV(<}TrmPao>e;8 zT+*06_bxq$-^95hZN?=7`>uKTdtr|V=~2SW-ZjJSE@~pf|7-!3BXZptB$!V5_=@IN zN)k@ab}cPkwn=j5KM!Q4PCkkEm-Y!zWYJ!V+oyVqsNJuR4D6@SW%l0W(7tctYI!Z4 z-Lygz2);dWvuV>Fp|5j4jWwDB7-upMAkfJuDO*2|pZt!TBR$?EP3_sM@Hou^ZR#jL z+NgGm{oCU3*g1V+Ir?VYfO?VtRy*TPIhCVqT^5fVnf?z|i~VYLh@CP(N{cHirV|$L zI~$5eTq^L)>dW{SVXP^4_rWl!1Z`?&*hEmi6&P~#bLaQBs%q0MO1du?d0bICa4B%qhkpJ?&hLB22eIjIqT;t ziuqBiWnf3DM$^R<$mjaCz(Jh>_;(#)M)IC`0>Kmw{qg@%X1*2UGl=AtgI0ctobh0D z$9o5D^cPn!MfA?uL)s(3V--n+tk|&Ig(@l# zEU#BxVmzVX`LE{CgOt|`{XON%T9+gFrTtp}x$$id8bDv0Z4SC*=@TM@ItI2i zKcYu05dx^Q@?ARoy-f^uicKeFKZJ#OvQj5$D=7c9wt{CgY^@_d+H6swxXP?{{2Vr4 z`ZV3eRGxWgk>pWs7BfN{B+W1vKtb`mUyROnt6}!1joeE(<60@DOZ8+)X5;XlC%u*g zZHpJ?%jfZhuSnIXR-51QSRCEDjy2Yr$0|?8c>Mlajav;HZ(=A;~K8TtD*=UN|l zdh&aG_+!<<$|&C7XF;K@&cO%NDI9nkoBDl=MM#9(bg-M0ZR3le!Q~urtR|t@AR=r~ zJ5!`4^t%SBtXh1MN7Q8Z!Ya4d)N8i$Raf#QQLO)3+9=HC63t#D`nwqJ0=w&!aZ)rE zGDHixs)U(gt#X$gn&Av|UnVMWWfqtqfAn=2>BAc$_3V{`kZyarkCheQvEI?(LM2@0|xdCLU2iu zkVHes-v8|EkhYsR;In$^LK`Kk#?;ZR+LprXCH5+a%bCLR4U%&ZMMlg2o+}Sdht|LT&u%0%EDxp% zu1blPLov12!%tb?8L}s<{tn7?t90xxv~Wz`+xlW^+pM7f>|!uc%Bv6W2-?Cs?g=5f zs=Buy6ME$%1^tE#XXLSsuUCSF2hp*M9@0w~YfFq3Y??~IHk!|!DqBVpWEJFS{wF91 za=`w=g?fEir$BT;3-N2rkDBprf;?lSy_-F7u8XVevWHo|+?xM{sD$ZS%6?zS*KD_o ze?fCg79`zR`g`n*lL|z|j>n1#YQbdC|Hy(Xsrl(6PRfg_DyY^;K|=TYI-&oD{Aj+O zy3l?+r${!##;QO=kW59bCq>7u0f$zD8RpsMiy6v8V@Rs)Je3 zCYe}eAlE&B>YOpyb zk5o{d49Bq48td1YgSKCk-7#tkIYS_Z5hdVu%P8SA`w9^AaV-^Uf}}Wyo_wm~*=8k0 z@a7`GB@u^mFC*C^0M5$VK2y0ku*v?b67xJi#6$2tIuSN3`kT4lQaneyL%P`BOj5>q zUbllB)mH}I+X+Fvale9S-_);|n>e|M!(e+F71vm@d!s*7*ti9lgLYD#hfSj^B2>xI z!++e>9pr(>_r;{Twbx8adW~ka>dt@zH1D|4{PFTiF4HVDp9+Q}u|{j2rlF8AC*%Ey zj|uy2;^-Zr8f&ZnxD^a`oJq)Wu@A9{S>eRjAz11Eu53`|koXdpI+6*Eza)O!_M1Fn zS5wrlj&XL5RteSM*wfdUD74kz^`|>OcJQtxjX;(1PL`jalrDBS=9UkGkNLn(6Xw={ z6DHYhu+hWY$JT@Apktb*^r+s&G^#IM$1sRhE-OeP7qTNJu*1R?uZPTvk)<4-r~icM z1QEq|mko>bfS9m7A=KlDjR-3rX0VmqC0ONcvSWY*_Y#YGhz9vvs$bae?B7M!q>UCo z5TAzmd5f-~!~Xf|`LCCW93_i=Z(Pb0c37@rJWWSULsP|uGRmaodfLd{8t7!+=qc(_ z$fy6^`qtrY%NVhiU-|}1_+2*3K6q^XtzCu_E94+&R>~=H=JDY`s3D@m)@{sIKtk{i zDrzk6qU_9lV!teg2oS$FxLev`4Ww4VfCX zeQPB8F>^laA*=fr9}lC*<0tJe@ySo*8>9^MV8{Xpw*3DYUxpQXD zojG^r?7g$JiwJ?7==|BErMMWzmG|Zw%M4<;AbKp$b@|vyhGBV(UgdZ=9n`F*i)nXC zu8x`KA$OT~(t*!Ixs}L-+1Z<`OZ_!QM1?E2sZ0`oK$XNv!PEjwLKg{^ISUpTNKzNBa=drM0e%$Pb&n&}0GOuIE5B&Bf$6!H zcV`Y5xVxFg5hEwActFD>A73(2>x#$gn@`AG0_}B2t<_+fnjyUyllh6{LjElZxjCcR z2foT-mpM59TCMgO#K`1{HXtpXV}?*70`pic2ax3lBm@%IH0QN?S{y zIr7=$?M&hPZ>Q1OE_1%P(O){miGW(PVdf7UE#IhL4{LQEZTxR7fDw2)Ajind(A~p^ zAfGA_HI8Q{n2Ea9D@S82e0ug?a;K0gXG619%W5E_E#)%Te8Li z>MlJx^mIig-}qx+fSkLyHJj}1SXQ^VDh?OqXlwh!Uq9uT;)*u;!K70zPG)hskidl) z@nmgY*X~yjZytr`ubfU~0?1i~AE8s?S=QIyq z`up5(_J;QDCw|*DdLU|MRGfM`;;wD0y0NeqtCX*#L0A*8#+jz&C6&F~`29!-RvduJ zLa{1r?-V2NcN{nr2A1KE*c%HGgBWwoK8csgtxAO*aUkg_gYPoe(}QnUocA4viNu*{ z%ZKO#PPPT8$ONUKl?~dlOQp98676c`R%+>Kpk$V?8x@&R@YI^ zp>u&CS%khV(Kk7r7&LBtpHiZ0-P4!9B#y}9>kuNS<3neaJmKdu#DTkYksm2`S1>`* z>khM}$B0}+sXwPW2JwL$O3$oC9mUzPT?C=E@3q6Z9AR0xsgcZ4w zHy0fxF$<9a4@F8{sO`I7&Jy)yUpFcN3CDtXd4*(MwZ<2bMiEFu`vz}VAr=zM)d4!3 ze4AzjLIACmqByl8GCX6rNXI{X_=PMHzF#YKy2|@w36q*(% z!#oA&F=l|;5ZTD6>wW=b4Ej*`?kHVx06M`z>pOJd6SY#(Fu=WqVm4l%w!w~TdC!Ws zUldQ&z5busQbKB2#gY3Ln0+i-wG(iegEBHYpF^k(qd#L(O~H^wwV0n4~R z{9AuApQwU&7d!ve_A3L*wD`e0XHgx%a8&$))5;Wb2j$M`j1wJ_5uXV=;(Q@hMxSR< zBv82l)4ZZC0_;JK0?cVfhynNL>$2zAUj~61g*tSgOGZqu5~7e zPM-8wke*%f=P(5Ad`eNVV-MKEi_8Gg!V8!2rYfS?OhzQl8{0*G9if%3YbS)g;U2|2lp-71wS`Y$SNaP6+p!~C` z_AWc@e@7?3{3|REr8$!__Voi%a!3oFI^DV%dV=De(uB}$AhaC>IJQX zR3bp(N+<2ZL9*QcbwSDA*gH{oj#%J#4gX|<7TGop3_u6~-JnL^?K29&avlq^Z0#*`>6*f%3T#G#W~^gVoQ0Z_@IDZOj%wq(tz!*F7hbTu&KTpC9A zfZt)}gcS{M;tTb1(+U^p0aNNv{g&n2Uvt{SKq~tCUASr&MG{yEe9VmV`rj?wi@!!I z>bwaCX3bE26TcjkCEU-(6r4?Cu`4zos@m}3bROYp$#~^ln%C41 z6&kElOVg4}9)&@Re1vjY_Z_{3+b&o9ZnHceWa&M|f+$K3Cx~p=>f*I1+c=I(S7hLKi<5HG=Xl+Q8e9pDClfzrQ82r_mPjwz!pl zuO9QcKXclzOk1%W!XqlHe z1DGUbsU;vz>9he@LNEN!H0)fE@uM{)LLLzSYs8AQ>_a`_EZk#pJ~Cg9^YUc0-R*?9 zt*ox)qd~n;Ax6NsH#qwINgw2t;4LQ-ae||jGeMPDY!>E&gKq36@*+_xR7Ls-fDn`S zDw7-Zl4|&{*1+_*df)7k`u3OUz&>Z+BJ7q1=W?de*LND>DFC^!Vm|LPE0w+pS>jrcG+sl2Y6%Ai@LQ{$litx}w3@w0y5)j7{=oNN zsqvg}3#<9s~tz@CLM4|TqT z@$|$4?T|soU-!(JQ^D|cNkYFq$*L|IfTSG~qrMLBug!-MPPv=rHmCQ|@ec6g2cy6r zdWh+HrWDV>;C*j&;l}46qeV|+d?bQ$bCC5V2vAKuOC0)@`nt9@e2b{=04KN4NOeXw z-|wv(VR4d7mHmMs(*_7L1@{L%ys<_25~mLrLpASLt1h!i*uKz;7O^ady6Au1K0Zi| zRI@#-02p*Gc_2j3VT@Br7*f{=lTWM4Nb(whWBO>!pKk*om9Ez{ zIOy-6=Z6GqEb+kmMK|Q2e9NYI6l~xgFCNPA8?S{0=?mh=k15Z4F2&7xa*nF64+e38 zJMO)3m-{Y!j;)bA*(1TsIzn%Sb2PW6~ zf21V}BXFTrBK#Fa{Zp2VVN6V25l^eJ_7ja^NlgN7@ze7-lhLnNTqAH2p#UaaK4i=4 z5wac9vK{4b4IdleeWeSnL%0br^l%OMvBe2VwucEjaOUp!j~U2SYs9�smaIsoI)3 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 HedGSW=zn+i literal 0 HcmV?d00001 diff --git a/apps/web/public/pools-sitemap.xml b/apps/web/public/pools-sitemap.xml index 08339144e0f..03d6f39b07c 100644 --- a/apps/web/public/pools-sitemap.xml +++ b/apps/web/public/pools-sitemap.xml @@ -13130,4 +13130,24 @@ 2025-10-17T22:04:33.647Z 0.8 + + https://app.uniswap.org/explore/pools/ethereum/0xa3ccaf08a54cf31649f91ae1570a0720c8d4eb1e + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/pools/arbitrum/0xd13040d4fe917ee704158cfcb3338dcd2838b245 + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/pools/bnb/0x75c5fbf77c1cd517544487aca4cc41e1ad95aced + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/pools/bnb/0x8c5a402ede3a33998604c8ba5fe6510896cb3821 + 2025-10-24T19:06:27.459Z + 0.8 + \ No newline at end of file diff --git a/apps/web/public/tokens-sitemap.xml b/apps/web/public/tokens-sitemap.xml index a865ac527e2..cc16efb4f28 100644 --- a/apps/web/public/tokens-sitemap.xml +++ b/apps/web/public/tokens-sitemap.xml @@ -11115,4 +11115,94 @@ 2025-10-17T22:04:33.647Z 0.8 + + https://app.uniswap.org/explore/tokens/solana/METvsvVRapdj9cFLzq4Tr43xK4tAjQfwX76z3n6mWQL + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/Dfh5DzRgSvvCFDoYc2ciTkMrbDfRKybA4SoFbPmApump + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/base/0x815269d17c10f0f3df7249370e0c1b9efe781aa8 + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/SarosY6Vscao718M4A778z4CGtvcwcGef5M9MEH1LGL + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/base/0x93d6afa0e6f11f4f7e9521ec6243f839526af7a6 + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/bnb/0x4c9027e10c5271efca82379d3123917ae3f2374e + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/USDSwr9ApdHk5bvJKMjzff41FfuX8bSxdKcR81vTwcA + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/SW1TCHLmRGTfW5xZknqQdpdarB8PD95sJYWpNp9TbFx + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/3wPQhXYqy861Nhoc4bahtpf7G3e89XCLfZ67ptEfZUSA + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/base/0xdcaa5e062b2be18e52ea6ed7ba232538621ddc10 + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/METAwkXcqyXKy1AtsSgJ8JiUHwGCafnZL38n3vYmeta + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/6nR8wBnfsmXfcdDr1hovJKjvFQxNSidN6XFyfAFZpump + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/AjPzK6Sf1G27jFkFe4HViSNqMxa3JLE4D1fm6Pzouq2q + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/bnb/0x0a8d6c86e1bce73fe4d0bd531e1a567306836ea5 + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/pSo1f9nQXWgXibFtKf7NWYxb5enAM4qfP6UJSiXRQfL + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/ethereum/0xf245964bd0a73128e10c4f7c96d0664ea2e436d8 + 2025-10-24T19:06:27.459Z + 0.8 + \ No newline at end of file diff --git a/apps/web/src/appGraphql/data/util.tsx b/apps/web/src/appGraphql/data/util.tsx index 18e459e39c1..a7ffb3e9d86 100644 --- a/apps/web/src/appGraphql/data/util.tsx +++ b/apps/web/src/appGraphql/data/util.tsx @@ -189,6 +189,12 @@ const PROTOCOL_META: { [source in GraphQLApi.PriceSource]: ProtocolMeta } = { color: '$chain_137', gradient: { start: 'rgba(96, 123, 238, 0.20)', end: 'rgba(55, 70, 136, 0.00)' }, }, + [GraphQLApi.PriceSource.External]: { + // TODO (LP-350): Remove this since this protocol chart does not exist anymore + name: 'external', + color: '$neutral1', + gradient: { start: 'rgba(252, 116, 254, 0.20)', end: 'rgba(252, 116, 254, 0.00)' }, + }, /* [GraphQLApi.PriceSource.UniswapX]: { name: 'UniswapX', color: purple } */ } diff --git a/apps/web/src/assets/images/portfolio-page-promo/dark.svg b/apps/web/src/assets/images/portfolio-page-promo/dark.svg new file mode 100644 index 00000000000..1ae6e3cb76e --- /dev/null +++ b/apps/web/src/assets/images/portfolio-page-promo/dark.svg @@ -0,0 +1,778 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/src/assets/images/portfolio-page-promo/light.svg b/apps/web/src/assets/images/portfolio-page-promo/light.svg new file mode 100644 index 00000000000..8e9c0579fe4 --- /dev/null +++ b/apps/web/src/assets/images/portfolio-page-promo/light.svg @@ -0,0 +1,778 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/src/assets/svg/Emblem/A.svg b/apps/web/src/assets/svg/Emblem/A.svg new file mode 100644 index 00000000000..46c5ecdf931 --- /dev/null +++ b/apps/web/src/assets/svg/Emblem/A.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/web/src/assets/svg/Emblem/B.svg b/apps/web/src/assets/svg/Emblem/B.svg new file mode 100644 index 00000000000..9ba0cad2077 --- /dev/null +++ b/apps/web/src/assets/svg/Emblem/B.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/assets/svg/Emblem/C.svg b/apps/web/src/assets/svg/Emblem/C.svg new file mode 100644 index 00000000000..df525ee3977 --- /dev/null +++ b/apps/web/src/assets/svg/Emblem/C.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/apps/web/src/assets/svg/Emblem/D.svg b/apps/web/src/assets/svg/Emblem/D.svg new file mode 100644 index 00000000000..6673c60e7b6 --- /dev/null +++ b/apps/web/src/assets/svg/Emblem/D.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/web/src/assets/svg/Emblem/E.svg b/apps/web/src/assets/svg/Emblem/E.svg new file mode 100644 index 00000000000..f1d262aa1fd --- /dev/null +++ b/apps/web/src/assets/svg/Emblem/E.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/assets/svg/Emblem/F.svg b/apps/web/src/assets/svg/Emblem/F.svg new file mode 100644 index 00000000000..f7f9944dbfa --- /dev/null +++ b/apps/web/src/assets/svg/Emblem/F.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/assets/svg/Emblem/G.svg b/apps/web/src/assets/svg/Emblem/G.svg new file mode 100644 index 00000000000..44e41f65357 --- /dev/null +++ b/apps/web/src/assets/svg/Emblem/G.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/assets/svg/Emblem/default.svg b/apps/web/src/assets/svg/Emblem/default.svg new file mode 100644 index 00000000000..1839d363511 --- /dev/null +++ b/apps/web/src/assets/svg/Emblem/default.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/components/AccountDrawer/AuthenticatedHeader.tsx b/apps/web/src/components/AccountDrawer/AuthenticatedHeader.tsx index 638bf5898ad..72bdd2ef2ee 100644 --- a/apps/web/src/components/AccountDrawer/AuthenticatedHeader.tsx +++ b/apps/web/src/components/AccountDrawer/AuthenticatedHeader.tsx @@ -1,5 +1,6 @@ import { NetworkStatus } from '@apollo/client' import { CurrencyAmount, Token } from '@uniswap/sdk-core' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { MultiBlockchainAddressDisplay } from 'components/AccountDetails/MultiBlockchainAddressDisplay' import { ActionTile } from 'components/AccountDrawer/ActionTile' import { DisconnectButton } from 'components/AccountDrawer/DisconnectButton' @@ -38,8 +39,6 @@ import { UniverseChainId } from 'uniswap/src/features/chains/types' import { usePortfolioTotalValue } from 'uniswap/src/features/dataApi/balances/balancesRest' import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' import { useAppFiatCurrency, useAppFiatCurrencyInfo } from 'uniswap/src/features/fiatCurrency/hooks' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { useHasAccountMismatchOnAnyChain } from 'uniswap/src/features/smartWallet/mismatch/hooks' diff --git a/apps/web/src/components/AccountDrawer/DisconnectButton.tsx b/apps/web/src/components/AccountDrawer/DisconnectButton.tsx index 4cd815d1f91..0e23c16c916 100644 --- a/apps/web/src/components/AccountDrawer/DisconnectButton.tsx +++ b/apps/web/src/components/AccountDrawer/DisconnectButton.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' import { MenuStateVariant, useSetMenu } from 'components/AccountDrawer/menuState' import { Power } from 'components/Icons/Power' @@ -14,8 +15,6 @@ import { PlusCircle } from 'ui/src/components/icons/PlusCircle' import { SwitchArrows } from 'ui/src/components/icons/SwitchArrows' import { AppTFunction } from 'ui/src/i18n/types' import { CONNECTION_PROVIDER_IDS } from 'uniswap/src/constants/web3' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { setIsTestnetModeEnabled } from 'uniswap/src/features/settings/slice' import { ElementName } from 'uniswap/src/features/telemetry/constants' diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.anvil.e2e.test.ts b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.anvil.e2e.test.ts index 413b3f15890..432c2f5f253 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.anvil.e2e.test.ts +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.anvil.e2e.test.ts @@ -19,6 +19,7 @@ test.describe('ActivityTab activity history', () => { }) await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) await graphql.intercept('ActivityWeb', Mocks.Account.activity_history) await page.goto(`/swap?inputCurrency=ETH&outputCurrency=${USDC_MAINNET.address}`) diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/ExtensionDeeplinks.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/ExtensionDeeplinks.tsx index f163e30df46..34d31b6c4dc 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/ExtensionDeeplinks.tsx +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/ExtensionDeeplinks.tsx @@ -1,4 +1,4 @@ -import { PositionStatus } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { PositionStatus } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { useOpenLimitOrders, usePendingActivity } from 'components/AccountDrawer/MiniPortfolio/Activity/hooks' import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' import { MenuStateVariant, useSetMenu } from 'components/AccountDrawer/menuState' diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Pools/PoolsTab.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/Pools/PoolsTab.tsx index d4bb8b966c4..5dbd6c74049 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Pools/PoolsTab.tsx +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Pools/PoolsTab.tsx @@ -1,4 +1,4 @@ -import { PositionStatus, ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { PositionStatus, ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { ExpandoRow } from 'components/AccountDrawer/MiniPortfolio/ExpandoRow' import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' import { EmptyPools } from 'components/AccountDrawer/MiniPortfolio/Pools/EmptyPools' diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/PortfolioRow.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/PortfolioRow.tsx index 7c5c73a38ee..404fd569423 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/PortfolioRow.tsx +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/PortfolioRow.tsx @@ -1,5 +1,5 @@ -import { LoadingBubble } from 'components/Tokens/loading' -import { Flex, FlexProps } from 'ui/src' +import { TextLoader } from 'components/Liquidity/Loader' +import { Circle, Flex, FlexProps, Shine } from 'ui/src' const PortfolioRowWrapper = ({ children, className, ...rest }: FlexProps) => ( - - - - - - - {shrinkRight ? ( - - ) : ( - <> - - - - )} + + + + + + + + + + + + + + + + + + + + + - + ) } -export function PortfolioSkeleton({ shrinkRight = false }: { shrinkRight?: boolean }) { +export function PortfolioSkeleton() { return ( - <> + {Array.from({ length: 5 }).map((_, i) => ( - + ))} - + ) } diff --git a/apps/web/src/components/ActivityTable/ActivityAddressCell.tsx b/apps/web/src/components/ActivityTable/ActivityAddressCell.tsx new file mode 100644 index 00000000000..b47c5acf5cd --- /dev/null +++ b/apps/web/src/components/ActivityTable/ActivityAddressCell.tsx @@ -0,0 +1,27 @@ +import { AddressWithAvatar } from 'components/ActivityTable/AddressWithAvatar' +import { buildActivityRowFragments } from 'components/ActivityTable/registry' +import { Flex } from 'ui/src' +import { ArrowRight } from 'ui/src/components/icons/ArrowRight' +import { TransactionDetails } from 'uniswap/src/features/transactions/types/transactionDetails' +import { getValidAddress } from 'uniswap/src/utils/addresses' + +interface ActivityAddressCellProps { + transaction: TransactionDetails +} + +export function ActivityAddressCell({ transaction }: ActivityAddressCellProps) { + const { counterparty } = buildActivityRowFragments(transaction) + + // Use counterparty from adapter if available, otherwise fall back to from address + const rawAddress = counterparty ?? transaction.from + const otherPartyAddress = rawAddress ? getValidAddress({ address: rawAddress, chainId: transaction.chainId }) : null + + return ( + + {otherPartyAddress && } + + + + + ) +} diff --git a/apps/web/src/components/ActivityTable/ActivityAmountCell.tsx b/apps/web/src/components/ActivityTable/ActivityAmountCell.tsx new file mode 100644 index 00000000000..b3cddbac36b --- /dev/null +++ b/apps/web/src/components/ActivityTable/ActivityAmountCell.tsx @@ -0,0 +1,255 @@ +import { buildActivityRowFragments } from 'components/ActivityTable/registry' +import { TokenAmountDisplay } from 'components/ActivityTable/TokenAmountDisplay' +import { useTranslation } from 'react-i18next' +import { Flex, Text } from 'ui/src' +import { ArrowRight } from 'ui/src/components/icons/ArrowRight' +import { useFormattedCurrencyAmountAndUSDValue } from 'uniswap/src/components/activity/hooks/useFormattedCurrencyAmountAndUSDValue' +import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' +import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' +import { + useCurrencyInfo, + useNativeCurrencyInfo, + useWrappedNativeCurrencyInfo, +} from 'uniswap/src/features/tokens/useCurrencyInfo' +import { TransactionDetails } from 'uniswap/src/features/transactions/types/transactionDetails' +import { getSymbolDisplayText } from 'uniswap/src/utils/currency' +import { NumberType } from 'utilities/src/format/types' + +interface ActivityAmountCellProps { + transaction: TransactionDetails +} + +function EmptyCell() { + return ( + + — + + ) +} + +interface DualTokenLayoutProps { + inputCurrency: CurrencyInfo | null | undefined + outputCurrency: CurrencyInfo | null | undefined + inputFormattedAmount: string | null + outputFormattedAmount: string | null + inputUsdValue: string | null + outputUsdValue: string | null + separator?: React.ReactNode +} + +function Separator({ children }: { children: React.ReactNode }) { + return ( + + {typeof children === 'string' ? ( + + {children} + + ) : ( + children + )} + + ) +} + +function DualTokenLayout({ + inputCurrency, + outputCurrency, + inputFormattedAmount, + outputFormattedAmount, + inputUsdValue, + outputUsdValue, + separator = , +}: DualTokenLayoutProps) { + return ( + + + {separator} + + + ) +} + +function formatAmountWithSymbol(amount: string | undefined, symbol: string | undefined): string | null { + return amount ? `${amount}${getSymbolDisplayText(symbol)}` : null +} + +function getUsdValue(value: string | undefined): string | null { + return value !== '-' ? (value ?? null) : null +} + +export function ActivityAmountCell({ transaction }: ActivityAmountCellProps) { + const formatter = useLocalizationContext() + const { t } = useTranslation() + const { chainId } = transaction + const { amount } = buildActivityRowFragments(transaction) + + // Hook up currency info based on amount model + const inputCurrencyInfo = useCurrencyInfo(amount?.kind === 'pair' ? amount.inputCurrencyId : undefined) + const outputCurrencyInfo = useCurrencyInfo(amount?.kind === 'pair' ? amount.outputCurrencyId : undefined) + const singleCurrencyInfo = useCurrencyInfo( + amount?.kind === 'single' || amount?.kind === 'approve' ? amount.currencyId : undefined, + ) + const currency0Info = useCurrencyInfo(amount?.kind === 'liquidity-pair' ? amount.currency0Id : undefined) + const currency1Info = useCurrencyInfo(amount?.kind === 'liquidity-pair' ? amount.currency1Id : undefined) + + const nativeCurrencyInfo = useNativeCurrencyInfo(chainId) + const wrappedCurrencyInfo = useWrappedNativeCurrencyInfo(chainId) + + // Format amounts based on kind + const inputFormattedData = useFormattedCurrencyAmountAndUSDValue({ + currency: inputCurrencyInfo?.currency, + currencyAmountRaw: amount?.kind === 'pair' ? (amount.inputAmountRaw ?? '') : '', + formatter, + isApproximateAmount: false, + }) + + const outputFormattedData = useFormattedCurrencyAmountAndUSDValue({ + currency: outputCurrencyInfo?.currency, + currencyAmountRaw: amount?.kind === 'pair' ? (amount.outputAmountRaw ?? '') : '', + formatter, + isApproximateAmount: false, + }) + + const singleFormattedData = useFormattedCurrencyAmountAndUSDValue({ + currency: singleCurrencyInfo?.currency, + currencyAmountRaw: amount?.kind === 'single' ? (amount.amountRaw ?? '') : '', + formatter, + isApproximateAmount: false, + }) + + const wrapAmountRaw = amount?.kind === 'wrap' ? (amount.amountRaw ?? '') : '' + const wrapInputCurrency = amount?.kind === 'wrap' && amount.unwrapped ? wrappedCurrencyInfo : nativeCurrencyInfo + const wrapOutputCurrency = amount?.kind === 'wrap' && amount.unwrapped ? nativeCurrencyInfo : wrappedCurrencyInfo + + const wrapInputFormattedData = useFormattedCurrencyAmountAndUSDValue({ + currency: wrapInputCurrency?.currency, + currencyAmountRaw: wrapAmountRaw, + formatter, + isApproximateAmount: false, + }) + + const wrapOutputFormattedData = useFormattedCurrencyAmountAndUSDValue({ + currency: wrapOutputCurrency?.currency, + currencyAmountRaw: wrapAmountRaw, + formatter, + isApproximateAmount: false, + }) + + const currency0FormattedData = useFormattedCurrencyAmountAndUSDValue({ + currency: currency0Info?.currency, + currencyAmountRaw: amount?.kind === 'liquidity-pair' ? amount.currency0AmountRaw : '', + formatter, + isApproximateAmount: false, + }) + + const currency1FormattedData = useFormattedCurrencyAmountAndUSDValue({ + currency: currency1Info?.currency, + currencyAmountRaw: amount?.kind === 'liquidity-pair' ? (amount.currency1AmountRaw ?? '') : '', + formatter, + isApproximateAmount: false, + }) + + if (!amount) { + return + } + + // Guard against missing currency data before formatting + if (amount.kind === 'pair' && (!inputCurrencyInfo || !outputCurrencyInfo)) { + return + } + + if (amount.kind === 'liquidity-pair' && (!currency0Info || !currency1Info)) { + return + } + + switch (amount.kind) { + case 'pair': { + // Dual token layout for swaps and bridges: Token1 → Token2 + return ( + + ) + } + + case 'approve': { + // Single token layout for approvals + let formattedAmount: string | null = null + + if (singleCurrencyInfo && amount.approvalAmount !== undefined) { + const amountText = + amount.approvalAmount === 'INF' + ? t('transaction.amount.unlimited') + : amount.approvalAmount && amount.approvalAmount !== '0.0' + ? formatter.formatNumberOrString({ value: amount.approvalAmount, type: NumberType.TokenNonTx }) + : '' + + formattedAmount = `${amountText ? amountText + ' ' : ''}${getSymbolDisplayText(singleCurrencyInfo.currency.symbol) ?? ''}` + } + + return + } + + case 'wrap': { + // Dual token layout for wraps: ETH ↔ WETH + return ( + + ) + } + + case 'single': { + // Single token layout for transfers + return ( + + ) + } + + case 'liquidity-pair': { + // Dual token layout for liquidity: Token0 and Token1 + return ( + + ) + } + } +} diff --git a/apps/web/src/components/ActivityTable/ActivityTable.tsx b/apps/web/src/components/ActivityTable/ActivityTable.tsx new file mode 100644 index 00000000000..97b62e13d1d --- /dev/null +++ b/apps/web/src/components/ActivityTable/ActivityTable.tsx @@ -0,0 +1,123 @@ +import { createColumnHelper, Row } from '@tanstack/react-table' +import { ActivityAddressCell } from 'components/ActivityTable/ActivityAddressCell' +import { ActivityAmountCell } from 'components/ActivityTable/ActivityAmountCell' +import { TimeCell } from 'components/ActivityTable/TimeCell' +import { TransactionTypeCell } from 'components/ActivityTable/TransactionTypeCell' +import { Table } from 'components/Table' +import { Cell } from 'components/Table/Cell' +import { HeaderCell } from 'components/Table/styled' +import { memo, useMemo } from 'react' +import { useTranslation } from 'react-i18next' +import { Text } from 'ui/src' +import { TransactionDetails } from 'uniswap/src/features/transactions/types/transactionDetails' + +interface ActivityTableProps { + data: TransactionDetails[] + loading?: boolean + error?: boolean + rowWrapper?: (row: Row, content: JSX.Element) => JSX.Element +} + +function _ActivityTable({ data, loading = false, error = false, rowWrapper }: ActivityTableProps): JSX.Element { + const { t } = useTranslation() + const columnHelper = useMemo(() => createColumnHelper(), []) + const showLoadingSkeleton = loading || error + + const columns = useMemo( + () => [ + // Time Column + columnHelper.accessor('addedTime', { + header: () => ( + + + {t('portfolio.activity.table.column.time')} + + + ), + cell: (info) => { + if (showLoadingSkeleton) { + return + } + return ( + + + + ) + }, + }), + + // Type Column + columnHelper.accessor((row) => row.typeInfo.type, { + id: 'type', + header: () => ( + + + {t('portfolio.activity.table.column.type')} + + + ), + cell: (info) => { + if (showLoadingSkeleton) { + return + } + return ( + + + + ) + }, + }), + + // Amount Column + columnHelper.display({ + id: 'amount', + header: () => ( + + + {t('portfolio.activity.table.column.amount')} + + + ), + cell: (info) => { + if (showLoadingSkeleton) { + return + } + return ( + + + + ) + }, + minSize: 280, + size: 300, + }), + + // Address Column + columnHelper.display({ + id: 'address', + header: () => ( + + + {t('portfolio.activity.table.column.address')} + + + ), + cell: (info) => { + if (showLoadingSkeleton) { + return + } + return ( + + + + ) + }, + }), + ], + [t, columnHelper, showLoadingSkeleton], + ) + + return +} + +export const ActivityTable = memo(_ActivityTable) diff --git a/apps/web/src/components/ActivityTable/AddressWithAvatar.tsx b/apps/web/src/components/ActivityTable/AddressWithAvatar.tsx new file mode 100644 index 00000000000..4abee3d5de7 --- /dev/null +++ b/apps/web/src/components/ActivityTable/AddressWithAvatar.tsx @@ -0,0 +1,42 @@ +import { Flex, Text } from 'ui/src' +import { Unitag } from 'ui/src/components/icons/Unitag' +import { useUnitagsAddressQuery } from 'uniswap/src/data/apiClients/unitagsApi/useUnitagsAddressQuery' +import { AccountIcon } from 'uniswap/src/features/accounts/AccountIcon' +import { useENSName } from 'uniswap/src/features/ens/api' +import { shortenAddress } from 'utilities/src/addresses' + +interface AddressWithAvatarProps { + address: Address + size?: number + showAvatar?: boolean +} + +export function AddressWithAvatar({ address, size = 20, showAvatar = true }: AddressWithAvatarProps) { + const { data: ENSName } = useENSName(address) + const { data: unitag } = useUnitagsAddressQuery({ + params: address ? { address } : undefined, + }) + const uniswapUsername = unitag?.username + + const displayName = uniswapUsername ?? ENSName ?? shortenAddress({ address }) + const hasUnitag = Boolean(uniswapUsername) + + return ( + + {showAvatar && ( + + )} + + {displayName} + + {hasUnitag && } + + ) +} diff --git a/apps/web/src/components/ActivityTable/TimeCell.tsx b/apps/web/src/components/ActivityTable/TimeCell.tsx new file mode 100644 index 00000000000..f90326cfbb8 --- /dev/null +++ b/apps/web/src/components/ActivityTable/TimeCell.tsx @@ -0,0 +1,15 @@ +import { TableText } from 'components/Table/styled' +import { useFormattedTimeForActivity } from 'uniswap/src/components/activity/hooks/useFormattedTime' + +interface TimeCellProps { + timestamp: number +} + +export function TimeCell({ timestamp }: TimeCellProps) { + const formattedTime = useFormattedTimeForActivity(timestamp) + return ( + + {formattedTime} + + ) +} diff --git a/apps/web/src/components/ActivityTable/TokenAmountDisplay.tsx b/apps/web/src/components/ActivityTable/TokenAmountDisplay.tsx new file mode 100644 index 00000000000..ef04e9384bf --- /dev/null +++ b/apps/web/src/components/ActivityTable/TokenAmountDisplay.tsx @@ -0,0 +1,32 @@ +import { TableText } from 'components/Table/styled' +import { Flex } from 'ui/src' +import { CurrencyLogo } from 'uniswap/src/components/CurrencyLogo/CurrencyLogo' +import { useCurrencyInfo } from 'uniswap/src/features/tokens/useCurrencyInfo' + +interface TokenAmountDisplayProps { + currencyInfo: ReturnType + formattedAmount: string | null + usdValue: string | null +} + +export function TokenAmountDisplay({ currencyInfo, formattedAmount, usdValue }: TokenAmountDisplayProps) { + if (!currencyInfo || !formattedAmount) { + return null + } + + return ( + + + + + {formattedAmount} + + {usdValue && ( + + {usdValue} + + )} + + + ) +} diff --git a/apps/web/src/components/ActivityTable/TransactionTypeCell.tsx b/apps/web/src/components/ActivityTable/TransactionTypeCell.tsx new file mode 100644 index 00000000000..5c3f52d05e7 --- /dev/null +++ b/apps/web/src/components/ActivityTable/TransactionTypeCell.tsx @@ -0,0 +1,30 @@ +import { buildActivityRowFragments } from 'components/ActivityTable/registry' +import { TableText } from 'components/Table/styled' +import { getTransactionTypeFilterOptions } from 'pages/Portfolio/Activity/Filters/utils' +import { useTranslation } from 'react-i18next' +import { Flex } from 'ui/src' +import { TransactionDetails } from 'uniswap/src/features/transactions/types/transactionDetails' + +interface TransactionTypeCellProps { + transaction: TransactionDetails +} + +export function TransactionTypeCell({ transaction }: TransactionTypeCellProps) { + const { t } = useTranslation() + const { typeLabel } = buildActivityRowFragments(transaction) + + // Get the icon from the filter options based on base group + const transactionTypeOptions = getTransactionTypeFilterOptions(t) + const typeOption = typeLabel?.baseGroup ? transactionTypeOptions[typeLabel.baseGroup] : null + const IconComponent = typeOption?.icon + + // Use override label key if provided, otherwise use the base group label + const label = typeLabel?.overrideLabelKey ? t(typeLabel.overrideLabelKey) : (typeOption?.label ?? 'Transaction') + + return ( + + {IconComponent && } + {label} + + ) +} diff --git a/apps/web/src/components/ActivityTable/activityTableModels.ts b/apps/web/src/components/ActivityTable/activityTableModels.ts new file mode 100644 index 00000000000..f1fc9d10af1 --- /dev/null +++ b/apps/web/src/components/ActivityTable/activityTableModels.ts @@ -0,0 +1,61 @@ +/** + * Models for activity table presentation layer. + * These types describe table-ready data from transaction parsers, without formatting or i18n. + * Each adapter returns raw IDs, amounts, addresses, and translation keys. + */ + +/** + * Represents the amount/token data for different transaction types + */ +type ActivityAmountModel = + | { + kind: 'pair' + inputCurrencyId: string + outputCurrencyId: string + inputAmountRaw?: string + outputAmountRaw?: string + } + | { + kind: 'single' + currencyId?: string + amountRaw?: string + } + | { + kind: 'approve' + currencyId?: string + approvalAmount?: string | 'INF' + } + | { + kind: 'wrap' + unwrapped: boolean + amountRaw?: string + } + | { + kind: 'liquidity-pair' + currency0Id: string + currency1Id: string + currency0AmountRaw: string + currency1AmountRaw?: string + } + +/** + * Represents the type label and grouping for a transaction + */ +interface ActivityTypeLabel { + /** Base group for filtering and icon mapping */ + baseGroup: 'swaps' | 'sent' | 'received' | 'deposits' | null + /** Optional override translation key for custom labels (e.g., "Wrapped"/"Unwrapped") */ + overrideLabelKey?: string +} + +/** + * Complete row data fragments for a single transaction in the activity table + */ +export interface ActivityRowFragments { + /** Amount/token data for the transaction */ + amount?: ActivityAmountModel | null + /** Counterparty address (sender/recipient/spender) */ + counterparty?: Address | null + /** Type label and grouping information */ + typeLabel?: ActivityTypeLabel | null +} diff --git a/apps/web/src/components/ActivityTable/registry.ts b/apps/web/src/components/ActivityTable/registry.ts new file mode 100644 index 00000000000..889b6d0451a --- /dev/null +++ b/apps/web/src/components/ActivityTable/registry.ts @@ -0,0 +1,246 @@ +import { UNI_ADDRESSES } from '@uniswap/sdk-core' +import { ActivityRowFragments } from 'components/ActivityTable/activityTableModels' +import { AssetType } from 'uniswap/src/entities/assets' +import { TransactionDetails, TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails' +import { getValidAddress } from 'uniswap/src/utils/addresses' +import { buildCurrencyId } from 'uniswap/src/utils/currencyId' + +/** + * Builds activity row fragments for a transaction by mapping from parsed typeInfo. + * Returns empty object for unsupported transaction types. + * + * @param details - The transaction details with parsed typeInfo + * @returns Activity row fragments containing amount, counterparty, and type label data + */ +export function buildActivityRowFragments(details: TransactionDetails): ActivityRowFragments { + const { typeInfo, chainId } = details + + switch (typeInfo.type) { + case TransactionType.Swap: + return { + amount: { + kind: 'pair', + inputCurrencyId: typeInfo.inputCurrencyId, + outputCurrencyId: typeInfo.outputCurrencyId, + inputAmountRaw: 'inputCurrencyAmountRaw' in typeInfo ? typeInfo.inputCurrencyAmountRaw : undefined, + outputAmountRaw: 'outputCurrencyAmountRaw' in typeInfo ? typeInfo.outputCurrencyAmountRaw : undefined, + }, + counterparty: null, + typeLabel: { + baseGroup: 'swaps', + overrideLabelKey: 'transaction.status.swap.success', + }, + } + + case TransactionType.Bridge: + return { + amount: { + kind: 'pair', + inputCurrencyId: typeInfo.inputCurrencyId, + outputCurrencyId: typeInfo.outputCurrencyId, + inputAmountRaw: 'inputCurrencyAmountRaw' in typeInfo ? typeInfo.inputCurrencyAmountRaw : undefined, + outputAmountRaw: 'outputCurrencyAmountRaw' in typeInfo ? typeInfo.outputCurrencyAmountRaw : undefined, + }, + counterparty: null, + typeLabel: { + baseGroup: 'swaps', + }, + } + + case TransactionType.Send: { + const currencyId = + typeInfo.assetType === AssetType.Currency ? buildCurrencyId(chainId, typeInfo.tokenAddress) : undefined + + return { + amount: { + kind: 'single', + currencyId, + amountRaw: typeInfo.currencyAmountRaw, + }, + counterparty: typeInfo.recipient ? getValidAddress({ address: typeInfo.recipient, chainId }) : null, + typeLabel: { + baseGroup: 'sent', + }, + } + } + + case TransactionType.Receive: { + const currencyId = + typeInfo.assetType === AssetType.Currency ? buildCurrencyId(chainId, typeInfo.tokenAddress) : undefined + + return { + amount: { + kind: 'single', + currencyId, + amountRaw: typeInfo.currencyAmountRaw, + }, + counterparty: typeInfo.sender ? getValidAddress({ address: typeInfo.sender, chainId }) : null, + typeLabel: { + baseGroup: 'received', + }, + } + } + + case TransactionType.Approve: { + const currencyId = buildCurrencyId(chainId, typeInfo.tokenAddress) + + return { + amount: { + kind: 'approve', + currencyId, + approvalAmount: typeInfo.approvalAmount, + }, + counterparty: typeInfo.spender ? getValidAddress({ address: typeInfo.spender, chainId }) : null, + typeLabel: { + baseGroup: null, + overrideLabelKey: 'common.approved', + }, + } + } + + case TransactionType.Wrap: + return { + amount: { + kind: 'wrap', + unwrapped: typeInfo.unwrapped, + amountRaw: typeInfo.currencyAmountRaw, + }, + counterparty: null, + typeLabel: { + baseGroup: 'swaps', + overrideLabelKey: typeInfo.unwrapped ? 'common.unwrapped' : 'common.wrapped', + }, + } + + case TransactionType.CreatePool: + case TransactionType.CreatePair: + return { + amount: { + kind: 'liquidity-pair', + currency0Id: typeInfo.currency0Id, + currency1Id: typeInfo.currency1Id, + currency0AmountRaw: typeInfo.currency0AmountRaw, + currency1AmountRaw: typeInfo.currency1AmountRaw, + }, + counterparty: typeInfo.dappInfo?.address + ? getValidAddress({ address: typeInfo.dappInfo.address, chainId }) + : null, + typeLabel: { + baseGroup: null, + overrideLabelKey: 'pool.create', + }, + } + + case TransactionType.LiquidityIncrease: + return { + amount: { + kind: 'liquidity-pair', + currency0Id: typeInfo.currency0Id, + currency1Id: typeInfo.currency1Id, + currency0AmountRaw: typeInfo.currency0AmountRaw, + currency1AmountRaw: typeInfo.currency1AmountRaw, + }, + counterparty: typeInfo.dappInfo?.address + ? getValidAddress({ address: typeInfo.dappInfo.address, chainId }) + : null, + typeLabel: { + baseGroup: 'deposits', + overrideLabelKey: 'common.addLiquidity', + }, + } + + case TransactionType.LiquidityDecrease: + return { + amount: { + kind: 'liquidity-pair', + currency0Id: typeInfo.currency0Id, + currency1Id: typeInfo.currency1Id, + currency0AmountRaw: typeInfo.currency0AmountRaw, + currency1AmountRaw: typeInfo.currency1AmountRaw, + }, + counterparty: typeInfo.dappInfo?.address + ? getValidAddress({ address: typeInfo.dappInfo.address, chainId }) + : null, + typeLabel: { + baseGroup: null, + overrideLabelKey: 'pool.removeLiquidity', + }, + } + + case TransactionType.NFTMint: { + const currencyId = typeInfo.purchaseCurrencyId + return { + amount: { + kind: 'single', + currencyId, + amountRaw: typeInfo.purchaseCurrencyAmountRaw, + }, + counterparty: typeInfo.dappInfo?.address + ? getValidAddress({ address: typeInfo.dappInfo.address, chainId }) + : null, + typeLabel: { + baseGroup: null, + overrideLabelKey: 'transaction.status.mint.success', + }, + } + } + + case TransactionType.CollectFees: + return { + amount: typeInfo.currency1Id + ? { + kind: 'liquidity-pair', + currency0Id: typeInfo.currency0Id, + currency1Id: typeInfo.currency1Id, + currency0AmountRaw: typeInfo.currency0AmountRaw, + currency1AmountRaw: typeInfo.currency1AmountRaw, + } + : { + kind: 'single', + currencyId: typeInfo.currency0Id, + amountRaw: typeInfo.currency0AmountRaw, + }, + counterparty: null, + typeLabel: { + baseGroup: null, + overrideLabelKey: 'transaction.status.collected.fees', + }, + } + + case TransactionType.LPIncentivesClaimRewards: { + const currencyId = buildCurrencyId(chainId, typeInfo.tokenAddress) + return { + amount: { + kind: 'single', + currencyId, + amountRaw: undefined, + }, + counterparty: null, + typeLabel: { + baseGroup: null, + overrideLabelKey: 'transaction.status.collected.fees', + }, + } + } + + case TransactionType.ClaimUni: { + const tokenAddress = UNI_ADDRESSES[chainId] + const currencyId = tokenAddress ? buildCurrencyId(chainId, tokenAddress) : undefined + return { + amount: { + kind: 'single', + currencyId, + amountRaw: typeInfo.uniAmountRaw, + }, + counterparty: getValidAddress({ address: typeInfo.recipient, chainId }), + typeLabel: { + baseGroup: null, + overrideLabelKey: 'common.claimed', + }, + } + } + + default: + return {} + } +} diff --git a/apps/web/src/components/Banner/BridgingPopularTokens/BridgingPopularTokensBanner.tsx b/apps/web/src/components/Banner/BridgingPopularTokens/BridgingPopularTokensBanner.tsx new file mode 100644 index 00000000000..2957dd9ef47 --- /dev/null +++ b/apps/web/src/components/Banner/BridgingPopularTokens/BridgingPopularTokensBanner.tsx @@ -0,0 +1,108 @@ +import { SharedEventName } from '@uniswap/analytics-events' +import { useCallback } from 'react' +import { useTranslation } from 'react-i18next' +import { useNavigate } from 'react-router' +import { useAppDispatch } from 'state/hooks' +import { Flex, IconButton, Image, styled, Text, TouchableArea } from 'ui/src' +import { BRIDGED_ASSETS_V2_WEB_BANNER } from 'ui/src/assets' +import { X } from 'ui/src/components/icons/X' +import { useUniswapContext } from 'uniswap/src/contexts/UniswapContext' +import { setHasDismissedBridgedAssetsBannerV2 } from 'uniswap/src/features/behaviorHistory/slice' +import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { ElementName } from 'uniswap/src/features/telemetry/constants' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' +import { Trace } from 'uniswap/src/features/telemetry/Trace' + +const BRIDGING_POPULAR_TOKENS_BANNER_HEIGHT = 152 +const GRADIENT_BACKGROUND_HEIGHT = 64 +const BANNER_PADDING = 16 + +const BannerContainer = styled(TouchableArea, { + borderRadius: '$rounded16', + width: 260, + height: BRIDGING_POPULAR_TOKENS_BANNER_HEIGHT, + shadowColor: '$shadowColor', + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.4, + shadowRadius: 10, + overflow: 'hidden', + padding: BANNER_PADDING, + backgroundColor: '$surface1', + borderWidth: 1, + borderColor: '$surface3', + gap: '$spacing16', + + '$platform-web': { + position: 'fixed', + bottom: 29, + left: 40, + }, +}) + +export function BridgingPopularTokensBanner() { + const dispatch = useAppDispatch() + const { t } = useTranslation() + const navigate = useNavigate() + const { setIsSwapTokenSelectorOpen, setSwapOutputChainId } = useUniswapContext() + + const handleBannerClose = useCallback(() => { + dispatch(setHasDismissedBridgedAssetsBannerV2(true)) + sendAnalyticsEvent(SharedEventName.ELEMENT_CLICKED, { + element: ElementName.CloseButton, + modal: ElementName.BridgedAssetsBannerV2, + }) + }, [dispatch]) + + const handleBannerClick = useCallback(() => { + navigate('/swap?outputChain=unichain') + setSwapOutputChainId(UniverseChainId.Unichain) + setIsSwapTokenSelectorOpen(true) + dispatch(setHasDismissedBridgedAssetsBannerV2(true)) + }, [dispatch, navigate, setIsSwapTokenSelectorOpen, setSwapOutputChainId]) + + return ( + + + + + + + + + {t('onboarding.home.intro.bridgedAssets.title')} + + + {t('bridgingPopularTokens.banner.description')} + + + + + ) +} + +function BannerXButton({ handleClose }: { handleClose: () => void }) { + return ( + + { + e.stopPropagation() + handleClose() + }} + hoverStyle={{ opacity: 0.8 }} + icon={} + p={2} + /> + + ) +} diff --git a/apps/web/src/components/Banner/shared/Banners.tsx b/apps/web/src/components/Banner/shared/Banners.tsx index 9ccc4ece9a5..5e16d747a68 100644 --- a/apps/web/src/components/Banner/shared/Banners.tsx +++ b/apps/web/src/components/Banner/shared/Banners.tsx @@ -1,12 +1,13 @@ import { manualChainOutageAtom, useChainOutageConfig } from 'featureFlags/flags/outageBanner' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' +import { BridgingPopularTokensBanner } from 'components/Banner/BridgingPopularTokens/BridgingPopularTokensBanner' import { getOutageBannerSessionStorageKey, OutageBanner } from 'components/Banner/Outage/OutageBanner' import { SOLANA_PROMO_BANNER_STORAGE_KEY, SolanaPromoBanner } from 'components/Banner/SolanaPromo/SolanaPromoBanner' import { useAtomValue } from 'jotai/utils' import { useMemo } from 'react' import { useLocation } from 'react-router' +import { useAppSelector } from 'state/hooks' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { InterfacePageName } from 'uniswap/src/features/telemetry/constants' import { getChainIdFromChainUrlParam, isChainUrlParam } from 'utils/chainParams' import { getCurrentPageFromLocation } from 'utils/urlRoutes' @@ -15,6 +16,10 @@ export function Banners() { const { pathname } = useLocation() const currentPage = getCurrentPageFromLocation(pathname) const isSolanaPromoEnabled = useFeatureFlag(FeatureFlags.SolanaPromo) + const isBridgedAssetsBannerV2Enabled = useFeatureFlag(FeatureFlags.BridgedAssetsBannerV2) + const hasDismissedBridgedAssetsBannerV2 = useAppSelector( + (state) => state.uniswapBehaviorHistory.hasDismissedBridgedAssetsBannerV2, + ) // Read from both sources: error-detected (from GraphQL failures) and Statsig (manual config) const statsigOutage = useChainOutageConfig() @@ -55,5 +60,9 @@ export function Banners() { return } + if (isBridgedAssetsBannerV2Enabled && !hasDismissedBridgedAssetsBannerV2) { + return + } + return null } diff --git a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/D3LiquidityRangeChart.tsx b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/D3LiquidityRangeChart.tsx index 685f409f924..33afc62d804 100644 --- a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/D3LiquidityRangeChart.tsx +++ b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/D3LiquidityRangeChart.tsx @@ -12,6 +12,7 @@ import { ChartEntry } from 'components/Charts/LiquidityRangeInput/types' import { PriceChartData } from 'components/Charts/PriceChart' import { ChartType } from 'components/Charts/utils' import { useLiquidityUrlState } from 'components/Liquidity/Create/hooks/useLiquidityUrlState' +import { InitialPosition } from 'components/Liquidity/Create/types' import { ChartQueryResult } from 'components/Tokens/TokenDetails/ChartSection/util' import * as d3 from 'd3' import { useEffect, useMemo, useRef } from 'react' @@ -22,11 +23,13 @@ const D3LiquidityRangeChart = ({ liquidityData, quoteCurrency, baseCurrency, + initialPosition, }: { priceData: ChartQueryResult liquidityData: ChartEntry[] quoteCurrency: Currency baseCurrency: Currency + initialPosition?: InitialPosition }) => { const colors = useSporeColors() const svgRef = useRef(null) @@ -125,6 +128,11 @@ const D3LiquidityRangeChart = ({ useEffect(() => { let minPrice let maxPrice + + if (initialPosition) { + return + } + if (priceRangeState.minPrice && !isNaN(parseFloat(priceRangeState.minPrice))) { minPrice = parseFloat(priceRangeState.minPrice) } @@ -136,7 +144,7 @@ const D3LiquidityRangeChart = ({ minPrice, maxPrice, }) - }, [priceData.dataHash, reset]) + }, [priceData.dataHash, initialPosition, reset]) return ( diff --git a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/components/D3LiquidityMinMaxInput.tsx b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/components/D3LiquidityMinMaxInput.tsx index ee3695042fb..1e0723c11af 100644 --- a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/components/D3LiquidityMinMaxInput.tsx +++ b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/components/D3LiquidityMinMaxInput.tsx @@ -92,15 +92,26 @@ export function D3LiquidityMinMaxInput() { } const price = input === RangeSelectionInput.MIN ? minPrice : maxPrice - if (input === RangeSelectionInput.MIN && ticksAtLimit[0]) { + + if (input === RangeSelectionInput.MIN && ticksAtLimit[0] && !positionState.initialPosition) { return '0' } - if (input === RangeSelectionInput.MAX && ticksAtLimit[1]) { + if (input === RangeSelectionInput.MAX && ticksAtLimit[1] && !positionState.initialPosition) { return '∞' } + return price?.toString() ?? '' }, - [displayUserTypedValue, typedValue, inputMode, priceDifferences, minPrice, maxPrice, ticksAtLimit], + [ + displayUserTypedValue, + typedValue, + inputMode, + priceDifferences, + minPrice, + maxPrice, + ticksAtLimit, + positionState.initialPosition, + ], ) // Sets chart state but does not update liquidity context diff --git a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/store/types.ts b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/store/types.ts index 4efa9bf8fd5..d6eec00d3de 100644 --- a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/store/types.ts +++ b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/store/types.ts @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency } from '@uniswap/sdk-core' import { GraphQLApi } from '@universe/api' import { TickAlignment } from 'components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/utils/priceToY' diff --git a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/utils/tickUtils.ts b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/utils/tickUtils.ts index a3385a91640..5b7eb089cf3 100644 --- a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/utils/tickUtils.ts +++ b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/utils/tickUtils.ts @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { nearestUsableTick, priceToClosestTick, TickMath, tickToPrice as tickToPriceV3 } from '@uniswap/v3-sdk' import { priceToClosestTick as priceToClosestV4Tick, tickToPrice as tickToPriceV4 } from '@uniswap/v4-sdk' import { TickNavigationParams } from 'components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/store/types' diff --git a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeInput.tsx b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeInput.tsx index 205c72ed202..71128df63fe 100644 --- a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeInput.tsx +++ b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeInput.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency, Price } from '@uniswap/sdk-core' import { GraphQLApi } from '@universe/api' import { D3LiquidityChartHeader } from 'components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/components/D3LiquidityChartHeader' @@ -13,7 +13,7 @@ import { ChartEntry } from 'components/Charts/LiquidityRangeInput/types' import { ChartSkeleton } from 'components/Charts/LoadingState' import { PriceChartData } from 'components/Charts/PriceChart' import { ChartType } from 'components/Charts/utils' -import { RangeAmountInputPriceMode } from 'components/Liquidity/Create/types' +import { InitialPosition, RangeAmountInputPriceMode } from 'components/Liquidity/Create/types' import { usePoolPriceChartData } from 'hooks/usePoolPriceChartData' import { UTCTimestamp } from 'lightweight-charts' import { useMemo, useState } from 'react' @@ -42,6 +42,7 @@ export function D3LiquidityRangeInput({ price, hook, currentPrice, + initialPosition, isFullRange, minPrice, maxPrice, @@ -73,6 +74,7 @@ export function D3LiquidityRangeInput({ minPrice?: number maxPrice?: number inputMode?: RangeAmountInputPriceMode + initialPosition?: InitialPosition setInputMode: (inputMode: RangeAmountInputPriceMode) => void setMinPrice: (minPrice?: number | null) => void setMaxPrice: (maxPrice?: number | null) => void @@ -194,6 +196,7 @@ export function D3LiquidityRangeInput({ baseCurrency={baseCurrency} priceData={finalPriceData} liquidityData={sortedLiquidityData} + initialPosition={initialPosition} /> ) : ( diff --git a/apps/web/src/components/Charts/LiquidityChart/index.tsx b/apps/web/src/components/Charts/LiquidityChart/index.tsx index cf4dfbf7f2a..b5aff745efb 100644 --- a/apps/web/src/components/Charts/LiquidityChart/index.tsx +++ b/apps/web/src/components/Charts/LiquidityChart/index.tsx @@ -1,5 +1,5 @@ import { BigNumber } from '@ethersproject/bignumber' -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency, CurrencyAmount, Token } from '@uniswap/sdk-core' import { FeeAmount, Pool as PoolV3, TICK_SPACINGS, TickMath as TickMathV3, tickToPrice } from '@uniswap/v3-sdk' import { Pool as PoolV4, tickToPrice as tickToPriceV4 } from '@uniswap/v4-sdk' diff --git a/apps/web/src/components/Charts/LiquidityPositionRangeChart/LiquidityPositionRangeChart.tsx b/apps/web/src/components/Charts/LiquidityPositionRangeChart/LiquidityPositionRangeChart.tsx index f22dce5006c..e820c97f067 100644 --- a/apps/web/src/components/Charts/LiquidityPositionRangeChart/LiquidityPositionRangeChart.tsx +++ b/apps/web/src/components/Charts/LiquidityPositionRangeChart/LiquidityPositionRangeChart.tsx @@ -1,4 +1,4 @@ -import { PositionStatus, ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { PositionStatus, ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency, Price } from '@uniswap/sdk-core' import { Pair } from '@uniswap/v2-sdk' import { FeeAmount, Pool as V3Pool } from '@uniswap/v3-sdk' diff --git a/apps/web/src/components/Charts/LiquidityRangeInput/LiquidityRangeInput.tsx b/apps/web/src/components/Charts/LiquidityRangeInput/LiquidityRangeInput.tsx index af38a075534..6ad03dc900c 100644 --- a/apps/web/src/components/Charts/LiquidityRangeInput/LiquidityRangeInput.tsx +++ b/apps/web/src/components/Charts/LiquidityRangeInput/LiquidityRangeInput.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency } from '@uniswap/sdk-core' import { GraphQLApi } from '@universe/api' import { ActiveLiquidityChart } from 'components/Charts/ActiveLiquidityChart/ActiveLiquidityChart' diff --git a/apps/web/src/components/Charts/LiquidityRangeInput/hooks.ts b/apps/web/src/components/Charts/LiquidityRangeInput/hooks.ts index 907bb46ba51..22f595d3efc 100644 --- a/apps/web/src/components/Charts/LiquidityRangeInput/hooks.ts +++ b/apps/web/src/components/Charts/LiquidityRangeInput/hooks.ts @@ -1,5 +1,5 @@ import { useQuery } from '@tanstack/react-query' -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency } from '@uniswap/sdk-core' import { calculateTokensLockedV3, calculateTokensLockedV4 } from 'components/Charts/LiquidityChart' import { ChartEntry } from 'components/Charts/LiquidityRangeInput/types' diff --git a/apps/web/src/components/Charts/PriceChart/index.tsx b/apps/web/src/components/Charts/PriceChart/index.tsx index f3767252cd6..2313ca3d480 100644 --- a/apps/web/src/components/Charts/PriceChart/index.tsx +++ b/apps/web/src/components/Charts/PriceChart/index.tsx @@ -25,6 +25,7 @@ import { Trans } from 'react-i18next' import { Flex, styled, Text } from 'ui/src' import { opacify } from 'ui/src/theme' import { isLowVarianceRange } from 'uniswap/src/components/charts/utils' +import { useFormatChartFiatDelta } from 'uniswap/src/features/fiatCurrency/hooks/useFormatChartFiatDelta' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { NumberType } from 'utilities/src/format/types' @@ -230,19 +231,54 @@ export class PriceChartModel extends ChartModel { } interface PriceChartDeltaProps { - startingPrice: PriceChartData - endingPrice: PriceChartData + startingPrice: number + endingPrice: number noColor?: boolean + shouldIncludeFiatDelta?: boolean + shouldTreatAsStablecoin?: boolean } -export function PriceChartDelta({ startingPrice, endingPrice, noColor }: PriceChartDeltaProps) { - const delta = calculateDelta(startingPrice.close, endingPrice.close) - const { formatPercent } = useLocalizationContext() +export function PriceChartDelta({ + startingPrice, + endingPrice, + noColor, + shouldIncludeFiatDelta = false, + shouldTreatAsStablecoin = false, +}: PriceChartDeltaProps) { + const { formatPercent, convertFiatAmount } = useLocalizationContext() + const { formatChartFiatDelta } = useFormatChartFiatDelta() + + const delta = calculateDelta(startingPrice, endingPrice) + const formattedDelta = useMemo(() => { + return delta !== undefined ? formatPercent(Math.abs(delta)) : '-' + }, [delta, formatPercent]) + + const fiatDelta = useMemo(() => { + if (!shouldIncludeFiatDelta) { + return null + } + + const convertedStart = convertFiatAmount(startingPrice) + const convertedEnd = convertFiatAmount(endingPrice) + + return formatChartFiatDelta({ + startingPrice: convertedStart.amount, + endingPrice: convertedEnd.amount, + isStablecoin: shouldTreatAsStablecoin, + }) + }, [ + shouldIncludeFiatDelta, + formatChartFiatDelta, + startingPrice, + endingPrice, + convertFiatAmount, + shouldTreatAsStablecoin, + ]) return ( - {delta && } - {delta ? formatPercent(Math.abs(delta)) : '-'} + {delta !== undefined && } + {fiatDelta ? `${fiatDelta.formatted} (${formattedDelta})` : formattedDelta} ) } @@ -288,7 +324,14 @@ function CandlestickTooltip({ data }: { data: PriceChartData }) { } export function PriceChart({ data, height, type, stale, timePeriod }: PriceChartProps) { + const startingPrice = data[0] const lastPrice = data[data.length - 1] + const { min, max } = getCandlestickPriceBounds(data) + const shouldTreatAsStablecoin = isLowVarianceRange({ + min, + max, + duration: timePeriod, + }) return ( ( } + additionalFields={ + + } valueFormatterType={NumberType.FiatTokenPrice} time={crosshairData?.time} /> diff --git a/apps/web/src/components/Expand/index.tsx b/apps/web/src/components/Expand/index.tsx index aa3303a3209..d9831b552f8 100644 --- a/apps/web/src/components/Expand/index.tsx +++ b/apps/web/src/components/Expand/index.tsx @@ -1,31 +1,8 @@ -import Column from 'components/deprecated/Column' -import Row, { RowBetween } from 'components/deprecated/Row' -import styled from 'lib/styled-components' import { PropsWithChildren, ReactElement } from 'react' -import { ChevronDown } from 'react-feather' -import { HeightAnimator } from 'ui/src' +import { Flex, FlexProps, HeightAnimator } from 'ui/src' +import { RotatableChevron } from 'ui/src/components/icons/RotatableChevron' import { iconSizes } from 'ui/src/theme' -const ButtonContainer = styled(Row)` - cursor: pointer; - justify-content: flex-end; - width: unset; -` - -const ExpandIcon = styled(ChevronDown)<{ $isOpen: boolean }>` - color: ${({ theme }) => theme.neutral2}; - transform: ${({ $isOpen }) => ($isOpen ? 'rotate(180deg)' : 'rotate(0deg)')}; - transition: transform ${({ theme }) => theme.transition.duration.medium}; -` - -const Content = styled(Column)` - padding-top: ${({ theme }) => theme.grids.md}; -` - -const Wrapper = styled(Column)<{ $padding?: string }>` - padding: ${({ $padding }) => $padding}; -` - export default function Expand({ header, button, @@ -35,27 +12,41 @@ export default function Expand({ padding, onToggle, iconSize = 'icon24', + paddingTop, + width, }: PropsWithChildren<{ header?: ReactElement button: ReactElement testId?: string isOpen: boolean - padding?: string + padding?: FlexProps['p'] onToggle: () => void iconSize?: keyof typeof iconSizes + paddingTop?: FlexProps['pt'] + width?: FlexProps['width'] }>) { return ( - - + + {header} - + {button} - - - + + + - {children} + + {children} + - + ) } diff --git a/apps/web/src/components/FeatureFlagModal/FeatureFlagModal.tsx b/apps/web/src/components/FeatureFlagModal/FeatureFlagModal.tsx index d419cc0f67d..0b3d9913486 100644 --- a/apps/web/src/components/FeatureFlagModal/FeatureFlagModal.tsx +++ b/apps/web/src/components/FeatureFlagModal/FeatureFlagModal.tsx @@ -1,3 +1,15 @@ +import type { DynamicConfigKeys } from '@universe/gating' +import { + DynamicConfigs, + Experiments, + ExternallyConnectableExtensionConfigKey, + FeatureFlags, + getFeatureFlagName, + getOverrideAdapter, + Layers, + NetworkRequestsConfigKey, + useFeatureFlagWithExposureLoggingDisabled, +} from '@universe/gating' import { useModalState } from 'hooks/useModalState' import styledDep from 'lib/styled-components' import { useExternallyConnectableExtensionId } from 'pages/ExtensionPasskeyAuthPopUp/useExternallyConnectableExtensionId' @@ -6,16 +18,6 @@ import { useCallback } from 'react' import { Button, Flex, ModalCloseIcon, styled, Text } from 'ui/src' import { ExperimentRow, LayerRow } from 'uniswap/src/components/gating/Rows' import { Modal } from 'uniswap/src/components/modals/Modal' -import type { DynamicConfigKeys } from 'uniswap/src/features/gating/configs' -import { - DynamicConfigs, - ExternallyConnectableExtensionConfigKey, - NetworkRequestsConfigKey, -} from 'uniswap/src/features/gating/configs' -import { Experiments, Layers } from 'uniswap/src/features/gating/experiments' -import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' -import { useFeatureFlagWithExposureLoggingDisabled } from 'uniswap/src/features/gating/hooks' -import { getOverrideAdapter } from 'uniswap/src/features/gating/sdk/statsig' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { isPlaywrightEnv } from 'utilities/src/environment/env' import { TRUSTED_CHROME_EXTENSION_IDS } from 'utilities/src/environment/extensionId' @@ -276,6 +278,7 @@ export default function FeatureFlagModal() { + @@ -286,6 +289,7 @@ export default function FeatureFlagModal() { + diff --git a/apps/web/src/components/HelpModal/HelpContent.tsx b/apps/web/src/components/HelpModal/HelpContent.tsx index b67856643ae..4e3332c04b6 100644 --- a/apps/web/src/components/HelpModal/HelpContent.tsx +++ b/apps/web/src/components/HelpModal/HelpContent.tsx @@ -32,7 +32,8 @@ export function HelpContent({ onClose }: HelpContentProps) { return ( - setIsOpen(open)}> + setIsOpen(open)} + > - + + + setIsOpen(false)} /> diff --git a/apps/web/src/components/Liquidity/ClaimFeeModal.tsx b/apps/web/src/components/Liquidity/ClaimFeeModal.tsx index 330fceecad5..bd924749dad 100644 --- a/apps/web/src/components/Liquidity/ClaimFeeModal.tsx +++ b/apps/web/src/components/Liquidity/ClaimFeeModal.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { CurrencyAmount } from '@uniswap/sdk-core' import { TradingApi } from '@universe/api' import { ErrorCallout } from 'components/ErrorCallout' diff --git a/apps/web/src/components/Liquidity/Create/AddHook.tsx b/apps/web/src/components/Liquidity/Create/AddHook.tsx index 2620a7cf2e9..506d1aa9dc6 100644 --- a/apps/web/src/components/Liquidity/Create/AddHook.tsx +++ b/apps/web/src/components/Liquidity/Create/AddHook.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { AdvancedButton } from 'components/Liquidity/Create/AdvancedButton' import { useLiquidityUrlState } from 'components/Liquidity/Create/hooks/useLiquidityUrlState' import { DEFAULT_POSITION_STATE } from 'components/Liquidity/Create/types' diff --git a/apps/web/src/components/Liquidity/Create/EditStep.tsx b/apps/web/src/components/Liquidity/Create/EditStep.tsx index bd96f6af8bc..ba5d25fd7c7 100644 --- a/apps/web/src/components/Liquidity/Create/EditStep.tsx +++ b/apps/web/src/components/Liquidity/Create/EditStep.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import CreatingPoolInfo from 'components/CreatingPoolInfo/CreatingPoolInfo' import { useDefaultInitialPrice } from 'components/Liquidity/Create/hooks/useDefaultInitialPrice' import { PositionFlowStep } from 'components/Liquidity/Create/types' diff --git a/apps/web/src/components/Liquidity/Create/FormWrapper.tsx b/apps/web/src/components/Liquidity/Create/FormWrapper.tsx index 8a172f68a51..07713ff025b 100644 --- a/apps/web/src/components/Liquidity/Create/FormWrapper.tsx +++ b/apps/web/src/components/Liquidity/Create/FormWrapper.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency } from '@uniswap/sdk-core' import { BreadcrumbNavContainer, BreadcrumbNavLink } from 'components/BreadcrumbNav' import { Container } from 'components/Liquidity/Create/Container' diff --git a/apps/web/src/components/Liquidity/Create/PositionOutOfRangeError.tsx b/apps/web/src/components/Liquidity/Create/PositionOutOfRangeError.tsx index b5e243de478..76aab9ca1cc 100644 --- a/apps/web/src/components/Liquidity/Create/PositionOutOfRangeError.tsx +++ b/apps/web/src/components/Liquidity/Create/PositionOutOfRangeError.tsx @@ -1,4 +1,4 @@ -import { PositionStatus } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { PositionStatus } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { ErrorCallout } from 'components/ErrorCallout' import { PositionInfo } from 'components/Liquidity/types' import { useTranslation } from 'react-i18next' diff --git a/apps/web/src/components/Liquidity/Create/RangeSelectionStep.tsx b/apps/web/src/components/Liquidity/Create/RangeSelectionStep.tsx index 80c51c9c44e..7ad8a3b54b9 100644 --- a/apps/web/src/components/Liquidity/Create/RangeSelectionStep.tsx +++ b/apps/web/src/components/Liquidity/Create/RangeSelectionStep.tsx @@ -1,4 +1,5 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { D3LiquidityRangeInput } from 'components/Charts/D3LiquidityRangeInput/D3LiquidityRangeInput' import { LiquidityRangeInput } from 'components/Charts/LiquidityRangeInput/LiquidityRangeInput' import { useDefaultInitialPrice } from 'components/Liquidity/Create/hooks/useDefaultInitialPrice' @@ -23,8 +24,6 @@ import { AlertTriangleFilled } from 'ui/src/components/icons/AlertTriangleFilled import { fonts, zIndexes } from 'ui/src/theme' import { AmountInput } from 'uniswap/src/components/AmountInput/AmountInput' import { WarningSeverity } from 'uniswap/src/components/modals/WarningModal/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' enum RangeSelection { FULL = 'FULL', @@ -535,6 +534,7 @@ export const SelectPriceRangeStep = ({ price={price} currentPrice={Number(price?.toSignificant())} inputMode={priceRangeState.inputMode} + initialPosition={initialPosition} minPrice={rangeInputMinPrice} maxPrice={rangeInputMaxPrice} isFullRange={priceRangeState.fullRange} diff --git a/apps/web/src/components/Liquidity/Create/SelectTokenStep.tsx b/apps/web/src/components/Liquidity/Create/SelectTokenStep.tsx index 86470371e61..95762e764d7 100644 --- a/apps/web/src/components/Liquidity/Create/SelectTokenStep.tsx +++ b/apps/web/src/components/Liquidity/Create/SelectTokenStep.tsx @@ -1,6 +1,13 @@ import { PrefetchBalancesWrapper } from 'appGraphql/data/apollo/AdaptiveTokenBalancesProvider' -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import type { Currency, Percent } from '@uniswap/sdk-core' +import { + AllowedV4WethHookAddressesConfigKey, + DynamicConfigs, + FeatureFlags, + useDynamicConfigValue, + useFeatureFlag, +} from '@universe/gating' import CreatingPoolInfo from 'components/CreatingPoolInfo/CreatingPoolInfo' import { ErrorCallout } from 'components/ErrorCallout' import { AddHook } from 'components/Liquidity/Create/AddHook' @@ -41,9 +48,6 @@ import { useUrlContext } from 'uniswap/src/contexts/UrlContext' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { UniverseChainId } from 'uniswap/src/features/chains/types' import type { CurrencyInfo } from 'uniswap/src/features/dataApi/types' -import { AllowedV4WethHookAddressesConfigKey, DynamicConfigs } from 'uniswap/src/features/gating/configs' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useDynamicConfigValue, useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { isSVMChain } from 'uniswap/src/features/platforms/utils/chains' @@ -225,7 +229,7 @@ export function SelectTokensStep({ }) const { - positionState: { hook, userApprovedHook, fee }, + positionState: { hook, userApprovedHook, fee, initialPosition }, setPositionState, protocolVersion, creatingPoolOrPair, @@ -586,7 +590,7 @@ export function SelectTokensStep({ + + + ) +} diff --git a/apps/web/src/pages/Portfolio/ConnectWalletBottomOverlay.tsx b/apps/web/src/pages/Portfolio/ConnectWalletBottomOverlay.tsx new file mode 100644 index 00000000000..1d3023714b3 --- /dev/null +++ b/apps/web/src/pages/Portfolio/ConnectWalletBottomOverlay.tsx @@ -0,0 +1,47 @@ +import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' +import { useTranslation } from 'react-i18next' +import { Button, Flex, Text } from 'ui/src' + +export function ConnectWalletBottomOverlay(): JSX.Element { + const accountDrawer = useAccountDrawer() + const { t } = useTranslation() + + return ( + + + + {t('portfolio.disconnected.connectWallet.cta')} + + + + + ) +} diff --git a/apps/web/src/pages/Portfolio/ConnectWalletView.tsx b/apps/web/src/pages/Portfolio/ConnectWalletView.tsx deleted file mode 100644 index 2cbbd7b7d11..00000000000 --- a/apps/web/src/pages/Portfolio/ConnectWalletView.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' -import { useTranslation } from 'react-i18next' -import { Button, Flex, Text } from 'ui/src' -import { LineChartDots } from 'ui/src/components/icons/LineChartDots' -import { iconSizes } from 'ui/src/theme' -import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' - -export default function PortfolioConnectWalletView() { - const { t } = useTranslation() - const accountDrawer = useAccountDrawer() - const { chains } = useEnabledChains() - - return ( - - - - - - - {t('common.getStarted')} - - {t('portfolio.connectWallet.summary', { amount: chains.length })} - - - - - - ) -} diff --git a/apps/web/src/pages/Portfolio/Header/Header.tsx b/apps/web/src/pages/Portfolio/Header/Header.tsx index dabe6593763..c08767e2216 100644 --- a/apps/web/src/pages/Portfolio/Header/Header.tsx +++ b/apps/web/src/pages/Portfolio/Header/Header.tsx @@ -1,14 +1,11 @@ import NetworkFilter from 'components/NetworkFilter/NetworkFilter' -import { useAccount } from 'hooks/useAccount' -import { useScroll } from 'hooks/useScroll' import { usePortfolioParams } from 'pages/Portfolio/Header/hooks/usePortfolioParams' +import PortfolioAddressDisplay from 'pages/Portfolio/Header/PortfolioAddressDisplay/PortfolioAddressDisplay' import { PortfolioTabs } from 'pages/Portfolio/Header/Tabs' import { PortfolioTab } from 'pages/Portfolio/types' -import { useEffect, useState } from 'react' import { useNavigate } from 'react-router' import { Flex } from 'ui/src' import { INTERFACE_NAV_HEIGHT } from 'ui/src/theme/heights' -import { AddressDisplay } from 'uniswap/src/components/accounts/AddressDisplay' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { useEvent } from 'utilities/src/react/hooks' import { getChainUrlParam } from 'utils/chainParams' @@ -22,21 +19,6 @@ function buildPortfolioUrl(tab: PortfolioTab | undefined, chainId: UniverseChain export default function PortfolioHeader() { const navigate = useNavigate() const { tab, chainId: currentChainId } = usePortfolioParams() - const { height: scrollHeight } = useScroll() - const [isCompact, setIsCompact] = useState(false) - const account = useAccount() - - useEffect(() => { - setIsCompact((prevIsCompact) => { - if (!prevIsCompact && scrollHeight > 120) { - return true - } - if (prevIsCompact && scrollHeight < 80) { - return false - } - return prevIsCompact - }) - }, [scrollHeight]) const onNetworkPress = useEvent((chainId: UniverseChainId | undefined) => { navigate(buildPortfolioUrl(tab, chainId)) @@ -56,14 +38,8 @@ export default function PortfolioHeader() { > - + + { + setIsCompact((prevIsCompact) => { + if (!prevIsCompact && scrollHeight > 120) { + return true + } + if (prevIsCompact && scrollHeight < 80) { + return false + } + return prevIsCompact + }) + }, [scrollHeight]) + + if (!account.address) { + return null + } + + return ( + + ) +} diff --git a/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/DemoAddressDisplay.tsx b/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/DemoAddressDisplay.tsx new file mode 100644 index 00000000000..4d6166b96cf --- /dev/null +++ b/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/DemoAddressDisplay.tsx @@ -0,0 +1,37 @@ +import { ReactComponent as Unicon } from 'assets/svg/Emblem/default.svg' +import { useTranslation } from 'react-i18next' +import { Flex, Text, Tooltip, useSporeColors } from 'ui/src' +import { Eye } from 'ui/src/components/icons/Eye' +import { iconSizes } from 'ui/src/theme' + +export default function DemoAddressDisplay() { + const colors = useSporeColors() + const { t } = useTranslation() + + return ( + + + + + + + + + {t('portfolio.disconnected.demoWallet.title')} + + + + + + {t('portfolio.disconnected.demoWallet.description')} + + + + ) +} diff --git a/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/PortfolioAddressDisplay.tsx b/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/PortfolioAddressDisplay.tsx new file mode 100644 index 00000000000..c2f6a8b9fbf --- /dev/null +++ b/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/PortfolioAddressDisplay.tsx @@ -0,0 +1,9 @@ +import useIsConnected from 'pages/Portfolio/Header/hooks/useIsConnected' +import ConnectedAddressDisplay from 'pages/Portfolio/Header/PortfolioAddressDisplay/ConnectedAddressDisplay' +import DemoAddressDisplay from 'pages/Portfolio/Header/PortfolioAddressDisplay/DemoAddressDisplay' + +export default function PortfolioAddressDisplay(): JSX.Element { + const isConnected = useIsConnected() + + return isConnected ? : +} diff --git a/apps/web/src/pages/Portfolio/Header/hooks/useIsConnected.ts b/apps/web/src/pages/Portfolio/Header/hooks/useIsConnected.ts new file mode 100644 index 00000000000..6c381c705ec --- /dev/null +++ b/apps/web/src/pages/Portfolio/Header/hooks/useIsConnected.ts @@ -0,0 +1,7 @@ +/* eslint-disable-next-line no-restricted-imports, no-restricted-syntax */ +import { useAccount } from 'hooks/useAccount' + +export default function useIsConnected() { + const account = useAccount() + return !!account.address +} diff --git a/apps/web/src/pages/Portfolio/NFTs/NFTCard.tsx b/apps/web/src/pages/Portfolio/NFTs/NFTCard.tsx new file mode 100644 index 00000000000..878c0a3cab8 --- /dev/null +++ b/apps/web/src/pages/Portfolio/NFTs/NFTCard.tsx @@ -0,0 +1,144 @@ +import { SharedEventName } from '@uniswap/analytics-events' +import { useCallback, useMemo, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { AnimateTransition, Flex, Text, TouchableArea, useSporeColors } from 'ui/src' +import { ArrowUpRight } from 'ui/src/components/icons/ArrowUpRight' +import { MoreHorizontal } from 'ui/src/components/icons/MoreHorizontal' +import { zIndexes } from 'ui/src/theme' +import { iconSizes } from 'ui/src/theme/iconSizes' +import { NetworkLogo } from 'uniswap/src/components/CurrencyLogo/NetworkLogo' +import { NftView, NftViewProps } from 'uniswap/src/components/nfts/NftView' +import { fromGraphQLChain } from 'uniswap/src/features/chains/utils' +import { ElementName, SectionName } from 'uniswap/src/features/telemetry/constants' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' +import { getOpenseaLink, openUri } from 'uniswap/src/utils/linking' + +const FLOAT_UP_ON_HOVER_OFFSET = -4 + +/** + * Generates a unique rotation angle for an element based on its ID + * @param id - Unique identifier for the element + * @returns CSS custom property object with rotation value + */ +function generateRotationStyle(id: string) { + // Generate hash from ID + const hashCode = id.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0) + + // Determine rotation direction (positive or negative) + const direction = hashCode % 2 === 0 ? 1 : -1 + + // Generate rotation amount between 0.5 and 2.5 degrees + const rotationAmount = 0.5 + (hashCode % 201) / 100 // Range: 0.5 to 2.5 + return direction * rotationAmount +} + +type NftCardProps = Omit & { + owner: Address + id: string + onPress?: () => void +} + +export function NFTCard(props: NftCardProps): JSX.Element { + const [isHovered, setIsHovered] = useState(false) + const colors = useSporeColors() + const { t } = useTranslation() + + // Generate OpenSea URL for the NFT + const openseaUrl = useMemo(() => { + if (props.item.chain && props.item.contractAddress && props.item.tokenId) { + const chainId = fromGraphQLChain(props.item.chain) + if (chainId) { + return getOpenseaLink({ + chainId, + contractAddress: props.item.contractAddress, + tokenId: props.item.tokenId, + }) + } + } + return null + }, [props.item.chain, props.item.contractAddress, props.item.tokenId]) + + const handlePress = useCallback(async () => { + if (openseaUrl) { + await openUri({ uri: openseaUrl }) + } + sendAnalyticsEvent(SharedEventName.ELEMENT_CLICKED, { + element: ElementName.PortfolioNftItem, + section: SectionName.PortfolioNftsTab, + collection_name: props.item.collectionName, + collection_address: props.item.contractAddress, + token_id: props.item.tokenId, + }) + props.onPress?.() + }, [openseaUrl, props.item.collectionName, props.item.contractAddress, props.item.tokenId, props.onPress]) + + return ( + + setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + onPress={handlePress} + > + {/* Context menu trigger icon */} + {/* TODO: open NFT context menu on click */} + event.stopPropagation()} + > + + + + {/* Let the parent card handle the onPress */} + {}} /> + + + + {props.item.name} + + + + + {props.item.collectionName} + + {props.item.chain && } + + + + {t('common.opensea.link')} + + + + + + + + ) +} diff --git a/apps/web/src/pages/Portfolio/NFTs/Nfts.tsx b/apps/web/src/pages/Portfolio/NFTs/Nfts.tsx new file mode 100644 index 00000000000..d876b5a78f2 --- /dev/null +++ b/apps/web/src/pages/Portfolio/NFTs/Nfts.tsx @@ -0,0 +1,75 @@ +import { SearchInput } from 'pages/Portfolio/components/SearchInput' +import { usePortfolioAddress } from 'pages/Portfolio/hooks/usePortfolioAddress' +import { NFTCard } from 'pages/Portfolio/NFTs/NFTCard' +import { filterNft } from 'pages/Portfolio/NFTs/utils/filterNfts' +import { useCallback, useMemo, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { Flex, Text } from 'ui/src' +import { useNftListRenderData } from 'uniswap/src/components/nfts/hooks/useNftListRenderData' +import { NftsList } from 'uniswap/src/components/nfts/NftsList' +import { NFTItem } from 'uniswap/src/features/nfts/types' +import { InterfacePageName } from 'uniswap/src/features/telemetry/constants' +import Trace from 'uniswap/src/features/telemetry/Trace' +import { assume0xAddress } from 'utils/wagmi' + +const LOADING_SKELETON_COUNT = 10 + +export default function PortfolioNfts(): JSX.Element { + const { t } = useTranslation() + const owner = usePortfolioAddress() + const nftsContainerRef = useRef(null) + + const [search, setSearch] = useState('') + const lowercaseSearch = useMemo(() => search.trim().toLowerCase(), [search]) + + const { numShown } = useNftListRenderData({ owner: assume0xAddress(owner), skip: !owner }) + + const renderNFTItem = useCallback( + (item: NFTItem) => { + if (!filterNft(item, lowercaseSearch)) { + return + } + + return ( + + + + + + ) + }, + [lowercaseSearch, owner], + ) + + return ( + + + + + {numShown ? `${numShown}` : ''} {t('portfolio.nfts.title')} + + + + + + + + + + ) +} diff --git a/apps/web/src/pages/Portfolio/NFTs/utils/filterNfts.test.ts b/apps/web/src/pages/Portfolio/NFTs/utils/filterNfts.test.ts new file mode 100644 index 00000000000..b208030e60d --- /dev/null +++ b/apps/web/src/pages/Portfolio/NFTs/utils/filterNfts.test.ts @@ -0,0 +1,257 @@ +import { filterNft } from 'pages/Portfolio/NFTs/utils/filterNfts' +import { NFTItem } from 'uniswap/src/features/nfts/types' + +describe('filterNft', () => { + const createMockNft = (overrides: Partial = {}): NFTItem => ({ + name: 'Bored Ape #1234', + collectionName: 'Bored Ape Yacht Club', + tokenId: '1234', + contractAddress: '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D', + ...overrides, + }) + + describe('when search query is empty', () => { + it('should return true for empty string', () => { + const nft = createMockNft() + expect(filterNft(nft, '')).toBe(true) + }) + + it('should return true for whitespace-only string', () => { + const nft = createMockNft() + expect(filterNft(nft, ' ')).toBe(true) + }) + + it('should return true for null/undefined search', () => { + const nft = createMockNft() + expect(filterNft(nft, '')).toBe(true) + }) + }) + + describe('when searching by NFT name', () => { + it('should match exact name', () => { + const nft = createMockNft({ name: 'Bored Ape #1234' }) + expect(filterNft(nft, 'Bored Ape #1234')).toBe(true) + }) + + it('should match partial name', () => { + const nft = createMockNft({ name: 'Bored Ape #1234' }) + expect(filterNft(nft, 'Bored')).toBe(true) + }) + + it('should be case-insensitive', () => { + const nft = createMockNft({ name: 'Bored Ape #1234' }) + expect(filterNft(nft, 'bored')).toBe(true) + expect(filterNft(nft, 'BORED')).toBe(true) + expect(filterNft(nft, 'BoReD')).toBe(true) + }) + + it('should not match when name does not contain search term', () => { + const nft = createMockNft({ name: 'Bored Ape #1234' }) + expect(filterNft(nft, 'CryptoPunk')).toBe(false) + }) + + it('should handle undefined name', () => { + const nft = createMockNft({ + name: undefined, + collectionName: undefined, + tokenId: undefined, + contractAddress: undefined, + }) + expect(filterNft(nft, 'Bored')).toBe(false) + }) + + it('should handle null name', () => { + const nft = createMockNft({ + name: null as any, + collectionName: undefined, + tokenId: undefined, + contractAddress: undefined, + }) + expect(filterNft(nft, 'Bored')).toBe(false) + }) + }) + + describe('when searching by collection name', () => { + it('should match exact collection name', () => { + const nft = createMockNft({ collectionName: 'Bored Ape Yacht Club' }) + expect(filterNft(nft, 'Bored Ape Yacht Club')).toBe(true) + }) + + it('should match partial collection name', () => { + const nft = createMockNft({ collectionName: 'Bored Ape Yacht Club' }) + expect(filterNft(nft, 'Yacht')).toBe(true) + }) + + it('should be case-insensitive', () => { + const nft = createMockNft({ collectionName: 'Bored Ape Yacht Club' }) + expect(filterNft(nft, 'yacht')).toBe(true) + expect(filterNft(nft, 'YACHT')).toBe(true) + expect(filterNft(nft, 'YaChT')).toBe(true) + }) + + it('should not match when collection name does not contain search term', () => { + const nft = createMockNft({ collectionName: 'Bored Ape Yacht Club' }) + expect(filterNft(nft, 'CryptoPunks')).toBe(false) + }) + + it('should handle undefined collection name', () => { + const nft = createMockNft({ collectionName: undefined }) + expect(filterNft(nft, 'Yacht')).toBe(false) + }) + }) + + describe('when searching by token ID', () => { + it('should match exact token ID', () => { + const nft = createMockNft({ tokenId: '1234' }) + expect(filterNft(nft, '1234')).toBe(true) + }) + + it('should match partial token ID', () => { + const nft = createMockNft({ tokenId: '1234' }) + expect(filterNft(nft, '123')).toBe(true) + }) + + it('should be case-insensitive', () => { + const nft = createMockNft({ tokenId: 'ABC123' }) + expect(filterNft(nft, 'abc')).toBe(true) + expect(filterNft(nft, 'ABC')).toBe(true) + expect(filterNft(nft, 'AbC')).toBe(true) + }) + + it('should not match when token ID does not contain search term', () => { + const nft = createMockNft({ tokenId: '1234' }) + expect(filterNft(nft, '5678')).toBe(false) + }) + + it('should handle undefined token ID', () => { + const nft = createMockNft({ + tokenId: undefined, + name: undefined, + collectionName: undefined, + contractAddress: undefined, + }) + expect(filterNft(nft, '1234')).toBe(false) + }) + }) + + describe('when searching by contract address', () => { + it('should match exact contract address', () => { + const nft = createMockNft({ contractAddress: '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D' }) + expect(filterNft(nft, '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D')).toBe(true) + }) + + it('should match partial contract address', () => { + const nft = createMockNft({ contractAddress: '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D' }) + expect(filterNft(nft, 'BC4CA0')).toBe(true) + }) + + it('should be case-insensitive', () => { + const nft = createMockNft({ contractAddress: '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D' }) + expect(filterNft(nft, 'bc4ca0')).toBe(true) + expect(filterNft(nft, 'BC4CA0')).toBe(true) + expect(filterNft(nft, 'Bc4Ca0')).toBe(true) + }) + + it('should not match when contract address does not contain search term', () => { + const nft = createMockNft({ contractAddress: '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D' }) + expect(filterNft(nft, '0x123456789')).toBe(false) + }) + + it('should handle undefined contract address', () => { + const nft = createMockNft({ contractAddress: undefined }) + expect(filterNft(nft, 'BC4CA0')).toBe(false) + }) + }) + + describe('when searching with whitespace', () => { + it('should trim leading and trailing whitespace', () => { + const nft = createMockNft({ name: 'Bored Ape #1234' }) + expect(filterNft(nft, ' Bored ')).toBe(true) + expect(filterNft(nft, '\tBored\n')).toBe(true) + }) + + it('should handle whitespace-only search as empty search', () => { + const nft = createMockNft() + expect(filterNft(nft, ' ')).toBe(true) + expect(filterNft(nft, '\t\n')).toBe(true) + }) + }) + + describe('edge cases', () => { + it('should handle NFT with all undefined fields', () => { + const nft = createMockNft({ + name: undefined, + collectionName: undefined, + tokenId: undefined, + contractAddress: undefined, + }) + expect(filterNft(nft, 'anything')).toBe(false) + }) + + it('should handle NFT with empty string fields', () => { + const nft = createMockNft({ + name: '', + collectionName: '', + tokenId: '', + contractAddress: '', + }) + expect(filterNft(nft, 'anything')).toBe(false) + }) + + it('should handle special characters in search', () => { + const nft = createMockNft({ name: 'NFT #1234' }) + expect(filterNft(nft, '#')).toBe(true) + expect(filterNft(nft, '1234')).toBe(true) + }) + + it('should handle unicode characters', () => { + const nft = createMockNft({ name: '🚀 Rocket NFT' }) + expect(filterNft(nft, '🚀')).toBe(true) + expect(filterNft(nft, 'Rocket')).toBe(true) + }) + }) + + describe('real-world examples', () => { + it('should match Bored Ape Yacht Club NFT', () => { + const nft = createMockNft({ + name: 'Bored Ape #1234', + collectionName: 'Bored Ape Yacht Club', + tokenId: '1234', + contractAddress: '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D', + }) + + expect(filterNft(nft, 'bored')).toBe(true) + expect(filterNft(nft, 'ape')).toBe(true) + expect(filterNft(nft, 'yacht')).toBe(true) + expect(filterNft(nft, '1234')).toBe(true) + expect(filterNft(nft, 'BC4CA0')).toBe(true) + }) + + it('should match CryptoPunks NFT', () => { + const nft = createMockNft({ + name: 'CryptoPunk #1234', + collectionName: 'CryptoPunks', + tokenId: '1234', + contractAddress: '0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB', + }) + + expect(filterNft(nft, 'crypto')).toBe(true) + expect(filterNft(nft, 'punk')).toBe(true) + expect(filterNft(nft, 'punks')).toBe(true) + expect(filterNft(nft, '1234')).toBe(true) + }) + + it('should not match unrelated NFTs', () => { + const nft = createMockNft({ + name: 'Bored Ape #1234', + collectionName: 'Bored Ape Yacht Club', + tokenId: '1234', + contractAddress: '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D', + }) + + expect(filterNft(nft, 'cryptopunk')).toBe(false) + expect(filterNft(nft, 'azuki')).toBe(false) + expect(filterNft(nft, '5678')).toBe(false) + }) + }) +}) diff --git a/apps/web/src/pages/Portfolio/NFTs/utils/filterNfts.ts b/apps/web/src/pages/Portfolio/NFTs/utils/filterNfts.ts new file mode 100644 index 00000000000..643712033f0 --- /dev/null +++ b/apps/web/src/pages/Portfolio/NFTs/utils/filterNfts.ts @@ -0,0 +1,32 @@ +import { NFTItem } from 'uniswap/src/features/nfts/types' + +/** + * Filters an NFT item based on a search query. + * The search is case-insensitive and matches against: + * - NFT name + * - Collection name + * - Token ID + * - Contract address + * + * @param item - The NFT item to filter + * @param searchQuery - The search query (will be converted to lowercase) + * @returns true if the item matches the search query, false otherwise + */ +export function filterNft(item: NFTItem, searchQuery: string): boolean { + if (!searchQuery.trim()) { + return true + } + + const lowercaseSearch = searchQuery.trim().toLowerCase() + const name = item.name?.toLowerCase() ?? '' + const collectionName = item.collectionName?.toLowerCase() ?? '' + const tokenId = item.tokenId?.toLowerCase() ?? '' + const contract = item.contractAddress?.toLowerCase() ?? '' + + return ( + name.includes(lowercaseSearch) || + collectionName.includes(lowercaseSearch) || + tokenId.includes(lowercaseSearch) || + contract.includes(lowercaseSearch) + ) +} diff --git a/apps/web/src/pages/Portfolio/Nfts.tsx b/apps/web/src/pages/Portfolio/Nfts.tsx deleted file mode 100644 index 49fdcff4e64..00000000000 --- a/apps/web/src/pages/Portfolio/Nfts.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { useTranslation } from 'react-i18next' -import { Flex, Text } from 'ui/src' -import { InterfacePageName } from 'uniswap/src/features/telemetry/constants' -import Trace from 'uniswap/src/features/telemetry/Trace' - -export default function PortfolioNfts() { - const { t } = useTranslation() - - return ( - - - {t('portfolio.nfts.title')} - - Coming Soon - - This feature is under development and will be available soon. - - - - - ) -} diff --git a/apps/web/src/pages/Portfolio/Portfolio.tsx b/apps/web/src/pages/Portfolio/Portfolio.tsx index b58e47ab710..8959a955b19 100644 --- a/apps/web/src/pages/Portfolio/Portfolio.tsx +++ b/apps/web/src/pages/Portfolio/Portfolio.tsx @@ -1,70 +1,59 @@ -import { useAccount } from 'hooks/useAccount' -import PortfolioActivity from 'pages/Portfolio/Activity/Activity' -import PortfolioConnectWalletView from 'pages/Portfolio/ConnectWalletView' -import PortfolioDefi from 'pages/Portfolio/Defi' +import { Layers, PortfolioDisconnectedDemoViewProperties, useExperimentValueFromLayer } from '@universe/gating' +import PortfolioConnectWalletBanner from 'pages/Portfolio/ConnectWalletBanner' +import { ConnectWalletBottomOverlay } from 'pages/Portfolio/ConnectWalletBottomOverlay' import PortfolioHeader from 'pages/Portfolio/Header/Header' -import { usePortfolioParams } from 'pages/Portfolio/Header/hooks/usePortfolioParams' -import { usePortfolioTabsAnimation } from 'pages/Portfolio/Header/hooks/usePortfolioTabsAnimation' -import PortfolioNfts from 'pages/Portfolio/Nfts' -import PortfolioOverview from 'pages/Portfolio/Overview' -import PortfolioTokens from 'pages/Portfolio/Tokens/Tokens' -import { PortfolioTab } from 'pages/Portfolio/types' -import { useLocation } from 'react-router' +import useIsConnected from 'pages/Portfolio/Header/hooks/useIsConnected' +import { PortfolioContent } from 'pages/Portfolio/PortfolioContent' +import PortfolioDisconnectedView from 'pages/Portfolio/PortfolioDisconnectedView' import { Flex } from 'ui/src' -import { TransitionItem } from 'ui/src/animations/components/AnimatePresencePager' import { InterfacePageName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' -const renderPortfolioContent = (tab: PortfolioTab | undefined) => { - switch (tab) { - case PortfolioTab.Overview: - return - case PortfolioTab.Tokens: - return - case PortfolioTab.Defi: - return - case PortfolioTab.Nfts: - return - case PortfolioTab.Activity: - return - default: - return - } -} - // eslint-disable-next-line import/no-unused-modules -- used in RouteDefinitions.tsx via lazy import export default function Portfolio() { - const { pathname } = useLocation() - const account = useAccount() - const animationType = usePortfolioTabsAnimation(pathname) - const { tab } = usePortfolioParams() + const isConnected = useIsConnected() + const showDemoView = useExperimentValueFromLayer({ + layerName: Layers.PortfolioPage, + param: PortfolioDisconnectedDemoViewProperties.DemoViewEnabled, + defaultValue: false, + }) return ( - - {account.address ? ( - <> - + {!showDemoView && !isConnected ? ( + + ) : ( + + {!isConnected && } + {!isConnected && } + + {isConnected ? ( + <> + + + {/* Animated Content Area - All routes show same content, filtered by chain */} + + + ) : ( + <> + - {/* Animated Content Area - All routes show same content, filtered by chain */} - - - {renderPortfolioContent(tab)} - - - - ) : ( - - )} - + {/* Animated Content Area - All routes show same content, filtered by chain */} + + + + + )} + + )} ) } diff --git a/apps/web/src/pages/Portfolio/PortfolioContent.tsx b/apps/web/src/pages/Portfolio/PortfolioContent.tsx new file mode 100644 index 00000000000..9f859aaa643 --- /dev/null +++ b/apps/web/src/pages/Portfolio/PortfolioContent.tsx @@ -0,0 +1,42 @@ +import PortfolioActivity from 'pages/Portfolio/Activity/Activity' +import PortfolioDefi from 'pages/Portfolio/Defi' +import { usePortfolioParams } from 'pages/Portfolio/Header/hooks/usePortfolioParams' +import { usePortfolioTabsAnimation } from 'pages/Portfolio/Header/hooks/usePortfolioTabsAnimation' +import PortfolioNfts from 'pages/Portfolio/NFTs/Nfts' +import PortfolioOverview from 'pages/Portfolio/Overview' +import PortfolioTokens from 'pages/Portfolio/Tokens/Tokens' +import { PortfolioTab } from 'pages/Portfolio/types' +import { useLocation } from 'react-router' +import { Flex } from 'ui/src' +import { TransitionItem } from 'ui/src/animations/components/AnimatePresencePager' + +const renderPortfolioContent = (tab: PortfolioTab | undefined) => { + switch (tab) { + case PortfolioTab.Overview: + return + case PortfolioTab.Tokens: + return + case PortfolioTab.Defi: + return + case PortfolioTab.Nfts: + return + case PortfolioTab.Activity: + return + default: + return + } +} + +export function PortfolioContent({ disabled }: { disabled?: boolean }): JSX.Element { + const { pathname } = useLocation() + const animationType = usePortfolioTabsAnimation(pathname) + const { tab } = usePortfolioParams() + + return ( + + + {renderPortfolioContent(tab)} + + + ) +} diff --git a/apps/web/src/pages/Portfolio/PortfolioDisconnectedView.tsx b/apps/web/src/pages/Portfolio/PortfolioDisconnectedView.tsx new file mode 100644 index 00000000000..fe9e4c354d6 --- /dev/null +++ b/apps/web/src/pages/Portfolio/PortfolioDisconnectedView.tsx @@ -0,0 +1,105 @@ +import DISCONNECTED_B_DARK from 'assets/images/portfolio-page-promo/dark.svg' +import DISCONNECTED_B_LIGHT from 'assets/images/portfolio-page-promo/light.svg' +import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' +import { useTranslation } from 'react-i18next' +import { Button, Flex, Image, Text, useIsDarkMode, useSporeColors } from 'ui/src' +import { INTERFACE_NAV_HEIGHT } from 'ui/src/theme' +import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' + +const PADDING_TOP = 60 +const NAV_BORDER_WIDTH = 1 +const OFFSET_TOP = INTERFACE_NAV_HEIGHT + NAV_BORDER_WIDTH +const LEFT_CONTENT_MAX_WIDTH = 262 + +export default function PortfolioDisconnectedView() { + const { t } = useTranslation() + const enabledChains = useEnabledChains() + const isDarkMode = useIsDarkMode() + const accountDrawer = useAccountDrawer() + const colors = useSporeColors() + + return ( + + + + + {t('common.getStarted')} + + + {t('portfolio.disconnected.cta.description', { numNetworks: enabledChains.chains.length })} + + + + + + + + + + + ) +} diff --git a/apps/web/src/pages/Portfolio/Tokens/Table/TokensContextMenuWrapper.tsx b/apps/web/src/pages/Portfolio/Tokens/Table/TokensContextMenuWrapper.tsx index ae185fdcc14..3bd16b1bd30 100644 --- a/apps/web/src/pages/Portfolio/Tokens/Table/TokensContextMenuWrapper.tsx +++ b/apps/web/src/pages/Portfolio/Tokens/Table/TokensContextMenuWrapper.tsx @@ -1,3 +1,4 @@ +import useIsConnected from 'pages/Portfolio/Header/hooks/useIsConnected' import { TokenData } from 'pages/Portfolio/Tokens/hooks/useTransformTokenTableData' import { PropsWithChildren, useMemo } from 'react' import { ContextMenuTriggerMode } from 'uniswap/src/components/menus/types' @@ -9,6 +10,7 @@ export default function TokensContextMenuWrapper({ triggerMode, children, }: PropsWithChildren<{ tokenData: TokenData; triggerMode?: ContextMenuTriggerMode }>): React.ReactNode { + const isConnected = useIsConnected() const portfolioBalance: PortfolioBalance | undefined = useMemo(() => { if (!tokenData.currencyInfo) { return undefined @@ -25,7 +27,7 @@ export default function TokensContextMenuWrapper({ } }, [tokenData.currencyInfo, tokenData.id, tokenData.balance.value, tokenData.change1d, tokenData.rawValue]) - if (!portfolioBalance) { + if (!portfolioBalance || !isConnected) { return children } diff --git a/apps/web/src/pages/Portfolio/Tokens/Table/TokensTable.tsx b/apps/web/src/pages/Portfolio/Tokens/Table/TokensTable.tsx new file mode 100644 index 00000000000..39c41307320 --- /dev/null +++ b/apps/web/src/pages/Portfolio/Tokens/Table/TokensTable.tsx @@ -0,0 +1,56 @@ +import { NetworkStatus } from '@apollo/client' +import { TokenData } from 'pages/Portfolio/Tokens/hooks/useTransformTokenTableData' +import TokensTableInner from 'pages/Portfolio/Tokens/Table/TokensTableInner' +import { useState } from 'react' +import { useTranslation } from 'react-i18next' +import { ScrollSync } from 'react-scroll-sync' +import { Flex, HeightAnimator, Text, TouchableArea } from 'ui/src' +import { AnglesDownUp } from 'ui/src/components/icons/AnglesDownUp' +import { SortVertical } from 'ui/src/components/icons/SortVertical' + +interface TokensTableProps { + visible: TokenData[] + hidden: TokenData[] + loading: boolean + refetching?: boolean + networkStatus: NetworkStatus + error?: Error | undefined +} + +export default function TokensTable({ visible, hidden, loading, refetching, networkStatus, error }: TokensTableProps) { + const { t } = useTranslation() + const [isOpen, setIsOpen] = useState(false) + const tableLoading = loading && !refetching + + return ( + // Scroll Sync Architecture: + // - Outer ScrollSync coordinates horizontal scrolling between visible and hidden tables + // - Each TokensTableInner uses externalScrollSync=true to skip its own ScrollSync wrapper + // - Both tables use ScrollSyncPane with scrollGroup="portfolio-tokens" for coordination + // - DO NOT remove this outer ScrollSync wrapper without updating the Table components + + + + {hidden.length > 0 && ( + <> + setIsOpen(!isOpen)} row gap="$gap8" p="$spacing16"> + + {t('hidden.tokens.info.text.button', { numHidden: hidden.length })} + + + {isOpen ? ( + + ) : ( + + )} + + + + + + + )} + + + ) +} diff --git a/apps/web/src/pages/Portfolio/Tokens/Table/Table.tsx b/apps/web/src/pages/Portfolio/Tokens/Table/TokensTableInner.tsx similarity index 66% rename from apps/web/src/pages/Portfolio/Tokens/Table/Table.tsx rename to apps/web/src/pages/Portfolio/Tokens/Table/TokensTableInner.tsx index e7f13d1fd33..aeb4600af6a 100644 --- a/apps/web/src/pages/Portfolio/Tokens/Table/Table.tsx +++ b/apps/web/src/pages/Portfolio/Tokens/Table/TokensTableInner.tsx @@ -15,12 +15,29 @@ import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import { Text } from 'ui/src' -export default function TokensTable({ tokenData }: { tokenData: TokenData[] }) { +const hasRow = (obj: unknown): obj is { row: { original: T } } => { + const maybeRow = (obj as { row?: unknown }).row + return typeof maybeRow === 'object' && maybeRow !== null && 'original' in maybeRow && maybeRow.original !== undefined +} + +export default function TokensTableInner({ + tokenData, + hideHeader, + loading = false, + error, +}: { + tokenData: TokenData[] + hideHeader?: boolean + loading?: boolean + error?: Error | undefined +}) { const { t } = useTranslation() + const showLoadingSkeleton = loading || !!error // Create table columns const columns = useMemo(() => { const columnHelper = createColumnHelper() + return [ columnHelper.accessor('currencyInfo', { header: () => ( @@ -31,10 +48,9 @@ export default function TokensTable({ tokenData }: { tokenData: TokenData[] }) { ), cell: (info) => { - const currencyInfo = info.getValue() return ( - - + + ) }, @@ -48,10 +64,9 @@ export default function TokensTable({ tokenData }: { tokenData: TokenData[] }) { ), cell: (info) => { - const value = info.getValue() return ( - - + + ) }, @@ -65,10 +80,9 @@ export default function TokensTable({ tokenData }: { tokenData: TokenData[] }) { ), cell: (info) => { - const value = info.getValue() return ( - - + + ) }, @@ -82,10 +96,9 @@ export default function TokensTable({ tokenData }: { tokenData: TokenData[] }) { ), cell: (info) => { - const value = info.getValue() return ( - - + + ) }, @@ -99,11 +112,9 @@ export default function TokensTable({ tokenData }: { tokenData: TokenData[] }) { ), cell: (info) => { - const value = info.getValue() - return ( - - + + ) }, @@ -117,10 +128,9 @@ export default function TokensTable({ tokenData }: { tokenData: TokenData[] }) { ), cell: (info) => { - const value = info.getValue() return ( - - + + ) }, @@ -130,28 +140,33 @@ export default function TokensTable({ tokenData }: { tokenData: TokenData[] }) { size: 40, header: () => , cell: (info) => { - const tokenData = info.row.original + const tokenData = hasRow(info) ? info.row.original : undefined return ( - - + + {tokenData && } ) }, }), ] - }, [t]) + }, [t, showLoadingSkeleton]) return (
row.id} - rowWrapper={(row, content) => ( - {content} - )} + rowWrapper={ + loading + ? undefined + : (row, content) => {content} + } /> ) } diff --git a/apps/web/src/pages/Portfolio/Tokens/Table/columns/Balance.tsx b/apps/web/src/pages/Portfolio/Tokens/Table/columns/Balance.tsx index 8a0d4a018f0..9a9a00ac191 100644 --- a/apps/web/src/pages/Portfolio/Tokens/Table/columns/Balance.tsx +++ b/apps/web/src/pages/Portfolio/Tokens/Table/columns/Balance.tsx @@ -10,7 +10,7 @@ const Balance = memo(function Balance({ value, symbol }: TokenData['balance']) { } return ( - + {symbol} ) diff --git a/apps/web/src/pages/Portfolio/Tokens/Tokens.tsx b/apps/web/src/pages/Portfolio/Tokens/Tokens.tsx index 3b44943cf6f..4e44c419bcf 100644 --- a/apps/web/src/pages/Portfolio/Tokens/Tokens.tsx +++ b/apps/web/src/pages/Portfolio/Tokens/Tokens.tsx @@ -1,27 +1,122 @@ -import { useAccount } from 'hooks/useAccount' +import { SearchInput } from 'pages/Portfolio/components/SearchInput' +import { usePortfolioParams } from 'pages/Portfolio/Header/hooks/usePortfolioParams' +import { usePortfolioAddress } from 'pages/Portfolio/hooks/usePortfolioAddress' import { useTransformTokenTableData } from 'pages/Portfolio/Tokens/hooks/useTransformTokenTableData' -import TokensTable from 'pages/Portfolio/Tokens/Table/Table' import { TokensAllocationChart } from 'pages/Portfolio/Tokens/Table/TokensAllocationChart' -import { Flex } from 'ui/src' +import TokensTable from 'pages/Portfolio/Tokens/Table/TokensTable' +import { filterTokensBySearch } from 'pages/Portfolio/Tokens/utils/filterTokensBySearch' +import { memo, useMemo, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { Flex, RemoveScroll, Text } from 'ui/src' +import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { PortfolioBalance } from 'uniswap/src/features/portfolio/PortfolioBalance/PortfolioBalance' import { InterfacePageName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' +import { parseChainFromTokenSearchQuery } from 'uniswap/src/utils/search/parseChainFromTokenSearchQuery' + +const TokenCountIndicator = memo(({ count }: { count: number }) => { + const { t } = useTranslation() + + return ( + + + + {t('portfolio.tokens.balance.totalTokens', { numTokens: count })} + + + ) +}) + +TokenCountIndicator.displayName = 'TokenCountIndicator' export default function PortfolioTokens() { - const account = useAccount() - const tokenData = useTransformTokenTableData() + const portfolioAddress = usePortfolioAddress() + const { t } = useTranslation() + const [search, setSearch] = useState('') + const { chains: enabledChains } = useEnabledChains() + const { chainId: urlChainId } = usePortfolioParams() + + // Parse search query to extract chain filter and search term + const { chainFilter, searchTerm } = useMemo(() => { + return parseChainFromTokenSearchQuery(search, enabledChains) + }, [search, enabledChains]) + + // Use URL chain ID as primary filter, search chain filter as fallback + const effectiveChainId = urlChainId || chainFilter + + // Get token data filtered by chain at API level + const { + visible: tokenData, + hidden: hiddenTokenData, + loading, + refetching, + networkStatus, + error, + } = useTransformTokenTableData({ + chainIds: effectiveChainId ? [effectiveChainId] : undefined, + }) + + // Filter tokens by search term at client level (chain filtering is handled at API level) + const filteredTokenData = useMemo(() => { + return filterTokensBySearch({ tokens: tokenData || [], searchTerm }) + // return filterTokensBySearch({ tokens: tokenData, searchTerm }) || [] + }, [tokenData, searchTerm]) + + const filteredHiddenTokenData = useMemo(() => { + return filterTokensBySearch({ tokens: hiddenTokenData || [], searchTerm }) || [] + }, [hiddenTokenData, searchTerm]) return ( - - {account.address && ( + + - - - + + : undefined} + /> + + - + {(tokenData && tokenData.length > 0) || loading ? ( + <> + + {(filteredTokenData?.length ?? 0) > 0 || loading ? ( + - )} - + + ) } diff --git a/apps/web/src/pages/Portfolio/Tokens/hooks/useTransformTokenTableData.ts b/apps/web/src/pages/Portfolio/Tokens/hooks/useTransformTokenTableData.ts index 082c0562e57..2812331fa28 100644 --- a/apps/web/src/pages/Portfolio/Tokens/hooks/useTransformTokenTableData.ts +++ b/apps/web/src/pages/Portfolio/Tokens/hooks/useTransformTokenTableData.ts @@ -1,6 +1,9 @@ -import { useAccount } from 'hooks/useAccount' +import { NetworkStatus } from '@apollo/client' +import { usePortfolioAddress } from 'pages/Portfolio/hooks/usePortfolioAddress' import { useMemo } from 'react' +import { UniverseChainId } from 'uniswap/src/features/chains/types' import { useSortedPortfolioBalances } from 'uniswap/src/features/dataApi/balances/balances' +import type { PortfolioBalance } from 'uniswap/src/features/dataApi/types' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { NumberType } from 'utilities/src/format/types' @@ -20,41 +23,54 @@ export interface TokenData { } // Custom hook to format portfolio data -export function useTransformTokenTableData(): TokenData[] { - const account = useAccount() - const { data: portfolioData, loading } = useSortedPortfolioBalances({ - evmAddress: account.address || undefined, - }) +export function useTransformTokenTableData({ chainIds }: { chainIds?: UniverseChainId[] }): { + visible: TokenData[] | null + hidden: TokenData[] | null + loading: boolean + refetching: boolean + error: Error | undefined + refetch: (() => void) | undefined + networkStatus: NetworkStatus +} { + const portfolioAddress = usePortfolioAddress() const { convertFiatAmountFormatted, formatNumberOrString } = useLocalizationContext() + const { + data: sortedBalances, + loading, + error, + refetch, + networkStatus, + } = useSortedPortfolioBalances({ + evmAddress: portfolioAddress, + chainIds, + }) + return useMemo(() => { - if (!account.address || !portfolioData?.balances || loading) { - return [] + // Only show empty state on initial load, not during refetch + const isInitialLoading = loading && !sortedBalances + const isRefetching = loading && !!sortedBalances + + if (isInitialLoading) { + return { visible: null, hidden: null, loading, refetching: false, error, refetch, networkStatus } + } + + if (!sortedBalances) { + return { visible: [], hidden: [], loading, refetching: false, error, refetch, networkStatus } } // Compute total USD across visible balances to determine allocation per token - const totalUSD = portfolioData.balances.reduce((sum, b) => sum + (b.balanceUSD ?? 0), 0) + const totalUSDVisible = sortedBalances.balances.reduce((sum, b) => sum + (b.balanceUSD ?? 0), 0) - return portfolioData.balances.map((balance) => { - // Format price (using balanceUSD / quantity for now, could be improved with actual price data) + const mapBalanceToTokenData = (balance: PortfolioBalance, allocationFromTotal?: number): TokenData => { const price = balance.balanceUSD && balance.quantity > 0 ? convertFiatAmountFormatted(balance.balanceUSD / balance.quantity, NumberType.FiatTokenPrice) : '$0.00' - // Format balance quantity - const formattedBalance = formatNumberOrString({ - value: balance.quantity, - type: NumberType.TokenNonTx, - }) - - // Format USD value + const formattedBalance = formatNumberOrString({ value: balance.quantity, type: NumberType.TokenNonTx }) const value = convertFiatAmountFormatted(balance.balanceUSD, NumberType.PortfolioBalance) - // Allocation percentage of this token vs total portfolio USD (0..100) - const balanceUSD = balance.balanceUSD ?? 0 - const allocation = totalUSD > 0 ? (balanceUSD / totalUSD) * 100 : 0 - return { id: balance.id, currencyInfo: balance.currencyInfo, @@ -66,8 +82,18 @@ export function useTransformTokenTableData(): TokenData[] { }, value, rawValue: balance.balanceUSD, - allocation, + allocation: allocationFromTotal ?? 0, } + } + + const visible = sortedBalances.balances.map((b) => { + const balanceUSD = b.balanceUSD ?? 0 + const allocation = totalUSDVisible > 0 ? (balanceUSD / totalUSDVisible) * 100 : 0 + return mapBalanceToTokenData(b, allocation) }) - }, [account.address, portfolioData?.balances, loading, convertFiatAmountFormatted, formatNumberOrString]) + + const hidden = sortedBalances.hiddenBalances.map((b) => mapBalanceToTokenData(b, 0)) + + return { visible, hidden, loading, refetching: isRefetching, refetch, networkStatus, error } + }, [loading, sortedBalances, convertFiatAmountFormatted, formatNumberOrString, error, refetch, networkStatus]) } diff --git a/apps/web/src/pages/Portfolio/Tokens/utils/filterTokensBySearch.test.ts b/apps/web/src/pages/Portfolio/Tokens/utils/filterTokensBySearch.test.ts new file mode 100644 index 00000000000..ab64034b7bb --- /dev/null +++ b/apps/web/src/pages/Portfolio/Tokens/utils/filterTokensBySearch.test.ts @@ -0,0 +1,280 @@ +import { Currency } from '@uniswap/sdk-core' +import { filterTokensBySearch } from 'pages/Portfolio/Tokens/utils/filterTokensBySearch' +import { TEST_TOKEN_1 } from 'test-utils/constants' + +// Mock the doesTokenMatchSearchTerm function to have full control over test scenarios +vi.mock('uniswap/src/utils/search/doesTokenMatchSearchTerm', () => ({ + doesTokenMatchSearchTerm: vi.fn(), +})) + +import { doesTokenMatchSearchTerm } from 'uniswap/src/utils/search/doesTokenMatchSearchTerm' + +const mockDoesTokenMatchSearchTerm = vi.mocked(doesTokenMatchSearchTerm) + +// Test data factory functions using test tokens +const createMockCurrencyInfo = ( + overrides: Partial<{ currencyId: string; currency: Currency }> = {}, +): { currencyId: string; currency: Currency } => ({ + currencyId: 'TEST', + currency: TEST_TOKEN_1, // Default to TEST_TOKEN_1 + ...overrides, +}) + +const createMockTokenWithInfo = ( + overrides: Partial<{ currencyInfo: { currencyId: string; currency: Currency } | null }> = {}, +): { currencyInfo: { currencyId: string; currency: Currency } | null } => ({ + currencyInfo: createMockCurrencyInfo(), + ...overrides, +}) + +describe('filterTokensBySearch', () => { + beforeEach(() => { + vi.clearAllMocks() + }) + + describe('when searchTerm is empty or undefined', () => { + it('should return all tokens when searchTerm is undefined', () => { + const tokens = [createMockTokenWithInfo(), createMockTokenWithInfo()] + + const result = filterTokensBySearch({ + tokens, + searchTerm: undefined, + }) + + expect(result).toBe(tokens) + expect(mockDoesTokenMatchSearchTerm).not.toHaveBeenCalled() + }) + + it('should return all tokens when searchTerm is null', () => { + const tokens = [createMockTokenWithInfo(), createMockTokenWithInfo()] + + const result = filterTokensBySearch({ + tokens, + searchTerm: null, + }) + + expect(result).toBe(tokens) + expect(mockDoesTokenMatchSearchTerm).not.toHaveBeenCalled() + }) + + it('should return all tokens when searchTerm is empty string', () => { + const tokens = [createMockTokenWithInfo(), createMockTokenWithInfo()] + + const result = filterTokensBySearch({ + tokens, + searchTerm: '', + }) + + expect(result).toBe(tokens) + expect(mockDoesTokenMatchSearchTerm).not.toHaveBeenCalled() + }) + + it('should return all tokens when searchTerm is only whitespace', () => { + const tokens = [createMockTokenWithInfo(), createMockTokenWithInfo()] + + const result = filterTokensBySearch({ + tokens, + searchTerm: ' ', + }) + + expect(result).toBe(tokens) + expect(mockDoesTokenMatchSearchTerm).not.toHaveBeenCalled() + }) + }) + + describe('when tokens array is undefined', () => { + it('should return undefined when tokens is undefined', () => { + const result = filterTokensBySearch({ + tokens: undefined, + searchTerm: 'test', + }) + + expect(result).toBeUndefined() + expect(mockDoesTokenMatchSearchTerm).not.toHaveBeenCalled() + }) + }) + + describe('when tokens array is empty', () => { + it('should return empty array when tokens is empty', () => { + const result = filterTokensBySearch({ + tokens: [], + searchTerm: 'test', + }) + + expect(result).toEqual([]) + expect(mockDoesTokenMatchSearchTerm).not.toHaveBeenCalled() + }) + }) + + describe('when filtering with valid search term', () => { + it('should filter tokens based on doesTokenMatchSearchTerm results', () => { + const token1 = createMockTokenWithInfo() + const token2 = createMockTokenWithInfo() + const token3 = createMockTokenWithInfo() + const tokens = [token1, token2, token3] + + // Mock the search function to return different results for each token + mockDoesTokenMatchSearchTerm + .mockReturnValueOnce(true) // token1 matches + .mockReturnValueOnce(false) // token2 doesn't match + .mockReturnValueOnce(true) // token3 matches + + const result = filterTokensBySearch({ + tokens, + searchTerm: 'test', + }) + + expect(result).toEqual([token1, token3]) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledTimes(3) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledWith(token1, 'test') + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledWith(token2, 'test') + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledWith(token3, 'test') + }) + + it('should return empty array when no tokens match', () => { + const token1 = createMockTokenWithInfo() + const token2 = createMockTokenWithInfo() + const tokens = [token1, token2] + + mockDoesTokenMatchSearchTerm.mockReturnValueOnce(false).mockReturnValueOnce(false) + + const result = filterTokensBySearch({ + tokens, + searchTerm: 'nonexistent', + }) + + expect(result).toEqual([]) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledTimes(2) + }) + + it('should return all tokens when all tokens match', () => { + const token1 = createMockTokenWithInfo() + const token2 = createMockTokenWithInfo() + const tokens = [token1, token2] + + mockDoesTokenMatchSearchTerm.mockReturnValueOnce(true).mockReturnValueOnce(true) + + const result = filterTokensBySearch({ + tokens, + searchTerm: 'common', + }) + + expect(result).toEqual(tokens) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledTimes(2) + }) + }) + + describe('with different token types', () => { + it('should work with tokens that have currencyInfo', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currencyId: 'ABC', + currency: TEST_TOKEN_1, // Use TEST_TOKEN_1 (symbol: 'ABC', name: 'Abc') + }), + }) + + mockDoesTokenMatchSearchTerm.mockReturnValue(true) + + const result = filterTokensBySearch({ + tokens: [token], + searchTerm: 'abc', + }) + + expect(result).toEqual([token]) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledWith(token, 'abc') + }) + + it('should work with tokens that have null currencyInfo', () => { + const token = createMockTokenWithInfo({ + currencyInfo: null, + }) + + mockDoesTokenMatchSearchTerm.mockReturnValue(false) + + const result = filterTokensBySearch({ + tokens: [token], + searchTerm: 'test', + }) + + expect(result).toEqual([]) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledWith(token, 'test') + }) + }) + + describe('edge cases', () => { + it('should handle single token array', () => { + const token = createMockTokenWithInfo() + mockDoesTokenMatchSearchTerm.mockReturnValue(true) + + const result = filterTokensBySearch({ + tokens: [token], + searchTerm: 'test', + }) + + expect(result).toEqual([token]) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledTimes(1) + }) + + it('should preserve original array reference when no filtering occurs', () => { + const tokens = [createMockTokenWithInfo()] + + const result = filterTokensBySearch({ + tokens, + searchTerm: undefined, + }) + + expect(result).toBe(tokens) + }) + + it('should handle search term with special characters', () => { + const token = createMockTokenWithInfo() + mockDoesTokenMatchSearchTerm.mockReturnValue(true) + + const result = filterTokensBySearch({ + tokens: [token], + searchTerm: 'test@#$%^&*()', + }) + + expect(result).toEqual([token]) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledWith(token, 'test@#$%^&*()') + }) + + it('should handle very long search terms', () => { + const token = createMockTokenWithInfo() + const longSearchTerm = 'a'.repeat(1000) + mockDoesTokenMatchSearchTerm.mockReturnValue(false) + + const result = filterTokensBySearch({ + tokens: [token], + searchTerm: longSearchTerm, + }) + + expect(result).toEqual([]) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledWith(token, longSearchTerm) + }) + }) + + describe('type safety', () => { + it('should work with generic token types', () => { + interface ExtendedToken { + currencyInfo: { currencyId: string; currency: Currency } | null + customProperty: string + } + + const extendedToken: ExtendedToken = { + currencyInfo: createMockCurrencyInfo(), + customProperty: 'test', + } + + mockDoesTokenMatchSearchTerm.mockReturnValue(true) + + const result = filterTokensBySearch({ + tokens: [extendedToken], + searchTerm: 'test', + }) + + expect(result).toEqual([extendedToken]) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledWith(extendedToken, 'test') + }) + }) +}) diff --git a/apps/web/src/pages/Portfolio/Tokens/utils/filterTokensBySearch.ts b/apps/web/src/pages/Portfolio/Tokens/utils/filterTokensBySearch.ts new file mode 100644 index 00000000000..7fa87992045 --- /dev/null +++ b/apps/web/src/pages/Portfolio/Tokens/utils/filterTokensBySearch.ts @@ -0,0 +1,28 @@ +import { Currency } from '@uniswap/sdk-core' +import { doesTokenMatchSearchTerm } from 'uniswap/src/utils/search/doesTokenMatchSearchTerm' + +/** + * Filters tokens based on search criteria (name, symbol, address, chain name). + * This is a pure utility function for client-side filtering. + * + * @param tokens - Array of tokens to filter + * @param searchTerm - Search term to match against + * @param enabledChains - Array of enabled chain IDs to search within + * @returns Filtered array of tokens that match the search criteria + */ +export function filterTokensBySearch({ + tokens, + searchTerm, +}: { + tokens: T[] | undefined + searchTerm: string | undefined | null +}): T[] | undefined { + const trimmedSearchTerm = searchTerm?.trim() + if (!trimmedSearchTerm) { + return tokens + } + + return tokens?.filter((token) => { + return doesTokenMatchSearchTerm(token, trimmedSearchTerm) + }) +} diff --git a/apps/web/src/pages/Portfolio/hooks/usePortfolioAddress.ts b/apps/web/src/pages/Portfolio/hooks/usePortfolioAddress.ts new file mode 100644 index 00000000000..b3909dc2a0d --- /dev/null +++ b/apps/web/src/pages/Portfolio/hooks/usePortfolioAddress.ts @@ -0,0 +1,13 @@ +/* eslint-disable-next-line no-restricted-imports, no-restricted-syntax */ +import { useAccount } from 'hooks/useAccount' + +// This is the address used for the disconnected demo view. It is only used in the disconnected state for the portfolio page. +const DEMO_WALLET_ADDRESS = '0x8796207d877194d97a2c360c041f13887896FC79' + +export function usePortfolioAddress() { + const account = useAccount() + if (!account.address) { + return DEMO_WALLET_ADDRESS + } + return account.address +} diff --git a/apps/web/src/pages/Positions/ClaimFees.anvil.e2e.test.ts b/apps/web/src/pages/Positions/ClaimFees.anvil.e2e.test.ts index 1d50f7b36b5..670e989ec5c 100644 --- a/apps/web/src/pages/Positions/ClaimFees.anvil.e2e.test.ts +++ b/apps/web/src/pages/Positions/ClaimFees.anvil.e2e.test.ts @@ -1,4 +1,4 @@ -import { getPosition } from '@uniswap/client-pools/dist/pools/v1/api-PoolsService_connectquery' +import { getPosition } from '@uniswap/client-data-api/dist/data/v1/api-DataApiService_connectquery' import { createExpectSingleTransaction } from 'playwright/anvil/transactions' import { expect, getTest } from 'playwright/fixtures' import { DEFAULT_TEST_GAS_LIMIT, stubTradingApiEndpoint } from 'playwright/fixtures/tradingApi' diff --git a/apps/web/src/pages/Positions/PositionPage.tsx b/apps/web/src/pages/Positions/PositionPage.tsx index 44a4eda09fb..5f923abfd40 100644 --- a/apps/web/src/pages/Positions/PositionPage.tsx +++ b/apps/web/src/pages/Positions/PositionPage.tsx @@ -1,7 +1,8 @@ import { BigNumber } from '@ethersproject/bignumber' -import { Position, PositionStatus, ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { Position, PositionStatus, ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency, CurrencyAmount, Percent, Price } from '@uniswap/sdk-core' import { GraphQLApi } from '@universe/api' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { BreadcrumbNavContainer, BreadcrumbNavLink } from 'components/BreadcrumbNav' import { WrappedLiquidityPositionRangeChart } from 'components/Charts/LiquidityPositionRangeChart/LiquidityPositionRangeChart' import { Dropdown } from 'components/Dropdowns/Dropdown' @@ -56,8 +57,6 @@ import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import { useSupportedChainId } from 'uniswap/src/features/chains/hooks/useSupportedChainId' import { EVMUniverseChainId, UniverseChainId } from 'uniswap/src/features/chains/types' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { isEVMChain } from 'uniswap/src/features/platforms/utils/chains' import { InterfacePageName } from 'uniswap/src/features/telemetry/constants' diff --git a/apps/web/src/pages/Positions/TopPools.tsx b/apps/web/src/pages/Positions/TopPools.tsx index 18a5f69a9ff..92b14c1ebe2 100644 --- a/apps/web/src/pages/Positions/TopPools.tsx +++ b/apps/web/src/pages/Positions/TopPools.tsx @@ -2,6 +2,7 @@ import { PoolSortFields } from 'appGraphql/data/pools/useTopPools' import { OrderDirection } from 'appGraphql/data/util' import { ExploreStatsResponse } from '@uniswap/client-explore/dist/uniswap/explore/v1/service_pb' import { ALL_NETWORKS_ARG } from '@universe/api' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { ExternalArrowLink } from 'components/Liquidity/ExternalArrowLink' import { useAccount } from 'hooks/useAccount' import { TopPoolsSection } from 'pages/Positions/TopPoolsSection' @@ -10,8 +11,6 @@ import { useTopPools } from 'state/explore/topPools' import { Flex, useMedia } from 'ui/src' import { useExploreStatsQuery } from 'uniswap/src/data/rest/exploreStats' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' const MAX_BOOSTED_POOLS = 3 diff --git a/apps/web/src/pages/Positions/V2PositionPage.tsx b/apps/web/src/pages/Positions/V2PositionPage.tsx index 40cf64e6e4e..1b79fdd6bc5 100644 --- a/apps/web/src/pages/Positions/V2PositionPage.tsx +++ b/apps/web/src/pages/Positions/V2PositionPage.tsx @@ -1,4 +1,5 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { BreadcrumbNavContainer, BreadcrumbNavLink } from 'components/BreadcrumbNav' import { useGetPoolTokenPercentage } from 'components/Liquidity/hooks/useGetPoolTokenPercentage' import { LiquidityPositionInfo, LiquidityPositionInfoLoader } from 'components/Liquidity/LiquidityPositionInfo' @@ -25,8 +26,6 @@ import { useGetPositionQuery } from 'uniswap/src/data/rest/getPosition' import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import { useSupportedChainId } from 'uniswap/src/features/chains/hooks/useSupportedChainId' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { isEVMChain } from 'uniswap/src/features/platforms/utils/chains' import { useUSDCValue } from 'uniswap/src/features/transactions/hooks/useUSDCPrice' diff --git a/apps/web/src/pages/Positions/index.tsx b/apps/web/src/pages/Positions/index.tsx index 4fb2229256b..43c75054aeb 100644 --- a/apps/web/src/pages/Positions/index.tsx +++ b/apps/web/src/pages/Positions/index.tsx @@ -1,4 +1,5 @@ -import { PositionStatus, ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { PositionStatus, ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import PROVIDE_LIQUIDITY from 'assets/images/provideLiquidity.png' import tokenLogo from 'assets/images/token-logo.png' import V4_HOOK from 'assets/images/v4Hooks.png' @@ -34,8 +35,6 @@ import { uniswapUrls } from 'uniswap/src/constants/urls' import { useGetPositionsInfiniteQuery } from 'uniswap/src/data/rest/getPositions' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { InterfacePageName, UniswapEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' diff --git a/apps/web/src/pages/RemoveLiquidity/RemoveLiquidity.anvil.e2e.test.ts b/apps/web/src/pages/RemoveLiquidity/RemoveLiquidity.anvil.e2e.test.ts index 155481bbbbd..60cdd4784fb 100644 --- a/apps/web/src/pages/RemoveLiquidity/RemoveLiquidity.anvil.e2e.test.ts +++ b/apps/web/src/pages/RemoveLiquidity/RemoveLiquidity.anvil.e2e.test.ts @@ -1,4 +1,4 @@ -import { getPosition } from '@uniswap/client-pools/dist/pools/v1/api-PoolsService_connectquery' +import { getPosition } from '@uniswap/client-data-api/dist/data/v1/api-DataApiService_connectquery' import { ONE_MILLION_USDT } from 'playwright/anvil/utils' import { expect, getTest } from 'playwright/fixtures' import { stubTradingApiEndpoint } from 'playwright/fixtures/tradingApi' diff --git a/apps/web/src/pages/RemoveLiquidity/RemoveLiquidityModalContext.tsx b/apps/web/src/pages/RemoveLiquidity/RemoveLiquidityModalContext.tsx index 7dab6197615..0a558e17485 100644 --- a/apps/web/src/pages/RemoveLiquidity/RemoveLiquidityModalContext.tsx +++ b/apps/web/src/pages/RemoveLiquidity/RemoveLiquidityModalContext.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency } from '@uniswap/sdk-core' import { getCurrencyWithOptionalUnwrap } from 'components/Liquidity/utils/currency' import { useModalInitialState } from 'hooks/useModalInitialState' diff --git a/apps/web/src/pages/RemoveLiquidity/RemoveLiquidityReview.tsx b/apps/web/src/pages/RemoveLiquidity/RemoveLiquidityReview.tsx index 4e219497812..5ad7f04a845 100644 --- a/apps/web/src/pages/RemoveLiquidity/RemoveLiquidityReview.tsx +++ b/apps/web/src/pages/RemoveLiquidity/RemoveLiquidityReview.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { CurrencyAmount } from '@uniswap/sdk-core' import { getLPBaseAnalyticsProperties } from 'components/Liquidity/analytics' import { useGetPoolTokenPercentage } from 'components/Liquidity/hooks/useGetPoolTokenPercentage' diff --git a/apps/web/src/pages/RemoveLiquidity/hooks/useRemoveLiquidityTxAndGasInfo.ts b/apps/web/src/pages/RemoveLiquidity/hooks/useRemoveLiquidityTxAndGasInfo.ts index c64e786d904..7ddeb195330 100644 --- a/apps/web/src/pages/RemoveLiquidity/hooks/useRemoveLiquidityTxAndGasInfo.ts +++ b/apps/web/src/pages/RemoveLiquidity/hooks/useRemoveLiquidityTxAndGasInfo.ts @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { TradingApi } from '@universe/api' import { getTokenOrZeroAddress } from 'components/Liquidity/utils/currency' import { getProtocolItems } from 'components/Liquidity/utils/protocolVersion' diff --git a/apps/web/src/pages/RouteDefinitions.tsx b/apps/web/src/pages/RouteDefinitions.tsx index 794e24ecd46..675c2e7fd5f 100644 --- a/apps/web/src/pages/RouteDefinitions.tsx +++ b/apps/web/src/pages/RouteDefinitions.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { getExploreDescription, getExploreTitle } from 'pages/getExploreTitle' import { getAddLiquidityPageTitle, getPositionPageDescription, getPositionPageTitle } from 'pages/getPositionPageTitle' // High-traffic pages (index and /swap) should not be lazy-loaded. @@ -7,8 +8,6 @@ import { lazy, ReactNode, Suspense, useMemo } from 'react' import { matchPath, Navigate, Route, Routes, useLocation } from 'react-router' import { CHROME_EXTENSION_UNINSTALL_URL_PATH } from 'uniswap/src/constants/urls' import { WRAPPED_SOL_ADDRESS_SOLANA } from 'uniswap/src/features/chains/svm/defaults' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { EXTENSION_PASSKEY_AUTH_PATH } from 'uniswap/src/features/passkey/constants' import i18n from 'uniswap/src/i18n' import { isBrowserRouterEnabled } from 'utils/env' diff --git a/apps/web/src/pages/Swap/Buy/Buy.e2e.test.ts b/apps/web/src/pages/Swap/Buy/Buy.e2e.test.ts index 5a725eb6dc7..2feb4d89169 100644 --- a/apps/web/src/pages/Swap/Buy/Buy.e2e.test.ts +++ b/apps/web/src/pages/Swap/Buy/Buy.e2e.test.ts @@ -1,5 +1,7 @@ import { expect, getTest } from 'playwright/fixtures' +import { stubTradingApiEndpoint } from 'playwright/fixtures/tradingApi' import { Mocks } from 'playwright/mocks/mocks' +import { uniswapUrls } from 'uniswap/src/constants/urls' import { TestID } from 'uniswap/src/test/fixtures/testIDs' const test = getTest() @@ -20,6 +22,7 @@ test.describe('Buy Crypto Form', () => { }) } + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) await page.goto('/buy') // Wait for wallet to be connected diff --git a/apps/web/src/pages/Swap/Buy/hooks.ts b/apps/web/src/pages/Swap/Buy/hooks.ts index 975c5d00a40..41d10539e82 100644 --- a/apps/web/src/pages/Swap/Buy/hooks.ts +++ b/apps/web/src/pages/Swap/Buy/hooks.ts @@ -1,4 +1,5 @@ import { useMeldSupportedCurrencyToCurrencyInfo } from 'appGraphql/data/types' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useSearchParams } from 'react-router' @@ -17,8 +18,6 @@ import { FORCountry, OffRampTransferDetailsRequest, } from 'uniswap/src/features/fiatOnRamp/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' // biome-ignore lint/style/noRestrictedImports: Buy hooks need direct SDK imports import { getFiatCurrencyComponents } from 'utilities/src/format/localeBased' diff --git a/apps/web/src/pages/Swap/Fees.anvil.e2e.test.ts b/apps/web/src/pages/Swap/Fees.anvil.e2e.test.ts index cda699f73ca..9ba01796841 100644 --- a/apps/web/src/pages/Swap/Fees.anvil.e2e.test.ts +++ b/apps/web/src/pages/Swap/Fees.anvil.e2e.test.ts @@ -10,6 +10,7 @@ const test = getTest({ withAnvil: true }) test.describe('Fees', () => { test('swaps ETH for USDC exact-in with swap fee', async ({ page, anvil }) => { await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) await page.goto(`/swap?inputCurrency=ETH&outputCurrency=${USDC_MAINNET.address}`) diff --git a/apps/web/src/pages/Swap/Fees.e2e.test.ts b/apps/web/src/pages/Swap/Fees.e2e.test.ts index 2c6564b3a16..c7b33190f5d 100644 --- a/apps/web/src/pages/Swap/Fees.e2e.test.ts +++ b/apps/web/src/pages/Swap/Fees.e2e.test.ts @@ -1,15 +1,16 @@ +import { Layers, PriceUxUpdateProperties } from '@universe/gating' import { expect, getTest } from 'playwright/fixtures' import { stubTradingApiEndpoint } from 'playwright/fixtures/tradingApi' import { Mocks } from 'playwright/mocks/mocks' import { DAI, USDC_MAINNET } from 'uniswap/src/constants/tokens' import { uniswapUrls } from 'uniswap/src/constants/urls' -import { Layers, PriceUxUpdateProperties } from 'uniswap/src/features/gating/experiments' import { TestID } from 'uniswap/src/test/fixtures/testIDs' const test = getTest() test.describe('Fees', () => { test('should not display fee on swaps without fees', async ({ page }) => { + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) await page.goto(`/swap?inputCurrency=${DAI.address}&outputCurrency=${USDC_MAINNET.address}`) // Enter amount @@ -23,6 +24,7 @@ test.describe('Fees', () => { }) test('displays UniswapX fee in UI', async ({ page }) => { + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) await page.goto( diff --git a/apps/web/src/pages/Swap/Limit/LimitForm.tsx b/apps/web/src/pages/Swap/Limit/LimitForm.tsx index 6ae17550be7..762c656b716 100644 --- a/apps/web/src/pages/Swap/Limit/LimitForm.tsx +++ b/apps/web/src/pages/Swap/Limit/LimitForm.tsx @@ -1,5 +1,6 @@ import { Currency, CurrencyAmount, Token } from '@uniswap/sdk-core' import { UNIVERSAL_ROUTER_ADDRESS, UniversalRouterVersion } from '@uniswap/universal-router-sdk' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' import { OpenLimitOrdersButton } from 'components/AccountDrawer/MiniPortfolio/Limits/OpenLimitOrdersButton' import { MenuStateVariant, useSetMenu } from 'components/AccountDrawer/menuState' @@ -40,8 +41,6 @@ import { uniswapUrls } from 'uniswap/src/constants/urls' import { LIMIT_SUPPORTED_CHAINS } from 'uniswap/src/features/chains/chainInfo' import { useIsSupportedChainId } from 'uniswap/src/features/chains/hooks/useSupportedChainId' import { getPrimaryStablecoin } from 'uniswap/src/features/chains/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { isEVMChain } from 'uniswap/src/features/platforms/utils/chains' import { useIsMismatchAccountQuery } from 'uniswap/src/features/smartWallet/mismatch/hooks' diff --git a/apps/web/src/pages/Swap/Logging.anvil.e2e.test.ts b/apps/web/src/pages/Swap/Logging.anvil.e2e.test.ts index 0c679d6bb32..ff6221750f6 100644 --- a/apps/web/src/pages/Swap/Logging.anvil.e2e.test.ts +++ b/apps/web/src/pages/Swap/Logging.anvil.e2e.test.ts @@ -16,6 +16,7 @@ test.describe('Time-to-swap logging', () => { anvil, }) => { await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) await page.goto(`/swap?inputCurrency=ETH&outputCurrency=${USDC_MAINNET.address}`) const expectMultipleTransactions = createExpectMultipleTransactions({ diff --git a/apps/web/src/pages/Swap/Send/NewAddressSpeedBump.test.tsx b/apps/web/src/pages/Swap/Send/NewAddressSpeedBump.test.tsx index 7c2a01a89ad..35ef25f0b89 100644 --- a/apps/web/src/pages/Swap/Send/NewAddressSpeedBump.test.tsx +++ b/apps/web/src/pages/Swap/Send/NewAddressSpeedBump.test.tsx @@ -22,8 +22,9 @@ const mockSendContext: SendContextType = { setSendState: vi.fn(), } -vi.mock('uniswap/src/features/gating/hooks', () => { +vi.mock('@universe/gating', async (importOriginal) => { return { + ...(await importOriginal()), useFeatureFlag: vi.fn(), getFeatureFlag: vi.fn(), } diff --git a/apps/web/src/pages/Swap/Send/SendForm.tsx b/apps/web/src/pages/Swap/Send/SendForm.tsx index 064fc5844a0..69a680ca15e 100644 --- a/apps/web/src/pages/Swap/Send/SendForm.tsx +++ b/apps/web/src/pages/Swap/Send/SendForm.tsx @@ -13,7 +13,6 @@ import { useTranslation } from 'react-i18next' import { useSendContext } from 'state/send/SendContext' import { CurrencyState } from 'state/swap/types' import { Button, Flex } from 'ui/src' -import { checkIsBridgedAsset } from 'uniswap/src/components/BridgedAsset/utils' import { GetHelpHeader } from 'uniswap/src/components/dialog/GetHelpHeader' import { uniswapUrls } from 'uniswap/src/constants/urls' import { useActiveAddress, useConnectionStatus } from 'uniswap/src/features/accounts/store/hooks' @@ -114,7 +113,7 @@ function SendFormInner({ disableTokenInputs = false, onCurrencyChange }: SendFor const { tokenWarningDismissed: isCompatibleAddressDismissed } = useDismissedCompatibleAddressWarnings( inputCurrencyInfo?.currency, ) - const isUnichainBridgedAsset = checkIsBridgedAsset(inputCurrencyInfo ?? undefined) && !isCompatibleAddressDismissed + const isUnichainBridgedAsset = Boolean(inputCurrencyInfo?.isBridged) && !isCompatibleAddressDismissed const { isSmartContractAddress, loading: loadingSmartContractAddress } = useIsSmartContractAddress( recipientData?.address, diff --git a/apps/web/src/pages/Swap/Swap.anvil.e2e.test.ts b/apps/web/src/pages/Swap/Swap.anvil.e2e.test.ts index cc58e9a32fd..974ec8a1d6c 100644 --- a/apps/web/src/pages/Swap/Swap.anvil.e2e.test.ts +++ b/apps/web/src/pages/Swap/Swap.anvil.e2e.test.ts @@ -48,6 +48,7 @@ test.describe('Swap', () => { test('should swap ETH to USDC', async ({ page, anvil }) => { await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) await page.goto('/swap') await page.getByTestId(TestID.ChooseOutputToken).click() @@ -68,6 +69,8 @@ test.describe('Swap', () => { }) test('should be able to swap token with FOT warning via TDP', async ({ page, anvil }) => { + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) + await page.route(`${uniswapUrls.tradingApiUrl}/v1/swap`, async (route) => { const request = route.request() const postData = request.postDataJSON() @@ -111,6 +114,8 @@ test.describe('Swap', () => { }) test('should bridge from ETH to L2', async ({ page, anvil }) => { + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) await page.goto(`/swap?inputCurrency=ETH`) await page.getByTestId(TestID.ChooseOutputToken).click() await page.getByTestId(`token-option-${UniverseChainId.Base}-ETH`).first().click() @@ -122,6 +127,7 @@ test.describe('Swap', () => { ).toBeVisible() await page.getByTestId(TestID.AmountInputIn).click() await page.getByTestId(TestID.AmountInputIn).fill('1') + await expect(page.getByTestId(TestID.ReviewSwap)).toBeEnabled() await page.getByTestId(TestID.ReviewSwap).click() await page.getByTestId(TestID.Confirm).click() await page.getByTestId(TestID.Swap).click() @@ -198,7 +204,7 @@ test.describe('Swap', () => { await page.getByTestId(TestID.ReviewSwap).click() await page.getByTestId(TestID.Swap).click() - await expect(page.getByText('Sign Message')).not.toBeVisible() + await expect(page.getByText('Sign message')).not.toBeVisible() await expect(page.getByText('Approved')).toBeVisible() await expect(page.getByText('Swapped')).toBeVisible() }) @@ -239,48 +245,48 @@ test.describe('Swap', () => { await page.getByTestId(TestID.Swap).click() await expect(page.getByText('Reset USDT limit')).toBeVisible() - await expect(page.getByText('Sign Message')).toBeVisible() + await expect(page.getByText('Sign message')).toBeVisible() await expect(page.getByText('Approved')).toBeVisible() await expect(page.getByText('Swapped')).toBeVisible() }) test('prompts signature when existing permit approval is expired', async ({ page, anvil }) => { + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) + await anvil.setErc20Balance({ address: assume0xAddress(USDT.address), balance: ONE_MILLION_USDT }) await anvil.setPermit2Allowance({ owner: TEST_WALLET_ADDRESS, token: assume0xAddress(USDT.address), spender: assume0xAddress(UNIVERSAL_ROUTER_ADDRESS(UniversalRouterVersion.V2_0, UniverseChainId.Mainnet)), expiration: Math.floor((Date.now() - 1) / 1000), }) - await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) - await anvil.setErc20Balance({ address: assume0xAddress(USDT.address), balance: ONE_MILLION_USDT }) await page.goto(`/swap?inputCurrency=${USDT.address}&outputCurrency=ETH`) await page.getByTestId(TestID.AmountInputIn).click() await page.getByTestId(TestID.AmountInputIn).fill('10') await page.getByTestId(TestID.ReviewSwap).click() await page.getByTestId(TestID.Swap).click() + await expect(page.getByText('Sign message')).toBeVisible() await expect(page.getByText('Approved')).toBeVisible() - await expect(page.getByText('Sign Message')).toBeVisible() await expect(page.getByText('Swapped')).toBeVisible() }) test('prompts signature when existing permit approval amount is too low', async ({ page, anvil }) => { + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) + await anvil.setErc20Balance({ address: assume0xAddress(USDT.address), balance: ONE_MILLION_USDT }) await anvil.setPermit2Allowance({ owner: TEST_WALLET_ADDRESS, token: assume0xAddress(USDT.address), spender: assume0xAddress(UNIVERSAL_ROUTER_ADDRESS(UniversalRouterVersion.V2_0, UniverseChainId.Mainnet)), amount: 1n, }) - await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) - await anvil.setErc20Balance({ address: assume0xAddress(USDT.address), balance: ONE_MILLION_USDT }) await page.goto(`/swap?inputCurrency=${USDT.address}&outputCurrency=ETH`) await page.getByTestId(TestID.AmountInputIn).click() await page.getByTestId(TestID.AmountInputIn).fill('10') await page.getByTestId(TestID.ReviewSwap).click() await page.getByTestId(TestID.Swap).click() + await expect(page.getByText('Sign message')).toBeVisible() await expect(page.getByText('Approved')).toBeVisible() - await expect(page.getByText('Sign Message')).toBeVisible() await expect(page.getByText('Swapped')).toBeVisible() }) }) diff --git a/apps/web/src/pages/Swap/index.tsx b/apps/web/src/pages/Swap/index.tsx index c17bb5ba55a..a06928cb810 100644 --- a/apps/web/src/pages/Swap/index.tsx +++ b/apps/web/src/pages/Swap/index.tsx @@ -1,5 +1,6 @@ import { PrefetchBalancesWrapper } from 'appGraphql/data/apollo/AdaptiveTokenBalancesProvider' import type { Currency } from '@uniswap/sdk-core' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' import { SwapBottomCard } from 'components/SwapBottomCard' import { SwitchLocaleLink } from 'components/SwitchLocaleLink' @@ -28,10 +29,8 @@ import type { AppTFunction } from 'ui/src/i18n/types' import { zIndexes } from 'ui/src/theme' import { useUniswapContext } from 'uniswap/src/contexts/UniswapContext' import { useIsModeMismatch } from 'uniswap/src/features/chains/hooks/useEnabledChains' -import type { UniverseChainId } from 'uniswap/src/features/chains/types' +import { UniverseChainId } from 'uniswap/src/features/chains/types' import { RampDirection } from 'uniswap/src/features/fiatOnRamp/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useGetPasskeyAuthStatus } from 'uniswap/src/features/passkey/hooks/useGetPasskeyAuthStatus' import { WebFORNudgeProvider } from 'uniswap/src/features/providers/webForNudgeProvider' import { InterfaceEventName, InterfacePageName, ModalName } from 'uniswap/src/features/telemetry/constants' @@ -49,6 +48,7 @@ import { SwapDependenciesStoreContextProvider } from 'uniswap/src/features/trans import { SwapFormStoreContextProvider } from 'uniswap/src/features/transactions/swap/stores/swapFormStore/SwapFormStoreContextProvider' import type { SwapFormState } from 'uniswap/src/features/transactions/swap/stores/swapFormStore/types' import { currencyToAsset } from 'uniswap/src/features/transactions/swap/utils/asset' +import { TransactionState } from 'uniswap/src/features/transactions/types/transactionState' import { CurrencyField } from 'uniswap/src/types/currency' import { SwapTab } from 'uniswap/src/types/screens/interface' import { isMobileWeb } from 'utilities/src/platform' @@ -66,7 +66,8 @@ export default function SwapPage() { const { initialInputCurrency, initialOutputCurrency, - initialChainId, + initialInputChainId, + initialOutputChainId, initialTypedValue, initialField, triggerConnect, @@ -84,9 +85,10 @@ export default function SwapPage() { void initialInputCurrency?: Currency initialOutputCurrency?: Currency + initialOutputChainId?: UniverseChainId initialTypedValue?: string initialIndependentField?: CurrencyField syncTabToUrl: boolean @@ -137,7 +158,7 @@ export function Swap({ const { isSwapTokenSelectorOpen, swapOutputChainId } = useUniswapContext() const isExplorePage = useIsPage(PageType.EXPLORE) - const isModeMismatch = useIsModeMismatch(chainId) + const isModeMismatch = useIsModeMismatch(initialInputChainId) const isSharedSwapDisabled = isModeMismatch && isExplorePage const input = currencyToAsset(initialInputCurrency) @@ -153,11 +174,16 @@ export function Swap({ selectingCurrencyField: isSwapTokenSelectorOpen ? CurrencyField.OUTPUT : undefined, selectingCurrencyChainId: swapOutputChainId, skipFocusOnCurrencyField: isMobileWeb, - filteredChainIdsOverride: usePersistedFilteredChainIds ? persistedFilteredChainIds : undefined, + filteredChainIdsOverride: getFilteredChainIdsOverride({ + initialInputChainId, + initialOutputChainId, + usePersistedFilteredChainIds, + persistedFilteredChainIds, + }), }) return ( - + ): AnvilConfig { port: overrides?.port ?? parseInt(process.env.ANVIL_PORT ?? '8545'), host: overrides?.host ?? '127.0.0.1', forkUrl: overrides?.forkUrl ?? buildForkUrl(), - timeout: overrides?.timeout ?? 5000, - healthCheckInterval: overrides?.healthCheckInterval ?? 10000, + timeout: overrides?.timeout ?? 10_000, + healthCheckInterval: overrides?.healthCheckInterval ?? 10_000, logFile: overrides?.logFile ?? path.join(process.cwd(), `anvil-test-${process.pid}.log`), } } diff --git a/apps/web/src/playwright/fixtures/anvil.ts b/apps/web/src/playwright/fixtures/anvil.ts index d80cd8c8bc4..91fcab8dffb 100644 --- a/apps/web/src/playwright/fixtures/anvil.ts +++ b/apps/web/src/playwright/fixtures/anvil.ts @@ -10,7 +10,9 @@ import { ZERO_ADDRESS } from 'uniswap/src/constants/misc' import { DAI, USDT } from 'uniswap/src/constants/tokens' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { assume0xAddress } from 'utils/wagmi' -import { Address, erc20Abi } from 'viem' +import { type Address, erc20Abi } from 'viem' + +const SNAPSHOTS_ENABLED = process.env.ENABLE_ANVIL_SNAPSHOTS === 'true' class WalletError extends Error { code?: number @@ -162,6 +164,11 @@ const createAnvilClient = () => { await client.mine({ blocks: 1 }) }, + /** + * @deprecated + * Wagmi submits transactions to Anvil via the RPC interface so this function no longer intercepts + * the requests. Use createRejectableMockConnector instead. + */ async setTransactionRejection() { // Override the wallet actions to reject transactions const originalRequest = client.request @@ -219,7 +226,9 @@ export const test = base.extend<{ anvil: AnvilClient; delegateToZeroAddress?: vo // Take snapshot for test isolation let snapshotId: `0x${string}` | undefined try { - snapshotId = await testAnvil.snapshot() + if (SNAPSHOTS_ENABLED) { + snapshotId = await testAnvil.snapshot() + } } catch (error) { if (isTimeoutError(error)) { // Anvil timed out during snapshot, restart and retry diff --git a/apps/web/src/playwright/fixtures/tradingApi.ts b/apps/web/src/playwright/fixtures/tradingApi.ts index b84f79de3b1..0092111e8b4 100644 --- a/apps/web/src/playwright/fixtures/tradingApi.ts +++ b/apps/web/src/playwright/fixtures/tradingApi.ts @@ -1,6 +1,6 @@ // biome-ignore lint/style/noRestrictedImports: Trading API fixtures need direct Playwright imports import { test as base } from '@playwright/test' -import { Page } from 'playwright/test' +import { type Page } from 'playwright/test' import { uniswapUrls } from 'uniswap/src/constants/urls' export const DEFAULT_TEST_GAS_LIMIT = '20000000' @@ -54,7 +54,15 @@ export async function stubTradingApiEndpoint({ }) const responseText = await response.text() - let responseJson = JSON.parse(responseText) + let responseJson + try { + responseJson = JSON.parse(responseText) + } catch (parseError) { + throw new Error(`Failed to parse trading API response for ${endpoint}. Response: ${responseText}`, { + cause: parseError, + }) + } + // Set a high gas limit to avoid OutOfGas if (endpoint === uniswapUrls.tradingApiPaths.swap) { responseJson.swap.gasLimit = DEFAULT_TEST_GAS_LIMIT diff --git a/apps/web/src/setupTests.ts b/apps/web/src/setupTests.ts index 9ede1b601e6..27620e661a8 100644 --- a/apps/web/src/setupTests.ts +++ b/apps/web/src/setupTests.ts @@ -10,6 +10,7 @@ import { WalletName, WalletReadyState, } from '@solana/wallet-adapter-base' +import { useFeatureFlag } from '@universe/gating' import { useWeb3React } from '@web3-react/core' import { config as loadEnv } from 'dotenv' import failOnConsole from 'jest-fail-on-console' @@ -19,7 +20,6 @@ import { Readable } from 'stream' import { toBeVisible } from 'test-utils/matchers' import { mocked } from 'test-utils/mocked' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { setupi18n } from 'uniswap/src/i18n/i18n-setup-interface' import { mockLocalizationContext } from 'uniswap/src/test/mocks/locale' import { TextDecoder, TextEncoder } from 'util' @@ -390,10 +390,9 @@ failOnConsole({ }, }) -vi.mock('uniswap/src/features/gating/hooks', async () => { - const genMock = await vi.importActual('uniswap/src/features/gating/hooks') +vi.mock('@universe/gating', async (importOriginal) => { return { - ...genMock, + ...(await importOriginal()), useFeatureFlag: vi.fn(), useFeatureFlagWithLoading: vi.fn(), getFeatureFlag: vi.fn(), diff --git a/apps/web/src/state/activity/polling/transactions.ts b/apps/web/src/state/activity/polling/transactions.ts index 4bbbb3fae73..417397b7707 100644 --- a/apps/web/src/state/activity/polling/transactions.ts +++ b/apps/web/src/state/activity/polling/transactions.ts @@ -1,4 +1,5 @@ import { TradingApi } from '@universe/api' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useAccount } from 'hooks/useAccount' import useCurrentBlockTimestamp from 'hooks/useCurrentBlockTimestamp' import useBlockNumber from 'lib/hooks/useBlockNumber' @@ -13,8 +14,6 @@ import { isPendingTx } from 'state/transactions/utils' import { TradingApiClient } from 'uniswap/src/data/apiClients/tradingApi/TradingApiClient' import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import { RetryOptions, UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { InterfaceEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { checkedTransaction } from 'uniswap/src/features/transactions/slice' diff --git a/apps/web/src/state/explore/protocolStats.test.tsx b/apps/web/src/state/explore/protocolStats.test.tsx index 0c94c9521fb..55ee77f344a 100644 --- a/apps/web/src/state/explore/protocolStats.test.tsx +++ b/apps/web/src/state/explore/protocolStats.test.tsx @@ -1,14 +1,13 @@ import { ProtocolStatsResponse } from '@uniswap/client-explore/dist/uniswap/explore/v1/service_pb' +import { useFeatureFlagWithLoading } from '@universe/gating' import { ExploreContext } from 'state/explore' import { use24hProtocolVolume, useDailyTVLWithChange } from 'state/explore/protocolStats' import { render, screen } from 'test-utils/render' -import * as GatingHooks from 'uniswap/src/features/gating/hooks' import type { Mock } from 'vitest' -vi.mock('uniswap/src/features/gating/hooks', async () => { - const actual = await vi.importActual('uniswap/src/features/gating/hooks') +vi.mock('@universe/gating', async (importOriginal) => { return { - ...actual, + ...(await importOriginal()), useFeatureFlagWithLoading: vi.fn(() => ({ value: true, isLoading: false })), // Ensure mock returns value immediately } }) @@ -57,7 +56,7 @@ const TestComponent24HrTVL = () => { } beforeEach(() => { - ;(GatingHooks.useFeatureFlagWithLoading as Mock).mockReturnValue({ value: true, isLoading: false }) + ;(useFeatureFlagWithLoading as Mock).mockReturnValue({ value: true, isLoading: false }) }) describe('use24hProtocolVolume', () => { diff --git a/apps/web/src/state/explore/topPools.ts b/apps/web/src/state/explore/topPools.ts index b8f97566868..980f69ad586 100644 --- a/apps/web/src/state/explore/topPools.ts +++ b/apps/web/src/state/explore/topPools.ts @@ -5,8 +5,8 @@ import { PoolTableSortState, } from 'appGraphql/data/pools/useTopPools' import { OrderDirection } from 'appGraphql/data/util' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { ExploreStatsResponse, PoolStats } from '@uniswap/client-explore/dist/uniswap/explore/v1/service_pb' -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' import { exploreSearchStringAtom } from 'components/Tokens/state' import { useAtomValue } from 'jotai/utils' import { useContext, useMemo } from 'react' diff --git a/apps/web/src/state/limit/hooks.ts b/apps/web/src/state/limit/hooks.ts index d63821e61f4..5e04da2d683 100644 --- a/apps/web/src/state/limit/hooks.ts +++ b/apps/web/src/state/limit/hooks.ts @@ -1,4 +1,5 @@ import { Currency, CurrencyAmount, Price, TradeType } from '@uniswap/sdk-core' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useAccount } from 'hooks/useAccount' import JSBI from 'jsbi' import { useCurrencyBalances } from 'lib/hooks/useCurrencyBalance' @@ -13,8 +14,6 @@ import { getUSDCostPerGas, isClassicTrade } from 'state/routing/utils' import { useSwapAndLimitContext } from 'state/swap/useSwapContext' import { nativeOnChain } from 'uniswap/src/constants/tokens' import { getStablecoinsForChain, isUniverseChainId } from 'uniswap/src/features/chains/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { isEVMChain, isSVMChain } from 'uniswap/src/features/platforms/utils/chains' import { CurrencyField } from 'uniswap/src/types/currency' diff --git a/apps/web/src/state/routing/useRoutingAPITrade.test.ts b/apps/web/src/state/routing/useRoutingAPITrade.test.ts index f535380851d..208225f4531 100644 --- a/apps/web/src/state/routing/useRoutingAPITrade.test.ts +++ b/apps/web/src/state/routing/useRoutingAPITrade.test.ts @@ -24,8 +24,9 @@ vi.mock('./slice', () => { } }) vi.mock('state/user/hooks') -vi.mock('uniswap/src/features/gating/hooks', () => { +vi.mock('@universe/gating', async (importOriginal) => { return { + ...(await importOriginal()), useFeatureFlag: vi.fn(), useExperimentValue: vi.fn(), getFeatureFlag: vi.fn(), diff --git a/apps/web/src/state/sagas/liquidity/liquiditySaga.ts b/apps/web/src/state/sagas/liquidity/liquiditySaga.ts index 492091bf334..1f96ff38e72 100644 --- a/apps/web/src/state/sagas/liquidity/liquiditySaga.ts +++ b/apps/web/src/state/sagas/liquidity/liquiditySaga.ts @@ -5,7 +5,6 @@ import { import { getLiquidityEventName } from 'components/Liquidity/analytics' import { popupRegistry } from 'components/Popups/registry' import { PopupType } from 'components/Popups/types' -import type { HandleOnChainStepParams } from 'state/sagas/transactions/utils' import { getDisplayableError, handleApprovalTransactionStep, @@ -34,7 +33,7 @@ import type { } from 'uniswap/src/features/transactions/liquidity/steps/migrate' import type { LiquidityAction, ValidatedLiquidityTxContext } from 'uniswap/src/features/transactions/liquidity/types' import { LiquidityTransactionType } from 'uniswap/src/features/transactions/liquidity/types' -import type { TransactionStep } from 'uniswap/src/features/transactions/steps/types' +import type { HandleOnChainStepParams, TransactionStep } from 'uniswap/src/features/transactions/steps/types' import { TransactionStepType } from 'uniswap/src/features/transactions/steps/types' import type { SetCurrentStepFn } from 'uniswap/src/features/transactions/swap/types/swapCallback' import type { diff --git a/apps/web/src/state/sagas/root.ts b/apps/web/src/state/sagas/root.ts index 7ebf0f49ac1..88b64fae9a5 100644 --- a/apps/web/src/state/sagas/root.ts +++ b/apps/web/src/state/sagas/root.ts @@ -4,10 +4,12 @@ import { swapSaga } from 'state/sagas/transactions/swapSaga' import { watchTransactionsSaga } from 'state/sagas/transactions/watcherSaga' import { wrapSaga } from 'state/sagas/transactions/wrapSaga' import { call, spawn } from 'typed-redux-saga' +import { planSaga } from 'uniswap/src/features/transactions/swap/plan/planSaga' import { waitForRehydration } from 'uniswap/src/utils/saga' const sagas = [ swapSaga.wrappedSaga, + planSaga.wrappedSaga, wrapSaga.wrappedSaga, liquiditySaga.wrappedSaga, watchTransactionsSaga.wrappedSaga, diff --git a/apps/web/src/state/sagas/transactions/5792.ts b/apps/web/src/state/sagas/transactions/5792.ts index 30f39529ce0..f10eed438aa 100644 --- a/apps/web/src/state/sagas/transactions/5792.ts +++ b/apps/web/src/state/sagas/transactions/5792.ts @@ -4,12 +4,12 @@ import { popupRegistry } from 'components/Popups/registry' import { PopupType } from 'components/Popups/types' import { wagmiConfig } from 'components/Web3Provider/wagmiConfig' import { getRoutingForTransaction } from 'state/activity/utils' -import { getSigner, HandleOnChainStepParams, watchForInterruption } from 'state/sagas/transactions/utils' +import { getSigner, watchForInterruption } from 'state/sagas/transactions/utils' import { handleGetCapabilities } from 'state/walletCapabilities/lib/handleGetCapabilities' import { setCapabilitiesByChain } from 'state/walletCapabilities/reducer' import { call, put } from 'typed-redux-saga' import { addTransaction } from 'uniswap/src/features/transactions/slice' -import { OnChainTransactionStepBatched } from 'uniswap/src/features/transactions/steps/types' +import { HandleOnChainStepParams, OnChainTransactionStepBatched } from 'uniswap/src/features/transactions/steps/types' import { InterfaceTransactionDetails, TransactionOriginType, diff --git a/apps/web/src/state/sagas/transactions/solana.ts b/apps/web/src/state/sagas/transactions/solana.ts index 7451e96e51a..2ff23ceb5ac 100644 --- a/apps/web/src/state/sagas/transactions/solana.ts +++ b/apps/web/src/state/sagas/transactions/solana.ts @@ -5,9 +5,10 @@ import { PopupType } from 'components/Popups/types' import { signSolanaTransactionWithCurrentWallet } from 'components/Web3Provider/signSolanaTransaction' import store from 'state' import { getSwapTransactionInfo } from 'state/sagas/transactions/utils' -import { call } from 'typed-redux-saga' +import { call, delay, spawn } from 'typed-redux-saga' import { JupiterApiClient } from 'uniswap/src/data/apiClients/jupiterApi/JupiterFetchClient' import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { refetchRestQueriesViaOnchainOverrideVariant } from 'uniswap/src/features/portfolio/portfolioUpdates/rest/refetchRestQueriesViaOnchainOverrideVariantSaga' import { SwapEventName } from 'uniswap/src/features/telemetry/constants/features' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { JupiterExecuteError } from 'uniswap/src/features/transactions/errors' @@ -16,9 +17,15 @@ import { ExtractedBaseTradeAnalyticsProperties } from 'uniswap/src/features/tran import { SolanaTrade } from 'uniswap/src/features/transactions/swap/types/solana' import { ValidatedSolanaSwapTxAndGasInfo } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' import { SwapEventType, timestampTracker } from 'uniswap/src/features/transactions/swap/utils/SwapEventTimestampTracker' -import { TransactionOriginType, TransactionStatus } from 'uniswap/src/features/transactions/types/transactionDetails' +import { + InterfaceBaseTransactionDetails, + SolanaTransactionDetails, + TransactionOriginType, + TransactionStatus, +} from 'uniswap/src/features/transactions/types/transactionDetails' import { SignerMnemonicAccountDetails } from 'uniswap/src/features/wallet/types/AccountDetails' import { tryCatch } from 'utilities/src/errors' +import { ONE_SECOND_MS } from 'utilities/src/time/time' type JupiterSwapParams = { account: SignerMnemonicAccountDetails @@ -49,27 +56,52 @@ async function signAndSendJupiterSwap({ return result } -function updateAppState({ hash, trade, from }: { hash: string; trade: SolanaTrade; from: string }) { +function* refetchBalancesWithDelay({ + transaction, + activeAddress, +}: { + transaction: SolanaTransactionDetails + activeAddress: string +}) { + // Wait 3 seconds before refetching. + // This is because at this point the transaction hasn't been fully confirmed yet, + // and it should take 1-2 seconds for the balance to update onchain. + yield* delay(3 * ONE_SECOND_MS) + + yield* call(refetchRestQueriesViaOnchainOverrideVariant, { + transaction, + activeAddress, + apolloClient: null, + }) +} + +function* updateAppState({ hash, trade, from }: { hash: string; trade: SolanaTrade; from: string }) { const typeInfo = getSwapTransactionInfo(trade) - store.dispatch( - addTransaction({ - from, - typeInfo, - hash, - chainId: UniverseChainId.Solana, - routing: TradingApi.Routing.JUPITER, - status: TransactionStatus.Success, - addedTime: Date.now(), - id: hash, - transactionOriginType: TransactionOriginType.Internal, - options: { - request: {}, - }, - }), - ) + const transaction: SolanaTransactionDetails = { + from, + typeInfo, + hash, + chainId: UniverseChainId.Solana, + routing: TradingApi.Routing.JUPITER, + status: TransactionStatus.Success, + addedTime: Date.now(), + id: hash, + transactionOriginType: TransactionOriginType.Internal, + options: { + request: {}, + }, + } + + store.dispatch(addTransaction(transaction)) popupRegistry.addPopup({ type: PopupType.Transaction, hash }, hash) + + // Spawn background task to refetch balances after a delay + yield* spawn(refetchBalancesWithDelay, { + transaction, + activeAddress: from, + }) } function createJupiterSwap(signSolanaTransaction: (tx: VersionedTransaction) => Promise) { @@ -92,7 +124,7 @@ function createJupiterSwap(signSolanaTransaction: (tx: VersionedTransaction) => throw new JupiterExecuteError(errorMessage ?? 'Unknown Jupiter Execution Error', code) } - updateAppState({ hash, trade, from: account.address }) + yield* call(updateAppState, { hash, trade, from: account.address }) return hash } diff --git a/apps/web/src/state/sagas/transactions/swapSaga.ts b/apps/web/src/state/sagas/transactions/swapSaga.ts index 2187773687e..f24c0bcfe3c 100644 --- a/apps/web/src/state/sagas/transactions/swapSaga.ts +++ b/apps/web/src/state/sagas/transactions/swapSaga.ts @@ -1,5 +1,6 @@ import { useTotalBalancesUsdForAnalytics } from 'appGraphql/data/apollo/useTotalBalancesUsdForAnalytics' import { TradingApi } from '@universe/api' +import { Experiments } from '@universe/gating' import { popupRegistry } from 'components/Popups/registry' import { PopupType } from 'components/Popups/types' import { DEFAULT_TXN_DISMISS_MS, L2_TXN_DISMISS_MS, ZERO_PERCENT } from 'constants/misc' @@ -16,7 +17,6 @@ import { handleUniswapXSignatureStep } from 'state/sagas/transactions/uniswapx' import { getDisplayableError, getSwapTransactionInfo, - HandleOnChainStepParams, handleApprovalTransactionStep, handleOnChainStep, handlePermitTransactionStep, @@ -24,24 +24,31 @@ import { } from 'state/sagas/transactions/utils' import { VitalTxFields } from 'state/transactions/types' import invariant from 'tiny-invariant' -import { call } from 'typed-redux-saga' +import { call, SagaGenerator } from 'typed-redux-saga' import { isL2ChainId } from 'uniswap/src/features/chains/utils' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { isSVMChain } from 'uniswap/src/features/platforms/utils/chains' import { SwapEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { SwapTradeBaseProperties } from 'uniswap/src/features/telemetry/types' +import { logExperimentQualifyingEvent } from 'uniswap/src/features/telemetry/utils/logExperimentQualifyingEvent' import { selectSwapStartTimestamp } from 'uniswap/src/features/timing/selectors' import { updateSwapStartTimestamp } from 'uniswap/src/features/timing/slice' import { UnexpectedTransactionStateError } from 'uniswap/src/features/transactions/errors' -import { TransactionStep, TransactionStepType } from 'uniswap/src/features/transactions/steps/types' +import { + HandleOnChainStepParams, + HandleSwapStepParams, + TransactionStep, + TransactionStepType, +} from 'uniswap/src/features/transactions/steps/types' import { ExtractedBaseTradeAnalyticsProperties, getBaseTradeAnalyticsProperties, } from 'uniswap/src/features/transactions/swap/analytics' -import { FLASHBLOCKS_UI_SKIP_ROUTES } from 'uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/constants' -import { getIsFlashblocksEnabled } from 'uniswap/src/features/transactions/swap/hooks/useIsUnichainFlashblocksEnabled' +import { getFlashblocksExperimentStatus } from 'uniswap/src/features/transactions/swap/hooks/useIsUnichainFlashblocksEnabled' import { useV4SwapEnabled } from 'uniswap/src/features/transactions/swap/hooks/useV4SwapEnabled' +import { planSaga } from 'uniswap/src/features/transactions/swap/plan/planSaga' +import { handleSwitchChains } from 'uniswap/src/features/transactions/swap/plan/utils' import { SwapTransactionStep, SwapTransactionStepAsync, @@ -54,10 +61,15 @@ import { SwapCallbackParams, } from 'uniswap/src/features/transactions/swap/types/swapCallback' import { PermitMethod, ValidatedSwapTxContext } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' -import { BridgeTrade, ClassicTrade } from 'uniswap/src/features/transactions/swap/types/trade' +import { BridgeTrade, ChainedActionTrade, ClassicTrade } from 'uniswap/src/features/transactions/swap/types/trade' import { slippageToleranceToPercent } from 'uniswap/src/features/transactions/swap/utils/format' import { generateSwapTransactionSteps } from 'uniswap/src/features/transactions/swap/utils/generateSwapTransactionSteps' -import { isClassic, isJupiter, UNISWAPX_ROUTING_VARIANTS } from 'uniswap/src/features/transactions/swap/utils/routing' +import { + isClassic, + isJupiter, + requireRouting, + UNISWAPX_ROUTING_VARIANTS, +} from 'uniswap/src/features/transactions/swap/utils/routing' import { getClassicQuoteFromResponse } from 'uniswap/src/features/transactions/swap/utils/tradingApi' import { useWallet } from 'uniswap/src/features/wallet/hooks/useWallet' import { @@ -68,14 +80,7 @@ import { createSaga } from 'uniswap/src/utils/saga' import { logger } from 'utilities/src/logger/logger' import { useTrace } from 'utilities/src/telemetry/trace/TraceContext' -interface HandleSwapStepParams extends Omit { - step: SwapTransactionStep | SwapTransactionStepAsync - signature?: string - trade: ClassicTrade | BridgeTrade - analytics: ExtractedBaseTradeAnalyticsProperties - onTransactionHash?: (hash: string) => void -} -function* handleSwapTransactionStep(params: HandleSwapStepParams) { +function* handleSwapTransactionStep(params: HandleSwapStepParams): SagaGenerator { const { trade, step, signature, analytics, onTransactionHash } = params const info = getSwapTransactionInfo(trade) @@ -103,14 +108,24 @@ function* handleSwapTransactionStep(params: HandleSwapStepParams) { handleSwapTransactionAnalytics({ ...params, hash }) - if ( - !getIsFlashblocksEnabled(trade.inputAmount.currency.chainId) || - FLASHBLOCKS_UI_SKIP_ROUTES.includes(trade.routing) - ) { + const chainId = trade.inputAmount.currency.chainId + const { shouldLogQualifyingEvent, shouldShowModal } = getFlashblocksExperimentStatus({ + chainId, + routing: trade.routing, + }) + + if (shouldLogQualifyingEvent) { + logExperimentQualifyingEvent({ + experiment: Experiments.UnichainFlashblocksModal, + }) + } + + // Show regular popup for control variant or ineligible swaps + if (!shouldShowModal) { popupRegistry.addPopup( { type: PopupType.Transaction, hash }, hash, - isL2ChainId(trade.inputAmount.currency.chainId) ? L2_TXN_DISMISS_MS : DEFAULT_TXN_DISMISS_MS, + isL2ChainId(chainId) ? L2_TXN_DISMISS_MS : DEFAULT_TXN_DISMISS_MS, ) } @@ -119,7 +134,7 @@ function* handleSwapTransactionStep(params: HandleSwapStepParams) { onTransactionHash(hash) } - return + return hash } interface HandleSwapBatchedStepParams extends Omit { @@ -149,7 +164,7 @@ function* handleSwapTransactionBatchedStep(params: HandleSwapBatchedStepParams) } function handleSwapTransactionAnalytics(params: { - trade: ClassicTrade | BridgeTrade + trade: ClassicTrade | BridgeTrade | ChainedActionTrade analytics: SwapTradeBaseProperties hash?: string batchId?: string @@ -208,31 +223,6 @@ type SwapParams = { v4Enabled: boolean } -/** Asserts that a given object fits a given routing variant. */ -function requireRouting( - val: V, - routing: readonly T[], -): asserts val is V & { routing: T } { - if (!routing.includes(val.routing as T)) { - throw new UnexpectedTransactionStateError(`Expected routing ${routing}, got ${val.routing}`) - } -} - -/** Switches to the proper chain, if needed. If a chain switch is necessary and it fails, returns success=false. */ -async function handleSwitchChains( - params: Pick, -): Promise<{ chainSwitchFailed: boolean }> { - const { selectChain, startChainId, swapTxContext } = params - - const swapChainId = swapTxContext.trade.inputAmount.currency.chainId - if (isJupiter(swapTxContext) || swapChainId === startChainId) { - return { chainSwitchFailed: false } - } - - const chainSwitched = await selectChain(swapChainId) - return { chainSwitchFailed: !chainSwitched } -} - function* swap(params: SwapParams) { const { account, @@ -247,7 +237,11 @@ function* swap(params: SwapParams) { } = params const { trade } = swapTxContext - const { chainSwitchFailed } = yield* call(handleSwitchChains, params) + const { chainSwitchFailed } = yield* call(handleSwitchChains, { + selectChain: params.selectChain, + startChainId: params.startChainId, + swapTxContext, + }) if (chainSwitchFailed) { onFailure() return @@ -408,7 +402,19 @@ export function useSwapCallback(): SwapCallback { updateSwapForm({ txHash: hash, txHashReceivedTime: Date.now() }) }, } - appDispatch(swapSaga.actions.trigger(swapParams)) + if (swapTxContext.trade.routing === TradingApi.Routing.CHAINED) { + appDispatch( + planSaga.actions.trigger({ + ...swapParams, + handleApprovalTransactionStep, + handleSwapTransactionStep, + handleSignatureStep, + getDisplayableError, + }), + ) + } else { + appDispatch(swapSaga.actions.trigger(swapParams)) + } const blockNumber = getClassicQuoteFromResponse(trade.quote)?.blockNumber?.toString() diff --git a/apps/web/src/state/sagas/transactions/uniswapx.ts b/apps/web/src/state/sagas/transactions/uniswapx.ts index fee5167d8bf..fe118260a6a 100644 --- a/apps/web/src/state/sagas/transactions/uniswapx.ts +++ b/apps/web/src/state/sagas/transactions/uniswapx.ts @@ -4,7 +4,6 @@ import { formatSwapSignedAnalyticsEventProperties } from 'lib/utils/analytics' import { addTransactionBreadcrumb, getSwapTransactionInfo, - HandleSignatureStepParams, handleSignatureStep, TransactionBreadcrumbStatus, } from 'state/sagas/transactions/utils' @@ -15,6 +14,7 @@ import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { SwapTradeBaseProperties } from 'uniswap/src/features/telemetry/types' import { HandledTransactionInterrupt } from 'uniswap/src/features/transactions/errors' import { addTransaction } from 'uniswap/src/features/transactions/slice' +import { HandleSignatureStepParams } from 'uniswap/src/features/transactions/steps/types' import { UniswapXSignatureStep } from 'uniswap/src/features/transactions/swap/steps/signOrder' import { UniswapXTrade } from 'uniswap/src/features/transactions/swap/types/trade' import { slippageToleranceToPercent } from 'uniswap/src/features/transactions/swap/utils/format' diff --git a/apps/web/src/state/sagas/transactions/utils.ts b/apps/web/src/state/sagas/transactions/utils.ts index bd12ae770d0..1905efecf5a 100644 --- a/apps/web/src/state/sagas/transactions/utils.ts +++ b/apps/web/src/state/sagas/transactions/utils.ts @@ -3,6 +3,7 @@ import type { TransactionResponse } from '@ethersproject/abstract-provider' import type { JsonRpcSigner, Web3Provider } from '@ethersproject/providers' import { TradeType } from '@uniswap/sdk-core' import { FetchError, TradingApi } from '@universe/api' +import { BlockedAsyncSubmissionChainIdsConfigKey, DynamicConfigs, getDynamicConfigValue } from '@universe/gating' import { wagmiConfig } from 'components/Web3Provider/wagmiConfig' import { clientToProvider } from 'hooks/useEthersProvider' import ms from 'ms' @@ -15,8 +16,6 @@ import type { SagaGenerator } from 'typed-redux-saga' import { call, cancel, delay, fork, put, race, select, spawn, take } from 'typed-redux-saga' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { isL2ChainId, isUniverseChainId } from 'uniswap/src/features/chains/utils' -import { BlockedAsyncSubmissionChainIdsConfigKey, DynamicConfigs } from 'uniswap/src/features/gating/configs' -import { getDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { ApprovalEditedInWalletError, HandledTransactionInterrupt, @@ -33,14 +32,21 @@ import type { TokenApprovalTransactionStep } from 'uniswap/src/features/transact import type { Permit2TransactionStep } from 'uniswap/src/features/transactions/steps/permit2Transaction' import type { TokenRevocationTransactionStep } from 'uniswap/src/features/transactions/steps/revoke' import type { + HandleApprovalStepParams, + HandleOnChainPermit2TransactionStep, + HandleOnChainStepParams, + HandleSignatureStepParams, OnChainTransactionStep, - SignatureTransactionStep, TransactionStep, } from 'uniswap/src/features/transactions/steps/types' import { TransactionStepType } from 'uniswap/src/features/transactions/steps/types' import { SolanaTrade } from 'uniswap/src/features/transactions/swap/types/solana' -import type { SetCurrentStepFn } from 'uniswap/src/features/transactions/swap/types/swapCallback' -import type { BridgeTrade, ClassicTrade, UniswapXTrade } from 'uniswap/src/features/transactions/swap/types/trade' +import type { + BridgeTrade, + ChainedActionTrade, + ClassicTrade, + UniswapXTrade, +} from 'uniswap/src/features/transactions/swap/types/trade' import { isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing' import type { ApproveTransactionInfo, @@ -75,12 +81,6 @@ export enum TransactionBreadcrumbStatus { Interrupted = 'interrupted', } -export interface HandleSignatureStepParams { - account: AccountDetails - step: T - setCurrentStep: SetCurrentStepFn - ignoreInterrupt?: boolean -} export function* handleSignatureStep({ setCurrentStep, step, ignoreInterrupt, account }: HandleSignatureStepParams) { // Add a watcher to check if the transaction flow is interrupted during this step const { throwIfInterrupted } = yield* watchForInterruption(ignoreInterrupt) @@ -107,20 +107,6 @@ export function* handleSignatureStep({ setCurrentStep, step, ignoreInterrupt, ac return signature } -export interface HandleOnChainStepParams { - account: AccountDetails - info: TransactionInfo - step: T - setCurrentStep: SetCurrentStepFn - /** Controls whether the function allow submitting a duplicate tx (a tx w/ identical `info` to another recent/pending tx). Defaults to false. */ - allowDuplicativeTx?: boolean - /** Controls whether the function should throw an error upon interrupt or not, defaults to `false`. */ - ignoreInterrupt?: boolean - /** Controls whether the function should wait to return until after the transaction has confirmed. Defaults to `true`. */ - shouldWaitForConfirmation?: boolean - /** Called when data returned from a submitted transaction differs from data originally sent to the wallet. */ - onModification?: (response: VitalTxFields) => void | Generator -} export function* handleOnChainStep(params: HandleOnChainStepParams) { const { account, @@ -350,15 +336,12 @@ function transformTransactionResponse(response: TransactionResponse | Transactio return { hash: response.hash, data: response.input, nonce: response.nonce } } -interface HandlePermitStepParams extends Omit, 'info'> {} -export function* handlePermitTransactionStep(params: HandlePermitStepParams) { +export function* handlePermitTransactionStep(params: HandleOnChainPermit2TransactionStep) { const { step } = params const info = getPermitTransactionInfo(step) return yield* call(handleOnChainStep, { ...params, info }) } -interface HandleApprovalStepParams - extends Omit, 'info'> {} export function* handleApprovalTransactionStep(params: HandleApprovalStepParams) { const { step, account } = params const info = getApprovalTransactionInfo(step) @@ -528,11 +511,11 @@ export async function getSigner(account: string): Promise { type SwapInfo = ExactInputSwapTransactionInfo | ExactOutputSwapTransactionInfo export function getSwapTransactionInfo( - trade: ClassicTrade | BridgeTrade | SolanaTrade, + trade: ClassicTrade | BridgeTrade | SolanaTrade | ChainedActionTrade, ): SwapInfo | BridgeTransactionInfo export function getSwapTransactionInfo(trade: UniswapXTrade): SwapInfo & { isUniswapXOrder: true } export function getSwapTransactionInfo( - trade: ClassicTrade | BridgeTrade | UniswapXTrade | SolanaTrade, + trade: ClassicTrade | BridgeTrade | UniswapXTrade | SolanaTrade | ChainedActionTrade, ): SwapInfo | BridgeTransactionInfo { if (trade.routing === TradingApi.Routing.BRIDGE) { return { diff --git a/apps/web/src/state/sagas/transactions/wrapSaga.ts b/apps/web/src/state/sagas/transactions/wrapSaga.ts index d2b767e6076..6dc3d46a298 100644 --- a/apps/web/src/state/sagas/transactions/wrapSaga.ts +++ b/apps/web/src/state/sagas/transactions/wrapSaga.ts @@ -6,10 +6,10 @@ import { useAccount } from 'hooks/useAccount' import useSelectChain from 'hooks/useSelectChain' import { useCallback } from 'react' import { useDispatch } from 'react-redux' -import { HandleOnChainStepParams, handleOnChainStep } from 'state/sagas/transactions/utils' +import { handleOnChainStep } from 'state/sagas/transactions/utils' import { call } from 'typed-redux-saga' import { isTestnetChain } from 'uniswap/src/features/chains/utils' -import { TransactionStepType } from 'uniswap/src/features/transactions/steps/types' +import { HandleOnChainStepParams, TransactionStepType } from 'uniswap/src/features/transactions/steps/types' import { WrapTransactionStep } from 'uniswap/src/features/transactions/steps/wrap' import { WrapCallback, WrapCallbackParams } from 'uniswap/src/features/transactions/swap/types/wrapCallback' import { TransactionType, WrapTransactionInfo } from 'uniswap/src/features/transactions/types/transactionDetails' diff --git a/apps/web/src/state/swap/hooks.test.tsx b/apps/web/src/state/swap/hooks.test.tsx index 2836b4d444d..516eda349ac 100644 --- a/apps/web/src/state/swap/hooks.test.tsx +++ b/apps/web/src/state/swap/hooks.test.tsx @@ -20,8 +20,9 @@ import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledCh import { UniverseChainId } from 'uniswap/src/features/chains/types' import { CurrencyField } from 'uniswap/src/types/currency' -vi.mock('uniswap/src/features/gating/hooks', () => { +vi.mock('@universe/gating', async (importOriginal) => { return { + ...(await importOriginal()), useFeatureFlag: vi.fn(), getFeatureFlag: vi.fn(), } @@ -128,6 +129,91 @@ describe('hooks', () => { chainId: undefined, }) }) + + test('no query parameters', () => { + expect(queryParametersToCurrencyState(parse('', { parseArrays: false, ignoreQueryPrefix: true }))).toEqual({ + inputCurrencyAddress: undefined, + outputCurrencyAddress: undefined, + value: undefined, + field: undefined, + chainId: undefined, + outputChainId: undefined, + }) + }) + + test('only chain parameter, no currencies', () => { + expect( + queryParametersToCurrencyState(parse('?chain=optimism', { parseArrays: false, ignoreQueryPrefix: true })), + ).toEqual({ + inputCurrencyAddress: undefined, + outputCurrencyAddress: undefined, + value: undefined, + field: undefined, + chainId: UniverseChainId.Optimism, + outputChainId: undefined, + }) + }) + + test('only outputChain parameter, no currencies', () => { + expect( + queryParametersToCurrencyState(parse('?outputChain=base', { parseArrays: false, ignoreQueryPrefix: true })), + ).toEqual({ + inputCurrencyAddress: undefined, + outputCurrencyAddress: undefined, + value: undefined, + field: undefined, + chainId: undefined, + outputChainId: UniverseChainId.Base, + }) + }) + + test('both chain and outputChain parameters, no currencies', () => { + expect( + queryParametersToCurrencyState( + parse('?chain=mainnet&outputChain=optimism', { parseArrays: false, ignoreQueryPrefix: true }), + ), + ).toEqual({ + inputCurrencyAddress: undefined, + outputCurrencyAddress: undefined, + value: undefined, + field: undefined, + chainId: UniverseChainId.Mainnet, + outputChainId: UniverseChainId.Optimism, + }) + }) + + test('outputChain parameter with output currency', () => { + expect( + queryParametersToCurrencyState( + parse(`?outputChain=base&outputCurrency=${DAI.address}`, { parseArrays: false, ignoreQueryPrefix: true }), + ), + ).toEqual({ + inputCurrencyAddress: undefined, + outputCurrencyAddress: DAI.address, + value: undefined, + field: undefined, + chainId: undefined, + outputChainId: UniverseChainId.Base, + }) + }) + + test('both chain and outputChain with input and output currencies', () => { + expect( + queryParametersToCurrencyState( + parse(`?chain=mainnet&outputChain=optimism&inputCurrency=ETH&outputCurrency=${USDC_OPTIMISM.address}`, { + parseArrays: false, + ignoreQueryPrefix: true, + }), + ), + ).toEqual({ + inputCurrencyAddress: 'ETH', + outputCurrencyAddress: USDC_OPTIMISM.address, + value: undefined, + field: undefined, + chainId: UniverseChainId.Mainnet, + outputChainId: UniverseChainId.Optimism, + }) + }) }) describe('URL parameter serialization', () => { @@ -260,7 +346,7 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialOutputCurrency, initialChainId }, + current: { initialInputCurrency, initialOutputCurrency, initialInputChainId: initialChainId }, }, } = renderHook(() => useInitialCurrencyState()) @@ -282,7 +368,7 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialOutputCurrency, initialChainId }, + current: { initialInputCurrency, initialOutputCurrency, initialInputChainId: initialChainId }, }, } = renderHook(() => useInitialCurrencyState()) @@ -307,7 +393,13 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialOutputCurrency, initialTypedValue, initialField, initialChainId }, + current: { + initialInputCurrency, + initialOutputCurrency, + initialTypedValue, + initialField, + initialInputChainId: initialChainId, + }, }, } = renderHook(() => useInitialCurrencyState()) @@ -328,7 +420,7 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialOutputCurrency, initialChainId }, + current: { initialInputCurrency, initialOutputCurrency, initialInputChainId: initialChainId }, }, } = renderHook(() => useInitialCurrencyState()) @@ -391,7 +483,7 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialChainId }, + current: { initialInputCurrency, initialInputChainId: initialChainId }, }, } = renderHook(() => useInitialCurrencyState()) @@ -417,7 +509,7 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialOutputCurrency, initialChainId }, + current: { initialInputCurrency, initialOutputCurrency, initialInputChainId: initialChainId }, }, } = renderHook(() => useInitialCurrencyState()) @@ -444,7 +536,7 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialChainId }, + current: { initialInputCurrency, initialInputChainId: initialChainId }, }, } = renderHook(() => useInitialCurrencyState()) @@ -463,7 +555,7 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialOutputCurrency, initialChainId }, + current: { initialInputCurrency, initialOutputCurrency, initialInputChainId: initialChainId }, }, } = renderHook(() => useInitialCurrencyState()) @@ -482,7 +574,7 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialOutputCurrency, initialChainId }, + current: { initialInputCurrency, initialOutputCurrency, initialInputChainId: initialChainId }, }, } = renderHook(() => useInitialCurrencyState()) @@ -504,7 +596,7 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialOutputCurrency, initialChainId }, + current: { initialInputCurrency, initialOutputCurrency, initialInputChainId: initialChainId }, }, } = renderHook(() => useInitialCurrencyState()) diff --git a/apps/web/src/state/swap/hooks.tsx b/apps/web/src/state/swap/hooks.tsx index 1f590d11da1..e95c837cd79 100644 --- a/apps/web/src/state/swap/hooks.tsx +++ b/apps/web/src/state/swap/hooks.tsx @@ -225,7 +225,8 @@ export function useInitialCurrencyState(): { initialOutputCurrency?: Currency initialTypedValue?: string initialField?: CurrencyField - initialChainId: UniverseChainId + initialInputChainId?: UniverseChainId + initialOutputChainId?: UniverseChainId triggerConnect: boolean } { const { setIsUserSelectedToken } = useMultichainContext() @@ -243,7 +244,10 @@ export function useInitialCurrencyState(): { const isSupportedChainCompatible = isTestnetModeEnabled === !!supportedChainInfo.testnet const hasCurrencyQueryParams = - parsedCurrencyState.inputCurrencyAddress || parsedCurrencyState.outputCurrencyAddress || parsedCurrencyState.chainId + parsedCurrencyState.inputCurrencyAddress || + parsedCurrencyState.outputCurrencyAddress || + parsedCurrencyState.chainId || + parsedCurrencyState.outputChainId useEffect(() => { if (parsedCurrencyState.inputCurrencyAddress || parsedCurrencyState.outputCurrencyAddress) { @@ -255,9 +259,9 @@ export function useInitialCurrencyState(): { const { initialInputCurrencyAddress, initialChainId } = useMemo(() => { // Default to native if no query params or chain is not compatible with testnet or mainnet mode if (!hasCurrencyQueryParams || !isSupportedChainCompatible) { - const initialChainId = persistedFilteredChainIds?.input ?? defaultChainId + const initialChainId = persistedFilteredChainIds?.input return { - initialInputCurrencyAddress: getNativeAddress(initialChainId), + initialInputCurrencyAddress: getNativeAddress(initialChainId ?? defaultChainId), initialChainId, } } @@ -265,13 +269,13 @@ export function useInitialCurrencyState(): { if (parsedCurrencyState.inputCurrencyAddress) { return { initialInputCurrencyAddress: parsedCurrencyState.inputCurrencyAddress, - initialChainId: supportedChainId, + initialChainId: parsedCurrencyState.chainId ? supportedChainId : undefined, } } // return ETH or parsedCurrencyState return { initialInputCurrencyAddress: parsedCurrencyState.outputCurrencyAddress ? undefined : 'ETH', - initialChainId: supportedChainId, + initialChainId: parsedCurrencyState.chainId ? supportedChainId : undefined, } }, [ hasCurrencyQueryParams, @@ -282,15 +286,15 @@ export function useInitialCurrencyState(): { defaultChainId, ]) - const outputChainIsSupported = useSupportedChainId(parsedCurrencyState.outputChainId) + const supportedOutputChainId = useSupportedChainId(parsedCurrencyState.outputChainId) const initialOutputCurrencyAddress = useMemo( () => // clear output if identical unless there's a supported outputChainId which means we're bridging - initialInputCurrencyAddress === parsedCurrencyState.outputCurrencyAddress && !outputChainIsSupported + initialInputCurrencyAddress === parsedCurrencyState.outputCurrencyAddress && !supportedOutputChainId ? undefined : parsedCurrencyState.outputCurrencyAddress, - [initialInputCurrencyAddress, parsedCurrencyState.outputCurrencyAddress, outputChainIsSupported], + [initialInputCurrencyAddress, parsedCurrencyState.outputCurrencyAddress, supportedOutputChainId], ) const initialInputCurrency = useCurrency({ address: initialInputCurrencyAddress, chainId: initialChainId }) @@ -313,7 +317,8 @@ export function useInitialCurrencyState(): { initialOutputCurrency, initialTypedValue, initialField, - initialChainId, + initialInputChainId: initialChainId, + initialOutputChainId: supportedOutputChainId, triggerConnect: !!parsedQs.connect, } } diff --git a/apps/web/src/state/transactions/types.ts b/apps/web/src/state/transactions/types.ts index 70d93c70194..d5708d22270 100644 --- a/apps/web/src/state/transactions/types.ts +++ b/apps/web/src/state/transactions/types.ts @@ -8,7 +8,11 @@ import type { } from 'uniswap/src/features/transactions/types/transactionDetails' import type { ValidatedTransactionRequest } from 'uniswap/src/features/transactions/types/transactionRequests' -// Re-export for backward compatibility +/** + * Re-export for backward compatibility + * + * @deprecated Use TransactionTypeInfo + */ export type TransactionInfo = TransactionTypeInfo // Web-specific pending transaction details with guaranteed pending status diff --git a/apps/web/src/state/walletCapabilities/hooks/useMismatchAccount.ts b/apps/web/src/state/walletCapabilities/hooks/useMismatchAccount.ts index 86b48a4a479..1b5633726c5 100644 --- a/apps/web/src/state/walletCapabilities/hooks/useMismatchAccount.ts +++ b/apps/web/src/state/walletCapabilities/hooks/useMismatchAccount.ts @@ -1,4 +1,5 @@ import { nanoid } from '@reduxjs/toolkit' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { popupRegistry } from 'components/Popups/registry' import { PopupType } from 'components/Popups/types' import { useRef } from 'react' @@ -9,8 +10,6 @@ import { isAtomicBatchingSupportedByChainId } from 'state/walletCapabilities/lib import { useDelegationService } from 'state/wallets/useDelegationService' import { selectHasShownMismatchToast } from 'uniswap/src/features/behaviorHistory/selectors' import { setHasShownMismatchToast } from 'uniswap/src/features/behaviorHistory/slice' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { createHasMismatchUtil, type HasMismatchUtil } from 'uniswap/src/features/smartWallet/mismatch/mismatch' import { UniswapEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send.web' diff --git a/apps/web/src/state/walletCapabilities/hooks/useWalletGetCapabilitiesMutation.ts b/apps/web/src/state/walletCapabilities/hooks/useWalletGetCapabilitiesMutation.ts index 889cdf53524..2fca5aae612 100644 --- a/apps/web/src/state/walletCapabilities/hooks/useWalletGetCapabilitiesMutation.ts +++ b/apps/web/src/state/walletCapabilities/hooks/useWalletGetCapabilitiesMutation.ts @@ -1,11 +1,10 @@ import { queryOptions, useMutation, useQueryClient } from '@tanstack/react-query' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useAccount } from 'hooks/useAccount' import ms from 'ms' import { useAppDispatch } from 'state/hooks' import { handleGetCapabilities } from 'state/walletCapabilities/lib/handleGetCapabilities' import { setCapabilitiesByChain, setCapabilitiesNotSupported } from 'state/walletCapabilities/reducer' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { getLogger } from 'utilities/src/logger/logger' import { useEvent } from 'utilities/src/react/hooks' import { ReactQueryCacheKey } from 'utilities/src/reactQuery/cache' diff --git a/apps/web/src/utils/computeSurroundingTicks.test.ts b/apps/web/src/utils/computeSurroundingTicks.test.ts index 1be002984db..266ddb293ca 100644 --- a/apps/web/src/utils/computeSurroundingTicks.test.ts +++ b/apps/web/src/utils/computeSurroundingTicks.test.ts @@ -1,5 +1,5 @@ import { TickData } from 'appGraphql/data/AllV3TicksQuery' -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Price, Token } from '@uniswap/sdk-core' import { FeeAmount, TICK_SPACINGS } from '@uniswap/v3-sdk' import JSBI from 'jsbi' diff --git a/apps/web/src/utils/computeSurroundingTicks.ts b/apps/web/src/utils/computeSurroundingTicks.ts index 03f3f448e93..4f98225ae92 100644 --- a/apps/web/src/utils/computeSurroundingTicks.ts +++ b/apps/web/src/utils/computeSurroundingTicks.ts @@ -1,5 +1,5 @@ import { Ticks } from 'appGraphql/data/AllV3TicksQuery' -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency, Price, Token } from '@uniswap/sdk-core' import { tickToPrice as tickToPriceV3 } from '@uniswap/v3-sdk' import { tickToPrice as tickToPriceV4 } from '@uniswap/v4-sdk' diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index 8426335ca78..31f14d0e75b 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -56,6 +56,9 @@ }, { "path": "../../packages/api" + }, + { + "path": "../../packages/gating" } ] } diff --git a/apps/web/vite.config.mts b/apps/web/vite.config.mts index 31586201d5a..2f1476e4429 100644 --- a/apps/web/vite.config.mts +++ b/apps/web/vite.config.mts @@ -287,7 +287,7 @@ export default defineConfig(({ mode }) => { '@visx/responsive', ], // Libraries that shouldn't be pre-bundled - exclude: ['expo-clipboard'], + exclude: ['expo-clipboard', '@connectrpc/connect'], esbuildOptions: { resolveExtensions: ['.web.js', '.web.ts', '.web.tsx', '.js', '.ts', '.tsx'], loader: { diff --git a/bun.lock b/bun.lock index a2d98fc1fbc..d06d2a9e293 100644 --- a/bun.lock +++ b/bun.lock @@ -67,6 +67,7 @@ "@uniswap/v3-sdk": "3.25.2", "@uniswap/v4-sdk": "1.21.2", "@universe/api": "workspace:^", + "@universe/gating": "workspace:^", "@wxt-dev/module-react": "1.1.3", "confusing-browser-globals": "1.0.11", "dotenv-webpack": "8.0.1", @@ -196,6 +197,7 @@ "@uniswap/ethers-rs-mobile": "0.0.5", "@uniswap/sdk-core": "7.7.2", "@universe/api": "workspace:^", + "@universe/gating": "workspace:^", "@walletconnect/core": "2.21.4", "@walletconnect/react-native-compat": "2.21.4", "@walletconnect/types": "2.21.4", @@ -362,8 +364,8 @@ "@types/react-scroll-sync": "0.9.0", "@uniswap/analytics": "1.7.2", "@uniswap/analytics-events": "2.43.0", + "@uniswap/client-data-api": "0.0.18", "@uniswap/client-explore": "0.0.17", - "@uniswap/client-pools": "0.0.17", "@uniswap/merkle-distributor": "1.0.1", "@uniswap/permit2-sdk": "1.3.0", "@uniswap/router-sdk": "2.0.2", @@ -378,6 +380,7 @@ "@uniswap/v3-sdk": "3.25.2", "@uniswap/v4-sdk": "1.21.2", "@universe/api": "workspace:^", + "@universe/gating": "workspace:^", "@visx/group": "2.17.0", "@visx/responsive": "3.12.0", "@visx/shape": "2.18.0", @@ -584,10 +587,9 @@ "@connectrpc/connect": "1.4.0", "@connectrpc/connect-web": "1.4.0", "@tanstack/react-query": "5.77.2", - "@uniswap/client-data-api": "0.0.14", + "@uniswap/client-data-api": "0.0.18", "@uniswap/client-embeddedwallet": "0.0.16", "@uniswap/client-explore": "0.0.17", - "@uniswap/client-pools": "0.0.17", "@uniswap/client-trading": "0.1.0", "@universe/config": "workspace:^", "@universe/sessions": "workspace:^", @@ -682,6 +684,37 @@ "eslint": "8.44.0", }, }, + "packages/gating": { + "name": "@universe/gating", + "version": "0.0.0", + "dependencies": { + "@statsig/client-core": "3.12.2", + "@statsig/js-client": "3.12.2", + "@statsig/js-local-overrides": "3.12.2", + "@statsig/react-bindings": "3.12.2", + "@statsig/react-native-bindings": "3.12.2", + "@universe/api": "workspace:*", + "utilities": "workspace:*", + }, + "devDependencies": { + "@types/node": "22.13.1", + "@uniswap/eslint-config": "workspace:^", + "depcheck": "1.4.7", + "eslint": "8.44.0", + "typescript": "5.3.3", + }, + }, + "packages/notifications": { + "name": "@universe/notifications", + "version": "0.0.0", + "devDependencies": { + "@types/node": "22.13.1", + "@uniswap/eslint-config": "workspace:^", + "depcheck": "1.4.7", + "eslint": "8.44.0", + "typescript": "5.3.3", + }, + }, "packages/sessions": { "name": "@universe/sessions", "version": "0.0.0", @@ -774,6 +807,7 @@ "@connectrpc/connect-query": "1.4.1", "@datadog/browser-logs": "5.20.0", "@datadog/browser-rum": "5.23.3", + "@ethersproject/abstract-provider": "5.8.0", "@ethersproject/abstract-signer": "5.7.0", "@ethersproject/address": "5.7.0", "@ethersproject/bignumber": "5.7.0", @@ -788,21 +822,15 @@ "@shopify/flash-list": "1.7.3", "@simplewebauthn/browser": "13.1.0", "@solana/web3.js": "1.92.0", - "@statsig/client-core": "3.12.2", - "@statsig/js-client": "3.12.2", - "@statsig/js-local-overrides": "3.12.2", - "@statsig/react-bindings": "3.12.2", - "@statsig/react-native-bindings": "3.12.2", "@tanstack/query-async-storage-persister": "5.51.21", "@tanstack/react-query": "5.77.2", "@tanstack/react-query-persist-client": "5.77.2", "@typechain/ethers-v5": "7.2.0", "@types/poisson-disk-sampling": "2.2.4", "@uniswap/analytics-events": "2.43.0", - "@uniswap/client-data-api": "0.0.14", + "@uniswap/client-data-api": "0.0.18", "@uniswap/client-embeddedwallet": "0.0.16", "@uniswap/client-explore": "0.0.17", - "@uniswap/client-pools": "0.0.17", "@uniswap/client-search": "0.0.10", "@uniswap/client-trading": "0.1.0", "@uniswap/permit2-sdk": "1.3.0", @@ -815,6 +843,7 @@ "@uniswap/v4-sdk": "1.21.2", "@universe/api": "workspace:^", "@universe/config": "workspace:^", + "@universe/gating": "workspace:^", "apollo-link-rest": "0.9.0", "date-fns": "2.30.0", "dayjs": "1.11.7", @@ -971,12 +1000,13 @@ "@scure/bip32": "1.3.2", "@tanstack/react-query": "5.77.2", "@uniswap/analytics-events": "2.43.0", - "@uniswap/client-data-api": "0.0.14", + "@uniswap/client-data-api": "0.0.18", "@uniswap/permit2-sdk": "1.3.0", "@uniswap/router-sdk": "2.0.2", "@uniswap/sdk-core": "7.7.2", "@uniswap/universal-router-sdk": "4.19.5", "@universe/api": "workspace:^", + "@universe/gating": "workspace:^", "apollo3-cache-persist": "0.14.1", "dayjs": "1.11.7", "ethers": "5.7.2", @@ -1167,29 +1197,29 @@ "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], - "@aws-sdk/client-cloudwatch-logs": ["@aws-sdk/client-cloudwatch-logs@3.911.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.911.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/eventstream-serde-browser": "^4.2.2", "@smithy/eventstream-serde-config-resolver": "^4.3.2", "@smithy/eventstream-serde-node": "^4.2.2", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-172pKzqYk/GtIQsdrqmJCg8VRBGR+U70kSWdcOWtTMZOOex7Cv6iYMsCLX/ckmvVCKicgsSdxXE6TWYIEMr6oQ=="], + "@aws-sdk/client-cloudwatch-logs": ["@aws-sdk/client-cloudwatch-logs@3.913.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/eventstream-serde-browser": "^4.2.2", "@smithy/eventstream-serde-config-resolver": "^4.3.2", "@smithy/eventstream-serde-node": "^4.2.2", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-ztaUBCI6ps90O5sERy5ZP8aGC2+Ks9kvOJrdpGFMKcTVtyHP1xTB/FDfNvmz2s25S8W7yeCokvs1fvoKcLyniQ=="], - "@aws-sdk/client-cognito-identity": ["@aws-sdk/client-cognito-identity@3.911.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.911.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-Ch/ndkyrh5fAIOqIBS/0IOSsxLQSrzhmBqyZ6Zrahy/haKHOC1UxFFld7crJUbcukvgvmuM9l5DRncy0tIe1tQ=="], + "@aws-sdk/client-cognito-identity": ["@aws-sdk/client-cognito-identity@3.913.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-TdEwasoXnLIb90z7NL1vLbEprzY0vdRqZH97ubIUDo8EaJ6WrJ35Um5g0rcnWKR6C+P9lKKI4mVv2BI2EwY94Q=="], - "@aws-sdk/client-iam": ["@aws-sdk/client-iam@3.911.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.911.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-IksVAEDAsiKR0NsP6b4OLhtvg6GkH/CpopR8Dh1TaBTotS/lE8amF2N94SYq+emG0vJ23CvErmkHQpa2ZBYDUg=="], + "@aws-sdk/client-iam": ["@aws-sdk/client-iam@3.913.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-3UR3EJ/2eutWpcs6LdtLl4JTJ4u/TZZEoLryUConEchrBNNtSVBG2CXrG7In1hS4l0t5TlkW/ruEZyLZJiqFfw=="], - "@aws-sdk/client-lambda": ["@aws-sdk/client-lambda@3.911.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.911.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/eventstream-serde-browser": "^4.2.2", "@smithy/eventstream-serde-config-resolver": "^4.3.2", "@smithy/eventstream-serde-node": "^4.2.2", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-stream": "^4.5.2", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-cKRF10Fks0EEkZiRYlIy3mOUKCwtGET6CwsdYbaQ28qCm/Hh26QcL5YjVbq1fUF4BfdsFi7AQAX9WOWOAA8HQA=="], + "@aws-sdk/client-lambda": ["@aws-sdk/client-lambda@3.913.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/eventstream-serde-browser": "^4.2.2", "@smithy/eventstream-serde-config-resolver": "^4.3.2", "@smithy/eventstream-serde-node": "^4.2.2", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-stream": "^4.5.2", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-Z1POaV/q+unF0G6PEDO0p6JrepJI6DXkVAl4RQiN1hZRshsfZxPQtsanKqMHLEi/OyhqnoVxy1buSNHjuumTdg=="], - "@aws-sdk/client-sfn": ["@aws-sdk/client-sfn@3.911.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.911.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-JQrrhHXecw607oAqJOmg53pd9f9iYOAXcDcTfIVdHiTnXvhMshqgW8TuRobQ4n8Yg4FtgCg0SB/WQNDfYiU+vg=="], + "@aws-sdk/client-sfn": ["@aws-sdk/client-sfn@3.913.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-XVonl1v6mqz+FxevEvY+CBEOi+fTG3Ht2BTwWRM3F0XUwOo4ONH4+jo54rEEbq12zVW3M53k+rMfUDyy1pSLiw=="], "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.911.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-N9QAeMvN3D1ZyKXkQp4aUgC4wUMuA5E1HuVCkajc0bq1pnH4PIke36YlrDGGREqPlyLFrXCkws2gbL5p23vtlg=="], "@aws-sdk/core": ["@aws-sdk/core@3.911.0", "", { "dependencies": { "@aws-sdk/types": "3.910.0", "@aws-sdk/xml-builder": "3.911.0", "@smithy/core": "^3.16.1", "@smithy/node-config-provider": "^4.3.2", "@smithy/property-provider": "^4.2.2", "@smithy/protocol-http": "^5.3.2", "@smithy/signature-v4": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-k4QG9A+UCq/qlDJFmjozo6R0eXXfe++/KnCDMmajehIE9kh+b/5DqlGvAmbl9w4e92LOtrY6/DN3mIX1xs4sXw=="], - "@aws-sdk/credential-provider-cognito-identity": ["@aws-sdk/credential-provider-cognito-identity@3.911.0", "", { "dependencies": { "@aws-sdk/client-cognito-identity": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-4RF/HQ2C4K+UfNfddw3xHLqk/c1G0/8nhgW10BGU0w/EICkCxtVEzgbflGeUumuXsxJYo8Fyyg/Pd8302brfHA=="], + "@aws-sdk/credential-provider-cognito-identity": ["@aws-sdk/credential-provider-cognito-identity@3.913.0", "", { "dependencies": { "@aws-sdk/client-cognito-identity": "3.913.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-AYZNpy3eEFzopzntLcrkEQQ1qyhg0V7BL8U77QdLSYtzoYvI9CqnWOGdWnNSEUp+Mpbk1VJyPzVfkDoDq5kX6g=="], "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-6FWRwWn3LUZzLhqBXB+TPMW2ijCWUqGICSw8bVakEdODrvbiv1RT/MVUayzFwz/ek6e6NKZn6DbSWzx07N9Hjw=="], "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/node-http-handler": "^4.4.1", "@smithy/property-provider": "^4.2.2", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/util-stream": "^4.5.2", "tslib": "^2.6.2" } }, "sha512-xUlwKmIUW2fWP/eM3nF5u4CyLtOtyohlhGJ5jdsJokr3MrQ7w0tDITO43C9IhCn+28D5UbaiWnKw5ntkw7aVfA=="], - "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-env": "3.911.0", "@aws-sdk/credential-provider-http": "3.911.0", "@aws-sdk/credential-provider-process": "3.911.0", "@aws-sdk/credential-provider-sso": "3.911.0", "@aws-sdk/credential-provider-web-identity": "3.911.0", "@aws-sdk/nested-clients": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/credential-provider-imds": "^4.2.2", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-bQ86kWAZ0Imn7uWl7uqOYZ2aqlkftPmEc8cQh+QyhmUXbia8II4oYKq/tMek6j3M5UOMCiJVxzJoxemJZA6/sw=="], + "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.913.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-env": "3.911.0", "@aws-sdk/credential-provider-http": "3.911.0", "@aws-sdk/credential-provider-process": "3.911.0", "@aws-sdk/credential-provider-sso": "3.911.0", "@aws-sdk/credential-provider-web-identity": "3.911.0", "@aws-sdk/nested-clients": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/credential-provider-imds": "^4.2.2", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-iR4c4NQ1OSRKQi0SxzpwD+wP1fCy+QNKtEyCajuVlD0pvmoIHdrm5THK9e+2/7/SsQDRhOXHJfLGxHapD74WJw=="], - "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.911.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.911.0", "@aws-sdk/credential-provider-http": "3.911.0", "@aws-sdk/credential-provider-ini": "3.911.0", "@aws-sdk/credential-provider-process": "3.911.0", "@aws-sdk/credential-provider-sso": "3.911.0", "@aws-sdk/credential-provider-web-identity": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/credential-provider-imds": "^4.2.2", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-4oGpLwgQCKNtVoJROztJ4v7lZLhCqcUMX6pe/DQ2aU0TktZX7EczMCIEGjVo5b7yHwSNWt2zW0tDdgVUTsMHPw=="], + "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.913.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.911.0", "@aws-sdk/credential-provider-http": "3.911.0", "@aws-sdk/credential-provider-ini": "3.913.0", "@aws-sdk/credential-provider-process": "3.911.0", "@aws-sdk/credential-provider-sso": "3.911.0", "@aws-sdk/credential-provider-web-identity": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/credential-provider-imds": "^4.2.2", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-HQPLkKDxS83Q/nZKqg9bq4igWzYQeOMqhpx5LYs4u1GwsKeCsYrrfz12Iu4IHNWPp9EnGLcmdfbfYuqZGrsaSQ=="], "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-mKshhV5jRQffZjbK9x7bs+uC2IsYKfpzYaBamFsEov3xtARCpOiKaIlM8gYKFEbHT2M+1R3rYYlhhl9ndVWS2g=="], @@ -1197,7 +1227,7 @@ "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/nested-clients": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-urIbXWWG+cm54RwwTFQuRwPH0WPsMFSDF2/H9qO2J2fKoHRURuyblFCyYG3aVKZGvFBhOizJYexf5+5w3CJKBw=="], - "@aws-sdk/credential-providers": ["@aws-sdk/credential-providers@3.911.0", "", { "dependencies": { "@aws-sdk/client-cognito-identity": "3.911.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-cognito-identity": "3.911.0", "@aws-sdk/credential-provider-env": "3.911.0", "@aws-sdk/credential-provider-http": "3.911.0", "@aws-sdk/credential-provider-ini": "3.911.0", "@aws-sdk/credential-provider-node": "3.911.0", "@aws-sdk/credential-provider-process": "3.911.0", "@aws-sdk/credential-provider-sso": "3.911.0", "@aws-sdk/credential-provider-web-identity": "3.911.0", "@aws-sdk/nested-clients": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/credential-provider-imds": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/property-provider": "^4.2.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-BTJyah0hB0w4kP6RKBr4oA1O9cJ5hG3UWVXKIH3YvvSEfZtjbaN1lrnN9DXk1lIEsNZG/yG5m6UjI4e9c7eeKA=="], + "@aws-sdk/credential-providers": ["@aws-sdk/credential-providers@3.913.0", "", { "dependencies": { "@aws-sdk/client-cognito-identity": "3.913.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-cognito-identity": "3.913.0", "@aws-sdk/credential-provider-env": "3.911.0", "@aws-sdk/credential-provider-http": "3.911.0", "@aws-sdk/credential-provider-ini": "3.913.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/credential-provider-process": "3.911.0", "@aws-sdk/credential-provider-sso": "3.911.0", "@aws-sdk/credential-provider-web-identity": "3.911.0", "@aws-sdk/nested-clients": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/credential-provider-imds": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/property-provider": "^4.2.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-KnkvoLXGszXNV7IMLdUH2Smo+tr4MiHUp2zkkrhl+6uXdSWpEAhlARSA8OPIxgVMabUW1AWDumN7Km7z0GvnWg=="], "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.910.0", "", { "dependencies": { "@aws-sdk/types": "3.910.0", "@smithy/protocol-http": "^5.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-F9Lqeu80/aTM6S/izZ8RtwSmjfhWjIuxX61LX+/9mxJyEkgaECRxv0chsLQsLHJumkGnXRy/eIyMLBhcTPF5vg=="], @@ -2679,7 +2709,7 @@ "@reown/walletkit": ["@reown/walletkit@1.2.8", "", { "dependencies": { "@walletconnect/core": "2.21.4", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/logger": "2.1.2", "@walletconnect/sign-client": "2.21.4", "@walletconnect/types": "2.21.4", "@walletconnect/utils": "2.21.4" } }, "sha512-X3EO9P6+Dvc++h8OwpBtBhGmq+890UlG/o0Ilb98l5ByDr3QVcYOURRIPVcV6pkTJ9sE6sVDXW7RIRiYSnQp2g=="], - "@repeaterjs/repeater": ["@repeaterjs/repeater@3.0.6", "", {}, "sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA=="], + "@repeaterjs/repeater": ["@repeaterjs/repeater@3.0.4", "", {}, "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA=="], "@resvg/resvg-wasm": ["@resvg/resvg-wasm@2.4.1", "", {}, "sha512-yi6R0HyHtsoWTRA06Col4WoDs7SvlXU3DLMNP2bdAgs7HK18dTEVl1weXgxRzi8gwLteGUbIg29zulxIB3GSdg=="], @@ -2901,16 +2931,24 @@ "@socket.io/component-emitter": ["@socket.io/component-emitter@3.1.2", "", {}, "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="], - "@solana-mobile/mobile-wallet-adapter-protocol": ["@solana-mobile/mobile-wallet-adapter-protocol@2.2.4", "", { "dependencies": { "@solana/wallet-standard": "^1.1.2", "@solana/wallet-standard-util": "^1.1.1", "@wallet-standard/core": "^1.0.3", "js-base64": "^3.7.5" }, "peerDependencies": { "react-native": ">0.69" } }, "sha512-0YvA8QAzMQYujYq1fuJ4wNlouvnJpVYJ4XKqBBh+G8IQGEezhWjuP6DryIg9gw3LD6ju/rDX1jfzGOZ38JAzkQ=="], + "@solana-mobile/mobile-wallet-adapter-protocol": ["@solana-mobile/mobile-wallet-adapter-protocol@2.2.5", "", { "dependencies": { "@solana/codecs-strings": "^4.0.0", "@solana/wallet-standard": "^1.1.2", "@solana/wallet-standard-util": "^1.1.1", "@wallet-standard/core": "^1.0.3", "js-base64": "^3.7.5" }, "peerDependencies": { "react-native": ">0.69" } }, "sha512-kCI+0/umWm98M9g12ndpS56U6wBzq4XdhobCkDPF8qRDYX/iTU8CD+QMcalh7VgRT7GWEmySQvQdaugM0Chf0g=="], - "@solana-mobile/mobile-wallet-adapter-protocol-web3js": ["@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.4", "", { "dependencies": { "@solana-mobile/mobile-wallet-adapter-protocol": "^2.2.4", "bs58": "^5.0.0", "js-base64": "^3.7.5" }, "peerDependencies": { "@solana/web3.js": "^1.58.0" } }, "sha512-vSsIVGEOs+IJ8+5gzSwl5XBCW1zFIwhF0Qfx+fqH8F0eN5ip+XExFcnt5Of426HVpmVL2H8jocBwGwvdrTNU/A=="], + "@solana-mobile/mobile-wallet-adapter-protocol-web3js": ["@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.5", "", { "dependencies": { "@solana-mobile/mobile-wallet-adapter-protocol": "^2.2.5", "bs58": "^5.0.0", "js-base64": "^3.7.5" }, "peerDependencies": { "@solana/web3.js": "^1.58.0" } }, "sha512-xfQl6Kee0ZXagUG5mpy+bMhQTNf2LAzF65m5SSgNJp47y/nP9GdXWi9blVH8IPP+QjF/+DnCtURaXS14bk3WJw=="], - "@solana-mobile/wallet-adapter-mobile": ["@solana-mobile/wallet-adapter-mobile@2.2.4", "", { "dependencies": { "@solana-mobile/mobile-wallet-adapter-protocol-web3js": "^2.2.0", "@solana-mobile/wallet-standard-mobile": "^0.4.1", "@solana/wallet-adapter-base": "^0.9.23", "@solana/wallet-standard-features": "^1.2.0", "js-base64": "^3.7.5" }, "optionalDependencies": { "@react-native-async-storage/async-storage": "^1.17.7" }, "peerDependencies": { "@solana/web3.js": "^1.58.0" } }, "sha512-ZKj8xU1bOtgHMgMfJh8qfUtdp5Ii4JhVJP3jqaRswYpRClmTApkBB++izSD3NBQ6fmiGv2G8F7AILQO0dYOwbg=="], + "@solana-mobile/wallet-adapter-mobile": ["@solana-mobile/wallet-adapter-mobile@2.2.5", "", { "dependencies": { "@solana-mobile/mobile-wallet-adapter-protocol-web3js": "^2.2.5", "@solana-mobile/wallet-standard-mobile": "^0.4.3", "@solana/wallet-adapter-base": "^0.9.23", "@solana/wallet-standard-features": "^1.2.0", "js-base64": "^3.7.5" }, "optionalDependencies": { "@react-native-async-storage/async-storage": "^1.17.7" }, "peerDependencies": { "@solana/web3.js": "^1.58.0" } }, "sha512-Zpzfwm3N4FfI63ZMs2qZChQ1j0z+p2prkZbSU51NyTnE+K9l9sDAl8RmRCOWnE29y+/AN10WuQZQoIAccHVOFg=="], - "@solana-mobile/wallet-standard-mobile": ["@solana-mobile/wallet-standard-mobile@0.4.2", "", { "dependencies": { "@solana-mobile/mobile-wallet-adapter-protocol": "^2.2.4", "@solana/wallet-standard-chains": "^1.1.0", "@solana/wallet-standard-features": "^1.2.0", "@wallet-standard/base": "^1.0.1", "@wallet-standard/features": "^1.0.3", "bs58": "^5.0.0", "js-base64": "^3.7.5", "qrcode": "^1.5.4" } }, "sha512-D/ebTRcpSEdCxfp7OZ0NRg+ScguJHqp208EGWI1R5rMBoGdoeu4ZvIi3VeJdi+Y9qcJFji8p2gf/wdHRL+6RkQ=="], + "@solana-mobile/wallet-standard-mobile": ["@solana-mobile/wallet-standard-mobile@0.4.3", "", { "dependencies": { "@solana-mobile/mobile-wallet-adapter-protocol": "^2.2.5", "@solana/wallet-standard-chains": "^1.1.0", "@solana/wallet-standard-features": "^1.2.0", "@wallet-standard/base": "^1.0.1", "@wallet-standard/features": "^1.0.3", "bs58": "^5.0.0", "js-base64": "^3.7.5", "qrcode": "^1.5.4" } }, "sha512-LLMQs/KgRZpftIhwOLCM2VZLMdA2vIghJjKsYUIiy1FBJS9GEkGDLJdbujb92lfAdmYwbyTuolIRik7JMPH3Kg=="], "@solana/buffer-layout": ["@solana/buffer-layout@4.0.1", "", { "dependencies": { "buffer": "~6.0.3" } }, "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA=="], + "@solana/codecs-core": ["@solana/codecs-core@4.0.0", "", { "dependencies": { "@solana/errors": "4.0.0" }, "peerDependencies": { "typescript": ">=5.3.3" } }, "sha512-28kNUsyIlhU3MO3/7ZLDqeJf2YAm32B4tnTjl5A9HrbBqsTZ+upT/RzxZGP1MMm7jnPuIKCMwmTpsyqyR6IUpw=="], + + "@solana/codecs-numbers": ["@solana/codecs-numbers@4.0.0", "", { "dependencies": { "@solana/codecs-core": "4.0.0", "@solana/errors": "4.0.0" }, "peerDependencies": { "typescript": ">=5.3.3" } }, "sha512-z9zpjtcwzqT9rbkKVZpkWB5/0V7+6YRKs6BccHkGJlaDx8Pe/+XOvPi2rEdXPqrPd9QWb5Xp1iBfcgaDMyiOiA=="], + + "@solana/codecs-strings": ["@solana/codecs-strings@4.0.0", "", { "dependencies": { "@solana/codecs-core": "4.0.0", "@solana/codecs-numbers": "4.0.0", "@solana/errors": "4.0.0" }, "peerDependencies": { "fastestsmallesttextencoderdecoder": "^1.0.22", "typescript": ">=5.3.3" } }, "sha512-XvyD+sQ1zyA0amfxbpoFZsucLoe+yASQtDiLUGMDg5TZ82IHE3B7n82jE8d8cTAqi0HgqQiwU13snPhvg1O0Ow=="], + + "@solana/errors": ["@solana/errors@4.0.0", "", { "dependencies": { "chalk": "5.6.2", "commander": "14.0.1" }, "peerDependencies": { "typescript": ">=5.3.3" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-3YEtvcMvtcnTl4HahqLt0VnaGVf7vVWOnt6/uPky5e0qV6BlxDSbGkbBzttNjxLXHognV0AQi3pjvrtfUnZmbg=="], + "@solana/wallet-adapter-base": ["@solana/wallet-adapter-base@0.9.27", "", { "dependencies": { "@solana/wallet-standard-features": "^1.3.0", "@wallet-standard/base": "^1.1.0", "@wallet-standard/features": "^1.1.0", "eventemitter3": "^5.0.1" }, "peerDependencies": { "@solana/web3.js": "^1.98.0" } }, "sha512-kXjeNfNFVs/NE9GPmysBRKQ/nf+foSaq3kfVSeMcO/iVgigyRmB551OjU3WyAolLG/1jeEfKLqF9fKwMCRkUqg=="], "@solana/wallet-adapter-coinbase": ["@solana/wallet-adapter-coinbase@0.1.23", "", { "dependencies": { "@solana/wallet-adapter-base": "^0.9.27" }, "peerDependencies": { "@solana/web3.js": "^1.98.0" } }, "sha512-vCJi/clbq1VVgydPFnHGAc2jdEhDAClYmhEAR4RJp9UHBg+MEQUl1WW8PVIREY5uOzJHma0qEiyummIfyt0b4A=="], @@ -3495,7 +3533,7 @@ "@types/express": ["@types/express@4.17.23", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ=="], - "@types/express-serve-static-core": ["@types/express-serve-static-core@5.1.0", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA=="], + "@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.7", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg=="], "@types/filesystem": ["@types/filesystem@0.0.36", "", { "dependencies": { "@types/filewriter": "*" } }, "sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA=="], @@ -3689,7 +3727,7 @@ "@uniswap/biome-config": ["@uniswap/biome-config@workspace:packages/biome-config"], - "@uniswap/client-data-api": ["@uniswap/client-data-api@0.0.14", "", {}, "sha512-OpZmRP2YbeIfjZ9fDsnVWk7rFa0xwhByfjt1Ma+VJgObUGyi8ecCuczZ4ntrpNqFpij/kYUrm7i36gR2yGow/Q=="], + "@uniswap/client-data-api": ["@uniswap/client-data-api@0.0.18", "", {}, "sha512-gM7Y4EJNdDfMoMQ9F7Il/NqeUus4zEIDdE8kf2OZTYoGmoiGp2WLrG8D/sToprCpYu0klXbdet2lXGDydkTyew=="], "@uniswap/client-embeddedwallet": ["@uniswap/client-embeddedwallet@0.0.16", "", {}, "sha512-zxlx3E2X0kKAw10FKOGlbFpX4yq3KJv9SEipBJxZae5OZH8Ki8UO+FBX/Ke9JPQmU1WUoiJ7NOknjIIDOjVmpw=="], @@ -3697,8 +3735,6 @@ "@uniswap/client-platform-service": ["@uniswap/client-platform-service@0.0.5", "", {}, "sha512-vqxYuCRpddynuaF9+umgIEdo6EYFb+8VJvamjT6E1p1fx0MC0YATWfQvASzKkPS6oKjKzUBQz8nxCLT+v7aNNg=="], - "@uniswap/client-pools": ["@uniswap/client-pools@0.0.17", "", {}, "sha512-qOmKD3r2R9WjK3nHMmNvDDUPKGA/8SFxUNNZupnIK2oUdkGfKY1xadkbcA4iqN3F00511LQ21c5OZDgxxjelSw=="], - "@uniswap/client-search": ["@uniswap/client-search@0.0.10", "", {}, "sha512-ykHIxTR0dRtI3dK1ubHu2jNe+hfhDjyUfqA/dlNVrjM67GLYjF1Ls4kWi/cfR131XeRWj9gVsZv30CgzkOicAQ=="], "@uniswap/client-trading": ["@uniswap/client-trading@0.1.0", "", {}, "sha512-LWjbAUk3TFvWOlfbXweyME12EUmO6jEQPiCM9jaHA6pWtlWOWPbQcCXuDWy3iwHklupoqhnyiLGj8CFgvpl0lA=="], @@ -3751,6 +3787,10 @@ "@universe/config": ["@universe/config@workspace:packages/config"], + "@universe/gating": ["@universe/gating@workspace:packages/gating"], + + "@universe/notifications": ["@universe/notifications@workspace:packages/notifications"], + "@universe/sessions": ["@universe/sessions@workspace:packages/sessions"], "@universe/uniswap-nx": ["@universe/uniswap-nx@workspace:tools/uniswap-nx"], @@ -4147,7 +4187,7 @@ "ast-types-flow": ["ast-types-flow@0.0.8", "", {}, "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="], - "ast-v8-to-istanbul": ["ast-v8-to-istanbul@0.3.6", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "estree-walker": "^3.0.3", "js-tokens": "^9.0.1" } }, "sha512-9tx1z/7OF/a8EdYL3FKoBhxLf3h3D8fXvuSj0HknsVeli2HE40qbNZxyFhMtnydaRiamwFu9zhb+BsJ5tVPehQ=="], + "ast-v8-to-istanbul": ["ast-v8-to-istanbul@0.3.7", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "estree-walker": "^3.0.3", "js-tokens": "^9.0.1" } }, "sha512-kr1Hy6YRZBkGQSb6puP+D6FQ59Cx4m0siYhAxygMCAgadiWQ6oxAxQXHOMvJx67SJ63jRoVIIg5eXzUbbct1ww=="], "astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="], @@ -4265,7 +4305,7 @@ "base64-sol": ["base64-sol@1.0.1", "", {}, "sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.8.16", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.8.17", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-j5zJcx6golJYTG6c05LUZ3Z8Gi+M62zRT/ycz4Xq4iCOdpcxwg7ngEYD4KA0eWZC7U17qh/Smq8bYbACJ0ipBA=="], "basic-auth": ["basic-auth@2.0.1", "", { "dependencies": { "safe-buffer": "5.1.2" } }, "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg=="], @@ -4401,7 +4441,7 @@ "bytes": ["bytes@3.0.0", "", {}, "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw=="], - "c12": ["c12@3.3.0", "", { "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^17.2.2", "exsolve": "^1.0.7", "giget": "^2.0.0", "jiti": "^2.5.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.0.0", "pkg-types": "^2.3.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" }, "optionalPeers": ["magicast"] }, "sha512-K9ZkuyeJQeqLEyqldbYLG3wjqwpw4BVaAqvmxq3GYKK0b1A/yYQdIcJxkzAOWcNVWhJpRXAPfZFueekiY/L8Dw=="], + "c12": ["c12@3.3.1", "", { "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^17.2.3", "exsolve": "^1.0.7", "giget": "^2.0.0", "jiti": "^2.6.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.0.0", "pkg-types": "^2.3.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" }, "optionalPeers": ["magicast"] }, "sha512-LcWQ01LT9tkoUINHgpIOv3mMs+Abv7oVCrtpMRi1PaapVEpWoMga5WuT7/DqFTu7URP9ftbOmimNw1KNIGh9DQ=="], "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], @@ -4439,7 +4479,7 @@ "caniuse-api": ["caniuse-api@3.0.0", "", { "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", "lodash.memoize": "^4.1.2", "lodash.uniq": "^4.5.0" } }, "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw=="], - "caniuse-lite": ["caniuse-lite@1.0.30001750", "", {}, "sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001751", "", {}, "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw=="], "canvaskit-wasm": ["canvaskit-wasm@0.40.0", "", { "dependencies": { "@webgpu/types": "0.1.21" } }, "sha512-Od2o+ZmoEw9PBdN/yCGvzfu0WVqlufBPEWNG452wY7E9aT8RBE+ChpZF526doOlg7zumO4iCS+RAeht4P0Gbpw=="], @@ -5079,7 +5119,7 @@ "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], - "envinfo": ["envinfo@7.18.0", "", { "bin": { "envinfo": "dist/cli.js" } }, "sha512-02QGCLRW+Jb8PC270ic02lat+N57iBaWsvHjcJViqp6UVupRB+Vsg7brYPTqEFXvsdTql3KnSczv5ModZFpl8Q=="], + "envinfo": ["envinfo@7.19.0", "", { "bin": { "envinfo": "dist/cli.js" } }, "sha512-DoSM9VyG6O3vqBf+p3Gjgr/Q52HYBBtO3v+4koAxt1MnWr+zEnxE+nke/yXS4lt2P4SYCHQ4V3f1i88LQVOpAw=="], "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], @@ -5381,6 +5421,8 @@ "fastest-levenshtein": ["fastest-levenshtein@1.0.16", "", {}, "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg=="], + "fastestsmallesttextencoderdecoder": ["fastestsmallesttextencoderdecoder@1.0.22", "", {}, "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw=="], + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], "faye-websocket": ["faye-websocket@0.11.4", "", { "dependencies": { "websocket-driver": ">=0.5.1" } }, "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g=="], @@ -6683,7 +6725,7 @@ "node-preload": ["node-preload@0.2.1", "", { "dependencies": { "process-on-spawn": "^1.0.0" } }, "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ=="], - "node-releases": ["node-releases@2.0.23", "", {}, "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg=="], + "node-releases": ["node-releases@2.0.25", "", {}, "sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA=="], "node-source-walk": ["node-source-walk@5.0.2", "", { "dependencies": { "@babel/parser": "^7.21.4" } }, "sha512-Y4jr/8SRS5hzEdZ7SGuvZGwfORvNsSsNRwDXx5WisiqzsVfeftDvRgfeqWNgZvWSJbgubTRVRYBzK6UO+ErqjA=="], @@ -8849,8 +8891,6 @@ "@babel/runtime/regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="], - "@binance/w3w-qrcode-modal/qrcode": ["qrcode@1.5.4", "", { "dependencies": { "dijkstrajs": "^1.0.1", "pngjs": "^5.0.0", "yargs": "^15.3.1" }, "bin": { "qrcode": "bin/qrcode" } }, "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg=="], - "@chromatic-com/storybook/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], "@cloudflare/kv-asset-handler/mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], @@ -8865,7 +8905,7 @@ "@commitlint/load/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "@commitlint/load/cosmiconfig": ["cosmiconfig@8.0.0", "", { "dependencies": { "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "parse-json": "^5.0.0", "path-type": "^4.0.0" } }, "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ=="], + "@commitlint/load/cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="], "@commitlint/read/fs-extra": ["fs-extra@11.3.2", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A=="], @@ -8949,26 +8989,8 @@ "@ethersproject/basex/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - "@ethersproject/hdnode/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "@ethersproject/hdnode/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "@ethersproject/hdnode/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], - - "@ethersproject/hdnode/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - - "@ethersproject/json-wallets/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], - - "@ethersproject/json-wallets/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "@ethersproject/json-wallets/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "@ethersproject/json-wallets/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - "@ethersproject/providers/ws": ["ws@7.4.6", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="], - "@ethersproject/signing-key/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - "@ethersproject/solidity/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], "@ethersproject/solidity/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], @@ -8987,20 +9009,8 @@ "@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], - "@ethersproject/wallet/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], - - "@ethersproject/wallet/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "@ethersproject/wallet/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "@ethersproject/wallet/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "@ethersproject/wallet/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], - "@expo/bunyan/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], - "@expo/cli/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], - "@expo/cli/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "@expo/cli/ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], @@ -9019,6 +9029,8 @@ "@expo/cli/picomatch": ["picomatch@3.0.1", "", {}, "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag=="], + "@expo/cli/send": ["send@0.19.1", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg=="], + "@expo/cli/source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], "@expo/cli/tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], @@ -9267,8 +9279,6 @@ "@graphql-tools/executor/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@graphql-tools/executor-graphql-ws/@repeaterjs/repeater": ["@repeaterjs/repeater@3.0.4", "", {}, "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA=="], - "@graphql-tools/executor-graphql-ws/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "@graphql-tools/executor-graphql-ws/ws": ["ws@8.13.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA=="], @@ -9473,8 +9483,6 @@ "@metamask/providers/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "@metamask/sdk/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], - "@metamask/sdk/cross-fetch": ["cross-fetch@4.1.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw=="], "@metamask/sdk/pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], @@ -9505,26 +9513,12 @@ "@nicolo-ribaudo/eslint-scope-5-internals/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], - "@nx/devkit/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@nx/eslint/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@nx/jest/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - - "@nx/js/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], - - "@nx/js/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], - "@nx/js/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "@nx/js/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - - "@nx/plugin/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@nx/workspace/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "@nx/workspace/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@octokit/endpoint/is-plain-object": ["is-plain-object@5.0.0", "", {}, "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="], "@octokit/request/is-plain-object": ["is-plain-object@5.0.0", "", {}, "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="], @@ -9807,6 +9801,12 @@ "@solana-mobile/wallet-standard-mobile/qrcode": ["qrcode@1.5.4", "", { "dependencies": { "dijkstrajs": "^1.0.1", "pngjs": "^5.0.0", "yargs": "^15.3.1" }, "bin": { "qrcode": "bin/qrcode" } }, "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg=="], + "@solana/errors/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "@solana/errors/commander": ["commander@14.0.1", "", {}, "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A=="], + + "@solana/wallet-standard-util/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], + "@solana/web3.js/bs58": ["bs58@4.0.1", "", { "dependencies": { "base-x": "^3.0.2" } }, "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw=="], "@solana/web3.js/node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], @@ -9815,8 +9815,6 @@ "@storybook/addon-actions/polished": ["polished@4.3.1", "", { "dependencies": { "@babel/runtime": "^7.17.8" } }, "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA=="], - "@storybook/addon-actions/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - "@storybook/addon-essentials/@storybook/addon-controls": ["@storybook/addon-controls@8.5.2", "", { "dependencies": { "@storybook/global": "^5.0.0", "dequal": "^2.0.2", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^8.5.2" } }, "sha512-wkzw2vRff4zkzdvC/GOlB2PlV0i973u8igSLeg34TWNEAa4bipwVHnFfIojRuP9eN1bZL/0tjuU5pKnbTqH7aQ=="], "@storybook/addon-interactions/polished": ["polished@4.3.1", "", { "dependencies": { "@babel/runtime": "^7.17.8" } }, "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA=="], @@ -9865,8 +9863,6 @@ "@storybook/test/@vitest/spy": ["@vitest/spy@2.0.5", "", { "dependencies": { "tinyspy": "^3.0.0" } }, "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA=="], - "@storybook/test-runner/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], - "@storybook/test-runner/@storybook/csf": ["@storybook/csf@0.1.13", "", { "dependencies": { "type-fest": "^2.19.0" } }, "sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q=="], "@surma/rollup-plugin-off-main-thread/magic-string": ["magic-string@0.25.9", "", { "dependencies": { "sourcemap-codec": "^1.4.8" } }, "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ=="], @@ -9903,8 +9899,6 @@ "@tamagui/static/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], - "@tamagui/static/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], - "@tamagui/static/esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], "@tamagui/static/fs-extra": ["fs-extra@11.3.2", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A=="], @@ -9937,8 +9931,6 @@ "@tybys/wasm-util/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@types/express/@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.7", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg=="], - "@types/request/form-data": ["form-data@2.5.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.35", "safe-buffer": "^5.2.1" } }, "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A=="], "@typescript-eslint/typescript-estree/globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -10833,8 +10825,6 @@ "jest-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "jest-util/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "jest-validate/@jest/types": ["@jest/types@30.2.0", "", { "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg=="], "jest-validate/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -10881,10 +10871,6 @@ "keccak/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "knip/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - - "knip/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "latest-version/package-json": ["package-json@10.0.1", "", { "dependencies": { "ky": "^1.2.0", "registry-auth-token": "^5.0.2", "registry-url": "^6.0.1", "semver": "^7.6.0" } }, "sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg=="], "lazystream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], @@ -10933,8 +10919,6 @@ "matcher-collection/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - "md5.js/hash-base": ["hash-base@3.1.2", "", { "dependencies": { "inherits": "^2.0.4", "readable-stream": "^2.3.8", "safe-buffer": "^5.2.1", "to-buffer": "^1.2.1" } }, "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg=="], - "meow/type-fest": ["type-fest@0.18.1", "", {}, "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw=="], "meow/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], @@ -10973,10 +10957,6 @@ "metro-file-map/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], - "metro-minify-terser/terser": ["terser@5.44.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w=="], - - "metro-runtime/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], - "metro-source-map/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], "metro-source-map/vlq": ["vlq@1.0.1", "", {}, "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w=="], @@ -11577,8 +11557,6 @@ "tamagui-loader/esbuild-loader": ["esbuild-loader@4.4.0", "", { "dependencies": { "esbuild": "^0.25.0", "get-tsconfig": "^4.10.1", "loader-utils": "^2.0.4", "webpack-sources": "^1.4.3" }, "peerDependencies": { "webpack": "^4.40.0 || ^5.0.0" } }, "sha512-4J+hXTpTtEdzUNLoY8ReqDNJx2NoldfiljRCiKbeYUuZmVaiJeDqFgyAzz8uOopaekwRoCcqBFyEroGQLFVZ1g=="], - "tamagui-loader/fs-extra": ["fs-extra@11.3.2", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A=="], - "tamagui-loader/loader-utils": ["loader-utils@3.3.1", "", {}, "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg=="], "tar/mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], @@ -11695,18 +11673,12 @@ "vinyl-sourcemap/vinyl": ["vinyl@2.2.1", "", { "dependencies": { "clone": "^2.1.1", "clone-buffer": "^1.0.0", "clone-stats": "^1.0.0", "cloneable-readable": "^1.0.0", "remove-trailing-separator": "^1.0.1", "replace-ext": "^1.0.0" } }, "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw=="], - "vite/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - - "vite-plugin-bundlesize/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "vite-plugin-bundlesize/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], "vite-plugin-svgr/@svgr/core": ["@svgr/core@8.1.0", "", { "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", "camelcase": "^6.2.0", "cosmiconfig": "^8.1.3", "snake-case": "^3.0.4" } }, "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA=="], "vite-plugin-svgr/@svgr/plugin-jsx": ["@svgr/plugin-jsx@8.1.0", "", { "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", "@svgr/hast-util-to-babel-ast": "8.0.0", "svg-parser": "^2.0.4" }, "peerDependencies": { "@svgr/core": "*" } }, "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA=="], - "vitest/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "vitest/vite-node": ["vite-node@3.2.1", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-V4EyKQPxquurNJPtQJRZo8hKOoKNBRIhxcDbQFPFig0JdoWcUhwRgK8yoCXXrfYVPKS6XwirGHPszLnR8FbjCA=="], "wagmi/use-sync-external-store": ["use-sync-external-store@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw=="], @@ -11839,8 +11811,6 @@ "@babel/register/source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - "@binance/w3w-qrcode-modal/qrcode/yargs": ["yargs@15.4.1", "", { "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" } }, "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A=="], - "@chromatic-com/storybook/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "@commitlint/format/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -11877,12 +11847,6 @@ "@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - "@ethersproject/hdnode/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "@ethersproject/json-wallets/@ethersproject/address/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "@ethersproject/json-wallets/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - "@ethersproject/solidity/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], "@expo/cli/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -11911,6 +11875,10 @@ "@expo/cli/ora/strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], + "@expo/cli/send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "@expo/cli/send/range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + "@expo/cli/source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "@expo/cli/tar/chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], @@ -12361,6 +12329,10 @@ "@solana/web3.js/node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + "@storybook/addon-actions/polished/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], + + "@storybook/addon-interactions/polished/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], + "@storybook/builder-webpack5/terser-webpack-plugin/schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], "@storybook/builder-webpack5/terser-webpack-plugin/terser": ["terser@5.44.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w=="], @@ -12375,6 +12347,8 @@ "@storybook/preset-react-webpack/find-up/locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + "@storybook/react-native-theming/polished/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], + "@storybook/react-native-ui/@storybook/react/@storybook/components": ["@storybook/components@8.6.14", "", { "peerDependencies": { "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "sha512-HNR2mC5I4Z5ek8kTrVZlIY/B8gJGs5b3XdZPBPBopTIN6U/YHXiDyOjY3JlaS4fSG1fVhp/Qp1TpMn1w/9m1pw=="], "@storybook/react-native-ui/@storybook/react/@storybook/manager-api": ["@storybook/manager-api@8.6.14", "", { "peerDependencies": { "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "sha512-ez0Zihuy17udLbfHZQXkGqwtep0mSGgHcNzGN7iZrMP1m+VmNo+7aGCJJdvXi7+iU3yq8weXSQFWg5DqWgLS7g=="], @@ -12385,6 +12359,8 @@ "@storybook/react-native-ui/@storybook/react/@storybook/theming": ["@storybook/theming@8.6.14", "", { "peerDependencies": { "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "sha512-r4y+LsiB37V5hzpQo+BM10PaCsp7YlZ0YcZzQP1OCkPlYXmUAFy2VvDKaFRpD8IeNPKug2u4iFm/laDEbs03dg=="], + "@storybook/react-native-ui/polished/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], + "@storybook/react-native/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], "@storybook/test/@testing-library/jest-dom/chalk": ["chalk@3.0.0", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="], @@ -13461,8 +13437,6 @@ "matcher-collection/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - "md5.js/hash-base/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], - "metro-config/cosmiconfig/import-fresh": ["import-fresh@2.0.0", "", { "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" } }, "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg=="], "metro-config/cosmiconfig/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], @@ -13471,14 +13445,10 @@ "metro-config/jest-validate/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "metro-config/metro-runtime/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], - "metro-file-map/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "metro-file-map/jest-worker/jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="], - "metro-minify-terser/terser/source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], - "metro-transform-worker/metro-source-map/metro-symbolicate": ["metro-symbolicate@0.81.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-source-map": "0.81.1", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "vlq": "^1.0.0" }, "bin": { "metro-symbolicate": "src/index.js" } }, "sha512-Lgk0qjEigtFtsM7C0miXITbcV47E1ZYIfB+m/hCraihiwRWkNUQEPCWvqZmwXKSwVE5mXA0EzQtghAvQSjZDxw=="], "metro-transform-worker/metro-source-map/ob1": ["ob1@0.81.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-1PEbvI+AFvOcgdNcO79FtDI1TUO8S3lhiKOyAiyWQF3sFDDKS+aw2/BZvGlArFnSmqckwOOB9chQuIX0/OahoQ=="], @@ -13497,8 +13467,6 @@ "metro/jest-worker/jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="], - "metro/metro-runtime/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], - "metro/metro-source-map/ob1": ["ob1@0.81.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-1PEbvI+AFvOcgdNcO79FtDI1TUO8S3lhiKOyAiyWQF3sFDDKS+aw2/BZvGlArFnSmqckwOOB9chQuIX0/OahoQ=="], "metro/metro-source-map/vlq": ["vlq@1.0.1", "", {}, "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w=="], @@ -13827,7 +13795,7 @@ "storybook/@storybook/core/@storybook/csf": ["@storybook/csf@0.1.12", "", { "dependencies": { "type-fest": "^2.19.0" } }, "sha512-9/exVhabisyIVL0VxTCxo01Tdm8wefIXKXfltAPTSr8cbLn5JAxGQ6QV3mjdecLGEOucfoVhAKtJfVHxEK1iqw=="], - "storybook/@storybook/core/esbuild": ["esbuild@0.19.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.19.12", "@esbuild/android-arm": "0.19.12", "@esbuild/android-arm64": "0.19.12", "@esbuild/android-x64": "0.19.12", "@esbuild/darwin-arm64": "0.19.12", "@esbuild/darwin-x64": "0.19.12", "@esbuild/freebsd-arm64": "0.19.12", "@esbuild/freebsd-x64": "0.19.12", "@esbuild/linux-arm": "0.19.12", "@esbuild/linux-arm64": "0.19.12", "@esbuild/linux-ia32": "0.19.12", "@esbuild/linux-loong64": "0.19.12", "@esbuild/linux-mips64el": "0.19.12", "@esbuild/linux-ppc64": "0.19.12", "@esbuild/linux-riscv64": "0.19.12", "@esbuild/linux-s390x": "0.19.12", "@esbuild/linux-x64": "0.19.12", "@esbuild/netbsd-x64": "0.19.12", "@esbuild/openbsd-x64": "0.19.12", "@esbuild/sunos-x64": "0.19.12", "@esbuild/win32-arm64": "0.19.12", "@esbuild/win32-ia32": "0.19.12", "@esbuild/win32-x64": "0.19.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg=="], + "storybook/@storybook/core/esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], "styled-components/@emotion/is-prop-valid/@emotion/memoize": ["@emotion/memoize@0.9.0", "", {}, "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="], @@ -13893,6 +13861,8 @@ "unstorage/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + "update-check/registry-auth-token/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + "update-notifier/boxen/camelcase": ["camelcase@8.0.0", "", {}, "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA=="], "update-notifier/boxen/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], @@ -14055,12 +14025,6 @@ "@babel/register/find-cache-dir/pkg-dir/find-up": ["find-up@3.0.0", "", { "dependencies": { "locate-path": "^3.0.0" } }, "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="], - "@binance/w3w-qrcode-modal/qrcode/yargs/cliui": ["cliui@6.0.0", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ=="], - - "@binance/w3w-qrcode-modal/qrcode/yargs/y18n": ["y18n@4.0.3", "", {}, "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="], - - "@binance/w3w-qrcode-modal/qrcode/yargs/yargs-parser": ["yargs-parser@18.1.3", "", { "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ=="], - "@commitlint/format/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "@commitlint/load/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -14079,8 +14043,6 @@ "@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - "@ethersproject/json-wallets/@ethersproject/strings/@ethersproject/constants/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - "@expo/cli/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "@expo/cli/glob/foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], @@ -14093,6 +14055,8 @@ "@expo/cli/ora/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], + "@expo/cli/send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + "@expo/cli/tar/fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], "@expo/cli/tar/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], @@ -14711,10 +14675,6 @@ "madge/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "md5.js/hash-base/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - - "md5.js/hash-base/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], - "metro-config/cosmiconfig/import-fresh/resolve-from": ["resolve-from@3.0.0", "", {}, "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw=="], "metro-config/cosmiconfig/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], @@ -14729,8 +14689,6 @@ "metro-file-map/jest-worker/jest-util/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "metro-minify-terser/terser/source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - "metro/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "metro/jest-worker/jest-util/ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], @@ -14947,51 +14905,55 @@ "static-eval/escodegen/optionator/type-check": ["type-check@0.3.2", "", { "dependencies": { "prelude-ls": "~1.1.2" } }, "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg=="], - "storybook/@storybook/core/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.19.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA=="], + "storybook/@storybook/core/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="], - "storybook/@storybook/core/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.19.12", "", { "os": "android", "cpu": "arm" }, "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w=="], + "storybook/@storybook/core/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q=="], - "storybook/@storybook/core/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.19.12", "", { "os": "android", "cpu": "arm64" }, "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA=="], + "storybook/@storybook/core/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.24.2", "", { "os": "android", "cpu": "arm64" }, "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg=="], - "storybook/@storybook/core/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.19.12", "", { "os": "android", "cpu": "x64" }, "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew=="], + "storybook/@storybook/core/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.24.2", "", { "os": "android", "cpu": "x64" }, "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw=="], - "storybook/@storybook/core/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.19.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g=="], + "storybook/@storybook/core/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.24.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA=="], - "storybook/@storybook/core/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.19.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A=="], + "storybook/@storybook/core/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.24.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA=="], - "storybook/@storybook/core/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.19.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA=="], + "storybook/@storybook/core/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.24.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg=="], - "storybook/@storybook/core/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.19.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg=="], + "storybook/@storybook/core/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.24.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q=="], - "storybook/@storybook/core/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.19.12", "", { "os": "linux", "cpu": "arm" }, "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w=="], + "storybook/@storybook/core/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.24.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA=="], - "storybook/@storybook/core/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.19.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA=="], + "storybook/@storybook/core/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.24.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg=="], - "storybook/@storybook/core/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.19.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA=="], + "storybook/@storybook/core/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.24.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw=="], - "storybook/@storybook/core/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA=="], + "storybook/@storybook/core/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ=="], - "storybook/@storybook/core/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w=="], + "storybook/@storybook/core/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw=="], - "storybook/@storybook/core/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.19.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg=="], + "storybook/@storybook/core/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.24.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw=="], - "storybook/@storybook/core/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg=="], + "storybook/@storybook/core/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q=="], - "storybook/@storybook/core/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.19.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg=="], + "storybook/@storybook/core/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.24.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw=="], - "storybook/@storybook/core/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.19.12", "", { "os": "linux", "cpu": "x64" }, "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg=="], + "storybook/@storybook/core/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.24.2", "", { "os": "linux", "cpu": "x64" }, "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q=="], - "storybook/@storybook/core/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.19.12", "", { "os": "none", "cpu": "x64" }, "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA=="], + "storybook/@storybook/core/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.24.2", "", { "os": "none", "cpu": "arm64" }, "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw=="], - "storybook/@storybook/core/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.19.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw=="], + "storybook/@storybook/core/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.24.2", "", { "os": "none", "cpu": "x64" }, "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw=="], - "storybook/@storybook/core/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.19.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA=="], + "storybook/@storybook/core/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.24.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A=="], - "storybook/@storybook/core/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.19.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A=="], + "storybook/@storybook/core/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.24.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA=="], - "storybook/@storybook/core/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.19.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ=="], + "storybook/@storybook/core/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.24.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig=="], - "storybook/@storybook/core/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.19.12", "", { "os": "win32", "cpu": "x64" }, "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA=="], + "storybook/@storybook/core/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.24.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ=="], + + "storybook/@storybook/core/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.24.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA=="], + + "storybook/@storybook/core/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg=="], "sucrase/glob/foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], @@ -15059,8 +15021,6 @@ "@babel/register/find-cache-dir/pkg-dir/find-up/locate-path": ["locate-path@3.0.0", "", { "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="], - "@binance/w3w-qrcode-modal/qrcode/yargs/yargs-parser/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], - "@commitlint/top-level/find-up/locate-path/p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], "@datadog/datadog-ci/ora/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], diff --git a/config/jest-presets/jest/jest-preset.js b/config/jest-presets/jest/jest-preset.js index c43d4e5925c..c151e795496 100644 --- a/config/jest-presets/jest/jest-preset.js +++ b/config/jest-presets/jest/jest-preset.js @@ -34,7 +34,7 @@ module.exports = { // changedSince: 'master', // https://github.com/facebook/jest/issues/2663#issuecomment-341384494 transformIgnorePatterns: [ - 'node_modules/(?!(react-native|react-native-web|react-native-modal-selector|react-native-modal-datetime-picker|react-native-keyboard-controller|@react-navigation|@storybook/react-native|@react-native-community/datetimepicker|react-native-image-colors|uuid|react-native-reanimated|react-native-safe-area-context|react-native-localize|@react-native-masked-view|@statsig-js/js-client|@statsig/react-native-bindings|@statsig/react-bindings|@statsig/js-local-overrides|@react-native|@react-native-firebase|@uniswap/client-embeddedwallet|@uniswap/client-data-api|@uniswap/client-pools|@uniswap/client-platform-service|@connectrpc|@bufbuild|react-native-webview|@gorhom|expo.*|d3-(array|color|format|interpolate|path|scale|shape|time-format|time)|internmap|react-native-qrcode-svg|react-native-modal|react-native-animatable|react-native-masked-view|redux-persist|react-native-url-polyfill|react-native-context-menu-view|react-native-wagmi-charts|react-native-markdown-display|react-native-redash|@walletconnect|moti|react-native-image-picker|wagmi|viem|rn-qr-generator|@solana|jayson)/)', + 'node_modules/(?!(react-native|@universe|react-native-web|react-native-modal-selector|react-native-modal-datetime-picker|react-native-keyboard-controller|@react-navigation|@storybook/react-native|@react-native-community/datetimepicker|react-native-image-colors|uuid|react-native-reanimated|react-native-safe-area-context|react-native-localize|@react-native-masked-view|@statsig-js/js-client|@statsig/react-native-bindings|@statsig/react-bindings|@statsig/js-local-overrides|@react-native|@react-native-firebase|@uniswap/client-embeddedwallet|@uniswap/client-data-api|@uniswap/client-platform-service|@connectrpc|@bufbuild|react-native-webview|@gorhom|expo.*|d3-(array|color|format|interpolate|path|scale|shape|time-format|time)|internmap|react-native-qrcode-svg|react-native-modal|react-native-animatable|react-native-masked-view|redux-persist|react-native-url-polyfill|react-native-context-menu-view|react-native-wagmi-charts|react-native-markdown-display|react-native-redash|@walletconnect|moti|react-native-image-picker|wagmi|viem|rn-qr-generator|@solana|jayson|@uniswap\/client-search)/)', ], collectCoverage: false, // only collect in CI clearMocks: true, diff --git a/config/jest-presets/jest/setup.js b/config/jest-presets/jest/setup.js index acfd62262e2..53cf1b368e0 100644 --- a/config/jest-presets/jest/setup.js +++ b/config/jest-presets/jest/setup.js @@ -109,39 +109,33 @@ const NetInfoStateType = { jest.mock('@react-native-community/netinfo', () => ({ ...mockRNCNetInfo, NetInfoStateType })) -jest.mock('uniswap/src/features/gating/sdk/statsig', () => { - const real = jest.requireActual('uniswap/src/features/gating/sdk/statsig') - const StatsigMock = { - ...real, - useGate: () => { - return { - isLoading: false, - value: false, - } - }, - useConfig: () => { - return {} - }, - +jest.mock('@universe/gating', () => { + const actual = jest.requireActual('@universe/gating') + return { + ...actual, + // Mock functions + useDynamicConfigValue: jest.fn((args) => args.defaultValue), + useFeatureFlag: jest.fn(() => false), + useGate: jest.fn(() => ({ isLoading: false, value: false })), + useConfig: jest.fn(() => ({})), + getStatsigClient: jest.fn(() => ({ + checkGate: jest.fn(() => false), + getConfig: jest.fn(() => ({ + get: (_name, fallback) => fallback, + getValue: (_name, fallback) => fallback, + })), + getLayer: jest.fn(() => ({ + get: jest.fn(() => false), + })), + })), Statsig: { - checkGate: () => false, - getConfig: () => { - return { - get: (_name, fallback) => fallback, - getValue: (_name, fallback) => fallback, - } - }, + checkGate: jest.fn(() => false), + getConfig: jest.fn(() => ({ + get: (_name, fallback) => fallback, + getValue: (_name, fallback) => fallback, + })), }, } - return StatsigMock -}) - -jest.mock('uniswap/src/features/gating/hooks', () => { - const real = jest.requireActual('uniswap/src/features/gating/hooks') - return { - ...real, - useDynamicConfigValue: (args) => args.defaultValue, - } }) // TODO: Remove this mock after mocks in jest-expo are fixed diff --git a/config/vitest-presets/vitest/vitest-preset.js b/config/vitest-presets/vitest/vitest-preset.js index 5b44b8f092d..e08010644ed 100644 --- a/config/vitest-presets/vitest/vitest-preset.js +++ b/config/vitest-presets/vitest/vitest-preset.js @@ -61,7 +61,6 @@ module.exports = { '@react-native-firebase/**', '@uniswap/client-embeddedwallet', '@uniswap/client-data-api', - '@uniswap/client-pools', 'react-native-webview', '@gorhom/**', 'expo*', diff --git a/dangerfile.ts b/dangerfile.ts index a0cdafb2a27..7785ee045d5 100644 --- a/dangerfile.ts +++ b/dangerfile.ts @@ -74,7 +74,7 @@ function checkGeneralizedHookFiles() { } // Put any files here that we explicitly want to ignore! -const IGNORED_SPLIT_RULE_FILES: string[] = ['packages/uniswap/src/features/gating/sdk/statsig.native.ts'] +const IGNORED_SPLIT_RULE_FILES: string[] = ['packages/gating/src/sdk/statsig.native.ts'] function checkSplitFiles() { const touchedFiles = danger.git.modified_files.concat(danger.git.created_files) diff --git a/nx.json b/nx.json index 5f69d8974a1..e24f6a33130 100644 --- a/nx.json +++ b/nx.json @@ -10,7 +10,13 @@ "build": { "dependsOn": ["^prepare", "prepare", "^build"], "inputs": ["dependencies", "sourceFiles", "tsConfig"], - "outputs": ["{projectRoot}/dist", "{projectRoot}/build", "{projectRoot}/.next", "{projectRoot}/types"], + "outputs": [ + "{workspaceRoot}/dist/out-tsc/{projectRoot}", + "{projectRoot}/dist", + "{projectRoot}/build", + "{projectRoot}/.next", + "{projectRoot}/types" + ], "cache": true }, "build:production": { @@ -49,18 +55,14 @@ "options": { "cwd": "{projectRoot}" }, - "dependsOn": [ - "@uniswap/biome-config:prepare" - ] + "dependsOn": ["@uniswap/biome-config:prepare"] }, "lint:biome:fix": { "command": "biome check . --write", "options": { "cwd": "{projectRoot}" }, - "dependsOn": [ - "@uniswap/biome-config:prepare" - ] + "dependsOn": ["@uniswap/biome-config:prepare"] }, "lint:eslint": { "command": "eslint . --ext ts,tsx --max-warnings=0", @@ -82,10 +84,7 @@ }, "lint:fix": { "executor": "nx:noop", - "dependsOn": [ - "lint:biome:fix", - "lint:eslint:fix" - ], + "dependsOn": ["lint:biome:fix", "lint:eslint:fix"], "cache": false }, "test": { @@ -171,13 +170,8 @@ }, "@nx/js:tsc": { "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ] + "dependsOn": ["^build"], + "inputs": ["production", "^production"] } }, "namedInputs": { diff --git a/package.json b/package.json index 1af9250245b..f42f4722421 100644 --- a/package.json +++ b/package.json @@ -132,11 +132,22 @@ }, "scripts": { "api": "bun run --cwd packages/api", - "clean": "bash ./scripts/clean.sh", - "config": "bun run --cwd packages/config", - "extension": "bun run --cwd apps/extension", "biome-config": "bun run --cwd packages/biome-config", + "config": "bun run --cwd packages/config", "eslint-config": "bun run --cwd packages/eslint-config", + "extension": "bun run --cwd apps/extension", + "mobile": "bun run --cwd apps/mobile", + "sessions": "bun run --cwd packages/sessions", + "ui": "bun run --cwd packages/ui", + "uniswap": "bun run --cwd packages/uniswap", + "utilities": "bun run --cwd packages/utilities", + "wallet": "bun run --cwd packages/wallet", + "web": "bun run --cwd apps/web", + "clean": "bash ./scripts/clean.sh", + "lfg": "bun run g:prepare && bun run mobile env:local:download && bun run extension env:local:download && bun run g:build && bun run mobile pod && bun run mobile ios", + "local:check": "./scripts/local-version-check.sh", + "preinstall": "./scripts/check-bun-version.sh", + "postinstall": "lefthook install && bun g:prepare", "g:build": "nx run-many -t build --parallel", "g:build:storybook": "nx run-many -t storybook:build --skip-nx-cache --parallel", "g:check:deps:usage": "./scripts/check-deps-with-vue-fix.sh && nx run-many -t check:deps:usage", @@ -148,12 +159,13 @@ "g:lint:changed": "nx affected -t lint --base=${NX_BASE:-main} --head=${NX_HEAD:-HEAD}", "g:lint": "nx run-many -t lint", "g:lint:fix": "nx run-many -t lint:fix", + "g:pre-commit-checks": "nx affected -t typecheck,lint:biome --uncommitted --output-style=stream", "g:prepare": "nx run-many -t prepare --output-style=stream", - "g:rm:local-packages": "rm -rf ./node_modules/utilities ./node_modules/wallet ./node_modules/ui ./node_modules/uniswap", + "g:rm:local-packages": "bash ./scripts/remove-local-packages.sh", "g:rm:nodemodules": "rm -rf node_modules **/node_modules", - "g:pre-commit-checks": "nx affected -t typecheck,lint:biome --uncommitted --output-style=stream", - "g:run-fast-checks": "nx affected -t typecheck,lint,build --base=${NX_BASE:-HEAD~1} --head=${NX_HEAD:-HEAD}", "g:run-all-checks": "nx run-many -t typecheck,lint,test,build,check:circular", + "g:run-fast-checks": "nx affected -t typecheck,lint,build --base=${NX_BASE:-HEAD~1} --head=${NX_HEAD:-HEAD}", + "g:snapshots": "nx run-many -t snapshots", "g:test:storybook:standalone": "nx run-many -t storybook:test:standalone --skip-nx-cache --parallel", "g:test": "nx run-many -t test", "g:test:coverage": "nx run-many -t test -- --collectCoverage=true", @@ -167,7 +179,6 @@ "g:test:coverage:extension": "nx test @uniswap/extension -- --collectCoverage=true", "g:test:coverage:mobile": "nx test @uniswap/mobile -- --collectCoverage=true", "g:test:coverage:wallet": "nx test wallet -- --collectCoverage=true", - "g:snapshots": "nx run-many -t snapshots", "g:typecheck": "nx run-many -t typecheck", "g:typecheck:changed": "nx affected -t typecheck --base=${NX_BASE:-main} --head=${NX_HEAD:-HEAD}", "i18n:extract": "i18next", @@ -175,22 +186,12 @@ "i18n:upload": "dotenv -e .env.defaults -c -- bun run i18n:_upload", "i18n:_download": "crowdin download", "i18n:download": "dotenv -e .env.defaults -c -- bun run i18n:_download", - "lfg": "bun run g:prepare && bun run mobile env:local:download && bun run extension env:local:download && bun run g:build && bun run mobile pod && bun run mobile ios", - "mobile": "bun run --cwd apps/mobile", - "local:check": "./scripts/local-version-check.sh", - "preinstall": "./scripts/check-bun-version.sh", - "postinstall": "lefthook install && bun g:prepare", - "sessions": "bun run --cwd packages/sessions", - "ui": "bun run --cwd packages/ui", "upgrade:tamagui": "bun update '*tamagui*' '@tamagui/*'", "upgrade:tamagui:canary": "bun update '*tamagui*'@canary '@tamagui/*'@canary", - "wallet": "bun run --cwd packages/wallet", - "web": "bun run --cwd apps/web", - "uniswap": "bun run --cwd packages/uniswap", - "utilities": "bun run --cwd packages/utilities", - "knip": "knip", "wallet:release:setup-cherry-pick-branches": "bunx tsx ./scripts/wallet-releases/generate-cherry-pick-branches-for-release.ts", - "wallet:release:generate-cherry-pick-commit-command": "bunx tsx ./scripts/wallet-releases/generate-cherry-pick-commit-command.ts" + "wallet:release:generate-cherry-pick-commit-command": "bunx tsx ./scripts/wallet-releases/generate-cherry-pick-commit-command.ts", + "gating": "bun run --cwd packages/gating", + "notifications": "bun run --cwd packages/notifications" }, "workspaces": ["apps/*", "packages/*", "config/*", "tools/uniswap-nx"], "patchedDependencies": { diff --git a/packages/api/package.json b/packages/api/package.json index b20f99888c2..974abf0ef5b 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -25,10 +25,9 @@ "@connectrpc/connect": "1.4.0", "@connectrpc/connect-web": "1.4.0", "@tanstack/react-query": "5.77.2", - "@uniswap/client-data-api": "0.0.14", + "@uniswap/client-data-api": "0.0.18", "@uniswap/client-embeddedwallet": "0.0.16", "@uniswap/client-explore": "0.0.17", - "@uniswap/client-pools": "0.0.17", "@uniswap/client-trading": "0.1.0", "@universe/config": "workspace:^", "@universe/sessions": "workspace:^", diff --git a/packages/api/src/clients/graphql/queries.graphql b/packages/api/src/clients/graphql/queries.graphql index 53aca66dce4..a6a92de8984 100644 --- a/packages/api/src/clients/graphql/queries.graphql +++ b/packages/api/src/clients/graphql/queries.graphql @@ -836,6 +836,12 @@ fragment TokenBasicInfoParts on Token { name standard symbol + isBridged + bridgedWithdrawalInfo { + chain + provider + url + } } fragment TokenBasicProjectParts on Token { diff --git a/packages/api/src/clients/graphql/schema.graphql b/packages/api/src/clients/graphql/schema.graphql index 287be283601..37e138268fb 100644 --- a/packages/api/src/clients/graphql/schema.graphql +++ b/packages/api/src/clients/graphql/schema.graphql @@ -1,19 +1,6 @@ """This directive allows results to be deferred during execution""" directive @defer on FIELD -"""Tells the service which mutation triggers this subscription.""" -directive @aws_subscribe( - """ - List of mutations which will trigger this subscription when they are called. - """ - mutations: [String] -) on FIELD_DEFINITION - -""" -Tells the service this field/object has access authorized by an OIDC token. -""" -directive @aws_oidc on OBJECT | FIELD_DEFINITION - """Directs the schema to enforce authorization on a field""" directive @aws_auth( """List of cognito user pool groups which have access on this field""" @@ -21,15 +8,26 @@ directive @aws_auth( ) on FIELD_DEFINITION """ -Tells the service this field/object has access authorized by sigv4 signing. +Tells the service which subscriptions will be published to when this mutation is +called. This directive is deprecated use @aws_susbscribe directive instead. """ -directive @aws_iam on OBJECT | FIELD_DEFINITION +directive @aws_publish( + """ + List of subscriptions which will be published to when this mutation is called. + """ + subscriptions: [String] +) on FIELD_DEFINITION """ Tells the service this field/object has access authorized by an API key. """ directive @aws_api_key on OBJECT | FIELD_DEFINITION +""" +Tells the service this field/object has access authorized by sigv4 signing. +""" +directive @aws_iam on OBJECT | FIELD_DEFINITION + """ Tells the service this field/object has access authorized by a Cognito User Pools token. """ @@ -38,15 +36,12 @@ directive @aws_cognito_user_pools( cognito_groups: [String] ) on OBJECT | FIELD_DEFINITION -""" -Tells the service which subscriptions will be published to when this mutation is -called. This directive is deprecated use @aws_susbscribe directive instead. -""" -directive @aws_publish( +"""Tells the service which mutation triggers this subscription.""" +directive @aws_subscribe( """ - List of subscriptions which will be published to when this mutation is called. + List of mutations which will trigger this subscription when they are called. """ - subscriptions: [String] + mutations: [String] ) on FIELD_DEFINITION """ @@ -54,6 +49,11 @@ Tells the service this field/object has access authorized by a Lambda Authorizer """ directive @aws_lambda on OBJECT | FIELD_DEFINITION +""" +Tells the service this field/object has access authorized by an OIDC token. +""" +directive @aws_oidc on OBJECT | FIELD_DEFINITION + """ Types, unions, and inputs (alphabetized): These are colocated to highlight the relationship between some types and their inputs. @@ -182,6 +182,12 @@ type BlockaidFees { sell: Float } +type BridgedWithdrawalInfo { + chain: String! + provider: String! + url: String! +} + enum Chain { ARBITRUM AVALANCHE @@ -1027,6 +1033,7 @@ enum PriceSource { SUBGRAPH_V2 SUBGRAPH_V3 SUBGRAPH_V4 + EXTERNAL } enum ProtectionAttackType { @@ -1078,8 +1085,8 @@ type Query { dailyProtocolTvl(chain: Chain!, version: ProtocolVersion!): [TimestampedAmount!] """ returns top v3 pools sorted by total value locked in desc order""" - topV3Pools(chain: Chain!, first: Int!, tvlCursor: Float, tokenFilter: String): [V3Pool!] - topV4Pools(chain: Chain!, first: Int!, tvlCursor: Float, tokenFilter: String): [V4Pool!] + topV3Pools(chain: Chain!, first: Int!, tvlCursor: Float, tokenFilter: String, debugMode: Boolean): [V3Pool!] + topV4Pools(chain: Chain!, first: Int!, tvlCursor: Float, tokenFilter: String, debugMode: Boolean): [V4Pool!] v3Pool(chain: Chain!, address: String!): V3Pool v4Pool(chain: Chain!, poolId: String!): V4Pool v3PoolsForTokenPair(chain: Chain!, token0: String!, token1: String!): [V3Pool!] @@ -1088,7 +1095,7 @@ type Query { v4Transactions(chain: Chain!, first: Int!, timestampCursor: Int): [PoolTransaction!] """ returns top v2 pairs sorted by total value locked in desc order""" - topV2Pairs(chain: Chain!, first: Int!, tvlCursor: Float, tokenFilter: String): [V2Pair!] + topV2Pairs(chain: Chain!, first: Int!, tvlCursor: Float, tokenFilter: String, debugMode: Boolean): [V2Pair!] v2Pair(chain: Chain!, address: String!): V2Pair v2Transactions(chain: Chain!, first: Int!, timestampCursor: Int): [PoolTransaction] convert(fromAmount: CurrencyAmountInput!, toCurrency: Currency!): Amount @@ -1226,6 +1233,8 @@ type Token implements IContract { v3Transactions(first: Int!, timestampCursor: Int): [PoolTransaction] v2Transactions(first: Int!, timestampCursor: Int): [PoolTransaction] source: TokenSource + isBridged: Boolean + bridgedWithdrawalInfo: BridgedWithdrawalInfo } type TokenAmount { diff --git a/packages/api/src/clients/notifications/createNotificationsApiClient.ts b/packages/api/src/clients/notifications/createNotificationsApiClient.ts new file mode 100644 index 00000000000..59546503bac --- /dev/null +++ b/packages/api/src/clients/notifications/createNotificationsApiClient.ts @@ -0,0 +1,49 @@ +import type { + GetNotificationsRequest, + InAppNotification, + NotificationsApiClient, + NotificationsClientContext, +} from '@universe/api/src/clients/notifications/types' + +/** + * Factory function to create a NotificationsApiClient + * + * Example usage: + * ```typescript + * const notificationsClient = createNotificationsApiClient({ + * fetchClient: myFetchClient, + * getApiPathPrefix: () => '/notifications/v1' + * }) + * + * const notifications = await notificationsClient.getNotifications() + * ``` + * + * @param ctx - Context containing injected dependencies + * @returns NotificationsApiClient instance + */ +export function createNotificationsApiClient(ctx: NotificationsClientContext): NotificationsApiClient { + const { fetchClient, getApiPathPrefix = (): string => '' } = ctx + + const getNotifications = async (params?: GetNotificationsRequest): Promise => { + const pathPrefix = getApiPathPrefix() + const path = `${pathPrefix}/uniswap.notificationservice.v1.NotificationService/GetNotifications` + + try { + const response = await fetchClient.post<{ notifications: InAppNotification[] }>(path, { + body: JSON.stringify(params ?? {}), + }) + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + return response?.notifications ?? [] + } catch (error) { + // Re-throw with context about which API call failed + throw new Error(`Failed to fetch notifications: ${error instanceof Error ? error.message : String(error)}`, { + cause: error, + }) + } + } + + return { + getNotifications, + } +} diff --git a/packages/api/src/clients/notifications/types.ts b/packages/api/src/clients/notifications/types.ts new file mode 100644 index 00000000000..d0b31810112 --- /dev/null +++ b/packages/api/src/clients/notifications/types.ts @@ -0,0 +1,38 @@ +import { FetchClient } from '@universe/api/src/clients/base/types' + +export interface NotificationsClientContext { + fetchClient: FetchClient + getApiPathPrefix?: () => string +} + +/** + * In-app notification returned by the notifications API + * TODO: This will be replaced with OpenAPI-generated types once the spec is integrated + */ +export interface InAppNotification { + notification_id: string + notification_name: string + meta_data: Record + content: Record + criteria: Record +} + +/** + * Request parameters for fetching notifications + */ +export type GetNotificationsRequest = Record + +/** + * Response from the GetNotifications API endpoint + */ +export interface GetNotificationsResponse { + notifications: InAppNotification[] +} + +export interface NotificationsApiClient { + /** + * Fetch notifications for the current user + * Uses session-based authentication (x-session-id header) via FetchClient + */ + getNotifications: (params?: GetNotificationsRequest) => Promise +} diff --git a/packages/api/src/clients/trading/tradeTypes.ts b/packages/api/src/clients/trading/tradeTypes.ts index 9b0a0cc2a17..7d415342ea1 100644 --- a/packages/api/src/clients/trading/tradeTypes.ts +++ b/packages/api/src/clients/trading/tradeTypes.ts @@ -42,7 +42,7 @@ interface StepProof { orderId?: string } -export interface TradeStep { +export interface PlanStep { stepId: string method: Method payloadType: PayloadType @@ -62,7 +62,7 @@ export interface TradeStep { export interface TradeResponse { tradeId: string - steps: TradeStep[] + steps: PlanStep[] expectedOutput: number timeEstimateMs: number //ms gasFee: string diff --git a/packages/api/src/connectRpc/utils.ts b/packages/api/src/connectRpc/utils.ts index 293daed4462..b26a9acd449 100644 --- a/packages/api/src/connectRpc/utils.ts +++ b/packages/api/src/connectRpc/utils.ts @@ -1,7 +1,7 @@ import { type PlainMessage } from '@bufbuild/protobuf' import { Platform, type PlatformAddress, type WalletAccount } from '@uniswap/client-data-api/dist/data/v1/api_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { type ProtectionInfo as ProtectionInfoProtobuf } from '@uniswap/client-explore/dist/uniswap/explore/v1/service_pb' -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' import { ProtectionAttackType, type ProtectionInfo, diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index 10b3fdd723e..f9a95b99786 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -73,11 +73,11 @@ export { type ExistingTradeRequest, Method, type NewTradeRequest, + type PlanStep, PlanStepStatus, type PriorityQuoteResponse, type SwappableTokensParams, type TradeResponse, - type TradeStep, type UnwrapQuoteResponse, type UpdateExistingTradeRequest, type WrapQuoteResponse, @@ -124,6 +124,16 @@ export { TokenReportEventType, } from '@universe/api/src/clients/data/createDataServiceApiClient' +// Notifications API +export { createNotificationsApiClient } from '@universe/api/src/clients/notifications/createNotificationsApiClient' +export type { + GetNotificationsRequest, + GetNotificationsResponse, + InAppNotification, + NotificationsApiClient, + NotificationsClientContext, +} from '@universe/api/src/clients/notifications/types' + // ConnectRPC API export { ALL_NETWORKS_ARG, diff --git a/packages/biome-config/base.jsonc b/packages/biome-config/base.jsonc index 71b95904adb..2e99ba3aada 100644 --- a/packages/biome-config/base.jsonc +++ b/packages/biome-config/base.jsonc @@ -177,7 +177,17 @@ }, "noUnusedLabels": "error", "noUnusedVariables": "error", - "useExhaustiveDependencies": "error", + "useExhaustiveDependencies": { + "level": "error", + "options": { + "hooks": [ + // React Native Reanimated hooks with stable results + { "name": "useSharedValue", "stableResult": true }, + { "name": "useDerivedValue", "stableResult": true }, + { "name": "useAnimatedRef", "stableResult": true } + ] + } + }, "useHookAtTopLevel": "error", "useIsNan": "warn", "useJsxKeyInIterable": "error", diff --git a/packages/gating/.eslintrc.js b/packages/gating/.eslintrc.js new file mode 100644 index 00000000000..05c00dcf591 --- /dev/null +++ b/packages/gating/.eslintrc.js @@ -0,0 +1,46 @@ +module.exports = { + root: true, + extends: ['@uniswap/eslint-config/native', '@uniswap/eslint-config/webPlatform'], + ignorePatterns: [ + 'node_modules', + '.turbo', + '.eslintrc.js', + 'vitest.config.ts', + 'codegen.ts', + '.nx', + 'scripts', + 'dist', + 'src/**/__generated__', + ], + parserOptions: { + project: 'tsconfig.lint.json', + tsconfigRootDir: __dirname, + ecmaFeatures: { + jsx: true, + }, + ecmaVersion: 2018, + sourceType: 'module', + }, + overrides: [ + { + files: ['src/index.ts'], + rules: { + 'check-file/no-index': 'off', + }, + }, + { + files: ['*.ts', '*.tsx'], + rules: { + 'no-relative-import-paths/no-relative-import-paths': [ + 'error', + { + allowSameFolder: false, + prefix: '@universe/gating', + }, + ], + '@typescript-eslint/prefer-enum-initializers': 'off', + }, + }, + ], + rules: {}, +} diff --git a/packages/gating/README.md b/packages/gating/README.md new file mode 100644 index 00000000000..8b26f751149 --- /dev/null +++ b/packages/gating/README.md @@ -0,0 +1,3 @@ +# @universe/gating + +// TODO diff --git a/packages/gating/package.json b/packages/gating/package.json new file mode 100644 index 00000000000..e8457067531 --- /dev/null +++ b/packages/gating/package.json @@ -0,0 +1,31 @@ +{ + "name": "@universe/gating", + "version": "0.0.0", + "dependencies": { + "@statsig/client-core": "3.12.2", + "@statsig/js-client": "3.12.2", + "@statsig/js-local-overrides": "3.12.2", + "@statsig/react-bindings": "3.12.2", + "@statsig/react-native-bindings": "3.12.2", + "@universe/api": "workspace:*", + "utilities": "workspace:*" + }, + "devDependencies": { + "@types/node": "22.13.1", + "@uniswap/eslint-config": "workspace:^", + "depcheck": "1.4.7", + "eslint": "8.44.0", + "typescript": "5.3.3" + }, + "scripts": { + "typecheck": "nx typecheck gating", + "lint": "nx lint gating", + "lint:fix": "nx lint:fix gating" + }, + "nx": { + "includedScripts": [] + }, + "main": "src/index.ts", + "private": true, + "sideEffects": false +} diff --git a/packages/gating/project.json b/packages/gating/project.json new file mode 100644 index 00000000000..e5b65be81e9 --- /dev/null +++ b/packages/gating/project.json @@ -0,0 +1,16 @@ +{ + "name": "@universe/gating", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "packages/gating/src", + "projectType": "library", + "tags": [], + "targets": { + "typecheck": {}, + "lint:biome": {}, + "lint:biome:fix": {}, + "lint:eslint": {}, + "lint:eslint:fix": {}, + "lint": {}, + "lint:fix": {} + } +} diff --git a/packages/uniswap/src/features/gating/LocalOverrideAdapterWrapper.ts b/packages/gating/src/LocalOverrideAdapterWrapper.ts similarity index 95% rename from packages/uniswap/src/features/gating/LocalOverrideAdapterWrapper.ts rename to packages/gating/src/LocalOverrideAdapterWrapper.ts index 4c4794d7cb0..1c68bee6685 100644 --- a/packages/uniswap/src/features/gating/LocalOverrideAdapterWrapper.ts +++ b/packages/gating/src/LocalOverrideAdapterWrapper.ts @@ -1,5 +1,5 @@ import { LocalOverrideAdapter } from '@statsig/js-local-overrides' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' +import { getStatsigClient } from '@universe/gating/src/sdk/statsig' // Workaround for @statsig 3.x.x refreshing client after applying overrides to get the result without reloading // Should be removed after statsig add real time override apply functionality diff --git a/packages/uniswap/src/features/gating/configs.ts b/packages/gating/src/configs.ts similarity index 81% rename from packages/uniswap/src/features/gating/configs.ts rename to packages/gating/src/configs.ts index 6c9ac865d3a..9752b9af739 100644 --- a/packages/uniswap/src/features/gating/configs.ts +++ b/packages/gating/src/configs.ts @@ -1,5 +1,64 @@ import { GasStrategy } from '@universe/api' -import type { Locale } from 'uniswap/src/features/language/constants' + +// TODO: move to own package +export enum Locale { + Afrikaans = 'af-ZA', + ArabicSaudi = 'ar-SA', + Catalan = 'ca-ES', + ChineseSimplified = 'zh-Hans', + ChineseTraditional = 'zh-Hant', + CzechCzechia = 'cs-CZ', + DanishDenmark = 'da-DK', + DutchNetherlands = 'nl-NL', + EnglishUnitedStates = 'en-US', + FinnishFinland = 'fi-FI', + FrenchFrance = 'fr-FR', + GreekGreece = 'el-GR', + HebrewIsrael = 'he-IL', + HindiIndia = 'hi-IN', + HungarianHungarian = 'hu-HU', + IndonesianIndonesia = 'id-ID', + ItalianItaly = 'it-IT', + JapaneseJapan = 'ja-JP', + KoreanKorea = 'ko-KR', + MalayMalaysia = 'ms-MY', + NorwegianNorway = 'no-NO', + PolishPoland = 'pl-PL', + PortugueseBrazil = 'pt-BR', + PortuguesePortugal = 'pt-PT', + RomanianRomania = 'ro-RO', + RussianRussia = 'ru-RU', + Serbian = 'sr-SP', + SpanishLatam = 'es-419', + SpanishBelize = 'es-BZ', + SpanishCuba = 'es-CU', + SpanishDominicanRepublic = 'es-DO', + SpanishGuatemala = 'es-GT', + SpanishHonduras = 'es-HN', + SpanishMexico = 'es-MX', + SpanishNicaragua = 'es-NI', + SpanishPanama = 'es-PA', + SpanishPeru = 'es-PE', + SpanishPuertoRico = 'es-PR', + SpanishElSalvador = 'es-SV', + SpanishUnitedStates = 'es-US', + SpanishArgentina = 'es-AR', + SpanishBolivia = 'es-BO', + SpanishChile = 'es-CL', + SpanishColombia = 'es-CO', + SpanishCostaRica = 'es-CR', + SpanishEcuador = 'es-EC', + SpanishSpain = 'es-ES', + SpanishParaguay = 'es-PY', + SpanishUruguay = 'es-UY', + SpanishVenezuela = 'es-VE', + SwahiliTanzania = 'sw-TZ', + SwedishSweden = 'sv-SE', + TurkishTurkey = 'tr-TR', + UkrainianUkraine = 'uk-UA', + UrduPakistan = 'ur-PK', + VietnameseVietnam = 'vi-VN', +} /** * Dynamic Configs diff --git a/packages/uniswap/src/features/gating/constants.ts b/packages/gating/src/constants.ts similarity index 100% rename from packages/uniswap/src/features/gating/constants.ts rename to packages/gating/src/constants.ts diff --git a/packages/uniswap/src/features/gating/experiments.ts b/packages/gating/src/experiments.ts similarity index 83% rename from packages/uniswap/src/features/gating/experiments.ts rename to packages/gating/src/experiments.ts index abee273dafe..1798d898243 100644 --- a/packages/uniswap/src/features/gating/experiments.ts +++ b/packages/gating/src/experiments.ts @@ -11,10 +11,12 @@ export enum Experiments { UnichainFlashblocksModal = 'unichain_flashblocks_modal', WebFORNudges = 'web_for_nudge', ForFilters = 'for_filters', + PortfolioDisconnectedDemoView = 'portfolio_disconnected_demo_view', } export enum Layers { SwapPage = 'swap-page', + PortfolioPage = 'portfolio-page', } // experiment groups @@ -59,6 +61,10 @@ export enum WebFORNudgesProperties { NudgeEnabled = 'nudgeEnabled', } +export enum PortfolioDisconnectedDemoViewProperties { + DemoViewEnabled = 'demoViewEnabled', +} + export type ExperimentProperties = { [Experiments.PriceUxUpdate]: PriceUxUpdateProperties [Experiments.PrivateRpc]: PrivateRpcProperties @@ -67,6 +73,7 @@ export type ExperimentProperties = { [Experiments.UnichainFlashblocksModal]: UnichainFlashblocksProperties [Experiments.ForFilters]: ForFiltersProperties [Experiments.WebFORNudges]: WebFORNudgesProperties + [Experiments.PortfolioDisconnectedDemoView]: PortfolioDisconnectedDemoViewProperties } // will be a spread of all experiment properties in that layer @@ -75,4 +82,7 @@ export const LayerProperties: Record = { ...PriceUxUpdateProperties, ...UnichainFlashblocksProperties, }), + [Layers.PortfolioPage]: Object.values({ + ...PortfolioDisconnectedDemoViewProperties, + }), } diff --git a/packages/uniswap/src/features/gating/flags.ts b/packages/gating/src/flags.ts similarity index 98% rename from packages/uniswap/src/features/gating/flags.ts rename to packages/gating/src/flags.ts index ae194d53c14..6e0f3b10d5b 100644 --- a/packages/uniswap/src/features/gating/flags.ts +++ b/packages/gating/src/flags.ts @@ -10,6 +10,7 @@ export enum FeatureFlags { // Shared ArbitrumDutchV3, BlockaidFotLogging, + BridgedAssetsBannerV2, ChainedActions, DisableSwap7702, EmbeddedWallet, @@ -87,6 +88,7 @@ export enum FeatureFlags { export const SHARED_FEATURE_FLAG_NAMES = new Map([ [FeatureFlags.ArbitrumDutchV3, 'uniswapx_dutchv3_orders_arbitrum'], [FeatureFlags.BlockaidFotLogging, 'blockaid_fot_logging'], + [FeatureFlags.BridgedAssetsBannerV2, 'bridged_assets_banner_v2'], [FeatureFlags.ChainedActions, 'enable_chained_actions'], [FeatureFlags.DisableSwap7702, 'disable-swap-7702'], [FeatureFlags.EmbeddedWallet, 'embedded_wallet'], diff --git a/packages/uniswap/src/features/gating/getStatsigEnvName.ts b/packages/gating/src/getStatsigEnvName.ts similarity index 100% rename from packages/uniswap/src/features/gating/getStatsigEnvName.ts rename to packages/gating/src/getStatsigEnvName.ts diff --git a/packages/uniswap/src/features/gating/hooks.ts b/packages/gating/src/hooks.ts similarity index 95% rename from packages/uniswap/src/features/gating/hooks.ts rename to packages/gating/src/hooks.ts index d369a0a6e3c..460af0075ec 100644 --- a/packages/uniswap/src/features/gating/hooks.ts +++ b/packages/gating/src/hooks.ts @@ -1,8 +1,7 @@ import { StatsigClientEventCallback, StatsigLoadingStatus } from '@statsig/client-core' -import { useEffect, useMemo, useState } from 'react' -import { DynamicConfigKeys } from 'uniswap/src/features/gating/configs' -import { ExperimentProperties, Experiments } from 'uniswap/src/features/gating/experiments' -import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' +import { DynamicConfigKeys } from '@universe/gating/src/configs' +import { ExperimentProperties, Experiments } from '@universe/gating/src/experiments' +import { FeatureFlags, getFeatureFlagName } from '@universe/gating/src/flags' import { getStatsigClient, TypedReturn, @@ -12,7 +11,8 @@ import { useGateValue, useLayer, useStatsigClient, -} from 'uniswap/src/features/gating/sdk/statsig' +} from '@universe/gating/src/sdk/statsig' +import { useEffect, useMemo, useState } from 'react' import { logger } from 'utilities/src/logger/logger' export function useFeatureFlag(flag: FeatureFlags): boolean { diff --git a/packages/gating/src/index.ts b/packages/gating/src/index.ts new file mode 100644 index 00000000000..efe852ff1f6 --- /dev/null +++ b/packages/gating/src/index.ts @@ -0,0 +1,86 @@ +export type { + DatadogIgnoredErrorsValType, + DatadogSessionSampleRateValType, + DeepLinkUrlAllowlist, + DynamicConfigKeys, + ForceUpgradeStatus, + ForceUpgradeTranslations, + GasStrategies, + GasStrategyType, + GasStrategyWithConditions, + UwULinkAllowlist, + UwULinkAllowlistItem, +} from '@universe/gating/src/configs' +export { + AllowedV4WethHookAddressesConfigKey, + BlockedAsyncSubmissionChainIdsConfigKey, + ChainsConfigKey, + DatadogIgnoredErrorsConfigKey, + DatadogSessionSampleRateKey, + DeepLinkUrlAllowlistConfigKey, + DynamicConfigs, + EmbeddedWalletConfigKey, + ExtensionBiometricUnlockConfigKey, + ExternallyConnectableExtensionConfigKey, + ForceUpgradeConfigKey, + HomeScreenExploreTokensConfigKey, + LPConfigKey, + NetworkRequestsConfigKey, + OnDeviceRecoveryConfigKey, + OutageBannerChainIdConfigKey, + SwapConfigKey, + SyncTransactionSubmissionChainIdsConfigKey, + UwuLinkConfigKey, +} from '@universe/gating/src/configs' +export { StatsigCustomAppValue } from '@universe/gating/src/constants' +export type { ExperimentProperties } from '@universe/gating/src/experiments' +export { + Experiments, + ForFiltersProperties, + LayerProperties, + Layers, + NativeTokenPercentageBufferProperties, + PortfolioDisconnectedDemoViewProperties, + PriceUxUpdateProperties, + PrivateRpcProperties, + UnichainFlashblocksProperties, + WebFORNudgesProperties, +} from '@universe/gating/src/experiments' +export { + FeatureFlags, + getFeatureFlagName, + WALLET_FEATURE_FLAG_NAMES, + WEB_FEATURE_FLAG_NAMES, +} from '@universe/gating/src/flags' +export { getStatsigEnvName } from '@universe/gating/src/getStatsigEnvName' +export { + getDynamicConfigValue, + getExperimentValue, + getExperimentValueFromLayer, + getFeatureFlag, + useDynamicConfigValue, + useExperimentValue, + useExperimentValueFromLayer, + useFeatureFlag, + useFeatureFlagWithExposureLoggingDisabled, + useFeatureFlagWithLoading, + useStatsigClientStatus, +} from '@universe/gating/src/hooks' +export { LocalOverrideAdapterWrapper } from '@universe/gating/src/LocalOverrideAdapterWrapper' +export type { + StatsigOptions, + StatsigUser, + StorageProvider, +} from '@universe/gating/src/sdk/statsig' +export { + getOverrideAdapter, + getStatsigClient, + StatsigClient, + StatsigContext, + StatsigProvider, + Storage, + useClientAsyncInit, + useExperiment, + useLayer, +} from '@universe/gating/src/sdk/statsig' +export { getOverrides } from '@universe/gating/src/utils' diff --git a/packages/uniswap/src/features/gating/sdk/statsig.native.ts b/packages/gating/src/sdk/statsig.native.ts similarity index 83% rename from packages/uniswap/src/features/gating/sdk/statsig.native.ts rename to packages/gating/src/sdk/statsig.native.ts index f946807b8dd..8e0c14b1022 100644 --- a/packages/uniswap/src/features/gating/sdk/statsig.native.ts +++ b/packages/gating/src/sdk/statsig.native.ts @@ -1,7 +1,9 @@ import { StatsigClient } from '@statsig/react-bindings' import { StatsigClientRN } from '@statsig/react-native-bindings' -import { config } from 'uniswap/src/config' -import { LocalOverrideAdapterWrapper } from 'uniswap/src/features/gating/LocalOverrideAdapterWrapper' +import { getConfig } from '@universe/config' +import { LocalOverrideAdapterWrapper } from '@universe/gating/src/LocalOverrideAdapterWrapper' + +const config = getConfig() export { StatsigClient, diff --git a/packages/uniswap/src/features/gating/sdk/statsig.ts b/packages/gating/src/sdk/statsig.ts similarity index 92% rename from packages/uniswap/src/features/gating/sdk/statsig.ts rename to packages/gating/src/sdk/statsig.ts index 231452cfe31..df1964153b0 100644 --- a/packages/uniswap/src/features/gating/sdk/statsig.ts +++ b/packages/gating/src/sdk/statsig.ts @@ -1,5 +1,5 @@ import { StatsigClient } from '@statsig/react-bindings' -import { LocalOverrideAdapterWrapper } from 'uniswap/src/features/gating/LocalOverrideAdapterWrapper' +import { LocalOverrideAdapterWrapper } from '@universe/gating/src/LocalOverrideAdapterWrapper' export { StatsigClient, diff --git a/packages/uniswap/src/features/gating/utils.ts b/packages/gating/src/utils.ts similarity index 92% rename from packages/uniswap/src/features/gating/utils.ts rename to packages/gating/src/utils.ts index d06e7398daa..491fc37ff2a 100644 --- a/packages/uniswap/src/features/gating/utils.ts +++ b/packages/gating/src/utils.ts @@ -1,5 +1,5 @@ import { PrecomputedEvaluationsInterface } from '@statsig/js-client' -import { getOverrideAdapter } from 'uniswap/src/features/gating/sdk/statsig' +import { getOverrideAdapter } from '@universe/gating/src/sdk/statsig' export function isStatsigReady(client: PrecomputedEvaluationsInterface): boolean { return client.loadingStatus === 'Ready' diff --git a/packages/gating/tsconfig.json b/packages/gating/tsconfig.json new file mode 100644 index 00000000000..1d8d402436b --- /dev/null +++ b/packages/gating/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../config/tsconfig/app.json", + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.json", "src/global.d.ts"], + "exclude": ["src/**/*.spec.ts", "src/**/*.spec.tsx", "src/**/*.test.ts", "src/**/*.test.tsx"], + "compilerOptions": { + "noEmit": false, + "emitDeclarationOnly": true, + "types": ["node"], + "paths": {} + }, + "references": [ + { + "path": "../utilities" + }, + { + "path": "../api" + } + ] +} diff --git a/packages/gating/tsconfig.lint.json b/packages/gating/tsconfig.lint.json new file mode 100644 index 00000000000..79659c26038 --- /dev/null +++ b/packages/gating/tsconfig.lint.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "preserveSymlinks": true + }, + "include": ["**/*.ts", "**/*.tsx", "**/*.json"], + "exclude": ["node_modules"] +} diff --git a/packages/notifications/.eslintrc.js b/packages/notifications/.eslintrc.js new file mode 100644 index 00000000000..a6dbbad9fee --- /dev/null +++ b/packages/notifications/.eslintrc.js @@ -0,0 +1,45 @@ +module.exports = { + root: true, + extends: ['@uniswap/eslint-config/native', '@uniswap/eslint-config/webPlatform'], + ignorePatterns: [ + 'node_modules', + '.turbo', + '.eslintrc.js', + 'vitest.config.ts', + 'codegen.ts', + '.nx', + 'scripts', + 'dist', + 'src/**/__generated__', + ], + parserOptions: { + project: 'tsconfig.lint.json', + tsconfigRootDir: __dirname, + ecmaFeatures: { + jsx: true, + }, + ecmaVersion: 2018, + sourceType: 'module', + }, + overrides: [ + { + files: ['src/index.ts'], + rules: { + 'check-file/no-index': 'off', + }, + }, + { + files: ['*.ts', '*.tsx'], + rules: { + 'no-relative-import-paths/no-relative-import-paths': [ + 'error', + { + allowSameFolder: false, + prefix: '@universe/notifications', + }, + ], + }, + }, + ], + rules: {}, +} diff --git a/packages/notifications/README.md b/packages/notifications/README.md new file mode 100644 index 00000000000..afbab0c0cfb --- /dev/null +++ b/packages/notifications/README.md @@ -0,0 +1,73 @@ +# @universe/notifications + +Client-side notification system for fetching, processing, storing, and displaying notifications from a backend service. + +## Architecture + +``` +NotificationSystem (orchestrator) +├── NotificationDataSource → Fetch/websocket notification data +├── NotificationTracker → Track shown/dismissed state +├── NotificationProcessor → Filter & prioritize notifications +├── NotificationChainCoordinator → Handle multi-step notification flows +└── NotificationRenderer → Platform-specific UI rendering +``` + +## Core Concepts + +### Notification Chains +Notifications can trigger follow-up notifications based on user actions: +```json +{ + "notificationName": "welcome_step_1", + "content": { + "buttons": [{ + "text": "Next", + "onClickType": "ON_CLICK_TYPE_DISMISS_AND_POPUP", + "onClickLink": "welcome_step_2" // ← triggers next notification + }] + } +} +``` + +## Usage + +### Initialize the System + +```typescript +import { createNotificationSystem } from '@universe/notifications' + +const notificationSystem = createNotificationSystem({ + dataSources: [getFetchNotificationDataSource({ apiClient })], + tracker: createLocalNotificationTracker({ storageDriver }), + processor: createNotificationProcessor(), + renderer: createNotificationRenderer(), + chainCoordinator: createNotificationChainCoordinator() +}) + +await notificationSystem.initialize() +``` + +### Handle User Actions + +```typescript +// When user clicks a button +notificationSystem.onButtonClick(notificationName, button) + +// When user dismisses +notificationSystem.onDismiss(notificationName) + +// When user clicks background +notificationSystem.onBackgroundClick(notificationName) +``` + +### React Integration + +```tsx +// Mount container at app root + + +// Container reads from Zustand store +const activeNotifications = useNotificationStore(state => state.activeNotifications) +const notificationSystem = useNotificationStore(state => state.notificationSystem) +``` diff --git a/packages/notifications/package.json b/packages/notifications/package.json new file mode 100644 index 00000000000..fdcf387b687 --- /dev/null +++ b/packages/notifications/package.json @@ -0,0 +1,18 @@ +{ + "name": "@universe/notifications", + "version": "0.0.0", + "devDependencies": { + "@types/node": "22.13.1", + "@uniswap/eslint-config": "workspace:^", + "depcheck": "1.4.7", + "eslint": "8.44.0", + "typescript": "5.3.3" + }, + "scripts": {}, + "nx": { + "includedScripts": [] + }, + "main": "src/index.ts", + "private": true, + "sideEffects": false +} diff --git a/packages/notifications/project.json b/packages/notifications/project.json new file mode 100644 index 00000000000..83f11f630fe --- /dev/null +++ b/packages/notifications/project.json @@ -0,0 +1,16 @@ +{ + "name": "@universe/notifications", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "packages/notifications/src", + "projectType": "library", + "tags": [], + "targets": { + "typecheck": {}, + "lint:biome": {}, + "lint:biome:fix": {}, + "lint:eslint": {}, + "lint:eslint:fix": {}, + "lint": {}, + "lint:fix": {} + } +} diff --git a/packages/notifications/src/index.ts b/packages/notifications/src/index.ts new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/notifications/tsconfig.json b/packages/notifications/tsconfig.json new file mode 100644 index 00000000000..6fbf4aa3e1b --- /dev/null +++ b/packages/notifications/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../config/tsconfig/app.json", + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.json", "src/global.d.ts"], + "exclude": ["src/**/*.spec.ts", "src/**/*.spec.tsx", "src/**/*.test.ts", "src/**/*.test.tsx"], + "compilerOptions": { + "noEmit": false, + "emitDeclarationOnly": true, + "types": ["node"], + "paths": {} + }, + "references": [] +} diff --git a/packages/notifications/tsconfig.lint.json b/packages/notifications/tsconfig.lint.json new file mode 100644 index 00000000000..79659c26038 --- /dev/null +++ b/packages/notifications/tsconfig.lint.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "preserveSymlinks": true + }, + "include": ["**/*.ts", "**/*.tsx", "**/*.json"], + "exclude": ["node_modules"] +} diff --git a/packages/ui/src/assets/graphics/bridged-assets-v2-web-banner.png b/packages/ui/src/assets/graphics/bridged-assets-v2-web-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..c7e87c3aa9006d2308279bfa82b69c8be89ef245 GIT binary patch literal 128449 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

2^rd?|>O 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 { return { diff --git a/packages/ui/src/components/switch/Switch.native.tsx b/packages/ui/src/components/switch/Switch.native.tsx index e5023ae2892..6103f25683a 100644 --- a/packages/ui/src/components/switch/Switch.native.tsx +++ b/packages/ui/src/components/switch/Switch.native.tsx @@ -40,7 +40,7 @@ export const Switch = memo(function Switch({ if (checked !== undefined && checked !== (progress.value === 1)) { progress.value = withTiming(checked ? 1 : 0, ANIMATION_CONFIG) } - }, [checked, progress]) + }, [checked]) const trackStyle = useAnimatedStyle(() => { const isOn = progress.value diff --git a/packages/ui/src/loading/Shine.native.tsx b/packages/ui/src/loading/Shine.native.tsx index 34c98d0ba77..c43c1db9cb1 100644 --- a/packages/ui/src/loading/Shine.native.tsx +++ b/packages/ui/src/loading/Shine.native.tsx @@ -30,7 +30,7 @@ export function Shine({ shimmerDurationSeconds = 2, children, disabled }: ShineP useEffect(() => { xPosition.value = withRepeat(withTiming(1, { duration: shimmerDuration }), Infinity, false) - }, [xPosition, shimmerDuration]) + }, [shimmerDuration]) const animatedStyle = useAnimatedStyle(() => ({ ...StyleSheet.absoluteFillObject, diff --git a/packages/ui/src/loading/Skeleton.native.tsx b/packages/ui/src/loading/Skeleton.native.tsx index 996ab35d086..37629c16a11 100644 --- a/packages/ui/src/loading/Skeleton.native.tsx +++ b/packages/ui/src/loading/Skeleton.native.tsx @@ -19,7 +19,6 @@ export function Skeleton({ children, contrast, disabled }: SkeletonProps): JSX.E const [layout, setLayout] = useState() const xPosition = useSharedValue(0) - // biome-ignore lint/correctness/useExhaustiveDependencies: only want to do this once on mount useLayoutEffect(() => { // TODO: [MOB-210] tweak animation to be smoother, right now sometimes looks kind of stuttery xPosition.value = withRepeat(withTiming(1, { duration: SHIMMER_DURATION }), Infinity, true) diff --git a/packages/ui/src/loading/SpinningLoader.native.tsx b/packages/ui/src/loading/SpinningLoader.native.tsx index bfaf4dc085d..44a3cfbf01d 100644 --- a/packages/ui/src/loading/SpinningLoader.native.tsx +++ b/packages/ui/src/loading/SpinningLoader.native.tsx @@ -33,7 +33,7 @@ export function SpinningLoader({ size = 20, disabled, color }: SpinningLoaderPro -1, ) return () => cancelAnimation(rotation) - }, [rotation]) + }, []) if (disabled) { return diff --git a/packages/uniswap/jest-package-mocks.js b/packages/uniswap/jest-package-mocks.js index 4141f641fdd..970956be0fd 100644 --- a/packages/uniswap/jest-package-mocks.js +++ b/packages/uniswap/jest-package-mocks.js @@ -20,10 +20,10 @@ jest.mock('utilities/src/device/uniqueId', () => { return jest.requireActual('uniswap/src/test/mocks/uniqueId') }) -jest.mock('uniswap/src/features/gating/sdk/statsig', () => { - const actualStatsig = jest.requireActual('uniswap/src/features/gating/sdk/statsig') +jest.mock('@universe/gating', () => { + const actual = jest.requireActual('@universe/gating') return { - ...actualStatsig, + ...actual, useClientAsyncInit: jest.fn(() => ({ client: null, isLoading: true, diff --git a/packages/uniswap/package.json b/packages/uniswap/package.json index 72947d379e8..7dcbba8c7e1 100644 --- a/packages/uniswap/package.json +++ b/packages/uniswap/package.json @@ -26,6 +26,7 @@ "@connectrpc/connect-query": "1.4.1", "@datadog/browser-logs": "5.20.0", "@datadog/browser-rum": "5.23.3", + "@ethersproject/abstract-provider": "5.8.0", "@ethersproject/abstract-signer": "5.7.0", "@ethersproject/address": "5.7.0", "@ethersproject/bignumber": "5.7.0", @@ -40,21 +41,15 @@ "@shopify/flash-list": "1.7.3", "@simplewebauthn/browser": "13.1.0", "@solana/web3.js": "1.92.0", - "@statsig/client-core": "3.12.2", - "@statsig/js-client": "3.12.2", - "@statsig/js-local-overrides": "3.12.2", - "@statsig/react-bindings": "3.12.2", - "@statsig/react-native-bindings": "3.12.2", "@tanstack/query-async-storage-persister": "5.51.21", "@tanstack/react-query": "5.77.2", "@tanstack/react-query-persist-client": "5.77.2", "@typechain/ethers-v5": "7.2.0", "@types/poisson-disk-sampling": "2.2.4", "@uniswap/analytics-events": "2.43.0", - "@uniswap/client-data-api": "0.0.14", + "@uniswap/client-data-api": "0.0.18", "@uniswap/client-embeddedwallet": "0.0.16", "@uniswap/client-explore": "0.0.17", - "@uniswap/client-pools": "0.0.17", "@uniswap/client-search": "0.0.10", "@uniswap/client-trading": "0.1.0", "@uniswap/permit2-sdk": "1.3.0", @@ -67,6 +62,7 @@ "@uniswap/v4-sdk": "1.21.2", "@universe/api": "workspace:^", "@universe/config": "workspace:^", + "@universe/gating": "workspace:^", "apollo-link-rest": "0.9.0", "date-fns": "2.30.0", "dayjs": "1.11.7", diff --git a/packages/uniswap/src/components/BridgedAsset/BridgedAssetModal.tsx b/packages/uniswap/src/components/BridgedAsset/BridgedAssetModal.tsx index ab6b1161337..5aab811db58 100644 --- a/packages/uniswap/src/components/BridgedAsset/BridgedAssetModal.tsx +++ b/packages/uniswap/src/components/BridgedAsset/BridgedAssetModal.tsx @@ -17,7 +17,6 @@ import { EnvelopeHeart } from 'ui/src/components/icons/EnvelopeHeart' import { OrderRouting } from 'ui/src/components/icons/OrderRouting' import { Verified } from 'ui/src/components/icons/Verified' import { iconSizes } from 'ui/src/theme' -import { getBridgedAsset } from 'uniswap/src/components/BridgedAsset/utils' import { CurrencyLogo } from 'uniswap/src/components/CurrencyLogo/CurrencyLogo' import { Modal } from 'uniswap/src/components/modals/Modal' import { uniswapUrls } from 'uniswap/src/constants/urls' @@ -47,8 +46,7 @@ export const BridgedAssetModalAtom = atom(un function BridgedAssetModalContent({ currencyInfo }: { currencyInfo: CurrencyInfo }): JSX.Element | null { const { t } = useTranslation() const chainName = getChainLabel(currencyInfo.currency.chainId) - const bridgedAsset = getBridgedAsset(currencyInfo) - if (!currencyInfo.currency.symbol || !bridgedAsset) { + if (!currencyInfo.currency.symbol || !currencyInfo.isBridged) { return null } @@ -104,11 +102,13 @@ function BridgedAssetModalContent({ currencyInfo }: { currencyInfo: CurrencyInfo - {t('bridgedAsset.modal.feature.withdrawToNativeChain', { nativeChainName: bridgedAsset.nativeChain })} + {t('bridgedAsset.modal.feature.withdrawToNativeChain', { + nativeChainName: currencyInfo.bridgedWithdrawalInfo?.chain ?? '', + })} {t('bridgedAsset.modal.feature.withdrawToNativeChain.description', { - nativeChainName: bridgedAsset.nativeChain, + nativeChainName: currencyInfo.bridgedWithdrawalInfo?.chain ?? '', })} diff --git a/packages/uniswap/src/components/BridgedAsset/WormholeModal.tsx b/packages/uniswap/src/components/BridgedAsset/WormholeModal.tsx index 38973fe1773..394941a0b6f 100644 --- a/packages/uniswap/src/components/BridgedAsset/WormholeModal.tsx +++ b/packages/uniswap/src/components/BridgedAsset/WormholeModal.tsx @@ -17,7 +17,6 @@ import { ExternalLink } from 'ui/src/components/icons/ExternalLink' import { Shuffle } from 'ui/src/components/icons/Shuffle' import { iconSizes } from 'ui/src/theme' import { BaseModalProps } from 'uniswap/src/components/BridgedAsset/BridgedAssetModal' -import { getBridgedAsset } from 'uniswap/src/components/BridgedAsset/utils' import { CurrencyLogo } from 'uniswap/src/components/CurrencyLogo/CurrencyLogo' import { Modal } from 'uniswap/src/components/modals/Modal' import { uniswapUrls } from 'uniswap/src/constants/urls' @@ -52,7 +51,7 @@ export function WormholeModal({ const textColor = useMemo(() => { return getContrastPassingTextColor(validTokenColor ?? colors.accent1.val) }, [colors.accent1.val, validTokenColor]) - const bridgedAsset = getBridgedAsset(currencyInfo) + const bridgedWithdrawalInfo = currencyInfo?.bridgedWithdrawalInfo const onPressLearnMore = async (): Promise => { await openUri({ uri: uniswapUrls.helpArticleUrls.bridgedAssets }) @@ -60,14 +59,17 @@ export function WormholeModal({ } const onPressContinue = useEvent(async () => { + if (!bridgedWithdrawalInfo?.url) { + return + } await openUri({ - uri: `${uniswapUrls.wormholeUrl}?sourceChain=unichain&targetChain=${bridgedAsset?.nativeChain}&asset=${bridgedAsset?.unichainAddress}&targetAsset=${bridgedAsset?.nativeAddress}`, + uri: bridgedWithdrawalInfo.url, openExternalBrowser: true, }) onClose() }) - if (!currencyInfo || !currencyInfo.currency.symbol || !bridgedAsset) { + if (!currencyInfo || !currencyInfo.currency.symbol || !bridgedWithdrawalInfo) { return null } const chainName = getChainLabel(currencyInfo.currency.chainId) @@ -127,14 +129,15 @@ export function WormholeModal({ {t('bridgedAsset.wormhole.title', { currencySymbol: currencyInfo.currency.symbol, - nativeChainName: bridgedAsset.nativeChain, + nativeChainName: bridgedWithdrawalInfo.chain, })} {t('bridgedAsset.wormhole.description', { currencySymbol: currencyInfo.currency.symbol, chainName, - nativeChainName: bridgedAsset.nativeChain, + nativeChainName: bridgedWithdrawalInfo.chain, + provider: bridgedWithdrawalInfo.provider, })} @@ -158,7 +161,7 @@ export function WormholeModal({ onPress={onPressContinue} > - {t('bridgedAsset.wormhole.button')} + {t('bridgedAsset.wormhole.button', { provider: bridgedWithdrawalInfo.provider })} diff --git a/packages/uniswap/src/components/BridgedAsset/utils.ts b/packages/uniswap/src/components/BridgedAsset/utils.ts deleted file mode 100644 index c74ddbe26d9..00000000000 --- a/packages/uniswap/src/components/BridgedAsset/utils.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { BridgedAsset, isBridgedAsset, UNICHAIN_BRIDGED_ASSETS } from 'uniswap/src/constants/tokens' -import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' - -export function checkIsBridgedAsset(currencyInfo?: CurrencyInfo): boolean { - if (!currencyInfo) { - return false - } - - return ( - currencyInfo.currency.chainId === UniverseChainId.Unichain && - currencyInfo.currency.isToken && - isBridgedAsset(currencyInfo.currency.address) - ) -} - -export function getBridgedAsset(currencyInfo?: Maybe): BridgedAsset | undefined { - if (!currencyInfo || !currencyInfo.currency.isToken) { - return undefined - } - const address = currencyInfo.currency.address - return UNICHAIN_BRIDGED_ASSETS.find((asset) => asset.unichainAddress === address) -} diff --git a/packages/uniswap/src/components/CurrencyInputPanel/AmountInputPresets/AmountInputPresets.tsx b/packages/uniswap/src/components/CurrencyInputPanel/AmountInputPresets/AmountInputPresets.tsx index 1b3889b53ea..1103debb35d 100644 --- a/packages/uniswap/src/components/CurrencyInputPanel/AmountInputPresets/AmountInputPresets.tsx +++ b/packages/uniswap/src/components/CurrencyInputPanel/AmountInputPresets/AmountInputPresets.tsx @@ -1,21 +1,17 @@ -import { Flex, FlexProps } from 'ui/src' +import { Key } from 'react' +import { ButtonProps, Flex, FlexProps } from 'ui/src' import { get200MsAnimationDelayFromIndex } from 'ui/src/theme/animations/delay200ms' -import { PresetAmountButton } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/PresetAmountButton' import { AmountInputPresetsProps } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/types' -import { PRESET_PERCENTAGES } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/utils' -import { ElementName } from 'uniswap/src/features/telemetry/constants' -import { CurrencyField } from 'uniswap/src/types/currency' import { isHoverable } from 'utilities/src/platform' -export function AmountInputPresets({ +export const PRESET_BUTTON_PROPS: ButtonProps = { variant: 'default', py: '$spacing4' } + +export function AmountInputPresets({ hoverLtr, - currencyAmount, - currencyBalance, - transactionType, - buttonProps, - onSetPresetValue, + presets, + renderPreset, ...rest -}: AmountInputPresetsProps & FlexProps): JSX.Element { +}: AmountInputPresetsProps & FlexProps): JSX.Element { return ( - {PRESET_PERCENTAGES.map((percent, index) => ( + {presets.map((preset, index) => ( - + {renderPreset(preset)} ))} diff --git a/packages/uniswap/src/components/CurrencyInputPanel/AmountInputPresets/types.ts b/packages/uniswap/src/components/CurrencyInputPanel/AmountInputPresets/types.ts index 8fda416c162..7734ff991db 100644 --- a/packages/uniswap/src/components/CurrencyInputPanel/AmountInputPresets/types.ts +++ b/packages/uniswap/src/components/CurrencyInputPanel/AmountInputPresets/types.ts @@ -1,15 +1,8 @@ -import { Currency, CurrencyAmount } from '@uniswap/sdk-core' -import { ButtonProps } from 'ui/src/components/buttons/Button/types' -import { TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails' - export type PresetPercentageNumber = 25 | 50 | 75 | 100 export type PresetPercentage = PresetPercentageNumber | 'max' -export interface AmountInputPresetsProps { +export interface AmountInputPresetsProps { hoverLtr?: boolean - currencyAmount: CurrencyAmount | null | undefined - currencyBalance: CurrencyAmount - transactionType?: TransactionType - buttonProps?: ButtonProps - onSetPresetValue: (amount: string, percentage: PresetPercentage) => void + presets: T[] + renderPreset: (preset: T) => JSX.Element } diff --git a/packages/uniswap/src/components/CurrencyInputPanel/CurrencyInputPanel.tsx b/packages/uniswap/src/components/CurrencyInputPanel/CurrencyInputPanel.tsx index 194d817d833..29f5a8e6bb9 100644 --- a/packages/uniswap/src/components/CurrencyInputPanel/CurrencyInputPanel.tsx +++ b/packages/uniswap/src/components/CurrencyInputPanel/CurrencyInputPanel.tsx @@ -1,15 +1,20 @@ /* eslint-disable complexity */ import { forwardRef, memo, useCallback } from 'react' import { Flex, TouchableArea, useIsShortMobileDevice, useShakeAnimation } from 'ui/src' -import { AmountInputPresets } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/AmountInputPresets' +import { + AmountInputPresets, + PRESET_BUTTON_PROPS, +} from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/AmountInputPresets' import { PresetAmountButton } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/PresetAmountButton' import type { PresetPercentage } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/types' +import { PRESET_PERCENTAGES } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/utils' import { CurrencyInputPanelBalance } from 'uniswap/src/components/CurrencyInputPanel/CurrencyInputPanelBalance' import { CurrencyInputPanelHeader } from 'uniswap/src/components/CurrencyInputPanel/CurrencyInputPanelHeader' import { CurrencyInputPanelInput } from 'uniswap/src/components/CurrencyInputPanel/CurrencyInputPanelInput' import { CurrencyInputPanelValue } from 'uniswap/src/components/CurrencyInputPanel/CurrencyInputPanelValue' import { useIndicativeQuoteTextDisplay } from 'uniswap/src/components/CurrencyInputPanel/hooks/useIndicativeQuoteTextDisplay' import type { CurrencyInputPanelProps, CurrencyInputPanelRef } from 'uniswap/src/components/CurrencyInputPanel/types' +import { ElementName } from 'uniswap/src/features/telemetry/constants' import { useWallet } from 'uniswap/src/features/wallet/hooks/useWallet' import { CurrencyField } from 'uniswap/src/types/currency' import { isExtensionApp, isMobileWeb, isWebAppDesktop } from 'utilities/src/platform' @@ -80,6 +85,22 @@ export const CurrencyInputPanel = memo( [onSetPresetValue], ) + const renderPreset = useCallback( + (preset: PresetPercentage) => ( + + ), + [currencyAmount, currencyBalance, currencyField, handleSetPresetValue, transactionType], + ) + return ( {showPercentagePresetsOnBottom && currencyBalance && !currencyAmount ? ( - + ) : ( ( + + ), + [currencyAmount, currencyBalance, currencyField, onSetPresetValue], + ) + if (!headerLabel && !showDefaultTokenOptions) { return null } @@ -49,12 +71,7 @@ export function CurrencyInputPanelHeader({ {showInputPresets && ( - + )} {showDefaultTokenOptions && isWebAppDesktop && ( diff --git a/packages/uniswap/src/components/TokenSelector/TokenSelector.tsx b/packages/uniswap/src/components/TokenSelector/TokenSelector.tsx index 8a11c2310d4..ca096c964fd 100644 --- a/packages/uniswap/src/components/TokenSelector/TokenSelector.tsx +++ b/packages/uniswap/src/components/TokenSelector/TokenSelector.tsx @@ -1,5 +1,6 @@ import type { BottomSheetView } from '@gorhom/bottom-sheet' import { Currency } from '@uniswap/sdk-core' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { hasStringAsync } from 'expo-clipboard' import { ComponentProps, memo, useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -23,8 +24,6 @@ import { TradeableAsset } from 'uniswap/src/entities/assets' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { SearchContext } from 'uniswap/src/features/search/SearchModal/analytics/SearchContext' import { useFilterCallbacks } from 'uniswap/src/features/search/SearchModal/hooks/useFilterCallbacks' import { SearchTextInput } from 'uniswap/src/features/search/SearchTextInput' diff --git a/packages/uniswap/src/components/TokenSelector/TokenSelectorList.tsx b/packages/uniswap/src/components/TokenSelector/TokenSelectorList.tsx index 239da7655aa..b3c62a99d83 100644 --- a/packages/uniswap/src/components/TokenSelector/TokenSelectorList.tsx +++ b/packages/uniswap/src/components/TokenSelector/TokenSelectorList.tsx @@ -2,7 +2,6 @@ import { memo, useCallback, useState } from 'react' import { useDispatch } from 'react-redux' import { Text } from 'ui/src' import { BridgedAssetModal } from 'uniswap/src/components/BridgedAsset/BridgedAssetModal' -import { checkIsBridgedAsset } from 'uniswap/src/components/BridgedAsset/utils' import { TokenOptionItem as BaseTokenOptionItem, TokenContextMenuVariant, @@ -80,7 +79,7 @@ const TokenOptionItem = memo(function _TokenOptionItem({ const shouldShowWarningModalOnPress = showWarnings && (isBlocked || (severity !== WarningSeverity.None && !tokenWarningDismissed)) - const isBridgedAsset = checkIsBridgedAsset(currencyInfo) + const isBridgedAsset = Boolean(currencyInfo.isBridged) const [showBridgedAssetWarningModal, setShowBridgedAssetWarningModal] = useState(false) const { tokenWarningDismissed: bridgedAssetTokenWarningDismissed } = useDismissedBridgedAssetWarnings( currencyInfo.currency, diff --git a/packages/uniswap/src/components/TokenSelector/hooks.test.ts b/packages/uniswap/src/components/TokenSelector/hooks.test.ts index 274e9417792..7970d994ec6 100644 --- a/packages/uniswap/src/components/TokenSelector/hooks.test.ts +++ b/packages/uniswap/src/components/TokenSelector/hooks.test.ts @@ -62,6 +62,16 @@ jest.mock('uniswap/src/data/rest/tokenRankings', () => ({ tokenRankingsStatToCurrencyInfo: jest.fn(), })) +// Helper to convert undefined to null for GraphQL compatibility +const convertUndefinedToNull = ( + items: T[], +): T[] => + items.map((item) => ({ + ...item, + isBridged: item.isBridged ?? null, + bridgedWithdrawalInfo: item.bridgedWithdrawalInfo ?? null, + })) + const mockPortfolioHook = jest.requireMock( 'uniswap/src/components/TokenSelector/hooks/usePortfolioBalancesForAddressById', ) @@ -157,12 +167,12 @@ describe(useAllCommonBaseCurrencies, () => { { test: 'returns all currencies when there is no currency with a bridged version on other networks', input: projects, - output: { data: tokenProjectToCurrencyInfos(projects) }, + output: { data: convertUndefinedToNull(tokenProjectToCurrencyInfos(projects)) }, }, { test: 'filters out currencies that have a bridged version on other networks', input: [projectWithBridged], - output: { data: tokenProjectToCurrencyInfos([tokenProjectWithoutBridged]) }, + output: { data: convertUndefinedToNull(tokenProjectToCurrencyInfos([tokenProjectWithoutBridged])) }, }, ] @@ -215,7 +225,7 @@ describe(useFavoriteCurrencies, () => { { test: 'returns favorite tokens when there is data', input: [project], - output: { data: tokenProjectToCurrencyInfos([projectWithFavoritesOnly]) }, + output: { data: convertUndefinedToNull(tokenProjectToCurrencyInfos([projectWithFavoritesOnly])) }, }, ] @@ -319,22 +329,22 @@ describe(useFilterCallbacks, () => { expect(result.current.chainFilter).toEqual(UniverseChainId.ArbitrumOne) expect(result.current.searchFilter).toEqual('base uni') expect(result.current.parsedSearchFilter).toEqual(null) - expect(result.current.parsedSearchFilter).toEqual(null) }) it('does not parse unsupported chains', async () => { + const searchText = 'UNSUPPORTED uni' const { result } = renderHook(() => useFilterCallbacks(null, ModalName.Swap)) expect(result.current.parsedSearchFilter).toEqual(null) await act(() => { - result.current.onChangeText('UNSUPPORTED uni') + result.current.onChangeText(searchText) }) expect(result.current.chainFilter).toEqual(null) - expect(result.current.searchFilter).toEqual('UNSUPPORTED uni') + expect(result.current.searchFilter).toEqual(searchText) expect(result.current.parsedChainFilter).toEqual(null) - expect(result.current.parsedSearchFilter).toEqual(null) + expect(result.current.parsedSearchFilter).toEqual(searchText) }) it('only parses after the first space', async () => { @@ -399,17 +409,18 @@ describe(useFilterCallbacks, () => { it('does not parse unsupported chains from end', async () => { const { result } = renderHook(() => useFilterCallbacks(null, ModalName.Swap)) + const searchText = 'uni UNSUPPORTED' expect(result.current.parsedSearchFilter).toEqual(null) await act(() => { - result.current.onChangeText('uni UNSUPPORTED') + result.current.onChangeText(searchText) }) expect(result.current.chainFilter).toEqual(null) - expect(result.current.searchFilter).toEqual('uni UNSUPPORTED') + expect(result.current.searchFilter).toEqual(searchText) expect(result.current.parsedChainFilter).toEqual(null) - expect(result.current.parsedSearchFilter).toEqual(null) + expect(result.current.parsedSearchFilter).toEqual(searchText) }) }) diff --git a/packages/uniswap/src/components/activity/details/TransactionDetailsModal.test.tsx b/packages/uniswap/src/components/activity/details/TransactionDetailsModal.test.tsx index ab3a2ad969a..7aa920b47a9 100644 --- a/packages/uniswap/src/components/activity/details/TransactionDetailsModal.test.tsx +++ b/packages/uniswap/src/components/activity/details/TransactionDetailsModal.test.tsx @@ -83,7 +83,8 @@ jest.mock('uniswap/src/features/tokens/useCurrencyInfo', () => ({ }, })) -jest.mock('uniswap/src/features/gating/hooks', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), useDynamicConfigValue: jest .fn() .mockImplementation(({ defaultValue }: { config: unknown; key: unknown; defaultValue: unknown }) => { diff --git a/packages/uniswap/src/components/activity/details/transactions/SwapTransactionDetails.test.tsx b/packages/uniswap/src/components/activity/details/transactions/SwapTransactionDetails.test.tsx index 5b4154799d9..ac166a53b89 100644 --- a/packages/uniswap/src/components/activity/details/transactions/SwapTransactionDetails.test.tsx +++ b/packages/uniswap/src/components/activity/details/transactions/SwapTransactionDetails.test.tsx @@ -51,7 +51,8 @@ jest.mock('uniswap/src/features/tokens/useCurrencyInfo', () => ({ }, })) -jest.mock('uniswap/src/features/gating/hooks', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), useDynamicConfigValue: jest .fn() .mockImplementation(({ defaultValue }: { config: unknown; key: unknown; defaultValue: unknown }) => { diff --git a/packages/uniswap/src/components/activity/details/transactions/TransferTransactionDetails.test.tsx b/packages/uniswap/src/components/activity/details/transactions/TransferTransactionDetails.test.tsx index 6827f2805c4..52cfaa09a99 100644 --- a/packages/uniswap/src/components/activity/details/transactions/TransferTransactionDetails.test.tsx +++ b/packages/uniswap/src/components/activity/details/transactions/TransferTransactionDetails.test.tsx @@ -67,7 +67,8 @@ const getCurrencyInfoForChain = (chainId: number): CurrencyInfo => { } } -jest.mock('uniswap/src/features/gating/hooks', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), useDynamicConfigValue: jest .fn() .mockImplementation(({ defaultValue }: { config: unknown; key: unknown; defaultValue: unknown }) => { diff --git a/packages/uniswap/src/components/gating/DynamicConfigDropdown.tsx b/packages/uniswap/src/components/gating/DynamicConfigDropdown.tsx index 17d4e3450cb..c3797f2dbd4 100644 --- a/packages/uniswap/src/components/gating/DynamicConfigDropdown.tsx +++ b/packages/uniswap/src/components/gating/DynamicConfigDropdown.tsx @@ -1,8 +1,6 @@ +import { DynamicConfigKeys, DynamicConfigs, getOverrideAdapter, useDynamicConfigValue } from '@universe/gating' import { Flex, Text } from 'ui/src' import { ActionSheetDropdown } from 'uniswap/src/components/dropdowns/ActionSheetDropdown' -import { DynamicConfigKeys, DynamicConfigs } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' -import { getOverrideAdapter } from 'uniswap/src/features/gating/sdk/statsig' export function DynamicConfigDropdown({ config, diff --git a/packages/uniswap/src/components/gating/GatingOverrides.tsx b/packages/uniswap/src/components/gating/GatingOverrides.tsx index 4d82f77b9b2..94bae18eb5a 100644 --- a/packages/uniswap/src/components/gating/GatingOverrides.tsx +++ b/packages/uniswap/src/components/gating/GatingOverrides.tsx @@ -1,3 +1,16 @@ +import { + DynamicConfigs, + EmbeddedWalletConfigKey, + Experiments, + ExtensionBiometricUnlockConfigKey, + FeatureFlags, + ForceUpgradeConfigKey, + getFeatureFlagName, + getOverrideAdapter, + Layers, + useFeatureFlagWithExposureLoggingDisabled, + WALLET_FEATURE_FLAG_NAMES, +} from '@universe/gating' import React, { PropsWithChildren, useCallback } from 'react' import { Accordion, Flex, Separator, Switch, Text } from 'ui/src' import { RotatableChevron } from 'ui/src/components/icons/RotatableChevron' @@ -14,16 +27,6 @@ import { GatingButton } from 'uniswap/src/components/gating/GatingButton' import { ExperimentRow, LayerRow } from 'uniswap/src/components/gating/Rows' import { useForceUpgradeStatus } from 'uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus' import { useForceUpgradeTranslations } from 'uniswap/src/features/forceUpgrade/hooks/useForceUpgradeTranslations' -import { - DynamicConfigs, - EmbeddedWalletConfigKey, - ExtensionBiometricUnlockConfigKey, - ForceUpgradeConfigKey, -} from 'uniswap/src/features/gating/configs' -import { Experiments, Layers } from 'uniswap/src/features/gating/experiments' -import { FeatureFlags, getFeatureFlagName, WALLET_FEATURE_FLAG_NAMES } from 'uniswap/src/features/gating/flags' -import { useFeatureFlagWithExposureLoggingDisabled } from 'uniswap/src/features/gating/hooks' -import { getOverrideAdapter } from 'uniswap/src/features/gating/sdk/statsig' import { useEmbeddedWalletBaseUrl } from 'uniswap/src/features/passkey/hooks/useEmbeddedWalletBaseUrl' import { isExtensionApp, isMobileApp } from 'utilities/src/platform' import { useEvent } from 'utilities/src/react/hooks' diff --git a/packages/uniswap/src/components/gating/Rows.tsx b/packages/uniswap/src/components/gating/Rows.tsx index c5797d1a13e..fac0346bbaf 100644 --- a/packages/uniswap/src/components/gating/Rows.tsx +++ b/packages/uniswap/src/components/gating/Rows.tsx @@ -1,7 +1,6 @@ +import { Experiments, getOverrideAdapter, LayerProperties, Layers, useExperiment, useLayer } from '@universe/gating' import { useCallback } from 'react' import { Flex, Input, Switch, Text } from 'ui/src' -import { Experiments, LayerProperties, Layers } from 'uniswap/src/features/gating/experiments' -import { getOverrideAdapter, useExperiment, useLayer } from 'uniswap/src/features/gating/sdk/statsig' export function LayerRow({ value: layerName, diff --git a/packages/uniswap/src/components/gating/dynamicConfigOverrides.tsx b/packages/uniswap/src/components/gating/dynamicConfigOverrides.tsx index a7ac74e9b63..166f0afd754 100644 --- a/packages/uniswap/src/components/gating/dynamicConfigOverrides.tsx +++ b/packages/uniswap/src/components/gating/dynamicConfigOverrides.tsx @@ -1,6 +1,6 @@ +import { ForceUpgradeStatus, ForceUpgradeTranslations } from '@universe/gating' import { ComponentProps } from 'react' import { DynamicConfigDropdown } from 'uniswap/src/components/gating/DynamicConfigDropdown' -import { ForceUpgradeStatus, ForceUpgradeTranslations } from 'uniswap/src/features/gating/configs' type DynamicConfigOptions = ComponentProps['options'] diff --git a/packages/uniswap/src/components/lists/items/pools/PoolOptionItem.tsx b/packages/uniswap/src/components/lists/items/pools/PoolOptionItem.tsx index 48a9871d69c..998c2f3630f 100644 --- a/packages/uniswap/src/components/lists/items/pools/PoolOptionItem.tsx +++ b/packages/uniswap/src/components/lists/items/pools/PoolOptionItem.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { memo } from 'react' import { Flex, Text } from 'ui/src' import { iconSizes } from 'ui/src/theme' diff --git a/packages/uniswap/src/components/lists/items/pools/PoolOptionItemContextMenu.tsx b/packages/uniswap/src/components/lists/items/pools/PoolOptionItemContextMenu.tsx index a6971c2edca..e2bd8a72534 100644 --- a/packages/uniswap/src/components/lists/items/pools/PoolOptionItemContextMenu.tsx +++ b/packages/uniswap/src/components/lists/items/pools/PoolOptionItemContextMenu.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import React, { ReactNode, useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { CheckCircleFilled } from 'ui/src/components/icons/CheckCircleFilled' diff --git a/packages/uniswap/src/components/lists/items/pools/usePoolSearchResultsToPoolOptions.tsx b/packages/uniswap/src/components/lists/items/pools/usePoolSearchResultsToPoolOptions.tsx index d1d48af9eb7..146cefe7f3d 100644 --- a/packages/uniswap/src/components/lists/items/pools/usePoolSearchResultsToPoolOptions.tsx +++ b/packages/uniswap/src/components/lists/items/pools/usePoolSearchResultsToPoolOptions.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { useMemo } from 'react' import { OnchainItemListOptionType, PoolOption } from 'uniswap/src/components/lists/items/types' import { ZERO_ADDRESS } from 'uniswap/src/constants/misc' diff --git a/packages/uniswap/src/components/lists/items/pools/usePoolStatsToPoolOptions.tsx b/packages/uniswap/src/components/lists/items/pools/usePoolStatsToPoolOptions.tsx index fcdd6b49718..715546ef5be 100644 --- a/packages/uniswap/src/components/lists/items/pools/usePoolStatsToPoolOptions.tsx +++ b/packages/uniswap/src/components/lists/items/pools/usePoolStatsToPoolOptions.tsx @@ -1,5 +1,5 @@ +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { PoolStats } from '@uniswap/client-explore/dist/uniswap/explore/v1/service_pb' -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' import { parseRestProtocolVersion } from '@universe/api' import { useMemo } from 'react' import { OnchainItemListOptionType, PoolOption } from 'uniswap/src/components/lists/items/types' diff --git a/packages/uniswap/src/components/lists/items/types.ts b/packages/uniswap/src/components/lists/items/types.ts index 0944d974245..2ab0ff8035b 100644 --- a/packages/uniswap/src/components/lists/items/types.ts +++ b/packages/uniswap/src/components/lists/items/types.ts @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' diff --git a/packages/uniswap/src/components/nfts/NftView.tsx b/packages/uniswap/src/components/nfts/NftView.tsx index b9f9dffbae8..9c57a605347 100644 --- a/packages/uniswap/src/components/nfts/NftView.tsx +++ b/packages/uniswap/src/components/nfts/NftView.tsx @@ -10,9 +10,10 @@ export type NftViewProps = { onPress: () => void walletAddresses: Address[] openContextMenu?: () => void + hoverAnimation?: boolean } -export function NftView({ item, onPress, index, openContextMenu }: NftViewProps): JSX.Element { +export function NftView({ item, onPress, index, openContextMenu, hoverAnimation = true }: NftViewProps): JSX.Element { const nftView = ( skip?: boolean customEmptyState?: JSX.Element + autoColumns?: boolean + /** Web-only: when true, use a flex-wrap container instead of 2-col grid */ + wrapFlex?: boolean }, 'renderItem' | 'data' -> +> & { + loadingSkeletonCount?: number +} export function NftsList(_props: NftsListProps): JSX.Element { throw new PlatformSplitStubError('NftsList') diff --git a/packages/uniswap/src/components/nfts/NftsList.web.tsx b/packages/uniswap/src/components/nfts/NftsList.web.tsx index 5d957a39e0d..1e92a24062b 100644 --- a/packages/uniswap/src/components/nfts/NftsList.web.tsx +++ b/packages/uniswap/src/components/nfts/NftsList.web.tsx @@ -2,7 +2,7 @@ import { isNonPollingRequestInFlight } from '@universe/api' import { useCallback, useEffect, useMemo } from 'react' import { useTranslation } from 'react-i18next' import InfiniteScroll from 'react-infinite-scroll-component' -import { Flex, Loader, View } from 'ui/src' +import { Flex, Loader, styled, View } from 'ui/src' import { NoNfts } from 'ui/src/components/icons/NoNfts' import { BaseCard } from 'uniswap/src/components/BaseCard/BaseCard' import { ExpandoRow } from 'uniswap/src/components/ExpandoRow/ExpandoRow' @@ -17,24 +17,29 @@ import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { isExtensionApp } from 'utilities/src/platform' -const AssetsContainer = ({ children, useGrid }: { children: React.ReactNode; useGrid: boolean }): JSX.Element => { - return ( - - {children} - - ) -} +const AssetsContainer = styled(View, { + width: '100%', + gap: '$spacing2', + variants: { + useGrid: { + true: { + '$platform-web': { + display: 'grid', + // default to 2 columns + gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 1fr)', + gridGap: '12px', + }, + }, + }, + autoColumns: { + true: { + '$platform-web': { + gridTemplateColumns: 'repeat(auto-fill, minmax(200px, 1fr))', + }, + }, + }, + }, +}) const LOADING_ITEM = 'loading' @@ -48,6 +53,8 @@ export function NftsList({ renderNFTItem, skip, customEmptyState, + autoColumns = false, + loadingSkeletonCount = 6, }: NftsListProps): JSX.Element { const { t } = useTranslation() @@ -96,7 +103,7 @@ export function NftsList({ return null case HIDDEN_NFTS_ROW: return ( - + ( <> - - - - - - - - - - + {Array.from({ length: loadingSkeletonCount }, (_, i) => ( + + ))} ), - [], + [loadingSkeletonCount], ) const emptyState = useMemo( @@ -197,7 +197,9 @@ export function NftsList({ style={{ overflow: 'unset' }} scrollableTarget="wallet-dropdown-scroll-wrapper" > - 0}>{listContent} + 0} autoColumns={autoColumns}> + {listContent} + ) diff --git a/packages/uniswap/src/components/notifications/NotificationToast.native.tsx b/packages/uniswap/src/components/notifications/NotificationToast.native.tsx index b97222b2910..fd0a2c1a101 100644 --- a/packages/uniswap/src/components/notifications/NotificationToast.native.tsx +++ b/packages/uniswap/src/components/notifications/NotificationToast.native.tsx @@ -39,11 +39,11 @@ export function NotificationToast({ const onDismissLatest = useCallback(() => { bannerOffset.value = withSpring(HIDE_OFFSET_Y, SPRING_ANIMATION) - }, [bannerOffset]) + }, []) const onShowCurrentNotification = useCallback(() => { bannerOffset.value = withDelay(SPRING_ANIMATION_DELAY, withSpring(showOffset, SPRING_ANIMATION)) - }, [bannerOffset, showOffset]) + }, [showOffset]) const { onActionButtonPress, onNotificationPress, cancelDismiss, dismissLatest } = useNotificationLifecycle({ actionButtonOnPress: actionButton?.onPress, diff --git a/packages/uniswap/src/data/apiClients/tradingApi/TradingApiClient.ts b/packages/uniswap/src/data/apiClients/tradingApi/TradingApiClient.ts index 3a5211d76a3..433155b730f 100644 --- a/packages/uniswap/src/data/apiClients/tradingApi/TradingApiClient.ts +++ b/packages/uniswap/src/data/apiClients/tradingApi/TradingApiClient.ts @@ -1,10 +1,9 @@ import { createTradingApiClient, TradingApi } from '@universe/api' +import { FeatureFlags, getFeatureFlag } from '@universe/gating' import { config } from 'uniswap/src/config' import { tradingApiVersionPrefix, uniswapUrls } from 'uniswap/src/constants/urls' import { createUniswapFetchClient } from 'uniswap/src/data/apiClients/createUniswapFetchClient' import { filterChainIdsByPlatform } from 'uniswap/src/features/chains/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag } from 'uniswap/src/features/gating/hooks' import { Platform } from 'uniswap/src/features/platforms/types/Platform' const TradingFetchClient = createUniswapFetchClient({ diff --git a/packages/uniswap/src/data/apiClients/uniswapApi/useGasFeeQuery.ts b/packages/uniswap/src/data/apiClients/uniswapApi/useGasFeeQuery.ts index a1bcecfc55c..b2ab75b8cf7 100644 --- a/packages/uniswap/src/data/apiClients/uniswapApi/useGasFeeQuery.ts +++ b/packages/uniswap/src/data/apiClients/uniswapApi/useGasFeeQuery.ts @@ -4,13 +4,13 @@ import { type UseQueryWithImmediateGarbageCollectionApiHelperHookArgs, useQueryWithImmediateGarbageCollection, } from '@universe/api' +import { useStatsigClientStatus } from '@universe/gating' import { uniswapUrls } from 'uniswap/src/constants/urls' import { createFetchGasFee, type GasFeeResultWithoutState, } from 'uniswap/src/data/apiClients/uniswapApi/UniswapApiClient' import { getActiveGasStrategy } from 'uniswap/src/features/gas/utils' -import { useStatsigClientStatus } from 'uniswap/src/features/gating/hooks' import { ReactQueryCacheKey } from 'utilities/src/reactQuery/cache' export function useGasFeeQuery({ diff --git a/packages/uniswap/src/data/rest/conversionTracking/useConversionProxy.ts b/packages/uniswap/src/data/rest/conversionTracking/useConversionProxy.ts index 87391cd4998..af8c28f62ae 100644 --- a/packages/uniswap/src/data/rest/conversionTracking/useConversionProxy.ts +++ b/packages/uniswap/src/data/rest/conversionTracking/useConversionProxy.ts @@ -3,9 +3,8 @@ import { type ConnectError, type Transport } from '@connectrpc/connect' import { useMutation } from '@connectrpc/connect-query' import { type UseMutationResult } from '@tanstack/react-query' import { ConversionTrackingApi, createConnectTransportWithDefaults } from '@universe/api' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { getConversionProxyApiBaseUrl } from 'uniswap/src/data/rest/conversionTracking/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' const createConversionProxyTransport = (isConversionApiMigrationEnabled: boolean): Transport => createConnectTransportWithDefaults({ diff --git a/packages/uniswap/src/data/rest/conversionTracking/useConversionTracking.ts b/packages/uniswap/src/data/rest/conversionTracking/useConversionTracking.ts index b64191593ff..c9307f17d9a 100644 --- a/packages/uniswap/src/data/rest/conversionTracking/useConversionTracking.ts +++ b/packages/uniswap/src/data/rest/conversionTracking/useConversionTracking.ts @@ -1,4 +1,5 @@ import { ConnectError } from '@connectrpc/connect' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useAtom } from 'jotai' import { atomWithStorage } from 'jotai/utils' import { parse } from 'qs' @@ -12,8 +13,6 @@ import { buildProxyRequest } from 'uniswap/src/data/rest/conversionTracking/trac import { ConversionLead, PlatformIdType, TrackConversionArgs } from 'uniswap/src/data/rest/conversionTracking/types' import { useConversionProxy } from 'uniswap/src/data/rest/conversionTracking/useConversionProxy' import { getExternalConversionLeadsCookie } from 'uniswap/src/data/rest/conversionTracking/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { UniswapEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { HexString } from 'utilities/src/addresses/hex' diff --git a/packages/uniswap/src/data/rest/getPair.ts b/packages/uniswap/src/data/rest/getPair.ts deleted file mode 100644 index b108414c5d7..00000000000 --- a/packages/uniswap/src/data/rest/getPair.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { PartialMessage } from '@bufbuild/protobuf' -import { ConnectError } from '@connectrpc/connect' -import { useQuery } from '@connectrpc/connect-query' -import { UseQueryResult } from '@tanstack/react-query' -import { GetPairRequest, GetPairResponse } from '@uniswap/client-pools/dist/pools/v1/api_pb' -import { getPair } from '@uniswap/client-pools/dist/pools/v1/api-PoolsService_connectquery' -import { uniswapGetTransport } from 'uniswap/src/data/rest/base' - -/** - * eslint-disable import/no-unused-modules -- this endpoint is returning stale data sometimes meaning - * that the data we get (i.e. the dependent amount) is incorrect and the transaction does not complete on chain. - * Use this endpoint again once the data is more up to date or the trading API handles the data discrepancy. - */ -export function useGetPair( - input?: PartialMessage, - enabled = true, -): UseQueryResult { - return useQuery(getPair, input, { transport: uniswapGetTransport, enabled, retry: false }) -} diff --git a/packages/uniswap/src/data/rest/getPools.ts b/packages/uniswap/src/data/rest/getPools.ts index 106bca1c926..1dcc0a98ead 100644 --- a/packages/uniswap/src/data/rest/getPools.ts +++ b/packages/uniswap/src/data/rest/getPools.ts @@ -2,8 +2,8 @@ import { PartialMessage } from '@bufbuild/protobuf' import { ConnectError } from '@connectrpc/connect' import { useQuery } from '@connectrpc/connect-query' import { UseQueryResult } from '@tanstack/react-query' -import { ListPoolsRequest, ListPoolsResponse } from '@uniswap/client-pools/dist/pools/v1/api_pb' -import { listPools } from '@uniswap/client-pools/dist/pools/v1/api-PoolsService_connectquery' +import { ListPoolsRequest, ListPoolsResponse } from '@uniswap/client-data-api/dist/data/v1/api_pb' +import { listPools } from '@uniswap/client-data-api/dist/data/v1/api-DataApiService_connectquery' import { uniswapGetTransport } from 'uniswap/src/data/rest/base' export function useGetPoolsByTokens( diff --git a/packages/uniswap/src/data/rest/getPoolsRewards.ts b/packages/uniswap/src/data/rest/getPoolsRewards.ts index 58a5abfed60..8d681b88749 100644 --- a/packages/uniswap/src/data/rest/getPoolsRewards.ts +++ b/packages/uniswap/src/data/rest/getPoolsRewards.ts @@ -2,8 +2,8 @@ import { PartialMessage } from '@bufbuild/protobuf' import { ConnectError } from '@connectrpc/connect' import { useQuery } from '@connectrpc/connect-query' import { UseQueryResult } from '@tanstack/react-query' -import { GetRewardsRequest, GetRewardsResponse } from '@uniswap/client-pools/dist/pools/v1/api_pb' -import { getRewards } from '@uniswap/client-pools/dist/pools/v1/api-PoolsService_connectquery' +import { GetRewardsRequest, GetRewardsResponse } from '@uniswap/client-data-api/dist/data/v1/api_pb' +import { getRewards } from '@uniswap/client-data-api/dist/data/v1/api-DataApiService_connectquery' import { uniswapGetTransport } from 'uniswap/src/data/rest/base' export function useGetPoolsRewards( diff --git a/packages/uniswap/src/data/rest/getPortfolio.ts b/packages/uniswap/src/data/rest/getPortfolio.ts index 5db0dd4021d..3b3db8f6bb3 100644 --- a/packages/uniswap/src/data/rest/getPortfolio.ts +++ b/packages/uniswap/src/data/rest/getPortfolio.ts @@ -15,7 +15,6 @@ import { cleanupCaughtUpOverrides, getOverridesForAddress, getOverridesForQuery, - getPortfolioQueryApolloClient, getPortfolioQueryReduxStore, } from 'uniswap/src/data/rest/portfolioBalanceOverrides' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' @@ -107,9 +106,8 @@ export const getPortfolioQuery = ({ try { const reduxStore = getPortfolioQueryReduxStore() - const apolloClient = getPortfolioQueryApolloClient() - if (!reduxStore || !apolloClient) { + if (!reduxStore) { log.warn('`getPortfolioQuery` called before `initializePortfolioQueryOverrides`') return apiResponse } @@ -150,7 +148,6 @@ export const getPortfolioQuery = ({ }) const mergedResult = await fetchAndMergeOnchainBalances({ - apolloClient, cachedPortfolio: modifiedResponse.portfolio, accountAddress: address, currencyIds: overridesForCurrentAddress, diff --git a/packages/uniswap/src/data/rest/getPosition.ts b/packages/uniswap/src/data/rest/getPosition.ts index 857c7d5a83c..22218d7f21a 100644 --- a/packages/uniswap/src/data/rest/getPosition.ts +++ b/packages/uniswap/src/data/rest/getPosition.ts @@ -2,8 +2,8 @@ import { PartialMessage } from '@bufbuild/protobuf' import { ConnectError } from '@connectrpc/connect' import { useQuery } from '@connectrpc/connect-query' import { UseQueryResult } from '@tanstack/react-query' -import { GetPositionRequest, GetPositionResponse } from '@uniswap/client-pools/dist/pools/v1/api_pb' -import { getPosition } from '@uniswap/client-pools/dist/pools/v1/api-PoolsService_connectquery' +import { GetPositionRequest, GetPositionResponse } from '@uniswap/client-data-api/dist/data/v1/api_pb' +import { getPosition } from '@uniswap/client-data-api/dist/data/v1/api-DataApiService_connectquery' import { uniswapPostTransport } from 'uniswap/src/data/rest/base' export function useGetPositionQuery( diff --git a/packages/uniswap/src/data/rest/getPositions.ts b/packages/uniswap/src/data/rest/getPositions.ts index 0a5431262e6..400b3115f92 100644 --- a/packages/uniswap/src/data/rest/getPositions.ts +++ b/packages/uniswap/src/data/rest/getPositions.ts @@ -12,9 +12,9 @@ import { GetPositionResponse, ListPositionsRequest, ListPositionsResponse, -} from '@uniswap/client-pools/dist/pools/v1/api_pb' -import { getPosition, listPositions } from '@uniswap/client-pools/dist/pools/v1/api-PoolsService_connectquery' -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +} from '@uniswap/client-data-api/dist/data/v1/api_pb' +import { getPosition, listPositions } from '@uniswap/client-data-api/dist/data/v1/api-DataApiService_connectquery' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Pair } from '@uniswap/v2-sdk' import { useMemo } from 'react' import { uniswapPostTransport } from 'uniswap/src/data/rest/base' diff --git a/packages/uniswap/src/data/rest/portfolioBalanceOverrides.ts b/packages/uniswap/src/data/rest/portfolioBalanceOverrides.ts index 695e5229893..24badbde9bc 100644 --- a/packages/uniswap/src/data/rest/portfolioBalanceOverrides.ts +++ b/packages/uniswap/src/data/rest/portfolioBalanceOverrides.ts @@ -1,4 +1,3 @@ -import { ApolloClient, NormalizedCacheObject } from '@apollo/client' import { ToolkitStore } from '@reduxjs/toolkit/dist/configureStore' import { GetPortfolioResponse } from '@uniswap/client-data-api/dist/data/v1/api_pb' import { getNativeAddress } from 'uniswap/src/constants/addresses' @@ -16,30 +15,22 @@ const FILE_NAME = 'portfolioBalanceOverrides.ts' // so instead of checking for exact equality, we check if the quantities are "aproximately" equal. const APPROXIMATE_EQUALITY_THRESHOLD_PERCENT = 0.02 // 2% -// Module-level references to Redux store and Apollo client +// Module-level references to Redux store // These are initialized once during app startup let portfolioQueryReduxStore: ToolkitStore | null = null -let portfolioQueryApolloClient: ApolloClient | null = null /** * Initializes the portfolio balance override mechanism. - * This must be called once during each app initialization after both the Redux store and Apollo client are created. + * This must be called once during each app initialization after the Redux store is created. */ -export function initializePortfolioQueryOverrides({ - store, - apolloClient, -}: { - store: ToolkitStore - apolloClient: ApolloClient -}): void { +export function initializePortfolioQueryOverrides({ store }: { store: ToolkitStore }): void { const log = createLogger(FILE_NAME, 'initializePortfolioQueryOverrides', '[REST-ITBU]') - if (portfolioQueryReduxStore || portfolioQueryApolloClient) { + if (portfolioQueryReduxStore) { log.warn('`initializePortfolioQueryOverrides` called multiple times') } portfolioQueryReduxStore = store - portfolioQueryApolloClient = apolloClient log.debug('Portfolio query overrides successfully initialized') } @@ -48,10 +39,6 @@ export function getPortfolioQueryReduxStore(): ToolkitStore | null { return portfolioQueryReduxStore } -export function getPortfolioQueryApolloClient(): ApolloClient | null { - return portfolioQueryApolloClient -} - const selectTokenBalanceOverridesForWalletAddress = makeSelectTokenBalanceOverridesForWalletAddress() /** diff --git a/packages/uniswap/src/data/rest/searchTokensAndPools.ts b/packages/uniswap/src/data/rest/searchTokensAndPools.ts index 47fcae4534a..0657cb1681c 100644 --- a/packages/uniswap/src/data/rest/searchTokensAndPools.ts +++ b/packages/uniswap/src/data/rest/searchTokensAndPools.ts @@ -1,22 +1,29 @@ import { PartialMessage } from '@bufbuild/protobuf' import { ConnectError } from '@connectrpc/connect' -import { useQuery } from '@connectrpc/connect-query' +import { createQueryOptions, useQuery } from '@connectrpc/connect-query' import { UseQueryResult } from '@tanstack/react-query' import { Pool, type Token as SearchToken, SearchTokensRequest, SearchTokensResponse, + SearchType, } from '@uniswap/client-search/dist/search/v1/api_pb' import { searchTokens } from '@uniswap/client-search/dist/search/v1/api-searchService_connectquery' -import { parseProtectionInfo, parseRestProtocolVersion, parseSafetyLevel } from '@universe/api' +import { parseProtectionInfo, parseRestProtocolVersion, parseSafetyLevel, SharedQueryClient } from '@universe/api' import { getNativeAddress } from 'uniswap/src/constants/addresses' import { uniswapPostTransport } from 'uniswap/src/data/rest/base' +import { createLogger } from 'utilities/src/logger/logger' + +const FILE_NAME = 'searchTokensAndPools.ts' + +import { UniverseChainId } from 'uniswap/src/features/chains/types' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' import { buildCurrency, buildCurrencyInfo } from 'uniswap/src/features/dataApi/utils/buildCurrency' import { getCurrencySafetyInfo } from 'uniswap/src/features/dataApi/utils/getCurrencySafetyInfo' import { PoolSearchHistoryResult, SearchHistoryResultType } from 'uniswap/src/features/search/SearchHistoryResult' import { buildCurrencyId, currencyId, isNativeCurrencyAddress } from 'uniswap/src/utils/currencyId' +import { ONE_DAY_MS, ONE_HOUR_MS } from 'utilities/src/time/time' /** * Wrapper around Tanstack useQuery for the Uniswap REST BE service SearchTokens @@ -40,6 +47,56 @@ export function useSearchTokensAndPoolsQuery({ }) } +/** + * Fetch a single token by address outside of React components + * @param chainId - The chain ID to search on + * @param address - The token address to look up + * @returns Token data or null if not found + */ +export async function fetchTokenByAddress({ + chainId, + address, +}: { + chainId: UniverseChainId + address: string +}): Promise { + const log = createLogger(FILE_NAME, 'fetchTokenByAddress') + + try { + const result = await SharedQueryClient.fetchQuery({ + ...createQueryOptions( + searchTokens, + { + searchQuery: address, + chainIds: [chainId], + searchType: SearchType.TOKEN, + size: 1, + page: 1, + }, + { transport: uniswapPostTransport }, + ), + // Token data does not change often, so we can use stale data here. + // This data will be refreshed when fetching the portfolio balances anyway. + staleTime: ONE_HOUR_MS, + gcTime: ONE_DAY_MS, + }) + + const token = result.tokens[0] ?? null + + if (!token) { + log.debug('Token not found in search results', { chainId, address }) + } + + return token + } catch (error) { + log.error(error, { + chainId, + address, + }) + return null + } +} + export function searchTokenToCurrencyInfo(token: SearchToken): CurrencyInfo | null { const { chainId, address, symbol, name, decimals, logoUrl, feeData } = token const safetyLevel = parseSafetyLevel(token.safetyLevel) diff --git a/packages/uniswap/src/features/activity/formatTransactionsByDate.ts b/packages/uniswap/src/features/activity/formatTransactionsByDate.ts index 8283078091f..dff387c77ba 100644 --- a/packages/uniswap/src/features/activity/formatTransactionsByDate.ts +++ b/packages/uniswap/src/features/activity/formatTransactionsByDate.ts @@ -62,15 +62,30 @@ export function formatTransactionsByDate( // For all transactions before yesterday, group by month const priorByMonthTransactionList = olderThan24HTransactionList.reduce( (accum: Record, item) => { + // Skip transactions with invalid timestamps + if (!item.addedTime || item.addedTime <= 0) { + return accum + } + const isPreviousYear = item.addedTime < msTimestampCutoffYear - const key = localizedDayjs(item.addedTime) + const dayjsDate = localizedDayjs(item.addedTime) + const maybeKeyFromDayjsDate = dayjsDate // If in a previous year, append year to key string, else just use month // This key is used as the section title in TransactionList .format(isPreviousYear ? FORMAT_DATE_MONTH_YEAR : FORMAT_DATE_MONTH) .toString() - const currentMonthList = accum[key] ?? [] + + // Fallback to English if localized formatting fails + const validatedKey = dayjsDate.isValid() + ? maybeKeyFromDayjsDate + : dayjs(item.addedTime) + .locale('en') + .format(isPreviousYear ? FORMAT_DATE_MONTH_YEAR : FORMAT_DATE_MONTH) + + const currentMonthList = accum[validatedKey] ?? [] currentMonthList.push(item) - accum[key] = currentMonthList + accum[validatedKey] = currentMonthList + return accum }, {}, diff --git a/packages/uniswap/src/features/behaviorHistory/slice.ts b/packages/uniswap/src/features/behaviorHistory/slice.ts index 72c644fe19f..76c0e39b55b 100644 --- a/packages/uniswap/src/features/behaviorHistory/slice.ts +++ b/packages/uniswap/src/features/behaviorHistory/slice.ts @@ -9,6 +9,7 @@ export interface UniswapBehaviorHistoryState { hasDismissedBridgingWarning?: boolean hasDismissedLowNetworkTokenWarning?: boolean hasViewedContractAddressExplainer?: boolean + hasDismissedBridgedAssetsBannerV2?: boolean unichainPromotion?: { coldBannerDismissed?: boolean warmBannerDismissed?: boolean @@ -33,6 +34,7 @@ export const initialUniswapBehaviorHistoryState: UniswapBehaviorHistoryState = { hasDismissedBridgingWarning: false, hasDismissedLowNetworkTokenWarning: false, hasViewedContractAddressExplainer: false, + hasDismissedBridgedAssetsBannerV2: false, unichainPromotion: { coldBannerDismissed: false, warmBannerDismissed: false, @@ -108,6 +110,9 @@ const slice = createSlice({ setHasSeenToucanIntroModal: (state, action: PayloadAction) => { state.hasSeenToucanIntroModal = action.payload }, + setHasDismissedBridgedAssetsBannerV2: (state, action: PayloadAction) => { + state.hasDismissedBridgedAssetsBannerV2 = action.payload + }, }, }) @@ -128,6 +133,7 @@ export const { setEmbeddedWalletGraduateCardDismissed, setHasShownSmartWalletNudge, setHasSeenToucanIntroModal, + setHasDismissedBridgedAssetsBannerV2, } = slice.actions export const uniswapBehaviorHistoryReducer = slice.reducer diff --git a/packages/uniswap/src/features/chains/evm/info/avalanche.ts b/packages/uniswap/src/features/chains/evm/info/avalanche.ts index e7b8d376100..b439bc592c3 100644 --- a/packages/uniswap/src/features/chains/evm/info/avalanche.ts +++ b/packages/uniswap/src/features/chains/evm/info/avalanche.ts @@ -1,5 +1,6 @@ import { Token } from '@uniswap/sdk-core' import { GraphQLApi } from '@universe/api' +import { SwapConfigKey } from '@universe/gating' import { AVALANCHE_LOGO } from 'ui/src/assets' import { config } from 'uniswap/src/config' import { DEFAULT_NATIVE_ADDRESS_LEGACY, getQuicknodeEndpointUrl } from 'uniswap/src/features/chains/evm/rpc' @@ -11,7 +12,6 @@ import { UniverseChainId, UniverseChainInfo, } from 'uniswap/src/features/chains/types' -import { SwapConfigKey } from 'uniswap/src/features/gating/configs' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { ElementName } from 'uniswap/src/features/telemetry/constants' import { buildUSDC, buildUSDT } from 'uniswap/src/features/tokens/stablecoin' diff --git a/packages/uniswap/src/features/chains/evm/info/celo.ts b/packages/uniswap/src/features/chains/evm/info/celo.ts index c58fe928cae..d1fc7111b55 100644 --- a/packages/uniswap/src/features/chains/evm/info/celo.ts +++ b/packages/uniswap/src/features/chains/evm/info/celo.ts @@ -1,4 +1,5 @@ import { GraphQLApi } from '@universe/api' +import { SwapConfigKey } from '@universe/gating' import { CELO_LOGO } from 'ui/src/assets' import { config } from 'uniswap/src/config' import { getQuicknodeEndpointUrl } from 'uniswap/src/features/chains/evm/rpc' @@ -10,7 +11,6 @@ import { UniverseChainId, UniverseChainInfo, } from 'uniswap/src/features/chains/types' -import { SwapConfigKey } from 'uniswap/src/features/gating/configs' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { ElementName } from 'uniswap/src/features/telemetry/constants' import { buildUSDC } from 'uniswap/src/features/tokens/stablecoin' diff --git a/packages/uniswap/src/features/chains/evm/info/mainnet.ts b/packages/uniswap/src/features/chains/evm/info/mainnet.ts index 0283a360cec..374332ae025 100644 --- a/packages/uniswap/src/features/chains/evm/info/mainnet.ts +++ b/packages/uniswap/src/features/chains/evm/info/mainnet.ts @@ -1,5 +1,6 @@ import { CurrencyAmount } from '@uniswap/sdk-core' import { GraphQLApi } from '@universe/api' +import { SwapConfigKey } from '@universe/gating' import { ETH_LOGO, ETHEREUM_LOGO } from 'ui/src/assets' import { config } from 'uniswap/src/config' import { @@ -16,7 +17,6 @@ import { UniverseChainId, UniverseChainInfo, } from 'uniswap/src/features/chains/types' -import { SwapConfigKey } from 'uniswap/src/features/gating/configs' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { ElementName } from 'uniswap/src/features/telemetry/constants' import { buildDAI, buildUSDC, buildUSDT } from 'uniswap/src/features/tokens/stablecoin' diff --git a/packages/uniswap/src/features/chains/evm/info/monad.ts b/packages/uniswap/src/features/chains/evm/info/monad.ts index 7ea38b26778..740d57a0d05 100644 --- a/packages/uniswap/src/features/chains/evm/info/monad.ts +++ b/packages/uniswap/src/features/chains/evm/info/monad.ts @@ -1,4 +1,5 @@ import { GraphQLApi } from '@universe/api' +import { SwapConfigKey } from '@universe/gating' import { MONAD_LOGO } from 'ui/src/assets' import { DEFAULT_NATIVE_ADDRESS_LEGACY, getQuicknodeEndpointUrl } from 'uniswap/src/features/chains/evm/rpc' import { buildChainTokens } from 'uniswap/src/features/chains/evm/tokens' @@ -9,7 +10,6 @@ import { UniverseChainId, UniverseChainInfo, } from 'uniswap/src/features/chains/types' -import { SwapConfigKey } from 'uniswap/src/features/gating/configs' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { ElementName } from 'uniswap/src/features/telemetry/constants' import { buildUSDT } from 'uniswap/src/features/tokens/stablecoin' diff --git a/packages/uniswap/src/features/chains/evm/info/polygon.ts b/packages/uniswap/src/features/chains/evm/info/polygon.ts index 2624aded152..e13b25e96d9 100644 --- a/packages/uniswap/src/features/chains/evm/info/polygon.ts +++ b/packages/uniswap/src/features/chains/evm/info/polygon.ts @@ -1,4 +1,5 @@ import { GraphQLApi } from '@universe/api' +import { SwapConfigKey } from '@universe/gating' import { POLYGON_LOGO } from 'ui/src/assets' import { config } from 'uniswap/src/config' import { getQuicknodeEndpointUrl } from 'uniswap/src/features/chains/evm/rpc' @@ -10,7 +11,6 @@ import { UniverseChainId, UniverseChainInfo, } from 'uniswap/src/features/chains/types' -import { SwapConfigKey } from 'uniswap/src/features/gating/configs' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { ElementName } from 'uniswap/src/features/telemetry/constants' import { buildDAI, buildUSDC, buildUSDT } from 'uniswap/src/features/tokens/stablecoin' diff --git a/packages/uniswap/src/features/chains/gasDefaults.ts b/packages/uniswap/src/features/chains/gasDefaults.ts index 3ef71913717..7e5e8f0c8dd 100644 --- a/packages/uniswap/src/features/chains/gasDefaults.ts +++ b/packages/uniswap/src/features/chains/gasDefaults.ts @@ -1,4 +1,4 @@ -import { SwapConfigKey } from 'uniswap/src/features/gating/configs' +import { SwapConfigKey } from '@universe/gating' /** * Shared gas configuration constants. diff --git a/packages/uniswap/src/features/chains/hooks/useFeatureFlaggedChainIds.ts b/packages/uniswap/src/features/chains/hooks/useFeatureFlaggedChainIds.ts index 969e7995190..36dbf2723ea 100644 --- a/packages/uniswap/src/features/chains/hooks/useFeatureFlaggedChainIds.ts +++ b/packages/uniswap/src/features/chains/hooks/useFeatureFlaggedChainIds.ts @@ -1,8 +1,7 @@ +import { FeatureFlags, getFeatureFlag, useFeatureFlag } from '@universe/gating' import { useMemo } from 'react' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { filterChainIdsByFeatureFlag } from 'uniswap/src/features/chains/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag, useFeatureFlag } from 'uniswap/src/features/gating/hooks' export const getFeatureFlaggedChainIds = createGetFeatureFlaggedChainIds({ getSoneiumStatus: () => getFeatureFlag(FeatureFlags.Soneium), diff --git a/packages/uniswap/src/features/chains/hooks/useNewChainIds.ts b/packages/uniswap/src/features/chains/hooks/useNewChainIds.ts index 8a9bd27b642..831f54704fc 100644 --- a/packages/uniswap/src/features/chains/hooks/useNewChainIds.ts +++ b/packages/uniswap/src/features/chains/hooks/useNewChainIds.ts @@ -1,8 +1,7 @@ +import { ChainsConfigKey, DynamicConfigs, useDynamicConfigValue } from '@universe/gating' import { useMemo } from 'react' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { isUniverseChainId } from 'uniswap/src/features/chains/utils' -import { ChainsConfigKey, DynamicConfigs } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { isUniverseChainIdArrayType } from 'uniswap/src/features/gating/typeGuards' export function useNewChainIds(): UniverseChainId[] { diff --git a/packages/uniswap/src/features/chains/hooks/useOrderedChainIds.ts b/packages/uniswap/src/features/chains/hooks/useOrderedChainIds.ts index b74ac7d3e58..da0cbd451dd 100644 --- a/packages/uniswap/src/features/chains/hooks/useOrderedChainIds.ts +++ b/packages/uniswap/src/features/chains/hooks/useOrderedChainIds.ts @@ -1,8 +1,7 @@ +import { ChainsConfigKey, DynamicConfigs, useDynamicConfigValue } from '@universe/gating' import { useMemo } from 'react' import { ALL_CHAIN_IDS } from 'uniswap/src/features/chains/chainInfo' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { ChainsConfigKey, DynamicConfigs } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' // Returns the given chains ordered based on the statsig config export function useOrderedChainIds(chainIds: UniverseChainId[]): UniverseChainId[] { diff --git a/packages/uniswap/src/features/chains/types.ts b/packages/uniswap/src/features/chains/types.ts index b302bfeafdb..4e680d421e8 100644 --- a/packages/uniswap/src/features/chains/types.ts +++ b/packages/uniswap/src/features/chains/types.ts @@ -1,10 +1,10 @@ // biome-ignore lint/style/noRestrictedImports: legacy import will be migrated import { CurrencyAmount, Token, ChainId as UniswapSDKChainId } from '@uniswap/sdk-core' import type { GraphQLApi } from '@universe/api' +import { SwapConfigKey } from '@universe/gating' import type { ImageSourcePropType } from 'react-native' // biome-ignore lint/style/noRestrictedImports: legacy import will be migrated import { type UNIVERSE_CHAIN_INFO } from 'uniswap/src/features/chains/chainInfo' -import { SwapConfigKey } from 'uniswap/src/features/gating/configs' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { ElementName } from 'uniswap/src/features/telemetry/constants' import { NonEmptyArray } from 'utilities/src/primitives/array' diff --git a/packages/uniswap/src/features/dataApi/balances/balances.ts b/packages/uniswap/src/features/dataApi/balances/balances.ts index 7fe5058c6ed..fa121a145af 100644 --- a/packages/uniswap/src/features/dataApi/balances/balances.ts +++ b/packages/uniswap/src/features/dataApi/balances/balances.ts @@ -38,10 +38,12 @@ export type PortfolioCacheUpdater = (hidden: boolean, portfolioBalance?: Portfol export function usePortfolioBalances({ evmAddress, svmAddress, + chainIds, ...queryOptions }: { evmAddress?: Address svmAddress?: Address + chainIds?: UniverseChainId[] } & QueryHookOptions< GraphQLApi.PortfolioBalancesQuery, GraphQLApi.PortfolioBalancesQueryVariables @@ -49,6 +51,7 @@ export function usePortfolioBalances({ return usePortfolioData({ evmAddress: evmAddress || '', svmAddress: svmAddress || '', + chainIds, ...queryOptions, skip: !(evmAddress ?? svmAddress) || queryOptions.skip, }) @@ -270,6 +273,8 @@ export function useTokenBalancesGroupedByVisibility({ }, [balancesById, currencyIdToTokenVisibility, isTestnetModeEnabled]) } +type SortedPortfolioBalancesResult = GqlResult & { networkStatus: NetworkStatus } + /** * Returns portfolio balances for a given address sorted by USD value. * @@ -284,12 +289,14 @@ export function useSortedPortfolioBalances({ svmAddress, pollInterval, onCompleted, + chainIds, }: { evmAddress?: Address svmAddress?: Address pollInterval?: PollingInterval onCompleted?: () => void -}): GqlResult & { networkStatus: NetworkStatus } { + chainIds?: UniverseChainId[] +}): SortedPortfolioBalancesResult { const { isTestnetModeEnabled } = useEnabledChains() // Fetch all balances including small balances and spam tokens because we want to return those in separate arrays @@ -304,19 +311,23 @@ export function useSortedPortfolioBalances({ pollInterval, onCompleted, fetchPolicy: 'cache-and-network', + chainIds, }) const { shownTokens, hiddenTokens } = useTokenBalancesGroupedByVisibility({ balancesById }) - return { - data: { - balances: sortPortfolioBalances({ balances: shownTokens || [], isTestnetModeEnabled }), - hiddenBalances: sortPortfolioBalances({ balances: hiddenTokens || [], isTestnetModeEnabled }), - }, - loading, - networkStatus, - refetch, - } + return useMemo( + () => ({ + data: { + balances: sortPortfolioBalances({ balances: shownTokens || [], isTestnetModeEnabled }), + hiddenBalances: sortPortfolioBalances({ balances: hiddenTokens || [], isTestnetModeEnabled }), + }, + loading, + networkStatus, + refetch, + }), + [shownTokens, hiddenTokens, isTestnetModeEnabled, loading, networkStatus, refetch], + ) } /** diff --git a/packages/uniswap/src/features/dataApi/balances/balancesRest.ts b/packages/uniswap/src/features/dataApi/balances/balancesRest.ts index 64f1f59fb9e..b288659bb99 100644 --- a/packages/uniswap/src/features/dataApi/balances/balancesRest.ts +++ b/packages/uniswap/src/features/dataApi/balances/balancesRest.ts @@ -48,7 +48,8 @@ export function usePortfolioData({ pollInterval?: PollingInterval fetchPolicy?: WatchQueryFetchPolicy } & GetPortfolioInput['input']): PortfolioDataResult { - const { chains: chainIds } = useEnabledChains() + const { chains: defaultChainIds } = useEnabledChains() + const chainIds = queryOptions.chainIds || defaultChainIds // TODO(SWAP-388): GetPortfolio REST endpoint does not yet support modifier array; it will take 1 evm/svm address, but will apply the modifications across the board const modifier = useRestPortfolioValueModifier(evmAddress ?? svmAddress) diff --git a/packages/uniswap/src/features/dataApi/tokenProjects/tokenProjects.test.tsx b/packages/uniswap/src/features/dataApi/tokenProjects/tokenProjects.test.tsx index 7bb8281ae25..d588ebf377b 100644 --- a/packages/uniswap/src/features/dataApi/tokenProjects/tokenProjects.test.tsx +++ b/packages/uniswap/src/features/dataApi/tokenProjects/tokenProjects.test.tsx @@ -28,9 +28,17 @@ describe(useTokenProjects, () => { resolvers, }) - await waitFor(async () => { - const data = result.current.data - expect(data).toEqual(tokenProjectToCurrencyInfos(await resolved.tokenProjects)) + const expected = tokenProjectToCurrencyInfos(await resolved.tokenProjects) + // GraphQL converts undefined to null, so we need to do the same for comparison + const expectedWithNull = expected.map((item) => ({ + ...item, + isBridged: item.isBridged ?? null, + bridgedWithdrawalInfo: item.bridgedWithdrawalInfo ?? null, + })) + + await waitFor(() => { + expect(result.current.loading).toEqual(false) + expect(result.current.data).toEqual(expectedWithNull) }) }) }) diff --git a/packages/uniswap/src/features/dataApi/tokenProjects/utils/tokenProjectToCurrencyInfos.test.ts b/packages/uniswap/src/features/dataApi/tokenProjects/utils/tokenProjectToCurrencyInfos.test.ts index 996eaa13b22..1ac2dc67a12 100644 --- a/packages/uniswap/src/features/dataApi/tokenProjects/utils/tokenProjectToCurrencyInfos.test.ts +++ b/packages/uniswap/src/features/dataApi/tokenProjects/utils/tokenProjectToCurrencyInfos.test.ts @@ -20,6 +20,8 @@ describe(tokenProjectToCurrencyInfos, () => { symbol: token.symbol, name: token.name ?? project.name, }), + isBridged: token.isBridged, + bridgedWithdrawalInfo: token.bridgedWithdrawalInfo, }) as CurrencyInfo it('converts tokenProject to CurrencyInfo', () => { diff --git a/packages/uniswap/src/features/dataApi/tokenProjects/utils/tokenProjectToCurrencyInfos.ts b/packages/uniswap/src/features/dataApi/tokenProjects/utils/tokenProjectToCurrencyInfos.ts index c84763a73e0..01c78c2e2e4 100644 --- a/packages/uniswap/src/features/dataApi/tokenProjects/utils/tokenProjectToCurrencyInfos.ts +++ b/packages/uniswap/src/features/dataApi/tokenProjects/utils/tokenProjectToCurrencyInfos.ts @@ -14,7 +14,8 @@ export function tokenProjectToCurrencyInfos( ?.flatMap((project) => project?.tokens.map((token) => { const { logoUrl, safetyLevel } = project - const { name, chain, address, decimals, symbol, feeData, protectionInfo } = token + const { name, chain, address, decimals, symbol, feeData, protectionInfo, isBridged, bridgedWithdrawalInfo } = + token const chainId = fromGraphQLChain(chain) if (chainFilter && chainFilter !== chainId) { @@ -40,6 +41,8 @@ export function tokenProjectToCurrencyInfos( currencyId: currencyId(currency), logoUrl, safetyInfo: getCurrencySafetyInfo(safetyLevel, protectionInfo), + isBridged, + bridgedWithdrawalInfo, }) return currencyInfo diff --git a/packages/uniswap/src/features/dataApi/types.ts b/packages/uniswap/src/features/dataApi/types.ts index 00138794455..acb786fb064 100644 --- a/packages/uniswap/src/features/dataApi/types.ts +++ b/packages/uniswap/src/features/dataApi/types.ts @@ -2,6 +2,7 @@ import { NetworkStatus } from '@apollo/client' import { Contract } from '@uniswap/client-data-api/dist/data/v1/types_pb' import { Currency } from '@uniswap/sdk-core' import { GraphQLApi, SpamCode } from '@universe/api' +import { BridgedWithdrawalInfo } from '@universe/api/src/clients/graphql/__generated__/types-and-hooks' import { FoTPercent } from 'uniswap/src/features/tokens/TokenWarningModal' import { CurrencyId } from 'uniswap/src/types/currency' @@ -45,6 +46,10 @@ export type CurrencyInfo = { isSpam?: Maybe // Indicates if this currency is from another chain than user searched isFromOtherNetwork?: boolean + // Indicates if this token is a bridged asset + isBridged?: Maybe + // Information about how to withdraw a bridged asset to its native chain + bridgedWithdrawalInfo?: Maybe } // Portfolio balance as exposed to the app diff --git a/packages/uniswap/src/features/dataApi/utils/gqlTokenToCurrencyInfo.test.ts b/packages/uniswap/src/features/dataApi/utils/gqlTokenToCurrencyInfo.test.ts index 75b58eea063..1df17498d9f 100644 --- a/packages/uniswap/src/features/dataApi/utils/gqlTokenToCurrencyInfo.test.ts +++ b/packages/uniswap/src/features/dataApi/utils/gqlTokenToCurrencyInfo.test.ts @@ -23,6 +23,8 @@ describe(gqlTokenToCurrencyInfo, () => { currencyId: `${fromGraphQLChain(token.chain)}-${token.address}`, logoUrl: token.project.logoUrl, isSpam: token.project.isSpam, + isBridged: token.isBridged, + bridgedWithdrawalInfo: token.bridgedWithdrawalInfo, }) }) diff --git a/packages/uniswap/src/features/dataApi/utils/gqlTokenToCurrencyInfo.ts b/packages/uniswap/src/features/dataApi/utils/gqlTokenToCurrencyInfo.ts index ce4d1560a4c..150c1063372 100644 --- a/packages/uniswap/src/features/dataApi/utils/gqlTokenToCurrencyInfo.ts +++ b/packages/uniswap/src/features/dataApi/utils/gqlTokenToCurrencyInfo.ts @@ -11,7 +11,8 @@ export type GqlTokenToCurrencyInfoToken = Omit, + ) => FormattedFiatDelta +} { + const currency = useAppFiatCurrency() + const { formatNumberOrString } = useLocalizationContext() + + return useMemo( + () => ({ + formatChartFiatDelta: ( + options: Omit, + ): FormattedFiatDelta => { + return formatChartFiatDelta({ ...options, currency, formatNumberOrString }) + }, + }), + [currency, formatNumberOrString], + ) +} diff --git a/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/shared/types.ts b/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/shared/types.ts new file mode 100644 index 00000000000..b86b504b881 --- /dev/null +++ b/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/shared/types.ts @@ -0,0 +1,37 @@ +import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' +import { FormatNumberOrStringInput } from 'uniswap/src/features/language/formatter' + +export type DecimalPlaceNumber = number | 'threshold' | 'zero' + +export interface TrimTrailingZerosParams { + formatted: string + decimals: number + roundedValue?: number // Optional - only used by stablecoin formatter +} + +export interface FiatDeltaFormatter { + getDecimalPlaces: (absValue: number) => DecimalPlaceNumber + trimTrailingZeros: (params: TrimTrailingZerosParams) => string + shouldShowBelowThreshold: (absValue: number) => boolean + format: (params: FormatParams) => string +} + +export interface FormatParams { + value: number + currency: FiatCurrency + formatNumberOrString: (input: FormatNumberOrStringInput) => string +} + +export interface FiatDeltaFormatOptions { + startingPrice: number + endingPrice: number + isStablecoin?: boolean + currency?: FiatCurrency + formatNumberOrString: (input: FormatNumberOrStringInput) => string +} + +export interface FormattedFiatDelta { + formatted: string + rawDelta: number + belowThreshold?: boolean +} diff --git a/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/shared/utils.ts b/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/shared/utils.ts new file mode 100644 index 00000000000..0bc790e11a5 --- /dev/null +++ b/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/shared/utils.ts @@ -0,0 +1,93 @@ +import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' +import { getFiatCurrencyCode } from 'uniswap/src/features/fiatCurrency/hooks' +import { TrimTrailingZerosParams } from 'uniswap/src/features/fiatCurrency/priceChart/formatters/shared/types' +import { FormatNumberOrStringInput } from 'uniswap/src/features/language/formatter' +import { NumberType } from 'utilities/src/format/types' + +export const FIAT_DELTA_THRESHOLD = 0.000001 +const FORMATTED_NUMBER_PATTERN = /^([^0-9]*)([0-9,.\s]+)(.*)$/ + +export function roundToDecimals(value: number, decimals: number): number { + const factor = Math.pow(10, decimals) + return Math.round(value * factor) / factor +} + +export function formatZero( + currency: FiatCurrency, + formatNumberOrString: (input: FormatNumberOrStringInput) => string, +): string { + const currencyCode = getFiatCurrencyCode(currency) + return formatNumberOrString({ + value: 0, + type: NumberType.FiatStandard, + currencyCode, + }) +} + +export function formatThreshold( + currency: FiatCurrency, + formatNumberOrString: (input: FormatNumberOrStringInput) => string, +): string { + const currencyCode = getFiatCurrencyCode(currency) + + // Format just the threshold value to get proper currency symbol + const formatted = formatNumberOrString({ + value: FIAT_DELTA_THRESHOLD, + type: NumberType.FiatTokenDetails, + currencyCode, + }) + + return `<${formatted}` +} + +export function formatWithDecimals(params: { + value: number + decimals: number + currency: FiatCurrency + formatNumberOrString: (input: FormatNumberOrStringInput) => string + trimZeros: (params: TrimTrailingZerosParams) => string +}): string { + const { value, decimals, currency, formatNumberOrString, trimZeros } = params + const absValue = Math.abs(value) + const currencyCode = getFiatCurrencyCode(currency) + + // Round the value to the specified decimals + const roundedValue = roundToDecimals(absValue, decimals) + + // For very small values, we need to use a different number type that preserves precision + // NumberType.FiatStandard uses StandardCurrency which defaults to 2 decimals + // NumberType.FiatTokenDetails uses rules that preserve precision for small values + let formatted: string + + if (decimals > 2 && roundedValue < 1) { + // Use FiatTokenDetails which has SmallestNumCurrency for small values + // This preserves up to 20 decimals and respects the user's locale + formatted = formatNumberOrString({ + value: roundedValue, + type: NumberType.FiatTokenDetails, + currencyCode, + }) + } else { + // For larger values or values with 2 decimals, use the standard formatter + formatted = formatNumberOrString({ + value: roundedValue, + type: NumberType.FiatStandard, + currencyCode, + }) + } + + return trimZeros({ formatted, decimals, roundedValue }) +} + +export function parseFormattedNumber(formatted: string): { + prefix: string + numberPart: string + suffix: string +} { + const match = formatted.match(FORMATTED_NUMBER_PATTERN) + if (!match) { + return { prefix: '', numberPart: formatted, suffix: '' } + } + const [, prefix = '', numberPart = '', suffix = ''] = match + return { prefix, numberPart, suffix } +} diff --git a/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/stablecoinFormatter.ts b/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/stablecoinFormatter.ts new file mode 100644 index 00000000000..4ff1d52a6fd --- /dev/null +++ b/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/stablecoinFormatter.ts @@ -0,0 +1,84 @@ +import type { + DecimalPlaceNumber, + FiatDeltaFormatter, + TrimTrailingZerosParams, +} from 'uniswap/src/features/fiatCurrency/priceChart/formatters/shared/types' +import { + formatWithDecimals, + formatZero, + parseFormattedNumber, + roundToDecimals, +} from 'uniswap/src/features/fiatCurrency/priceChart/formatters/shared/utils' + +function getDecimalPlaces(absValue: number): DecimalPlaceNumber { + if (absValue === 0) { + return 'zero' + } + if (absValue >= 0.01) { + return 2 + } + if (absValue >= 0.001) { + return 3 + } + return 2 // Show $0.00 for < 0.001 +} + +function trimTrailingZeros(params: TrimTrailingZerosParams): string { + const { formatted, decimals, roundedValue } = params + + // Special handling for stablecoins that round to zero + // don't trim 3 decimal places + if (roundedValue === 0 || decimals === 3) { + return formatted + } + + const { prefix, numberPart, suffix } = parseFormattedNumber(formatted) + + // Only trim 00 for 2 decimal places + if (decimals === 2 && numberPart.match(/[.,]00$/)) { + return prefix + numberPart.replace(/[.,]00$/, '') + suffix + } + + return formatted +} + +export function createStablecoinFormatter(): FiatDeltaFormatter { + return { + getDecimalPlaces, + trimTrailingZeros, + + shouldShowBelowThreshold: () => false, // Never show threshold for stablecoins + + format: (params): string => { + const { value, currency, formatNumberOrString } = params + const absValue = Math.abs(value) + let decimals = getDecimalPlaces(absValue) + + if (decimals === 'zero') { + return formatZero(currency, formatNumberOrString) + } + + // Stablecoins treat values < 0.001 as zero (return $0.00) + if (absValue < 0.001 && absValue > 0) { + return formatZero(currency, formatNumberOrString) + } + + // Check if rounding changes which decimal bucket we're in + // For example, 0.0099 rounds to 0.01 with 3 decimals, which should use 2 decimals + if (decimals === 3) { + const rounded = roundToDecimals(absValue, 3) + if (rounded >= 0.01) { + decimals = 2 + } + } + + return formatWithDecimals({ + value, + decimals: decimals as number, + currency, + formatNumberOrString, + trimZeros: trimTrailingZeros, + }) + }, + } +} diff --git a/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/standardFormatter.ts b/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/standardFormatter.ts new file mode 100644 index 00000000000..f9597121a4c --- /dev/null +++ b/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/standardFormatter.ts @@ -0,0 +1,88 @@ +import type { + DecimalPlaceNumber, + FiatDeltaFormatter, + TrimTrailingZerosParams, +} from 'uniswap/src/features/fiatCurrency/priceChart/formatters/shared/types' +import { + FIAT_DELTA_THRESHOLD, + formatThreshold, + formatWithDecimals, + formatZero, + parseFormattedNumber, +} from 'uniswap/src/features/fiatCurrency/priceChart/formatters/shared/utils' + +const DECIMAL_THRESHOLDS = [ + { min: 1, decimals: 2 }, + { min: 0.1, decimals: 2 }, + { min: 0.01, decimals: 3 }, + { min: 0.001, decimals: 4 }, + { min: 0.0001, decimals: 5 }, + { min: 0.00001, decimals: 6 }, +] as const + +function getDecimalPlaces(absValue: number): DecimalPlaceNumber { + if (absValue === 0) { + return 'zero' + } + + // Use a small epsilon for floating point comparison + const EPSILON = 1e-10 + + for (const { min, decimals } of DECIMAL_THRESHOLDS) { + // Use epsilon comparison to handle floating point errors + if (absValue >= min - EPSILON) { + return decimals + } + } + + return 'threshold' +} + +function trimTrailingZeros(params: TrimTrailingZerosParams): string { + const { formatted, decimals } = params + const { prefix, numberPart, suffix } = parseFormattedNumber(formatted) + let trimmed = numberPart + + if (decimals === 2) { + // For 2 decimal places, keep both decimals (don't trim trailing zeros) + // This ensures values like $0.10 stay as $0.10, not $0.1 + trimmed = numberPart + } else if (decimals > 2) { + // For decimals > 2, trim all trailing zeros (including the decimal point if no significant digits remain) + trimmed = numberPart.replace(/(\.\d*?)0+$/, '$1') + // If we end with just a decimal point, remove it + trimmed = trimmed.replace(/\.$/, '') + } + + return prefix + trimmed + suffix +} + +export function createStandardFormatter(): FiatDeltaFormatter { + return { + getDecimalPlaces, + trimTrailingZeros, + + shouldShowBelowThreshold: (absValue: number) => absValue > 0 && absValue < FIAT_DELTA_THRESHOLD, + + format: (params): string => { + const { value, currency, formatNumberOrString } = params + const absValue = Math.abs(value) + const decimals = getDecimalPlaces(absValue) + + switch (decimals) { + case 'zero': + return formatZero(currency, formatNumberOrString) + case 'threshold': + return formatThreshold(currency, formatNumberOrString) + default: + return formatWithDecimals({ + value, + decimals, + currency, + formatNumberOrString, + trimZeros: trimTrailingZeros, + }) + } + }, + } +} diff --git a/packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.test.ts b/packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.test.ts new file mode 100644 index 00000000000..fbf15548f29 --- /dev/null +++ b/packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.test.ts @@ -0,0 +1,1204 @@ +/* eslint-disable max-lines */ +import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' +import { formatChartFiatDelta } from 'uniswap/src/features/fiatCurrency/priceChart/priceChartConversion' +import { FormatNumberOrStringInput } from 'uniswap/src/features/language/formatter' + +// Minimal test formatter that matches expected test output +const defaultFormatter = (input: FormatNumberOrStringInput): string => { + const { value, currencyCode, type } = input + if (value === null || value === undefined) { + return '-' + } + + const num = typeof value === 'number' ? value : parseFloat(value) + const currencySymbols: Record = { + USD: '$', + GBP: '£', + EUR: 'EUR ', + JPY: '¥', + INR: '₹', + } + + const symbol = currencySymbols[currencyCode || 'USD'] || currencyCode + ' ' + + if (type === 'fiat-standard') { + let decimals = 2 + const str = num.toString() + const match = str.match(/\.(\d+)/) + if (match && match[1]) { + decimals = Math.max(2, match[1].length) + } + + const formatted = num.toLocaleString('en-US', { + minimumFractionDigits: decimals, + maximumFractionDigits: decimals, + }) + if (num >= 1 && num === Math.floor(num)) { + return `${symbol}${formatted.replace(/\.00$/, '')}` + } + return `${symbol}${formatted}` + } + + const getDecimals = (n: number): number => { + const abs = Math.abs(n) + if (abs === 0 || abs >= 0.1) { + return 2 + } + if (abs >= 0.01) { + return Math.max(2, n.toString().replace(/.*\./, '').replace(/0+$/, '').length) + } + if (abs >= 0.001) { + return Math.max(3, n.toString().replace(/.*\./, '').replace(/0+$/, '').length) + } + if (abs >= 0.0001) { + return Math.max(4, n.toString().replace(/.*\./, '').replace(/0+$/, '').length) + } + if (abs >= 0.00001) { + return Math.max(5, n.toString().replace(/.*\./, '').replace(/0+$/, '').length) + } + return 6 + } + + const decimals = getDecimals(num) + let formatted = num.toLocaleString('en-US', { + minimumFractionDigits: decimals, + maximumFractionDigits: decimals, + }) + + // Trim trailing zeros for whole numbers (e.g., $1.00 -> $1) + if (decimals === 2 && num >= 1 && num === Math.floor(num)) { + formatted = formatted.replace(/\.00$/, '') + } + + return `${symbol}${formatted}` +} + +describe('formatChartFiatDelta', () => { + describe('normal crypto formatting', () => { + describe('values >= $1', () => { + it('formats positive values with 2 decimals', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 101.25, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$1.25') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 2530.1, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$2,430.10') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 101, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$1') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 1099.99, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$999.99') + }) + + it('formats negative values with 2 decimals', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + -1.25, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$1.25') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -2430.1, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$2,430.10') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + -1.0, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$1') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -999.99, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$999.99') + }) + + it('uses thousand separators', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 1234.56, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$1,234.56') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 1234567.89, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$1,234,567.89') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -1234567.89, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$1,234,567.89') + }) + + it('trims trailing zeros', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 1.0, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$1') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 1.1, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$1.10') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 1.2, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$1.20') + }) + }) + + describe('values >= $0.10 and < $1', () => { + it('formats positive values with 2 decimals', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.57, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.57') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.14, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.14') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.1, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.10') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.99, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.99') + }) + + it('formats negative values with 2 decimals', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + -0.57, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.57') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + -0.14, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.14') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + -0.1, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.10') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + -0.99, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.99') + }) + + it('trims trailing zeros', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.1, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.10') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.5, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.50') + }) + }) + + describe('values >= $0.01 and < $0.10', () => { + it('formats positive values with 3 decimals', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.053, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.053') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.096, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.096') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.01, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.01') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.099, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.099') + }) + + it('formats negative values with 3 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.053, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.053') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.096, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.096') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + -0.01, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.01') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.099, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.099') + }) + + it('trims trailing zeros but keeps at least 2 decimals', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.01, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.01') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.05, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.05') + }) + }) + + describe('values >= $0.001 and < $0.01', () => { + it('formats positive values with 4 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0075, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0075') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0031, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0031') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.001, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0099, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0099') + }) + + it('formats negative values with 4 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0075, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0075') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0031, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0031') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0099, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0099') + }) + + it('trims trailing zeros but keeps minimum decimals', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.001, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0012, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0012') + }) + }) + + describe('values >= $0.0001 and < $0.001', () => { + it('formats positive values with 5 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.00083, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00083') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.00022, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00022') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.00099, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00099') + }) + + it('formats negative values with 5 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.00083, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00083') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.00022, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00022') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.00099, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00099') + }) + + it('trims trailing zeros but keeps minimum decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.00012, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00012') + }) + }) + + describe('values >= $0.00001 and < $0.0001', () => { + it('formats positive values with 6 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.000019, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.000019') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.000094, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.000094') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.00001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.000099, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.000099') + }) + + it('formats negative values with 6 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.000019, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.000019') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.000094, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.000094') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.00001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.000099, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.000099') + }) + + it('trims trailing zeros but keeps minimum decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.00001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.000012, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.000012') + }) + }) + + describe('values < $0.000001', () => { + it('formats as threshold with exact value in tooltip', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0000001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('<$0.000001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0000009, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('<$0.000001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0000001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('<$0.000001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0000009, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('<$0.000001') + }) + }) + + describe('zero value', () => { + it('formats as $0.00', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.00') + }) + }) + }) + + describe('stablecoin formatting', () => { + describe('values >= $1', () => { + it('formats positive values with 2 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 1.25, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$1.25') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 2430.1, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$2,430.10') + }) + + it('formats negative values with 2 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -1.25, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$1.25') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -2430.1, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$2,430.10') + }) + }) + + describe('values >= $0.10 and < $1', () => { + it('formats positive values with 2 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.42, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.42') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.1, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.10') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.99, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.99') + }) + + it('formats negative values with 2 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.42, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.42') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.1, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.10') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.99, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.99') + }) + }) + + describe('values >= $0.01 and < $0.10', () => { + it('formats positive values with 2 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.07, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.07') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.01, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.01') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.099, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.10') + }) + + it('formats negative values with 2 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.07, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.07') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.01, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.01') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.099, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.10') + }) + }) + + describe('values >= $0.001 and < $0.01', () => { + it('formats positive values with 3 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.003, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.003') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.001, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0099, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.01') + }) + + it('formats negative values with 3 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.003, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.003') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.001, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0099, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.01') + }) + }) + + describe('values < $0.001', () => { + it('formats as $0.00', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0001, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0009, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0001, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0009, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00') + }) + }) + + describe('zero value', () => { + it('formats as $0.00', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00') + }) + }) + }) + + describe('formatFiatDelta with isStablecoin flag', () => { + it('uses stablecoin formatting when isStablecoin is true', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.003, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.003') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0001, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 1.25, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$1.25') + }) + + it('uses normal formatting when isStablecoin is false', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.003, + isStablecoin: false, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.003') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0001, + isStablecoin: false, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 1.25, + isStablecoin: false, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$1.25') + }) + }) + + describe('currency support', () => { + it('formats EUR currency with proper symbol', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 100, + currency: FiatCurrency.Euro, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('EUR 100') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -50.5, + currency: FiatCurrency.Euro, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('EUR 50.50') + }) + + it('formats GBP currency with proper symbol', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 100, + currency: FiatCurrency.BritishPound, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('£100') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -50.5, + currency: FiatCurrency.BritishPound, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('£50.50') + }) + + it('formats JPY currency with proper symbol', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 100, + currency: FiatCurrency.JapaneseYen, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('¥100') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -50.5, + currency: FiatCurrency.JapaneseYen, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('¥50.50') + }) + }) + + describe('edge cases', () => { + it('handles trimming edge cases that previously failed', () => { + // Test case 1: Value that trims to whole number (previously would fail regex) + // 1.000 with 4 decimals should trim to "1", not break + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 101.0, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$1') + + // Test case 2: Value with all trailing zeros after rounding + // 0.0010 with 4 decimals should trim to "0.001" + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100.001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.001') + + // Test case 3: Value in the 3-decimal range that has trailing zeros + // 0.0500 should trim to "0.05" (in the 3-decimal range >= 0.01 and < 0.10) + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100.05, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.05') + + // Test case 4: Very small value that needs all its decimals preserved + // 0.00012 should keep all significant digits + expect( + formatChartFiatDelta({ + startingPrice: 1.0, + endingPrice: 1.00012, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00012') + + // Test case 5: Value that would have broken the old regex when decimal point is removed + // 0.001000 with 4 decimals trims to "0.001", old logic would try to match non-existent decimal + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100.001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.001') + }) + + it('handles rounding correctly', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.0999, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.1') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.00999, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.01') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.0994, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.099') + }) + + it('handles very small negative values correctly', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0000001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('<$0.000001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.000001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('<$0.000001') + }) + + it('handles values exactly at thresholds', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 1.0, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$1') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.1, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.10') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.01, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.01') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.001, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.001') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.0001, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.0001') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.00001, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.00001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.000001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('<$0.000001') + }) + }) + describe('delta calculation', () => { + it('calculates and formats positive delta for normal crypto', () => { + const result = formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 103.53, + isStablecoin: false, + formatNumberOrString: defaultFormatter, + }) + expect(result.formatted).toBe('$3.53') + expect(result.rawDelta).toBeCloseTo(3.53, 5) + expect(result.belowThreshold).toBeUndefined() + }) + + it('correctly formats DEGEN-like small delta values', () => { + // Test the specific DEGEN case: $0.00370 - $0.00338 = $0.00032 + const result = formatChartFiatDelta({ + startingPrice: 0.00338, + endingPrice: 0.0037, + isStablecoin: false, + formatNumberOrString: defaultFormatter, + }) + expect(result.formatted).toBe('$0.00032') + expect(result.rawDelta).toBeCloseTo(0.00032, 10) + expect(result.belowThreshold).toBeUndefined() + }) + + it('calculates and formats positive delta for stablecoin', () => { + const result = formatChartFiatDelta({ + startingPrice: 1.0, + endingPrice: 1.003, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }) + expect(result.formatted).toBe('$0.003') + expect(result.rawDelta).toBeCloseTo(0.003, 5) + expect(result.belowThreshold).toBeUndefined() + }) + + it('calculates and formats negative delta for stablecoin', () => { + const result = formatChartFiatDelta({ + startingPrice: 1.0, + endingPrice: 0.997, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }) + expect(result.formatted).toBe('$0.003') + expect(result.rawDelta).toBeCloseTo(-0.003, 5) + expect(result.belowThreshold).toBeUndefined() + }) + + it('handles very small deltas for stablecoin', () => { + const result = formatChartFiatDelta({ + startingPrice: 1.0, + endingPrice: 1.0001, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }) + expect(result.formatted).toBe('$0.00') + expect(result.rawDelta).toBeCloseTo(0.0001, 5) + expect(result.belowThreshold).toBeUndefined() + }) + + it('handles zero delta', () => { + const result = formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100, + isStablecoin: false, + formatNumberOrString: defaultFormatter, + }) + expect(result.formatted).toBe('$0.00') + expect(result.rawDelta).toBe(0) + expect(result.belowThreshold).toBeUndefined() + }) + + it('uses custom currency', () => { + const result = formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 150, + currency: FiatCurrency.Euro, + formatNumberOrString: defaultFormatter, + }) + expect(result.formatted).toBe('EUR 50') + expect(result.rawDelta).toBe(50) + expect(result.belowThreshold).toBeUndefined() + }) + + it('handles below threshold values for normal crypto', () => { + const result = formatChartFiatDelta({ + startingPrice: 1.0, + endingPrice: 1.0000005, + isStablecoin: false, + formatNumberOrString: defaultFormatter, + }) + expect(result.formatted).toBe('<$0.000001') + expect(result.rawDelta).toBeCloseTo(0.0000005, 10) + expect(result.belowThreshold).toBe(true) + }) + + it('handles multiple currencies', () => { + const gbpResult = formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 175.25, + currency: FiatCurrency.BritishPound, + formatNumberOrString: defaultFormatter, + }) + expect(gbpResult.formatted).toBe('£75.25') + expect(gbpResult.rawDelta).toBe(75.25) + + const jpyResult = formatChartFiatDelta({ + startingPrice: 10000, + endingPrice: 12500, + currency: FiatCurrency.JapaneseYen, + formatNumberOrString: defaultFormatter, + }) + expect(jpyResult.formatted).toBe('¥2,500') + expect(jpyResult.rawDelta).toBe(2500) + + const inrResult = formatChartFiatDelta({ + startingPrice: 5000, + endingPrice: 7500.5, + currency: FiatCurrency.IndianRupee, + formatNumberOrString: defaultFormatter, + }) + expect(inrResult.formatted).toBe('₹2,500.50') + expect(inrResult.rawDelta).toBe(2500.5) + }) + + it('correctly sets belowThreshold flag', () => { + // Should set belowThreshold for non-stablecoins + const cryptoResult = formatChartFiatDelta({ + startingPrice: 1.0, + endingPrice: 1.0000003, + isStablecoin: false, + formatNumberOrString: defaultFormatter, + }) + expect(cryptoResult.belowThreshold).toBe(true) + + // Should NOT set belowThreshold for stablecoins + const stableResult = formatChartFiatDelta({ + startingPrice: 1.0, + endingPrice: 1.0000003, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }) + expect(stableResult.belowThreshold).toBeUndefined() + + // Should NOT set belowThreshold when value is above threshold + const aboveResult = formatChartFiatDelta({ + startingPrice: 1.0, + endingPrice: 1.001, + isStablecoin: false, + formatNumberOrString: defaultFormatter, + }) + expect(aboveResult.belowThreshold).toBeUndefined() + }) + }) +}) diff --git a/packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.ts b/packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.ts new file mode 100644 index 00000000000..91e80a8d9ee --- /dev/null +++ b/packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.ts @@ -0,0 +1,42 @@ +import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' +import type { + FiatDeltaFormatOptions, + FormattedFiatDelta, +} from 'uniswap/src/features/fiatCurrency/priceChart/formatters/shared/types' +import { createStablecoinFormatter } from 'uniswap/src/features/fiatCurrency/priceChart/formatters/stablecoinFormatter' +import { createStandardFormatter } from 'uniswap/src/features/fiatCurrency/priceChart/formatters/standardFormatter' + +/** + * Utility for formatting fiat currency delta values in price charts. + * + * This module provides specialized formatting for price change amounts with: + * - Dynamic decimal precision based on value magnitude (2-6 decimal places) + * - Threshold formatting for very small values (<$0.000001) + * - Intelligent trailing zero trimming while preserving minimum decimals + * - Support for multiple fiat currencies with proper symbol extraction + * - Special handling for stablecoins (simplified precision rules) + */ +export function formatChartFiatDelta({ + startingPrice, + endingPrice, + isStablecoin = false, + currency = FiatCurrency.UnitedStatesDollar, + formatNumberOrString, +}: FiatDeltaFormatOptions): FormattedFiatDelta { + const formatter = isStablecoin ? createStablecoinFormatter() : createStandardFormatter() + const rawDelta = endingPrice - startingPrice + + const formatted = formatter.format({ + value: rawDelta, + currency, + formatNumberOrString, + }) + + const belowThreshold = formatter.shouldShowBelowThreshold(Math.abs(rawDelta)) + + return { + formatted, + rawDelta, + ...(belowThreshold && { belowThreshold: true }), + } +} diff --git a/packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus.ts b/packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus.ts index 246af09288d..b573fee07df 100644 --- a/packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus.ts +++ b/packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus.ts @@ -1,5 +1,4 @@ -import { DynamicConfigs, ForceUpgradeConfigKey, ForceUpgradeStatus } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' +import { DynamicConfigs, ForceUpgradeConfigKey, ForceUpgradeStatus, useDynamicConfigValue } from '@universe/gating' export function useForceUpgradeStatus(): ForceUpgradeStatus { return useDynamicConfigValue({ diff --git a/packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeTranslations.ts b/packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeTranslations.ts index 5eb16d3693e..63357d0ef22 100644 --- a/packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeTranslations.ts +++ b/packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeTranslations.ts @@ -1,5 +1,9 @@ -import { DynamicConfigs, ForceUpgradeConfigKey, ForceUpgradeTranslations } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' +import { + DynamicConfigs, + ForceUpgradeConfigKey, + ForceUpgradeTranslations, + useDynamicConfigValue, +} from '@universe/gating' export function useForceUpgradeTranslations(): ForceUpgradeTranslations { return useDynamicConfigValue({ diff --git a/packages/uniswap/src/features/gas/hooks.ts b/packages/uniswap/src/features/gas/hooks.ts index 96ae3a1cd70..cab1383e613 100644 --- a/packages/uniswap/src/features/gas/hooks.ts +++ b/packages/uniswap/src/features/gas/hooks.ts @@ -1,5 +1,6 @@ import { Currency, CurrencyAmount } from '@uniswap/sdk-core' import { GasStrategy } from '@universe/api' +import { GasStrategyType, useStatsigClientStatus } from '@universe/gating' import { BigNumber, providers } from 'ethers/lib/ethers' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' @@ -12,8 +13,6 @@ import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledCh import { UniverseChainId } from 'uniswap/src/features/chains/types' import { FormattedUniswapXGasFeeInfo, GasFeeResult } from 'uniswap/src/features/gas/types' import { getActiveGasStrategy, hasSufficientFundsIncludingGas } from 'uniswap/src/features/gas/utils' -import { GasStrategyType } from 'uniswap/src/features/gating/configs' -import { useStatsigClientStatus } from 'uniswap/src/features/gating/hooks' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { useOnChainNativeCurrencyBalance } from 'uniswap/src/features/portfolio/api' import { getCurrencyAmount, ValueType } from 'uniswap/src/features/tokens/getCurrencyAmount' diff --git a/packages/uniswap/src/features/gas/hooks/useMaxAmountSpend.test.ts b/packages/uniswap/src/features/gas/hooks/useMaxAmountSpend.test.ts index 5019f99318b..e1717ddd237 100644 --- a/packages/uniswap/src/features/gas/hooks/useMaxAmountSpend.test.ts +++ b/packages/uniswap/src/features/gas/hooks/useMaxAmountSpend.test.ts @@ -8,8 +8,9 @@ import { MAINNET_CURRENCY } from 'uniswap/src/test/fixtures/wallet/currencies' const mockUseDynamicConfigValue = jest.fn() -jest.mock('uniswap/src/features/gating/hooks', () => { +jest.mock('@universe/gating', () => { return { + ...jest.requireActual('@universe/gating'), useDynamicConfigValue: (params: { config: unknown; key: unknown; defaultValue: unknown }): unknown => mockUseDynamicConfigValue(params), } diff --git a/packages/uniswap/src/features/gas/hooks/useMaxAmountSpend.ts b/packages/uniswap/src/features/gas/hooks/useMaxAmountSpend.ts index 7d223059153..30a1e1ceb77 100644 --- a/packages/uniswap/src/features/gas/hooks/useMaxAmountSpend.ts +++ b/packages/uniswap/src/features/gas/hooks/useMaxAmountSpend.ts @@ -1,10 +1,9 @@ import { Currency, CurrencyAmount } from '@uniswap/sdk-core' +import { DynamicConfigs, SwapConfigKey, useDynamicConfigValue } from '@universe/gating' import JSBI from 'jsbi' import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import { GENERIC_L2_GAS_CONFIG } from 'uniswap/src/features/chains/gasDefaults' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { DynamicConfigs, SwapConfigKey } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { getCurrencyAmount, ValueType } from 'uniswap/src/features/tokens/getCurrencyAmount' import { TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails' diff --git a/packages/uniswap/src/features/gas/utils.ts b/packages/uniswap/src/features/gas/utils.ts index f8862b530fa..9c1e2460928 100644 --- a/packages/uniswap/src/features/gas/utils.ts +++ b/packages/uniswap/src/features/gas/utils.ts @@ -1,14 +1,14 @@ import { Currency, CurrencyAmount } from '@uniswap/sdk-core' import { GasEstimate, GasStrategy } from '@universe/api' -import JSBI from 'jsbi' -import { areEqualGasStrategies } from 'uniswap/src/features/gas/types' import { DynamicConfigs, GasStrategies, GasStrategyType, GasStrategyWithConditions, -} from 'uniswap/src/features/gating/configs' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' + getStatsigClient, +} from '@universe/gating' +import JSBI from 'jsbi' +import { areEqualGasStrategies } from 'uniswap/src/features/gas/types' import { getCurrencyAmount, ValueType } from 'uniswap/src/features/tokens/getCurrencyAmount' // The default "Urgent" strategy that was previously hardcoded in the gas service diff --git a/packages/uniswap/src/features/gating/StatsigProviderWrapper.tsx b/packages/uniswap/src/features/gating/StatsigProviderWrapper.tsx index 86c703873e0..f73bb72db2a 100644 --- a/packages/uniswap/src/features/gating/StatsigProviderWrapper.tsx +++ b/packages/uniswap/src/features/gating/StatsigProviderWrapper.tsx @@ -1,12 +1,6 @@ +import { StatsigOptions, StatsigProvider, StatsigUser, StorageProvider, useClientAsyncInit } from '@universe/gating' import { ReactNode, useEffect } from 'react' import { config } from 'uniswap/src/config' -import { - StatsigOptions, - StatsigProvider, - StatsigUser, - StorageProvider, - useClientAsyncInit, -} from 'uniswap/src/features/gating/sdk/statsig' import { statsigBaseConfig } from 'uniswap/src/features/gating/statsigBaseConfig' import { logger } from 'utilities/src/logger/logger' diff --git a/packages/uniswap/src/features/gating/statsigBaseConfig.ts b/packages/uniswap/src/features/gating/statsigBaseConfig.ts index 6ea6d023740..dbb1f13d574 100644 --- a/packages/uniswap/src/features/gating/statsigBaseConfig.ts +++ b/packages/uniswap/src/features/gating/statsigBaseConfig.ts @@ -1,6 +1,5 @@ +import { getOverrideAdapter, getStatsigEnvName, StatsigOptions } from '@universe/gating' import { uniswapUrls } from 'uniswap/src/constants/urls' -import { getStatsigEnvName } from 'uniswap/src/features/gating/getStatsigEnvName' -import { getOverrideAdapter, StatsigOptions } from 'uniswap/src/features/gating/sdk/statsig' export const statsigBaseConfig: StatsigOptions = { networkConfig: { api: uniswapUrls.statsigProxyUrl }, diff --git a/packages/uniswap/src/features/gating/typeGuards.ts b/packages/uniswap/src/features/gating/typeGuards.ts index 4f98aa75596..058c3fb0549 100644 --- a/packages/uniswap/src/features/gating/typeGuards.ts +++ b/packages/uniswap/src/features/gating/typeGuards.ts @@ -1,6 +1,6 @@ import { GraphQLApi } from '@universe/api' +import { UwULinkAllowlist } from '@universe/gating' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { UwULinkAllowlist } from 'uniswap/src/features/gating/configs' export const isUwULinkAllowlistType = (x: unknown): x is UwULinkAllowlist => { const hasFields = diff --git a/packages/uniswap/src/features/language/hooks.tsx b/packages/uniswap/src/features/language/hooks.tsx index 1c550e5213d..5e76bb6999f 100644 --- a/packages/uniswap/src/features/language/hooks.tsx +++ b/packages/uniswap/src/features/language/hooks.tsx @@ -1,9 +1,9 @@ +import { ForceUpgradeTranslations } from '@universe/gating' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import { AppTFunction } from 'ui/src/i18n/types' import { useUrlContext } from 'uniswap/src/contexts/UrlContext' -import { ForceUpgradeTranslations } from 'uniswap/src/features/gating/configs' import { Language, Locale, diff --git a/packages/uniswap/src/features/nfts/hooks/useNftContextMenuItems.tsx b/packages/uniswap/src/features/nfts/hooks/useNftContextMenuItems.tsx index afebb23bf45..99c9236debd 100644 --- a/packages/uniswap/src/features/nfts/hooks/useNftContextMenuItems.tsx +++ b/packages/uniswap/src/features/nfts/hooks/useNftContextMenuItems.tsx @@ -1,4 +1,5 @@ import { TokenReportEventType } from '@universe/api' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' @@ -14,8 +15,6 @@ import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledCh import { useBlockExplorerLogo } from 'uniswap/src/features/chains/logos' import { type UniverseChainId } from 'uniswap/src/features/chains/types' import { getChainExplorerName } from 'uniswap/src/features/chains/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useNavigateToNftExplorerLink } from 'uniswap/src/features/nfts/hooks/useNavigateToNftExplorerLink' import { getIsNftHidden, getNFTAssetKey } from 'uniswap/src/features/nfts/utils' import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' diff --git a/packages/uniswap/src/features/passkey/hooks/useEmbeddedWalletBaseUrl.ts b/packages/uniswap/src/features/passkey/hooks/useEmbeddedWalletBaseUrl.ts index 116f82ffc2b..36eeab329b6 100644 --- a/packages/uniswap/src/features/passkey/hooks/useEmbeddedWalletBaseUrl.ts +++ b/packages/uniswap/src/features/passkey/hooks/useEmbeddedWalletBaseUrl.ts @@ -1,6 +1,5 @@ +import { DynamicConfigs, EmbeddedWalletConfigKey, useDynamicConfigValue } from '@universe/gating' import { UNISWAP_WEB_URL } from 'uniswap/src/constants/urls' -import { DynamicConfigs, EmbeddedWalletConfigKey } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' export function useEmbeddedWalletBaseUrl(): string { const baseUrl = useDynamicConfigValue({ diff --git a/packages/uniswap/src/features/portfolio/PortfolioBalance/PortfolioBalance.tsx b/packages/uniswap/src/features/portfolio/PortfolioBalance/PortfolioBalance.tsx index 48a9aeccb6b..d5327f5640a 100644 --- a/packages/uniswap/src/features/portfolio/PortfolioBalance/PortfolioBalance.tsx +++ b/packages/uniswap/src/features/portfolio/PortfolioBalance/PortfolioBalance.tsx @@ -17,9 +17,13 @@ import { isWebPlatform } from 'utilities/src/platform' interface PortfolioBalanceProps { owner: Address + endText?: JSX.Element | string } -export const PortfolioBalance = memo(function _PortfolioBalance({ owner }: PortfolioBalanceProps): JSX.Element { +export const PortfolioBalance = memo(function _PortfolioBalance({ + owner, + endText, +}: PortfolioBalanceProps): JSX.Element { const { data, loading, networkStatus, refetch } = usePortfolioTotalValue({ evmAddress: owner, // TransactionHistoryUpdater will refetch this query on new transaction. @@ -47,7 +51,7 @@ export const PortfolioBalance = memo(function _PortfolioBalance({ owner }: Portf const shouldFadePortfolioDecimals = (currency === FiatCurrency.UnitedStatesDollar || currency === FiatCurrency.Euro) && currencyComponents.symbolAtFront - const EndElement = useMemo(() => { + const RefreshButton = useMemo(() => { if (isWebPlatform) { return } @@ -65,19 +69,22 @@ export const PortfolioBalance = memo(function _PortfolioBalance({ owner }: Portf value={totalBalance} warmLoading={isWarmLoading} isRightToLeft={isRightToLeft} - EndElement={EndElement} + EndElement={RefreshButton} /> - - - + + + + + {endText} + ) }) diff --git a/packages/uniswap/src/features/portfolio/api.ts b/packages/uniswap/src/features/portfolio/api.ts index 8bbe8b0e570..910338e10cc 100644 --- a/packages/uniswap/src/features/portfolio/api.ts +++ b/packages/uniswap/src/features/portfolio/api.ts @@ -2,6 +2,7 @@ import { PublicKey } from '@solana/web3.js' import { skipToken, useQuery } from '@tanstack/react-query' import { Currency, CurrencyAmount, NativeCurrency as NativeCurrencyClass } from '@uniswap/sdk-core' import { SharedQueryClient } from '@universe/api' +import { DynamicConfigs, getDynamicConfigValue, SyncTransactionSubmissionChainIdsConfigKey } from '@universe/gating' import { Contract } from 'ethers/lib/ethers' import { useMemo } from 'react' import ERC20_ABI from 'uniswap/src/abis/erc20.json' @@ -14,8 +15,6 @@ import { import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { getPollingIntervalByBlocktime } from 'uniswap/src/features/chains/utils' -import { DynamicConfigs, SyncTransactionSubmissionChainIdsConfigKey } from 'uniswap/src/features/gating/configs' -import { getDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { chainIdToPlatform } from 'uniswap/src/features/platforms/utils/chains' import { createEthersProvider } from 'uniswap/src/features/providers/createEthersProvider' diff --git a/packages/uniswap/src/features/portfolio/portfolioUpdates/isInstantTokenBalanceUpdateEnabled.ts b/packages/uniswap/src/features/portfolio/portfolioUpdates/isInstantTokenBalanceUpdateEnabled.ts index f35ff5a208c..12424682f7f 100644 --- a/packages/uniswap/src/features/portfolio/portfolioUpdates/isInstantTokenBalanceUpdateEnabled.ts +++ b/packages/uniswap/src/features/portfolio/portfolioUpdates/isInstantTokenBalanceUpdateEnabled.ts @@ -1,5 +1,4 @@ -import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' +import { FeatureFlags, getFeatureFlagName, getStatsigClient } from '@universe/gating' export function isInstantTokenBalanceUpdateEnabled(): boolean { return getStatsigClient().checkGate(getFeatureFlagName(FeatureFlags.InstantTokenBalanceUpdate)) diff --git a/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/fetchOnChainBalancesRest.test.ts b/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/fetchOnChainBalancesRest.test.ts index 40395fdc848..9054ae0f4e6 100644 --- a/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/fetchOnChainBalancesRest.test.ts +++ b/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/fetchOnChainBalancesRest.test.ts @@ -1,6 +1,6 @@ -import { ApolloClient, NormalizedCacheObject } from '@apollo/client' import { GetPortfolioResponse } from '@uniswap/client-data-api/dist/data/v1/api_pb.d' -import { GraphQLApi } from '@universe/api' +import { type Token as SearchToken } from '@uniswap/client-search/dist/search/v1/api_pb' +import * as searchTokensAndPools from 'uniswap/src/data/rest/searchTokensAndPools' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { fetchOnChainCurrencyBalance } from 'uniswap/src/features/portfolio/api' import { fetchOnChainBalancesRest } from 'uniswap/src/features/portfolio/portfolioUpdates/rest/fetchOnChainBalancesRest' @@ -33,10 +33,19 @@ jest.mock('uniswap/src/features/portfolio/api', () => ({ fetchOnChainCurrencyBalance: jest.fn(), })) +jest.mock('uniswap/src/data/rest/searchTokensAndPools', () => ({ + ...jest.requireActual('uniswap/src/data/rest/searchTokensAndPools'), + fetchTokenByAddress: jest.fn(), +})) + const mockGetOnChainBalancesFetch = fetchOnChainCurrencyBalance as jest.MockedFunction< typeof fetchOnChainCurrencyBalance > +const mockFetchTokenByAddress = searchTokensAndPools.fetchTokenByAddress as jest.MockedFunction< + typeof searchTokensAndPools.fetchTokenByAddress +> + const TEST_ACCOUNT = '0x1234567890123456789012345678901234567890' const TEST_TOKEN_ADDRESS = '0xabcdef0123456789abcdef0123456789abcdef01' const TEST_CHAIN_ID = UniverseChainId.Mainnet @@ -83,10 +92,6 @@ const mockCachedPortfolio = { } as NonNullable describe('fetchOnChainBalancesRest', () => { - const mockApolloClient = { - query: jest.fn(), - } as unknown as ApolloClient - beforeEach(() => { jest.clearAllMocks() }) @@ -100,7 +105,6 @@ describe('fetchOnChainBalancesRest', () => { }) const result = await fetchOnChainBalancesRest({ - apolloClient: mockApolloClient, cachedPortfolio: mockCachedPortfolio, accountAddress: TEST_ACCOUNT, currencyIds: new Set([currencyId]), @@ -149,7 +153,6 @@ describe('fetchOnChainBalancesRest', () => { } as NonNullable const result = await fetchOnChainBalancesRest({ - apolloClient: mockApolloClient, cachedPortfolio: mockCachedPortfolioWithNative, accountAddress: TEST_ACCOUNT, currencyIds: new Set([currencyId]), @@ -172,7 +175,6 @@ describe('fetchOnChainBalancesRest', () => { const invalidCurrencyId = 'invalid-currency-id' const result = await fetchOnChainBalancesRest({ - apolloClient: mockApolloClient, cachedPortfolio: mockCachedPortfolio, accountAddress: TEST_ACCOUNT, currencyIds: new Set([invalidCurrencyId]), @@ -190,32 +192,28 @@ describe('fetchOnChainBalancesRest', () => { balance: mockBalance, }) - // Mock GraphQL query for new token - ;(mockApolloClient.query as jest.Mock).mockResolvedValueOnce({ - data: { - token: { - ...mockToken, - address: MOCK_TOKEN_ADDRESS_2, - symbol: 'NEW', - name: 'New Token', - }, - }, - }) + // Mock REST search for new token + mockFetchTokenByAddress.mockResolvedValueOnce({ + chainId: TEST_CHAIN_ID, + address: MOCK_TOKEN_ADDRESS_2, + symbol: 'NEW', + name: 'New Token', + decimals: 18, + logoUrl: '', + feeData: undefined, + safetyLevel: 0, + protectionInfo: undefined, + } as unknown as SearchToken) const result = await fetchOnChainBalancesRest({ - apolloClient: mockApolloClient, cachedPortfolio: mockCachedPortfolio, // doesn't contain new token accountAddress: TEST_ACCOUNT, currencyIds: new Set([currencyId]), }) - expect(mockApolloClient.query).toHaveBeenCalledWith({ - query: GraphQLApi.TokenDocument, - variables: { - chain: 'ETHEREUM', - address: MOCK_TOKEN_ADDRESS_2, - }, - fetchPolicy: 'cache-first', + expect(mockFetchTokenByAddress).toHaveBeenCalledWith({ + chainId: TEST_CHAIN_ID, + address: MOCK_TOKEN_ADDRESS_2, }) const balanceInfo = result.get(currencyId) @@ -225,7 +223,7 @@ describe('fetchOnChainBalancesRest', () => { expect(balanceInfo?.token?.symbol).toBe('NEW') }) - it('skips tokens when GraphQL query fails', async () => { + it('skips tokens when REST token search fails', async () => { const currencyId = buildCurrencyId(TEST_CHAIN_ID, MOCK_TOKEN_ADDRESS_3) const mockBalance = MOCK_BALANCE_1_ETH @@ -233,13 +231,10 @@ describe('fetchOnChainBalancesRest', () => { balance: mockBalance, }) - // Mock GraphQL query to return null token - ;(mockApolloClient.query as jest.Mock).mockResolvedValueOnce({ - data: { token: null }, - }) + // Mock REST search to return null (token not found) + mockFetchTokenByAddress.mockResolvedValueOnce(null) const result = await fetchOnChainBalancesRest({ - apolloClient: mockApolloClient, cachedPortfolio: mockCachedPortfolio, accountAddress: TEST_ACCOUNT, currencyIds: new Set([currencyId]), @@ -284,7 +279,6 @@ describe('fetchOnChainBalancesRest', () => { .mockResolvedValueOnce({ balance: MOCK_BALANCE_2_ETH }) const result = await fetchOnChainBalancesRest({ - apolloClient: mockApolloClient, cachedPortfolio: mockCachedPortfolioMultiple, accountAddress: TEST_ACCOUNT, currencyIds: new Set([currencyId1, currencyId2]), @@ -310,7 +304,6 @@ describe('fetchOnChainBalancesRest', () => { .mockRejectedValueOnce(new Error('Network error')) const result = await fetchOnChainBalancesRest({ - apolloClient: mockApolloClient, cachedPortfolio: mockCachedPortfolio, accountAddress: TEST_ACCOUNT, currencyIds: new Set([currencyId1, currencyId2]), @@ -332,7 +325,6 @@ describe('fetchOnChainBalancesRest', () => { // Cached portfolio has 1 token worth $100 const result = await fetchOnChainBalancesRest({ - apolloClient: mockApolloClient, cachedPortfolio: mockCachedPortfolio, accountAddress: TEST_ACCOUNT, currencyIds: new Set([currencyId]), diff --git a/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/fetchOnChainBalancesRest.ts b/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/fetchOnChainBalancesRest.ts index 98837526c9b..580ed5e508a 100644 --- a/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/fetchOnChainBalancesRest.ts +++ b/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/fetchOnChainBalancesRest.ts @@ -1,21 +1,20 @@ -import { ApolloClient, NormalizedCacheObject } from '@apollo/client' import { PartialMessage } from '@bufbuild/protobuf' import { GetPortfolioResponse } from '@uniswap/client-data-api/dist/data/v1/api_pb.d' import { Balance } from '@uniswap/client-data-api/dist/data/v1/types_pb' import { CurrencyAmount, NativeCurrency, Token } from '@uniswap/sdk-core' -import { GraphQLApi, TradingApi } from '@universe/api' +import { TradingApi } from '@universe/api' import { getNativeAddress } from 'uniswap/src/constants/addresses' +import { fetchTokenByAddress, searchTokenToCurrencyInfo } from 'uniswap/src/data/rest/searchTokensAndPools' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { getPrimaryStablecoin } from 'uniswap/src/features/chains/utils' -import { currencyIdToContractInput } from 'uniswap/src/features/dataApi/utils/currencyIdToContractInput' -import { gqlTokenToCurrencyInfo } from 'uniswap/src/features/dataApi/utils/gqlTokenToCurrencyInfo' -import { Platform } from 'uniswap/src/features/platforms/types/Platform' +import { isSVMChain } from 'uniswap/src/features/platforms/utils/chains' import { fetchOnChainCurrencyBalance } from 'uniswap/src/features/portfolio/api' import { DenominatedValue, fetchIndicativeQuote, } from 'uniswap/src/features/portfolio/portfolioUpdates/fetchOnChainBalances' import { getCurrencyAmount, ValueType } from 'uniswap/src/features/tokens/getCurrencyAmount' +import { SolanaToken } from 'uniswap/src/features/tokens/SolanaToken' import { toTradingApiSupportedChainId } from 'uniswap/src/features/transactions/swap/utils/tradingApi' import { CurrencyId } from 'uniswap/src/types/currency' import { areAddressesEqual } from 'uniswap/src/utils/addresses' @@ -28,12 +27,10 @@ const FILE_NAME = 'fetchOnChainBalancesRest.ts' // Fetches real-time onchain balances for multiple currencies and converts them to Balance objects export async function fetchOnChainBalancesRest({ - apolloClient, cachedPortfolio, accountAddress, currencyIds, }: { - apolloClient: ApolloClient cachedPortfolio: NonNullable accountAddress: Address currencyIds: Set @@ -64,7 +61,7 @@ export async function fetchOnChainBalancesRest({ const cachedBalance = findCachedBalance({ cachedPortfolio, chainId, currencyAddress }) const token = cachedBalance?.token - const currencyResult = await resolveCurrency({ token, currencyId, apolloClient }) + const currencyResult = await resolveCurrency({ token, currencyId }) if (!currencyResult) { return @@ -259,49 +256,83 @@ function findCachedBalance({ } return areAddressesEqual({ - addressInput1: { address: balance.token.address, platform: Platform.EVM }, - addressInput2: { address: currencyAddress, platform: Platform.EVM }, + addressInput1: { address: balance.token.address, chainId: balance.token.chainId }, + addressInput2: { address: currencyAddress, chainId }, }) }) } -// Resolves currency metadata from cache or by fetching from GraphQL +function getCurrencyFromCache( + token: Balance['token'], + currencyId: CurrencyId, +): { currency: Token | SolanaToken; tokenInfo: null } | null { + if (!token) { + return null + } + + const currencyAddress = currencyIdToAddress(currencyId) + const chainId = currencyIdToChain(currencyId) + + if (!chainId) { + return null + } + + const currency = isSVMChain(chainId) + ? new SolanaToken(chainId, currencyAddress, token.decimals, token.symbol, token.name) + : new Token(chainId, currencyAddress, token.decimals, token.symbol, token.name) + + return { currency, tokenInfo: null } +} + +async function fetchTokenCurrencyInfo( + chainId: UniverseChainId, + address: string, +): Promise | null> { + const searchToken = await fetchTokenByAddress({ + chainId, + address, + }) + + return searchToken ? searchTokenToCurrencyInfo(searchToken) : null +} + +// Resolves `CurrencyInfo` either from cache or via REST search async function resolveCurrency({ token, currencyId, - apolloClient, }: { token?: Balance['token'] currencyId: CurrencyId - apolloClient: ApolloClient -}): Promise<{ currency: Token; tokenInfo: ReturnType | null } | null> { +}): Promise<{ currency: Token | SolanaToken; tokenInfo: ReturnType | null } | null> { const log = createLogger(FILE_NAME, 'resolveCurrency', '[REST-ITBU]') + // Try cache first if (token) { - const currencyAddress = currencyIdToAddress(currencyId) - const chainId = currencyIdToChain(currencyId) as UniverseChainId - const currency = new Token(chainId, currencyAddress, token.decimals, token.symbol, token.name) - return { currency, tokenInfo: null } + const cached = getCurrencyFromCache(token, currencyId) + if (cached) { + return cached + } } - // For new tokens not in cache, fetch token metadata from GraphQL - // TODO(WALL-7215): migrate this to REST once we have a tokens endpoint - const tokenQuery = await apolloClient.query({ - query: GraphQLApi.TokenDocument, - variables: currencyIdToContractInput(currencyId), - fetchPolicy: 'cache-first', - }) + // For new tokens not in cache, fetch token metadata via REST search + const chainId = currencyIdToChain(currencyId) + const currencyAddress = currencyIdToAddress(currencyId) + + if (!chainId || !currencyAddress) { + log.error(new Error('Invalid currencyId in `resolveCurrency`'), { currencyId }) + return null + } - const tokenInfo = tokenQuery.data.token ? gqlTokenToCurrencyInfo(tokenQuery.data.token) : null + const tokenInfo = await fetchTokenCurrencyInfo(chainId, currencyAddress) if (tokenInfo?.currency.isToken) { - log.debug('Fetched token metadata from GraphQL', { + log.debug('Fetched Token via REST Search', { currencyId, currency: tokenInfo.currency, }) return { currency: tokenInfo.currency, tokenInfo } } else { - log.warn('Could not fetch token metadata, skipping asset', { currencyId }) + log.warn('Failed to fetch Token via REST search', { currencyId }) return null } } diff --git a/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/refetchRestQueriesViaOnchainOverrideVariantSaga.ts b/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/refetchRestQueriesViaOnchainOverrideVariantSaga.ts index ca42115f47a..06d15b5e6b1 100644 --- a/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/refetchRestQueriesViaOnchainOverrideVariantSaga.ts +++ b/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/refetchRestQueriesViaOnchainOverrideVariantSaga.ts @@ -147,12 +147,10 @@ export function mergeOnChainBalances( } export async function fetchAndMergeOnchainBalances({ - apolloClient, cachedPortfolio, accountAddress, currencyIds, }: { - apolloClient: ApolloClient cachedPortfolio: Portfolio accountAddress: string currencyIds: Set @@ -165,7 +163,6 @@ export async function fetchAndMergeOnchainBalances({ try { const onchainBalancesByCurrencyId = await fetchOnChainBalancesRest({ - apolloClient, cachedPortfolio, accountAddress, currencyIds, @@ -206,7 +203,8 @@ export function* refetchRestQueriesViaOnchainOverrideVariant({ }: { transaction: TransactionDetails activeAddress: string | null - apolloClient: ApolloClient + // Only pass `null` for Solana where we don't need to refetch GQL queries + apolloClient: ApolloClient | null }): Generator { const currenciesWithBalanceToUpdate = getCurrenciesToUpdate(transaction, activeAddress) @@ -243,7 +241,6 @@ export function* refetchRestQueriesViaOnchainOverrideVariant({ yield* all( portfolioQueriesToUpdate.map((query) => call(updatePortfolioCache, { - apolloClient, ownerAddress: activeAddress, currencyIds: currenciesWithBalanceToUpdate, queryKey: query.queryKey, @@ -255,7 +252,11 @@ export function* refetchRestQueriesViaOnchainOverrideVariant({ yield* delay(REFETCH_DELAY) // Once NFTs are migrated to REST we won't need to do this - yield* call([apolloClient, apolloClient.refetchQueries], { include: [GQLQueries.NftsTab] }) + if (apolloClient) { + yield* call([apolloClient, apolloClient.refetchQueries], { include: [GQLQueries.NftsTab] }) + } else { + log.debug(`Ignoring NFT GQL refetch for ${platform} because apolloClient is null`) + } // Invalidate all portfolio queries that match this address yield* call([SharedQueryClient, SharedQueryClient.invalidateQueries], { @@ -265,12 +266,10 @@ export function* refetchRestQueriesViaOnchainOverrideVariant({ } function* updatePortfolioCache({ - apolloClient, ownerAddress, currencyIds, queryKey, }: { - apolloClient: ApolloClient ownerAddress: string currencyIds: Set queryKey: readonly unknown[] @@ -286,7 +285,6 @@ function* updatePortfolioCache({ } const mergedData = yield* call(fetchAndMergeOnchainBalances, { - apolloClient, cachedPortfolio: cachedPortfolioData.portfolio, accountAddress: ownerAddress, currencyIds, diff --git a/packages/uniswap/src/features/providers/rpcUrlSelector.ts b/packages/uniswap/src/features/providers/rpcUrlSelector.ts index 2a55c4f0abd..ec69efbbdb5 100644 --- a/packages/uniswap/src/features/providers/rpcUrlSelector.ts +++ b/packages/uniswap/src/features/providers/rpcUrlSelector.ts @@ -1,7 +1,6 @@ +import { Experiments, getExperimentValue, PrivateRpcProperties } from '@universe/gating' import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import { RPCType, UniverseChainId } from 'uniswap/src/features/chains/types' -import { Experiments, PrivateRpcProperties } from 'uniswap/src/features/gating/experiments' -import { getExperimentValue } from 'uniswap/src/features/gating/hooks' import { DEFAULT_FLASHBOTS_ENABLED, FLASHBOTS_DEFAULT_REFUND_PERCENT, diff --git a/packages/uniswap/src/features/search/SearchHistoryResult.ts b/packages/uniswap/src/features/search/SearchHistoryResult.ts index c1bf7bb3b4e..7c26f6bde7f 100644 --- a/packages/uniswap/src/features/search/SearchHistoryResult.ts +++ b/packages/uniswap/src/features/search/SearchHistoryResult.ts @@ -1,7 +1,7 @@ /* * Represents the search result types that are saved in Redux. */ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { CurrencyId } from 'uniswap/src/types/currency' diff --git a/packages/uniswap/src/features/search/SearchModal/analytics/analytics.ts b/packages/uniswap/src/features/search/SearchModal/analytics/analytics.ts index f19b7f817d6..8af105061e1 100644 --- a/packages/uniswap/src/features/search/SearchModal/analytics/analytics.ts +++ b/packages/uniswap/src/features/search/SearchModal/analytics/analytics.ts @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { OnchainItemListOptionType, SearchModalOption } from 'uniswap/src/components/lists/items/types' import { extractDomain } from 'uniswap/src/components/lists/items/wallets/utils' import { OnchainItemSection, OnchainItemSectionName } from 'uniswap/src/components/lists/OnchainItemList/types' diff --git a/packages/uniswap/src/features/search/SearchModal/hooks/useFilterCallbacks.ts b/packages/uniswap/src/features/search/SearchModal/hooks/useFilterCallbacks.ts index 40b45cb94fa..b27037d22b3 100644 --- a/packages/uniswap/src/features/search/SearchModal/hooks/useFilterCallbacks.ts +++ b/packages/uniswap/src/features/search/SearchModal/hooks/useFilterCallbacks.ts @@ -1,10 +1,9 @@ -import { useCallback, useEffect, useState } from 'react' -import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' +import { useCallback, useEffect, useMemo, useState } from 'react' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { isTestnetChain } from 'uniswap/src/features/chains/utils' import { ModalNameType, WalletEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' +import { parseChainFromTokenSearchQuery } from 'uniswap/src/utils/search/parseChainFromTokenSearchQuery' export function useFilterCallbacks( chainId: UniverseChainId | null, @@ -19,9 +18,7 @@ export function useFilterCallbacks( onChangeText: (newSearchFilter: string) => void } { const [chainFilter, setChainFilter] = useState(chainId) - const [parsedChainFilter, setParsedChainFilter] = useState(null) const [searchFilter, setSearchFilter] = useState(null) - const [parsedSearchFilter, setParsedSearchFilter] = useState(null) const { chains: enabledChains } = useEnabledChains() @@ -29,44 +26,16 @@ export function useFilterCallbacks( // i.e "eth dai" or "dai eth" // parsedChainFilter: 1 // parsedSearchFilter: "dai" - useEffect(() => { - const sanitizedSearch = searchFilter?.trim().replace(' ', ' ') - const splitSearch = sanitizedSearch?.split(' ') - if (!splitSearch || splitSearch.length < 2) { - setParsedChainFilter(null) - setParsedSearchFilter(null) - return - } - - const firstWord = splitSearch[0]?.toLowerCase() - const lastWord = splitSearch[splitSearch.length - 1]?.toLowerCase() - - const firstWordChainMatch = firstWord ? getMatchingChainId(firstWord, enabledChains) : undefined - const lastWordChainMatch = lastWord ? getMatchingChainId(lastWord, enabledChains) : undefined - - if (!chainFilter && firstWordChainMatch) { - // First word is chain, rest is search term - const search = splitSearch.slice(1).join(' ') - if (search) { - setParsedChainFilter(firstWordChainMatch) - setParsedSearchFilter(search) - return + const { chainFilter: parsedChainFilter, searchTerm: parsedSearchFilter } = useMemo(() => { + // If there's already a chain filter set, don't parse chains from search text + if (chainFilter) { + return { + chainFilter: null, + searchTerm: null, } } - - if (!chainFilter && lastWordChainMatch && !firstWordChainMatch) { - // Last word is chain, preceding words are search term - const search = splitSearch.slice(0, -1).join(' ') - if (search) { - setParsedChainFilter(lastWordChainMatch) - setParsedSearchFilter(search) - return - } - } - - setParsedChainFilter(null) - setParsedSearchFilter(null) - }, [searchFilter, chainFilter, enabledChains]) + return parseChainFromTokenSearchQuery(searchFilter, enabledChains) + }, [chainFilter, searchFilter, enabledChains]) useEffect(() => { setChainFilter(chainId) @@ -99,38 +68,3 @@ export function useFilterCallbacks( onChangeText, } } - -/** - * Finds a matching chain ID based on the provided chain name. - * - * @param maybeChainName - The potential chain name to match against - * @param enabledChains - Array of enabled chain IDs to search within - * @returns The matching UniverseChainId or undefined if no match found - */ -const getMatchingChainId = (maybeChainName: string, enabledChains: UniverseChainId[]): UniverseChainId | undefined => { - const lowerCaseChainName = maybeChainName.toLowerCase() - - for (const chainId of enabledChains) { - if (isTestnetChain(chainId)) { - continue - } - - const chainInfo = getChainInfo(chainId) - - // Check against native currency name - const nativeCurrencyName = chainInfo.nativeCurrency.name.toLowerCase() - const firstWord = nativeCurrencyName.split(' ')[0] - - if (firstWord === lowerCaseChainName) { - return chainId - } - - // Check against interface name - const interfaceName = chainInfo.interfaceName.toLowerCase() - if (interfaceName === lowerCaseChainName) { - return chainId - } - } - - return undefined -} diff --git a/packages/uniswap/src/features/settings/hooks.test.ts b/packages/uniswap/src/features/settings/hooks.test.ts index b795e557ff8..0dc873ea549 100644 --- a/packages/uniswap/src/features/settings/hooks.test.ts +++ b/packages/uniswap/src/features/settings/hooks.test.ts @@ -12,7 +12,8 @@ jest.mock('utilities/src/platform', () => ({ ...jest.requireActual('utilities/src/platform'), })) -jest.mock('uniswap/src/features/gating/hooks', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), useFeatureFlag: jest.fn(), })) diff --git a/packages/uniswap/src/features/smartWallet/mismatch/MismatchContext.tsx b/packages/uniswap/src/features/smartWallet/mismatch/MismatchContext.tsx index 3f74fc4fe33..f6b554d433c 100644 --- a/packages/uniswap/src/features/smartWallet/mismatch/MismatchContext.tsx +++ b/packages/uniswap/src/features/smartWallet/mismatch/MismatchContext.tsx @@ -1,7 +1,6 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { createContext, PropsWithChildren, useContext, useMemo } from 'react' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { MismatchAccountEffects } from 'uniswap/src/features/smartWallet/mismatch/MismatchAccountEffects' import type { HasMismatchInput, diff --git a/packages/uniswap/src/features/telemetry/constants/trace/element.ts b/packages/uniswap/src/features/telemetry/constants/trace/element.ts index 963e10245e8..24d4fb4f760 100644 --- a/packages/uniswap/src/features/telemetry/constants/trace/element.ts +++ b/packages/uniswap/src/features/telemetry/constants/trace/element.ts @@ -22,6 +22,7 @@ export enum ElementName { AutorouterVisualizationRow = 'expandable-autorouter-visualization-row', BackButton = 'back-button', BlogLink = 'blog-link', + BridgedAssetsBannerV2 = 'bridged-assets-banner-v2', BridgedAssetTDPSection = 'bridged-asset-tdp-section', BridgeNativeTokenButton = 'bridge-native-token-button', Buy = 'buy', @@ -136,6 +137,7 @@ export enum ElementName { OpenNftsList = 'open-nfts-list', PoolsTableRow = 'pools-table-row', PoolOutOfSyncError = 'pool-out-of-sync-error', + PortfolioNftItem = 'portfolio-nft-item', PreselectAsset = 'preselect-asset', PresetPercentage = 'preset-percentage', PriceUpdateAcceptButton = 'price-update-accept-button', diff --git a/packages/uniswap/src/features/telemetry/constants/trace/section.ts b/packages/uniswap/src/features/telemetry/constants/trace/section.ts index 9a3a749134a..2629576f2d2 100644 --- a/packages/uniswap/src/features/telemetry/constants/trace/section.ts +++ b/packages/uniswap/src/features/telemetry/constants/trace/section.ts @@ -16,6 +16,7 @@ export enum SectionName { ProfileActivityTab = 'profile-activity-tab', ProfileNftsTab = 'profile-nfts-tab', ProfileTokensTab = 'profile-tokens-tab', + PortfolioNftsTab = 'portfolio-nfts-tab', SwapCurrencyInput = 'swap-currency-input', SwapCurrencyOutput = 'swap-currency-output', SwapForm = 'swap-form', diff --git a/packages/uniswap/src/features/telemetry/constants/uniswap.ts b/packages/uniswap/src/features/telemetry/constants/uniswap.ts index 86e3ed35218..b1d890932eb 100644 --- a/packages/uniswap/src/features/telemetry/constants/uniswap.ts +++ b/packages/uniswap/src/features/telemetry/constants/uniswap.ts @@ -1,9 +1,10 @@ export enum UniswapEventName { BalancesReport = 'Balances Report', BalancesReportPerChain = 'Balances Report Per Chain', - TokenSelected = 'Token Selected', - ConversionEventSubmitted = 'Conversion Event Submitted', BlockaidFeesMismatch = 'Blockaid Fees Mismatch', + ConversionEventSubmitted = 'Conversion Event Submitted', + DelegationDetected = 'Delegation Detected', + ExperimentQualifyingEvent = 'Experiment Qualifying Event', LowNetworkTokenInfoModalOpened = 'Low Network Token Info Modal Opened', LpIncentiveCollectRewardsButtonClicked = 'LP Incentive Collect Rewards Button Clicked', LpIncentiveCollectRewardsErrorThrown = 'LP Incentive Collect Rewards Error Thrown', @@ -11,7 +12,7 @@ export enum UniswapEventName { LpIncentiveCollectRewardsSuccess = 'LP Incentive Collect Rewards Success', LpIncentiveLearnMoreCtaClicked = 'LP Incentive Learn More CTA Clicked', SmartWalletMismatchDetected = 'Smart Wallet Mismatch Detected', + TokenSelected = 'Token Selected', TooltipOpened = 'Tooltip Opened', - DelegationDetected = 'Delegation Detected', // alphabetize additional values. } diff --git a/packages/uniswap/src/features/telemetry/types.ts b/packages/uniswap/src/features/telemetry/types.ts index f7cc90ada26..a712650d81c 100644 --- a/packages/uniswap/src/features/telemetry/types.ts +++ b/packages/uniswap/src/features/telemetry/types.ts @@ -7,6 +7,7 @@ import { SharedEventName } from '@uniswap/analytics-events' import { OnChainStatus } from '@uniswap/client-trading/dist/trading/v1/api_pb' import { Currency, TradeType } from '@uniswap/sdk-core' import { TradingApi, UnitagClaimContext } from '@universe/api' +import { Experiments } from '@universe/gating' import type { PresetPercentage } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/types' import { OnchainItemSectionName } from 'uniswap/src/components/lists/OnchainItemList/types' import { UniverseChainId } from 'uniswap/src/features/chains/types' @@ -909,6 +910,9 @@ export type UniverseEventProperties = { delegationAddress: string isActiveChain?: boolean } + [UniswapEventName.ExperimentQualifyingEvent]: { + experiment: Experiments + } [UniswapEventName.BalancesReport]: { total_balances_usd: number wallets: string[] diff --git a/packages/uniswap/src/features/telemetry/utils/logExperimentQualifyingEvent.ts b/packages/uniswap/src/features/telemetry/utils/logExperimentQualifyingEvent.ts new file mode 100644 index 00000000000..983d478aee4 --- /dev/null +++ b/packages/uniswap/src/features/telemetry/utils/logExperimentQualifyingEvent.ts @@ -0,0 +1,9 @@ +import { Experiments } from '@universe/gating' +import { UniswapEventName } from 'uniswap/src/features/telemetry/constants' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' + +export function logExperimentQualifyingEvent({ experiment }: { experiment: Experiments }): void { + sendAnalyticsEvent(UniswapEventName.ExperimentQualifyingEvent, { + experiment, + }) +} diff --git a/packages/uniswap/src/features/tokens/hooks/useBlockaidFeeComparisonAnalytics.ts b/packages/uniswap/src/features/tokens/hooks/useBlockaidFeeComparisonAnalytics.ts index 03957097909..54e01673dd8 100644 --- a/packages/uniswap/src/features/tokens/hooks/useBlockaidFeeComparisonAnalytics.ts +++ b/packages/uniswap/src/features/tokens/hooks/useBlockaidFeeComparisonAnalytics.ts @@ -1,8 +1,7 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useEffect, useRef } from 'react' import { getNativeAddress } from 'uniswap/src/constants/addresses' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { UniswapEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send.web' import { getTokenProtectionFeeOnTransfer } from 'uniswap/src/features/tokens/safetyUtils' diff --git a/packages/uniswap/src/features/transactions/components/DecimalPadInput/DecimalPad.native.tsx b/packages/uniswap/src/features/transactions/components/DecimalPadInput/DecimalPad.native.tsx index 162c20ab5ed..d94a881af3e 100644 --- a/packages/uniswap/src/features/transactions/components/DecimalPadInput/DecimalPad.native.tsx +++ b/packages/uniswap/src/features/transactions/components/DecimalPadInput/DecimalPad.native.tsx @@ -228,7 +228,7 @@ const KeyButton = memo(function KeyButton({ onPress?.(label, action) scale.value = withSequence(withTiming(1.3, animationOptions), withTiming(1, animationOptions)) opacity.value = withSequence(withTiming(0.75, animationOptions), withTiming(1, animationOptions)) - }, [action, label, onPress, opacity, scale]) + }, [action, label, onPress]) const handleLongPressStart = useCallback((): void => { onLongPressStart?.(label, action) diff --git a/packages/uniswap/src/features/transactions/components/settings/TransactionSettingsModal/TransactionSettingsModalContent/TransactionSettingsRow.tsx b/packages/uniswap/src/features/transactions/components/settings/TransactionSettingsModal/TransactionSettingsModalContent/TransactionSettingsRow.tsx index 7114bd77958..15d71a412e3 100644 --- a/packages/uniswap/src/features/transactions/components/settings/TransactionSettingsModal/TransactionSettingsModalContent/TransactionSettingsRow.tsx +++ b/packages/uniswap/src/features/transactions/components/settings/TransactionSettingsModal/TransactionSettingsModalContent/TransactionSettingsRow.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { PropsWithChildren, ReactNode, useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import { Flex, Text, TouchableArea } from 'ui/src' @@ -5,8 +6,6 @@ import { InfoCircleFilled } from 'ui/src/components/icons/InfoCircleFilled' import { RotatableChevron } from 'ui/src/components/icons/RotatableChevron' import { iconSizes } from 'ui/src/theme' import { InfoTooltip } from 'uniswap/src/components/tooltip/InfoTooltip' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import type { TransactionSettingConfig } from 'uniswap/src/features/transactions/components/settings/types' interface TransactionSettingRowProps { diff --git a/packages/uniswap/src/features/transactions/components/settings/settingsConfigurations/slippage/useSlippageSettings.ts b/packages/uniswap/src/features/transactions/components/settings/settingsConfigurations/slippage/useSlippageSettings.ts index 8362cfd13cd..b8640e896fb 100644 --- a/packages/uniswap/src/features/transactions/components/settings/settingsConfigurations/slippage/useSlippageSettings.ts +++ b/packages/uniswap/src/features/transactions/components/settings/settingsConfigurations/slippage/useSlippageSettings.ts @@ -152,7 +152,7 @@ export function useSlippageSettings(params?: SlippageSettingsProps): { setCustomSlippageTolerance(parsedValue) } }, - [updateInputWarning, saveOnBlur, inputShakeX, setCustomSlippageTolerance], + [updateInputWarning, saveOnBlur, setCustomSlippageTolerance], ) const onFocusSlippageInput = useCallback((): void => { diff --git a/packages/uniswap/src/features/transactions/components/settings/types.ts b/packages/uniswap/src/features/transactions/components/settings/types.ts index 06239c3491f..146767f0360 100644 --- a/packages/uniswap/src/features/transactions/components/settings/types.ts +++ b/packages/uniswap/src/features/transactions/components/settings/types.ts @@ -1,5 +1,5 @@ +import type { FeatureFlags } from '@universe/gating' import type { AppTFunction } from 'ui/src/i18n/types' -import type { FeatureFlags } from 'uniswap/src/features/gating/flags' import type { Platform } from 'uniswap/src/features/platforms/types/Platform' import type { FrontendSupportedProtocol } from 'uniswap/src/features/transactions/swap/utils/protocols' diff --git a/packages/uniswap/src/features/transactions/hooks/useGetCanSignPermits.ts b/packages/uniswap/src/features/transactions/hooks/useGetCanSignPermits.ts index 085c09ad749..70292374ffc 100644 --- a/packages/uniswap/src/features/transactions/hooks/useGetCanSignPermits.ts +++ b/packages/uniswap/src/features/transactions/hooks/useGetCanSignPermits.ts @@ -1,6 +1,5 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useHasAccountMismatchCallback } from 'uniswap/src/features/smartWallet/mismatch/hooks' import { useEvent } from 'utilities/src/react/hooks' diff --git a/packages/uniswap/src/features/transactions/hooks/useGetSwapDelegationAddress.ts b/packages/uniswap/src/features/transactions/hooks/useGetSwapDelegationAddress.ts index 296c287fa6f..24e77262eea 100644 --- a/packages/uniswap/src/features/transactions/hooks/useGetSwapDelegationAddress.ts +++ b/packages/uniswap/src/features/transactions/hooks/useGetSwapDelegationAddress.ts @@ -1,6 +1,5 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useEvent } from 'utilities/src/react/hooks' export function useGetSwapDelegationAddress(): (chainId: UniverseChainId | undefined) => string | undefined { diff --git a/packages/uniswap/src/features/transactions/hooks/usePollingIntervalByChain.ts b/packages/uniswap/src/features/transactions/hooks/usePollingIntervalByChain.ts index d9be83dd85d..0a750000644 100644 --- a/packages/uniswap/src/features/transactions/hooks/usePollingIntervalByChain.ts +++ b/packages/uniswap/src/features/transactions/hooks/usePollingIntervalByChain.ts @@ -1,8 +1,6 @@ +import { DynamicConfigs, FeatureFlags, SwapConfigKey, useDynamicConfigValue, useFeatureFlag } from '@universe/gating' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { isMainnetChainId } from 'uniswap/src/features/chains/utils' -import { DynamicConfigs, SwapConfigKey } from 'uniswap/src/features/gating/configs' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useDynamicConfigValue, useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ONE_SECOND_MS } from 'utilities/src/time/time' export const AVERAGE_L1_BLOCK_TIME_MS = 12 * ONE_SECOND_MS diff --git a/packages/uniswap/src/features/transactions/liquidity/types.ts b/packages/uniswap/src/features/transactions/liquidity/types.ts index ba9cf518a28..9ed54c94ef5 100644 --- a/packages/uniswap/src/features/transactions/liquidity/types.ts +++ b/packages/uniswap/src/features/transactions/liquidity/types.ts @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency, CurrencyAmount, Token } from '@uniswap/sdk-core' import { TradingApi } from '@universe/api' import { PermitTransaction, PermitTypedData } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' diff --git a/packages/uniswap/src/features/transactions/steps/types.ts b/packages/uniswap/src/features/transactions/steps/types.ts index 3e3d8b56e5a..6e5ee03bf76 100644 --- a/packages/uniswap/src/features/transactions/steps/types.ts +++ b/packages/uniswap/src/features/transactions/steps/types.ts @@ -1,13 +1,23 @@ +import type { TransactionResponse } from '@ethersproject/abstract-provider' import type { CollectFeesSteps } from 'uniswap/src/features/transactions/liquidity/steps/collectFeesSteps' import type { CollectLpIncentiveRewardsSteps } from 'uniswap/src/features/transactions/liquidity/steps/collectIncentiveRewardsSteps' import type { DecreaseLiquiditySteps } from 'uniswap/src/features/transactions/liquidity/steps/decreaseLiquiditySteps' import type { IncreaseLiquiditySteps } from 'uniswap/src/features/transactions/liquidity/steps/increaseLiquiditySteps' import type { MigrationSteps } from 'uniswap/src/features/transactions/liquidity/steps/migrationSteps' +import { TokenApprovalTransactionStep } from 'uniswap/src/features/transactions/steps/approve' import type { SignTypedDataStepFields } from 'uniswap/src/features/transactions/steps/permit2Signature' +import type { Permit2TransactionStep } from 'uniswap/src/features/transactions/steps/permit2Transaction' +import { TokenRevocationTransactionStep } from 'uniswap/src/features/transactions/steps/revoke' import { WrapTransactionStep } from 'uniswap/src/features/transactions/steps/wrap' +import { ExtractedBaseTradeAnalyticsProperties } from 'uniswap/src/features/transactions/swap/analytics' import type { ClassicSwapSteps } from 'uniswap/src/features/transactions/swap/steps/classicSteps' +import { SwapTransactionStep, SwapTransactionStepAsync } from 'uniswap/src/features/transactions/swap/steps/swap' import type { UniswapXSwapSteps } from 'uniswap/src/features/transactions/swap/steps/uniswapxSteps' +import { SetCurrentStepFn } from 'uniswap/src/features/transactions/swap/types/swapCallback' +import { BridgeTrade, ChainedActionTrade, ClassicTrade } from 'uniswap/src/features/transactions/swap/types/trade' +import { TransactionTypeInfo } from 'uniswap/src/features/transactions/types/transactionDetails' import type { ValidatedTransactionRequest } from 'uniswap/src/features/transactions/types/transactionRequests' +import { AccountDetails } from 'uniswap/src/features/wallet/types/AccountDetails' export enum TransactionStepType { TokenApprovalTransaction = 'TokenApproval', @@ -49,3 +59,42 @@ export interface OnChainTransactionFields { export interface OnChainTransactionFieldsBatched { batchedTxRequests: ValidatedTransactionRequest[] } + +export interface HandleOnChainStepParams { + account: AccountDetails + info: TransactionTypeInfo + step: T + setCurrentStep: SetCurrentStepFn + /** Controls whether the function allow submitting a duplicate tx (a tx w/ identical `info` to another recent/pending tx). Defaults to false. */ + allowDuplicativeTx?: boolean + /** Controls whether the function should throw an error upon interrupt or not, defaults to `false`. */ + ignoreInterrupt?: boolean + /** Controls whether the function should wait to return until after the transaction has confirmed. Defaults to `true`. */ + shouldWaitForConfirmation?: boolean + /** Called when data returned from a submitted transaction differs from data originally sent to the wallet. */ + onModification?: ( + response: Pick, + ) => void | Generator +} + +export interface HandleSignatureStepParams { + account: AccountDetails + step: T + setCurrentStep: SetCurrentStepFn + ignoreInterrupt?: boolean +} + +export type HandleApprovalStepParams = Omit< + HandleOnChainStepParams, + 'info' +> + +export type HandleOnChainPermit2TransactionStep = Omit, 'info'> + +export interface HandleSwapStepParams extends Omit { + step: SwapTransactionStep | SwapTransactionStepAsync + signature?: string + trade: ClassicTrade | BridgeTrade | ChainedActionTrade + analytics: ExtractedBaseTradeAnalyticsProperties + onTransactionHash?: (hash: string) => void +} diff --git a/packages/uniswap/src/features/transactions/swap/components/MaxSlippageRow/SlippageInfo/SlippageInfoCaption.tsx b/packages/uniswap/src/features/transactions/swap/components/MaxSlippageRow/SlippageInfo/SlippageInfoCaption.tsx index 1b27e9022c3..31bc13b6cf9 100644 --- a/packages/uniswap/src/features/transactions/swap/components/MaxSlippageRow/SlippageInfo/SlippageInfoCaption.tsx +++ b/packages/uniswap/src/features/transactions/swap/components/MaxSlippageRow/SlippageInfo/SlippageInfoCaption.tsx @@ -75,7 +75,7 @@ export function SlippageInfoCaption({ : t('swap.settings.slippage.output.message')}{' '} {isWebPlatform && ( - + )} diff --git a/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useSwapFormButtonText.ts b/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useSwapFormButtonText.ts index 37794aa417e..292ec06cc5f 100644 --- a/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useSwapFormButtonText.ts +++ b/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useSwapFormButtonText.ts @@ -1,8 +1,7 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useTranslation } from 'react-i18next' import { nativeOnChain } from 'uniswap/src/constants/tokens' import { useConnectionStatus } from 'uniswap/src/features/accounts/store/hooks' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { isSVMChain } from 'uniswap/src/features/platforms/utils/chains' import { useIsWebFORNudgeEnabled } from 'uniswap/src/features/providers/webForNudgeProvider' import { useTransactionModalContext } from 'uniswap/src/features/transactions/components/TransactionModal/TransactionModalContext' diff --git a/packages/uniswap/src/features/transactions/swap/components/SwapFormSettings/settingsConfigurations/TradeRoutingPreference/TradeRoutingPreferenceScreen.tsx b/packages/uniswap/src/features/transactions/swap/components/SwapFormSettings/settingsConfigurations/TradeRoutingPreference/TradeRoutingPreferenceScreen.tsx index 96b0727a14e..6a68c8df6a3 100644 --- a/packages/uniswap/src/features/transactions/swap/components/SwapFormSettings/settingsConfigurations/TradeRoutingPreference/TradeRoutingPreferenceScreen.tsx +++ b/packages/uniswap/src/features/transactions/swap/components/SwapFormSettings/settingsConfigurations/TradeRoutingPreference/TradeRoutingPreferenceScreen.tsx @@ -1,4 +1,5 @@ import { TradingApi } from '@universe/api' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import type { TFunction } from 'i18next' import type { ReactNode } from 'react' import { useCallback, useState } from 'react' @@ -16,11 +17,8 @@ import { InfoTooltip } from 'uniswap/src/components/tooltip/InfoTooltip' import WarningIcon from 'uniswap/src/components/warnings/WarningIcon' import { uniswapUrls } from 'uniswap/src/constants/urls' import { useUniswapContextSelector } from 'uniswap/src/contexts/UniswapContext' - import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' import { TransactionSettingsModalId } from 'uniswap/src/features/transactions/components/settings/stores/TransactionSettingsModalStore/createTransactionSettingsModalStore' diff --git a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/AnimatedTokenFlip.tsx b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/AnimatedTokenFlip.tsx index 13fca286d05..21aa4e2fdbf 100644 --- a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/AnimatedTokenFlip.tsx +++ b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/AnimatedTokenFlip.tsx @@ -23,7 +23,7 @@ export function AnimatedTokenFlip({ duration: 600, easing: Easing.bezier(0.68, -0.3, 0.265, 1.3), }) - }, [processingState, flipAnimation]) + }, [processingState]) const handleTokenClick = (): void => { setProcessingState((prev) => (prev === 'complete' ? 'processing' : 'complete')) diff --git a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/GradientContainer.native.tsx b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/GradientContainer.native.tsx index 3bc29963a45..f477b40bbbc 100644 --- a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/GradientContainer.native.tsx +++ b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/GradientContainer.native.tsx @@ -33,7 +33,7 @@ export function GradientContainer({ toTokenColor, children }: GradientContainerP blobT1.value = withRepeat(withTiming(1, cfg), -1, true) blobT2.value = withRepeat(withTiming(1, { ...cfg, duration: 16000 }), -1, true) blobT3.value = withRepeat(withTiming(1, { ...cfg, duration: 7000 }), -1, true) - }, [blobT1, blobT2, blobT3]) + }, []) const blob1 = useAnimatedStyle(() => { const innerT = blobT1.value * Math.PI * 2 diff --git a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/GradientContainer.web.tsx b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/GradientContainer.web.tsx index 91e0f69d8a7..dfe2d111a64 100644 --- a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/GradientContainer.web.tsx +++ b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/GradientContainer.web.tsx @@ -27,7 +27,7 @@ export function GradientContainer({ toTokenColor, children }: GradientContainerP blobT1.value = withRepeat(withTiming(1, cfg), -1, true) blobT2.value = withRepeat(withTiming(1, { ...cfg, duration: 16000 }), -1, true) blobT3.value = withRepeat(withTiming(1, { ...cfg, duration: 7000 }), -1, true) - }, [blobT1, blobT2, blobT3]) + }, []) const blob1 = useAnimatedStyle(() => { const innerT = blobT1.value * Math.PI * 2 diff --git a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/hooks/receiptFetching/useReceiptSuccessHandler.ts b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/hooks/receiptFetching/useReceiptSuccessHandler.ts index df86321ffe6..ff2f988a4f3 100644 --- a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/hooks/receiptFetching/useReceiptSuccessHandler.ts +++ b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/hooks/receiptFetching/useReceiptSuccessHandler.ts @@ -3,9 +3,10 @@ import { JsonRpcProvider, TransactionReceipt } from '@ethersproject/providers' import { useCallback } from 'react' import { useDispatch } from 'react-redux' import { useTransactionModalContext } from 'uniswap/src/features/transactions/components/TransactionModal/TransactionModalContext' -import { updateTransaction } from 'uniswap/src/features/transactions/slice' +import { updateTransactionWithoutWatch } from 'uniswap/src/features/transactions/slice' import { getOutputAmountUsingSwapLogAndFormData } from 'uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/getOutputAmountFromSwapLogAndFormData.ts/getOutputAmountFromSwapLogAndFormData' import { + logSwapTransactionCompleted, NO_OUTPUT_ERROR, reportOutputAmount, } from 'uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/hooks/receiptFetching/utils' @@ -75,16 +76,19 @@ export function useReceiptSuccessHandler(): (params: ReceiptSuccessParams) => Pr // updates if the tx is successful so we know to fallback to the form value updateSwapForm({ instantReceiptFetchTime: methodFetchTime - methodRoundtripTime }) - // TODO(APPS-8546): move to a saga to avoid anti-pattern + // TODO(SWAP-407): move to a saga to avoid anti-pattern const parsedReceipt = receiptFromEthersReceipt(receipt, methodFetchTime) - dispatch( - updateTransaction({ - ...transaction, - receipt: parsedReceipt, - status: TransactionStatus.Success, - ...(isWebApp && { isFlashblockTxWithinThreshold }), - }), - ) + + const updatedTransaction = { + ...transaction, + receipt: parsedReceipt, + status: TransactionStatus.Success, + ...(isWebApp && { isFlashblockTxWithinThreshold }), + } + + dispatch(updateTransactionWithoutWatch(updatedTransaction)) + + logSwapTransactionCompleted(updatedTransaction) // Try to get output amount from transfer logs first const outputAmountFromOutputTransferLog = getOutputAmountUsingOutputTransferLog({ diff --git a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/hooks/receiptFetching/utils.ts b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/hooks/receiptFetching/utils.ts index 13e4794ad3d..fe449760247 100644 --- a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/hooks/receiptFetching/utils.ts +++ b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/hooks/receiptFetching/utils.ts @@ -1,6 +1,13 @@ import { BigNumber } from '@ethersproject/bignumber' +import { TradeType } from '@uniswap/sdk-core' +import { SwapEventName } from 'uniswap/src/features/telemetry/constants' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { TransactionScreen } from 'uniswap/src/features/transactions/components/TransactionModal/TransactionModalContext' +import { getRouteAnalyticsData, tradeRoutingToFillType } from 'uniswap/src/features/transactions/swap/analytics' import { SwapFormState } from 'uniswap/src/features/transactions/swap/stores/swapFormStore/types' +import { SwapEventType, timestampTracker } from 'uniswap/src/features/transactions/swap/utils/SwapEventTimestampTracker' +import { TransactionDetails, TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails' +import { isWebApp } from 'utilities/src/platform' export const NO_OUTPUT_ERROR = 'No output amount found in receipt logs' @@ -43,3 +50,74 @@ export function resetSwapFormAndReturnToForm({ updateSwapForm, setScreen }: Rese }) setScreen(TransactionScreen.Form) } + +/** + * TODO(SWAP-407): do NOT copy this logic when moving to a saga; we should restore the original watcher+logging logic once we make the switch + * Logs swap transaction completion analytics for web app + */ +export function logSwapTransactionCompleted(updatedTransaction: TransactionDetails): void { + if (updatedTransaction.typeInfo.type !== TransactionType.Swap || !updatedTransaction.hash || !isWebApp) { + return + } + + const { hash, chainId, addedTime, from, typeInfo, transactionOriginType, routing, id, receipt } = updatedTransaction + const gasUsed = receipt?.gasUsed + const effectiveGasPrice = receipt?.effectiveGasPrice + const confirmedTime = receipt?.confirmedTime + const includesDelegation = 'options' in updatedTransaction ? updatedTransaction.options.includesDelegation : undefined + const isSmartWalletTransaction = + 'options' in updatedTransaction ? updatedTransaction.options.isSmartWalletTransaction : undefined + + const { + quoteId, + gasUseEstimate, + inputCurrencyId, + outputCurrencyId, + transactedUSDValue, + tradeType, + slippageTolerance, + routeString, + protocol, + simulationFailureReasons, + } = typeInfo + + const baseProperties = { + routing: tradeRoutingToFillType({ routing, indicative: false }), + id, + hash, + transactionOriginType, + address: from, + chain_id: chainId, + added_time: addedTime, + confirmed_time: confirmedTime, + gas_used: gasUsed, + effective_gas_price: effectiveGasPrice, + inputCurrencyId, + outputCurrencyId, + gasUseEstimate, + quoteId, + submitViaPrivateRpc: + 'options' in updatedTransaction ? (updatedTransaction.options.submitViaPrivateRpc ?? false) : undefined, + transactedUSDValue, + tradeType: tradeType === TradeType.EXACT_INPUT ? 'EXACT_INPUT' : 'EXACT_OUTPUT', + slippageTolerance, + route: routeString, + protocol, + simulation_failure_reasons: simulationFailureReasons, + includes_delegation: includesDelegation, + is_smart_wallet_transaction: isSmartWalletTransaction, + ...getRouteAnalyticsData(updatedTransaction), + } + + // Log swap success with time-to-swap tracking + const hasSetSwapSuccess = timestampTracker.hasTimestamp(SwapEventType.FirstSwapSuccess) + const elapsedTime = timestampTracker.setElapsedTime(SwapEventType.FirstSwapSuccess) + + sendAnalyticsEvent(SwapEventName.SwapTransactionCompleted, { + ...baseProperties, + time_to_swap: hasSetSwapSuccess ? undefined : elapsedTime, + time_to_swap_since_first_input: hasSetSwapSuccess + ? undefined + : timestampTracker.getElapsedTime(SwapEventType.FirstSwapSuccess, SwapEventType.FirstSwapAction), + }) +} diff --git a/packages/uniswap/src/features/transactions/swap/form/SwapFormScreen/SwapFormDecimalPad/SwapFormDecimalPad.native.tsx b/packages/uniswap/src/features/transactions/swap/form/SwapFormScreen/SwapFormDecimalPad/SwapFormDecimalPad.native.tsx index db1ca5bebbb..b766c8c4cd8 100644 --- a/packages/uniswap/src/features/transactions/swap/form/SwapFormScreen/SwapFormDecimalPad/SwapFormDecimalPad.native.tsx +++ b/packages/uniswap/src/features/transactions/swap/form/SwapFormScreen/SwapFormDecimalPad/SwapFormDecimalPad.native.tsx @@ -1,10 +1,16 @@ import type { MutableRefObject, RefObject } from 'react' -import { useMemo, useState } from 'react' +import { useCallback, useMemo, useState } from 'react' import type { LayoutChangeEvent, TextInputProps } from 'react-native' import { type ButtonProps, Flex, type FlexProps } from 'ui/src' -import { AmountInputPresets } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/AmountInputPresets' +import { + AmountInputPresets, + PRESET_BUTTON_PROPS, +} from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/AmountInputPresets' +import { PresetAmountButton } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/PresetAmountButton' import type { PresetPercentage } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/types' +import { PRESET_PERCENTAGES } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/utils' import { MAX_FIAT_INPUT_DECIMALS } from 'uniswap/src/constants/transactions' +import { ElementName } from 'uniswap/src/features/telemetry/constants' import type { DecimalPadInputRef } from 'uniswap/src/features/transactions/components/DecimalPadInput/DecimalPadInput' import { DecimalPadCalculatedSpaceId, @@ -122,6 +128,21 @@ function SwapFormDecimalPadContent({ setAdditionalElementsHeight(event.nativeEvent.layout.height) }) + const renderPreset = useCallback( + (preset: PresetPercentage) => ( + + ), + [currencyAmounts[CurrencyField.INPUT], currencyBalances[CurrencyField.INPUT], onSetPresetValue], + ) + return ( <> )} diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useIsForFiltersEnabled.ts b/packages/uniswap/src/features/transactions/swap/hooks/useIsForFiltersEnabled.ts index a0c81fe6965..34b8e52f31c 100644 --- a/packages/uniswap/src/features/transactions/swap/hooks/useIsForFiltersEnabled.ts +++ b/packages/uniswap/src/features/transactions/swap/hooks/useIsForFiltersEnabled.ts @@ -1,5 +1,4 @@ -import { Experiments, ForFiltersProperties } from 'uniswap/src/features/gating/experiments' -import { useExperimentValue } from 'uniswap/src/features/gating/hooks' +import { Experiments, ForFiltersProperties, useExperimentValue } from '@universe/gating' /** * Hook to determine if ForFilters feature should be enabled diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useIsUnichainFlashblocksEnabled.ts b/packages/uniswap/src/features/transactions/swap/hooks/useIsUnichainFlashblocksEnabled.ts index f222c7b8e74..aa88f876b33 100644 --- a/packages/uniswap/src/features/transactions/swap/hooks/useIsUnichainFlashblocksEnabled.ts +++ b/packages/uniswap/src/features/transactions/swap/hooks/useIsUnichainFlashblocksEnabled.ts @@ -1,24 +1,56 @@ -import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { Experiments, Layers, UnichainFlashblocksProperties } from 'uniswap/src/features/gating/experiments' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' +import { TradingApi } from '@universe/api' import { + Experiments, + FeatureFlags, getExperimentValueFromLayer, getFeatureFlag, + Layers, + UnichainFlashblocksProperties, useExperimentValueFromLayer, useFeatureFlag, -} from 'uniswap/src/features/gating/hooks' +} from '@universe/gating' +import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { shouldShowFlashblocksUI } from 'uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/utils' import { isWebApp } from 'utilities/src/platform' /** - * Hook to determine if Unichain flashblocks feature should be enabled + * Core logic to determine if Flashblocks modal should be enabled. * Returns true only when: * 1. The UnichainFlashblocks feature flag is enabled - * 2. The UnichainFlashblocksModal experiment is enabled (via SwapPage layer) - only on interface - * 3. The current chain is Unichain mainnet or Unichain sepolia + * 2. The user is allocated to the UnichainFlashblocksModal experiment in the SwapPage layer (web only) + * 3. The flashblocksModalEnabled parameter is true for that experiment + * 4. The current chain is Unichain mainnet or Unichain sepolia + */ +function isFlashblocksModalEnabledForChain({ + flashblocksFlagEnabled, + flashblocksModalEnabled, + chainId, +}: { + flashblocksFlagEnabled: boolean + flashblocksModalEnabled: boolean + chainId?: UniverseChainId +}): boolean { + // Check feature flag on all platforms + if (!flashblocksFlagEnabled) { + return false + } + + // Only check experiment on the web app + if (isWebApp && !flashblocksModalEnabled) { + return false + } + + return chainId === UniverseChainId.Unichain || chainId === UniverseChainId.UnichainSepolia +} + +/** + * Hook to determine if the Flashblocks modal should be enabled. + * Uses React hooks to read feature flags and experiments. */ export function useIsUnichainFlashblocksEnabled(chainId?: UniverseChainId): boolean { - const flashblocksFlag = useFeatureFlag(FeatureFlags.UnichainFlashblocks) - const flashblocksExperiment = useExperimentValueFromLayer< + const flashblocksFlagEnabled = useFeatureFlag(FeatureFlags.UnichainFlashblocks) + + const flashblocksModalEnabled = useExperimentValueFromLayer< Layers.SwapPage, Experiments.UnichainFlashblocksModal, boolean @@ -28,29 +60,17 @@ export function useIsUnichainFlashblocksEnabled(chainId?: UniverseChainId): bool defaultValue: false, }) - // Check feature flag on all platforms - if (!flashblocksFlag) { - return false - } - - // Only check experiment on interface platform - if (isWebApp && !flashblocksExperiment) { - return false - } - - return chainId === UniverseChainId.Unichain || chainId === UniverseChainId.UnichainSepolia + return isFlashblocksModalEnabledForChain({ flashblocksFlagEnabled, flashblocksModalEnabled, chainId }) } /** - * Sync function to check if Unichain flashblocks feature is enabled - * Returns true only when: - * 1. The UnichainFlashblocks feature flag is enabled - * 2. The UnichainFlashblocksModal experiment is enabled (via SwapPage layer) - only on interface - * 3. The current chain is Unichain mainnet or Unichain sepolia + * Sync function to determine if the Flashblocks modal should be enabled. + * Uses direct getters to read feature flags and experiments. */ export function getIsFlashblocksEnabled(chainId?: UniverseChainId): boolean { - const flashblocksFlag = getFeatureFlag(FeatureFlags.UnichainFlashblocks) - const flashblocksExperiment = getExperimentValueFromLayer< + const flashblocksFlagEnabled = getFeatureFlag(FeatureFlags.UnichainFlashblocks) + + const flashblocksModalEnabled = getExperimentValueFromLayer< Layers.SwapPage, Experiments.UnichainFlashblocksModal, boolean @@ -60,15 +80,56 @@ export function getIsFlashblocksEnabled(chainId?: UniverseChainId): boolean { defaultValue: false, }) - // Check feature flag on all platforms - if (!flashblocksFlag) { - return false + return isFlashblocksModalEnabledForChain({ flashblocksFlagEnabled, flashblocksModalEnabled, chainId }) +} + +export function getFlashblocksExperimentStatus({ + chainId, + routing, +}: { + chainId?: UniverseChainId + routing?: TradingApi.Routing +}): { + /** Whether to log a qualifying event (swap is eligible) */ + shouldLogQualifyingEvent: boolean + /** Whether to show the flashblocks modal (treatment variant) */ + shouldShowModal: boolean +} { + // Skip routes are not part of the experiment + if (!shouldShowFlashblocksUI(routing)) { + return { shouldLogQualifyingEvent: false, shouldShowModal: false } } - // Only check experiment on interface platform - if (isWebApp && !flashblocksExperiment) { - return false + const flashblocksFlagEnabled = getFeatureFlag(FeatureFlags.UnichainFlashblocks) + const isUnichainChain = chainId === UniverseChainId.Unichain || chainId === UniverseChainId.UnichainSepolia + + if (!flashblocksFlagEnabled || !isUnichainChain) { + return { shouldLogQualifyingEvent: false, shouldShowModal: false } } - return chainId === UniverseChainId.Unichain || chainId === UniverseChainId.UnichainSepolia + // Mobile/Extension: no experiment, feature flag controls behavior + if (!isWebApp) { + return { shouldLogQualifyingEvent: false, shouldShowModal: true } + } + + // Web: experiment controls behavior + const flashblocksModalEnabled = getExperimentValueFromLayer< + Layers.SwapPage, + Experiments.UnichainFlashblocksModal, + boolean + >({ + layerName: Layers.SwapPage, + param: UnichainFlashblocksProperties.FlashblocksModalEnabled, + defaultValue: false, + }) + + return { + // TRUE for all users that reach this point, even if they're not part of the experiment. + // Statsig will later filter out non-allocated users because it applies the auto-exposure filter first, + // and then filters by users that triggered this event *after* being exposed to the experiment. + // More info: https://docs.statsig.com/statsig-warehouse-native/configuration/qualifying-events + shouldLogQualifyingEvent: true, + // TRUE for treatment variant or forced override + shouldShowModal: flashblocksModalEnabled === true, + } } diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useNeedsBridgedAssetWarning.ts b/packages/uniswap/src/features/transactions/swap/hooks/useNeedsBridgedAssetWarning.ts index 1738fa4984d..9569aea3b84 100644 --- a/packages/uniswap/src/features/transactions/swap/hooks/useNeedsBridgedAssetWarning.ts +++ b/packages/uniswap/src/features/transactions/swap/hooks/useNeedsBridgedAssetWarning.ts @@ -1,5 +1,4 @@ import { useMemo } from 'react' -import { checkIsBridgedAsset } from 'uniswap/src/components/BridgedAsset/utils' import { TradeableAsset } from 'uniswap/src/entities/assets' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' import { useDismissedBridgedAssetWarnings } from 'uniswap/src/features/tokens/slice/hooks' @@ -38,19 +37,14 @@ export function useNeedsBridgedAssetWarning( outputCurrencyId && prefilledCurrencies?.some((currency) => currencyId(currency).toLowerCase() === outputCurrencyId.toLowerCase()) - if ( - inputCurrencyInfo && - !inputTokenWarningPreviouslyDismissed && - isInputPrefilled && - checkIsBridgedAsset(inputCurrencyInfo) - ) { + if (inputCurrencyInfo && !inputTokenWarningPreviouslyDismissed && isInputPrefilled && inputCurrencyInfo.isBridged) { tokens.push(inputCurrencyInfo) } if ( outputCurrencyInfo && !outputTokenWarningPreviouslyDismissed && isOutputPrefilled && - checkIsBridgedAsset(outputCurrencyInfo) + outputCurrencyInfo.isBridged ) { tokens.push(outputCurrencyInfo) } diff --git a/packages/uniswap/src/features/transactions/swap/hooks/usePriceUXEnabled.ts b/packages/uniswap/src/features/transactions/swap/hooks/usePriceUXEnabled.ts index a6ae0d406b3..cd339b827d5 100644 --- a/packages/uniswap/src/features/transactions/swap/hooks/usePriceUXEnabled.ts +++ b/packages/uniswap/src/features/transactions/swap/hooks/usePriceUXEnabled.ts @@ -1,5 +1,4 @@ -import { Experiments, Layers, PriceUxUpdateProperties } from 'uniswap/src/features/gating/experiments' -import { useExperimentValueFromLayer } from 'uniswap/src/features/gating/hooks' +import { Experiments, Layers, PriceUxUpdateProperties, useExperimentValueFromLayer } from '@universe/gating' export function usePriceUXEnabled(): boolean { const expValueFromLayer = useExperimentValueFromLayer({ diff --git a/packages/uniswap/src/features/transactions/swap/plan/planSaga.ts b/packages/uniswap/src/features/transactions/swap/plan/planSaga.ts new file mode 100644 index 00000000000..c3c8351dbcf --- /dev/null +++ b/packages/uniswap/src/features/transactions/swap/plan/planSaga.ts @@ -0,0 +1,243 @@ +import { Currency, CurrencyAmount } from '@uniswap/sdk-core' +import { PlanStepStatus, TradingApi } from '@universe/api' +import { call, delay, SagaGenerator } from 'typed-redux-saga' +import { TradingApiClient } from 'uniswap/src/data/apiClients/tradingApi/TradingApiClient' +import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' +import { UnexpectedTransactionStateError } from 'uniswap/src/features/transactions/errors' +import type { + HandleApprovalStepParams, + HandleSignatureStepParams, + HandleSwapStepParams, +} from 'uniswap/src/features/transactions/steps/types' +import { TransactionStep, TransactionStepType } from 'uniswap/src/features/transactions/steps/types' +import { ExtractedBaseTradeAnalyticsProperties } from 'uniswap/src/features/transactions/swap/analytics' +import { TransactionAndPlanStep, transformSteps } from 'uniswap/src/features/transactions/swap/plan/planStepTransformer' +import { findFirstActionableStep, stepHasFinalized } from 'uniswap/src/features/transactions/swap/plan/utils' +import { SetCurrentStepFn } from 'uniswap/src/features/transactions/swap/types/swapCallback' +import { ValidatedSwapTxContext } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' +import { isChained, requireRouting } from 'uniswap/src/features/transactions/swap/utils/routing' +import { SignerMnemonicAccountDetails } from 'uniswap/src/features/wallet/types/AccountDetails' +import { createSaga } from 'uniswap/src/utils/saga' +import { logger } from 'utilities/src/logger/logger' + +type SwapParams = { + selectChain: (chainId: number) => Promise + startChainId?: number + account: SignerMnemonicAccountDetails + analytics: ExtractedBaseTradeAnalyticsProperties + swapTxContext: ValidatedSwapTxContext + setCurrentStep: SetCurrentStepFn + setSteps: (steps: TransactionStep[]) => void + getOnPressRetry: (error: Error | undefined) => (() => void) | undefined + disableOneClickSwap: () => void + onSuccess: () => void + onFailure: (error?: Error, onPressRetry?: () => void) => void + onTransactionHash?: (hash: string) => void + v4Enabled: boolean +} + +type PlanCalls = { + handleApprovalTransactionStep: (params: HandleApprovalStepParams) => SagaGenerator + handleSwapTransactionStep: (params: HandleSwapStepParams) => SagaGenerator + handleSignatureStep: (params: HandleSignatureStepParams) => SagaGenerator + getDisplayableError: ({ + error, + step, + flow, + }: { + error: Error + step?: TransactionStep + flow?: string + }) => Error | undefined +} + +const MAX_ATTEMPTS = 60 + +/** + * Waits for a the target step to complete by polling the plan for the given planId and targetStepId. + * + * @returns The updated steps or no steps + */ +function* waitForStepCompletion(params: { + chainId: number + tradeId: string + targetStepId: string + currentStepIndex: number + inputAmount: CurrencyAmount +}): SagaGenerator { + const { chainId, tradeId, targetStepId, currentStepIndex, inputAmount } = params + + const pollingInterval = getChainInfo(chainId).tradingApiPollingIntervalMs + let attempt = 0 + + try { + while (attempt < MAX_ATTEMPTS) { + logger.debug('planSaga', 'waitForStepCompletion', 'waiting for step completion', { + currentStepIndex, + attempt, + maxAttempts: MAX_ATTEMPTS, + }) + + const tradeStatusResponse = yield* call(TradingApiClient.getExistingTrade, { tradeId }) + const latestTargetStep = tradeStatusResponse.steps.find((_step) => _step.stepId === targetStepId) + if (!latestTargetStep) { + throw new Error(`Target stepId=${targetStepId} not found in latest plan.`) + } + if (stepHasFinalized(latestTargetStep)) { + return transformSteps(tradeStatusResponse.steps, inputAmount) + } + attempt++ + yield* delay(pollingInterval) + } + throw new Error(`Exceeded ${MAX_ATTEMPTS} attempts waiting for step completion`) + } catch (error) { + logger.error(error, { tags: { file: 'planSaga', function: 'waitForStepCompletion' } }) + throw error + } +} + +/** + * Saga for executing a plan returned from the Trading API. This plan + * includes a list of steps to be executed in sequence in order to execute + * various actions such as a signature, approval, or swap. + * + * If a inputTradeId exists, it will use that existing plan and refresh the + * plan before beginning execution. As steps are executed, the proofs are sent + * to the TAPI to update the plan. As the steps are executed, the plan continues + * to execute the next step until all last step is confirmed. + */ +function* plan(params: SwapParams & PlanCalls) { + const { + account, + setCurrentStep, + setSteps, + swapTxContext, + analytics, + onSuccess, + onFailure, + selectChain, + handleApprovalTransactionStep, + handleSwapTransactionStep, + handleSignatureStep, + getDisplayableError, + } = params + + logger.debug('planSaga', 'plan', '🚨 plan saga started', swapTxContext) + if (!isChained(swapTxContext)) { + onFailure(new Error('Route not enabled for the plan saga')) + return + } + + const { trade, tradeId: inputTradeId } = swapTxContext + + let response + if (!inputTradeId) { + response = yield* call(TradingApiClient.fetchNewTrade, { + quote: swapTxContext.trade.quote.quote, + }) + } else { + response = yield* call(TradingApiClient.updateExistingTrade, { tradeId: inputTradeId, steps: [] }) + } + let steps: TransactionAndPlanStep[] = transformSteps(response.steps, swapTxContext.trade.inputAmount) + const tradeId = response.tradeId + + let currentStepIndex = steps.findIndex((step) => step.status !== PlanStepStatus.COMPLETE) + let currentStep = steps[currentStepIndex] + setSteps(steps) + if (currentStep) { + setCurrentStep({ step: currentStep, accepted: false }) + } + + try { + while (currentStepIndex < steps.length) { + let signature: string | undefined + let hash: string | undefined + + currentStep = steps[currentStepIndex] + const isLastStep = currentStepIndex === steps.length - 1 + + logger.debug('planSaga', 'plan', '🚨 Starting step', currentStep) + + // @ts-expect-error TODO: SWAP-458 - Temporary fix for chainId until fromChainId is finalized + const swapChainId = currentStep?.chainId || currentStep?.fromChainId || currentStep?.txRequest?.chainId + if (swapChainId) { + yield* call(selectChain, swapChainId) + } + + switch (currentStep?.type) { + case TransactionStepType.TokenRevocationTransaction: + case TransactionStepType.TokenApprovalTransaction: { + hash = yield* call(handleApprovalTransactionStep, { account, step: currentStep, setCurrentStep }) + break + } + case TransactionStepType.Permit2Signature: { + signature = yield* call(handleSignatureStep, { account, step: currentStep, setCurrentStep }) + break + } + case TransactionStepType.SwapTransaction: + case TransactionStepType.SwapTransactionAsync: { + requireRouting(trade, [TradingApi.Routing.CLASSIC, TradingApi.Routing.BRIDGE, TradingApi.Routing.CHAINED]) + hash = yield* call(handleSwapTransactionStep, { + account, + signature, + step: currentStep, + setCurrentStep, + trade, + analytics, + allowDuplicativeTx: true, + }) + break + } + default: { + throw new UnexpectedTransactionStateError(`Unexpected step type: ${currentStep?.type}`) + } + } + + if (hash || signature) { + logger.debug('planSaga', 'plan', '🚨 updating existing trade', tradeId, hash, signature) + yield* call(TradingApiClient.updateExistingTrade, { + tradeId, + steps: [{ stepId: currentStep.stepId, proof: { txHash: hash, signature } }], + }) + } else { + throw new Error('No hash or signature found.') + } + + if (isLastStep) { + yield* call(onSuccess) + return + } + + const updatedSteps: TransactionAndPlanStep[] = yield* call(waitForStepCompletion, { + chainId: swapChainId, + tradeId, + targetStepId: currentStep.stepId, + currentStepIndex, + inputAmount: swapTxContext.trade.inputAmount, + }) + logger.debug('planSaga', 'plan', '🚨 updated steps', updatedSteps) + const nextStep = findFirstActionableStep(updatedSteps) + if (nextStep) { + steps = updatedSteps + setSteps(steps) + setCurrentStep({ step: nextStep, accepted: false }) + currentStepIndex = steps.findIndex((s) => s.stepId === nextStep.stepId) + } else { + throw new Error('No next step found') + } + } + } catch (error) { + const displayableError = getDisplayableError({ + error: error instanceof Error ? error : new Error('Unknown error'), + step: currentStep, + }) + if (displayableError) { + logger.error(displayableError, { tags: { file: 'planSaga', function: 'plan' } }) + } + const onPressRetry = params.getOnPressRetry(displayableError) + onFailure(displayableError, onPressRetry) + return + } +} + +export const planSaga = createSaga(plan, 'planSaga') diff --git a/packages/uniswap/src/features/transactions/swap/plan/planStepTransformer.ts b/packages/uniswap/src/features/transactions/swap/plan/planStepTransformer.ts new file mode 100644 index 00000000000..a9b1a620b78 --- /dev/null +++ b/packages/uniswap/src/features/transactions/swap/plan/planStepTransformer.ts @@ -0,0 +1,62 @@ +import { Currency, CurrencyAmount } from '@uniswap/sdk-core' +import { Method, PlanStep } from '@universe/api' +import { createApprovalTransactionStep } from 'uniswap/src/features/transactions/steps/approve' +import { createPermit2SignatureStep } from 'uniswap/src/features/transactions/steps/permit2Signature' +import { TransactionStep } from 'uniswap/src/features/transactions/steps/types' +import { createSwapTransactionStep } from 'uniswap/src/features/transactions/swap/steps/swap' +import { + validatePermitTypeGuard, + validateTransactionRequestTypeGuard, +} from 'uniswap/src/features/transactions/swap/utils/trade' + +const ERC20_APPROVE_TX_PREFIX = '0x095ea7b3' + +export type TransactionAndPlanStep = TransactionStep & PlanStep + +export const transformStep = ( + step: PlanStep, + inputAmount: CurrencyAmount, +): TransactionAndPlanStep | undefined => { + switch (step.method) { + case Method.SIGN_MSG: + if (!validatePermitTypeGuard(step.payload)) { + return undefined + } + return { + ...step, + ...createPermit2SignatureStep(step.payload, inputAmount.currency), + } + case Method.SEND_TX: + if (!validateTransactionRequestTypeGuard(step.payload)) { + return undefined + } + if (step.payload.data?.toString().startsWith(ERC20_APPROVE_TX_PREFIX)) { + const approvalStep = createApprovalTransactionStep({ + txRequest: step.payload, + amountIn: inputAmount, + }) + if (!approvalStep) { + return undefined + } + return { + ...step, + ...approvalStep, + } + } else { + return { + ...step, + ...createSwapTransactionStep(step.payload), + } + } + // TODO: SWAP-433 - Handle send smart wallet transactions + case Method.SEND_CALLS: + default: + return undefined + } +} + +export const transformSteps = (steps: PlanStep[], inputAmount: CurrencyAmount): TransactionAndPlanStep[] => { + return steps + .map((step) => transformStep(step, inputAmount)) + .filter((step): step is TransactionAndPlanStep => step !== undefined) +} diff --git a/packages/uniswap/src/features/transactions/swap/plan/utils.ts b/packages/uniswap/src/features/transactions/swap/plan/utils.ts new file mode 100644 index 00000000000..967bcb6ba6a --- /dev/null +++ b/packages/uniswap/src/features/transactions/swap/plan/utils.ts @@ -0,0 +1,35 @@ +import { PlanStep, PlanStepStatus } from '@universe/api' +import { TransactionAndPlanStep } from 'uniswap/src/features/transactions/swap/plan/planStepTransformer' +import { ValidatedSwapTxContext } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' +import { isJupiter } from 'uniswap/src/features/transactions/swap/utils/routing' + +/** Switches to the proper chain, if needed. If a chain switch is necessary and it fails, returns success=false. */ +export async function handleSwitchChains(params: { + selectChain: (chainId: number) => Promise + startChainId?: number + swapTxContext: ValidatedSwapTxContext +}): Promise<{ chainSwitchFailed: boolean }> { + const { selectChain, startChainId, swapTxContext } = params + + const swapChainId = swapTxContext.trade.inputAmount.currency.chainId + + if (isJupiter(swapTxContext) || swapChainId === startChainId) { + return { chainSwitchFailed: false } + } + + const chainSwitched = await selectChain(swapChainId) + + return { chainSwitchFailed: !chainSwitched } +} + +export function stepHasFinalized(step: PlanStep): boolean { + return step.status === PlanStepStatus.COMPLETE || step.status === PlanStepStatus.STEP_ERROR +} + +export function findFirstActionableStep(steps: T[]): T | undefined { + return steps.find((step) => step.status === PlanStepStatus.AWAITING_ACTION) +} + +export function allStepsComplete(steps: PlanStep[]): boolean { + return steps.every((step) => step.status === PlanStepStatus.COMPLETE) +} diff --git a/packages/uniswap/src/features/transactions/swap/review/hooks/useCreateSwapReviewCallbacks.tsx b/packages/uniswap/src/features/transactions/swap/review/hooks/useCreateSwapReviewCallbacks.tsx index 000086bee42..92de3528f62 100644 --- a/packages/uniswap/src/features/transactions/swap/review/hooks/useCreateSwapReviewCallbacks.tsx +++ b/packages/uniswap/src/features/transactions/swap/review/hooks/useCreateSwapReviewCallbacks.tsx @@ -95,6 +95,7 @@ export function useCreateSwapReviewCallbacks(ctx: { const onSuccess = useCallback(() => { // For Unichain networks, trigger confirmation and branch to stall+fetch logic (ie handle in component) if (isFlashblocksEnabled && shouldShowConfirmedState) { + resetCurrentStep() updateSwapForm({ isConfirmed: true, isSubmitting: false, @@ -125,7 +126,7 @@ export function useCreateSwapReviewCallbacks(ctx: { setScreen(TransactionScreen.Form) } onClose() - }, [setScreen, updateSwapForm, onClose, isFlashblocksEnabled, shouldShowConfirmedState]) + }, [setScreen, updateSwapForm, onClose, isFlashblocksEnabled, shouldShowConfirmedState, resetCurrentStep]) const onPending = useCallback(() => { // Skip pending UI only for Unichain networks with flashblocks-compatible routes diff --git a/packages/uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/hooks.ts b/packages/uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/hooks.ts index 12ba0034d82..5defe3a6ac2 100644 --- a/packages/uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/hooks.ts +++ b/packages/uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/hooks.ts @@ -1,12 +1,11 @@ import type { UseQueryResult } from '@tanstack/react-query' import { queryOptions, useQuery } from '@tanstack/react-query' import { GasStrategy, TradingApi } from '@universe/api' +import { DynamicConfigs, SwapConfigKey, useDynamicConfigValue } from '@universe/gating' import { useMemo } from 'react' import { useUniswapContext } from 'uniswap/src/contexts/UniswapContext' import type { UniverseChainId } from 'uniswap/src/features/chains/types' import { useActiveGasStrategy } from 'uniswap/src/features/gas/hooks' -import { DynamicConfigs, SwapConfigKey } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import type { SwapDelegationInfo } from 'uniswap/src/features/smartWallet/delegation/types' import { useAllTransactionSettings } from 'uniswap/src/features/transactions/components/settings/stores/transactionSettingsStore/useTransactionSettingsStore' import { useV4SwapEnabled } from 'uniswap/src/features/transactions/swap/hooks/useV4SwapEnabled' diff --git a/packages/uniswap/src/features/transactions/swap/stores/swapFormStore/hooks/useDerivedSwapInfo.ts b/packages/uniswap/src/features/transactions/swap/stores/swapFormStore/hooks/useDerivedSwapInfo.ts index a739bf55eda..7339325a376 100644 --- a/packages/uniswap/src/features/transactions/swap/stores/swapFormStore/hooks/useDerivedSwapInfo.ts +++ b/packages/uniswap/src/features/transactions/swap/stores/swapFormStore/hooks/useDerivedSwapInfo.ts @@ -1,10 +1,9 @@ import { TradeType } from '@uniswap/sdk-core' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useMemo } from 'react' import { useUniswapContextSelector } from 'uniswap/src/contexts/UniswapContext' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useOnChainCurrencyBalance } from 'uniswap/src/features/portfolio/api' import { getCurrencyAmount, ValueType } from 'uniswap/src/features/tokens/getCurrencyAmount' import { useCurrencyInfo } from 'uniswap/src/features/tokens/useCurrencyInfo' diff --git a/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/SwapTxStoreContextProvider.tsx b/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/SwapTxStoreContextProvider.tsx index 839d41380c7..601393df715 100644 --- a/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/SwapTxStoreContextProvider.tsx +++ b/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/SwapTxStoreContextProvider.tsx @@ -1,6 +1,5 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useEffect, useState } from 'react' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useSwapTxAndGasInfo as useServiceBasedSwapTxAndGasInfo } from 'uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/hooks' import { useSwapFormStore } from 'uniswap/src/features/transactions/swap/stores/swapFormStore/useSwapFormStore' import { createSwapTxStore } from 'uniswap/src/features/transactions/swap/stores/swapTxStore/createSwapTxStore' diff --git a/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/hooks/useTransactionRequestInfo.test.ts b/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/hooks/useTransactionRequestInfo.test.ts index ca576871813..f640823efd8 100644 --- a/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/hooks/useTransactionRequestInfo.test.ts +++ b/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/hooks/useTransactionRequestInfo.test.ts @@ -25,9 +25,9 @@ jest.mock( useAllTransactionSettings: jest.fn(), }), ) -jest.mock('uniswap/src/features/gating/hooks', () => { +jest.mock('@universe/gating', () => { return { - ...jest.requireActual('uniswap/src/features/gating/hooks'), + ...jest.requireActual('@universe/gating'), useDynamicConfigValue: jest .fn() .mockImplementation(({ defaultValue }: { config: unknown; key: unknown; defaultValue: unknown }) => { diff --git a/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/hooks/useTransactionRequestInfo.ts b/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/hooks/useTransactionRequestInfo.ts index 7649e9a3f63..78f27648f34 100644 --- a/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/hooks/useTransactionRequestInfo.ts +++ b/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/hooks/useTransactionRequestInfo.ts @@ -1,11 +1,9 @@ import { TradingApi } from '@universe/api' +import { DynamicConfigs, SwapConfigKey, useDynamicConfigValue } from '@universe/gating' import { useEffect, useMemo, useRef } from 'react' import { useUniswapContextSelector } from 'uniswap/src/contexts/UniswapContext' import { useTradingApiSwapQuery } from 'uniswap/src/data/apiClients/tradingApi/useTradingApiSwapQuery' - import { useActiveGasStrategy } from 'uniswap/src/features/gas/hooks' -import { DynamicConfigs, SwapConfigKey } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { useAllTransactionSettings } from 'uniswap/src/features/transactions/components/settings/stores/transactionSettingsStore/useTransactionSettingsStore' import { FALLBACK_SWAP_REQUEST_POLL_INTERVAL_MS } from 'uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/constants' import { processUniswapXResponse } from 'uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/uniswapx/utils' diff --git a/packages/uniswap/src/features/transactions/swap/types/trade.ts b/packages/uniswap/src/features/transactions/swap/types/trade.ts index f2c8f0910ef..6433e8dd70b 100644 --- a/packages/uniswap/src/features/transactions/swap/types/trade.ts +++ b/packages/uniswap/src/features/transactions/swap/types/trade.ts @@ -848,6 +848,7 @@ export class ChainedActionTrade { readonly indicative = false readonly tradeType: TradeType = TradeType.EXACT_INPUT readonly deadline: undefined + readonly priceImpact: undefined // depends on trade type. since exact input, max amount in is the input amount readonly maxAmountIn: CurrencyAmount diff --git a/packages/uniswap/src/features/transactions/swap/utils/getIsWebForNudgeEnabled.ts b/packages/uniswap/src/features/transactions/swap/utils/getIsWebForNudgeEnabled.ts index b83f8a7cd6a..7cb7c6fe964 100644 --- a/packages/uniswap/src/features/transactions/swap/utils/getIsWebForNudgeEnabled.ts +++ b/packages/uniswap/src/features/transactions/swap/utils/getIsWebForNudgeEnabled.ts @@ -1,5 +1,4 @@ -import { Experiments, WebFORNudgesProperties } from 'uniswap/src/features/gating/experiments' -import { getExperimentValue } from 'uniswap/src/features/gating/hooks' +import { Experiments, getExperimentValue, WebFORNudgesProperties } from '@universe/gating' import { isWebApp } from 'utilities/src/platform' export function getIsWebFORNudgeEnabled(): boolean { diff --git a/packages/uniswap/src/features/transactions/swap/utils/protocols.test.ts b/packages/uniswap/src/features/transactions/swap/utils/protocols.test.ts index f6e395ff91c..5911aa798f9 100644 --- a/packages/uniswap/src/features/transactions/swap/utils/protocols.test.ts +++ b/packages/uniswap/src/features/transactions/swap/utils/protocols.test.ts @@ -1,8 +1,7 @@ import { TradingApi } from '@universe/api' +import { FeatureFlags, getFeatureFlag } from '@universe/gating' import { createGetSupportedChainId } from 'uniswap/src/features/chains/hooks/useSupportedChainId' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag } from 'uniswap/src/features/gating/hooks' import { createGetV4SwapEnabled } from 'uniswap/src/features/transactions/swap/hooks/useV4SwapEnabled' import { createGetProtocolsForChain, @@ -11,7 +10,8 @@ import { FrontendSupportedProtocol, } from 'uniswap/src/features/transactions/swap/utils/protocols' -jest.mock('uniswap/src/features/gating/hooks', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), useFeatureFlag: jest.fn(), getFeatureFlag: jest.fn(), })) diff --git a/packages/uniswap/src/features/transactions/swap/utils/protocols.ts b/packages/uniswap/src/features/transactions/swap/utils/protocols.ts index 75006c824f9..8f0fa23647f 100644 --- a/packages/uniswap/src/features/transactions/swap/utils/protocols.ts +++ b/packages/uniswap/src/features/transactions/swap/utils/protocols.ts @@ -1,11 +1,9 @@ import { TradingApi } from '@universe/api' +import { FeatureFlags, getFeatureFlag, useFeatureFlag } from '@universe/gating' import { useMemo } from 'react' import { useUniswapContextSelector } from 'uniswap/src/contexts/UniswapContext' - import { createGetSupportedChainId } from 'uniswap/src/features/chains/hooks/useSupportedChainId' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag, useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { createGetV4SwapEnabled, useV4SwapEnabled } from 'uniswap/src/features/transactions/swap/hooks/useV4SwapEnabled' export const DEFAULT_PROTOCOL_OPTIONS = [ diff --git a/packages/uniswap/src/features/transactions/swap/utils/routing.ts b/packages/uniswap/src/features/transactions/swap/utils/routing.ts index 6ffc30ac3cd..7fb00f6f68c 100644 --- a/packages/uniswap/src/features/transactions/swap/utils/routing.ts +++ b/packages/uniswap/src/features/transactions/swap/utils/routing.ts @@ -1,6 +1,6 @@ import { ADDRESS_ZERO } from '@uniswap/v3-sdk' import { TradingApi } from '@universe/api' - +import { UnexpectedTransactionStateError } from 'uniswap/src/features/transactions/errors' import { type SwapTxAndGasInfo } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' import { type ValidatedTransactionRequest } from 'uniswap/src/features/transactions/types/transactionRequests' @@ -56,6 +56,16 @@ export function getEVMTxRequest(swapTxContext: SwapTxAndGasInfo): ValidatedTrans return swapTxContext.txRequests?.[0] } +/** Asserts that a given object fits a given routing variant. */ +export function requireRouting( + val: V, + routing: readonly T[], +): asserts val is V & { routing: T } { + if (!routing.includes(val.routing as T)) { + throw new UnexpectedTransactionStateError(`Expected routing ${routing}, got ${val.routing}`) + } +} + export const ACROSS_DAPP_INFO = { name: 'Across API', address: ADDRESS_ZERO, diff --git a/packages/uniswap/src/features/transactions/swap/utils/trade.ts b/packages/uniswap/src/features/transactions/swap/utils/trade.ts index 322130dd229..83958b8a754 100644 --- a/packages/uniswap/src/features/transactions/swap/utils/trade.ts +++ b/packages/uniswap/src/features/transactions/swap/utils/trade.ts @@ -208,6 +208,12 @@ export function validateTransactionRequest( return undefined } +export function validateTransactionRequestTypeGuard( + request?: providers.TransactionRequest | null, +): request is ValidatedTransactionRequest { + return !!request?.to && !!request.chainId +} + export function validateTransactionRequests( requests?: providers.TransactionRequest[] | null, ): PopulatedTransactionRequestArray | undefined { @@ -243,6 +249,10 @@ export function validatePermit(permit: TradingApi.NullablePermit | undefined): V return undefined } +export function validatePermitTypeGuard(permit: TradingApi.NullablePermit | undefined): permit is ValidatedPermit { + return !!permit && !!permit.domain && !!permit.types && !!permit.values +} + export function hasTradeType( typeInfo: TransactionTypeInfo, ): typeInfo is ExactInputSwapTransactionInfo | ExactOutputSwapTransactionInfo { diff --git a/packages/uniswap/src/features/transactions/swap/utils/tradingApi.test.ts b/packages/uniswap/src/features/transactions/swap/utils/tradingApi.test.ts index ea189390fa8..4eeb93197d6 100644 --- a/packages/uniswap/src/features/transactions/swap/utils/tradingApi.test.ts +++ b/packages/uniswap/src/features/transactions/swap/utils/tradingApi.test.ts @@ -1,12 +1,13 @@ import { TradingApi } from '@universe/api' +import { useFeatureFlag } from '@universe/gating' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import type { FrontendSupportedProtocol } from 'uniswap/src/features/transactions/swap/utils/protocols' import { useProtocolsForChain } from 'uniswap/src/features/transactions/swap/utils/protocols' import { useQuoteRoutingParams } from 'uniswap/src/features/transactions/swap/utils/tradingApi' import { renderHook } from 'uniswap/src/test/test-utils' -jest.mock('uniswap/src/features/gating/hooks', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), useFeatureFlag: jest.fn(), })) jest.mock('uniswap/src/features/transactions/swap/utils/protocols', () => ({ diff --git a/packages/uniswap/src/features/transactions/swap/utils/tradingApi.ts b/packages/uniswap/src/features/transactions/swap/utils/tradingApi.ts index 42610ca00ab..c4e0bd27bc0 100644 --- a/packages/uniswap/src/features/transactions/swap/utils/tradingApi.ts +++ b/packages/uniswap/src/features/transactions/swap/utils/tradingApi.ts @@ -8,12 +8,11 @@ import type { FeeAmount } from '@uniswap/v3-sdk' import { Pool as V3Pool, Route as V3Route } from '@uniswap/v3-sdk' import { Pool as V4Pool, Route as V4Route } from '@uniswap/v4-sdk' import { type ClassicQuoteResponse, type DiscriminatedQuoteResponse, TradingApi } from '@universe/api' +import { DynamicConfigs, getDynamicConfigValue, SwapConfigKey } from '@universe/gating' import { nativeOnChain } from 'uniswap/src/constants/tokens' import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import type { UniverseChainId } from 'uniswap/src/features/chains/types' import { isUniverseChainId } from 'uniswap/src/features/chains/utils' -import { DynamicConfigs, SwapConfigKey } from 'uniswap/src/features/gating/configs' -import { getDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { getCurrencyAmount, ValueType } from 'uniswap/src/features/tokens/getCurrencyAmount' import type { Trade } from 'uniswap/src/features/transactions/swap/types/trade' import { diff --git a/packages/uniswap/src/features/unitags/ClaimUnitagContent.tsx b/packages/uniswap/src/features/unitags/ClaimUnitagContent.tsx index a170222c2c2..86e557aceb0 100644 --- a/packages/uniswap/src/features/unitags/ClaimUnitagContent.tsx +++ b/packages/uniswap/src/features/unitags/ClaimUnitagContent.tsx @@ -131,13 +131,7 @@ export function ClaimUnitagContent({ }) return unsubscribe - }, [ - navigationEventConsumer, - showTextInputView, - addressViewOpacity, - unitagInputContainerTranslateY, - focusUnitagTextInput, - ]) + }, [navigationEventConsumer, showTextInputView, focusUnitagTextInput]) const onChangeTextInput = useCallback( (text: string): void => { @@ -196,15 +190,7 @@ export function ClaimUnitagContent({ } }, initialDelay + translateYDuration) }, - [ - onComplete, - onNavigateContinue, - addressViewOpacity, - entryPoint, - unitagAddress, - unitagInputContainerTranslateY, - fontSize, - ], + [onComplete, onNavigateContinue, entryPoint, unitagAddress, fontSize], ) useEffect(() => { diff --git a/packages/uniswap/src/i18n/locales/source/en-US.json b/packages/uniswap/src/i18n/locales/source/en-US.json index aaa13e3aee8..21e6ace68d0 100644 --- a/packages/uniswap/src/i18n/locales/source/en-US.json +++ b/packages/uniswap/src/i18n/locales/source/en-US.json @@ -144,14 +144,15 @@ "bridgedAsset.send.warning.description": "You’re sending a wrapped version of {{currencySymbol}} on {{chainName}}. Sending it to a centralized exchange will result in a permanent loss of funds.", "bridgedAsset.send.warning.title": "Make sure you’re sending to a compatible address", "bridgedAsset.tdp.description": "This is a bridged version of {{currencySymbol}} that is 1:1 backed by native {{currencySymbol}}.", - "bridgedAsset.wormhole.button": "Continue to Wormhole", - "bridgedAsset.wormhole.description": "Continue to the Wormhole portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", + "bridgedAsset.wormhole.button": "Continue to {{provider}}", + "bridgedAsset.wormhole.description": "Continue to the {{provider}} portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", "bridgedAsset.wormhole.title": "Withdraw {{currencySymbol}} to {{nativeChainName}}", "bridgedAsset.wormhole.toNativeChain": "to {{nativeChainName}}", "bridgedAsset.wormhole.withdrawToNativeChain": "Withdraw to {{nativeChainName}}", "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Candlestick", "chart.error.pools": "Unable to display historical data for the current pool.", "chart.error.tokens": "Unable to display historical data for the current token.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "No matching v2 pools found. Double-check your token selection and ensure you’re connected to the correct wallet.", "pools.explore": "Explore pools", "portfolio.activity.filters.timePeriod.all": "All time", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "All types", - "portfolio.activity.filters.transactionType.deposits": "Deposits", - "portfolio.activity.filters.transactionType.staking": "Staking", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Swaps", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Activity", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "Track your crypto portfolio across all chains and protocols", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFTs", "portfolio.overview.title": "Overview", "portfolio.title": "Portfolio", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Allocation", "portfolio.tokens.table.column.balance": "Balance", "portfolio.tokens.table.column.change1d": "1D Change", diff --git a/packages/uniswap/src/i18n/locales/translations/af-ZA.json b/packages/uniswap/src/i18n/locales/translations/af-ZA.json index 40119ecf73d..d714754e9dc 100644 --- a/packages/uniswap/src/i18n/locales/translations/af-ZA.json +++ b/packages/uniswap/src/i18n/locales/translations/af-ZA.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Sluit beursie", "settings.action.privacy": "Privaatheidsbeleid", "settings.action.terms": "Diensbepalings", + "settings.connectWalletPlatform.warning": "Om Uniswap op {{platform}}te gebruik, koppel aan 'n beursie wat {{platform}}ondersteun.", "settings.footer": "Met liefde gemaak, \nUniswap-span 🦄", "settings.hideSmallBalances": "Versteek klein saldo's", "settings.hideSmallBalances.subtitle": "Saldo's onder 1 USD sal van jou portefeulje weggesteek word.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Hierdie toepassing ondersteun slim beursies", "smartWallets.unavailableModal.description": "'n Ander beursieverskaffer bestuur nou slim beursie-instellings vir {{displayName}}. Jy kan Uniswap soos normaalweg voortgaan om te gebruik.", "smartWallets.unavailableModal.title": "Slim beursie-kenmerke is nie beskikbaar nie", - "solanaPromo.banner.description": "Ruil Solana-tokens direk op die Uniswap-webtoepassing.", + "solanaPromo.banner.description": "Ruil Solana-tokens direk op Uniswap.", "solanaPromo.banner.title": "Solana is nou beskikbaar", "solanaPromo.modal.connectWallet": "Koppel jou gunsteling Solana-beursie", "solanaPromo.modal.startSwapping.button": "Begin omruil op Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/ar-SA.json b/packages/uniswap/src/i18n/locales/translations/ar-SA.json index 3e628872b83..a10e2e0aef2 100644 --- a/packages/uniswap/src/i18n/locales/translations/ar-SA.json +++ b/packages/uniswap/src/i18n/locales/translations/ar-SA.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "قفل المحفظة", "settings.action.privacy": "سياسة الخصوصية", "settings.action.terms": "شروط الخدمة", + "settings.connectWalletPlatform.warning": "لاستخدام Uniswap على {{platform}}، قم بالاتصال بمحفظة تدعم {{platform}}.", "settings.footer": "صُنع بكل حب، \nفريق Uniswap 🦄", "settings.hideSmallBalances": "إخفاء الأرصدة الصغيرة", "settings.hideSmallBalances.subtitle": "سيتم إخفاء الأرصدة التي تقل عن 1 دولار أمريكي من محفظتك.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "يدعم هذا التطبيق المحافظ الذكية", "smartWallets.unavailableModal.description": "يُدير موفر محفظة آخر إعدادات المحفظة الذكية لـ {{displayName}}. يمكنك الاستمرار في استخدام Uniswap كالمعتاد.", "smartWallets.unavailableModal.title": "ميزات المحفظة الذكية غير متوفرة", - "solanaPromo.banner.description": "قم بتداول رموز Solana مباشرة على تطبيق Uniswap Web App.", + "solanaPromo.banner.description": "قم بتداول رموز Solana مباشرة على Uniswap.", "solanaPromo.banner.title": "سولانا متاحة الآن", "solanaPromo.modal.connectWallet": "قم بتوصيل محفظة Solana المفضلة لديك", "solanaPromo.modal.startSwapping.button": "ابدأ بالتبديل على سولانا", diff --git a/packages/uniswap/src/i18n/locales/translations/ca-ES.json b/packages/uniswap/src/i18n/locales/translations/ca-ES.json index 7bd08ae2841..3fecdb8ce51 100644 --- a/packages/uniswap/src/i18n/locales/translations/ca-ES.json +++ b/packages/uniswap/src/i18n/locales/translations/ca-ES.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Bloqueja la cartera", "settings.action.privacy": "Política de privacitat", "settings.action.terms": "Termes del servei", + "settings.connectWalletPlatform.warning": "Per utilitzar Uniswap a {{platform}}, connecteu-vos a un moneder que admeti {{platform}}.", "settings.footer": "Fet amb amor, \nUniswap Team 🦄", "settings.hideSmallBalances": "Amaga petits saldos", "settings.hideSmallBalances.subtitle": "Els saldos inferiors a 1 USD s'amagaran de la vostra cartera.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Aquesta aplicació admet moneders intel·ligents", "smartWallets.unavailableModal.description": "Un proveïdor de moneders diferent ara gestiona la configuració del moneder intel·ligent per a {{displayName}}. Podeu continuar utilitzant Uniswap com sempre.", "smartWallets.unavailableModal.title": "Les funcions de la cartera intel·ligent no estan disponibles", - "solanaPromo.banner.description": "Intercanvia tokens de Solana directament a l'aplicació web Uniswap.", + "solanaPromo.banner.description": "Intercanvia fitxes de Solana directament a Uniswap.", "solanaPromo.banner.title": "Solana ja està disponible", "solanaPromo.modal.connectWallet": "Connecta la teva cartera Solana preferida", "solanaPromo.modal.startSwapping.button": "Comença a intercanviar a Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/da-DK.json b/packages/uniswap/src/i18n/locales/translations/da-DK.json index 6b105874916..f084b805e68 100644 --- a/packages/uniswap/src/i18n/locales/translations/da-DK.json +++ b/packages/uniswap/src/i18n/locales/translations/da-DK.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Lås pung", "settings.action.privacy": "Fortrolighedspolitik", "settings.action.terms": "Servicevilkår", + "settings.connectWalletPlatform.warning": "For at bruge Uniswap på {{platform}}skal du oprette forbindelse til en tegnebog, der understøtter {{platform}}.", "settings.footer": "Lavet med kærlighed, \nUniswap Team 🦄", "settings.hideSmallBalances": "Skjul små saldi", "settings.hideSmallBalances.subtitle": "Saldi under 1 USD vil blive skjult fra din portefølje.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Denne app understøtter smarte tegnebøger", "smartWallets.unavailableModal.description": "En anden wallet-udbyder administrerer nu smart wallet-indstillinger for {{displayName}}. Du kan fortsætte med at bruge Uniswap som normalt.", "smartWallets.unavailableModal.title": "Smart wallet-funktioner er ikke tilgængelige", - "solanaPromo.banner.description": "Handl Solana-tokens direkte på Uniswap-webappen.", + "solanaPromo.banner.description": "Handl Solana-tokens direkte på Uniswap.", "solanaPromo.banner.title": "Solana er nu tilgængelig", "solanaPromo.modal.connectWallet": "Tilslut din foretrukne Solana-pung", "solanaPromo.modal.startSwapping.button": "Begynd at bytte på Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/el-GR.json b/packages/uniswap/src/i18n/locales/translations/el-GR.json index 54df5b70ffa..2bae3774d7b 100644 --- a/packages/uniswap/src/i18n/locales/translations/el-GR.json +++ b/packages/uniswap/src/i18n/locales/translations/el-GR.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Κλείδωμα πορτοφολιού", "settings.action.privacy": "Πολιτική απορρήτου", "settings.action.terms": "Οροι χρήσης", + "settings.connectWalletPlatform.warning": "Για να χρησιμοποιήσετε το Uniswap στο {{platform}}, συνδεθείτε σε ένα πορτοφόλι που υποστηρίζει το {{platform}}.", "settings.footer": "Φτιαγμένο με αγάπη, \nUniswap Team 🦄", "settings.hideSmallBalances": "Απόκρυψη μικρών υπολοίπων", "settings.hideSmallBalances.subtitle": "Υπόλοιπα κάτω του 1 USD θα κρυφτούν από το χαρτοφυλάκιό σας.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Αυτή η εφαρμογή υποστηρίζει έξυπνα πορτοφόλια", "smartWallets.unavailableModal.description": "Ένας διαφορετικός πάροχος πορτοφολιού διαχειρίζεται πλέον τις ρυθμίσεις έξυπνου πορτοφολιού για το {{displayName}}. Μπορείτε να συνεχίσετε να χρησιμοποιείτε το Uniswap κανονικά.", "smartWallets.unavailableModal.title": "Οι λειτουργίες έξυπνου πορτοφολιού δεν είναι διαθέσιμες", - "solanaPromo.banner.description": "Ανταλλάξτε μάρκες Solana απευθείας στην εφαρμογή Uniswap Web.", + "solanaPromo.banner.description": "Ανταλλάξτε μάρκες Solana απευθείας στο Uniswap.", "solanaPromo.banner.title": "Η Σολάνα είναι τώρα διαθέσιμη", "solanaPromo.modal.connectWallet": "Συνδέστε το αγαπημένο σας πορτοφόλι Solana", "solanaPromo.modal.startSwapping.button": "Ξεκινήστε την ανταλλαγή στο Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/es-ES.json b/packages/uniswap/src/i18n/locales/translations/es-ES.json index 6cd7dbb7db4..d7c2473c9d3 100644 --- a/packages/uniswap/src/i18n/locales/translations/es-ES.json +++ b/packages/uniswap/src/i18n/locales/translations/es-ES.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} min {{seconds}} s", "bridging.estimatedTime.minutesOnly": "~{{minutes}} min", "bridging.estimatedTime.secondsOnly": "~{{seconds}} s", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Gráfico de velas", "chart.error.pools": "No se pueden mostrar los datos históricos del fondo actual.", "chart.error.tokens": "No se pueden mostrar los datos históricos del token actual.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "No se encontraron fondos v2 que coincidan. Vuelve a verificar la selección de tokens y asegúrate de estar conectado a la billetera correcta.", "pools.explore": "Explorar los fondos", "portfolio.activity.filters.timePeriod.all": "Historial", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "Todos los tipos", - "portfolio.activity.filters.transactionType.deposits": "Depósitos", - "portfolio.activity.filters.transactionType.staking": "Staking", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Intercambios", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Actividad", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "Rastrea tu cartera de criptomonedas en todas las cadenas y protocolos", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT", "portfolio.overview.title": "Resumen", "portfolio.title": "Cartera", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Asignación", "portfolio.tokens.table.column.balance": "Saldo", "portfolio.tokens.table.column.change1d": "Variación en las últimas 24 horas", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "No hay suficientes {{tokenSymbol}} en {{chain}}", "v2.notAvailable": "Uniswap V2 no está disponible en esta red.", "wallet.appSignIn": "Ingresar con la app", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "Si conectas una billetera, aceptas las Condiciones del servicio de Uniswap Labs y consientes en su Política de privacidad.", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "La billetera que tienes conectada no es compatible con algunas funciones.", diff --git a/packages/uniswap/src/i18n/locales/translations/fi-FI.json b/packages/uniswap/src/i18n/locales/translations/fi-FI.json index 659ba918272..9dd03a9a09d 100644 --- a/packages/uniswap/src/i18n/locales/translations/fi-FI.json +++ b/packages/uniswap/src/i18n/locales/translations/fi-FI.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Lukittava lompakko", "settings.action.privacy": "Tietosuojakäytäntö", "settings.action.terms": "Käyttöehdot", + "settings.connectWalletPlatform.warning": "Käyttääksesi Uniswapia {{platform}}:ssä, muodosta yhteys lompakkoon, joka tukee {{platform}}:ää.", "settings.footer": "Tehty rakkaudella, \nUniswap Team 🦄", "settings.hideSmallBalances": "Piilota pienet saldot", "settings.hideSmallBalances.subtitle": "Alle 1 USD:n saldot piilotetaan salkustasi.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Tämä sovellus tukee älykkäitä lompakoita", "smartWallets.unavailableModal.description": "Eri lompakkopalveluntarjoaja hallinnoi nyt {{displayName}}:n älylompakkoasetuksia. Voit jatkaa Uniswapin käyttöä normaalisti.", "smartWallets.unavailableModal.title": "Älykäs lompakon ominaisuudet eivät ole käytettävissä", - "solanaPromo.banner.description": "Vaihda Solana-tokeneita suoraan Uniswap-verkkosovelluksessa.", + "solanaPromo.banner.description": "Vaihda Solana-tokeneita suoraan Uniswapissa.", "solanaPromo.banner.title": "Solana on nyt saatavilla", "solanaPromo.modal.connectWallet": "Yhdistä suosikki Solana-lompakkosi", "solanaPromo.modal.startSwapping.button": "Aloita vaihtaminen Solanan kanssa", diff --git a/packages/uniswap/src/i18n/locales/translations/fil-PH.json b/packages/uniswap/src/i18n/locales/translations/fil-PH.json index 323e3c414ee..047dae48f21 100644 --- a/packages/uniswap/src/i18n/locales/translations/fil-PH.json +++ b/packages/uniswap/src/i18n/locales/translations/fil-PH.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Candlestick", "chart.error.pools": "Hindi maipakita ang dating data para sa kasalukuyang pool.", "chart.error.tokens": "Hindi maipakita ang dating data para sa kasalukuyang token.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "Walang nakitang v2 pool na tumutugma. I-double check ang iyong napiling token at tiyaking nakakonekta ka sa tamang wallet.", "pools.explore": "I-explore ang mga pool", "portfolio.activity.filters.timePeriod.all": "Lahat ng oras", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "Lahat ng uri", - "portfolio.activity.filters.transactionType.deposits": "Mga Deposito", - "portfolio.activity.filters.transactionType.staking": "Staking", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Mga Swap", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Aktibidad", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "I-track ang iyong crypto portfolio sa lahat ng chain at protocol", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "Mga NFT", "portfolio.overview.title": "Pangkalahatang-ideya", "portfolio.title": "Portfolio", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Alokasyon", "portfolio.tokens.table.column.balance": "Balanse", "portfolio.tokens.table.column.change1d": "Pagbabago sa 1D", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "Hindi sapat ang {{tokenSymbol}} sa {{chain}}", "v2.notAvailable": "Hindi available ang Uniswap V2 sa network na ito.", "wallet.appSignIn": "Mag-sign in gamit ang app", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "Sa pamamagitan ng pagkonekta ng wallet, sumasang-ayon ka sa Mga Tuntunin ng Serbisyo ng Uniswap Labs at pumapayag ka sa Patakaran sa Privacy nito.", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "Ang ilang feature ay hindi sinusuportahan ng iyong nakakonektang wallet.", diff --git a/packages/uniswap/src/i18n/locales/translations/fr-FR.json b/packages/uniswap/src/i18n/locales/translations/fr-FR.json index 0110021626c..87a016d4648 100644 --- a/packages/uniswap/src/i18n/locales/translations/fr-FR.json +++ b/packages/uniswap/src/i18n/locales/translations/fr-FR.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "Env. {{minutes}} min {{seconds}} s", "bridging.estimatedTime.minutesOnly": "Env. {{minutes}} min", "bridging.estimatedTime.secondsOnly": "Env. {{seconds}} s", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Chandelier", "chart.error.pools": "Impossible d'afficher les données historiques du pool actuel.", "chart.error.tokens": "Impossible d'afficher les données historiques du token actuel.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "Aucun pool V2 ne correspond à votre sélection. Vérifiez le(s) token(s) sélectionné(s) et assurez-vous d’être connecté au bon wallet.", "pools.explore": "Découvrir les pools", "portfolio.activity.filters.timePeriod.all": "Toujours", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "Tous les types", - "portfolio.activity.filters.transactionType.deposits": "Dépôts", - "portfolio.activity.filters.transactionType.staking": "Staking", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Échanges", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Activité", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "Suivez votre portefeuille de crypto à travers toutes les chaînes et protocoles", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT", "portfolio.overview.title": "Aperçu", "portfolio.title": "Portefeuille", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Allocation", "portfolio.tokens.table.column.balance": "Solde", "portfolio.tokens.table.column.change1d": "Évolution sur 1 j", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "Pas assez de {{tokenSymbol}} sur {{chain}}", "v2.notAvailable": "Uniswap V2 n'est pas disponible sur ce réseau.", "wallet.appSignIn": "Se connecter avec l'app", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "En connectant un wallet, vous acceptez les Conditions d'utilisation d'Uniswap Labs et vous consentez à sa Politique de confidentialité.", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "Certaines fonctionnalités ne sont pas prises en charge par votre wallet connecté.", diff --git a/packages/uniswap/src/i18n/locales/translations/he-IL.json b/packages/uniswap/src/i18n/locales/translations/he-IL.json index 5c183c131d7..ece09b33c76 100644 --- a/packages/uniswap/src/i18n/locales/translations/he-IL.json +++ b/packages/uniswap/src/i18n/locales/translations/he-IL.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "מנעול ארנק", "settings.action.privacy": "מדיניות הפרטיות", "settings.action.terms": "תנאי השירות", + "settings.connectWalletPlatform.warning": "כדי להשתמש ב-Uniswap ב- {{platform}}, התחבר לארנק שתומך ב- {{platform}}.", "settings.footer": "מיוצר באהבה, \nצוות Uniswap 🦄", "settings.hideSmallBalances": "הסתר יתרות קטנות", "settings.hideSmallBalances.subtitle": "יתרות מתחת ל-1 USD יוסתרו מהתיק שלך.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "אפליקציה זו תומכת בארנקים חכמים", "smartWallets.unavailableModal.description": "ספק ארנק אחר מנהל כעת את הגדרות הארנק החכם עבור {{displayName}}. ניתן להמשיך להשתמש ב-Uniswap כרגיל.", "smartWallets.unavailableModal.title": "תכונות הארנק החכם אינן זמינות", - "solanaPromo.banner.description": "סחרו באסימוני סולאנה ישירות באפליקציית האינטרנט של Uniswap.", + "solanaPromo.banner.description": "סחרו באסימוני סולאנה ישירות ב-Uniswap.", "solanaPromo.banner.title": "סולאנה זמינה כעת", "solanaPromo.modal.connectWallet": "חבר את ארנק סולאנה המועדף עליך", "solanaPromo.modal.startSwapping.button": "התחל להחליף על סולאנה", diff --git a/packages/uniswap/src/i18n/locales/translations/hi-IN.json b/packages/uniswap/src/i18n/locales/translations/hi-IN.json index ca00c6fb653..8ceab52826a 100644 --- a/packages/uniswap/src/i18n/locales/translations/hi-IN.json +++ b/packages/uniswap/src/i18n/locales/translations/hi-IN.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "बटुआ बंद करो", "settings.action.privacy": "गोपनीयता नीति", "settings.action.terms": "सेवा की शर्तें", + "settings.connectWalletPlatform.warning": "{{platform}}पर Uniswap का उपयोग करने के लिए, {{platform}}का समर्थन करने वाले वॉलेट से कनेक्ट करें।", "settings.footer": "प्यार से बनाया गया, \nUniswap टीम 🦄", "settings.hideSmallBalances": "छोटे-छोटे शेष छिपाएँ", "settings.hideSmallBalances.subtitle": "1 USD से कम शेष राशि आपके पोर्टफोलियो से छिपा दी जाएगी।", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "यह ऐप स्मार्ट वॉलेट को सपोर्ट करता है", "smartWallets.unavailableModal.description": "एक अलग वॉलेट प्रदाता अब {{displayName}}के लिए स्मार्ट वॉलेट सेटिंग्स का प्रबंधन कर रहा है। आप सामान्य रूप से Uniswap का उपयोग जारी रख सकते हैं।", "smartWallets.unavailableModal.title": "स्मार्ट वॉलेट सुविधाएँ उपलब्ध नहीं हैं", - "solanaPromo.banner.description": "यूनिस्वैप वेब ऐप पर सीधे सोलाना टोकन का व्यापार करें।", + "solanaPromo.banner.description": "यूनिस्वैप पर सीधे सोलाना टोकन का व्यापार करें।", "solanaPromo.banner.title": "सोलाना अब उपलब्ध है", "solanaPromo.modal.connectWallet": "अपने पसंदीदा सोलाना वॉलेट को कनेक्ट करें", "solanaPromo.modal.startSwapping.button": "सोलाना पर स्वैपिंग शुरू करें", diff --git a/packages/uniswap/src/i18n/locales/translations/hu-HU.json b/packages/uniswap/src/i18n/locales/translations/hu-HU.json index 827d0da4825..3265b8f67ee 100644 --- a/packages/uniswap/src/i18n/locales/translations/hu-HU.json +++ b/packages/uniswap/src/i18n/locales/translations/hu-HU.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Zárható pénztárca", "settings.action.privacy": "Adatvédelmi irányelvek", "settings.action.terms": "Szolgáltatás feltételei", + "settings.connectWalletPlatform.warning": "A Uniswap {{platform}}tárcán való használatához csatlakozz egy olyan tárcához, amely támogatja a {{platform}}tárcát.", "settings.footer": "Szeretettel készült, \nUniswap Team 🦄", "settings.hideSmallBalances": "Kis egyenlegek elrejtése", "settings.hideSmallBalances.subtitle": "Az 1 USD alatti egyenlegek el lesznek rejtve a portfóliójában.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Ez az alkalmazás támogatja az intelligens pénztárcákat", "smartWallets.unavailableModal.description": "Egy másik pénztárca-szolgáltató kezeli a {{displayName}}intelligens pénztárca beállításait. A Uniswap szolgáltatást a szokásos módon használhatod.", "smartWallets.unavailableModal.title": "Az intelligens pénztárca funkciói nem érhetők el", - "solanaPromo.banner.description": "Kereskedjen Solana tokenekkel közvetlenül az Uniswap webes alkalmazásban.", + "solanaPromo.banner.description": "Cserélj Solana tokeneket közvetlenül az Uniswap-on.", "solanaPromo.banner.title": "A Solana már elérhető", "solanaPromo.modal.connectWallet": "Csatlakoztassa kedvenc Solana pénztárcáját", "solanaPromo.modal.startSwapping.button": "Kezdj el cserélgetni a Solanán", diff --git a/packages/uniswap/src/i18n/locales/translations/id-ID.json b/packages/uniswap/src/i18n/locales/translations/id-ID.json index 7eb5c98e8ea..61ac7b19cc6 100644 --- a/packages/uniswap/src/i18n/locales/translations/id-ID.json +++ b/packages/uniswap/src/i18n/locales/translations/id-ID.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} mnt {{seconds}} dtk", "bridging.estimatedTime.minutesOnly": "~{{minutes}} mnt", "bridging.estimatedTime.secondsOnly": "~{{seconds}} dtk", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Kandil", "chart.error.pools": "Tidak dapat menampilkan data historis untuk pool saat ini.", "chart.error.tokens": "Tidak dapat menampilkan data historis untuk token saat ini.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "Cadangan aset v2 yang sesuai tidak ditemukan. Periksa kembali pilihan tokenmu dan pastikan kamu telah terhubung dengan dompet yang benar.", "pools.explore": "Jelajahi pool", "portfolio.activity.filters.timePeriod.all": "Sepanjang periode", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "Semua jenis", - "portfolio.activity.filters.transactionType.deposits": "Setoran", - "portfolio.activity.filters.transactionType.staking": "Staking", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Pertukaran", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Aktivitas", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "Melacak portofolio kripto di semua chain dan protokol", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT", "portfolio.overview.title": "Ikhtisar", "portfolio.title": "Portofolio", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Alokasi", "portfolio.tokens.table.column.balance": "Saldo", "portfolio.tokens.table.column.change1d": "Perubahan 1 Hari", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "Tidak cukup {{tokenSymbol}} di {{chain}}", "v2.notAvailable": "Uniswap V2 tidak tersedia di jaringan ini.", "wallet.appSignIn": "Masuk dengan aplikasi", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "Dengan menghubungkan dompet, kamu menyetujui Ketentuan Layanan Uniswap Labs dan menyetujui Kebijakan Privasi.", "wallet.connectionFailed.message": "Upaya koneksi gagal. Silakan coba lagi dan ikuti langkah-langkah untuk menghubungkan di dompetmu.", "wallet.mismatch.popup.description": "Dompet terhubungmu tidak mendukung beberapa fitur.", diff --git a/packages/uniswap/src/i18n/locales/translations/it-IT.json b/packages/uniswap/src/i18n/locales/translations/it-IT.json index fe13f5ece22..275f8c80b31 100644 --- a/packages/uniswap/src/i18n/locales/translations/it-IT.json +++ b/packages/uniswap/src/i18n/locales/translations/it-IT.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Blocca il portafoglio", "settings.action.privacy": "Politica sulla riservatezza", "settings.action.terms": "Termini di servizio", + "settings.connectWalletPlatform.warning": "Per utilizzare Uniswap su {{platform}}, connettiti a un portafoglio che supporti {{platform}}.", "settings.footer": "Fatto con amore, \nUniswap Team 🦄", "settings.hideSmallBalances": "Nascondi piccoli saldi", "settings.hideSmallBalances.subtitle": "I saldi inferiori a 1 USD saranno nascosti dal tuo portafoglio.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Questa app supporta i portafogli intelligenti", "smartWallets.unavailableModal.description": "Un altro fornitore di wallet gestisce ora le impostazioni del wallet intelligente per {{displayName}}. Puoi continuare a utilizzare Uniswap normalmente.", "smartWallets.unavailableModal.title": "Funzionalità del portafoglio intelligente non disponibili", - "solanaPromo.banner.description": "Scambia i token Solana direttamente sulla Web App Uniswap.", + "solanaPromo.banner.description": "Scambia i token Solana direttamente su Uniswap.", "solanaPromo.banner.title": "Solana è ora disponibile", "solanaPromo.modal.connectWallet": "Collega il tuo portafoglio Solana preferito", "solanaPromo.modal.startSwapping.button": "Inizia a scambiare su Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/ja-JP.json b/packages/uniswap/src/i18n/locales/translations/ja-JP.json index 3d432bde27d..2add2c812a9 100644 --- a/packages/uniswap/src/i18n/locales/translations/ja-JP.json +++ b/packages/uniswap/src/i18n/locales/translations/ja-JP.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "約 {{minutes}} 分 {{seconds}} 秒", "bridging.estimatedTime.minutesOnly": "約 {{minutes}} 分", "bridging.estimatedTime.secondsOnly": "約 {{seconds}} 秒", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "ローソク足", "chart.error.pools": "現在のプールの履歴データを表示できません。", "chart.error.tokens": "現在のトークンの履歴データを表示できません。", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "一致する v2 プールが見つかりませんでした。選択したトークンを再確認し、正しいウォレットに接続されていることを確認してください。", "pools.explore": "プールを探索", "portfolio.activity.filters.timePeriod.all": "全期間", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "全種類", - "portfolio.activity.filters.transactionType.deposits": "預け入れ", - "portfolio.activity.filters.transactionType.staking": "ステーキング", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "スワップ", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "アクティビティ", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "チェーンとプロトコルすべてにわたって暗号資産ポートフォリオを追跡します", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT", "portfolio.overview.title": "概要", "portfolio.title": "ポートフォリオ", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "割り当て", "portfolio.tokens.table.column.balance": "残高", "portfolio.tokens.table.column.change1d": "1 日の変更", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "{{chain}} の {{tokenSymbol}} が十分ではありません", "v2.notAvailable": "Uniswap V2 はこのネットワークでは利用できません。", "wallet.appSignIn": "アプリでログイン", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "ウォレットを接続すると、Uniswap Labs の利用規約に同意し、プライバシー ポリシーに同意したことになります。", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "接続中のウォレットでは一部の機能がサポートされていません。", diff --git a/packages/uniswap/src/i18n/locales/translations/ko-KR.json b/packages/uniswap/src/i18n/locales/translations/ko-KR.json index 92215e92477..8e7df5d1fcf 100644 --- a/packages/uniswap/src/i18n/locales/translations/ko-KR.json +++ b/packages/uniswap/src/i18n/locales/translations/ko-KR.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}분 {{seconds}}초", "bridging.estimatedTime.minutesOnly": "~{{minutes}}분", "bridging.estimatedTime.secondsOnly": "~{{seconds}}초", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "촛대", "chart.error.pools": "현재 풀에 대한 기록 데이터를 표시할 수 없습니다.", "chart.error.tokens": "현재 토큰에 대한 기록 데이터를 표시할 수 없습니다.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "일치하는 v2 풀을 찾지 못했습니다. 토큰 선택을 다시 한번 확인하고 올바른 지갑에 연결되어 있는지 확인하세요.", "pools.explore": "풀 탐색", "portfolio.activity.filters.timePeriod.all": "누적", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "모든 유형", - "portfolio.activity.filters.transactionType.deposits": "입금", - "portfolio.activity.filters.transactionType.staking": "스테이킹", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "스왑", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "활동", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "모든 체인과 프로토콜을 아우르는 암호화폐 포트폴리오 추적", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT", "portfolio.overview.title": "개요", "portfolio.title": "포트폴리오", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "할당", "portfolio.tokens.table.column.balance": "잔액", "portfolio.tokens.table.column.change1d": "1일 변동", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "{{chain}}에 {{tokenSymbol}}이 충분하지 않습니다.", "v2.notAvailable": "이 네트워크에서는 Uniswap V2를 사용할 수 없습니다.", "wallet.appSignIn": "앱으로 로그인", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "지갑을 연결하면 Uniswap Labs의 서비스 약관개인정보 보호정책에 동의하는 것으로 간주됩니다.", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "연결된 지갑에서 일부 기능을 지원하지 않습니다.", diff --git a/packages/uniswap/src/i18n/locales/translations/ms-MY.json b/packages/uniswap/src/i18n/locales/translations/ms-MY.json index f2a08e7fe70..dd31542a088 100644 --- a/packages/uniswap/src/i18n/locales/translations/ms-MY.json +++ b/packages/uniswap/src/i18n/locales/translations/ms-MY.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Kunci dompet", "settings.action.privacy": "Dasar privasi", "settings.action.terms": "Syarat perkhidmatan", + "settings.connectWalletPlatform.warning": "Untuk menggunakan Uniswap pada {{platform}}, sambung ke dompet yang menyokong {{platform}}.", "settings.footer": "Dibuat dengan penuh kasih sayang, \nPasukan Uniswap 🦄", "settings.hideSmallBalances": "Sembunyikan baki kecil", "settings.hideSmallBalances.subtitle": "Baki di bawah 1 USD akan disembunyikan daripada portfolio anda.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Aplikasi ini menyokong dompet pintar", "smartWallets.unavailableModal.description": "Pembekal dompet yang berbeza kini menguruskan tetapan dompet pintar untuk {{displayName}}. Anda boleh terus menggunakan Uniswap seperti biasa.", "smartWallets.unavailableModal.title": "Ciri dompet pintar tidak tersedia", - "solanaPromo.banner.description": "Berdagang token Solana terus pada Apl Web Uniswap.", + "solanaPromo.banner.description": "Berdagang token Solana terus pada Uniswap.", "solanaPromo.banner.title": "Solana kini tersedia", "solanaPromo.modal.connectWallet": "Sambungkan dompet Solana kegemaran anda", "solanaPromo.modal.startSwapping.button": "Mula bertukar pada Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/nl-NL.json b/packages/uniswap/src/i18n/locales/translations/nl-NL.json index 8b8d74c3d7b..81f0d03cc5d 100644 --- a/packages/uniswap/src/i18n/locales/translations/nl-NL.json +++ b/packages/uniswap/src/i18n/locales/translations/nl-NL.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Candlestick", "chart.error.pools": "Kon de historische data voor de huidige pool niet weergeven.", "chart.error.tokens": "Kon de historische data voor het huidige token niet weergeven.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "Geen overeenkomende v2-pools gevonden. Controleer je tokenselectie nogmaals en zorg ervoor dat je verbonden bent met de juiste wallet.", "pools.explore": "Pools verkennen", "portfolio.activity.filters.timePeriod.all": "Altijd", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "Alle typen", - "portfolio.activity.filters.transactionType.deposits": "Stortingen", - "portfolio.activity.filters.transactionType.staking": "Staking", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Swaps", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Activiteit", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "Volg je cryptoportefeuille in alle chains en protocollen", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT's", "portfolio.overview.title": "Overzicht", "portfolio.title": "Portefeuille", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Toewijzing", "portfolio.tokens.table.column.balance": "Saldo", "portfolio.tokens.table.column.change1d": "1d-wijziging", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "Onvoldoende {{tokenSymbol}} op {{chain}}", "v2.notAvailable": "Uniswap V2 is niet beschikbaar op dit netwerk.", "wallet.appSignIn": "Aanmelden met de app", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "Door een wallet te verbinden, ga je akkoord met de Servicevoorwaarden van Uniswap Labs en geef je toestemming voor het Privacybeleid.", "wallet.connectionFailed.message": "Verbindingspoging mislukt. Probeer het opnieuw en volg de stappen om verbinding te maken in je wallet.", "wallet.mismatch.popup.description": "Sommige functies worden niet ondersteund door je verbonden wallet.", diff --git a/packages/uniswap/src/i18n/locales/translations/pl-PL.json b/packages/uniswap/src/i18n/locales/translations/pl-PL.json index 2d44ff150af..29ec82c2163 100644 --- a/packages/uniswap/src/i18n/locales/translations/pl-PL.json +++ b/packages/uniswap/src/i18n/locales/translations/pl-PL.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Zablokuj portfel", "settings.action.privacy": "Polityka prywatności", "settings.action.terms": "Warunki usługi", + "settings.connectWalletPlatform.warning": "Aby użyć Uniswap na {{platform}}, połącz się z portfelem, który obsługuje {{platform}}.", "settings.footer": "Wykonane z miłością, \nZespół Uniswap 🦄", "settings.hideSmallBalances": "Ukryj małe salda", "settings.hideSmallBalances.subtitle": "Salda poniżej 1 USD nie będą widoczne w Twoim portfelu.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Ta aplikacja obsługuje inteligentne portfele", "smartWallets.unavailableModal.description": "Inny dostawca portfela zarządza teraz ustawieniami inteligentnego portfela dla {{displayName}}. Możesz nadal używać Uniswap jak zwykle.", "smartWallets.unavailableModal.title": "Funkcje inteligentnego portfela są niedostępne", - "solanaPromo.banner.description": "Handluj tokenami Solana bezpośrednio w aplikacji internetowej Uniswap.", + "solanaPromo.banner.description": "Handluj tokenami Solana bezpośrednio na platformie Uniswap.", "solanaPromo.banner.title": "Solana jest już dostępna", "solanaPromo.modal.connectWallet": "Podłącz swój ulubiony portfel Solana", "solanaPromo.modal.startSwapping.button": "Rozpocznij wymianę na Solanie", diff --git a/packages/uniswap/src/i18n/locales/translations/pt-PT.json b/packages/uniswap/src/i18n/locales/translations/pt-PT.json index fb1b0588fb6..cb8e48d7a01 100644 --- a/packages/uniswap/src/i18n/locales/translations/pt-PT.json +++ b/packages/uniswap/src/i18n/locales/translations/pt-PT.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} min {{seconds}} s", "bridging.estimatedTime.minutesOnly": "~{{minutes}} min", "bridging.estimatedTime.secondsOnly": "~{{seconds}} s", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Vela", "chart.error.pools": "Não foi possível exibir dados históricos do pool atual.", "chart.error.tokens": "Não foi possível exibir dados históricos do token atual.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "Não foram encontrados pools v2 correspondentes. Verifique novamente sua seleção de tokens e se está acessando a carteira certa.", "pools.explore": "Explorar pools", "portfolio.activity.filters.timePeriod.all": "Todo o período", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "Todos os tipos", - "portfolio.activity.filters.transactionType.deposits": "Depósitos", - "portfolio.activity.filters.transactionType.staking": "Staking", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Swaps", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Atividade", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "Acompanhe seu portfólio de criptos em todas as redes e protocolos", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFTs", "portfolio.overview.title": "Visão geral", "portfolio.title": "Portfólio", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Alocação", "portfolio.tokens.table.column.balance": "Saldo", "portfolio.tokens.table.column.change1d": "Alteração de 1 dia", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "Não há {{tokenSymbol}} suficiente em {{chain}}", "v2.notAvailable": "A Uniswap V2 não está disponível nesta rede.", "wallet.appSignIn": "Entrar com o aplicativo", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "Ao conectar uma carteira, você concorda com os Termos de serviço e a Política de privacidade da Uniswap Labs.", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "Sua carteira não é compatível com alguns recursos.", diff --git a/packages/uniswap/src/i18n/locales/translations/ru-RU.json b/packages/uniswap/src/i18n/locales/translations/ru-RU.json index a4e2f3b7bf7..0e9fe2c606c 100644 --- a/packages/uniswap/src/i18n/locales/translations/ru-RU.json +++ b/packages/uniswap/src/i18n/locales/translations/ru-RU.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "прибл. {{minutes}} мин. {{seconds}} с.", "bridging.estimatedTime.minutesOnly": "прибл. {{minutes}} мин.", "bridging.estimatedTime.secondsOnly": "прибл. {{seconds}} с.", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Свечной график", "chart.error.pools": "Невозможно отобразить исторические данные для текущего пула.", "chart.error.tokens": "Невозможно отобразить исторические данные для текущего токена.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "Соответствующие пулы v2 не найдены. Еще раз проверьте выбранные токены и убедитесь, что подключились к правильному кошельку.", "pools.explore": "Исследование пулов", "portfolio.activity.filters.timePeriod.all": "Все время", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "Все типы", - "portfolio.activity.filters.transactionType.deposits": "Депозиты", - "portfolio.activity.filters.transactionType.staking": "Стейкинг", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Свопы", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Активность", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "Отслеживайте свои криптовалюты во всех блокчейнах и протоколах", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT", "portfolio.overview.title": "Обзор", "portfolio.title": "Портфель", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Распределение", "portfolio.tokens.table.column.balance": "Баланс", "portfolio.tokens.table.column.change1d": "Изменения за 1 дн.", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "Недостаточно {{tokenSymbol}} в {{chain}}", "v2.notAvailable": "Протокол Uniswap V2 недоступен в этой сети.", "wallet.appSignIn": "Войти через приложение", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "Подключая кошелек, вы принимаете Условия обслуживания и Политику конфиденциальности Uniswap Labs.", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "В подключенном кошельке не поддерживаются некоторые функции.", diff --git a/packages/uniswap/src/i18n/locales/translations/sl-SI.json b/packages/uniswap/src/i18n/locales/translations/sl-SI.json index 7953e1a00d8..223da00c4b1 100644 --- a/packages/uniswap/src/i18n/locales/translations/sl-SI.json +++ b/packages/uniswap/src/i18n/locales/translations/sl-SI.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Zakleni denarnico", "settings.action.privacy": "Politika zasebnosti", "settings.action.terms": "Pogoji storitve", + "settings.connectWalletPlatform.warning": "Za uporabo Uniswapa na {{platform}}se povežite z denarnico, ki podpira {{platform}}.", "settings.footer": "Narejeno z ljubeznijo, \nekipa Uniswap 🦄", "settings.hideSmallBalances": "Skrij majhna stanja", "settings.hideSmallBalances.subtitle": "Stanja pod 1 USD bodo skrita v vašem portfelju.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Ta aplikacija podpira pametne denarnice", "smartWallets.unavailableModal.description": "Nastavitve pametne denarnice za {{displayName}}zdaj upravlja drug ponudnik denarnic. Uniswap lahko še naprej uporabljate kot običajno.", "smartWallets.unavailableModal.title": "Funkcije pametne denarnice niso na voljo", - "solanaPromo.banner.description": "Trgujte z žetoni Solana neposredno v spletni aplikaciji Uniswap.", + "solanaPromo.banner.description": "Trgujte z žetoni Solana neposredno na Uniswapu.", "solanaPromo.banner.title": "Solana je zdaj na voljo", "solanaPromo.modal.connectWallet": "Povežite svojo najljubšo denarnico Solana", "solanaPromo.modal.startSwapping.button": "Začnite menjati na Solani", diff --git a/packages/uniswap/src/i18n/locales/translations/sr-SP.json b/packages/uniswap/src/i18n/locales/translations/sr-SP.json index a65b21f9ec0..afaef20798b 100644 --- a/packages/uniswap/src/i18n/locales/translations/sr-SP.json +++ b/packages/uniswap/src/i18n/locales/translations/sr-SP.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Закључајте новчаник", "settings.action.privacy": "Правила о приватности", "settings.action.terms": "Услови коришћења", + "settings.connectWalletPlatform.warning": "To use Uniswap on {{platform}}, connect to a wallet that supports {{platform}}.", "settings.footer": "Направљен с љубављу, \nУнисвап тим 🦄", "settings.hideSmallBalances": "Сакријте мале биланце", "settings.hideSmallBalances.subtitle": "Balances under 1 USD will be hidden from your portfolio.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "This app supports smart wallets", "smartWallets.unavailableModal.description": "A different wallet provider is now managing smart wallet settings for {{displayName}}. You can continue using Uniswap as normal.", "smartWallets.unavailableModal.title": "Smart wallet features unavailable", - "solanaPromo.banner.description": "Trade Solana tokens directly on the Uniswap Web App.", + "solanaPromo.banner.description": "Trade Solana tokens directly on Uniswap.", "solanaPromo.banner.title": "Solana is now available", "solanaPromo.modal.connectWallet": "Connect your favorite Solana wallet", "solanaPromo.modal.startSwapping.button": "Start swapping on Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/sv-SE.json b/packages/uniswap/src/i18n/locales/translations/sv-SE.json index 87294b31017..dd01404d9fc 100644 --- a/packages/uniswap/src/i18n/locales/translations/sv-SE.json +++ b/packages/uniswap/src/i18n/locales/translations/sv-SE.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Lås plånbok", "settings.action.privacy": "Integritetspolicy", "settings.action.terms": "Användarvillkor", + "settings.connectWalletPlatform.warning": "För att använda Uniswap på {{platform}}, anslut till en plånbok som stöder {{platform}}.", "settings.footer": "Tillverkad med kärlek, \nUniswap Team 🦄", "settings.hideSmallBalances": "Dölj små saldon", "settings.hideSmallBalances.subtitle": "Saldon under 1 USD kommer att döljas från din portfölj.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Den här appen stöder smarta plånböcker", "smartWallets.unavailableModal.description": "En annan plånboksleverantör hanterar nu smarta plånboksinställningar för {{displayName}}. Du kan fortsätta använda Uniswap som vanligt.", "smartWallets.unavailableModal.title": "Smarta plånboksfunktioner är inte tillgängliga", - "solanaPromo.banner.description": "Handla Solana-tokens direkt i Uniswap-webbappen.", + "solanaPromo.banner.description": "Handla Solana-tokens direkt på Uniswap.", "solanaPromo.banner.title": "Solana är nu tillgänglig", "solanaPromo.modal.connectWallet": "Anslut din favorit Solana-plånbok", "solanaPromo.modal.startSwapping.button": "Börja byta på Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/sw-TZ.json b/packages/uniswap/src/i18n/locales/translations/sw-TZ.json index 8015c9a4637..7e2958541b6 100644 --- a/packages/uniswap/src/i18n/locales/translations/sw-TZ.json +++ b/packages/uniswap/src/i18n/locales/translations/sw-TZ.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Funga mkoba", "settings.action.privacy": "Sera ya faragha", "settings.action.terms": "Masharti ya huduma", + "settings.connectWalletPlatform.warning": "To use Uniswap on {{platform}}, connect to a wallet that supports {{platform}}.", "settings.footer": "Imetengenezwa kwa upendo, \nTimu ya Uniswap 🦄", "settings.hideSmallBalances": "Ficha mizani ndogo", "settings.hideSmallBalances.subtitle": "Balances under 1 USD will be hidden from your portfolio.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "This app supports smart wallets", "smartWallets.unavailableModal.description": "A different wallet provider is now managing smart wallet settings for {{displayName}}. You can continue using Uniswap as normal.", "smartWallets.unavailableModal.title": "Smart wallet features unavailable", - "solanaPromo.banner.description": "Trade Solana tokens directly on the Uniswap Web App.", + "solanaPromo.banner.description": "Trade Solana tokens directly on Uniswap.", "solanaPromo.banner.title": "Solana is now available", "solanaPromo.modal.connectWallet": "Connect your favorite Solana wallet", "solanaPromo.modal.startSwapping.button": "Start swapping on Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/tr-TR.json b/packages/uniswap/src/i18n/locales/translations/tr-TR.json index 5b508028083..8282c8779ad 100644 --- a/packages/uniswap/src/i18n/locales/translations/tr-TR.json +++ b/packages/uniswap/src/i18n/locales/translations/tr-TR.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} dk {{seconds}} sn", "bridging.estimatedTime.minutesOnly": "~{{minutes}} dk", "bridging.estimatedTime.secondsOnly": "~{{seconds}} sn", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Mum grafiği", "chart.error.pools": "Geçerli havuza ilişkin geçmiş veriler görüntülenemiyor.", "chart.error.tokens": "Geçerli token'ın geçmiş verileri görüntülenemiyor.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "Eşleşen v2 havuzları bulunamadı. Token seçimini bir kez daha kontrol et ve doğru cüzdana bağlı olduğundan emin ol.", "pools.explore": "Havuzları keşfet", "portfolio.activity.filters.timePeriod.all": "Her zaman", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "Tüm türler", - "portfolio.activity.filters.transactionType.deposits": "Yatırılan", - "portfolio.activity.filters.transactionType.staking": "Staking", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Swap'lar", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Etkinlik", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "Kripto para portföyünü tüm zincirlerde ve protokollerde takip et", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT'ler", "portfolio.overview.title": "Genel Bakış", "portfolio.title": "Portföy", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Dağıtım", "portfolio.tokens.table.column.balance": "Bakiye", "portfolio.tokens.table.column.change1d": "1 Günlük Değişim", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "{{chain}} zincirinde yeterli {{tokenSymbol}} yok", "v2.notAvailable": "Uniswap V2 bu ağda mevcut değil.", "wallet.appSignIn": "Uygulama ile giriş yap", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "Bir cüzdan bağlayarak Uniswap Labs'ın Hizmet Şartlarını ve Gizlilik Politikasını kabul etmiş olursun.", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "Bağlı cüzdanın, bazı özellikleri desteklemiyor.", diff --git a/packages/uniswap/src/i18n/locales/translations/uk-UA.json b/packages/uniswap/src/i18n/locales/translations/uk-UA.json index 147135f6657..2cd48cba7bb 100644 --- a/packages/uniswap/src/i18n/locales/translations/uk-UA.json +++ b/packages/uniswap/src/i18n/locales/translations/uk-UA.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Заблокувати гаманець", "settings.action.privacy": "Політика конфіденційності", "settings.action.terms": "Умови використання", + "settings.connectWalletPlatform.warning": "Щоб використовувати Uniswap на {{platform}}, підключіться до гаманця, який підтримує {{platform}}.", "settings.footer": "Зроблено з любов’ю, \nкоманда Uniswap 🦄", "settings.hideSmallBalances": "Приховайте невеликі залишки", "settings.hideSmallBalances.subtitle": "Залишки менше 1 долара США будуть приховані з вашого портфеля.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Цей додаток підтримує розумні гаманці", "smartWallets.unavailableModal.description": "Інший постачальник гаманців тепер керує налаштуваннями смарт-гаманця для {{displayName}}. Ви можете продовжувати користуватися Uniswap як завжди.", "smartWallets.unavailableModal.title": "Функції розумного гаманця недоступні", - "solanaPromo.banner.description": "Торгуйте токенами Solana безпосередньо у веб-додатку Uniswap.", + "solanaPromo.banner.description": "Торгуйте токенами Solana безпосередньо на Uniswap.", "solanaPromo.banner.title": "Солана вже доступна", "solanaPromo.modal.connectWallet": "Підключіть свій улюблений гаманець Solana", "solanaPromo.modal.startSwapping.button": "Почніть обмін на Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/ur-PK.json b/packages/uniswap/src/i18n/locales/translations/ur-PK.json index af9efc42fb9..184ada9065d 100644 --- a/packages/uniswap/src/i18n/locales/translations/ur-PK.json +++ b/packages/uniswap/src/i18n/locales/translations/ur-PK.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "پرس مقفل کریں۔", "settings.action.privacy": "رازداری کی پالیسی", "settings.action.terms": "سروس کی شرائط", + "settings.connectWalletPlatform.warning": "{{platform}}پر Uniswap استعمال کرنے کے لیے، ایک ایسے والیٹ سے جڑیں جو {{platform}}کو سپورٹ کرتا ہو۔", "settings.footer": "محبت کے ساتھ بنایا گیا، \nUnswap ٹیم 🦄", "settings.hideSmallBalances": "چھوٹے بیلنس چھپائیں۔", "settings.hideSmallBalances.subtitle": "1 USD سے کم بیلنس آپ کے پورٹ فولیو سے چھپائے جائیں گے۔", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "یہ ایپ سمارٹ بٹوے کو سپورٹ کرتی ہے۔", "smartWallets.unavailableModal.description": "ایک مختلف والیٹ فراہم کنندہ اب {{displayName}}کے لیے سمارٹ والیٹ کی ترتیبات کا انتظام کر رہا ہے۔ آپ یونی سویپ کا استعمال معمول کے مطابق جاری رکھ سکتے ہیں۔", "smartWallets.unavailableModal.title": "اسمارٹ والیٹ کی خصوصیات دستیاب نہیں ہیں۔", - "solanaPromo.banner.description": "سولانا ٹوکنز کو براہ راست Uniswap ویب ایپ پر تجارت کریں۔", + "solanaPromo.banner.description": "سولانا ٹوکنز کو براہ راست Uniswap پر تجارت کریں۔", "solanaPromo.banner.title": "سولانا اب دستیاب ہے۔", "solanaPromo.modal.connectWallet": "اپنے پسندیدہ سولانا والیٹ کو جوڑیں۔", "solanaPromo.modal.startSwapping.button": "سولانا پر تبادلہ کرنا شروع کریں۔", diff --git a/packages/uniswap/src/i18n/locales/translations/vi-VN.json b/packages/uniswap/src/i18n/locales/translations/vi-VN.json index dd72bb83886..ea0d816cc7e 100644 --- a/packages/uniswap/src/i18n/locales/translations/vi-VN.json +++ b/packages/uniswap/src/i18n/locales/translations/vi-VN.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} phút {{seconds}} giây", "bridging.estimatedTime.minutesOnly": "~{{minutes}} phút", "bridging.estimatedTime.secondsOnly": "~{{seconds}} giây", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Biểu đồ nến", "chart.error.pools": "Không thể hiển thị dữ liệu lịch sử cho pool hiện tại.", "chart.error.tokens": "Không thể hiển thị dữ liệu lịch sử cho token hiện tại.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "Không tìm thấy pool v2 trùng khớp. Hãy kiểm tra lại lựa chọn token của bạn và đảm bảo bạn đã kết nối với đúng ví.", "pools.explore": "Khám phá pool", "portfolio.activity.filters.timePeriod.all": "Mọi thời điểm", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "Mọi loại", - "portfolio.activity.filters.transactionType.deposits": "Các giao dịch nạp", - "portfolio.activity.filters.transactionType.staking": "Staking", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Các giao dịch hoán đổi", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Hoạt động", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "Theo dõi danh mục đầu tư crypto của bạn trên tất cả các blockchain và giao thức", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT", "portfolio.overview.title": "Tổng quan", "portfolio.title": "Danh mục đầu tư", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Phân bổ", "portfolio.tokens.table.column.balance": "Số dư", "portfolio.tokens.table.column.change1d": "Biến động trong 1 ngày", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "Không đủ {{tokenSymbol}} trên {{chain}}", "v2.notAvailable": "Uniswap V2 không khả dụng trên mạng này.", "wallet.appSignIn": "Đăng nhập bằng ứng dụng", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "Bằng việc kết nối ví, bạn đồng ý với Điều khoản dịch vụ của Uniswap Labs và chấp nhận Chính sách về quyền riêng tư của Uniswap Labs.", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "Ví đã kết nối của bạn không hỗ trợ một số tính năng.", diff --git a/packages/uniswap/src/i18n/locales/translations/zh-CN.json b/packages/uniswap/src/i18n/locales/translations/zh-CN.json index 4822b97d6f4..17ad3bb5632 100644 --- a/packages/uniswap/src/i18n/locales/translations/zh-CN.json +++ b/packages/uniswap/src/i18n/locales/translations/zh-CN.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} 分钟 {{seconds}} 秒", "bridging.estimatedTime.minutesOnly": "~{{minutes}} 分钟", "bridging.estimatedTime.secondsOnly": "~{{seconds}} 秒", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "K 线图", "chart.error.pools": "无法显示当前资金池的历史数据。", "chart.error.tokens": "无法显示当前代币的历史数据。", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "未找到相符的 v2 资金池。请仔细检查你选择的代币,并确保你已连接至正确的钱包。", "pools.explore": "探索资金池", "portfolio.activity.filters.timePeriod.all": "所有时间", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "所有类型", - "portfolio.activity.filters.transactionType.deposits": "存入", - "portfolio.activity.filters.transactionType.staking": "质押", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "交换", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "活动", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "跨所有区块链和协议追踪你的加密货币资产组合", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "非同质化代币", "portfolio.overview.title": "概览", "portfolio.title": "资产组合", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "配额", "portfolio.tokens.table.column.balance": "余额", "portfolio.tokens.table.column.change1d": "24 小时变动", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "{{chain}} 上的 {{tokenSymbol}} 不足", "v2.notAvailable": "Uniswap V2 在此网络上不可用。", "wallet.appSignIn": "使用应用登录", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "通过连接钱包,表明你同意 Uniswap 实验室 的服务条款及其隐私政策。", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "某些功能你的联网钱包不支持。", diff --git a/packages/uniswap/src/i18n/locales/translations/zh-TW.json b/packages/uniswap/src/i18n/locales/translations/zh-TW.json index 43410fc3108..21c0ea4913e 100644 --- a/packages/uniswap/src/i18n/locales/translations/zh-TW.json +++ b/packages/uniswap/src/i18n/locales/translations/zh-TW.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} 分 {{seconds}} 秒", "bridging.estimatedTime.minutesOnly": "~{{minutes}} 分鐘", "bridging.estimatedTime.secondsOnly": "~{{seconds}} 秒", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "K 線圖表", "chart.error.pools": "無法顯示目前資產池的過往記錄資料。", "chart.error.tokens": "無法顯示目前代幣的過往記錄資料。", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "未找到相符的 v2 資產池。請仔細檢查你選取的代幣,並確保你已連接至正確的錢包。", "pools.explore": "探索資產池", "portfolio.activity.filters.timePeriod.all": "全部時間", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "所有類型", - "portfolio.activity.filters.transactionType.deposits": "存入", - "portfolio.activity.filters.transactionType.staking": "質押", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "交換", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "活動", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "跨所有鏈和協定追蹤您的加密貨幣資產組合", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT", "portfolio.overview.title": "概覽", "portfolio.title": "資產組合", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "配額", "portfolio.tokens.table.column.balance": "餘額", "portfolio.tokens.table.column.change1d": "1 日變動", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "{{chain}} 上的 {{tokenSymbol}} 不足", "v2.notAvailable": "Uniswap V2 在此網路上不適用。", "wallet.appSignIn": "使用 App 登入", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "連線錢包即表示你同意 Uniswap Labs 的服務條款並同意其隱私權政策。", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "你的已連接錢包不支援某些功能。", diff --git a/packages/uniswap/src/state/oldTypes.ts b/packages/uniswap/src/state/oldTypes.ts index c78dd73667e..964e7c1d065 100644 --- a/packages/uniswap/src/state/oldTypes.ts +++ b/packages/uniswap/src/state/oldTypes.ts @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { GraphQLApi } from '@universe/api' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { SafetyInfo } from 'uniswap/src/features/dataApi/types' diff --git a/packages/uniswap/src/test/fixtures/gql/assets/tokens.ts b/packages/uniswap/src/test/fixtures/gql/assets/tokens.ts index ef474c92660..708ed37422c 100644 --- a/packages/uniswap/src/test/fixtures/gql/assets/tokens.ts +++ b/packages/uniswap/src/test/fixtures/gql/assets/tokens.ts @@ -58,6 +58,8 @@ export const token = createFixture({ sellFeeBps: '', }, protectionInfo, + isBridged: undefined, + bridgedWithdrawalInfo: undefined, })) export const tokenBalance = createFixture()(() => ({ diff --git a/packages/uniswap/src/test/fixtures/testIDs.ts b/packages/uniswap/src/test/fixtures/testIDs.ts index 4536dff1a7a..dc0ef02f8b1 100644 --- a/packages/uniswap/src/test/fixtures/testIDs.ts +++ b/packages/uniswap/src/test/fixtures/testIDs.ts @@ -69,6 +69,7 @@ export const TestID = { ExploreFilterChainPrefix: 'explore-filter-chain-', ExploreSearchInput: 'explore-search-input', ExploreSortButton: 'explore-sort-button', + ExploreTab: 'explore-tab', ExploreSortByVolume: 'explore-sort-by-volume', ExploreTokensSearchInput: 'explore-tokens-search-input', Favorite: 'favorite', @@ -81,6 +82,7 @@ export const TestID = { HiddenNftsRow: 'hidden-nfts-row', HelpIcon: 'help-icon', HelpModal: 'help-modal', + HomeTab: 'home-tab', ImportAccount: 'import-account', ImportAccountInput: 'import-account-input', InvertPrice: 'invert-price', diff --git a/packages/uniswap/src/test/mocks/gql/mocks.ts b/packages/uniswap/src/test/mocks/gql/mocks.ts index ec307734bc0..894a005e0ae 100644 --- a/packages/uniswap/src/test/mocks/gql/mocks.ts +++ b/packages/uniswap/src/test/mocks/gql/mocks.ts @@ -28,6 +28,8 @@ export const mocks = { symbol: () => faker.lorem.word(), protectionInfo: () => ({ result: randomEnumValue(GraphQLApi.ProtectionResult), attackTypes: [] }), feeData: () => ({ buyFeeBps: '', sellFeeBps: '' }), + isBridged: () => null, + bridgedWithdrawalInfo: () => null, }, Amount: { id: () => faker.datatype.uuid(), diff --git a/packages/uniswap/src/utils/datadog.web.ts b/packages/uniswap/src/utils/datadog.web.ts index 3da89dd1680..fd79ee7cc6e 100644 --- a/packages/uniswap/src/utils/datadog.web.ts +++ b/packages/uniswap/src/utils/datadog.web.ts @@ -1,17 +1,18 @@ import { datadogLogs } from '@datadog/browser-logs' import { datadogRum, RumEvent, RumEventDomainContext, RumFetchResourceEventDomainContext } from '@datadog/browser-rum' -import { config } from 'uniswap/src/config' import { DatadogIgnoredErrorsConfigKey, DatadogIgnoredErrorsValType, DatadogSessionSampleRateKey, DatadogSessionSampleRateValType, DynamicConfigs, -} from 'uniswap/src/features/gating/configs' -import { Experiments } from 'uniswap/src/features/gating/experiments' -import { WALLET_FEATURE_FLAG_NAMES, WEB_FEATURE_FLAG_NAMES } from 'uniswap/src/features/gating/flags' -import { getDynamicConfigValue } from 'uniswap/src/features/gating/hooks' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' + Experiments, + getDynamicConfigValue, + getStatsigClient, + WALLET_FEATURE_FLAG_NAMES, + WEB_FEATURE_FLAG_NAMES, +} from '@universe/gating' +import { config } from 'uniswap/src/config' import { getUniqueId } from 'utilities/src/device/uniqueId' import { datadogEnabledBuild, localDevDatadogEnabled } from 'utilities/src/environment/constants' import { isBetaEnv } from 'utilities/src/environment/env' @@ -40,7 +41,9 @@ function beforeSend(event: RumEvent, context: RumEventDomainContext): boolean { defaultValue: [], }) - const ignoredError = ignoredErrors.find(({ messageContains }) => event.error.message.includes(messageContains)) + const ignoredError = ignoredErrors.find(({ messageContains }: { messageContains: string }) => + event.error.message.includes(messageContains), + ) if (ignoredError && Math.random() > ignoredError.sampleRate) { return false } diff --git a/packages/uniswap/src/utils/search/doesTokenMatchSearchTerm.test.ts b/packages/uniswap/src/utils/search/doesTokenMatchSearchTerm.test.ts new file mode 100644 index 00000000000..f04ac41d388 --- /dev/null +++ b/packages/uniswap/src/utils/search/doesTokenMatchSearchTerm.test.ts @@ -0,0 +1,419 @@ +import { Currency } from '@uniswap/sdk-core' +import { DAI, nativeOnChain, USDC, WBTC } from 'uniswap/src/constants/tokens' +import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { doesTokenMatchSearchTerm } from 'uniswap/src/utils/search/doesTokenMatchSearchTerm' + +// Test data factory functions using real tokens +const createMockCurrencyInfo = ( + overrides: Partial<{ currencyId: string; currency: Currency }> = {}, +): { currencyId: string; currency: Currency } => ({ + currencyId: 'TEST', + currency: USDC, // Default to USDC + ...overrides, +}) + +const createMockTokenWithInfo = ( + overrides: Partial<{ currencyInfo: { currencyId: string; currency: Currency } | null }> = {}, +): { currencyInfo: { currencyId: string; currency: Currency } | null } => ({ + currencyInfo: createMockCurrencyInfo(), + ...overrides, +}) + +describe('doesTokenMatchSearchTerm', () => { + describe('when searchTerm is empty or undefined', () => { + it('should return true when searchTerm is undefined', () => { + const token = createMockTokenWithInfo() + + const result = doesTokenMatchSearchTerm(token, undefined as any) + + expect(result).toBe(true) + }) + + it('should return true when searchTerm is null', () => { + const token = createMockTokenWithInfo() + + const result = doesTokenMatchSearchTerm(token, null as any) + + expect(result).toBe(true) + }) + + it('should return true when searchTerm is empty string', () => { + const token = createMockTokenWithInfo() + + const result = doesTokenMatchSearchTerm(token, '') + + expect(result).toBe(true) + }) + + it('should return true when searchTerm is only whitespace', () => { + const token = createMockTokenWithInfo() + + const result = doesTokenMatchSearchTerm(token, ' ') + + expect(result).toBe(true) + }) + + it('should return true when searchTerm is only tabs and newlines', () => { + const token = createMockTokenWithInfo() + + const result = doesTokenMatchSearchTerm(token, '\t\n\r ') + + expect(result).toBe(true) + }) + }) + + describe('when currencyInfo is null', () => { + it('should return false when currencyInfo is null', () => { + const token = createMockTokenWithInfo({ + currencyInfo: null, + }) + + const result = doesTokenMatchSearchTerm(token, 'test') + + expect(result).toBe(false) + }) + }) + + describe('when searching by token name', () => { + it('should match when search term is in token name (case insensitive)', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: DAI, // DAI has name "Dai Stablecoin" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'dai') + + expect(result).toBe(true) + }) + + it('should match when search term is in token name with different case', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: DAI, // DAI has name "Dai Stablecoin" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'STABLECOIN') + + expect(result).toBe(true) + }) + + it('should not match when search term is not in token name', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has name "USD Coin" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'bitcoin') + + expect(result).toBe(false) + }) + + it('should handle undefined token name', () => { + // Create a token with undefined name by modifying WBTC + const tokenWithUndefinedName = { + ...WBTC, + name: undefined, + } as any + + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: tokenWithUndefinedName, + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'test') + + expect(result).toBe(false) + }) + }) + + describe('when searching by token symbol', () => { + it('should match when search term is in token symbol (case insensitive)', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has symbol "USDC" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'usd') + + expect(result).toBe(true) + }) + + it('should match when search term is in token symbol with different case', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has symbol "USDC" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'USDC') + + expect(result).toBe(true) + }) + + it('should not match when search term is not in token symbol', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has symbol "USDC" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'bitcoin') + + expect(result).toBe(false) + }) + + it('should handle undefined token symbol', () => { + // Create a token with undefined symbol by modifying WBTC + const tokenWithUndefinedSymbol = { + ...WBTC, + symbol: undefined, + } as any + + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: tokenWithUndefinedSymbol, + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'test') + + expect(result).toBe(false) + }) + }) + + describe('when searching by token address', () => { + it('should match when search term is in token address (case insensitive)', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has address starting with 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'a0b8') + + expect(result).toBe(true) + }) + + it('should match when search term is in token address with different case', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has address starting with 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'A0B8') + + expect(result).toBe(true) + }) + + it('should not match when search term is not in token address', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, + }), + }) + + const result = doesTokenMatchSearchTerm(token, '9999') + + expect(result).toBe(false) + }) + + it('should not search by address for native currencies', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: nativeOnChain(UniverseChainId.Mainnet), // Native ETH + }), + }) + + const result = doesTokenMatchSearchTerm(token, '0x') + + expect(result).toBe(false) + }) + }) + + describe('when multiple fields match', () => { + it('should return true if name matches even if symbol and address do not', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: DAI, // DAI has name "Dai Stablecoin" and symbol "DAI" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'dai') + + expect(result).toBe(true) + }) + + it('should return true if symbol matches even if name and address do not', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has symbol "USDC" and name "USD Coin" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'usd') + + expect(result).toBe(true) + }) + + it('should return true if address matches even if name and symbol do not', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has address starting with 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'a0b8') + + expect(result).toBe(true) + }) + }) + + describe('edge cases', () => { + it('should handle partial matches at the beginning of strings', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: DAI, // DAI has symbol "DAI" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'dai') + + expect(result).toBe(true) + }) + + it('should handle partial matches at the end of strings', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: DAI, // DAI has name "Dai Stablecoin" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'coin') + + expect(result).toBe(true) + }) + + it('should handle partial matches in the middle of strings', () => { + // Fix the imported WBTC token properties + const wbtcToken = { + ...WBTC, + name: 'Wrapped BTC', + symbol: 'WBTC', + } as any + + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: wbtcToken, + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'wrapped') + + expect(result).toBe(true) + }) + + it('should handle special characters in search term', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has name "USD Coin" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'usd') + + expect(result).toBe(true) + }) + + it('should handle very long search terms', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, + }), + }) + + const longSearchTerm = 'a'.repeat(1000) + const result = doesTokenMatchSearchTerm(token, longSearchTerm) + + expect(result).toBe(false) + }) + + it('should handle empty token name and symbol', () => { + // Create a token with empty name and symbol by modifying WBTC + const tokenWithEmptyFields = { + ...WBTC, + name: '', + symbol: '', + } as any + + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: tokenWithEmptyFields, + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'test') + + expect(result).toBe(false) + }) + }) + + describe('with different currency types', () => { + it('should work with Token instances', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC is a Token instance + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'usd') + + expect(result).toBe(true) + }) + + it('should work with NativeCurrency instances', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: nativeOnChain(UniverseChainId.Mainnet), // Native ETH + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'ethereum') + + expect(result).toBe(true) + }) + + it('should not search by address for NativeCurrency', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: nativeOnChain(UniverseChainId.Mainnet), // Native ETH + }), + }) + + // NativeCurrency doesn't have an address, so this should not match + const result = doesTokenMatchSearchTerm(token, '0x') + + expect(result).toBe(false) + }) + }) + + describe('case sensitivity', () => { + it('should be case insensitive for all fields', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has name "USD Coin" and symbol "USDC" + }), + }) + + expect(doesTokenMatchSearchTerm(token, 'usd')).toBe(true) + expect(doesTokenMatchSearchTerm(token, 'USD')).toBe(true) + expect(doesTokenMatchSearchTerm(token, 'Usd')).toBe(true) + expect(doesTokenMatchSearchTerm(token, 'UsD')).toBe(true) + }) + }) +}) diff --git a/packages/uniswap/src/utils/search/doesTokenMatchSearchTerm.ts b/packages/uniswap/src/utils/search/doesTokenMatchSearchTerm.ts new file mode 100644 index 00000000000..f056a6f7c2a --- /dev/null +++ b/packages/uniswap/src/utils/search/doesTokenMatchSearchTerm.ts @@ -0,0 +1,37 @@ +import { Currency, Token } from '@uniswap/sdk-core' + +/** + * Checks if a token matches a search term. + * + * @param token - The token to check + * @param searchTerm - The search term to match against + * @returns True if the token matches the search term, false otherwise + */ +export function doesTokenMatchSearchTerm( + token: { currencyInfo: { currencyId: string; currency: Currency } | null }, + searchTerm: string, +): boolean { + if (!searchTerm || !searchTerm.trim()) { + return true + } + + const lowercaseSearch = searchTerm.toLowerCase() + + const currencyInfo = token.currencyInfo + if (!currencyInfo) { + return false + } + const currency = currencyInfo.currency + + // Search by token name + const nameIncludesSearch = currency.name?.toLowerCase().includes(lowercaseSearch) + + // Search by token symbol + const symbolIncludesSearch = currency.symbol?.toLowerCase().includes(lowercaseSearch) + + // Search by token address (normalized for consistency with explore page) + const addressIncludesSearch = + currency instanceof Token ? currency.address.toLowerCase().includes(lowercaseSearch) : false + + return Boolean(nameIncludesSearch || symbolIncludesSearch || addressIncludesSearch) +} diff --git a/packages/uniswap/src/utils/search/getPossibleChainMatchFromSearchWord.test.ts b/packages/uniswap/src/utils/search/getPossibleChainMatchFromSearchWord.test.ts new file mode 100644 index 00000000000..af0cfc67144 --- /dev/null +++ b/packages/uniswap/src/utils/search/getPossibleChainMatchFromSearchWord.test.ts @@ -0,0 +1,437 @@ +import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { getPossibleChainMatchFromSearchWord } from 'uniswap/src/utils/search/getPossibleChainMatchFromSearchWord' + +// Mock the dependencies before importing the function +jest.mock('uniswap/src/features/chains/chainInfo', () => ({ + getChainInfo: jest.fn(), +})) + +jest.mock('uniswap/src/features/chains/utils', () => ({ + isTestnetChain: jest.fn(), +})) + +// Import the mocked functions +import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' +import { isTestnetChain } from 'uniswap/src/features/chains/utils' + +const mockGetChainInfo = getChainInfo as any +const mockIsTestnetChain = isTestnetChain as any + +describe('getPossibleChainMatchFromSearchWord', () => { + beforeEach(() => { + jest.clearAllMocks() + }) + + describe('when search word is empty or invalid', () => { + it('should return undefined when search word is empty string', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + const result = getPossibleChainMatchFromSearchWord('', enabledChains) + + expect(result).toBeUndefined() + }) + + it('should return undefined when search word is null', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + const result = getPossibleChainMatchFromSearchWord(null as any, enabledChains) + + expect(result).toBeUndefined() + }) + + it('should return undefined when search word is undefined', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + const result = getPossibleChainMatchFromSearchWord(undefined as any, enabledChains) + + expect(result).toBeUndefined() + }) + + it('should return undefined when search word is only whitespace', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + // Mock the functions to return proper structure + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Polygon) { + return { + nativeCurrency: { name: 'Polygon' }, + interfaceName: 'polygon', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord(' ', enabledChains) + + expect(result).toBeUndefined() + }) + }) + + describe('when matching by native currency name', () => { + it('should match exact native currency name', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Polygon) { + return { + nativeCurrency: { name: 'Polygon' }, + interfaceName: 'polygon', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('ethereum', enabledChains) + + expect(result).toBe(UniverseChainId.Mainnet) + }) + + it('should be case insensitive for native currency name', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Polygon) { + return { + nativeCurrency: { name: 'Polygon' }, + interfaceName: 'polygon', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('ETHEREUM', enabledChains) + + expect(result).toBe(UniverseChainId.Mainnet) + }) + }) + + describe('when matching by interface name', () => { + it('should match exact interface name', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Polygon) { + return { + nativeCurrency: { name: 'Polygon' }, + interfaceName: 'polygon', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('mainnet', enabledChains) + + expect(result).toBe(UniverseChainId.Mainnet) + }) + + it('should be case insensitive for interface name', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Polygon) { + return { + nativeCurrency: { name: 'Polygon' }, + interfaceName: 'polygon', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('MAINNET', enabledChains) + + expect(result).toBe(UniverseChainId.Mainnet) + }) + + it('should match polygon interface name', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Polygon) { + return { + nativeCurrency: { name: 'Polygon' }, + interfaceName: 'polygon', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('polygon', enabledChains) + + expect(result).toBe(UniverseChainId.Polygon) + }) + + it('should match arbitrum interface name', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.ArbitrumOne] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.ArbitrumOne) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'arbitrum', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('arbitrum', enabledChains) + + expect(result).toBe(UniverseChainId.ArbitrumOne) + }) + }) + + describe('when handling testnet chains', () => { + it('should skip testnet chains', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Sepolia] + + mockIsTestnetChain.mockImplementation((chainId: UniverseChainId) => chainId === UniverseChainId.Sepolia) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Sepolia) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'sepolia', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('ethereum', enabledChains) + + expect(result).toBe(UniverseChainId.Mainnet) + expect(mockIsTestnetChain).toHaveBeenCalledWith(UniverseChainId.Mainnet) + // The function returns early when it finds a match, so it doesn't check Sepolia + // This is the correct behavior - it should return the first non-testnet match + }) + + it('should return undefined when only testnet chains match', () => { + const enabledChains = [UniverseChainId.Sepolia] + + mockIsTestnetChain.mockReturnValue(true) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Sepolia) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'sepolia', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('ethereum', enabledChains) + + expect(result).toBeUndefined() + }) + }) + + describe('when no matches are found', () => { + it('should return undefined when no chains match', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Polygon) { + return { + nativeCurrency: { name: 'Polygon' }, + interfaceName: 'polygon', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('bitcoin', enabledChains) + + expect(result).toBeUndefined() + }) + + it('should return undefined when enabledChains is empty', () => { + const enabledChains: UniverseChainId[] = [] + + const result = getPossibleChainMatchFromSearchWord('ethereum', enabledChains) + + expect(result).toBeUndefined() + }) + + it('should return undefined when all chains are testnets', () => { + const enabledChains = [UniverseChainId.Sepolia, UniverseChainId.UnichainSepolia] + + mockIsTestnetChain.mockReturnValue(true) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Sepolia) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'sepolia', + } as any + } + if (chainId === UniverseChainId.UnichainSepolia) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'unichain-sepolia', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('ethereum', enabledChains) + + expect(result).toBeUndefined() + }) + }) + + describe('when multiple chains could match', () => { + it('should return the first matching chain', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon, UniverseChainId.ArbitrumOne] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Polygon) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'polygon', + } as any + } + if (chainId === UniverseChainId.ArbitrumOne) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'arbitrum', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('ethereum', enabledChains) + + expect(result).toBe(UniverseChainId.Mainnet) + }) + }) + + describe('edge cases', () => { + it('should handle native currency names with empty first word', () => { + const enabledChains = [UniverseChainId.Mainnet] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: ' Ethereum' }, // Leading space + interfaceName: 'mainnet', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('ethereum', enabledChains) + + expect(result).toBeUndefined() + }) + + it('should handle interface names with special characters', () => { + const enabledChains = [UniverseChainId.Mainnet] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'main-net', // With hyphen + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('main-net', enabledChains) + + expect(result).toBe(UniverseChainId.Mainnet) + }) + + it('should match base chain interface name', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Base] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Base) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'base', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('base', enabledChains) + + expect(result).toBe(UniverseChainId.Base) + }) + }) +}) diff --git a/packages/uniswap/src/utils/search/getPossibleChainMatchFromSearchWord.ts b/packages/uniswap/src/utils/search/getPossibleChainMatchFromSearchWord.ts new file mode 100644 index 00000000000..5331ee7c0a2 --- /dev/null +++ b/packages/uniswap/src/utils/search/getPossibleChainMatchFromSearchWord.ts @@ -0,0 +1,47 @@ +import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' +import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { isTestnetChain } from 'uniswap/src/features/chains/utils' + +/** + * Finds a matching chain ID based on the provided chain name. + * This is intended to check if a singular word is a chain name. It doesn't + * look for chain names in multi-word searches. + * + * @param maybeChainName - The potential chain name to match against + * @param enabledChains - Array of enabled chain IDs to search within + * @returns The matching UniverseChainId or undefined if no match found + */ +export function getPossibleChainMatchFromSearchWord( + maybeChainName: string, + enabledChains: UniverseChainId[], +): UniverseChainId | undefined { + if (!maybeChainName) { + return undefined + } + + const lowerCaseChainName = maybeChainName.toLowerCase() + + for (const chainId of enabledChains) { + if (isTestnetChain(chainId)) { + continue + } + + const chainInfo = getChainInfo(chainId) + + // Check against native currency name + const nativeCurrencyName = chainInfo.nativeCurrency.name.toLowerCase() + const firstWord = nativeCurrencyName.split(' ')[0] + + if (firstWord && firstWord === lowerCaseChainName) { + return chainId + } + + // Check against interface name + const interfaceName = chainInfo.interfaceName.toLowerCase() + if (interfaceName === lowerCaseChainName) { + return chainId + } + } + + return undefined +} diff --git a/packages/uniswap/src/utils/search/parseChainFromTokenSearchQuery.test.ts b/packages/uniswap/src/utils/search/parseChainFromTokenSearchQuery.test.ts new file mode 100644 index 00000000000..cfecb304f8e --- /dev/null +++ b/packages/uniswap/src/utils/search/parseChainFromTokenSearchQuery.test.ts @@ -0,0 +1,138 @@ +import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { parseChainFromTokenSearchQuery } from 'uniswap/src/utils/search/parseChainFromTokenSearchQuery' + +describe('parseChainFromTokenSearchQuery', () => { + const enabledChains: UniverseChainId[] = [ + UniverseChainId.Mainnet, + UniverseChainId.ArbitrumOne, + UniverseChainId.Base, + UniverseChainId.Optimism, + UniverseChainId.Polygon, + ] + + describe('null/empty input handling', () => { + it('returns empty result for null/empty/whitespace inputs', () => { + expect(parseChainFromTokenSearchQuery(null, enabledChains)).toEqual({ chainFilter: null, searchTerm: null }) + expect(parseChainFromTokenSearchQuery('', enabledChains)).toEqual({ chainFilter: null, searchTerm: null }) + expect(parseChainFromTokenSearchQuery(' ', enabledChains)).toEqual({ chainFilter: null, searchTerm: null }) + }) + }) + + describe('single word searches', () => { + it('returns chain filter for chain names (native currency and interface)', () => { + expect(parseChainFromTokenSearchQuery('ethereum', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: null, + }) + expect(parseChainFromTokenSearchQuery('mainnet', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: null, + }) + expect(parseChainFromTokenSearchQuery('EtHeReUm', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: null, + }) // case insensitive + }) + + it('returns search term for non-chain words', () => { + expect(parseChainFromTokenSearchQuery('dai', enabledChains)).toEqual({ chainFilter: null, searchTerm: 'dai' }) + expect(parseChainFromTokenSearchQuery('unsupported', enabledChains)).toEqual({ + chainFilter: null, + searchTerm: 'unsupported', + }) + }) + }) + + describe('multi-word searches', () => { + it('parses chain from first word', () => { + expect(parseChainFromTokenSearchQuery('ethereum dai', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: 'dai', + }) + expect(parseChainFromTokenSearchQuery('ethereum dai token', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: 'dai token', + }) + expect(parseChainFromTokenSearchQuery('arbitrum uni corn token', enabledChains)).toEqual({ + chainFilter: UniverseChainId.ArbitrumOne, + searchTerm: 'uni corn token', + }) + }) + + it('parses chain from last word when first word is not a chain', () => { + expect(parseChainFromTokenSearchQuery('dai ethereum', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: 'dai', + }) + expect(parseChainFromTokenSearchQuery('uni corn token base', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Base, + searchTerm: 'uni corn token', + }) + }) + + it('prioritizes first word chain match over last word', () => { + expect(parseChainFromTokenSearchQuery('base token ethereum', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Base, + searchTerm: 'token ethereum', + }) + expect(parseChainFromTokenSearchQuery('ethereum token base', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: 'token base', + }) + }) + }) + + describe('edge cases', () => { + it('handles extra spaces and trimming', () => { + expect(parseChainFromTokenSearchQuery(' ethereum dai ', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: 'dai', + }) + expect(parseChainFromTokenSearchQuery('ethereum dai', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: 'dai', + }) + }) + + it('returns original search when no chain is found', () => { + expect(parseChainFromTokenSearchQuery('random search terms', enabledChains)).toEqual({ + chainFilter: null, + searchTerm: 'random search terms', + }) + }) + + it('handles chain name that matches but no search term remains', () => { + expect(parseChainFromTokenSearchQuery('ethereum', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: null, + }) + }) + }) + + describe('different chain types', () => { + it('parses various chain types', () => { + expect(parseChainFromTokenSearchQuery('arbitrum dai', enabledChains)).toEqual({ + chainFilter: UniverseChainId.ArbitrumOne, + searchTerm: 'dai', + }) + expect(parseChainFromTokenSearchQuery('base usdc', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Base, + searchTerm: 'usdc', + }) + expect(parseChainFromTokenSearchQuery('optimism link', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Optimism, + searchTerm: 'link', + }) + expect(parseChainFromTokenSearchQuery('polygon matic', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Polygon, + searchTerm: 'matic', + }) + }) + }) + + describe('empty enabled chains', () => { + it('returns search term when no chains are enabled', () => { + expect(parseChainFromTokenSearchQuery('eth dai', [])).toEqual({ chainFilter: null, searchTerm: 'eth dai' }) + }) + }) +}) diff --git a/packages/uniswap/src/utils/search/parseChainFromTokenSearchQuery.ts b/packages/uniswap/src/utils/search/parseChainFromTokenSearchQuery.ts new file mode 100644 index 00000000000..b44c3db8dad --- /dev/null +++ b/packages/uniswap/src/utils/search/parseChainFromTokenSearchQuery.ts @@ -0,0 +1,81 @@ +import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { getPossibleChainMatchFromSearchWord } from 'uniswap/src/utils/search/getPossibleChainMatchFromSearchWord' + +/** + * Parses a search query to extract chain filter and search term. + * Handles patterns like "eth dai", "dai eth", "ethereum usdc", etc. + * + * @param searchQuery - The search query string + * @param enabledChains - Array of enabled chain IDs to search within + * @returns An object containing the parsed `chainFilter` and `searchTerm` + */ +export function parseChainFromTokenSearchQuery( + searchQuery: string | null, + enabledChains: UniverseChainId[], +): { + chainFilter: UniverseChainId | null + searchTerm: string | null +} { + if (!searchQuery) { + return { + chainFilter: null, + searchTerm: null, + } + } + + const sanitizedSearch = searchQuery.trim().replace(/\s+/g, ' ') + const splitSearch = sanitizedSearch.split(' ') + if (splitSearch.length === 0) { + return { + chainFilter: null, + searchTerm: null, + } + } + + if (splitSearch.length === 1) { + const singleWordSearch = splitSearch[0] + const searchChainMatch = singleWordSearch + ? getPossibleChainMatchFromSearchWord(singleWordSearch, enabledChains) + : undefined + if (searchChainMatch) { + return { + chainFilter: searchChainMatch, + searchTerm: null, + } + } else { + return { + chainFilter: null, + searchTerm: splitSearch[0] || null, + } + } + } + + const firstWord = splitSearch[0]?.toLowerCase() + const lastWord = splitSearch[splitSearch.length - 1]?.toLowerCase() + + const firstWordChainMatch = firstWord ? getPossibleChainMatchFromSearchWord(firstWord, enabledChains) : undefined + const lastWordChainMatch = lastWord ? getPossibleChainMatchFromSearchWord(lastWord, enabledChains) : undefined + + if (firstWordChainMatch) { + // First word is chain, rest is search term + const search = splitSearch.slice(1).join(' ').trim() + return { + chainFilter: firstWordChainMatch, + searchTerm: search || null, + } + } + + if (lastWordChainMatch) { + // Last word is chain, preceding words are search term + const search = splitSearch.slice(0, -1).join(' ').trim() + return { + chainFilter: lastWordChainMatch, + searchTerm: search || null, + } + } + + return { + chainFilter: null, + searchTerm: searchQuery, + } +} diff --git a/packages/uniswap/tsconfig.json b/packages/uniswap/tsconfig.json index 156cfd244ec..0e4e5fb492b 100644 --- a/packages/uniswap/tsconfig.json +++ b/packages/uniswap/tsconfig.json @@ -13,6 +13,9 @@ }, { "path": "../config" + }, + { + "path": "../gating" } ], "compilerOptions": { diff --git a/packages/wallet/package.json b/packages/wallet/package.json index be879854949..bb6f34a492b 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -29,12 +29,13 @@ "@scure/bip32": "1.3.2", "@tanstack/react-query": "5.77.2", "@uniswap/analytics-events": "2.43.0", - "@uniswap/client-data-api": "0.0.14", + "@uniswap/client-data-api": "0.0.18", "@uniswap/permit2-sdk": "1.3.0", "@uniswap/router-sdk": "2.0.2", "@uniswap/sdk-core": "7.7.2", "@uniswap/universal-router-sdk": "4.19.5", "@universe/api": "workspace:^", + "@universe/gating": "workspace:^", "apollo3-cache-persist": "0.14.1", "dayjs": "1.11.7", "ethers": "5.7.2", diff --git a/packages/wallet/src/components/landing/LandingBackground.tsx b/packages/wallet/src/components/landing/LandingBackground.tsx index 656492eb7a3..d39a33cb798 100644 --- a/packages/wallet/src/components/landing/LandingBackground.tsx +++ b/packages/wallet/src/components/landing/LandingBackground.tsx @@ -76,7 +76,7 @@ const OnboardingAnimation = ({ easing: Easing.elastic(1.1), }), ) - }, [uniswapLogoScale]) + }, []) useTimeout(() => { setShowAnimatedElements(true) @@ -184,7 +184,7 @@ const AnimatedElements = ({ ) innerAnimation.value = withDelay(INNER_CIRCLE_SHOW_DELAY, withSpring(0.8)) outerAnimation.value = withDelay(OUTER_CIRCLE_SHOW_DELAY, withSpring(0.8)) - }, [innerAnimation, outerAnimation, rotation]) + }, []) const innerCircleStyle = useAnimatedStyle(() => { return { diff --git a/packages/wallet/src/components/smartWallet/smartAccounts/hooks.ts b/packages/wallet/src/components/smartWallet/smartAccounts/hooks.ts index 5b252e271bb..72f960be889 100644 --- a/packages/wallet/src/components/smartWallet/smartAccounts/hooks.ts +++ b/packages/wallet/src/components/smartWallet/smartAccounts/hooks.ts @@ -1,8 +1,7 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback, useEffect, useState } from 'react' import { useSelector } from 'react-redux' import { AccountType } from 'uniswap/src/features/accounts/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { DEFAULT_TOAST_HIDE_DELAY } from 'uniswap/src/features/notifications/constants' import { useSuccessfulSwapCompleted } from 'uniswap/src/features/transactions/hooks/useSuccessfulSwapCompleted' import { TransactionDetails } from 'uniswap/src/features/transactions/types/transactionDetails' diff --git a/packages/wallet/src/features/gating/userPropertyHooks.ts b/packages/wallet/src/features/gating/userPropertyHooks.ts index 3fe58e437cc..f9f9a571080 100644 --- a/packages/wallet/src/features/gating/userPropertyHooks.ts +++ b/packages/wallet/src/features/gating/userPropertyHooks.ts @@ -1,8 +1,8 @@ +import { getStatsigClient } from '@universe/gating' import { useEffect } from 'react' import { useUnitagsAddressQuery } from 'uniswap/src/data/apiClients/unitagsApi/useUnitagsAddressQuery' import { AccountType } from 'uniswap/src/features/accounts/types' import { useENSName } from 'uniswap/src/features/ens/api' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { getValidAddress } from 'uniswap/src/utils/addresses' import { logger } from 'utilities/src/logger/logger' diff --git a/packages/wallet/src/features/smartWallet/hooks/useNetworkBalances.tsx b/packages/wallet/src/features/smartWallet/hooks/useNetworkBalances.tsx index ced5d4c5724..75146ef0bb6 100644 --- a/packages/wallet/src/features/smartWallet/hooks/useNetworkBalances.tsx +++ b/packages/wallet/src/features/smartWallet/hooks/useNetworkBalances.tsx @@ -1,8 +1,8 @@ +import { useStatsigClientStatus } from '@universe/gating' import { useEffect, useState } from 'react' import { fetchGasFeeQuery } from 'uniswap/src/data/apiClients/uniswapApi/useGasFeeQuery' import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import { DEFAULT_NATIVE_ADDRESS } from 'uniswap/src/features/chains/evm/defaults' -import { useStatsigClientStatus } from 'uniswap/src/features/gating/hooks' import { createEthersProvider } from 'uniswap/src/features/providers/createEthersProvider' import { useSmartWalletChains } from 'wallet/src/features/smartWallet/hooks/useSmartWalletChains' import { NetworkInfo } from 'wallet/src/features/smartWallet/InsufficientFundsNetworkRow' diff --git a/packages/wallet/src/features/transactions/contexts/WalletUniswapContext.tsx b/packages/wallet/src/features/transactions/contexts/WalletUniswapContext.tsx index 4a3da58b3a1..3fa70472e1b 100644 --- a/packages/wallet/src/features/transactions/contexts/WalletUniswapContext.tsx +++ b/packages/wallet/src/features/transactions/contexts/WalletUniswapContext.tsx @@ -1,11 +1,10 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { ethers } from 'ethers' import React, { PropsWithChildren, useCallback, useEffect, useState } from 'react' import { UniswapProvider } from 'uniswap/src/contexts/UniswapContext' import { getDelegationService } from 'uniswap/src/domains/services' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useUpdateDelegatedState } from 'uniswap/src/features/smartWallet/delegation/hooks/useUpdateDelegateState' import { useHasAccountMismatchCallback } from 'uniswap/src/features/smartWallet/mismatch/hooks' import { MismatchContextProvider } from 'uniswap/src/features/smartWallet/mismatch/MismatchContext' diff --git a/packages/wallet/src/features/transactions/executeTransaction/services/featureFlagService.ts b/packages/wallet/src/features/transactions/executeTransaction/services/featureFlagService.ts index ea11a986c21..2780711d0a6 100644 --- a/packages/wallet/src/features/transactions/executeTransaction/services/featureFlagService.ts +++ b/packages/wallet/src/features/transactions/executeTransaction/services/featureFlagService.ts @@ -1,5 +1,5 @@ -import { ExperimentProperties } from 'uniswap/src/features/gating/experiments' -import type { FeatureFlags } from 'uniswap/src/features/gating/flags' +import type { FeatureFlags } from '@universe/gating' +import { ExperimentProperties } from '@universe/gating' export interface FeatureFlagService { isFeatureEnabled(flagName: FeatureFlags): boolean diff --git a/packages/wallet/src/features/transactions/executeTransaction/services/featureFlagServiceImpl.ts b/packages/wallet/src/features/transactions/executeTransaction/services/featureFlagServiceImpl.ts index b55151e3c28..dd5b6ec99a5 100644 --- a/packages/wallet/src/features/transactions/executeTransaction/services/featureFlagServiceImpl.ts +++ b/packages/wallet/src/features/transactions/executeTransaction/services/featureFlagServiceImpl.ts @@ -1,6 +1,4 @@ -import { ExperimentProperties } from 'uniswap/src/features/gating/experiments' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getExperimentValue, getFeatureFlag } from 'uniswap/src/features/gating/hooks' +import { ExperimentProperties, FeatureFlags, getExperimentValue, getFeatureFlag } from '@universe/gating' import { FeatureFlagService } from 'wallet/src/features/transactions/executeTransaction/services/featureFlagService' export const createFeatureFlagService = (): FeatureFlagService => { diff --git a/packages/wallet/src/features/transactions/executeTransaction/services/transactionConfigServiceImpl.test.ts b/packages/wallet/src/features/transactions/executeTransaction/services/transactionConfigServiceImpl.test.ts index 74c9a33abd9..fb0d18f8bfc 100644 --- a/packages/wallet/src/features/transactions/executeTransaction/services/transactionConfigServiceImpl.test.ts +++ b/packages/wallet/src/features/transactions/executeTransaction/services/transactionConfigServiceImpl.test.ts @@ -1,5 +1,5 @@ +import { FeatureFlags } from '@universe/gating' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' import { logger as loggerUtil } from 'utilities/src/logger/logger' import { isPrivateRpcSupportedOnChain } from 'wallet/src/features/providers/utils' import { FeatureFlagService } from 'wallet/src/features/transactions/executeTransaction/services/featureFlagService' diff --git a/packages/wallet/src/features/transactions/executeTransaction/services/transactionConfigServiceImpl.ts b/packages/wallet/src/features/transactions/executeTransaction/services/transactionConfigServiceImpl.ts index 7c4f3d0a18c..97651db7513 100644 --- a/packages/wallet/src/features/transactions/executeTransaction/services/transactionConfigServiceImpl.ts +++ b/packages/wallet/src/features/transactions/executeTransaction/services/transactionConfigServiceImpl.ts @@ -1,6 +1,5 @@ +import { Experiments, FeatureFlags, PrivateRpcProperties } from '@universe/gating' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { Experiments, PrivateRpcProperties } from 'uniswap/src/features/gating/experiments' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' import { DEFAULT_FLASHBOTS_ENABLED } from 'uniswap/src/features/providers/FlashbotsCommon' import { logger as loggerUtil } from 'utilities/src/logger/logger' import { isPrivateRpcSupportedOnChain } from 'wallet/src/features/providers/utils' diff --git a/packages/wallet/src/features/transactions/executeTransaction/tryGetNonce.ts b/packages/wallet/src/features/transactions/executeTransaction/tryGetNonce.ts index 2b443309e17..ac9f241eb22 100644 --- a/packages/wallet/src/features/transactions/executeTransaction/tryGetNonce.ts +++ b/packages/wallet/src/features/transactions/executeTransaction/tryGetNonce.ts @@ -1,11 +1,15 @@ +import { + Experiments, + FeatureFlags, + getExperimentValue, + getFeatureFlagName, + getStatsigClient, + PrivateRpcProperties, +} from '@universe/gating' import { SagaIterator } from 'redux-saga' import { call, select } from 'typed-redux-saga' import { SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { Experiments, PrivateRpcProperties } from 'uniswap/src/features/gating/experiments' -import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' -import { getExperimentValue } from 'uniswap/src/features/gating/hooks' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' import { DEFAULT_FLASHBOTS_ENABLED } from 'uniswap/src/features/providers/FlashbotsCommon' import { makeSelectAddressTransactions } from 'uniswap/src/features/transactions/selectors' import { isClassic } from 'uniswap/src/features/transactions/swap/utils/routing' diff --git a/packages/wallet/src/features/transactions/send/TokenSelectorPanel.tsx b/packages/wallet/src/features/transactions/send/TokenSelectorPanel.tsx index 5cf5a03e7a9..453caf0b2f1 100644 --- a/packages/wallet/src/features/transactions/send/TokenSelectorPanel.tsx +++ b/packages/wallet/src/features/transactions/send/TokenSelectorPanel.tsx @@ -1,5 +1,4 @@ import { Currency, CurrencyAmount } from '@uniswap/sdk-core' -import { Maybe } from 'graphql/jsutils/Maybe' import { useTranslation } from 'react-i18next' import { Flex, Text, TouchableArea } from 'ui/src' import { RotatableChevron } from 'ui/src/components/icons' diff --git a/packages/wallet/src/features/transactions/swap/confirmation.ts b/packages/wallet/src/features/transactions/swap/confirmation.ts index b0adbcde1c4..c784e69e98a 100644 --- a/packages/wallet/src/features/transactions/swap/confirmation.ts +++ b/packages/wallet/src/features/transactions/swap/confirmation.ts @@ -1,9 +1,8 @@ import { TradingApi } from '@universe/api' +import { FeatureFlags, getFeatureFlagName, getStatsigClient } from '@universe/gating' import { SagaGenerator, take } from 'typed-redux-saga' import { getDelegationService } from 'uniswap/src/domains/services' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' import { finalizeTransaction } from 'uniswap/src/features/transactions/slice' import { PermitMethod, SwapTxAndGasInfo } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' import { TransactionStatus } from 'uniswap/src/features/transactions/types/transactionDetails' diff --git a/packages/wallet/src/features/transactions/swap/executeSwapSaga.ts b/packages/wallet/src/features/transactions/swap/executeSwapSaga.ts index 29439a7438c..10380eabbda 100644 --- a/packages/wallet/src/features/transactions/swap/executeSwapSaga.ts +++ b/packages/wallet/src/features/transactions/swap/executeSwapSaga.ts @@ -1,8 +1,7 @@ +import { DynamicConfigs, getDynamicConfigValue, SyncTransactionSubmissionChainIdsConfigKey } from '@universe/gating' import { call, put } from 'typed-redux-saga' import type { SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types' import type { UniverseChainId } from 'uniswap/src/features/chains/types' -import { DynamicConfigs, SyncTransactionSubmissionChainIdsConfigKey } from 'uniswap/src/features/gating/configs' -import { getDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' import type { SwapTradeBaseProperties } from 'uniswap/src/features/telemetry/types' diff --git a/packages/wallet/src/features/transactions/swap/hooks/useSwapHandlers.ts b/packages/wallet/src/features/transactions/swap/hooks/useSwapHandlers.ts index 420ac15b9a1..ab5987f0921 100644 --- a/packages/wallet/src/features/transactions/swap/hooks/useSwapHandlers.ts +++ b/packages/wallet/src/features/transactions/swap/hooks/useSwapHandlers.ts @@ -1,9 +1,8 @@ +import { FeatureFlags, getFeatureFlag } from '@universe/gating' import { useCallback, useMemo } from 'react' import { useDispatch, useSelector } from 'react-redux' import { AccountMeta } from 'uniswap/src/features/accounts/types' import { usePortfolioTotalValue } from 'uniswap/src/features/dataApi/balances/balancesRest' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { SwapEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' diff --git a/packages/wallet/src/features/transactions/swap/modals/QueuedOrderModal.tsx b/packages/wallet/src/features/transactions/swap/modals/QueuedOrderModal.tsx index 18e6819fb83..db13d952f17 100644 --- a/packages/wallet/src/features/transactions/swap/modals/QueuedOrderModal.tsx +++ b/packages/wallet/src/features/transactions/swap/modals/QueuedOrderModal.tsx @@ -1,4 +1,5 @@ import { CurrencyAmount, TradeType } from '@uniswap/sdk-core' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' @@ -10,8 +11,6 @@ import { Modal } from 'uniswap/src/components/modals/Modal' import { LearnMoreLink } from 'uniswap/src/components/text/LearnMoreLink' import { uniswapUrls } from 'uniswap/src/constants/urls' import { AssetType, TradeableAsset } from 'uniswap/src/entities/assets' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { useCurrencyInfo } from 'uniswap/src/features/tokens/useCurrencyInfo' import { diff --git a/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.test.ts b/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.test.ts index dcd61b4350c..8b9eda0d70f 100644 --- a/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.test.ts +++ b/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.test.ts @@ -35,7 +35,8 @@ jest.mock('wallet/src/features/transactions/factories/createTransactionServices' const mockPrivateRpcFlag = jest.fn().mockReturnValue(true) -jest.mock('uniswap/src/features/gating/sdk/statsig', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), getStatsigClient: jest.fn(() => ({ checkGate: jest.fn().mockImplementation((flagName: string) => { if (flagName === 'mev-blocker') { diff --git a/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.ts b/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.ts index 86d53f2ebfe..a130e9568ae 100644 --- a/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.ts +++ b/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.ts @@ -1,7 +1,6 @@ +import { FeatureFlags, getFeatureFlagName, getStatsigClient } from '@universe/gating' import { call, select } from 'typed-redux-saga' import type { SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types' -import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' import type { PrepareSwapParams } from 'uniswap/src/features/transactions/swap/types/swapHandlers' import { PermitMethod } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' import { isBridge, isClassic, isUniswapX, isWrap } from 'uniswap/src/features/transactions/swap/utils/routing' diff --git a/packages/wallet/src/features/transactions/swap/settings/SwapProtection.tsx b/packages/wallet/src/features/transactions/swap/settings/SwapProtection.tsx index c4a1760c11b..70a8d61e30e 100644 --- a/packages/wallet/src/features/transactions/swap/settings/SwapProtection.tsx +++ b/packages/wallet/src/features/transactions/swap/settings/SwapProtection.tsx @@ -1,9 +1,9 @@ +import { FeatureFlags } from '@universe/gating' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' import { Switch, Text } from 'ui/src' import { getChainLabel } from 'uniswap/src/features/chains/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import type { TransactionSettingConfig } from 'uniswap/src/features/transactions/components/settings/types' import { useSwapFormStoreDerivedSwapInfo } from 'uniswap/src/features/transactions/swap/stores/swapFormStore/useSwapFormStore' diff --git a/packages/wallet/src/features/transactions/swap/swapSaga.test.ts b/packages/wallet/src/features/transactions/swap/swapSaga.test.ts index cf2475ead8d..739e6bce957 100644 --- a/packages/wallet/src/features/transactions/swap/swapSaga.test.ts +++ b/packages/wallet/src/features/transactions/swap/swapSaga.test.ts @@ -42,7 +42,8 @@ import { SwapProtectionSetting } from 'wallet/src/features/wallet/slice' import { signerMnemonicAccount } from 'wallet/src/test/fixtures' import { getTxProvidersMocks } from 'wallet/src/test/mocks' -jest.mock('uniswap/src/features/gating/sdk/statsig', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), getStatsigClient: jest.fn(() => ({ checkGate: jest.fn().mockReturnValue(true), getLayer: jest.fn(() => ({ diff --git a/packages/wallet/src/features/transactions/swap/swapSaga.ts b/packages/wallet/src/features/transactions/swap/swapSaga.ts index 6b265b5347b..378fad172d7 100644 --- a/packages/wallet/src/features/transactions/swap/swapSaga.ts +++ b/packages/wallet/src/features/transactions/swap/swapSaga.ts @@ -1,14 +1,13 @@ import { permit2Address } from '@uniswap/permit2-sdk' import { TradingApi } from '@universe/api' +import { Experiments, FeatureFlags, getFeatureFlagName, getStatsigClient } from '@universe/gating' import { call, put, select } from 'typed-redux-saga' import { SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types' -import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' import { SwapTradeBaseProperties } from 'uniswap/src/features/telemetry/types' -import { FLASHBLOCKS_UI_SKIP_ROUTES } from 'uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/constants' -import { getIsFlashblocksEnabled } from 'uniswap/src/features/transactions/swap/hooks/useIsUnichainFlashblocksEnabled' +import { logExperimentQualifyingEvent } from 'uniswap/src/features/telemetry/utils/logExperimentQualifyingEvent' +import { getFlashblocksExperimentStatus } from 'uniswap/src/features/transactions/swap/hooks/useIsUnichainFlashblocksEnabled' import { PermitMethod, ValidatedSwapTxContext } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' import { isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing' import { tradeToTransactionInfo } from 'uniswap/src/features/transactions/swap/utils/trade' @@ -217,8 +216,19 @@ export function* approveAndSwap(params: SwapParams) { } yield* call(executeTransaction, executeTransactionParams) - // Only show pending notification if not a flashblock transaction - if (!getIsFlashblocksEnabled(chainId) || FLASHBLOCKS_UI_SKIP_ROUTES.includes(swapTxContext.routing)) { + const { shouldLogQualifyingEvent, shouldShowModal } = getFlashblocksExperimentStatus({ + chainId, + routing: swapTxContext.routing, + }) + + if (shouldLogQualifyingEvent) { + logExperimentQualifyingEvent({ + experiment: Experiments.UnichainFlashblocksModal, + }) + } + + // Show pending notification for control variant or ineligible swaps + if (!shouldShowModal) { yield* put(pushNotification({ type: AppNotificationType.SwapPending, wrapType: WrapType.NotApplicable })) } diff --git a/packages/wallet/src/features/transactions/watcher/transactionFinalizationSaga.ts b/packages/wallet/src/features/transactions/watcher/transactionFinalizationSaga.ts index d6090419b58..1e11344cda9 100644 --- a/packages/wallet/src/features/transactions/watcher/transactionFinalizationSaga.ts +++ b/packages/wallet/src/features/transactions/watcher/transactionFinalizationSaga.ts @@ -1,14 +1,13 @@ import { ApolloClient, NormalizedCacheObject } from '@apollo/client' import { TradeType } from '@uniswap/sdk-core' import { SharedQueryClient } from '@universe/api' +import { Experiments, getExperimentValue, PrivateRpcProperties } from '@universe/gating' import { BigNumber } from 'ethers' import { call, put, select, takeEvery } from 'typed-redux-saga' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { getChainLabel } from 'uniswap/src/features/chains/utils' import { getGasPrice } from 'uniswap/src/features/gas/types' import { findLocalGasStrategy } from 'uniswap/src/features/gas/utils' -import { Experiments, PrivateRpcProperties } from 'uniswap/src/features/gating/experiments' -import { getExperimentValue } from 'uniswap/src/features/gating/hooks' import { setNotificationStatus } from 'uniswap/src/features/notifications/slice/slice' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { refetchQueries } from 'uniswap/src/features/portfolio/portfolioUpdates/refetchQueriesSaga' diff --git a/packages/wallet/src/features/transactions/watcher/watchOnChainTransactionSaga.test.ts b/packages/wallet/src/features/transactions/watcher/watchOnChainTransactionSaga.test.ts index f2b65470cbf..46548927883 100644 --- a/packages/wallet/src/features/transactions/watcher/watchOnChainTransactionSaga.test.ts +++ b/packages/wallet/src/features/transactions/watcher/watchOnChainTransactionSaga.test.ts @@ -27,7 +27,8 @@ import { getProvider } from 'wallet/src/features/wallet/context' let mockGates: Record = {} -jest.mock('uniswap/src/features/gating/sdk/statsig', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), getStatsigClient: jest.fn(() => ({ checkGate: jest.fn((gate: string) => mockGates[gate] ?? false), getDynamicConfig: jest.fn(() => ({ diff --git a/packages/wallet/src/features/transactions/watcher/watchOnChainTransactionSaga.ts b/packages/wallet/src/features/transactions/watcher/watchOnChainTransactionSaga.ts index 97956f77add..b134be6e2df 100644 --- a/packages/wallet/src/features/transactions/watcher/watchOnChainTransactionSaga.ts +++ b/packages/wallet/src/features/transactions/watcher/watchOnChainTransactionSaga.ts @@ -1,9 +1,8 @@ import { ApolloClient, NormalizedCacheObject } from '@apollo/client' +import { FeatureFlags, getFeatureFlagName, getStatsigClient } from '@universe/gating' import { BigNumber, BigNumberish, providers } from 'ethers' import { call, cancel, delay, fork, put, race, spawn, take } from 'typed-redux-saga' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' import { waitForFlashbotsProtectReceipt } from 'uniswap/src/features/providers/FlashbotsCommon' diff --git a/packages/wallet/tsconfig.json b/packages/wallet/tsconfig.json index 96488672116..038c024dc0f 100644 --- a/packages/wallet/tsconfig.json +++ b/packages/wallet/tsconfig.json @@ -11,6 +11,9 @@ { "path": "../ui" }, + { + "path": "../gating" + }, { "path": "../api" } diff --git a/scripts/clean.sh b/scripts/clean.sh index 2f6aef5b8f6..fe3a27eb887 100644 --- a/scripts/clean.sh +++ b/scripts/clean.sh @@ -1,25 +1,78 @@ #!/bin/bash set -euo pipefail -# Restore the monorepo as close to a freshly cloned state as possible (except for the .env files) - -# Safety check - confirm with user before proceeding -echo "⚠️ WARNING: This will remove ALL untracked files and directories from your repository!" -echo "Only .env files will be preserved." -read -p "Are you sure you want to continue? (y/N): " -n 1 -r -echo -if [[ ! $REPLY =~ ^[Yy]$ ]]; then - echo "Operation cancelled." - exit 1 +# Restore the monorepo as close to a freshly cloned state as possible +# Usage: bun clean [--git] [--node] [--bun] +# --git Remove git untracked files (except for .env files, node_modules, and .claude directories) +# --node Remove all node_modules (instead of just local packages) +# --bun Clear the global bun cache + +# Parse CLI arguments +GIT_CLEAN=false +NODE_MODULES=false +BUN_CACHE=false +HAS_CLI_ARGS=false + +while [[ $# -gt 0 ]]; do + HAS_CLI_ARGS=true + case $1 in + --git) + GIT_CLEAN=true + shift + ;; + --node) + NODE_MODULES=true + shift + ;; + --bun) + BUN_CACHE=true + shift + ;; + *) + echo "Unknown argument: $1" + echo "Usage: $0 [--git] [--node] [--bun]" + exit 1 + ;; + esac +done + +prompt_yes_no() { + local message=$1 + local var_name=$2 + echo "$message" + read -p "(y/n): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + eval "$var_name=true" + fi +} + +# Only prompt if no CLI args were provided +if [ "$HAS_CLI_ARGS" = false ]; then + prompt_yes_no "⚠️ UNTRACKED FILES: Do you want to remove all files untracked by git..." "GIT_CLEAN" + prompt_yes_no "📦 NODE MODULES: Local packages will be cleaned. Do you also want to remove ALL other node_modules (slower but more thorough)?" "NODE_MODULES" fi -# Remove all untracked files -echo "Removing all untracked files..." -git clean -fdx -e "**/.env*" +# Execute git clean if confirmed +if [ "$GIT_CLEAN" = true ]; then + echo "Removing all untracked files except for .env files..." + git clean -fdx -e "**/.env*" -e "**/node_modules" -e "**/.claude" +fi + +# Execute node_modules cleanup +if [ "$NODE_MODULES" = true ]; then + echo "Removing node_modules..." + bun run g:rm:nodemodules +else + echo "Removing local packages..." + bun run g:rm:local-packages +fi -# Remove node_modules -echo "Removing node_modules..." -bun run g:rm:nodemodules +# Clear global bun cache +if [ "$BUN_CACHE" = true ]; then + echo "Clearing global bun cache..." + bun pm cache rm +fi # Install dependencies echo "Installing dependencies..." @@ -28,6 +81,9 @@ bun install # Clear NX cache echo "Clearing NX cache..." bun nx reset +# Sync NX but silence errors because sometimes the first NX command +# after a reset fails due to a race condition with the NX daemon +bun nx sync 2>/dev/null || true # Prepare packages echo "Preparing packages..." diff --git a/scripts/remove-local-packages.sh b/scripts/remove-local-packages.sh new file mode 100755 index 00000000000..69bb087ad78 --- /dev/null +++ b/scripts/remove-local-packages.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -euo pipefail + +# This script queries NX and then removes local monorepo packages from node_modules + +projects=$(bun nx show projects) + +while IFS= read -r project; do + project_path="node_modules/$project" + echo "Removing $project_path" + rm -rf "$project_path" +done <<< "$projects" + +echo "Done removing local packages from node_modules" diff --git a/tools/uniswap-nx/src/generators/package/files/biome.json b/tools/uniswap-nx/src/generators/package/files/biome.json deleted file mode 100644 index 8e08a6604fc..00000000000 --- a/tools/uniswap-nx/src/generators/package/files/biome.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "//", - "formatter": { - "includes": ["**"] - } -} diff --git a/tools/uniswap-nx/src/generators/package/files/tsconfig.json b/tools/uniswap-nx/src/generators/package/files/tsconfig.json index 7b64995b539..194d7e1a230 100644 --- a/tools/uniswap-nx/src/generators/package/files/tsconfig.json +++ b/tools/uniswap-nx/src/generators/package/files/tsconfig.json @@ -5,7 +5,7 @@ "compilerOptions": { "noEmit": false, "emitDeclarationOnly": true, - "types": [<%= types %>], + "types": [<%- types %>], "paths": {} }, "references": [] diff --git a/tools/uniswap-nx/src/generators/package/package.ts b/tools/uniswap-nx/src/generators/package/package.ts index 56d5156071c..c926ad5b16f 100644 --- a/tools/uniswap-nx/src/generators/package/package.ts +++ b/tools/uniswap-nx/src/generators/package/package.ts @@ -1,5 +1,6 @@ import { addProjectConfiguration, generateFiles, Tree, updateJson } from '@nx/devkit' import { addTsConfigPath } from '@nx/js' +import { execSync } from 'child_process' import * as path from 'path' import { PackageGeneratorSchema } from './schema' @@ -23,14 +24,33 @@ export async function packageGenerator(tree: Tree, options: PackageGeneratorSche return json }) const relativePathToRoot = path.relative(options.path, '') + const typesList = options.types.split(',').map((t) => t.trim()) + const types = JSON.stringify(typesList).slice(1, -1) // Remove outer brackets to fit in template generateFiles(tree, path.join(__dirname, 'files'), projectRoot, { ...options, relativePathToRoot, - types: options.types - .split(',') - .map((t) => `"${t.trim()}"`) - .join(', '), + types, }) + + // Return a task that formats only the files changed by this generator + return () => { + // Get only the files that were changed by this generator + const changedFiles = tree.listChanges().map(change => change.path).join(' ') + + if (!changedFiles) { + return + } + + try { + console.log('Formatting generated files with Biome...') + // Run biome directly on just the files changed by this generator + execSync(`bun biome format --write ${changedFiles}`, { + stdio: 'inherit', + }) + } catch (error) { + console.warn('Could not format files. You may need to run "bun g:format" manually.') + } + } } export default packageGenerator diff --git a/tsconfig.base.json b/tsconfig.base.json index 61f218e91c4..32364947eab 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -40,7 +40,9 @@ "ui/*": ["packages/ui/*"], "uniswap/*": ["packages/uniswap/*"], "utilities/*": ["packages/utilities/*"], - "wallet/*": ["packages/wallet/*"] + "wallet/*": ["packages/wallet/*"], + "@universe/gating/*": ["packages/gating/*"], + "@universe/notifications/*": ["packages/notifications/*"] } } } diff --git a/tsconfig.json b/tsconfig.json index 72b73c7c20c..5b0b2b7b2f8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -36,6 +36,12 @@ }, { "path": "./tools/uniswap-nx" + }, + { + "path": "./packages/gating" + }, + { + "path": "./packages/notifications" } ] } From 60b7d9276229654fd0ab9a36d17cd1268c75bb91 Mon Sep 17 00:00:00 2001 From: Uniswap Labs Service Account Date: Thu, 30 Oct 2025 22:14:58 +0000 Subject: [PATCH 3/6] ci(release): publish latest release --- RELEASE | 55 ++---------------- VERSION | 2 +- .../graphics/bridged-assets-v2-web-banner.png | Bin 128449 -> 137674 bytes .../src/i18n/locales/source/en-US.json | 2 +- 4 files changed, 7 insertions(+), 52 deletions(-) diff --git a/RELEASE b/RELEASE index 12680356c4b..a0fe208e989 100644 --- a/RELEASE +++ b/RELEASE @@ -1,6 +1,6 @@ IPFS hash of the deployment: -- CIDv0: `QmUF5sYAgjigJ6D7nE6p12SG1rFrwYLidKxeX52qBN1Pce` -- CIDv1: `bafybeicxxeljdmh6f2s3xo43piks2h7ibgm6hbfoo3ftc5wjfmqfsngghm` +- CIDv0: `QmZPfZzNEpaLma32VPTwQryN5RVFugahpSFEGcCSoeAt5j` +- CIDv1: `bafybeifegzcwlxc747e745hq7q24nqsxgsxgkubmmacb2gd7zn6i5cr5oy` The latest release is always mirrored at [app.uniswap.org](https://app.uniswap.org). @@ -10,54 +10,9 @@ You can also access the Uniswap Interface from an IPFS gateway. Your Uniswap settings are never remembered across different URLs. IPFS gateways: -- https://bafybeicxxeljdmh6f2s3xo43piks2h7ibgm6hbfoo3ftc5wjfmqfsngghm.ipfs.dweb.link/ -- [ipfs://QmUF5sYAgjigJ6D7nE6p12SG1rFrwYLidKxeX52qBN1Pce/](ipfs://QmUF5sYAgjigJ6D7nE6p12SG1rFrwYLidKxeX52qBN1Pce/) +- https://bafybeifegzcwlxc747e745hq7q24nqsxgsxgkubmmacb2gd7zn6i5cr5oy.ipfs.dweb.link/ +- [ipfs://QmZPfZzNEpaLma32VPTwQryN5RVFugahpSFEGcCSoeAt5j/](ipfs://QmZPfZzNEpaLma32VPTwQryN5RVFugahpSFEGcCSoeAt5j/) -## 5.116.0 (2025-10-28) - - -### Features - -* **web:** add activity table to the tab with real data (#23506) f00228c -* **web:** Add createRejectableMockConnector util to force tx rejection (#24574) 3b3b2b7 -* **web:** add demo account support for activity tab (#24639) 9ec0194 -* **web:** add disconnected portfolio view (#23690) 7a1b085 -* **web:** add fiat to price chart (#23577) fab99ce -* **web:** add hidden tokens table rows (#23535) 291fab3 -* **web:** add loading state to tokens table (#23544) ed5ced8 -* **web:** add more & better filtering + transaction parsing (#24579) 205c03d -* **web:** add v2 bridged asset banner (#24734) 4666868 -* **web:** disconnected view B version (#24630) 46ca828 -* **web:** Help Modal styling nits (#24547) ae252e6 -* **web:** NFTs tab (#23604) a438b54 -* **web:** small style nits for Company menu (#24318) 4d71e08 -* **web:** special case metamask dual vm connection flow (#24756) faabc72 -* **web:** tokens table search (#23509) b83fc75 -* **web:** update CompanyMenu arrangement on tablet width (#24312) 758f68d - - -### Bug Fixes - -* **web:** default to mainnet for limits flow [STAGING] (#24885) 5a8e150 -* **web:** Fix CreatePosition e2e anvil test (#24573) d68b011 -* **web:** Fix e2e anvil tests missing quote stub (#24590) 838d5bd -* **web:** Fix limit order chain switch bug (#23064) b11176d -* **web:** Fix Swap e2e anvil tests (#24662) 26adf5c -* **web:** fixes pools tab loader skeletons (#24472) 2f887aa -* **web:** Increase anvil manager timeout (#24623) 466eb69 -* **web:** log interface swap finalization results for flashblocks (#24869) bf30270 -* **web:** support chain filtering query params (#24754) 4bc3729 -* **web:** update the create flow to display the latest dependnet amount (#24676) 168c20a -* **web:** Use Mainnet instead of Base for e2e test commands (#24589) ff7dfee - - -### Continuous Integration - -* **web:** update sitemaps 4e8124b - - -### Tests - -* **web:** Disable anvil snapshots by default (#24666) 1a2903c +### 5.116.1 (2025-10-30) diff --git a/VERSION b/VERSION index a4fafce7ea0..1f3953aa880 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -web/5.116.0 \ No newline at end of file +web/5.116.1 \ No newline at end of file diff --git a/packages/ui/src/assets/graphics/bridged-assets-v2-web-banner.png b/packages/ui/src/assets/graphics/bridged-assets-v2-web-banner.png index c7e87c3aa9006d2308279bfa82b69c8be89ef245..75dba8f7687d73c9b26c345176b2b904f6ec17b3 100644 GIT binary patch literal 137674 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�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 literal 128449 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

2^rd?|>O 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 Date: Wed, 5 Nov 2025 21:09:43 +0000 Subject: [PATCH 4/6] ci(release): publish latest release --- .bun-version | 2 +- .claude/settings.json | 20 + .cursor/cli.json | 21 + .cursorignore | 7 + CLAUDE.md | 3 +- RELEASE | 66 +- VERSION | 2 +- apps/api-self-serve/.eslintrc.js | 44 + apps/api-self-serve/.gitignore | 7 + apps/api-self-serve/README.md | 1 + apps/api-self-serve/app/app.css | 170 + apps/api-self-serve/app/lib/utils.ts | 6 + apps/api-self-serve/app/root.tsx | 53 + apps/api-self-serve/app/routes.ts | 3 + apps/api-self-serve/app/routes/home.tsx | 11 + apps/api-self-serve/app/welcome/logo-dark.svg | 23 + .../api-self-serve/app/welcome/logo-light.svg | 23 + apps/api-self-serve/app/welcome/welcome.tsx | 80 + apps/api-self-serve/components.json | 22 + apps/api-self-serve/package.json | 36 + apps/api-self-serve/react-router.config.ts | 7 + apps/api-self-serve/tailwind.config.ts | 430 ++ apps/api-self-serve/tsconfig.eslint.json | 5 + apps/api-self-serve/tsconfig.json | 23 + apps/api-self-serve/vite.config.ts | 15 + apps/extension/package.json | 2 + .../app/components/AutoLockProvider.test.tsx | 425 +- .../src/app/components/AutoLockProvider.tsx | 125 +- .../src/app/components/tabs/ActivityTab.tsx | 24 +- .../src/app/core/BaseAppContainer.tsx | 11 + apps/extension/src/app/core/SidebarApp.tsx | 14 + .../src/app/features/accounts/AccountItem.tsx | 14 +- .../biometricUnlock/BiometricUnlockStorage.ts | 1 + .../biometricUnlock/biometricAuthUtils.ts | 7 +- .../useBiometricUnlockSetupMutation.test.ts | 9 +- .../useBiometricUnlockSetupMutation.ts | 10 +- ...hangePasswordWithBiometricMutation.test.ts | 4 + .../useChangePasswordWithBiometricMutation.ts | 2 + ...ockWithBiometricCredentialMutation.test.ts | 44 +- ...seUnlockWithBiometricCredentialMutation.ts | 4 +- .../app/features/home/TokenBalanceList.tsx | 40 +- .../features/settings/DeviceAccessScreen.tsx | 2 + .../app/features/settings/SettingsScreen.tsx | 2 +- .../password/ChangePasswordForm.test.tsx | 166 + .../settings/password/ChangePasswordForm.tsx | 45 +- .../password/CreateNewPasswordModal.tsx | 4 +- .../ChangePasswordForm.test.tsx.snap | 279 + .../password/usePasswordResetFlow.test.ts | 93 + .../settings/password/usePasswordResetFlow.ts | 6 + apps/extension/src/app/saga.ts | 19 - .../src/background/backgroundDappRequests.ts | 1 + .../background/utils/persistedStateUtils.ts | 6 + apps/extension/src/entrypoints/background.ts | 56 +- apps/extension/src/manifest.json | 2 +- apps/extension/src/store/migrations.test.ts | 11 +- apps/extension/src/store/migrations.ts | 4 +- apps/extension/src/store/schema.ts | 6 +- apps/extension/tsconfig.json | 5 +- apps/extension/wxt.config.ts | 2 +- apps/mobile/.eslintrc.js | 7 - apps/mobile/android/app/build.gradle | 6 +- .../android/app/src/main/AndroidManifest.xml | 4 + .../main/java/com/uniswap/UniswapPackage.kt | 2 + .../SilentPushEventEmitterModule.kt | 129 + .../SilentPushNotificationServiceExtension.kt | 123 + .../uniswap/utils/JsonWritableExtensions.kt | 61 + .../ios/Uniswap.xcodeproj/project.pbxproj | 1102 ++-- apps/mobile/ios/Uniswap/AppDelegate.m | 13 + .../Notifications/SilentPushEventEmitter.m | 18 + .../SilentPushEventEmitter.swift | 31 + .../ios/WidgetsCore/.mobileschema_fingerprint | 2 +- apps/mobile/package.json | 1 + apps/mobile/scripts/checkBundleSize.sh | 2 +- apps/mobile/src/app/App.tsx | 11 + apps/mobile/src/app/migrations.test.ts | 11 +- apps/mobile/src/app/migrations.ts | 4 +- apps/mobile/src/app/monitoredSagas.ts | 19 - apps/mobile/src/app/navigation/constants.ts | 2 + apps/mobile/src/app/navigation/navigation.tsx | 4 + apps/mobile/src/app/navigation/types.ts | 4 + apps/mobile/src/app/schema.ts | 12 +- .../PriceExplorer/PriceExplorer.tsx | 2 + .../src/components/PriceExplorer/Text.tsx | 57 +- .../PriceExplorer/usePriceHistory.test.ts | 93 +- .../PriceExplorer/usePriceHistory.ts | 23 +- .../ScanSheet/AccountSelectPopover.tsx | 1 + .../TokenBalanceList/TokenBalanceList.tsx | 7 + .../TokenDetails/TokenDetailsStats.tsx | 26 +- .../components/accounts/AccountCardItem.tsx | 5 +- .../components/activity/ActivityContent.tsx | 62 +- .../introCards/OnboardingIntroCardStack.tsx | 43 +- .../ReactNavigationModal.tsx | 6 + .../ReportTokenDataModalScreen.tsx | 10 + .../ReportTokenIssueModalScreen.tsx | 10 + .../src/features/deepLinking/configUtils.ts | 21 +- .../deepLinking/deepLinkUtils.test.ts | 92 +- .../src/features/deepLinking/deepLinkUtils.ts | 98 +- .../deepLinking/handleDeepLinkSaga.test.ts | 370 -- .../deepLinking/handleDeepLinkSaga.ts | 11 +- .../deepLinking/handleInAppBrowserSaga.ts | 35 - .../src/features/notifications/Onesignal.ts | 9 + .../notifications/SilentPushListener.ts | 70 + .../src/features/send/SendTokenForm.tsx | 2 +- apps/mobile/src/screens/ActivityScreen.tsx | 45 +- apps/mobile/src/screens/SettingsScreen.tsx | 2 +- .../src/screens/TokenDetailsHeaders.tsx | 22 + .../mobile/src/screens/TokenDetailsScreen.tsx | 18 +- apps/mobile/tsconfig.json | 5 +- apps/web/.depcheckrc | 1 + apps/web/.storybook/main.ts | 4 +- apps/web/functions/api/image/pools.tsx | 2 +- apps/web/package.json | 6 +- apps/web/public/csp.json | 2 +- apps/web/public/pools-sitemap.xml | 5290 +++++++++-------- apps/web/public/tokens-sitemap.xml | 4542 +++++++------- .../components/AccountDrawer/ActionTile.tsx | 24 +- .../AccountDrawer/AuthenticatedHeader.tsx | 59 +- .../MiniPortfolio/Activity/ActivityTab.tsx | 40 +- .../Activity/CancelOrdersDialog.tsx | 19 +- .../CancelOrdersDialog.test.tsx.snap | 232 +- .../MiniPortfolio/Activity/parseLocal.ts | 1 + .../MiniPortfolio/MiniPortfolioV2.tsx | 86 + .../MiniPortfolio/Tokens/TokensTab.tsx | 14 + .../AccountDrawer/PortfolioBalanceMenu.tsx | 10 +- .../AccountDrawer/ReportedActivityToggle.tsx | 24 + .../components/AccountDrawer/SettingsMenu.tsx | 2 +- .../AccountDrawer/SettingsToggle.tsx | 3 +- .../AccountDrawer/SmallBalanceToggle.tsx | 1 + .../{SpamToggle.tsx => SpamTokensToggle.tsx} | 12 +- .../ActionTileWithIconAnimation.tsx | 43 + .../components/ActionTiles/BuyActionTile.tsx | 26 + .../components/ActionTiles/MoreActionTile.tsx | 92 + .../ActionTiles/ReceiveActionTile.tsx | 23 + .../SendActionTile/SendActionTile.tsx | 38 + .../SendActionTile}/SendButtonTooltip.tsx | 0 .../components/ActionTiles/SwapActionTile.tsx | 26 + .../web/src/components/Charts/ChartHeader.tsx | 18 +- apps/web/src/components/Charts/ChartModel.tsx | 76 +- .../components/Charts/CustomHoverMarker.tsx | 51 + .../components/D3LiquidityMinMaxInput.tsx | 4 +- .../components/DefaultPriceStrategies.tsx | 3 +- .../LiquidityPositionRangeChart.tsx | 1 + .../LiquidityRangeInput.tsx | 1 + .../src/components/Charts/LiveDotRenderer.tsx | 162 + .../src/components/Charts/LoadingState.tsx | 7 +- .../components/Charts/PriceChart/index.tsx | 109 +- .../Charts/StackedLineChart/index.tsx | 24 +- .../components/Charts/VolumeChart/index.tsx | 3 +- .../hooks/useApplyChartTextureEffects.ts | 90 + .../useHeaderDateFormatter.ts} | 0 .../__snapshots__/Head.test.tsx.snap | 12 +- .../web/src/components/Dropdowns/Dropdown.tsx | 1 + .../components/Dropdowns/DropdownSelector.tsx | 2 +- .../FeatureFlagModal/FeatureFlagModal.tsx | 12 +- apps/web/src/components/Icons/CreditCard.tsx | 12 - .../components/Liquidity/Create/AddHook.tsx | 30 +- .../Create/DynamicFeeTierSpeedbump.tsx | 16 +- .../Liquidity/Create/RangeSelectionStep.tsx | 4 +- .../Liquidity/Create/SelectTokenStep.tsx | 67 +- .../hooks/useDerivedPositionInfo.test.ts | 8 +- .../Create/hooks/useDerivedPositionInfo.tsx | 31 +- .../Create/hooks/useLiquidityUrlState.test.ts | 8 +- .../src/components/Liquidity/Create/types.ts | 7 +- .../Liquidity/FeeTierSearchModal.tsx | 2 +- .../LPIncentives/LpIncentiveClaimModal.tsx | 2 +- .../Liquidity/LiquidityPositionCard.tsx | 201 +- .../Liquidity/hooks/useAllFeeTierPoolData.ts | 3 + .../hooks/useReportPositionHandler.ts | 63 + .../Liquidity/parsers/urlParsers.ts | 5 +- .../Liquidity/utils/feeTiers.test.ts | 13 +- .../components/Liquidity/utils/feeTiers.ts | 31 +- .../Liquidity/utils/parseFromRest.test.ts | 4 +- .../Liquidity/utils/parseFromRest.ts | 4 +- .../Liquidity/utils/priceRangeInfo.ts | 17 +- .../components/NavBar/Tabs/TabsContent.tsx | 19 +- .../Pools/PoolDetails/ChartSection/index.tsx | 9 +- .../PoolDetailsTransactionTable.test.tsx.snap | 89 +- .../components/Pools/PoolTable/PoolTable.tsx | 31 +- .../__snapshots__/PoolTable.test.tsx.snap | 52 +- .../components/Popups/MismatchToastItem.tsx | 2 +- apps/web/src/components/Popups/PopupItem.tsx | 20 + .../components/Popups/ToastRegularSimple.tsx | 2 +- apps/web/src/components/Popups/constants.ts | 4 + apps/web/src/components/Popups/types.ts | 10 + apps/web/src/components/Table/ErrorBox.tsx | 12 +- apps/web/src/components/Table/icons.tsx | 13 - apps/web/src/components/Table/index.tsx | 44 +- apps/web/src/components/Table/types.ts | 10 + .../Tokens/TokenDetails/ChartSection/hooks.ts | 65 +- .../TokenDetails/ChartSection/index.tsx | 10 +- .../Tokens/TokenDetails/MoreButton.tsx | 48 + .../Tokens/TokenDetails/ShareButton.tsx | 29 +- .../Tokens/TokenDetails/StatsSection.tsx | 29 +- .../TokenDetails/TokenDetailsHeader.tsx | 223 +- .../components/Tokens/TokenDetails/index.tsx | 16 +- .../components/Tokens/TokenDetails/shared.ts | 19 + .../TokenDetailsPoolsTable.test.tsx.snap | 89 +- .../components/Tokens/TokenTable/index.tsx | 41 +- .../src/components/TopLevelModals/index.tsx | 20 + .../TopLevelModals/modalRegistry.tsx | 9 + .../Auction/hooks/useAuctionBlockPolling.ts | 55 + .../store/AuctionStoreContextProvider.tsx | 8 + .../Auction/store/createAuctionStore.ts | 24 +- .../components/Toucan/Auction/store/types.ts | 24 +- .../Auction/utils/computeAuctionProgress.ts | 76 + apps/web/src/components/animations/Wiggle.tsx | 75 +- .../delegation/DelegationMismatchModal.tsx | 13 +- apps/web/src/constants/icons/mxnIcon.tsx | 1 + .../WebNotificationToastWrapper.tsx | 3 + apps/web/src/hooks/useBlockCountdown.test.ts | 76 + apps/web/src/hooks/useBlockCountdown.ts | 55 + apps/web/src/hooks/useBlockTimestamp.ts | 2 +- apps/web/src/index.tsx | 11 + .../NotificationContainer.tsx | 180 + .../createWebNotificationRenderer.ts | 44 + .../notificationStore.ts | 36 + .../CreateLiquidityContextProvider.tsx | 24 +- .../CreatePosition.anvil.e2e.test.ts | 11 +- .../CreatePosition/CreatePosition.e2e.test.ts | 59 +- .../pages/CreatePosition/CreatePosition.tsx | 2 +- .../CreatePosition/CreatePositionModal.tsx | 8 +- .../CreatePositionTxContext.tsx | 3 +- .../Explore/tables/RecentTransactions.tsx | 22 +- .../web/src/pages/MigrateV2/MigrateV2Pair.tsx | 1 + .../MigrateV3/MigrateV3LiquidityTxContext.tsx | 4 +- .../MigrateV3/hooks/useInitialPosition.ts | 3 +- apps/web/src/pages/MigrateV3/index.tsx | 15 +- .../src/pages/Portfolio/Activity/Activity.tsx | 94 +- .../ActivityTable/ActivityAddressCell.tsx | 4 +- .../ActivityTable/ActivityAmountCell.tsx | 14 +- .../Activity}/ActivityTable/ActivityTable.tsx | 8 +- .../ActivityTable/AddressWithAvatar.tsx | 0 .../Activity}/ActivityTable/TimeCell.tsx | 0 .../ActivityTable/TokenAmountDisplay.tsx | 0 .../ActivityTable/TransactionTypeCell.tsx | 2 +- .../ActivityTable/activityTableModels.ts | 4 +- .../Activity}/ActivityTable/registry.ts | 30 +- .../pages/Portfolio/Activity/Filters/utils.ts | 75 +- .../pages/Portfolio/ConnectWalletBanner.tsx | 2 +- apps/web/src/pages/Portfolio/Defi.tsx | 2 +- .../web/src/pages/Portfolio/Header/Header.tsx | 9 +- .../ConnectedAddressDisplay.tsx | 3 +- .../DemoAddressDisplay.tsx | 2 +- .../PortfolioAddressDisplay.tsx | 6 +- apps/web/src/pages/Portfolio/Header/Tabs.tsx | 18 +- ...rtfolioParams.ts => usePortfolioRoutes.ts} | 15 +- .../Header/hooks/usePortfolioTabs.ts | 6 +- apps/web/src/pages/Portfolio/NFTs/NFTCard.tsx | 178 +- .../pages/Portfolio/NFTs/NFTCardSkeleton.tsx | 22 + apps/web/src/pages/Portfolio/NFTs/Nfts.tsx | 20 +- apps/web/src/pages/Portfolio/Overview.tsx | 89 - .../pages/Portfolio/Overview/ActionTiles.tsx | 60 + .../src/pages/Portfolio/Overview/Overview.tsx | 45 + .../pages/Portfolio/Overview/StatsTiles.tsx | 97 + .../Overview/hooks/useSwapsThisWeek.ts | 51 + apps/web/src/pages/Portfolio/Portfolio.tsx | 4 +- .../src/pages/Portfolio/PortfolioContent.tsx | 21 +- .../Tokens/Table/TokensAllocationChart.tsx | 2 +- .../Tokens/Table/TokensContextMenuWrapper.tsx | 22 +- .../Portfolio/Tokens/Table/TokensTable.tsx | 4 +- .../Tokens/Table/TokensTableInner.tsx | 16 +- .../Tokens/Table/columns/Allocation.tsx | 6 +- .../Tokens/Table/columns/Balance.tsx | 4 +- .../Table/columns/ContextMenuButton.tsx | 4 +- .../Tokens/Table/columns/RelativeChange1D.tsx | 4 +- .../Tokens/Table/columns/TokenDisplay.tsx | 4 +- .../Portfolio/Tokens/Table/columns/Value.tsx | 4 +- .../web/src/pages/Portfolio/Tokens/Tokens.tsx | 12 +- .../ValueWithFadedDecimals.tsx | 23 +- apps/web/src/pages/Positions/PositionPage.tsx | 34 + apps/web/src/pages/Positions/index.tsx | 3 +- apps/web/src/pages/Swap/Buy/BuyForm.tsx | 14 +- .../Swap/Buy/OffRampConfirmTransferModal.tsx | 4 +- apps/web/src/pages/Swap/Buy/shared.test.tsx | 2 +- apps/web/src/pages/Swap/Limit/LimitForm.tsx | 1 + .../pages/Swap/Send/NewAddressSpeedBump.tsx | 20 +- .../src/pages/Swap/Send/SendReviewModal.tsx | 2 +- .../Swap/Send/SmartContractSpeedBump.tsx | 9 +- .../NewAddressSpeedBump.test.tsx.snap | 86 +- .../SmartContractSpeedbump.test.tsx.snap | 82 +- apps/web/src/pages/Swap/index.tsx | 8 +- apps/web/src/state/migrations.ts | 6 +- apps/web/src/state/migrations/19.test.ts | 4 +- apps/web/src/state/migrations/22.test.ts | 2 + apps/web/src/state/migrations/58.test.ts | 176 + apps/web/src/state/migrations/58.ts | 73 + apps/web/src/state/migrations/59.test.ts | 21 + apps/web/src/state/migrations/59.ts | 20 + apps/web/src/state/mint/v3/hooks.tsx | 1 + apps/web/src/state/routing/types.ts | 1 + apps/web/src/state/routing/utils.ts | 1 + .../transactions/useSwapHandlers.test.ts | 470 ++ .../sagas/transactions/useSwapHandlers.ts | 115 + .../web/src/state/sagas/transactions/utils.ts | 1 + apps/web/src/state/swap/hooks.tsx | 4 +- .../hooks/useMismatchAccount.ts | 2 +- .../src/state/walletCapabilities/reducer.ts | 2 +- .../utils/showSwitchNetworkNotification.ts | 9 +- apps/web/tsconfig.json | 14 +- bun.lock | 690 ++- bunfig.toml | 1 + config/jest-presets/jest/jest-preset.js | 2 +- config/jest-presets/jest/setup.js | 11 + package.json | 8 +- packages/api/package.json | 3 +- .../api/src/clients/base/createFetchClient.ts | 4 - packages/api/src/clients/graphql/queries.ts | 1 - .../api/src/clients/graphql/web/token.graphql | 2 + .../api/src/clients/notifications/types.ts | 41 +- .../clients/trading/createTradingApiClient.ts | 46 +- .../api/src/clients/trading/tradeTypes.ts | 13 +- packages/api/src/components/ApiInit.test.tsx | 306 + packages/api/src/components/ApiInit.tsx | 50 + packages/api/src/getDeviceIdService.ts | 25 + packages/api/src/getSessionService.native.ts | 41 +- packages/api/src/getSessionService.web.ts | 66 +- packages/api/src/getSessionStorage.native.ts | 24 + packages/api/src/getSessionStorage.ts | 8 + packages/api/src/getSessionStorage.web.ts | 30 + packages/api/src/index.ts | 15 +- .../src/storage/createStorageDriver.native.ts | 19 + .../api/src/storage/createStorageDriver.ts | 8 + .../src/storage/createStorageDriver.web.ts | 35 + packages/api/src/storage/types.ts | 9 + packages/api/src/transport.ts | 85 + packages/api/tsconfig.json | 10 +- packages/api/vitest.config.ts | 3 +- packages/biome-config/package.json | 3 +- packages/biome-config/src/extractor.test.js | 138 + .../src/fixtures/array-merge-config.jsonc | 52 + .../src/fixtures/no-markers-config.jsonc | 37 + .../src/fixtures/off-override-config.jsonc | 41 + .../src/fixtures/simple-config.jsonc | 45 + packages/biome-config/src/merger.js | 44 +- packages/biome-config/src/merger.test.js | 178 + packages/biome-config/src/processor.test.js | 336 ++ packages/eslint-config/base.js | 8 + packages/eslint-config/native.js | 1 - packages/gating/src/configs.ts | 16 - packages/gating/src/flags.ts | 10 +- packages/gating/src/index.ts | 2 - packages/notifications/README.md | 6 +- packages/notifications/package.json | 17 +- packages/notifications/project.json | 14 +- packages/notifications/src/global.d.ts | 2 + packages/notifications/src/index.ts | 20 + .../NotificationDataSource.ts | 8 + .../createNotificationDataSource.ts | 19 + ...reatePollingNotificationDataSource.test.ts | 359 ++ .../createPollingNotificationDataSource.ts | 91 + .../notificationQueryOptions.ts | 58 + .../NotificationProcessor.ts | 7 + .../createBaseNotificationProcessor.test.ts | 320 + .../createBaseNotificationProcessor.ts | 39 + .../createNotificationProcessor.test.ts | 130 + .../createNotificationProcessor.ts | 12 + .../NotificationRenderer.ts | 8 + .../createNotificationRenderer.ts | 16 + .../notification-system/NotificationSystem.ts | 23 + .../createNotificationSystem.test.ts | 548 ++ .../createNotificationSystem.ts | 96 + .../NotificationTracker.ts | 15 + .../createNoopNotificationTracker.ts | 48 + .../createNotificationTracker.ts | 31 + packages/notifications/tsconfig.json | 7 +- packages/notifications/vitest.config.ts | 10 + packages/sessions/package.json | 2 +- .../createChallengeSolverService.ts | 47 + .../createHashcashMockSolver.ts | 39 + .../challenge-solvers/createNoneMockSolver.ts | 11 + .../createTurnstileMockSolver.ts | 30 + .../createTurnstileSolver.ts | 177 + .../turnstileSolver.integration.test.ts | 312 + .../sessions/src/challenge-solvers/types.ts | 17 + .../src/challengeFlow.integration.test.ts | 380 ++ .../src/device-id/createDeviceIdService.ts | 17 +- packages/sessions/src/device-id/types.ts | 10 +- packages/sessions/src/index.ts | 37 +- ...createSessionInitializationService.test.ts | 296 + .../createSessionInitializationService.ts | 97 + .../session-initialization/sessionErrors.ts | 32 + .../session-repository/createSessionClient.ts | 2 +- .../createSessionRepository.test.ts | 32 +- .../createSessionRepository.ts | 25 +- .../src/session-repository/transport.ts | 38 - .../sessions/src/session-repository/types.ts | 9 +- .../createNoopSessionService.ts | 11 +- .../createSessionService.test.ts | 34 + .../session-service/createSessionService.ts | 30 +- .../sessions/src/session-service/types.ts | 42 +- .../session-storage/createSessionStorage.ts | 3 + .../sessions/src/session-storage/types.ts | 4 + .../src/sessionLifecycle.integration.test.ts | 251 + packages/sessions/src/test-utils.ts | 176 + packages/sessions/src/test-utils/mocks.ts | 120 + packages/sessions/vitest.config.ts | 2 + .../bridged-assets-v2-card-banner-dark.png | Bin 0 -> 81953 bytes .../bridged-assets-v2-card-banner-light.png | Bin 0 -> 76561 bytes packages/ui/src/assets/icons/box.svg | 3 + .../ui/src/assets/icons/chart-bar-crossed.svg | 4 + packages/ui/src/assets/icons/credit-card.svg | 6 + packages/ui/src/assets/icons/money-hand.svg | 3 + .../assets/icons/shield-magnifying-glass.svg | 3 + packages/ui/src/assets/index.ts | 2 + packages/ui/src/components/icons/Box.tsx | 17 + .../src/components/icons/ChartBarCrossed.tsx | 17 + .../ui/src/components/icons/CreditCard.tsx | 16 + .../ui/src/components/icons/MoneyHand.tsx | 17 + .../icons/ShieldMagnifyingGlass.tsx | 16 + packages/ui/src/components/icons/exported.ts | 5 + .../ui/src/components/switch/Switch.web.tsx | 6 +- .../ui/src/utils/colors/specialCaseTokens.ts | 4 + packages/uniswap/jest-setup.js | 7 + packages/uniswap/package.json | 3 +- .../components/TokenSelector/hooks.test.ts | 1 - .../components/accounts/AddressDisplay.tsx | 33 +- .../details/TransactionDetailsModal.tsx | 13 +- .../ApproveTransactionDetails.tsx | 8 +- .../useFormattedCurrencyAmountAndUSDValue.ts | 2 +- .../activity/summaries/ApproveSummaryItem.tsx | 9 +- .../summaries/TransactionSummaryLayout.tsx | 2 +- .../uniswap/src/components/activity/types.ts | 2 +- .../src/components/dialog/Dialog.test.tsx | 6 +- .../src/components/dialog/Dialog.web.tsx | 119 +- .../src/components/dialog/DialogProps.tsx | 10 +- .../src/components/dialog/GetHelpHeader.tsx | 16 +- .../dropdowns/ActionSheetDropdown.tsx | 1 + .../tokens/TokenOptionItemContextMenu.tsx | 2 +- .../modals/WarningModal/WarningModal.tsx | 100 +- .../modals/useBottomSheetSafeKeyboard.web.tsx | 4 +- .../uniswap/src/components/nfts/NftsList.tsx | 2 + .../src/components/nfts/NftsList.web.tsx | 13 +- .../src/components/nfts/ShowNFTModal.tsx | 4 +- .../portfolio/PortfolioEmptyState.tsx | 6 +- .../TokenBalanceItemContextMenu.native.tsx | 3 + .../portfolio/TokenBalanceItemContextMenu.tsx | 1 + .../TokenBalanceItemContextMenu.web.tsx | 2 + .../portfolio/TokenBalanceListWeb.tsx | 34 +- .../src/components/reporting/ReportModal.tsx | 131 + .../reporting/ReportTokenDataModal.tsx | 101 + .../reporting/ReportTokenIssueModal.tsx | 131 + .../src/components/reporting/input.tsx | 28 + packages/uniswap/src/constants/urls.ts | 4 +- .../apiClients/createUniswapFetchClient.ts | 4 +- .../src/data/rest/auctions/auctionService.ts | 44 + .../uniswap/src/data/rest/auctions/paths.ts | 12 + .../uniswap/src/data/rest/auctions/types.ts | 80 + .../auctions/useGetAuctionDetailsQuery.ts | 31 + .../data/rest/auctions/useGetAuctionsQuery.ts | 32 + .../auctions/useGetBidConcentrationQuery.ts | 31 + .../useGetBidsByWalletInfiniteQuery.ts | 35 + .../rest/auctions/useGetBidsByWalletQuery.ts | 32 + .../auctions/useGetLatestCheckpointQuery.ts | 31 + packages/uniswap/src/data/rest/base.ts | 30 +- packages/uniswap/src/data/rest/getPools.ts | 4 +- .../uniswap/src/data/rest/listTransactions.ts | 79 +- .../DialogPreferencesService.ts | 40 + .../createDialogPreferencesService.test.ts | 156 + .../createDialogPreferencesService.ts | 60 + .../uniswap/src/dialog-preferences/index.ts | 8 + .../src/features/accounts/AccountIcon.tsx | 5 +- .../activity/extract/conversion.test.ts | 1 - .../activity/extract/conversionRest.test.ts | 1 - .../activity/hooks/useActivityData.tsx | 29 +- .../useFormattedTransactionDataForActivity.ts | 19 +- .../activity/hooks/useTransactionActions.tsx | 114 +- .../utils/getTransactionSummaryTitle.ts | 3 +- .../listTransactions/listTransactions.test.ts | 25 +- .../listTransactions/listTransactions.ts | 118 +- .../tokenDetails/useTokenDetailsData.ts | 94 + .../uniswap/src/features/dataApi/types.ts | 6 + .../priceChart/priceChartConversion.test.ts | 1 - .../src/features/language/constants.ts | 97 - .../uniswap/src/features/language/hooks.tsx | 120 - .../src/features/language/localizedDayjs.ts | 25 - .../nfts/hooks/useNftContextMenuItems.tsx | 53 +- .../portfolio/TokenBalanceListContext.tsx | 15 +- .../hooks/useTokenContextMenuOptions.ts | 37 +- .../portfolio/portfolioUpdates/constants.ts | 6 +- .../uniswap/src/features/reporting/reports.ts | 155 + .../src/features/settings/constants.ts | 18 +- .../uniswap/src/features/settings/hooks.ts | 7 +- .../src/features/settings/selectors.ts | 7 + .../uniswap/src/features/settings/slice.ts | 6 + .../telemetry/constants/trace/modal.ts | 2 + .../telemetry/constants/trace/section.ts | 1 + .../features/telemetry/constants/uniswap.ts | 2 + .../features/telemetry/constants/wallet.ts | 1 + .../uniswap/src/features/telemetry/types.ts | 56 + .../src/features/tokens/TokenWarningModal.tsx | 29 + .../useBlockaidFeeComparisonAnalytics.ts | 2 +- .../src/features/tokens/safetyUtils.test.ts | 1 - .../modals/HiddenTokenInfoModal.tsx | 2 +- .../modals/MaxBalanceInfoModal.tsx | 16 +- .../src/features/transactions/slice.test.ts | 1 - .../swap/components/SwapArrowButton.tsx | 7 +- .../SwapFormButton/hooks/useInterfaceWrap.ts | 80 - .../hooks/useIsSwapButtonDisabled.ts | 5 - .../hooks/useSwapFormButtonText.ts | 6 +- .../transactions/swap/plan/planSaga.ts | 30 +- .../chainedActionTxSwapAndGasInfoService.ts | 47 +- .../swap/services/executeSwapService.ts | 196 +- .../swap/services/hooks/useExecuteSwap.ts | 26 +- .../swap/services/hooks/usePrepareSwap.ts | 4 - .../swap/services/prepareSwapService.ts | 11 - .../SwapDependenciesStoreContextProvider.tsx | 15 +- .../createSwapDependenciesStore.ts | 6 - .../swap/types/swapTxAndGasInfo.ts | 15 +- .../transactions/types/transactionDetails.ts | 3 + .../src/features/unitags/fileUtils.web.ts | 15 + .../visibility/hooks/useIsActivityHidden.ts | 7 + .../visibility/hooks/useTokenVisibility.ts | 20 + .../src/features/visibility/selectors.ts | 20 +- .../uniswap/src/features/visibility/slice.ts | 20 +- .../features/visibility/visibility.test.ts | 118 +- packages/uniswap/src/i18n/i18n-setup.tsx | 8 - .../src/i18n/locales/source/en-US.json | 83 +- .../src/i18n/locales/translations/af-ZA.json | 2563 -------- .../src/i18n/locales/translations/ar-SA.json | 2563 -------- .../src/i18n/locales/translations/ca-ES.json | 2563 -------- .../src/i18n/locales/translations/cs-CZ.json | 2384 -------- .../src/i18n/locales/translations/da-DK.json | 2563 -------- .../src/i18n/locales/translations/de-DE.json | 2384 -------- .../src/i18n/locales/translations/el-GR.json | 2563 -------- .../src/i18n/locales/translations/es-ES.json | 89 +- .../src/i18n/locales/translations/fi-FI.json | 2563 -------- .../src/i18n/locales/translations/fil-PH.json | 87 +- .../src/i18n/locales/translations/fr-FR.json | 89 +- .../src/i18n/locales/translations/he-IL.json | 2563 -------- .../src/i18n/locales/translations/hi-IN.json | 2563 -------- .../src/i18n/locales/translations/hu-HU.json | 2563 -------- .../src/i18n/locales/translations/id-ID.json | 87 +- .../src/i18n/locales/translations/it-IT.json | 2563 -------- .../src/i18n/locales/translations/ja-JP.json | 87 +- .../src/i18n/locales/translations/ko-KR.json | 87 +- .../src/i18n/locales/translations/ms-MY.json | 2563 -------- .../src/i18n/locales/translations/nl-NL.json | 87 +- .../src/i18n/locales/translations/no-NO.json | 2384 -------- .../src/i18n/locales/translations/pl-PL.json | 2563 -------- .../src/i18n/locales/translations/pt-PT.json | 89 +- .../src/i18n/locales/translations/ro-RO.json | 2384 -------- .../src/i18n/locales/translations/ru-RU.json | 87 +- .../src/i18n/locales/translations/sl-SI.json | 2563 -------- .../src/i18n/locales/translations/sr-SP.json | 2563 -------- .../src/i18n/locales/translations/sv-SE.json | 2563 -------- .../src/i18n/locales/translations/sw-TZ.json | 2563 -------- .../src/i18n/locales/translations/tr-TR.json | 87 +- .../src/i18n/locales/translations/uk-UA.json | 2563 -------- .../src/i18n/locales/translations/ur-PK.json | 2563 -------- .../src/i18n/locales/translations/vi-VN.json | 87 +- .../src/i18n/locales/translations/zh-CN.json | 87 +- .../src/i18n/locales/translations/zh-TW.json | 87 +- .../src/state/uniswapMigrationTests.ts | 12 +- .../uniswap/src/state/uniswapMigrations.ts | 13 + packages/uniswap/src/test/fixtures/testIDs.ts | 3 + packages/utilities/babel.config.js | 54 - .../src/react}/useInfiniteScroll.test.tsx | 32 +- .../utilities/src/react}/useInfiniteScroll.ts | 14 +- packages/utilities/src/reactQuery/cache.ts | 3 + packages/wallet/package.json | 2 - .../WalletPreviewCard.test.tsx.snap | 10 +- .../AccountDetails.test.tsx.snap | 8 +- .../__snapshots__/LinkButton.test.tsx.snap | 8 +- .../PortfolioBalanceModal.tsx | 33 +- .../data/apollo/usePersistedApolloClient.tsx | 4 +- packages/wallet/src/data/onRampAuthLink.ts | 51 - .../src/features/behaviorHistory/selectors.ts | 3 + .../src/features/behaviorHistory/slice.ts | 5 + ...SupportedNetworkNotification.test.tsx.snap | 8 +- .../transactionServiceImpl.test.ts | 2 - .../transactionSignerService.ts | 7 - .../transactionSignerServiceImpl.test.ts | 73 - .../transactionSignerServiceImpl.ts | 30 - .../features/transactions/rpcUtils.test.ts | 1 + .../transactions/swap/WalletSwapFlow.tsx | 12 +- .../transactions/swap/executeSwapSaga.test.ts | 1 - .../swap/hooks/useSwapCallback.ts | 104 - .../swap/hooks/useSwapHandlers.ts | 14 +- .../swap/hooks/useWrapCallback.ts | 21 - .../swap/prepareAndSignSwapSaga.test.ts | 1 - .../transactions/swap/swapSaga.test.ts | 385 -- .../features/transactions/swap/swapSaga.ts | 283 - .../transactions/swap/types/fixtures.ts | 1 - .../transactions/swap/wrapSaga.test.ts | 80 - .../features/transactions/swap/wrapSaga.ts | 86 - .../wallet/src/features/transactions/utils.ts | 3 + packages/wallet/src/test/rpcUtilsFixtures.ts | 4 + packages/wallet/src/utils/password.ts | 1 + patches/lightweight-charts@4.1.1.patch | 421 -- 589 files changed, 22695 insertions(+), 66889 deletions(-) create mode 100644 .claude/settings.json create mode 100644 .cursor/cli.json create mode 100644 .cursorignore create mode 100644 apps/api-self-serve/.eslintrc.js create mode 100644 apps/api-self-serve/.gitignore create mode 100644 apps/api-self-serve/README.md create mode 100644 apps/api-self-serve/app/app.css create mode 100644 apps/api-self-serve/app/lib/utils.ts create mode 100644 apps/api-self-serve/app/root.tsx create mode 100644 apps/api-self-serve/app/routes.ts create mode 100644 apps/api-self-serve/app/routes/home.tsx create mode 100644 apps/api-self-serve/app/welcome/logo-dark.svg create mode 100644 apps/api-self-serve/app/welcome/logo-light.svg create mode 100644 apps/api-self-serve/app/welcome/welcome.tsx create mode 100644 apps/api-self-serve/components.json create mode 100644 apps/api-self-serve/package.json create mode 100644 apps/api-self-serve/react-router.config.ts create mode 100644 apps/api-self-serve/tailwind.config.ts create mode 100644 apps/api-self-serve/tsconfig.eslint.json create mode 100644 apps/api-self-serve/tsconfig.json create mode 100644 apps/api-self-serve/vite.config.ts create mode 100644 apps/extension/src/app/features/settings/password/ChangePasswordForm.test.tsx create mode 100644 apps/extension/src/app/features/settings/password/__snapshots__/ChangePasswordForm.test.tsx.snap create mode 100644 apps/mobile/android/app/src/main/java/com/uniswap/notifications/SilentPushEventEmitterModule.kt create mode 100644 apps/mobile/android/app/src/main/java/com/uniswap/notifications/SilentPushNotificationServiceExtension.kt create mode 100644 apps/mobile/android/app/src/main/java/com/uniswap/utils/JsonWritableExtensions.kt create mode 100644 apps/mobile/ios/Uniswap/Notifications/SilentPushEventEmitter.m create mode 100644 apps/mobile/ios/Uniswap/Notifications/SilentPushEventEmitter.swift create mode 100644 apps/mobile/src/app/navigation/constants.ts create mode 100644 apps/mobile/src/components/modals/ReactNavigationModals/ReportTokenDataModalScreen.tsx create mode 100644 apps/mobile/src/components/modals/ReactNavigationModals/ReportTokenIssueModalScreen.tsx delete mode 100644 apps/mobile/src/features/deepLinking/handleInAppBrowserSaga.ts create mode 100644 apps/mobile/src/features/notifications/SilentPushListener.ts create mode 100644 apps/web/src/components/AccountDrawer/MiniPortfolio/MiniPortfolioV2.tsx create mode 100644 apps/web/src/components/AccountDrawer/ReportedActivityToggle.tsx rename apps/web/src/components/AccountDrawer/{SpamToggle.tsx => SpamTokensToggle.tsx} (58%) create mode 100644 apps/web/src/components/ActionTiles/ActionTileWithIconAnimation.tsx create mode 100644 apps/web/src/components/ActionTiles/BuyActionTile.tsx create mode 100644 apps/web/src/components/ActionTiles/MoreActionTile.tsx create mode 100644 apps/web/src/components/ActionTiles/ReceiveActionTile.tsx create mode 100644 apps/web/src/components/ActionTiles/SendActionTile/SendActionTile.tsx rename apps/web/src/components/{AccountDrawer => ActionTiles/SendActionTile}/SendButtonTooltip.tsx (100%) create mode 100644 apps/web/src/components/ActionTiles/SwapActionTile.tsx create mode 100644 apps/web/src/components/Charts/CustomHoverMarker.tsx create mode 100644 apps/web/src/components/Charts/LiveDotRenderer.tsx create mode 100644 apps/web/src/components/Charts/hooks/useApplyChartTextureEffects.ts rename apps/web/src/components/Charts/{hooks.ts => hooks/useHeaderDateFormatter.ts} (100%) delete mode 100644 apps/web/src/components/Icons/CreditCard.tsx create mode 100644 apps/web/src/components/Liquidity/hooks/useReportPositionHandler.ts create mode 100644 apps/web/src/components/Table/types.ts create mode 100644 apps/web/src/components/Tokens/TokenDetails/MoreButton.tsx create mode 100644 apps/web/src/components/Toucan/Auction/hooks/useAuctionBlockPolling.ts create mode 100644 apps/web/src/components/Toucan/Auction/utils/computeAuctionProgress.ts create mode 100644 apps/web/src/hooks/useBlockCountdown.test.ts create mode 100644 apps/web/src/hooks/useBlockCountdown.ts create mode 100644 apps/web/src/notification-renderer/NotificationContainer.tsx create mode 100644 apps/web/src/notification-renderer/createWebNotificationRenderer.ts create mode 100644 apps/web/src/notification-renderer/notificationStore.ts rename apps/web/src/{components => pages/Portfolio/Activity}/ActivityTable/ActivityAddressCell.tsx (85%) rename apps/web/src/{components => pages/Portfolio/Activity}/ActivityTable/ActivityAmountCell.tsx (95%) rename apps/web/src/{components => pages/Portfolio/Activity}/ActivityTable/ActivityTable.tsx (91%) rename apps/web/src/{components => pages/Portfolio/Activity}/ActivityTable/AddressWithAvatar.tsx (100%) rename apps/web/src/{components => pages/Portfolio/Activity}/ActivityTable/TimeCell.tsx (100%) rename apps/web/src/{components => pages/Portfolio/Activity}/ActivityTable/TokenAmountDisplay.tsx (100%) rename apps/web/src/{components => pages/Portfolio/Activity}/ActivityTable/TransactionTypeCell.tsx (93%) rename apps/web/src/{components => pages/Portfolio/Activity}/ActivityTable/activityTableModels.ts (93%) rename apps/web/src/{components => pages/Portfolio/Activity}/ActivityTable/registry.ts (89%) rename apps/web/src/pages/Portfolio/Header/hooks/{usePortfolioParams.ts => usePortfolioRoutes.ts} (63%) create mode 100644 apps/web/src/pages/Portfolio/NFTs/NFTCardSkeleton.tsx delete mode 100644 apps/web/src/pages/Portfolio/Overview.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/ActionTiles.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/Overview.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/StatsTiles.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/hooks/useSwapsThisWeek.ts create mode 100644 apps/web/src/state/migrations/58.test.ts create mode 100644 apps/web/src/state/migrations/58.ts create mode 100644 apps/web/src/state/migrations/59.test.ts create mode 100644 apps/web/src/state/migrations/59.ts create mode 100644 apps/web/src/state/sagas/transactions/useSwapHandlers.test.ts create mode 100644 apps/web/src/state/sagas/transactions/useSwapHandlers.ts create mode 100644 packages/api/src/components/ApiInit.test.tsx create mode 100644 packages/api/src/components/ApiInit.tsx create mode 100644 packages/api/src/getDeviceIdService.ts create mode 100644 packages/api/src/getSessionStorage.native.ts create mode 100644 packages/api/src/getSessionStorage.ts create mode 100644 packages/api/src/getSessionStorage.web.ts create mode 100644 packages/api/src/storage/createStorageDriver.native.ts create mode 100644 packages/api/src/storage/createStorageDriver.ts create mode 100644 packages/api/src/storage/createStorageDriver.web.ts create mode 100644 packages/api/src/storage/types.ts create mode 100644 packages/api/src/transport.ts create mode 100644 packages/biome-config/src/extractor.test.js create mode 100644 packages/biome-config/src/fixtures/array-merge-config.jsonc create mode 100644 packages/biome-config/src/fixtures/no-markers-config.jsonc create mode 100644 packages/biome-config/src/fixtures/off-override-config.jsonc create mode 100644 packages/biome-config/src/fixtures/simple-config.jsonc create mode 100644 packages/biome-config/src/merger.test.js create mode 100644 packages/biome-config/src/processor.test.js create mode 100644 packages/notifications/src/global.d.ts create mode 100644 packages/notifications/src/notification-data-source/NotificationDataSource.ts create mode 100644 packages/notifications/src/notification-data-source/implementations/createNotificationDataSource.ts create mode 100644 packages/notifications/src/notification-data-source/implementations/createPollingNotificationDataSource.test.ts create mode 100644 packages/notifications/src/notification-data-source/implementations/createPollingNotificationDataSource.ts create mode 100644 packages/notifications/src/notification-data-source/notificationQueryOptions.ts create mode 100644 packages/notifications/src/notification-processor/NotificationProcessor.ts create mode 100644 packages/notifications/src/notification-processor/implementations/createBaseNotificationProcessor.test.ts create mode 100644 packages/notifications/src/notification-processor/implementations/createBaseNotificationProcessor.ts create mode 100644 packages/notifications/src/notification-processor/implementations/createNotificationProcessor.test.ts create mode 100644 packages/notifications/src/notification-processor/implementations/createNotificationProcessor.ts create mode 100644 packages/notifications/src/notification-renderer/NotificationRenderer.ts create mode 100644 packages/notifications/src/notification-renderer/implementations/createNotificationRenderer.ts create mode 100644 packages/notifications/src/notification-system/NotificationSystem.ts create mode 100644 packages/notifications/src/notification-system/implementations/createNotificationSystem.test.ts create mode 100644 packages/notifications/src/notification-system/implementations/createNotificationSystem.ts create mode 100644 packages/notifications/src/notification-tracker/NotificationTracker.ts create mode 100644 packages/notifications/src/notification-tracker/implementations/createNoopNotificationTracker.ts create mode 100644 packages/notifications/src/notification-tracker/implementations/createNotificationTracker.ts create mode 100644 packages/notifications/vitest.config.ts create mode 100644 packages/sessions/src/challenge-solvers/createChallengeSolverService.ts create mode 100644 packages/sessions/src/challenge-solvers/createHashcashMockSolver.ts create mode 100644 packages/sessions/src/challenge-solvers/createNoneMockSolver.ts create mode 100644 packages/sessions/src/challenge-solvers/createTurnstileMockSolver.ts create mode 100644 packages/sessions/src/challenge-solvers/createTurnstileSolver.ts create mode 100644 packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts create mode 100644 packages/sessions/src/challenge-solvers/types.ts create mode 100644 packages/sessions/src/challengeFlow.integration.test.ts create mode 100644 packages/sessions/src/session-initialization/createSessionInitializationService.test.ts create mode 100644 packages/sessions/src/session-initialization/createSessionInitializationService.ts create mode 100644 packages/sessions/src/session-initialization/sessionErrors.ts delete mode 100644 packages/sessions/src/session-repository/transport.ts create mode 100644 packages/sessions/src/sessionLifecycle.integration.test.ts create mode 100644 packages/sessions/src/test-utils.ts create mode 100644 packages/sessions/src/test-utils/mocks.ts create mode 100644 packages/ui/src/assets/graphics/bridged-assets-v2-card-banner-dark.png create mode 100644 packages/ui/src/assets/graphics/bridged-assets-v2-card-banner-light.png create mode 100644 packages/ui/src/assets/icons/box.svg create mode 100644 packages/ui/src/assets/icons/chart-bar-crossed.svg create mode 100644 packages/ui/src/assets/icons/credit-card.svg create mode 100644 packages/ui/src/assets/icons/money-hand.svg create mode 100644 packages/ui/src/assets/icons/shield-magnifying-glass.svg create mode 100644 packages/ui/src/components/icons/Box.tsx create mode 100644 packages/ui/src/components/icons/ChartBarCrossed.tsx create mode 100644 packages/ui/src/components/icons/CreditCard.tsx create mode 100644 packages/ui/src/components/icons/MoneyHand.tsx create mode 100644 packages/ui/src/components/icons/ShieldMagnifyingGlass.tsx create mode 100644 packages/uniswap/src/components/reporting/ReportModal.tsx create mode 100644 packages/uniswap/src/components/reporting/ReportTokenDataModal.tsx create mode 100644 packages/uniswap/src/components/reporting/ReportTokenIssueModal.tsx create mode 100644 packages/uniswap/src/components/reporting/input.tsx create mode 100644 packages/uniswap/src/data/rest/auctions/auctionService.ts create mode 100644 packages/uniswap/src/data/rest/auctions/paths.ts create mode 100644 packages/uniswap/src/data/rest/auctions/types.ts create mode 100644 packages/uniswap/src/data/rest/auctions/useGetAuctionDetailsQuery.ts create mode 100644 packages/uniswap/src/data/rest/auctions/useGetAuctionsQuery.ts create mode 100644 packages/uniswap/src/data/rest/auctions/useGetBidConcentrationQuery.ts create mode 100644 packages/uniswap/src/data/rest/auctions/useGetBidsByWalletInfiniteQuery.ts create mode 100644 packages/uniswap/src/data/rest/auctions/useGetBidsByWalletQuery.ts create mode 100644 packages/uniswap/src/data/rest/auctions/useGetLatestCheckpointQuery.ts create mode 100644 packages/uniswap/src/dialog-preferences/DialogPreferencesService.ts create mode 100644 packages/uniswap/src/dialog-preferences/implementations/createDialogPreferencesService.test.ts create mode 100644 packages/uniswap/src/dialog-preferences/implementations/createDialogPreferencesService.ts create mode 100644 packages/uniswap/src/dialog-preferences/index.ts create mode 100644 packages/uniswap/src/features/dataApi/tokenDetails/useTokenDetailsData.ts create mode 100644 packages/uniswap/src/features/reporting/reports.ts delete mode 100644 packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useInterfaceWrap.ts create mode 100644 packages/uniswap/src/features/visibility/hooks/useIsActivityHidden.ts create mode 100644 packages/uniswap/src/features/visibility/hooks/useTokenVisibility.ts delete mode 100644 packages/uniswap/src/i18n/locales/translations/af-ZA.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/ar-SA.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/ca-ES.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/cs-CZ.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/da-DK.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/de-DE.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/el-GR.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/fi-FI.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/he-IL.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/hi-IN.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/hu-HU.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/it-IT.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/ms-MY.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/no-NO.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/pl-PL.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/ro-RO.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/sl-SI.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/sr-SP.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/sv-SE.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/sw-TZ.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/uk-UA.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/ur-PK.json delete mode 100644 packages/utilities/babel.config.js rename {apps/web/src/hooks => packages/utilities/src/react}/useInfiniteScroll.test.tsx (76%) rename {apps/web/src/hooks => packages/utilities/src/react}/useInfiniteScroll.ts (74%) delete mode 100644 packages/wallet/src/data/onRampAuthLink.ts delete mode 100644 packages/wallet/src/features/transactions/swap/hooks/useSwapCallback.ts delete mode 100644 packages/wallet/src/features/transactions/swap/hooks/useWrapCallback.ts delete mode 100644 packages/wallet/src/features/transactions/swap/swapSaga.test.ts delete mode 100644 packages/wallet/src/features/transactions/swap/swapSaga.ts delete mode 100644 packages/wallet/src/features/transactions/swap/wrapSaga.test.ts delete mode 100644 packages/wallet/src/features/transactions/swap/wrapSaga.ts delete mode 100644 patches/lightweight-charts@4.1.1.patch diff --git a/.bun-version b/.bun-version index 9728bd69ac8..3a3cd8cc8b0 100644 --- a/.bun-version +++ b/.bun-version @@ -1 +1 @@ -1.2.21 +1.3.1 diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 00000000000..7d26733d0a9 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,20 @@ +{ + "permissions": { + "deny": [ + "Read(**/.env)", + "Edit(**/.env)", + "Read(~/.aws/**)", + "Edit(~/.aws/**)", + "Read(~/.ssh/**)", + "Edit(~/.ssh/**)", + "Read(~/.gnupg/**)", + "Edit(~/.gnupg/**)", + "Read(~/.git-credentials)", + "Edit(~/.git-credentials)", + "Read($HOME/Library/Keychains/**)", + "Edit($HOME/Library/Keychains/**)", + "Read(/private/etc/**)", + "Edit(/private/etc/**)" + ] + } + } diff --git a/.cursor/cli.json b/.cursor/cli.json new file mode 100644 index 00000000000..b50608cd785 --- /dev/null +++ b/.cursor/cli.json @@ -0,0 +1,21 @@ +{ + "version": 1, + "permissions": { + "deny": [ + "Read(**/.env)", + "Write(**/.env)", + "Read(~/.aws/**)", + "Write(~/.aws/**)", + "Read(~/.ssh/**)", + "Write(~/.ssh/**)", + "Read(~/.gnupg/**)", + "Write(~/.gnupg/**)", + "Read(~/.git-credentials)", + "Write(~/.git-credentials)", + "Read($HOME/Library/Keychains/**)", + "Write($HOME/Library/Keychains/**)", + "Read(/private/etc/**)", + "Write(/private/etc/**)" + ] + } + } diff --git a/.cursorignore b/.cursorignore new file mode 100644 index 00000000000..70179d19f2e --- /dev/null +++ b/.cursorignore @@ -0,0 +1,7 @@ +**/.env +**/.aws/** +**/.ssh/** +**/.gnupg/** +**/.git-credentials +**/Library/Keychains/** +**/private/etc/** diff --git a/CLAUDE.md b/CLAUDE.md index 00a8280afa0..7224bbdb032 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -44,6 +44,7 @@ bun extension build:production # Extension production ```bash bun g:test # Run all tests +bun notifications test # Run tests for a specific package (e.g. notifications) bun g:test:coverage # With coverage bun web playwright:test # Web E2E tests bun mobile e2e # Mobile E2E tests @@ -158,4 +159,4 @@ Be cognizant of the app or package within which a given change is being made. Be - If the user needs help with an Nx configuration or project graph error, use the `nx_workspace` tool to get any errors - \ No newline at end of file + diff --git a/RELEASE b/RELEASE index a0fe208e989..9b31fb52f72 100644 --- a/RELEASE +++ b/RELEASE @@ -1,6 +1,6 @@ IPFS hash of the deployment: -- CIDv0: `QmZPfZzNEpaLma32VPTwQryN5RVFugahpSFEGcCSoeAt5j` -- CIDv1: `bafybeifegzcwlxc747e745hq7q24nqsxgsxgkubmmacb2gd7zn6i5cr5oy` +- CIDv0: `QmNMoMSDQVQwUdfxLqhLpM4bKgGMyEHU2LU2RfDFaRqACc` +- CIDv1: `bafybeiaajnnkurqabznrl32buiydbsym77nt2np3d5xv5mgskkd6euk3au` The latest release is always mirrored at [app.uniswap.org](https://app.uniswap.org). @@ -10,9 +10,65 @@ You can also access the Uniswap Interface from an IPFS gateway. Your Uniswap settings are never remembered across different URLs. IPFS gateways: -- https://bafybeifegzcwlxc747e745hq7q24nqsxgsxgkubmmacb2gd7zn6i5cr5oy.ipfs.dweb.link/ -- [ipfs://QmZPfZzNEpaLma32VPTwQryN5RVFugahpSFEGcCSoeAt5j/](ipfs://QmZPfZzNEpaLma32VPTwQryN5RVFugahpSFEGcCSoeAt5j/) +- https://bafybeiaajnnkurqabznrl32buiydbsym77nt2np3d5xv5mgskkd6euk3au.ipfs.dweb.link/ +- [ipfs://QmNMoMSDQVQwUdfxLqhLpM4bKgGMyEHU2LU2RfDFaRqACc/](ipfs://QmNMoMSDQVQwUdfxLqhLpM4bKgGMyEHU2LU2RfDFaRqACc/) -### 5.116.1 (2025-10-30) +## 5.117.0 (2025-11-05) + + +### Features + +* **web:** add activity items to new mini portfolio (#24822) f0994c6 +* **web:** add infinite scroll for portfolio activity table (#24691) d71921f +* **web:** add infinite scroll to minip on web activity (#23352) 78d6dcb +* **web:** add NFT context menu (#24791) 10ed3e4 +* **web:** add report position option to context menus (#24840) b587dfc +* **web:** add report position option to PDP (#24841) 97d0b94 +* **web:** add toast on report (#24717) 65c8cd6 +* **web:** add web entry points for token reporting (#24714) b83cb90 +* **web:** block timestamp countdown (#24632) 6a1da1d +* **web:** dialog content container + spacing tweaks (#24239) 035026d +* **web:** portfolio Overview tab (#24737) ed3f451 +* **web:** stub out new mini portfolio behind flag (#24821) 0602da3 +* **web:** toucan auction status (#24866) 0d9d56b +* **web:** use shared token details hooks with unified 24hr change (#24726) 501d754 + + +### Bug Fixes + +* **web:** calculate fiat delta from API percentage for multi-chain tokens (#24728) 36f4c68 +* **web:** data reporting abilities fixes (#25130) 9246200 +* **web:** default to mainnet for limits flow (#24884) 666bdb0 +* **web:** fix issue with listpools endpoint returning an error (#25141) 62f132b +* **web:** fix nested scrollbar overflowY issue (#24688) 60d39f3 +* **web:** Fix non-reactive prices on explore tab (#24766) 4539d99 +* **web:** Load tokens until scrollbar appears- PORT-359 (#23085) 5a480cf +* **web:** log interface swap finalization results for flashblocks (#24869) b800fb3 +* **web:** portfolio polishes (#24944) 6d94d95 +* **web:** position card context menu fixes and cleanup (#24839) 5568c4d +* **web:** prevent blank loading state in swap modal 5790e16 +* **web:** remove bad import in server side worker code (#24803) 048e2a0 +* **web:** Remove unnecessary button outline on Switch (#24697) 6216bb8 +* **web:** revert table scroll update (#25113) 9d12691 + + +### Continuous Integration + +* **web:** update sitemaps c5134d4 + + +### Code Refactoring + +* **web:** Consolidate swap and wrap callbacks into useSwapHandlers (#24219) b151db3 +* **web:** Consolidate swap and wrap handlers into unified interface (#24184) 672c7be + + +### Styles + +* **web:** apply textured background to pool details page table variants (#25040) 8381ec0 +* **web:** fix portfolio page account header scroll animation (#24953) 13aef52 +* **web:** update activity tab filter to reflect designs (#24687) 68f73cb +* **web:** update loading skeletons for NFT Cards (#24951) d556e00 +* **web:** update price chart styles (#24773) 5f231db diff --git a/VERSION b/VERSION index 1f3953aa880..8eadb5ad7bf 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -web/5.116.1 \ No newline at end of file +web/5.117.0 \ No newline at end of file diff --git a/apps/api-self-serve/.eslintrc.js b/apps/api-self-serve/.eslintrc.js new file mode 100644 index 00000000000..bc045be8575 --- /dev/null +++ b/apps/api-self-serve/.eslintrc.js @@ -0,0 +1,44 @@ +const restrictedGlobals = require('confusing-browser-globals') +const rulesDirPlugin = require('eslint-plugin-rulesdir') +rulesDirPlugin.RULES_DIR = '../../packages/uniswap/eslint_rules' + +module.exports = { + root: true, + extends: ['@uniswap/eslint-config/extension'], + plugins: ['rulesdir'], + ignorePatterns: [ + 'node_modules', + '.react-router', + 'dist', + 'build', + '.eslintrc.js', + 'manifest.json', + '.nx', + 'vite.config.ts', + ], + parserOptions: { + project: 'tsconfig.eslint.json', + tsconfigRootDir: __dirname, + ecmaFeatures: { + jsx: true, + }, + ecmaVersion: 2018, + sourceType: 'module', + }, + rules: { + 'rulesdir/i18n': 'error', + }, + overrides: [ + { + files: ['*.ts', '*.tsx'], + rules: { + 'no-relative-import-paths/no-relative-import-paths': [ + 'error', + { + allowSameFolder: false, + }, + ], + }, + }, + ], +} diff --git a/apps/api-self-serve/.gitignore b/apps/api-self-serve/.gitignore new file mode 100644 index 00000000000..039ee62d21a --- /dev/null +++ b/apps/api-self-serve/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +.env +/node_modules/ + +# React Router +/.react-router/ +/build/ diff --git a/apps/api-self-serve/README.md b/apps/api-self-serve/README.md new file mode 100644 index 00000000000..25d1b31c061 --- /dev/null +++ b/apps/api-self-serve/README.md @@ -0,0 +1 @@ +# API Self Serve Portal diff --git a/apps/api-self-serve/app/app.css b/apps/api-self-serve/app/app.css new file mode 100644 index 00000000000..abd90f244db --- /dev/null +++ b/apps/api-self-serve/app/app.css @@ -0,0 +1,170 @@ +@import "tailwindcss/preflight"; +@import "tailwindcss"; +@plugin "tailwindcss-animate"; +@tailwind utilities; +@config "../tailwind.config.ts"; + +@custom-variant dark (&:is(.dark *)); + +@font-face { + font-family: "Basel Grotesk"; + src: url("https://app.uniswap.org/fonts/Basel-Grotesk-Book.woff2") + format("woff2"); + font-weight: 485; + font-style: normal; + font-display: swap; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} + +@font-face { + font-family: "Basel Grotesk"; + src: url("https://app.uniswap.org/fonts/Basel-Grotesk-Medium.woff2") + format("woff2"); + font-weight: 535; + font-style: normal; + font-display: swap; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} + +@layer base { + html, body { + @apply bg-background text-foreground font-basel; + } + * { + @apply border-border outline-ring/50; + } +} + +/* Light mode is the default */ +:root { + color-scheme: light; + --font-basel: "Basel Grotesk"; + /* Light mode shadows */ + --shadow-short: + 0px 1px 6px 2px rgba(0, 0, 0, 0.03), 0px 1px 2px 0px rgba(0, 0, 0, 0.02); + --shadow-medium: + 0px 6px 12px -3px rgba(19, 19, 19, 0.04), + 0px 2px 5px -2px rgba(19, 19, 19, 0.03); + --shadow-large: + 0px 10px 20px -5px rgba(19, 19, 19, 0.05), + 0px 4px 12px -3px rgba(19, 19, 19, 0.04); + /*shadcn*/ + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +/* Dark mode applies when .dark class is present */ +.dark { + color-scheme: dark; + /* Dark mode shadows */ + --shadow-short: + 0px 1px 3px 0px rgba(0, 0, 0, 0.12), 0px 1px 2px 0px rgba(0, 0, 0, 0.24); + --shadow-medium: + 0px 10px 15px -3px rgba(19, 19, 19, 0.54), + 0px 4px 6px -2px rgba(19, 19, 19, 0.4); + --shadow-large: + 0px 16px 24px -6px rgba(0, 0, 0, 0.6), 0px 8px 12px -4px rgba(0, 0, 0, 0.48); + /*shadcn*/ + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.922 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); +} + +/*shadcn*/ +@theme inline { + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} diff --git a/apps/api-self-serve/app/lib/utils.ts b/apps/api-self-serve/app/lib/utils.ts new file mode 100644 index 00000000000..d32b0fe652e --- /dev/null +++ b/apps/api-self-serve/app/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/apps/api-self-serve/app/root.tsx b/apps/api-self-serve/app/root.tsx new file mode 100644 index 00000000000..9b3208dc36b --- /dev/null +++ b/apps/api-self-serve/app/root.tsx @@ -0,0 +1,53 @@ +import { isRouteErrorResponse, Links, Meta, Outlet, Scripts, ScrollRestoration } from 'react-router' +import type { Route } from './+types/root' +import './app.css' + +export const links: Route.LinksFunction = () => [] + +export function Layout({ children }: { children: React.ReactNode }) { + return ( + + + + + + + + + {children} + + + + + ) +} + +export default function App() { + return +} + +export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) { + let message = 'Oops!' + let details = 'An unexpected error occurred.' + let stack: string | undefined + + if (isRouteErrorResponse(error)) { + message = error.status === 404 ? '404' : 'Error' + details = error.status === 404 ? 'The requested page could not be found.' : error.statusText || details + } else if (import.meta.env.DEV && error && error instanceof Error) { + details = error.message + stack = error.stack + } + + return ( +

+

{message}

+

{details}

+ {stack && ( +
+          {stack}
+        
+ )} +
+ ) +} diff --git a/apps/api-self-serve/app/routes.ts b/apps/api-self-serve/app/routes.ts new file mode 100644 index 00000000000..10d7044bf99 --- /dev/null +++ b/apps/api-self-serve/app/routes.ts @@ -0,0 +1,3 @@ +import { index, type RouteConfig } from '@react-router/dev/routes' + +export default [index('routes/home.tsx')] satisfies RouteConfig diff --git a/apps/api-self-serve/app/routes/home.tsx b/apps/api-self-serve/app/routes/home.tsx new file mode 100644 index 00000000000..c6316aae628 --- /dev/null +++ b/apps/api-self-serve/app/routes/home.tsx @@ -0,0 +1,11 @@ +import { Welcome } from '~/welcome/welcome' +import type { Route } from './+types/home' + +// biome-ignore lint/correctness/noEmptyPattern: this will likely be updated. this is ootb from the create react router app tool. +export function meta({}: Route.MetaArgs) { + return [{ title: 'New React Router App' }, { name: 'description', content: 'Welcome to React Router!' }] +} + +export default function Home() { + return +} diff --git a/apps/api-self-serve/app/welcome/logo-dark.svg b/apps/api-self-serve/app/welcome/logo-dark.svg new file mode 100644 index 00000000000..dd820289447 --- /dev/null +++ b/apps/api-self-serve/app/welcome/logo-dark.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/api-self-serve/app/welcome/logo-light.svg b/apps/api-self-serve/app/welcome/logo-light.svg new file mode 100644 index 00000000000..73284929d36 --- /dev/null +++ b/apps/api-self-serve/app/welcome/logo-light.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/api-self-serve/app/welcome/welcome.tsx b/apps/api-self-serve/app/welcome/welcome.tsx new file mode 100644 index 00000000000..92555f1574a --- /dev/null +++ b/apps/api-self-serve/app/welcome/welcome.tsx @@ -0,0 +1,80 @@ +/** biome-ignore-all lint/correctness/noRestrictedElements: this will be removed, it's default template */ +import logoDark from './logo-dark.svg' +import logoLight from './logo-light.svg' + +export function Welcome() { + return ( +
+ +
+ ) +} + +const resources = [ + { + href: 'https://reactrouter.com/docs', + text: 'React Router Docs', + icon: ( + + + + ), + }, + { + href: 'https://rmx.as/discord', + text: 'Join Discord', + icon: ( + + + + ), + }, +] diff --git a/apps/api-self-serve/components.json b/apps/api-self-serve/components.json new file mode 100644 index 00000000000..d0a566ccc19 --- /dev/null +++ b/apps/api-self-serve/components.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "app/app.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "aliases": { + "components": "~/components", + "utils": "~/lib/utils", + "ui": "~/components/ui", + "lib": "~/lib", + "hooks": "~/hooks" + }, + "registries": {} +} diff --git a/apps/api-self-serve/package.json b/apps/api-self-serve/package.json new file mode 100644 index 00000000000..2c38ca368e3 --- /dev/null +++ b/apps/api-self-serve/package.json @@ -0,0 +1,36 @@ +{ + "name": "api-self-serve", + "private": true, + "type": "module", + "scripts": { + "build": "react-router build", + "dev": "react-router dev", + "start": "react-router-serve ./build/server/index.js", + "typecheck": "react-router typegen && tsc" + }, + "dependencies": { + "@react-router/node": "7.6.3", + "@react-router/serve": "7.6.3", + "class-variance-authority": "0.7.1", + "clsx": "2.1.1", + "isbot": "5.1.31", + "lucide-react": "0.548.0", + "react": "18.3.1", + "react-dom": "18.3.1", + "react-router": "7.6.3", + "tailwind-merge": "3.3.1", + "tailwindcss-animate": "1.0.7" + }, + "devDependencies": { + "@react-router/dev": "7.6.3", + "@tailwindcss/vite": "4.1.13", + "@types/node": "22.13.1", + "@types/react": "18.3.18", + "@uniswap/eslint-config": "workspace:^", + "eslint": "8.44.0", + "tailwindcss": "4.1.16", + "typescript": "5.3.3", + "vite": "npm:rolldown-vite@7.0.10", + "vite-tsconfig-paths": "5.1.4" + } +} diff --git a/apps/api-self-serve/react-router.config.ts b/apps/api-self-serve/react-router.config.ts new file mode 100644 index 00000000000..6ff16f91779 --- /dev/null +++ b/apps/api-self-serve/react-router.config.ts @@ -0,0 +1,7 @@ +import type { Config } from "@react-router/dev/config"; + +export default { + // Config options... + // Server-side render by default, to enable SPA mode set this to `false` + ssr: true, +} satisfies Config; diff --git a/apps/api-self-serve/tailwind.config.ts b/apps/api-self-serve/tailwind.config.ts new file mode 100644 index 00000000000..8135de497d5 --- /dev/null +++ b/apps/api-self-serve/tailwind.config.ts @@ -0,0 +1,430 @@ +import type { Config } from 'tailwindcss' +import tailwindAnimate from 'tailwindcss-animate' + +export default { + darkMode: 'class', + content: [ + './pages/**/*.{js,ts,jsx,tsx,mdx}', + './components/**/*.{js,ts,jsx,tsx,mdx}', + './app/**/*.{js,ts,jsx,tsx,mdx}', + './registry/**/*.{js,ts,jsx,tsx,mdx}', + ], + theme: { + extend: { + fontFamily: { + basel: ['var(--font-basel)', 'sans-serif'], + baselBook: [ + 'Basel Grotesk Book', + '-apple-system', + 'system-ui', + 'BlinkMacSystemFont', + 'Segoe UI', + 'Roboto', + 'Helvetica', + 'Arial', + 'sans-serif', + ], + baselMedium: [ + 'Basel Grotesk Medium', + '-apple-system', + 'system-ui', + 'BlinkMacSystemFont', + 'Segoe UI', + 'Roboto', + 'Helvetica', + 'Arial', + 'sans-serif', + ], + mono: ['InputMono-Regular', 'monospace'], + }, + fontWeight: { + book: '485', + medium: '535', + }, + screens: { + xxs: '360px', + xs: '380px', + sm: '450px', + md: '640px', + lg: '768px', + xl: '1024px', + xxl: '1280px', + xxxl: '1536px', + 'h-short': { raw: '(max-height: 736px)' }, + 'h-mid': { raw: '(max-height: 800px)' }, + }, + fontSize: { + // Headings + 'heading-1': [ + '52px', + { + lineHeight: '60px', + letterSpacing: '-0.02em', + fontWeight: '485', + }, + ], + 'heading-2': [ + '36px', + { + lineHeight: '44px', + letterSpacing: '-0.01em', + fontWeight: '485', + }, + ], + 'heading-3': [ + '24px', + { + lineHeight: '32px', + letterSpacing: '-0.005em', + fontWeight: '485', + }, + ], + // Subheadings + 'subheading-1': [ + '18px', + { + lineHeight: '24px', + fontWeight: '485', + }, + ], + 'subheading-2': [ + '16px', + { + lineHeight: '24px', + fontWeight: '485', + }, + ], + // Body + 'body-1': [ + '18px', + { + lineHeight: '24px', + fontWeight: '485', + }, + ], + 'body-2': [ + '16px', + { + lineHeight: '24px', + fontWeight: '485', + }, + ], + 'body-3': [ + '14px', + { + lineHeight: '20px', + fontWeight: '485', + }, + ], + 'body-4': [ + '12px', + { + lineHeight: '16px', + fontWeight: '485', + }, + ], + // Button Labels + 'button-1': [ + '18px', + { + lineHeight: '24px', + fontWeight: '535', + }, + ], + 'button-2': [ + '16px', + { + lineHeight: '24px', + fontWeight: '535', + }, + ], + 'button-3': [ + '14px', + { + lineHeight: '20px', + fontWeight: '535', + }, + ], + 'button-4': [ + '12px', + { + lineHeight: '16px', + fontWeight: '535', + }, + ], + }, + colors: { + // Base colors + white: '#FFFFFF', + black: '#000000', + + // Semantic colors for light theme + background: { + DEFAULT: '#FFFFFF', // colors.white + dark: '#000000', // colors.black + }, + + // Neutral colors with semantic naming + neutral1: { + DEFAULT: '#222222', // neutral1_light + dark: '#FFFFFF', // neutral1_dark + }, + neutral2: { + DEFAULT: '#7D7D7D', // neutral2_light + dark: '#9B9B9B', // neutral2_dark + }, + neutral3: { + DEFAULT: '#CECECE', // neutral3_light + dark: '#5E5E5E', // neutral3_dark + }, + + // Surface colors with semantic naming + surface1: { + DEFAULT: '#FFFFFF', // surface1_light + dark: '#131313', // surface1_dark + hovered: { + DEFAULT: '#F5F5F5', // surface1_hovered_light + dark: '#181818', // surface1_hovered_dark + }, + }, + surface2: { + DEFAULT: '#F9F9F9', // surface2_light + dark: '#1B1B1B', // surface2_dark + hovered: { + DEFAULT: '#F2F2F2', // surface2_hovered_light + dark: '#242424', // surface2_hovered_dark + }, + }, + surface3: { + DEFAULT: '#22222212', // surface3_light + dark: '#FFFFFF12', // surface3_dark + hovered: { + DEFAULT: 'rgba(34, 34, 34, 0.12)', // surface3_hovered_light + dark: 'rgba(255, 255, 255, 0.16)', // surface3_hovered_dark + }, + }, + surface4: { + DEFAULT: '#FFFFFF64', // surface4_light + dark: '#FFFFFF20', // surface4_dark + }, + surface5: { + DEFAULT: '#00000004', // surface5_light + dark: '#00000004', // surface5_dark + }, + + // Accent colors with semantic naming + accent1: { + DEFAULT: '#FC72FF', // accent1_light + dark: '#FC72FF', // accent1_dark + }, + accent2: { + DEFAULT: '#FFEFFF', // accent2_light + dark: '#311C31', // accent2_dark + }, + accent3: { + DEFAULT: '#4C82FB', // accent3_light + dark: '#4C82FB', // accent3_dark + }, + + // Token colors + token0: { + DEFAULT: '#FC72FF', // token0 in light theme + dark: '#FC72FF', // token0 in dark theme + }, + token1: { + DEFAULT: '#4C82FB', // token1 in light theme + dark: '#4C82FB', // token1 in dark theme + }, + + // Status colors + success: { + DEFAULT: '#40B66B', // success + }, + critical: { + DEFAULT: '#FF5F52', // critical + secondary: { + DEFAULT: '#FFF2F1', // critical2_light + dark: '#2E0805', // critical2_dark + }, + }, + warning: { + DEFAULT: '#EEB317', // gold200 + }, + + // Network colors + network: { + ethereum: '#627EEA', + optimism: '#FF0420', + polygon: '#A457FF', + arbitrum: '#28A0F0', + bsc: '#F0B90B', + base: '#0052FF', + blast: '#FCFC03', + }, + + // Gray palette + gray: { + 50: '#F5F6FC', + 100: '#E8ECFB', + 150: '#D2D9EE', + 200: '#B8C0DC', + 250: '#A6AFCA', + 300: '#98A1C0', + 350: '#888FAB', + 400: '#7780A0', + 450: '#6B7594', + 500: '#5D6785', + 550: '#505A78', + 600: '#404A67', + 650: '#333D59', + 700: '#293249', + 750: '#1B2236', + 800: '#131A2A', + 850: '#0E1524', + 900: '#0D111C', + 950: '#080B11', + }, + + // Pink palette + pink: { + 50: '#F9ECF1', + 100: '#FFD9E4', + 200: '#FBA4C0', + 300: '#FF6FA3', + 400: '#FB118E', + 500: '#C41969', + 600: '#8C0F49', + 700: '#55072A', + 800: '#350318', + 900: '#2B000B', + vibrant: '#F50DB4', + base: '#FC74FE', + }, + + // Red palette + red: { + 50: '#FAECEA', + 100: '#FED5CF', + 200: '#FEA79B', + 300: '#FD766B', + 400: '#FA2B39', + 500: '#C4292F', + 600: '#891E20', + 700: '#530F0F', + 800: '#380A03', + 900: '#240800', + vibrant: '#F14544', + }, + + // Additional color palettes + yellow: { + 50: '#F6F2D5', + 100: '#DBBC19', + 200: '#DBBC19', + 300: '#BB9F13', + 400: '#A08116', + 500: '#866311', + 600: '#5D4204', + 700: '#3E2B04', + 800: '#231902', + 900: '#180F02', + vibrant: '#FAF40A', + }, + + green: { + 50: '#E3F3E6', + 100: '#BFEECA', + 200: '#76D191', + 300: '#40B66B', + 400: '#209853', + 500: '#0B783E', + 600: '#0C522A', + 700: '#053117', + 800: '#091F10', + 900: '#09130B', + vibrant: '#5CFE9D', + }, + + blue: { + 50: '#EDEFF8', + 100: '#DEE1FF', + 200: '#ADBCFF', + 300: '#869EFF', + 400: '#4C82FB', + 500: '#1267D6', + 600: '#1D4294', + 700: '#09265E', + 800: '#0B193F', + 900: '#040E34', + vibrant: '#587BFF', + }, + + gold: { + 200: '#EEB317', + 400: '#B17900', + vibrant: '#FEB239', + }, + + magenta: { + 300: '#FD82FF', + vibrant: '#FC72FF', + }, + + purple: { + 300: '#8440F2', + 900: '#1C0337', + vibrant: '#6100FF', + }, + + // Legacy colors mapping (for compatibility) + border: '#F9F9F9', + input: '#F9F9F9', + ring: '#222222', + foreground: '#222222', + card: { + DEFAULT: '#FFFFFF', + foreground: '#222222', + }, + popover: { + DEFAULT: '#FFFFFF', + foreground: '#222222', + }, + primary: { + DEFAULT: '#222222', + foreground: '#F9F9F9', + }, + secondary: { + DEFAULT: '#F9F9F9', + foreground: '#222222', + }, + muted: { + DEFAULT: '#F9F9F9', + foreground: '#7D7D7D', + }, + destructive: { + DEFAULT: '#FF5F52', + foreground: '#F9F9F9', + }, + scrim: 'rgba(0, 0, 0, 0.60)', + }, + borderRadius: { + none: '0px', + rounded4: '4px', + rounded6: '6px', + rounded8: '8px', + rounded12: '12px', + rounded16: '16px', + rounded20: '20px', + rounded24: '24px', + rounded32: '32px', + roundedFull: '999999px', + }, + boxShadow: { + short: 'var(--shadow-short)', + medium: 'var(--shadow-medium)', + large: 'var(--shadow-large)', + }, + }, + }, + plugins: [tailwindAnimate], +} satisfies Config diff --git a/apps/api-self-serve/tsconfig.eslint.json b/apps/api-self-serve/tsconfig.eslint.json new file mode 100644 index 00000000000..0af7bb26f3f --- /dev/null +++ b/apps/api-self-serve/tsconfig.eslint.json @@ -0,0 +1,5 @@ +// same as tsconfig.json but without references which caused performance issues with typescript-eslint +{ + "extends": "./tsconfig.json", + "references": [] +} diff --git a/apps/api-self-serve/tsconfig.json b/apps/api-self-serve/tsconfig.json new file mode 100644 index 00000000000..a0d80e99890 --- /dev/null +++ b/apps/api-self-serve/tsconfig.json @@ -0,0 +1,23 @@ +{ + "include": ["**/*", "**/.server/**/*", "**/.client/**/*", ".react-router/types/**/*"], + "exclude": ["tools/**/*"], + "compilerOptions": { + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "types": ["node", "vite/client"], + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "rootDirs": [".", "./.react-router/types"], + "baseUrl": ".", + "paths": { + "~/*": ["./app/*"] + }, + "esModuleInterop": true, + "verbatimModuleSyntax": true, + "noEmit": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true + } +} diff --git a/apps/api-self-serve/vite.config.ts b/apps/api-self-serve/vite.config.ts new file mode 100644 index 00000000000..e0925ec7ad1 --- /dev/null +++ b/apps/api-self-serve/vite.config.ts @@ -0,0 +1,15 @@ +import { reactRouter } from '@react-router/dev/vite' +import tailwindcss from '@tailwindcss/vite' +import { defineConfig } from 'vite' +import tsconfigPaths from 'vite-tsconfig-paths' + +export default defineConfig({ + plugins: [ + tailwindcss(), + reactRouter(), + tsconfigPaths({ + // ignores tsconfig files in Nx generator template directories + skip: (dir) => dir.includes('files'), + }), + ], +}) diff --git a/apps/extension/package.json b/apps/extension/package.json index c93f66b93f1..df241dde507 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -17,12 +17,14 @@ "@types/uuid": "9.0.1", "@uniswap/analytics-events": "2.43.0", "@uniswap/client-embeddedwallet": "0.0.16", + "@uniswap/sdk-core": "7.7.2", "@uniswap/uniswapx-sdk": "3.0.0-beta.7", "@uniswap/universal-router-sdk": "4.19.5", "@uniswap/v3-sdk": "3.25.2", "@uniswap/v4-sdk": "1.21.2", "@universe/api": "workspace:^", "@universe/gating": "workspace:^", + "@universe/sessions": "workspace:^", "@wxt-dev/module-react": "1.1.3", "confusing-browser-globals": "1.0.11", "dotenv-webpack": "8.0.1", diff --git a/apps/extension/src/app/components/AutoLockProvider.test.tsx b/apps/extension/src/app/components/AutoLockProvider.test.tsx index 0b082e9cc91..5e3f69795e7 100644 --- a/apps/extension/src/app/components/AutoLockProvider.test.tsx +++ b/apps/extension/src/app/components/AutoLockProvider.test.tsx @@ -1,252 +1,337 @@ -import { waitFor } from '@testing-library/react' import React from 'react' import { AutoLockProvider } from 'src/app/components/AutoLockProvider' import { render } from 'src/test/test-utils' import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' import { Language } from 'uniswap/src/features/language/constants' import { DeviceAccessTimeout } from 'uniswap/src/features/settings/constants' -import { ExtensionEventName } from 'uniswap/src/features/telemetry/constants' -import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { logger } from 'utilities/src/logger/logger' -import { Keyring } from 'wallet/src/features/wallet/Keyring/Keyring' // Mock dependencies jest.mock('uniswap/src/extension/useIsChromeWindowFocused') -jest.mock('uniswap/src/features/telemetry/send') jest.mock('utilities/src/logger/logger') -jest.mock('wallet/src/features/wallet/Keyring/Keyring') - -// Import mocked modules with proper typing -import { useIsChromeWindowFocusedWithTimeout } from 'uniswap/src/extension/useIsChromeWindowFocused' - -const mockUseIsChromeWindowFocusedWithTimeout = useIsChromeWindowFocusedWithTimeout as jest.MockedFunction< - typeof useIsChromeWindowFocusedWithTimeout -> -const mockSendAnalyticsEvent = sendAnalyticsEvent as jest.MockedFunction -const mockLogger = logger as jest.Mocked -const mockKeyring = Keyring as jest.Mocked - -// Helper functions for common test patterns -const renderAutoLockProvider = ( - deviceAccessTimeout: DeviceAccessTimeout, - children: React.ReactNode =
Test
, -) => { - return render({children}, { - preloadedState: { - userSettings: { - currentLanguage: Language.English, - currentCurrency: FiatCurrency.UnitedStatesDollar, - hideSmallBalances: true, - hideSpamTokens: true, - hapticsEnabled: true, - deviceAccessTimeout, - }, - }, - }) +jest.mock('src/app/hooks/useIsWalletUnlocked', () => ({ + useIsWalletUnlocked: jest.fn(), + isWalletUnlocked: null, +})) + +// Import mocked modules +import { useIsWalletUnlocked } from 'src/app/hooks/useIsWalletUnlocked' +import { useIsChromeWindowFocused } from 'uniswap/src/extension/useIsChromeWindowFocused' + +const mockUseIsChromeWindowFocused = jest.mocked(useIsChromeWindowFocused) +const mockUseIsWalletUnlocked = jest.mocked(useIsWalletUnlocked) +const mockLogger = jest.mocked(logger) + +// Mock chrome.alarms API +const mockChromeAlarms = { + create: jest.fn(), + clear: jest.fn(), } -const simulateFocusChange = (component: ReturnType) => (fromFocused: boolean, toFocused: boolean) => { - mockUseIsChromeWindowFocusedWithTimeout.mockReturnValue(fromFocused) - const { rerender } = component +global.chrome = { + ...global.chrome, + alarms: mockChromeAlarms as unknown as typeof chrome.alarms, +} - mockUseIsChromeWindowFocusedWithTimeout.mockReturnValue(toFocused) - rerender( +// Helper function +const renderAutoLockProvider = (deviceAccessTimeout: DeviceAccessTimeout) => { + return render(
Test
, + { + preloadedState: { + userSettings: { + currentLanguage: Language.English, + currentCurrency: FiatCurrency.UnitedStatesDollar, + hideSmallBalances: true, + hideSpamTokens: true, + hapticsEnabled: true, + deviceAccessTimeout, + }, + }, + }, ) } -const expectWalletLockCalled = async (times: number = 1) => { - await waitFor(() => { - expect(mockKeyring.lock).toHaveBeenCalledTimes(times) - }) -} +const simulateFocusChange = (component: ReturnType) => (fromFocused: boolean, toFocused: boolean) => { + mockUseIsChromeWindowFocused.mockReturnValue(fromFocused) + const { rerender } = component -const expectAnalyticsEventCalled = async () => { - await waitFor(() => { - expect(mockSendAnalyticsEvent).toHaveBeenCalledWith(ExtensionEventName.ChangeLockedState, { - locked: true, - location: 'background', - }) - }) + mockUseIsChromeWindowFocused.mockReturnValue(toFocused) + rerender() } describe('AutoLockProvider', () => { beforeEach(() => { jest.clearAllMocks() - mockUseIsChromeWindowFocusedWithTimeout.mockReturnValue(true) - mockKeyring.lock.mockResolvedValue(true) - mockSendAnalyticsEvent.mockImplementation(() => {}) + mockUseIsChromeWindowFocused.mockReturnValue(true) + mockUseIsWalletUnlocked.mockReturnValue(true) mockLogger.debug.mockImplementation(() => {}) mockLogger.error.mockImplementation(() => {}) + mockChromeAlarms.create.mockImplementation(() => {}) + mockChromeAlarms.clear.mockImplementation(() => {}) }) - describe('window focus monitoring', () => { - const testTimeoutValues = [ - { timeout: DeviceAccessTimeout.FiveMinutes, expectedMs: 5 * 60 * 1000, description: '5 minutes' }, - { timeout: DeviceAccessTimeout.ThirtyMinutes, expectedMs: 30 * 60 * 1000, description: '30 minutes' }, - { timeout: DeviceAccessTimeout.OneHour, expectedMs: 60 * 60 * 1000, description: '1 hour' }, - { timeout: DeviceAccessTimeout.TwentyFourHours, expectedMs: 24 * 60 * 60 * 1000, description: '24 hours' }, - { - timeout: DeviceAccessTimeout.Never, - expectedMs: Number.MAX_SAFE_INTEGER, - description: 'Never (MAX_SAFE_INTEGER)', - }, - ] + describe('mount behavior', () => { + it('should clear alarm on mount', () => { + renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - testTimeoutValues.forEach(({ timeout, expectedMs, description }) => { - it(`should call useIsChromeWindowFocusedWithTimeout with correct timeout for ${description}`, () => { - renderAutoLockProvider(timeout) - expect(mockUseIsChromeWindowFocusedWithTimeout).toHaveBeenCalledWith(expectedMs) - }) + expect(mockChromeAlarms.clear).toHaveBeenCalledWith('AutoLockAlarm') + }) + + it('should always render children', () => { + const { container } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + expect(container.textContent).toBe('Test') }) }) - describe('wallet locking behavior', () => { - it('should lock wallet when window loses focus and timeout is configured', async () => { + describe('unmount behavior', () => { + it('should not schedule alarm on unmount (handled by background port disconnect)', () => { + const { unmount } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + + unmount() + + // Unmount no longer schedules alarm - this is handled by background script + expect(mockChromeAlarms.create).not.toHaveBeenCalled() + }) + }) + + describe('focus change behavior (while sidebar is open)', () => { + it('should schedule alarm when window loses focus and wallet is unlocked', () => { const component = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - expect(mockKeyring.lock).not.toHaveBeenCalled() + mockChromeAlarms.create.mockClear() // Clear the mount call simulateFocusChange(component)(true, false) - await expectWalletLockCalled() + + expect(mockChromeAlarms.create).toHaveBeenCalledWith('AutoLockAlarm', { + delayInMinutes: 5, + }) }) - it('should not lock wallet when window is focused', () => { - mockUseIsChromeWindowFocusedWithTimeout.mockReturnValue(true) - renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - expect(mockKeyring.lock).not.toHaveBeenCalled() + it('should clear alarm when window regains focus', () => { + const component = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + mockChromeAlarms.clear.mockClear() // Clear the mount call + + // First lose focus (creates alarm) + simulateFocusChange(component)(true, false) + expect(mockChromeAlarms.create).toHaveBeenCalled() + + // Then regain focus + simulateFocusChange(component)(false, true) + + expect(mockChromeAlarms.clear).toHaveBeenCalledWith('AutoLockAlarm') }) - it('should not lock wallet when timeout is set to Never', () => { - mockUseIsChromeWindowFocusedWithTimeout.mockReturnValue(false) - renderAutoLockProvider(DeviceAccessTimeout.Never) - expect(mockKeyring.lock).not.toHaveBeenCalled() + it('should not schedule alarm when window loses focus and wallet is locked', () => { + mockUseIsWalletUnlocked.mockReturnValue(false) + const component = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + mockChromeAlarms.create.mockClear() // Clear the mount call + + simulateFocusChange(component)(true, false) + + expect(mockChromeAlarms.create).not.toHaveBeenCalled() }) - it('should send analytics event when locking wallet', async () => { - const component = renderAutoLockProvider(DeviceAccessTimeout.ThirtyMinutes) + it('should not schedule alarm when window loses focus and timeout is Never', () => { + const component = renderAutoLockProvider(DeviceAccessTimeout.Never) + mockChromeAlarms.create.mockClear() // Clear the mount call + simulateFocusChange(component)(true, false) - await expectAnalyticsEventCalled() - expect(mockSendAnalyticsEvent).toHaveBeenCalledTimes(1) + + expect(mockChromeAlarms.create).not.toHaveBeenCalled() }) }) - describe('error handling', () => { - it('should handle Keyring.lock() errors gracefully', async () => { - const lockError = new Error('Failed to lock keyring') - mockKeyring.lock.mockRejectedValue(lockError) + describe('wallet state changes', () => { + it('should clear alarm when wallet becomes locked', () => { + mockUseIsWalletUnlocked.mockReturnValue(true) + const { rerender } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - const component = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - simulateFocusChange(component)(true, false) + // Clear the initial mount call + mockChromeAlarms.clear.mockClear() - await waitFor(() => { - expect(mockLogger.error).toHaveBeenCalledWith(lockError, { - tags: { - file: 'AutoLockProvider.tsx', - function: 'lockWallet', - }, - }) - }) + // Wallet becomes locked + mockUseIsWalletUnlocked.mockReturnValue(false) + rerender() + + expect(mockChromeAlarms.clear).toHaveBeenCalledWith('AutoLockAlarm') }) - it('should not send analytics event when lock fails', async () => { - const lockError = new Error('Failed to lock keyring') - mockKeyring.lock.mockRejectedValue(lockError) + it('should clear alarm when wallet becomes unlocked', () => { + mockUseIsWalletUnlocked.mockReturnValue(false) + const { rerender } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - const component = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - simulateFocusChange(component)(true, false) + // Clear the initial mount call + mockChromeAlarms.clear.mockClear() - await waitFor(() => { - expect(mockLogger.error).toHaveBeenCalledWith(lockError, { - tags: { - file: 'AutoLockProvider.tsx', - function: 'lockWallet', - }, - }) - }) + // Wallet becomes unlocked + mockUseIsWalletUnlocked.mockReturnValue(true) + rerender() - expect(mockSendAnalyticsEvent).not.toHaveBeenCalled() - }) - - it('should handle undefined deviceAccessTimeout gracefully', () => { - render( - -
Test
-
, - { - preloadedState: { - userSettings: { - currentLanguage: Language.English, - currentCurrency: FiatCurrency.UnitedStatesDollar, - hideSmallBalances: true, - hideSpamTokens: true, - hapticsEnabled: true, - deviceAccessTimeout: undefined as any, - }, - }, - }, - ) + expect(mockChromeAlarms.clear).toHaveBeenCalledWith('AutoLockAlarm') + }) + + it('should not clear alarm on initial render (only mount clear)', () => { + mockUseIsWalletUnlocked.mockReturnValue(true) + renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + + // Only the mount clear should have been called + expect(mockChromeAlarms.clear).toHaveBeenCalledTimes(1) + }) + }) + + describe('combined scenarios', () => { + it('should handle mount -> unmount -> remount correctly', () => { + // First mount + const { unmount } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + expect(mockChromeAlarms.clear).toHaveBeenCalledTimes(1) + + // Unmount (alarm scheduling now handled in background) + unmount() + + // Second mount (clears alarm) + renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + expect(mockChromeAlarms.clear).toHaveBeenCalledTimes(2) + }) + + it('should handle wallet unlock during mounted state', () => { + mockUseIsWalletUnlocked.mockReturnValue(false) + const { rerender } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + + mockChromeAlarms.clear.mockClear() + + // Wallet unlocks while mounted + mockUseIsWalletUnlocked.mockReturnValue(true) + rerender() + + // Should clear alarm due to wallet state change + expect(mockChromeAlarms.clear).toHaveBeenCalled() + }) - expect(mockUseIsChromeWindowFocusedWithTimeout).toHaveBeenCalledWith(30 * 60 * 1000) + it('should handle wallet lock during mounted state', () => { + mockUseIsWalletUnlocked.mockReturnValue(true) + const { rerender } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + + mockChromeAlarms.clear.mockClear() + + // Wallet locks while mounted + mockUseIsWalletUnlocked.mockReturnValue(false) + rerender() + + // Should clear alarm due to wallet state change + expect(mockChromeAlarms.clear).toHaveBeenCalled() }) }) - describe('focus state changes', () => { - it('should react to focus state changes from focused to unfocused', async () => { + describe('error handling', () => { + it('should handle chrome.alarms.create errors gracefully', () => { + const error = new Error('Permission denied') + mockChromeAlarms.create.mockImplementationOnce(() => { + throw error + }) + const component = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - expect(mockKeyring.lock).not.toHaveBeenCalled() + mockChromeAlarms.create.mockClear() - simulateFocusChange(component)(true, false) - await expectWalletLockCalled() + // This should not throw, error should be logged + expect(() => { + simulateFocusChange(component)(true, false) + }).not.toThrow() + + expect(mockLogger.error).toHaveBeenCalledWith(error, { + tags: { file: 'AutoLockProvider', function: 'createAutoLockAlarm' }, + extra: { delayInMinutes: 5 }, + }) + }) + + it('should handle chrome.alarms.clear errors gracefully', () => { + const error = new Error('Permission denied') + mockChromeAlarms.clear.mockImplementationOnce(() => { + throw error + }) + + // This should not throw, error should be logged + expect(() => { + renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + }).not.toThrow() + + expect(mockLogger.error).toHaveBeenCalledWith(error, { + tags: { file: 'AutoLockProvider', function: 'clearAutoLockAlarm' }, + extra: { reason: 'Cleared auto-lock alarm (sidebar opened)' }, + }) }) - it('should not trigger multiple locks when already unfocused', async () => { + it('should continue to function after chrome.alarms errors', () => { + // First call fails + mockChromeAlarms.clear.mockImplementationOnce(() => { + throw new Error('Permission denied') + }) + const component = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + // Clear the error and mock calls + mockLogger.error.mockClear() + mockChromeAlarms.clear.mockClear() + mockChromeAlarms.create.mockClear() + + // Subsequent calls should still work simulateFocusChange(component)(true, false) - await expectWalletLockCalled() + expect(mockChromeAlarms.create).toHaveBeenCalledWith('AutoLockAlarm', { + delayInMinutes: 5, + }) + expect(mockLogger.error).not.toHaveBeenCalled() + }) + }) - // Rerender with same unfocused state - should not trigger additional calls - const { rerender } = component - rerender( - -
Test
-
, - ) + describe('edge cases', () => { + it('should handle rapid mount/unmount cycles', () => { + const { unmount: unmount1 } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + unmount1() - expect(mockKeyring.lock).toHaveBeenCalledTimes(1) + const { unmount: unmount2 } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + unmount2() + + // Should have cleared alarm twice (once per mount) + expect(mockChromeAlarms.clear).toHaveBeenCalledTimes(2) + // No create calls because unmount scheduling is handled in background + expect(mockChromeAlarms.create).not.toHaveBeenCalled() }) - it('should not lock again when returning to focused state', async () => { + it('should handle rapid focus changes', () => { const component = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + mockChromeAlarms.create.mockClear() + mockChromeAlarms.clear.mockClear() + // Lose focus simulateFocusChange(component)(true, false) - await expectWalletLockCalled() + expect(mockChromeAlarms.create).toHaveBeenCalledTimes(1) - // Change back to focused + // Regain focus simulateFocusChange(component)(false, true) - expect(mockKeyring.lock).toHaveBeenCalledTimes(1) - }) - }) + expect(mockChromeAlarms.clear).toHaveBeenCalledTimes(1) - describe('timeout setting changes', () => { - it('should respond to timeout setting changes', () => { - renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - expect(mockUseIsChromeWindowFocusedWithTimeout).toHaveBeenLastCalledWith(5 * 60 * 1000) - - renderAutoLockProvider(DeviceAccessTimeout.OneHour) - expect(mockUseIsChromeWindowFocusedWithTimeout).toHaveBeenLastCalledWith(60 * 60 * 1000) + // Lose focus again + simulateFocusChange(component)(true, false) + expect(mockChromeAlarms.create).toHaveBeenCalledTimes(2) }) - it('should handle timeout change from configured to Never', () => { - mockUseIsChromeWindowFocusedWithTimeout.mockReturnValue(false) + it('should prioritize wallet state changes over focus changes (race condition)', () => { + mockUseIsWalletUnlocked.mockReturnValue(true) + mockUseIsChromeWindowFocused.mockReturnValue(true) + const { rerender } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - expect(mockUseIsChromeWindowFocusedWithTimeout).toHaveBeenCalledWith(5 * 60 * 1000) + mockChromeAlarms.clear.mockClear() + mockChromeAlarms.create.mockClear() + + // Simulate simultaneous wallet lock + focus loss + mockUseIsWalletUnlocked.mockReturnValue(false) + mockUseIsChromeWindowFocused.mockReturnValue(false) + rerender() - renderAutoLockProvider(DeviceAccessTimeout.Never) - expect(mockUseIsChromeWindowFocusedWithTimeout).toHaveBeenLastCalledWith(Number.MAX_SAFE_INTEGER) + // Should only clear alarm (wallet state change priority), not schedule + expect(mockChromeAlarms.clear).toHaveBeenCalledTimes(1) + expect(mockChromeAlarms.create).not.toHaveBeenCalled() }) }) }) diff --git a/apps/extension/src/app/components/AutoLockProvider.tsx b/apps/extension/src/app/components/AutoLockProvider.tsx index 8f26d940352..68c18d819e6 100644 --- a/apps/extension/src/app/components/AutoLockProvider.tsx +++ b/apps/extension/src/app/components/AutoLockProvider.tsx @@ -1,73 +1,98 @@ -import { FeatureFlags, useFeatureFlag } from '@universe/gating' -import { PropsWithChildren, useEffect } from 'react' +import { PropsWithChildren, useEffect, useRef } from 'react' import { useSelector } from 'react-redux' -import { ExtensionState } from 'src/store/extensionReducer' -import { useIsChromeWindowFocusedWithTimeout } from 'uniswap/src/extension/useIsChromeWindowFocused' -import { deviceAccessTimeoutToMs } from 'uniswap/src/features/settings/constants' -import { ExtensionEventName } from 'uniswap/src/features/telemetry/constants' -import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' +import { useIsWalletUnlocked } from 'src/app/hooks/useIsWalletUnlocked' +import { useIsChromeWindowFocused } from 'uniswap/src/extension/useIsChromeWindowFocused' +import { selectDeviceAccessTimeoutMinutes } from 'uniswap/src/features/settings/selectors' import { logger } from 'utilities/src/logger/logger' -import { Keyring } from 'wallet/src/features/wallet/Keyring/Keyring' -const AUTO_LOCK_ALARM_NAME = 'AutoLockAlarm' +export const AUTO_LOCK_ALARM_NAME = 'AutoLockAlarm' /** - * AutoLockProvider monitors window focus and automatically locks the wallet - * after the configured inactivity timeout period. + * Helper to safely clear the auto-lock alarm with error handling + */ +function clearAutoLockAlarm(reason: string): void { + try { + chrome.alarms.clear(AUTO_LOCK_ALARM_NAME) + logger.debug('AutoLockProvider', 'clearAutoLockAlarm', reason) + } catch (error) { + logger.error(error, { + tags: { file: 'AutoLockProvider', function: 'clearAutoLockAlarm' }, + extra: { reason }, + }) + } +} + +/** + * Helper to safely create the auto-lock alarm with error handling + */ +function createAutoLockAlarm(delayInMinutes: number): void { + try { + chrome.alarms.create(AUTO_LOCK_ALARM_NAME, { delayInMinutes }) + logger.debug('AutoLockProvider', 'createAutoLockAlarm', `Scheduled auto-lock alarm for ${delayInMinutes} minutes`) + } catch (error) { + logger.error(error, { + tags: { file: 'AutoLockProvider', function: 'createAutoLockAlarm' }, + extra: { delayInMinutes }, + }) + } +} + +/** + * AutoLockProvider schedules chrome alarms to automatically lock the wallet + * after the configured timeout period when the sidebar is not focused. * - * This component should be placed high in the component tree to ensure - * it's always active when the extension is running. + * Uses chrome.alarms API which persists even when the extension is closed, + * ensuring reliable auto-lock behavior. */ export function AutoLockProvider({ children }: PropsWithChildren): JSX.Element { - const deviceAccessTimeout = useSelector((state: ExtensionState) => state.userSettings.deviceAccessTimeout) - const useAlarmsApi = useFeatureFlag(FeatureFlags.UseAlarmsApi) - const timeoutMs = deviceAccessTimeoutToMs(deviceAccessTimeout) + const delayInMinutes = useSelector(selectDeviceAccessTimeoutMinutes) + const isWalletUnlocked = useIsWalletUnlocked() + const isChromeWindowFocused = useIsChromeWindowFocused() - // Use the window focus hook with the configured timeout - // If timeoutMs is undefined (Never setting), use a very large number to effectively disable - const isChromeWindowFocused = useIsChromeWindowFocusedWithTimeout(timeoutMs ?? Number.MAX_SAFE_INTEGER) + // Ref to track previous focus state + const prevFocusedRef = useRef(true) + // Ref to track previous unlock state + const prevUnlockedRef = useRef(null) - // Maintain chrome.alarms usage behind feature flag + // On mount: Clear any existing alarm (sidebar just opened) useEffect(() => { - if (useAlarmsApi) { - chrome.alarms.create(AUTO_LOCK_ALARM_NAME, { - delayInMinutes: 1000, - }) + clearAutoLockAlarm('Cleared auto-lock alarm (sidebar opened)') + }, []) + + useEffect(() => { + // Skip if timeout not configured (Never) + if (delayInMinutes === undefined) { + clearAutoLockAlarm('Cleared auto-lock alarm (timeout not configured)') + return } - return () => { - chrome.alarms.clear(AUTO_LOCK_ALARM_NAME) + const prevFocused = prevFocusedRef.current + const prevUnlocked = prevUnlockedRef.current + prevFocusedRef.current = isChromeWindowFocused + prevUnlockedRef.current = isWalletUnlocked + + // Skip first render for unlock state + if (prevUnlocked === null) { + return } - }, [useAlarmsApi]) - useEffect(() => { - // Only lock if timeout is configured (not "Never") - if (timeoutMs === undefined) { + // Clear alarm when wallet state changes (locked or unlocked) + if (prevUnlocked !== isWalletUnlocked) { + clearAutoLockAlarm(`Cleared auto-lock alarm (wallet ${isWalletUnlocked ? 'unlocked' : 'locked'})`) return } - if (!isChromeWindowFocused) { - const lockWallet = async (): Promise => { - try { - logger.debug('AutoLockProvider', 'lockWallet', 'Locking wallet due to inactivity') - await Keyring.lock() - sendAnalyticsEvent(ExtensionEventName.ChangeLockedState, { - locked: true, - location: 'background', - }) - } catch (error) { - logger.error(error, { - tags: { - file: 'AutoLockProvider.tsx', - function: 'lockWallet', - }, - }) - } - } + // When window loses focus AND wallet is unlocked: schedule alarm + if (prevFocused && !isChromeWindowFocused && isWalletUnlocked) { + createAutoLockAlarm(delayInMinutes) + return + } - lockWallet() + // When window regains focus: clear alarm + if (!prevFocused && isChromeWindowFocused) { + clearAutoLockAlarm('Cleared auto-lock alarm (window focused)') } - }, [isChromeWindowFocused, timeoutMs]) + }, [isChromeWindowFocused, isWalletUnlocked, delayInMinutes]) return <>{children} } diff --git a/apps/extension/src/app/components/tabs/ActivityTab.tsx b/apps/extension/src/app/components/tabs/ActivityTab.tsx index a0a8074467f..95ca43b900f 100644 --- a/apps/extension/src/app/components/tabs/ActivityTab.tsx +++ b/apps/extension/src/app/components/tabs/ActivityTab.tsx @@ -1,5 +1,6 @@ import { memo } from 'react' -import { ScrollView } from 'ui/src' +import { Flex, Loader, ScrollView } from 'ui/src' +import { useInfiniteScroll } from 'utilities/src/react/useInfiniteScroll' import { useActivityDataWallet } from 'wallet/src/features/activity/useActivityDataWallet' export const ActivityTab = memo(function _ActivityTab({ @@ -9,9 +10,16 @@ export const ActivityTab = memo(function _ActivityTab({ address: Address skip?: boolean }): JSX.Element { - const { maybeEmptyComponent, renderActivityItem, sectionData } = useActivityDataWallet({ - evmOwner: address, - skip, + const { maybeEmptyComponent, renderActivityItem, sectionData, fetchNextPage, hasNextPage, isFetchingNextPage } = + useActivityDataWallet({ + evmOwner: address, + skip, + }) + + const { sentinelRef } = useInfiniteScroll({ + onLoadMore: fetchNextPage, + hasNextPage, + isFetching: isFetchingNextPage, }) if (maybeEmptyComponent) { @@ -22,6 +30,14 @@ export const ActivityTab = memo(function _ActivityTab({ {/* `sectionData` will be either an array of transactions or an array of loading skeletons */} {sectionData.map((item, index) => renderActivityItem({ item, index }))} + {/* Show skeleton loading indicator while fetching next page */} + {isFetchingNextPage && ( + + + + )} + {/* Intersection observer sentinel for infinite scroll */} + ) }) diff --git a/apps/extension/src/app/core/BaseAppContainer.tsx b/apps/extension/src/app/core/BaseAppContainer.tsx index 09f9327325c..c38fbbc9e56 100644 --- a/apps/extension/src/app/core/BaseAppContainer.tsx +++ b/apps/extension/src/app/core/BaseAppContainer.tsx @@ -1,3 +1,5 @@ +import { ApiInit, getSessionService } from '@universe/api' +import { createChallengeSolverService, createSessionInitializationService } from '@universe/sessions' import { PropsWithChildren } from 'react' import { I18nextProvider } from 'react-i18next' import { GraphqlProvider } from 'src/app/apollo' @@ -14,6 +16,14 @@ import { ErrorBoundary } from 'wallet/src/components/ErrorBoundary/ErrorBoundary import { AccountsStoreContextProvider } from 'wallet/src/features/accounts/store/provider' import { SharedWalletProvider } from 'wallet/src/providers/SharedWalletProvider' +const sessionInitializationService = createSessionInitializationService({ + sessionService: getSessionService({ + // TODO: Use real base url + getBaseUrl: () => 'https://entry-gateway.backend-dev.api.uniswap.org', + }), + challengeSolverService: createChallengeSolverService(), +}) + export function BaseAppContainer({ children, appName, @@ -30,6 +40,7 @@ export function BaseAppContainer({ + {children} diff --git a/apps/extension/src/app/core/SidebarApp.tsx b/apps/extension/src/app/core/SidebarApp.tsx index db280c45dfb..eeadc95bfa9 100644 --- a/apps/extension/src/app/core/SidebarApp.tsx +++ b/apps/extension/src/app/core/SidebarApp.tsx @@ -6,6 +6,7 @@ import { useEffect, useRef, useState } from 'react' import { useDispatch } from 'react-redux' import { createHashRouter, RouterProvider } from 'react-router' import { PersistGate } from 'redux-persist/integration/react' +import { AUTO_LOCK_ALARM_NAME } from 'src/app/components/AutoLockProvider' import { ErrorElement } from 'src/app/components/ErrorElement' import { useTraceSidebarDappUrl } from 'src/app/components/Trace/useTraceSidebarDappUrl' import { BaseAppContainer } from 'src/app/core/BaseAppContainer' @@ -188,8 +189,21 @@ function useDappRequestPortListener(): void { }, PORT_PING_INTERVAL) } +/** + * Creates a connection so that the background script can detect when the sidebar is closed and schedule an auto-lock alarm. + */ +function useAutoLockAlarmConnection(): void { + useEffect(() => { + const port = chrome.runtime.connect({ name: AUTO_LOCK_ALARM_NAME }) + return () => { + port.disconnect() + } + }, []) +} + function SidebarWrapper(): JSX.Element { useDappRequestPortListener() + useAutoLockAlarmConnection() useTestnetModeForLoggingAndAnalytics() const resetUnitagsQueries = useResetUnitagsQueries() diff --git a/apps/extension/src/app/features/accounts/AccountItem.tsx b/apps/extension/src/app/features/accounts/AccountItem.tsx index dc2db86aa01..99eb7319601 100644 --- a/apps/extension/src/app/features/accounts/AccountItem.tsx +++ b/apps/extension/src/app/features/accounts/AccountItem.tsx @@ -4,8 +4,8 @@ import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' import { EditLabelModal } from 'src/app/features/accounts/EditLabelModal' import { removeAllDappConnectionsForAccount } from 'src/app/features/dapp/actions' -import { AppRoutes, SettingsRoutes } from 'src/app/navigation/constants' -import { useExtensionNavigation } from 'src/app/navigation/utils' +import { AppRoutes, SettingsRoutes, UnitagClaimRoutes } from 'src/app/navigation/constants' +import { focusOrCreateUnitagTab, useExtensionNavigation } from 'src/app/navigation/utils' import { Flex, Text, TouchableArea } from 'ui/src' import { CopySheets, Edit, Ellipsis, Globe, TrashFilled } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' @@ -97,13 +97,17 @@ export function AccountItem({ address, onAccountSelect, balanceUSD }: AccountIte label: !accountHasUnitag ? t('account.wallet.menu.edit.title') : t('settings.setting.wallet.action.editProfile'), - onPress: (e: BaseSyntheticEvent): void => { + onPress: async (e: BaseSyntheticEvent): Promise => { // We have to manually prevent click-through because the way the context menu is inside of a TouchableArea in this component it // means that without it the TouchableArea handler will get called e.preventDefault() e.stopPropagation() - setShowEditLabelModal(true) + if (accountHasUnitag) { + await focusOrCreateUnitagTab(address, UnitagClaimRoutes.EditProfile) + } else { + setShowEditLabelModal(true) + } }, Icon: Edit, }, @@ -134,7 +138,7 @@ export function AccountItem({ address, onAccountSelect, balanceUSD }: AccountIte iconProps: { color: '$statusCritical' }, }, ] - }, [accountHasUnitag, onPressCopyAddress, navigateTo, t]) + }, [accountHasUnitag, onPressCopyAddress, navigateTo, t, address]) return ( <> diff --git a/apps/extension/src/app/features/biometricUnlock/BiometricUnlockStorage.ts b/apps/extension/src/app/features/biometricUnlock/BiometricUnlockStorage.ts index bd06afb9236..599a36b1c07 100644 --- a/apps/extension/src/app/features/biometricUnlock/BiometricUnlockStorage.ts +++ b/apps/extension/src/app/features/biometricUnlock/BiometricUnlockStorage.ts @@ -4,6 +4,7 @@ import { PersistedStorage } from 'wallet/src/utils/persistedStorage' export type BiometricUnlockStorageData = { credentialId: string + transports: AuthenticatorTransport[] secretPayload: Omit & { ciphertext: string } } diff --git a/apps/extension/src/app/features/biometricUnlock/biometricAuthUtils.ts b/apps/extension/src/app/features/biometricUnlock/biometricAuthUtils.ts index d82aeb49f58..21aa3d19515 100644 --- a/apps/extension/src/app/features/biometricUnlock/biometricAuthUtils.ts +++ b/apps/extension/src/app/features/biometricUnlock/biometricAuthUtils.ts @@ -16,9 +16,11 @@ import { */ export async function authenticateWithBiometricCredential({ credentialId, + transports, abortSignal, }: { credentialId: string + transports: AuthenticatorTransport[] abortSignal: AbortSignal }): Promise<{ publicKeyCredential: PublicKeyCredential; encryptionKey: CryptoKey }> { // Convert stored credential ID back to binary format @@ -31,6 +33,7 @@ export async function authenticateWithBiometricCredential({ { type: 'public-key', id: credentialIdBuffer, + transports, }, ], userVerification: 'required', @@ -70,10 +73,12 @@ export async function encryptPasswordWithBiometricData({ password, encryptionKey, credentialId, + transports, }: { password: string encryptionKey: CryptoKey credentialId: string + transports: AuthenticatorTransport[] }): Promise { // Create a new secret payload for the password const secretPayload = await createEmptySecretPayload() @@ -86,7 +91,7 @@ export async function encryptPasswordWithBiometricData({ additionalData: credentialId, // Use credential ID as additional authenticated data }) - return { credentialId, secretPayload: secretPayloadWithCiphertext } + return { credentialId, transports, secretPayload: secretPayloadWithCiphertext } } /** diff --git a/apps/extension/src/app/features/biometricUnlock/useBiometricUnlockSetupMutation.test.ts b/apps/extension/src/app/features/biometricUnlock/useBiometricUnlockSetupMutation.test.ts index 1b15deca6b5..1eb0c37cb0b 100644 --- a/apps/extension/src/app/features/biometricUnlock/useBiometricUnlockSetupMutation.test.ts +++ b/apps/extension/src/app/features/biometricUnlock/useBiometricUnlockSetupMutation.test.ts @@ -42,7 +42,12 @@ const mockGetEncryptionKeyFromBuffer = jest.requireMock( // Mock PublicKeyCredential (doesn't exist in Jest environment) class MockPublicKeyCredential { - constructor(public rawId: ArrayBuffer) {} + constructor( + public rawId: ArrayBuffer, + public response = { + getTransports: () => ['internal' as AuthenticatorTransport], + }, + ) {} } Object.defineProperty(global, 'PublicKeyCredential', { writable: true, @@ -124,10 +129,12 @@ describe('useBiometricUnlockSetupMutation', () => { // Verify the stored secret payload has all required properties const storedData = mockBiometricUnlockStorage.set.mock.calls[0]![0] as { credentialId: string + transports: AuthenticatorTransport[] secretPayload: typeof mockSecretPayload } expect(storedData.credentialId).toBe(expectedCredentialId) + expect(storedData.transports).toEqual(['internal']) expect(storedData.secretPayload).toEqual( expect.objectContaining({ diff --git a/apps/extension/src/app/features/biometricUnlock/useBiometricUnlockSetupMutation.ts b/apps/extension/src/app/features/biometricUnlock/useBiometricUnlockSetupMutation.ts index 345545a74c8..bd0e4616f51 100644 --- a/apps/extension/src/app/features/biometricUnlock/useBiometricUnlockSetupMutation.ts +++ b/apps/extension/src/app/features/biometricUnlock/useBiometricUnlockSetupMutation.ts @@ -69,7 +69,7 @@ async function createCredentialAndEncryptPassword({ const rawKey = await window.crypto.subtle.exportKey('raw', encryptionKey) - const { credentialId } = await createCredential({ + const { credentialId, transports } = await createCredential({ encryptionKey: rawKey, abortSignal, }) @@ -78,6 +78,7 @@ async function createCredentialAndEncryptPassword({ password, encryptionKey, credentialId, + transports, }) } @@ -116,7 +117,7 @@ async function createCredential({ }: { encryptionKey: ArrayBuffer abortSignal: AbortSignal -}): Promise<{ credentialId: string }> { +}): Promise<{ credentialId: string; transports: AuthenticatorTransport[] }> { // Create WebAuthn credential with platform authenticator (Touch ID, Windows Hello, etc.) forced const credential = await navigator.credentials.create({ publicKey: { @@ -149,5 +150,8 @@ async function createCredential({ // Convert raw ID to a storable string format const credentialId = btoa(String.fromCharCode(...new Uint8Array(publicKeyCredential.rawId))) - return { credentialId } + const response = publicKeyCredential.response as AuthenticatorAttestationResponse + const transports = response.getTransports() as AuthenticatorTransport[] + + return { credentialId, transports } } diff --git a/apps/extension/src/app/features/biometricUnlock/useChangePasswordWithBiometricMutation.test.ts b/apps/extension/src/app/features/biometricUnlock/useChangePasswordWithBiometricMutation.test.ts index fd312c48e6a..c8f23d90136 100644 --- a/apps/extension/src/app/features/biometricUnlock/useChangePasswordWithBiometricMutation.test.ts +++ b/apps/extension/src/app/features/biometricUnlock/useChangePasswordWithBiometricMutation.test.ts @@ -108,6 +108,7 @@ describe('useChangePasswordWithBiometricMutation', () => { // Setup default mocks mockBiometricUnlockStorage.get.mockResolvedValue({ credentialId: mockCredentialId, + transports: ['internal'], secretPayload: mockOldEncryptedPayload, }) @@ -146,6 +147,7 @@ describe('useChangePasswordWithBiometricMutation', () => { { type: 'public-key', id: credentialIdBuffer, + transports: ['internal'], }, ], userVerification: 'required', @@ -160,6 +162,7 @@ describe('useChangePasswordWithBiometricMutation', () => { // 4. Should update the stored biometric data with re-encrypted password expect(mockBiometricUnlockStorage.set).toHaveBeenCalledWith({ credentialId: mockCredentialId, + transports: ['internal'], secretPayload: expect.objectContaining({ ciphertext: expect.any(String), iv: expect.any(String), @@ -189,6 +192,7 @@ describe('useChangePasswordWithBiometricMutation', () => { const newBiometricData = setCall?.[0] expect(newBiometricData?.credentialId).toBe(mockCredentialId) + expect(newBiometricData?.transports).toEqual(['internal']) expect(newBiometricData?.secretPayload).toMatchObject({ ciphertext: expect.any(String), iv: expect.any(String), diff --git a/apps/extension/src/app/features/biometricUnlock/useChangePasswordWithBiometricMutation.ts b/apps/extension/src/app/features/biometricUnlock/useChangePasswordWithBiometricMutation.ts index 8da478fe45c..11361bdf03f 100644 --- a/apps/extension/src/app/features/biometricUnlock/useChangePasswordWithBiometricMutation.ts +++ b/apps/extension/src/app/features/biometricUnlock/useChangePasswordWithBiometricMutation.ts @@ -25,6 +25,7 @@ export function useChangePasswordWithBiometricMutation(options?: { // Authenticate with WebAuthn to get the encryption key const { encryptionKey } = await authenticateWithBiometricCredential({ credentialId: biometricUnlockCredential.credentialId, + transports: biometricUnlockCredential.transports, abortSignal, }) @@ -36,6 +37,7 @@ export function useChangePasswordWithBiometricMutation(options?: { password: newPassword, encryptionKey, credentialId: biometricUnlockCredential.credentialId, + transports: biometricUnlockCredential.transports, }) // Update the stored biometric data diff --git a/apps/extension/src/app/features/biometricUnlock/useUnlockWithBiometricCredentialMutation.test.ts b/apps/extension/src/app/features/biometricUnlock/useUnlockWithBiometricCredentialMutation.test.ts index 832e727c382..5685ba37f1a 100644 --- a/apps/extension/src/app/features/biometricUnlock/useUnlockWithBiometricCredentialMutation.test.ts +++ b/apps/extension/src/app/features/biometricUnlock/useUnlockWithBiometricCredentialMutation.test.ts @@ -3,15 +3,13 @@ import { waitFor } from '@testing-library/react' import { BiometricUnlockStorage } from 'src/app/features/biometricUnlock/BiometricUnlockStorage' import { useUnlockWithBiometricCredentialMutation } from 'src/app/features/biometricUnlock/useUnlockWithBiometricCredentialMutation' import { renderHookWithProviders } from 'src/test/render' -import { authActions } from 'wallet/src/features/auth/saga' -import { AuthActionType } from 'wallet/src/features/auth/types' import { encodeForStorage, encrypt, generateNew256BitRandomBuffer } from 'wallet/src/features/wallet/Keyring/crypto' jest.mock('src/app/features/biometricUnlock/BiometricUnlockStorage') -jest.mock('wallet/src/features/auth/saga', () => ({ - authActions: { - trigger: jest.fn(), - }, + +const mockUnlockWithPassword = jest.fn() +jest.mock('src/app/features/lockScreen/useUnlockWithPassword', () => ({ + useUnlockWithPassword: jest.fn(() => mockUnlockWithPassword), })) // Mock the Web Crypto API with Node.js built-in @@ -27,7 +25,6 @@ Object.defineProperty(navigator, 'credentials', { }) const mockBiometricUnlockStorage = BiometricUnlockStorage as jest.Mocked -const mockAuthActions = authActions as jest.Mocked // Mock AuthenticatorAssertionResponse class MockAuthenticatorAssertionResponse { @@ -100,6 +97,7 @@ describe('useUnlockWithBiometricCredentialMutation', () => { // Setup default mocks mockBiometricUnlockStorage.get.mockResolvedValue({ credentialId: mockCredentialId, + transports: ['internal'], secretPayload: mockEncryptedPayload, }) @@ -107,15 +105,9 @@ describe('useUnlockWithBiometricCredentialMutation', () => { const mockPublicKeyCredential = new MockPublicKeyCredential(mockAuthResponse) mockCredentialsGet.mockResolvedValue(mockPublicKeyCredential) - mockAuthActions.trigger.mockReturnValue({ - type: 'AUTH_TRIGGER', - payload: { - type: AuthActionType.Unlock, - password: mockPassword, - }, - }) - - jest.clearAllMocks() + // Reset and configure mockUnlockWithPassword + mockUnlockWithPassword.mockReset() + mockUnlockWithPassword.mockResolvedValue(undefined) }) describe('successful unlock', () => { @@ -140,6 +132,7 @@ describe('useUnlockWithBiometricCredentialMutation', () => { { type: 'public-key', id: credentialIdBuffer, + transports: ['internal'], }, ], userVerification: 'required', @@ -148,11 +141,8 @@ describe('useUnlockWithBiometricCredentialMutation', () => { signal: expect.any(AbortSignal), }) - // 3. Should dispatch unlock action with the decrypted password - expect(mockAuthActions.trigger).toHaveBeenCalledWith({ - type: AuthActionType.Unlock, - password: mockPassword, - }) + // 3. Should call unlockWithPassword with the decrypted password + expect(mockUnlockWithPassword).toHaveBeenCalledWith({ password: mockPassword }) }) }) @@ -170,7 +160,7 @@ describe('useUnlockWithBiometricCredentialMutation', () => { expect(result.current.error?.message).toBe('No biometric unlock credential found') expect(mockCredentialsGet).not.toHaveBeenCalled() - expect(mockAuthActions.trigger).not.toHaveBeenCalled() + expect(mockUnlockWithPassword).not.toHaveBeenCalled() }) it('should throw error when biometric authentication fails', async () => { @@ -185,7 +175,7 @@ describe('useUnlockWithBiometricCredentialMutation', () => { }) expect(result.current.error?.message).toBe('Failed to create credential') - expect(mockAuthActions.trigger).not.toHaveBeenCalled() + expect(mockUnlockWithPassword).not.toHaveBeenCalled() }) it('should throw error when no user handle returned from authentication', async () => { @@ -202,7 +192,7 @@ describe('useUnlockWithBiometricCredentialMutation', () => { }) expect(result.current.error?.message).toBe('No user handle returned from biometric authentication') - expect(mockAuthActions.trigger).not.toHaveBeenCalled() + expect(mockUnlockWithPassword).not.toHaveBeenCalled() }) it('should throw error when password decryption fails', async () => { @@ -226,7 +216,7 @@ describe('useUnlockWithBiometricCredentialMutation', () => { }) expect(result.current.error?.message).toBe('Failed to decrypt password') - expect(mockAuthActions.trigger).not.toHaveBeenCalled() + expect(mockUnlockWithPassword).not.toHaveBeenCalled() }) it('should handle WebAuthn API errors', async () => { @@ -242,7 +232,7 @@ describe('useUnlockWithBiometricCredentialMutation', () => { }) expect(result.current.error).toBe(webAuthnError) - expect(mockAuthActions.trigger).not.toHaveBeenCalled() + expect(mockUnlockWithPassword).not.toHaveBeenCalled() }) it('should handle storage retrieval errors', async () => { @@ -259,7 +249,7 @@ describe('useUnlockWithBiometricCredentialMutation', () => { expect(result.current.error).toBe(storageError) expect(mockCredentialsGet).not.toHaveBeenCalled() - expect(mockAuthActions.trigger).not.toHaveBeenCalled() + expect(mockUnlockWithPassword).not.toHaveBeenCalled() }) }) diff --git a/apps/extension/src/app/features/biometricUnlock/useUnlockWithBiometricCredentialMutation.ts b/apps/extension/src/app/features/biometricUnlock/useUnlockWithBiometricCredentialMutation.ts index 4eac011d28f..b37d3357cb1 100644 --- a/apps/extension/src/app/features/biometricUnlock/useUnlockWithBiometricCredentialMutation.ts +++ b/apps/extension/src/app/features/biometricUnlock/useUnlockWithBiometricCredentialMutation.ts @@ -58,10 +58,10 @@ async function getPasswordFromBiometricCredential(abortSignal: AbortSignal): Pro throw new Error('No biometric unlock credential found') } - const { credentialId } = biometricUnlockCredential + const { credentialId, transports } = biometricUnlockCredential // Authenticate with WebAuthn using the stored credential and decrypt password - const { encryptionKey } = await authenticateWithBiometricCredential({ credentialId, abortSignal }) + const { encryptionKey } = await authenticateWithBiometricCredential({ credentialId, transports, abortSignal }) const password = await decryptPasswordFromBiometricData({ encryptionKey, biometricUnlockCredential }) return password } diff --git a/apps/extension/src/app/features/home/TokenBalanceList.tsx b/apps/extension/src/app/features/home/TokenBalanceList.tsx index b29a53a4a2c..ebbed006847 100644 --- a/apps/extension/src/app/features/home/TokenBalanceList.tsx +++ b/apps/extension/src/app/features/home/TokenBalanceList.tsx @@ -1,9 +1,13 @@ -import { memo } from 'react' +import { Currency } from '@uniswap/sdk-core' +import { memo, useState } from 'react' import { useInterfaceBuyNavigator } from 'src/app/features/for/utils' import { AppRoutes } from 'src/app/navigation/constants' import { navigate } from 'src/app/navigation/state' import { TokenBalanceListWeb } from 'uniswap/src/components/portfolio/TokenBalanceListWeb' +import { ReportTokenIssueModal } from 'uniswap/src/components/reporting/ReportTokenIssueModal' import { ElementName } from 'uniswap/src/features/telemetry/constants' +import { useEvent } from 'utilities/src/react/hooks' +import { useBooleanState } from 'utilities/src/react/useBooleanState' import { usePortfolioEmptyStateBackground } from 'wallet/src/components/portfolio/empty' export const ExtensionTokenBalanceList = memo(function _ExtensionTokenBalanceList({ @@ -15,13 +19,35 @@ export const ExtensionTokenBalanceList = memo(function _ExtensionTokenBalanceLis navigate(`/${AppRoutes.Receive}`) } const onPressBuy = useInterfaceBuyNavigator(ElementName.EmptyStateBuy) + + const { value: isReportTokenModalOpen, setTrue: openModal, setFalse: closeReportTokenModal } = useBooleanState(false) + const [reportTokenCurrency, setReportTokenCurrency] = useState(undefined) + const [isMarkedSpam, setIsMarkedSpam] = useState>(undefined) + + const openReportTokenModal = useEvent((currency: Currency, isMarkedSpam: Maybe) => { + setReportTokenCurrency(currency) + setIsMarkedSpam(isMarkedSpam) + openModal() + }) + const backgroundImageWrapperCallback = usePortfolioEmptyStateBackground() return ( - + <> + + {reportTokenCurrency && ( + + )} + ) }) diff --git a/apps/extension/src/app/features/settings/DeviceAccessScreen.tsx b/apps/extension/src/app/features/settings/DeviceAccessScreen.tsx index c9b6d70c21b..c739b0cbe06 100644 --- a/apps/extension/src/app/features/settings/DeviceAccessScreen.tsx +++ b/apps/extension/src/app/features/settings/DeviceAccessScreen.tsx @@ -48,6 +48,7 @@ export function DeviceAccessScreen(): JSX.Element { const { flowState, + oldPassword, startPasswordReset, closeModal, onPasswordModalNext, @@ -98,6 +99,7 @@ export function DeviceAccessScreen(): JSX.Element { return ( closeModal(PasswordResetFlowState.EnterNewPassword)} /> diff --git a/apps/extension/src/app/features/settings/SettingsScreen.tsx b/apps/extension/src/app/features/settings/SettingsScreen.tsx index ed9a068a3c1..48d2ca462ba 100644 --- a/apps/extension/src/app/features/settings/SettingsScreen.tsx +++ b/apps/extension/src/app/features/settings/SettingsScreen.tsx @@ -227,7 +227,7 @@ export function SettingsScreen(): JSX.Element { /> setIsPortfolioBalanceModalOpen(true)} /> {isSmartWalletEnabled ? ( diff --git a/apps/extension/src/app/features/settings/password/ChangePasswordForm.test.tsx b/apps/extension/src/app/features/settings/password/ChangePasswordForm.test.tsx new file mode 100644 index 00000000000..f4721fb4899 --- /dev/null +++ b/apps/extension/src/app/features/settings/password/ChangePasswordForm.test.tsx @@ -0,0 +1,166 @@ +import { act, fireEvent, waitFor } from '@testing-library/react' +import { ChangePasswordForm } from 'src/app/features/settings/password/ChangePasswordForm' +import { cleanup, render, screen } from 'src/test/test-utils' +import { Keyring } from 'wallet/src/features/wallet/Keyring/Keyring' + +// Mock the Keyring +jest.mock('wallet/src/features/wallet/Keyring/Keyring', () => ({ + Keyring: { + changePassword: jest.fn().mockResolvedValue(undefined), + }, +})) + +// Mock analytics +jest.mock('uniswap/src/features/telemetry/send', () => ({ + sendAnalyticsEvent: jest.fn(), +})) + +const mockChangePassword = Keyring.changePassword as jest.MockedFunction + +describe('ChangePasswordForm', () => { + const mockOnNext = jest.fn() + const oldPassword = 'MyOldPassword123!' + + beforeEach(() => { + jest.clearAllMocks() + mockChangePassword.mockClear() + }) + + afterEach(() => { + cleanup() + }) + + it('renders without error', () => { + const tree = render() + expect(tree).toMatchSnapshot() + }) + + it('renders password input fields', () => { + render() + + // Check for translated placeholders + expect(screen.getByPlaceholderText('New password')).toBeDefined() + expect(screen.getByPlaceholderText('Confirm password')).toBeDefined() + }) + + it('renders continue button', () => { + render() + + expect(screen.getByText('Continue')).toBeDefined() + }) + + it('shows error when new password matches old password', async () => { + render() + + const newPasswordInput = screen.getByPlaceholderText('New password') + const confirmPasswordInput = screen.getByPlaceholderText('Confirm password') + + // Type the same password as the old password + act(() => { + fireEvent.change(newPasswordInput, { target: { value: oldPassword } }) + fireEvent.change(confirmPasswordInput, { target: { value: oldPassword } }) + }) + + // Wait for error to appear + await waitFor(() => { + const errorText = screen.getByText('New password must be different from current password') + expect(errorText).toBeDefined() + }) + }) + + it('clears error when password changes to be different', async () => { + render() + + const newPasswordInput = screen.getByPlaceholderText('New password') + const confirmPasswordInput = screen.getByPlaceholderText('Confirm password') + + // First, type the same password as old password + act(() => { + fireEvent.change(newPasswordInput, { target: { value: oldPassword } }) + fireEvent.change(confirmPasswordInput, { target: { value: oldPassword } }) + }) + + // Wait for error to appear + await waitFor(() => { + expect(screen.getByText('New password must be different from current password')).toBeDefined() + }) + + // Clear and type a different password + act(() => { + fireEvent.change(newPasswordInput, { target: { value: 'DifferentPassword789!' } }) + fireEvent.change(confirmPasswordInput, { target: { value: 'DifferentPassword789!' } }) + }) + + // Error should be cleared + await waitFor(() => { + expect(screen.queryByText('New password must be different from current password')).toBeNull() + }) + }) + + it('does not call onNext when passwords match old password', async () => { + render() + + const newPasswordInput = screen.getByPlaceholderText('New password') + const confirmPasswordInput = screen.getByPlaceholderText('Confirm password') + const submitButton = screen.getByText('Continue') + + // Type the same password as the old password + act(() => { + fireEvent.change(newPasswordInput, { target: { value: oldPassword } }) + fireEvent.change(confirmPasswordInput, { target: { value: oldPassword } }) + }) + + // Try to submit + await act(async () => { + fireEvent.click(submitButton) + }) + + expect(mockOnNext).not.toHaveBeenCalled() + expect(mockChangePassword).not.toHaveBeenCalled() + }) + + it('calls onNext and changePassword when passwords are different and valid', async () => { + render() + + const newPasswordInput = screen.getByPlaceholderText('New password') + const confirmPasswordInput = screen.getByPlaceholderText('Confirm password') + const submitButton = screen.getByText('Continue') + + const newPassword = 'MyNewStrongPassword456!' + + // Type a different password + act(() => { + fireEvent.change(newPasswordInput, { target: { value: newPassword } }) + fireEvent.change(confirmPasswordInput, { target: { value: newPassword } }) + }) + + // Submit the form + await act(async () => { + fireEvent.click(submitButton) + }) + + await waitFor(() => { + expect(mockChangePassword).toHaveBeenCalledWith(newPassword) + expect(mockOnNext).toHaveBeenCalledWith(newPassword) + }) + }) + + it('handles undefined oldPassword gracefully', async () => { + render() + + const newPasswordInput = screen.getByPlaceholderText('New password') + const confirmPasswordInput = screen.getByPlaceholderText('Confirm password') + + const newPassword = 'AnyPassword123!' + + // Type any password - should not show "same password" error since oldPassword is undefined + act(() => { + fireEvent.change(newPasswordInput, { target: { value: newPassword } }) + fireEvent.change(confirmPasswordInput, { target: { value: newPassword } }) + }) + + await waitFor(() => { + expect(screen.queryByText('New password must be different from current password')).toBeNull() + }) + }) +}) diff --git a/apps/extension/src/app/features/settings/password/ChangePasswordForm.tsx b/apps/extension/src/app/features/settings/password/ChangePasswordForm.tsx index c03b41a1cac..d82b56ba129 100644 --- a/apps/extension/src/app/features/settings/password/ChangePasswordForm.tsx +++ b/apps/extension/src/app/features/settings/password/ChangePasswordForm.tsx @@ -1,13 +1,19 @@ -import { useCallback } from 'react' +import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { PADDING_STRENGTH_INDICATOR, PasswordInput } from 'src/app/components/PasswordInput' import { Button, Flex, Text } from 'ui/src' import { ExtensionEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { Keyring } from 'wallet/src/features/wallet/Keyring/Keyring' -import { usePasswordForm } from 'wallet/src/utils/password' +import { PasswordErrors, usePasswordForm } from 'wallet/src/utils/password' -export function ChangePasswordForm({ onNext }: { onNext: (password: string) => void }): JSX.Element { +export function ChangePasswordForm({ + oldPassword, + onNext, +}: { + oldPassword: string | undefined + onNext: (password: string) => void +}): JSX.Element { const { t } = useTranslation() const { @@ -20,18 +26,45 @@ export function ChangePasswordForm({ onNext }: { onNext: (password: string) => v confirmPassword, onChangeConfirmPassword, setHideInput, - errorText, + errorText: baseErrorText, checkSubmit, } = usePasswordForm() + const [customError, setCustomError] = useState(undefined) + + // Check if new password is same as old password + const isSamePassword = useMemo( + () => Boolean(password && oldPassword && password === oldPassword), + [password, oldPassword], + ) + + // Update custom error when password matches old password + useEffect(() => { + setCustomError(isSamePassword ? PasswordErrors.SamePassword : undefined) + }, [isSamePassword]) + + // Override error text if custom error exists + const errorText = useMemo(() => { + if (customError === PasswordErrors.SamePassword) { + return t('common.input.password.error.same') + } + return baseErrorText + }, [customError, baseErrorText, t]) + const onSubmit = useCallback(async () => { + // Check for same password error + if (isSamePassword) { + setCustomError(PasswordErrors.SamePassword) + return + } + if (checkSubmit()) { // Just change the password and pass it to the parent await Keyring.changePassword(password) sendAnalyticsEvent(ExtensionEventName.PasswordChanged) onNext(password) } - }, [checkSubmit, password, onNext]) + }, [checkSubmit, password, onNext, isSamePassword]) return ( @@ -70,7 +103,7 @@ export function ChangePasswordForm({ onNext }: { onNext: (password: string) => v - diff --git a/apps/extension/src/app/features/settings/password/CreateNewPasswordModal.tsx b/apps/extension/src/app/features/settings/password/CreateNewPasswordModal.tsx index 65860afaa14..9411c1fa006 100644 --- a/apps/extension/src/app/features/settings/password/CreateNewPasswordModal.tsx +++ b/apps/extension/src/app/features/settings/password/CreateNewPasswordModal.tsx @@ -7,10 +7,12 @@ import { ModalName } from 'uniswap/src/features/telemetry/constants' export function CreateNewPasswordModal({ isOpen, + oldPassword, onNext, onClose, }: { isOpen: boolean + oldPassword: string | undefined onNext: (password: string) => void onClose: () => void }): JSX.Element { @@ -36,7 +38,7 @@ export function CreateNewPasswordModal({ {t('settings.setting.password.change.title')} - +
) diff --git a/apps/extension/src/app/features/settings/password/__snapshots__/ChangePasswordForm.test.tsx.snap b/apps/extension/src/app/features/settings/password/__snapshots__/ChangePasswordForm.test.tsx.snap new file mode 100644 index 00000000000..71e0ea60127 --- /dev/null +++ b/apps/extension/src/app/features/settings/password/__snapshots__/ChangePasswordForm.test.tsx.snap @@ -0,0 +1,279 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ChangePasswordForm renders without error 1`] = ` +{ + "asFragment": [Function], + "baseElement": +
+ +
+
+
+ + + +
+
+ + + +
+ + + +
+
+ +
+
+ +
+
+
+ +
+ , + "container":
+ +
+
+
+ + + +
+
+ + + +
+ + + +
+
+ +
+
+ +
+
+
+ +
, + "debug": [Function], + "findAllByAltText": [Function], + "findAllByDisplayValue": [Function], + "findAllByLabelText": [Function], + "findAllByPlaceholderText": [Function], + "findAllByRole": [Function], + "findAllByTestId": [Function], + "findAllByText": [Function], + "findAllByTitle": [Function], + "findByAltText": [Function], + "findByDisplayValue": [Function], + "findByLabelText": [Function], + "findByPlaceholderText": [Function], + "findByRole": [Function], + "findByTestId": [Function], + "findByText": [Function], + "findByTitle": [Function], + "getAllByAltText": [Function], + "getAllByDisplayValue": [Function], + "getAllByLabelText": [Function], + "getAllByPlaceholderText": [Function], + "getAllByRole": [Function], + "getAllByTestId": [Function], + "getAllByText": [Function], + "getAllByTitle": [Function], + "getByAltText": [Function], + "getByDisplayValue": [Function], + "getByLabelText": [Function], + "getByPlaceholderText": [Function], + "getByRole": [Function], + "getByTestId": [Function], + "getByText": [Function], + "getByTitle": [Function], + "queryAllByAltText": [Function], + "queryAllByDisplayValue": [Function], + "queryAllByLabelText": [Function], + "queryAllByPlaceholderText": [Function], + "queryAllByRole": [Function], + "queryAllByTestId": [Function], + "queryAllByText": [Function], + "queryAllByTitle": [Function], + "queryByAltText": [Function], + "queryByDisplayValue": [Function], + "queryByLabelText": [Function], + "queryByPlaceholderText": [Function], + "queryByRole": [Function], + "queryByTestId": [Function], + "queryByText": [Function], + "queryByTitle": [Function], + "rerender": [Function], + "store": { + "dispatch": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + Symbol(observable): [Function], + }, + "unmount": [Function], +} +`; diff --git a/apps/extension/src/app/features/settings/password/usePasswordResetFlow.test.ts b/apps/extension/src/app/features/settings/password/usePasswordResetFlow.test.ts index 9ccb4c71a73..3685be9bde1 100644 --- a/apps/extension/src/app/features/settings/password/usePasswordResetFlow.test.ts +++ b/apps/extension/src/app/features/settings/password/usePasswordResetFlow.test.ts @@ -67,6 +67,12 @@ describe('usePasswordResetFlow', () => { expect(result.current.flowState).toBe(PasswordResetFlowState.None) }) + it('should initialize with undefined oldPassword', () => { + const { result } = renderHook(() => usePasswordResetFlow()) + + expect(result.current.oldPassword).toBeUndefined() + }) + it('should transition to EnterCurrentPassword when starting password reset', () => { const { result } = renderHook(() => usePasswordResetFlow()) @@ -91,6 +97,22 @@ describe('usePasswordResetFlow', () => { expect(result.current.flowState).toBe(PasswordResetFlowState.EnterNewPassword) }) + it('should store oldPassword when valid password is provided', () => { + const { result } = renderHook(() => usePasswordResetFlow()) + const testPassword = 'myOldPassword123!' + + act(() => { + result.current.startPasswordReset() + }) + + act(() => { + result.current.onPasswordModalNext(testPassword) + }) + + expect(result.current.oldPassword).toBe(testPassword) + expect(result.current.flowState).toBe(PasswordResetFlowState.EnterNewPassword) + }) + it('should return to None state when no password is provided', () => { const { result } = renderHook(() => usePasswordResetFlow()) @@ -105,6 +127,32 @@ describe('usePasswordResetFlow', () => { expect(result.current.flowState).toBe(PasswordResetFlowState.None) }) + it('should clear oldPassword when no password is provided', () => { + const { result } = renderHook(() => usePasswordResetFlow()) + + act(() => { + result.current.startPasswordReset() + }) + + act(() => { + result.current.onPasswordModalNext('validPassword') + }) + + expect(result.current.oldPassword).toBe('validPassword') + + // Go back and provide no password + act(() => { + result.current.startPasswordReset() + }) + + act(() => { + result.current.onPasswordModalNext() + }) + + expect(result.current.oldPassword).toBeUndefined() + expect(result.current.flowState).toBe(PasswordResetFlowState.None) + }) + it('should transition to BiometricAuth when biometric is enabled', () => { mockUseHasBiometricUnlockCredential.mockReturnValue(true) const { result } = renderHook(() => usePasswordResetFlow()) @@ -160,6 +208,28 @@ describe('usePasswordResetFlow', () => { expect(result.current.flowState).toBe(PasswordResetFlowState.None) }) + it('should clear oldPassword when closeModal is called with matching state', () => { + const { result } = renderHook(() => usePasswordResetFlow()) + + act(() => { + result.current.startPasswordReset() + }) + + act(() => { + result.current.onPasswordModalNext('testPassword123') + }) + + expect(result.current.oldPassword).toBe('testPassword123') + expect(result.current.flowState).toBe(PasswordResetFlowState.EnterNewPassword) + + act(() => { + result.current.closeModal(PasswordResetFlowState.EnterNewPassword) + }) + + expect(result.current.flowState).toBe(PasswordResetFlowState.None) + expect(result.current.oldPassword).toBeUndefined() + }) + it('should not close modal when closeModal is called with non-matching state', () => { const { result } = renderHook(() => usePasswordResetFlow()) @@ -176,6 +246,29 @@ describe('usePasswordResetFlow', () => { expect(result.current.flowState).toBe(PasswordResetFlowState.EnterCurrentPassword) }) + it('should not clear oldPassword when closeModal is called with non-matching state', () => { + const { result } = renderHook(() => usePasswordResetFlow()) + + act(() => { + result.current.startPasswordReset() + }) + + act(() => { + result.current.onPasswordModalNext('testPassword456') + }) + + expect(result.current.oldPassword).toBe('testPassword456') + expect(result.current.flowState).toBe(PasswordResetFlowState.EnterNewPassword) + + act(() => { + result.current.closeModal(PasswordResetFlowState.BiometricAuth) + }) + + // Should not clear oldPassword or change state + expect(result.current.flowState).toBe(PasswordResetFlowState.EnterNewPassword) + expect(result.current.oldPassword).toBe('testPassword456') + }) + it('should transition to BiometricAuth state when biometric is enabled and trigger internal mutation', () => { mockUseHasBiometricUnlockCredential.mockReturnValue(true) const { result } = renderHook(() => usePasswordResetFlow()) diff --git a/apps/extension/src/app/features/settings/password/usePasswordResetFlow.ts b/apps/extension/src/app/features/settings/password/usePasswordResetFlow.ts index 48e02692ef5..9c2b61b4eda 100644 --- a/apps/extension/src/app/features/settings/password/usePasswordResetFlow.ts +++ b/apps/extension/src/app/features/settings/password/usePasswordResetFlow.ts @@ -54,6 +54,7 @@ export enum PasswordResetFlowState { interface PasswordResetFlowResult { // State flowState: PasswordResetFlowState + oldPassword: string | undefined // Actions startPasswordReset: () => void @@ -68,6 +69,7 @@ interface PasswordResetFlowResult { export function usePasswordResetFlow(): PasswordResetFlowResult { const dispatch = useDispatch() const [flowState, setFlowState] = useState(PasswordResetFlowState.None) + const [oldPassword, setOldPassword] = useState(undefined) const hasBiometricUnlockCredential = useHasBiometricUnlockCredential() @@ -95,15 +97,18 @@ export function usePasswordResetFlow(): PasswordResetFlowResult { // This check ensures the close action is from user interaction, not from modal state changes. if (flowState === expectedState) { setFlowState(PasswordResetFlowState.None) + setOldPassword(undefined) } }) const onPasswordModalNext = useEvent((password?: string): void => { if (!password) { setFlowState(PasswordResetFlowState.None) + setOldPassword(undefined) return } + setOldPassword(password) setFlowState(PasswordResetFlowState.EnterNewPassword) }) @@ -127,6 +132,7 @@ export function usePasswordResetFlow(): PasswordResetFlowResult { return { // State flowState, + oldPassword, // Actions startPasswordReset, diff --git a/apps/extension/src/app/saga.ts b/apps/extension/src/app/saga.ts index a5e6ddbf951..e4c17a340bd 100644 --- a/apps/extension/src/app/saga.ts +++ b/apps/extension/src/app/saga.ts @@ -28,13 +28,6 @@ import { prepareAndSignSwapSaga, prepareAndSignSwapSagaName, } from 'wallet/src/features/transactions/swap/configuredSagas' -import { swapActions, swapReducer, swapSaga, swapSagaName } from 'wallet/src/features/transactions/swap/swapSaga' -import { - tokenWrapActions, - tokenWrapReducer, - tokenWrapSaga, - tokenWrapSagaName, -} from 'wallet/src/features/transactions/swap/wrapSaga' import { watchTransactionEvents } from 'wallet/src/features/transactions/watcher/transactionFinalizationSaga' import { transactionWatcher } from 'wallet/src/features/transactions/watcher/transactionWatcherSaga' import { @@ -83,18 +76,6 @@ export const monitoredSagas: Record = { reducer: executeSwapReducer, actions: executeSwapActions, }, - [swapSagaName]: { - name: swapSagaName, - wrappedSaga: swapSaga, - reducer: swapReducer, - actions: swapActions, - }, - [tokenWrapSagaName]: { - name: tokenWrapSagaName, - wrappedSaga: tokenWrapSaga, - reducer: tokenWrapReducer, - actions: tokenWrapActions, - }, [removeDelegationSagaName]: { name: removeDelegationSagaName, wrappedSaga: removeDelegationSaga, diff --git a/apps/extension/src/background/backgroundDappRequests.ts b/apps/extension/src/background/backgroundDappRequests.ts index 968024943b1..a72af9d0126 100644 --- a/apps/extension/src/background/backgroundDappRequests.ts +++ b/apps/extension/src/background/backgroundDappRequests.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { rpcErrors, serializeError } from '@metamask/rpc-errors' import { removeDappConnection } from 'src/app/features/dapp/actions' import { changeChain } from 'src/app/features/dapp/changeChain' diff --git a/apps/extension/src/background/utils/persistedStateUtils.ts b/apps/extension/src/background/utils/persistedStateUtils.ts index 50f2b49cdc3..2b646c64565 100644 --- a/apps/extension/src/background/utils/persistedStateUtils.ts +++ b/apps/extension/src/background/utils/persistedStateUtils.ts @@ -2,6 +2,7 @@ import { isOnboardedSelector } from 'src/app/utils/isOnboardedSelector' import { STATE_STORAGE_KEY } from 'src/store/constants' import { ExtensionState } from 'src/store/extensionReducer' import { EXTENSION_STATE_VERSION } from 'src/store/migrations' +import { deviceAccessTimeoutToMinutes } from 'uniswap/src/features/settings/constants' import { logger } from 'utilities/src/logger/logger' export async function readReduxStateFromStorage(storageChanges?: { @@ -30,6 +31,11 @@ export async function readIsOnboardedFromStorage(): Promise { return state ? isOnboardedSelector(state) : false } +export async function readDeviceAccessTimeoutMinutesFromStorage(): Promise { + const state = await readReduxStateFromStorage() + return state ? deviceAccessTimeoutToMinutes(state.userSettings.deviceAccessTimeout) : undefined +} + /** * Checks if Redux migrations are pending by comparing persisted version with current version * @returns true if migrations are pending and sidebar should handle the request diff --git a/apps/extension/src/entrypoints/background.ts b/apps/extension/src/entrypoints/background.ts index f75bfd172b9..773b1b9114a 100644 --- a/apps/extension/src/entrypoints/background.ts +++ b/apps/extension/src/entrypoints/background.ts @@ -1,5 +1,6 @@ import 'symbol-observable' // Needed by `reduxed-chrome-storage` as polyfill, order matters +import { AUTO_LOCK_ALARM_NAME } from 'src/app/components/AutoLockProvider' import { initStatSigForBrowserScripts } from 'src/app/core/initStatSigForBrowserScripts' import { focusOrCreateOnboardingTab } from 'src/app/navigation/focusOrCreateOnboardingTab' import { initExtensionAnalytics } from 'src/app/utils/analytics' @@ -14,9 +15,15 @@ import { ContentScriptUtilityMessageType, } from 'src/background/messagePassing/types/requests' import { setSidePanelBehavior, setSidePanelOptions } from 'src/background/utils/chromeSidePanelUtils' -import { readIsOnboardedFromStorage } from 'src/background/utils/persistedStateUtils' +import { + readDeviceAccessTimeoutMinutesFromStorage, + readIsOnboardedFromStorage, +} from 'src/background/utils/persistedStateUtils' import { uniswapUrls } from 'uniswap/src/constants/urls' +import { ExtensionEventName } from 'uniswap/src/features/telemetry/constants' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { logger } from 'utilities/src/logger/logger' +import { Keyring } from 'wallet/src/features/wallet/Keyring/Keyring' import { defineBackground } from 'wxt/utils/define-background' async function enableSidebar(): Promise { @@ -69,6 +76,53 @@ function makeBackground(): void { await checkAndHandleOnboarding() }) + // Auto-lock alarm listener + chrome.alarms.onAlarm.addListener((alarm) => { + if (alarm.name === AUTO_LOCK_ALARM_NAME) { + Keyring.lock() + .then(() => { + sendAnalyticsEvent(ExtensionEventName.ChangeLockedState, { + locked: true, + location: 'background', + }) + }) + .catch((error) => { + logger.error(error, { + tags: { + file: 'background.ts', + function: 'alarms.onAlarm', + }, + }) + }) + } + }) + + // Listen for sidebar port disconnects to schedule auto-lock alarm + chrome.runtime.onConnect.addListener((port) => { + if (port.name === AUTO_LOCK_ALARM_NAME) { + port.onDisconnect.addListener(async () => { + try { + // Get timeout setting from Redux state + const delayInMinutes = await readDeviceAccessTimeoutMinutesFromStorage() + if (delayInMinutes === undefined) { + return + } + + // Schedule alarm + chrome.alarms.create(AUTO_LOCK_ALARM_NAME, { delayInMinutes }) + logger.debug('background', 'port.onDisconnect', `Scheduled auto-lock alarm for ${delayInMinutes} minutes`) + } catch (error) { + logger.error(error, { + tags: { + file: 'background.ts', + function: 'port.onDisconnect', + }, + }) + } + }) + } + }) + // on arc browser, show unsupported browser page (lives on onboarding flow) // this is because arc doesn't support the sidebar contentScriptUtilityMessageChannel.addMessageListener( diff --git a/apps/extension/src/manifest.json b/apps/extension/src/manifest.json index 4b599a3f4bd..c2d1319446d 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.61.0", + "version": "1.62.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 f78dd2d2f16..e257005881e 100644 --- a/apps/extension/src/store/migrations.test.ts +++ b/apps/extension/src/store/migrations.test.ts @@ -36,6 +36,7 @@ import { v24Schema, v25Schema, v26Schema, + v27Schema, } from 'src/store/schema' import { initialUniswapBehaviorHistoryState } from 'uniswap/src/features/behaviorHistory/slice' import { UniverseChainId } from 'uniswap/src/features/chains/types' @@ -48,7 +49,11 @@ import { initialTokensState } from 'uniswap/src/features/tokens/slice/slice' import { initialTransactionsState } from 'uniswap/src/features/transactions/slice' import { TransactionStatus, TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails' import { initialVisibilityState } from 'uniswap/src/features/visibility/slice' -import { testMigrateSearchHistory, testRemoveTHBFromCurrency } from 'uniswap/src/state/uniswapMigrationTests' +import { + testAddActivityVisibility, + testMigrateSearchHistory, + testRemoveTHBFromCurrency, +} from 'uniswap/src/state/uniswapMigrationTests' import { getAllKeysOfNestedObject } from 'utilities/src/primitives/objects' import { initialAppearanceSettingsState } from 'wallet/src/features/appearance/slice' import { initialBatchedTransactionsState } from 'wallet/src/features/batchedTransactions/slice' @@ -347,4 +352,8 @@ describe('Redux state migrations', () => { it('migrates from v26 to v27', () => { testMigrateSearchHistory(migrations[27], v26Schema) }) + + it('migrates from v27 to v29', () => { + testAddActivityVisibility(migrations[29], v27Schema) + }) }) diff --git a/apps/extension/src/store/migrations.ts b/apps/extension/src/store/migrations.ts index e9534188698..189147fee8a 100644 --- a/apps/extension/src/store/migrations.ts +++ b/apps/extension/src/store/migrations.ts @@ -7,6 +7,7 @@ import { removeDappInfoToChromeLocalStorage, } from 'src/store/extensionMigrations' import { + addActivityVisibility, addDismissedBridgedAndCompatibleWarnings, migrateSearchHistory, removeThaiBahtFromFiatCurrency, @@ -67,6 +68,7 @@ export const migrations = { 26: migrateLiquidityTransactionInfo, 27: migrateSearchHistory, 28: addDismissedBridgedAndCompatibleWarnings, + 29: addActivityVisibility, } -export const EXTENSION_STATE_VERSION = 28 +export const EXTENSION_STATE_VERSION = 29 diff --git a/apps/extension/src/store/schema.ts b/apps/extension/src/store/schema.ts index 0fd7dc87697..3238da4aa9f 100644 --- a/apps/extension/src/store/schema.ts +++ b/apps/extension/src/store/schema.ts @@ -276,6 +276,8 @@ export const v25Schema = { ...v24Schema } export const v26Schema = { ...v25Schema } -const v27Schema = { ...v26Schema } +export const v27Schema = { ...v26Schema } -export const getSchema = (): typeof v27Schema => v27Schema +const v29Schema = { ...v27Schema, visibility: { ...v27Schema.visibility, activity: {} } } + +export const getSchema = (): typeof v29Schema => v29Schema diff --git a/apps/extension/tsconfig.json b/apps/extension/tsconfig.json index 831ce04a0d1..72cc9db7534 100644 --- a/apps/extension/tsconfig.json +++ b/apps/extension/tsconfig.json @@ -18,10 +18,13 @@ "path": "../../packages/ui" }, { - "path": "../../packages/api" + "path": "../../packages/sessions" }, { "path": "../../packages/gating" + }, + { + "path": "../../packages/api" } ], "compilerOptions": { diff --git a/apps/extension/wxt.config.ts b/apps/extension/wxt.config.ts index 37e4fc458e7..ec88b1603c4 100644 --- a/apps/extension/wxt.config.ts +++ b/apps/extension/wxt.config.ts @@ -16,7 +16,7 @@ const icons = { const BASE_NAME = 'Uniswap Extension' const BASE_DESCRIPTION = "The Uniswap Extension is a self-custody crypto wallet that's built for swapping." -const BASE_VERSION = '1.61.0' +const BASE_VERSION = '1.62.0' const BUILD_NUM = parseInt(process.env.BUILD_NUM || '0') const EXTENSION_VERSION = `${BASE_VERSION}.${BUILD_NUM}` diff --git a/apps/mobile/.eslintrc.js b/apps/mobile/.eslintrc.js index 8a2ee3a2cee..26a62d9f007 100644 --- a/apps/mobile/.eslintrc.js +++ b/apps/mobile/.eslintrc.js @@ -58,13 +58,6 @@ module.exports = { 'import/no-unused-modules': 'off', }, }, - { - // Allow test files to exceed max-lines limit - files: ['**/*.test.ts', '**/*.test.tsx', '**/__tests__/**/*.[jt]s?(x)', '**/?(*.)+(spec|test).[tj]s?(x)'], - rules: { - 'max-lines': 'off', - }, - }, ], rules: { 'rulesdir/i18n': 'error', diff --git a/apps/mobile/android/app/build.gradle b/apps/mobile/android/app/build.gradle index cf470808dde..7d7adf356ea 100644 --- a/apps/mobile/android/app/build.gradle +++ b/apps/mobile/android/app/build.gradle @@ -72,9 +72,9 @@ if (isCI && datadogPropertiesAvailable) { apply from: "../../../../node_modules/@datadog/mobile-react-native/datadog-sourcemaps.gradle" } -def devVersionName = "1.61" -def betaVersionName = "1.61" -def prodVersionName = "1.61" +def devVersionName = "1.62" +def betaVersionName = "1.62" +def prodVersionName = "1.62" android { ndkVersion rootProject.ext.ndkVersion diff --git a/apps/mobile/android/app/src/main/AndroidManifest.xml b/apps/mobile/android/app/src/main/AndroidManifest.xml index 66bdd248726..d790d48341a 100644 --- a/apps/mobile/android/app/src/main/AndroidManifest.xml +++ b/apps/mobile/android/app/src/main/AndroidManifest.xml @@ -31,6 +31,10 @@ android:name="com.onesignal.NotificationAccentColor.DEFAULT" android:value="@string/notification_accent_color" /> + + 0 + + companion object { + const val MODULE_NAME = "SilentPushEventEmitter" + private const val EVENT_NAME = "SilentPushReceived" + private const val TAG = "SilentPushEmitter" + private val pendingPayloads = mutableListOf() + + @Volatile + private var instance: SilentPushEventEmitterModule? = null + + @Volatile + private var listenerCount: Int = 0 + + fun emitEvent(payload: JSONObject?) { + val eventPayload = payload?.let { JSONObject(it.toString()) } ?: JSONObject() + val currentInstance = instance + + if (currentInstance != null && currentInstance.hasListeners()) { + Log.d(TAG, "Sending silent push event to JS immediately: $eventPayload") + currentInstance.sendEvent(eventPayload) + return + } + + synchronized(pendingPayloads) { + Log.d(TAG, "Queueing silent push payload until listeners attach: $eventPayload") + pendingPayloads.add(eventPayload) + } + } + } +} diff --git a/apps/mobile/android/app/src/main/java/com/uniswap/notifications/SilentPushNotificationServiceExtension.kt b/apps/mobile/android/app/src/main/java/com/uniswap/notifications/SilentPushNotificationServiceExtension.kt new file mode 100644 index 00000000000..90321dc944d --- /dev/null +++ b/apps/mobile/android/app/src/main/java/com/uniswap/notifications/SilentPushNotificationServiceExtension.kt @@ -0,0 +1,123 @@ +package com.uniswap.notifications + +import android.util.Log +import androidx.annotation.Keep +import com.onesignal.notifications.INotification +import com.onesignal.notifications.INotificationReceivedEvent +import com.onesignal.notifications.INotificationServiceExtension +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.json.JSONException +import org.json.JSONObject + +@Keep +class SilentPushNotificationServiceExtension : INotificationServiceExtension { + override fun onNotificationReceived(event: INotificationReceivedEvent) { + val notification = event.notification + val payload = buildPayload(notification) + + val hasContentAvailableFlag = hasContentAvailable(payload) + val isMissingVisibleContent = notification.isMissingVisibleContent() + + Log.d( + TAG, + "Notification received. hasContentAvailable=$hasContentAvailableFlag, " + + "missingVisibleContent=$isMissingVisibleContent, payload=$payload", + ) + + if (!hasContentAvailableFlag && !isMissingVisibleContent) { + return + } + + Log.d(TAG, "Emitting silent push event: $payload") + val payloadForEmission = try { + JSONObject(payload.toString()) + } catch (error: JSONException) { + Log.w(TAG, "Failed to clone payload for emission: ${error.message}") + payload + } + + CoroutineScope(Dispatchers.Default).launch { + withContext(Dispatchers.Main) { + SilentPushEventEmitterModule.emitEvent(payloadForEmission) + } + } + + if (isMissingVisibleContent) { + event.preventDefault() + } + } + + private fun INotification.isMissingVisibleContent(): Boolean { + val title: String? = this.title + val body: String? = this.body + return title.isNullOrBlank() && body.isNullOrBlank() + } + + private fun buildPayload(notification: INotification): JSONObject { + val rawPayload = notification.rawPayload + val payload = try { + if (rawPayload.isNullOrBlank()) JSONObject() else JSONObject(rawPayload) + } catch (error: JSONException) { + Log.w(TAG, "Failed parsing raw payload: ${error.message}") + JSONObject() + } + + notification.additionalData?.let { additionalData -> + try { + payload.put("additionalData", additionalData) + } catch (error: JSONException) { + Log.w(TAG, "Failed to append additional data: ${error.message}") + } + } + + return payload + } + + private fun hasContentAvailable(payload: JSONObject?): Boolean { + if (payload == null) { + return false + } + + if (payload.hasContentAvailableFlag()) { + return true + } + + val aps = payload.optJSONObject("aps") + if (aps != null && aps.hasContentAvailableFlag()) { + return true + } + + val additionalData = payload.optJSONObject("additionalData") + if (additionalData != null && additionalData.hasContentAvailableFlag()) { + return true + } + + return false + } + + private fun JSONObject.hasContentAvailableFlag(): Boolean { + return opt(CONTENT_AVAILABLE_UNDERSCORE).isTruthy() || opt(CONTENT_AVAILABLE_HYPHEN).isTruthy() + } + + private fun Any?.isTruthy(): Boolean { + return when (this) { + null, JSONObject.NULL -> false + is Boolean -> this + is Int -> this == 1 + is Long -> this == 1L + is Double -> this == 1.0 + is Float -> this == 1f + is String -> equals("1", ignoreCase = true) || equals("true", ignoreCase = true) + else -> false + } + } + + companion object { + private const val TAG = "SilentPushExt" + private const val CONTENT_AVAILABLE_UNDERSCORE = "content_available" + private const val CONTENT_AVAILABLE_HYPHEN = "content-available" + } +} diff --git a/apps/mobile/android/app/src/main/java/com/uniswap/utils/JsonWritableExtensions.kt b/apps/mobile/android/app/src/main/java/com/uniswap/utils/JsonWritableExtensions.kt new file mode 100644 index 00000000000..81415055e6d --- /dev/null +++ b/apps/mobile/android/app/src/main/java/com/uniswap/utils/JsonWritableExtensions.kt @@ -0,0 +1,61 @@ +package com.uniswap.utils + +import com.facebook.react.bridge.Arguments +import com.facebook.react.bridge.WritableArray +import com.facebook.react.bridge.WritableMap +import org.json.JSONArray +import org.json.JSONObject + +fun JSONObject.toWritableMap(): WritableMap { + val map = Arguments.createMap() + val iterator = keys() + while (iterator.hasNext()) { + val key = iterator.next() + when (val value = opt(key)) { + null, JSONObject.NULL -> map.putNull(key) + is JSONObject -> map.putMap(key, value.toWritableMap()) + is JSONArray -> map.putArray(key, value.toWritableArray()) + is Boolean -> map.putBoolean(key, value) + is Int -> map.putInt(key, value) + is Long -> { + if (value in Int.MIN_VALUE..Int.MAX_VALUE) { + map.putInt(key, value.toInt()) + } else { + map.putDouble(key, value.toDouble()) + } + } + is Double -> map.putDouble(key, value) + is Float -> map.putDouble(key, value.toDouble()) + is Number -> map.putDouble(key, value.toDouble()) + is String -> map.putString(key, value) + else -> map.putString(key, value.toString()) + } + } + return map +} + +fun JSONArray.toWritableArray(): WritableArray { + val array = Arguments.createArray() + for (index in 0 until length()) { + when (val value = opt(index)) { + null, JSONObject.NULL -> array.pushNull() + is JSONObject -> array.pushMap(value.toWritableMap()) + is JSONArray -> array.pushArray(value.toWritableArray()) + is Boolean -> array.pushBoolean(value) + is Int -> array.pushInt(value) + is Long -> { + if (value in Int.MIN_VALUE..Int.MAX_VALUE) { + array.pushInt(value.toInt()) + } else { + array.pushDouble(value.toDouble()) + } + } + is Double -> array.pushDouble(value) + is Float -> array.pushDouble(value.toDouble()) + is Number -> array.pushDouble(value.toDouble()) + is String -> array.pushString(value) + else -> array.pushString(value.toString()) + } + } + return array +} diff --git a/apps/mobile/ios/Uniswap.xcodeproj/project.pbxproj b/apps/mobile/ios/Uniswap.xcodeproj/project.pbxproj index 6cdc18319f2..8e43796dc97 100644 --- a/apps/mobile/ios/Uniswap.xcodeproj/project.pbxproj +++ b/apps/mobile/ios/Uniswap.xcodeproj/project.pbxproj @@ -10,13 +10,14 @@ 0013F5F72C93399400D6EF09 /* ProtectionInfo.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0013F5F62C93399400D6EF09 /* ProtectionInfo.graphql.swift */; }; 00265F792C933CE300A5DA57 /* ProtectionResult.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00265F772C933CE300A5DA57 /* ProtectionResult.graphql.swift */; }; 00265F7A2C933CE300A5DA57 /* ProtectionAttackType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00265F782C933CE300A5DA57 /* ProtectionAttackType.graphql.swift */; }; - 0094F4FBBC1C0A2FFABF7157 /* TokenProject.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4981A14906A35E8A0B7F9457 /* TokenProject.graphql.swift */; }; 00E356F31AD99517003FC87E /* UniswapTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* UniswapTests.m */; }; - 03291E0DA448AF438F97EA5D /* DescriptionTranslations.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E1F288B7EDDE906C4C00C46 /* DescriptionTranslations.graphql.swift */; }; + 02B7B534DFEC9DA0F7F06B8D /* TokenBalanceQuantityParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B0A1F5F6FC3E1141E228B7D /* TokenBalanceQuantityParts.graphql.swift */; }; 037C5AAA2C04970B00B1D808 /* CopyIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 037C5AA92C04970B00B1D808 /* CopyIcon.swift */; }; + 03AE019583139330A3E408AB /* SwapOrderDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53F4E5E9341BE66984935185 /* SwapOrderDetails.graphql.swift */; }; 03C788232C10E7390011E5DC /* ActionButtons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03C788222C10E7390011E5DC /* ActionButtons.swift */; }; 03D2F3182C218D390030D987 /* RelativeOffsetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03D2F3172C218D380030D987 /* RelativeOffsetView.swift */; }; - 03E3515E38E247F459218CAA /* SwapOrderDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = C955CE2592785712A11892DE /* SwapOrderDetails.graphql.swift */; }; + 03EEEDA1A3D5EF23C0D14B08 /* OnRampTransactionDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87CF9B03AE29A19C5B0F4E35 /* OnRampTransactionDetails.graphql.swift */; }; + 06C9F16E22B8B64855980A69 /* TokenMarketParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55081ADF188C967FC1ECD289 /* TokenMarketParts.graphql.swift */; }; 0703EE032A5734A600AED1DA /* UserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0703EE022A5734A600AED1DA /* UserDefaults.swift */; }; 0703EE052A57351800AED1DA /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 072F6C372A44BECC00DA720A /* Logging.swift */; }; 072E238E2A44D5BD006AD6C9 /* WidgetsCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 072E23862A44D5BC006AD6C9 /* WidgetsCore.framework */; }; @@ -109,6 +110,7 @@ 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 */; }; + 0764D0BF05C44615BDD9AD65 /* NftBalanceAssetInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 696F6C5220D0072E380E198F /* NftBalanceAssetInput.graphql.swift */; }; 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 */; }; @@ -123,10 +125,10 @@ 07F136422A5763480067004F /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F136412A5763480067004F /* Network.swift */; }; 07F5CF712A6AD97D00C648A5 /* Chart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F5CF702A6AD97D00C648A5 /* Chart.swift */; }; 07F5CF752A7020FD00C648A5 /* Format.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F5CF742A7020FD00C648A5 /* Format.swift */; }; - 09E8C497051C37FE604FD40E /* OnRampTransactionsAuth.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 315B8A905FA2C60C053F138B /* OnRampTransactionsAuth.graphql.swift */; }; - 09F9DEB33392F3051BEA8D52 /* TokenFeeDataParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 018603D0FA4D05DBF16F1441 /* TokenFeeDataParts.graphql.swift */; }; - 0C6FC49E0FC9BCB2DF5B627E /* TokenSortableField.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32012AC135EBD991C8F02F92 /* TokenSortableField.graphql.swift */; }; - 0CEBEB8BE3AB95C3F584F6CE /* Image.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31ED613D63FE9C56D9270517 /* Image.graphql.swift */; }; + 092E5F0FE7DE6113285AF5E3 /* NftsTabQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA3BCD49511DE84892B34ED0 /* NftsTabQuery.graphql.swift */; }; + 0AC6A2E1C5837AAD902742DA /* TokenBalanceMainParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD452B34344D670BA23EA331 /* TokenBalanceMainParts.graphql.swift */; }; + 0AD9B4E176D2E9FE86E6ED21 /* AssetActivity.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C66C49AF2B78703FCE4C7C /* AssetActivity.graphql.swift */; }; + 0D87DBFD19D5A6DF176C0AB7 /* MobileSchema.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87442A651C068E552BEA89C6 /* MobileSchema.graphql.swift */; }; 0DB282262CDADB260014CF77 /* EmbeddedWallet.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DB282242CDADB260014CF77 /* EmbeddedWallet.m */; }; 0DB282272CDADB260014CF77 /* EmbeddedWallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DB282252CDADB260014CF77 /* EmbeddedWallet.swift */; }; 0DC6ADF02B1E2C100092909C /* PortfolioValueModifier.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DC6ADEF2B1E2C0F0092909C /* PortfolioValueModifier.graphql.swift */; }; @@ -134,61 +136,57 @@ 0DE251472C13B69D005F47F9 /* OnRampTransfer.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DE251442C13B69D005F47F9 /* OnRampTransfer.graphql.swift */; }; 0DE251482C13B69D005F47F9 /* OnRampServiceProvider.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DE251452C13B69D005F47F9 /* OnRampServiceProvider.graphql.swift */; }; 0DE251492C13B69D005F47F9 /* OnRampTransactionDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DE251462C13B69D005F47F9 /* OnRampTransactionDetails.graphql.swift */; }; - 0F282C26344F1AE3622232B0 /* OffRampTransactionDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 396B6AB3BB41898B56EB3828 /* OffRampTransactionDetails.graphql.swift */; }; - 126CC4BC99F3F15CC1E2F1C3 /* NftAssetTrait.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70851E3D1A4B296A1CE22A20 /* NftAssetTrait.graphql.swift */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 143C638C2CCAC689371BFC93 /* NftActivityType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D95FE36D2667E070345CDD0 /* NftActivityType.graphql.swift */; }; 1440B371A1C9A42F3E91DAAE /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF5F26A06553EFDD4D99214 /* ExpoModulesProvider.swift */; }; - 171DD1C966C7FBF9DD68CFAC /* TopTokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04E5C2900254E7BA7F10CE51 /* TopTokensQuery.graphql.swift */; }; - 1B59968CF49C45B127E9C768 /* NftOrder.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E3A78386B3B779B688021FF /* NftOrder.graphql.swift */; }; - 1BC3A49161EB906542F8E23B /* ProtectionAttackType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40E034582FBD2C374CEF808E /* ProtectionAttackType.graphql.swift */; }; - 1C3559D557BC09C709104802 /* NftsTabQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 730CA356D6E1D498CC0C1472 /* NftsTabQuery.graphql.swift */; }; - 1CE49305114BF4792290DDC6 /* AmountChange.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = E63EA0C75D8011BCC182492C /* AmountChange.graphql.swift */; }; - 1DC34AE3E11264475E8B9F62 /* NftApproval.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E32BBB65A6DD9CFF608C8E8 /* NftApproval.graphql.swift */; }; - 1E2AF2C38C8FBEB2A95B644E /* OffRampTransfer.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D5E6A07F404974045BD525 /* OffRampTransfer.graphql.swift */; }; - 252BD40CB9B46FE47B2440B1 /* NftCollection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63ACFF2A1D5AE3498731AC69 /* NftCollection.graphql.swift */; }; - 257C7A9F2C4AC3C99C6B7348 /* TransactionHistoryUpdaterQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF3D7A923E5E1FB504E1F64D /* TransactionHistoryUpdaterQuery.graphql.swift */; }; - 2B12DFE797E2CBF314565D81 /* TokenProtectionInfoParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BB4A40E30E1D985519DB3CF /* TokenProtectionInfoParts.graphql.swift */; }; - 2B422D705C68BB51FBDA9895 /* NFTItemScreenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 207F4DF7664454C31DE069F8 /* NFTItemScreenQuery.graphql.swift */; }; - 2E05037B51AF526A47701B09 /* TransactionDirection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC2FBE9F353D3753FB94B8BF /* TransactionDirection.graphql.swift */; }; - 302E24504C4FCE674CF95984 /* TokenParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F596250F55A3D6E9E1F499 /* TokenParts.graphql.swift */; }; - 30872BFB39EEC66944E3EFD7 /* MobileSchema.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4E0C448C5D45BF1071FA458 /* MobileSchema.graphql.swift */; }; - 31661D70B58410EA030E2C53 /* TimestampedAmount.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0DB67D6C438F623976727E9 /* TimestampedAmount.graphql.swift */; }; - 326CFFDBB89D95FA4CB95EBB /* HistoryDuration.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BF42F88002431BFDC9FCA9F /* HistoryDuration.graphql.swift */; }; - 3361FE5837059AEF4AA877BE /* TransactionListQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 224CA82F1871016F4173F69E /* TransactionListQuery.graphql.swift */; }; - 33928A7366AFE7F892CDC89F /* NftBalanceConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FC7B80EC0E0D2134B67575B /* NftBalanceConnection.graphql.swift */; }; - 35B8176433A98BA798BBEE79 /* PageInfo.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = E475EBABF7EA310435E2F19C /* PageInfo.graphql.swift */; }; - 36E601F269D40A67FC353947 /* AssetChange.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39F60B2B54796DC978765C99 /* AssetChange.graphql.swift */; }; - 3E338E14E33C721DAB708664 /* NftActivityFilterInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43E2ECCEFBC3BE8D13BE6CAB /* NftActivityFilterInput.graphql.swift */; }; - 3FE25F715DFFD1D03DCDA57D /* NftContract.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18B9EB43501127BE1B14F1A5 /* NftContract.graphql.swift */; }; + 147F4DFD43CE86324A066003 /* FeedTransactionListQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EFADDBB38BB9261933C1349 /* FeedTransactionListQuery.graphql.swift */; }; + 15193A0A3CE80FF72AAB54B4 /* SafetyLevel.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22F8093091A9E5FC0D6284BA /* SafetyLevel.graphql.swift */; }; + 15A72E27235628C56431EC98 /* FeeData.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEE1CB436B299B0349BA9957 /* FeeData.graphql.swift */; }; + 15F6E43DA2BD9A8A681EC70C /* TokenTransfer.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BEBBC668E69EE3A1FC6AB05 /* TokenTransfer.graphql.swift */; }; + 16506815CDEE17670D3DD363 /* TimestampedAmount.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31CBA4397C44A04E218AEF28 /* TimestampedAmount.graphql.swift */; }; + 19BC2371F6BE6CAD5218AA53 /* NftActivityConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBE0699A65BEEEE6E9A6B03F /* NftActivityConnection.graphql.swift */; }; + 1C84E14C7F52CF6C9A6D2930 /* TokenProjectDescriptionQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1276D33B06E840B8E6839F39 /* TokenProjectDescriptionQuery.graphql.swift */; }; + 1CA252C75CD5291E2A0B308B /* NftCollection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25620D6E0E297C56198F190 /* NftCollection.graphql.swift */; }; + 206E0025B8FCE0EA96AC744A /* NftCollectionScreenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA3BFDC64C5E0A058877A348 /* NftCollectionScreenQuery.graphql.swift */; }; + 23B195B262495EABE4A6CDF4 /* HistoryDuration.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1053483279043EED7612BE90 /* HistoryDuration.graphql.swift */; }; + 24B4011ADC672F470EC515AC /* BridgedWithdrawalInfo.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAC62CDEEBE5712219A457C7 /* BridgedWithdrawalInfo.graphql.swift */; }; + 252A28057D1D481D14D2F5E5 /* TransactionDirection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D494D944670E557175A694 /* TransactionDirection.graphql.swift */; }; + 2925C6E0262B95C5EA0C2AE7 /* TransactionDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55240C84512D3851C8B9F027 /* TransactionDetails.graphql.swift */; }; + 2B2738BAB9E906B561E0D4D6 /* TokenParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB76D1207400E308430A837F /* TokenParts.graphql.swift */; }; + 2C9935142A9582467B5B5FC5 /* ProtectionInfo.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD12FD368B3A96F323444D8E /* ProtectionInfo.graphql.swift */; }; + 2D73D2D80BC8C455DB35CE57 /* TokenApproval.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD56CBC543897BE8E37CC2C1 /* TokenApproval.graphql.swift */; }; + 2FC53D1C58218F0BF1D4E5F3 /* IContract.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D9189C818AFF8E988F861D0 /* IContract.graphql.swift */; }; + 31A4EC91F1924E25AECA2F4E /* NftCollectionMarket.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F286C514E849B29F5235310A /* NftCollectionMarket.graphql.swift */; }; + 3389D45727F15B8E4F59B99F /* NftApproval.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD111A711D83D1D82E4025A9 /* NftApproval.graphql.swift */; }; + 34610491FF9A452F4F806157 /* TokenPriceHistoryQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9602E2A290179F8741EDD35A /* TokenPriceHistoryQuery.graphql.swift */; }; + 3720F641F397A2819500B1B1 /* SwapOrderStatus.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0359DDEA2E2E17759FCC5CF /* SwapOrderStatus.graphql.swift */; }; + 391FD815120230BDAF53F6F0 /* BlockaidFees.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EF9AEC00868BFD7CEBF202C /* BlockaidFees.graphql.swift */; }; + 39DEA445993253BCC1201199 /* NftApproveForAll.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF1B893C0275DAAA156B0108 /* NftApproveForAll.graphql.swift */; }; + 4260B9F719F8E25DFBF99D73 /* OnRampTransfer.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E5D1A04B42B25218C53C107 /* OnRampTransfer.graphql.swift */; }; + 438115E2759B1194751A8021 /* NftContract.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55A243177E9FA92A0524A222 /* NftContract.graphql.swift */; }; + 45FFF7DF2E8C2A8100362570 /* SilentPushEventEmitter.m in Sources */ = {isa = PBXBuildFile; fileRef = 45FFF7DE2E8C2A6400362570 /* SilentPushEventEmitter.m */; }; + 45FFF7E12E8C2E6900362570 /* SilentPushEventEmitter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45FFF7E02E8C2E6100362570 /* SilentPushEventEmitter.swift */; }; 463BA791004B1B7AC1773914 /* Pods_Uniswap.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2226DF79BEAFECEE11A51347 /* Pods_Uniswap.framework */; }; - 4917B04DB81579CF4243A1DA /* Chain.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A8990A17F489F284E0DB1B3 /* Chain.graphql.swift */; }; - 4BB9E218D89B8AF5E4E27CCB /* NftOrderEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49BD6C776029FAF4FC711DE7 /* NftOrderEdge.graphql.swift */; }; - 4C187202229BDC4D8898E067 /* Dimensions.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54B1C71AED738D17898103A6 /* Dimensions.graphql.swift */; }; - 4EF8D293BB1EBCFBFC65A330 /* TokenTransfer.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DA4E7C052A6C4AC3A9DCDA6 /* TokenTransfer.graphql.swift */; }; - 4FED6AAF896BA371C56D88B1 /* Portfolio.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1849039FD4A210DA990363C8 /* Portfolio.graphql.swift */; }; - 50C89DFAF2DBC80D6343B164 /* NftAssetTraitInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 556339705BD103365D4ED07B /* NftAssetTraitInput.graphql.swift */; }; - 553E6B467BEE49C9984691C5 /* OnRampTransfer.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2139ABF56EA067ED792A48C9 /* OnRampTransfer.graphql.swift */; }; - 5804A1B1BB144D9EFBBE177D /* NftAssetEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DF7C8888BE6AFA2F22889FE /* NftAssetEdge.graphql.swift */; }; + 47797825D18637A2FE57AC1F /* TokenProtectionInfoParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 835D9DF76533D22EDF0E9D67 /* TokenProtectionInfoParts.graphql.swift */; }; + 4DB6B64CFF3B00FCF0258336 /* NftMarketplace.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83FB27D93A9468E6DB47231C /* NftMarketplace.graphql.swift */; }; + 4DB6D0FB611F6C68EADFB948 /* TokenProjectMarket.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B0505DB30407C221B6A8491 /* TokenProjectMarket.graphql.swift */; }; + 4DB88A2CBFF5FF356CA757F0 /* ApplicationContract.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59DD4D834D7B42A6D02F4F12 /* ApplicationContract.graphql.swift */; }; + 4FD78AA88D2EB8E22144BCDF /* NftAssetTraitInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1731869775D16A9EAB475C /* NftAssetTraitInput.graphql.swift */; }; + 51362EC6F0E6D8928C067F5E /* NftBalancesFilterInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1810C60B56CC74150C868801 /* NftBalancesFilterInput.graphql.swift */; }; + 5551DDD6A8B9B28E03459816 /* TokenFeeDataParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1166529407CA13E4D4F24F12 /* TokenFeeDataParts.graphql.swift */; }; + 5676CCD265609B71D3B1DB7C /* NftCollectionEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70593F94C8B315F5304B9BE /* NftCollectionEdge.graphql.swift */; }; + 57ECD348EA564F0CBF715E9E /* PortfolioBalancesQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0A53C3A09AD259B9A8EDBDD /* PortfolioBalancesQuery.graphql.swift */; }; 5B4398EC2DD3B22C00F6BE08 /* PrivateKeyDisplayManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B4398E82DD3B22C00F6BE08 /* PrivateKeyDisplayManager.m */; }; 5B4398ED2DD3B22C00F6BE08 /* PrivateKeyDisplayManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B4398E92DD3B22C00F6BE08 /* PrivateKeyDisplayManager.swift */; }; 5B4398EE2DD3B22C00F6BE08 /* PrivateKeyDisplayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B4398EA2DD3B22C00F6BE08 /* PrivateKeyDisplayView.swift */; }; 5B4CEC5F2DD65DD4009F082B /* CopyIconOutline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B4CEC5E2DD65DD4009F082B /* CopyIconOutline.swift */; }; - 5C3958DA046B5A84FE90C1BD /* FeeData.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17819A49DE69723EC60D9D72 /* FeeData.graphql.swift */; }; - 5D06BAB366D14A5AFE2355E8 /* TransactionType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69F2FFD11FB5E462CC454A15 /* TransactionType.graphql.swift */; }; 5E5E0A632D380F5800E166AA /* Env.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E5E0A622D380F5700E166AA /* Env.swift */; }; 5EFB78362B1E585000E77EAC /* ConvertQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EFB78352B1E585000E77EAC /* ConvertQuery.graphql.swift */; }; - 614FCC3D8E9AA8175E950726 /* Currency.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25B4C7C7FEF32EAF10D030F9 /* Currency.graphql.swift */; }; - 61988A922656857278F7CBF9 /* TokenBalanceMainParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 137696908D703632CEE3AB28 /* TokenBalanceMainParts.graphql.swift */; }; - 62B32E9623DA0E939F062033 /* TokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3C3F0403FAEFDD632AC6CCE /* TokensQuery.graphql.swift */; }; - 63BDDE4499AC6B2375C9F795 /* FavoriteTokenCardQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F0EEAC1DADE827AE38EB8A6 /* FavoriteTokenCardQuery.graphql.swift */; }; - 648B919F00D069DE1F0040F6 /* NftMarketplace.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 600250B00B6C02AAB063818B /* NftMarketplace.graphql.swift */; }; + 6250D4ACD5696D845FD83DFD /* HomeScreenTokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7FF51A507BF788E64E3EFE /* HomeScreenTokensQuery.graphql.swift */; }; + 63FBF9C23ED568816590F093 /* ActivityDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 075E4C1DFAA00EE5B3CE792D /* ActivityDetails.graphql.swift */; }; 649A7A782D9AE70B00B53589 /* KeychainUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 649A7A772D9AE70B00B53589 /* KeychainUtils.swift */; }; 649A7A792D9AE70B00B53589 /* KeychainConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 649A7A762D9AE70B00B53589 /* KeychainConstants.swift */; }; - 66D2765A00D8CE3136D28F1F /* SafetyLevel.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ACFA5B4204741038C986C5D /* SafetyLevel.graphql.swift */; }; - 677FC15A05D9BD23930FAC95 /* TokenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74885865ED8CFEA875E40916 /* TokenQuery.graphql.swift */; }; - 6A60BDC9D46A710D871DEC6E /* NftProfile.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB35E518AD7FBFEBEA9CAB95 /* NftProfile.graphql.swift */; }; + 6882C4768011FDD4D746BDDB /* TokenBasicInfoParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = D13E592852F52B2855F05A5E /* TokenBasicInfoParts.graphql.swift */; }; 6BC7D07E2B5FF02400617C95 /* ScantasticEncryption.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BC7D07B2B5FF02400617C95 /* ScantasticEncryption.m */; }; 6BC7D07F2B5FF02400617C95 /* ScantasticEncryption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BC7D07C2B5FF02400617C95 /* ScantasticEncryption.swift */; }; 6BC7D0802B5FF02400617C95 /* EncryptionUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BC7D07D2B5FF02400617C95 /* EncryptionUtils.swift */; }; @@ -198,21 +196,25 @@ 6CA91BE12A95226200C4063E /* RNCloudStorageBackupsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CA91BDE2A95226200C4063E /* RNCloudStorageBackupsManager.m */; }; 6CA91BE22A95226200C4063E /* EncryptionHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CA91BDF2A95226200C4063E /* EncryptionHelper.swift */; }; 6CA91BE32A95226200C4063E /* RNCloudStorageBackupsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CA91BE02A95226200C4063E /* RNCloudStorageBackupsManager.swift */; }; + 70CD2D0665E5AC6A0DF6F697 /* NFTItemScreenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03AB6B21A1BFB3A18982B47E /* NFTItemScreenQuery.graphql.swift */; }; 70EB8338CA39744B7DBD553E /* Pods_WidgetIntentExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1064E23E366D0C2C2B20C30E /* Pods_WidgetIntentExtension.framework */; }; - 71CF37F19F1C138B57CC135C /* TopTokenParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5640432978873FB030467750 /* TopTokenParts.graphql.swift */; }; + 71954B20E4341CEC36203F87 /* NftActivityEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 043C7D80D6722AFCF1715D07 /* NftActivityEdge.graphql.swift */; }; + 7700BED7CD7F52C83A3FF430 /* NftAssetEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFFD4C1E5A4B30DE3CE02DB4 /* NftAssetEdge.graphql.swift */; }; 77CF6065C8A24FE48204A2C1 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BF9176E944C84910B1C0B057 /* SplashScreen.storyboard */; }; - 7BE97D20155AE69FF36C4CB4 /* NftStandard.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B308EC3DB7C3C1DD5DDE03D /* NftStandard.graphql.swift */; }; - 818179F5724AA35E1B1D5A9C /* ProtectionInfo.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0702203B17BDD858CED28F8B /* ProtectionInfo.graphql.swift */; }; + 7B557C3224F990851430DBD2 /* Portfolio.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5397E77A577E9952D2477020 /* Portfolio.graphql.swift */; }; + 7C886F9D4C02EF4E5F67B011 /* NftsQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE735ED4766E65C0D6808F9A /* NftsQuery.graphql.swift */; }; + 7E3412EB776E1F43D6904BA0 /* PageInfo.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97FBBE677B56FFE07052EF1D /* PageInfo.graphql.swift */; }; + 8117BFB02DCF0F315FD83E67 /* TokenBalance.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 181209B4CDE80BDC80891CFD /* TokenBalance.graphql.swift */; }; + 8141B38CCDB09F91180C0EBD /* NftCollectionConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D09FFE2B5E56CDCAB2F9455 /* NftCollectionConnection.graphql.swift */; }; + 81E55E8D3056E2378A332B31 /* TokenDetailsScreenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 957A35D2DE7A140BA198A0F1 /* TokenDetailsScreenQuery.graphql.swift */; }; 8273FC23FB1AE47B80C5E09F /* Pods_OneSignalNotificationServiceExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15092E550A1C78508ABA3280 /* Pods_OneSignalNotificationServiceExtension.framework */; }; 8385A47D3C765B841F450090 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C26D739993D5C939C6FBB58A /* ExpoModulesProvider.swift */; }; - 8410B98A8D7974A941AAF299 /* WidgetTokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA33683D2BA6BBE3251D67C /* WidgetTokensQuery.graphql.swift */; }; - 85ADD03923353DB3D6CD7301 /* SwapOrderStatus.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = D574AB5194929038A54B4D4B /* SwapOrderStatus.graphql.swift */; }; - 85D0E81B798D0F2D841386E9 /* NftCollectionMarket.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F4F47D22B749A438B5BF674 /* NftCollectionMarket.graphql.swift */; }; - 869F3639FBC6D8156FFE3BD3 /* TokenProjectMarket.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B9A505509D9A85BE1DB7D05 /* TokenProjectMarket.graphql.swift */; }; - 8950F8354810AA673E1E35DA /* SchemaMetadata.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = C65195A1CC9894C6341385C3 /* SchemaMetadata.graphql.swift */; }; - 8ADDD2E2AB1FD9D1D9AF5627 /* BlockaidFees.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD35300F81746B2D4A23065A /* BlockaidFees.graphql.swift */; }; - 8CC06A8205186D0640F0BC55 /* NftAssetConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 218B8AB05C80D919671D3970 /* NftAssetConnection.graphql.swift */; }; - 8CEA6459A5B739C3A0382000 /* TokenProjectsQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8A49D011C60137D4034CAC4 /* TokenProjectsQuery.graphql.swift */; }; + 845327D60EFBB850189D6AB3 /* Amount.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4C3461E088654B80ABE3DE7 /* Amount.graphql.swift */; }; + 86038259E487A108DDC2948B /* Image.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C9047B981FA322A727947F7 /* Image.graphql.swift */; }; + 8971E73E041A6283E2684481 /* TokenProject.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8856DFFC7FDC9BF105B0B4E3 /* TokenProject.graphql.swift */; }; + 8BCFF1F648887F78894F1071 /* ContractInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = AED050A208757F137DBDA57D /* ContractInput.graphql.swift */; }; + 8D85F349FEF81A52FB93EAAB /* AssetChange.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4C849A7805FCCEE8C8C3E6 /* AssetChange.graphql.swift */; }; + 8E6DA65AC5CAE9F9A67F9E38 /* TopTokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 243576FAC8D2801F9D99ECC9 /* TopTokensQuery.graphql.swift */; }; 8E89C3AE2AB8AAA400C84DE5 /* MnemonicConfirmationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E89C3A62AB8AAA400C84DE5 /* MnemonicConfirmationView.swift */; }; 8E89C3AF2AB8AAA400C84DE5 /* MnemonicDisplayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E89C3A72AB8AAA400C84DE5 /* MnemonicDisplayView.swift */; }; 8E89C3B12AB8AAA400C84DE5 /* MnemonicConfirmationWordBankView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E89C3A92AB8AAA400C84DE5 /* MnemonicConfirmationWordBankView.swift */; }; @@ -227,7 +229,7 @@ 8EBFB1552ABA6AA6006B32A8 /* PasteIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EBFB1542ABA6AA6006B32A8 /* PasteIcon.swift */; }; 8ED0562C2AA78E2C009BD5A2 /* ScrollFadeExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8ED0562B2AA78E2C009BD5A2 /* ScrollFadeExtensions.swift */; }; 8EE7C0582AFD7B2100E0D9CD /* DescriptionTranslations.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EE7C0572AFD7B2100E0D9CD /* DescriptionTranslations.graphql.swift */; }; - 8FE0F30936E893297558F467 /* ProtectionResult.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD0FC2D534CB82B151C7F9B7 /* ProtectionResult.graphql.swift */; }; + 9061ACE5AF99CEDE7BA51C94 /* NftProfile.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE2A9FBFB7F718246B668A60 /* NftProfile.graphql.swift */; }; 9127D1362CC2D3D00096F134 /* TokenBalanceMainParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9127D1342CC2D3D00096F134 /* TokenBalanceMainParts.graphql.swift */; }; 9127D1372CC2D3D00096F134 /* TokenBalanceQuantityParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9127D1352CC2D3D00096F134 /* TokenBalanceQuantityParts.graphql.swift */; }; 9173CEBC2D03C6F30036DA28 /* TokenBalanceParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9173CEBB2D03C6F30036DA28 /* TokenBalanceParts.graphql.swift */; }; @@ -243,15 +245,14 @@ 91D501792CDBEAE700B09B7F /* TopTokenParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91D5016E2CDBEAE700B09B7F /* TopTokenParts.graphql.swift */; }; 91D5017A2CDBEAE700B09B7F /* TokenFeeDataParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91D5016F2CDBEAE700B09B7F /* TokenFeeDataParts.graphql.swift */; }; 91D5017E2CDBEAF600B09B7F /* HomeScreenTokenParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91D5017C2CDBEAF600B09B7F /* HomeScreenTokenParts.graphql.swift */; }; - 9301D18644F3DFA9ABB8F0BE /* TokenApproval.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E975BEDBED5FE51D0DC6E96 /* TokenApproval.graphql.swift */; }; - 93566FBDE94E1A2D8CC5AB62 /* ConvertQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD3F0794908635CDFA7DAB6 /* ConvertQuery.graphql.swift */; }; - 9381B5EA5839DA17D07A45F0 /* TokenDetailsScreenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7A33933670CCAD9E62A1A80 /* TokenDetailsScreenQuery.graphql.swift */; }; - 93AEECDBDB160B5E0C9E3149 /* TokenProjectDescriptionQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FF8B660E9C2C0D8DDF7588A /* TokenProjectDescriptionQuery.graphql.swift */; }; - 97CA219E1FFD832D8FA02C20 /* TransactionDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABE51731EB853137302A7B0D /* TransactionDetails.graphql.swift */; }; - 9822D243ED2F5C350404A375 /* HomeScreenTokenParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27F8B915042BD8D67D9627EA /* HomeScreenTokenParts.graphql.swift */; }; - 9A3E861F5D7B0F2CB0EFA7A6 /* AssetActivity.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4624A41EC1468712BD77653 /* AssetActivity.graphql.swift */; }; - 9AF0D1FDF2BFB17FB732C5FD /* SchemaConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E49E724432C70A2551FB2C7 /* SchemaConfiguration.swift */; }; - 9B6C88F7D8D542AAC353A3EA /* NftOrderConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39FC2A13550FA6754EC1A7FC /* NftOrderConnection.graphql.swift */; }; + 91DBDA9B4F4006350AEB8E4B /* NftStandard.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0373C61A7AF015058A502CE2 /* NftStandard.graphql.swift */; }; + 9260D04A891FEDE2BF511707 /* Currency.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD0CA37FB709C06F123EBF74 /* Currency.graphql.swift */; }; + 997BFD5324E4BDE2422FEFED /* NftAssetsFilterInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310373063D8A11E9E02314FE /* NftAssetsFilterInput.graphql.swift */; }; + 9A9B39BC22F3BDFCD0917B66 /* OffRampTransactionDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4CA32B2B2997D73A0185635 /* OffRampTransactionDetails.graphql.swift */; }; + 9D638326CD705ABE549C8CA7 /* TokenProjectMarketsParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C2E70E43A02405C5CEAD7C /* TokenProjectMarketsParts.graphql.swift */; }; + 9E7EC26AC45301198E280DC7 /* NftOrderEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD158681F2E84A5E49656B11 /* NftOrderEdge.graphql.swift */; }; + 9EBC41A90B1A80653960045E /* SchemaMetadata.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 522135E54BDB258B45B5A694 /* SchemaMetadata.graphql.swift */; }; + 9EC9E4AB5C3FD254EDB28D7A /* PortfolioValueModifier.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = E09D12605BAA868AB51573BE /* PortfolioValueModifier.graphql.swift */; }; 9F00A43A2B33894C0088A0D0 /* ApplicationContract.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F00A4392B33894C0088A0D0 /* ApplicationContract.graphql.swift */; }; 9F29D4ED2B47126D004D003A /* NftBalanceAssetInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F29D4EC2B47126D004D003A /* NftBalanceAssetInput.graphql.swift */; }; 9F78980B2A819CC4004D5A98 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 072F6C222A44A32E00DA720A /* SwiftUI.framework */; }; @@ -268,72 +269,74 @@ 9FCEBF012A95A8E00079EDDB /* RNWalletConnect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCEBEFF2A95A8E00079EDDB /* RNWalletConnect.swift */; }; 9FCEBF042A95A99C0079EDDB /* RCTThemeModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FCEBF032A95A99B0079EDDB /* RCTThemeModule.m */; }; 9FEC9B8B2A858CF1003CD019 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FEC9B8A2A858CF1003CD019 /* AppDelegate.m */; }; - A104024A1861354EC1DD53C1 /* PortfolioBalancesQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 985DDC8324B872DD44E87781 /* PortfolioBalancesQuery.graphql.swift */; }; + A250CF455F6CEFB64ABFC277 /* HomeScreenTokenParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB772B265A35BFBC3A7761AD /* HomeScreenTokenParts.graphql.swift */; }; A32F9FBD272343C9002CFCDB /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = A32F9FBC272343C8002CFCDB /* GoogleService-Info.plist */; }; - A3318C676D7FBF78A1583B16 /* NftCollectionEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37038CCEB11E70E2027EF4EA /* NftCollectionEdge.graphql.swift */; }; 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 */; }; - A974633048E27D5D23420F34 /* TokenBasicInfoParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3377F7BB38BD5A45AE31909D /* TokenBasicInfoParts.graphql.swift */; }; - AA3AE4E5C2AAC3F9460A3637 /* NftBalanceAssetInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E5FA43C5E31035775917C4E /* NftBalanceAssetInput.graphql.swift */; }; + A88A26642AC25B022F428953 /* OnRampServiceProvider.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BED80DB034487FCA1450EDB /* OnRampServiceProvider.graphql.swift */; }; + A949039A6A9EB3584B5644F3 /* IAmount.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37376E4CF3A4B76E9DAE150C /* IAmount.graphql.swift */; }; + A9AF7B483E9666E88CD6253E /* NftOrderConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F489175099FE697721272D /* NftOrderConnection.graphql.swift */; }; + AAB837C01239A62D00068853 /* TransactionType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18D48B25E03122149B0D1304 /* TransactionType.graphql.swift */; }; AC0EE0982BD826E700BCCF07 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = AC0EE0972BD826E700BCCF07 /* PrivacyInfo.xcprivacy */; }; AC2EF4032C914B1600EEEFDB /* fonts in Resources */ = {isa = PBXBuildFile; fileRef = AC2EF4022C914B1600EEEFDB /* fonts */; }; - AC70FF8207ED26561B634E30 /* NftsQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9030AC59702756C39396FFE /* NftsQuery.graphql.swift */; }; - ADE104A101B3DFFBDB308189 /* Query.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED157D3DB73302C8A1B9522E /* Query.graphql.swift */; }; - AF83E7713BB625D787DD1A1D /* TokenMarket.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBD833F6580F9B82A68D4A98 /* TokenMarket.graphql.swift */; }; + ACA7AE75760B76F7B30DCD43 /* AmountChange.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066BBBD815CF2DE8803338BC /* AmountChange.graphql.swift */; }; + AD6036D32C44048781B728E1 /* SchemaConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF4115ACC8D8F0C7529AABA7 /* SchemaConfiguration.swift */; }; B193AD315CF844A3BDC3D11D /* Basel-Grotesk-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 3C606D2C81014A0A8898F38E /* Basel-Grotesk-Medium.otf */; }; - B377DB0418EA15695F208D9F /* NetworkFee.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BEADEB4AE05B860CF2232D1 /* NetworkFee.graphql.swift */; }; - B61E182CF4937B5169885C95 /* OnRampTransactionDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12D3AB6C2FC9513E9F224B7C /* OnRampTransactionDetails.graphql.swift */; }; - B746C09DA19B4C7F9C700989 /* NftActivityConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F912AB9AB67808B740246798 /* NftActivityConnection.graphql.swift */; }; - BA83003638263D702D03C3C1 /* ActivityDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A4EB7BAD2C90E61FD6C30AF /* ActivityDetails.graphql.swift */; }; + B64BD6DEB100AEB723DB640D /* NftBalanceConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62DDC1F42E7172783EAF3776 /* NftBalanceConnection.graphql.swift */; }; BA869E372D56B0B600D7A718 /* WidgetTokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA869E362D56B0B600D7A718 /* WidgetTokensQuery.graphql.swift */; }; BA8FC9627A40644259D9E2F9 /* Pods_WidgetsCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB29AC0C0907A833F23D2C30 /* Pods_WidgetsCore.framework */; }; - BD1FF76A8E50EFEA0720CC04 /* NftAsset.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2932B486DD7070DF226A27B /* NftAsset.graphql.swift */; }; - BD59A9C8414D6A4BFE9C9A2E /* NftActivity.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A24D364C0D262A14BB7182 /* NftActivity.graphql.swift */; }; - C1FC1F8B4A2725A195F66D60 /* PortfolioValueModifier.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41003491EF939043CF9D0F4E /* PortfolioValueModifier.graphql.swift */; }; - C791C5505DBB3036B9D5066D /* SwapOrderType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 148617FD73F2CD7117960DBA /* SwapOrderType.graphql.swift */; }; - C7ABAADA504107D152A52FD4 /* NftBalancesFilterInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41BA2129FFE961C8549C8A30 /* NftBalancesFilterInput.graphql.swift */; }; - C8338C5BE951EF9111C48217 /* TokenBasicProjectParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C2F4BE3080D4129D4478528 /* TokenBasicProjectParts.graphql.swift */; }; - C8402101FF510BAA358DCA46 /* TokenBalanceParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0C34E94906CB9F0A016D566 /* TokenBalanceParts.graphql.swift */; }; - CA0EDABCA1B6C2B0936BF5CF /* NftBalanceEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B132543F80E3C9191219E6D /* NftBalanceEdge.graphql.swift */; }; - CCBC45FD4310D8153D859361 /* TransactionStatus.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ABA47847A73130D356EB6BF /* TransactionStatus.graphql.swift */; }; - CE1DF567D58943ACCBB8360C /* Amount.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20E9461A6C9C1CD6A24BEED /* Amount.graphql.swift */; }; - CF2BAECCF9A2EC43AC3EC583 /* OnRampServiceProvider.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A84A192F750A0F1BC8D7A69 /* OnRampServiceProvider.graphql.swift */; }; - CF36F741187285B430EFE557 /* NftBalance.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05BE2F49DD1FB9A692E21C13 /* NftBalance.graphql.swift */; }; + BAB54489223FD0027F7A8DBE /* Dimensions.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764C4757EB194D13A8857DFA /* Dimensions.graphql.swift */; }; + BB28AF35DC102F8DE2A4BE9D /* OnRampTransactionsAuth.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3CC3D9DE64A39897BA580B3 /* OnRampTransactionsAuth.graphql.swift */; }; + BE0DBD01CF4DCA6D3CDDA369 /* NftActivity.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55C67E53A2C8AEB6AE92E33F /* NftActivity.graphql.swift */; }; + BED0DD22C0D9E09C85DF010D /* NftAsset.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C9F3B31FC6AF8CE30CD7DA2 /* NftAsset.graphql.swift */; }; + BFB114718A0D262E3AEAEDC0 /* TransactionStatus.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945EF0A3BD6F19DA14E40AE1 /* TransactionStatus.graphql.swift */; }; + C064037906B259088B6B78B2 /* NetworkFee.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09BE4B220A4F8465C3D01BA5 /* NetworkFee.graphql.swift */; }; + C0BBEE1CAEA4B2F778426BDE /* SelectWalletScreenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB9CACD175D6C20B6D4707C8 /* SelectWalletScreenQuery.graphql.swift */; }; + C8F5AF75BDB439143FE1C173 /* NftActivityFilterInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C3E075E850CEC1714BE52C /* NftActivityFilterInput.graphql.swift */; }; + CA966CBD02A7B16BC55F1B8E /* ProtectionResult.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAB6B8C64F7525D0D0E978C6 /* ProtectionResult.graphql.swift */; }; + CBEB9122D993BCB0E9A604B7 /* Query.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5956ECBE73216D266D8D2E86 /* Query.graphql.swift */; }; + CE8C365D91CADE7A5A8F4D52 /* TopTokenParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F0E504152E22110917353E /* TopTokenParts.graphql.swift */; }; + CEE9E9912D5621F6E8F819B7 /* MultiplePortfolioBalancesQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 595699514939A2CE780AF0CF /* MultiplePortfolioBalancesQuery.graphql.swift */; }; + D0B9B6DEC559290B7F64B24F /* TokenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0914ECF70C274E2B064BCD42 /* TokenQuery.graphql.swift */; }; + D1FB4E293EC152C12A495ACD /* TokenStandard.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34AC1057AD14362BB91E88B /* TokenStandard.graphql.swift */; }; D3B63ACA9B0C42F68080B080 /* InputMono-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1834199AFFB04D91B05FFB64 /* InputMono-Regular.ttf */; }; - D660CA59775C3634324037ED /* MultiplePortfolioBalancesQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4429CA6DA254ECC24A65DA14 /* MultiplePortfolioBalancesQuery.graphql.swift */; }; - D680C4844F2C5DACF5D0892E /* NftAssetsFilterInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B477EBEA1EDA3914C77E8A6 /* NftAssetsFilterInput.graphql.swift */; }; + D48D1B7A4469BAAA22608058 /* TokenSortableField.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51F133663B435829DE47E3CE /* TokenSortableField.graphql.swift */; }; + D5F36D3EDC206DF15EC368AC /* NftActivityType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CDAC035887C3908C3BD1A77 /* NftActivityType.graphql.swift */; }; + D6149AE9ED70F546DF5841BD /* ConvertQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E4DEE7FC8D7BCD030CFA4D3 /* ConvertQuery.graphql.swift */; }; D7926D4A878B2237137B300F /* Pods_WidgetsCoreTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 021E59CE7ECBD4FE0F3BFCFD /* Pods_WidgetsCoreTests.framework */; }; - D7E3642851C618D369D26B82 /* TokenMarketParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC36D963A2A52D1E7CA77E4 /* TokenMarketParts.graphql.swift */; }; - D81BAFFCC105668B88B607FC /* NftCollectionConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92DE390311705FF1EE65C0E6 /* NftCollectionConnection.graphql.swift */; }; - DC0641C5870F91D26C914F1D /* TokenPriceHistoryQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DFBD29C0BDFDB4464B8189C /* TokenPriceHistoryQuery.graphql.swift */; }; + D8A0C6D04FF53BA4F50543FE /* NftAssetTrait.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85B43D489CC5ACF1EA34E9EB /* NftAssetTrait.graphql.swift */; }; + DB752E8F664505726ABDBCD3 /* NftBalance.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB2B02717B1A87BD41920151 /* NftBalance.graphql.swift */; }; + DC4AA6DE28B9F40A3D7600F1 /* TokenProjectsQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98CEFE7189D63880FD5A702 /* TokenProjectsQuery.graphql.swift */; }; DE2F24512E7204C2CA255C50 /* Pods_Widgets.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2E8B7D36D2E14D9488F351EB /* Pods_Widgets.framework */; }; - E091F379106E92D3181103CB /* IAmount.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03AD8C2B1226EBE1524F2573 /* IAmount.graphql.swift */; }; - E0F63BA3A99DB10FA1CCAB5E /* TokenProjectUrlsParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 236126979349098B98C70F27 /* TokenProjectUrlsParts.graphql.swift */; }; - E24ED8688E9B18BBD543F8F0 /* TokenBalance.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4B149117182C6CC58DD570C /* TokenBalance.graphql.swift */; }; + E1009979B48ACF5017C12F09 /* TransactionListQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95283AC560844B50E95934E4 /* TransactionListQuery.graphql.swift */; }; + E2C528F617A9675690171D54 /* DescriptionTranslations.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = D91432EF6C35F5A6301340A2 /* DescriptionTranslations.graphql.swift */; }; + E475BA358DD8BE30A6FDC051 /* NftBalanceEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DD55DFFC717D37DD960B82E /* NftBalanceEdge.graphql.swift */; }; + E4985BA9090E013F2C9FC190 /* TokenMarket.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E5B09464C768590127BFA6 /* TokenMarket.graphql.swift */; }; E4B3067A930D2E57558E5229 /* Pods_Uniswap_UniswapTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0929C0B4AE1570B8C0B45D4D /* Pods_Uniswap_UniswapTests.framework */; }; - E54093DC857B8C634804D42B /* NftTransfer.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3317EBD4E3B11E2F2A1CE58 /* NftTransfer.graphql.swift */; }; - EF05F69E61EA8A16C6A66D53 /* IContract.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0D68CC8D1F13D864F069BB /* IContract.graphql.swift */; }; - EF3D92CA76DEE66090F18D0C /* NftCollectionScreenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE0973BB445AAD8FAA25757F /* NftCollectionScreenQuery.graphql.swift */; }; - F0D6A92BB4FCE19CDFA5BBE1 /* HomeScreenTokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7E03AA02B39A7A90C96AA76 /* HomeScreenTokensQuery.graphql.swift */; }; - F2EB62621E64B57B07DE8B13 /* Token.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647933A5DC35BDFEEF3620A1 /* Token.graphql.swift */; }; + E654760CA0FF19139A85472A /* TokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4C8174A3A9EB3244AA844F4 /* TokensQuery.graphql.swift */; }; + E7B6F1CA0E30585C949C9D9A /* NftAssetConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD86EFAA0D6B8FBECCC4828B /* NftAssetConnection.graphql.swift */; }; + E7D4A29333634717D099F80E /* SwapOrderType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AFDF569E43F173C2F5A07AF /* SwapOrderType.graphql.swift */; }; + E7EDBB8CDF65D5D6602BF8FC /* NftOrder.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67C0D95F7EA9E7ACA9B18692 /* NftOrder.graphql.swift */; }; + EB0A75424F8EEF6612D28D52 /* NftTransfer.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74AD16E33DC518A42C386FE2 /* NftTransfer.graphql.swift */; }; + ED606CD83873CC9DFCCA44F1 /* FavoriteTokenCardQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B03A0A6AB0957A512A2D225 /* FavoriteTokenCardQuery.graphql.swift */; }; + EE4B861AE191A1BF70CF3784 /* WidgetTokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F0A91F56B1CA2E71B479BAD /* WidgetTokensQuery.graphql.swift */; }; + F09E3F15A36A9050B028B3E3 /* TokenBasicProjectParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E8286984864AD69A0FAE3BC /* TokenBasicProjectParts.graphql.swift */; }; + F1193089AE71CA3C4C101EA5 /* OffRampTransfer.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 166A9AE7203545C397E683E8 /* OffRampTransfer.graphql.swift */; }; 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, ); }; }; - F53121FB1B070DB9A81347DF /* TokenProjectMarketsParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC055C3EDFDE2966FCA83C9E /* TokenProjectMarketsParts.graphql.swift */; }; - F5B577CA1201CB6FF04A9A58 /* ApplicationContract.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 608B07304ED1387B5AEAA3BB /* ApplicationContract.graphql.swift */; }; - F772B09295DABC5E8895C1C5 /* SelectWalletScreenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = B033206DC974BCB6AF8CC613 /* SelectWalletScreenQuery.graphql.swift */; }; - FA8EB6A63AB3F56194C6CFB8 /* TokenBalanceQuantityParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2370BAD675DC8064C00AC037 /* TokenBalanceQuantityParts.graphql.swift */; }; - FBE634E2AEC7A62B89863366 /* ContractInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B3C6DF5DED22E892851B10 /* ContractInput.graphql.swift */; }; - FC7C117CEA5EA63460E6A2C6 /* NftApproveForAll.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5BCBB5D46312050E4A5BD64 /* NftApproveForAll.graphql.swift */; }; - FD4E55146E046C7F5983A379 /* FeedTransactionListQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BA0ACE5B9B2C41187CD41F3 /* FeedTransactionListQuery.graphql.swift */; }; + F49C1C4E9175DFE7EEF9FB51 /* Token.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FB1590D18A58D37C750D9AC /* Token.graphql.swift */; }; + F77F1A182DCA1D8DFE46ACC8 /* TokenBalanceParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65AD13BFAD4EBA18AA6205E3 /* TokenBalanceParts.graphql.swift */; }; + F814C0144D90ADB4A8E0A34E /* Chain.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DBCFBC330BF97BA2F630908 /* Chain.graphql.swift */; }; + F86D86FC31BBDA7246C50392 /* ProtectionAttackType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3F4D5E8B9ED6E0FE29EA779 /* ProtectionAttackType.graphql.swift */; }; + FA318FB37223FAF04A5C887B /* TokenProjectUrlsParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 190523DBBA423868C74FF80D /* TokenProjectUrlsParts.graphql.swift */; }; + FC61EDE606C85346CE069C5D /* TransactionHistoryUpdaterQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 559CBC7F568C769C48E7C6F4 /* TransactionHistoryUpdaterQuery.graphql.swift */; }; FD54D51D296C79A4007A37E9 /* GoogleServiceInfo in Resources */ = {isa = PBXBuildFile; fileRef = FD54D51C296C79A4007A37E9 /* GoogleServiceInfo */; }; FD7304CE28A364FC0085BDEA /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FD7304CD28A364FC0085BDEA /* Colors.xcassets */; }; FD7304D028A3650A0085BDEA /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD7304CF28A3650A0085BDEA /* Colors.swift */; }; - FD84AA379C4562598807843D /* TokenStandard.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC419570F5A025E80AB10A72 /* TokenStandard.graphql.swift */; }; - FE9CE5C3B5A456B249FC34C5 /* NftActivityEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DB4379B5E222207CA7328D0 /* NftActivityEdge.graphql.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -436,16 +439,16 @@ 00E356EE1AD99517003FC87E /* UniswapTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UniswapTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 00E356F21AD99517003FC87E /* UniswapTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UniswapTests.m; sourceTree = ""; }; - 018603D0FA4D05DBF16F1441 /* TokenFeeDataParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenFeeDataParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenFeeDataParts.graphql.swift; sourceTree = ""; }; 021E59CE7ECBD4FE0F3BFCFD /* Pods_WidgetsCoreTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WidgetsCoreTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0373C61A7AF015058A502CE2 /* NftStandard.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftStandard.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/NftStandard.graphql.swift; sourceTree = ""; }; 037C5AA92C04970B00B1D808 /* CopyIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopyIcon.swift; sourceTree = ""; }; - 03AD8C2B1226EBE1524F2573 /* IAmount.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IAmount.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Interfaces/IAmount.graphql.swift; sourceTree = ""; }; + 03AB6B21A1BFB3A18982B47E /* NFTItemScreenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NFTItemScreenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/NFTItemScreenQuery.graphql.swift; sourceTree = ""; }; 03C788222C10E7390011E5DC /* ActionButtons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionButtons.swift; sourceTree = ""; }; 03D2F3172C218D380030D987 /* RelativeOffsetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelativeOffsetView.swift; sourceTree = ""; }; - 04E5C2900254E7BA7F10CE51 /* TopTokensQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TopTokensQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TopTokensQuery.graphql.swift; sourceTree = ""; }; - 05BE2F49DD1FB9A692E21C13 /* NftBalance.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalance.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftBalance.graphql.swift; sourceTree = ""; }; + 043C7D80D6722AFCF1715D07 /* NftActivityEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivityEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftActivityEdge.graphql.swift; sourceTree = ""; }; + 05C66C49AF2B78703FCE4C7C /* AssetActivity.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssetActivity.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/AssetActivity.graphql.swift; sourceTree = ""; }; 065A981F892F7A06A900FCD5 /* Pods-WidgetsCoreTests.dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetsCoreTests.dev.xcconfig"; path = "Target Support Files/Pods-WidgetsCoreTests/Pods-WidgetsCoreTests.dev.xcconfig"; sourceTree = ""; }; - 0702203B17BDD858CED28F8B /* ProtectionInfo.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProtectionInfo.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/ProtectionInfo.graphql.swift; sourceTree = ""; }; + 066BBBD815CF2DE8803338BC /* AmountChange.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AmountChange.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/AmountChange.graphql.swift; sourceTree = ""; }; 0703EE022A5734A600AED1DA /* UserDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaults.swift; sourceTree = ""; }; 070480372A58A507009006CE /* WidgetIntentExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WidgetIntentExtension.entitlements; sourceTree = ""; }; 0712B3629C74D1F958DF35FB /* Pods-Uniswap-UniswapTests.dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Uniswap-UniswapTests.dev.xcconfig"; path = "Target Support Files/Pods-Uniswap-UniswapTests/Pods-Uniswap-UniswapTests.dev.xcconfig"; sourceTree = ""; }; @@ -544,6 +547,7 @@ 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 = ""; }; + 075E4C1DFAA00EE5B3CE792D /* ActivityDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ActivityDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Unions/ActivityDetails.graphql.swift; 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 = ""; }; @@ -556,17 +560,20 @@ 07B0676A2A7D6EC8001DD9B9 /* RNWidgets.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RNWidgets.swift; sourceTree = ""; }; 07B0676B2A7D6EC8001DD9B9 /* RNWidgets.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNWidgets.m; sourceTree = ""; }; 07F0C28E2A5F3E2E00D5353E /* Env.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Env.swift; sourceTree = ""; }; + 07F0E504152E22110917353E /* TopTokenParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TopTokenParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TopTokenParts.graphql.swift; sourceTree = ""; }; 07F1363F2A575EC00067004F /* DataQueries.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataQueries.swift; sourceTree = ""; }; 07F136412A5763480067004F /* Network.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; 07F5CF702A6AD97D00C648A5 /* Chart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Chart.swift; sourceTree = ""; }; 07F5CF742A7020FD00C648A5 /* Format.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Format.swift; sourceTree = ""; }; 08C60D53AB82A6D0D31D0F78 /* Pods-WidgetIntentExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetIntentExtension.release.xcconfig"; path = "Target Support Files/Pods-WidgetIntentExtension/Pods-WidgetIntentExtension.release.xcconfig"; sourceTree = ""; }; 08EBF075A4482F701892270B /* Pods-Widgets.dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Widgets.dev.xcconfig"; path = "Target Support Files/Pods-Widgets/Pods-Widgets.dev.xcconfig"; sourceTree = ""; }; + 0914ECF70C274E2B064BCD42 /* TokenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenQuery.graphql.swift; sourceTree = ""; }; 0929C0B4AE1570B8C0B45D4D /* Pods_Uniswap_UniswapTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Uniswap_UniswapTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 0B132543F80E3C9191219E6D /* NftBalanceEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalanceEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftBalanceEdge.graphql.swift; sourceTree = ""; }; + 09BE4B220A4F8465C3D01BA5 /* NetworkFee.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkFee.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NetworkFee.graphql.swift; sourceTree = ""; }; + 0B0505DB30407C221B6A8491 /* TokenProjectMarket.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectMarket.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenProjectMarket.graphql.swift; sourceTree = ""; }; 0B7E5D62E11408EB5F0F5A80 /* Pods-WidgetsCore.beta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetsCore.beta.xcconfig"; path = "Target Support Files/Pods-WidgetsCore/Pods-WidgetsCore.beta.xcconfig"; sourceTree = ""; }; - 0BB4A40E30E1D985519DB3CF /* TokenProtectionInfoParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProtectionInfoParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenProtectionInfoParts.graphql.swift; sourceTree = ""; }; 0C19DE44A750FB17647FF2B6 /* Pods-Widgets.beta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Widgets.beta.xcconfig"; path = "Target Support Files/Pods-Widgets/Pods-Widgets.beta.xcconfig"; sourceTree = ""; }; + 0D09FFE2B5E56CDCAB2F9455 /* NftCollectionConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollectionConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftCollectionConnection.graphql.swift; sourceTree = ""; }; 0DB282242CDADB260014CF77 /* EmbeddedWallet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EmbeddedWallet.m; sourceTree = ""; }; 0DB282252CDADB260014CF77 /* EmbeddedWallet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmbeddedWallet.swift; sourceTree = ""; }; 0DC6ADEF2B1E2C0F0092909C /* PortfolioValueModifier.graphql.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PortfolioValueModifier.graphql.swift; sourceTree = ""; }; @@ -574,91 +581,82 @@ 0DE251442C13B69D005F47F9 /* OnRampTransfer.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnRampTransfer.graphql.swift; sourceTree = ""; }; 0DE251452C13B69D005F47F9 /* OnRampServiceProvider.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnRampServiceProvider.graphql.swift; sourceTree = ""; }; 0DE251462C13B69D005F47F9 /* OnRampTransactionDetails.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnRampTransactionDetails.graphql.swift; sourceTree = ""; }; + 0E7FF51A507BF788E64E3EFE /* HomeScreenTokensQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HomeScreenTokensQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/HomeScreenTokensQuery.graphql.swift; sourceTree = ""; }; + 1053483279043EED7612BE90 /* HistoryDuration.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoryDuration.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/HistoryDuration.graphql.swift; sourceTree = ""; }; 1064E23E366D0C2C2B20C30E /* Pods_WidgetIntentExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WidgetIntentExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1166529407CA13E4D4F24F12 /* TokenFeeDataParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenFeeDataParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenFeeDataParts.graphql.swift; sourceTree = ""; }; 1193B3A845BC3BE8CAA00D01 /* Pods-OneSignalNotificationServiceExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OneSignalNotificationServiceExtension.release.xcconfig"; path = "Target Support Files/Pods-OneSignalNotificationServiceExtension/Pods-OneSignalNotificationServiceExtension.release.xcconfig"; sourceTree = ""; }; - 12D3AB6C2FC9513E9F224B7C /* OnRampTransactionDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnRampTransactionDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OnRampTransactionDetails.graphql.swift; sourceTree = ""; }; - 137696908D703632CEE3AB28 /* TokenBalanceMainParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBalanceMainParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBalanceMainParts.graphql.swift; sourceTree = ""; }; + 1276D33B06E840B8E6839F39 /* TokenProjectDescriptionQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectDescriptionQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenProjectDescriptionQuery.graphql.swift; sourceTree = ""; }; 13B07F961A680F5B00A75B9A /* Uniswap.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Uniswap.app; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Uniswap/AppDelegate.h; sourceTree = ""; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Uniswap/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Uniswap/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Uniswap/main.m; sourceTree = ""; }; - 148617FD73F2CD7117960DBA /* SwapOrderType.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwapOrderType.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/SwapOrderType.graphql.swift; sourceTree = ""; }; 15092E550A1C78508ABA3280 /* Pods_OneSignalNotificationServiceExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_OneSignalNotificationServiceExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 17819A49DE69723EC60D9D72 /* FeeData.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FeeData.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/FeeData.graphql.swift; sourceTree = ""; }; + 166A9AE7203545C397E683E8 /* OffRampTransfer.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OffRampTransfer.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OffRampTransfer.graphql.swift; sourceTree = ""; }; 178644A78AB62609EFDB66B3 /* Pods-Uniswap.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Uniswap.release.xcconfig"; path = "Target Support Files/Pods-Uniswap/Pods-Uniswap.release.xcconfig"; sourceTree = ""; }; + 1810C60B56CC74150C868801 /* NftBalancesFilterInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalancesFilterInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftBalancesFilterInput.graphql.swift; sourceTree = ""; }; + 181209B4CDE80BDC80891CFD /* TokenBalance.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBalance.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenBalance.graphql.swift; sourceTree = ""; }; 1834199AFFB04D91B05FFB64 /* InputMono-Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "InputMono-Regular.ttf"; path = "../src/assets/fonts/InputMono-Regular.ttf"; sourceTree = ""; }; - 1849039FD4A210DA990363C8 /* Portfolio.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Portfolio.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Portfolio.graphql.swift; sourceTree = ""; }; - 18B9EB43501127BE1B14F1A5 /* NftContract.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftContract.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftContract.graphql.swift; sourceTree = ""; }; + 18D48B25E03122149B0D1304 /* TransactionType.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionType.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TransactionType.graphql.swift; sourceTree = ""; }; + 190523DBBA423868C74FF80D /* TokenProjectUrlsParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectUrlsParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenProjectUrlsParts.graphql.swift; sourceTree = ""; }; 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 = ""; }; - 1FC7B80EC0E0D2134B67575B /* NftBalanceConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalanceConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftBalanceConnection.graphql.swift; sourceTree = ""; }; - 207F4DF7664454C31DE069F8 /* NFTItemScreenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NFTItemScreenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/NFTItemScreenQuery.graphql.swift; sourceTree = ""; }; - 2139ABF56EA067ED792A48C9 /* OnRampTransfer.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnRampTransfer.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OnRampTransfer.graphql.swift; sourceTree = ""; }; - 218B8AB05C80D919671D3970 /* NftAssetConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftAssetConnection.graphql.swift; sourceTree = ""; }; + 1CDAC035887C3908C3BD1A77 /* NftActivityType.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivityType.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/NftActivityType.graphql.swift; sourceTree = ""; }; + 1D9189C818AFF8E988F861D0 /* IContract.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IContract.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Interfaces/IContract.graphql.swift; sourceTree = ""; }; + 1F1731869775D16A9EAB475C /* NftAssetTraitInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetTraitInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftAssetTraitInput.graphql.swift; sourceTree = ""; }; 2226DF79BEAFECEE11A51347 /* Pods_Uniswap.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Uniswap.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 224CA82F1871016F4173F69E /* TransactionListQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionListQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TransactionListQuery.graphql.swift; sourceTree = ""; }; - 236126979349098B98C70F27 /* TokenProjectUrlsParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectUrlsParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenProjectUrlsParts.graphql.swift; sourceTree = ""; }; - 2370BAD675DC8064C00AC037 /* TokenBalanceQuantityParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBalanceQuantityParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBalanceQuantityParts.graphql.swift; sourceTree = ""; }; - 25B4C7C7FEF32EAF10D030F9 /* Currency.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Currency.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/Currency.graphql.swift; sourceTree = ""; }; - 27F8B915042BD8D67D9627EA /* HomeScreenTokenParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HomeScreenTokenParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/HomeScreenTokenParts.graphql.swift; sourceTree = ""; }; - 2ABA47847A73130D356EB6BF /* TransactionStatus.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionStatus.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TransactionStatus.graphql.swift; sourceTree = ""; }; - 2BA0ACE5B9B2C41187CD41F3 /* FeedTransactionListQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FeedTransactionListQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/FeedTransactionListQuery.graphql.swift; sourceTree = ""; }; - 2C2F4BE3080D4129D4478528 /* TokenBasicProjectParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBasicProjectParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBasicProjectParts.graphql.swift; sourceTree = ""; }; - 2D95FE36D2667E070345CDD0 /* NftActivityType.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivityType.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/NftActivityType.graphql.swift; sourceTree = ""; }; - 2E49E724432C70A2551FB2C7 /* SchemaConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchemaConfiguration.swift; path = WidgetsCore/MobileSchema/Schema/SchemaConfiguration.swift; sourceTree = ""; }; + 22F8093091A9E5FC0D6284BA /* SafetyLevel.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SafetyLevel.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/SafetyLevel.graphql.swift; sourceTree = ""; }; + 243576FAC8D2801F9D99ECC9 /* TopTokensQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TopTokensQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TopTokensQuery.graphql.swift; sourceTree = ""; }; + 2E8286984864AD69A0FAE3BC /* TokenBasicProjectParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBasicProjectParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBasicProjectParts.graphql.swift; sourceTree = ""; }; 2E8B7D36D2E14D9488F351EB /* Pods_Widgets.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Widgets.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 315B8A905FA2C60C053F138B /* OnRampTransactionsAuth.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnRampTransactionsAuth.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/OnRampTransactionsAuth.graphql.swift; sourceTree = ""; }; - 31ED613D63FE9C56D9270517 /* Image.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Image.graphql.swift; sourceTree = ""; }; - 32012AC135EBD991C8F02F92 /* TokenSortableField.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenSortableField.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TokenSortableField.graphql.swift; sourceTree = ""; }; - 3377F7BB38BD5A45AE31909D /* TokenBasicInfoParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBasicInfoParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBasicInfoParts.graphql.swift; sourceTree = ""; }; - 37038CCEB11E70E2027EF4EA /* NftCollectionEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollectionEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftCollectionEdge.graphql.swift; sourceTree = ""; }; - 396B6AB3BB41898B56EB3828 /* OffRampTransactionDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OffRampTransactionDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OffRampTransactionDetails.graphql.swift; sourceTree = ""; }; - 39F60B2B54796DC978765C99 /* AssetChange.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssetChange.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Unions/AssetChange.graphql.swift; sourceTree = ""; }; - 39FC2A13550FA6754EC1A7FC /* NftOrderConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftOrderConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftOrderConnection.graphql.swift; sourceTree = ""; }; + 2FB1590D18A58D37C750D9AC /* Token.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Token.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Token.graphql.swift; sourceTree = ""; }; + 310373063D8A11E9E02314FE /* NftAssetsFilterInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetsFilterInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftAssetsFilterInput.graphql.swift; sourceTree = ""; }; + 31CBA4397C44A04E218AEF28 /* TimestampedAmount.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TimestampedAmount.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TimestampedAmount.graphql.swift; sourceTree = ""; }; + 37376E4CF3A4B76E9DAE150C /* IAmount.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IAmount.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Interfaces/IAmount.graphql.swift; 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 = ""; }; - 3B9A505509D9A85BE1DB7D05 /* TokenProjectMarket.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectMarket.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenProjectMarket.graphql.swift; sourceTree = ""; }; - 3BF42F88002431BFDC9FCA9F /* HistoryDuration.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoryDuration.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/HistoryDuration.graphql.swift; sourceTree = ""; }; + 3B03A0A6AB0957A512A2D225 /* FavoriteTokenCardQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FavoriteTokenCardQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/FavoriteTokenCardQuery.graphql.swift; sourceTree = ""; }; 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 = ""; }; - 3F0EEAC1DADE827AE38EB8A6 /* FavoriteTokenCardQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FavoriteTokenCardQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/FavoriteTokenCardQuery.graphql.swift; sourceTree = ""; }; - 40E034582FBD2C374CEF808E /* ProtectionAttackType.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProtectionAttackType.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/ProtectionAttackType.graphql.swift; sourceTree = ""; }; - 41003491EF939043CF9D0F4E /* PortfolioValueModifier.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PortfolioValueModifier.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/PortfolioValueModifier.graphql.swift; sourceTree = ""; }; - 41BA2129FFE961C8549C8A30 /* NftBalancesFilterInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalancesFilterInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftBalancesFilterInput.graphql.swift; sourceTree = ""; }; - 43E2ECCEFBC3BE8D13BE6CAB /* NftActivityFilterInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivityFilterInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftActivityFilterInput.graphql.swift; sourceTree = ""; }; - 4429CA6DA254ECC24A65DA14 /* MultiplePortfolioBalancesQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultiplePortfolioBalancesQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/MultiplePortfolioBalancesQuery.graphql.swift; sourceTree = ""; }; + 3E5D1A04B42B25218C53C107 /* OnRampTransfer.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnRampTransfer.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OnRampTransfer.graphql.swift; sourceTree = ""; }; + 3EF9AEC00868BFD7CEBF202C /* BlockaidFees.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BlockaidFees.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/BlockaidFees.graphql.swift; sourceTree = ""; }; + 45FFF7DE2E8C2A6400362570 /* SilentPushEventEmitter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SilentPushEventEmitter.m; sourceTree = ""; }; + 45FFF7E02E8C2E6100362570 /* SilentPushEventEmitter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SilentPushEventEmitter.swift; 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 = ""; }; - 4981A14906A35E8A0B7F9457 /* TokenProject.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProject.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenProject.graphql.swift; sourceTree = ""; }; - 49BD6C776029FAF4FC711DE7 /* NftOrderEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftOrderEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftOrderEdge.graphql.swift; sourceTree = ""; }; - 4A8990A17F489F284E0DB1B3 /* Chain.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Chain.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/Chain.graphql.swift; sourceTree = ""; }; - 4ACFA5B4204741038C986C5D /* SafetyLevel.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SafetyLevel.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/SafetyLevel.graphql.swift; sourceTree = ""; }; - 4B308EC3DB7C3C1DD5DDE03D /* NftStandard.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftStandard.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/NftStandard.graphql.swift; sourceTree = ""; }; 4C445DB9798210862C34D0E0 /* Pods-WidgetsCoreTests.beta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetsCoreTests.beta.xcconfig"; path = "Target Support Files/Pods-WidgetsCoreTests/Pods-WidgetsCoreTests.beta.xcconfig"; sourceTree = ""; }; - 4DB4379B5E222207CA7328D0 /* NftActivityEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivityEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftActivityEdge.graphql.swift; sourceTree = ""; }; + 4DD55DFFC717D37DD960B82E /* NftBalanceEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalanceEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftBalanceEdge.graphql.swift; sourceTree = ""; }; 4DF5F26A06553EFDD4D99214 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Uniswap/ExpoModulesProvider.swift"; sourceTree = ""; }; - 4E32BBB65A6DD9CFF608C8E8 /* NftApproval.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftApproval.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftApproval.graphql.swift; sourceTree = ""; }; - 4E5FA43C5E31035775917C4E /* NftBalanceAssetInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalanceAssetInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftBalanceAssetInput.graphql.swift; sourceTree = ""; }; - 4F4F47D22B749A438B5BF674 /* NftCollectionMarket.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollectionMarket.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftCollectionMarket.graphql.swift; sourceTree = ""; }; - 54B1C71AED738D17898103A6 /* Dimensions.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Dimensions.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Dimensions.graphql.swift; sourceTree = ""; }; - 556339705BD103365D4ED07B /* NftAssetTraitInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetTraitInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftAssetTraitInput.graphql.swift; sourceTree = ""; }; - 5640432978873FB030467750 /* TopTokenParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TopTokenParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TopTokenParts.graphql.swift; sourceTree = ""; }; + 50C3E075E850CEC1714BE52C /* NftActivityFilterInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivityFilterInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftActivityFilterInput.graphql.swift; sourceTree = ""; }; + 51F133663B435829DE47E3CE /* TokenSortableField.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenSortableField.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TokenSortableField.graphql.swift; sourceTree = ""; }; + 522135E54BDB258B45B5A694 /* SchemaMetadata.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchemaMetadata.graphql.swift; path = WidgetsCore/MobileSchema/Schema/SchemaMetadata.graphql.swift; sourceTree = ""; }; + 5397E77A577E9952D2477020 /* Portfolio.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Portfolio.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Portfolio.graphql.swift; sourceTree = ""; }; + 53F4E5E9341BE66984935185 /* SwapOrderDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwapOrderDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/SwapOrderDetails.graphql.swift; sourceTree = ""; }; + 55081ADF188C967FC1ECD289 /* TokenMarketParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenMarketParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenMarketParts.graphql.swift; sourceTree = ""; }; + 55240C84512D3851C8B9F027 /* TransactionDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TransactionDetails.graphql.swift; sourceTree = ""; }; + 559CBC7F568C769C48E7C6F4 /* TransactionHistoryUpdaterQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionHistoryUpdaterQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TransactionHistoryUpdaterQuery.graphql.swift; sourceTree = ""; }; + 55A243177E9FA92A0524A222 /* NftContract.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftContract.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftContract.graphql.swift; sourceTree = ""; }; + 55C67E53A2C8AEB6AE92E33F /* NftActivity.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivity.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftActivity.graphql.swift; sourceTree = ""; }; 56FE9C9AF785221B7E3F4C04 /* Pods-Uniswap.dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Uniswap.dev.xcconfig"; path = "Target Support Files/Pods-Uniswap/Pods-Uniswap.dev.xcconfig"; sourceTree = ""; }; + 595699514939A2CE780AF0CF /* MultiplePortfolioBalancesQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultiplePortfolioBalancesQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/MultiplePortfolioBalancesQuery.graphql.swift; sourceTree = ""; }; + 5956ECBE73216D266D8D2E86 /* Query.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Query.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Query.graphql.swift; sourceTree = ""; }; + 59DD4D834D7B42A6D02F4F12 /* ApplicationContract.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ApplicationContract.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/ApplicationContract.graphql.swift; sourceTree = ""; }; + 5B0A1F5F6FC3E1141E228B7D /* TokenBalanceQuantityParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBalanceQuantityParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBalanceQuantityParts.graphql.swift; sourceTree = ""; }; 5B4398E82DD3B22C00F6BE08 /* PrivateKeyDisplayManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PrivateKeyDisplayManager.m; sourceTree = ""; }; 5B4398E92DD3B22C00F6BE08 /* PrivateKeyDisplayManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivateKeyDisplayManager.swift; sourceTree = ""; }; 5B4398EA2DD3B22C00F6BE08 /* PrivateKeyDisplayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivateKeyDisplayView.swift; sourceTree = ""; }; 5B4CEC5E2DD65DD4009F082B /* CopyIconOutline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopyIconOutline.swift; sourceTree = ""; }; - 5E0D68CC8D1F13D864F069BB /* IContract.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IContract.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Interfaces/IContract.graphql.swift; sourceTree = ""; }; + 5BED80DB034487FCA1450EDB /* OnRampServiceProvider.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnRampServiceProvider.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OnRampServiceProvider.graphql.swift; sourceTree = ""; }; + 5C9F3B31FC6AF8CE30CD7DA2 /* NftAsset.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAsset.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftAsset.graphql.swift; sourceTree = ""; }; 5E5E0A622D380F5700E166AA /* Env.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Env.swift; sourceTree = ""; }; 5EFB78352B1E585000E77EAC /* ConvertQuery.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConvertQuery.graphql.swift; sourceTree = ""; }; - 600250B00B6C02AAB063818B /* NftMarketplace.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftMarketplace.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/NftMarketplace.graphql.swift; sourceTree = ""; }; - 608B07304ED1387B5AEAA3BB /* ApplicationContract.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ApplicationContract.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/ApplicationContract.graphql.swift; sourceTree = ""; }; 62CEA9F2D5176D20A6402A3E /* Pods-Uniswap.beta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Uniswap.beta.xcconfig"; path = "Target Support Files/Pods-Uniswap/Pods-Uniswap.beta.xcconfig"; sourceTree = ""; }; - 63ACFF2A1D5AE3498731AC69 /* NftCollection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftCollection.graphql.swift; sourceTree = ""; }; - 647933A5DC35BDFEEF3620A1 /* Token.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Token.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Token.graphql.swift; sourceTree = ""; }; + 62DDC1F42E7172783EAF3776 /* NftBalanceConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalanceConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftBalanceConnection.graphql.swift; sourceTree = ""; }; 649A7A762D9AE70B00B53589 /* KeychainConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainConstants.swift; sourceTree = ""; }; 649A7A772D9AE70B00B53589 /* KeychainUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainUtils.swift; sourceTree = ""; }; - 69F2FFD11FB5E462CC454A15 /* TransactionType.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionType.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TransactionType.graphql.swift; sourceTree = ""; }; - 6A84A192F750A0F1BC8D7A69 /* OnRampServiceProvider.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnRampServiceProvider.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OnRampServiceProvider.graphql.swift; sourceTree = ""; }; + 64D494D944670E557175A694 /* TransactionDirection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionDirection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TransactionDirection.graphql.swift; sourceTree = ""; }; + 65AD13BFAD4EBA18AA6205E3 /* TokenBalanceParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBalanceParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBalanceParts.graphql.swift; sourceTree = ""; }; + 67C0D95F7EA9E7ACA9B18692 /* NftOrder.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftOrder.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftOrder.graphql.swift; sourceTree = ""; }; + 696F6C5220D0072E380E198F /* NftBalanceAssetInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalanceAssetInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftBalanceAssetInput.graphql.swift; sourceTree = ""; }; 6BC7D07B2B5FF02400617C95 /* ScantasticEncryption.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScantasticEncryption.m; sourceTree = ""; }; 6BC7D07C2B5FF02400617C95 /* ScantasticEncryption.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScantasticEncryption.swift; sourceTree = ""; }; 6BC7D07D2B5FF02400617C95 /* EncryptionUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EncryptionUtils.swift; sourceTree = ""; }; @@ -669,26 +667,26 @@ 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 = ""; }; - 6DF7C8888BE6AFA2F22889FE /* NftAssetEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftAssetEdge.graphql.swift; sourceTree = ""; }; - 6E3A78386B3B779B688021FF /* NftOrder.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftOrder.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftOrder.graphql.swift; sourceTree = ""; }; + 6D4C849A7805FCCEE8C8C3E6 /* AssetChange.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssetChange.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Unions/AssetChange.graphql.swift; sourceTree = ""; }; + 6E4DEE7FC8D7BCD030CFA4D3 /* ConvertQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConvertQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/ConvertQuery.graphql.swift; sourceTree = ""; }; + 6F0A91F56B1CA2E71B479BAD /* WidgetTokensQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WidgetTokensQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/WidgetTokensQuery.graphql.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 = ""; }; - 6FF8B660E9C2C0D8DDF7588A /* TokenProjectDescriptionQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectDescriptionQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenProjectDescriptionQuery.graphql.swift; sourceTree = ""; }; - 70851E3D1A4B296A1CE22A20 /* NftAssetTrait.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetTrait.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftAssetTrait.graphql.swift; sourceTree = ""; }; - 730CA356D6E1D498CC0C1472 /* NftsTabQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftsTabQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/NftsTabQuery.graphql.swift; sourceTree = ""; }; - 74885865ED8CFEA875E40916 /* TokenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenQuery.graphql.swift; sourceTree = ""; }; + 74AD16E33DC518A42C386FE2 /* NftTransfer.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftTransfer.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftTransfer.graphql.swift; sourceTree = ""; }; + 764C4757EB194D13A8857DFA /* Dimensions.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Dimensions.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Dimensions.graphql.swift; sourceTree = ""; }; 7A7637BBC9B3A68E0338D96E /* Pods-WidgetIntentExtension.beta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetIntentExtension.beta.xcconfig"; path = "Target Support Files/Pods-WidgetIntentExtension/Pods-WidgetIntentExtension.beta.xcconfig"; sourceTree = ""; }; - 7BD3F0794908635CDFA7DAB6 /* ConvertQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConvertQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/ConvertQuery.graphql.swift; sourceTree = ""; }; - 7E1F288B7EDDE906C4C00C46 /* DescriptionTranslations.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DescriptionTranslations.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/DescriptionTranslations.graphql.swift; sourceTree = ""; }; + 7AFDF569E43F173C2F5A07AF /* SwapOrderType.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwapOrderType.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/SwapOrderType.graphql.swift; sourceTree = ""; }; + 7DBCFBC330BF97BA2F630908 /* Chain.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Chain.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/Chain.graphql.swift; sourceTree = ""; }; 82C9871585F60F92D079FB95 /* Pods-Widgets.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Widgets.release.xcconfig"; path = "Target Support Files/Pods-Widgets/Pods-Widgets.release.xcconfig"; sourceTree = ""; }; - 84997376A0B436ECC0A996C5 /* ExploreSearchQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExploreSearchQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/ExploreSearchQuery.graphql.swift; sourceTree = ""; }; + 835D9DF76533D22EDF0E9D67 /* TokenProtectionInfoParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProtectionInfoParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenProtectionInfoParts.graphql.swift; sourceTree = ""; }; + 83FB27D93A9468E6DB47231C /* NftMarketplace.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftMarketplace.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/NftMarketplace.graphql.swift; sourceTree = ""; }; + 85B43D489CC5ACF1EA34E9EB /* NftAssetTrait.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetTrait.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftAssetTrait.graphql.swift; sourceTree = ""; }; 8719E5872CC41AB64503E903 /* Pods-WidgetIntentExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetIntentExtension.debug.xcconfig"; path = "Target Support Files/Pods-WidgetIntentExtension/Pods-WidgetIntentExtension.debug.xcconfig"; sourceTree = ""; }; - 8A4EB7BAD2C90E61FD6C30AF /* ActivityDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ActivityDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Unions/ActivityDetails.graphql.swift; sourceTree = ""; }; - 8A5342DEF1410E0E81E97F40 /* SearchTokensQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchTokensQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/SearchTokensQuery.graphql.swift; sourceTree = ""; }; - 8B477EBEA1EDA3914C77E8A6 /* NftAssetsFilterInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetsFilterInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftAssetsFilterInput.graphql.swift; sourceTree = ""; }; - 8BEADEB4AE05B860CF2232D1 /* NetworkFee.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkFee.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NetworkFee.graphql.swift; sourceTree = ""; }; - 8DA4E7C052A6C4AC3A9DCDA6 /* TokenTransfer.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenTransfer.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenTransfer.graphql.swift; sourceTree = ""; }; + 87442A651C068E552BEA89C6 /* MobileSchema.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MobileSchema.graphql.swift; path = WidgetsCore/MobileSchema/MobileSchema.graphql.swift; sourceTree = ""; }; + 87CF9B03AE29A19C5B0F4E35 /* OnRampTransactionDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnRampTransactionDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OnRampTransactionDetails.graphql.swift; sourceTree = ""; }; + 8856DFFC7FDC9BF105B0B4E3 /* TokenProject.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProject.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenProject.graphql.swift; sourceTree = ""; }; + 8C9047B981FA322A727947F7 /* Image.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Image.graphql.swift; sourceTree = ""; }; 8E89C3A62AB8AAA400C84DE5 /* MnemonicConfirmationView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MnemonicConfirmationView.swift; sourceTree = ""; }; 8E89C3A72AB8AAA400C84DE5 /* MnemonicDisplayView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MnemonicDisplayView.swift; sourceTree = ""; }; 8E89C3A92AB8AAA400C84DE5 /* MnemonicConfirmationWordBankView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MnemonicConfirmationWordBankView.swift; sourceTree = ""; }; @@ -719,11 +717,14 @@ 91D5016E2CDBEAE700B09B7F /* TopTokenParts.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TopTokenParts.graphql.swift; sourceTree = ""; }; 91D5016F2CDBEAE700B09B7F /* TokenFeeDataParts.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TokenFeeDataParts.graphql.swift; sourceTree = ""; }; 91D5017C2CDBEAF600B09B7F /* HomeScreenTokenParts.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeScreenTokenParts.graphql.swift; sourceTree = ""; }; - 92DE390311705FF1EE65C0E6 /* NftCollectionConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollectionConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftCollectionConnection.graphql.swift; sourceTree = ""; }; - 985DDC8324B872DD44E87781 /* PortfolioBalancesQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PortfolioBalancesQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/PortfolioBalancesQuery.graphql.swift; sourceTree = ""; }; - 98F596250F55A3D6E9E1F499 /* TokenParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenParts.graphql.swift; sourceTree = ""; }; - 9DFBD29C0BDFDB4464B8189C /* TokenPriceHistoryQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenPriceHistoryQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenPriceHistoryQuery.graphql.swift; sourceTree = ""; }; - 9E975BEDBED5FE51D0DC6E96 /* TokenApproval.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenApproval.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenApproval.graphql.swift; sourceTree = ""; }; + 945EF0A3BD6F19DA14E40AE1 /* TransactionStatus.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionStatus.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TransactionStatus.graphql.swift; sourceTree = ""; }; + 95283AC560844B50E95934E4 /* TransactionListQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionListQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TransactionListQuery.graphql.swift; sourceTree = ""; }; + 957A35D2DE7A140BA198A0F1 /* TokenDetailsScreenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenDetailsScreenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenDetailsScreenQuery.graphql.swift; sourceTree = ""; }; + 9602E2A290179F8741EDD35A /* TokenPriceHistoryQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenPriceHistoryQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenPriceHistoryQuery.graphql.swift; sourceTree = ""; }; + 97FBBE677B56FFE07052EF1D /* PageInfo.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PageInfo.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/PageInfo.graphql.swift; sourceTree = ""; }; + 98F489175099FE697721272D /* NftOrderConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftOrderConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftOrderConnection.graphql.swift; sourceTree = ""; }; + 9BEBBC668E69EE3A1FC6AB05 /* TokenTransfer.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenTransfer.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenTransfer.graphql.swift; sourceTree = ""; }; + 9EFADDBB38BB9261933C1349 /* FeedTransactionListQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FeedTransactionListQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/FeedTransactionListQuery.graphql.swift; sourceTree = ""; }; 9F00A4392B33894C0088A0D0 /* ApplicationContract.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApplicationContract.graphql.swift; sourceTree = ""; }; 9F29D4EC2B47126D004D003A /* NftBalanceAssetInput.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NftBalanceAssetInput.graphql.swift; sourceTree = ""; }; 9F3500812A8AA5890077BFC5 /* EXSplashScreen.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = EXSplashScreen.xcframework; path = "../../../node_modules/expo-splash-screen/ios/EXSplashScreen.xcframework"; sourceTree = ""; }; @@ -740,71 +741,73 @@ 9FEC9B8A2A858CF1003CD019 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Uniswap/AppDelegate.m; sourceTree = ""; }; A32F9FBC272343C8002CFCDB /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; A3F0A5B0272B1DFA00895B25 /* KeychainSwiftDistrib.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainSwiftDistrib.swift; sourceTree = ""; }; - A4E0C448C5D45BF1071FA458 /* MobileSchema.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MobileSchema.graphql.swift; path = WidgetsCore/MobileSchema/MobileSchema.graphql.swift; sourceTree = ""; }; A70E4DD32C25DA0A002D6D86 /* NetworkFee.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NetworkFee.graphql.swift; path = MobileSchema/Schema/Objects/NetworkFee.graphql.swift; sourceTree = ""; }; A70E4DD52C260416002D6D86 /* SwapOrderType.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwapOrderType.graphql.swift; path = MobileSchema/Schema/Enums/SwapOrderType.graphql.swift; sourceTree = ""; }; A70E4DD62C260416002D6D86 /* SwapOrderStatus.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwapOrderStatus.graphql.swift; path = MobileSchema/Schema/Enums/SwapOrderStatus.graphql.swift; sourceTree = ""; }; - A7A33933670CCAD9E62A1A80 /* TokenDetailsScreenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenDetailsScreenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenDetailsScreenQuery.graphql.swift; sourceTree = ""; }; A7B8EFCA2BF68F0D00CA4A1C /* FeeData.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeeData.graphql.swift; path = MobileSchema/Schema/Objects/FeeData.graphql.swift; sourceTree = ""; }; 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 = ""; }; - A9030AC59702756C39396FFE /* NftsQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftsQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/NftsQuery.graphql.swift; sourceTree = ""; }; - ABE51731EB853137302A7B0D /* TransactionDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TransactionDetails.graphql.swift; sourceTree = ""; }; + A98CEFE7189D63880FD5A702 /* TokenProjectsQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectsQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenProjectsQuery.graphql.swift; sourceTree = ""; }; + AAB6B8C64F7525D0D0E978C6 /* ProtectionResult.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProtectionResult.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/ProtectionResult.graphql.swift; sourceTree = ""; }; + AB772B265A35BFBC3A7761AD /* HomeScreenTokenParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HomeScreenTokenParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/HomeScreenTokenParts.graphql.swift; 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 = ""; }; AC2EF4022C914B1600EEEFDB /* fonts */ = {isa = PBXFileReference; lastKnownFileType = folder; name = fonts; path = ../src/assets/fonts; sourceTree = ""; }; - AF3D7A923E5E1FB504E1F64D /* TransactionHistoryUpdaterQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionHistoryUpdaterQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TransactionHistoryUpdaterQuery.graphql.swift; sourceTree = ""; }; - B033206DC974BCB6AF8CC613 /* SelectWalletScreenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SelectWalletScreenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/SelectWalletScreenQuery.graphql.swift; sourceTree = ""; }; + AD452B34344D670BA23EA331 /* TokenBalanceMainParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBalanceMainParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBalanceMainParts.graphql.swift; sourceTree = ""; }; + AD86EFAA0D6B8FBECCC4828B /* NftAssetConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftAssetConnection.graphql.swift; sourceTree = ""; }; + AE2A9FBFB7F718246B668A60 /* NftProfile.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftProfile.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftProfile.graphql.swift; sourceTree = ""; }; + AED050A208757F137DBDA57D /* ContractInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContractInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/ContractInput.graphql.swift; 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 = ""; }; - B0DB67D6C438F623976727E9 /* TimestampedAmount.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TimestampedAmount.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TimestampedAmount.graphql.swift; sourceTree = ""; }; - B3C3F0403FAEFDD632AC6CCE /* TokensQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokensQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokensQuery.graphql.swift; sourceTree = ""; }; - B7E03AA02B39A7A90C96AA76 /* HomeScreenTokensQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HomeScreenTokensQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/HomeScreenTokensQuery.graphql.swift; sourceTree = ""; }; + B25620D6E0E297C56198F190 /* NftCollection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftCollection.graphql.swift; sourceTree = ""; }; + B3CC3D9DE64A39897BA580B3 /* OnRampTransactionsAuth.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnRampTransactionsAuth.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/OnRampTransactionsAuth.graphql.swift; sourceTree = ""; }; + B3F4D5E8B9ED6E0FE29EA779 /* ProtectionAttackType.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProtectionAttackType.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/ProtectionAttackType.graphql.swift; sourceTree = ""; }; + B5C2E70E43A02405C5CEAD7C /* TokenProjectMarketsParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectMarketsParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenProjectMarketsParts.graphql.swift; sourceTree = ""; }; + BA3BCD49511DE84892B34ED0 /* NftsTabQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftsTabQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/NftsTabQuery.graphql.swift; sourceTree = ""; }; BA869E362D56B0B600D7A718 /* WidgetTokensQuery.graphql.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetTokensQuery.graphql.swift; sourceTree = ""; }; + BB76D1207400E308430A837F /* TokenParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenParts.graphql.swift; sourceTree = ""; }; 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 = ""; }; - BD0FC2D534CB82B151C7F9B7 /* ProtectionResult.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProtectionResult.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/ProtectionResult.graphql.swift; sourceTree = ""; }; - BD35300F81746B2D4A23065A /* BlockaidFees.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BlockaidFees.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/BlockaidFees.graphql.swift; sourceTree = ""; }; BF9176E944C84910B1C0B057 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = Uniswap/SplashScreen.storyboard; sourceTree = ""; }; - BFC36D963A2A52D1E7CA77E4 /* TokenMarketParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenMarketParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenMarketParts.graphql.swift; sourceTree = ""; }; + BFFD4C1E5A4B30DE3CE02DB4 /* NftAssetEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftAssetEdge.graphql.swift; sourceTree = ""; }; + C0359DDEA2E2E17759FCC5CF /* SwapOrderStatus.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwapOrderStatus.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/SwapOrderStatus.graphql.swift; sourceTree = ""; }; C26D739993D5C939C6FBB58A /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Uniswap-UniswapTests/ExpoModulesProvider.swift"; sourceTree = ""; }; - C4790C2A43570CAC086B936E /* NftCollectionsFilterInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollectionsFilterInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftCollectionsFilterInput.graphql.swift; sourceTree = ""; }; - C65195A1CC9894C6341385C3 /* SchemaMetadata.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchemaMetadata.graphql.swift; path = WidgetsCore/MobileSchema/Schema/SchemaMetadata.graphql.swift; sourceTree = ""; }; + C4CA32B2B2997D73A0185635 /* OffRampTransactionDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OffRampTransactionDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OffRampTransactionDetails.graphql.swift; sourceTree = ""; }; C89238E3ED9F3AC98876B573 /* Pods-WidgetsCoreTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetsCoreTests.release.xcconfig"; path = "Target Support Files/Pods-WidgetsCoreTests/Pods-WidgetsCoreTests.release.xcconfig"; sourceTree = ""; }; - C955CE2592785712A11892DE /* SwapOrderDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwapOrderDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/SwapOrderDetails.graphql.swift; sourceTree = ""; }; - C9D5E6A07F404974045BD525 /* OffRampTransfer.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OffRampTransfer.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OffRampTransfer.graphql.swift; sourceTree = ""; }; + C8E5B09464C768590127BFA6 /* TokenMarket.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenMarket.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenMarket.graphql.swift; sourceTree = ""; }; + CA3BFDC64C5E0A058877A348 /* NftCollectionScreenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollectionScreenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/NftCollectionScreenQuery.graphql.swift; sourceTree = ""; }; + CAC62CDEEBE5712219A457C7 /* BridgedWithdrawalInfo.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BridgedWithdrawalInfo.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/BridgedWithdrawalInfo.graphql.swift; sourceTree = ""; }; CB29AC0C0907A833F23D2C30 /* Pods_WidgetsCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WidgetsCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CC055C3EDFDE2966FCA83C9E /* TokenProjectMarketsParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectMarketsParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenProjectMarketsParts.graphql.swift; sourceTree = ""; }; - CC2FBE9F353D3753FB94B8BF /* TransactionDirection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionDirection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TransactionDirection.graphql.swift; sourceTree = ""; }; - D20E9461A6C9C1CD6A24BEED /* Amount.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Amount.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Amount.graphql.swift; sourceTree = ""; }; - D574AB5194929038A54B4D4B /* SwapOrderStatus.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwapOrderStatus.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/SwapOrderStatus.graphql.swift; sourceTree = ""; }; + CBE0699A65BEEEE6E9A6B03F /* NftActivityConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivityConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftActivityConnection.graphql.swift; sourceTree = ""; }; + CD0CA37FB709C06F123EBF74 /* Currency.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Currency.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/Currency.graphql.swift; sourceTree = ""; }; + CF4115ACC8D8F0C7529AABA7 /* SchemaConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchemaConfiguration.swift; path = WidgetsCore/MobileSchema/Schema/SchemaConfiguration.swift; sourceTree = ""; }; + D13E592852F52B2855F05A5E /* TokenBasicInfoParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBasicInfoParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBasicInfoParts.graphql.swift; sourceTree = ""; }; + D34AC1057AD14362BB91E88B /* TokenStandard.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenStandard.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TokenStandard.graphql.swift; sourceTree = ""; }; + D4C8174A3A9EB3244AA844F4 /* TokensQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokensQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokensQuery.graphql.swift; sourceTree = ""; }; D79B717BEAEA7857469D770A /* Pods-Widgets.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Widgets.debug.xcconfig"; path = "Target Support Files/Pods-Widgets/Pods-Widgets.debug.xcconfig"; sourceTree = ""; }; - DB35E518AD7FBFEBEA9CAB95 /* NftProfile.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftProfile.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftProfile.graphql.swift; sourceTree = ""; }; - DBA33683D2BA6BBE3251D67C /* WidgetTokensQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WidgetTokensQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/WidgetTokensQuery.graphql.swift; sourceTree = ""; }; - E4624A41EC1468712BD77653 /* AssetActivity.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssetActivity.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/AssetActivity.graphql.swift; sourceTree = ""; }; - E475EBABF7EA310435E2F19C /* PageInfo.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PageInfo.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/PageInfo.graphql.swift; sourceTree = ""; }; - E63EA0C75D8011BCC182492C /* AmountChange.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AmountChange.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/AmountChange.graphql.swift; sourceTree = ""; }; - E8A49D011C60137D4034CAC4 /* TokenProjectsQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectsQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenProjectsQuery.graphql.swift; sourceTree = ""; }; - EBD833F6580F9B82A68D4A98 /* TokenMarket.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenMarket.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenMarket.graphql.swift; sourceTree = ""; }; - ED157D3DB73302C8A1B9522E /* Query.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Query.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Query.graphql.swift; sourceTree = ""; }; + D91432EF6C35F5A6301340A2 /* DescriptionTranslations.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DescriptionTranslations.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/DescriptionTranslations.graphql.swift; sourceTree = ""; }; + DB2B02717B1A87BD41920151 /* NftBalance.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalance.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftBalance.graphql.swift; sourceTree = ""; }; + DD111A711D83D1D82E4025A9 /* NftApproval.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftApproval.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftApproval.graphql.swift; sourceTree = ""; }; + DD12FD368B3A96F323444D8E /* ProtectionInfo.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProtectionInfo.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/ProtectionInfo.graphql.swift; sourceTree = ""; }; + DD56CBC543897BE8E37CC2C1 /* TokenApproval.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenApproval.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenApproval.graphql.swift; sourceTree = ""; }; + DE735ED4766E65C0D6808F9A /* NftsQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftsQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/NftsQuery.graphql.swift; sourceTree = ""; }; + E09D12605BAA868AB51573BE /* PortfolioValueModifier.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PortfolioValueModifier.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/PortfolioValueModifier.graphql.swift; sourceTree = ""; }; + E0A53C3A09AD259B9A8EDBDD /* PortfolioBalancesQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PortfolioBalancesQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/PortfolioBalancesQuery.graphql.swift; sourceTree = ""; }; + EB9CACD175D6C20B6D4707C8 /* SelectWalletScreenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SelectWalletScreenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/SelectWalletScreenQuery.graphql.swift; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; - EE0973BB445AAD8FAA25757F /* NftCollectionScreenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollectionScreenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/NftCollectionScreenQuery.graphql.swift; sourceTree = ""; }; - F0C34E94906CB9F0A016D566 /* TokenBalanceParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBalanceParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBalanceParts.graphql.swift; sourceTree = ""; }; - F1A24D364C0D262A14BB7182 /* NftActivity.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivity.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftActivity.graphql.swift; sourceTree = ""; }; F1A3F4DDD7E40DA9E4BBAAD1 /* Pods-Uniswap-UniswapTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Uniswap-UniswapTests.release.xcconfig"; path = "Target Support Files/Pods-Uniswap-UniswapTests/Pods-Uniswap-UniswapTests.release.xcconfig"; sourceTree = ""; }; - F2932B486DD7070DF226A27B /* NftAsset.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAsset.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftAsset.graphql.swift; sourceTree = ""; }; - F3317EBD4E3B11E2F2A1CE58 /* NftTransfer.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftTransfer.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftTransfer.graphql.swift; sourceTree = ""; }; + F286C514E849B29F5235310A /* NftCollectionMarket.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollectionMarket.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftCollectionMarket.graphql.swift; sourceTree = ""; }; F35AFD3627EE49230011A725 /* Uniswap.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = Uniswap.entitlements; path = Uniswap/Uniswap.entitlements; sourceTree = ""; }; F35AFD3B27EE49990011A725 /* OneSignalNotificationServiceExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = OneSignalNotificationServiceExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; F35AFD3D27EE49990011A725 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; F35AFD3F27EE49990011A725 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; F35AFD4727EE4B400011A725 /* OneSignalNotificationServiceExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = OneSignalNotificationServiceExtension.entitlements; sourceTree = ""; }; - F4B149117182C6CC58DD570C /* TokenBalance.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBalance.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenBalance.graphql.swift; sourceTree = ""; }; + F4C3461E088654B80ABE3DE7 /* Amount.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Amount.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Amount.graphql.swift; sourceTree = ""; }; F56CC08FBB20FAC0DF6B93DA /* Pods-OneSignalNotificationServiceExtension.beta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OneSignalNotificationServiceExtension.beta.xcconfig"; path = "Target Support Files/Pods-OneSignalNotificationServiceExtension/Pods-OneSignalNotificationServiceExtension.beta.xcconfig"; sourceTree = ""; }; - F5BCBB5D46312050E4A5BD64 /* NftApproveForAll.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftApproveForAll.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftApproveForAll.graphql.swift; sourceTree = ""; }; - F7B3C6DF5DED22E892851B10 /* ContractInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContractInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/ContractInput.graphql.swift; sourceTree = ""; }; - F912AB9AB67808B740246798 /* NftActivityConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivityConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftActivityConnection.graphql.swift; sourceTree = ""; }; - FC419570F5A025E80AB10A72 /* TokenStandard.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenStandard.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TokenStandard.graphql.swift; sourceTree = ""; }; + F70593F94C8B315F5304B9BE /* NftCollectionEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollectionEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftCollectionEdge.graphql.swift; sourceTree = ""; }; + FD158681F2E84A5E49656B11 /* NftOrderEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftOrderEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftOrderEdge.graphql.swift; sourceTree = ""; }; FD54D51C296C79A4007A37E9 /* GoogleServiceInfo */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = GoogleServiceInfo; sourceTree = SOURCE_ROOT; }; FD7304CD28A364FC0085BDEA /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Colors.xcassets; path = Uniswap/Colors.xcassets; sourceTree = ""; }; FD7304CF28A3650A0085BDEA /* Colors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Colors.swift; path = Uniswap/Colors.swift; sourceTree = ""; }; + FEE1CB436B299B0349BA9957 /* FeeData.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FeeData.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/FeeData.graphql.swift; sourceTree = ""; }; + FF1B893C0275DAAA156B0108 /* NftApproveForAll.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftApproveForAll.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftApproveForAll.graphql.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1206,6 +1209,7 @@ F35AFD3627EE49230011A725 /* Uniswap.entitlements */, 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 9FEC9B8A2A858CF1003CD019 /* AppDelegate.m */, + 45FFF7DD2E8C2A3A00362570 /* Notifications */, 6C84F055283D83CF0071FA2E /* Onboarding */, 6CE631B928186D4500716D29 /* WalletConnect */, A32F9FBC272343C8002CFCDB /* GoogleService-Info.plist */, @@ -1221,6 +1225,25 @@ name = Uniswap; sourceTree = ""; }; + 157C3B73F4388F6F1274463F /* Operations */ = { + isa = PBXGroup; + children = ( + 5AF8BB7C2143FF285A912E6A /* Queries */, + ); + name = Operations; + sourceTree = ""; + }; + 281687A9A85A9EF49839548D /* MobileSchema */ = { + isa = PBXGroup; + children = ( + 87442A651C068E552BEA89C6 /* MobileSchema.graphql.swift */, + 308DDBB1BED0BB4E93F1AD8C /* Fragments */, + 157C3B73F4388F6F1274463F /* Operations */, + 4C36556DE2985BABC27C13AD /* Schema */, + ); + name = MobileSchema; + sourceTree = ""; + }; 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { isa = PBXGroup; children = ( @@ -1240,6 +1263,36 @@ name = Frameworks; sourceTree = ""; }; + 308DDBB1BED0BB4E93F1AD8C /* Fragments */ = { + isa = PBXGroup; + children = ( + AB772B265A35BFBC3A7761AD /* HomeScreenTokenParts.graphql.swift */, + AD452B34344D670BA23EA331 /* TokenBalanceMainParts.graphql.swift */, + 65AD13BFAD4EBA18AA6205E3 /* TokenBalanceParts.graphql.swift */, + 5B0A1F5F6FC3E1141E228B7D /* TokenBalanceQuantityParts.graphql.swift */, + D13E592852F52B2855F05A5E /* TokenBasicInfoParts.graphql.swift */, + 2E8286984864AD69A0FAE3BC /* TokenBasicProjectParts.graphql.swift */, + 1166529407CA13E4D4F24F12 /* TokenFeeDataParts.graphql.swift */, + 55081ADF188C967FC1ECD289 /* TokenMarketParts.graphql.swift */, + BB76D1207400E308430A837F /* TokenParts.graphql.swift */, + B5C2E70E43A02405C5CEAD7C /* TokenProjectMarketsParts.graphql.swift */, + 190523DBBA423868C74FF80D /* TokenProjectUrlsParts.graphql.swift */, + 835D9DF76533D22EDF0E9D67 /* TokenProtectionInfoParts.graphql.swift */, + 07F0E504152E22110917353E /* TopTokenParts.graphql.swift */, + ); + name = Fragments; + sourceTree = ""; + }; + 45FFF7DD2E8C2A3A00362570 /* Notifications */ = { + isa = PBXGroup; + children = ( + 45FFF7E02E8C2E6100362570 /* SilentPushEventEmitter.swift */, + 45FFF7DE2E8C2A6400362570 /* SilentPushEventEmitter.m */, + ); + name = Notifications; + path = Uniswap/Notifications; + sourceTree = ""; + }; 47914D9EE3A4DE926EFC5089 /* UniswapTests */ = { isa = PBXGroup; children = ( @@ -1248,27 +1301,18 @@ name = UniswapTests; sourceTree = ""; }; - 4EEA950E66FC2881D331F823 /* Enums */ = { + 4C36556DE2985BABC27C13AD /* Schema */ = { isa = PBXGroup; children = ( - 4A8990A17F489F284E0DB1B3 /* Chain.graphql.swift */, - 25B4C7C7FEF32EAF10D030F9 /* Currency.graphql.swift */, - 3BF42F88002431BFDC9FCA9F /* HistoryDuration.graphql.swift */, - 2D95FE36D2667E070345CDD0 /* NftActivityType.graphql.swift */, - 600250B00B6C02AAB063818B /* NftMarketplace.graphql.swift */, - 4B308EC3DB7C3C1DD5DDE03D /* NftStandard.graphql.swift */, - 40E034582FBD2C374CEF808E /* ProtectionAttackType.graphql.swift */, - BD0FC2D534CB82B151C7F9B7 /* ProtectionResult.graphql.swift */, - 4ACFA5B4204741038C986C5D /* SafetyLevel.graphql.swift */, - D574AB5194929038A54B4D4B /* SwapOrderStatus.graphql.swift */, - 148617FD73F2CD7117960DBA /* SwapOrderType.graphql.swift */, - 32012AC135EBD991C8F02F92 /* TokenSortableField.graphql.swift */, - FC419570F5A025E80AB10A72 /* TokenStandard.graphql.swift */, - CC2FBE9F353D3753FB94B8BF /* TransactionDirection.graphql.swift */, - 2ABA47847A73130D356EB6BF /* TransactionStatus.graphql.swift */, - 69F2FFD11FB5E462CC454A15 /* TransactionType.graphql.swift */, + CF4115ACC8D8F0C7529AABA7 /* SchemaConfiguration.swift */, + 522135E54BDB258B45B5A694 /* SchemaMetadata.graphql.swift */, + F054FF4C0D351C1EAF0012D5 /* Enums */, + F498443CD9DA8803A092F3D9 /* InputObjects */, + C28876A002BC02672EE6A673 /* Interfaces */, + B83DA94147128EE9CC2DB246 /* Objects */, + 971EB6FCC042316AEFF90697 /* Unions */, ); - name = Enums; + name = Schema; sourceTree = ""; }; 5754C6A1B51170788A63F6F3 /* ExpoModulesProviders */ = { @@ -1283,11 +1327,39 @@ 5841D897B122046172ACD989 /* WidgetsCore */ = { isa = PBXGroup; children = ( - 8D57A3CBC005A567F7303961 /* MobileSchema */, + 281687A9A85A9EF49839548D /* MobileSchema */, ); name = WidgetsCore; sourceTree = ""; }; + 5AF8BB7C2143FF285A912E6A /* Queries */ = { + isa = PBXGroup; + children = ( + 6E4DEE7FC8D7BCD030CFA4D3 /* ConvertQuery.graphql.swift */, + 3B03A0A6AB0957A512A2D225 /* FavoriteTokenCardQuery.graphql.swift */, + 9EFADDBB38BB9261933C1349 /* FeedTransactionListQuery.graphql.swift */, + 0E7FF51A507BF788E64E3EFE /* HomeScreenTokensQuery.graphql.swift */, + 595699514939A2CE780AF0CF /* MultiplePortfolioBalancesQuery.graphql.swift */, + 03AB6B21A1BFB3A18982B47E /* NFTItemScreenQuery.graphql.swift */, + CA3BFDC64C5E0A058877A348 /* NftCollectionScreenQuery.graphql.swift */, + DE735ED4766E65C0D6808F9A /* NftsQuery.graphql.swift */, + BA3BCD49511DE84892B34ED0 /* NftsTabQuery.graphql.swift */, + E0A53C3A09AD259B9A8EDBDD /* PortfolioBalancesQuery.graphql.swift */, + EB9CACD175D6C20B6D4707C8 /* SelectWalletScreenQuery.graphql.swift */, + 957A35D2DE7A140BA198A0F1 /* TokenDetailsScreenQuery.graphql.swift */, + 9602E2A290179F8741EDD35A /* TokenPriceHistoryQuery.graphql.swift */, + 1276D33B06E840B8E6839F39 /* TokenProjectDescriptionQuery.graphql.swift */, + A98CEFE7189D63880FD5A702 /* TokenProjectsQuery.graphql.swift */, + 0914ECF70C274E2B064BCD42 /* TokenQuery.graphql.swift */, + D4C8174A3A9EB3244AA844F4 /* TokensQuery.graphql.swift */, + 243576FAC8D2801F9D99ECC9 /* TopTokensQuery.graphql.swift */, + 559CBC7F568C769C48E7C6F4 /* TransactionHistoryUpdaterQuery.graphql.swift */, + 95283AC560844B50E95934E4 /* TransactionListQuery.graphql.swift */, + 6F0A91F56B1CA2E71B479BAD /* WidgetTokensQuery.graphql.swift */, + ); + name = Queries; + sourceTree = ""; + }; 5B4398EB2DD3B22C00F6BE08 /* PrivateKeyDisplay */ = { isa = PBXGroup; children = ( @@ -1403,17 +1475,6 @@ name = Products; sourceTree = ""; }; - 8D57A3CBC005A567F7303961 /* MobileSchema */ = { - isa = PBXGroup; - children = ( - A4E0C448C5D45BF1071FA458 /* MobileSchema.graphql.swift */, - CA8FF4CDF9B448F7BE77CA07 /* Fragments */, - F79593090BE522E6D2A3330F /* Operations */, - 9723B33A3716C9068F5FD2B1 /* Schema */, - ); - name = MobileSchema; - sourceTree = ""; - }; 8E566D9F2AA1095000D4AA76 /* Components */ = { isa = PBXGroup; children = ( @@ -1462,18 +1523,13 @@ path = Uniswap/Icons; sourceTree = ""; }; - 9723B33A3716C9068F5FD2B1 /* Schema */ = { + 971EB6FCC042316AEFF90697 /* Unions */ = { isa = PBXGroup; children = ( - 2E49E724432C70A2551FB2C7 /* SchemaConfiguration.swift */, - C65195A1CC9894C6341385C3 /* SchemaMetadata.graphql.swift */, - 4EEA950E66FC2881D331F823 /* Enums */, - B741FF3580D33B5968CB9841 /* InputObjects */, - A60630E00A276B08BE85275D /* Interfaces */, - AB0BCF231B03A3F4E547DFF5 /* Objects */, - F23767E14A7943D5969AFDC1 /* Unions */, + 075E4C1DFAA00EE5B3CE792D /* ActivityDetails.graphql.swift */, + 6D4C849A7805FCCEE8C8C3E6 /* AssetChange.graphql.swift */, ); - name = Schema; + name = Unions; sourceTree = ""; }; 9759A762F61D6B2F01C79DBF /* Uniswap */ = { @@ -1484,87 +1540,72 @@ name = Uniswap; sourceTree = ""; }; - A60630E00A276B08BE85275D /* Interfaces */ = { - isa = PBXGroup; - children = ( - 03AD8C2B1226EBE1524F2573 /* IAmount.graphql.swift */, - 5E0D68CC8D1F13D864F069BB /* IContract.graphql.swift */, - ); - name = Interfaces; - sourceTree = ""; - }; - AB0BCF231B03A3F4E547DFF5 /* Objects */ = { + B83DA94147128EE9CC2DB246 /* Objects */ = { isa = PBXGroup; children = ( - D20E9461A6C9C1CD6A24BEED /* Amount.graphql.swift */, - E63EA0C75D8011BCC182492C /* AmountChange.graphql.swift */, - 608B07304ED1387B5AEAA3BB /* ApplicationContract.graphql.swift */, - E4624A41EC1468712BD77653 /* AssetActivity.graphql.swift */, - BD35300F81746B2D4A23065A /* BlockaidFees.graphql.swift */, - 7E1F288B7EDDE906C4C00C46 /* DescriptionTranslations.graphql.swift */, - 54B1C71AED738D17898103A6 /* Dimensions.graphql.swift */, - 17819A49DE69723EC60D9D72 /* FeeData.graphql.swift */, - 31ED613D63FE9C56D9270517 /* Image.graphql.swift */, - 8BEADEB4AE05B860CF2232D1 /* NetworkFee.graphql.swift */, - F1A24D364C0D262A14BB7182 /* NftActivity.graphql.swift */, - F912AB9AB67808B740246798 /* NftActivityConnection.graphql.swift */, - 4DB4379B5E222207CA7328D0 /* NftActivityEdge.graphql.swift */, - 4E32BBB65A6DD9CFF608C8E8 /* NftApproval.graphql.swift */, - F5BCBB5D46312050E4A5BD64 /* NftApproveForAll.graphql.swift */, - F2932B486DD7070DF226A27B /* NftAsset.graphql.swift */, - 218B8AB05C80D919671D3970 /* NftAssetConnection.graphql.swift */, - 6DF7C8888BE6AFA2F22889FE /* NftAssetEdge.graphql.swift */, - 70851E3D1A4B296A1CE22A20 /* NftAssetTrait.graphql.swift */, - 05BE2F49DD1FB9A692E21C13 /* NftBalance.graphql.swift */, - 1FC7B80EC0E0D2134B67575B /* NftBalanceConnection.graphql.swift */, - 0B132543F80E3C9191219E6D /* NftBalanceEdge.graphql.swift */, - 63ACFF2A1D5AE3498731AC69 /* NftCollection.graphql.swift */, - 92DE390311705FF1EE65C0E6 /* NftCollectionConnection.graphql.swift */, - 37038CCEB11E70E2027EF4EA /* NftCollectionEdge.graphql.swift */, - 4F4F47D22B749A438B5BF674 /* NftCollectionMarket.graphql.swift */, - 18B9EB43501127BE1B14F1A5 /* NftContract.graphql.swift */, - 6E3A78386B3B779B688021FF /* NftOrder.graphql.swift */, - 39FC2A13550FA6754EC1A7FC /* NftOrderConnection.graphql.swift */, - 49BD6C776029FAF4FC711DE7 /* NftOrderEdge.graphql.swift */, - DB35E518AD7FBFEBEA9CAB95 /* NftProfile.graphql.swift */, - F3317EBD4E3B11E2F2A1CE58 /* NftTransfer.graphql.swift */, - 396B6AB3BB41898B56EB3828 /* OffRampTransactionDetails.graphql.swift */, - C9D5E6A07F404974045BD525 /* OffRampTransfer.graphql.swift */, - 6A84A192F750A0F1BC8D7A69 /* OnRampServiceProvider.graphql.swift */, - 12D3AB6C2FC9513E9F224B7C /* OnRampTransactionDetails.graphql.swift */, - 2139ABF56EA067ED792A48C9 /* OnRampTransfer.graphql.swift */, - E475EBABF7EA310435E2F19C /* PageInfo.graphql.swift */, - 1849039FD4A210DA990363C8 /* Portfolio.graphql.swift */, - 0702203B17BDD858CED28F8B /* ProtectionInfo.graphql.swift */, - ED157D3DB73302C8A1B9522E /* Query.graphql.swift */, - C955CE2592785712A11892DE /* SwapOrderDetails.graphql.swift */, - B0DB67D6C438F623976727E9 /* TimestampedAmount.graphql.swift */, - 647933A5DC35BDFEEF3620A1 /* Token.graphql.swift */, - 9E975BEDBED5FE51D0DC6E96 /* TokenApproval.graphql.swift */, - F4B149117182C6CC58DD570C /* TokenBalance.graphql.swift */, - EBD833F6580F9B82A68D4A98 /* TokenMarket.graphql.swift */, - 4981A14906A35E8A0B7F9457 /* TokenProject.graphql.swift */, - 3B9A505509D9A85BE1DB7D05 /* TokenProjectMarket.graphql.swift */, - 8DA4E7C052A6C4AC3A9DCDA6 /* TokenTransfer.graphql.swift */, - ABE51731EB853137302A7B0D /* TransactionDetails.graphql.swift */, + F4C3461E088654B80ABE3DE7 /* Amount.graphql.swift */, + 066BBBD815CF2DE8803338BC /* AmountChange.graphql.swift */, + 59DD4D834D7B42A6D02F4F12 /* ApplicationContract.graphql.swift */, + 05C66C49AF2B78703FCE4C7C /* AssetActivity.graphql.swift */, + 3EF9AEC00868BFD7CEBF202C /* BlockaidFees.graphql.swift */, + CAC62CDEEBE5712219A457C7 /* BridgedWithdrawalInfo.graphql.swift */, + D91432EF6C35F5A6301340A2 /* DescriptionTranslations.graphql.swift */, + 764C4757EB194D13A8857DFA /* Dimensions.graphql.swift */, + FEE1CB436B299B0349BA9957 /* FeeData.graphql.swift */, + 8C9047B981FA322A727947F7 /* Image.graphql.swift */, + 09BE4B220A4F8465C3D01BA5 /* NetworkFee.graphql.swift */, + 55C67E53A2C8AEB6AE92E33F /* NftActivity.graphql.swift */, + CBE0699A65BEEEE6E9A6B03F /* NftActivityConnection.graphql.swift */, + 043C7D80D6722AFCF1715D07 /* NftActivityEdge.graphql.swift */, + DD111A711D83D1D82E4025A9 /* NftApproval.graphql.swift */, + FF1B893C0275DAAA156B0108 /* NftApproveForAll.graphql.swift */, + 5C9F3B31FC6AF8CE30CD7DA2 /* NftAsset.graphql.swift */, + AD86EFAA0D6B8FBECCC4828B /* NftAssetConnection.graphql.swift */, + BFFD4C1E5A4B30DE3CE02DB4 /* NftAssetEdge.graphql.swift */, + 85B43D489CC5ACF1EA34E9EB /* NftAssetTrait.graphql.swift */, + DB2B02717B1A87BD41920151 /* NftBalance.graphql.swift */, + 62DDC1F42E7172783EAF3776 /* NftBalanceConnection.graphql.swift */, + 4DD55DFFC717D37DD960B82E /* NftBalanceEdge.graphql.swift */, + B25620D6E0E297C56198F190 /* NftCollection.graphql.swift */, + 0D09FFE2B5E56CDCAB2F9455 /* NftCollectionConnection.graphql.swift */, + F70593F94C8B315F5304B9BE /* NftCollectionEdge.graphql.swift */, + F286C514E849B29F5235310A /* NftCollectionMarket.graphql.swift */, + 55A243177E9FA92A0524A222 /* NftContract.graphql.swift */, + 67C0D95F7EA9E7ACA9B18692 /* NftOrder.graphql.swift */, + 98F489175099FE697721272D /* NftOrderConnection.graphql.swift */, + FD158681F2E84A5E49656B11 /* NftOrderEdge.graphql.swift */, + AE2A9FBFB7F718246B668A60 /* NftProfile.graphql.swift */, + 74AD16E33DC518A42C386FE2 /* NftTransfer.graphql.swift */, + C4CA32B2B2997D73A0185635 /* OffRampTransactionDetails.graphql.swift */, + 166A9AE7203545C397E683E8 /* OffRampTransfer.graphql.swift */, + 5BED80DB034487FCA1450EDB /* OnRampServiceProvider.graphql.swift */, + 87CF9B03AE29A19C5B0F4E35 /* OnRampTransactionDetails.graphql.swift */, + 3E5D1A04B42B25218C53C107 /* OnRampTransfer.graphql.swift */, + 97FBBE677B56FFE07052EF1D /* PageInfo.graphql.swift */, + 5397E77A577E9952D2477020 /* Portfolio.graphql.swift */, + DD12FD368B3A96F323444D8E /* ProtectionInfo.graphql.swift */, + 5956ECBE73216D266D8D2E86 /* Query.graphql.swift */, + 53F4E5E9341BE66984935185 /* SwapOrderDetails.graphql.swift */, + 31CBA4397C44A04E218AEF28 /* TimestampedAmount.graphql.swift */, + 2FB1590D18A58D37C750D9AC /* Token.graphql.swift */, + DD56CBC543897BE8E37CC2C1 /* TokenApproval.graphql.swift */, + 181209B4CDE80BDC80891CFD /* TokenBalance.graphql.swift */, + C8E5B09464C768590127BFA6 /* TokenMarket.graphql.swift */, + 8856DFFC7FDC9BF105B0B4E3 /* TokenProject.graphql.swift */, + 0B0505DB30407C221B6A8491 /* TokenProjectMarket.graphql.swift */, + 9BEBBC668E69EE3A1FC6AB05 /* TokenTransfer.graphql.swift */, + 55240C84512D3851C8B9F027 /* TransactionDetails.graphql.swift */, ); name = Objects; sourceTree = ""; }; - B741FF3580D33B5968CB9841 /* InputObjects */ = { + C28876A002BC02672EE6A673 /* Interfaces */ = { isa = PBXGroup; children = ( - F7B3C6DF5DED22E892851B10 /* ContractInput.graphql.swift */, - 43E2ECCEFBC3BE8D13BE6CAB /* NftActivityFilterInput.graphql.swift */, - 556339705BD103365D4ED07B /* NftAssetTraitInput.graphql.swift */, - 8B477EBEA1EDA3914C77E8A6 /* NftAssetsFilterInput.graphql.swift */, - 4E5FA43C5E31035775917C4E /* NftBalanceAssetInput.graphql.swift */, - 41BA2129FFE961C8549C8A30 /* NftBalancesFilterInput.graphql.swift */, - C4790C2A43570CAC086B936E /* NftCollectionsFilterInput.graphql.swift */, - 315B8A905FA2C60C053F138B /* OnRampTransactionsAuth.graphql.swift */, - 41003491EF939043CF9D0F4E /* PortfolioValueModifier.graphql.swift */, + 37376E4CF3A4B76E9DAE150C /* IAmount.graphql.swift */, + 1D9189C818AFF8E988F861D0 /* IContract.graphql.swift */, ); - name = InputObjects; + name = Interfaces; sourceTree = ""; }; C2C18ECBEF5A4489BF3A314C /* Resources */ = { @@ -1577,56 +1618,6 @@ name = Resources; sourceTree = ""; }; - CA8FF4CDF9B448F7BE77CA07 /* Fragments */ = { - isa = PBXGroup; - children = ( - 27F8B915042BD8D67D9627EA /* HomeScreenTokenParts.graphql.swift */, - 137696908D703632CEE3AB28 /* TokenBalanceMainParts.graphql.swift */, - F0C34E94906CB9F0A016D566 /* TokenBalanceParts.graphql.swift */, - 2370BAD675DC8064C00AC037 /* TokenBalanceQuantityParts.graphql.swift */, - 3377F7BB38BD5A45AE31909D /* TokenBasicInfoParts.graphql.swift */, - 2C2F4BE3080D4129D4478528 /* TokenBasicProjectParts.graphql.swift */, - 018603D0FA4D05DBF16F1441 /* TokenFeeDataParts.graphql.swift */, - BFC36D963A2A52D1E7CA77E4 /* TokenMarketParts.graphql.swift */, - 98F596250F55A3D6E9E1F499 /* TokenParts.graphql.swift */, - CC055C3EDFDE2966FCA83C9E /* TokenProjectMarketsParts.graphql.swift */, - 236126979349098B98C70F27 /* TokenProjectUrlsParts.graphql.swift */, - 0BB4A40E30E1D985519DB3CF /* TokenProtectionInfoParts.graphql.swift */, - 5640432978873FB030467750 /* TopTokenParts.graphql.swift */, - ); - name = Fragments; - sourceTree = ""; - }; - D9DDAE0E99B4703AF96A81AB /* Queries */ = { - isa = PBXGroup; - children = ( - 7BD3F0794908635CDFA7DAB6 /* ConvertQuery.graphql.swift */, - 84997376A0B436ECC0A996C5 /* ExploreSearchQuery.graphql.swift */, - 3F0EEAC1DADE827AE38EB8A6 /* FavoriteTokenCardQuery.graphql.swift */, - 2BA0ACE5B9B2C41187CD41F3 /* FeedTransactionListQuery.graphql.swift */, - B7E03AA02B39A7A90C96AA76 /* HomeScreenTokensQuery.graphql.swift */, - 4429CA6DA254ECC24A65DA14 /* MultiplePortfolioBalancesQuery.graphql.swift */, - 207F4DF7664454C31DE069F8 /* NFTItemScreenQuery.graphql.swift */, - EE0973BB445AAD8FAA25757F /* NftCollectionScreenQuery.graphql.swift */, - A9030AC59702756C39396FFE /* NftsQuery.graphql.swift */, - 730CA356D6E1D498CC0C1472 /* NftsTabQuery.graphql.swift */, - 985DDC8324B872DD44E87781 /* PortfolioBalancesQuery.graphql.swift */, - 8A5342DEF1410E0E81E97F40 /* SearchTokensQuery.graphql.swift */, - B033206DC974BCB6AF8CC613 /* SelectWalletScreenQuery.graphql.swift */, - A7A33933670CCAD9E62A1A80 /* TokenDetailsScreenQuery.graphql.swift */, - 9DFBD29C0BDFDB4464B8189C /* TokenPriceHistoryQuery.graphql.swift */, - 6FF8B660E9C2C0D8DDF7588A /* TokenProjectDescriptionQuery.graphql.swift */, - E8A49D011C60137D4034CAC4 /* TokenProjectsQuery.graphql.swift */, - 74885865ED8CFEA875E40916 /* TokenQuery.graphql.swift */, - B3C3F0403FAEFDD632AC6CCE /* TokensQuery.graphql.swift */, - 04E5C2900254E7BA7F10CE51 /* TopTokensQuery.graphql.swift */, - AF3D7A923E5E1FB504E1F64D /* TransactionHistoryUpdaterQuery.graphql.swift */, - 224CA82F1871016F4173F69E /* TransactionListQuery.graphql.swift */, - DBA33683D2BA6BBE3251D67C /* WidgetTokensQuery.graphql.swift */, - ); - name = Queries; - sourceTree = ""; - }; E233CBF5F47BEE60B243DCF8 /* Pods */ = { isa = PBXGroup; children = ( @@ -1662,13 +1653,27 @@ path = Pods; sourceTree = ""; }; - F23767E14A7943D5969AFDC1 /* Unions */ = { + F054FF4C0D351C1EAF0012D5 /* Enums */ = { isa = PBXGroup; children = ( - 8A4EB7BAD2C90E61FD6C30AF /* ActivityDetails.graphql.swift */, - 39F60B2B54796DC978765C99 /* AssetChange.graphql.swift */, + 7DBCFBC330BF97BA2F630908 /* Chain.graphql.swift */, + CD0CA37FB709C06F123EBF74 /* Currency.graphql.swift */, + 1053483279043EED7612BE90 /* HistoryDuration.graphql.swift */, + 1CDAC035887C3908C3BD1A77 /* NftActivityType.graphql.swift */, + 83FB27D93A9468E6DB47231C /* NftMarketplace.graphql.swift */, + 0373C61A7AF015058A502CE2 /* NftStandard.graphql.swift */, + B3F4D5E8B9ED6E0FE29EA779 /* ProtectionAttackType.graphql.swift */, + AAB6B8C64F7525D0D0E978C6 /* ProtectionResult.graphql.swift */, + 22F8093091A9E5FC0D6284BA /* SafetyLevel.graphql.swift */, + C0359DDEA2E2E17759FCC5CF /* SwapOrderStatus.graphql.swift */, + 7AFDF569E43F173C2F5A07AF /* SwapOrderType.graphql.swift */, + 51F133663B435829DE47E3CE /* TokenSortableField.graphql.swift */, + D34AC1057AD14362BB91E88B /* TokenStandard.graphql.swift */, + 64D494D944670E557175A694 /* TransactionDirection.graphql.swift */, + 945EF0A3BD6F19DA14E40AE1 /* TransactionStatus.graphql.swift */, + 18D48B25E03122149B0D1304 /* TransactionType.graphql.swift */, ); - name = Unions; + name = Enums; sourceTree = ""; }; F35AFD3C27EE49990011A725 /* OneSignalNotificationServiceExtension */ = { @@ -1682,12 +1687,19 @@ path = OneSignalNotificationServiceExtension; sourceTree = ""; }; - F79593090BE522E6D2A3330F /* Operations */ = { + F498443CD9DA8803A092F3D9 /* InputObjects */ = { isa = PBXGroup; children = ( - D9DDAE0E99B4703AF96A81AB /* Queries */, + AED050A208757F137DBDA57D /* ContractInput.graphql.swift */, + 50C3E075E850CEC1714BE52C /* NftActivityFilterInput.graphql.swift */, + 1F1731869775D16A9EAB475C /* NftAssetTraitInput.graphql.swift */, + 310373063D8A11E9E02314FE /* NftAssetsFilterInput.graphql.swift */, + 696F6C5220D0072E380E198F /* NftBalanceAssetInput.graphql.swift */, + 1810C60B56CC74150C868801 /* NftBalancesFilterInput.graphql.swift */, + B3CC3D9DE64A39897BA580B3 /* OnRampTransactionsAuth.graphql.swift */, + E09D12605BAA868AB51573BE /* PortfolioValueModifier.graphql.swift */, ); - name = Operations; + name = InputObjects; sourceTree = ""; }; /* End PBXGroup section */ @@ -2149,6 +2161,7 @@ "$(SRCROOT)/WidgetsCore/MobileSchema/Schema/Objects/ApplicationContract.graphql.swift", "$(SRCROOT)/WidgetsCore/MobileSchema/Schema/Objects/AssetActivity.graphql.swift", "$(SRCROOT)/WidgetsCore/MobileSchema/Schema/Objects/BlockaidFees.graphql.swift", + "$(SRCROOT)/WidgetsCore/MobileSchema/Schema/Objects/BridgedWithdrawalInfo.graphql.swift", "$(SRCROOT)/WidgetsCore/MobileSchema/Schema/Objects/DescriptionTranslations.graphql.swift", "$(SRCROOT)/WidgetsCore/MobileSchema/Schema/Objects/Dimensions.graphql.swift", "$(SRCROOT)/WidgetsCore/MobileSchema/Schema/Objects/FeeData.graphql.swift", @@ -2640,122 +2653,123 @@ 0743221A2A83E3CA00F8518D /* TokenMarket.graphql.swift in Sources */, 074322322A83E3CA00F8518D /* NftBalance.graphql.swift in Sources */, 9F813EA02AA8FB7500438D89 /* TransactionDetails.graphql.swift in Sources */, - 30872BFB39EEC66944E3EFD7 /* MobileSchema.graphql.swift in Sources */, - 9822D243ED2F5C350404A375 /* HomeScreenTokenParts.graphql.swift in Sources */, - 61988A922656857278F7CBF9 /* TokenBalanceMainParts.graphql.swift in Sources */, - C8402101FF510BAA358DCA46 /* TokenBalanceParts.graphql.swift in Sources */, - FA8EB6A63AB3F56194C6CFB8 /* TokenBalanceQuantityParts.graphql.swift in Sources */, - A974633048E27D5D23420F34 /* TokenBasicInfoParts.graphql.swift in Sources */, - C8338C5BE951EF9111C48217 /* TokenBasicProjectParts.graphql.swift in Sources */, - 09F9DEB33392F3051BEA8D52 /* TokenFeeDataParts.graphql.swift in Sources */, - D7E3642851C618D369D26B82 /* TokenMarketParts.graphql.swift in Sources */, - 302E24504C4FCE674CF95984 /* TokenParts.graphql.swift in Sources */, - F53121FB1B070DB9A81347DF /* TokenProjectMarketsParts.graphql.swift in Sources */, - E0F63BA3A99DB10FA1CCAB5E /* TokenProjectUrlsParts.graphql.swift in Sources */, - 2B12DFE797E2CBF314565D81 /* TokenProtectionInfoParts.graphql.swift in Sources */, - 71CF37F19F1C138B57CC135C /* TopTokenParts.graphql.swift in Sources */, - 93566FBDE94E1A2D8CC5AB62 /* ConvertQuery.graphql.swift in Sources */, - 63BDDE4499AC6B2375C9F795 /* FavoriteTokenCardQuery.graphql.swift in Sources */, - FD4E55146E046C7F5983A379 /* FeedTransactionListQuery.graphql.swift in Sources */, - F0D6A92BB4FCE19CDFA5BBE1 /* HomeScreenTokensQuery.graphql.swift in Sources */, - D660CA59775C3634324037ED /* MultiplePortfolioBalancesQuery.graphql.swift in Sources */, - 2B422D705C68BB51FBDA9895 /* NFTItemScreenQuery.graphql.swift in Sources */, - EF3D92CA76DEE66090F18D0C /* NftCollectionScreenQuery.graphql.swift in Sources */, - AC70FF8207ED26561B634E30 /* NftsQuery.graphql.swift in Sources */, - 1C3559D557BC09C709104802 /* NftsTabQuery.graphql.swift in Sources */, - A104024A1861354EC1DD53C1 /* PortfolioBalancesQuery.graphql.swift in Sources */, - F772B09295DABC5E8895C1C5 /* SelectWalletScreenQuery.graphql.swift in Sources */, - 9381B5EA5839DA17D07A45F0 /* TokenDetailsScreenQuery.graphql.swift in Sources */, - DC0641C5870F91D26C914F1D /* TokenPriceHistoryQuery.graphql.swift in Sources */, - 93AEECDBDB160B5E0C9E3149 /* TokenProjectDescriptionQuery.graphql.swift in Sources */, - 8CEA6459A5B739C3A0382000 /* TokenProjectsQuery.graphql.swift in Sources */, - 677FC15A05D9BD23930FAC95 /* TokenQuery.graphql.swift in Sources */, - 62B32E9623DA0E939F062033 /* TokensQuery.graphql.swift in Sources */, - 171DD1C966C7FBF9DD68CFAC /* TopTokensQuery.graphql.swift in Sources */, - 257C7A9F2C4AC3C99C6B7348 /* TransactionHistoryUpdaterQuery.graphql.swift in Sources */, - 3361FE5837059AEF4AA877BE /* TransactionListQuery.graphql.swift in Sources */, - 8410B98A8D7974A941AAF299 /* WidgetTokensQuery.graphql.swift in Sources */, - 9AF0D1FDF2BFB17FB732C5FD /* SchemaConfiguration.swift in Sources */, - 8950F8354810AA673E1E35DA /* SchemaMetadata.graphql.swift in Sources */, - 4917B04DB81579CF4243A1DA /* Chain.graphql.swift in Sources */, - 614FCC3D8E9AA8175E950726 /* Currency.graphql.swift in Sources */, - 326CFFDBB89D95FA4CB95EBB /* HistoryDuration.graphql.swift in Sources */, - 143C638C2CCAC689371BFC93 /* NftActivityType.graphql.swift in Sources */, - 648B919F00D069DE1F0040F6 /* NftMarketplace.graphql.swift in Sources */, - 7BE97D20155AE69FF36C4CB4 /* NftStandard.graphql.swift in Sources */, - 1BC3A49161EB906542F8E23B /* ProtectionAttackType.graphql.swift in Sources */, - 8FE0F30936E893297558F467 /* ProtectionResult.graphql.swift in Sources */, - 66D2765A00D8CE3136D28F1F /* SafetyLevel.graphql.swift in Sources */, - 85ADD03923353DB3D6CD7301 /* SwapOrderStatus.graphql.swift in Sources */, - C791C5505DBB3036B9D5066D /* SwapOrderType.graphql.swift in Sources */, - 0C6FC49E0FC9BCB2DF5B627E /* TokenSortableField.graphql.swift in Sources */, - FD84AA379C4562598807843D /* TokenStandard.graphql.swift in Sources */, - 2E05037B51AF526A47701B09 /* TransactionDirection.graphql.swift in Sources */, - CCBC45FD4310D8153D859361 /* TransactionStatus.graphql.swift in Sources */, - 5D06BAB366D14A5AFE2355E8 /* TransactionType.graphql.swift in Sources */, - FBE634E2AEC7A62B89863366 /* ContractInput.graphql.swift in Sources */, - 3E338E14E33C721DAB708664 /* NftActivityFilterInput.graphql.swift in Sources */, - 50C89DFAF2DBC80D6343B164 /* NftAssetTraitInput.graphql.swift in Sources */, - D680C4844F2C5DACF5D0892E /* NftAssetsFilterInput.graphql.swift in Sources */, - AA3AE4E5C2AAC3F9460A3637 /* NftBalanceAssetInput.graphql.swift in Sources */, - C7ABAADA504107D152A52FD4 /* NftBalancesFilterInput.graphql.swift in Sources */, - 09E8C497051C37FE604FD40E /* OnRampTransactionsAuth.graphql.swift in Sources */, - C1FC1F8B4A2725A195F66D60 /* PortfolioValueModifier.graphql.swift in Sources */, - E091F379106E92D3181103CB /* IAmount.graphql.swift in Sources */, - EF05F69E61EA8A16C6A66D53 /* IContract.graphql.swift in Sources */, - CE1DF567D58943ACCBB8360C /* Amount.graphql.swift in Sources */, - 1CE49305114BF4792290DDC6 /* AmountChange.graphql.swift in Sources */, - F5B577CA1201CB6FF04A9A58 /* ApplicationContract.graphql.swift in Sources */, - 9A3E861F5D7B0F2CB0EFA7A6 /* AssetActivity.graphql.swift in Sources */, - 8ADDD2E2AB1FD9D1D9AF5627 /* BlockaidFees.graphql.swift in Sources */, - 03291E0DA448AF438F97EA5D /* DescriptionTranslations.graphql.swift in Sources */, - 4C187202229BDC4D8898E067 /* Dimensions.graphql.swift in Sources */, - 5C3958DA046B5A84FE90C1BD /* FeeData.graphql.swift in Sources */, - 0CEBEB8BE3AB95C3F584F6CE /* Image.graphql.swift in Sources */, - B377DB0418EA15695F208D9F /* NetworkFee.graphql.swift in Sources */, - BD59A9C8414D6A4BFE9C9A2E /* NftActivity.graphql.swift in Sources */, - B746C09DA19B4C7F9C700989 /* NftActivityConnection.graphql.swift in Sources */, - FE9CE5C3B5A456B249FC34C5 /* NftActivityEdge.graphql.swift in Sources */, - 1DC34AE3E11264475E8B9F62 /* NftApproval.graphql.swift in Sources */, - FC7C117CEA5EA63460E6A2C6 /* NftApproveForAll.graphql.swift in Sources */, - BD1FF76A8E50EFEA0720CC04 /* NftAsset.graphql.swift in Sources */, - 8CC06A8205186D0640F0BC55 /* NftAssetConnection.graphql.swift in Sources */, - 5804A1B1BB144D9EFBBE177D /* NftAssetEdge.graphql.swift in Sources */, - 126CC4BC99F3F15CC1E2F1C3 /* NftAssetTrait.graphql.swift in Sources */, - CF36F741187285B430EFE557 /* NftBalance.graphql.swift in Sources */, - 33928A7366AFE7F892CDC89F /* NftBalanceConnection.graphql.swift in Sources */, - CA0EDABCA1B6C2B0936BF5CF /* NftBalanceEdge.graphql.swift in Sources */, - 252BD40CB9B46FE47B2440B1 /* NftCollection.graphql.swift in Sources */, - D81BAFFCC105668B88B607FC /* NftCollectionConnection.graphql.swift in Sources */, - A3318C676D7FBF78A1583B16 /* NftCollectionEdge.graphql.swift in Sources */, - 85D0E81B798D0F2D841386E9 /* NftCollectionMarket.graphql.swift in Sources */, - 3FE25F715DFFD1D03DCDA57D /* NftContract.graphql.swift in Sources */, - 1B59968CF49C45B127E9C768 /* NftOrder.graphql.swift in Sources */, - 9B6C88F7D8D542AAC353A3EA /* NftOrderConnection.graphql.swift in Sources */, - 4BB9E218D89B8AF5E4E27CCB /* NftOrderEdge.graphql.swift in Sources */, - 6A60BDC9D46A710D871DEC6E /* NftProfile.graphql.swift in Sources */, - E54093DC857B8C634804D42B /* NftTransfer.graphql.swift in Sources */, - 0F282C26344F1AE3622232B0 /* OffRampTransactionDetails.graphql.swift in Sources */, - 1E2AF2C38C8FBEB2A95B644E /* OffRampTransfer.graphql.swift in Sources */, - CF2BAECCF9A2EC43AC3EC583 /* OnRampServiceProvider.graphql.swift in Sources */, - B61E182CF4937B5169885C95 /* OnRampTransactionDetails.graphql.swift in Sources */, - 553E6B467BEE49C9984691C5 /* OnRampTransfer.graphql.swift in Sources */, - 35B8176433A98BA798BBEE79 /* PageInfo.graphql.swift in Sources */, - 4FED6AAF896BA371C56D88B1 /* Portfolio.graphql.swift in Sources */, - 818179F5724AA35E1B1D5A9C /* ProtectionInfo.graphql.swift in Sources */, - ADE104A101B3DFFBDB308189 /* Query.graphql.swift in Sources */, - 03E3515E38E247F459218CAA /* SwapOrderDetails.graphql.swift in Sources */, - 31661D70B58410EA030E2C53 /* TimestampedAmount.graphql.swift in Sources */, - F2EB62621E64B57B07DE8B13 /* Token.graphql.swift in Sources */, - 9301D18644F3DFA9ABB8F0BE /* TokenApproval.graphql.swift in Sources */, - E24ED8688E9B18BBD543F8F0 /* TokenBalance.graphql.swift in Sources */, - AF83E7713BB625D787DD1A1D /* TokenMarket.graphql.swift in Sources */, - 0094F4FBBC1C0A2FFABF7157 /* TokenProject.graphql.swift in Sources */, - 869F3639FBC6D8156FFE3BD3 /* TokenProjectMarket.graphql.swift in Sources */, - 4EF8D293BB1EBCFBFC65A330 /* TokenTransfer.graphql.swift in Sources */, - 97CA219E1FFD832D8FA02C20 /* TransactionDetails.graphql.swift in Sources */, - BA83003638263D702D03C3C1 /* ActivityDetails.graphql.swift in Sources */, - 36E601F269D40A67FC353947 /* AssetChange.graphql.swift in Sources */, + 0D87DBFD19D5A6DF176C0AB7 /* MobileSchema.graphql.swift in Sources */, + A250CF455F6CEFB64ABFC277 /* HomeScreenTokenParts.graphql.swift in Sources */, + 0AC6A2E1C5837AAD902742DA /* TokenBalanceMainParts.graphql.swift in Sources */, + F77F1A182DCA1D8DFE46ACC8 /* TokenBalanceParts.graphql.swift in Sources */, + 02B7B534DFEC9DA0F7F06B8D /* TokenBalanceQuantityParts.graphql.swift in Sources */, + 6882C4768011FDD4D746BDDB /* TokenBasicInfoParts.graphql.swift in Sources */, + F09E3F15A36A9050B028B3E3 /* TokenBasicProjectParts.graphql.swift in Sources */, + 5551DDD6A8B9B28E03459816 /* TokenFeeDataParts.graphql.swift in Sources */, + 06C9F16E22B8B64855980A69 /* TokenMarketParts.graphql.swift in Sources */, + 2B2738BAB9E906B561E0D4D6 /* TokenParts.graphql.swift in Sources */, + 9D638326CD705ABE549C8CA7 /* TokenProjectMarketsParts.graphql.swift in Sources */, + FA318FB37223FAF04A5C887B /* TokenProjectUrlsParts.graphql.swift in Sources */, + 47797825D18637A2FE57AC1F /* TokenProtectionInfoParts.graphql.swift in Sources */, + CE8C365D91CADE7A5A8F4D52 /* TopTokenParts.graphql.swift in Sources */, + D6149AE9ED70F546DF5841BD /* ConvertQuery.graphql.swift in Sources */, + ED606CD83873CC9DFCCA44F1 /* FavoriteTokenCardQuery.graphql.swift in Sources */, + 147F4DFD43CE86324A066003 /* FeedTransactionListQuery.graphql.swift in Sources */, + 6250D4ACD5696D845FD83DFD /* HomeScreenTokensQuery.graphql.swift in Sources */, + CEE9E9912D5621F6E8F819B7 /* MultiplePortfolioBalancesQuery.graphql.swift in Sources */, + 70CD2D0665E5AC6A0DF6F697 /* NFTItemScreenQuery.graphql.swift in Sources */, + 206E0025B8FCE0EA96AC744A /* NftCollectionScreenQuery.graphql.swift in Sources */, + 7C886F9D4C02EF4E5F67B011 /* NftsQuery.graphql.swift in Sources */, + 092E5F0FE7DE6113285AF5E3 /* NftsTabQuery.graphql.swift in Sources */, + 57ECD348EA564F0CBF715E9E /* PortfolioBalancesQuery.graphql.swift in Sources */, + C0BBEE1CAEA4B2F778426BDE /* SelectWalletScreenQuery.graphql.swift in Sources */, + 81E55E8D3056E2378A332B31 /* TokenDetailsScreenQuery.graphql.swift in Sources */, + 34610491FF9A452F4F806157 /* TokenPriceHistoryQuery.graphql.swift in Sources */, + 1C84E14C7F52CF6C9A6D2930 /* TokenProjectDescriptionQuery.graphql.swift in Sources */, + DC4AA6DE28B9F40A3D7600F1 /* TokenProjectsQuery.graphql.swift in Sources */, + D0B9B6DEC559290B7F64B24F /* TokenQuery.graphql.swift in Sources */, + E654760CA0FF19139A85472A /* TokensQuery.graphql.swift in Sources */, + 8E6DA65AC5CAE9F9A67F9E38 /* TopTokensQuery.graphql.swift in Sources */, + FC61EDE606C85346CE069C5D /* TransactionHistoryUpdaterQuery.graphql.swift in Sources */, + E1009979B48ACF5017C12F09 /* TransactionListQuery.graphql.swift in Sources */, + EE4B861AE191A1BF70CF3784 /* WidgetTokensQuery.graphql.swift in Sources */, + AD6036D32C44048781B728E1 /* SchemaConfiguration.swift in Sources */, + 9EBC41A90B1A80653960045E /* SchemaMetadata.graphql.swift in Sources */, + F814C0144D90ADB4A8E0A34E /* Chain.graphql.swift in Sources */, + 9260D04A891FEDE2BF511707 /* Currency.graphql.swift in Sources */, + 23B195B262495EABE4A6CDF4 /* HistoryDuration.graphql.swift in Sources */, + D5F36D3EDC206DF15EC368AC /* NftActivityType.graphql.swift in Sources */, + 4DB6B64CFF3B00FCF0258336 /* NftMarketplace.graphql.swift in Sources */, + 91DBDA9B4F4006350AEB8E4B /* NftStandard.graphql.swift in Sources */, + F86D86FC31BBDA7246C50392 /* ProtectionAttackType.graphql.swift in Sources */, + CA966CBD02A7B16BC55F1B8E /* ProtectionResult.graphql.swift in Sources */, + 15193A0A3CE80FF72AAB54B4 /* SafetyLevel.graphql.swift in Sources */, + 3720F641F397A2819500B1B1 /* SwapOrderStatus.graphql.swift in Sources */, + E7D4A29333634717D099F80E /* SwapOrderType.graphql.swift in Sources */, + D48D1B7A4469BAAA22608058 /* TokenSortableField.graphql.swift in Sources */, + D1FB4E293EC152C12A495ACD /* TokenStandard.graphql.swift in Sources */, + 252A28057D1D481D14D2F5E5 /* TransactionDirection.graphql.swift in Sources */, + BFB114718A0D262E3AEAEDC0 /* TransactionStatus.graphql.swift in Sources */, + AAB837C01239A62D00068853 /* TransactionType.graphql.swift in Sources */, + 8BCFF1F648887F78894F1071 /* ContractInput.graphql.swift in Sources */, + C8F5AF75BDB439143FE1C173 /* NftActivityFilterInput.graphql.swift in Sources */, + 4FD78AA88D2EB8E22144BCDF /* NftAssetTraitInput.graphql.swift in Sources */, + 997BFD5324E4BDE2422FEFED /* NftAssetsFilterInput.graphql.swift in Sources */, + 0764D0BF05C44615BDD9AD65 /* NftBalanceAssetInput.graphql.swift in Sources */, + 51362EC6F0E6D8928C067F5E /* NftBalancesFilterInput.graphql.swift in Sources */, + BB28AF35DC102F8DE2A4BE9D /* OnRampTransactionsAuth.graphql.swift in Sources */, + 9EC9E4AB5C3FD254EDB28D7A /* PortfolioValueModifier.graphql.swift in Sources */, + A949039A6A9EB3584B5644F3 /* IAmount.graphql.swift in Sources */, + 2FC53D1C58218F0BF1D4E5F3 /* IContract.graphql.swift in Sources */, + 845327D60EFBB850189D6AB3 /* Amount.graphql.swift in Sources */, + ACA7AE75760B76F7B30DCD43 /* AmountChange.graphql.swift in Sources */, + 4DB88A2CBFF5FF356CA757F0 /* ApplicationContract.graphql.swift in Sources */, + 0AD9B4E176D2E9FE86E6ED21 /* AssetActivity.graphql.swift in Sources */, + 391FD815120230BDAF53F6F0 /* BlockaidFees.graphql.swift in Sources */, + 24B4011ADC672F470EC515AC /* BridgedWithdrawalInfo.graphql.swift in Sources */, + E2C528F617A9675690171D54 /* DescriptionTranslations.graphql.swift in Sources */, + BAB54489223FD0027F7A8DBE /* Dimensions.graphql.swift in Sources */, + 15A72E27235628C56431EC98 /* FeeData.graphql.swift in Sources */, + 86038259E487A108DDC2948B /* Image.graphql.swift in Sources */, + C064037906B259088B6B78B2 /* NetworkFee.graphql.swift in Sources */, + BE0DBD01CF4DCA6D3CDDA369 /* NftActivity.graphql.swift in Sources */, + 19BC2371F6BE6CAD5218AA53 /* NftActivityConnection.graphql.swift in Sources */, + 71954B20E4341CEC36203F87 /* NftActivityEdge.graphql.swift in Sources */, + 3389D45727F15B8E4F59B99F /* NftApproval.graphql.swift in Sources */, + 39DEA445993253BCC1201199 /* NftApproveForAll.graphql.swift in Sources */, + BED0DD22C0D9E09C85DF010D /* NftAsset.graphql.swift in Sources */, + E7B6F1CA0E30585C949C9D9A /* NftAssetConnection.graphql.swift in Sources */, + 7700BED7CD7F52C83A3FF430 /* NftAssetEdge.graphql.swift in Sources */, + D8A0C6D04FF53BA4F50543FE /* NftAssetTrait.graphql.swift in Sources */, + DB752E8F664505726ABDBCD3 /* NftBalance.graphql.swift in Sources */, + B64BD6DEB100AEB723DB640D /* NftBalanceConnection.graphql.swift in Sources */, + E475BA358DD8BE30A6FDC051 /* NftBalanceEdge.graphql.swift in Sources */, + 1CA252C75CD5291E2A0B308B /* NftCollection.graphql.swift in Sources */, + 8141B38CCDB09F91180C0EBD /* NftCollectionConnection.graphql.swift in Sources */, + 5676CCD265609B71D3B1DB7C /* NftCollectionEdge.graphql.swift in Sources */, + 31A4EC91F1924E25AECA2F4E /* NftCollectionMarket.graphql.swift in Sources */, + 438115E2759B1194751A8021 /* NftContract.graphql.swift in Sources */, + E7EDBB8CDF65D5D6602BF8FC /* NftOrder.graphql.swift in Sources */, + A9AF7B483E9666E88CD6253E /* NftOrderConnection.graphql.swift in Sources */, + 9E7EC26AC45301198E280DC7 /* NftOrderEdge.graphql.swift in Sources */, + 9061ACE5AF99CEDE7BA51C94 /* NftProfile.graphql.swift in Sources */, + EB0A75424F8EEF6612D28D52 /* NftTransfer.graphql.swift in Sources */, + 9A9B39BC22F3BDFCD0917B66 /* OffRampTransactionDetails.graphql.swift in Sources */, + F1193089AE71CA3C4C101EA5 /* OffRampTransfer.graphql.swift in Sources */, + A88A26642AC25B022F428953 /* OnRampServiceProvider.graphql.swift in Sources */, + 03EEEDA1A3D5EF23C0D14B08 /* OnRampTransactionDetails.graphql.swift in Sources */, + 4260B9F719F8E25DFBF99D73 /* OnRampTransfer.graphql.swift in Sources */, + 7E3412EB776E1F43D6904BA0 /* PageInfo.graphql.swift in Sources */, + 7B557C3224F990851430DBD2 /* Portfolio.graphql.swift in Sources */, + 2C9935142A9582467B5B5FC5 /* ProtectionInfo.graphql.swift in Sources */, + CBEB9122D993BCB0E9A604B7 /* Query.graphql.swift in Sources */, + 03AE019583139330A3E408AB /* SwapOrderDetails.graphql.swift in Sources */, + 16506815CDEE17670D3DD363 /* TimestampedAmount.graphql.swift in Sources */, + F49C1C4E9175DFE7EEF9FB51 /* Token.graphql.swift in Sources */, + 2D73D2D80BC8C455DB35CE57 /* TokenApproval.graphql.swift in Sources */, + 8117BFB02DCF0F315FD83E67 /* TokenBalance.graphql.swift in Sources */, + E4985BA9090E013F2C9FC190 /* TokenMarket.graphql.swift in Sources */, + 8971E73E041A6283E2684481 /* TokenProject.graphql.swift in Sources */, + 4DB6D0FB611F6C68EADFB948 /* TokenProjectMarket.graphql.swift in Sources */, + 15F6E43DA2BD9A8A681EC70C /* TokenTransfer.graphql.swift in Sources */, + 2925C6E0262B95C5EA0C2AE7 /* TransactionDetails.graphql.swift in Sources */, + 63FBF9C23ED568816590F093 /* ActivityDetails.graphql.swift in Sources */, + 8D85F349FEF81A52FB93EAAB /* AssetChange.graphql.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2797,10 +2811,12 @@ FD7304D028A3650A0085BDEA /* Colors.swift in Sources */, 8E89C3AF2AB8AAA400C84DE5 /* MnemonicDisplayView.swift in Sources */, 9FEC9B8B2A858CF1003CD019 /* AppDelegate.m in Sources */, + 45FFF7E12E8C2E6900362570 /* SilentPushEventEmitter.swift in Sources */, 6BC7D0802B5FF02400617C95 /* EncryptionUtils.swift in Sources */, 03C788232C10E7390011E5DC /* ActionButtons.swift in Sources */, 8EA8AB3B2AB7ED3C004E7EF3 /* SeedPhraseInputManager.m in Sources */, 03D2F3182C218D390030D987 /* RelativeOffsetView.swift in Sources */, + 45FFF7DF2E8C2A8100362570 /* SilentPushEventEmitter.m in Sources */, 6CA91BDB2A95223C00C4063E /* RNEthersRS.swift in Sources */, 8EA8AB3C2AB7ED3C004E7EF3 /* SeedPhraseInputViewModel.swift in Sources */, 072F6C2E2A44A32F00DA720A /* TokenPriceWidget.intentdefinition in Sources */, @@ -2985,7 +3001,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -3038,7 +3054,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCore; @@ -3091,7 +3107,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCore; @@ -3144,7 +3160,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCore; @@ -3182,7 +3198,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.1; - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -3218,7 +3234,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.1; - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCoreTests; @@ -3253,7 +3269,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.1; - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCoreTests; @@ -3288,7 +3304,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.1; - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCoreTests; @@ -3335,7 +3351,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -3381,7 +3397,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.widgets; @@ -3427,7 +3443,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.dev.widgets; @@ -3473,7 +3489,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.beta.widgets; @@ -3515,7 +3531,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -3558,7 +3574,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.WidgetIntentExtension; @@ -3601,7 +3617,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.dev.WidgetIntentExtension; @@ -3644,7 +3660,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.beta.WidgetIntentExtension; @@ -3680,7 +3696,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -3718,7 +3734,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -3920,7 +3936,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -3965,7 +3981,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.OneSignalNotificationServiceExtension; @@ -4076,7 +4092,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -4148,7 +4164,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.beta.OneSignalNotificationServiceExtension; @@ -4259,7 +4275,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -4331,7 +4347,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.62; 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/AppDelegate.m b/apps/mobile/ios/Uniswap/AppDelegate.m index 28b0f7e1310..f16174f207e 100644 --- a/apps/mobile/ios/Uniswap/AppDelegate.m +++ b/apps/mobile/ios/Uniswap/AppDelegate.m @@ -1,6 +1,7 @@ #import "AppDelegate.h" #import +#import #import "Uniswap-Swift.h" @@ -128,4 +129,16 @@ -(BOOL)application:(UIApplication *)application shouldAllowExtensionPointIdentif return YES; } +- (void)application:(UIApplication *)application + didReceiveRemoteNotification:(NSDictionary *)userInfo + fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler +{ + NSDictionary *aps = userInfo[@"aps"]; + NSNumber *contentAvailable = aps[@"content-available"] ?: aps[@"content_available"]; + if (contentAvailable != nil && contentAvailable.integerValue == 1) { + [SilentPushEventEmitter emitEventWithPayload:userInfo ?: @{}]; + } + completionHandler(UIBackgroundFetchResultNoData); +} + @end diff --git a/apps/mobile/ios/Uniswap/Notifications/SilentPushEventEmitter.m b/apps/mobile/ios/Uniswap/Notifications/SilentPushEventEmitter.m new file mode 100644 index 00000000000..343b5119cf9 --- /dev/null +++ b/apps/mobile/ios/Uniswap/Notifications/SilentPushEventEmitter.m @@ -0,0 +1,18 @@ +// +// SilentPushEventEmitter.m +// Uniswap +// +// Created by John Short on 9/29/25. +// + +#import +#import +#import + +@interface RCT_EXTERN_MODULE(SilentPushEventEmitter, RCTEventEmitter) + +RCT_EXTERN_METHOD(supportedEvents) +RCT_EXTERN_METHOD(addListener:(NSString *)eventName) +RCT_EXTERN_METHOD(removeListeners:(nonnull NSNumber *)count) + +@end diff --git a/apps/mobile/ios/Uniswap/Notifications/SilentPushEventEmitter.swift b/apps/mobile/ios/Uniswap/Notifications/SilentPushEventEmitter.swift new file mode 100644 index 00000000000..c79a3fb051a --- /dev/null +++ b/apps/mobile/ios/Uniswap/Notifications/SilentPushEventEmitter.swift @@ -0,0 +1,31 @@ +// +// SilentPushEventEmitter.swift +// Uniswap +// +// Created by John Short on 9/29/25. +// + +import React + +@objc(SilentPushEventEmitter) +open class SilentPushEventEmitter: RCTEventEmitter { + + public static weak var emitter: RCTEventEmitter? + + override init() { + super.init() + SilentPushEventEmitter.emitter = self + } + + open override func supportedEvents() -> [String] { + ["SilentPushReceived"] + } + + @objc(emitEventWithPayload:) + public static func emitEvent(with payload: [String: Any]) { + guard let emitter = emitter else { + return + } + emitter.sendEvent(withName: "SilentPushReceived", body: payload) + } +} diff --git a/apps/mobile/ios/WidgetsCore/.mobileschema_fingerprint b/apps/mobile/ios/WidgetsCore/.mobileschema_fingerprint index dcdbb6388ae..bdbfc2b1a8b 100644 --- a/apps/mobile/ios/WidgetsCore/.mobileschema_fingerprint +++ b/apps/mobile/ios/WidgetsCore/.mobileschema_fingerprint @@ -1 +1 @@ -7a03144e3423ea77bd883f7e79a0e3d6a3c54ea3e98424ac288e5f817f88931c \ No newline at end of file +6ac99a17ab7586621527349b19aa9fee726de2187db2a35e940d94747d2b4cf8 \ No newline at end of file diff --git a/apps/mobile/package.json b/apps/mobile/package.json index e013942b40c..a5684faab6d 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -112,6 +112,7 @@ "@uniswap/sdk-core": "7.7.2", "@universe/api": "workspace:^", "@universe/gating": "workspace:^", + "@universe/sessions": "workspace:^", "@walletconnect/core": "2.21.4", "@walletconnect/react-native-compat": "2.21.4", "@walletconnect/types": "2.21.4", diff --git a/apps/mobile/scripts/checkBundleSize.sh b/apps/mobile/scripts/checkBundleSize.sh index b9a4e5a57da..8b7abf6bfce 100755 --- a/apps/mobile/scripts/checkBundleSize.sh +++ b/apps/mobile/scripts/checkBundleSize.sh @@ -1,5 +1,5 @@ #!/bin/bash -MAX_SIZE=24.60 +MAX_SIZE=23.30 MAX_BUFFER=0.5 # Check OS type and use appropriate stat command diff --git a/apps/mobile/src/app/App.tsx b/apps/mobile/src/app/App.tsx index da7c8559205..d72efa7668b 100644 --- a/apps/mobile/src/app/App.tsx +++ b/apps/mobile/src/app/App.tsx @@ -3,6 +3,7 @@ import { loadDevMessages, loadErrorMessages } from '@apollo/client/dev' import { DdRum, RumActionType } from '@datadog/mobile-react-native' import { BottomSheetModalProvider } from '@gorhom/bottom-sheet' import { PerformanceProfiler, RenderPassReport } from '@shopify/react-native-performance' +import { ApiInit, getSessionService } from '@universe/api' import { DatadogSessionSampleRateKey, DynamicConfigs, @@ -14,6 +15,7 @@ import { Storage, WALLET_FEATURE_FLAG_NAMES, } from '@universe/gating' +import { createChallengeSolverService, createSessionInitializationService } from '@universe/sessions' import { MMKVWrapper } from 'apollo3-cache-persist' import { default as React, StrictMode, useCallback, useEffect, useMemo, useRef } from 'react' import { I18nextProvider } from 'react-i18next' @@ -128,6 +130,14 @@ initAppsFlyer() initializePortfolioQueryOverrides({ store }) +const sessionInitService = createSessionInitializationService({ + sessionService: getSessionService({ + // TODO: Use real base url + getBaseUrl: () => 'https://entry-gateway.backend-dev.api.uniswap.org', + }), + challengeSolverService: createChallengeSolverService(), +}) + function App(): JSX.Element | null { useEffect(() => { if (!__DEV__) { @@ -366,6 +376,7 @@ function DataUpdaters(): JSX.Element { return ( <> + ) diff --git a/apps/mobile/src/app/migrations.test.ts b/apps/mobile/src/app/migrations.test.ts index 55b7a04a610..40fef90d16a 100644 --- a/apps/mobile/src/app/migrations.test.ts +++ b/apps/mobile/src/app/migrations.test.ts @@ -96,6 +96,7 @@ import { v90Schema, v91Schema, v92Schema, + v93Schema, } from 'src/app/schema' import { persistConfig } from 'src/app/store' import { initialBiometricsSettingsState } from 'src/features/biometricsSettings/slice' @@ -118,7 +119,11 @@ import { initialTokensState } from 'uniswap/src/features/tokens/slice/slice' import { initialTransactionsState } from 'uniswap/src/features/transactions/slice' import { TransactionStatus, TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails' import { initialVisibilityState } from 'uniswap/src/features/visibility/slice' -import { testMigrateSearchHistory, testRemoveTHBFromCurrency } from 'uniswap/src/state/uniswapMigrationTests' +import { + testAddActivityVisibility, + testMigrateSearchHistory, + testRemoveTHBFromCurrency, +} from 'uniswap/src/state/uniswapMigrationTests' import { transactionDetails } from 'uniswap/src/test/fixtures' import { DappRequestType } from 'uniswap/src/types/walletConnect' import { getAllKeysOfNestedObject } from 'utilities/src/primitives/objects' @@ -1784,4 +1789,8 @@ describe('Redux state migrations', () => { it('migrates from v92 to v93', () => { testMigrateSearchHistory(migrations[93], v92Schema) }) + + it('migrates from v93 to v95', () => { + testAddActivityVisibility(migrations[95], v93Schema) + }) }) diff --git a/apps/mobile/src/app/migrations.ts b/apps/mobile/src/app/migrations.ts index 779ea388446..a79c1b32b72 100644 --- a/apps/mobile/src/app/migrations.ts +++ b/apps/mobile/src/app/migrations.ts @@ -18,6 +18,7 @@ import { TransactionType, } from 'uniswap/src/features/transactions/types/transactionDetails' import { + addActivityVisibility, addDismissedBridgedAndCompatibleWarnings, migrateSearchHistory, removeThaiBahtFromFiatCurrency, @@ -1084,6 +1085,7 @@ export const migrations = { 93: migrateSearchHistory, 94: addDismissedBridgedAndCompatibleWarnings, + 95: addActivityVisibility, } -export const MOBILE_STATE_VERSION = 94 +export const MOBILE_STATE_VERSION = 95 diff --git a/apps/mobile/src/app/monitoredSagas.ts b/apps/mobile/src/app/monitoredSagas.ts index 1c08736cb48..edfcf2d17d9 100644 --- a/apps/mobile/src/app/monitoredSagas.ts +++ b/apps/mobile/src/app/monitoredSagas.ts @@ -14,13 +14,6 @@ import { prepareAndSignSwapSaga, prepareAndSignSwapSagaName, } from 'wallet/src/features/transactions/swap/configuredSagas' -import { swapActions, swapReducer, swapSaga, swapSagaName } from 'wallet/src/features/transactions/swap/swapSaga' -import { - tokenWrapActions, - tokenWrapReducer, - tokenWrapSaga, - tokenWrapSagaName, -} from 'wallet/src/features/transactions/swap/wrapSaga' import { editAccountActions, editAccountReducer, @@ -61,18 +54,6 @@ export const monitoredSagas: Record = { reducer: executeSwapReducer, actions: executeSwapActions, }, - [swapSagaName]: { - name: swapSagaName, - wrappedSaga: swapSaga, - reducer: swapReducer, - actions: swapActions, - }, - [tokenWrapSagaName]: { - name: tokenWrapSagaName, - wrappedSaga: tokenWrapSaga, - reducer: tokenWrapReducer, - actions: tokenWrapActions, - }, [removeDelegationSagaName]: { name: removeDelegationSagaName, wrappedSaga: removeDelegationSaga, diff --git a/apps/mobile/src/app/navigation/constants.ts b/apps/mobile/src/app/navigation/constants.ts new file mode 100644 index 00000000000..778a6d63580 --- /dev/null +++ b/apps/mobile/src/app/navigation/constants.ts @@ -0,0 +1,2 @@ +// Some pages in react native navigation require a delay before the modal is opened +export const MODAL_OPEN_WAIT_TIME = 300 diff --git a/apps/mobile/src/app/navigation/navigation.tsx b/apps/mobile/src/app/navigation/navigation.tsx index 07cbfafd88c..889fbf8ea67 100644 --- a/apps/mobile/src/app/navigation/navigation.tsx +++ b/apps/mobile/src/app/navigation/navigation.tsx @@ -40,6 +40,8 @@ import { PasskeyHelpModalScreen } from 'src/components/modals/ReactNavigationMod import { PasskeyManagementModalScreen } from 'src/components/modals/ReactNavigationModals/PasskeyManagementModalScreen' import { PermissionsSettingsScreen } from 'src/components/modals/ReactNavigationModals/PermissionsSettingsScreen' import { PortfolioBalanceSettingsScreen } from 'src/components/modals/ReactNavigationModals/PortfolioBalanceSettingsScreen' +import { ReportTokenDataModalScreen } from 'src/components/modals/ReactNavigationModals/ReportTokenDataModalScreen' +import { ReportTokenIssueModalScreen } from 'src/components/modals/ReactNavigationModals/ReportTokenIssueModalScreen' import { SmartWalletEnabledModalScreen } from 'src/components/modals/ReactNavigationModals/SmartWalletEnabledModalScreen' import { SmartWalletNudgeScreen } from 'src/components/modals/ReactNavigationModals/SmartWalletNudgeScreen' import { TestnetModeModalScreen } from 'src/components/modals/ReactNavigationModals/TestnetModeModalScreen' @@ -419,6 +421,8 @@ export function AppStackNavigator(): JSX.Element { + + diff --git a/apps/mobile/src/app/navigation/types.ts b/apps/mobile/src/app/navigation/types.ts index c4d0cf03be1..c0ed40ff6cd 100644 --- a/apps/mobile/src/app/navigation/types.ts +++ b/apps/mobile/src/app/navigation/types.ts @@ -21,6 +21,8 @@ import { ReceiveCryptoModalState } from 'src/screens/ReceiveCryptoModalState' import { ViewPrivateKeysScreenState } from 'src/screens/ViewPrivateKeys/ViewPrivateKeysScreenState' import { BridgedAssetModalProps } from 'uniswap/src/components/BridgedAsset/BridgedAssetModal' import { WormholeModalProps } from 'uniswap/src/components/BridgedAsset/WormholeModal' +import { ReportTokenDataModalProps } from 'uniswap/src/components/reporting/ReportTokenDataModal' +import { ReportTokenModalProps } from 'uniswap/src/components/reporting/ReportTokenIssueModal' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { FORServiceProvider } from 'uniswap/src/features/fiatOnRamp/types' import { NFTItem } from 'uniswap/src/features/nfts/types' @@ -221,6 +223,8 @@ export type AppStackParamList = { [ModalName.ConfirmDisableSmartWalletScreen]: undefined [ModalName.BridgedAsset]: BridgedAssetModalProps [ModalName.Wormhole]: WormholeModalProps + [ModalName.ReportTokenIssue]: ReportTokenModalProps + [ModalName.ReportTokenData]: ReportTokenDataModalProps } export type AppStackNavigationProp = NativeStackNavigationProp diff --git a/apps/mobile/src/app/schema.ts b/apps/mobile/src/app/schema.ts index b396fd537ad..72624013bdc 100644 --- a/apps/mobile/src/app/schema.ts +++ b/apps/mobile/src/app/schema.ts @@ -721,8 +721,16 @@ delete v92SchemaIntermediate.cloudBackup export const v92Schema = v92SchemaIntermediate -const v93Schema = v92Schema +export const v93Schema = v92Schema + +const v95Schema = { + ...v93Schema, + visibility: { + ...v93Schema.visibility, + activity: {}, + }, +} // TODO: [MOB-201] use function with typed output when API reducers are removed from rootReducer // export const getSchema = (): RootState => v0Schema -export const getSchema = (): typeof v93Schema => v93Schema +export const getSchema = (): typeof v95Schema => v95Schema diff --git a/apps/mobile/src/components/PriceExplorer/PriceExplorer.tsx b/apps/mobile/src/components/PriceExplorer/PriceExplorer.tsx index 9517ca0e609..b7cfd91080e 100644 --- a/apps/mobile/src/components/PriceExplorer/PriceExplorer.tsx +++ b/apps/mobile/src/components/PriceExplorer/PriceExplorer.tsx @@ -42,6 +42,7 @@ type PriceTextProps = { const PriceTextSection = memo(function PriceTextSection({ loading, numberOfDigits, + relativeChange, spotPrice, startingPrice, shouldTreatAsStablecoin, @@ -68,6 +69,7 @@ const PriceTextSection = memo(function PriceTextSection({ */} diff --git a/apps/mobile/src/components/PriceExplorer/Text.tsx b/apps/mobile/src/components/PriceExplorer/Text.tsx index 8cddaffd8e7..871b9ebc9cf 100644 --- a/apps/mobile/src/components/PriceExplorer/Text.tsx +++ b/apps/mobile/src/components/PriceExplorer/Text.tsx @@ -1,10 +1,11 @@ import React from 'react' -import { useAnimatedStyle, useDerivedValue } from 'react-native-reanimated' -import { useLineChartDatetime } from 'react-native-wagmi-charts' +import { SharedValue, useAnimatedStyle, useDerivedValue } from 'react-native-reanimated' +import { useLineChart, useLineChartDatetime } from 'react-native-wagmi-charts' import { AnimatedDecimalNumber } from 'src/components/PriceExplorer/AnimatedDecimalNumber' import { useLineChartFiatDelta } from 'src/components/PriceExplorer/useFiatDelta' import { useLineChartPrice, useLineChartRelativeChange } from 'src/components/PriceExplorer/usePrice' import { AnimatedText } from 'src/components/text/AnimatedText' +import { numberToPercentWorklet } from 'src/utils/reanimated' import { Flex, Text, useSporeColors } from 'ui/src' import { AnimatedCaretChange } from 'ui/src/components/icons' import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' @@ -42,26 +43,52 @@ export function PriceText({ maxWidth }: { loading: boolean; maxWidth?: number }) export function RelativeChangeText({ loading, + spotRelativeChange, startingPrice, shouldTreatAsStablecoin = false, }: { loading: boolean + /** 24hr price change from API (used when not scrubbing chart) */ + spotRelativeChange?: SharedValue startingPrice?: number shouldTreatAsStablecoin?: boolean }): JSX.Element { const colors = useSporeColors() + const { isActive } = useLineChart() + + // Calculate relative change from chart data (used when scrubbing) + const calculatedRelativeChange = useLineChartRelativeChange() - const relativeChange = useLineChartRelativeChange() const fiatDelta = useLineChartFiatDelta({ startingPrice, shouldTreatAsStablecoin, }) + // Decide which source to use: API's 24hr when idle, chart's when scrubbing + // This ensures the color shows immediately with correct API data + const hasSpotData = !!spotRelativeChange + const shouldUseSpotData = useDerivedValue(() => !isActive.value && hasSpotData) + + const relativeChange = useDerivedValue(() => { + return shouldUseSpotData.value + ? (spotRelativeChange?.value ?? calculatedRelativeChange.value.value) + : calculatedRelativeChange.value.value + }) + + const relativeChangeFormatted = useDerivedValue(() => { + if (shouldUseSpotData.value) { + return spotRelativeChange + ? numberToPercentWorklet(spotRelativeChange.value, { precision: 2, absolute: true }) + : calculatedRelativeChange.formatted.value + } + return calculatedRelativeChange.formatted.value + }) + const changeColor = useDerivedValue(() => { - if (relativeChange.value.value === 0) { + if (relativeChange.value === 0) { return colors.neutral3.val } - return relativeChange.value.value > 0 ? colors.statusSuccess.val : colors.statusCritical.val + return relativeChange.value > 0 ? colors.statusSuccess.val : colors.statusCritical.val }) const styles = useAnimatedStyle(() => ({ @@ -69,16 +96,20 @@ export function RelativeChangeText({ })) const caretStyle = useAnimatedStyle(() => ({ color: changeColor.value, - transform: [{ rotate: relativeChange.value.value >= 0 ? '180deg' : '0deg' }], + transform: [ + { rotate: relativeChange.value >= 0 ? '180deg' : '0deg' }, + // fix vertical centering + { translateY: relativeChange.value >= 0 ? -1 : 1 }, + ], })) // Combine fiat delta and percentage in a derived value const combinedText = useDerivedValue(() => { const delta = fiatDelta.formatted.value if (delta) { - return `${delta} (${relativeChange.formatted.value})` + return `${delta} (${relativeChangeFormatted.value})` } - return relativeChange.formatted.value + return relativeChangeFormatted.value }) return ( @@ -96,15 +127,7 @@ export function RelativeChangeText({ ) : ( <> - = 0 ? -1 : 1 }, - ]} - /> + )} diff --git a/apps/mobile/src/components/PriceExplorer/usePriceHistory.test.ts b/apps/mobile/src/components/PriceExplorer/usePriceHistory.test.ts index 4d2669249db..243e83db715 100644 --- a/apps/mobile/src/components/PriceExplorer/usePriceHistory.test.ts +++ b/apps/mobile/src/components/PriceExplorer/usePriceHistory.test.ts @@ -3,6 +3,7 @@ import { GraphQLApi } from '@universe/api' import { act } from 'react-test-renderer' import { useTokenPriceHistory } from 'src/components/PriceExplorer/usePriceHistory' import { renderHookWithProviders } from 'src/test/render' +import { USDC, USDC_ARBITRUM, USDC_BASE, USDC_OPTIMISM, USDC_POLYGON } from 'uniswap/src/constants/tokens' import { getLatestPrice, priceHistory, @@ -34,6 +35,24 @@ const mockTokenProjectsQuery = (historyPrices: number[]) => (): GraphQLApi.Token const formatPriceHistory = (history: GraphQLApi.TimestampedAmount[]): Omit[] => history.map(({ timestamp, value }) => ({ value, timestamp: timestamp * 1000 })) +/** + * Creates a USDC token project with matching priceHistory for both the aggregated market + * and the Ethereum token's market. This ensures the hook returns the expected data since + * it prefers per-chain price history over aggregated price history. + */ +const createUsdcTokenProjectWithMatchingPriceHistory = ( + history: (GraphQLApi.TimestampedAmount | undefined)[], +): GraphQLApi.TokenProject => ({ + ...usdcTokenProject({ priceHistory: history }), + tokens: [ + token({ sdkToken: USDC, market: tokenMarket({ priceHistory: history }) }), + token({ sdkToken: USDC_POLYGON }), + token({ sdkToken: USDC_ARBITRUM }), + token({ sdkToken: USDC_BASE, market: tokenMarket() }), + token({ sdkToken: USDC_OPTIMISM }), + ], +}) + describe(useTokenPriceHistory, () => { it('returns correct initial values', async () => { const { result } = renderHookWithProviders(() => useTokenPriceHistory({ currencyId: SAMPLE_CURRENCY_ID_1 })) @@ -59,7 +78,13 @@ describe(useTokenPriceHistory, () => { it('returns on-chain spot price if off-chain spot price is not available', async () => { const market = tokenMarket() const { resolvers } = queryResolvers({ - tokenProjects: () => [usdcTokenProject({ markets: undefined, tokens: [token({ market })] })], + tokenProjects: () => [ + usdcTokenProject({ + markets: undefined, + // Ensure token has the correct chain to match SAMPLE_CURRENCY_ID_1 (Ethereum) + tokens: [token({ market, chain: GraphQLApi.Chain.Ethereum })], + }), + ], }) const { result } = renderHookWithProviders(() => useTokenPriceHistory({ currencyId: SAMPLE_CURRENCY_ID_1 }), { resolvers, @@ -80,6 +105,35 @@ describe(useTokenPriceHistory, () => { }) }) + it('handles gracefully when no token matches the currencyId chain', async () => { + const aggregatedMarket = tokenProjectMarket() + const { resolvers } = queryResolvers({ + tokenProjects: () => [ + usdcTokenProject({ + markets: [aggregatedMarket], + // Provide tokens for different chains, but none matching SAMPLE_CURRENCY_ID_1 (Ethereum) + tokens: [token({ chain: GraphQLApi.Chain.Polygon }), token({ chain: GraphQLApi.Chain.Arbitrum })], + }), + ], + }) + const { result } = renderHookWithProviders(() => useTokenPriceHistory({ currencyId: SAMPLE_CURRENCY_ID_1 }), { + resolvers, + }) + + await waitFor(() => { + expect(result.current.loading).toBe(false) + expect(result.current.error).toBe(false) + }) + + // Should fall back to aggregated market data when no chain-specific token is found + await waitFor(() => { + expect(result.current.data?.spot).toEqual({ + value: expect.objectContaining({ value: aggregatedMarket.price.value }), + relativeChange: expect.objectContaining({ value: aggregatedMarket.pricePercentChange24h.value }), + }) + }) + }) + describe('correct number of digits', () => { it('for max price greater than 1', async () => { const { resolvers } = queryResolvers({ @@ -141,7 +195,7 @@ describe(useTokenPriceHistory, () => { it('properly formats price history entries', async () => { const history = priceHistory() const { resolvers } = queryResolvers({ - tokenProjects: () => [usdcTokenProject({ priceHistory: history })], + tokenProjects: () => [createUsdcTokenProjectWithMatchingPriceHistory(history)], }) const { result } = renderHookWithProviders(() => useTokenPriceHistory({ currencyId: SAMPLE_CURRENCY_ID_1 }), { resolvers, @@ -156,12 +210,9 @@ describe(useTokenPriceHistory, () => { }) it('filters out invalid price history entries', async () => { + const invalidHistory = [undefined, timestampedAmount({ value: 1 }), undefined, timestampedAmount({ value: 2 })] const { resolvers } = queryResolvers({ - tokenProjects: () => [ - usdcTokenProject({ - priceHistory: [undefined, timestampedAmount({ value: 1 }), undefined, timestampedAmount({ value: 2 })], - }), - ], + tokenProjects: () => [createUsdcTokenProjectWithMatchingPriceHistory(invalidHistory)], }) const { result } = renderHookWithProviders(() => useTokenPriceHistory({ currencyId: SAMPLE_CURRENCY_ID_1 }), { resolvers, @@ -191,10 +242,10 @@ describe(useTokenPriceHistory, () => { const monthPriceHistory = priceHistory({ duration: GraphQLApi.HistoryDuration.Month }) const yearPriceHistory = priceHistory({ duration: GraphQLApi.HistoryDuration.Year }) - const dayTokenProject = usdcTokenProject({ priceHistory: dayPriceHistory }) - const weekTokenProject = usdcTokenProject({ priceHistory: weekPriceHistory }) - const monthTokenProject = usdcTokenProject({ priceHistory: monthPriceHistory }) - const yearTokenProject = usdcTokenProject({ priceHistory: yearPriceHistory }) + const dayTokenProject = createUsdcTokenProjectWithMatchingPriceHistory(dayPriceHistory) + const weekTokenProject = createUsdcTokenProjectWithMatchingPriceHistory(weekPriceHistory) + const monthTokenProject = createUsdcTokenProjectWithMatchingPriceHistory(monthPriceHistory) + const yearTokenProject = createUsdcTokenProjectWithMatchingPriceHistory(yearPriceHistory) const { resolvers } = queryResolvers({ // eslint-disable-next-line max-params @@ -239,10 +290,11 @@ describe(useTokenPriceHistory, () => { }) await waitFor(() => { + const ethereumToken = dayTokenProject.tokens.find((t) => t.chain === GraphQLApi.Chain.Ethereum) expect(result.current.data?.spot).toEqual({ - value: expect.objectContaining({ value: dayTokenProject.markets[0]?.price.value }), + value: expect.objectContaining({ value: ethereumToken?.market?.price?.value }), relativeChange: expect.objectContaining({ - value: dayTokenProject.markets[0]?.pricePercentChange24h.value, + value: dayTokenProject.markets?.[0]?.pricePercentChange24h?.value, }), }) }) @@ -283,10 +335,11 @@ describe(useTokenPriceHistory, () => { { resolvers }, ) await waitFor(() => { + const ethereumToken = yearTokenProject.tokens.find((t) => t.chain === GraphQLApi.Chain.Ethereum) expect(result.current.data?.spot).toEqual({ - value: expect.objectContaining({ value: yearTokenProject.markets[0]?.price?.value }), + value: expect.objectContaining({ value: ethereumToken?.market?.price?.value }), relativeChange: expect.objectContaining({ - value: yearTokenProject.markets[0]?.pricePercentChange24h?.value, + value: yearTokenProject.markets?.[0]?.pricePercentChange24h?.value, }), }) }) @@ -300,12 +353,13 @@ describe(useTokenPriceHistory, () => { }) await waitFor(() => { + const ethereumToken = dayTokenProject.tokens.find((t) => t.chain === GraphQLApi.Chain.Ethereum) expect(result.current.data).toEqual({ priceHistory: formatPriceHistory(dayPriceHistory), spot: { - value: expect.objectContaining({ value: dayTokenProject.markets[0]?.price.value }), + value: expect.objectContaining({ value: ethereumToken?.market?.price?.value }), relativeChange: expect.objectContaining({ - value: dayTokenProject.markets[0]?.pricePercentChange24h.value, + value: dayTokenProject.markets?.[0]?.pricePercentChange24h?.value, }), }, }) @@ -317,12 +371,13 @@ describe(useTokenPriceHistory, () => { }) await waitFor(() => { + const ethereumToken = weekTokenProject.tokens.find((t) => t.chain === GraphQLApi.Chain.Ethereum) expect(result.current.data).toEqual({ priceHistory: formatPriceHistory(weekPriceHistory), spot: { - value: expect.objectContaining({ value: weekTokenProject.markets[0]?.price?.value }), + value: expect.objectContaining({ value: ethereumToken?.market?.price?.value }), relativeChange: expect.objectContaining({ - value: weekTokenProject.markets[0]?.pricePercentChange24h?.value, + value: weekTokenProject.markets?.[0]?.pricePercentChange24h?.value, }), }, }) diff --git a/apps/mobile/src/components/PriceExplorer/usePriceHistory.ts b/apps/mobile/src/components/PriceExplorer/usePriceHistory.ts index 62775d74aee..2c4bca9bbb4 100644 --- a/apps/mobile/src/components/PriceExplorer/usePriceHistory.ts +++ b/apps/mobile/src/components/PriceExplorer/usePriceHistory.ts @@ -4,8 +4,11 @@ import { type Dispatch, type SetStateAction, useCallback, useMemo, useRef, useSt import { type SharedValue, useDerivedValue } from 'react-native-reanimated' import { type TLineChartData } from 'react-native-wagmi-charts' import { PollingInterval } from 'uniswap/src/constants/misc' +import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { toGraphQLChain } from 'uniswap/src/features/chains/utils' import { currencyIdToContractInput } from 'uniswap/src/features/dataApi/utils/currencyIdToContractInput' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' +import { currencyIdToChain } from 'uniswap/src/utils/currencyId' export type TokenSpotData = { value: SharedValue @@ -63,12 +66,26 @@ export function useTokenPriceHistory({ skip, }) + // Data source strategy for multi-chain tokens: + // - Use PER-CHAIN data (token.market) for price and price history to show the correct chain-specific view + // - Fallback to AGGREGATED data (project.markets) when per-chain history is unavailable + // - Continue using aggregated 24hr change for consistency across platforms + // Note: TokenProjectMarket is aggregated across chains, TokenMarket is per-chain const offChainData = priceData?.tokenProjects?.[0]?.markets?.[0] - const onChainData = priceData?.tokenProjects?.[0]?.tokens[0]?.market - const price = offChainData?.price?.value ?? onChainData?.price?.value ?? lastPrice.current + // We need to find the specific token for the chain we're viewing + const currentChain = toGraphQLChain(currencyIdToChain(currencyId) ?? UniverseChainId.Mainnet) + const currentChainToken = priceData?.tokenProjects?.[0]?.tokens.find((token) => token.chain === currentChain) + const onChainData = currentChainToken?.market + + // Use per-chain price to ensure correct price on each chain (e.g., USDC on Ethereum vs Polygon) + const price = onChainData?.price?.value ?? offChainData?.price?.value ?? lastPrice.current lastPrice.current = price - const priceHistory = offChainData?.priceHistory ?? onChainData?.priceHistory + + // Prefer per-chain price history so multi-chain tokens render the correct chart for the selected chain + const priceHistory = onChainData?.priceHistory ?? offChainData?.priceHistory + + // Use aggregated 24hr change (project-level change is more reliable) const pricePercentChange24h = offChainData?.pricePercentChange24h?.value ?? onChainData?.pricePercentChange24h?.value ?? 0 diff --git a/apps/mobile/src/components/Requests/ScanSheet/AccountSelectPopover.tsx b/apps/mobile/src/components/Requests/ScanSheet/AccountSelectPopover.tsx index 936964566d6..17d09486949 100644 --- a/apps/mobile/src/components/Requests/ScanSheet/AccountSelectPopover.tsx +++ b/apps/mobile/src/components/Requests/ScanSheet/AccountSelectPopover.tsx @@ -96,6 +96,7 @@ export const AccountSelectPopover = ({ textColor="$neutral1" variant="buttonLabel3" captionVariant="body4" + flexGrow={false} /> + navigate(ModalName.ReportTokenIssue, { + currency: portfolioBalance.currencyInfo.currency, + isMarkedSpam: portfolioBalance.currencyInfo.isSpam, + source: 'portfolio', + }) + } onPressToken={handlePressToken} > {tokenBalanceItem} diff --git a/apps/mobile/src/components/TokenDetails/TokenDetailsStats.tsx b/apps/mobile/src/components/TokenDetails/TokenDetailsStats.tsx index be50bcd450a..5f0ccd4bbec 100644 --- a/apps/mobile/src/components/TokenDetails/TokenDetailsStats.tsx +++ b/apps/mobile/src/components/TokenDetails/TokenDetailsStats.tsx @@ -10,9 +10,8 @@ import { DEP_accentColors, validColor } from 'ui/src/theme' import { useTokenBasicInfoPartsFragment, useTokenBasicProjectPartsFragment, - useTokenMarketPartsFragment, - useTokenProjectMarketsPartsFragment, } from 'uniswap/src/data/graphql/uniswap-data-api/fragments' +import { useTokenMarketStats } from 'uniswap/src/features/dataApi/tokenDetails/useTokenDetailsData' import { currencyIdToContractInput } from 'uniswap/src/features/dataApi/utils/currencyIdToContractInput' import { Language } from 'uniswap/src/features/language/constants' import { useCurrentLanguage, useCurrentLanguageInfo } from 'uniswap/src/features/language/hooks' @@ -52,21 +51,8 @@ const TokenDetailsMarketData = memo(function _TokenDetailsMarketData(): JSX.Elem const { currencyId, tokenColor } = useTokenDetailsContext() - const tokenMarket = useTokenMarketPartsFragment({ currencyId }).data.market - const projectMarkets = useTokenProjectMarketsPartsFragment({ currencyId }).data.project?.markets - - const price = projectMarkets?.[0]?.price?.value || tokenMarket?.price?.value || undefined - const marketCap = projectMarkets?.[0]?.marketCap?.value - const volume = tokenMarket?.volume?.value - const rawPriceHigh52W = projectMarkets?.[0]?.priceHigh52W?.value || tokenMarket?.priceHigh52W?.value || undefined - const rawPriceLow52W = projectMarkets?.[0]?.priceLow52W?.value || tokenMarket?.priceLow52W?.value || undefined - - // Use current price for 52w high/low if it exceeds the bounds - const priceHight52W = - price !== undefined && rawPriceHigh52W !== undefined ? Math.max(price, rawPriceHigh52W) : rawPriceHigh52W - const priceLow52W = - price !== undefined && rawPriceLow52W !== undefined ? Math.min(price, rawPriceLow52W) : rawPriceLow52W - const fullyDilutedValuation = projectMarkets?.[0]?.fullyDilutedValuation?.value + // Use shared hook for unified data fetching (CoinGecko-first strategy) + const { marketCap, fdv, volume, high52w, low52w } = useTokenMarketStats(currencyId) return ( @@ -84,7 +70,7 @@ const TokenDetailsMarketData = memo(function _TokenDetailsMarketData(): JSX.Elem statsIcon={} > - {convertFiatAmountFormatted(fullyDilutedValuation, NumberType.FiatTokenStats)} + {convertFiatAmountFormatted(fdv, NumberType.FiatTokenStats)} @@ -102,7 +88,7 @@ const TokenDetailsMarketData = memo(function _TokenDetailsMarketData(): JSX.Elem statsIcon={} > - {convertFiatAmountFormatted(priceHight52W, NumberType.FiatTokenDetails)} + {convertFiatAmountFormatted(high52w, NumberType.FiatTokenDetails)} @@ -111,7 +97,7 @@ const TokenDetailsMarketData = memo(function _TokenDetailsMarketData(): JSX.Elem statsIcon={} > - {convertFiatAmountFormatted(priceLow52W, NumberType.FiatTokenDetails)} + {convertFiatAmountFormatted(low52w, NumberType.FiatTokenDetails)} diff --git a/apps/mobile/src/components/accounts/AccountCardItem.tsx b/apps/mobile/src/components/accounts/AccountCardItem.tsx index 7a0547713e1..9d5cbdc115c 100644 --- a/apps/mobile/src/components/accounts/AccountCardItem.tsx +++ b/apps/mobile/src/components/accounts/AccountCardItem.tsx @@ -3,6 +3,7 @@ import React, { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import ContextMenu from 'react-native-context-menu-view' import { useDispatch } from 'react-redux' +import { MODAL_OPEN_WAIT_TIME } from 'src/app/navigation/constants' import { navigate } from 'src/app/navigation/rootNavigation' import { NotificationBadge } from 'src/components/notifications/Badge' import { Flex, Text, TouchableArea } from 'ui/src' @@ -24,8 +25,6 @@ import { noop } from 'utilities/src/react/noop' import { useAccountListData } from 'wallet/src/features/accounts/useAccountListData' import { useAccounts } from 'wallet/src/features/wallet/hooks' -const MODAL_CLOSE_WAIT_TIME = 300 - type AccountCardItemProps = { address: Address isViewOnly: boolean @@ -130,7 +129,7 @@ export function AccountCardItem({ navigate(ModalName.ConnectionsDappListModal, { address, }) - }, MODAL_CLOSE_WAIT_TIME) + }, MODAL_OPEN_WAIT_TIME) }, [address, onClose]) const onPressRemoveWallet = useCallback(() => { diff --git a/apps/mobile/src/components/activity/ActivityContent.tsx b/apps/mobile/src/components/activity/ActivityContent.tsx index ed12c5ecaaa..6aafda789bd 100644 --- a/apps/mobile/src/components/activity/ActivityContent.tsx +++ b/apps/mobile/src/components/activity/ActivityContent.tsx @@ -3,7 +3,7 @@ import { LegendList } from '@legendapp/list' import { useScrollToTop } from '@react-navigation/native' import { FeatureFlags, useFeatureFlag } from '@universe/gating' import type { ForwardedRef } from 'react' -import { forwardRef, memo, useMemo, useRef } from 'react' +import { forwardRef, memo, useMemo, useRef, useState } from 'react' import type { FlatList } from 'react-native' import { RefreshControl } from 'react-native' import type Animated from 'react-native-reanimated' @@ -16,7 +16,7 @@ import { useBiometricAppSettings } from 'src/features/biometrics/useBiometricApp import { useBiometricPrompt } from 'src/features/biometricsSettings/hooks' import { openModal } from 'src/features/modals/modalSlice' import { removePendingSession } from 'src/features/walletConnect/walletConnectSlice' -import { Flex, useSporeColors } from 'ui/src' +import { Flex, Loader, useSporeColors } from 'ui/src' import { ScannerModalState } from 'uniswap/src/components/ReceiveQRCode/constants' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' @@ -29,6 +29,7 @@ import { useActivityDataWallet } from 'wallet/src/features/activity/useActivityD const ESTIMATED_ITEM_SIZE = 92 const AMOUNT_TO_DRAW = 18 +const ON_END_REACHED_THRESHOLD = 0.1 // trigger onEndReached at 10% of visible length export const ActivityContent = memo( forwardRef, TabProps>(function _ActivityTab( @@ -61,7 +62,16 @@ export const ActivityContent = memo( dispatch(openModal({ name: ModalName.WalletConnectScan, initialState: ScannerModalState.WalletQr })) }) - const { maybeEmptyComponent, renderActivityItem, sectionData, keyExtractor } = useActivityDataWallet({ + const { + maybeEmptyComponent, + renderActivityItem, + sectionData, + keyExtractor, + fetchNextPage, + hasNextPage, + isFetchingNextPage, + refetch, + } = useActivityDataWallet({ evmOwner: owner, authTrigger: requiresBiometrics ? biometricsTrigger : undefined, isExternalProfile, @@ -71,6 +81,20 @@ export const ActivityContent = memo( usePerformanceLogger(DDRumManualTiming.RenderActivityTabList, []) + const [isRefreshing, setIsRefreshing] = useState(false) + + const handleRefresh = useEvent(async () => { + setIsRefreshing(true) + try { + onRefresh?.() + await refetch() + } finally { + setIsRefreshing(false) + } + }) + + const refreshingAll = refreshing ?? isRefreshing + const refreshControl = useMemo(() => { const progressViewOffset = isBottomTabsEnabled ? undefined @@ -79,12 +103,12 @@ export const ActivityContent = memo( return ( ) - }, [isBottomTabsEnabled, insets.top, headerHeight, refreshing, colors.neutral3, onRefresh]) + }, [isBottomTabsEnabled, insets.top, headerHeight, refreshingAll, colors.neutral3, handleRefresh]) const List = renderedInModal ? AnimatedBottomSheetFlatList : AnimatedFlatList @@ -103,11 +127,20 @@ export const ActivityContent = memo( estimatedItemSize={ESTIMATED_ITEM_SIZE} drawDistance={ESTIMATED_ITEM_SIZE * AMOUNT_TO_DRAW} ListEmptyComponent={maybeEmptyComponent} - ListFooterComponent={isExternalProfile ? null : adaptiveFooter} + ListFooterComponent={ + isExternalProfile ? null : ( + + {isFetchingNextPage && } + {adaptiveFooter} + + ) + } contentContainerStyle={containerProps?.contentContainerStyle} refreshControl={refreshControl} - refreshing={refreshing} + refreshing={refreshingAll} onContentSizeChange={onContentSizeChange} + onEndReached={hasNextPage && !isFetchingNextPage ? fetchNextPage : undefined} + onEndReachedThreshold={ON_END_REACHED_THRESHOLD} /> ) : ( + {isFetchingNextPage && } + {adaptiveFooter} + + ) + } onScroll={scrollHandler} onContentSizeChange={onContentSizeChange} + onEndReached={hasNextPage && !isFetchingNextPage ? fetchNextPage : undefined} + onEndReachedThreshold={ON_END_REACHED_THRESHOLD} {...containerProps} /> )} diff --git a/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx b/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx index 910a539088f..a90f7752308 100644 --- a/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx +++ b/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx @@ -8,8 +8,13 @@ import { NotificationPermission, useNotificationOSPermissionsEnabled, } from 'src/features/notifications/hooks/useNotificationOSPermissionsEnabled' -import { Flex } from 'ui/src' -import { BRIDGED_ASSETS_CARD_BANNER, PUSH_NOTIFICATIONS_CARD_BANNER } from 'ui/src/assets' +import { Flex, useIsDarkMode } from 'ui/src' +import { + BRIDGED_ASSETS_CARD_BANNER, + BRIDGED_ASSETS_V2_CARD_BANNER_DARK, + BRIDGED_ASSETS_V2_CARD_BANNER_LIGHT, + PUSH_NOTIFICATIONS_CARD_BANNER, +} from 'ui/src/assets' import { Buy } from 'ui/src/components/icons' import { AccountType } from 'uniswap/src/features/accounts/types' import { UniverseChainId } from 'uniswap/src/features/chains/types' @@ -30,9 +35,14 @@ import { useSharedIntroCards } from 'wallet/src/components/introCards/useSharedI import { useWalletNavigation } from 'wallet/src/contexts/WalletNavigationContext' import { selectHasViewedBridgedAssetsCard, + selectHasViewedBridgedAssetsV2Card, selectHasViewedNotificationsCard, } from 'wallet/src/features/behaviorHistory/selectors' -import { setHasViewedBridgedAssetsCard, setHasViewedNotificationsCard } from 'wallet/src/features/behaviorHistory/slice' +import { + setHasViewedBridgedAssetsCard, + setHasViewedBridgedAssetsV2Card, + setHasViewedNotificationsCard, +} from 'wallet/src/features/behaviorHistory/slice' import { useActiveAccountWithThrow } from 'wallet/src/features/wallet/hooks' type OnboardingIntroCardStackProps = { @@ -44,6 +54,7 @@ export function OnboardingIntroCardStack({ isLoading = false, }: OnboardingIntroCardStackProps): JSX.Element | null { const { t } = useTranslation() + const isDarkMode = useIsDarkMode() const dispatch = useDispatch() const activeAccount = useActiveAccountWithThrow() const address = activeAccount.address @@ -60,6 +71,10 @@ export function OnboardingIntroCardStack({ const hasViewedBridgedAssetCard = useSelector(selectHasViewedBridgedAssetsCard) const shouldShowBridgedAssetCard = useFeatureFlag(FeatureFlags.BridgedAssetsBanner) && !hasViewedBridgedAssetCard + const hasViewedBridgedAssetsV2Card = useSelector(selectHasViewedBridgedAssetsV2Card) + const shouldShowBridgedAssetsV2Card = + useFeatureFlag(FeatureFlags.BridgedAssetsBannerV2) && !hasViewedBridgedAssetsV2Card + const { navigateToSwapFlow } = useWalletNavigation() const navigateToUnitagClaim = useCallback(() => { @@ -151,6 +166,26 @@ export function OnboardingIntroCardStack({ }) } + if (shouldShowBridgedAssetsV2Card) { + output.push({ + loggingName: OnboardingCardLoggingName.BridgedAsset, + graphic: { + type: IntroCardGraphicType.Image, + image: isDarkMode ? BRIDGED_ASSETS_V2_CARD_BANNER_DARK : BRIDGED_ASSETS_V2_CARD_BANNER_LIGHT, + }, + title: t('onboarding.home.intro.bridgedAssets.title'), + description: t('onboarding.home.intro.bridgedAssets.description.v2'), + cardType: CardType.Dismissible, + onPress: () => { + navigateToBridgedAssetSwap() + dispatch(setHasViewedBridgedAssetsV2Card(true)) + }, + onClose: () => { + dispatch(setHasViewedBridgedAssetsV2Card(true)) + }, + }) + } + if (shouldShowBridgedAssetCard) { output.push({ loggingName: OnboardingCardLoggingName.BridgedAsset, @@ -177,9 +212,11 @@ export function OnboardingIntroCardStack({ isSignerAccount, sharedCards, t, + isDarkMode, dispatch, navigateToBridgedAssetSwap, shouldShowBridgedAssetCard, + shouldShowBridgedAssetsV2Card, showEnableNotificationsCard, ]) diff --git a/apps/mobile/src/components/modals/ReactNavigationModals/ReactNavigationModal.tsx b/apps/mobile/src/components/modals/ReactNavigationModals/ReactNavigationModal.tsx index 64cbdf8aac4..7e8b9ad958b 100644 --- a/apps/mobile/src/components/modals/ReactNavigationModals/ReactNavigationModal.tsx +++ b/apps/mobile/src/components/modals/ReactNavigationModals/ReactNavigationModal.tsx @@ -4,6 +4,8 @@ import { useReactNavigationModal } from 'src/components/modals/useReactNavigatio import type { GetProps } from 'ui/src' import { BridgedAssetModal } from 'uniswap/src/components/BridgedAsset/BridgedAssetModal' import { WormholeModal } from 'uniswap/src/components/BridgedAsset/WormholeModal' +import { ReportTokenDataModal } from 'uniswap/src/components/reporting/ReportTokenDataModal' +import { ReportTokenIssueModal } from 'uniswap/src/components/reporting/ReportTokenIssueModal' import { PasskeyManagementModal } from 'uniswap/src/features/passkey/PasskeyManagementModal' import { PasskeysHelpModal } from 'uniswap/src/features/passkey/PasskeysHelpModal' import { ModalName } from 'uniswap/src/features/telemetry/constants' @@ -31,6 +33,8 @@ type ValidModalNames = keyof Pick< | typeof ModalName.LanguageSelector | typeof ModalName.BridgedAsset | typeof ModalName.Wormhole + | typeof ModalName.ReportTokenIssue + | typeof ModalName.ReportTokenData > type ModalNameWithComponentProps = { @@ -46,6 +50,8 @@ type ModalNameWithComponentProps = { [ModalName.LanguageSelector]: GetProps [ModalName.BridgedAsset]: GetProps [ModalName.Wormhole]: GetProps + [ModalName.ReportTokenIssue]: GetProps + [ModalName.ReportTokenData]: GetProps } type NavigationModalProps = { diff --git a/apps/mobile/src/components/modals/ReactNavigationModals/ReportTokenDataModalScreen.tsx b/apps/mobile/src/components/modals/ReactNavigationModals/ReportTokenDataModalScreen.tsx new file mode 100644 index 00000000000..0cf6770c2b4 --- /dev/null +++ b/apps/mobile/src/components/modals/ReactNavigationModals/ReportTokenDataModalScreen.tsx @@ -0,0 +1,10 @@ +import { AppStackScreenProp } from 'src/app/navigation/types' +import { ReactNavigationModal } from 'src/components/modals/ReactNavigationModals/ReactNavigationModal' +import { ReportTokenDataModal } from 'uniswap/src/components/reporting/ReportTokenDataModal' +import { ModalName } from 'uniswap/src/features/telemetry/constants' + +export const ReportTokenDataModalScreen = ( + props: AppStackScreenProp, +): JSX.Element => { + return +} diff --git a/apps/mobile/src/components/modals/ReactNavigationModals/ReportTokenIssueModalScreen.tsx b/apps/mobile/src/components/modals/ReactNavigationModals/ReportTokenIssueModalScreen.tsx new file mode 100644 index 00000000000..aba9bc3f71a --- /dev/null +++ b/apps/mobile/src/components/modals/ReactNavigationModals/ReportTokenIssueModalScreen.tsx @@ -0,0 +1,10 @@ +import { AppStackScreenProp } from 'src/app/navigation/types' +import { ReactNavigationModal } from 'src/components/modals/ReactNavigationModals/ReactNavigationModal' +import { ReportTokenIssueModal } from 'uniswap/src/components/reporting/ReportTokenIssueModal' +import { ModalName } from 'uniswap/src/features/telemetry/constants' + +export const ReportTokenIssueModalScreen = ( + props: AppStackScreenProp, +): JSX.Element => { + return +} diff --git a/apps/mobile/src/features/deepLinking/configUtils.ts b/apps/mobile/src/features/deepLinking/configUtils.ts index 19231b35d75..e182bed83f6 100644 --- a/apps/mobile/src/features/deepLinking/configUtils.ts +++ b/apps/mobile/src/features/deepLinking/configUtils.ts @@ -1,25 +1,6 @@ -import { - DeepLinkUrlAllowlist, - DeepLinkUrlAllowlistConfigKey, - DynamicConfigs, - getDynamicConfigValue, - UwULinkAllowlist, - UwuLinkConfigKey, -} from '@universe/gating' +import { DynamicConfigs, getDynamicConfigValue, UwULinkAllowlist, UwuLinkConfigKey } from '@universe/gating' import { isUwULinkAllowlistType } from 'uniswap/src/features/gating/typeGuards' -/** - * Gets the in-app browser allowlist from dynamic config. - * This function wraps getDynamicConfigValue for easier testing. - */ -export function getInAppBrowserAllowlist(): DeepLinkUrlAllowlist { - return getDynamicConfigValue({ - config: DynamicConfigs.DeepLinkUrlAllowlist, - key: DeepLinkUrlAllowlistConfigKey.AllowedUrls, - defaultValue: { allowedUrls: [] }, - }) -} - /** * Gets the UwuLink allowlist from dynamic config. * This function wraps getDynamicConfigValue for easier testing. diff --git a/apps/mobile/src/features/deepLinking/deepLinkUtils.test.ts b/apps/mobile/src/features/deepLinking/deepLinkUtils.test.ts index d1b329914e6..0cc51ce831d 100644 --- a/apps/mobile/src/features/deepLinking/deepLinkUtils.test.ts +++ b/apps/mobile/src/features/deepLinking/deepLinkUtils.test.ts @@ -1,10 +1,4 @@ import { DeepLinkAction, parseDeepLinkUrl } from 'src/features/deepLinking/deepLinkUtils' -import { logger } from 'utilities/src/logger/logger' - -// Mock the config utils -jest.mock('src/features/deepLinking/configUtils', () => ({ - getInAppBrowserAllowlist: jest.fn(() => ({ allowedUrls: [] })), -})) // Mock the logger jest.mock('utilities/src/logger/logger', () => ({ @@ -13,11 +7,6 @@ jest.mock('utilities/src/logger/logger', () => ({ }, })) -const mockGetInAppBrowserAllowlist = jest.mocked( - require('src/features/deepLinking/configUtils').getInAppBrowserAllowlist, -) -const mockLogger = jest.mocked(logger) - describe('getDeepLinkAction', () => { it.each` url | expected @@ -38,84 +27,11 @@ describe('getDeepLinkAction', () => { ${'uniswap://app/fiatonramp?userAddress=0x123&source=push'} | ${DeepLinkAction.FiatOnRampScreen} ${'uniswap://app/fiatonramp?source=push&moonpayOnly=true&moonpayCurrencyCode=usdc&amount=100'} | ${DeepLinkAction.FiatOnRampScreen} ${'uniswap://app/tokendetails?currencyId=10-0x6fd9d7ad17242c41f7131d257212c54a0e816691&source=push'} | ${DeepLinkAction.TokenDetails} + ${'https://cryptothegame.com/'} | ${DeepLinkAction.UniswapExternalBrowserLink} + ${'https://support.uniswap.org/hc/en-us/articles/test-article-123'} | ${DeepLinkAction.UniswapExternalBrowserLink} + ${'https://blog.uniswap.org/article'} | ${DeepLinkAction.UniswapExternalBrowserLink} + ${'https://uniswapx.uniswap.org/'} | ${DeepLinkAction.UniswapExternalBrowserLink} `('url=$url should return expected=$expected', ({ url, expected }) => { expect(parseDeepLinkUrl(url).action).toEqual(expected) }) }) - -describe('parseDeepLinkUrl allowlist behavior', () => { - beforeEach(() => { - jest.clearAllMocks() - }) - - describe('when allowlist is empty', () => { - beforeEach(() => { - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: [] }) - }) - - it('should return Unknown action and log appropriate error message', () => { - const url = 'https://example.com/test' - const result = parseDeepLinkUrl(url) - - expect(result.action).toBe(DeepLinkAction.Unknown) - expect(mockLogger.error).toHaveBeenCalledWith( - `No allowlist configured for browser opening, rejecting URL: ${url}`, - { - tags: { file: 'deepLinkUtils', function: 'parseDeepLinkUrl' }, - }, - ) - expect(mockLogger.error).toHaveBeenCalledWith(`Unknown deep link action for url=${url}`, { - tags: { file: 'deepLinkUtils', function: 'parseDeepLinkUrl' }, - }) - }) - }) - - describe('when allowlist is non-empty but URL is not allowlisted', () => { - beforeEach(() => { - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: ['https://trusted.com'] }) - }) - - it('should return Unknown action and log URL not allowlisted error', () => { - const url = 'https://untrusted.com/test' - const result = parseDeepLinkUrl(url) - - expect(result.action).toBe(DeepLinkAction.Unknown) - expect(mockLogger.error).toHaveBeenCalledWith(`URL not allowlisted for browser opening: ${url}`, { - tags: { file: 'deepLinkUtils', function: 'parseDeepLinkUrl' }, - }) - expect(mockLogger.error).toHaveBeenCalledWith(`Unknown deep link action for url=${url}`, { - tags: { file: 'deepLinkUtils', function: 'parseDeepLinkUrl' }, - }) - }) - }) - - describe('when URL is allowlisted', () => { - beforeEach(() => { - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: [{ url: 'https://example.com', openInApp: true }] }) - }) - - it('should return InAppBrowser action without logging errors', () => { - const url = 'https://example.com/test' - const result = parseDeepLinkUrl(url) - - expect(result.action).toBe(DeepLinkAction.InAppBrowser) - if (result.action === DeepLinkAction.InAppBrowser) { - expect(result.data.targetUrl).toBe(url) - expect(result.data.openInApp).toBe(true) - } - expect(mockLogger.error).not.toHaveBeenCalled() - }) - - it('should respect openInApp configuration', () => { - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: [{ url: 'https://example.com', openInApp: false }] }) - - const url = 'https://example.com/test' - const result = parseDeepLinkUrl(url) - - expect(result.action).toBe(DeepLinkAction.InAppBrowser) - if (result.action === DeepLinkAction.InAppBrowser) { - expect(result.data.openInApp).toBe(false) - } - }) - }) -}) diff --git a/apps/mobile/src/features/deepLinking/deepLinkUtils.ts b/apps/mobile/src/features/deepLinking/deepLinkUtils.ts index 318a9e14845..6bcb8ba2605 100644 --- a/apps/mobile/src/features/deepLinking/deepLinkUtils.ts +++ b/apps/mobile/src/features/deepLinking/deepLinkUtils.ts @@ -1,7 +1,5 @@ -import { DeepLinkUrlAllowlist } from '@universe/gating' import { getScantasticQueryParams } from 'src/components/Requests/ScanSheet/util' import { UNISWAP_URL_SCHEME_UWU_LINK } from 'src/components/Requests/Uwulink/utils' -import { getInAppBrowserAllowlist } from 'src/features/deepLinking/configUtils' import { UNISWAP_URL_SCHEME, UNISWAP_URL_SCHEME_SCANTASTIC, @@ -17,6 +15,7 @@ const WALLETCONNECT_URI_SCHEME = 'wc:' // https://eips.ethereum.org/EIPS/eip-132 export enum DeepLinkAction { UniswapWebLink = 'uniswapWebLink', + UniswapExternalBrowserLink = 'uniswapExternalBrowserLink', UniswapWalletConnect = 'uniswapWalletConnect', WalletConnectAsParam = 'walletConnectAsParam', UniswapWidget = 'uniswapWidget', @@ -29,7 +28,6 @@ export enum DeepLinkAction { SkipNonWalletConnect = 'skipNonWalletConnect', UniversalWalletConnectLink = 'universalWalletConnectLink', WalletConnect = 'walletConnect', - InAppBrowser = 'inAppBrowser', Error = 'error', Unknown = 'unknown', TokenDetails = 'tokenDetails', @@ -85,6 +83,7 @@ export type PayloadWithFiatOnRampParams = BasePayload & { export type DeepLinkActionResult = | { action: DeepLinkAction.UniswapWebLink; data: BasePayload & { urlPath: string } } + | { action: DeepLinkAction.UniswapExternalBrowserLink; data: BasePayload & { urlPath: string } } | { action: DeepLinkAction.WalletConnectAsParam; data: PayloadWithWcUri } | { action: DeepLinkAction.UniswapWalletConnect; data: PayloadWithWcUri } | { action: DeepLinkAction.UniswapWidget; data: BasePayload } @@ -97,7 +96,6 @@ export type DeepLinkActionResult = | { action: DeepLinkAction.SkipNonWalletConnect; data: BasePayload } | { action: DeepLinkAction.UniversalWalletConnectLink; data: PayloadWithWcUri } | { action: DeepLinkAction.WalletConnect; data: BasePayload & { wcUri: string } } - | { action: DeepLinkAction.InAppBrowser; data: BasePayload & { targetUrl: string; openInApp: boolean } } | { action: DeepLinkAction.TokenDetails; data: BasePayload & { currencyId: string } } | { action: DeepLinkAction.FiatOnRampScreen; data: PayloadWithFiatOnRampParams } | { action: DeepLinkAction.Error; data: BasePayload } @@ -105,56 +103,6 @@ export type DeepLinkActionResult = type DeepLinkHandler = (url: URL, data: BasePayload) => DeepLinkActionResult -/** - * Checks if a URL is allowlisted for browser opening and returns the configuration. - * This function should be called with the dynamic config value. - * - * @param urlString - The URL to check. - * @param allowList - Allowlist from dynamic config. - * @returns Object with isAllowed and openInApp flags, or null if not allowlisted. - */ -function getUrlAllowlistConfig( - urlString: string, - allowList: DeepLinkUrlAllowlist, -): { isAllowed: boolean; openInApp: boolean } { - try { - const url = new URL(urlString) - - // Only allow HTTPS protocol - if (url.protocol !== 'https:') { - return { isAllowed: false, openInApp: false } - } - - const urlToCheck = `${url.protocol}//${url.hostname}${url.pathname}` - - for (const allowedItem of allowList.allowedUrls) { - const allowedUrl = typeof allowedItem === 'string' ? allowedItem : allowedItem.url - const openInApp = typeof allowedItem === 'string' ? true : (allowedItem.openInApp ?? true) // Default to in-app - - try { - // Support both exact matches and hostname matches - if (allowedUrl === urlString || allowedUrl === urlToCheck) { - return { isAllowed: true, openInApp } - } - - // Support hostname-only matches (e.g., "example.com" matches "https://example.com/any/path") - // Always use HTTPS for allowed URL validation - const allowedUrlObj = new URL(allowedUrl.startsWith('https://') ? allowedUrl : `https://${allowedUrl}`) - if (url.hostname === allowedUrlObj.hostname) { - return { isAllowed: true, openInApp } - } - } catch { - // If allowedUrl is not a valid URL, reject it for security - continue - } - } - - return { isAllowed: false, openInApp: false } - } catch { - return { isAllowed: false, openInApp: false } - } -} - /** * Parses a deep link URL and returns the action to be taken as well as * any additional data that may be needed to handle the deep link. @@ -174,6 +122,10 @@ export function parseDeepLinkUrl(urlString: string): DeepLinkActionResult { } } + if (isValidUniswapExternalWebLink(urlString)) { + return { action: DeepLinkAction.UniswapExternalBrowserLink, data: { ...data, urlPath: url.pathname } } + } + const urlPath = url.pathname const userAddress = url.searchParams.get('userAddress') ?? undefined const fiatOnRamp = url.searchParams.get('fiatOnRamp') === 'true' @@ -290,35 +242,8 @@ export function parseDeepLinkUrl(urlString: string): DeepLinkActionResult { return { action: DeepLinkAction.WalletConnect, data: { ...data, wcUri } } } - // Check if URL is allowlisted for browser opening - const inAppBrowserAllowlist = getInAppBrowserAllowlist() - - // Always perform allowlist check for consistent behavior and logging - const allowlistConfig = getUrlAllowlistConfig(urlString, inAppBrowserAllowlist) - if (allowlistConfig.isAllowed) { - return { - action: DeepLinkAction.InAppBrowser, - data: { ...data, targetUrl: urlString, openInApp: allowlistConfig.openInApp }, - } - } - - // Log appropriate message based on allowlist state - if (inAppBrowserAllowlist.allowedUrls.length === 0) { - logger.error(`No allowlist configured for browser opening, rejecting URL: ${urlString}`, { - tags: { file: 'deepLinkUtils', function: 'parseDeepLinkUrl' }, - }) - } else { - logger.error(`URL not allowlisted for browser opening: ${urlString}`, { - tags: { file: 'deepLinkUtils', function: 'parseDeepLinkUrl' }, - }) - } - - logger.error(`Unknown deep link action for url=${urlString}`, { - tags: { file: 'deepLinkUtils', function: 'parseDeepLinkUrl' }, - }) return { action: DeepLinkAction.Unknown, data } } - const handlers: Record = { [UNISWAP_WEB_HOSTNAME]: (url, data) => { const urlParts = url.href.split(`${UNISWAP_WEB_HOSTNAME}/`) @@ -368,6 +293,17 @@ const handlers: Record = { }), } +const UNISWAP_EXTERNAL_WEB_LINK_VALID_REGEXES = [ + // eslint-disable-next-line security/detect-unsafe-regex + /^https:\/\/([a-zA-Z0-9-]+)\.uniswap\.org(\/.*)?$/, + // eslint-disable-next-line security/detect-unsafe-regex + /^https:\/\/cryptothegame\.com(\/.*)?$/, +] + +function isValidUniswapExternalWebLink(urlString: string): boolean { + return UNISWAP_EXTERNAL_WEB_LINK_VALID_REGEXES.some((regex) => regex.test(urlString)) +} + /** * Extracts the WalletConnect URI from a URL string. * diff --git a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts index 9424abf457a..f3133c385fd 100644 --- a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts +++ b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts @@ -10,7 +10,6 @@ import { ONRAMP_DEEPLINK_DELAY, parseAndValidateUserAddress, } from 'src/features/deepLinking/handleDeepLinkSaga' -import { handleInAppBrowser } from 'src/features/deepLinking/handleInAppBrowserSaga' import { handleOnRampReturnLink } from 'src/features/deepLinking/handleOnRampReturnLinkSaga' import { handleTransactionLink } from 'src/features/deepLinking/handleTransactionLinkSaga' import { handleUniswapAppDeepLink } from 'src/features/deepLinking/handleUniswapAppDeepLink' @@ -50,16 +49,6 @@ jest.mock('@universe/gating', () => ({ getFeatureFlag: jest.fn(() => false), // Default to false for feature flags })) -jest.mock('src/features/deepLinking/configUtils', () => ({ - getInAppBrowserAllowlist: jest.fn(() => ({ allowedUrls: [] })), // Default to empty allowlist - getUwuLinkAllowlist: jest.fn(() => ({ contracts: [], tokenRecipients: [] })), // Default to empty allowlist -})) - -// Get the mocked functions for proper typing -const mockGetInAppBrowserAllowlist = jest.mocked( - require('src/features/deepLinking/configUtils').getInAppBrowserAllowlist, -) - const account = signerMnemonicAccount() const swapUrl = `https://uniswap.org/app?screen=swap&userAddress=${account.address}&inputCurrencyId=${SAMPLE_CURRENCY_ID_1}&outputCurrencyId=${SAMPLE_CURRENCY_ID_2}¤cyField=INPUT` @@ -658,363 +647,4 @@ describe(handleDeepLink, () => { .returns(undefined) .silentRun() }) - - describe('In-app browser functionality', () => { - const testUrl = 'https://example.com/test' - const testUrlPayload = { url: testUrl, coldStart: false } - - beforeEach(() => { - // Reset the mock before each test - mockGetInAppBrowserAllowlist.mockClear() - }) - - it('Handles allowlisted URL with openInApp=true (default)', () => { - const mockAllowlist = [{ url: 'https://example.com', openInApp: true }] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - return expectSaga(handleDeepLink, { payload: testUrlPayload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(handleInAppBrowser, testUrl, true) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.InAppBrowser, - url: testUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - }) - - it('Handles allowlisted URL with openInApp=false (external browser)', () => { - const mockAllowlist = [{ url: 'https://example.com', openInApp: false }] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - return expectSaga(handleDeepLink, { payload: testUrlPayload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(handleInAppBrowser, testUrl, false) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.InAppBrowser, - url: testUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - }) - - it('Handles allowlisted URL with string format (defaults to openInApp=true)', () => { - const mockAllowlist = ['https://example.com'] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - return expectSaga(handleDeepLink, { payload: testUrlPayload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(handleInAppBrowser, testUrl, true) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.InAppBrowser, - url: testUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - }) - - it('Handles hostname matching with openInApp configuration', () => { - const mockAllowlist = [{ url: 'example.com', openInApp: false }] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - return expectSaga(handleDeepLink, { payload: testUrlPayload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(handleInAppBrowser, testUrl, false) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.InAppBrowser, - url: testUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - }) - - it('Handles allowlisted URL without active account', () => { - const mockAllowlist = [{ url: 'https://example.com', openInApp: true }] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - return expectSaga(handleDeepLink, { payload: testUrlPayload, type: '' }) - .withState({ - wallet: { - accounts: {}, - activeAccountAddress: null, - }, - }) - .call(handleInAppBrowser, testUrl, true) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.InAppBrowser, - url: testUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - }) - - it('Rejects non-allowlisted URL and logs error', () => { - const mockAllowlist = [{ url: 'https://trusted.com', openInApp: true }] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - const consoleSpy = jest.spyOn(console, 'error').mockImplementation(() => undefined) - - return expectSaga(handleDeepLink, { payload: testUrlPayload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.Unknown, - url: testUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - .finally(() => { - consoleSpy.mockRestore() - }) - }) - - it('Handles mixed allowlist with different URL formats and openInApp settings', () => { - const testUrl2 = 'https://docs.example.com/help' - const testUrl2Payload = { url: testUrl2, coldStart: false } - - const mockAllowlist = [ - 'https://example.com', // String format - defaults to openInApp=true - { url: 'https://docs.example.com', openInApp: false }, // Object format - external browser - { url: 'trusted-site.com', openInApp: true }, // Hostname matching - in-app browser - ] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - return expectSaga(handleDeepLink, { payload: testUrl2Payload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(handleInAppBrowser, testUrl2, false) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.InAppBrowser, - url: testUrl2, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - }) - - it('Handles empty allowlist', () => { - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: [] }) - - const consoleSpy = jest.spyOn(console, 'error').mockImplementation(() => undefined) - - return expectSaga(handleDeepLink, { payload: testUrlPayload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.Unknown, - url: testUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - .finally(() => { - consoleSpy.mockRestore() - }) - }) - - it('Handles URL with query parameters and fragments', () => { - const complexUrl = 'https://example.com/path?param=value#section' - const complexUrlPayload = { url: complexUrl, coldStart: false } - - const mockAllowlist = [{ url: 'https://example.com', openInApp: true }] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - return expectSaga(handleDeepLink, { payload: complexUrlPayload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(handleInAppBrowser, complexUrl, true) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.InAppBrowser, - url: complexUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - }) - - // Security tests for URL validation - describe('URL validation security', () => { - const consoleSpy = jest.spyOn(console, 'error').mockImplementation(() => undefined) - - afterEach(() => { - consoleSpy.mockClear() - }) - - afterAll(() => { - consoleSpy.mockRestore() - }) - - it('Rejects malicious URLs that would match allowlist substrings', () => { - // Test case: allowlist contains "example.com" but malicious URL contains it as substring - const mockAllowlist = ['example.com'] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - const maliciousUrls = [ - 'https://malicious-example.com/steal-data', - 'https://notexample.com/example.com', - 'https://example.com.evil.com/phishing', - 'https://sub.example.com.attacker.com/fake', - ] - - const testMaliciousUrl = (maliciousUrl: string): Promise => { - const payload = { url: maliciousUrl, coldStart: false } - return expectSaga(handleDeepLink, { payload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.Unknown, - url: maliciousUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - } - - const promises = maliciousUrls.map(testMaliciousUrl) - return Promise.all(promises) - }) - - it('Rejects URLs with invalid allowlist entries that would previously use includes() fallback', () => { - // Test case: allowlist contains invalid URL strings that would trigger the dangerous fallback - const mockAllowlist = [ - 'invalid-url-format', // This is not a valid URL - '://malformed-url', - 'just-a-string', - ] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - const invalidTestUrls = [ - 'https://malicious-invalid-url-format.com/attack', - 'https://evil.com/invalid-url-format', - 'https://attacker.com/path?param=invalid-url-format', - ] - - const testInvalidUrl = (invalidTestUrl: string): Promise => { - const payload = { url: invalidTestUrl, coldStart: false } - return expectSaga(handleDeepLink, { payload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.Unknown, - url: invalidTestUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - } - - const promises = invalidTestUrls.map(testInvalidUrl) - return Promise.all(promises) - }) - - it('Still allows legitimate URLs that match hostname exactly', () => { - const mockAllowlist = ['example.com'] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - const legitimateUrls = [ - 'https://example.com/', - 'https://example.com/path', - 'https://example.com/path?param=value', - 'https://example.com/path?param=value#fragment', - ] - - const testLegitimateUrl = (legitimateUrl: string): Promise => { - const payload = { url: legitimateUrl, coldStart: false } - return expectSaga(handleDeepLink, { payload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(handleInAppBrowser, legitimateUrl, true) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.InAppBrowser, - url: legitimateUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - } - - const promises = legitimateUrls.map(testLegitimateUrl) - return Promise.all(promises) - }) - - it('Rejects non-HTTPS URLs even if they match allowlist', () => { - const mockAllowlist = ['example.com'] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - const insecureUrls = ['http://example.com/', 'ftp://example.com/', 'file://example.com/'] - - const testInsecureUrl = (insecureUrl: string): Promise => { - const payload = { url: insecureUrl, coldStart: false } - return expectSaga(handleDeepLink, { payload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.Unknown, - url: insecureUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - } - - const promises = insecureUrls.map(testInsecureUrl) - return Promise.all(promises) - }) - - it('Handles edge cases with subdomain attacks', () => { - const mockAllowlist = ['trusted.com'] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - // These should be rejected - they are different hostnames - const subdomainAttackUrls = [ - 'https://evil.trusted.com.attacker.com/', - 'https://trusted.com.evil.com/', - 'https://anytrusted.com/', - 'https://trusted.com.fake/', - ] - - const testAttackUrl = (attackUrl: string): Promise => { - const payload = { url: attackUrl, coldStart: false } - return expectSaga(handleDeepLink, { payload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.Unknown, - url: attackUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - } - - const promises = subdomainAttackUrls.map(testAttackUrl) - return Promise.all(promises) - }) - }) - }) }) diff --git a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts index c115585ae5b..ffa647d65d9 100644 --- a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts +++ b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts @@ -16,7 +16,6 @@ import { PayloadWithFiatOnRampParams, parseDeepLinkUrl, } from 'src/features/deepLinking/deepLinkUtils' -import { handleInAppBrowser } from 'src/features/deepLinking/handleInAppBrowserSaga' import { handleOffRampReturnLink } from 'src/features/deepLinking/handleOffRampReturnLinkSaga' import { handleOnRampReturnLink } from 'src/features/deepLinking/handleOnRampReturnLinkSaga' import { handleSwapLink } from 'src/features/deepLinking/handleSwapLinkSaga' @@ -66,8 +65,6 @@ export function* handleDeepLink(action: ReturnType) { if (!activeAccount) { if (deepLinkAction.action === DeepLinkAction.UniswapWebLink) { yield* call(openUri, { uri: deepLinkAction.data.url.toString(), openExternalBrowser: true }) - } else if (deepLinkAction.action === DeepLinkAction.InAppBrowser) { - yield* call(handleInAppBrowser, deepLinkAction.data.targetUrl, deepLinkAction.data.openInApp) } // If there is no active account, we don't want to handle other deep links } else { @@ -80,6 +77,10 @@ export function* handleDeepLink(action: ReturnType) { }) break } + case DeepLinkAction.UniswapExternalBrowserLink: { + yield* call(openUri, { uri: deepLinkAction.data.url.toString(), openExternalBrowser: true }) + break + } case DeepLinkAction.WalletConnectAsParam: case DeepLinkAction.UniswapWalletConnect: { yield* call(handleWalletConnectDeepLink, deepLinkAction.data.wcUri) @@ -101,10 +102,6 @@ export function* handleDeepLink(action: ReturnType) { yield* call(handleUwuLinkDeepLink, deepLinkAction.data.url.toString()) break } - case DeepLinkAction.InAppBrowser: { - yield* call(handleInAppBrowser, deepLinkAction.data.targetUrl, deepLinkAction.data.openInApp) - break - } case DeepLinkAction.TransactionScreen: case DeepLinkAction.ShowTransactionAfterFiatOnRamp: case DeepLinkAction.ShowTransactionAfterFiatOffRampScreen: diff --git a/apps/mobile/src/features/deepLinking/handleInAppBrowserSaga.ts b/apps/mobile/src/features/deepLinking/handleInAppBrowserSaga.ts deleted file mode 100644 index 3503cfc20f4..00000000000 --- a/apps/mobile/src/features/deepLinking/handleInAppBrowserSaga.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { call } from 'typed-redux-saga' -import { openUri } from 'uniswap/src/utils/linking' -import { logger } from 'utilities/src/logger/logger' - -/** - * Opens a URL in a browser window (in-app or external). - * - * @param url - The URL to open - * @param openInApp - If true, opens in in-app browser; if false, opens in external browser - */ -export function* handleInAppBrowser(url: string, openInApp: boolean = true) { - try { - const browserType = openInApp ? 'in-app browser' : 'external browser' - yield* call(logger.info, 'handleInAppBrowserSaga', 'handleInAppBrowser', `Opening URL in ${browserType}: ${url}`) - - // Open the URL using openUri with the specified browser preference - yield* call(openUri, { - uri: url, - openExternalBrowser: !openInApp, // Use external browser if openInApp is false - isSafeUri: true, // URL has been allowlisted so it's safe - }) - - yield* call( - logger.info, - 'handleInAppBrowserSaga', - 'handleInAppBrowser', - `Successfully opened URL in ${browserType}: ${url}`, - ) - } catch (error) { - yield* call(logger.error, error, { - tags: { file: 'handleInAppBrowserSaga', function: 'handleInAppBrowser' }, - extra: { url }, - }) - } -} diff --git a/apps/mobile/src/features/notifications/Onesignal.ts b/apps/mobile/src/features/notifications/Onesignal.ts index b95f823dba7..6d3741c91d9 100644 --- a/apps/mobile/src/features/notifications/Onesignal.ts +++ b/apps/mobile/src/features/notifications/Onesignal.ts @@ -1,6 +1,7 @@ import { Linking } from 'react-native' import { OneSignal } from 'react-native-onesignal' import { NotificationType } from 'src/features/notifications/constants' +import { startSilentPushListener } from 'src/features/notifications/SilentPushListener' import { config } from 'uniswap/src/config' import { GQL_QUERIES_TO_REFETCH_ON_TXN_UPDATE } from 'uniswap/src/features/portfolio/portfolioUpdates/constants' import { getUniqueId } from 'utilities/src/device/uniqueId' @@ -15,6 +16,8 @@ export const initOneSignal = (): void => { OneSignal.initialize(config.onesignalAppId) + startSilentPushListener() + OneSignal.Notifications.addEventListener('foregroundWillDisplay', (event) => { const notification = event.getNotification() const additionalData = notification.additionalData as { notification_type?: string } | undefined @@ -72,6 +75,12 @@ export const initOneSignal = (): void => { export const promptPushPermission = async (): Promise => { const response = await OneSignal.Notifications.requestPermission(true) logger.debug('Onesignal', 'promptForPushNotificationsWithUserResponse', `Prompt response: ${response}`) + + // Explicitly opt in to push notifications if permission was granted + if (response) { + OneSignal.User.pushSubscription.optIn() + } + return response } diff --git a/apps/mobile/src/features/notifications/SilentPushListener.ts b/apps/mobile/src/features/notifications/SilentPushListener.ts new file mode 100644 index 00000000000..395825bd05e --- /dev/null +++ b/apps/mobile/src/features/notifications/SilentPushListener.ts @@ -0,0 +1,70 @@ +import { NativeEventEmitter, NativeModules, Platform } from 'react-native' +import { WalletEventName } from 'uniswap/src/features/telemetry/constants/wallet' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' +import { logger } from 'utilities/src/logger/logger' +import { isMobileApp } from 'utilities/src/platform' + +const EVENT_NAME = 'SilentPushReceived' + +interface SilentPushEventEmitterInterface { + addListener: (eventName: string) => void + removeListeners: (count: number) => void +} + +declare module 'react-native' { + interface NativeModulesStatic { + SilentPushEventEmitter: SilentPushEventEmitterInterface + } +} + +const { SilentPushEventEmitter } = NativeModules + +const eventEmitter = isMobileApp ? new NativeEventEmitter(SilentPushEventEmitter) : undefined + +let subscription: { remove: () => void } | undefined + +const handleSilentPush = (payload: Record): void => { + logger.debug('SilentPush', 'handleSilentPush', 'Silent push received', payload) + + // Onesignal Silent Push payload stores the template id in the 'custom' object with key 'i' + if ('custom' in payload && payload.custom) { + try { + const customPayload = typeof payload.custom === 'string' ? JSON.parse(payload.custom) : payload.custom + + if (!('i' in customPayload) || typeof customPayload.i !== 'string') { + return + } + + sendAnalyticsEvent(WalletEventName.SilentPushReceived, { + template_id: customPayload.i, + }) + logger.debug('SilentPush', 'handleSilentPush', 'Silent push event sent', { + template_id: customPayload.i, + }) + } catch (error) { + logger.error(error, { + tags: { + file: 'SilentPushListener.ts', + function: 'handleSilentPush', + }, + }) + } + } +} + +export const startSilentPushListener = (): void => { + if (subscription) { + return + } + + if (!eventEmitter) { + logger.warn('SilentPush', 'startSilentPushListener', 'Native event emitter unavailable', { + platform: Platform.OS, + moduleLoaded: Boolean(SilentPushEventEmitter), + }) + return + } + + subscription = eventEmitter.addListener(EVENT_NAME, handleSilentPush) + logger.debug('SilentPush', 'startSilentPushListener', 'Listener registered') +} diff --git a/apps/mobile/src/features/send/SendTokenForm.tsx b/apps/mobile/src/features/send/SendTokenForm.tsx index bc64573a93b..96e402547cd 100644 --- a/apps/mobile/src/features/send/SendTokenForm.tsx +++ b/apps/mobile/src/features/send/SendTokenForm.tsx @@ -295,7 +295,7 @@ export function SendTokenForm(): JSX.Element { style={StyleSheet.absoluteFill} > - + diff --git a/apps/mobile/src/screens/ActivityScreen.tsx b/apps/mobile/src/screens/ActivityScreen.tsx index 5ab318ab1fa..27c7df44c4b 100644 --- a/apps/mobile/src/screens/ActivityScreen.tsx +++ b/apps/mobile/src/screens/ActivityScreen.tsx @@ -1,44 +1,18 @@ -import { useApolloClient } from '@apollo/client' import { useScrollToTop } from '@react-navigation/native' -import { useQuery } from '@tanstack/react-query' -import { GQLQueries } from '@universe/api' import { FeatureFlags, useFeatureFlag } from '@universe/gating' -import { useCallback, useEffect, useMemo, useRef } from 'react' +import { useEffect, useMemo, useRef } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' import { ESTIMATED_BOTTOM_TABS_HEIGHT } from 'src/app/navigation/tabs/CustomTabBar/constants' import { ActivityContent } from 'src/components/activity/ActivityContent' import { Screen } from 'src/components/layout/Screen' -import { useAppStateTrigger } from 'src/utils/useAppStateTrigger' import { Text } from 'ui/src' import { spacing } from 'ui/src/theme' import { useSelectAddressHasNotifications } from 'uniswap/src/features/notifications/slice/hooks' import { setNotificationStatus } from 'uniswap/src/features/notifications/slice/slice' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' -import { ReactQueryCacheKey } from 'utilities/src/reactQuery/cache' import { useActiveAccountWithThrow } from 'wallet/src/features/wallet/hooks' -const useRefreshActivityData = (owner: Address): { refreshing: boolean; onRefreshActivityData: () => void } => { - const apolloClient = useApolloClient() - - const refreshFn = useCallback( - () => - apolloClient.refetchQueries({ - include: [GQLQueries.TransactionList], - }), - [apolloClient], - ) - - const { refetch, isRefetching } = useQuery({ - queryKey: [ReactQueryCacheKey.ActivityScreenRefresh, owner], - enabled: false, - retry: 0, - queryFn: refreshFn, - }) - - return { refreshing: isRefetching, onRefreshActivityData: refetch } -} - export function ActivityScreen(): JSX.Element { const { t } = useTranslation() const activeAccount = useActiveAccountWithThrow() @@ -47,15 +21,6 @@ export function ActivityScreen(): JSX.Element { useScrollToTop(scrollRef) - const { refreshing, onRefreshActivityData } = useRefreshActivityData(activeAccount.address) - - // Automatically refresh activity data when app comes to foreground - useAppStateTrigger({ - from: 'background', - to: 'active', - callback: onRefreshActivityData, - }) - const insets = useAppInsets() const isBottomTabsEnabled = useFeatureFlag(FeatureFlags.BottomTabs) @@ -82,13 +47,7 @@ export function ActivityScreen(): JSX.Element { {t('common.activity')} - + ) } diff --git a/apps/mobile/src/screens/SettingsScreen.tsx b/apps/mobile/src/screens/SettingsScreen.tsx index 8f4d3e83b9c..6fa0cf28f23 100644 --- a/apps/mobile/src/screens/SettingsScreen.tsx +++ b/apps/mobile/src/screens/SettingsScreen.tsx @@ -226,7 +226,7 @@ export function SettingsScreen(): JSX.Element { }, { navigationModal: ModalName.PortfolioBalanceModal, - text: t('settings.setting.smallBalances.title'), + text: t('settings.setting.balancesActivity.title'), icon: , }, { diff --git a/apps/mobile/src/screens/TokenDetailsHeaders.tsx b/apps/mobile/src/screens/TokenDetailsHeaders.tsx index ba0b0744664..66cadffd71e 100644 --- a/apps/mobile/src/screens/TokenDetailsHeaders.tsx +++ b/apps/mobile/src/screens/TokenDetailsHeaders.tsx @@ -1,6 +1,8 @@ import React, { memo } from 'react' import { useTranslation } from 'react-i18next' import { FadeIn } from 'react-native-reanimated' +import { MODAL_OPEN_WAIT_TIME } from 'src/app/navigation/constants' +import { navigate } from 'src/app/navigation/rootNavigation' import { useTokenDetailsContext } from 'src/components/TokenDetails/TokenDetailsContext' import { TokenDetailsFavoriteButton } from 'src/components/TokenDetails/TokenDetailsFavoriteButton' import { useTokenDetailsCurrentChainBalance } from 'src/components/TokenDetails/useTokenDetailsCurrentChainBalance' @@ -21,7 +23,9 @@ import { TokenMenuActionType, useTokenContextMenuOptions, } from 'uniswap/src/features/portfolio/balances/hooks/useTokenContextMenuOptions' +import { ModalName } from 'uniswap/src/features/telemetry/constants' import { TestID } from 'uniswap/src/test/fixtures/testIDs' +import { useEvent } from 'utilities/src/react/hooks' import { useBooleanState } from 'utilities/src/react/useBooleanState' export const HeaderTitleElement = memo(function HeaderTitleElement(): JSX.Element { @@ -62,6 +66,22 @@ export const HeaderRightElement = memo(function HeaderRightElement(): JSX.Elemen useTokenDetailsContext() const currentChainBalance = useTokenDetailsCurrentChainBalance() + const openReportTokenModal = useEvent(() => { + setTimeout(() => { + navigate(ModalName.ReportTokenIssue, { + source: 'token-details', + currency: currencyInfo?.currency, + isMarkedSpam: currencyInfo?.isSpam, + }) + }, MODAL_OPEN_WAIT_TIME) + }) + + const openReportDataIssueModal = useEvent(() => { + setTimeout(() => { + navigate(ModalName.ReportTokenData, { currency: currencyInfo?.currency, isMarkedSpam: currencyInfo?.isSpam }) + }, MODAL_OPEN_WAIT_TIME) + }) + const { value: isOpen, setTrue: openMenu, setFalse: closeMenu } = useBooleanState(false) const menuActions = useTokenContextMenuOptions({ excludedActions: EXCLUDED_ACTIONS, @@ -70,6 +90,8 @@ export const HeaderRightElement = memo(function HeaderRightElement(): JSX.Elemen tokenSymbolForNotification: currencyInfo?.currency.symbol, portfolioBalance: currentChainBalance, openContractAddressExplainerModal, + openReportDataIssueModal, + openReportTokenModal, copyAddressToClipboard, closeMenu: () => {}, }) diff --git a/apps/mobile/src/screens/TokenDetailsScreen.tsx b/apps/mobile/src/screens/TokenDetailsScreen.tsx index 83a20f7ec10..90a705c6f4d 100644 --- a/apps/mobile/src/screens/TokenDetailsScreen.tsx +++ b/apps/mobile/src/screens/TokenDetailsScreen.tsx @@ -4,6 +4,8 @@ import { GQLQueries, GraphQLApi } from '@universe/api' import React, { memo, useCallback, useEffect, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { FadeInDown, FadeOutDown } from 'react-native-reanimated' +import { useDispatch } from 'react-redux' +import { MODAL_OPEN_WAIT_TIME } from 'src/app/navigation/constants' import { navigate } from 'src/app/navigation/rootNavigation' import type { AppStackScreenProp } from 'src/app/navigation/types' import { HeaderScrollScreen } from 'src/components/layout/screens/HeaderScrollScreen' @@ -38,6 +40,8 @@ import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledCh import { TokenList } from 'uniswap/src/features/dataApi/types' import { currencyIdToContractInput } from 'uniswap/src/features/dataApi/utils/currencyIdToContractInput' import { useIsSupportedFiatOnRampCurrency } from 'uniswap/src/features/fiatOnRamp/hooks' +import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' +import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' import { useOnChainNativeCurrencyBalance } from 'uniswap/src/features/portfolio/api' import { ModalName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' @@ -166,6 +170,8 @@ const TokenDetailsErrorCard = memo(function _TokenDetailsErrorCard(): JSX.Elemen }) const TokenDetailsModals = memo(function _TokenDetailsModals(): JSX.Element { + const { t } = useTranslation() + const dispatch = useDispatch() const { navigateToSwapFlow } = useWalletNavigation() const { @@ -198,6 +204,15 @@ const TokenDetailsModals = memo(function _TokenDetailsModals(): JSX.Element { } }) + const onTokenWarningReportSuccess = useEvent(() => { + dispatch( + pushNotification({ + type: AppNotificationType.Success, + title: t('common.reported'), + }), + ) + }) + return ( <> {isTokenWarningModalOpen && currencyInfo && ( @@ -206,6 +221,7 @@ const TokenDetailsModals = memo(function _TokenDetailsModals(): JSX.Element { currencyInfo0={currencyInfo} isVisible={isTokenWarningModalOpen} closeModalOnly={onCloseTokenWarning} + onReportSuccess={onTokenWarningReportSuccess} onAcknowledge={onAcknowledgeTokenWarning} /> )} @@ -292,7 +308,7 @@ const TokenDetailsActionButtonsWrapper = memo(function _TokenDetailsActionButton navigate(ModalName.Wormhole, { currencyInfo, }) - }, 300) // delay is needed to prevent menu from not closing properly + }, MODAL_OPEN_WAIT_TIME) }, [currencyInfo]) const bridgedWithdrawalInfo = currencyInfo?.bridgedWithdrawalInfo diff --git a/apps/mobile/tsconfig.json b/apps/mobile/tsconfig.json index 94f3a6d681f..14599dc3084 100644 --- a/apps/mobile/tsconfig.json +++ b/apps/mobile/tsconfig.json @@ -14,10 +14,13 @@ "path": "../../packages/uniswap" }, { - "path": "../../packages/api" + "path": "../../packages/sessions" }, { "path": "../../packages/gating" + }, + { + "path": "../../packages/api" } ], "compilerOptions": { diff --git a/apps/web/.depcheckrc b/apps/web/.depcheckrc index 0469d010fbb..11687b28177 100644 --- a/apps/web/.depcheckrc +++ b/apps/web/.depcheckrc @@ -83,6 +83,7 @@ ignores: [ 'lib', 'locales', 'nft', + 'notification-renderer', 'pages', 'polyfills', 'rpc', diff --git a/apps/web/.storybook/main.ts b/apps/web/.storybook/main.ts index d5325632a17..c0a776589d1 100644 --- a/apps/web/.storybook/main.ts +++ b/apps/web/.storybook/main.ts @@ -41,6 +41,7 @@ const config: StorybookConfig = { config.plugins.push( new DefinePlugin({ __DEV__: isDev, + 'process.env.IS_UNISWAP_EXTENSION': JSON.stringify(process.env.STORYBOOK_EXTENSION || 'false'), }), ) @@ -70,7 +71,8 @@ const config: StorybookConfig = { config.module.rules.push({ test: /\.tsx?$/, use: 'ts-loader', - exclude: /node_modules/, + // Exclude node_modules except for expo packages and related modules + exclude: /node_modules\/(?!(expo-.*|@expo|@react-native|@uniswap\/.*)\/).*/, }) config.resolve ??= {} diff --git a/apps/web/functions/api/image/pools.tsx b/apps/web/functions/api/image/pools.tsx index 79b1f698a04..7974fee61ba 100644 --- a/apps/web/functions/api/image/pools.tsx +++ b/apps/web/functions/api/image/pools.tsx @@ -1,6 +1,6 @@ // biome-ignore-all lint/correctness/noRestrictedElements: ignoring for the whole file -import { GraphQLApi } from '@universe/api' +import * as GraphQLApi from '@universe/api/src/clients/graphql/__generated__/types-and-hooks' import { ImageResponse } from '@vercel/og' import { WATERMARK_URL } from 'functions/constants' import getFont from 'functions/utils/getFont' diff --git a/apps/web/package.json b/apps/web/package.json index e1f137ab04b..82e41a616d4 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -97,7 +97,7 @@ "@types/uuid": "9.0.1", "@types/wcag-contrast": "3.0.0", "@types/xml2js": "0.4.14", - "@uniswap/client-trading": "0.1.0", + "@uniswap/client-trading": "0.1.2", "@uniswap/default-token-list": "11.19.0", "@uniswap/eslint-config": "workspace:^", "@vercel/og": "0.5.8", @@ -204,6 +204,8 @@ "@uniswap/v4-sdk": "1.21.2", "@universe/api": "workspace:^", "@universe/gating": "workspace:^", + "@universe/notifications": "workspace:^", + "@universe/sessions": "workspace:^", "@visx/group": "2.17.0", "@visx/responsive": "3.12.0", "@visx/shape": "2.18.0", @@ -279,7 +281,7 @@ "engines": { "npm": "please-use-bun", "node": "=22.13.1", - "bun": ">=1.2.0" + "bun": ">=1.3.1" }, "sideEffects": ["*.css", "src/sideEffects.ts", "src/tracing/index.ts"] } diff --git a/apps/web/public/csp.json b/apps/web/public/csp.json index bd7590b734f..63c04d41496 100644 --- a/apps/web/public/csp.json +++ b/apps/web/public/csp.json @@ -1,6 +1,6 @@ { "defaultSrc": ["'self'"], - "scriptSrc": ["'self'", "'wasm-unsafe-eval'"], + "scriptSrc": ["'self'", "'wasm-unsafe-eval'", "https://challenges.cloudflare.com"], "styleSrc": [ "'self'", "'unsafe-inline'", diff --git a/apps/web/public/pools-sitemap.xml b/apps/web/public/pools-sitemap.xml index 03d6f39b07c..44395221f37 100644 --- a/apps/web/public/pools-sitemap.xml +++ b/apps/web/public/pools-sitemap.xml @@ -2,13152 +2,13182 @@ https://app.uniswap.org/explore/pools/ethereum/0xcbcdf9626bc03e24f779434178a73a0b4bad62ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x4e68ccd3e89f51c3074ca5072bbac773960dfa36 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x4585fe77225b41b697c938b018e2ac67ac5a20c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc63b0708e2f7e69cb8a1df0e1389a98c35a76d52 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x99ac8ca7087fa4a2a1fb6357269965a2014abc35 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x11b815efb8f581194ae79006d24e0d814b7697f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa6cc3c2531fdaa6ae1a3ca84c2855806728693e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x5777d92f208679db4b9778590fa3cab3ac9e2168 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x1d42064fc4beb5f8aaf85f4617ae8b3b5b8bd801 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc2e9f25be6257c210d7adf0d4cd6e3e881ba25f8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x11950d141ecb863f01007add7d1a342041227b58 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc5c134a1f112efa96003f8559dba6fac0ba77692 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x109830a1aaad605bbf02a9dfa7b0b92ec2fb7daa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x1df4c6e36d61416813b42fe32724ef11e363eddc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x12d6867fa648d269835cf69b49f125147754b54d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x3416cf6c708da44db2624d63ea0aaef7113527c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe8c6c9227491c0a8156a0106a0204d881bb7e531 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x04708077eca6bb527a5bbbd6358ffb043a9c1c14 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x9db9e0e53058c89e5b94e29621a205198648425b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xf239009a101b6b930a527deaab6961b6e7dec8a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xfe0df74636bc25c7f2400f22fe7dae32d39443d2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xf4c5e0f4590b6679b3030d29a84857f226087fef - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x5764a6f2212d502bc5970f9f129ffcd61e5d7563 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa3f558aebaecaf0e11ca4b2199cc5ed341edfd74 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x99132b53ab44694eeb372e87bced3929e4ab8456 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x6c6bc977e13df9b0de53b251522280bb72383700 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x9d96880952b4c80a55099b9c258250f2cc5813ec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x3afdc5e6dfc0b0a507a8e023c9dce2cafc310316 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x290a6a7460b308ee3f19023d2d00de604bcf5b42 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xac4b3dacb91461209ae9d41ec517c2b9cb1b7daf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x60594a405d53811d3bc4766596efd80fd545a270 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x331399c614ca67dee86733e5a2fba40dbb16827c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x4b5ab61593a2401b1075b90c04cbcdd3f87ce011 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x844eb5c280f38c7462316aad3f338ef9bda62668 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe936f0073549ad8b1fa53583600d629ba9375161 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x2f62f2b4c5fcd7570a709dec05d68ea19c82a9ec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x381fe4eb128db1621647ca00965da3f9e09f4fac - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x97e7d56a0408570ba1a7852de36350f7713906ec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xcd423f3ab39a11ff1d9208b7d37df56e902c932b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe15e6583425700993bd08f51bf6e7b73cd5da91b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x69d91b94f0aaf8e8a2586909fa77a5c2c89818d5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe42318ea3b998e8355a3da364eb9d48ec725eb45 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xad9ef19e289dcbc9ab27b83d2df53cdeff60f02d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x3b685307c8611afb2a9e83ebc8743dc20480716e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x7bea39867e4169dbe237d55c8242a8f2fcdcc387 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x7b1e5d984a43ee732de195628d20d05cfabc3cc7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x7858e59e0c01ea06df3af3d20ac7b0003275d4bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xae2a25cbdb19d0dc0dddd1d2f6b08a6e48c4a9a9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x517f9dd285e75b599234f7221227339478d0fcc8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x0af81cd5d9c124b4859d65697a4cd10ee223746a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x197d7010147df7b99e9025c724f13723b29313f8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x2f0b1417aa42ebf0b4ca1154212847f6094d708d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe4b8583ccb95b25737c016ac88e539d0605949e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x8dbee21e8586ee356130074aaa789c33159921ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa29fe6ef9592b5d408cca961d0fb9b1faf497d6d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x1b1137dd16faa651e38a9dfb5d9ffff7767fdf62 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x8fb8e9921922d2ffb529a95d28a0d06d275d7a59 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x2cc846fff0b08fb3bffad71f53a60b4b6e6d6482 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x959873fb4fc11825fba83c80c4c632db1e936e15 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa7480aafa8ad2af3ce24ac6853f960ae6ac7f0c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x570febdf89c07f256c75686caca215289bb11cfc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe3d3551bb608e7665472180a20280630d9e938aa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xb6b0c651c37ec4ca81c0a128420e02001a57fac2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x4e34da137f0b317c633838458e0c923a5e088752 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xfe9e7931e55c514c33d489c88582fa36e84bd8e3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x149148acc3b06b8cc73af3a10e84189243a35925 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x8ef79d6c328c25da633559c20c75f638a4863462 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x14af1804dbbf7d621ecc2901eef292a24a0260ea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x80a9ae39310abf666a87c743d6ebbd0e8c42158e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc31e54c7a869b9fcbecc14363cf510d1c41fa443 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x2f5e87c9312fa29aed5c179e456625d79015299c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc6962004f452be9203591991d15f6b388e09e8d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc6f780497a95e246eb9449f5e4770916dcd6396a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x641c00a822e8b671738d32a431a4fb6074e5c79d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x92c63d0e701caae670c9415d91c474f686298f00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x1aeedd3727a6431b8f070c0afaa81cc74f273882 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xcda53b1f66614552f834ceef361a8d12a0b8dad8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x35218a1cbac5bbc3e57fd9bd38219d37571b3537 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x17c14d2c404d167802b16c450d3c99f88f2c4f4d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x468b88941e7cc0b88c1869d68ab6b570bcef62ff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xdbaeb7f0dfe3a0aafd798ccecb5b22e708f7852c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x149e36e72726e0bcea5c59d40df2c43f60f5a22d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xbaaf1fc002e31cb12b99e4119e5e350911ec575b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa67f72f21bd9f91db2da2d260590da5e6c437009 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x92fd143a8fa0c84e016c2765648b9733b0aa519e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x7cf803e8d82a50504180f417b8bc7a493c0a0503 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x81c48d31365e6b526f6bbadc5c9aafd822134863 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x446bf9748b4ea044dd759d9b9311c70491df8f29 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc82819f72a9e77e2c0c3a69b3196478f44303cf4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x50c7390dfdd3756139e6efb5a461c2eb7331ceb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x1dfc1054e0e2a10e33c9ca21aad5aa8a1cce91e3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc91b7b39bbb2c733f0e7459348fd0c80259c8471 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x59d72ddb29da32847a4665d08ffc8464a7185fae - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x09ba302a3f5ad2bf8853266e271b005a5b3716fe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa77d77c9773c35e910acc2e30cefe52b54a58414 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x8da66e470403b3d3eee66c67e2c61fda6e248ad1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x2f020e708811c054f146eebcc4d5a215fd4eec26 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x7e7fb3cceca5f2ac952edf221fd2a9f62e411980 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x68c685fd52a56f04665b491d491355a624540e85 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa8328bf492ba1b77ad6381b3f7567d942b000baf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc0cf0f380ddb44dbcaf19a86d094c8bba3efa04a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa169d1ab5c948555954d38700a6cdaa7a4e0c3a0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x1862200e8e7ce1c0827b792d0f9546156f44f892 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x05bbaaa020ff6bea107a9a1e06d2feb7bfd79ed2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xd02a4969dc12bb889754361f8bcf3385ac1b2077 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc24f7d8e51a64dc1238880bd00bb961d54cbeb29 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x7c06736e41236fecd681dd3353aa77ecd19ea565 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc473e2aee3441bf9240be85eb122abb059a3b57c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x14353445c8329df76e6f15e9ead18fa2d45a8bb6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x2039f8c9cd32ba9cd2ea7e575d5b1abea93f7527 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xd3e11119d2680c963f1cdcffece0c4ade823fb58 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x8e295789c9465487074a65b1ae9ce0351172393f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x97bca422ec0ee4851f2110ea743c1cd0a14835a1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xbe3ad6a5669dc0b8b12febc03608860c31e2eef6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x56ebd63a756b94d3de9cea194896b4920b64fb01 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe2ddd33585b441b9245085588169f35108f85a6e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x84436a2af97f37018db116ae8e1b691666db3d00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x517f9dd285e75b599234f7221227339478d0fcc8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x0af81cd5d9c124b4859d65697a4cd10ee223746a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x197d7010147df7b99e9025c724f13723b29313f8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x2f0b1417aa42ebf0b4ca1154212847f6094d708d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe4b8583ccb95b25737c016ac88e539d0605949e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x8dbee21e8586ee356130074aaa789c33159921ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa29fe6ef9592b5d408cca961d0fb9b1faf497d6d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x1b1137dd16faa651e38a9dfb5d9ffff7767fdf62 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x8fb8e9921922d2ffb529a95d28a0d06d275d7a59 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x2cc846fff0b08fb3bffad71f53a60b4b6e6d6482 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x959873fb4fc11825fba83c80c4c632db1e936e15 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa7480aafa8ad2af3ce24ac6853f960ae6ac7f0c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x570febdf89c07f256c75686caca215289bb11cfc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe3d3551bb608e7665472180a20280630d9e938aa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xb6b0c651c37ec4ca81c0a128420e02001a57fac2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x4e34da137f0b317c633838458e0c923a5e088752 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xfe9e7931e55c514c33d489c88582fa36e84bd8e3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x149148acc3b06b8cc73af3a10e84189243a35925 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x8ef79d6c328c25da633559c20c75f638a4863462 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x68f5c0a2de713a54991e01858fd27a3832401849 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x4533bad2dc588f0fadf8d2e72386d4cd6a19b519 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x85149247691df622eaf1a8bd0cafd40bc45154a9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x0392b358ce4547601befa962680bede836606ae2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x1c3140ab59d6caf9fa7459c6f83d4b52ba881d36 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xd1f1bad4c9e6c44dec1e9bf3b94902205c5cd6c3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x03af20bdaaffb4cc0a521796a223f7d85e2aac31 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x73b14a78a0d396c521f954532d43fd5ffe385216 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xac85eaf55e9c60ed40a683de7e549d23fdfbeb33 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x04f6c85a1b00f6d9b75f91fd23835974cc07e65c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x730691cdac3cbd4d41fc5eb9d8abbb0cea795b94 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x535541f1aa08416e69dc4d610131099fa2ae7222 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xfc1f3296458f9b2a27a0b91dd7681c4020e09d05 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x85c31ffa3706d1cce9d525a00f1c7d4a2911754c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xd52533a3309b393afebe3176620e8ccfb6159f8a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xff7fbdf7832ae524deda39ca402e03d92adff7a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xb589969d38ce76d3d7aa319de7133bc9755fd840 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xf334f6104a179207ddacfb41fa3567feea8595c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x1fb3cf6e48f1e7b10213e7b6d87d4c073c7fdb7b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xd4344ea0c5ade7e22b9b275f0bde7a145dec5a23 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x5b42a63d6741416ce9a7b9f4f16d8c9231ccddd4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x252cbdff917169775be2b552ec9f6781af95e7f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x2ab22ac86b25bd448a4d9dc041bd2384655299c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xc858a329bf053be78d6239c4a4343b8fbd21472b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa73c628eaf6e283e26a7b1f8001cf186aa4c0e8e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xb533c12fb4e7b53b5524eab9b47d93ff6c7a456f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x2ae3d6096d8215ac2acddf30c60caa984ea5debe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x19ea026886cbb7a900ecb2458636d72b5cae223b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x6f32061f59a21086c334d0d45f804089ce374aaf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xfaf037caafa9620bfaebc04c298bf4a104963613 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xadb35413ec50e0afe41039eac8b930d313e94fa4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xe9e3893921de87b1194a8108f9d70c24bde71c27 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xf1f199342687a7d78bcc16fce79fa2665ef870e1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xf44acaa38be5e965c5ddf374e7a2ba270e580684 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x36e42931a765022790b797963e42c5522d6b585a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x5adba6c5589c50791dd65131df29677595c7efa7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x3249e3e3e4133ee18e65347daf586610cc265f54 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xca1b837c87c6563910c2befa48834fa2a8c3d72d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x6ef7b14bcd8d989cef8f8ec8ba4bf371b2ac95fd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x37ffd11972128fd624337ebceb167c8c0a5115ff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xe62bd99a9501ca33d98913105fc2bec5bae6e5dd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xb2ac2e5a3684411254d58b1c5a542212b782114d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xb0efaf46a1de55c54f333f93b1f0641e73bc16d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xd0fa3b5264ccde31e8b094b86bca4a1e97d3c603 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xad4c666fc170b468b19988959eb931a3676f0e9f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x790fde1fd6d2568050061a88c375d5c2e06b140b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xaefc1edaede6adadcdf3bb344577d45a80b19582 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa8a5356ee5d02fe33d72355e4f698782f8f199e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x55bc964fe3b0c8cc2d4c63d65f1be7aef9bb1a3c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x95d9d28606ee55de7667f0f176ebfc3215cfd9c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x517f9dd285e75b599234f7221227339478d0fcc8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x0af81cd5d9c124b4859d65697a4cd10ee223746a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x197d7010147df7b99e9025c724f13723b29313f8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x2f0b1417aa42ebf0b4ca1154212847f6094d708d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xe4b8583ccb95b25737c016ac88e539d0605949e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x8dbee21e8586ee356130074aaa789c33159921ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa29fe6ef9592b5d408cca961d0fb9b1faf497d6d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x1b1137dd16faa651e38a9dfb5d9ffff7767fdf62 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x8fb8e9921922d2ffb529a95d28a0d06d275d7a59 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x2cc846fff0b08fb3bffad71f53a60b4b6e6d6482 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x959873fb4fc11825fba83c80c4c632db1e936e15 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa7480aafa8ad2af3ce24ac6853f960ae6ac7f0c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x570febdf89c07f256c75686caca215289bb11cfc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xe3d3551bb608e7665472180a20280630d9e938aa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xb6b0c651c37ec4ca81c0a128420e02001a57fac2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x4e34da137f0b317c633838458e0c923a5e088752 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xfe9e7931e55c514c33d489c88582fa36e84bd8e3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x149148acc3b06b8cc73af3a10e84189243a35925 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x8ef79d6c328c25da633559c20c75f638a4863462 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x45dda9cb7c25131df268515131f647d726f50608 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x50eaedb835021e4a108b7290636d62e9765cc6d7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x167384319b41f7094e62f7506409eb38079abff8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa374094527e1673a86de625aa59517c5de346d32 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x86f1d8390222a3691c28938ec7404a1661e618e0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xeda1094f59a4781456734e5d258b95e6be20b983 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x847b64f9d3a95e977d157866447a5c0a5dfa0ee5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x94ab9e4553ffb839431e37cc79ba8905f45bfbea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x0e44ceb592acfc5d3f09d996302eb4c499ff8c10 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x1e5bd2ab4c308396c06c182e1b7e7ba8b2935b83 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x9b08288c3be4f62bbf8d1c20ac9c5e6f9467d8b7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xb6e57ed85c4c9dbfef2a68711e9d6f36c56e0fcb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x3e31ab7f37c048fc6574189135d108df80f0ea26 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xd36ec33c8bed5a9f7b6630855f1533455b98a418 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xdac8a8e6dbf8c690ec6815e0ff03491b2770255d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xfe343675878100b344802a6763fd373fdeed07a4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x0a28c2f5e0e8463e047c203f00f649812ae67e4f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x88f3c15523544835ff6c738ddb30995339ad57d6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x98b9162161164de1ed182a0dfa08f5fbf0f733ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xeef1a9507b3d505f0062f2be9453981255b503c8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc4c06c9a239f94fc0a1d3e04d23c159ebe8316f1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x849ec65748107aedc518dbc42961f358ea1361a7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2db87c4831b2fec2e35591221455834193b50d1b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa4d8c89f0c20efbe54cba9e7e7a7e509056228d9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x642f28a89fa9d0fa30e664f71804bfdd7341d21f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2aceda63b5e958c45bd27d916ba701bc1dc08f7a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x781067ef296e5c4a4203f81c593274824b7c185d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x4ccd010148379ea531d6c587cfdd60180196f9b1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xd866fac7db79994d08c0ca2221fee08935595b4b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x941061770214613ba0ca3db9a700c39587bb89b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa9077cdb3d13f45b8b9d87c43e11bce0e73d8631 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa01f64fa1b923dd9c5c7618b39a6ba8098a88863 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa830ff28bb7a46570a7e43dc24a35a663b9cfc2e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x8837a61644d523cbe5216dde226f8f85e3aa9be3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xca5d44977d6de1846530eb434167b208752fba7d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x4d05f2a005e6f36633778416764e82d1d12e7fbb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x41e64a5bc929fa8e6a9c8d7e3b81a13b21ff3045 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x3ea34cfc9322273311f7843826a2581c4a00fd39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x785061ed819414dc4269d2a5d5974069c0daea96 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x3f5228d0e7d75467366be7de2c31d0d098ba2c23 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2e3f22e9a1c2470b2e293351f48c99e1fd788f32 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2a08c38c7e1fa969325e2b64047abb085dec3756 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xe6c36eed27c2e8ecb9a233bf12da06c9730b5955 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xefa98fdf168f372e5e9e9b910fcdfd65856f3986 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x76fa081e510f43ac8335efdb4db88c9ff1894413 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc6832ef0af793336aa44a936e54b992bff47e7cd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x865f456479a21e2b3d866561d7171a3d0a7b112d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xbd934a7778771a7e2d9bf80596002a214d8c9304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x9ab9f658104467604b5afa9a3e1df62f35f7b208 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x6e430d59ba145c59b73a6db674fe3d53c1f31cae - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x517f9dd285e75b599234f7221227339478d0fcc8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x0af81cd5d9c124b4859d65697a4cd10ee223746a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x197d7010147df7b99e9025c724f13723b29313f8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2f0b1417aa42ebf0b4ca1154212847f6094d708d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xe4b8583ccb95b25737c016ac88e539d0605949e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x8dbee21e8586ee356130074aaa789c33159921ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa29fe6ef9592b5d408cca961d0fb9b1faf497d6d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x1b1137dd16faa651e38a9dfb5d9ffff7767fdf62 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x8fb8e9921922d2ffb529a95d28a0d06d275d7a59 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2cc846fff0b08fb3bffad71f53a60b4b6e6d6482 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x959873fb4fc11825fba83c80c4c632db1e936e15 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa7480aafa8ad2af3ce24ac6853f960ae6ac7f0c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x570febdf89c07f256c75686caca215289bb11cfc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xe3d3551bb608e7665472180a20280630d9e938aa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xb6b0c651c37ec4ca81c0a128420e02001a57fac2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x4e34da137f0b317c633838458e0c923a5e088752 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xfe9e7931e55c514c33d489c88582fa36e84bd8e3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x149148acc3b06b8cc73af3a10e84189243a35925 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x8ef79d6c328c25da633559c20c75f638a4863462 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x9e37cb775a047ae99fc5a24dded834127c4180cd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x48413707b70355597404018e7c603b261fcadf3f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xade9bcd4b968ee26bed102dd43a55f6a8c2416df - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xda679706ff21114ac9fac5198bff24543f357a16 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xba3f945812a83471d709bce9c3ca699a19fb46f7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc9034c3e7f58003e6ae0c8438e7c8f4598d5acaa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x4c36388be6f416a29c8d8eee81c771ce6be14b18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa1b2457c0b627f97f6cc892946a382451e979014 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x4b0aaf3ebb163dd45f663b38b6d93f6093ebc2d3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xae2ce200bdb67c472030b31f602f0756c9aeb61c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x3bc5180d5439b500f381f9a46f15dd6608101671 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x5122e02898ece3bc62df8c1efdb29a9e914244d3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x24e1cbd6fed006ceed9af0dce688acc7951d57a9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x2556230ac694093d4d3b7b965a2f2d77d4c403a4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xdaca082c2c7d052a96fa83ea9d3a7b6839e39586 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa555149210075702a734968f338d5e1cbd509354 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x10648ba41b8565907cfa1496765fa4d95390aa0d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x00bcec1526dae1e170a53017b8775a93b7810d7c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x20e068d76f9e90b90604500b84c7e19dcb923e7e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x6b93950a9b589bc32b82a5df4e5148f98a7fae27 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xd9caa6dbe6791fcb7fc9fb59d1a6b3dd8c1c2339 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x62e81e93136ac42a1ada48d4098f5f9e703e7455 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x84206d33845c9d811438b6fe4e7a0c634748dc50 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xd0b53d9277642d899df5c87a3966a349a798f224 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xcfa7c4bb565915f1c4f9475e2a0536d31efad776 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa7de21f28ca460b45373b217cd4eb111c3faeff8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xb64dff20dd5c47e6dbb56ead80d23568006dec1e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xad4e969f4193878e5cc89cefb57faf6c7c0048da - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xdf5eb97e3e23ca7f5a5fd2264680377c211310ba - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xf16baaae8eb7b37f4280e72924479f69e7a61f32 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xe745a591970e0fa981204cf525e170a2b9e4fb93 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x64b74c66b9ba60ca668b781289767ae7298f37ae - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x17e1ebd791e7253a5e606fd94c5b66c14d873136 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x46715bd57b9ec01deadb35fe096fb44acda79414 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x3447accd4b8e735329d1065244aad2ed630f0122 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x2feb7f3ffc243f7de94d5ea5975533d301584e07 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0d5959a52e7004b601f0be70618d01ac3cdce976 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x2170ca774e48a3f51559917ada6f9d7ae8f7bfea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x62a76dfa8951aefcff787e790782db3633ebf422 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x8073679e0b3b2d1d665777cf1b2b5b1c2d3d2d0c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x143f1a6f3fb32e6ab3f22d3cc6b417b5c2197599 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x82ad659c2f152aad59bb37cbc5e7663a2de0c607 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa4efe9e8e2a2d5a2ac46805f233b8e49d0e11955 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xfcc89a1f250d76de198767d33e1ca9138a7fb54b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x2faa2b42b782d578a160f61bb7cd763a17476730 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xdd44c0e83c2570062d1e6fdd440b4724862e8f31 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xe3930a14641786e123e7bbe842d701fa1cbfe2df - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x6d03360ce4764e862ed81660c1f76cc2711b14b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc055f66f228105072315247785c00299d0ce27e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xcae1d141ab11cef0a415cf0440025e1e5e962e06 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x517f9dd285e75b599234f7221227339478d0fcc8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0af81cd5d9c124b4859d65697a4cd10ee223746a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x197d7010147df7b99e9025c724f13723b29313f8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x2f0b1417aa42ebf0b4ca1154212847f6094d708d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xe4b8583ccb95b25737c016ac88e539d0605949e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x8dbee21e8586ee356130074aaa789c33159921ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa29fe6ef9592b5d408cca961d0fb9b1faf497d6d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x1b1137dd16faa651e38a9dfb5d9ffff7767fdf62 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x8fb8e9921922d2ffb529a95d28a0d06d275d7a59 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x2cc846fff0b08fb3bffad71f53a60b4b6e6d6482 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x959873fb4fc11825fba83c80c4c632db1e936e15 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa7480aafa8ad2af3ce24ac6853f960ae6ac7f0c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x570febdf89c07f256c75686caca215289bb11cfc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xe3d3551bb608e7665472180a20280630d9e938aa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xb6b0c651c37ec4ca81c0a128420e02001a57fac2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x4e34da137f0b317c633838458e0c923a5e088752 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xfe9e7931e55c514c33d489c88582fa36e84bd8e3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x149148acc3b06b8cc73af3a10e84189243a35925 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x8ef79d6c328c25da633559c20c75f638a4863462 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0f338ec12d3f7c3d77a4b9fcc1f95f3fb6ad0ea6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4eaa90264d6a3567228dcb5cfc242200da586437 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x6fe9e9de56356f7edbfcbb29fab7cd69471a4869 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xf420603317a0996a3fce1b1a80993eaef6f7ae1a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x47a90a2d92a8367a91efa1906bfc8c1e05bf10c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x41bf5eeae051fbd2e97b76b5f8f0fdcc1a1e526b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x28df0835942396b7a1b7ae1cd068728e6ddbbafd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa3f3664a52f01b42557524bd14556e379daf5669 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x1fd22fa7274bafebdfb1881321709f1219744829 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xe39cfc1a2e51a09ecbd060a24ee4eef5a97697bb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x06396509195eb9e07c38a016694dc9ff535b128a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x5a1c486edefda2f09d3b349fadc38524f1743826 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x5bf1cf153c102a79d9e18b7fb7c79ba57fa70d0c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2c3c320d49019d4f9a92352e947c7e5acfe47d68 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4141325bac36affe9db165e854982230a14e6d48 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x17507bef4c3abc1bc715be723ee1baf571256e05 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x8149b92ea743cc382aada523b68b8834733b9015 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xc98f01bf2141e1140ef8f8cad99d4b021d10718f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x7f9d307973cdabe42769d9712df8ee1cc1a28d10 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x5c87da28a45e5089b762dcbbd86f743d14c54317 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2cd97604ef77bbcb1fa0cff47545dff8ec7def08 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x7862d9b4be2156b15d54f41ee4ede2d5b0b455e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x554548b404213c7efcdbab933f52edfe3c581834 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x63008c5ea4e47f5421e0e1428b1c5043a507d0d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0350ca994791c4b07a5b02b08aaf9d6fc8ab510e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x32776ed4d96ed069a2d812773f0ad8ad9ef83cf8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x84f3ca9b7a1579ff74059bd0e8929424d3fa330e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x5289a8dbf7029ee0b0498a84777ed3941d9acfec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xb2bc284ab4c953b7f7a06d59c0ceb2de26405f22 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x508acf810857fefa86281499068ad5d19ebce325 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xccdfcd1aac447d5b29980f64b831c532a6a33726 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4fb87838a29b37598099ef5aa6b3fbeeef987c50 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x515e94dc736b9d8b7d28ecf1cece0aba3d75da97 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xfd6e5b7c30538dff2752058e425ad01a56b831cc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xcb99fe720124129520f7a09ca3cbef78d58ed934 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xd2f21358c1549be193537b2a4c5dc7f0228ae011 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x93094ed1c907e4bca7eb041cb659da94f7e1b58e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xd37e6ecb991d1a0e7610c89666817665713362a7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x73234630bd159384c8d43f145407312d64614f43 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xad1ddf00c4ae50573e4dc98e6c5ee93baa04a0c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa765593c821f7df9ad81119509a37961e7ffa6c5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x9b501a7ad3087d603ceb34424b7b2a6c348ad0b7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xafebb7cfa1a15fcac4121b609b456cbce3137c20 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0adaf134ae0c4583b3a38fc3168a83e33162651e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xf9878a5dd55edc120fde01893ea713a4f032229c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x84e47c7f2fe86f6b5efbe14fee46b8bb871b2e05 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xf3e5bec78654049990965f666b0612e116b94fb2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x33e59edd3214e97cb68450c6d3d6c167de072aba - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2ca76c7e466e560e0cb11a91269bb953e41254bc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xbb124e35ab9e85f8d59ba83500e559dc052b9368 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x517f9dd285e75b599234f7221227339478d0fcc8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0af81cd5d9c124b4859d65697a4cd10ee223746a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x197d7010147df7b99e9025c724f13723b29313f8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2f0b1417aa42ebf0b4ca1154212847f6094d708d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xe4b8583ccb95b25737c016ac88e539d0605949e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x8dbee21e8586ee356130074aaa789c33159921ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa29fe6ef9592b5d408cca961d0fb9b1faf497d6d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x1b1137dd16faa651e38a9dfb5d9ffff7767fdf62 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x8fb8e9921922d2ffb529a95d28a0d06d275d7a59 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2cc846fff0b08fb3bffad71f53a60b4b6e6d6482 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x959873fb4fc11825fba83c80c4c632db1e936e15 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa7480aafa8ad2af3ce24ac6853f960ae6ac7f0c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x570febdf89c07f256c75686caca215289bb11cfc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xe3d3551bb608e7665472180a20280630d9e938aa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xb6b0c651c37ec4ca81c0a128420e02001a57fac2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4e34da137f0b317c633838458e0c923a5e088752 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xfe9e7931e55c514c33d489c88582fa36e84bd8e3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x149148acc3b06b8cc73af3a10e84189243a35925 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x8ef79d6c328c25da633559c20c75f638a4863462 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xd88d5f9e6c10e6febc9296a454f6c2589b1e8fae - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xb90fe7da36ac89448e6dfd7f2bb1e90a66659977 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xbd6313d0796984c578cae6bc5b5e23b27c5540c5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x1f18cd7d1c7ba0dbe3d9abe0d3ec84ce1ad10066 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x7da99753ff017f1b7afb2c8c0542718dc9f15f21 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x079e7a44f42e9cd2442c3b9536244be634e8f888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x1c8dafd358d308b880f71edb5170b010b106ca60 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xbd0f6f34baa3c1329448a69bab90111a20756f01 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x3420720e561f3082f1e514a4545f0f2e0c955a5d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xea3fb6e3313a2a90757e4ca3d6749efd0107b0b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xf130f72f8190f662522774c3367e6e8814f5e219 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x4a46c053bd5c10a959aea258228217b9d3405f3d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xb83258bf5940c98abf54f26c5a02710bd6b83b2c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x6a209c5329f0a225fa1890d4177823c096016f34 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xdb24905b1b080f65dedb0ad978aad5c76363d3c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xddff2cdad11898b901a661e32e9fa010780263a0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x72dd8fe09b5b493012e5816068dfc6fb26a2a9e6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x54fc722a66abfb6500a36d8b7b2646129d0e836a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x53b612b32233c80ec439a64325a29766ce95be7f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xe5edcbe72d1bc223097a1bed1fe6c0e404b4290c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xb928c37b8bd9754d321dc3d3c6ef374d332fe761 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x2d70cbabf4d8e61d5317b62cbe912935fd94e0fe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x953e2937f0515c43ca7995e80c84aedcbbb9385e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x84394d80830ae963b599ded7d9149b90059f182f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa1777e082fa1746eb78dd9c1fbb515419cf6e538 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x112466c8b6e5abe42c78c47eb1b9d40baa3f943c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x9491d57c5687ab75726423b55ac2d87d1cda2c3f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x978799f1845c00c9a4d9fd2629b9ce18df66e488 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xdc55d1fd1c04e005051a40bd59c5f95623257bc5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x34757893070b0fc5de37aaf2844255ff90f7f1e0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x7faf167615419228f3f7d71d52d840dab154913c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa4d7b6a50dd4c55334ca6f175dbc6561f269d264 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x0ed413cefde954d8e5c54d981d7d182b587e98e3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x524375d0c6a04439128428f400b00eae81a2e9e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x4b7a4530d56ff55a4dce089d917ede812e543307 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x84bb5b9bf1b6782c87cfa3e396f2f571c8e49646 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x723292eea7e1576ae482a5c317934054c0199e24 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x9b42940e8184d866aac6595a91f8d8952a59d3b9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x37622453c614f625d288151101ffe48fd222ced1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x4a94130b9e8eb0a0959c2c0f1ee9583213773fd9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x51514b3dc24afc1db95586242b99f0063bea17c5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc130254e9196d48bbd9f91240390a6e8203132e9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x60ac25da2ada3be14a2a8c04e45b072bed965966 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x4e392a3883a84225260ff857318517eb50e5d128 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xca0aa06385a42242fe9523cd7015f6d01cd8f6b2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x3e448c17043ce1481bbe53c0fd19481bad8b98a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x81060e6bf2a683f208b8799a33c7c09830cabed1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x463fe9f646b61ccfb43a022bf947075411cd71c7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x517f9dd285e75b599234f7221227339478d0fcc8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x0af81cd5d9c124b4859d65697a4cd10ee223746a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x197d7010147df7b99e9025c724f13723b29313f8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x2f0b1417aa42ebf0b4ca1154212847f6094d708d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xe4b8583ccb95b25737c016ac88e539d0605949e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x8dbee21e8586ee356130074aaa789c33159921ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa29fe6ef9592b5d408cca961d0fb9b1faf497d6d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x1b1137dd16faa651e38a9dfb5d9ffff7767fdf62 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x8fb8e9921922d2ffb529a95d28a0d06d275d7a59 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x2cc846fff0b08fb3bffad71f53a60b4b6e6d6482 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x959873fb4fc11825fba83c80c4c632db1e936e15 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa7480aafa8ad2af3ce24ac6853f960ae6ac7f0c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x570febdf89c07f256c75686caca215289bb11cfc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xe3d3551bb608e7665472180a20280630d9e938aa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xb6b0c651c37ec4ca81c0a128420e02001a57fac2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x4e34da137f0b317c633838458e0c923a5e088752 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xfe9e7931e55c514c33d489c88582fa36e84bd8e3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x149148acc3b06b8cc73af3a10e84189243a35925 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x8ef79d6c328c25da633559c20c75f638a4863462 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xbf16ef186e715668aa29cef57e2fd7f9d48adfe6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x5645dcb64c059aa11212707fbf4e7f984440a8cf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x3ad4913fa896391c9822a81d8d869cc0d783bdd7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x7a415b19932c0105c82fdb6b720bb01b0cc2cae3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x9b3423373e6e786c9ac367120533abe4ee398373 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x4a25dbdf9629b1782c3e2c7de3bdce41f1c7f801 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xbe80225f09645f172b079394312220637c440a63 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x059615ebf32c946aaab3d44491f78e4f8e97e1d3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x435664008f38b0650fbc1c9fc971d0a3bc2f1e47 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x4b62fa30fea125e43780dc425c2be5acb4ba743b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc3db44adc1fcdfd5671f555236eae49f4a8eea18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa86aca6d7c393c06dcdc30473ea3d1b05c358dff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x0f027d40c80d8f70f77d3884776531f80b21d20e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x69c66beafb06674db41b22cfc50c34a93b8d82a2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xeedff72a683058f8ff531e8c98575f920430fdc5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x811cfb75567a252bea23474e2ccd1286927bfe0a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe5cf22ee4988d54141b77050967e1052bd9c7f7a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x7f580f8a02b759c350e6b8340e7c2d4b8162b6a9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x48b0ab72c2591849e678e7d6f272b75ef9b863f7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x74d0ae8b8e1fca6039707564704a25ad2ee036b0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x5969efdde3cf5c0d9a88ae51e47d721096a97203 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe32efff8f8b5fdc53803405aa3f623f03f8a8767 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe8629b6a488f366d27dad801d1b5b445199e2ada - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x066b28f0c160935cf285f75ed600967bf8417035 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa86aca6d7c393c06dcdc30473ea3d1b05c358dff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x0f027d40c80d8f70f77d3884776531f80b21d20e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x69c66beafb06674db41b22cfc50c34a93b8d82a2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xeedff72a683058f8ff531e8c98575f920430fdc5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x811cfb75567a252bea23474e2ccd1286927bfe0a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x146b020399769339509c98b7b353d19130c150ec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xd28f71e383e93c570d3edfe82ebbceb35ec6c412 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xadab76dd2dca7ae080a796f0ce86170e482afb4a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x0fb07e6d6e1f52c839608e1436d2ea810cf07257 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa86aca6d7c393c06dcdc30473ea3d1b05c358dff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x0f027d40c80d8f70f77d3884776531f80b21d20e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x69c66beafb06674db41b22cfc50c34a93b8d82a2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xeedff72a683058f8ff531e8c98575f920430fdc5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x811cfb75567a252bea23474e2ccd1286927bfe0a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x95d2483d2a0fff034004f91c53d649623d993896 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x19c5505638383337d2972ce68b493ad78e315147 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc143161ed3ed8049bb63d8da42907c08a10e2269 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc3286373599dd5af2a17a572ebb7561f05f88bec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xbb98b3d2b18aef63a3178023a920971cf5f29be4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x647fb01a63de9a551b39c7915693b25e6bcec502 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa90c1c009dc8292bd04ced30f9b53a5ff7a806a0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa86aca6d7c393c06dcdc30473ea3d1b05c358dff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x0f027d40c80d8f70f77d3884776531f80b21d20e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x69c66beafb06674db41b22cfc50c34a93b8d82a2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xeedff72a683058f8ff531e8c98575f920430fdc5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x811cfb75567a252bea23474e2ccd1286927bfe0a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xfb765ff72a14735550f1d798a5efd1311f2ddee7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x3537f2a5f99f08f59eb1417073db1fadbebf0c74 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xde8ed0277ee0e84c25756a73ffa7374e4aeadf46 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xd8f3a72d2b2220a5067abe8c38aea57dc2d69a5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x7ec18abf80e865c6799069df91073335935c4185 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x14b1911dd6b451c2771661ae8cd70637d726c356 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x9ae8084c21752971d867597c07f2673765d949a1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xcfaf75a3d292c3535ea3acdb16ed2ee58c2bb091 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x8055e6de251e414e8393b20adab096afb3cf8399 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xffec10fe1355c2d8df4f62affcdeffdb04f06569 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc16454420f100b2e771d8bc4c5b6200068129a34 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x046f405e4ae1d0e786eda4959adadbd417d13ad8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xeccb34691c06c1c9c31ceb2228b22cbd242b5879 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xe22a2dfaaaaec8a7b2b7acb4909eaaa5c5bd6e64 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xe2dda0911e227e73d9fd94745b851c8bc6504610 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0f082a7870908f8cebbb2cd27a42a9225c19f898 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x69d667281778db0c3bc8177efea3a91ee95c3068 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x30d61bb28a6789f9f49d8c7fb198d63b6aba4b61 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x090f3fd9110621df127c3f9be5c6f58c02f2d5eb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xd56f086e7b796b313d49f2bc926fac4bdd2a2b0b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x7eb847a214192aab8fa1b503f4d4c9ddd2a08db6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x81b3bc0ef974c16d71b8614adb8c22ccc045da01 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc9b44ca4159dbaf5722a3dc8618e9d4b5f39d5b2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xbeef35a63fc62a3334630d9d3b4db27093d95317 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x3d5d143381916280ff91407febeb52f2b60f33cf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x68c9325cc268df8b9ed4a06429587f28471b5f84 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa00cc1fb7ac185222294777c6b23a13c013f07ce - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x77021e63bcbd3c5296b0cdd8a3c3770fb0ea8fa2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xcc28456d4ff980cee3457ca809a257e52cd9cdb0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xec0b7e8e44c9d60efd67a89dba1d4a6e02a7a4a0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0c8fed5dd65542ca5f0add1acab14c2e470c9110 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xd56da2b74ba826f19015e6b7dd9dae1903e85da1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x5482c2b11951bbb92b87858242e17abde802b398 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xd95bae63641d822dc591bd4aca7a64e53eac76f9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x06959273e9a65433de71f5a452d529544e07ddd0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x24bf2ee2e09477082d1ddf2f0603baa460b3f5f3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x56d8f846415e08c5e663d89505e79f522d33f947 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x548e923281f372d28a40287d3a2d30dce482fc66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x9d744d3d905897608d24c1b8c1c7db0d30c36cd4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa86aca6d7c393c06dcdc30473ea3d1b05c358dff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0f027d40c80d8f70f77d3884776531f80b21d20e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x69c66beafb06674db41b22cfc50c34a93b8d82a2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xeedff72a683058f8ff531e8c98575f920430fdc5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x811cfb75567a252bea23474e2ccd1286927bfe0a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xab46d39cb398fb3649ecba781180016fef75f50b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x25048028ad87484b7fce99bc4e22dcb6c3307470 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xdb2177fee5b0ebdc7b8038cb70f3964bb6d14143 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x42d749f736051d8933b118324cded52d1f92bec1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xb1a1b707b143b911c36e1a0f4f901c5017791aca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x3319a81a316abd4c086f7048904e31ff86648b38 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4a978a2d4fb7393063babfb0cee741b8bcd4dd4b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xea403e36fb592fdfdc342c38e94284ddbb0d2105 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xe3fb01794d6912f0773171e32e723471ee8df061 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x916d7f23ccbb1d10118dcfc6ad5a10b6446ff73e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa86aca6d7c393c06dcdc30473ea3d1b05c358dff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0f027d40c80d8f70f77d3884776531f80b21d20e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x69c66beafb06674db41b22cfc50c34a93b8d82a2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xeedff72a683058f8ff531e8c98575f920430fdc5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x811cfb75567a252bea23474e2ccd1286927bfe0a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x6cde5f5a192fbf3fd84df983aa6dc30dbd9f8fac - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xd80d28850bebe6208433c298334392bc940b4fc7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x7f7c4335ccac291ddedcef4429a626c442b627ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x628cb3a5a206956423d158009612813b64b19dab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x116361f4f45e310347b43cd098fdfa459760ea7f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x5dc631ad6c26bea1a59fbf2c2680cf3df43d249f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x1a810e0b6c2dd5629afa2f0c898b9512c6f78846 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xac1cb6d3d419da9ead0b53e62d6fb4bb53473523 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x0115d04a88990889471a88e85817aac9e961c07b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xd3409b7f3f54bb097433d0f4cd31c48ac33e569b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x493bfc1adb2e60805693197f23132350ffd2a04e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xcf4f103759770c21f945413781ca787620316988 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xb135ebde27d366b0d62e579bae4118cb991b820e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xecbc2f008c20729b9239317408367377c5473812 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x96e0c440d3377c2dfe4f2a82add0b045e46cbe64 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x6f5304c22ac77e228e8af4732ac6677c46e09030 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xcb037f27eb3952222810966e28e0ceb650c65cd9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa86aca6d7c393c06dcdc30473ea3d1b05c358dff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x0f027d40c80d8f70f77d3884776531f80b21d20e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x69c66beafb06674db41b22cfc50c34a93b8d82a2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xeedff72a683058f8ff531e8c98575f920430fdc5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x811cfb75567a252bea23474e2ccd1286927bfe0a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x7baece5d47f1bc5e1953fbe0e9931d54dab6d810 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x83abecf7204d5afc1bea5df734f085f2535a9976 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x4eefe02fce5b53ca33c7717bbd8ad3c9cb0609f1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xb2eb5849e2606f99fc492e9add0103c667f806d3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x53c6ca2597711ca7a73b6921faf4031eedf71339 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x4eefe02fce5b53ca33c7717bbd8ad3c9cb0609f1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xd35937ecd47b04a1474f8569f457fc5ac395921a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x4eefe02fce5b53ca33c7717bbd8ad3c9cb0609f1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x6b75f2189f0e11c52e814e09e280eb1a9a8a094a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xb372b5abdb7c2ab8ad9e614be9835a42d0009153 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xf369277650ad6654f25412ea8bfbd5942733babc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x4eefe02fce5b53ca33c7717bbd8ad3c9cb0609f1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x4898cf312fbff8814cab80a8d7f6ee5ad0dc73fb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x5e78afc6c804d4382bede3a0712d210e657e9b4f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x86b211ca7915a0c8d4659dd98242d9e801d88ab4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xb637f7c82fd774c280e23cebc725e7cd807c66d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xd249c43faabc58d6dd4b0a4de598b5a956c5d8d7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x1fbae785ce68b79f7ed4f7b27c3af3ef0e0bc3d4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x3c1376fb8487da57d4ffb263d9d01b578c7b586b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x7b24bed19856f4bb1d4c0421cfb328026cd936bd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x7cf887a863d81e6a483ee947dee05cb51914923c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x588c8cf031809486f015908864ee8699b44017e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x3987d38a4ff8520a8ef6bcc6f98d6da8bcd69b89 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x4eefe02fce5b53ca33c7717bbd8ad3c9cb0609f1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xde67d05242b18af00b28678db34feec883cc9cd6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4eefe02fce5b53ca33c7717bbd8ad3c9cb0609f1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x4a5a8b0108f446df7c1c8a459fcfb54e844b7343 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xf6ba006abf768ab2d1b5bba2d22d9f13eb1269d4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x4eefe02fce5b53ca33c7717bbd8ad3c9cb0609f1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x92c2fc5f306405eab0ff0958f6d85d7f8892cf4d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x92c2fc5f306405eab0ff0958f6d85d7f8892cf4d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xc1738d90e2e26c35784a0d3e3d8a9f795074bca4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x92c2fc5f306405eab0ff0958f6d85d7f8892cf4d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xda908c0bf14ad0b61ea5ebe671ac59b2ce091cbf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x254aa3a898071d6a2da0db11da73b02b4646078f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x92c2fc5f306405eab0ff0958f6d85d7f8892cf4d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x41824081f2e7beb83048bf52465ddd7c8e471da2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa0c2ce1723b3939f47ad01a293292f2f75dc629d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc42442f6402b68626e791a447d87b35cb1c6236e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x84537db6f6aaa2afdb71f325d14b9f5f7825bef1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x13933689ed2c6c66e83aed64336df14896efb7e2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x92c2fc5f306405eab0ff0958f6d85d7f8892cf4d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x039df62583ddc1c5fda75db152b87113d863b6d6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x92c2fc5f306405eab0ff0958f6d85d7f8892cf4d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x92c2fc5f306405eab0ff0958f6d85d7f8892cf4d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc39e83fe4e412a885c0577c08eb53bdb6548004a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xdbac78be00503d10ae0074e5e5873a61fc56647c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc1cd3d0913f4633b43fcddbcd7342bc9b71c676f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x6c4c7f46d9d4ef6bc5c9e155f011ad19fc4ef321 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xb2c86ff752f18499b70e8f642b3421405d50d6e9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x16588709ca8f7b84829b43cc1c5cb7e84a321b16 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xd0a4c8a1a14530c7c9efdad0ba37e8cf4204d230 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xf92f2e3fca01491baba0975264362cc38b1cab7b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x3e6e23198679419cd73bb6376518dcc5168c8260 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x531b6a4b3f962208ea8ed5268c642c84bb29be0b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x553e9c493678d8606d6a5ba284643db2110df823 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe3170d65018882a336743a9c396c52ea4b9c5563 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x1385fc1fe0418ea0b4fcf7adc61fc7535ab7f80d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x5cd0ad98ba6288ed7819246a1ebc0386c32c314b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x0ad1e922e764df5ab6d636f5d21ecc2e41e827f0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x6b3a3d6ed64faf933a7a4b1bd44b2efba47614ac - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x4ce4a1a593ea9f2e6b2c05016a00a2d300c9ffd8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x0843e0f56b9e7fdc4fb95fabba22a01ef4088f41 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x8323d063b1d12acce4742f1e3ed9bc46d71f4222 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xe30e4dfdbb10949c27501922f845e20cfa579f09 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x7e02ae3f794ebade542c92973eb1c46d7e2e935d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xfa22d298e3b0bc1752e5ef2849cec1149d596674 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x8066ee17156e4184d69277e26fa8cbca3a845edf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x418de8e0ab58abfe916a47821a055c59b9502deb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xfb9caae5a5c0ab91f68542124c05d1efbb97d151 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xb68606a75b117906e06caa0755896ad2b3dd0272 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x6e33c0f5e16b45114679eac217e0c0138cefcd2e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xd64fb39a5681908ad488b487d65f5d8479cb235c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0217fc17c642d29b890bcf888e21be2378493e01 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x099d23a43da5a8a9282266dbefeaaef958150300 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xd92e0767473d1e3ff11ac036f2b1db90ad0ae55f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x40c547e7fd88f60d94788953b83d9342d8d133c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x397433498c7befde4b4049b98a7ff081a2c17387 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xf9be03505869d719ba194757943575ed2af001f2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x18c40bb9281a07627ff25cea45b7511f68fd0076 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x270d89e983d9821a418bf193684736414fab78c5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xb125aa15ad943d96e813e4a06d0c34716f897e26 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x813c0decbb1097fff46d0ed6a39fb5f6a83043f4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x9a7ac628ba9f330341486380af729c8975388959 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xf2c9339945bff71dd0bffd3c142164112cd05dc6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x12a4619c0bd9710732fbc458e9baa73df6c3d35f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x96530dac7817f186390b64ba63d13becd079b28d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x18fc1e95adb68b556212ebbad777f3fbb644db98 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xabbeb324b090550ca6d15ec71019915813f54f90 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x86d708404d0db1d97843e66d4ed6b86d11be705b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xbfbba3de6a260c8374f8299c38898312c2d6e9a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xd31d41dffa3589bb0c0183e46a1eed983a5e5978 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x391e8501b626c623d39474afca6f9e46c2686649 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xd0fc8ba7e267f2bc56044a7715a489d851dc6d78 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x4fd47e5102dfbf95541f64ed6fe13d4ed26d2546 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xe9033c0011f35547fa90d3f8a6ad4b666a590759 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x0c3561d3b72e17378d99684414aa8669daeb8bd0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x14653ce9f406ba7f35a7ffa43c81fa7ecd99c788 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x3204e9734a56a4d7c6f4f5822e14182d9d1a43c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x43faefd4c0c25e969ac211cd97a4a51e52c729b7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa652ab3be697c7a01fbdce4d73f8e8acd990251c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x29962083891241aad61ad97bae46d032c9c0c55c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x26bf3601b77be9c31b13b22ebca02914db9c7468 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0d2edd335982f56662d772b93d86901eb9bd2ff9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xbaed273edd493930711fe88690ebd1f30f7f55ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x16033643947bf4d8a1ae37b055edf57cb183106a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xf59abf32c1e8c5d2c6e3faa2131533bbcd466194 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x0312187403bf72b8d2d80729894d6ac3300bd63f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x416fdbc4fb8d4d1f48d0d3778c59dfa5352e9b15 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x90908e414d3525e33733d320798b5681508255ea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x5918aca9ae924e6eaaa3d293bb92bdec9ab79338 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x8270e64d22cf13e92c641c4006408c7d7e3ff341 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x16503510c58da73486950b72a12ead3d1d8355dd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x90908e414d3525e33733d320798b5681508255ea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x7505159f644ddc5eae21c119e328d0d5bee574b0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xe870bfe4aacb6e234b645e535d26c53790d50e78 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x2e2d190ad4e0d7be9569baebd4d33298379b0502 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x90908e414d3525e33733d320798b5681508255ea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xb834093d7e46f7644be45e77281394d31003e866 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xb5a1fd804342cfb679bd8ada75718bc3ec43097e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x90908e414d3525e33733d320798b5681508255ea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x9e71e2b14d7e6d30811628ab0965f28e4e2edbce - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa011da4a0c9261ecf4694bf73a74d113aa261133 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x7ab922c1bfdf7df977c7531c5782074d866f3adc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xe2d2050430e341a8f3988e2726e44d9370f8cd3a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xed66ba3ea44425805a085b1ca80d00467b055b38 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x40dade19adc198125ec237a2c48b3408568b2f81 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x166bc40da621d3cb978e24334f844b84ddef25f8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x76bf0abd20f1e0155ce40a62615a90a709a6c3d8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x90908e414d3525e33733d320798b5681508255ea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x6948d6c8532c6b0006cb67c6fb9c399792c8ac91 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x90908e414d3525e33733d320798b5681508255ea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x4e40cf4a7d8724e5adc2b791bbf9451d1e260b93 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x90908e414d3525e33733d320798b5681508255ea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc0067d751fb1172dbab1fa003efe214ee8f419b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc3d7aa944105d3fafe07fc1822102449c916a8d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xd6b4cce96ddf8aab2e5750983af9a901f17fbc36 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x4cef551255ec96d89fec975446301b5c4e164c59 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc0067d751fb1172dbab1fa003efe214ee8f419b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc3d7aa944105d3fafe07fc1822102449c916a8d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xdd0c6bae8ad5998c358b823df15a2a4181da1b80 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xc0067d751fb1172dbab1fa003efe214ee8f419b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xc3d7aa944105d3fafe07fc1822102449c916a8d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc0067d751fb1172dbab1fa003efe214ee8f419b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc3d7aa944105d3fafe07fc1822102449c916a8d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x5e6ff2fa4ca244b6b33c7286d368120822eacc11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x98efd62b4bfbde6393b18b063c506ce5a77f4810 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x3c5096df639262db0a6cd0172f08709d4161094b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xae31f0e673fc5f33cfc0e9abb426d8051404a7c5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc0067d751fb1172dbab1fa003efe214ee8f419b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc3d7aa944105d3fafe07fc1822102449c916a8d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xc0067d751fb1172dbab1fa003efe214ee8f419b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xc3d7aa944105d3fafe07fc1822102449c916a8d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xd10456ce05b9af05c8eede0f93ea8aa80a0daa2f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x065c22a16f6531706681fabbc8df135fe6eb1c2e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x8ab8d851c6b31d8a4d42fd7d3e47b20861b025f2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc0067d751fb1172dbab1fa003efe214ee8f419b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc3d7aa944105d3fafe07fc1822102449c916a8d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x2982d3295a0e1a99e6e88ece0e93ffdfc5c761ae - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc593fe9193b745447e86b45ea0bf62565ee030cc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x88051b0eea095007d3bef21ab287be961f3d8598 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xb31273fd2dfc05e6fd91a3b8a2a681aeb0fbcf48 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xaf7b48ae2f4773fd44f9208cca3db5ae7bfa7e37 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc2125a452115ff5a300cc2a6ffae99637f6e329d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xb08a8794a5d3ccca3725d92964696858d3201909 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xae99efe6b04bbe5b8b4ad567946fb84b35681abb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x6696710b8e3dc0d844c8b9244767962a4a61ad97 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xcde77ef185a8f886d03b109573cc1dcdcf3cf1f8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x35f5387decce5a234da1a32ca3c9e338a48bcf37 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4178dd7eb2eb983ba7f7e41648cf91db6be20190 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xb6c8f9490314394cfc6edacb8717bfdc1eb8dab5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x1625fe58cdb3726e5841fb2bb367dde9aaa009b3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xb1ed164c736909ba7ddbc1feb7ced4eaad854a87 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x95faa9a91cd6c1c018e4b1a6fc4c89d4f1695e5d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa143ccf73c25eec6f38bd1b741043ebea228b8e9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x2e067e0eab7fd31c01473c0f56f3295afb82e461 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xbc83c60e853398d263c1d88899cf5a8b408f9654 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x202a6012894ae5c288ea824cbc8a9bfb26a49b93 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x744159757cac173a7a3ecf5e97adb10d1a725377 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x127452f3f9cdc0389b0bf59ce6131aa3bd763598 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x2264ba9dc0b257c69eeae7782e8ff608cc65d6a7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x00a59c2d0f0f4837028d47a391decbffc1e10608 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xad6e8f6a34087bddfb03815e2c10e4f7bfd4395b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xd5bb156cb73bfca62f68dc3dff7e5ec4e305b861 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc0d8f259578c985947a050802fb4857261af0bf3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x74f7a360eb36a46b675ea932ea07094a3ace441f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x626761cc5b9fafe4696bf8def4aa015576bb4bef - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc767c0b2e2e56c455fd29f9ee9b6e6f035c71ed4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x625cb959213d18a9853973c2220df7287f1e5b7d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x7138eae57e8a214f7297e5e67bb6e183df3572d5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc7bbec68d12a0d1830360f8ec58fa599ba1b0e9b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x840deeef2f115cf50da625f7368c24af6fe74410 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xda71299ff6bdac31bdcafde52a41d460f17e3ad9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xabebc245a9a47166ecd10933d43817c8ef6fb825 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xb007dda6ca7a57785ce04981c30a1934995a197a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0de383928e4fcf0f90ad2d6a5ee18eb3b9d16a55 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0a36df020fe3f132e6557899f272bf3d4591620e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x8c9d230d45d6cfee39a6680fb7cb7e8de7ea8e71 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xcb198a55e2a88841e855be4eacaad99422416b33 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x9b371948735f612be19195f5f6e5ebc03839cdaf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xb3709d0e16b618b15ee4bcf82d19b9e7d4100914 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xe426e1305f5e6093864762bf9d2d8b44bc211c59 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x7b9a5bc920610f54881f2f6359007957de504862 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xfb82dd4d657033133eea6e5b7015042984c5825f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x92560c178ce069cc014138ed3c2f5221ba71f58a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x6ef7d514d75b5a5a3c500dba1b161a81e842e7a4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xac70bd92f89e6739b3a08db9b6081a923912f73d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x1ebcf8831b93450ea81b0619c5e05b98751c8322 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x470d0d72c975a7f328bd63808bfffd28194b3eb6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa961f0473da4864c5ed28e00fcc53a3aab056c1b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x6ef7d514d75b5a5a3c500dba1b161a81e842e7a4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa5b6d588ceb3aa1bf543d095038479188f884690 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x6ef7d514d75b5a5a3c500dba1b161a81e842e7a4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x6ef7d514d75b5a5a3c500dba1b161a81e842e7a4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xb1419a7f9e8c6e434b1d05377e0dbc4154e3de78 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x6ef7d514d75b5a5a3c500dba1b161a81e842e7a4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x70c132a2ddeccf0d76cc9b64a749ffe375a79a21 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x6ef7d514d75b5a5a3c500dba1b161a81e842e7a4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x6ef7d514d75b5a5a3c500dba1b161a81e842e7a4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x1b942ce8bf08290f740b9e825c91e07fcd0bfe75 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x5016cd7b785a773f7f3a3ff4035a1e7a76543946 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x4f122edcd91af8cda38c3a87158afa8687bab57c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xed3fe08bd12f24dad0f1a1e58610644debe374fb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x5016cd7b785a773f7f3a3ff4035a1e7a76543946 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x7bc815ca2c2115f896bb14b31b8196388c05e99b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x5016cd7b785a773f7f3a3ff4035a1e7a76543946 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xd29c2df656b2e4ae6b6817ccc2ebe932fc6a950b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x1f6082db7c8f4b199e17090cd5c8831a1dad1997 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x5016cd7b785a773f7f3a3ff4035a1e7a76543946 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc64f886397988ff16d72123dbe3d46e5bf33ffac - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0d2c430c6f7ef48ed34bf4aad0ec377e03cc53cf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x5016cd7b785a773f7f3a3ff4035a1e7a76543946 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2b11a34f52e354ef197f0a2397008699b875ae7e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x5016cd7b785a773f7f3a3ff4035a1e7a76543946 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xde27bdec962a74a72fa1c5ef50bff6f3da083e05 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x7766bdc5ff15d3aceb4d37914963aebaccf3de15 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x5016cd7b785a773f7f3a3ff4035a1e7a76543946 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x67ab7dc903a10838a0de8861dfdff3287cf98e5c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x88aaeed1fcfca2eda30749afa9ad45a75c80e292 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x2c8e9a1586ed822f79c0a241e1a4d48e839b3182 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x847165954680b989902e354f34d08b09afab3cd9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x590269935821d760c54b32d31db66ba47d4e53b4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x03d70bf9e6afbf8cac09ef0c45f9a00a841c2bed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x8b238f615c1f312d22a65762bcf601a37f1eeec7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x5280d5e63b416277d0f81fae54bb1e0444cabdaa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xf4e43a4a17d2820c7cf724e46844943931a47894 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x5ab53ee1d50eef2c1dd3d5402789cd27bb52c1bb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe6ff8b9a37b0fab776134636d9981aa778c4e718 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x44af8d03393e498eec5fcfc7936ebc381f02974d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4094915f7849b26e8d43dee1f7e3b7b477a0b5bb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc3f5e0d4cdff86e85486cf6bd20cc0884df5f98e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x87428a53e14d24ab19c6ca4939b4df93b8996ca9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x9dbe5dffaeb4ac2e0ac14f8b4e08b3bc55de5232 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc3576f38c32e95e36bbd8d91e6cbe646a3723110 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x8d58e202016122aae65be55694dbce1b810b4072 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc3576f38c32e95e36bbd8d91e6cbe646a3723110 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x8d58e202016122aae65be55694dbce1b810b4072 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa7bb0d95c6ba0ed0aca70c503b34bc7108589a47 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xbcfac19a0036ada56496316ee5cf388c2af2bf58 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x296b88b607ea3a03c821ca4dc34dd9e7e4efa041 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xc3576f38c32e95e36bbd8d91e6cbe646a3723110 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x8d58e202016122aae65be55694dbce1b810b4072 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x019c29d5c97f8cbaa67013e2cf4b6506a5cf183a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc3576f38c32e95e36bbd8d91e6cbe646a3723110 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x8d58e202016122aae65be55694dbce1b810b4072 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x30442fcebbd75a5bb58377c0174d5ce637e297d7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x6c561b446416e1a00e8e93e221854d6ea4171372 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0fb597d6cfe5be0d5258a7f017599c2a4ece34c7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xe9b7057f9b81a0120c09306d35f22859473f18cb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x8deb37b048f4b3c7bd61eca7dfccbef7cba726de - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x455fd3ae52a8ab80f319a1bf912457aa8296695a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xe11d03bef391ee0a4b670176e23eb44aad490f12 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xe7f850731fed6af4c36cce93eccfbcda0634a030 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xadad4ce0c68f50a19cf5063e0b91d701daab1df1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x5e9bb3d7682a9537db831060176c4247ab80d1ec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xe9ed60539a8ea7a4da04ebfa524e631b1fd48525 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0511791eb6fb175a1aaa645114f0f5c8689ec163 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xf3c7b93db3f28580b0fd10365e619eedceb40e76 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x58ecf9cec06bc58fde9280d348f79ed8f3d3046e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xedc7f0dfd9751ef95bb8786a3b130f490743bb0e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc3576f38c32e95e36bbd8d91e6cbe646a3723110 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x8d58e202016122aae65be55694dbce1b810b4072 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x6bcb0ba386e9de0c29006e46b2f01f047ca1806e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xc3576f38c32e95e36bbd8d91e6cbe646a3723110 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x8d58e202016122aae65be55694dbce1b810b4072 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc3576f38c32e95e36bbd8d91e6cbe646a3723110 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x8d58e202016122aae65be55694dbce1b810b4072 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x34a43471377dcce420ce8e3ffd9360b2e08fa7b4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x34a43471377dcce420ce8e3ffd9360b2e08fa7b4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x34a43471377dcce420ce8e3ffd9360b2e08fa7b4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x34a43471377dcce420ce8e3ffd9360b2e08fa7b4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x34a43471377dcce420ce8e3ffd9360b2e08fa7b4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x34a43471377dcce420ce8e3ffd9360b2e08fa7b4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x34a43471377dcce420ce8e3ffd9360b2e08fa7b4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x766854992bd5363ebeeff0113f5a5795796befab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x9438a9d1bdeece02ed4431ac59613a128201e0b9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x0a63d3910ffc1529190e80e10855c4216407cc45 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x89084692453ab2305f5f8ac7d70d5efd37a86b8f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xb34a5657988da5b9888952c439756594613507aa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x05efb437e4e97efea6450321eca8d7585a731369 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc973c86afc23ed731ce1a14d7179003a1601205f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x0f44a1c2b66418f784607d2067fe695703809bff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x0da6253560822973185297d5f32ff8fa38243afe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x622270721fb38fde831ab23a8e177665557f6fa9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa95b0f5a65a769d82ab4f3e82842e45b8bbaf101 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x622270721fb38fde831ab23a8e177665557f6fa9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x886b4f0cb357e0d6ec07b7a3985f346cc17ece7d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x622270721fb38fde831ab23a8e177665557f6fa9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x50defb73a76efe5d5d35cf267ffb02dfd6cd96bc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x622270721fb38fde831ab23a8e177665557f6fa9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x7aea2e8a3843516afa07293a10ac8e49906dabd1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x8c7080564b5a792a33ef2fd473fba6364d5495e5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x8f81b80d950e5996346530b76aba2962da5c9edb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x7bc0f74d8d94e8e9fdaa40bbc04cc44fb8e0f081 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x09c149c856e6fb6e40aa39209142411b554b1a41 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x622270721fb38fde831ab23a8e177665557f6fa9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x7ef0a523c49b1dd07e3593198c5260a95ad7859a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x622270721fb38fde831ab23a8e177665557f6fa9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x622270721fb38fde831ab23a8e177665557f6fa9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x15aa01580ae866f9ff4dbe45e06e307941d90c7b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x4548280ac92507c9092a511c7396cbea78fa9e49 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe0554a476a092703abdb3ef35c80e0d76d32939f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x421803da50d3932caa36bd1731d36a0e2af93542 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x258a4b7373f6863db5a17de191e0cebb1e0bbc8a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x45126b956401daaec92afba2a9953e14b16fb83f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa3eaa52b505cf61aadcfe21424d43a6847dd6331 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x722bcf6c16dadcc29914e4e64290c46aa1406de8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x1e1367dcebe168554e82552e0e659a4116926d10 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4d170f8714367c44787ae98259ce8adb72240067 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xaa97f0689660ea15b7d6f84f2e5250b63f2b381a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xb736330326cf379ecd918dba10614bd63c2713da - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe3d4faff3179f0a664a3a84c3e1da3b90e27f186 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x50e7b9293aef80c304234e86c84a01be8401c530 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x87dddd2e152bf1955e7e03d9f23a9dcc163eebf6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xd9dd34576c7034beb0b11a99afffc49e91011235 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x394a9fcbab8599437d9ec4e5a4a0eb7cb1fd2f69 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xb3adde966b8a1a6f22a04914ee9fe0798e71fc5b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa2d4a8e00daad32acace1a0dd0905f6aaf57e84e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x2392ae4ba6daf181ce7343d237b695cdf525e233 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc2c390c6cd3c4e6c2b70727d35a45e8a072f18ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x95f4408736988549212db071b1c8d20f7c4e6304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x3dd2fdba71282083d440687cce9e4231aaac534e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe4d9faddd9bca5d8393bee915dc56e916ab94d27 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x95f4408736988549212db071b1c8d20f7c4e6304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x9c92ed19a86986124447a73b27625230dd52f805 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x740601243a6aa25ce4ee2d196eef83ac3bec6c65 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x95f4408736988549212db071b1c8d20f7c4e6304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x95f4408736988549212db071b1c8d20f7c4e6304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xafbb6fcc92ddb091dbc13e9073c3360c7d9600cc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x95f4408736988549212db071b1c8d20f7c4e6304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xf54eba95d7f8dbe4bfeb0b6e038b3c2bedd3e40a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x05c0a0b84b6b67499c33e6403686f45cab063810 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x9169bf3657353e4b2b81c75e235f22bc299a7780 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x95f4408736988549212db071b1c8d20f7c4e6304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x95f4408736988549212db071b1c8d20f7c4e6304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xb0bb2c1d32c7b27f21eec4402c6d1c38795c090a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x534d3930edba2c0b90a7973549a0287141c987ef - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xf27d0dac09460b236d4d9e0da316fe9c3a99b4a2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x0c3fdf9c70835f9be9db9585ecb6a1ee3f20a6c7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xdd672b3b768a16b9bcb4ee1060d3e8221435beaa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x0c3fdf9c70835f9be9db9585ecb6a1ee3f20a6c7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa39fe8f7a00ce28b572617d3a0bc1c2b44110e79 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x0c3fdf9c70835f9be9db9585ecb6a1ee3f20a6c7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x0c3fdf9c70835f9be9db9585ecb6a1ee3f20a6c7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0c3fdf9c70835f9be9db9585ecb6a1ee3f20a6c7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x96d5d78b179169ee0a0a0104dc514988f2a797fe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0c3fdf9c70835f9be9db9585ecb6a1ee3f20a6c7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xb466d5429d6ad9999bf112c225d9d7b15e96c658 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x0c3fdf9c70835f9be9db9585ecb6a1ee3f20a6c7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x8a35d2635aeca1aaf667d77ed9ff3b21e48ede24 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe566e99d65b17974fd9db02e25e24ea8020f7a0e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x5c3edc45ae71a353c669cfa71e6488951dce4618 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa7b3bcc6c88da2856867d29f11c67c3a85634882 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x543842cbfef3b3f5614b2153c28936967218a0e6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc45a81bc23a64ea556ab4cdf08a86b61cdceea8b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe333e366503f620e0242796431dc74fffd258e66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x42161084d0672e1d3f26a9b53e653be2084ff19c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe24f62341d84d11078188d83ca3be118193d6389 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x782dcc2cd3a65405baeb794269703e9c29a175cc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xae8d5b91fca627410a3bef77f55fcfe208409a40 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa42eb1c1a212da9e24058c6afc0ea906fecb8351 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x0e3529cf622dc1141a31cfc0fc85f679f558c92b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x6f5ec7c65c2744a963064f6d49df0f4eea7d7d90 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x9a772018fbd77fcd2d25657e5c547baff3fd7d16 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xfc1505b3d4cd16bb2336394ad11071638710950f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x8e0a7d4018fb2674346d5742055174f899fe1826 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xf8aa1db87d84118b0b461e2135190ac27fc1859d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe8f7c89c5efa061e340f2d2f206ec78fd8f7e124 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x56534741cd8b152df6d48adf7ac51f75169a83b2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x73a38006d23517a1d383c88929b2014f8835b38b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xf5d63f66a36be31a106631f276794223b8ce5280 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xcf0bb95967cd006f5eaa1463c9d710d1e1550a96 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xdc9bf303e72a5780c45d53fc12799164e5ba8271 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x1d4dab3f27c7f656b6323c1d6ef713b48a8f72f1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xafd8f9b89e2af8246523573a369010daf9489b12 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xbd045175d2a1451a015079f5f3f59ca5c05524ea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x859ec3d336bb5508f6d87fea2d49c9294adae311 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x8544383f6f2eb43711fba8d918b30658856b9806 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x5166c1bd4603cf67dbb9a98940e38d2bd0a7f294 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xf215cedbae999571e4ba5d80c10b6e835f88d5ec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xd4cb5566b5c16ef2f4a08b1438052013171212a2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x357faf5843c7fd7fb4e34fbeabdac16eabe8a5bc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x2bbfb5a2496f405d4094d4b854daeb9ce70d0029 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x3373a22cb07cb49651b82cf6f174ef434e4dbaa8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xc8d19b4ea42939a4b14260f0c8b4a0d6f70c8496 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xb2290db2f409201c33c507d266becabf19228dd1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x0c30062368eefb96bf3ade1218e685306b8e89fa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x6f38e884725a116c9c7fbf208e79fe8828a2595f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xe612cb2b5644aef0ad3e922bae70a8374c63515f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xdef705a1864bcba65e4e275bffd58de21b5d44a0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x717358a47ac99f3cd233e723be331756b3951164 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x9166a0139cab9661e08779cd01b1358aaea7b95f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc1a6fbedae68e1472dbb91fe29b51f7a0bd44f97 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x3a3dc4a26d1aceae12fd1026a5856f12d20658ea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa2375dad211fe6e538d29c98ec526246e38be4ec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x4e4a4c4c46d3488ff35ff05a0233785a30f03ec4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x5d27fdd96c8e4028edbabf3d667be24769425199 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x1944ac04bd9fed9a2bcdb38b70c35949c864ec35 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x5e2cd0da3411449152010d8b7f2b624eb29cca59 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x85e8d0fddf559a57aac6404e7695142cd53eb808 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xead1cd21ddf8793debc9484a0b8d286230c9b5a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc4ecaf115cbce3985748c58dccfc4722fef8247c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x2f42df4af5312b492e9d7f7b2110d9c7bf2d9e4f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x021235b92a4f52c789f43a1b01453c237c265861 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc6e291f54532f12391ab59d7af75453db2dd784a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xfe4fe5b4575c036ac6d5cccfe13660020270e27a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xfa7d79f971a70771e5e92bd80ab955edc8602f4d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x023b6298e2f9ae728b324757599f2a36e002a55a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x53d3e59faac08184720bcb2816f4cf5b36d6767d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x7e9cb8ad4a7683070e233f3eb1d07d87272b9b26 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa213c82265cd3d94f972f735a4f5130e34df81bc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xf1fdc83c3a336bdbdc9fb06e318b08eaddc82ff4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x3d9228f1847b07e6b2c8eaaf393d5a4db2dbedc2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x9263bb7e2d3570593d80d087ea2cfc72882cfb2c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x360b9726186c0f62cc719450685ce70280774dc8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x9ec9620e1fda9c1e57c46782bc3232903cacb59b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x1112956589a2bea1b038732db4ea6b0c416ef130 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x663b1d43c27e41e5e512bf59010133997d1cd304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x9ec9620e1fda9c1e57c46782bc3232903cacb59b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x1112956589a2bea1b038732db4ea6b0c416ef130 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xfea834a5c47b923add607cc5b96288d18ffb9c3f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x9ec9620e1fda9c1e57c46782bc3232903cacb59b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x1112956589a2bea1b038732db4ea6b0c416ef130 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x273d580e9ceadca5b2a8ceb5ebb38a70511377cb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x9ec9620e1fda9c1e57c46782bc3232903cacb59b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x1112956589a2bea1b038732db4ea6b0c416ef130 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x3b241fb91c65f42432ebdbca029e0b511c8a1707 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xe9a65059e895dd5d49806f6a71b63fed0ffffd4b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x01a1f5758c3a53057b6c819ec7331e39c167794a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x40fc7cda03139ebf7a0d3fc01f12b9d9a878cc92 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x11e26bbd1a5547895a50fc39a2d4c0025dec0bda - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x21cbb0e695b0ac79be756a87da690fd80bef4bff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x68b27e9066d3aadc6078e17c8611b37868f96a1d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x9ec9620e1fda9c1e57c46782bc3232903cacb59b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x1112956589a2bea1b038732db4ea6b0c416ef130 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2af64d33a47e7a98eafc20ce9f6af59927d10260 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x9ec9620e1fda9c1e57c46782bc3232903cacb59b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x1112956589a2bea1b038732db4ea6b0c416ef130 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x9ec9620e1fda9c1e57c46782bc3232903cacb59b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x1112956589a2bea1b038732db4ea6b0c416ef130 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc4ce8e63921b8b6cbdb8fcb6bd64cc701fb926f2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x9febc984504356225405e26833608b17719c82ae - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x59c38b6775ded821f010dbd30ecabdcf84e04756 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xcec31e540163ddf45a394e00b11ae442ddc0d704 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x7f9121b4f4e040fd066e9dc5c250cf9b4338d5bc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x316f12517630903035a0e0b4d6e617593ee432ba - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x61928bf5f2895b682ecc9b13957aa5a5fe040cc0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x9399da51c1a85e64cce4b30b554875d2b89b2445 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0962a51e121aa8371cd4bb0458b7e5a08c1cbd29 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xfbb6eed8e7aa03b138556eedaf5d271a5e1e43ef - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x913a4ed1636c474e6451b5e9249d94046a24bb33 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x8e3ecc0b261f1a4db62321090575eb299844f077 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x99950bae3d0b79b8bee86a8a208ae1b087b9dcb0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x948b54a93f5ad1df6b8bff6dc249d99ca2eca052 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x5738df8073ad05d0c0fcf60e358033268ebf16cc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x52f9d14bed8ce6536da063aaf274ae2747ef4853 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc0f05732d1cda6f59487ceeef4390abcad86ea3e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x28117b7b8dba890041d7ebe646082af043533da2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xf3ca4ade682c5b99507db9a72549318b8708f137 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x9c087eb773291e50cf6c6a90ef0f4500e349b903 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x037818b04ac34ea8b54b6683b79ef24d23c0e7cb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xbf6ef625de5df898cc1d0f91868aae03976a2e2d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xfdbaf04326acc24e3d1788333826b71e3291863a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc68b994e2147b8bcf18f82c201ac3ee1e97be33d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x47808ddbc91646b21b307fefbaf7ee200b004ccc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xafa5421fe7997c16e11458659f5a87d67f1e8651 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x26b4103c8da21725909955fe85f7f6249d05dd9e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x79dbd26d3c1e44171205f258aadfae84933b69b8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0f9e3c4b905e6292b33f5ef96af18054ded12ac8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xb0e1a214130245d289ae425db7826576694a5b5f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x32a5746ba6826828716cc1a394bc33301ebc7656 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x0f725b113979e025c69da0ffce3fbf5b6063cc5c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x056c5ff8380625cc94efe865a4c178a33ed546f8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xda67d7c01c4c8f757c105c0890d94ac489952cd5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x4fe87203b27a105a772f195d3f30dea714d1ecf0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x670e77c361375be9013869ccc516027ccc90383f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xaec085e5a5ce8d96a7bdd3eb3a62445d4f6ce703 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x92d90f7f8413749bd4bea26dde4e29efc9e9a0b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x2c114787d52e9f080464dbed8e285e07ec4e120f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x303b00d7a2ad12a480db7c04de5835ec9ccc37b0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x6f9d09253f99d2b6843b5ec62c23496c37327216 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x4cd15f2bc9533bf6fac4ae33c649f138cb601935 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x63d134fa19fbb35ad689dbb6b659879de1e7fb29 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x5cbddc44f31067df328aa7a8da03aca6f2edd2ad - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x72da5b3c28b8cee48158f469e0e9215607fe06d7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa7cca1c4a7d4b70f687380e0454e5ae418db53b1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xd364eb55e17700b54bd75feb3f14582ed7a29444 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xb3fb7ccf7b681e9562c6da467db4859a8ef0b8de - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0eb7fbe43045426938ddadc11dc41338e0907659 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa23fab21d0653c231166b31cb6274ff45eba2ee5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xf68001b66cb98345c05b2e3efdee1db8fc01a76c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa3adcaaf941a01eec47655c550dd5504637d029a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x6dcba3657ee750a51a13a235b4ed081317da3066 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xbbf3209130df7d19356d72eb8a193e2d9ec5c234 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x6de5072c06cbf37da96ccc0fc85c85ca82fe9d13 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x183ea22691c54806fe96555436dd312b6befac2f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x6f169193b181d9492f9bde038109cce6dfe19321 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xe9d448cc1ed83891ab5b381face53f0cadb3a8e5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xcbfb0745b8489973bf7b334d54fdbd573df7ef3c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa04d13f092f68f603a193832222898b0d9f52c71 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x0df407bc6abe9af2093dcb4c974e18d40a6a381a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xb2c5d104f481d0beb056842bd5312be6fd831429 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xb2c5d104f481d0beb056842bd5312be6fd831429 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xb2c5d104f481d0beb056842bd5312be6fd831429 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x56fcb902bee19a645f9607cd1e1c0737b6358feb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xb2c5d104f481d0beb056842bd5312be6fd831429 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x7b9fda92bfa6fdadfdc4f6c72c0cc8336e7d7497 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x1d2bdb7117a5a7d7fe4c1d95681a92e4df13bb69 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xb2c5d104f481d0beb056842bd5312be6fd831429 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x7e4fb9e08cf122feb925117bace017ea234944d3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xb2c5d104f481d0beb056842bd5312be6fd831429 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xb2c5d104f481d0beb056842bd5312be6fd831429 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x867b321132b18b5bf3775c0d9040d1872979422e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xb26a868ffa4cbba926970d7ae9c6a36d088ee38c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xc4329493d7566525a4d51698a33f43ad240e9290 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x96239bd7ae3d9bc253b1cc7cf7a84f3a67ca5369 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x2ff525c71cb7b29fcde4bea8c8f601b1dd22480a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x43f34a518e20b9454c94bf4026ec9024ed84a062 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x12146c8e7469be19ec6c7f58b80246548144f8b8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x026428e531f30b2714ceff3781d7cdf5d278e96a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x2049df3435bdbb36d22f98fcd2e5027049a1f3ce - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x2049df3435bdbb36d22f98fcd2e5027049a1f3ce - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x2049df3435bdbb36d22f98fcd2e5027049a1f3ce - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x22d1c3c541dd649ea4a8709fc787f348dc069e95 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xd9abecb39a5885d1e531ed3599adfed620e2fc8a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x25fb97799f80433e422f47e75173314e54dae174 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2049df3435bdbb36d22f98fcd2e5027049a1f3ce - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x2049df3435bdbb36d22f98fcd2e5027049a1f3ce - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x3e2e284d55926f5f6e86987da6be216aef292e76 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2049df3435bdbb36d22f98fcd2e5027049a1f3ce - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x2049df3435bdbb36d22f98fcd2e5027049a1f3ce - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc8219b876753a85025156b22176c2edea17aac53 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x27807dd7adf218e1f4d885d54ed51c70efb9de50 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x1d69099803b4580efb8df0c7ef083e550a1c42c1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xec558e484cc9f2210714e345298fdc53b253c27d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x37bb450b17721c6720040a150029e504766e9777 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4cd04970dcad72d09c3af2e09f15bbcd2eb1d5d4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc9d0cae8343a2231b1647ab00e639eabdc766147 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x8c7adf7bcfdfca0a27f3d7ad49698b9e11c1f20b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x98e4799d58982ed714159c30a34b4bdb20ba20b7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x8ff82952cee74c095c1734ee144143a755d3c600 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xf7513c120b92fa4dd5cbfa78dffefcb4ced5743f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xdd2e0d86a45e4ef9bd490c2809e6405720cc357c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xd2fdfd5059a83e15bf362f094a2ae63f03b554ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x5116773e18a9c7bb03ebb961b38678e45e238923 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xbac01354f2109eb3aebcb46b3ee43813dbae1a7d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x357596dd7a0ef5cb703c5aae4da01edff176ae95 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xf8e349d1d827a6edf17ee673664cfad4ca78c533 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x48da0965ab2d2cbf1c17c09cfb5cbe67ad5b1406 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x49d27c3e1cac5bcf7615f2f8e1c1af6ab9db8225 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x679420c54cc4806d0f480925772965746d9f9779 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x20b795a5bb2cca7598b67739dba8666ab3c506f8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x55703b183e4676d3e72289995c2e14fa0cc29c1b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x3e7995110680e6a55e6e430a1c511e921f896316 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xd19a1c8278d0420bfb2c825d99dc31ff86224607 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x9c42751954513c0461481a9600c9d11a059ddd12 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x7d68d2a3b22824a7895ad475f4fc3ca9ac8a240a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x65081cb48d74a32e9ccfed75164b8c09972dbcf1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x765c3773f641ad8073795765c5c41c075f91b140 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x18b268965e4e702bdf13469205937894b8ab0ee8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x6b918c9f87b46a758c2b51bce427c8028dacb720 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xbda709a0665b340898856b8b29ff87079bb130d3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xd49174dba635489c67fa628864c2d0d04824ebd8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x9e2ef5522b2f9eac00912f25082f6e652123b54d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xc673d5164103357a7537c36438a6326776a14bbd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xe97a0889d2b0660fddc144a8893b3ac9236756a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x12095933f1eeb066176dd2e41e5a2f8be6974616 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x8eb4b07affbd1083f42032eed35cd32e382ee8b7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xfbc45ab96d02e150b2ddeb7dd4eacd3d8c674f4a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x9d7151413833dcb13ae284d6a7fccd93989c47a1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x18ce92e7a37d994657f97c3defaf880a805f08d5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xa9c6669de2c04c2adb22ac7a65d75b47fee30e35 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x6e4e17973cb963c9931617d8d0e35813cb5eb886 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x8927058918e3cff6f55efe45a58db1be1f069e49 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xfae3f424a0a47706811521e3ee268f00cfb5c45e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x7b602f98d71715916e7c963f51bfebc754ade2d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xb978a8c502ce97b04043036a91548b846067f9ea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x804226ca4edb38e7ef56d16d16e92dc3223347a0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x9ba9c677d19347abfba1d6b6d6ceb61942071561 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x5e8754aaa7c2da42c218f40435cbdedbae88bfc5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xeb7e0191f4054868d97f33ca7a4176b226ccbd2f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xd1356d360f37932059e5b89b7992692aa234eda6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x27b571f3e7f7827b13d927d2d59244e3e58a7d1a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xb2dc1235bf4b36628a8665aeb668bf202759528a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x2e587b9e7aa638d7eb7db5fe7447513bc4d0d28b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x724f6a02ed2eb82d8d45034b280903cf663731ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xe54dadf5b4f8779256e1bbb94eca00b124311208 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xa7141c79d3d4a9ad67ba95d2b97fe7eed9fb92b3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x28f577ed1cb3b0add148d745d9c0a2c0c40cc48d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x12089f58e0e7eadfc7d60cf1b1ed6839a811672a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x3859de09906bed098879cbef34d80817357244c7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x01ed0722f62a5dd3212b04aed2a2065623a705bb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x178b99eaa2f6bc97d16f84edbce2e23ae6b8140b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x0e663593657b064e1bae76d28625df5d0ebd4421 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xd18384f4398bf5415902ad5d87eaa96549fd4f1e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x97bb1788dcd64e17166931b87789cae97c154009 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x83b9a48793f4e5be12cfe1de3b1d55a83c4f1a9a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x6d61ae1b0d94941dc702581daaaafc7665d1c6d7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x9a68f0bbced6d6f1f63f0a61215742377ac9d325 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x01c7c6066ec10b1cd4821e13b9fb063680ffa083 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xcea3c61705b68fefd8da1048ca69db1344180fcb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xf39f633a18042105454ff64c6abd07beb8cbcead - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x7fd0055020a6d9c43c31c8ea755c5038ebd39722 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xe1e870fdff3ad67f2879542d841d8ab3e1406f4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xc0a57a72cb7da55da2e50f664b1641570941618f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xfd584fcc3a74429d85c9a2294eaf0f566ddfd593 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xfc1e7bc60adfc151565c033521ee6ccbde027f54 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x78b4c0301b7e6e3d31f259b3f112ced639f030a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x94a0d838379e9703b69a777191d8a8951ada2e8e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xd399718256c5206d9586e866169dbdf131193e02 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x43fb9c3fd6715e872272b0caab968a97692726eb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x9d1bcb75a7bc5defe7daed505c462572b5e022f9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xd312a35320a5936409edfd5e2eb0d17bcf99910b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x118bc22a76a71ff3187577422af2d57210277bab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x90fbfd28f16fa163b914be6b9b3eeeb1c3e02fe5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x44f904512639f2a4530dc3b0cce8927b09226a43 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xaf4ceda77ec614099ffe67b7f4fe4427d52e75cc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xd494b33229ee2c857a43b94ee7117be05e5fd88c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x0e7a5a8177d5711dc90ba9a6ded590060f52dd29 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xcec63fa2b71744e1cdd48f71e34acedd46b496aa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x0fbb556c73226b12cd7cfb2bed56e77fc177f0ec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x15309a0e8c954c46601d8028153125c3b92884b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xdbd8a9c9d060973557f3ac7c7f642a9523529d68 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xc58a6a266ede99e0b8069f3f45a3028c2aaf4c0c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x85287626e78602d0da569332e419154b0bdea035 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xf52b4b69123cbcf07798ae8265642793b2e8990c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x1cf4cfc7a984a474ab03f444ccedb30c3ae6f56c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xf5a23bdd36a56ede75d503f6f643d5eaf25b1a8f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x57529f9e2a23cc53fc387b162d2ab0f1df3ed701 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xf4b646bc85458cc74497c773e2bc8b9ec1351e97 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xf08ff66b8ec0db053711f4989c40b084564f7de3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x0000fb2a9a0f3f35d72d7eedb8689c6db1d30225 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xbb60bb410182d8e96c41dfc92e017dd79f5100bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x0f6c5fdcb927b99b3040c609bef07bdfc59a6173 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xaeba85e3328d6b77b58130f43815ac9c59603d38 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xbf796b95d09729815806dd50de07c1111aa3926f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x63f59866a7e9a8628e7f1577ba55da134d64d8c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x78337095c61035056a85b7d430d6e9875f177ae2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x258ba3b253e5cc3bab01c28d2f527aacd6d96793 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x7b8086f5442f130a6be2d62dff02319018344feb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x9dfb11cf311a8fa1296f6958057f8bb02be51a4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xf95141f5552e592dc58c41e54d65d0f645ab7d7e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x610e319b3a3ab56a0ed5562927d37c233774ba39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xdce053d9ba0fa2c5f772416b64f191158cbcc32e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x5f835420502a7702de50cd0e78d8aa3608b2137e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x3672722f9c4413c63d8e275bea51ee526449a92d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x0d8322f0422664ccf845fccedc10a82b292f9d3a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x494d68e3cab640fa50f4c1b3e2499698d1a173a0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x02371da6173cf95623da4189e68912233cc7107c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x7c3c2a92598d6d77e57fd55c50e99af4b291f595 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x6787de741bb42ca7ff7dd1b9aad6098c850cdc6a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x56505f73cf8f5ef637bb37d9e635c3f520c9b0e5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xad710fbc1161b26ea427c158f49a93f6d9d871b4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x3d7264539e6e3f596bb485e3091f3ae02ad01ef8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xeecb86c38c4667b46487255f41c6904df3d76f8f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xa0769a3c6af68812bb3a5cbd511f7879033440eb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x23c77a553aac0ad009441c856c05d117c1131e3d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xedb4833e1cae54b3b7637f71edacf9abfcfbd1bd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xf8c42655373a280e8800beee44fcc12ffc99e797 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x4b2dfca17caadc23c9d28eb77ca27b52731e3aba - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x105a6f7c2f23270db6eed8d9ee8474323091d30c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x4152fdbf1ce1957b6fafd55737f96a26b787ee9a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x3f618967492945c02d5222d333e903345fde741a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xff577f0e828a878743ecc5e2632cbf65cecf17cf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x3e3dd517fec2e70eddba2a626422a4ba286e8c38 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x433587150898e706b21d68b48833cdf274987743 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xc99bcff6564bafc70ba1b53c53a03541f780a546 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xdc4359ca3a73c05b83759d3fe6618b499ff5f656 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xa07028b453a1f6ac277e93f3a0ea73b4be5c7d63 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xc1fcd2a14df1a10f91cdd0d9b6191ca264356eec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x3f777c16829c7d1885a7a46912560f1ba764218d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xcbd38eba8170f475063bcc2c56cb213f8db1f9e1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xbeea3b382696669e0e67c08ea9f4aae8d528af0f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xd864e059aae2d400ef3ab5b4d38b4370d63f1277 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x9e83bb5cf96fd382affb9f9f4d1bbdb49e7a5e7b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xc4ea014402cddb4c6d2c4cb6d1c696eded93630a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xd8ba14df11d963bd3c00ada3569a361d1810d4b1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x663a655203ec965a3f642772ef49ba1e99c1520d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x1017e7b5efbb2d230979cf166078c1a96cdeeaef - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xbffd6eebdd42038067b10e04d3682e6373278ffe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x7657d138111306459def4ba2285730f35ed6066f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x2dee3855d991a07ad3ed1fe3b26343320a122963 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xe5bacf3e9b092c71de7cfe28124beb4c9d85783c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x80643ea8601be7f65362d4c2dc17b435dfa22762 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xfc93ec2d9d0d390209365013aaa6358db9f77936 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x4d8295d7a043007760e1b2ea3ec07c93a906874d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x341584a7aa4cbfe1381009762aabdd0659542348 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xed1def6744ba38d53ef80b59ac010b6d9392bcae - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xffbd38130ff590d0c4d82e3851f6f4fdf9a3d3ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x1fa900dbb20ed45d18883849c00632bca16f6610 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x81111cd2ab53ccb3d060c0fd7b303654151c3b9d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x6dbdeea3d4127913420eedd6ff25c7c6765e104a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x42e2209e6d9b4ed0cce3d06a5a5d7b65d577cf5c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x86c2fd1c99d8b7ff541767a4748b2eb38fd43da8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xbc59f8f3b275aa56a90d13bae7cce5e6e11a3b17 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x1ed9b524d6f395ecc61aa24537f87a0482933069 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xc3aee7c0e80f65ff13655955fa51d971e5d8d535 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xaea25cc307dc4bac390816f3d85edcbc805c589d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x33604ba99eb25c593cabd53c096c131a72a74752 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x3c127629c99355f3671f128ebef2f49b4d17e4e1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x4684c6198243fcd8bcfa706d8e29b6b0531c6172 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xb14db2b0cdb55dcf97f7388a2f70b7ad28c80885 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x970a7749ecaa4394c8b2bf5f2471f41fd6b79288 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xf7fd0860922bd3352e2dbaf725a182b74bf7a2e1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xab22d1d671bb5cee8735c5ba29ea651ccda48a8e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xb003df4b243f938132e8cadbeb237abc5a889fb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x00c8e9500f32237beecfc8179ae064606d457577 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x5151c83ad4e1c8c4ea0d1eaf91c246a8c6dab2a4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xad397a0472503b066ab4b311d66fa1f659f4cb61 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xaf948ca24669f5ca9f5b6f90d9f2cef12f4a0d20 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x7d4324293304797cb662c6ea1b904b6af2b485f5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x80e4f4f8bb89dab206c6bb4bddbf2ad72500394d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xdfcfdf5dd0569d591e0bce28b5da3b13de09e3cb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x73ccdeaa8957422c0a64e83f50c8814c7b33fe99 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xe3f5da07bcbfeb310ca65a6f98656dd41c3d3b4a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x329eeb1a58bdb3b804d1f94623c7a29a67a9b6b7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x0d76866f78fcbca2730e60c5997d59d6ba585613 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xd279f8bcc5f037f08cad776a0186acde0417c339 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x1dfab2147401be78ea05f05a0379f86ec87a81cc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xf2b8c40f98dae03f261d41f312bd204f68430acc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xa8c90356d7c7dc508eef63670927bb15a0dc0298 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x48466012f56a07f89656dab41a996986602fd1aa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x073b315457c5f4f5e658f6c06998a60abb5a7b90 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xc19bc89ac024426f5a23c5bb8bc91d8017c90684 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x4e6c10e2b505a1e8324aa64d3a92de764cf86783 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x953764548d1ca834e2b73fcd0d26a495336c99c8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4361aaffc616809a8536ea3d5afff3d1b87921a4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc275a7390966e4bcbf331b837cd7316c4a3efa83 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x1e1dfff79d95725aaafd6b47af4fbc28d859ce28 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x7de4c593fe83417ca6ef98d7cf59c99d304f41c9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xd38d1ab8a150e6ee0ae70c86a8e9fb0c83255b76 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x06d7874037e622d6ef42294cf32eb259806cb1c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x37fd96e1d24f69f20172ab97040f806284a31ae5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa4bc5aa6229e6f2baa4b8851b19342a1d1217c08 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x1d6ae37db0e36305019fb3d4bad2750b8784adf9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x5c90b076af8cb73ef064efc09eae7936132bebcf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x9a601b332698e64aa90fd468ce858d504e43e7df - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xb431c70f800100d87554ac1142c4a94c5fe4c0c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x1bc877326b683d8aeaca8dbbc604b649e5ad78e6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xedc625b74537ee3a10874f53d170e9c17a906b9c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x1b01fba73ff847e3d96162a8bcd5426f6cde56a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x5c75bfb6194d7d763d33ea292cbc50cda806451b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xd3249cfbb4c00dd81f377ef5113848c5cc848780 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x83c6bdb0355c6b69277a388416e4dca992a81d6f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xc566b786309bf2fe34dd48cea1267b13cead02bb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x4905220ca9d1001daa7be72e877243f4996002e0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x2fa9d6085c91151200e61a3e627d35001772c0d1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa1d79325ec44d5d5a69119010823da0ec746e615 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x57a63adebf02680c996a89413c324901dc0df801 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xe5028e8e8fb3488c2003c09fffc00876bc974b1a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xdfea50f83fd27967741f2220110449d8663a1b4f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x841820459769cd629b10a36fd12e603938cc2679 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x38fd16cebb0ec8bbc3041a9c40b4394d2743e77a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x6200b24e69eb9a12c06d09f21b0335a9b0eeb227 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xbc9df7f489b3d5d38da7c5a6f7d751bdaa88f254 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xd19c0dbbc5ba2ec4faa0e3fff892f0e95f23d9e0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x76a67a7fb64253fb4b0d80e1adbd71bd5865d68a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xff3d4af6aed14f62c202d55871f75c37951409c3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xc799b2440fd3b8618b87dfbf6b0dabf218e92274 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x1ae3579d37ede91662003a9e9eed3997f3339eff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x59ca2b1d97c98d585402531a7056321a9935e052 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x8d58a3348f302f2daad2bab66a83849d900effd9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x5b16de420b1d093b962c0bc03dd91b6d423f8c4a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xbd50f13489f8901e692862f440a5062d5f1aa062 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x1db0bca1d1a09e5a86213d349fa4fe33f8fe7fe2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x20a613705ed7ee62821ae0879bfc47a2450eb0dd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x52393e963583683a75cff607792410bd48aa02d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xfa20fa20b90c4c2411532c565cad7c14f9bc4a56 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x4d661231d973ff9c7c1b0e34a28b94bb70cb3894 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x1c276bd1a3bc05b034d50a7369b0bd5b39223a65 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x338e7862fcae6c3dec1c49606c0fe297422fce39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xed79818e8168083883d5279c181eb76054d16c87 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xff878f095ea20f29d3b0967052c96526fc6ee14f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xcd4255ceae51803a9333aa1a559991e17b024efc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xd68e61880190ebf2bda21a66d3064625866ddabd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xecbe401654382b37ba3b5fea8950874b47e83a56 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x1a4abfe77b9aec6259757805bd0d3c46fca6d494 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x7a11472726c3cf31b9a4c6900118aacd2a3e584a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xfdfc89d953e044f84faa2ed4953190a066328ee0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xff9722cb0712261a7f02a451dd178de10234ad0c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x45e844b4d3b81aba43697ac73c55204bd7b727e7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xc0808a4d70b0c1d6811c3526ca358570516214fd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x075b6f68b05fe21205f8827323a6f9b747b09e93 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x8ce4c6020fccf7428d0b6ec2d4410c0442626630 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xa2e7d6051bed36e1552ba982dab7e6743785598e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe6d7ebb9f1a9519dc06d557e03c522d53520e76a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x529d2863a1521d0b57db028168fde2e97120017c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x8d421b0d641193d67dd1aa024dab17fcde0bfc89 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x81c7294b66955824bc04acb642ae8dc58e6ce507 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xafecdd2fc04f0939d7b6835529677608470c063d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x1219b06380157f0ea0468f4f714d66e7f89d6956 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x8a82f2333101195b926e2c1dd56a116bb57d41c9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x40857abd8b284205a81fe6e0dfcebe261f47d854 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xe32915f74d76b6fe4945cb4c4c77474e2fdb6d63 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe8a1f39c16eea2844e98f951d711bb4bb31557ad - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xfe530931da161232ec76a7c3bea7d36cf3811a0d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc8da14d7467814a91384796db3ca2c273b30b361 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x0b1c2dcbbfa744ebd3fc17ff1a96a1e1eb4b2d69 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xf150d29d92e7460a1531cbc9d1abeab33d6998e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x7b39b6693f4ca739b01ca1c42a343c8159d96e23 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4c1d39e6b736a6a99105ee2a9e7c44bfc56af860 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4f60db16e8235eae877305c1e9ef2f648be2971c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x15689276dc6e7d2702f7e1900c42f885284ffc46 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xcd695596b54099613b84862bc60907651c5917be - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xcbfbec4704a6e34a9c562796e0606750bcd73675 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x8bdacdf255a57b66d0adeb271f4f76403ff4dffa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xb1baaf9b23dafb25775111a689c23f4016fd0a73 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x042c2083fb30d1324e102fffe527d1dc689d3c60 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x0b599ebf4e05af48b56d38e2dde520570c366460 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe51a3d36ecad2d2fbeafb6295fe0beb4f8f8f30d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x23d17764f41aea93fdbb5beffa83571f0bf3f8b2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa236278bec0e0677a48527340cfb567b4e6e9adc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x387a86d863420ffa2ef88b2524e54513a0ded845 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4b54900d3801b7a27657a0e63ce7a819365e0940 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xc2b9d0b3db9afe1567d4952ec3aede504b7357cf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x68fd2f81ac30ef3186dd618947f8be49edb27886 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xf9f588394ec5c3b05511368ce016de5fd3812446 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x827f0a2a4376bc26729f398b865f424dc8456841 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xd8cc6bfdee087148c220e9141a075d18418abbac - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x944b4364cd6faddfe8f83865aabdbf57d0d9358c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xdb18729070d3abdc72f9cd57d3b949540cc4486a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xf55791afbb35ad42984f18d6fe3e1ff73d81900c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x61ef8708fc240dc7f9f2c0d81c3124df2fd8829f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x87dec9a2589d9e6511df84c193561b3a16cf6238 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x2ac5baa668a8a58fd0e302b9896717484fd217b0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x6bab3afa6d0c42d539bcbc33ffb68c0406913413 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x14e577e42d45fd2200a9b0e31d87fe826467111a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x4495f525c4ecacf9713a51ec3e8d1e81d7dff870 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc5a5caebf3bf6220a3efa222710ab488943a73f8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x40b3737b8984d14a2e8f96d8c680b2d475719fdf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xe92c7cc875245a86faf088febe4614e1e318bef5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xdb6e3b03a3255e5ddfc99b98f18e6e8557a2ed96 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x9331f571f79d1e186a095c93756b5680a43932ac - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xe1acb466421ed24dd8bd381d1205bad0ad43ca9c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x2876ce407e520ba49177d83ff4e2c7338b6eeae4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xf12533a96712133d9bb97c24de5bcf52f48851bd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x28dfa7adabff80fdf4ffd7db0c0796fb86d26700 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x1b4a3f6ad0b7254e373f47a3e442eea60af693fc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x929fcf81102c5577243ee614c2c455acd6681f1a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x3202c46666e774b44ba463eafaa6da9a968a058f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa6a2d598365cd758ba0a72cd95b7f8805248a5d5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x052e77018bfb98dc6373c37d757bb1d3fad09ec5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xeff7f8fe083d7a446717b992bf84391253e54789 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xf9bb9137256193af73d2e8b3e377727756fd98be - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x7840fafdea1292068c1167f5da035a54bd31fae5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xed85676d391be656e6efa22ea4f3c663ffdd1683 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xe6b4903642b4a1637d7b411d009af5c91617860c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x6a61d4c9c359d2ce0203378983beb4f69f85106c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x97e4442bca2c069f9060f3b8eef52eb25c98c245 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xd40be16e9c2bddd7f36dd31c1ae39ca6cb2b20ce - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x40f4928332584198d5c68f3f39631245dda5c200 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xeb2a20f397c37f9f36799dab5dbe762da58c5194 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x53ead11073fc0651dce70572666f0ed0752abfea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa0ca5bebc42cdbf3623b1c09206ae4e3975b0fc7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x18aa3faeedb077aa604d748587093adcc9c5172b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xb655dc66ecead581d1f1a5759c2c37c2dbef2275 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x2e8b5cf35680f8b7df0957d05c6a0a4ae1d00cde - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x87c0676255be413399c9a205d9cbeb2a04814cca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xc09b0b0bde3b1f97ed3d3b5f5b0a74a74ee99768 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x9950c1f3754fb8a3ebbaf24b8573cafc7474c00f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x9fca4c864a30c03c21cc8743ee0c73312deda0ec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x9b03dd0d04c2953a6a74471c53f24f15f592df1e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x260e34c78b27ece3fc6de8cd170e3ffb49fac35f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x3dc10d7bfb94eeb009203e84a653e5764f71771d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0e5828c7eb7c7c9066201718f7ff044cf9fa10d9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xb0828467656ef9a9804e0d57da3fbd79374877f4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x075138693e0d65fa038753e3f3f97aad0989dd43 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xcd83055557536eff25fd0eafbc56e74a1b4260b3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x91308bc9ce8ca2db82aa30c65619856cc939d907 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x1442097733acf0a2b5c4ab422f1c0186e95d52ba - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x393e58375ca7bcaa89ed90e661ee7cc46466eccf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x91020dd18c800eb5fee593ad58902b0ebdcfbfd2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xa4f1768e3e1cd62c6faf4deab1ccef804a50c34e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x4efc6d91b5170b670a1bd5cfb8d4ae50283400eb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x993defde3e6ef50610eb6d994823dc82565ad3ba - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xab04a352d4ec8d0f1812a4e5ebe7807fa67acd48 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x49768b215014fac2c66680b03045fe32936b21e6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x5ae13baaef0620fdae1d355495dc51a17adb4082 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xdea629c5587037d0925ff85f1961d95db62bedd6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xba51d338a319f5e1b5da46065946576149874acf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xe47727f8c9256ab31dd97d431dfe9a5d9c098238 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xafe235b62d5d7fe6335428d52df1a6204de002b8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x76c54e356ccf357882e5632127983d6c975d7573 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xd491076c7316bc28fd4d35e3da9ab5286d079250 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x7d98804119551f915a75ce278526ac7ee5077087 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xcc630802c847766bf386fb7f4403ee5990f13e0a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x9d66f536b5d0d4a6086ffbef06a12c5caa9a1460 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xf5ffdca301d3b2a0f4b3de313e4a176515d9bdbf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x6b86794e11cfb1d454d9b38ac5ab5ee2d1f87434 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x89692e5e664c923b1dbbba13c57e07a0bacc5207 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0ab8855c73d567f0ec633cddec43580c5f7e2555 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xe04b2344211942751334e848f717a27a10eb8c45 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x75a0eae18bac14a3e9bebb4e2e5a12a926f2d230 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x64850db70da55c031c9b6b8518502988b5734633 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xaacb6baf9cf61be287b8744a0e0c1027709dc26f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xd828b499b3ed234af94c4d5521c1a82a787da86e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x1846464de29a2e0d7cfbd3f350d7cb4675236d48 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x919b20ac45304aeb09c9df5c604b3cd9d99a51ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x9144a6e8ad6f56db96dac444eb173831660ba3e5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xfb559d225343a61884d46eee91c1a805759f758b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x30db6dfdb8817765797bd62316e41f5f4e431e93 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x7deef378b6befa291e2e255294e532b2c1bca419 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x8bfb0fb037b30562fdb7be3f71440575664ab74e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x9338f9d099be4011991f8ca784d67acdf901f376 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2e066d83ad074b1a43cd14af5e08f2cf8a275021 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xef947aa8af8160cf78455292eaf3deb6b39e4bef - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc74f05c1e7b86fa42ab07ab4a1361286b9a90087 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x31fa55e03bad93c7f8affdd2ec616ebfde246001 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x263f7b865de80355f91c00dfb975a821effbea24 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xbc5592c48bf9d4354de4953f57de4f6295dd51b0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x0893e340ee2b0263ddad2f3b8bd23dba11859aea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xff8dd24ffd38eca6bbe58c7aca49abc2d9abb574 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xeab00687c6558cd648ec288f58de4b0a6de026ba - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4ef938b633d704f29e593a8b51148d43429d0bc4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x85144212383a34479f3b0abe6f6f9ee69240fb55 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x2837809fd68e4a4104af76bbec5b622b6146b2cb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xb4e27c8e10856daa165a852f44462d1ca945e25c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x68ebadf62ee5acce5f8d64211d24b4710eeb2029 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x1b19825a9e32b1039080acb1e1f9271314938b96 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x718a038c465efd88962fafe1008d233bf52bef44 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x9913a93c082fdc69f9e7d146b0e4ce9070d5a104 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xb4cb800910b228ed3d0834cf79d697127bbb00e5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/base/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4610464356ba6bba15eec558619d84b72fea260f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x65d5b99ba46b29005856ddb7d5c6675aab77b204 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x5066103530d8de7e582ff2f623c59f4b2eca8bf6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xf7932a224761fb8df2db546dd0e587e60439b4b4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xb1c5374164f17fc74f7401fb4ea88c2604ba75c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x57332c214e647063bb4c5a73e5a8b7bba79be1e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0x8917ba2a352c6d3e1acd5ea0a0bf7f203046149e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/unichain/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0x7145084e49429057f28d4c5c955cf277a027ae93 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/avalanche/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/blast/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/soneium/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/worldchain/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zksync/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/zora/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa3ccaf08a54cf31649f91ae1570a0720c8d4eb1e - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xd13040d4fe917ee704158cfcb3338dcd2838b245 - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x75c5fbf77c1cd517544487aca4cc41e1ad95aced - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x8c5a402ede3a33998604c8ba5fe6510896cb3821 - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z + 0.8 + + + https://app.uniswap.org/explore/pools/ethereum/0x6546055f46e866a4b9a4a13e81273e3152bae5da + 2025-10-31T19:27:21.343Z + 0.8 + + + https://app.uniswap.org/explore/pools/base/0xfc01837343cfc2a9ddca9e8a0a19825f6b2f0460 + 2025-10-31T19:27:21.343Z + 0.8 + + + https://app.uniswap.org/explore/pools/bnb/0xfaad4e108e73e36852944886fe8428cebab3cec8 + 2025-10-31T19:27:21.343Z + 0.8 + + + https://app.uniswap.org/explore/pools/bnb/0x81965714e2a1ec25fb8bcb3de60a11fe6bca929a + 2025-10-31T19:27:21.343Z + 0.8 + + + https://app.uniswap.org/explore/pools/bnb/0x17de8952353275dfe989a981e27344a7df5d7dda + 2025-10-31T19:27:21.343Z + 0.8 + + + https://app.uniswap.org/explore/pools/avalanche/0x41a26e0f91b7d61bb3561e858c80b4e1baf969af + 2025-10-31T19:27:21.343Z 0.8 \ No newline at end of file diff --git a/apps/web/public/tokens-sitemap.xml b/apps/web/public/tokens-sitemap.xml index cc16efb4f28..9a9dc08f77c 100644 --- a/apps/web/public/tokens-sitemap.xml +++ b/apps/web/public/tokens-sitemap.xml @@ -2,11207 +2,11267 @@ https://app.uniswap.org/explore/tokens/ethereum/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xdac17f958d2ee523a2206206994597c13d831ec7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2260fac5e5542a773aa44fbcfedf7c193bc2c599 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6982508145454ce325ddbe47a25d4ec3d2311933 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6b175474e89094c44da98b954eedeac495271d0f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6123b0049f904d730db3c36a31167d9d4121fa6b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcf0c122c6b73ff809c693db761e7baebe62b6a2e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xfaba6f8e4a5e8ab82f62fe7c39859fa577269be3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x58cb30368ceb2d194740b144eab4c2da8a917dcb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4c9edd5852cd905f086c759e8383e09bff1e68b3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xaaee1a9723aadb7afa2810263653a34ba2c21c7a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x514910771af9ca656af840dff83e8264ecf986ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5b7533812759b45c2b44c19e320ba2cd2681b542 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xae78736cd615f374d3085123a210448e74fc6393 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb9f599ce614feb2e1bbe58f180f370d05b39344e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd5f7838f5c461feff7fe49ea5ebaf7728bb0adfa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd31a59c85ae9d8edefec411d448f90841571b89c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6a7eff1e2c355ad6eb91bebb5ded49257f3fed98 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x576e2bed8f7b46d34016198911cdf9886f78bea7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1258d60b224c0c5cd888d37bbf31aa5fcfb7e870 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x62d0a8458ed7719fdaf978fe5929c6d342b0bfce - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x77e06c9eccf2e797fd462a92b6d7642ef85b0a44 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x24fcfc492c1393274b6bcd568ac9e225bec93584 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x27702a26126e0b3702af63ee09ac4d1a084ef628 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd46ba6d942050d489dbd938a2c909a5d5039a161 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbe9895146f7af43049ca1c1ae358b0541ea49704 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x72f713d11480dcf08b37e1898670e736688d218d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0001a500a6b18995b03f44bb040a5ffc28e45cb0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9e9fbde7c7a83c43913bddc8779158f1368f0413 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5f98805a4e8be255a32880fdec7f6728c6568ba0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2b591e99afe9f32eaa6214f7b7629768c40eeb39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1ae7e1d0ce06364ced9ad58225a1705b3e5db92b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x046eee2cc3188071c02bfc1745a6b17c656e3f3d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x84018071282d4b2996272659d9c01cb08dd7327f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x12970e6868f88f6557b76120662c1b3e50a646bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xaea46a60368a7bd060eec7df8cba43b7ef41ad85 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6de037ef9ad2725eb40118bb1702ebb27e4aeb24 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc01154b4ccb518232d6bbfc9b9e6c5068b766f82 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5a98fcbea516cf06857215779fd812ca3bef1b32 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x102c776ddb30c754ded4fdcc77a19230a60d4e4f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x72e4f9f808c49a2a61de9c5896298920dc4eeea9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x467719ad09025fcc6cf6f8311755809d45a5e5f3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf19308f923582a6f7c465e5ce7a9dc1bec6665b1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x710287d1d39dcf62094a83ebb3e736e79400068a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf951e335afb289353dc249e82926178eac7ded78 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf017d3690346eb8234b85f74cee5e15821fee1f4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8c282c35b5e1088bb208991c151182a782637699 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xeaa63125dd63f10874f99cdbbb18410e7fc79dd3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xde342a3e269056fc3305f9e315f4c40d917ba521 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2dff88a56767223a5529ea5960da7a3f5f766406 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x626e8036deb333b408be468f951bdb42433cbf18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xdd66781d0e9a08d4fbb5ec7bac80b691be27f21d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb23d80f5fefcddaa212212f028021b41ded428cf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbaac2b4491727d78d2b78815144570b9f2fe8899 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf8ebf4849f1fa4faf0dff2106a173d3a6cb2eb3a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb90b2a35c65dbc466b04240097ca756ad2005295 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1614f18fc94f47967a3fbe5ffcd46d4e7da3d787 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf1df7305e4bab3885cab5b1e4dfc338452a67891 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x91fbb2503ac69702061f1ac6885759fc853e6eae - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa9e8acf069c58aec8825542845fd754e41a9489a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2c95d751da37a5c1d9c5a7fd465c1d50f3d96160 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe453c3409f8ad2b1fe1ed08e189634d359705a5b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x89d584a1edb3a70b3b07963f9a3ea5399e38b136 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4507cef57c46789ef8d1a19ea45f4216bae2b528 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd1d2eb1b1e90b638588728b4130137d262c87cae - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe92344b4edf545f3209094b192e46600a19e7c2d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8a0a9b663693a22235b896f70a229c4a22597623 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1bbe973bef3a977fc51cbed703e8ffdefe001fed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa41d2f8ee4f47d3b860a149765a7df8c3287b7f0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x761d38e5ddf6ccf6cf7c55759d5210750b5d60f3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc18360217d8f7ab5e7c516566761ea12ce7f9d72 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe28b3b32b6c345a34ff64674606124dd5aceca30 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x168e209d7b2f58f1f24b8ae7b7d35e662bbf11cc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb131f4a55907b10d1f0a50d8ab8fa09ec342cd74 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3472a5a71965499acd81997a54bba8d852c6e53d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7dd9c5cba05e151c895fde1cf355c9a1d5da6429 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x19efa7d0fc88ffe461d1091f8cbe56dc2708a84f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x14fee680690900ba0cccfc76ad70fd1b95d10e16 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3c3a81e81dc49a522a592e7622a7e711c06bf354 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa1290d69c65a6fe4df752f95823fae25cb99e5a7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x92f419fb7a750aed295b0ddf536276bf5a40124f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2c06ba9e7f0daccbc1f6a33ea67e85bb68fbee3a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3d658390460295fb963f54dc0899cfb1c30776df - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8e870d67f660d95d5be530380d0ec0bd388289e1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x853d955acef822db058eb8505911ed77f175b99e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1294f4183763743c7c9519bec51773fb3acd78fd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4e15361fd6b4bb609fa63c81a2be19d873717870 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x695d38eb4e57e0f137e36df7c1f0f2635981246b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x40a7df3df8b56147b781353d379cb960120211d7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xaaef88cea01475125522e117bfe45cf32044e238 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x163f8c2467924be0ae7b5347228cabf260318753 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x30672ae2680c319ec1028b69670a4a786baa0f35 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc944e90c64b2c07662a292be6244bdf05cda44a7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x15e6e0d4ebeac120f9a97e71faa6a0235b85ed12 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7d225c4cc612e61d26523b099b0718d03152edef - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x82af49447d8a07e3bd95bd0d56f35241523fbab1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xaf88d065e77c8cc2239327c5edb3a432268e5831 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xff970a61a04b1ca14834a43f5de4533ebddb5cc8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x912ce59144191c1204e64559fe8253a0e49e6548 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x5979d7b546e38e414f7e9822514be443a4800529 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x35751007a407ca6feffe80b3cb397736d2cf4dbe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xda10009cbd5d07dd0cecc66161fc93d7c9000da1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xeb466342c4d449bc9f53a865d5cb90586f405215 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xfc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x0c880f6761f1af8d9aa9c466984b80dab9a8c9e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xf97f4df75117a78c1a5a0dbb814af92458539fb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x9623063377ad1b27544c965ccd7342f7ea7e88c7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x539bde0d7dbd336b79148aa742883198bbf60342 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3082cc23568ea640225c2467653db90e9250aaa0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x18c11fd286c5ec11c3b683caa813b77f5163a122 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x289ba1701c2f088cf0faf8b3705246331cb8a839 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x4cb9a7ae498cedcbb5eae9f25736ae7d428c9d66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x00cbcf7b3d37844e44b888bc747bdd75fcf4e555 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xfa7f8980b0f1e64a2062791cc3b0871572f1f7f0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd79bb960dc8a206806c3a428b31bca49934d18d7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3096e7bfd0878cc65be71f8899bc4cfb57187ba3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x13ad51ed4f1b7e9dc168d8a00cb3f4ddd85efa60 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x4e352cf164e64adcbad318c3a1e222e9eba4ce42 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x11cdb42b0eb46d95f990bedd4695a6e3fa034978 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xba5ddd1f9d7f570dc94a51479a000e3bce967196 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xc8ccbd97b96834b976c995a67bf46e5754e2c48e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd07d35368e04a839dee335e213302b21ef14bb4a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x323665443cef804a3b5206103304bd4872ea4253 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x83d6c8c06ac276465e4c92e7ac8c23740f435140 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x87aaffdf26c6885f6010219208d5b161ec7609c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x1b8d516e2146d7a32aca0fcbf9482db85fd42c3a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xafccb724e3aec1657fc9514e3e53a0e71e80622d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x4425742f1ec8d98779690b5a3a6276db85ddc01a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xec70dcb4a1efa46b8f2d97c310c9c4790ba5ffa8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3419875b4d3bca7f3fdda2db7a476a79fd31b4fe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3b60ff35d3f7f62d636b067dd0dc0dfdad670e4e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x58b9cb810a68a7f3e1e4f8cb45d1b9b3c79705e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xfa5ed56a203466cbbc2430a43c66b9d8723528e7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x95146881b86b3ee99e63705ec87afe29fcc044d9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x088cd8f5ef3652623c22d48b1605dcfe860cd704 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xbfd5206962267c7b4b4a8b3d76ac2e1b2a5c4d5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x6daf586b7370b14163171544fca24abcc0862ac5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x9d2f299715d94d8a7e6f5eaa8e654e8c74a988a7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x580e933d90091b9ce380740e3a4a39c67eb85b4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x655a6beebf2361a19549a99486ff65f709bd2646 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x9e64d3b9e8ec387a9a58ced80b71ed815f8d82b5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x2297aebd383787a160dd0d9f71508148769342e3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x6694340fc020c5e6b96567843da2df01b2ce1eb6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x772598e9e62155d7fdfe65fdf01eb5a53a8465be - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x431402e8b9de9aa016c743880e04e517074d8cec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd74f5255d557944cf7dd0e45ff521520002d5748 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x6fd58f5a2f3468e35feb098b5f59f04157002407 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x561877b6b3dd7651313794e5f2894b2f18be0766 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xf9ca0ec182a94f6231df9b14bd147ef7fb9fa17c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd77b108d4f6cefaa0cae9506a934e825becca46e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd56734d7f9979dd94fae3d67c7e928234e71cd4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xf1264873436a0771e440e2b28072fafcc5eebd01 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x5575552988a3a80504bbaeb1311674fcfd40ad4b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x0341c0c0ec423328621788d4854119b97f44e391 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x764bfc309090e7f93edce53e5befa374cdcb7b8e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xaaa6c1e32c55a7bfa8066a6fae9b42650f262418 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x9e20461bc2c4c980f62f1b279d71734207a6a356 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x7fb7ede54259cb3d4e1eaf230c7e2b1ffc951e9a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3a18dcc9745edcd1ef33ecb93b0b6eba5671e7ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x000000000026839b3f4181f2cf69336af6153b99 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x8b0e6f19ee57089f7649a455d89d7bc6314d04e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x31c91d8fb96bff40955dd2dbc909b36e8b104dde - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x25d887ce7a35172c62febfd67a1856f20faebb00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd4d42f0b6def4ce0383636770ef773390d85c61a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xf8388c2b6edf00e2e27eef5200b1befb24ce141d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x619c82392cb6e41778b7d088860fea8447941f4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x94025780a1ab58868d9b2dbbb775f44b32e8e6e5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xad4b9c1fbf4923061814dd9d5732eb703faa53d4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd7a892f28dedc74e6b7b33f93be08abfc394a360 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3269a3c00ab86c753856fd135d97b87facb0d848 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x4568ca00299819998501914690d6010ae48a59ba - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x21e60ee73f17ac0a411ae5d690f908c3ed66fe12 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd3188e0df68559c0b63361f6160c57ad88b239d8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x2b41806cbf1ffb3d9e31a9ece6b738bf9d6f645f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xf19547f9ed24aa66b03c3a552d181ae334fbb8db - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x35e6a59f786d9266c7961ea28c7b768b33959cbb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x59a729658e9245b0cf1f8cb9fb37945d2b06ea27 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xb56c29413af8778977093b9b4947efeea7136c36 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x43ab8f7d2a8dd4102ccea6b438f6d747b1b9f034 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x1d987200df3b744cfa9c14f713f5334cb4bc4d5d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3404149e9ee6f17fb41db1ce593ee48fbdcd9506 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x080f6aed32fc474dd5717105dba5ea57268f46eb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xb5a628803ee72d82098d4bcaf29a42e63531b441 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x1622bf67e6e5747b81866fe0b85178a93c7f86e3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x7dd747d63b094971e6638313a6a2685e80c7fb2e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xa2f9ecf83a48b86265ff5fd36cdbaaa1f349916c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x17a8541b82bf67e10b0874284b4ae66858cb1fd5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xbcd4d5ac29e06e4973a1ddcd782cd035d04bc0b7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x42069d11a2cc72388a2e06210921e839cfbd3280 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xbbea044f9e7c0520195e49ad1e561572e7e1b948 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xe85b662fe97e8562f4099d8a1d5a92d4b453bf30 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3d9907f9a368ad0a51be60f7da3b97cf940982d8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x4e51ac49bc5e2d87e0ef713e9e5ab2d71ef4f336 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x4200000000000000000000000000000000000006 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x7f5c764cbc14f9669b88837ca1490cca17c31607 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x4200000000000000000000000000000000000042 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x0b2c639c533813f4aa9d7837caf62653d097ff85 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x1f32b1c2345538c0c6f582fcb022739c4a194ebb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x68f180fcce6836688e9084f035309e29bf0a2095 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x94b008aa00579c1307b0ef2c499ad98a8ce58e58 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xda10009cbd5d07dd0cecc66161fc93d7c9000da1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xdc6ff44d5d932cbd77b52e5612ba0529dc6226f1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x8700daec35af8ff88c16bdf0418774cb3d7599b4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x920cf626a271321c151d027030d5d08af699456b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x6c84a8f1c29108f47a79964b5fe888d4f4d0de40 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x9e1028f5f1d5ede59748ffcee5532509976840e0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xeb466342c4d449bc9f53a865d5cb90586f405215 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x350a791bfc2c21f9ed5d10980dad2e2638ffa7f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x17aabf6838a6303fc6e9c5a227dc1eb6d95c829a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xf467c7d5a4a9c4687ffc7986ac6ad5a4c81e1404 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x76fb31fb4af56892a25e32cfc43de717950c9278 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xc5b001dc33727f8f26880b184090d3e252470d45 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x9560e827af36c94d2ac33a39bce1fe78631088db - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x9bcef72be871e61ed4fbbc7630889bee758eb81d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x50c5725949a6f0c72e6c4a641f24049a917db0cb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xf98dcd95217e15e05d8638da4c91125e59590b07 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x4b03afc91295ed778320c2824bad5eb5a1d852dd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xc40f949f8a4e094d1b49a23ea9241d289b7b2819 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x323665443cef804a3b5206103304bd4872ea4253 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x50bce64397c75488465253c0a034b8097fea6578 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x296f55f8fb28e498b858d0bcda06d955b2cb3f97 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x2598c30330d5771ae9f983979209486ae26de875 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x0994206dfe8de6ec6920ff4d779b0d950605fb53 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xc3248a1bd9d72fa3da6e6ba701e58cbf818354eb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x6fd9d7ad17242c41f7131d257212c54a0e816691 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x14778860e937f509e651192a90589de711fb88a9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xdfa46478f9e5ea86d57387849598dbfb2e964b02 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x9b88d293b7a791e40d36a39765ffd5a1b9b5c349 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x3eb398fec5f7327c6b15099a9681d9568ded2e82 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x217d47011b23bb961eb6d93ca9945b7501a5bb11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xbfd5206962267c7b4b4a8b3d76ac2e1b2a5c4d5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x1cef2d62af4cd26673c7416957cc4ec619a696a7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x9fd22a17b4a96da3f83797d122172c450381fb88 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xaddb6a0412de1ba0f936dcaeb8aaa24578dcf3b2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x2791bca1f2de4661ed88a30c99a7a9449aa84174 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x7ceb23fd6bc0add59e62ac25578270cff1b9f619 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x3c499c542cef5e3811e1192ce70d8cc03d5c3359 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x1bfd67037b42cf73acf2047067bd4f2c47d9bfd6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xc2132d05d31c914a87c6611c10748aeb04b58e8f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x53e0bca35ec356bd5dddfebbd1fc0fd03fabad39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x61299774020da444af134c82fa83e3810b309991 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xd6df932a45c0f255f85145f286ea0b292b21c90b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x2ad2934d5bfb7912304754479dd1f096d5c807da - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xc3c7d422809852031b44ab29eec9f1eff2a58756 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x8f3cf7ad23cd3cadbd9735aff958023239c6a063 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x750e4c4984a9e0f12978ea6742bc1c5d248f40ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x111111517e4929d3dcbdfa7cce55d30d4b6bc4d6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xd0258a3fd00f38aa8090dfee343f10a9d4d30d3f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x430ef9263e76dae63c84292c3409d61c598e9682 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xb33eaad8d922b1083446dc23f610c2567fb5180f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xdc3326e71d45186f113a2f448984ca0e8d201995 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x311434160d7537be358930def317afb606c0d737 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x0b3f868e0be5597d5db7feb59e1cadbb0fdda50a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe3f2b1b2229c0333ad17d03f179b87500e7c5e01 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xac0f66379a6d7801d7726d5a943356a172549adb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xf88332547c680f755481bf489d890426248bb275 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe5417af564e4bfda1c483642db72007871397896 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe261d618a959afffd53168cd07d12e37b26761db - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe0b52e49357fd4daf2c15e02058dce6bc0057db4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xbbba073c31bf03b8acf7c28ef0738decf3695683 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe238ecb42c424e877652ad82d8a939183a04c35f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x3b56a704c01d650147ade2b8cee594066b3f9421 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x5fe2b58c013d7601147dcdd68c143a77499f5531 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x172370d5cd63279efa6d502dab29171933a610af - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x53df32548214f51821cf1fe4368109ac5ddea1ff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xff76c0b48363a7c7307868a81548d340049b0023 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x6f8a06447ff6fcf75d803135a7de15ce88c1d4ec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x50b728d8d964fd00c2d0aad81718b71311fef68a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x03b54a6e9a984069379fae1a4fc4dbae93b3bccd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xd93f7e271cb87c23aaa73edc008a79646d1f9912 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x200c234721b5e549c3693ccc93cf191f90dc2af9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x11cd37bb86f65419713f30673a480ea33c826872 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x8a16d4bf8a0a716017e8d2262c4ac32927797a2f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x9a71012b13ca4d3d0cdc72a177df3ef03b0e76a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xa1c57f48f0deb89f569dfbe6e2b7f46d33606fd4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x190eb8a183d22a4bdf278c6791b152228857c033 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x2f6f07cdcf3588944bf4c42ac74ff24bf56e7590 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x235737dbb56e8517391473f7c964db31fa6ef280 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x0b220b82f3ea3b7f6d9a1d8ab58930c064a2b5bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x8bff1bd27e2789fe390acabc379c380a83b68e84 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xb58458c52b6511dc723d7d6f3be8c36d7383b4a8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x323665443cef804a3b5206103304bd4872ea4253 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x2760e46d9bb43dafcbecaad1f64b93207f9f0ed7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x18ec0a6e18e5bc3784fdd3a3634b31245ab704f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x431d5dff03120afa4bdf332c61a6e1766ef37bdb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x6f7c932e7684666c9fd1d44527765433e01ff61d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xeee3371b89fc43ea970e908536fcddd975135d8a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe5b49820e5a1063f6f4ddf851327b5e8b2301048 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xaa3717090cddc9b227e49d0d84a28ac0a996e6ff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x62a872d9977db171d9e213a5dc2b782e72ca0033 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x381caf412b45dac0f62fbeec89de306d3eabe384 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe0bceef36f3a6efdd5eebfacd591423f8549b9d5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x23d29d30e35c5e8d321e1dc9a8a61bfd846d4c5c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x282d8efce846a88b159800bd4130ad77443fa1a1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x74dd45dd579cad749f9381d6227e7e02277c944b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x714db550b574b3e927af3d93e26127d15721d4c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xfa68fb4628dff1028cfec22b4162fccd0d45efb6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe631dabef60c37a37d70d3b4f812871df663226f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xdb725f82818de83e99f1dac22a9b5b51d3d04dd4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x3c59798620e5fec0ae6df1a19c6454094572ab92 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x0d0b8488222f7f83b23e365320a4021b12ead608 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xa380c0b01ad15c8cf6b46890bddab5f0868e87f3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x8a953cfe442c5e8855cc6c61b1293fa648bae472 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x45c32fa6df82ead1e2ef74d17b76547eddfaff89 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x11cd72f7a4b699c67f225ca8abb20bc9f8db90c7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x0c9c7712c83b3c70e7c5e11100d33d9401bdf9dd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x77a6f2e9a9e44fd5d5c3f9be9e52831fc1c3c0a0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xbfc70507384047aa74c29cdc8c5cb88d0f7213ac - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xfcb54da3f4193435184f3f647467e12b50754575 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x9a6a40cdf21a0af417f1b815223fd92c85636c58 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe111178a87a3bff0c8d18decba5798827539ae99 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x82617aa52dddf5ed9bb7b370ed777b3182a30fd1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x2ab0e9e4ee70fff1fb9d67031e44f6410170d00e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xa486c6bc102f409180ccb8a94ba045d39f8fc7cb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xc4a206a306f0db88f98a3591419bc14832536862 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xf0059cc2b3e980065a906940fbce5f9db7ae40a7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x16eccfdbb4ee1a85a33f3a9b21175cd7ae753db4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x553d3d295e0f695b9228246232edf400ed3560b5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x14af1f2f02dccb1e43402339099a05a5e363b83c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x7bdf330f423ea880ff95fc41a280fd5ecfd3d09f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x8505b9d2254a7ae468c0e9dd10ccea3a837aef5c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe2aa7db6da1dae97c5f5c6914d285fbfcc32a128 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xb7b31a6bc18e48888545ce79e83e06003be70930 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x1631244689ec1fecbdd22fb5916e920dfc9b8d30 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xf6372cdb9c1d3674e83842e3800f2a62ac9f3c66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x692ac1e363ae34b6b489148152b12e2785a3d8d6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x0266f4f08d82372cf0fcbccc0ff74309089c74d1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x7fbc10850cae055b27039af31bd258430e714c62 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xa3fa99a148fa48d14ed51d610c367c61876997f1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x9dbfc1cbf7a1e711503a29b4b5f9130ebeccac96 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x236aa50979d5f3de3bd1eeb40e81137f22ab794b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xf86df9b91f002cfeb2aed0e6d05c4c4eaef7cf02 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4200000000000000000000000000000000000006 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6921b130d297cc43754afba22e5eac0fbf8db75b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x5babfc2f240bc5de90eb7e19d789412db1dec402 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x532f27101965dd16442e59d40670faf5ebb142e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x833589fcd6edb6e08f4c7c32d4f71b54bda02913 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4ed4e862860bed51a9570b96d89af5e1b0efefed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc1cba3fcea344f92d9239c08c0568f6f2f0ee452 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xac1bd2486aaf3b5c0fc3fd868558b082a531b2b4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0d97f261b1e88845184f678e2d1e7a98d9fd38de - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8129b94753f22ec4e62e2c4d099ffe6773969ebc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3f14920c99beb920afa163031c4e47a3e03b3e4a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x940181a94a35a4569e4529a3cdfb74e38fd98631 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3419875b4d3bca7f3fdda2db7a476a79fd31b4fe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xa067436db77ab18b1a315095e4b816791609897c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xafb89a09d82fbde58f18ac6437b3fc81724e4df6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x489fe42c267fe0366b16b0c39e7aeef977e841ef - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2ae3f1ec7f1f5012cfeab0185bfc7aa3cf0dec22 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xdc46c1e93b71ff9209a0f8076a9951569dc35855 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x91f45aa2bde7393e0af1cc674ffe75d746b93567 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x236aa50979d5f3de3bd1eeb40e81137f22ab794b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf6e932ca12afa26665dc4dde7e27be02a7c02e50 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x524d524b4c9366be706d3a90dcf70076ca037ae3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x5b5dee44552546ecea05edea01dcd7be7aa6144a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2598c30330d5771ae9f983979209486ae26de875 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfa980ced6895ac314e7de34ef1bfae90a5add21b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x469fda1fb46fcb4befc0d8b994b516bd28c87003 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4e496c0256fb9d4cc7ba2fdf931bc9cbb7731660 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x27d2decb4bfc9c76f0309b8e88dec3a601fe25a8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbfd5206962267c7b4b4a8b3d76ac2e1b2a5c4d5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9e1028f5f1d5ede59748ffcee5532509976840e0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3c3aa127e6ee3d2f2e432d0184dd36f2d2076b52 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xba5e6fa2f33f3955f0cef50c63dcc84861eab663 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x97c806e7665d3afd84a8fe1837921403d59f3dcc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8ee73c484a26e0a5df2ee2a4960b789967dd0415 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x00e57ec29ef2ba7df07ad10573011647b2366f6d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8f019931375454fe4ee353427eb94e2e0c9e0a8c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x93e6407554b2f02640ab806cd57bd83e848ec65d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x55d398326f99059ff775485246999027b3197955 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x2170ed0880ac9a755fd29b2688956bd959f933f8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xfdc66a08b0d0dc44c17bbd471b88f49f50cdd20f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x1d2f0da169ceb9fc7b3144628db156f3f6c60dbe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xe9e7cea3dedca5984780bafc599bd69add087d56 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xfa54ff1a158b5189ebba6ae130ced6bbd3aea76e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x570a5d26f7765ecb712c0924e4de545b89fd43df - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x47c454ca6be2f6def6f32b638c80f91c9c3c5949 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xad86d0e9764ba90ddd68747d64bffbd79879a238 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xf8a0bf9cf54bb92f17374d9e9a321e6a111a51bd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xd691d9a68c887bdf34da8c36f63487333acfd103 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x1294f4183763743c7c9519bec51773fb3acd78fd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xb04906e95ab5d797ada81508115611fee694c2b3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x111111111117dc0aa78b770fa6a738034120c302 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xcc42724c6683b7e57334c4e856f4c9965ed682bd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x90c97f71e18723b0cf0dfa30ee176ab653e89f40 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x2b72867c32cf673f7b02d208b26889fed353b1f8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x031b41e504677879370e9dbcf937283a8691fa7f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x1ce0c2827e2ef14d5c4f29a091d735a204794041 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xcf3bb6ac0f6d987a5727e2d15e39c2d6061d5bec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x8ff795a6f4d97e7887c79bea79aba5cc76444adf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x2dff88a56767223a5529ea5960da7a3f5f766406 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x4b0f1812e5df2a09796481ff14017e6005508003 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xbf5140a22578168fd562dccf235e5d43a02ce9b1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xca1c644704febf4ab81f85daca488d1623c28e63 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x51e72dd1f2628295cc2ef931cb64fdbdc3a0c599 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xbbca42c60b5290f2c48871a596492f93ff0ddc82 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x555296de6a86e72752e5c5dc091fe49713aa145c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x0808bf94d57c905f1236212654268ef82e1e594e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x8457ca5040ad67fdebbcc8edce889a335bc0fbfb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xcebef3df1f3c5bfd90fde603e71f31a53b11944d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x90ed8f1dc86388f14b64ba8fb4bbd23099f18240 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x9840652dc04fb9db2c43853633f0f62be6f00f98 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xba2ae424d960c26247dd6c32edc70b295c744c43 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x0782b6d8c4551b9760e74c0545a9bcd90bdc41e5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xbe2b6c5e31f292009f495ddbda88e28391c9815e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x8f0528ce5ef7b51152a59745befdd91d97091d2f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xffeecbf8d7267757c2dc3d13d730e97e15bfdf7f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x0eb3a705fc54725037cc9e008bdede697f62f335 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xf21768ccbc73ea5b6fd3c687208a7c2def2d966e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x0000028a2eb8346cd5c0267856ab7594b7a55308 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x76a797a59ba2c17726896976b7b3747bfd1d220f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xc79d1fd14f514cd713b5ca43d288a782ae53eab2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xad29abb318791d579433d831ed122afeaf29dcfe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x3203c9e46ca618c8c1ce5dc67e7e9d75f5da2377 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xdb021b1b247fe2f1fa57e0a87c748cc1e321f07f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x7083609fce4d1d8dc0c979aab8c869ea2c873402 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xc5f0f7b66764f6ec8c8dff7ba683102295e16409 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xe29142e14e52bdfbb8108076f66f49661f10ec10 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xb0d502e938ed5f4df2e681fe6e419ff29631d62b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x6730f7a6bbb7b9c8e60843948f7feb4b6a17b7f7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x1613957159e9b0ac6c80e824f7eea748a32a0ae2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x471ece3750da237f93b8e339c536989b8978a438 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x765de816845861e75a25fca122bb6898b8b1282a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x66803fb87abd4aac3cbb3fad7c3aa01f6f3fb207 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0xd8763cba276a3738e6de85b4b3bf5fded6d6ca73 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x37f750b7cc259a2f741af45294f6a16572cf5cad - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0xd71ffd0940c920786ec4dbb5a12306669b5b81ef - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0xe8537a3d056da446677b9e9d6c5db704eaab4787 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x4f604735c1cf31399c6e711d5962b2b3e0225ad3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x02de4766c272abc10bc88c220d214a26960a7e92 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0xceba9300f2b948710d2653dd7b07f33a8b32118c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0xc16b81af351ba9e64c1a069e3ab18c244a1e3049 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x728f30fa2f100742c7949d1961804fa8e0b1387d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x41ea5d41eeacc2d5c4072260945118a13bb7ebce - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf21661d0d1d76d3ecb8e1b9f1c923dbfffae4097 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xb0ecc6ac0073c063dcfc026ccdc9039cae2998e1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x00f932f0fe257456b32deda4758922e56a4f4b42 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xa4af354d466e8a68090dd9eb2cb7caf162f4c8c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xba50933c268f567bdc86e1ac131be072c6b0b71a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd29da236dd4aac627346e1bba06a619e8c22d7c5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1bfce574deff725a3f483c334b790e25c8fa9779 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9e18d5bab2fa94a6a95f509ecb38f8f68322abd3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcd5fe23c85820f7b72d0926fc9b05b43e359b7ee - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbf5495efe5db9ce00f80364c8b423567e58d2110 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x065b4e5dfd50ac12a81722fd0a0de81d78ddf7fb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x57e114b691db790c35207b2e685d4a43181e6061 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0b7f0e51cd1739d6c96982d55ad8fa634dd43a9c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc56c7a0eaa804f854b536a5f3d5f49d2ec4b12b8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x594daad7d77592a2b97b725a7ad59d7e188b5bfa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8355dbe8b0e275abad27eb843f3eaf3fc855e525 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2a961d752eaa791cbff05991e4613290aec0d9ac - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x38e68a37e401f7271568cecaac63c6b1e19130b4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1131d427ecd794714ed00733ac0f851e904c8398 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1495bc9e44af1f8bcb62278d2bec4540cf0c05ea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x808507121b80c02388fad14726482e061b8da827 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x44971abf0251958492fee97da3e5c5ada88b9185 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x320623b8e4ff03373931769a31fc52a4e78b5d70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6e5970dbd6fc7eb1f29c6d2edf2bc4c36124c0c1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd40c688da9df74e03566eaf0a7c754ed98fbb8cc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8afe4055ebc86bd2afb3940c0095c9aca511d852 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9ce84f6a69986a83d92c324df10bc8e64771030f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbe4d9c8c638b5f0864017d7f6a04b66c42953847 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x68bbed6a47194eff1cf514b50ea91895597fc91e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x69420e3a3aa9e17dea102bb3a9b3b73dcddb9528 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7420b4b9a0110cdc71fb720908340c03f9bc03ec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x03aa6298f1370642642415edc0db8b957783e8d6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd533a949740bb3306d119cc777fa900ba034cd52 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf14dd7b286ce197019cba54b189d2b883e70f761 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa35923162c49cf95e6bf26623385eb431ad920d3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8cefbeb2172a9382753de431a493e21ba9694004 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x120a3879da835a5af037bb2d1456bebd6b54d4ba - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x69457a1c9ec492419344da01daf0df0e0369d5d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf6ce4be313ead51511215f1874c898239a331e37 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x73d7c860998ca3c01ce8c808f5577d94d545d1b4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xeff49b0f56a97c7fd3b51f0ecd2ce999a7861420 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x236501327e701692a281934230af0b6be8df3353 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5026f006b85729a8b14553fae6af249ad16c9aab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x66761fa41377003622aee3c7675fc7b5c1c2fac5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9f9c8ec3534c3ce16f928381372bfbfbfb9f4d24 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd8c978de79e12728e38aa952a6cb4166f891790f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7122985656e38bdc0302db86685bb972b145bd3c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x582d872a1b094fc48f5de31d3b73f2d9be47def1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x504624040e0642921c2c266a9ac37cafbd8cda4e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc548e90589b166e1364de744e6d35d8748996fe8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4c11249814f11b9346808179cf06e71ac328c1b5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x423f4e6138e475d85cf7ea071ac92097ed631eea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8390a1da07e376ef7add4be859ba74fb83aa02d5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf94e7d0710709388bce3161c32b4eea56d3f91cc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xaa95f26e30001251fb905d264aa7b00ee9df6c18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x2416092f143378750bb29b79ed961ab195cceea5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x6c84a8f1c29108f47a79964b5fe888d4f4d0de40 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x71eeba415a523f5c952cc2f06361d5443545ad28 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x88a269df8fe7f53e590c561954c52fccc8ec0cfb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x429fed88f10285e61b12bdf00848315fbdfcc341 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xb299751b088336e165da313c33e3195b8c6663a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xf0a479c9c3378638ec603b8b6b0d75903902550b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xb59c8912c83157a955f9d715e556257f432c35d7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xba0dda8762c24da9487f5fa026a9b64b695a07ea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xc24a365a870821eb83fd216c9596edd89479d8d7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xa586b3b80d7e3e8d439e25fbc16bc5bcee3e2c85 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xef04804e1e474d3f9b73184d7ef5d786f3fce930 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x2e9a6df78e42a30712c10a9dc4b1c8656f8f2879 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x13a7dedb7169a17be92b0e3c7c2315b46f4772b3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x1dd6b5f9281c6b4f043c02a83a46c2772024636c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xc5102fe9359fd9a28f877a67e36b0f050d81a3cc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xf525e73bdeb4ac1b0e741af3ed8a8cbb43ab0756 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xe4177c1400a8eee1799835dcde2489c6f0d5d616 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xed5740209fcf6974d6f3a5f11e295b5e468ac27c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xe10d4a4255d2d35c9e23e2c4790e073046fbaf5c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x10398abc267496e49106b07dd6be13364d10dc71 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x2218a117083f5b482b0bb821d27056ba9c04b1d3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x395ae52bb17aef68c2888d941736a71dc6d4e125 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x9a601c5bb360811d96a23689066af316a30c3027 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xbac3368b5110f3a3dda8b5a0f7b66edb37c47afe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x1d3c629ca5c1d0ab3bdf74600e81b4145615df8e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe9c21de62c5c5d0ceacce2762bf655afdceb7ab3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x658cda444ac43b0a7da13d638700931319b64014 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x3d2bd0e15829aa5c362a4144fdf4a1112fa29b5c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x3fb83a9a2c4408909c058b0bfe5b4823f54fafe2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x00e5646f60ac6fb446f621d146b6e1886f002905 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x12a4cebf81f8671faf1ab0acea4e3429e42869e7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x9ff62d1fc52a907b6dcba8077c2ddca6e6a9d3e1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xc61f39418cd27820b5d4e9ba4a7197eefaeb8b05 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x15b7c0c907e4c6b9adaaaabc300c08991d6cea05 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x7f67639ffc8c93dd558d452b8920b28815638c44 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x276c9cbaa4bdf57d7109a41e67bd09699536fa3d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x041fdf3f472d2c8a7ecc458fc3b7f543e6c57ef7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3c281a39944a2319aa653d81cfd93ca10983d234 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x96419929d7949d6a801a6909c145c8eef6a40431 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfea9dcdc9e23a9068bf557ad5b186675c61d33ea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xdb6e0e5094a25a052ab6845a9f1e486b9a9b3dde - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xcde172dc5ffc46d228838446c57c1227e0b82049 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xff0c532fdb8cd566ae169c1cb157ff2bdc83e105 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9a26f5433671751c3276a065f57e5a02d2817973 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3636a7734b669ce352e97780df361ce1f809c58c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x50c5725949a6f0c72e6c4a641f24049a917db0cb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xe3086852a4b125803c815a158249ae468a3254ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbeb0fd48c2ba0f1aacad2814605f09e08a96b94e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbc45647ea894030a4e9801ec03479739fa2485f0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x768be13e1680b5ebe0024c42c896e3db59ec0149 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x928a6a9fc62b2c94baf2992a6fba4715f5bb0066 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbf4db8b7a679f89ef38125d5f84dd1446af2ea3b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xed899bfdb28c8ad65307fa40f4acab113ae2e14c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1b6a569dd61edce3c383f6d565e2f79ec3a12980 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x76734b57dfe834f102fb61e1ebf844adf8dd931e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4621b7a9c75199271f773ebd9a499dbd165c3191 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xaf07d812d1dcec20bf741075bc18660738d226dd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7f12d13b34f5f4f0a9449c16bcd42f0da47af200 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x55a6f6cb50db03259f6ab17979a4891313be2f45 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x968d6a288d7b024d5012c0b25d67a889e4e3ec19 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7a8a5012022bccbf3ea4b03cd2bb5583d915fb1a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xcde90558fc317c69580deeaf3efc509428df9080 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0028e1e60167b48a938b785aa5292917e7eaca8b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x76e7447bafa3f0acafc9692629b1d1bc937ca15d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x15ac90165f8b45a80534228bdcb124a011f62fee - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4045b33f339a3027af80013fb5451fdbb01a4492 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xddf98aad8180c3e368467782cd07ae2e3e8d36a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x698dc45e4f10966f6d1d98e3bfd7071d8144c233 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3c8665472ec5af30981b06b4e0143663ebedcc1e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x18a8bd1fe17a1bb9ffb39ecd83e9489cfd17a022 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xba0dda8762c24da9487f5fa026a9b64b695a07ea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x13741c5df9ab03e7aa9fb3bf1f714551dd5a5f8a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xebff2db643cf955247339c8c6bcd8406308ca437 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfadb26be94c1f959f900bf88cd396b3e803481d6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x52c2b317eb0bb61e650683d2f287f56c413e4cf6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x38d513ec43dda20f323f26c7bef74c5cf80b6477 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x33ad778e6c76237d843c52d7cafc972bb7cf8729 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x290814ad0fbd2b935f34d7b40306102313d4c63e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x5e432eecd01c12ee7071ee9219c2477a347da192 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbdf5bafee1291eec45ae3aadac89be8152d4e673 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xff62ddfa80e513114c3a0bf4d6ffff1c1d17aadf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8c81b4c816d66d36c4bf348bdec01dbcbc70e987 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6b82297c6f1f9c3b1f501450d2ee7c37667ab70d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x42069babe14fb1802c5cb0f50bb9d2ad6fef55e2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x72499bddb67f4ca150e1f522ca82c87bc9fb18c8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0578d8a44db98b23bf096a382e016e29a5ce0ffe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8fe815417913a93ea99049fc0718ee1647a2a07c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7d12aeb5d96d221071d176980d23c213d88d9998 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb166e8b140d35d9d8226e40c09f757bac5a4d87d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8853f0c059c27527d33d02378e5e4f6d5afb574a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf3c052f2baab885c610a748eb01dfbb643ba835b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xcd1cffa8ebc66f1a2cf7675b48ba955ffcb82d8e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xde7a416ac821c77478340eebaa21b68297025ef3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2da56acb9ea78330f947bd57c54119debda7af71 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8972ab69d499b5537a31576725f0af8f67203d38 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x88faea256f789f8dd50de54f9c807eef24f71b16 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x42069de48741db40aef864f8764432bbccbd0b69 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9a27c6759a6de0f26ac41264f0856617dec6bc3f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfaa4f3bcfc87d791e9305951275e0f62a98bcb10 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfd9fa4f785331ce88b5af8994a047ba087c705d8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x21eceaf3bf88ef0797e3927d855ca5bb569a47fc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7d9ce55d54ff3feddb611fc63ff63ec01f26d15f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4229c271c19ca5f319fb67b4bc8a40761a6d6299 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x80f45eacf6537498ecc660e4e4a2d2f99e195cf4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1a475d06d967aeb686c98de80d079d72097aeacf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4fb9b20dafe45d91ae287f2e07b2e79709308178 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd3741ac9b3f280b0819191e4b30be4ecd990771e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x09579452bc3872727a5d105f342645792bb8a82b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8a24d7260cd02d3dfd8eefb66bc17ad4b17d494c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd88611a629265c9af294ffdd2e7fa4546612273e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9a86980d3625b4a6e69d8a4606d51cbc019e2002 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1c7a460413dd4e964f96d8dfc56e7223ce88cd85 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x776aaef8d8760129a0398cf8674ee28cefc0eab9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x28e29ec91db66733a94ee8e3b86a6199117baf99 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb9898511bd2bad8bfc23eba641ef97a08f27e730 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x76baa16ff15d61d32e6b3576c3a8c83a25c2f180 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2816a491dd0b7a88d84cbded842a618e59016888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xa7ea9d5d4d4c7cf7dbde5871e6d108603c6942a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x586e10db93630a4d2da6c6a34ba715305b556f04 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xf486ad071f3bee968384d2e39e2d8af0fcf6fd46 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x76d36d44dc4595e8d2eb3ad745f175eda134284f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x1fa4a73a3f0133f0025378af00236f3abdee5d63 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xb3ed0a426155b79b898849803e3b36552f7ed507 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x0ef4a107b48163ab4b57fca36e1352151a587be4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x62694d43ccb9b64e76e38385d15e325c7712a735 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xa2b726b1145a4773f68593cf171187d8ebe4d495 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xf275e1ac303a4c9d987a2c48b8e555a77fec3f1c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x11a31b833d43853f8869c9eec17f60e3b4d2a753 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x48065fbbe25f71c9282ddf5e1cd6d6a887483d5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbadff0ef41d2a68f22de21eabca8a59aaf495cf0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1fdd61ef9a5c31b9a2abc7d39c139c779e8412af - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4ade2b180f65ed752b6f1296d0418ad21eb578c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0c5cb676e38d6973837b9496f6524835208145a2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb69753c06bb5c366be51e73bfc0cc2e3dc07e371 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8143182a775c54578c8b7b3ef77982498866945d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x76e222b07c53d28b89b0bac18602810fc22b49a8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x18aaa7115705e8be94bffebde57af9bfc265b998 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7d8146cf21e8d7cbe46054e01588207b51198729 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xfe0c30065b384f05761f15d0cc899d4f9f9cc0eb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1ce270557c1f68cfb577b856766310bf8b47fd9c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x793a5d8b30aab326f83d20a9370c827fea8fdc51 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xff836a5821e69066c87e268bc51b849fab94240c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf4d2888d29d722226fafa5d9b24f9164c092421e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8ed97a637a790be1feff5e888d43629dc05408f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x31c8eacbffdd875c74b94b077895bd78cf1e64a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc55126051b22ebb829d00368f4b12bde432de5da - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe0f63a424a4439cbe457d80e4f4b51ad25b2c56c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8881562783028f5c1bcb985d2283d5e170d88888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x67466be17df832165f8c80a5a120ccc652bd7e69 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd939212f16560447ed82ce46ca40a63db62419b5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x88417754ff7062c10f4e3a4ab7e9f9d9cbda6023 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5afe3855358e112b5647b952709e6165e1c1eeee - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x02e7f808990638e9e67e1f00313037ede2362361 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd2bdaaf2b9cc6981fd273dcb7c04023bfbe0a7fe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x112b08621e27e10773ec95d250604a041f36c582 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x32b053f2cba79f80ada5078cb6b305da92bde6e1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5ac34c53a04b9aaa0bf047e7291fb4e8a48f2a18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x26ebb8213fb8d66156f1af8908d43f7e3e367c1d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe3b9cfb8ea8a4f1279fbc28d3e15b4d2d86f18a0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8207c1ffc5b6804f6024322ccf34f29c3541ae26 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x255f1b39172f65dc6406b8bee8b08155c45fe1b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x092baadb7def4c3981454dd9c0a0d7ff07bcfc86 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x53bcf6698c911b2a7409a740eacddb901fc2a2c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x2ac2b254bc18cd4999f64773a966e4f4869c34ee - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x17fc002b466eec40dae837fc4be5c67993ddbd6f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xc8a4eea31e9b6b61c406df013dd4fec76f21e279 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x498bf2b1e120fed3ad3d42ea2165e9b73f99c1e5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xe4dddfe67e7164b0fe14e218d80dc4c08edc01cb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x7c8a1a80fdd00c9cccd6ebd573e9ecb49bfa2a59 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x1debd73e752beaf79865fd6446b0c970eae7732f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xaf5db6e1cc585ca312e8c8f7c499033590cf5c98 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x65559aa14915a70190438ef90104769e5e890a00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x7fb688ccf682d58f86d7e38e03f9d22e7705448b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x73cb180bf0521828d8849bc8cf2b920918e23032 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x2e3d870790dc77a83dd1d18184acc7439a53f475 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xa00e3a3511aac35ca78530c85007afcd31753819 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x528cdc92eab044e1e39fe43b9514bfdab4412b98 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x4f604735c1cf31399c6e711d5962b2b3e0225ad3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x1c954e8fe737f99f68fa1ccda3e51ebdb291948c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xf50d05a1402d0adafa880d36050736f9f6ee7dee - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xab0b2ddb9c7e440fac8e140a89c0dbcbf2d7bbff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x8bc3ec2e7973e64be582a90b08cadd13457160fe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x64060ab139feaae7f06ca4e63189d86adeb51691 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x5ec03c1f7fa7ff05ec476d19e34a22eddb48acdc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x9627a3d6872be48410fcece9b1ddd344bf08c53e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x1ed02954d60ba14e26c230eec40cbac55fa3aeea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8d3419b9a18651f3926a205ee0b1acea1e7192de - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb56d0839998fd79efcd15c27cf966250aa58d6d3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x81f91fe59ee415735d59bd5be5cca91a0ea4fa69 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x87c211144b1d9bdaa5a791b8099ea4123dc31d21 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf4210f93bc68d63df3286c73eba08c6414f40c0d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xece7b98bd817ee5b1f2f536daf34d0b6af8bb542 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4c96a67b0577358894407af7bc3158fc1dffbeb5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x70737489dfdf1a29b7584d40500d3561bd4fe196 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x39353a32eceafe4979a8606512c046c3b6398cc4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x92fb1b7d9730b2f1bd4e2e91368c1eb6fdd2a009 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x174e33ef2effa0a4893d97dda5db4044cc7993a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfdc944fb59201fb163596ee5e209ebc8fa4dcdc5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x388e543a5a491e7b42e3fbcd127dd6812ea02d0d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x56a38e7216304108e841579041249feb236c887b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1804e3db872eed4141e482ff74c56862f2791103 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9de16c805a3227b9b92e39a446f9d56cf59fe640 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb8d98a102b0079b69ffbc760c8d857a31653e56e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x5d6812722c3693078e4a0dbe3e9affc27a0b2768 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x255f1b39172f65dc6406b8bee8b08155c45fe1b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc2fe011c3885277c7f0e7ffd45ff90cadc8ecd12 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc1ffaef4e7d553bbaf13926e258a1a555a363a07 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4e73420dcc85702ea134d91a262c8ffc0a72aa70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xecaf81eb42cd30014eb44130b89bcd6d4ad98b92 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x4eae52907dba9c370e9ee99f0ce810602a4f2c63 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x25d887ce7a35172c62febfd67a1856f20faebb00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x382ea807a61a418479318efd96f1efbc5c1f2c21 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6468e79a80c0eab0f9a2b574c8d5bc374af59414 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3106a0a076bedae847652f42ef07fd58589e001f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd015422879a1308ba557510345e944b912b9ab73 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5de8ab7e27f6e7a1fff3e5b337584aa43961beef - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcf078da6e85389de507ceede0e3d217e457b9d49 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1bbf25e71ec48b84d773809b4ba55b6f4be946fb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7039cd6d7966672f194e8139074c3d5c4e6dcf65 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x943af17c37207c9d7a27d12cb5055542a0b7afa8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6d68015171eaa7af9a5a0a103664cf1e506ff699 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6942806d1b2d5886d95ce2f04314ece8eb825833 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x949d48eca67b17269629c7194f4b727d4ef9e5d6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9361adf2b72f413d96f81ff40d794b47ce13b331 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3bb1be077f3f96722ae92ec985ab37fd0a0c4c51 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xdbb7a34bf10169d6d2d0d02a6cbb436cf4381bfa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x66bff695f3b16a824869a8018a3a6e3685241269 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x85d19fb57ca7da715695fcf347ca2169144523a7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x069d89974f4edabde69450f9cf5cf7d8cbd2568d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0fe13ffe64b28a172c58505e24c0c111d149bd47 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x111111111117dc0aa78b770fa6a738034120c302 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xdc7ac5d5d4a9c3b5d8f3183058a92776dc12f4f3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x482702745260ffd69fc19943f70cffe2cacd70e9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc555d625828c4527d477e595ff1dd5801b4a600e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9eec1a4814323a7396c938bc86aec46b97f1bd82 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x87d73e916d7057945c9bcd8cdd94e42a6f47f776 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x067def80d66fb69c276e53b641f37ff7525162f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xdd157bd06c1840fa886da18a138c983a7d74c1d7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xe80772eaf6e2e18b651f160bc9158b2a5cafca65 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xb6093b61544572ab42a0e43af08abafd41bf25a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x35ca1e5a9b1c09fa542fa18d1ba4d61c8edff852 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x83e60b9f7f4db5cdb0877659b1740e73c662c55b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x4d01397994aa636bdcc65c9e8024bc497498c3bb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xc3abc47863524ced8daf3ef98d74dd881e131c38 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x4d15a3a2286d883af0aa1b3f21367843fac63e07 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xfb7f8a2c0526d01bfb00192781b7a7761841b16c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x3809dcdd5dde24b37abe64a5a339784c3323c44f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x85955046df4668e1dd369d2de9f3aeb98dd2a369 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x554cd6bdd03214b10aafa3e0d4d42de0c5d2937b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x4318cb63a2b8edf2de971e2f17f77097e499459d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xab9cb20a28f97e189ca0b666b8087803ad636b3c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x6a8ec2d9bfbdd20a7f5a4e89d640f7e7ceba4499 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x0169ec1f8f639b32eec6d923e24c2a2ff45b9dd6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xe161be4a74ab8fa8706a2d03e67c02318d0a0ad6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4d58608eff50b691a3b76189af2a7a123df1e9ba - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x420b0fa3de2efcf2b2fd04152eb1df36a09717cd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1cd38856ee0fdfd65c757e530e3b1de3061008d3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfad8cb754230dbfd249db0e8eccb5142dd675a0d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xda761a290e01c69325d12d82ac402e5a73d62e81 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xafb5d4d474693e68df500c9c682e6a2841f9661a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0b3e328455c4059eeb9e3f84b5543f74e24e7e1b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfc5462143a3178cf044e97c491f6bcb5e38f173e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xed1978d01d4a8a9d6a43ac79403d5b8dfbed739b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xba71cb8ef2d59de7399745793657838829e0b147 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x10c1b6f768e13c624a4a23337f1a5ba5c9be0e4b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1b1514c76c54ce8807d7fdedf85c664eee734ece - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x58cd93c4a91c3940109fa27d700f5013b18b5dc2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xea6f7e7e0f46a9e0f4e2048eb129d879f609d632 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x30d19fb77c3ee5cfa97f73d72c6a1e509fa06aef - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xe2dca969624795985f2f083bcd0b674337ba130a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x59f4f336bf3d0c49dbfba4a74ebd2a6ace40539a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x62d0a8458ed7719fdaf978fe5929c6d342b0bfce - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb8fda5aee55120247f16225feff266dfdb381d4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xca530408c3e552b020a2300debc7bd18820fb42f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3ffeea07a27fab7ad1df5297fa75e77a43cb5790 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcfeb09c3c5f0f78ad72166d55f9e6e9a60e96eec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x467bccd9d29f223bce8043b84e8c8b282827790f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2077d81d0c5258230d5a195233941547cb5f0989 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa0bbbe391b0d0957f1d013381b643041d2ca4022 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd1b89856d82f978d049116eba8b7f9df2f342ff3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x62f03b52c377fea3eb71d451a95ad86c818755d1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3927fb89f34bbee63351a6340558eebf51a19fb8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xacd2c239012d17beb128b0944d49015104113650 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x86b69f38bea3e02f68ff88534bc61ec60e772b19 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6873c95307e13beb58fb8fcddf9a99667655c9e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x18084fba666a33d37592fa2633fd49a74dd93a88 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6e79b51959cf968d87826592f46f819f92466615 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x80ee5c641a8ffc607545219a3856562f56427fe9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0414d8c87b271266a5864329fb4932bbe19c0c49 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf57e7e7c23978c3caec3c3548e3d615c346e79ff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xb0ffa8000886e57f86dd5264b9582b2ad87b2b91 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x1c986661170c1834db49c3830130d4038eeeb866 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x9ed7e4b1bff939ad473da5e7a218c771d1569456 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x7f9a7db853ca816b9a138aee3380ef34c437dee0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x371c7ec6d8039ff7933a2aa28eb827ffe1f52f07 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xb1bc21f748ae2be95674876710bc6d78235480e0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xadf5dd3e51bf28ab4f07e684ecf5d00691818790 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x1eba7a6a72c894026cd654ac5cdcf83a46445b08 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x38022a157b95c52d43abcac9bd09f028a1079105 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xd2507e7b5794179380673870d88b22f94da6abe0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xc708d6f2153933daa50b2d0758955be0a93a8fec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x0052074d3eb1429f39e5ea529b54a650c21f5aa4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x4e78011ce80ee02d2c3e649fb657e45898257815 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x7583feddbcefa813dc18259940f76a02710a8905 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe78aee6ccb05471a69677fb74da80f5d251c042b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x04f177fcacf6fb4d2f95d41d7d3fee8e565ca1d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xa6da8c8999c094432c77e7d318951d34019af24b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6d3b8c76c5396642960243febf736c6be8b60562 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7cf7132ede0ca592a236b6198a681bb7b42dd5ae - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3afeae00a594fbf2e4049f924e3c6ac93296b6e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0a93a7be7e7e426fc046e204c44d6b03a302b631 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc9b6ef062fab19d3f1eabc36b1f2e852af1acd18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1754e5aadce9567a95f545b146a616ce34eead53 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xdb173587d459ddb1b9b0f2d6d88febef039304a2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x10a7a84c91988138f8dbbc82a23b02c8639e2552 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x92af6f53febd6b4c6f5293840b6076a1b82c4bc2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xeb9e49fb4c33d9f6aefb1b03f9133435e24c0ec6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1b2c141479757b8643a519be4692904088d860b2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4d25e94291fe8dcfbfa572cbb2aaa7b755087c91 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8e0e798966382e53bfb145d474254cbe065c17dc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4b6f82a4ed0b9e3767f53309b87819a78d041a7f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x004aa1586011f3454f487eac8d0d5c647d646c69 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x741777f6b6d8145041f73a0bddd35ae81f55a40f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xc6c58f600917de512cd02d2b6ed595ab54b4c30f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x03aa6298f1370642642415edc0db8b957783e8d6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x3ee2200efb3400fabb9aacf31297cbdd1d435d47 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x0d8ce2a99bb6e3b7db580ed848240e4a0f9ae153 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xa697e272a73744b343528c3bc4702f2565b2f422 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x301af3eff0c904dc5ddd06faa808f653474f7fcc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x776f9987d9deed90eed791cbd824d971fd5ccf09 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xf7de7e8a6bd59ed41a4b5fe50278b3b7f31384df - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x19e6bfc1a6e4b042fb20531244d47e252445df01 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x4338665cbb7b2485a8855a139b75d5e34ab0db94 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x2940566eb50f15129238f4dc599adc4f742d7d8e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xbb73bb2505ac4643d5c0a99c2a1f34b3dfd09d11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x4ea98c1999575aaadfb38237dd015c5e773f75a2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x1d18d0386f51ab03e7e84e71bda1681eba865f1f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x57b96d4af698605563a4653d882635da59bf11af - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd33526068d116ce69f19a9ee46f0bd304f21a51f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2a5fa016ffb20c70e2ef36058c08547f344677aa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbe0ed4138121ecfc5c0e56b40517da27e6c5226b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9fd9278f04f01c6a39a9d1c1cd79f7782c6ade08 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x054c9d4c6f4ea4e14391addd1812106c97d05690 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7613c48e0cd50e42dd9bf0f6c235063145f6f8dc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x614da3b37b6f66f7ce69b4bbbcf9a55ce6168707 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x069e4aa272d17d9625aa3b6f863c7ef6cfb96713 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x24da31e7bb182cb2cabfef1d88db19c2ae1f5572 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7d4a23832fad83258b32ce4fd3109ceef4332af4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb58e61c3098d85632df34eecfb899a1ed80921cb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x67c4d14861f9c975d004cfb3ac305bee673e996e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x69babe9811cc86dcfc3b8f9a14de6470dd18eda4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x32f0d04b48427a14fb3cbc73db869e691a9fec6f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4cff49d0a19ed6ff845a9122fa912abcfb1f68a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x51cb253744189f11241becb29bedd3f1b5384fdb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcf4c91ecafc43c9f382db723ba20b82efa852821 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6968676661ac9851c38907bdfcc22d5dd77b564d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0d438f3b5175bebc262bf23753c1e53d03432bde - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb98d4c97425d9908e66e53a6fdf673acca0be986 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x68a47fe1cf42eba4a030a10cd4d6a1031ca3ca0a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8a370c951f34e295b2655b47bb0985dd08d8f718 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x525574c899a7c877a11865339e57376092168258 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd9a442856c234a39a81a089c06451ebaa4306a72 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x1c43d05be7e5b54d506e3ddb6f0305e8a66cd04e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xb766039cc6db368759c1e56b79affe831d0cc507 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x18c14c2d707b2212e17d1579789fc06010cfca23 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xe0ee18eacafddaeb38f8907c74347c44385578ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x56659245931cb6920e39c189d2a0e7dd0da2d57b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xb6a5ae40e79891e4deadad06c8a7ca47396df21c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x04565fe9aa3ae571ada8e1bebf8282c4e5247b2a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf8a99f2bf2ce5bb6ce4aafcf070d8723bc904aa2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3b9728bd65ca2c11a817ce39a6e91808cceef6fd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6797b6244fa75f2e78cdffc3a4eb169332b730cc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xe2c86869216ac578bd62a4b8313770d9ee359a05 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x47b464edb8dc9bc67b5cd4c9310bb87b773845bd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x28a730de97dc62a8c88363e0b1049056f1274a70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xba5ede8d98ab88cea9f0d69918dde28dc23c2553 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8319767a7b602f88e376368dca1b92d38869b9b4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x461ee40928677644b8195662ab91bcdaae6ef105 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x24569d33653c404f90af10a2b98d6e0030d3d267 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x22222bd682745cf032006394750739684e45a5f8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9124577428c5bd73ad7636cbc5014081384f29d6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xaa6cccdce193698d33deb9ffd4be74eaa74c4898 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xe095780ba2a64a4efa7a74830f0b71656f0b0ad4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb59c8912c83157a955f9d715e556257f432c35d7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7771450ece9c61430953d2646f995e33a06c91f5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc48823ec67720a04a9dfd8c7d109b2c3d6622094 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x9ec02756a559700d8d9e79ece56809f7bcc5dc27 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3593d125a4f7849a1b059e64f4517a86dd60c95d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb0ffa8000886e57f86dd5264b9582b2ad87b2b91 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6985884c4392d348587b19cb9eaaf157f13271cd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa045fe936e26e1e1e1fb27c1f2ae3643acde0171 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbeef698bd78139829e540622d5863e723e8715f1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x426a688ee72811773eb64f5717a32981b56f10c1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x873259322be8e50d80a4b868d186cc5ab148543a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x661c70333aa1850ccdbae82776bb436a0fcfeefb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0a2c375553e6965b42c135bb8b15a8914b08de0c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6fba952443be1de22232c824eb8d976b426b3c38 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1abaea1f7c830bd89acc67ec4af516284b1bc33c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb62132e35a6c13ee1ee0f84dc5d40bad8d815206 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb60fdf036f2ad584f79525b5da76c5c531283a1b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5a3e6a77ba2f983ec0d371ea3b475f8bc0811ad5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x55296f69f40ea6d20e478533c15a6b08b654e758 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1a7e4e63778b4f12a199c062f3efdd288afcbce8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x45804880de22913dafe09f4980848ece6ecbaf78 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe5018913f2fdf33971864804ddb5fca25c539032 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x6985884c4392d348587b19cb9eaaf157f13271cd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x2c650dab03a59332e2e0c0c4a7f726913e5028c1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x9aee3c99934c88832399d6c6e08ad802112ebeab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x439c0cf1038f8002a4cad489b427e217ba4b42ad - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x6985884c4392d348587b19cb9eaaf157f13271cd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x6985884c4392d348587b19cb9eaaf157f13271cd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6985884c4392d348587b19cb9eaaf157f13271cd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb79dd08ea68a908a97220c76d19a6aa9cbde4376 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4b61e2f1bbdee6d746209a693156952936f1702c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7480527815ccae421400da01e052b120cc4255e9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7466de7bb8b5e41ee572f4167de6be782a7fa75d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x298d411511a05dc1b559ed8f79c56bee06687b14 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8e16d46cb2da01cdd49601ec73d7b0344969ae33 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x18dd5b087bca9920562aff7a0199b96b9230438b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x37f0c2915cecc7e977183b8543fc0864d03e064c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x37f24b26bcefbfac7f261b97f8036da98f81a299 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xacb5b33ce55ba7729e38b2b59677e71c0112f0d9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x6985884c4392d348587b19cb9eaaf157f13271cd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xc71b5f631354be6853efe9c3ab6b9590f8302e81 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7e744bbb1a49a44dfcc795014a4ba618e418fbbe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4e3fbd56cd56c3e72c1403e103b45db9da5b9d2b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0c04ff41b11065eed8c9eda4d461ba6611591395 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x636bd98fc13908e475f56d8a38a6e03616ec5563 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x590246bfbf89b113d8ac36faeea12b7589f7fe5b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x80034f803afb1c6864e3ca481ef1362c54d094b9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x73fbd93bfda83b111ddc092aa3a4ca77fd30d380 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xff33a6b3dc0127862eedd3978609404b22298a54 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc770eefad204b5180df6a14ee197d99d808ee52d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa0385e7283c83e2871e9af49eec0966088421ddd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb2617246d0c6c0087f18703d576831899ca94f01 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xba386a4ca26b85fd057ab1ef86e3dc7bdeb5ce70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9ebb0895bd9c7c9dfab0d8d877c66ba613ac98ea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd12a99dbc40036cec6f1b776dccd2d36f5953b94 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8ab2ff0116a279a99950c66a12298962d152b83c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x420698cfdeddea6bc78d59bc17798113ad278f9d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa8c8cfb141a3bb59fea1e2ea6b79b5ecbcd7b6ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd8e8438cf7beed13cfabc82f300fb6573962c9e3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb1c9d42fa4ba691efe21656a7e6953d999b990c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xdadeca1167fe47499e53eb50f261103630974905 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xa05245ade25cc1063ee50cf7c083b4524c1c4302 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x4fafad147c8cd0e52f83830484d164e960bdc6c3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4dd9077269dd08899f2a9e73507125962b5bc87f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8931ee05ec111325c1700b68e5ef7b887e00661d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x26f1bb40ea88b46ceb21557dc0ffac7b7c0ad40f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x642e993fa91ffe9fb24d39a8eb0e0663145f8e92 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0c41f1fc9022feb69af6dc666abfe73c9ffda7ce - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf7ccb8a6e3400eb8eb0c47619134f7516e025215 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2416092f143378750bb29b79ed961ab195cceea5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf0268c5f9aa95baf5c25d646aabb900ac12f0800 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0c067fc190cde145b0c537765a78d4e19873a5cc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbe5614875952b1683cb0a2c20e6509be46d353a4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x87a0233a8cb4392ec3eb8fa467817fc0b6a326dd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xdfbea88c4842d30c26669602888d746d30f9d60d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb6fe221fe9eef5aba221c348ba20a1bf5e73624c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x80b3455e1db60b4cba46aba12e8b1e256dd64979 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x747747e47a48c669be384e0dfb248eee6ba04039 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x50e85c754929840b58614f48e29c64bc78c58345 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x02f92800f57bcd74066f5709f1daa1a4302df875 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x967da4048cd07ab37855c090aaf366e4ce1b9f48 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x729031b3995538ddf6b6bce6e68d5d6fdeb3ccb5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6dea81c8171d0ba574754ef6f8b412f2ed88c54d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x97a9a15168c22b3c137e6381037e1499c8ad0978 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5faa989af96af85384b8a938c2ede4a7378d9875 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4691937a7508860f876c9c0a2a617e7d9e945d4b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb50721bcf8d664c30412cfbc6cf7a15145234ad1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x037a54aab062628c9bbae1fdb1583c195585fe41 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xcb8b5cd20bdcaea9a010ac1f8d835824f5c87a04 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xdfb8be6f8c87f74295a87de951974362cedcfa30 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x354a6da3fcde098f8389cad84b0182725c6c91de - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3f56e0c36d275367b8c502090edf38289b3dea0d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x6f9590958ce2beaf9c92a3a8fca6d1ddf310e052 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x3e5d9d8a63cc8a88748f229999cf59487e90721e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xecc68d0451e20292406967fe7c04280e5238ac7d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xf1c1a3c2481a3a8a3f173a9ab5ade275292a6fa3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xb5e0cfe1b4db501ac003b740665bf43192cc7853 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xffa188493c15dfaf2c206c97d8633377847b6a52 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xb5c064f955d8e7f38fe0460c556a72987494ee17 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x4f604735c1cf31399c6e711d5962b2b3e0225ad3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xf0949dd87d2531d665010d6274f06a357669457a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x14e5386f47466a463f85d151653e1736c0c50fc3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xadac33f543267c4d59a8c299cf804c303bc3e4ac - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xcfa3ef56d303ae4faaba0592388f19d7c3399fb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x67ce18961c3269ca03c2e5632f1938cc53e614a1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x48164ea5df090e80a0eaee1147e466ea28669221 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3054e8f8fba3055a42e5f5228a2a4e2ab1326933 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x42069d11a2cc72388a2e06210921e839cfbd3280 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x74ff3cbf86f95fea386f79633d7bc4460d415f34 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2d6a3893966dda77749cc7e4003ab15f5cfa3cc1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x51b75da3da2e413ea1b8ed3eb078dc712304761c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8ad5b9007556749de59e088c88801a3aaa87134b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbd97693278f1948c59f65f130fd87e7ff7c61d11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3992b27da26848c2b19cea6fd25ad5568b68ab98 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x34980c35353a8d7b1a1ba02e02e387a8383e004a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xdebd6e2da378784a69dc6ec99fe254223b312287 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x456a3d042c0dbd3db53d5489e98dfb038553b0d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x9995cc8f20db5896943afc8ee0ba463259c931ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x30d20208d987713f46dfd34ef128bb16c404d10f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x19848077f45356b21164c412eff3d3e4ff6ebc31 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x53206bf5b6b8872c1bb0b3c533e06fde2f7e22e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x07ddacf367f0d40bd68b4b80b4709a37bdc9f847 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbdbe9f26918918bd3f43a0219d54e5fda9ce1bb3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb9d09bc374577dac1ab853de412a903408204ea8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe72b141df173b999ae7c1adcbf60cc9833ce56a8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x214549b0317564de15770561221433fb3e8c995c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc82e3db60a52cf7529253b4ec688f631aad9e7c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf3dcbc6d72a4e1892f7917b7c43b74131df8480e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x62e3b3c557c792c4a70765b3cdb5b56b1879f82d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2598c30330d5771ae9f983979209486ae26de875 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd4f4d0a10bcae123bb6655e8fe93a30d01eebd04 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xa0995d43901551601060447f9abf93ebc277cec2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x40379a439d4f6795b6fc9aa5687db461677a2dba - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x433cde5a82b5e0658da3543b47a375dffd126eb6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x619c4bbbd65f836b78b36cbe781513861d57f39d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1e0bb24ed6c806c01ef2f880a4b91adb90099ea7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0dd7913197bfb6d2b1f03f9772ced06298f1a644 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfbb75a59193a3525a8825bebe7d4b56899e2f7e1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc3de830ea07524a0761646a6a4e4be0e114a3c83 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3792dbdd07e87413247df995e692806aa13d3299 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x527856315a4bcd2f428ea7fa05ea251f7e96a50a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x292fcdd1b104de5a00250febba9bc6a5092a0076 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd749b369d361396286f8cc28a99dd3425ac05619 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xfe3e6a25e6b192a42a44ecddcd13796471735acf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa1faa113cbe53436df28ff0aee54275c13b40975 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8802269d1283cdb2a5a329649e5cb4cdcee91ab6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0000bdaa645097ef80f9d475f341d0d107a45b3a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x683a4ac99e65200921f556a19dadf4b0214b5938 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x36c7188d64c44301272db3293899507eabb8ed43 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8a2279d4a90b6fe1c4b30fa660cc9f926797baa2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf418588522d5dd018b425e472991e52ebbeeeeee - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6135177a17e02658df99a07a2841464deb5b8589 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcf91b70017eabde82c9671e30e5502d312ea6eb2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x45080a6531d671ddff20db42f93792a489685e32 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x790814cd782983fab4d7b92cf155187a865d9f18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9e6be44cc1236eef7e1f197418592d363bedcd5a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xaa7a9ca87d3694b5755f213b5d04094b8d0f0a6f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x69ee720c120ec7c9c52a625c04414459b3185f23 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x408e41876cccdc0f92210600ef50372656052a38 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5cf04716ba20127f1e2297addcf4b5035000c9eb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8290333cef9e6d528dd5618fb97a76f268f3edd4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1929761e87667283f087ea9ab8370c174681b4e9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x888888848b652b3e3a0f34c96e00eec0f3a23f72 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf944e35f95e819e752f3ccb5faf40957d311e8c5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1f70300bce8c2302780bd0a153ebb75b8ca7efcb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3de81ce90f5a27c5e6a5adb04b54aba488a6d14e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xc87b37a581ec3257b734886d9d3a581f5a9d056c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x1a6b3a62391eccaaa992ade44cd4afe6bec8cff1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x65c936f008bc34fe819bce9fa5afd9dc2d49977f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x07d65c18cecba423298c0aeb5d2beded4dfd5736 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x51fc0f6660482ea73330e414efd7808811a57fa2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xcbe94d75ec713b7ead84f55620dc3174beeb1cfe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xd3144ff5f388d36c0a445686c08540296d8b209b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x433e39ce74aef8f409182541269e417ad9b56011 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb1a03eda10342529bbf8eb700a06c60441fef25d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6b9bb36519538e0c073894e964e90172e1c0b41f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x689644b86075ed61c647596862c7403e1c474dbf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9a6d24c02ec35ad970287ee8296d4d6552a31dbe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x506beb7965fc7053059006c7ab4c62c02c2d989f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x31b28012f61fc3600e1c076bafc9fd997fb2da90 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd7d919ea0c33a97ad6e7bd4f510498e2ec98cb78 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xef553b6914dbd17567393f7e55fbd773fff7d0cb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xe642657e4f43e6dcf0bd73ef24008394574dee28 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf8b1b47aa748f5c7b5d0e80c726a843913eb573a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd064c53f043d5aee2ac9503b13ee012bf2def1d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfc60aa1ffca50ce08b3cdec9626c0bb9e9b09bec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x82c8f48ac694841360de84d649a0d48d239b61f8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7d89e05c0b93b24b5cb23a073e60d008fed1acf9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7546e0d4d947a15f914e33de6616ffed826f45ef - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x9a5350edf28c1f93bb36d6e94b5c425fde8e222d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xaa076b62efc6f357882e07665157a271ab46a063 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6a6aa13393b7d1100c00a57c76c39e8b6c835041 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x07040971246a73ebda9cf29ea1306bb47c7c4e76 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6df0e641fc9847c0c6fde39be6253045440c14d3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2b640a99991dea2916205ecdc9f9c58f80017ed8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x38e4adb44ef08f22f5b5b76a8f0c2d0dcbe7dca1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x42069cc15f5befb510430d22ff1c9a1b3ae22cfe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x89fd2d8fd8d937f55c89b7da3ceed44fa27e4a81 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x76bc677d444f1e9d57daf5187ee2b7dc852745ae - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa0084063ea01d5f09e56ef3ff6232a9e18b0bacd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4abd5745f326932b1b673bfa592a20d7bb6bc455 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe53ec727dbdeb9e2d5456c3be40cff031ab40a55 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf43f21384d03b5cbbddd58d2de64071e4ce76ab0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x33349b282065b0284d756f0577fb39c158f935e6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x33c88d4cac6ac34f77020915a2a88cd0417dc069 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xdce765f021410b3266aa0053c93cb4535f1e12e0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xb50a8e92cb9782c9b8f3c88e4ee8a1d0aa2221d7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x0a84edf70f30325151631ce7a61307d1f4d619a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xc11158c5da9db1d553ed28f0c2ba1cbedd42cfcb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xb0b195aefa3650a6908f15cdac7d92f8a5791b0b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xdc4f4ed9872571d5ec8986a502a0d88f3a175f1e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9beec80e62aa257ced8b0edd8692f79ee8783777 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf95e1c0a67492720ca22842122fe7fa63d5519e5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xca8e8d244f0d219a6fc9e4793c635cea98d0399c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6a4f69da1e2fb2a9b11d1aad60d03163fe567732 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0718f45bbf4781ce891e4e18182f025725f0fc95 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x132bbda4a40d4d6288be49b637ec2c113b5d7600 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9aaae745cf2830fb8ddc6248b17436dc3a5e701c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x24fcfc492c1393274b6bcd568ac9e225bec93584 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x21fd16cd0ef24a49d28429921e335bb0c1bfadb3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa469b7ee9ee773642b3e93e842e5d9b5baa10067 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8c19f7854b27758ddffdcdc8908f22bf55e00736 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xf2ae0038696774d65e67892c9d301c5f2cbbda58 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6bc40d4099f9057b23af309c08d935b890d7adc0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xee2a03aa6dacf51c18679c516ad5283d8e7c2637 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7f911119435d8ded9f018194b4b6661331379a3d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x777be1c6075c20184c4fd76344b7b0b7c858fe6b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x812ba41e071c7b7fa4ebcfb62df5f45f6fa853ee - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x881d4c8618d68872fa404518b2460ea839a02a6a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xba2ae4e0a9c6ecaf172015aa2cdd70a21f5a290b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1caf237d7a2d103e3e9b1855988c01ac10344600 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7d4a7be025652995364e0e232063abd9e8d65e6e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x620aa20875ec1144126ea47fb27ecfe6e10d0c56 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xfae103dc9cf190ed75350761e95403b7b8afa6c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xae7ab96520de3a18e5e111b5eaab095312d7fe84 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x04c154b66cb340f3ae24111cc767e0184ed00cc6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x70e8de73ce538da2beed35d14187f6959a8eca96 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xfb7b4564402e5500db5bb6d63ae671302777c75a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6810e776880c02933d47db1b9fc05908e5386b96 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x11e969e9b3f89cb16d686a03cd8508c9fc0361af - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x8b5d1d8b3466ec21f8ee33ce63f319642c026142 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3ed03e95dd894235090b3d4a49e0c3239edce59e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xb3f13b0c61d65d67d7d6215d70c89533ee567a91 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xfea31d704deb0975da8e77bf13e04239e70d7c28 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x66e535e8d2ebf13f49f3d49e5c50395a97c137b1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x9a06db14d639796b25a6cec6a1bf614fd98815ec - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7fdd7419428955dbf36d4176af5a8f09ad29d1f3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8c9037d1ef5c6d1f6816278c7aaf5491d24cd527 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xa9f5031b54c44c3603b4300fde9b8f5cd18ad06f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x57f5fbd3de65dfc0bd3630f732969e5fb97e6d37 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9ef1139e6b420cc929dd912a5a7adeced6f12e91 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x120edc8e391ba4c94cb98bb65d8856ae6ec1525f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd7ea82d19f1f59ff1ae95f1945ee6e6d86a25b96 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2c9ab600d71967ff259c491ad51f517886740cbc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xf4c8e32eadec4bfe97e0f595add0f4450a863a11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x8c49a510756224e887b3d99d00d959f2d86dda1c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7777cec341e7434126864195adef9b05dcc3489c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x19af07b52e5faa0c2b1e11721c52aa23172fe2f5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb7109df1a93f8fe2b8162c6207c9b846c1c68090 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbbc2ae13b23d715c30720f079fcd9b4a74093505 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x595832f8fc6bf59c85c527fec3740a1b7a361269 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7316d973b0269863bbfed87302e11334e25ea565 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2be8e422cb4a5a7f217a8f1b0658952a79132f28 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x83e6f1e41cdd28eaceb20cb649155049fac3d5aa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbabe3ce7835665464228df00b03246115c30730a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2e6a60492fb5b58f5b5d08c7cafc75e740e6dc8e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc08e7e23c235073c6807c2efe7021304cb7c2815 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x955d5c14c8d4944da1ea7836bd44d54a8ec35ba1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3540abe4f288b280a0740ad5121aec337c404d15 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xfe8526a77a2c3590e5973ba81308b90bea21fbff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x64aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd807f7e2818db8eda0d28b5be74866338eaedb86 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x4186bfc76e2e237523cbc30fd220fe055156b41f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd5d3aa404d7562d09a848f96a8a8d5d65977bf90 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xa3f751662e282e83ec3cbc387d225ca56dd63d3a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xd24157aa1097486dc9d7cf094a7e15026e566b5d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xbed0b9240bdbcc8e33f66d2ca650a5ef60a5bab0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x5d559ea7bb2dae4b694a079cb8328a2145fd32f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x97b959385dfdcaf252223838746beb232ac601aa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x18e692c03de43972fe81058f322fa542ae1a5e2c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x38029c62dfa30d9fd3cadf4c64e9b2ab21dbda17 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x4507cef57c46789ef8d1a19ea45f4216bae2b528 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x73f93dcc49cb8a239e2032663e9475dd5ef29a08 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x9e523234d36973f9e38642886197d023c88e307e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5de758bba013e58dae2693aea3f0b12b31a3023d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1001271083c249bd771e1bb76c22d935809a61ee - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9d39a5de30e57443bff2a8307a4256c8797a3497 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf3768d6e78e65fc64b8f12ffc824452130bd5394 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf2ec4a773ef90c58d98ea734c0ebdb538519b988 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0f2d719407fdbeff09d87557abb7232601fd9f29 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x180000dda70eb7fb7f3e10e52e88ce88f46e3b3a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xed89fc0f41d8be2c98b13b7e3cd3e876d73f1d30 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x17c50d62e6e8d20d2dc18e9ad79c43263d0720d9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3b50805453023a91a8bf641e279401a0b23fa6f9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xfd03723a9a3abe0562451496a9a394d2c4bad4ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xfe67a4450907459c3e1fff623aa927dd4e28c67a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc5fb36dd2fb59d3b98deff88425a3f425ee469ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x6b021b3f68491974be6d4009fee61a4e3c708fd6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x7ae9ab13fc8945323b778b3f8678145e80ec2efb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xbc4c97fb9befaa8b41448e1dfcc5236da543217f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x93919784c523f39cacaa98ee0a9d96c3f32b593e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xd55fce7cdab84d84f2ef3f99816d765a2a94a509 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x32e0f9d26d1e33625742a52620cc76c1130efde6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9b700b043e9587dde9a0c29a9483e2f8fa450d54 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0b1594b0e896bf165d925956e0df733b8443af6a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x891502ba08132653151f822a3a430198f1844115 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc702b80a1bebac118cab22ce6f2978ef59563b3f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1287a235474e0331c0975e373bdd066444d1bd35 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xab36452dbac151be02b16ca17d8919826072f64a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xcc7ff230365bd730ee4b352cc2492cedac49383e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xa9b038285f43cd6fe9e16b4c80b4b9bccd3c161b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x77be1ba1cd2d7a63bffc772d361168cc327dd8bc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x00000000efe302beaa2b3e6e1b18d08d69a9012a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd101dcc414f310268c37eeb4cd376ccfa507f571 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd09eb9099fac55edcbf4965e0a866779ca365a0c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7b0df1cd724ec34ec9bc4bd19749b01afb490761 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x71297312753ea7a2570a5a3278ed70d9a75f4f44 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9e32b13ce7f2e80a01932b42553652e053d6ed8e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6942040b6d25d6207e98f8e26c6101755d67ac89 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3301ee63fb29f863f2333bd4466acb46cd8323e6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xfefe157c9d0ae025213092ff9a5cb56ab492bab8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x44108f0223a3c3028f5fe7aec7f9bb2e66bef82f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1121acc14c63f3c872bfca497d10926a6098aac5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf1376bcef0f78459c0ed0ba5ddce976f1ddf51f4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xce722f60f35c37ab295adc4e6ba45bcc7ca89dd6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x614577036f0a024dbc1c88ba616b394dd65d105a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x93fa0b88c0c78e45980fa74cdd87469311b7b3e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xe22c452bd2ade15dfc8ad98286bc6bdf0c9219b7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x00000000000451f49c692bfc24971cacea2db678 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x00000000702749f73e5210b08b0a3d440078f888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x86f65121804d2cdbef79f9f072d4e0c2eebabc08 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x127e47aba094a9a87d084a3a93732909ff031419 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x52b492a33e447cdb854c7fc19f1e57e8bfa1777d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x55027a5b06f4340cc4c82dcc74c90ca93dcb173e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x32b133add6d99d085ff23f522662b546b70d54a1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2ad3d80c917ddbf08acc04277f379e00e4d75395 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc73dc7ae7a4fa40517aafa941ae1ee436b91a12c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9f235d23354857efe6c541db92a9ef1877689bcb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0c90c756350fb803a7d5d9f9ee5ac29e77369973 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xac12f930318be4f9d37f602cbf89cd33e99aa9d4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x1c45366641014069114c78962bdc371f534bc81c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc328a59e7321747aebbc49fd28d1b32c1af8d3b2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x90edf25b14393350f0c1b5b12b6cb3cd3781fb4a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x590f820444fa3638e022776752c5eef34e2f89a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1fdb29ad49330b07ae5a87483f598aa6b292039e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4a220e6096b25eadb88358cb44068a3248254675 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xabd4c63d2616a5201454168269031355f4764337 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4c1b1302220d7de5c22b495e78b72f2dd2457d45 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x5d3a1ff2b6bab83b63cd9ad0787074081a52ef34 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x050c24dbf1eec17babe5fc585f06116a259cc77a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x57211299bc356319ba5ca36873eb06896173f8bc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfde4c96c8593536e31f229ea8f37b2ada2699bb2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf9b738c2e7adc4f299c57afd0890b925a5efea6f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x04c0599ae5a44757c0af6f9ec3b93da8976c150a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x99b2b1a2adb02b38222adcd057783d7e5d1fcc7d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf9569cfb8fd265e91aa478d86ae8c78b8af55df4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xa3d1a8deb97b111454b294e2324efad13a9d8396 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd85eff20288ca72ea9eecffb428f89ee5066ca5c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x13f4196cc779275888440b3000ae533bbbbc3166 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x160452f95612699d1a561a70eeeeede67c6812af - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x5ce12f6d9f2fcaf0b11494a1c39e09eeb16ca7e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x6894cde390a3f51155ea41ed24a33a4827d3063d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6db6fdb5182053eecec778afec95e0814172a474 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc0cfbe1602dd586349f60e4681bf4badca584ec9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x289ff00235d2b98b0145ff5d4435d3e92f9540a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcb76314c2540199f4b844d4ebbc7998c604880ca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd7cfdb3cdc33dbeb9e9a4c95b61953cf12a008b3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xce176825afc335d9759cb4e323ee8b31891de747 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8f2bf2f59cdf7be4aee71500b9419623202b8636 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x744d70fdbe2ba4cf95131626614a1763df805b9e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x52e6654aee5d59e13ae30b48f8f5dbeb97f708cd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x38f9bf9dce51833ec7f03c9dc218197999999999 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x7189fb5b6504bbff6a852b13b7b82a3c118fdc27 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x38f9bf9dce51833ec7f03c9dc218197999999999 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x8349314651ede274f8c5fef01aa65ff8da75e57c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x38f9bf9dce51833ec7f03c9dc218197999999999 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x1adcef5c780d8895ac77e6ee9239b4b3ecb76da2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x38f9bf9dce51833ec7f03c9dc218197999999999 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x917f39bb33b2483dd19546b1e8d2f09ce481ee44 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x60a3e35cc302bfa44cb288bc5a4f316fdb1adb42 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8b67f2e56139ca052a7ec49cbcd1aa9c83f2752a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x029c58a909fbe3d4be85a24f414dda923a3fde0f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x655a51e6803faf50d4ace80fa501af2f29c856cf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x9ca5dfa3b0b187d7f53f4ef83ca435a2ec2e4070 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xb68a20b9e9b06fde873897e12ab3372ce48f1a8a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x0203d275d2a65030889af45ed91d472be3948b92 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa00453052a36d43a99ac1ca145dfe4a952ca33b8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8236a87084f8b84306f72007f36f2618a5634494 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbc5ca3c518c8a2930947661237b1b562e34f22b7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xfd0205066521550d7d7ab19da8f72bb004b4c341 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x880226cbcce551eeafd18c9a9e883c85811b82fc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xfc21540d6b89667d167d42086e1feb04da3e9b21 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x41d06390b935356b46ad6750bda30148ad2044a4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8149745670881d99700078ede5903a1a7bebe262 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcf01a5c02c9b9dd5bf73a5a56bcdbc9dca483d43 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xae0fe8474cf5b1b412b3e4327a1c535ea12b77b7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc98d64da73a6616c42117b582e832812e7b8d57f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x70c0b83501a3989d4f8a8693581bb7010194abb5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x80122c6a83c8202ea365233363d3f4837d13e888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x455e53cbb86018ac2b8092fdcd39d8444affc3f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x58aea10748a00d1781d6651f9d78a414ea32ca46 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x406d59819bc2aef682f4ff2769085c98a264f97b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xc4ce1d6f5d98d65ee25cf85e9f2e9dcfee6cb5d6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x94025780a1ab58868d9b2dbbb775f44b32e8e6e5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xf33687811f3ad0cd6b48dd4b39f9f977bd7165a2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xa88594d404727625a9437c3f886c7643872296ae - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7e72d6410803c40e73806f2a72e3eade5d075cc0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x31ea904a7eca45122890deb8da3473a2081bc9d1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x48c6740bcf807d6c47c864faeea15ed4da3910ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc5fecc3a29fb57b5024eec8a2239d4621e111cbe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x184cff0e719826b966025f93e05d8c8b0a79b3f9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0c2e08e459fc43ddd1e2718c122f566473f59665 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1a3a8cf347b2bf5890d3d6a1b981c4f4432c8661 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8baf5d75cae25c7df6d1e0d26c52d19ee848301a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x28561b8a2360f463011c16b6cc0b0cbef8dbbcad - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0fd10b9899882a6f2fcb5c371e17e70fdee00c38 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7a58c0be72be218b41c608b7fe7c5bb630736c71 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xddaf27167929cd045a7d97d09a4fa1046ece3d89 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x375e104af98872e5b4fe951919e504a47db1757c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5408d3883ec28c2de205064ae9690142b035fed2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1bb4afbf2ce0c9ec86e6414ad4ba4d9aab1c0de4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7391425ca7cee3ee03e09794b819291a572af83e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x38e382f74dfb84608f3c1f10187f6bef5951de93 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbea269038eb75bdab47a9c04d0f5c572d94b93d5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf41a7b7c79840775f70a085c1fc5a762bbc6b180 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x13654df31871b5d01e5fba8e6c21a5d0344820f5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x4d840b741bc05fde325d4ec0b4cfcd0cea237e4e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x49b1be61a8ca3f9a9f178d6550e41e00d9162159 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf5bc3439f53a45607ccad667abc7daf5a583633f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0a953dd9fc813fefaf6015b804c9dfa0624690c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x44ec807ce2f4a6f2737a92e985f318d035883e47 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xfb6115445bff7b52feb98650c87f44907e58f802 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x117a123ded97cd125837d9ac19592b77d806fa88 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd9fcd98c322942075a5c3860693e9f4f03aae07b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x240cd7b53d364a208ed41f8ced4965d11f571b7a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb8d6196d71cdd7d90a053a7769a077772aaac464 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcbde0453d4e7d748077c1b0ac2216c011dd2f406 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x786f112c9a6bc840cdc07cfd840105efd6ef2d4b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0bffdd787c83235f6f0afa0faed42061a4619b7a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1c43cd666f22878ee902769fccda61f401814efb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1b54a6fa1360bd71a0f28f77a1d6fba215d498c3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb528edbef013aff855ac3c50b381f253af13b997 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x888888ae2c4a298efd66d162ffc53b3f2a869888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4cd27e18757baa3a4fe7b0ab7db083002637a6c5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x240d6faf8c3b1a7394e371792a3bf9d28dd65515 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x41b1f9dcd5923c9542b6957b9b72169595acbc5c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd1f2586790a5bd6da1e443441df53af6ec213d83 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8de5b80a0c1b02fe4976851d030b36122dbb8624 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x391cf4b21f557c935c7f670218ef42c21bd8d686 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8bd35250918ed056304fa8641e083be2c42308bb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc3960227e41c3f54e9b399ce216149dea5315c34 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x59062301fb510f4ea2417b67404cb16d31e604ba - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x75ec618a817eb0a4a7e44ac3dfc64c963daf921a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x7e7a7c916c19a45769f6bdaf91087f93c6c12f78 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x21ccbc5e7f353ec43b2f5b1fb12c3e9d89d30dca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x87eee96d50fb761ad85b1c982d28a042169d61b1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x3c720206bfacb2d16fa3ac0ed87d2048dbc401fc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x8d60fb5886497851aac8c5195006ecf07647ba0d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xcb327b99ff831bf8223cced12b1338ff3aa322ff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf544251d25f3d243a36b07e7e7962a678f952691 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xa7296cefae8477a81e23230ca5d3a3d6f49d3764 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x051fb509e4a775fabd257611eea1efaed8f91359 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xae2bddbcc932c2d2cf286bad0028c6f5074c77b5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1dd2d631c92b1acdfcdd51a0f7145a50130050c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd3c68968137317a57a9babeacc7707ec433548b4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7f6f6720a73c0f54f95ab343d7efeb1fa991f4f7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xf3527ef8de265eaa3716fb312c12847bfba66cef - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x8888888888f004100c0353d657be6300587a6ccd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xe2a59d5e33c6540e18aaa46bf98917ac3158db0d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xfa2ad87e35fc8d3c9f57d73c4667a4651ce6ad2f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xec53bf9167f50cdeb3ae105f56099aaab9061f83 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb3912b20b3abc78c15e85e13ec0bf334fbb924f7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x16a3543fa6b32cac3b0a755f64a729e84f89a75c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf1c9acdc66974dfb6decb12aa385b9cd01190e38 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0da2082905583cedfffd4847879d0f1cf3d25c36 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb0ffa8000886e57f86dd5264b9582b2ad87b2b91 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xec9333e7dadeebf82d290d6cb12e66cc30ce46b0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x898843fb909e3562c82f2b96f4e3d0693af041df - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xaf05ce8a2cef336006e933c02fc89887f5b3c726 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x13e4b8cffe704d3de6f19e52b201d92c21ec18bd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xaeb3607ec434454ceb308f5cd540875efb54309a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2a3bff78b79a009976eea096a51a948a3dc00e34 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4298e4ad48be89bf63a6fdc470a4b4fe9ce633b1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa117000000f279d81a1d3cc75430faa017fa5a2e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x339058ca41e17b55b6dd295373c5d3cbe8000cd9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa3d4bee77b05d4a0c943877558ce21a763c4fa29 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x362bc847a3a9637d3af6624eec853618a43ed7d2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7a65cb87f596caf31a4932f074c59c0592be77d7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa21af1050f7b26e0cff45ee51548254c41ed6b5c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x284b25d8f199125da962abc9ee6e6b1b6715cae3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8fac8031e079f409135766c7d5de29cf22ef897c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf280b16ef293d8e534e370794ef26bf312694126 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x69af81e73a73b40adf4f3d4223cd9b1ece623074 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x888c1a341ce9d9ae9c2d2a75a72a7f0d2551a2dc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x465dbc39f46f9d43c581a5d90a43e4a0f2a6ff2d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x44e18207b6e98f4a786957954e462ed46b8c95be - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x70c29e99ca32592c0e88bb571b87444bb0e08e33 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8c7ac134ed985367eadc6f727d79e8295e11435c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6aa56e1d98b3805921c170eb4b3fe7d4fda6d89b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x81db1949d0e888557bc632f7c0f6698b1f8c9106 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2de1218c31a04e1040fc5501b89e3a58793b3ddf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x30ae41d5f9988d359c733232c6c693c0e645c77e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x1fc01117e196800f416a577350cb1938d10501c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3212dc0f8c834e4de893532d27cc9b6001684db0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xd0cf4de352ac8dcce00bd6b93ee73d3cb272edc3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x75e6b648c91d222b2f6318e8ceeed4b691d5323f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2a06a17cbc6d0032cac2c6696da90f29d39a1a29 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6668d4a6605a27e5ee51eda040581155eddc6666 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2dc90fa3a0f178ba4bee16cac5d6c9a5a7b4c6cb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x9c7beba8f6ef6643abd725e45a4e8387ef260649 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x0cf8e180350253271f4b917ccfb0accc4862f262 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x42069026eac8eee0fd9b5f7adfa4f6e6d69a2b39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x340d2bde5eb28c1eed91b2f790723e3b160613b7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xec21890967a8ceb3e55a3f79dac4e90673ba3c2e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6900f7b42fb4abb615c938db6a26d73a9afbed69 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4c44a8b7823b80161eb5e6d80c014024752607f2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x103143acf2e717acf8f021823e86a1dbfe944fb5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6969f3a3754ab674b48b7829a8572360e98132ba - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x562e362876c8aee4744fc2c6aac8394c312d215d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd0ebfe04adb5ef449ec5874e450810501dc53ed5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2597342ff387b63846eb456419590781c4bfcdaf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4e6221c07dae8d3460a46fa01779cf17fdd72ad8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb612bfc5ce2fb1337bd29f5af24ca85dbb181ce2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc0e10854ab40b2e59a5519c481161a090f1162a0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa7f4195f10f1a62b102bd683eab131d657a6c6e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7e7ef0ee0305c1c195fcae22fd7b207a813eef86 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xb6212b633c941e9be168c4b9c2d9e785f1cd42fb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x139052115f8b1773cf7dcba6a553f922a2e54f69 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x3f94618ad346f34f43e27f0cf46decbb0d396b1b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf56b3b3972f2f154555a0b62ff5a22b7b2a3c90b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc08cd26474722ce93f4d0c34d16201461c10aa8c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x080c169cd58122f8e1d36713bf8bcbca45176905 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x50da645f148798f68ef2d7db7c1cb22a6819bb2c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xea1d649ddc8e2a6e6ee40b89b2997518476cafa5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xa4080f1778e69467e905b8d6f72f6e441f9e9484 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb60acd2057067dc9ed8c083f5aa227a244044fd6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd0dfca0b404e866dc9a3038bd2a545c6735d9fa9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x18a8d75f70eaead79b5a55903d036ce337f623a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xebb66a88cedd12bfe3a289df6dfee377f2963f12 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9343e24716659a3551eb10aff9472a2dcad5db2d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xfa3e941d1f6b7b10ed84a0c211bfa8aee907965e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x85bea4ee627b795a79583fcede229e198aa57055 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0c03ce270b4826ec62e7dd007f0b716068639f7b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x19706c142d33376240e418d6385f05691a5fa8e2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb3e41d6e0ea14b43bc5de3c314a408af171b03dd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x634769eb87542eaf41c0008c05d5d8f5d8bec3a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd3c5bdbc6de5ea3899a28f6cd419f29c09fa749f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9dfad1b7102d46b1b197b90095b5c4e9f5845bba - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc8f69a9b46b235de8d0b77c355fff7994f1b090f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5200b34e6a519f289f5258de4554ebd3db12e822 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x69fd9281a920717ee54193a1c130b689ef341933 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5d56b6581d2e7e7574adce2dc593f499a53d7505 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x168168db04def453b7e8bfaff1e0102a3e810485 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1f19d846d99a0e75581913b64510fe0e18bbc31f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x571d9b73dc04ed88b4e273e048c8d4848f83b779 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xca5ca9083702c56b481d1eec86f1776fdbd2e594 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x99f40b01ba9c469193b360f72740e416b17ac332 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xc6bdfc4f2e90196738873e824a9efa03f7c64176 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x06480acaae64bcfa6da8fd176f60982584385090 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0c5142bc58f9a61ab8c3d2085dd2f4e550c5ce0b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc734635cd30e882037c3f3de1ebccf9fa9d27d9f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x65e570b560027f493f2b1907e8e8e3b9546053bd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd1917629b3e6a72e6772aab5dbe58eb7fa3c2f33 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9e81f6495ba29a6b4d48bddd042c0598fa8abc9f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2075f6e2147d4ac26036c9b4084f8e28b324397d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x01aac2b594f7bdbec740f0f1aa22910ebb4b74ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xef433ebb8ba7a486ce21b854f093b9a3f4e696bc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2bb84fd8f7ed0ffae3da36ad60d4d7840bdeeada - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xad86b91a1d1db15a4cd34d0634bbd4ecacb5b61a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4d224452801aced8b2f0aebe155379bb5d594381 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf63e309818e4ea13782678ce6c31c1234fa61809 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe0151763455a8a021e64880c238ba1cff3787ff0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x44ff8620b8ca30902395a7bd3f2407e1a091bf73 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5640e0560e6afd6a9f4ddb41230d0201d181fea7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x88ee7a3537667958d040216d9dc1752d1274d838 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x39d5313c3750140e5042887413ba8aa6145a9bd2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xba2a3dad197d6fee75471215efd5c30c8c854e11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3dd77d53f4fa9b3435b3a2ff6bb408771e6800e6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xf929de51d91c77e42f5090069e0ad7a09e513c73 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x74885b4d524d497261259b38900f54e6dbad2210 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xc55e93c62874d8100dbd2dfe307edc1036ad5434 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x9c9e5fd8bbc25984b178fdce6117defa39d2db39 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xaa53b93608c88ee55fad8db4c504fa20e52642ad - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x55cd6469f597452b5a7536e2cd98fde4c1247ee4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfe550bffb51eb645ea3b324d772a19ac449e92c5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x314d7f9e2f55b430ef656fbb98a7635d43a2261e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3b54eb78fc8103462f86976b06916fa46078b124 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1d4731111bd2a50ab3dd5178574e6f3698270ffc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7a2c5e7788e55ec0a7ba4aeec5b3da322718fb5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x814fe70e85025bec87d4ad3f3b713bdcaac0579b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9b69667f602f15ef2d09a9a18489c788e327461e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8808434a831efea81170a56a9ddc57cc9e6de1d8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe0c8b298db4cffe05d1bea0bb1ba414522b33c1b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x230ea9aed5d08afdb22cd3c06c47cf24ad501301 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x35d8949372d46b7a3d5a56006ae77b215fc69bc0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x535887989b9edffb63b1fd5c6b99a4d45443b49a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9ee8c380e1926730ad89e91665ff27063b13c90a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb8a914a00664e9361eae187468eff94905dfbc15 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xda2e903b0b67f30bf26bd3464f9ee1a383bbbe5f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd6cf874e24a9f5f43075142101a6b13735cdd424 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x8c92e38eca8210f4fcbf17f0951b198dd7668292 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9a33406165f562e16c3abd82fd1185482e01b49a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7f65323e468939073ef3b5287c73f13951b0ff5b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x5597ce42b315f29e42071d231dcd0158da35b77b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0a14ef61afb32e5ca672e021784f71705ac14908 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0f1cfd0bb452db90a3bfc0848349463010419ab2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf3708859c178709d5319ad5405bc81511b72b9e9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xadf734e8d910d01e6528240898d895af6c22e2de - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x78a087d713be963bf307b18f2ff8122ef9a63ae9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4287105ffac106eb98a71cab46586906181e35ff - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb8e564b206032bbcda2c3978bc371da52152f72e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3ecced5b416e58664f04a39dd18935eb71d33b15 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x71e26d0e519d14591b9de9a0fe9513a398101490 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x105d4a9306d2e55a71d2eb95b81553ae1dc20d7b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x420110d74c4c3ea14043a09e81fad53e1932f54c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd6203889c22d9fe5e938a9200f50fdffe9dd8e02 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0a6e7ba5042b38349e437ec6db6214aec7b35676 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6f40d4a6237c257fff2db00fa0510deeecd303eb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3b991130eae3cca364406d718da22fa1c3e7c256 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x555907a0b5c32df0feb35401187aed60a9191d74 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4947b72fed037ade3365da050a9be5c063e605a7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe9732d4b1e7d3789004ff029f032ba3034db059c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x556c3cbdca77a7f21afe15b17e644e0e98e64df4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x81f8f0bb1cb2a06649e51913a151f0e7ef6fa321 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe69ccaaaea33ebfe5b76e0dd373cd9a1a31fd410 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9aab071b4129b083b01cb5a0cb513ce7eca26fa5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5ff0d2de4cd862149c6672c99b7edf3b092667a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x96a5399d07896f757bd4c6ef56461f58db951862 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x0d5105ec5bbbf17dba7a87e1aed2c2c15394a9e2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x00000000ea00f3f4000e7ed5ed91965b19f1009b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x5117f4ad0bc70dbb3b05bf39a1ec1ee40dd67654 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x4be87c766a7ce11d5cc864b6c3abb7457dcc4cc9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x16a500aec6c37f84447ef04e66c57cfc6254cf92 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x9f6abbf0ba6b5bfa27f4deb6597cc6ec20573fda - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x5465145a47260d5e715733997333a175d97285bb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x93890f346c5d02c3863a06657bc72555dc72c527 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x1d1498166ddceee616a6d99868e1e0677300056f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x1d734a02ef1e1f5886e66b0673b71af5b53ffa94 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x4c3bf0a3de9524af68327d1d2558a3b70d17d42a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x36912b5cf63e509f18e53ac98b3012fa79e77bf5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x858c50c3af1913b0e849afdb74617388a1a5340d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x92dc4ab92eb16e781559e612f349916988013d5a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x548f93779fbc992010c07467cbaf329dd5f059b7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd1412d909f67b8db7505ddfcf26cf2303f4b1bb4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfb1aaba03c31ea98a3eec7591808acb1947ee7ac - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9562e2063122eaa4d7c2d786e7ca2610d70ca8b8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x699ec925118567b6475fe495327ba0a778234aaa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x37d299d9900209c3566254cfe59bfe6ff8f8c295 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x128f3e482f5bd5f08fe1b216e60ec0a6013deab9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x554fb3b6c1cf4a3cef49779ced321ca51c667d7d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8578a8716013c390b95db73065922f512783e2cf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf5809f3348ff40906bb509f936aba43e6d1961ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x11920f139a3121c2836e01551d43f95b3c31159c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x45940000009600102a1c002f0097c4a500fa00ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x4debfb9ed639144cf1e401674af361ffffcefb58 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x0cfc9a713a5c17bc8a5ff0379467f6558bacd0e0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0fd7a301b51d0a83fcaf6718628174d527b373b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1bc0c42215582d5a085795f4badbac3ff36d1bcb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3c4b6cd7874edc945797123fce2d9a871818524b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x64cb1bafc59bf93aeb90676885c63540cf4f4106 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xe8aae6251c6cf39927b0ff31399030c60bec798f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3d1d651761d535df881740ab50ba4bd8a2ec2c00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8216e8143902a8fe0b676006bc25eb23829c123d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xce7de646e7208a4ef112cb6ed5038fa6cc6b12e3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x947950bcc74888a40ffa2593c5798f11fc9124c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x9f9bb3d5af7cc774f9b6adf66e32859b5a998952 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xba41ddf06b7ffd89d1267b5a93bfef2424eb2003 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7a56e1c57c7475ccf742a1832b028f0456652f97 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x58d97b57bb95320f9a05dc918aef65434969c2b2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc785698504a70be37d0e939a4c5326f8eddd5beb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4955f6641bf9c8c163604c321f4b36e988698f75 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x473f4068073cd5b2ab0e4cc8e146f9edc6fb52cc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x16c22a91c705ec3c2d5945dbe2aca37924f1d2ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xac1d3d7a8878e655cbb063d58e453540641f4117 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb72e76ccf005313868db7b48070901a44629da98 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xa71e2738704e367798baa2755af5a10499634953 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x8697841b82c71fcbd9e58c15f6de68cd1c63fd02 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x7dff72693f6a4149b17e7c6314655f6a9f7c8b33 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x650af3c15af43dcb218406d30784416d64cfb6b2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x3c8b650257cfb5f272f799f5e2b4e65093a11a05 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe4feab21b42919c5c960ed2b4bdffc521e26881f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xc3ec80343d2bae2f8e680fdadde7c17e71e114ea - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x9c2c5fd7b07e95ee044ddeba0e97a665f142394f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0db510e79909666d6dec7f5e49370838c16d950f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x599f07567656e6961e20fa6a90685d393808c192 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4f9fd6be4a90f2620860d680c0d4d5fb53d1a825 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1185cb5122edad199bdbc0cbd7a0457e448f23c7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbaa5cc21fd487b8fcc2f632f3f4e8d37262a0842 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb488fcb23333e7baa28d1dfd7b69a5d3a8bfeb3a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2c8c89c442436cc6c0a77943e09c8daf49da3161 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x91ad1b44913cd1b8241a4ff1e2eaa198da6bf4c9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xa0a2e84f6f19c09a095d4a83ac8de5a32d303a13 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1db0c569ebb4a8b57ac01833b9792f526305e062 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8a638ea79f71f3b91bdc96bbdf9fb27c93013d60 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x731814e491571a2e9ee3c5b1f7f3b962ee8f4870 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2c002ffec41568d138acc36f5894d6156398d539 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x33d13d537609841ce6c42d6fd775dc33e3833411 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x11d41056ff636107dd710ec4ea772490a710cdb7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x2859e4544c4bb03966803b044a93563bd2d0dd4d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x77777feddddffc19ff86db637967013e6c6a116c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xfd418e42783382e86ae91e445406600ba144d162 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4f7d2d728ce137dd01ec63ef7b225805c7b54575 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2e44f3f609ff5aa4819b323fd74690f07c3607c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x19e1f2f837a3b90ebd0730cb6111189be0e1b6d6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd55210bb6898c021a19de1f58d27b71f095921ee - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x823556202e86763853b40e9cde725f412e294689 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4d1c297d39c5c1277964d0e3f8aa901493664530 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x864cb5194722d5a1596f4be8b899916d30dad8d8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x4a24b101728e07a52053c13fb4db2bcf490cabc3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x79ead7a012d97ed8deece279f9bc39e264d7eef9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xd566c529b33ecf15170f600d4b1ab12468c8efc6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x3b7e1ce09afe2bb3a23919afb65a38e627cfbe97 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xaa404804ba583c025fa64c9a276a6127ceb355c6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x1a3acf6d19267e2d3e7f898f42803e90c9219062 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6b2504a03ca4d43d0d73776f6ad46dab2f2a4cfd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x98d59767cd1335071a4e9b9d3482685c915131e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x354d6890caa31a5e28b6059d46781f40880786a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x30121d81f4407474a6d93f5c3060f14aaa098a61 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x5d9c2457a10d455e0ad8e28e40cc28eacf27a06a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xac27fa800955849d6d17cc8952ba9dd6eaa66187 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xe2b1dc2d4a3b4e59fdf0c47b71a7a86391a8b35a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd2699f9fddc04d262a819808f561c153098c2408 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x23a96680ccde03bd4bdd9a3e9a0cb56a5d27f7c9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3c5fdf0ee37d62c774025599e3b692d027746e24 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf31e6d62bfc485857af2186eb3d8ee94b4379fed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xcf6bb5389c92bdda8a3747ddb454cb7a64626c63 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcf3c8be2e2c42331da80ef210e9b1b307c03d36a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x306227d964511a260d14563fbfa82aa75db404b2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc00e94cb662c3520282e6f5717214004a7f26888 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0c4785ee3ca8bf1fb90c772703210bd346aa3413 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe41d2489571d322189246dafa5ebde1f4699f498 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7fd4d7737597e7b4ee22acbf8d94362343ae0a79 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3567aa22cd3ab9aef23d7e18ee0d7cf16974d7e6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf107edabf59ba696e38de62ad5327415bd4d4236 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x06450dee7fd2fb8e39061434babcfc05599a6fb8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9cf0ed013e67db12ca3af8e7506fe401aa14dad6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x33333333fede34409fb7f67c6585047e1f653333 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xc760f9782f8cea5b06d862574464729537159966 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x1b7ad346b6ff2d196daa8e78aed86baa6d7e3b02 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xff733b2a3557a7ed6697007ab5d11b79fdd1b76b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x05f52cc483c50c2a7e25a13dac17d736fa50f259 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xafb755c5f2ea2aadbae693d3bf2dc2c35158dc04 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x101a023270368c0d50bffb62780f4afd4ea79c35 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x3562ddf1f5ce2c02ef109e9d5a72e2fdb702711d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x20d704099b62ada091028bcfc44445041ed16f09 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x161e113b8e9bbaefb846f73f31624f6f9607bd44 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xa6f774051dfb6b54869227fda2df9cb46f296c09 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x50ce4129ca261ccde4eb100c170843c2936bc11b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbdf317f9c153246c429f23f4093087164b145390 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x08c81699f9a357a9f0d04a09b353576ca328d60d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb33ff54b9f7242ef1593d2c9bcd8f9df46c77935 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x589864a9892b1a736ae70a91824ab4dc591fd8cd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd98832e8a59156acbee4744b9a94a9989a728f36 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x478e03d45716dda94f6dbc15a633b0d90c237e2f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2676e4e0e2eb58d9bdb5078358ff8a3a964cedf5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1c4cca7c5db003824208adda61bd749e55f463a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x749e5334752466cda899b302ed4176b8573dc877 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x63cb9a22cbc00bf9159429e9dede4b88c3dba8ce - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2f20cf3466f80a5f7f532fca553c8cbc9727fef6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2c24497d4086490e7ead87cc12597fb50c2e6ed6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4f81837c2f4a189a0b69370027cc2627d93785b4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x252d223d0550bc6c137b003d90bc74f5341a2818 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x72ff5742319ef07061836f5c924ac6d72c919080 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x2ab0e9e4ee70fff1fb9d67031e44f6410170d00e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x8c907e0a72c3d55627e853f4ec6a96b0c8771145 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xc748673057861a797275cd8a068abb95a902e8de - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x62d7c4e3566f7f4033fc8e01b4d8e9bbc01c0760 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x109ba5f0230b7b39e4a8ab56e7361db89fa0e108 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x82a605d6d9114f4ad6d5ee461027477eeed31e34 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0bb217e40f8a5cb79adf04e1aab60e5abd0dfc1e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf411903cbc70a74d22900a5de66a2dda66507255 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xdd3b11ef34cd511a2da159034a05fcb94d806686 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4ec1b60b96193a64acae44778e51f7bff2007831 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x78965b1c638a7ff408d1697a96d7b8e47bb7c75f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x60222751504796934bddee8218f9725f0c95d2c1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1ccb4b14a11e0f2994a7ecbbd4cc69632f4c7c76 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc7dcca0a3e69bd762c8db257f868f76be36c8514 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9cdf242ef7975d8c68d5c1f5b6905801699b1940 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xadd39272e83895e7d3f244f696b7a25635f34234 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0000000000c5dc95539589fbd24be07c6c14eca4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcab254f1a32343f11ab41fbde90ecb410cde348a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x95ed629b028cf6aadd1408bb988c6d1daabe4767 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa6c0c097741d55ecd9a3a7def3a8253fd022ceb9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd888a5460fffa4b14340dd9fe2710cbabd520659 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x683989afc948477fd38567f8327f501562c955ac - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x946fb08103b400d1c79e07acccdef5cfd26cd374 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7076de6ff1d91e00be7e92458089c833de99e22e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xadf7c35560035944e805d98ff17d58cde2449389 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x62b9c7356a2dc64a1969e19c23e4f579f9810aa7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd19b72e027cd66bde41d8f60a13740a26c4be8f3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x66a1e37c9b0eaddca17d3662d6c05f4decf3e110 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf477ac7719e2e659001455cdda0cc8f3ad10b604 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xe16e2548a576ad448fb014bbe85284d7f3542df5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x330bd769382cfc6d50175903434ccc8d206dcae5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xb08d8becab1bf76a9ce3d2d5fa946f65ec1d3e83 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x8b21e9b7daf2c4325bf3d18c1beb79a347fe902a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xd9a9b4d466747e1ebcb7aeb42784452f40452367 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x306fd3e7b169aa4ee19412323e1a5995b8c1a1f4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x9cb74c8032b007466865f060ad2c46145d45553d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x333333c465a19c85f85c6cfbed7b16b0b26e3333 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb9a5f238dc61eebe820060226c8143cd24624771 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc48cddc6f2650bdb13dcf6681f61ba07209b5299 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfb42da273158b0f642f59f2ba7cc1d5457481677 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6f35720b272bf23832852b13ae9888c706e1a379 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4498cd8ba045e00673402353f5a4347562707e7d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1035ae3f87a91084c6c5084d0615cc6121c5e228 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3639e6f4c224ebd1bf6373c3d97917d33e0492bb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8bfac1b375bf2894d6f12fb2eb48b1c1a7916789 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd27c288fd69f228e0c02f79e5ecadff962e05a2b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x62ff28a01abd2484adb18c61f78f30fb2e4a6fdb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x315b8c9a1123c10228d469551033440441b41f0b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1d008f50fb828ef9debbbeae1b71fffe929bf317 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xeec468333ccc16d4bf1cef497a56cf8c0aae4ca3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x20dd04c17afd5c9a8b3f2cdacaa8ee7907385bef - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x25e0a7767d03461eaf88b47cd9853722fe05dfd3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x22af33fe49fd1fa80c7149773dde5890d3c76f3b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbc1852f8940991d91bd2b09a5abb5e7b8092a16c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x06a63c498ef95ad1fa4fff841955e512b4b2198a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xeb6d78148f001f3aa2f588997c5e102e489ad341 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xa4dc5a82839a148ff172b5b8ba9d52e681fd2261 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xef22cb48b8483df6152e1423b19df5553bbd818b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf83759099dc88f75fc83de854c41e0d9e83ada9b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x844c03892863b0e3e00e805e41b34527044d5c72 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xc9de725a4be9ab74b136c29d4731d6bebd7122e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x59e69094398afbea632f8bd63033bdd2443a3be1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x15f9eb4b9beafa9db35341c5694c0b6573809808 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x29cbd0510eec0327992cd6006e63f9fa8e7f33b7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcb1592591996765ec0efc1f92599a19767ee5ffa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x26e550ac11b26f78a04489d5f20f24e3559f7dd9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x50327c6c5a14dcade707abad2e27eb517df87ab5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc575bd129848ce06a460a19466c30e1d0328f52c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x47000a7b27a75d44ffadfe9d0b97fa04d569b323 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2196b84eace74867b73fb003aff93c11fce1d47a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc4441c2be5d8fa8126822b9929ca0b81ea0de38e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x421b05cf5ce28cb7347e73e2278e84472f0e4a88 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcdbddbdefb0ee3ef03a89afcd714aa4ef310d567 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf4308b0263723b121056938c2172868e408079d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8cedb0680531d26e62abdbd0f4c5428b7fdc26d5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x49fb8ad7578148e17c3ef0c344ce23a66ed372c4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x40e3d1a4b2c47d9aa61261f5606136ef73e28042 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x60d95823f795f1972dbdbcd886955095e36e04cd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x761a3557184cbc07b7493da0661c41177b2f97fa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x64c5cba9a1bfbd2a5faf601d91beff2dcac2c974 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x02f92800f57bcd74066f5709f1daa1a4302df875 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x291a50e611035b6562a2374b8b44de70aa8d7896 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x999faf0af2ff109938eefe6a7bf91ca56f0d07e1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x1a5b0aaf478bf1fda7b934c76e7692d722982a6d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x680447595e8b7b3aa1b43beb9f6098c79ac2ab3f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xc1eb7689147c81ac840d4ff0d298489fc7986d52 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x60bf4e7cf16ff34513514b968483b54beff42a81 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x5df7abe3c51c01dcf6d1f1f9a0ab4dc3759869b9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xfe049f59963545bf5469f968e04c9646d6e2c2c5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc0041ef357b183448b235a8ea73ce4e4ec8c265f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x12e377989a87da0f9b9166f0f875c9069eaa776c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfc48314ad4ad5bd36a84e8307b86a68a01d95d9c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0521aaa7c96e25afee79fdd4f1bb48f008ae4eac - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7a5f5ccd46ebd7ac30615836d988ca3bd57412b3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x20ef84969f6d81ff74ae4591c331858b20ad82cd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4d70f1058b73198f12a76c193aef5db5dd75babd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9239e9f9e325e706ef8b89936ece9d48896abbe3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xca73ed1815e5915489570014e024b7ebe65de679 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x79dacb99a8698052a9898e81fdf883c29efb93cb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2f6c17fa9f9bc3600346ab4e48c0701e1d5962ae - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xba5e66fb16944da22a62ea4fd70ad02008744460 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2b0772bea2757624287ffc7feb92d03aeae6f12d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc841b4ead3f70be99472ffdb88e5c3c7af6a481a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf8f97a79a3fa77104fab4814e3ed93899777de0d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf0d7cb351589c4b1520bf8d31afc87f7fb839c85 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x511ef9ad5e645e533d15df605b4628e3d0d0ff53 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x625bb9bb04bdca51871ed6d07e2dd9034e914631 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x291a8da3c42b7d7f00349d6f1be3c823a2b3fca4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf09034487c84954d49ae04bf6817148ffc2edb83 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1e2093ab84768948c6176db5ad98c909ce97f368 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x64fcc3a02eeeba05ef701b7eed066c6ebd5d4e51 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc796e499cc8f599a2a8280825d8bda92f7a895e0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbdb0e1c40a76c5113a023d685b419b90b01e3d61 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x76c71f1703fbf19ffdcf3051e1e684cb9934510f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc655c331d1aa7f96c252f1f40ce13d80eac53504 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x85645b86243886b7c7c1da6288571f8bea6fc035 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x623cd3a3edf080057892aaf8d773bbb7a5c9b6e9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xab964f7b7b6391bd6c4e8512ef00d01f255d9c0d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6112b8714221bbd96ae0a0032a683e38b475d06c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc2eeca228ebac45c339cc5e522dd3a10638155f1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x018dd3a0dd7f213cc822076b3800816d3ce1ed86 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x446c9033e7516d820cc9a2ce2d0b7328b579406f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x73a15fed60bf67631dc6cd7bc5b6e8da8190acf5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4448726b23483927c492f09c1dbfdffd3967b452 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xeeacc51af745846ddf46012b46c6910ea9b12898 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x25931894a86d47441213199621f1f2994e1c39aa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1a4e7febd24b6689704b10685857d8b30885f05e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8248270620aa532e4d64316017be5e873e37cc09 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xca7af58da871736994ce360f51ec6cd28351a3df - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xca4f53e6117623992126a9a45ce61682fe8678df - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x79bbf4508b1391af3a0f4b30bb5fc4aa9ab0e07c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xd2a530170d71a9cfe1651fb468e2b98f7ed7456b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xbf7970d56a150cd0b60bd08388a4a75a27777777 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xb87904db461005fc716a6bf9f2d451c33b10b80b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x708383ae0e80e75377d664e4d6344404dede119a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x2c89bbc92bd86f8075d1decc58c7f4e0107f286b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x288f4eb27400fa220d14b864259ad1b7f77c1594 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2d57c47bc5d2432feeedf2c9150162a9862d3ccf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x91da780bc7f4b7cf19abe90411a2a296ec5ff787 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb89d354ad1b0d95a48b3de4607f75a8cd710c1ba - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x79bbf4508b1391af3a0f4b30bb5fc4aa9ab0e07c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6263ad921e11ab47ae85f1daa725b8b3581baed3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x57edc3f1fd42c0d48230e964b1c5184b9c89b2ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xa608512bbc9934e4b1ddecf0f5fb38b6ad93308d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9e6a46f294bb67c20f1d1e7afb0bbef614403b55 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x767a739d1a152639e9ea1d8c1bd55fdc5b217d7f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfbecd19292b1effeaa7b2e61f5101ddb6744a1fb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf04d220b8136e2d3d4be08081dbb565c3c302ffd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xce1eab31756a48915b7e7bb79c589835aac6242d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd1d7aa941c71fd95e9d31bbd81937b3e71bd6231 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x53ae20d42e16626dc41c7842d9ce876358082370 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x5ab3d4c385b400f3abb49e80de2faf6a88a7b691 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc438b0c0e80a8fa1b36898d1b36a3fc2ec371c54 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbe35071605277d8be5a52c84a66ab1bc855a758d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa2cd3d43c775978a96bdbf12d733d5a1ed94fb18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb6aaa0efdfac186652e3b31a6f07a9a74d1b5a75 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6b0b3a982b4634ac68dd83a4dbf02311ce324181 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x32f4768fc4a238a58fc9da408d9a0da4333012e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x0721b3c9f19cfef1d622c918dcd431960f35e060 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x0caadd427a6feb5b5fc1137eb05aa7ddd9c08ce9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x77b7787a09818502305c95d68a2571f090abb135 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x9f07f8a82cb1af1466252e505b7b7ddee103bc91 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xdb298285fe4c5410b05390ca80e8fbe9de1f259b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x4cfe63294dac27ce941d42a778a37f2b35fea21b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xdf7837de1f2fa4631d716cf2502f8b230f1dcc32 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xce899f26928a2b21c6a2fddd393ef37c61dba918 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x21e00ff5374a0b803e0dc13a72800aca95b4b09e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xe4a7b54c0a30da69c04dc54b89868c185ff382bc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf857b2764095b9a5f57c3e71f82f297fe4e45334 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9c632e6aaa3ea73f91554f8a3cb2ed2f29605e0c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x097b1b242d3ed90e191c5f83a62f41abe16f6ceb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x504a26cf29674bc77a9341e73f88ccecc864034c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0c1dc73159e30c4b06170f2593d3118968a0dca5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x42e07fa3d31190731368ca2f88d12d80139dca42 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3a46ed8fceb6ef1ada2e4600a522ae7e24d2ed18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4b361e60cf256b926ba15f157d69cac9cd037426 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xdd3acdbdc7b358df453a6cb6bca56c92aa5743aa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x78ec15c5fd8efc5e924e9eebb9e549e29c785867 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x164ffdae2fe3891714bc2968f1875ca4fa1079d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x98f4779fccb177a6d856dd1dfd78cd15b7cd2af5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xabe8e5cabe24cb36df9540088fd7ce1175b9bc52 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x80a78a9b6b1272fdb612b39181bf113706024875 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7da2641000cbb407c329310c461b2cb9c70c3046 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xfeac2eae96899709a43e252b6b92971d32f9c0f9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0f51bb10119727a7e5ea3538074fb341f56b09ad - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x15700b564ca08d9439c58ca5053166e8317aa138 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x59a529070fbb61e6d6c91f952ccb7f35c34cf8aa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1010107b4757c915bc2f1ecd08c85d1bb0be92e0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3845badade8e6dff049820680d1f14bd3903a5d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6f365eb3686ee95bdefbae71f1728d62c0af7ab1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x85f17cf997934a597031b2e18a9ab6ebd4b9f6a4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcc4304a31d09258b0029ea7fe63d032f52e44efe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1196c6704789620514fd25632abe15f69a50bc4f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7475fa4c36344f1d633964f02564f37162299194 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x543ba622733bc9a7bfadd1d07b6c35ae1f9659d9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x20fd4c5396f7d9686f9997e0f10991957f7112fc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0b3ae50babe7ffa4e1a50569cee6bdefd4ccaee0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf1bb41f9ed87e6c7e1f70e921b7b4bee1df7ae9c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x97ad75064b20fb2b2447fed4fa953bf7f007a706 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xad0d1436dd45dbd6d8e50ac82240b72f52d7ea89 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa0ef786bf476fe0810408caba05e536ac800ff86 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb5130f4767ab0acc579f25a76e8f9e977cb3f948 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbb0e17ef65f82ab018d8edd776e8dd940327b28b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8a60e489004ca22d775c5f2c657598278d17d9c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4c1746a800d224393fe2470c70a35717ed4ea5f1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf34960d9d60be18cc1d5afc1a6f012a723a28811 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9be89d2a4cd102d8fecc6bf9da793be995c22541 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4eddb15a0abfa2c349e8065af9214e942d9a6d36 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x37a645648df29205c6261289983fb04ecd70b4b3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x1cd9a56c8c2ea913c70319a44da75e99255aa46f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x6b43732a9ae9f8654d496c0a075aa4aa43057a0b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xfea7a6a0b346362bf88a9e4a88416b77a57d6c2a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x6d7187220f769bde541ff51dd37ee07416f861d2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x2f3e306d9f02ee8e8850f9040404918d0b345207 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xecdcb5b88f8e3c15f95c720c51c71c9e2080525d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xa1832f7f4e534ae557f9b5ab76de54b1873e498b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x514d8e8099286a13486ef6c525c120f51c239b52 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4837b18a6d7af6159c8665505b90a2ed393255e0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6bfdb6f4e65ead27118592a41eb927cea6956198 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd7efb00d12c2c13131fd319336fdf952525da2af - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf1a7000000950c7ad8aff13118bb7ab561a448ee - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x56cfc19d8cbf7d417d370844249be9cb2d2e19a1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x65c101e95d7dd475c7966330fa1a803205ff92ab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x0c5fa0e07949f941a6c2c29a008252db1527d6ee - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xfdb794692724153d1488ccdbe0c56c252596735f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xf7e78d9c4c74df889a83c8c8d6d05bf70ff75876 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x8fa62d23fb6359c1e1685dbfa9b63ef27ecdb612 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf1a7000000950c7ad8aff13118bb7ab561a448ee - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xacfe6019ed1a7dc6f7b508c02d1b04ec88cc21bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9704d2adbc02c085ff526a37ac64872027ac8a50 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3bf9a2a798c9b122747344da0276d30a267a80dc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x64baa63f3eedf9661f736d8e4d42c6f8aa0cda71 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xbe0d3526fc797583dada3f30bc390013062a048b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xf5d8015d625be6f59b8073c8189bd51ba28792e1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0ff6ffcfda92c53f615a4a75d982f399c989366b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x841a3083074b1a40b644bf2ba2491a731b6da277 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb01dd87b29d187f3e3a4bf6cdaebfb97f3d9ab98 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x667102bd3413bfeaa3dffb48fa8288819e480a88 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3073f7aaa4db83f95e9fff17424f71d4751a3073 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x32b86b99441480a7e5bd3a26c124ec2373e3f015 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbf2e353f5db1a01e4e7f051222c666afc81b2574 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x960fce8724aa127184b6d13af41a711755236c77 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9ea59db651a3c79a8d52a394a49da8e9a214d6ae - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x95987b0cdc7f65d989a30b3b7132a38388c548eb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x707f635951193ddafbb40971a0fcaab8a6415160 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xcafcd85d8ca7ad1e1c6f82f651fa15e33aefd07b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xdd1ddd4d978ac0baef4bfa9c7e91853bfce90f11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x2ab445c24c96db13383bb34678adae50c43b4baa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xc157ee77518769b8009642f68a8d6a500ff59d53 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x90ec58ef4cc9f37b96de1e203b65bd4e6e79580e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd47f3e45b23b7594f5d5e1ccfde63237c60be49e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb3b32f9f8827d4634fe7d973fa1034ec9fddb3b3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd758916365b361cf833bb9c4c465ecd501ddd984 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbc7755a153e852cf76cccddb4c2e7c368f6259d8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb5130f4767ab0acc579f25a76e8f9e977cb3f948 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x39d5313c3750140e5042887413ba8aa6145a9bd2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x86bb94ddd16efc8bc58e6b056e8df71d9e666429 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xa4c3497b57c8b6d510f3707a1e9694fd791f45fb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x1f3af095cda17d63cad238358837321e95fc5915 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x0688977ae5b10075f46519063fd2f03adc052c1f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xccb365d2e11ae4d6d74715c680f56cf58bf4bf10 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x643c4e15d7d62ad0abec4a9bd4b001aa3ef52d66 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8e729198d1c59b82bd6bba579310c40d740a11c2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd4fe6e1e37dfcf35e9eeb54d4cca149d1c10239f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xaeac3b55c3522157ecda7ec8fcb86c832faa28af - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x46777c76dbbe40fabb2aab99e33ce20058e76c59 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xa78d8321b20c4ef90ecd72f2588aa985a4bdb684 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xaef5bbcbfa438519a5ea80b4c7181b4e78d419f2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x82e64f49ed5ec1bc6e43dad4fc8af9bb3a2312ee - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x484c2d6e3cdd945a8b2df735e079178c1036578c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x46777c76dbbe40fabb2aab99e33ce20058e76c59 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x1e925de1c68ef83bd98ee3e130ef14a50309c01b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x300211def2a644b036a9bdd3e58159bb2074d388 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x98d0baa52b2d063e780de12f615f963fe8537553 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x67543cf0304c19ca62ac95ba82fd4f4b40788dc1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x938171227ece879267122a36847b219cbd3b9d47 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6967f0974d76d34e140cae27efea32cdf546b58e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4b12507e171970b3acd48edfeb5bd1c676e61280 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb4d4ff3fcbd6965962a79229aa94631d394217cb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xeb476e9ab6b1655860b3f40100678d0c1cedb321 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xd5eaaac47bd1993d661bc087e15dfb079a7f3c19 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x6d5ad1592ed9d6d1df9b93c793ab759573ed6714 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xa18bbdcd86e4178d10ecd9316667cfe4c4aa8717 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xf78d2e7936f5fe18308a3b2951a93b6c4a41f5e2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7ff7fa94b8b66ef313f7970d4eebd2cb3103a2c0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x40e3eddf6d253bb734381a309437428f121c594b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x56072c95faa701256059aa122697b133aded9279 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x881ba05de1e78f549cc63a8f6cabb1d4ad32250d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6c3ea9036406852006290770bedfcaba0e23a0e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6fb3e0a217407efff7ca062d46c26e5d60a14d69 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd89cc9d79ad3c49e2cd477a8bbc8e63dee53f82e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x9d0bfe46891573c12021942c7d28f15ebb641988 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x46777c76dbbe40fabb2aab99e33ce20058e76c59 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1f1c695f6b4a3f8b05f2492cef9474afb6d6ad69 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3c8cd0db9a01efa063a7760267b822a129bc7dca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x060cb087a9730e13aa191f31a6d86bff8dfcdcc0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbf1aea8670d2528e08334083616dd9c5f3b087ae - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9b8df6e244526ab5f6e6400d331db28c8fdddb55 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4b6104755afb5da4581b81c552da3a25608c73b8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x12b4356c65340fb02cdff01293f95febb1512f3b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x08e8ac8c4bca64503f774d2c40c911e8a3ffcc12 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x47a1eb0b825b73e6a14807beaecafef199d5477c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x103071da56e7cd95b415320760d6a0ddc4da1ca5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc43c6bfeda065fe2c4c11765bf838789bd0bb5de - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5732046a883704404f284ce41ffadd5b007fd668 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8292bb45bf1ee4d140127049757c2e0ff06317ed - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2d8ea194902bc55431420bd26be92b0782dce91d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xd1f9c58e33933a993a3891f8acfe05a68e1afc05 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x17d70172c7c4205bd39ce80f7f0ee660b7dc5a23 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x624e2e7fdc8903165f64891672267ab0fcb98831 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbf388570ebd5b88bfc7cd21ec469813c15f453a3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x44551ca46fa5592bb572e20043f7c3d54c85cad7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2133031f5acbc493572c02f271186f241cd8d6a5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xcb6ab91007fe165c81b1e672007361cce9995fd1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb4fde59a779991bfb6a52253b51947828b982be3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x09be1692ca16e06f536f0038ff11d1da8524adb1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc0634090f2fe6c6d75e61be2b949464abb498973 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd51827754a56860f04acd1d2699b049b026a5925 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xa2e3356610840701bdf5611a53974510ae27e2e1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x944824290cc12f31ae18ef51216a223ba4063092 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x10dea67478c5f8c5e2d90e5e9b26dbe60c54d800 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2f42b7d686ca3effc69778b6ed8493a7787b4d6e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc669928185dbce49d2230cc9b0979be6dc797957 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5485a469faea1492191cfce7528ab6e58135aa4d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8e0e57dcb1ce8d9091df38ec1bfc3b224529754a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1151cb3d861920e07a38e03eead12c32178567f6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0305f515fa978cf87226cf8a9776d25bcfb2cc0b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x88800092ff476844f74dc2fc427974bbee2794ae - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe76c6c83af64e4c60245d8c7de953df673a7a33d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x90685e300a4c4532efcefe91202dfe1dfd572f47 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa849eaae994fb86afa73382e9bd88c2b6b18dc71 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbb2a93afcf5d3af8ae28dd50d6c18556ea532c5a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbad6c59d72d44512616f25b3d160c79db5a69ddf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4604151d4c98d1eea200b0d6bffb79a2613182aa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa93d86af16fe83f064e3c0e2f3d129f7b7b002b0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x419c4db4b9e25d6db2ad9691ccb832c8d9fda05e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x004e9c3ef86bc1ca1f0bb5c7662861ee93350568 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x68749665ff8d2d112fa859aa293f07a622782f38 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4da27a545c0c5b758a6ba100e3a049001de870f5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x820802fa8a99901f52e39acd21177b0be6ee2974 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3ec2156d4c0a9cbdab4a016633b7bcf6a8d68ea2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x937a1cfaf0a3d9f5dc4d0927f72ee5e3e5f82a00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2e2cc4dfce60257f091980631e75f5c436b71c87 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x65553f5c85c78b977668cec098ec09475099aa61 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x04175b1f982b8c8444f238ac0aae59f029e21099 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1c93d155bd388241f9ab5df500d69eb529ce9583 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x45d9c101a3870ca5024582fd788f4e1e8f7971c3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1986cc18d8ec757447254310d2604f85741aa732 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb3621cd34803cf7065dcb0d5bfb0f56c1834a063 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x570b1533f6daa82814b25b62b5c7c4c55eb83947 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x43c5034469bce262d32f64c5e7f9f359f5b1495f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbdf43ecadc5cef51b7d1772f722e40596bc1788b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x80ac24aa929eaf5013f6436cda2a7ba190f5cc0b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9813037ee2218799597d83d4a5b6f3b6778218d9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x88909d489678dd17aa6d9609f89b0419bf78fd9a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4274cd7277c7bb0806bd5fe84b9adae466a8da0a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa0246c9032bc3a600820415ae600c6388619a14d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xed04915c23f00a313a544955524eb7dbd823143d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xaf7e3f16d747e77e927dc94287f86eb95a64d83d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x290f057a2c59b95d8027aa4abf31782676502071 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x46777c76dbbe40fabb2aab99e33ce20058e76c59 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9e12735d77c72c5c3670636d428f2f3815d8a4cb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6bb7a212910682dcfdbd5bcbb3e28fb4e8da10ee - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf2e244d4020c182e8e2c936d4055e3f0e578064f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xe3cf8dbcbdc9b220ddead0bd6342e245daff934d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xebcda5b80f62dd4dd2a96357b42bb6facbf30267 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xdc06717f367e57a16e06cce0c4761604460da8fc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xd5369a3cac0f4448a9a96bb98af9c887c92fc37b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x3199a64bc8aabdfd9a3937a346cc59c3d81d8a9a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xff7d6a96ae471bbcd7713af9cb1feeb16cf56b41 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/NATIVE - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/NATIVE - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/NATIVE - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x0000000000000000000000000000000000001010 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/NATIVE - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/unichain/NATIVE - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/NATIVE - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x68037790a0229e9ce6eaa8a99ea92964106c4703 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x28d38df637db75533bd3f71426f3410a82041544 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/avalanche/NATIVE - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/avalanche/0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/avalanche/0x49d5c2bdffac6ce2bfdb6640f4f80f226bc10bab - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x437cc33344a0b27a429f795ff6b469c72698b291 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x30c7235866872213f68cb1f08c37cb9eccb93452 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xdc035d45d973e3ec169d2276ddab16f1e407384f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/unichain/0x078d782b760474a361dda0af3839290b0ef57ad6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/unichain/0x9151434b16b9763660705744891fa906f660ecc5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xdb99b0477574ac0b2d9c8cec56b42277da3fdb82 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd769d56f479e9e72a77bb1523e866a33098feec5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/unichain/0x927b51f251480a681271180da4de28d44ec4afb8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/unichain/0xc02fe7317d4eb8753a02c35fe019786854a92001 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/unichain/0x7dcc39b4d1c53cb31e1abc0e358b43987fef80f7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/unichain/0x2416092f143378750bb29b79ed961ab195cceea5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xfa2b947eec368f42195f24f36d2af29f7c24cec2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/unichain/0xc3eacf0612346366db554c991d7858716db09f58 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x85e90a5430af45776548adb82ee4cd9e33b08077 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xef4461891dfb3ac8572ccf7c794664a8dd927945 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0f81001ef0a83ecce5ccebf63eb302c70a39a654 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1111111111166b7fe7bd91427724b487980afc69 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/unichain/0x8f187aa05619a017077f5308904739877ce9ea21 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/avalanche/0x152b9d0fdc40c096757f570a51e494bd4b943e50 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x5a70be406ce7471a44f0183b8d7091f4ad751db5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbc396689893d065f41bc2c6ecbee5e0085233447 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7eb4db4dddb16a329c5ade17a8a0178331267e28 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/worldchain/NATIVE - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/worldchain/0x79a02482a880bce3f13e09da970dc34db4cd24d1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf816507e690f5aa4e29d164885eb5fa7a5627860 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd3f68c6e8aee820569d58adf8d85d94489315192 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4d0528598f916fd1d8dc80e5f54a8feedcfd4b18 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xa0c56a8c0692bd10b3fa8f8ba79cf5332b7107f9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8d0d000ee44948fc98c9b98a4fa4921476f08b0d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xecca809227d43b895754382f1fd871628d7e51fb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x8d0d000ee44948fc98c9b98a4fa4921476f08b0d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9cb41fd9dc6891bae8187029461bfaadf6cc0c69 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/worldchain/0x2cfc85d8e48f8eab294be644d9e25c3030863003 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xe6df05ce8c8301223373cf5b969afcb1498c5528 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/unichain/0x0555e30da8f98308edb960aa94c0db47230d2b9c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4d4574f50dd8b9dbe623cf329dcc78d76935e610 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7d6fcb3327d7e17095fa8b0e3513ac7a3564f5e1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7300b37dfdfab110d83290a29dfb31b1740219fe - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbf8566956b4e2d8beb90c4c19dbb8c67a9290c36 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x87d00066cf131ff54b72b134a217d5401e5392b6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xdac991621fd8048d9f235324780abd6c3ad26421 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xe50e3d1a46070444f44df911359033f2937fcc13 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa776a95223c500e81cb0937b291140ff550ac3e4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4f1aac70b303818ddd0823570af3bb46681d9bd8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x95034f653d5d161890836ad2b6b8cc49d14e029a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x3f160760535eb715d5809a26cf55408a2d9844c1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xde04da55b74435d7b9f2c5c62d9f1b53929b09aa - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x595e21b20e78674f8a64c1566a20b2b316bc3511 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe6f98920852a360497dbcc8ec895f1bb1f7c8df4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xd6b48ccf41a62eb3891e58d0f006b19b01d50cca - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x926759a8eaecfadb5d8bdc7a9c7b193c5085f507 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xd86e6ef14b96d942ef0abf0720c549197ea8c528 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x30c60b20c25b2810ca524810467a0c342294fc61 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6444c6c2d527d85ea97032da9a7504d6d1448ecf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0f7dc5d02cc1e1f5ee47854d534d332a1081ccc8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x3fefe29da25bea166fb5f6ade7b5976d2b0e586b - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xc9ccbd76c2353e593cc975f13295e8289d04d3bb - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x39702843a6733932ec7ce0dde404e5a6dbd8c989 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x4fa7c69a7b69f8bc48233024d546bc299d6b03bf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xe0cd4cacddcbf4f36e845407ce53e87717b6601d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe0b7ad7f8f26e2b00c8b47b5df370f15f90fcf48 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/avalanche/0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6a72d3a87f97a0fee2c2ee4233bdaebc32813d7a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe868084cf08f3c3db11f4b73a95473762d9463f7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xb035723d62e0e2ea7499d76355c9d560f13ba404 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xad8c787992428cd158e451aab109f724b6bc36de - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc20059e0317de91738d13af027dfc4a50781b066 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xf39e4b21c84e737df08e2c3b32541d856f508e48 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x30a538effd91acefb1b12ce9bc0074ed18c9dfc9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x95af4af910c28e8ece4512bfe46f1f33687424ce - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9ab778f84b2397c7015f7e83d12eee47d4c26694 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x45e02bc2875a2914c4f585bbf92a6f28bc07cb70 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcab84bc21f9092167fcfe0ea60f5ce053ab39a1e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2f299be3b081e8cd47dc56c1932fcae7a91b5dcd - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x5f5668d7c748fc1a17540c3a7f9245d8cea10c29 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf9902edfca4f49dcaebc335c73aebd82c79c2886 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc96de26018a54d51c097160568752c4e3bd6c364 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x0e7779e698052f8fe56c415c3818fcf89de9ac6d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3e05284ff11a92d66e44b6b3ea70533729670257 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6b785a0322126826d8226d77e173d75dafb84d11 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x226a2fa2556c48245e57cd1cba4c6c9e67077dd2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x1d58e204ca59328007469a614522903d69dc0a4c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xea87148a703adc0de89db2ac2b6b381093ae8ee0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcaa1e525acb44aec4e0d17a0e2467aa3ea7ee3a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xa4a2e2ca3fbfe21aed83471d28b6f65a233c6e00 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/celo/0xd221812de1bd094f35587ee8e174b07b6167d9af - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7b10d50b5885be4c7985a88408265c109bd1eec8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4a0aaf171446dda0ed95295c46820e2015a28b07 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x00c83aecc790e8a4453e5dd3b0b4b3680501a7a7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/unichain/0x07f1508a8fe276fb96b9fcf80ace41eb2abddf81 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6555255b8ded3c538cb398d9e36769f45d7d3ea7 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc299004a310303d1c0005cb14c70ccc02863924d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xe3225e11cab122f1a126a28997788e5230838ab9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x10ee9f68ee4e4d311e854ae14c53f5b25a917f85 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xaccfd598ef801178ed6c816c234b16ec51ae9f32 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x1aecab957bad4c6e36dd29c3d3bb470c4c29768a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x75231f58b43240c9718dd58b4967c5114342a86c - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x61fac5f038515572d6f42d4bcb6b581642753d50 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd5c3a723e63a0ecab81081c26c6a3c4b2634bf85 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xf8f331dfa811132c43c308757cd802ca982b7211 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x2c3a8ee94ddd97244a93bc48298f97d2c412f7db - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x642ee4b1f054da33bc6003ad0278f9a27478caf5 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xb994882a1b9bd98a71dd6ea5f61577c42848b0e8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xda5e1988097297dcdc1f90d4dfe7909e847cbef6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xdac32deb60c817ee1cd8fc2bb2a7cda2ce1732d0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xd955c9ba56fb1ab30e34766e252a97ccce3d31a6 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/unichain/0x89824f7609107efe6f8088cd89a620c8edbeed6e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xa9616e5e23ec1582c2828b025becf3ef610e266f - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/unichain/0xbde8a5331e8ac4831cf8ea9e42e229219eafab97 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x000ae314e2a2172a039b26378814c252734f556a - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb4c6fedd984bc983b1a758d0875f1ea34f81a6af - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc50673edb3a7b94e8cad8a7d4e0cd68864e33edf - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2fd23a21c52fff0535328a7177da1fb31b8a819e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/unichain/0x15d0e0c55a3e7ee67152ad7e89acf164253ff68d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x11dc28d01984079b7efe7763b533e6ed9e3722b9 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1789e0043623282d5dcc7f213d703c6d8bafbb04 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xfa35e2250e376c23955247383dc32c79082e7fcc - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/native - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/native - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/native - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/unichain/native - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/avalanche/native - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x405fbc9004d857903bfd6b3357792d71a50726b0 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/optimism/native - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/native - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x696f9436b67233384889472cd7cd58a6fb5df4f1 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/worldchain/native - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x8dedf84656fa932157e27c060d8613824e7979e3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xacf5a368ec5bb9e804c8ac0b508daa5a21c92e13 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xa64a1b5b0a5ce578a8c6bca10cbe36d83713d170 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/avalanche/0x211cc4dd073734da055fbf44a2b4667d5e5fe5d2 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x0a1a1a107e45b7ced86833863f482bc5f4ed82ef - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x52a8845df664d76c69d2eea607cd793565af42b8 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9c4315eb7ba91b7bdc1727ad5f76ea4ac8875506 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/AzVCECC5zr21ikYQne4Xtoh3SVg848duPHUHb3M7bonk - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/8avjtjHAHFqp4g2RR9ALAGBpSTqKPZR8nRbzSTwZERA - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/8ZHE4ow1a2jjxuoMfyExuNamQNALv5ekZhsBn5nMDf5e - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/native - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/HUSTLFV3U5Km8u66rMQExh4nLy7unfKHedEXVK1WgSAG - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/3uXACfojUrya7VH51jVC1DCHq3uzK4A7g469Q954LABS - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/4NGbC4RRrUjS78ooSN53Up7gSg4dGrj6F6dxpMWHbonk - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/goodX4LG92UAcRdFRUykfP2fAfzQAVttrToEPxtxSkp - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/7kN5FQMD8ja4bzysEgc5FXmryKd6gCgjiWnhksjHCFb3 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/HeLp6NuQkmYB4pYWo2zYs22mESHXPQYzXbB8n4V98jwC - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/27G8MtK7VtTcCHkpASjSDdkWWYfoqT6ggEuKidVJidD4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/FViMp5phQH2bX81S7Yyn1yXjj3BRddFBNcMCbTH8FCze - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/QdyjMr627PR7NtWdcEcgFmDm5haBVUWEcj4jdM4boop - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/Dz9mQ9NzkBcCsuGPFJ3r1bS4wgqKMHBPiVuniW8Mbonk - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/cbbtcf3aa214zXHbiAZQwf4122FBYbraNdFqgw4iMij - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/3xypwTgs9nWgjc6nUBiHmMb36t2PwL3SwCZkEQvW8FTX - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xaca92e438df0b2401ff60da7e4337b687a2435da - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/USD1ttGY1N17NEEHLmELoaybftRBUSErhqYiQzvEmuB - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/KMNo3nJsBXfcpJTVhZcXLW7RmTwTt4GVFE7suUBo9sS - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/2u1tszSeqZ3qBWF3uNGPFc8TzMk2tdiwknnRMWGWjGWH - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/UwU8RVXB69Y6Dcju6cN2Qef6fykkq6UUNpB15rZku6Z - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/AvZZF1YaZDziPY2RCK4oJrRVrbN3mTD9NL24hPeaZeUj - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/HzwqbKZw8HxMN6bF2yFZNrht3c2iXXzpKcFu7uBEDKtr - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/9tqjeRS1swj36Ee5C1iGiwAxjQJNGAVCzaTLwFY8bonk - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/CASHx9KJUStyftLFWGvEVf59SGeG9sh5FfcnZMVPCASH - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/5oVNBeEEQvYi1cX3ir8Dx5n1P7pdxydbGF2X4TxVusJm - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/76rTxzztXjJe7AUaBi7jQ5J61MFgpQgB4Cc934sWbonk - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa37f4d2dc3d3c136b68fcf52be3afa09d4dfc38d - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xfab99fcf605fd8f4593edb70a43ba56542777777 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8a910ea80fc09d5b5a2120521a39b67980df0bc4 - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/jupSoLaHXQiZZTSfEWMTRRgpnyFm8f6sZdosWBjx93v - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/Ey59PH7Z4BFU4HjyKnyMdWt5GGN76KazTAwQihoUXRnk - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/CARDSccUMFKoPRZxt5vt3ksUbxEFEcnZ3H2pd3dKxYjp - 2025-10-17T22:04:33.647Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/METvsvVRapdj9cFLzq4Tr43xK4tAjQfwX76z3n6mWQL - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/Dfh5DzRgSvvCFDoYc2ciTkMrbDfRKybA4SoFbPmApump - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x815269d17c10f0f3df7249370e0c1b9efe781aa8 - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/SarosY6Vscao718M4A778z4CGtvcwcGef5M9MEH1LGL - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0x93d6afa0e6f11f4f7e9521ec6243f839526af7a6 - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x4c9027e10c5271efca82379d3123917ae3f2374e - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/USDSwr9ApdHk5bvJKMjzff41FfuX8bSxdKcR81vTwcA - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/SW1TCHLmRGTfW5xZknqQdpdarB8PD95sJYWpNp9TbFx - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/3wPQhXYqy861Nhoc4bahtpf7G3e89XCLfZ67ptEfZUSA - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/base/0xdcaa5e062b2be18e52ea6ed7ba232538621ddc10 - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/METAwkXcqyXKy1AtsSgJ8JiUHwGCafnZL38n3vYmeta - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/6nR8wBnfsmXfcdDr1hovJKjvFQxNSidN6XFyfAFZpump - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/AjPzK6Sf1G27jFkFe4HViSNqMxa3JLE4D1fm6Pzouq2q - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x0a8d6c86e1bce73fe4d0bd531e1a567306836ea5 - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/solana/pSo1f9nQXWgXibFtKf7NWYxb5enAM4qfP6UJSiXRQfL - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf245964bd0a73128e10c4f7c96d0664ea2e436d8 - 2025-10-24T19:06:27.459Z + 2025-10-31T19:27:21.343Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/DUSDt4AeLZHWYmcXnVGYdgAzjtzU5mXUVnTMdnSzAttM + 2025-10-31T19:27:21.343Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/BLVxek8YMXUQhcKmMvrFTrzh5FXg8ec88Crp6otEaCMf + 2025-10-31T19:27:21.343Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/6FrrzDk5mQARGc1TDYoyVnSyRdds1t4PbtohCD6p3tgG + 2025-10-31T19:27:21.343Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/JDzPbXboQYWVmdxXS3LbvjM52RtsV1QaSv2AzoCiai2o + 2025-10-31T19:27:21.343Z + 0.8 + + + https://app.uniswap.org/explore/tokens/base/0xd85c31854c2b0fb40aaa9e2fc4da23c21f829d46 + 2025-10-31T19:27:21.343Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/8x5VqbHA8D7NkD52uNuS5nnt3PwA8pLD34ymskeSo2Wn + 2025-10-31T19:27:21.343Z + 0.8 + + + https://app.uniswap.org/explore/tokens/ethereum/0x007d0267449e1f8fe8ce9d8b604abb2ce789f0ea + 2025-10-31T19:27:21.343Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R + 2025-10-31T19:27:21.343Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/BANKJmvhT8tiJRsBSS1n2HryMBPvT5Ze4HU95DUAmeta + 2025-10-31T19:27:21.343Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/5UUH9RTDiSpq6HKS6bp4NdU9PNJpXRXuiw6ShBTBhgH2 + 2025-10-31T19:27:21.343Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/LBTCgU4b3wsFKsPwBn1rRZDx5DoFutM6RPiEt1TPDsY + 2025-10-31T19:27:21.343Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump + 2025-10-31T19:27:21.343Z 0.8 \ No newline at end of file diff --git a/apps/web/src/components/AccountDrawer/ActionTile.tsx b/apps/web/src/components/AccountDrawer/ActionTile.tsx index cabbd3f44a3..72ce6a1764f 100644 --- a/apps/web/src/components/AccountDrawer/ActionTile.tsx +++ b/apps/web/src/components/AccountDrawer/ActionTile.tsx @@ -1,6 +1,6 @@ import { ReactNode } from 'react' import { SpinnerSVG } from 'theme/components/icons/spinner' -import { Flex, styled, Text, useSporeColors } from 'ui/src' +import { Flex, FlexProps, styled, Text, useSporeColors } from 'ui/src' const LoadingButtonSpinner = (props: React.ComponentPropsWithoutRef<'svg'>) => ( @@ -39,6 +39,16 @@ const Tile = styled(Flex, { }, }) +export type ActionTileProps = { + dataTestId: string + Icon: ReactNode + name: string + onClick: () => void + loading?: boolean + disabled?: boolean + padding?: FlexProps['p'] +} + export function ActionTile({ dataTestId, Icon, @@ -46,18 +56,12 @@ export function ActionTile({ onClick, loading, disabled, -}: { - dataTestId: string - Icon: ReactNode - name: string - onClick: () => void - loading?: boolean - disabled?: boolean -}) { + padding = '$spacing12', +}: ActionTileProps) { const { accent1 } = useSporeColors() return ( - + {loading ? : Icon} {name} diff --git a/apps/web/src/components/AccountDrawer/AuthenticatedHeader.tsx b/apps/web/src/components/AccountDrawer/AuthenticatedHeader.tsx index 72bdd2ef2ee..2173284ae1b 100644 --- a/apps/web/src/components/AccountDrawer/AuthenticatedHeader.tsx +++ b/apps/web/src/components/AccountDrawer/AuthenticatedHeader.tsx @@ -2,40 +2,35 @@ import { NetworkStatus } from '@apollo/client' import { CurrencyAmount, Token } from '@uniswap/sdk-core' import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { MultiBlockchainAddressDisplay } from 'components/AccountDetails/MultiBlockchainAddressDisplay' -import { ActionTile } from 'components/AccountDrawer/ActionTile' import { DisconnectButton } from 'components/AccountDrawer/DisconnectButton' import { DownloadGraduatedWalletCard } from 'components/AccountDrawer/DownloadGraduatedWalletCard' import { EmptyWallet } from 'components/AccountDrawer/MiniPortfolio/EmptyWallet' import { ExtensionDeeplinks } from 'components/AccountDrawer/MiniPortfolio/ExtensionDeeplinks' import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' import MiniPortfolio from 'components/AccountDrawer/MiniPortfolio/MiniPortfolio' -import { SendButtonTooltip } from 'components/AccountDrawer/SendButtonTooltip' +import MiniPortfolioV2 from 'components/AccountDrawer/MiniPortfolio/MiniPortfolioV2' +import { ReceiveActionTile } from 'components/ActionTiles/ReceiveActionTile' +import { SendActionTile } from 'components/ActionTiles/SendActionTile/SendActionTile' import { LimitedSupportBanner } from 'components/Banner/LimitedSupportBanner' import DelegationMismatchModal from 'components/delegation/DelegationMismatchModal' import { Settings } from 'components/Icons/Settings' -import { ReceiveModalState } from 'components/ReceiveCryptoModal/types' -import { useOpenReceiveCryptoModal } from 'components/ReceiveCryptoModal/useOpenReceiveCryptoModal' import StatusIcon from 'components/StatusIcon' import { useAccountsStore } from 'features/accounts/store/hooks' import { useIsUniswapExtensionConnected } from 'hooks/useIsUniswapExtensionConnected' import { useModalState } from 'hooks/useModalState' import { useTheme } from 'lib/styled-components' import { useState } from 'react' -import { Trans, useTranslation } from 'react-i18next' +import { useTranslation } from 'react-i18next' import { useUserHasAvailableClaim, useUserUnclaimedAmount } from 'state/claim/hooks' import { Button, Flex, IconButton } from 'ui/src' -import { ArrowDownCircleFilled } from 'ui/src/components/icons/ArrowDownCircleFilled' -import { SendAction } from 'ui/src/components/icons/SendAction' import { Shine } from 'ui/src/loading/Shine' import AnimatedNumber, { BALANCE_CHANGE_INDICATION_DURATION, } from 'uniswap/src/components/AnimatedNumber/AnimatedNumber' import { TestnetModeBanner } from 'uniswap/src/components/banners/TestnetModeBanner' import { RelativeChange } from 'uniswap/src/components/RelativeChange/RelativeChange' -import { useUniswapContext } from 'uniswap/src/contexts/UniswapContext' import { useConnectionStatus } from 'uniswap/src/features/accounts/store/hooks' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' -import { UniverseChainId } from 'uniswap/src/features/chains/types' import { usePortfolioTotalValue } from 'uniswap/src/features/dataApi/balances/balancesRest' import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' import { useAppFiatCurrency, useAppFiatCurrencyInfo } from 'uniswap/src/features/fiatCurrency/hooks' @@ -46,7 +41,6 @@ import { ModalName } from 'uniswap/src/features/telemetry/constants' import i18next from 'uniswap/src/i18n' import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { NumberType } from 'utilities/src/format/types' -import { useEvent } from 'utilities/src/react/hooks' export default function AuthenticatedHeader({ evmAddress, @@ -58,6 +52,7 @@ export default function AuthenticatedHeader({ openSettings: () => void }) { const { t } = useTranslation() + const isPortfolioPageEnabled = useFeatureFlag(FeatureFlags.PortfolioPage) const isSolanaConnected = useConnectionStatus(Platform.SVM).isConnected const multipleWalletsConnected = useAccountsStore((state) => { @@ -78,21 +73,6 @@ export default function AuthenticatedHeader({ const accountDrawer = useAccountDrawer() - const openReceiveCryptoModal = useOpenReceiveCryptoModal({ - modalState: ReceiveModalState.DEFAULT, - }) - - const { navigateToSendFlow } = useUniswapContext() - - const isSolanaOnlyWallet = Boolean(svmAddress && !evmAddress) - - const onPressSend = useEvent(() => { - if (!isSolanaOnlyWallet) { - navigateToSendFlow({ chainId: UniverseChainId.Mainnet }) - accountDrawer.close() - } - }) - const { data, networkStatus, loading } = usePortfolioTotalValue({ evmAddress, svmAddress, @@ -189,24 +169,19 @@ export default function AuthenticatedHeader({ ) : ( <> - - } - name={t('common.send.button')} - onClick={onPressSend} - disabled={isSolanaOnlyWallet} - /> - - } - name={t('common.receive')} - onClick={openReceiveCryptoModal} - /> + + + + + + - + {isPortfolioPageEnabled ? ( + + ) : ( + + )} )} {isUnclaimed && ( @@ -216,7 +191,7 @@ export default function AuthenticatedHeader({ onPress={toggleClaimModal} style={{ background: 'linear-gradient(to right, #9139b0 0%, #4261d6 100%)' }} > - + {t('account.authHeader.claimReward', { amount })} )} diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.tsx index b0bcf916c64..2189152b645 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.tsx +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.tsx @@ -1,10 +1,11 @@ import { OpenLimitOrdersButton } from 'components/AccountDrawer/MiniPortfolio/Limits/OpenLimitOrdersButton' import { MenuStateVariant, useSetMenu } from 'components/AccountDrawer/menuState' import { useMemo } from 'react' -import { Flex, ScrollView } from 'ui/src' +import { Flex, Loader, ScrollView } from 'ui/src' import { ActivityItem } from 'uniswap/src/components/activity/generateActivityItemRenderer' import { useActivityData } from 'uniswap/src/features/activity/hooks/useActivityData' import { TestID } from 'uniswap/src/test/fixtures/testIDs' +import { useInfiniteScroll } from 'utilities/src/react/useInfiniteScroll' export default function ActivityTab({ evmOwner, @@ -15,17 +16,24 @@ export default function ActivityTab({ }) { const setMenu = useSetMenu() - const { maybeEmptyComponent, renderActivityItem, sectionData } = useActivityData({ - evmOwner, - svmOwner, - ownerAddresses: [evmOwner, svmOwner].filter(Boolean) as string[], - swapCallbacks: { - useLatestSwapTransaction: () => undefined, - useSwapFormTransactionState: () => undefined, - onRetryGenerator: () => () => {}, - }, - fiatOnRampParams: undefined, - skip: false, + const { maybeEmptyComponent, renderActivityItem, sectionData, fetchNextPage, hasNextPage, isFetchingNextPage } = + useActivityData({ + evmOwner, + svmOwner, + ownerAddresses: [evmOwner, svmOwner].filter(Boolean) as string[], + swapCallbacks: { + useLatestSwapTransaction: () => undefined, + useSwapFormTransactionState: () => undefined, + onRetryGenerator: () => () => {}, + }, + fiatOnRampParams: undefined, + skip: false, + }) + + const { sentinelRef } = useInfiniteScroll({ + onLoadMore: fetchNextPage, + hasNextPage, + isFetching: isFetchingNextPage, }) const ActivityItems = useMemo(() => { @@ -52,6 +60,14 @@ export default function ActivityTab({ )} {ActivityItems} + {/* Show skeleton loading indicator while fetching next page */} + {isFetchingNextPage && ( + + + + )} + {/* Intersection observer sentinel for infinite scroll */} + ) diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/CancelOrdersDialog.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/CancelOrdersDialog.tsx index 0defc585b6d..bd2641d003a 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/CancelOrdersDialog.tsx +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/CancelOrdersDialog.tsx @@ -156,17 +156,14 @@ export function CancelOrdersDialog(props: CancelOrdersDialogProps) { } modalName={ModalName.CancelOrders} primaryButtonText={t('common.neverMind')} - primaryButtonOnClick={onCancel} + primaryButtonOnPress={onCancel} primaryButtonVariant="default" primaryButtonEmphasis="secondary" secondaryButtonText={t('common.proceed')} - secondaryButtonOnClick={onConfirm} + secondaryButtonOnPress={onConfirm} secondaryButtonVariant="critical" - buttonContainerProps={{ - flexDirection: 'row', - }} displayHelpCTA - hasIconBackground + iconBackgroundColor="$surface3" > {/* eslint-disable-next-line @typescript-eslint/no-unnecessary-condition */} @@ -185,15 +182,7 @@ function GasEstimateDisplay({ gasEstimateValue, chainId }: { gasEstimateValue?: const gasFeeFormatted = convertFiatAmountFormatted(gasFeeUSD?.toExact(), NumberType.PortfolioBalance) return ( - + , diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/__snapshots__/CancelOrdersDialog.test.tsx.snap b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/__snapshots__/CancelOrdersDialog.test.tsx.snap index 19e599207c5..36071ed265a 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/__snapshots__/CancelOrdersDialog.test.tsx.snap +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/__snapshots__/CancelOrdersDialog.test.tsx.snap @@ -63,7 +63,7 @@ exports[`CancelOrdersDialog > should render limit order text 1`] = `

@@ -101,11 +101,11 @@ exports[`CancelOrdersDialog > should render limit order text 1`] = ` style="display: contents; pointer-events: auto;" > @@ -121,11 +121,11 @@ exports[`CancelOrdersDialog > should render limit order text 1`] = ` target="_blank" >
should render limit order text 1`] = ` /> Get help @@ -164,10 +164,10 @@ exports[`CancelOrdersDialog > should render limit order text 1`] = `

should render limit order text 1`] = ` />
- - Cancel limit - - - Your swap could execute before cancellation is processed. Your network costs cannot be refunded. Do you wish to proceed? - + + Cancel limit + + + Your swap could execute before cancellation is processed. Your network costs cannot be refunded. Do you wish to proceed? + +
- Network cost -
-
- - - - +
+ Network cost +
+
+ + - + +
-
+
+ - + -
+ Never mind + +
@@ -368,7 +376,7 @@ exports[`CancelOrdersDialog > should render order cancel correctly 1`] = ` should render order cancel correctly 1`] = ` target="_blank" >
should render order cancel correctly 1`] = ` /> Get help @@ -429,10 +437,10 @@ exports[`CancelOrdersDialog > should render order cancel correctly 1`] = `
should render order cancel correctly 1`] = ` />
- - Cancel order - - - Your swap could execute before cancellation is processed. Your network costs cannot be refunded. Do you wish to proceed? - + + Cancel order + + + Your swap could execute before cancellation is processed. Your network costs cannot be refunded. Do you wish to proceed? + +
- Network cost -
-
- - - - +
+ Network cost +
+
+ + - + +
-
+
+ - + -
+ Never mind + +
diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/parseLocal.ts b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/parseLocal.ts index 57f7aec94fc..e3f1ddf0d2d 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/parseLocal.ts +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/parseLocal.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { BigNumber } from '@ethersproject/bignumber' import { queryOptions, useQuery } from '@tanstack/react-query' import type { Currency } from '@uniswap/sdk-core' diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/MiniPortfolioV2.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/MiniPortfolioV2.tsx new file mode 100644 index 00000000000..b36ca7eb0be --- /dev/null +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/MiniPortfolioV2.tsx @@ -0,0 +1,86 @@ +import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' +import { filterTransactionDetailsFromActivityItems } from 'pages/Portfolio/Activity/Filters/utils' +import { useCallback, useMemo } from 'react' +import { useTranslation } from 'react-i18next' +import { useNavigate } from 'react-router' +import { Button, Flex, Text, TouchableArea } from 'ui/src' +import { RightArrow } from 'ui/src/components/icons/RightArrow' +import { iconSizes } from 'ui/src/theme' +import { ActivityItem } from 'uniswap/src/components/activity/generateActivityItemRenderer' +import { useActivityData } from 'uniswap/src/features/activity/hooks/useActivityData' + +const MAX_RECENT_ACTIVITY_ITEMS = 3 + +export default function MiniPortfolioV2({ evmAddress, svmAddress }: { evmAddress?: string; svmAddress?: string }) { + const { t } = useTranslation() + const navigate = useNavigate() + const accountDrawer = useAccountDrawer() + + const handleViewPortfolio = useCallback(() => { + navigate('/portfolio') + accountDrawer.close() + }, [navigate, accountDrawer]) + + const handleViewMore = useCallback(() => { + navigate('/portfolio/activity') + accountDrawer.close() + }, [navigate, accountDrawer]) + + const { renderActivityItem, sectionData } = useActivityData({ + evmOwner: evmAddress, + svmOwner: svmAddress, + ownerAddresses: [evmAddress, svmAddress].filter(Boolean) as string[], + swapCallbacks: { + useLatestSwapTransaction: () => undefined, + useSwapFormTransactionState: () => undefined, + onRetryGenerator: () => () => {}, + }, + fiatOnRampParams: undefined, + skip: false, + }) + + const recentActivityItems = useMemo(() => { + // Filter out section headers and loading items, then get the first 3 actual activity items + const actualActivityItems = filterTransactionDetailsFromActivityItems(sectionData ?? []).slice( + 0, + MAX_RECENT_ACTIVITY_ITEMS, + ) + return actualActivityItems.map((item: ActivityItem, index) => { + return renderActivityItem({ + item, + index, + }) + }) + }, [sectionData, renderActivityItem]) + + return ( + + + + + + {t('activity.recentActivity')} + + {recentActivityItems} + + + + + {t('common.button.viewMore')} + + + + ) +} diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Tokens/TokensTab.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/Tokens/TokensTab.tsx index 05f1f405026..fb95430ef9d 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Tokens/TokensTab.tsx +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Tokens/TokensTab.tsx @@ -1,12 +1,18 @@ +import { Currency } from '@uniswap/sdk-core' import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' +import { useModalState } from 'hooks/useModalState' +import { useAtom } from 'jotai' import { useCallback } from 'react' import { useNavigate } from 'react-router' import { Flex } from 'ui/src' import { TokenBalanceListWeb } from 'uniswap/src/components/portfolio/TokenBalanceListWeb' +import { ReportTokenIssueModalPropsAtom } from 'uniswap/src/components/reporting/ReportTokenIssueModal' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' +import { ModalName } from 'uniswap/src/features/telemetry/constants' import { CurrencyId } from 'uniswap/src/types/currency' import { currencyIdToAddress, currencyIdToChain } from 'uniswap/src/utils/currencyId' import { getTokenDetailsURL } from 'uniswap/src/utils/linking' +import { useEvent } from 'utilities/src/react/hooks' import { noop } from 'utilities/src/react/noop' import { getChainUrlParam } from 'utils/chainParams' @@ -21,6 +27,13 @@ export default function TokensTab({ const { isTestnetModeEnabled } = useEnabledChains() const navigate = useNavigate() + const { openModal } = useModalState(ModalName.ReportTokenIssue) + const [, setModalProps] = useAtom(ReportTokenIssueModalPropsAtom) + const openReportTokenModal = useEvent((currency: Currency, isMarkedSpam: Maybe) => { + setModalProps({ source: 'portfolio', currency, isMarkedSpam }) + openModal() + }) + const navigateToTokenDetails = useCallback( async (currencyId: CurrencyId) => { const address = currencyIdToAddress(currencyId) @@ -51,6 +64,7 @@ export default function TokensTab({ onPressReceive={noop} onPressBuy={noop} onPressToken={navigateToTokenDetails} + openReportTokenModal={openReportTokenModal} /> ) diff --git a/apps/web/src/components/AccountDrawer/PortfolioBalanceMenu.tsx b/apps/web/src/components/AccountDrawer/PortfolioBalanceMenu.tsx index a65d9ee15d8..95ff52970a5 100644 --- a/apps/web/src/components/AccountDrawer/PortfolioBalanceMenu.tsx +++ b/apps/web/src/components/AccountDrawer/PortfolioBalanceMenu.tsx @@ -1,19 +1,23 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' +import { ReportedActivityToggle } from 'components/AccountDrawer/ReportedActivityToggle' import { SlideOutMenu } from 'components/AccountDrawer/SlideOutMenu' import { SmallBalanceToggle } from 'components/AccountDrawer/SmallBalanceToggle' -import { SpamToggle } from 'components/AccountDrawer/SpamToggle' +import { SpamTokensToggle } from 'components/AccountDrawer/SpamTokensToggle' import { MenuColumn } from 'components/AccountDrawer/shared' import { useTranslation } from 'react-i18next' import { Flex } from 'ui/src' export default function PortfolioBalanceMenu({ onClose }: { onClose: () => void }) { const { t } = useTranslation() + const isDataReportingAbilitiesEnabled = useFeatureFlag(FeatureFlags.DataReportingAbilities) return ( - + - + + {isDataReportingAbilitiesEnabled && } diff --git a/apps/web/src/components/AccountDrawer/ReportedActivityToggle.tsx b/apps/web/src/components/AccountDrawer/ReportedActivityToggle.tsx new file mode 100644 index 00000000000..c2798ccdac6 --- /dev/null +++ b/apps/web/src/components/AccountDrawer/ReportedActivityToggle.tsx @@ -0,0 +1,24 @@ +import { SettingsToggle } from 'components/AccountDrawer/SettingsToggle' +import { useTranslation } from 'react-i18next' +import { useDispatch } from 'react-redux' +import { useHideReportedActivitySetting } from 'uniswap/src/features/settings/hooks' +import { setHideReportedActivity } from 'uniswap/src/features/settings/slice' + +export function ReportedActivityToggle() { + const { t } = useTranslation() + const hideReportedActivity = useHideReportedActivitySetting() + const dispatch = useDispatch() + + const onToggle = () => { + dispatch(setHideReportedActivity(!hideReportedActivity)) + } + + return ( + + ) +} diff --git a/apps/web/src/components/AccountDrawer/SettingsMenu.tsx b/apps/web/src/components/AccountDrawer/SettingsMenu.tsx index 86cc03f9bf7..17aab1ae20e 100644 --- a/apps/web/src/components/AccountDrawer/SettingsMenu.tsx +++ b/apps/web/src/components/AccountDrawer/SettingsMenu.tsx @@ -92,7 +92,7 @@ export default function SettingsMenu({ testId={TestID.LanguageSettingsButton} /> diff --git a/apps/web/src/components/AccountDrawer/SettingsToggle.tsx b/apps/web/src/components/AccountDrawer/SettingsToggle.tsx index 92f3ce8ffe4..45923bb281f 100644 --- a/apps/web/src/components/AccountDrawer/SettingsToggle.tsx +++ b/apps/web/src/components/AccountDrawer/SettingsToggle.tsx @@ -1,8 +1,7 @@ -import { ReactNode } from 'react' import { Flex, Switch, Text } from 'ui/src' interface SettingsToggleProps { - title: ReactNode + title: string description?: string dataid?: string disabled?: boolean diff --git a/apps/web/src/components/AccountDrawer/SmallBalanceToggle.tsx b/apps/web/src/components/AccountDrawer/SmallBalanceToggle.tsx index 5c4cc371248..b1bfdd4db50 100644 --- a/apps/web/src/components/AccountDrawer/SmallBalanceToggle.tsx +++ b/apps/web/src/components/AccountDrawer/SmallBalanceToggle.tsx @@ -18,6 +18,7 @@ export function SmallBalanceToggle() { return ( } isActive={hideSpamTokens} toggle={onToggle} /> + ) } diff --git a/apps/web/src/components/ActionTiles/ActionTileWithIconAnimation.tsx b/apps/web/src/components/ActionTiles/ActionTileWithIconAnimation.tsx new file mode 100644 index 00000000000..65b5ef54d96 --- /dev/null +++ b/apps/web/src/components/ActionTiles/ActionTileWithIconAnimation.tsx @@ -0,0 +1,43 @@ +import { ActionTile, ActionTileProps } from 'components/AccountDrawer/ActionTile' +import { Wiggle } from 'components/animations/Wiggle' +import { Flex, GeneratedIcon } from 'ui/src' +import { useBooleanState } from 'utilities/src/react/useBooleanState' + +type ActionTileWithIconAnimationProps = Omit & { + Icon: GeneratedIcon +} + +export function ActionTileWithIconAnimation({ + dataTestId, + Icon, + name, + onClick, + disabled, + padding, +}: ActionTileWithIconAnimationProps) { + const { value: isHovered, setTrue: setIsHovered, setFalse: setIsHoveredFalse } = useBooleanState(false) + + return ( + + + + + } + name={name} + onClick={onClick} + disabled={disabled} + padding={padding} + /> + + ) +} diff --git a/apps/web/src/components/ActionTiles/BuyActionTile.tsx b/apps/web/src/components/ActionTiles/BuyActionTile.tsx new file mode 100644 index 00000000000..737d024b555 --- /dev/null +++ b/apps/web/src/components/ActionTiles/BuyActionTile.tsx @@ -0,0 +1,26 @@ +import { ActionTileWithIconAnimation } from 'components/ActionTiles/ActionTileWithIconAnimation' +import { useTranslation } from 'react-i18next' +import { CreditCard } from 'ui/src/components/icons/CreditCard' +import { FlexProps } from 'ui/src/components/layout/Flex' +import { useUniswapContext } from 'uniswap/src/contexts/UniswapContext' +import { TestID } from 'uniswap/src/test/fixtures/testIDs' +import { useEvent } from 'utilities/src/react/hooks' + +export function BuyActionTile({ padding = '$spacing12' }: { padding?: FlexProps['p'] }) { + const { t } = useTranslation() + const { navigateToFiatOnRamp } = useUniswapContext() + + const onPressBuy = useEvent(() => { + navigateToFiatOnRamp({}) + }) + + return ( + + ) +} diff --git a/apps/web/src/components/ActionTiles/MoreActionTile.tsx b/apps/web/src/components/ActionTiles/MoreActionTile.tsx new file mode 100644 index 00000000000..a2c1cd99ac2 --- /dev/null +++ b/apps/web/src/components/ActionTiles/MoreActionTile.tsx @@ -0,0 +1,92 @@ +import { ActionTileWithIconAnimation } from 'components/ActionTiles/ActionTileWithIconAnimation' +import { AdaptiveDropdown } from 'components/Dropdowns/AdaptiveDropdown' +import { InternalMenuItem } from 'components/Dropdowns/Dropdown' +import { Limit } from 'components/Icons/Limit' +import { useTranslation } from 'react-i18next' +import { useNavigate } from 'react-router' +import { Flex, Text, useSporeColors } from 'ui/src' +import { ArrowDownCircleFilled } from 'ui/src/components/icons/ArrowDownCircleFilled' +import { MoreHorizontal } from 'ui/src/components/icons/MoreHorizontal' +import { Plus } from 'ui/src/components/icons/Plus' +import { FlexProps } from 'ui/src/components/layout/Flex' +import { iconSizes } from 'ui/src/theme' +import { useUniswapContext } from 'uniswap/src/contexts/UniswapContext' +import { TestID } from 'uniswap/src/test/fixtures/testIDs' +import { useEvent } from 'utilities/src/react/hooks' +import { useBooleanState } from 'utilities/src/react/useBooleanState' + +export function MoreActionTile({ padding = '$spacing12' }: { padding?: FlexProps['p'] }) { + const { t } = useTranslation() + const colors = useSporeColors() + const { navigateToReceive } = useUniswapContext() + const navigate = useNavigate() + const { value: isDropdownOpen, setFalse: closeDropdown, toggle: toggleDropdown } = useBooleanState(false) + + const onPressSell = useEvent(() => { + navigate('/sell') + closeDropdown() + }) + + const onPressReceive = useEvent(() => { + navigateToReceive() + closeDropdown() + }) + + const onPressLimit = useEvent(() => { + navigate('/limit') + closeDropdown() + }) + + const onPressCreatePool = useEvent(() => { + navigate('/positions/create') + closeDropdown() + }) + + return ( + + + + } + containerStyle={{ height: '100%' }} + alignRight={false} + > + + + + {t('common.sell.label')} + + + + + + + {t('common.receive')} + + + + + + + {t('swap.limit')} + + + + + + + {t('pool.newPosition.title')} + + + + ) +} diff --git a/apps/web/src/components/ActionTiles/ReceiveActionTile.tsx b/apps/web/src/components/ActionTiles/ReceiveActionTile.tsx new file mode 100644 index 00000000000..2ab90b5adca --- /dev/null +++ b/apps/web/src/components/ActionTiles/ReceiveActionTile.tsx @@ -0,0 +1,23 @@ +import { ActionTileWithIconAnimation } from 'components/ActionTiles/ActionTileWithIconAnimation' +import { ReceiveModalState } from 'components/ReceiveCryptoModal/types' +import { useOpenReceiveCryptoModal } from 'components/ReceiveCryptoModal/useOpenReceiveCryptoModal' +import { useTranslation } from 'react-i18next' +import { ArrowDownCircleFilled } from 'ui/src/components/icons/ArrowDownCircleFilled' +import { TestID } from 'uniswap/src/test/fixtures/testIDs' + +export function ReceiveActionTile() { + const { t } = useTranslation() + + const openReceiveCryptoModal = useOpenReceiveCryptoModal({ + modalState: ReceiveModalState.DEFAULT, + }) + + return ( + + ) +} diff --git a/apps/web/src/components/ActionTiles/SendActionTile/SendActionTile.tsx b/apps/web/src/components/ActionTiles/SendActionTile/SendActionTile.tsx new file mode 100644 index 00000000000..3951ea94d0e --- /dev/null +++ b/apps/web/src/components/ActionTiles/SendActionTile/SendActionTile.tsx @@ -0,0 +1,38 @@ +import { ActionTileWithIconAnimation } from 'components/ActionTiles/ActionTileWithIconAnimation' +import { SendButtonTooltip } from 'components/ActionTiles/SendActionTile/SendButtonTooltip' +import { useActiveAddresses } from 'features/accounts/store/hooks' +import { useTranslation } from 'react-i18next' +import { FlexProps } from 'ui/src' +import { SendAction } from 'ui/src/components/icons/SendAction' +import { useUniswapContext } from 'uniswap/src/contexts/UniswapContext' +import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { TestID } from 'uniswap/src/test/fixtures/testIDs' +import { useEvent } from 'utilities/src/react/hooks' + +export function SendActionTile({ onPress, padding }: { onPress?: () => void; padding?: FlexProps['p'] }): JSX.Element { + const { t } = useTranslation() + const { navigateToSendFlow } = useUniswapContext() + const { evmAddress, svmAddress } = useActiveAddresses() + + const isSolanaOnlyWallet = Boolean(svmAddress && !evmAddress) + + const onPressSend = useEvent(() => { + if (!isSolanaOnlyWallet) { + navigateToSendFlow({ chainId: UniverseChainId.Mainnet }) + onPress?.() + } + }) + + return ( + + + + ) +} diff --git a/apps/web/src/components/AccountDrawer/SendButtonTooltip.tsx b/apps/web/src/components/ActionTiles/SendActionTile/SendButtonTooltip.tsx similarity index 100% rename from apps/web/src/components/AccountDrawer/SendButtonTooltip.tsx rename to apps/web/src/components/ActionTiles/SendActionTile/SendButtonTooltip.tsx diff --git a/apps/web/src/components/ActionTiles/SwapActionTile.tsx b/apps/web/src/components/ActionTiles/SwapActionTile.tsx new file mode 100644 index 00000000000..59627e9926b --- /dev/null +++ b/apps/web/src/components/ActionTiles/SwapActionTile.tsx @@ -0,0 +1,26 @@ +import { ActionTileWithIconAnimation } from 'components/ActionTiles/ActionTileWithIconAnimation' +import { useTranslation } from 'react-i18next' +import { SwapDotted } from 'ui/src/components/icons/SwapDotted' +import { FlexProps } from 'ui/src/components/layout/Flex' +import { useUniswapContext } from 'uniswap/src/contexts/UniswapContext' +import { TestID } from 'uniswap/src/test/fixtures/testIDs' +import { useEvent } from 'utilities/src/react/hooks' + +export function SwapActionTile({ padding = '$spacing12' }: { padding?: FlexProps['p'] }) { + const { t } = useTranslation() + const { navigateToSwapFlow } = useUniswapContext() + + const onPressSwap = useEvent(() => { + navigateToSwapFlow({}) + }) + + return ( + + ) +} diff --git a/apps/web/src/components/Charts/ChartHeader.tsx b/apps/web/src/components/Charts/ChartHeader.tsx index 95f429bb743..d1ec1e6a7f0 100644 --- a/apps/web/src/components/Charts/ChartHeader.tsx +++ b/apps/web/src/components/Charts/ChartHeader.tsx @@ -1,11 +1,11 @@ import { getProtocolColor, getProtocolName } from 'appGraphql/data/util' import { GraphQLApi } from '@universe/api' -import { useHeaderDateFormatter } from 'components/Charts/hooks' +import { useHeaderDateFormatter } from 'components/Charts/hooks/useHeaderDateFormatter' import { PROTOCOL_LEGEND_ELEMENT_ID } from 'components/Charts/types' import { UTCTimestamp } from 'lightweight-charts' import { ReactElement, ReactNode } from 'react' import { EllipsisTamaguiStyle } from 'theme/components/styles' -import { Flex, styled, Text } from 'ui/src' +import { Flex, styled, Text, useSporeColors } from 'ui/src' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { FiatNumberType, NumberType } from 'utilities/src/format/types' @@ -113,6 +113,7 @@ export function ChartHeader({ additionalFields, }: ChartHeaderProps) { const isHovered = !!time + const colors = useSporeColors() return ( - + {additionalFields} diff --git a/apps/web/src/components/Charts/ChartModel.tsx b/apps/web/src/components/Charts/ChartModel.tsx index d392f70abf0..26f8360a546 100644 --- a/apps/web/src/components/Charts/ChartModel.tsx +++ b/apps/web/src/components/Charts/ChartModel.tsx @@ -1,3 +1,6 @@ +import { CustomHoverMarker } from 'components/Charts/CustomHoverMarker' +import { useApplyChartTextureEffects } from 'components/Charts/hooks/useApplyChartTextureEffects' +import { ChartModelWithLiveDot, LiveDotRenderer } from 'components/Charts/LiveDotRenderer' import { PROTOCOL_LEGEND_ELEMENT_ID, SeriesDataItemType } from 'components/Charts/types' import { formatTickMarks } from 'components/Charts/utils' import { MissingDataBars } from 'components/Table/icons' @@ -73,6 +76,18 @@ export abstract class ChartModel { public tooltipId = `chart-tooltip-${uuidv4()}` + /** Get current hover coordinates for custom marker rendering */ + public getHoverCoordinates(): { x: number; y: number } | null { + if (!this._hoverData) { + return null + } + // Adjust x coordinate to account for price scale width + return { + x: this._hoverData.x + this.api.priceScale('left').width(), + y: this._hoverData.y, + } + } + constructor(chartDiv: HTMLDivElement, params: ChartModelParams) { this.chartDiv = chartDiv this.onCrosshairMove = params.onCrosshairMove @@ -266,6 +281,9 @@ export function Chart, TDataType e children, className, disableChartTouchPanning, + showDottedBackground = false, + showLeftFadeOverlay = false, + showCustomHoverMarker = false, }: { Model: new (chartDiv: HTMLDivElement, params: TParamType & ChartUtilParams) => ChartModel TooltipBody?: ChartTooltipBodyComponent @@ -274,25 +292,44 @@ export function Chart, TDataType e children?: (crosshair?: TDataType) => ReactElement className?: string disableChartTouchPanning?: boolean // On touch devices, optionally disables chart touch panning on mobile devices to avoid interfering with vertical scrolling + showDottedBackground?: boolean + showLeftFadeOverlay?: boolean + showCustomHoverMarker?: boolean }) { 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 [crosshairData, setCrosshairData] = useState(undefined) + const [hoverCoordinates, setHoverCoordinates] = useState<{ x: number; y: number } | null>(null) const format = useLocalizationContext() const theme = useTheme() const locale = useCurrentLocale() const media = useMedia() const isLargeScreen = !media.lg + const handleCrosshairMove = useMemo( + () => (data: TDataType | undefined) => { + setCrosshairData(data) + if (chartModelRef.current) { + const coords = chartModelRef.current.getHoverCoordinates() + setHoverCoordinates(coords) + } else { + setHoverCoordinates(null) + } + }, + [], + ) + const modelParams = useMemo( - () => ({ ...params, format, theme, locale, isLargeScreen, onCrosshairMove: setCrosshairData }), - [format, isLargeScreen, locale, params, theme], + () => ({ ...params, format, theme, locale, isLargeScreen, onCrosshairMove: handleCrosshairMove }), + [format, isLargeScreen, locale, params, theme, handleCrosshairMove], ) // Chart model state should not affect React render cycles since the chart canvas is drawn outside of React, so we store via ref const chartModelRef = useRef>() + useApplyChartTextureEffects({ chartDivElement, showDottedBackground, showLeftFadeOverlay }) + // Creates the chart as soon as the chart div ref is defined useEffect(() => { if (chartDivElement && chartModelRef.current === undefined) { @@ -321,20 +358,39 @@ export function Chart, TDataType e useOnClickOutside({ node: { current: chartDivElement } as React.RefObject, - handler: () => setCrosshairData(undefined), + handler: () => { + setCrosshairData(undefined) + setHoverCoordinates(null) + }, }) + // Update hover coordinates on crosshair data changes + useEffect(() => { + if (chartModelRef.current) { + const coords = chartModelRef.current.getHoverCoordinates() + setHoverCoordinates(coords) + } else if (!crosshairData) { + setHoverCoordinates(null) + } + }, [crosshairData]) + const touchMoveHandler = disableChartTouchPanning ? (e: TouchEvent) => e.stopPropagation() : undefined return ( + {/* Chart container */} + + {/* Canvas is injected here by lightweight-charts */} + {/* Background texture and fade overlay are applied directly to the chart td element */} + + + {/* Header/content outside background */} {children && children(crosshairData)} {TooltipBody && crosshairData && ( @@ -342,6 +398,18 @@ export function Chart, TDataType e )} {params.stale && } + {/* Custom hover marker */} + {showCustomHoverMarker && hoverCoordinates && chartDivElement && chartModelRef.current && ( + + )} + {/* Live dot indicator at the end of line charts */} + {chartModelRef.current && chartDivElement && 'getLastPointCoordinates' in chartModelRef.current && ( + + )} ) } diff --git a/apps/web/src/components/Charts/CustomHoverMarker.tsx b/apps/web/src/components/Charts/CustomHoverMarker.tsx new file mode 100644 index 00000000000..f1b2f84713a --- /dev/null +++ b/apps/web/src/components/Charts/CustomHoverMarker.tsx @@ -0,0 +1,51 @@ +import { useTheme } from 'lib/styled-components' +import { Flex } from 'ui/src' +import { opacify } from 'ui/src/theme' + +interface CustomHoverMarkerProps { + coordinates: { x: number; y: number } + lineColor: string +} + +export function CustomHoverMarker({ coordinates, lineColor }: CustomHoverMarkerProps): JSX.Element { + const theme = useTheme() + + return ( + + {/* Halo - 16px diameter */} + + {/* Main marker - 10px diameter with 2px neutral1 border */} + + + ) +} diff --git a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/components/D3LiquidityMinMaxInput.tsx b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/components/D3LiquidityMinMaxInput.tsx index 1e0723c11af..a47f85cd2de 100644 --- a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/components/D3LiquidityMinMaxInput.tsx +++ b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/components/D3LiquidityMinMaxInput.tsx @@ -63,7 +63,7 @@ export function D3LiquidityMinMaxInput() { // Navigation params for increment/decrement actions const tickNavigationParams: TickNavigationParams | undefined = useMemo(() => { - if (!positionState.fee.tickSpacing || !currencies.display.TOKEN0 || !currencies.display.TOKEN1) { + if (!positionState.fee?.tickSpacing || !currencies.display.TOKEN0 || !currencies.display.TOKEN1) { return undefined } @@ -76,7 +76,7 @@ export function D3LiquidityMinMaxInput() { priceInverted: priceRangeState.priceInverted, protocolVersion: positionState.protocolVersion, } - }, [positionState.fee.tickSpacing, currencies.display, priceRangeState.priceInverted, positionState.protocolVersion]) + }, [positionState.fee?.tickSpacing, currencies.display, priceRangeState.priceInverted, positionState.protocolVersion]) // Get display value based on input mode const getDisplayValue = useCallback( diff --git a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/components/DefaultPriceStrategies.tsx b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/components/DefaultPriceStrategies.tsx index 18dba71fac5..81c4f2bae31 100644 --- a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/components/DefaultPriceStrategies.tsx +++ b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/components/DefaultPriceStrategies.tsx @@ -2,6 +2,7 @@ import { useChartPriceState } from 'components/Charts/D3LiquidityRangeInput/D3Li import { useLiquidityChartStoreRenderingContext } from 'components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/store/selectors/viewSelectors' import { DefaultPriceStrategy } from 'components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/store/types' import { useLiquidityChartStoreActions } from 'components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/store/useLiquidityChartStore' +import { POPUP_MEDIUM_DISMISS_MS } from 'components/Popups/constants' import { popupRegistry } from 'components/Popups/registry' import { PopupType } from 'components/Popups/types' import { ClickableTamaguiStyle } from 'theme/components/styles' @@ -115,7 +116,7 @@ export function DefaultPriceStrategies({ isLoading }: { isLoading: boolean }) { popupRegistry.addPopup( { type: PopupType.Error, error: i18n.t('position.default_price_strategies.error') }, 'default-price-strategy-error', - 3000, + POPUP_MEDIUM_DISMISS_MS, ) } }) diff --git a/apps/web/src/components/Charts/LiquidityPositionRangeChart/LiquidityPositionRangeChart.tsx b/apps/web/src/components/Charts/LiquidityPositionRangeChart/LiquidityPositionRangeChart.tsx index e820c97f067..62b5ab1eac6 100644 --- a/apps/web/src/components/Charts/LiquidityPositionRangeChart/LiquidityPositionRangeChart.tsx +++ b/apps/web/src/components/Charts/LiquidityPositionRangeChart/LiquidityPositionRangeChart.tsx @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { PositionStatus, ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency, Price } from '@uniswap/sdk-core' import { Pair } from '@uniswap/v2-sdk' diff --git a/apps/web/src/components/Charts/LiquidityRangeInput/LiquidityRangeInput.tsx b/apps/web/src/components/Charts/LiquidityRangeInput/LiquidityRangeInput.tsx index 6ad03dc900c..91d8132d1d7 100644 --- a/apps/web/src/components/Charts/LiquidityRangeInput/LiquidityRangeInput.tsx +++ b/apps/web/src/components/Charts/LiquidityRangeInput/LiquidityRangeInput.tsx @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency } from '@uniswap/sdk-core' import { GraphQLApi } from '@universe/api' diff --git a/apps/web/src/components/Charts/LiveDotRenderer.tsx b/apps/web/src/components/Charts/LiveDotRenderer.tsx new file mode 100644 index 00000000000..a0ca27790c5 --- /dev/null +++ b/apps/web/src/components/Charts/LiveDotRenderer.tsx @@ -0,0 +1,162 @@ +import { useTheme } from 'lib/styled-components' +import { useEffect, useRef, useState } from 'react' +import { Flex } from 'ui/src' + +export interface ChartModelWithLiveDot { + getLastPointCoordinates?: () => { x: number; y: number } | null +} + +interface LiveDotRendererProps { + chartModel: ChartModelWithLiveDot + isHovering: boolean + chartContainer?: HTMLElement | null +} + +// TODO(PORT-494): figure out why the dot isn't rendering at the correct coordinated after resize +function useHideOnResize( + chartContainer: HTMLElement | null | undefined, + setCoordinates: (coordinates: { x: number; y: number } | null) => void, +): boolean { + const [hasResized, setHasResized] = useState(false) + + useEffect(() => { + if (!chartContainer || hasResized) { + return undefined + } + + // Track if this is the first callback (initial layout) + let isFirstCallback = true + + // Permanently hide dot after any resize (until page refresh) + const resizeObserver = new ResizeObserver(() => { + // Ignore the first callback (initial layout measurement) + if (isFirstCallback) { + isFirstCallback = false + return + } + + // This is a real resize after initial layout + setHasResized(true) + // Clear coordinates immediately when resize is detected to prevent wrong positioning + setCoordinates(null) + // Stop observing once resize is detected since dot will never show again + resizeObserver.disconnect() + }) + resizeObserver.observe(chartContainer) + + return () => { + resizeObserver.disconnect() + } + }, [chartContainer, setCoordinates, hasResized]) + + return hasResized +} + +export function LiveDotRenderer({ chartModel, isHovering, chartContainer }: LiveDotRendererProps) { + const [coordinates, setCoordinates] = useState<{ x: number; y: number } | null>(null) + const hasResized = useHideOnResize(chartContainer, setCoordinates) + const theme = useTheme() + const rafRef = useRef(null) + + useEffect(() => { + // Only render if the chart model has getLastPointCoordinates method + if (!('getLastPointCoordinates' in chartModel)) { + return undefined + } + + const updateCoordinates = () => { + // Stop updating if resize has occurred + if (hasResized) { + return + } + const coords = chartModel.getLastPointCoordinates?.() + setCoordinates(coords ?? null) + rafRef.current = requestAnimationFrame(updateCoordinates) + } + + updateCoordinates() + + return () => { + if (rafRef.current !== null) { + cancelAnimationFrame(rafRef.current) + rafRef.current = null + } + } + }, [chartModel, hasResized]) + + if (!coordinates || isHovering || hasResized) { + return null + } + + return ( + + {/* Outer pulsing ring */} + + + {/* Inner dot */} + + + + ) +} diff --git a/apps/web/src/components/Charts/LoadingState.tsx b/apps/web/src/components/Charts/LoadingState.tsx index e7268e40a16..1a304b98ca0 100644 --- a/apps/web/src/components/Charts/LoadingState.tsx +++ b/apps/web/src/components/Charts/LoadingState.tsx @@ -1,14 +1,13 @@ import { ChartType } from 'components/Charts/utils' import Column from 'components/deprecated/Column' import Row from 'components/deprecated/Row' -import { MissingDataIcon } from 'components/Table/icons' +import { ChartBarCrossedWithBackground } from 'components/Table/ErrorBox' import styled, { useTheme } from 'lib/styled-components' import { lighten } from 'polished' import { PropsWithChildren, ReactNode } from 'react' import { Trans } from 'react-i18next' import { ThemedText } from 'theme/components' import { textFadeIn } from 'theme/styles' -import { Flex } from 'ui/src' import { opacify } from 'ui/src/theme' const ChartErrorContainer = styled(Row)` @@ -34,9 +33,7 @@ const ErrorTextColumn = styled(Column)` export function ChartErrorView({ children }: PropsWithChildren) { return ( - - - + diff --git a/apps/web/src/components/Charts/PriceChart/index.tsx b/apps/web/src/components/Charts/PriceChart/index.tsx index 2313ca3d480..96de3a03b8d 100644 --- a/apps/web/src/components/Charts/PriceChart/index.tsx +++ b/apps/web/src/components/Charts/PriceChart/index.tsx @@ -51,6 +51,64 @@ export class PriceChartModel extends ChartModel { private min: number private max: number + /** + * Gets the screen coordinates for the last data point + * Returns null for candlestick charts since they don't need a live dot indicator + */ + getLastPointCoordinates(): { x: number; y: number } | null { + // Only show live dot for line charts + if (this.type === PriceChartType.CANDLESTICK) { + return null + } + + if (this.data.length === 0) { + return null + } + + const lastDataPoint = this.data[this.data.length - 1] + const xCoordinate = this.api.timeScale().timeToCoordinate(lastDataPoint.time) + const yCoordinate = this.series.priceToCoordinate((lastDataPoint as AreaData).value) + + if (xCoordinate == null || yCoordinate == null) { + return null + } + + return { + x: Number(xCoordinate) + this.api.priceScale('left').width(), + y: Number(yCoordinate), + } + } + + /** + * Gets the screen coordinates for the hovered data point on the line + * Returns null if not hovering or for candlestick charts + */ + override getHoverCoordinates(): { x: number; y: number } | null { + // Only show custom marker for line charts + if (this.type === PriceChartType.CANDLESTICK) { + return null + } + + const hoverData = (this as any)._hoverData + if (!hoverData || !hoverData.item) { + return null + } + + // Calculate x from time + const xCoordinate = this.api.timeScale().timeToCoordinate(hoverData.item.time) + // Calculate y from the data point's value (not mouse position) + const yCoordinate = this.series.priceToCoordinate((hoverData.item as AreaData).value) + + if (xCoordinate == null || yCoordinate == null) { + return null + } + + return { + x: Number(xCoordinate) + this.api.priceScale('left').width(), + y: Number(yCoordinate), + } + } + constructor(chartDiv: HTMLDivElement, params: PriceChartModelParams) { super(chartDiv, params) this.originalData = this.data @@ -134,10 +192,6 @@ export class PriceChartModel extends ChartModel { ) }, }, - grid: { - vertLines: { style: LineStyle.CustomDotGrid, color: theme.neutral3 }, - horzLines: { style: LineStyle.CustomDotGrid, color: theme.neutral3 }, - }, ...(scaleMargins && { rightPriceScale: { scaleMargins, @@ -180,11 +234,10 @@ export class PriceChartModel extends ChartModel { lineType: data.length < 20 ? LineType.WithSteps : LineType.Curved, // Stepped line is visually preferred for smaller datasets lineWidth: 2, lineColor, - topColor: opacify(12, lineColor), - bottomColor: opacify(12, lineColor), - crosshairMarkerRadius: 5, - crosshairMarkerBorderColor: opacify(30, lineColor), - crosshairMarkerBorderWidth: 3, + topColor: lineColor, + bottomColor: opacify(0, theme.surface1), + // Hide default marker - we use a custom marker instead + crosshairMarkerRadius: 0, // Candlestick-specific options: upColor: theme.success, @@ -236,6 +289,10 @@ interface PriceChartDeltaProps { noColor?: boolean shouldIncludeFiatDelta?: boolean shouldTreatAsStablecoin?: boolean + /** Optional 24hr price change % from API (used when not hovering to match mobile) */ + pricePercentChange24h?: number + /** Whether the user is currently hovering over the chart */ + isHovering?: boolean } export function PriceChartDelta({ @@ -244,11 +301,17 @@ export function PriceChartDelta({ noColor, shouldIncludeFiatDelta = false, shouldTreatAsStablecoin = false, + pricePercentChange24h, + isHovering = false, }: PriceChartDeltaProps) { const { formatPercent, convertFiatAmount } = useLocalizationContext() const { formatChartFiatDelta } = useFormatChartFiatDelta() - const delta = calculateDelta(startingPrice, endingPrice) + // When not hovering and we have API's 24hr change, use it for consistency with mobile + // When hovering, calculate change from starting price to current hover point + const calculatedDelta = calculateDelta(startingPrice, endingPrice) + const delta = !isHovering && pricePercentChange24h !== undefined ? pricePercentChange24h : calculatedDelta + const formattedDelta = useMemo(() => { return delta !== undefined ? formatPercent(Math.abs(delta)) : '-' }, [delta, formatPercent]) @@ -258,6 +321,22 @@ export function PriceChartDelta({ return null } + // When using API's 24hr percentage (not hovering), calculate fiat delta from that percentage + // This avoids mixing aggregated chart prices with per-chain current prices + if (!isHovering && pricePercentChange24h !== undefined) { + const convertedEnd = convertFiatAmount(endingPrice) + const percentAsDecimal = pricePercentChange24h / 100 + const historicalPrice = convertedEnd.amount / (1 + percentAsDecimal) + const fiatChange = convertedEnd.amount - historicalPrice + + return formatChartFiatDelta({ + startingPrice: convertedEnd.amount - fiatChange, + endingPrice: convertedEnd.amount, + isStablecoin: shouldTreatAsStablecoin, + }) + } + + // When hovering, use chart prices for consistent calculation const convertedStart = convertFiatAmount(startingPrice) const convertedEnd = convertFiatAmount(endingPrice) @@ -273,6 +352,8 @@ export function PriceChartDelta({ endingPrice, convertFiatAmount, shouldTreatAsStablecoin, + pricePercentChange24h, + isHovering, ]) return ( @@ -289,6 +370,7 @@ interface PriceChartProps { data: PriceChartData[] stale: boolean timePeriod?: GraphQLApi.HistoryDuration + pricePercentChange24h?: number } const CandlestickTooltipRow = styled(Flex, { @@ -323,7 +405,7 @@ function CandlestickTooltip({ data }: { data: PriceChartData }) { ) } -export function PriceChart({ data, height, type, stale, timePeriod }: PriceChartProps) { +export function PriceChart({ data, height, type, stale, timePeriod, pricePercentChange24h }: PriceChartProps) { const startingPrice = data[0] const lastPrice = data[data.length - 1] const { min, max } = getCandlestickPriceBounds(data) @@ -339,6 +421,9 @@ export function PriceChart({ data, height, type, stale, timePeriod }: PriceChart params={useMemo(() => ({ data, type, stale, timePeriod }), [data, stale, type, timePeriod])} height={height} TooltipBody={type === PriceChartType.CANDLESTICK ? CandlestickTooltip : undefined} + showDottedBackground={true} + showLeftFadeOverlay={type === PriceChartType.LINE} + showCustomHoverMarker={type === PriceChartType.LINE} > {(crosshairData) => ( } valueFormatterType={NumberType.FiatTokenPrice} diff --git a/apps/web/src/components/Charts/StackedLineChart/index.tsx b/apps/web/src/components/Charts/StackedLineChart/index.tsx index 0c281aea7a4..562523e15ca 100644 --- a/apps/web/src/components/Charts/StackedLineChart/index.tsx +++ b/apps/web/src/components/Charts/StackedLineChart/index.tsx @@ -4,15 +4,7 @@ import { ChartHeader } from 'components/Charts/ChartHeader' import { Chart, ChartModel, ChartModelParams } from 'components/Charts/ChartModel' import { StackedAreaSeriesOptions } from 'components/Charts/StackedLineChart/stacked-area-series/options' import { StackedAreaSeries } from 'components/Charts/StackedLineChart/stacked-area-series/stacked-area-series' -import { - CustomStyleOptions, - DeepPartial, - ISeriesApi, - LineStyle, - Logical, - UTCTimestamp, - WhitespaceData, -} from 'lightweight-charts' +import { CustomStyleOptions, DeepPartial, ISeriesApi, Logical, UTCTimestamp, WhitespaceData } from 'lightweight-charts' import { useMemo } from 'react' import { ColorTokens, useSporeColors } from 'ui/src' @@ -52,15 +44,6 @@ class TVLChartModel extends ChartModel { updateOptions(params: TVLChartParams) { const isSingleLineChart = params.colors.length === 1 - const gridSettings = isSingleLineChart - ? { - grid: { - vertLines: { style: LineStyle.CustomDotGrid, color: params.theme.neutral3 }, - horzLines: { style: LineStyle.CustomDotGrid, color: params.theme.neutral3 }, - }, - } - : {} - super.updateOptions(params, { handleScale: false, handleScroll: false, @@ -73,7 +56,6 @@ class TVLChartModel extends ChartModel { }, autoScale: true, }, - ...gridSettings, }) const { data, colors, gradients } = params @@ -114,8 +96,10 @@ export function LineChart({ height, data, sources, stale }: LineChartProps) { }, [data, sporeColors, sources, stale]) const lastEntry = data[data.length - 1] + const isSingleLineChart = params.colors.length === 1 + return ( - + {(crosshairData: StackedLineData | undefined) => ( (sum += v), 0)} diff --git a/apps/web/src/components/Charts/VolumeChart/index.tsx b/apps/web/src/components/Charts/VolumeChart/index.tsx index 4b72e9051c7..9f29e074d37 100644 --- a/apps/web/src/components/Charts/VolumeChart/index.tsx +++ b/apps/web/src/components/Charts/VolumeChart/index.tsx @@ -2,7 +2,7 @@ import { TimePeriod, toHistoryDuration } from 'appGraphql/data/util' import { GraphQLApi } from '@universe/api' import { ChartHeader } from 'components/Charts/ChartHeader' import { Chart, ChartModelParams } from 'components/Charts/ChartModel' -import { useHeaderDateFormatter } from 'components/Charts/hooks' +import { useHeaderDateFormatter } from 'components/Charts/hooks/useHeaderDateFormatter' import { CustomVolumeChartModel, CustomVolumeChartModelParams, @@ -146,6 +146,7 @@ export function VolumeChart({ height, data, feeTier, timePeriod, stale }: Volume Model={VolumeChartModel} params={params} height={height} + showDottedBackground={true} TooltipBody={ feeTier === undefined // i.e. if is token volume chart ? undefined diff --git a/apps/web/src/components/Charts/hooks/useApplyChartTextureEffects.ts b/apps/web/src/components/Charts/hooks/useApplyChartTextureEffects.ts new file mode 100644 index 00000000000..8325af9cae3 --- /dev/null +++ b/apps/web/src/components/Charts/hooks/useApplyChartTextureEffects.ts @@ -0,0 +1,90 @@ +import { useEffect } from 'react' +import { assertWebElement, TamaguiElement, useSporeColors } from 'ui/src' + +export function useApplyChartTextureEffects({ + chartDivElement, + showDottedBackground, + showLeftFadeOverlay, +}: { + chartDivElement: TamaguiElement | null + showDottedBackground: boolean + showLeftFadeOverlay: boolean +}) { + const colors = useSporeColors() + + // Track the chart td element position for scoped overlays + useEffect(() => { + if (!chartDivElement || (!showDottedBackground && !showLeftFadeOverlay)) { + return undefined + } + + assertWebElement(chartDivElement) + + const applyBackgroundTexture = (): void => { + // Find the second td in the first tr - this is the actual chart area + // Lightweight-charts structure: chartDivElement > div > table > tr:first-child > td:nth-child(2) + const chartTd = chartDivElement.querySelector( + ':scope > div > table > tr:first-child > td:nth-child(2)', + ) as HTMLTableCellElement | null + + if (!chartTd) { + return + } + + // Ensure td has position relative for absolute positioning of overlay + chartTd.style.position = 'relative' + + // Apply dotted background + if (showDottedBackground) { + chartTd.style.backgroundImage = `radial-gradient(circle, ${colors.surface3Hovered.val} 1px, transparent 1px)` + chartTd.style.backgroundSize = '20px 20px' + chartTd.style.backgroundPosition = '0 0' + } else { + // Clear styles when disabled + chartTd.style.backgroundImage = '' + chartTd.style.backgroundSize = '' + chartTd.style.backgroundPosition = '' + } + + // Handle left fade overlay + const existingOverlay = chartTd.querySelector('[data-chart-fade-overlay]') as HTMLElement | null + if (showLeftFadeOverlay) { + if (existingOverlay) { + // Update existing overlay + existingOverlay.style.background = `linear-gradient(to right, ${colors.surface1.val} 0%, transparent 100%)` + } else { + // Create new overlay element + const overlay = document.createElement('div') + overlay.setAttribute('data-chart-fade-overlay', 'true') + overlay.style.position = 'absolute' + overlay.style.top = '0' + overlay.style.left = '0' + overlay.style.bottom = '0' + overlay.style.width = '40px' + overlay.style.height = '100%' + overlay.style.background = `linear-gradient(to right, ${colors.surface1.val} 0%, transparent 100%)` + overlay.style.pointerEvents = 'none' + overlay.style.zIndex = '1' + chartTd.appendChild(overlay) + } + } else if (existingOverlay) { + // Remove overlay when disabled + existingOverlay.remove() + } + } + + applyBackgroundTexture() + + // Use observers to update when chart layout changes (chart renders asynchronously) + const mutationObserver = new MutationObserver(applyBackgroundTexture) + mutationObserver.observe(chartDivElement, { childList: true, subtree: true }) + + const resizeObserver = new ResizeObserver(applyBackgroundTexture) + resizeObserver.observe(chartDivElement) + + return () => { + mutationObserver.disconnect() + resizeObserver.disconnect() + } + }, [chartDivElement, showDottedBackground, showLeftFadeOverlay, colors.surface3Hovered.val, colors.surface1.val]) +} diff --git a/apps/web/src/components/Charts/hooks.ts b/apps/web/src/components/Charts/hooks/useHeaderDateFormatter.ts similarity index 100% rename from apps/web/src/components/Charts/hooks.ts rename to apps/web/src/components/Charts/hooks/useHeaderDateFormatter.ts diff --git a/apps/web/src/components/ConfirmSwapModal/__snapshots__/Head.test.tsx.snap b/apps/web/src/components/ConfirmSwapModal/__snapshots__/Head.test.tsx.snap index 822e14a032f..2fb8ecf070a 100644 --- a/apps/web/src/components/ConfirmSwapModal/__snapshots__/Head.test.tsx.snap +++ b/apps/web/src/components/ConfirmSwapModal/__snapshots__/Head.test.tsx.snap @@ -28,11 +28,11 @@ exports[`ConfirmSwapModal/Head > should render correctly for a Limit order 1`] = target="_blank" >
should render correctly for a Limit order 1`] = /> Get help @@ -106,11 +106,11 @@ exports[`ConfirmSwapModal/Head > should render correctly for a classic swap 1`] target="_blank" >
should render correctly for a classic swap 1`] /> Get help diff --git a/apps/web/src/components/Dropdowns/Dropdown.tsx b/apps/web/src/components/Dropdowns/Dropdown.tsx index 750c333cc25..1d61ae854d7 100644 --- a/apps/web/src/components/Dropdowns/Dropdown.tsx +++ b/apps/web/src/components/Dropdowns/Dropdown.tsx @@ -64,6 +64,7 @@ export function Dropdown({ direction={isOpen ? 'up' : 'down'} height={iconSizes.icon20} width={iconSizes.icon20} + $group-item-hover={{}} /> )} diff --git a/apps/web/src/components/Dropdowns/DropdownSelector.tsx b/apps/web/src/components/Dropdowns/DropdownSelector.tsx index dd8d0eb667a..a3f956e90ef 100644 --- a/apps/web/src/components/Dropdowns/DropdownSelector.tsx +++ b/apps/web/src/components/Dropdowns/DropdownSelector.tsx @@ -70,7 +70,7 @@ export function DropdownSelector({ }} > - {option.icon && } + {option.icon && } {option.label} {selectedValue === value && } diff --git a/apps/web/src/components/FeatureFlagModal/FeatureFlagModal.tsx b/apps/web/src/components/FeatureFlagModal/FeatureFlagModal.tsx index 0b3d9913486..25cf367861c 100644 --- a/apps/web/src/components/FeatureFlagModal/FeatureFlagModal.tsx +++ b/apps/web/src/components/FeatureFlagModal/FeatureFlagModal.tsx @@ -249,6 +249,9 @@ export default function FeatureFlagModal() { label="Disable extension deeplinks for testing mini portfolio UI on web" /> + + + - + + + + + diff --git a/apps/web/src/components/Icons/CreditCard.tsx b/apps/web/src/components/Icons/CreditCard.tsx deleted file mode 100644 index 4f975a9705c..00000000000 --- a/apps/web/src/components/Icons/CreditCard.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { ComponentProps } from 'react' - -export function CreditCardIcon(props: ComponentProps<'svg'>) { - return ( - - - - ) -} diff --git a/apps/web/src/components/Liquidity/Create/AddHook.tsx b/apps/web/src/components/Liquidity/Create/AddHook.tsx index 506d1aa9dc6..253989bcde9 100644 --- a/apps/web/src/components/Liquidity/Create/AddHook.tsx +++ b/apps/web/src/components/Liquidity/Create/AddHook.tsx @@ -1,9 +1,7 @@ import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { AdvancedButton } from 'components/Liquidity/Create/AdvancedButton' import { useLiquidityUrlState } from 'components/Liquidity/Create/hooks/useLiquidityUrlState' -import { DEFAULT_POSITION_STATE } from 'components/Liquidity/Create/types' import { HookModal } from 'components/Liquidity/HookModal' -import { isDynamicFeeTier } from 'components/Liquidity/utils/feeTiers' import { useCreateLiquidityContext } from 'pages/CreatePosition/CreateLiquidityContextProvider' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -94,7 +92,7 @@ export function AddHook() { const { hook: initialHook } = useLiquidityUrlState() const { - positionState: { hook, fee, protocolVersion }, + positionState: { hook, protocolVersion }, setPositionState, } = useCreateLiquidityContext() const [hookInputEnabled, setHookInputEnabled] = useState(!!hook) @@ -106,6 +104,7 @@ export function AddHook() { ...state, hook: value, userApprovedHook: value, + fee: undefined, })) }, [setPositionState], @@ -122,17 +121,11 @@ export function AddHook() { }, [initialHook, protocolVersion, setPositionState]) const onClearHook = useCallback(() => { - if (isDynamicFeeTier(fee)) { - setPositionState((state) => ({ - ...state, - fee: DEFAULT_POSITION_STATE.fee, - })) - } - setHookInputEnabled(false) setHookValue('') onSelectHook(undefined) - }, [fee, onSelectHook, setPositionState]) + setPositionState((state) => ({ ...state, fee: undefined })) + }, [onSelectHook, setPositionState]) // In the case that the user clears a hook that was filled in from a url // this ensures the input is cleared again @@ -154,10 +147,7 @@ export function AddHook() { isOpen={hookModalOpen} address={hookValue} onClose={() => setHookModalOpen(false)} - onClearHook={() => { - setHookInputEnabled(false) - setHookValue('') - }} + onClearHook={onClearHook} onContinue={() => onSelectHook(hookValue)} /> )} @@ -165,8 +155,7 @@ export function AddHook() { { - setHookInputEnabled(true) - onSelectHook(undefined) + setHookModalOpen(true) }} > {shortenAddress({ address: hook })} - + { + e.preventDefault() + onClearHook() + }} + > {t('common.clear')} diff --git a/apps/web/src/components/Liquidity/Create/DynamicFeeTierSpeedbump.tsx b/apps/web/src/components/Liquidity/Create/DynamicFeeTierSpeedbump.tsx index b8bc97fd77c..20b670d49e8 100644 --- a/apps/web/src/components/Liquidity/Create/DynamicFeeTierSpeedbump.tsx +++ b/apps/web/src/components/Liquidity/Create/DynamicFeeTierSpeedbump.tsx @@ -19,11 +19,13 @@ export const DynamicFeeTierSpeedbump = () => { const handleConfirm = () => { setPositionState((prevState) => ({ ...prevState, - fee: { - feeAmount: dynamicFeeTierSpeedbumpData.wishFeeData.feeAmount, - tickSpacing: dynamicFeeTierSpeedbumpData.wishFeeData.tickSpacing, - isDynamic: dynamicFeeTierSpeedbumpData.wishFeeData.isDynamic, - }, + fee: dynamicFeeTierSpeedbumpData.wishFeeData + ? { + feeAmount: dynamicFeeTierSpeedbumpData.wishFeeData.feeAmount, + tickSpacing: dynamicFeeTierSpeedbumpData.wishFeeData.tickSpacing, + isDynamic: dynamicFeeTierSpeedbumpData.wishFeeData.isDynamic, + } + : undefined, })) setDynamicFeeTierSpeedbumpData({ @@ -56,10 +58,10 @@ export const DynamicFeeTierSpeedbump = () => { subtext={t('fee.tier.dynamic.create.info')} onClose={handleCancel} primaryButtonText={t('common.button.continue')} - primaryButtonOnClick={handleConfirm} + primaryButtonOnPress={handleConfirm} primaryButtonVariant="default" secondaryButtonText={t('common.button.cancel')} - secondaryButtonOnClick={handleCancel} + secondaryButtonOnPress={handleCancel} modalName={ModalName.DynamicFeeTierSpeedbump} displayHelpCTA /> diff --git a/apps/web/src/components/Liquidity/Create/RangeSelectionStep.tsx b/apps/web/src/components/Liquidity/Create/RangeSelectionStep.tsx index 7ad8a3b54b9..7e4636d89b1 100644 --- a/apps/web/src/components/Liquidity/Create/RangeSelectionStep.tsx +++ b/apps/web/src/components/Liquidity/Create/RangeSelectionStep.tsx @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { D3LiquidityRangeInput } from 'components/Charts/D3LiquidityRangeInput/D3LiquidityRangeInput' @@ -335,7 +336,7 @@ export const SelectPriceRangeStep = ({ ? { baseCurrency, quoteCurrency, - feeAmount: fee.feeAmount, + feeAmount: fee?.feeAmount, tickLower: ticks[0], tickUpper: ticks[1], pool: poolOrPair, @@ -516,6 +517,7 @@ export const SelectPriceRangeStep = ({ )} {baseCurrency && quoteCurrency && + fee && (isD3LiquidityRangeChartEnabled ? ( ; tokenB: Maybe }>> } & FlexProps) { const { loadingA, loadingB } = useLiquidityUrlState() - const { useParsedQueryString } = useUrlContext() - const parsedQs = useParsedQueryString() const { formatPercent } = useLocalizationContext() const { t } = useTranslation() const { setSelectedChainId } = useMultichainContext() @@ -263,6 +261,9 @@ export function SelectTokensStep({ setSelectedChainId(currency.chainId) + // If the tokens change, we want to reset the default fee tier (mostUsedFeeTier) in the useEffect below. + setPositionState((prevState) => ({ ...prevState, fee: undefined })) + if (areCurrenciesEqual(currency, otherCurrency) || areCurrenciesEqual(wrappedCurrencyNew, wrappedCurrencyOther)) { setCurrencyInputs((prevState) => ({ ...prevState, @@ -284,8 +285,6 @@ export function SelectTokensStep({ switch (currencySearchInputState) { case 'tokenA': case 'tokenB': - // If the tokens change, we want to reset the default fee tier in the useEffect below. - setDefaultFeeTierSelected(false) setCurrencyInputs((prevState) => ({ ...prevState, [currencySearchInputState]: currency, @@ -295,7 +294,7 @@ export function SelectTokensStep({ break } }, - [currencySearchInputState, setCurrencyInputs, currencyInputs, setSelectedChainId], + [currencySearchInputState, setCurrencyInputs, currencyInputs, setSelectedChainId, setPositionState], ) const handleFeeTierSelect = useCallback( @@ -322,7 +321,6 @@ export function SelectTokensStep({ [feeTierData, isLpIncentivesEnabled], ) - const [defaultFeeTierSelected, setDefaultFeeTierSelected] = useState(false) const mostUsedFeeTier = useMemo(() => { if (hasExistingFeeTiers && Object.keys(feeTierData).length > 0) { return Object.values(feeTierData).reduce((highest, current) => { @@ -333,18 +331,18 @@ export function SelectTokensStep({ return undefined }, [hasExistingFeeTiers, feeTierData]) - // If the userApprovedHook changes, we want to reset the default fee tier in the useEffect below. - // biome-ignore lint/correctness/useExhaustiveDependencies: +userApprovedHook useEffect(() => { - setDefaultFeeTierSelected(false) - }, [userApprovedHook]) + // If a fee tier is already set, return + if (fee) { + return + } - useEffect(() => { - // Don't auto-select recommended fee if user provided either legacy feeTier param or modern fee param - // or if the user is migrating a position - const hasUserProvidedFee = parsedQs.feeTier || parsedQs.fee - if (mostUsedFeeTier && !defaultFeeTierSelected && !hasUserProvidedFee && !tokensLocked) { - setDefaultFeeTierSelected(true) + // If the tokens are locked, return + if (tokensLocked) { + return + } + + if (mostUsedFeeTier) { setPositionState((prevState) => ({ ...prevState, fee: mostUsedFeeTier.fee, @@ -355,7 +353,7 @@ export function SelectTokensStep({ ...trace, }) } - }, [tokensLocked, mostUsedFeeTier, defaultFeeTierSelected, parsedQs, setPositionState, trace]) + }, [tokensLocked, mostUsedFeeTier, fee, setPositionState, trace]) const { chains } = useEnabledChains({ platform: Platform.EVM }) const supportedChains = useMemo(() => { @@ -439,10 +437,10 @@ export function SelectTokensStep({ // to ensure the current selected fee tier rewards APR matches the same fee tier in the fee tier selector, // grab the rewards tier from the fee tier directly const matchingFeeTier = Object.values(feeTierData).find( - (tier) => getFeeTierKey(tier.fee.feeAmount, tier.fee.isDynamic) === getFeeTierKey(fee.feeAmount, fee.isDynamic), + (tier) => getFeeTierKey(tier.fee.feeAmount, tier.fee.isDynamic) === getFeeTierKey(fee?.feeAmount, fee?.isDynamic), ) return matchingFeeTier?.boostedApr && matchingFeeTier.boostedApr > 0 ? matchingFeeTier.boostedApr : undefined - }, [isLpIncentivesEnabled, protocolVersion, feeTierData, fee.feeAmount, fee.isDynamic]) + }, [isLpIncentivesEnabled, protocolVersion, feeTierData, fee?.feeAmount, fee?.isDynamic]) const defaultFeeTiers = getDefaultFeeTiersWithData({ chainId: token0?.chainId, feeTierData, protocolVersion }) @@ -453,7 +451,7 @@ export function SelectTokensStep({ isOpen={hookModalOpen} address={hook} onClose={() => setHookModalOpen(false)} - onClearHook={() => setPositionState((state) => ({ ...state, hook: undefined }))} + onClearHook={() => setPositionState((state) => ({ ...state, hook: undefined, fee: undefined }))} onContinue={() => { setPositionState((state) => ({ ...state, userApprovedHook: hook })) onContinue() @@ -530,8 +528,10 @@ export function SelectTokensStep({ > - - {isDynamicFeeTier(fee) ? ( + + {!fee ? ( + + ) : isDynamicFeeTier(fee) ? ( ) : ( )} - {getFeeTierKey(fee.feeAmount, fee.isDynamic) === - (mostUsedFeeTier && - getFeeTierKey(mostUsedFeeTier.fee.feeAmount, mostUsedFeeTier.fee.isDynamic)) ? ( + {fee && + getFeeTierKey(fee.feeAmount, fee.isDynamic) === + (mostUsedFeeTier && + getFeeTierKey(mostUsedFeeTier.fee.feeAmount, mostUsedFeeTier.fee.isDynamic)) ? ( - ) : defaultFeeTiers.find( + ) : fee && + defaultFeeTiers.find( (tier) => getFeeTierKey(tier.value.feeAmount, tier.value.isDynamic) === getFeeTierKey(fee.feeAmount, fee.isDynamic), - ) ? null : ( + ) ? null : fee ? ( - )} - {lpIncentiveRewardApr && ( + ) : null} + {fee && lpIncentiveRewardApr && ( {t('common.button.continue')} diff --git a/apps/web/src/components/Liquidity/Create/hooks/useDerivedPositionInfo.test.ts b/apps/web/src/components/Liquidity/Create/hooks/useDerivedPositionInfo.test.ts index cd3a6f8d548..318112b540a 100644 --- a/apps/web/src/components/Liquidity/Create/hooks/useDerivedPositionInfo.test.ts +++ b/apps/web/src/components/Liquidity/Create/hooks/useDerivedPositionInfo.test.ts @@ -34,8 +34,8 @@ class MockPoolInformation extends PoolInformation { tokenAddressA = ETH_MAINNET.wrapped.address tokenAddressB = USDT.address chainId = ChainId.MAINNET - tokenAReserves = '1000000000000000000' - tokenBReserves = '2000000000000000000' + token0Reserves = '1000000000000000000' + token1Reserves = '2000000000000000000' hookAddress = ZERO_ADDRESS constructor(readonly protocolVersion: ProtocolVersion) { @@ -68,8 +68,8 @@ const mockV4Pool = new V4Pool( ) const mockPair = new Pair( - CurrencyAmount.fromRawAmount(ETH_MAINNET.wrapped, mockV2PairInformation.tokenAReserves), - CurrencyAmount.fromRawAmount(USDT, mockV2PairInformation.tokenBReserves), + CurrencyAmount.fromRawAmount(ETH_MAINNET.wrapped, mockV2PairInformation.token0Reserves), + CurrencyAmount.fromRawAmount(USDT, mockV2PairInformation.token1Reserves), ) // remove the following mocks once the PoolInfoEndpoint is fully rolled out diff --git a/apps/web/src/components/Liquidity/Create/hooks/useDerivedPositionInfo.tsx b/apps/web/src/components/Liquidity/Create/hooks/useDerivedPositionInfo.tsx index 74c21f66c0c..d3462351a30 100644 --- a/apps/web/src/components/Liquidity/Create/hooks/useDerivedPositionInfo.tsx +++ b/apps/web/src/components/Liquidity/Create/hooks/useDerivedPositionInfo.tsx @@ -7,11 +7,12 @@ import { CreateV2PositionInfo, CreateV3PositionInfo, CreateV4PositionInfo, + DYNAMIC_FEE_DATA, FeeData, PositionState, } from 'components/Liquidity/Create/types' import { getCurrencyWithWrap, getTokenOrZeroAddress, validateCurrencyInput } from 'components/Liquidity/utils/currency' -import { getFeeTierKey } from 'components/Liquidity/utils/feeTiers' +import { getFeeTierKey, isDynamicFeeTier } from 'components/Liquidity/utils/feeTiers' import { getSDKPoolFromPoolInformation, getV4SDKPoolFromRestPool } from 'components/Liquidity/utils/parseFromRest' import { getProtocols, @@ -93,16 +94,15 @@ function useGetLegacyPoolOrPair({ protocolVersion: ProtocolVersion validCurrencyInput: boolean sortedCurrencies: { [field in PositionField]: Maybe } - fee: FeeData + fee?: FeeData hook?: string }): CreatePositionInfo { const { chainId } = useMultichainContext() - const poolsQueryEnabled = - !isPoolInfoEndpointEnabled && poolEnabledProtocolVersion(protocolVersion) && validCurrencyInput - const token0 = getCurrencyWithWrap(sortedCurrencies.TOKEN0, protocolVersion) const token1 = getCurrencyWithWrap(sortedCurrencies.TOKEN1, protocolVersion) + const poolsQueryEnabled = + fee !== undefined && !isPoolInfoEndpointEnabled && poolEnabledProtocolVersion(protocolVersion) && validCurrencyInput const { data: poolData, isLoading: poolIsLoading, @@ -110,7 +110,7 @@ function useGetLegacyPoolOrPair({ refetch: refetchPoolData, } = useGetPoolsByTokens( { - fee: fee.feeAmount, + fee: fee?.feeAmount, chainId, protocolVersions: [protocolVersion], token0: getTokenOrZeroAddress(token0), @@ -120,7 +120,8 @@ function useGetLegacyPoolOrPair({ poolsQueryEnabled, ) - const pool = poolData?.pools && poolData.pools.length > 0 ? filterPoolByFeeTier(poolData.pools[0], fee) : undefined + const pool = + poolData?.pools && poolData.pools.length > 0 && fee ? filterPoolByFeeTier(poolData.pools[0], fee) : undefined const pairResult = useV2Pair(sortedCurrencies.TOKEN0?.wrapped, sortedCurrencies.TOKEN1?.wrapped) const pairIsLoading = pairResult[0] === PairState.LOADING @@ -131,7 +132,7 @@ function useGetLegacyPoolOrPair({ const v3PoolResult = usePool({ currencyA: sortedCurrencies.TOKEN0?.wrapped, currencyB: sortedCurrencies.TOKEN1?.wrapped, - feeAmount: fee.feeAmount, + feeAmount: fee?.feeAmount, }) const v3Pool = protocolVersion === ProtocolVersion.V3 ? (v3PoolResult[1] ?? undefined) : undefined @@ -147,6 +148,10 @@ function useGetLegacyPoolOrPair({ }, [pool, protocolVersion, sortedCurrencies]) const creatingPoolOrPair = useMemo(() => { + if (!fee) { + return false + } + if (protocolVersion === ProtocolVersion.UNSPECIFIED) { return false } @@ -160,7 +165,7 @@ function useGetLegacyPoolOrPair({ } return poolDataIsFetched && !pool - }, [protocolVersion, pairResult, v3PoolResult, pool, poolDataIsFetched]) + }, [protocolVersion, pairResult, v3PoolResult, pool, poolDataIsFetched, fee]) return useMemo(() => { if (protocolVersion === ProtocolVersion.UNSPECIFIED) { @@ -264,6 +269,8 @@ export function useDerivedPositionInfo( const token1 = getCurrencyWithWrap(sortedCurrencies.TOKEN1, protocolVersion) const protocol = getProtocols(protocolVersion) + const isFeeValid = protocolVersion === ProtocolVersion.V2 ? true : state.fee !== undefined + const { data: poolData, isLoading: poolIsLoading, @@ -277,12 +284,12 @@ export function useDerivedPositionInfo( poolParameters: new PoolParameters({ tokenAddressA: getTokenOrZeroAddress(token0), tokenAddressB: getTokenOrZeroAddress(token1), - fee: state.fee.feeAmount, + fee: isDynamicFeeTier(state.fee) ? DYNAMIC_FEE_DATA.feeAmount : state.fee?.feeAmount, hookAddress: state.hook, - tickSpacing: state.fee.tickSpacing, + tickSpacing: state.fee?.tickSpacing, }), }), - enabled: isPoolInfoEndpointEnabled && validCurrencyInput && protocol !== undefined, + enabled: isPoolInfoEndpointEnabled && validCurrencyInput && protocol !== undefined && isFeeValid, }) const poolOrPair = poolData?.pools && poolData.pools.length > 0 ? poolData.pools[0] : undefined diff --git a/apps/web/src/components/Liquidity/Create/hooks/useLiquidityUrlState.test.ts b/apps/web/src/components/Liquidity/Create/hooks/useLiquidityUrlState.test.ts index 9b2a255004d..63c3a798c99 100644 --- a/apps/web/src/components/Liquidity/Create/hooks/useLiquidityUrlState.test.ts +++ b/apps/web/src/components/Liquidity/Create/hooks/useLiquidityUrlState.test.ts @@ -183,9 +183,9 @@ describe('useLiquidityUrlState', () => { vi.fn(), ]) const { result } = renderHook(() => useLiquidityUrlState()) - expect(result.current.fee.feeAmount).toBe(500) - expect(result.current.fee.isDynamic).toBe(true) - expect(result.current.fee.tickSpacing).toBe(10) + expect(result.current.fee?.feeAmount).toBe(500) + expect(result.current.fee?.isDynamic).toBe(true) + expect(result.current.fee?.tickSpacing).toBe(10) }) it('returns default fee when no fee data provided', () => { @@ -493,7 +493,7 @@ describe('useLiquidityUrlState', () => { // Verify specific values expect(result.current.tokenA).toEqual(USDC) - expect(result.current.fee.feeAmount).toBe(3000) + expect(result.current.fee?.feeAmount).toBe(3000) expect(result.current.hook).toBe('0x0000000000000000000000000000000000000001') expect(result.current.priceRangeState.minPrice).toBe('1.0') expect(result.current.depositState.exactAmounts?.[PositionField.TOKEN0]).toBe('100') diff --git a/apps/web/src/components/Liquidity/Create/types.ts b/apps/web/src/components/Liquidity/Create/types.ts index fefa50168db..e34fc3ec267 100644 --- a/apps/web/src/components/Liquidity/Create/types.ts +++ b/apps/web/src/components/Liquidity/Create/types.ts @@ -38,11 +38,12 @@ export interface InitialPosition { tickLower: number tickUpper: number isOutOfRange: boolean + fee: FeeData } export interface PositionState { protocolVersion: ProtocolVersion - fee: FeeData + fee?: FeeData hook?: string userApprovedHook?: string // address of approved hook. If different from `hook`, user needs to reapprove the new hook // Initial position is provided for migration purposes. @@ -56,7 +57,7 @@ export const DEFAULT_FEE_DATA = { } export const DEFAULT_POSITION_STATE: PositionState = { - fee: DEFAULT_FEE_DATA, + fee: undefined, hook: undefined, userApprovedHook: undefined, protocolVersion: ProtocolVersion.V4, @@ -104,7 +105,7 @@ export type CreatePositionInfo = CreateV4PositionInfo | CreateV3PositionInfo | C export interface DynamicFeeTierSpeedbumpData { open: boolean - wishFeeData: FeeData + wishFeeData?: FeeData } export type PriceDifference = { diff --git a/apps/web/src/components/Liquidity/FeeTierSearchModal.tsx b/apps/web/src/components/Liquidity/FeeTierSearchModal.tsx index 9a307cc15f8..199016e2bd3 100644 --- a/apps/web/src/components/Liquidity/FeeTierSearchModal.tsx +++ b/apps/web/src/components/Liquidity/FeeTierSearchModal.tsx @@ -421,7 +421,7 @@ export function FeeTierSearchModal() { {getFeeTierKey(pool.fee.feeAmount, pool.fee.isDynamic) === - getFeeTierKey(selectedFee.feeAmount, selectedFee.isDynamic) && ( + getFeeTierKey(selectedFee?.feeAmount, selectedFee?.isDynamic) && ( )} diff --git a/apps/web/src/components/Liquidity/LPIncentives/LpIncentiveClaimModal.tsx b/apps/web/src/components/Liquidity/LPIncentives/LpIncentiveClaimModal.tsx index cac60cc2a6c..9f09022614b 100644 --- a/apps/web/src/components/Liquidity/LPIncentives/LpIncentiveClaimModal.tsx +++ b/apps/web/src/components/Liquidity/LPIncentives/LpIncentiveClaimModal.tsx @@ -108,7 +108,7 @@ export function LpIncentiveClaimModal({ } displayHelpCTA onClose={onClose} - primaryButtonOnClick={buttonConfig.onClick} + primaryButtonOnPress={buttonConfig.onClick} isPrimaryButtonLoading={buttonConfig.isLoading} modalName={ModalName.LpIncentiveClaimModal} primaryButtonText={buttonConfig.title} diff --git a/apps/web/src/components/Liquidity/LiquidityPositionCard.tsx b/apps/web/src/components/Liquidity/LiquidityPositionCard.tsx index d752040c92b..f36dbb8963f 100644 --- a/apps/web/src/components/Liquidity/LiquidityPositionCard.tsx +++ b/apps/web/src/components/Liquidity/LiquidityPositionCard.tsx @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { PositionStatus, ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { @@ -8,6 +9,7 @@ import { } from 'components/Charts/LiquidityPositionRangeChart/LiquidityPositionRangeChart' import { AdaptiveDropdown } from 'components/Dropdowns/AdaptiveDropdown' import { useGetRangeDisplay } from 'components/Liquidity/hooks/useGetRangeDisplay' +import { useReportPositionHandler } from 'components/Liquidity/hooks/useReportPositionHandler' import { LiquidityPositionFeeStats, LiquidityPositionFeeStatsLoader, @@ -32,6 +34,7 @@ import { ArrowsLeftRight } from 'ui/src/components/icons/ArrowsLeftRight' import { Dollar } from 'ui/src/components/icons/Dollar' import { Eye } from 'ui/src/components/icons/Eye' import { EyeOff } from 'ui/src/components/icons/EyeOff' +import { Flag } from 'ui/src/components/icons/Flag' import { InfoCircleFilled } from 'ui/src/components/icons/InfoCircleFilled' import { Minus } from 'ui/src/components/icons/Minus' import { MoreHorizontal } from 'ui/src/components/icons/MoreHorizontal' @@ -46,7 +49,7 @@ import { useLocalizationContext } from 'uniswap/src/features/language/Localizati import { ModalName } from 'uniswap/src/features/telemetry/constants' import { useCurrencyInfo } from 'uniswap/src/features/tokens/useCurrencyInfo' import { useUSDCValue } from 'uniswap/src/features/transactions/hooks/useUSDCPrice' -import { togglePositionVisibility } from 'uniswap/src/features/visibility/slice' +import { setPositionVisibility } from 'uniswap/src/features/visibility/slice' import { buildCurrencyId, currencyAddress } from 'uniswap/src/utils/currencyId' import { getPoolDetailsURL } from 'uniswap/src/utils/linking' import { NumberType } from 'utilities/src/format/types' @@ -87,38 +90,91 @@ function useDropdownOptions({ }: { liquidityPosition: PositionInfo showVisibilityOption?: boolean - isVisible?: boolean + isVisible: boolean }): MenuOptionItem[] { const { t } = useTranslation() const isOpenLiquidityPosition = liquidityPosition.status !== PositionStatus.CLOSED + const isDataReportingEnabled = useFeatureFlag(FeatureFlags.DataReportingAbilities) const dispatch = useAppDispatch() const navigate = useNavigate() const account = useAccount() const selectChain = useSelectChain() + const reportPositionHandler = useReportPositionHandler({ position: liquidityPosition, isVisible }) return useMemo(() => { const chainInfo = getChainInfo(liquidityPosition.chainId) - const addLiquidityOption = { - onPress: () => { - dispatch(setOpenModal({ name: ModalName.AddLiquidity, initialState: liquidityPosition })) - }, - label: t('common.addLiquidity'), - Icon: Plus, + const options: MenuOptionItem[] = [] + + const isV2Position = liquidityPosition.version === ProtocolVersion.V2 + const isV3Position = liquidityPosition.version === ProtocolVersion.V3 + const showMigrateV3Option = + isV3Position && isOpenLiquidityPosition && !isV4UnsupportedChain(liquidityPosition.chainId) + + if (!isV2Position && isOpenLiquidityPosition) { + options.push({ + onPress: () => { + dispatch( + setOpenModal({ + name: ModalName.ClaimFee, + initialState: liquidityPosition, + }), + ) + }, + label: t('pool.collectFees'), + Icon: Dollar, + }) } - const removeLiquidityOption: MenuOptionItem | undefined = isOpenLiquidityPosition - ? { - onPress: () => { - dispatch(setOpenModal({ name: ModalName.RemoveLiquidity, initialState: liquidityPosition })) - }, - label: t('pool.removeLiquidity'), - Icon: Minus, - } - : undefined + // closed v2 positions cannot re-add liquidity since the erc20 liquidity token is permanently burned when closed, + // whereas v3 positions can be re-opened + if (!isV2Position || isOpenLiquidityPosition) { + options.push({ + onPress: () => { + dispatch(setOpenModal({ name: ModalName.AddLiquidity, initialState: liquidityPosition })) + }, + label: t('common.addLiquidity'), + Icon: Plus, + }) + } - const poolInfoOption = { + if (isOpenLiquidityPosition) { + options.push({ + onPress: () => { + dispatch(setOpenModal({ name: ModalName.RemoveLiquidity, initialState: liquidityPosition })) + }, + label: t('pool.removeLiquidity'), + Icon: Minus, + }) + } + + // Add migration options if relevant + + if (isV2Position && isOpenLiquidityPosition) { + options.push({ + onPress: async () => { + if (liquidityPosition.chainId !== account.chainId) { + await selectChain(liquidityPosition.chainId) + } + navigate(`/migrate/v2/${liquidityPosition.liquidityToken.address}`) + }, + label: t('pool.migrateLiquidity'), + Icon: RightArrow, + }) + } + + if (showMigrateV3Option) { + options.push({ + onPress: () => { + navigate(`/migrate/v3/${chainInfo.urlParam}/${liquidityPosition.tokenId}`) + }, + label: t('pool.migrateLiquidity'), + Icon: RightArrow, + }) + } + + options.push({ onPress: () => { if (!liquidityPosition.poolId) { return @@ -128,95 +184,47 @@ function useDropdownOptions({ }, label: t('pool.info'), Icon: InfoCircleFilled, + }) + + if (showVisibilityOption) { + options.push({ + onPress: () => { + dispatch( + setPositionVisibility({ + poolId: liquidityPosition.poolId, + tokenId: liquidityPosition.tokenId, + chainId: liquidityPosition.chainId, + isVisible: !isVisible, + }), + ) + }, + label: isVisible ? t('common.hide.button') : t('common.unhide'), + Icon: isVisible ? EyeOff : Eye, + showDivider: true, + }) + + if (isDataReportingEnabled) { + options.push({ + onPress: reportPositionHandler, + label: t('nft.reportSpam'), + Icon: Flag, + destructive: true, + }) + } } - const hideOption: MenuOptionItem | undefined = showVisibilityOption - ? { - onPress: () => { - dispatch( - togglePositionVisibility({ - poolId: liquidityPosition.poolId, - tokenId: liquidityPosition.tokenId, - chainId: liquidityPosition.chainId, - }), - ) - }, - label: isVisible ? t('common.hide.button') : t('common.unhide'), - Icon: isVisible ? EyeOff : Eye, - showDivider: true, - } - : undefined - - if (liquidityPosition.version === ProtocolVersion.V2) { - const migrateV2Option = isOpenLiquidityPosition - ? { - onPress: async () => { - if (liquidityPosition.chainId !== account.chainId) { - await selectChain(liquidityPosition.chainId) - } - navigate(`/migrate/v2/${liquidityPosition.liquidityToken.address}`) - }, - label: t('pool.migrateLiquidity'), - Icon: RightArrow, - } - : undefined - - return [ - isOpenLiquidityPosition ? addLiquidityOption : undefined, // closed v2 positions cannot re-add liquidity since the erc20 liquidity token is permanently burned when closed. whereas v3 positions can be re-opened - removeLiquidityOption, - migrateV2Option, - poolInfoOption, - hideOption, - ].filter((o): o is MenuOptionItem => o !== undefined) - } - - const collectFeesOption: MenuOptionItem | undefined = isOpenLiquidityPosition - ? { - onPress: () => { - dispatch( - setOpenModal({ - name: ModalName.ClaimFee, - initialState: liquidityPosition, - }), - ) - }, - label: t('pool.collectFees'), - Icon: Dollar, - } - : undefined - - const showMigrateV3Option = - isOpenLiquidityPosition && - !isV4UnsupportedChain(liquidityPosition.chainId) && - liquidityPosition.version !== ProtocolVersion.V4 - - const migrateV3Option: MenuOptionItem | undefined = showMigrateV3Option - ? { - onPress: () => { - navigate(`/migrate/v3/${chainInfo.urlParam}/${liquidityPosition.tokenId}`) - }, - label: t('pool.migrateLiquidity'), - Icon: RightArrow, - } - : undefined - - return [ - collectFeesOption, - addLiquidityOption, - removeLiquidityOption, - migrateV3Option, - poolInfoOption, - hideOption, - ].filter((o): o is MenuOptionItem => o !== undefined) + return options }, [ account.chainId, dispatch, isOpenLiquidityPosition, + reportPositionHandler, isVisible, liquidityPosition, navigate, showVisibilityOption, selectChain, + isDataReportingEnabled, t, ]) } @@ -574,7 +582,6 @@ function PositionDropdownMoreMenu({ void { + const dispatch = useAppDispatch() + const navigate = useNavigate() + const { t } = useTranslation() + + return useEvent(() => { + if (!position) { + return + } + + // Submit report + submitPoolSpamReport({ + chainId: position.chainId, + poolId: position.poolId, + version: position.version, + token0: position.currency0Amount.currency, + token1: position.currency1Amount.currency, + }) + + // hide position if not already hidden + if (isVisible) { + dispatch( + setPositionVisibility({ + poolId: position.poolId, + tokenId: position.tokenId, + chainId: position.chainId, + isVisible: false, + }), + ) + } + + // pop reported toast + popupRegistry.addPopup( + { type: PopupType.Success, message: t('common.reported') }, + 'report-position-success', + POPUP_MEDIUM_DISMISS_MS, + ) + + // navigate to position page + if (navigateToPositions) { + navigate('/positions') + } + }) +} diff --git a/apps/web/src/components/Liquidity/parsers/urlParsers.ts b/apps/web/src/components/Liquidity/parsers/urlParsers.ts index b6e2b2e4f40..3fc1b29fd5e 100644 --- a/apps/web/src/components/Liquidity/parsers/urlParsers.ts +++ b/apps/web/src/components/Liquidity/parsers/urlParsers.ts @@ -1,5 +1,4 @@ import { - DEFAULT_FEE_DATA, FeeData, PositionFlowStep, PriceRangeState, @@ -37,13 +36,13 @@ const depositStateSchema: z.ZodSchema> = z }) .partial() -const feeDataSchema: z.ZodSchema = z.object({ +const feeDataSchema: z.ZodSchema = z.object({ feeAmount: z.number(), tickSpacing: z.number(), isDynamic: z.boolean(), }) -export const parseAsFeeData = parseAsJson(feeDataSchema.parse).withDefault(DEFAULT_FEE_DATA) +export const parseAsFeeData = parseAsJson(feeDataSchema.parse) export const parseAsPriceRangeState = parseAsJson(priceRangeStateSchema.parse).withDefault({}) diff --git a/apps/web/src/components/Liquidity/utils/feeTiers.test.ts b/apps/web/src/components/Liquidity/utils/feeTiers.test.ts index 8a671a5926d..523d061a810 100644 --- a/apps/web/src/components/Liquidity/utils/feeTiers.test.ts +++ b/apps/web/src/components/Liquidity/utils/feeTiers.test.ts @@ -50,6 +50,7 @@ describe('mergeFeeTiers', () => { const formattedDynamicFeeTier = 'dynamic' const staticFee = { feeAmount: 100, isDynamic: false, tickSpacing: 60 } const dynamicFee = { feeAmount: 100, isDynamic: true, tickSpacing: 60 } + const dynamicFeeKey = getFeeTierKey(dynamicFee.feeAmount, true)! const staticFeeTierData: FeeTierData = { fee: staticFee, @@ -99,7 +100,8 @@ describe('mergeFeeTiers', () => { it('formats static and dynamic fees correctly', () => { const defaultFeeData = [staticFee] - let feeTiers = { [getFeeTierKey(DYNAMIC_FEE_DATA.feeAmount, true)]: defaultDynamicFeeTierData } + const dynamicKey = getFeeTierKey(DYNAMIC_FEE_DATA.feeAmount, true)! + let feeTiers = { [dynamicKey]: defaultDynamicFeeTierData } let result = mergeFeeTiers({ feeTiers, defaultFeeData, formatPercent, formattedDynamicFeeTier }) expect(result).toEqual({ 100: { @@ -108,10 +110,10 @@ describe('mergeFeeTiers', () => { tvl: '0', percentage: new Percent(0, 100), }, - [getFeeTierKey(DYNAMIC_FEE_DATA.feeAmount, true)]: defaultDynamicFeeTierData, + [dynamicKey]: defaultDynamicFeeTierData, }) - feeTiers = { [getFeeTierKey(dynamicFee.feeAmount, true)]: dynamicFeeTierData } + feeTiers = { [dynamicFeeKey]: dynamicFeeTierData } result = mergeFeeTiers({ feeTiers, defaultFeeData, formatPercent, formattedDynamicFeeTier }) expect(result).toEqual({ 100: { @@ -120,7 +122,7 @@ describe('mergeFeeTiers', () => { tvl: '0', percentage: new Percent(0, 100), }, - [getFeeTierKey(dynamicFee.feeAmount, true)]: dynamicFeeTierData, + [dynamicFeeKey]: dynamicFeeTierData, }) }) @@ -128,12 +130,13 @@ describe('mergeFeeTiers', () => { const defaultFeeData = [staticFee, dynamicFee] const feeTiers = { '100': { ...staticFeeTierData, totalLiquidityUsd: 999 } } const result = mergeFeeTiers({ feeTiers, defaultFeeData, formatPercent, formattedDynamicFeeTier }) + expect(result).toEqual({ 100: { ...staticFeeTierData, totalLiquidityUsd: 999, }, - [getFeeTierKey(dynamicFee.feeAmount, true)]: { + [dynamicFeeKey]: { ...dynamicFeeTierData, created: false, totalLiquidityUsd: 0, diff --git a/apps/web/src/components/Liquidity/utils/feeTiers.ts b/apps/web/src/components/Liquidity/utils/feeTiers.ts index d331692bfa9..3823b216e3f 100644 --- a/apps/web/src/components/Liquidity/utils/feeTiers.ts +++ b/apps/web/src/components/Liquidity/utils/feeTiers.ts @@ -26,7 +26,10 @@ export function calculateTickSpacingFromFeeAmount(feeAmount: number): number { return Math.max(Math.round((2 * feeAmount) / 100), 1) } -export function getFeeTierKey(feeTier: number, isDynamicFee: boolean): string { +export function getFeeTierKey(feeTier?: number, isDynamicFee?: boolean): string | undefined { + if (feeTier === undefined) { + return undefined + } return feeTier + (isDynamicFee ? '-dynamic' : '') } @@ -68,16 +71,18 @@ export function mergeFeeTiers({ } const key = getFeeTierKey(feeTier.feeAmount, isDynamicFeeTier(feeTier)) - result[key] = { - fee: feeTier, - formattedFee: isDynamicFeeTier(feeTier) - ? formattedDynamicFeeTier - : formatPercent(feeTier.feeAmount / BIPS_BASE, MAX_FEE_TIER_DECIMALS), - totalLiquidityUsd: 0, - percentage: new Percent(0, 100), - created: false, - tvl: '0', - } satisfies FeeTierData + if (key) { + result[key] = { + fee: feeTier, + formattedFee: isDynamicFeeTier(feeTier) + ? formattedDynamicFeeTier + : formatPercent(feeTier.feeAmount / BIPS_BASE, MAX_FEE_TIER_DECIMALS), + totalLiquidityUsd: 0, + percentage: new Percent(0, 100), + created: false, + tvl: '0', + } satisfies FeeTierData + } } return { ...result, ...feeTiers } @@ -227,8 +232,8 @@ export function getDefaultFeeTiersWithData({ } /* eslint-enable @typescript-eslint/no-unnecessary-condition */ -export function isDynamicFeeTier(feeData: FeeData): feeData is DynamicFeeData { - return feeData.isDynamic || feeData.feeAmount === DYNAMIC_FEE_DATA.feeAmount +export function isDynamicFeeTier(feeData?: FeeData): feeData is DynamicFeeData { + return feeData?.isDynamic || feeData?.feeAmount === DYNAMIC_FEE_DATA.feeAmount } const sortFeeTiersByTvl = (a: { tvl: string }, b: { tvl: string }) => { diff --git a/apps/web/src/components/Liquidity/utils/parseFromRest.test.ts b/apps/web/src/components/Liquidity/utils/parseFromRest.test.ts index 69d16b345af..c014f383e3c 100644 --- a/apps/web/src/components/Liquidity/utils/parseFromRest.test.ts +++ b/apps/web/src/components/Liquidity/utils/parseFromRest.test.ts @@ -80,8 +80,8 @@ describe('getSDKPoolFromPoolInformation', () => { tokenAddressA = token0.address tokenAddressB = token1.address chainId = ChainId.MAINNET - tokenAReserves = '1000000000000000000' - tokenBReserves = '2000000000000000000' + token0Reserves = '1000000000000000000' + token1Reserves = '2000000000000000000' hookAddress = hooks.address constructor(readonly protocolVersion: ProtocolVersion) { super() diff --git a/apps/web/src/components/Liquidity/utils/parseFromRest.ts b/apps/web/src/components/Liquidity/utils/parseFromRest.ts index 3b0c5342d15..4523d3f1c90 100644 --- a/apps/web/src/components/Liquidity/utils/parseFromRest.ts +++ b/apps/web/src/components/Liquidity/utils/parseFromRest.ts @@ -200,8 +200,8 @@ export function getSDKPoolFromPoolInformation({ } if (protocolVersion === ProtocolVersion.V2) { return new Pair( - CurrencyAmount.fromRawAmount(token0, poolOrPair.tokenAReserves ?? '0'), - CurrencyAmount.fromRawAmount(token1, poolOrPair.tokenBReserves ?? '0'), + CurrencyAmount.fromRawAmount(token0, poolOrPair.token0Reserves ?? '0'), + CurrencyAmount.fromRawAmount(token1, poolOrPair.token1Reserves ?? '0'), ) } diff --git a/apps/web/src/components/Liquidity/utils/priceRangeInfo.ts b/apps/web/src/components/Liquidity/utils/priceRangeInfo.ts index 48bb91eada3..52040ae4298 100644 --- a/apps/web/src/components/Liquidity/utils/priceRangeInfo.ts +++ b/apps/web/src/components/Liquidity/utils/priceRangeInfo.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency, CurrencyAmount, Price, Token } from '@uniswap/sdk-core' import { Pair } from '@uniswap/v2-sdk' @@ -226,7 +227,7 @@ export function getPriceRangeInfo({ derivedPositionInfo: CreatePositionInfo state: PriceRangeState positionState: PositionState -}): PriceRangeInfo { +}): PriceRangeInfo | undefined { if (derivedPositionInfo.protocolVersion === ProtocolVersion.V2) { return getV2PriceRangeInfo({ state, derivedPositionInfo }) } @@ -270,8 +271,13 @@ export function getV3PriceRangeInfo({ state: PriceRangeState positionState: PositionState derivedPositionInfo: CreateV3PositionInfo -}): V3PriceRangeInfo { +}): V3PriceRangeInfo | undefined { const { fee } = positionState + + if (!fee) { + return undefined + } + const { protocolVersion, currencies: { sdk: sdkCurrencies }, @@ -426,8 +432,13 @@ export function getV4PriceRangeInfo({ state: PriceRangeState positionState: PositionState derivedPositionInfo: CreateV4PositionInfo -}): V4PriceRangeInfo { +}): V4PriceRangeInfo | undefined { const { fee, hook, initialPosition } = positionState + + if (!fee) { + return undefined + } + const { protocolVersion, currencies: { sdk: sortedCurrencies }, diff --git a/apps/web/src/components/NavBar/Tabs/TabsContent.tsx b/apps/web/src/components/NavBar/Tabs/TabsContent.tsx index 9d0ff30f2ef..3a62feafe19 100644 --- a/apps/web/src/components/NavBar/Tabs/TabsContent.tsx +++ b/apps/web/src/components/NavBar/Tabs/TabsContent.tsx @@ -1,5 +1,4 @@ import { FeatureFlags, useFeatureFlag } from '@universe/gating' -import { CreditCardIcon } from 'components/Icons/CreditCard' import { Limit } from 'components/Icons/Limit' import { SwapV2 } from 'components/Icons/SwapV2' import { MenuItem } from 'components/NavBar/CompanyMenu/Content' @@ -8,6 +7,7 @@ import { useTranslation } from 'react-i18next' import { useLocation } from 'react-router' import { CoinConvert } from 'ui/src/components/icons/CoinConvert' import { Compass } from 'ui/src/components/icons/Compass' +import { CreditCard } from 'ui/src/components/icons/CreditCard' import { Pools } from 'ui/src/components/icons/Pools' import { ReceiveAlt } from 'ui/src/components/icons/ReceiveAlt' import { Wallet } from 'ui/src/components/icons/Wallet' @@ -32,6 +32,7 @@ export const useTabsContent = (): TabsSection[] => { const isFiatOffRampEnabled = useFeatureFlag(FeatureFlags.FiatOffRamp) const isPortfolioPageEnabled = useFeatureFlag(FeatureFlags.PortfolioPage) const isToucanEnabled = useFeatureFlag(FeatureFlags.Toucan) + const isPortfolioDefiTabEnabled = useFeatureFlag(FeatureFlags.PortfolioDefiTab) return [ { @@ -54,7 +55,7 @@ export const useTabsContent = (): TabsSection[] => { }, { label: t('common.buy.label'), - icon: , + icon: , href: '/buy', internal: true, }, @@ -122,11 +123,15 @@ export const useTabsContent = (): TabsSection[] => { href: '/portfolio/tokens', internal: true, }, - { - label: t('portfolio.defi.title'), - href: '/portfolio/defi', - internal: true, - }, + ...(isPortfolioDefiTabEnabled + ? [ + { + label: t('portfolio.defi.title'), + href: '/portfolio/defi', + internal: true, + }, + ] + : []), { label: t('portfolio.nfts.title'), href: '/portfolio/nfts', diff --git a/apps/web/src/components/Pools/PoolDetails/ChartSection/index.tsx b/apps/web/src/components/Pools/PoolDetails/ChartSection/index.tsx index 5337c82fc65..e312802c197 100644 --- a/apps/web/src/components/Pools/PoolDetails/ChartSection/index.tsx +++ b/apps/web/src/components/Pools/PoolDetails/ChartSection/index.tsx @@ -311,7 +311,13 @@ function PriceChart({ const lastPrice = data[data.length - 1] const price = useUSDCValue(tryParseCurrencyAmount(lastPrice.value.toString(), quoteCurrency)) return ( - + {(crosshairData) => { const displayValue = crosshairData ?? lastPrice const priceDisplay = ( @@ -420,6 +426,7 @@ function LiquidityChart({ height={PDP_CHART_HEIGHT_PX} Model={LiquidityBarChartModel} params={params} + showDottedBackground TooltipBody={({ data: crosshairData }: { data: LiquidityBarData }) => ( // TODO(WEB-3628): investigate potential off-by-one or subgraph issues causing calculated TVL issues on 1 bip pools // Also remove Error Boundary when its determined its not needed 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 0c4390b2043..92d4a9e096f 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,7 +2,23 @@ exports[`PoolDetailsTransactionsTable > renders data filled state 1`] = ` - .c2 { + .c5 { + height: 16px; + width: 16px; +} + +.c5 path { + stroke: #FF37C7; + background: rgba(19,19,19,0.63); + fill: none; +} + +.c6 { + -webkit-animation: 2s fvtopB linear infinite; + animation: 2s fvtopB linear infinite; +} + +.c2 { display: inline-block; height: inherit; } @@ -289,6 +305,29 @@ exports[`PoolDetailsTransactionsTable > renders data filled state 1`] = `
+
+
+ + + + Loading +
+
renders error state 1`] = `
- - - - - +
+ + + + +
{ + return amount ? convertFiatAmountFormatted(amount, NumberType.FiatTokenStats) : '-' + } + return { index: poolSortRank, poolDescription: ( @@ -279,9 +283,9 @@ export function PoolsTable({ ), protocolVersion: pool.protocolVersion?.toLowerCase(), feeTier: pool.feeTier, - tvl: isGqlPool ? pool.tvl : giveExploreStatDefaultValue(pool.totalLiquidity?.value), - volume24h: isGqlPool ? pool.volume24h : giveExploreStatDefaultValue(pool.volume1Day?.value), - volume30d: isGqlPool ? pool.volume30d : giveExploreStatDefaultValue(pool.volume30Day?.value), + tvl: parseVolume((isGqlPool ? pool.tvl : pool.totalLiquidity?.value) ?? 0), + volume24h: parseVolume((isGqlPool ? pool.volume24h : pool.volume1Day?.value) ?? 0), + volume30d: parseVolume((isGqlPool ? pool.volume30d : pool.volume30Day?.value) ?? 0), volOverTvl: pool.volOverTvl, apr: pool.apr, rewardApr: pool.boostedApr, @@ -305,7 +309,7 @@ export function PoolsTable({ }, } }) ?? [], - [defaultChainId, filterString, pools], + [convertFiatAmountFormatted, defaultChainId, filterString, pools], ) const showLoadingSkeleton = loading || !!error @@ -398,7 +402,7 @@ export function PoolsTable({ ), cell: (tvl) => ( - {convertFiatAmountFormatted(tvl.getValue?.(), NumberType.FiatTokenStats)} + {tvl.getValue?.()} ), }) @@ -472,9 +476,7 @@ export function PoolsTable({ cell: (volume24h) => { return ( - - {convertFiatAmountFormatted(volume24h?.getValue?.(), NumberType.FiatTokenStats)} - + {volume24h?.getValue?.()} ) }, @@ -495,7 +497,7 @@ export function PoolsTable({ ), cell: (volumeWeek) => ( - {convertFiatAmountFormatted(volumeWeek.getValue?.(), NumberType.FiatTokenStats)} + {volumeWeek.getValue?.()} ), }) @@ -538,7 +540,6 @@ export function PoolsTable({ orderDirection, formatNumberOrString, formatPercent, - convertFiatAmountFormatted, ]) return ( diff --git a/apps/web/src/components/Pools/PoolTable/__snapshots__/PoolTable.test.tsx.snap b/apps/web/src/components/Pools/PoolTable/__snapshots__/PoolTable.test.tsx.snap index 8aa09e17084..a0264e886e5 100644 --- a/apps/web/src/components/Pools/PoolTable/__snapshots__/PoolTable.test.tsx.snap +++ b/apps/web/src/components/Pools/PoolTable/__snapshots__/PoolTable.test.tsx.snap @@ -436,7 +436,7 @@ exports[`PoolTable > renders data filled state 1`] = ` >
renders data filled state 1`] = `
renders error state 1`] = `
- - - - - +
+ + + + +
) } + case PopupType.Success: { + return ( + } + text={content.message} + /> + ) + } + case PopupType.Unhide: { + return ( + } + text={t('notification.assetVisibility.unhidden', { assetName: content.assetName })} + /> + ) + } } } diff --git a/apps/web/src/components/Popups/ToastRegularSimple.tsx b/apps/web/src/components/Popups/ToastRegularSimple.tsx index 631e5c0c408..f0a4bb1edf1 100644 --- a/apps/web/src/components/Popups/ToastRegularSimple.tsx +++ b/apps/web/src/components/Popups/ToastRegularSimple.tsx @@ -42,7 +42,7 @@ export function ToastRegularSimple({ > {icon && {icon}} - {text ? isToastOneLine ? {text} : text : null} + {text ? isToastOneLine ? {text} : text : null} {onDismiss ? ( diff --git a/apps/web/src/components/Popups/constants.ts b/apps/web/src/components/Popups/constants.ts index cfa887dcd38..c2a0d1195d7 100644 --- a/apps/web/src/components/Popups/constants.ts +++ b/apps/web/src/components/Popups/constants.ts @@ -1,2 +1,6 @@ +import { ONE_SECOND_MS } from 'utilities/src/time/time' + // Do not change, this is Sonner's default max width export const POPUP_MAX_WIDTH = 348 + +export const POPUP_MEDIUM_DISMISS_MS = ONE_SECOND_MS * 3 diff --git a/apps/web/src/components/Popups/types.ts b/apps/web/src/components/Popups/types.ts index 10c90d84e9b..51f9459bf34 100644 --- a/apps/web/src/components/Popups/types.ts +++ b/apps/web/src/components/Popups/types.ts @@ -11,6 +11,8 @@ export enum PopupType { Mismatch = 'mismatch', FORTransaction = 'forTransaction', Error = 'error', + Success = 'success', + Unhide = 'unhide', } export enum SwitchNetworkAction { @@ -58,3 +60,11 @@ export type PopupContent = type: PopupType.Error error: string } + | { + type: PopupType.Success + message: string + } + | { + type: PopupType.Unhide + assetName: string + } diff --git a/apps/web/src/components/Table/ErrorBox.tsx b/apps/web/src/components/Table/ErrorBox.tsx index bb7aa217eaf..ebdf59c4cbb 100644 --- a/apps/web/src/components/Table/ErrorBox.tsx +++ b/apps/web/src/components/Table/ErrorBox.tsx @@ -1,5 +1,13 @@ -import { MissingDataIcon } from 'components/Table/icons' import { Flex, Text } from 'ui/src' +import { ChartBarCrossed } from 'ui/src/components/icons/ChartBarCrossed' + +export function ChartBarCrossedWithBackground(): JSX.Element { + return ( + + + + ) +} export const ErrorModal = ({ header, subtitle }: { header: React.ReactNode; subtitle: React.ReactNode }) => ( - + diff --git a/apps/web/src/components/Table/icons.tsx b/apps/web/src/components/Table/icons.tsx index 7b0d05398e0..c379f9bc0d0 100644 --- a/apps/web/src/components/Table/icons.tsx +++ b/apps/web/src/components/Table/icons.tsx @@ -29,16 +29,3 @@ export const MissingDataBars = ({ color }: { color: string }) => ( ) - -export const MissingDataIcon = (props: SVGProps) => ( - - - - - -) diff --git a/apps/web/src/components/Table/index.tsx b/apps/web/src/components/Table/index.tsx index 7911e20b5ec..465281fd76d 100644 --- a/apps/web/src/components/Table/index.tsx +++ b/apps/web/src/components/Table/index.tsx @@ -7,7 +7,6 @@ import { getCoreRowModel, Row, RowData, - Table as TanstackTable, useReactTable, } from '@tanstack/react-table' import { useParentSize } from '@visx/responsive' @@ -30,6 +29,7 @@ import { TableScrollMask, } from 'components/Table/styled' import { TableSizeProvider, useTableSize } from 'components/Table/TableSizeProvider' +import { TableBodyProps } from 'components/Table/types' import { getCommonPinningStyles } from 'components/Table/utils' import useDebounce from 'hooks/useDebounce' import { forwardRef, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' @@ -119,14 +119,6 @@ function TableRowComponent({ row, v2 = true, rowWrapper }: Ta const TableRow = memo(TableRowComponent) as typeof TableRowComponent -type TableBodyProps = { - table: TanstackTable - loading?: boolean - error?: ApolloError | boolean - v2: boolean - rowWrapper?: (row: Row, content: JSX.Element) => JSX.Element -} - function TableBodyInner( { table, loading, error, v2 = true, rowWrapper }: TableBodyProps, ref: React.Ref, @@ -239,8 +231,10 @@ export function Table({ // biome-ignore lint/correctness/useExhaustiveDependencies: we want to run it also when loadMore, loadingMore are changed useEffect(() => { - const scrollableElement = maxHeight ? tableBodyRef.current : window - if (scrollableElement === null) { + // Use parentElement because the actual scrolling container is the parent wrapper, + // not the table body div itself (which is a child of the scrollable container) + const scrollableElement = maxHeight ? tableBodyRef.current?.parentElement : window + if (!scrollableElement) { return undefined } const updateScrollPosition = () => { @@ -250,7 +244,7 @@ export function Table({ distanceFromTop: scrollTop, distanceToBottom: scrollHeight - scrollTop - clientHeight, }) - } else { + } else if (scrollableElement === window) { setScrollPosition({ distanceFromTop: scrollableElement.scrollY, distanceToBottom: document.body.scrollHeight - scrollableElement.scrollY - scrollableElement.innerHeight, @@ -263,7 +257,29 @@ export function Table({ // biome-ignore lint/correctness/useExhaustiveDependencies: we want to run it also when distanceFromTop, loading are changed useEffect(() => { - if (distanceToBottom < LOAD_MORE_BOTTOM_OFFSET && !loadingMore && loadMore && canLoadMore.current && !error) { + const scrollableElement = maxHeight ? tableBodyRef.current?.parentElement : window + const shouldLoadMoreFromScroll = distanceToBottom < LOAD_MORE_BOTTOM_OFFSET + let shouldLoadMoreFromViewportHeight = false + + if (!shouldLoadMoreFromScroll) { + if (!maxHeight && scrollableElement === window) { + const contentHeight = document.body.scrollHeight + const viewportHeight = window.innerHeight + shouldLoadMoreFromViewportHeight = contentHeight <= viewportHeight + } else if (scrollableElement instanceof HTMLDivElement) { + const { scrollHeight, clientHeight } = scrollableElement + shouldLoadMoreFromViewportHeight = scrollHeight <= clientHeight + } + } + + if ( + (shouldLoadMoreFromScroll || shouldLoadMoreFromViewportHeight) && + !loadingMore && + loadMore && + canLoadMore.current && + !error && + !loading + ) { setLoadingMore(true) // Manually update scroll position to prevent re-triggering setScrollPosition({ @@ -281,7 +297,7 @@ export function Table({ }, }) } - }, [data.length, distanceFromTop, distanceToBottom, error, loadMore, loading, loadingMore]) + }, [data.length, distanceFromTop, distanceToBottom, error, loadMore, loading, loadingMore, maxHeight, tableBodyRef]) const table = useReactTable({ columns, diff --git a/apps/web/src/components/Table/types.ts b/apps/web/src/components/Table/types.ts new file mode 100644 index 00000000000..9c0c26ab0bd --- /dev/null +++ b/apps/web/src/components/Table/types.ts @@ -0,0 +1,10 @@ +import { ApolloError } from '@apollo/client' +import { Row, RowData, Table as TanstackTable } from '@tanstack/react-table' + +export type TableBodyProps = { + table: TanstackTable + loading?: boolean + error?: ApolloError | boolean + v2: boolean + rowWrapper?: (row: Row, content: JSX.Element) => JSX.Element +} diff --git a/apps/web/src/components/Tokens/TokenDetails/ChartSection/hooks.ts b/apps/web/src/components/Tokens/TokenDetails/ChartSection/hooks.ts index 0d4da0c9524..fae3ab6132b 100644 --- a/apps/web/src/components/Tokens/TokenDetails/ChartSection/hooks.ts +++ b/apps/web/src/components/Tokens/TokenDetails/ChartSection/hooks.ts @@ -11,6 +11,9 @@ import { } from 'components/Tokens/TokenDetails/ChartSection/util' import { UTCTimestamp } from 'lightweight-charts' import { useMemo, useReducer } from 'react' +import { fromGraphQLChain } from 'uniswap/src/features/chains/utils' +import { currencyIdToContractInput } from 'uniswap/src/features/dataApi/utils/currencyIdToContractInput' +import { buildCurrencyId } from 'uniswap/src/utils/currencyId' type TDPChartQueryVariables = { chain: GraphQLApi.Chain; address?: string; duration: GraphQLApi.HistoryDuration } @@ -39,17 +42,63 @@ export function useTDPPriceChartData({ priceChartType: PriceChartType }): ChartQueryResult & { disableCandlestickUI: boolean } { const [fallback, enablePriceHistoryFallback] = useReducer(() => true, false) - const { data, loading } = GraphQLApi.useTokenPriceQuery({ variables: { ...variables, fallback }, skip }) + + // For candlestick charts, use subgraph OHLC data (required, not available in CoinGecko) + // For line charts when fallback is needed, fetch both CoinGecko and subgraph data + const { data: subgraphData, loading: subgraphLoading } = GraphQLApi.useTokenPriceQuery({ + variables: { ...variables, fallback }, + skip, + }) + + // Fetch CoinGecko data for line charts to prefer its priceHistory + // Construct currencyId from chain and address for the CoinGecko query + const currencyIdValue = useMemo(() => { + if (!variables.address) { + return undefined + } + const chainId = fromGraphQLChain(variables.chain) + return chainId ? buildCurrencyId(chainId, variables.address) : undefined + }, [variables.chain, variables.address]) + + const { data: coinGeckoData, loading: coinGeckoLoading } = GraphQLApi.useTokenPriceHistoryQuery({ + variables: { + contract: currencyIdValue + ? currencyIdToContractInput(currencyIdValue) + : { address: undefined, chain: variables.chain }, + duration: variables.duration, + }, + skip: skip || !currencyIdValue || priceChartType === PriceChartType.CANDLESTICK, + }) + + const loading = subgraphLoading || (priceChartType === PriceChartType.LINE && coinGeckoLoading) return useMemo(() => { - const { ohlc, priceHistory, price } = data?.token?.market ?? {} + const subgraphMarket = subgraphData?.token?.market + const { ohlc, priceHistory: subgraphPriceHistory, price: subgraphPrice } = subgraphMarket ?? {} + + // Data source strategy: prefer CoinGecko for line charts, use subgraph for candlesticks + // Prefer per-chain CoinGecko history when available so multi-chain tokens render correctly + const coinGeckoProject = coinGeckoData?.tokenProjects?.[0] + const coinGeckoMarket = coinGeckoProject?.markets?.[0] + const coinGeckoTokenMarket = coinGeckoProject?.tokens.find((token) => token.chain === variables.chain)?.market + const coinGeckoPriceHistory = coinGeckoTokenMarket?.priceHistory ?? coinGeckoMarket?.priceHistory + const coinGeckoAggregatedPrice = coinGeckoTokenMarket?.price?.value ?? coinGeckoMarket?.price?.value + + // For line charts, prefer CoinGecko priceHistory but use PER-CHAIN current price + // For candlestick charts, always use subgraph OHLC (only source) + const useCoinGeckoHistory = priceChartType === PriceChartType.LINE && coinGeckoPriceHistory + const priceHistory = useCoinGeckoHistory ? coinGeckoPriceHistory : subgraphPriceHistory + + // CRITICAL: Always use per-chain price from subgraph for multi-chain tokens + // This ensures USDC on Ethereum shows Ethereum price, not aggregated price + const currentPrice = subgraphPrice?.value ?? coinGeckoAggregatedPrice + let entries = (ohlc ? ohlc.filter((v): v is GraphQLApi.CandlestickOhlcFragment => v !== undefined).map(toPriceChartData) : priceHistory ?.filter((v): v is GraphQLApi.PriceHistoryFallbackFragment => v !== undefined) .map(fallbackToPriceChartData)) ?? [] - const currentPrice = price?.value if (ohlc) { // Special case: backend returns invalid OHLC data on some chains. If we detect long series of 0's, return an empty array to trigger fallback. @@ -141,7 +190,15 @@ export function useTDPPriceChartData({ const dataQuality = checkDataQuality({ data: entries, chartType: ChartType.PRICE, duration: variables.duration }) return { chartType: ChartType.PRICE, entries, loading, dataQuality, disableCandlestickUI: fallback } - }, [data?.token?.market, fallback, loading, priceChartType, variables.duration]) + }, [ + subgraphData?.token?.market, + coinGeckoData?.tokenProjects?.[0], + fallback, + loading, + priceChartType, + variables.duration, + variables.chain, + ]) } export function useTDPVolumeChartData( diff --git a/apps/web/src/components/Tokens/TokenDetails/ChartSection/index.tsx b/apps/web/src/components/Tokens/TokenDetails/ChartSection/index.tsx index 715e036b3c8..1e5062431f2 100644 --- a/apps/web/src/components/Tokens/TokenDetails/ChartSection/index.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/ChartSection/index.tsx @@ -27,6 +27,8 @@ import { useMemo, useState } from 'react' import { Trans } from 'react-i18next' import { ThemeProvider } from 'theme' import { Flex, SegmentedControl, SegmentedControlOption, styled, useMedia } from 'ui/src' +import { useTokenPriceChange } from 'uniswap/src/features/dataApi/tokenDetails/useTokenDetailsData' +import { currencyId } from 'uniswap/src/utils/currencyId' export const TDP_CHART_HEIGHT_PX = 356 const TDP_CHART_SELECTOR_OPTIONS = [ChartType.PRICE, ChartType.VOLUME, ChartType.TVL] as const @@ -113,7 +115,12 @@ export function useCreateTDPChartState( export default function ChartSection() { const { activeQuery, timePeriod, priceChartType } = useTDPContext().chartState - const { tokenColor } = useTDPContext() + const { tokenColor, currency } = useTDPContext() + + // Get the 24hr price change from API to ensure consistency with mobile + // Both platforms now show the same 24hr change regardless of selected chart period + const currencyIdValue = useMemo(() => currencyId(currency), [currency]) + const priceChange24h = useTokenPriceChange(currencyIdValue) // eslint-disable-next-line consistent-return const getSection = () => { @@ -137,6 +144,7 @@ export default function ChartSection() { type={priceChartType} stale={stale} timePeriod={toHistoryDuration(timePeriod)} + pricePercentChange24h={priceChange24h} /> ) case ChartType.VOLUME: diff --git a/apps/web/src/components/Tokens/TokenDetails/MoreButton.tsx b/apps/web/src/components/Tokens/TokenDetails/MoreButton.tsx new file mode 100644 index 00000000000..640b3e7229e --- /dev/null +++ b/apps/web/src/components/Tokens/TokenDetails/MoreButton.tsx @@ -0,0 +1,48 @@ +import { Dropdown } from 'components/Dropdowns/Dropdown' +import { ActionButtonStyle, DropdownAction } from 'components/Tokens/TokenDetails/shared' +import { useTDPContext } from 'pages/TokenDetails/TDPContext' +import { useState } from 'react' +import { useTranslation } from 'react-i18next' +import { Text } from 'ui/src' +import { ChartBarCrossed } from 'ui/src/components/icons/ChartBarCrossed' +import { Ellipsis } from 'ui/src/components/icons/Ellipsis' +import { Flag } from 'ui/src/components/icons/Flag' + +export function MoreButton({ + openReportTokenModal, + openReportDataIssueModal, +}: { + openReportTokenModal: () => void + openReportDataIssueModal: () => void +}) { + const { t } = useTranslation() + const { currency } = useTDPContext() + const [isOpen, setIsOpen] = useState(false) + + return ( + } + hideChevron + buttonStyle={ActionButtonStyle} + dropdownStyle={{ width: 200 }} + alignRight + > + + + {t('reporting.token.data.title')} + + <> + {!currency.isNative && ( + + + + {t('reporting.token.report.title')} + + + )} + + + ) +} diff --git a/apps/web/src/components/Tokens/TokenDetails/ShareButton.tsx b/apps/web/src/components/Tokens/TokenDetails/ShareButton.tsx index 282918333e5..912ea4043b4 100644 --- a/apps/web/src/components/Tokens/TokenDetails/ShareButton.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/ShareButton.tsx @@ -1,38 +1,19 @@ import { Dropdown } from 'components/Dropdowns/Dropdown' import { Share as ShareIcon } from 'components/Icons/Share' import { TwitterXLogo } from 'components/Icons/TwitterX' -import { ActionButtonStyle } from 'components/Tokens/TokenDetails/shared' +import { ActionButtonStyle, DropdownAction } from 'components/Tokens/TokenDetails/shared' import useCopyClipboard from 'hooks/useCopyClipboard' -import styled from 'lib/styled-components' import { useState } from 'react' import { Link } from 'react-feather' import { useTranslation } from 'react-i18next' import { useSearchParams } from 'react-router' -import { colors } from 'theme/colors' import { Text, useMedia, useSporeColors } from 'ui/src' import { Check } from 'ui/src/components/icons/Check' -import { opacify } from 'ui/src/theme' import { isMobileWeb } from 'utilities/src/platform' const TWITTER_WIDTH = 560 const TWITTER_HEIGHT = 480 -const ShareAction = styled.div` - display: flex; - align-items: center; - padding: 8px; - border-radius: 8px; - font-size: 16px; - font-weight: 485; - gap: 12px; - height: 40px; - color: ${({ theme }) => theme.neutral1}; - cursor: pointer; - :hover { - background-color: ${({ theme }) => opacify(10, theme.darkMode ? colors.gray200 : colors.gray300)}; - } -` - export function openShareTweetWindow(name: string) { const currentLocation = window.location.href const positionX = (window.screen.width - TWITTER_WIDTH) / 2 @@ -67,15 +48,15 @@ export default function ShareButton({ name, utmSource }: { name: string; utmSour dropdownStyle={{ width: 200 }} alignRight > - setCopied(currentLocation)}> + setCopied(currentLocation)}> {isCopied ? ( ) : ( )} {isCopied ? t('common.copied') : t('common.copyLink.button')} - - + { setIsOpen(false) openShareTweetWindow(name) @@ -83,7 +64,7 @@ export default function ShareButton({ name, utmSource }: { name: string; utmSour > {t('common.share.shareToTwitter')} - + ) } diff --git a/apps/web/src/components/Tokens/TokenDetails/StatsSection.tsx b/apps/web/src/components/Tokens/TokenDetails/StatsSection.tsx index c43b4999162..6c5d224f287 100644 --- a/apps/web/src/components/Tokens/TokenDetails/StatsSection.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/StatsSection.tsx @@ -2,10 +2,13 @@ import { TokenQueryData } from 'appGraphql/data/Token' import { TokenSortMethod } from 'components/Tokens/state' import { HEADER_DESCRIPTIONS } from 'components/Tokens/TokenTable' import { MouseoverTooltip } from 'components/Tooltip' -import { ReactNode } from 'react' +import { useTDPContext } from 'pages/TokenDetails/TDPContext' +import { ReactNode, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { Flex, FlexProps, Text } from 'ui/src' +import { useTokenMarketStats } from 'uniswap/src/features/dataApi/tokenDetails/useTokenDetailsData' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' +import { currencyId } from 'uniswap/src/utils/currencyId' import { NumberType } from 'utilities/src/format/types' export const StatWrapper = ({ children, ...props }: { children: ReactNode } & FlexProps) => ( @@ -75,16 +78,20 @@ type StatsSectionProps = { export default function StatsSection(props: StatsSectionProps) { const { tokenQueryData } = props const { t } = useTranslation() + const { currency } = useTDPContext() - const tokenMarketInfo = tokenQueryData?.market - const tokenProjectMarketInfo = tokenQueryData?.project?.markets?.[0] // aggregated market price from CoinGecko + // Construct currencyId for shared hooks + const currencyIdValue = useMemo(() => currencyId(currency), [currency]) - const FDV = tokenProjectMarketInfo?.fullyDilutedValuation?.value - const marketCap = tokenProjectMarketInfo?.marketCap?.value - const TVL = tokenMarketInfo?.totalValueLocked?.value - const volume24H = tokenMarketInfo?.volume24H?.value + // Use shared hook for unified data fetching (CoinGecko-first strategy) + const { marketCap, fdv } = useTokenMarketStats(currencyIdValue) - const hasStats = TVL || FDV || marketCap || volume24H + // Volume and TVL come from tokenQueryData to avoid fragment timing issues + // These are already loaded with the main TokenWebQuery + const volume = tokenQueryData?.market?.volume24H?.value + const tvl = tokenQueryData?.market?.totalValueLocked?.value + + const hasStats = tvl || fdv || marketCap || volume if (hasStats) { return ( @@ -96,7 +103,7 @@ export default function StatsSection(props: StatsSectionProps) { @@ -110,13 +117,13 @@ export default function StatsSection(props: StatsSectionProps) { diff --git a/apps/web/src/components/Tokens/TokenDetails/TokenDetailsHeader.tsx b/apps/web/src/components/Tokens/TokenDetails/TokenDetailsHeader.tsx index bab31209d84..775ad505304 100644 --- a/apps/web/src/components/Tokens/TokenDetails/TokenDetailsHeader.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/TokenDetailsHeader.tsx @@ -1,31 +1,52 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { PortfolioLogo } from 'components/AccountDrawer/MiniPortfolio/PortfolioLogo' import { EtherscanLogo } from 'components/Icons/Etherscan' import { ExplorerIcon } from 'components/Icons/ExplorerIcon' import { Globe } from 'components/Icons/Globe' import { Share as ShareIcon } from 'components/Icons/Share' import { TwitterXLogo } from 'components/Icons/TwitterX' +import { POPUP_MEDIUM_DISMISS_MS } from 'components/Popups/constants' +import { popupRegistry } from 'components/Popups/registry' +import { PopupType } from 'components/Popups/types' +import { MoreButton } from 'components/Tokens/TokenDetails/MoreButton' import ShareButton, { openShareTweetWindow } from 'components/Tokens/TokenDetails/ShareButton' import { ActionButtonStyle } from 'components/Tokens/TokenDetails/shared' import { MouseoverTooltip, TooltipSize } from 'components/Tooltip' import useCopyClipboard from 'hooks/useCopyClipboard' +import { useModalState } from 'hooks/useModalState' +import { useAtom } from 'jotai' import { useTDPContext } from 'pages/TokenDetails/TDPContext' import { useMemo, useState } from 'react' -import { Link, MoreHorizontal } from 'react-feather' +import { Link } from 'react-feather' import { useTranslation } from 'react-i18next' import { useSearchParams } from 'react-router' import { EllipsisTamaguiStyle } from 'theme/components/styles' -import { Flex, Text, TouchableArea, useMedia, useSporeColors, WebBottomSheet } from 'ui/src' +import { Flex, Text, TextProps, TouchableArea, useMedia, useSporeColors, WebBottomSheet } from 'ui/src' +import { ChartBarCrossed } from 'ui/src/components/icons/ChartBarCrossed' import { Check } from 'ui/src/components/icons/Check' +import { Flag } from 'ui/src/components/icons/Flag' +import { MoreHorizontal } from 'ui/src/components/icons/MoreHorizontal' +import { ReportTokenDataModal } from 'uniswap/src/components/reporting/ReportTokenDataModal' +import { ReportTokenIssueModalPropsAtom } from 'uniswap/src/components/reporting/ReportTokenIssueModal' import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { ModalName } from 'uniswap/src/features/telemetry/constants' import { ExplorerDataType, getExplorerLink } from 'uniswap/src/utils/linking' +import { useEvent } from 'utilities/src/react/hooks' +import { useBooleanState } from 'utilities/src/react/useBooleanState' type HeaderAction = { title: string + textColor?: TextProps['color'] icon: React.ReactNode onPress: () => void show: boolean } +type HeaderActionSection = { + title: string + actions: HeaderAction[] +} + export const TokenDetailsHeader = () => { const { address, currency, tokenQuery } = useTDPContext() @@ -34,6 +55,28 @@ export const TokenDetailsHeader = () => { const media = useMedia() const isMobileScreen = media.sm + const isDataReportingEnabled = useFeatureFlag(FeatureFlags.DataReportingAbilities) + const { openModal } = useModalState(ModalName.ReportTokenIssue) + const [, setModalProps] = useAtom(ReportTokenIssueModalPropsAtom) + const openReportTokenModal = useEvent(() => { + setModalProps({ source: 'token-details', currency, isMarkedSpam: tokenQuery.data?.token?.project?.isSpam }) + openModal() + }) + + const onReportSuccess = useEvent(() => { + popupRegistry.addPopup( + { type: PopupType.Success, message: t('common.reported') }, + 'report-token-success', + POPUP_MEDIUM_DISMISS_MS, + ) + }) + + const { + value: isReportDataIssueModalOpen, + setTrue: openReportDataIssueModal, + setFalse: closeReportDataIssueModal, + } = useBooleanState(false) + const [mobileSheetOpen, toggleMobileSheet] = useState(false) const tokenSymbolName = currency.symbol ?? t('tdp.symbolNotFound') @@ -56,7 +99,7 @@ export const TokenDetailsHeader = () => { const [isCopied, setCopied] = useCopyClipboard() - const HeaderActions: HeaderAction[] = useMemo(() => { + const desktopHeaderActions: HeaderAction[] = useMemo(() => { return [ { title: t('common.explorer'), @@ -81,35 +124,71 @@ export const TokenDetailsHeader = () => { onPress: () => window.open(twitterUrl, '_blank'), show: !!twitterUrl, }, + ] + }, [t, explorerUrl, colors.neutral1.val, currency.chainId, homepageUrl, twitterUrl]) + + const mobileHeaderActionSections: HeaderActionSection[] = useMemo(() => { + return [ { - title: isCopied ? t('common.copied') : t('common.copyLink.button'), - icon: isCopied ? ( - - ) : ( - - ), - onPress: () => setCopied(currentLocation), - show: isMobileScreen, + title: t('common.details'), + actions: desktopHeaderActions, }, { - title: t('common.share.shareToTwitter'), - icon: , - onPress: () => openShareTweetWindow(twitterShareName), - show: isMobileScreen, + title: t('common.share'), + actions: [ + { + title: isCopied ? t('common.copied') : t('common.copyLink.button'), + icon: isCopied ? ( + + ) : ( + + ), + onPress: () => setCopied(currentLocation), + show: true, + }, + { + title: t('common.share.shareToTwitter'), + icon: , + onPress: () => openShareTweetWindow(twitterShareName), + show: true, + }, + ], }, + ...(isDataReportingEnabled + ? [ + { + title: t('common.report'), + actions: [ + { + title: t('reporting.token.data.title'), + icon: , + onPress: openReportDataIssueModal, + show: true, + }, + { + title: t('reporting.token.report.title'), + textColor: '$statusCritical', + icon: , + onPress: openReportTokenModal, + show: !currency.isNative, + }, + ], + }, + ] + : []), ] }, [ t, - currency.chainId, colors.neutral1.val, colors.statusSuccess.val, - explorerUrl, - homepageUrl, - twitterUrl, + currentLocation, isCopied, - isMobileScreen, setCopied, - currentLocation, + openReportTokenModal, + openReportDataIssueModal, + desktopHeaderActions, + currency.isNative, + isDataReportingEnabled, twitterShareName, ]) @@ -139,11 +218,23 @@ export const TokenDetailsHeader = () => { ) : ( - + )} + ) } @@ -151,43 +242,52 @@ export const TokenDetailsHeader = () => { interface MobileTokenActionsProps { mobileSheetOpen: boolean toggleMobileSheet: (open: boolean) => void - HeaderActions: HeaderAction[] + actionSections: HeaderActionSection[] } -function MobileTokenActions({ mobileSheetOpen, toggleMobileSheet, HeaderActions }: MobileTokenActionsProps) { - const colors = useSporeColors() - +function MobileTokenActions({ mobileSheetOpen, toggleMobileSheet, actionSections }: MobileTokenActionsProps) { return ( - toggleMobileSheet(true)} {...ActionButtonStyle}> - + toggleMobileSheet(true)}> + toggleMobileSheet(false)}> - - {HeaderActions.map( - (action) => - action.show && ( - { - toggleMobileSheet(false) - action.onPress() - }} - > - {action.icon} - {action.title} - - ), - )} + + {actionSections.map((section) => { + const items = section.actions.map( + (action) => + action.show && ( + { + toggleMobileSheet(false) + action.onPress() + }} + > + {action.icon} + + {action.title} + + + ), + ) + + return ( + + + {section.title} + + {items} + + ) + })} @@ -197,22 +297,33 @@ function MobileTokenActions({ mobileSheetOpen, toggleMobileSheet, HeaderActions interface DesktopTokenActionsProps { HeaderActions: HeaderAction[] twitterShareName: string + openReportTokenModal: () => void + openReportDataIssueModal: () => void } -function DesktopTokenActions({ HeaderActions, twitterShareName }: DesktopTokenActionsProps) { +function DesktopTokenActions({ + HeaderActions, + twitterShareName, + openReportTokenModal, + openReportDataIssueModal, +}: DesktopTokenActionsProps) { + const isDataReportingEnabled = useFeatureFlag(FeatureFlags.DataReportingAbilities) return ( {HeaderActions.map( (action) => action.show && ( - + {action.icon} ), )} + {isDataReportingEnabled && ( + + )} ) } diff --git a/apps/web/src/components/Tokens/TokenDetails/index.tsx b/apps/web/src/components/Tokens/TokenDetails/index.tsx index c0fa77b18a3..2c28debdf42 100644 --- a/apps/web/src/components/Tokens/TokenDetails/index.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/index.tsx @@ -2,6 +2,9 @@ import { getTokenDetailsURL } from 'appGraphql/data/util' import { Currency } from '@uniswap/sdk-core' import { BreadcrumbNavContainer, BreadcrumbNavLink, CurrentPageBreadcrumb } from 'components/BreadcrumbNav' import { MobileBottomBar, TDPActionTabs } from 'components/NavBar/MobileBottomBar' +import { POPUP_MEDIUM_DISMISS_MS } from 'components/Popups/constants' +import { popupRegistry } from 'components/Popups/registry' +import { PopupType } from 'components/Popups/types' import { ActivitySection } from 'components/Tokens/TokenDetails/ActivitySection' import BalanceSummary, { PageChainBalanceSummary } from 'components/Tokens/TokenDetails/BalanceSummary' import { BridgedAssetSection } from 'components/Tokens/TokenDetails/BridgedAssetSection' @@ -19,7 +22,7 @@ import { Swap } from 'pages/Swap' import { useTDPContext } from 'pages/TokenDetails/TDPContext' import { PropsWithChildren, useCallback, useMemo, useState } from 'react' import { ChevronRight } from 'react-feather' -import { Trans } from 'react-i18next' +import { Trans, useTranslation } from 'react-i18next' import { useNavigate } from 'react-router' import { CurrencyState } from 'state/swap/types' import { Flex, useIsTouchDevice, useMedia } from 'ui/src' @@ -33,6 +36,7 @@ import TokenWarningModal from 'uniswap/src/features/tokens/TokenWarningModal' import { useCurrencyInfo } from 'uniswap/src/features/tokens/useCurrencyInfo' import { areAddressesEqual } from 'uniswap/src/utils/addresses' import { areCurrenciesEqual, currencyId } from 'uniswap/src/utils/currencyId' +import { useEvent } from 'utilities/src/react/hooks' import { getInitialLogoUrl } from 'utils/getInitialLogoURL' const DividerLine = deprecatedStyled(Hr)` @@ -114,6 +118,7 @@ function includesToken(tokens: CurrencyState | undefined, token: Currency | unde } function TDPSwapComponent() { + const { t } = useTranslation() const { address, currency, currencyChainId, tokenColor } = useTDPContext() const navigate = useNavigate() @@ -203,6 +208,14 @@ function TDPSwapComponent() { const [showWarningModal, setShowWarningModal] = useState(false) const closeWarningModal = useCallback(() => setShowWarningModal(false), []) + const onTokenWarningReportSuccess = useEvent(() => { + popupRegistry.addPopup( + { type: PopupType.Success, message: t('common.reported') }, + 'report-token-warning-success', + POPUP_MEDIUM_DISMISS_MS, + ) + }) + return ( )} diff --git a/apps/web/src/components/Tokens/TokenDetails/shared.ts b/apps/web/src/components/Tokens/TokenDetails/shared.ts index b6335c9bf7a..9506f983503 100644 --- a/apps/web/src/components/Tokens/TokenDetails/shared.ts +++ b/apps/web/src/components/Tokens/TokenDetails/shared.ts @@ -1,6 +1,25 @@ import deprecatedStyled from 'lib/styled-components' +import styled from 'lib/styled-components' +import { colors } from 'theme/colors' import { ClickableTamaguiStyle } from 'theme/components/styles' import { TextProps } from 'ui/src' +import { opacify } from 'ui/src/theme' + +export const DropdownAction = styled.div` + display: flex; + align-items: center; + padding: 8px; + border-radius: 8px; + font-size: 16px; + font-weight: 485; + gap: 12px; + height: 40px; + color: ${({ theme }) => theme.neutral1}; + cursor: pointer; + :hover { + background-color: ${({ theme }) => opacify(10, theme.darkMode ? colors.gray200 : colors.gray300)}; + } +` export const ActionButtonStyle = { display: 'flex', 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 6e3f78cfc8a..8fcee7b1b81 100644 --- a/apps/web/src/components/Tokens/TokenDetails/tables/__snapshots__/TokenDetailsPoolsTable.test.tsx.snap +++ b/apps/web/src/components/Tokens/TokenDetails/tables/__snapshots__/TokenDetailsPoolsTable.test.tsx.snap @@ -2,7 +2,23 @@ exports[`TDPPoolTable > renders data filled state 1`] = ` - .c0 { + .c2 { + height: 16px; + width: 16px; +} + +.c2 path { + stroke: #FF37C7; + background: rgba(19,19,19,0.63); + fill: none; +} + +.c3 { + -webkit-animation: 2s fvtopB linear infinite; + animation: 2s fvtopB linear infinite; +} + +.c0 { display: inline-block; height: inherit; } @@ -574,6 +590,29 @@ exports[`TDPPoolTable > renders data filled state 1`] = `
+
+
+ + + + Loading +
+
renders error state 1`] = `
- - - - - +
+ + + + +
{ + return amount ? convertFiatAmountFormatted(amount, type) : '-' + } + return { index: tokenSortIndex, tokenDescription: , - price: giveExploreStatDefaultValue(token.price?.value), + price: parseAmount(token.price?.value, NumberType.FiatTokenPrice), testId: `${TestID.TokenTableRowPrefix}${unwrappedToken.address}`, percentChange1hr: ( @@ -195,8 +199,8 @@ function TokenTable({ {formatPercent(delta1dAbs)} ), - fdv: giveExploreStatDefaultValue(token.fullyDilutedValuation?.value), - volume: giveExploreStatDefaultValue(token.volume?.value), + fdv: parseAmount(token.fullyDilutedValuation?.value, NumberType.FiatTokenStats), + volume: parseAmount(token.volume?.value, NumberType.FiatTokenStats), sparkline: ( {/* A simple 0 price indicates the price is not currently available from the api */} - {price.getValue?.() === 0 - ? '-' - : convertFiatAmountFormatted(price.getValue?.(), NumberType.FiatTokenPrice)} + {price.getValue?.()} ), @@ -342,7 +353,7 @@ function TokenTable({ ), cell: (fdv) => ( - {convertFiatAmountFormatted(fdv.getValue?.(), NumberType.FiatTokenStats)} + {fdv.getValue?.()} ), }), @@ -360,7 +371,7 @@ function TokenTable({ ), cell: (volume) => ( - {convertFiatAmountFormatted(volume.getValue?.(), NumberType.FiatTokenStats)} + {volume.getValue?.()} ), }), @@ -379,7 +390,7 @@ function TokenTable({ ] return filteredColumns.filter((column): column is NonNullable<(typeof filteredColumns)[number]> => Boolean(column)) - }, [convertFiatAmountFormatted, orderDirection, showLoadingSkeleton, sortMethod, media]) + }, [orderDirection, showLoadingSkeleton, sortMethod, media]) return (
{ + popupRegistry.addPopup( + { type: PopupType.Success, message: t('common.reported') }, + 'report-token-success', + POPUP_MEDIUM_DISMISS_MS, + ) + }) + const shouldShowDevFlags = isDevEnv() || isBetaEnv() // On landing page we need to be very careful about what modals we show @@ -83,6 +99,10 @@ export default function TopLevelModals() { + ) } diff --git a/apps/web/src/components/TopLevelModals/modalRegistry.tsx b/apps/web/src/components/TopLevelModals/modalRegistry.tsx index a861f540381..3a5137e398a 100644 --- a/apps/web/src/components/TopLevelModals/modalRegistry.tsx +++ b/apps/web/src/components/TopLevelModals/modalRegistry.tsx @@ -83,6 +83,11 @@ const WormholeModal = createLazy(() => })), ) +const ReportTokenModal = createLazy(() => + import('uniswap/src/components/reporting/ReportTokenIssueModal').then((module) => ({ + default: module.ReportTokenIssueModal, + })), +) const ModalLoadingFallback = memo(() => null) ModalLoadingFallback.displayName = 'ModalLoadingFallback' @@ -199,6 +204,10 @@ export const modalRegistry: ModalRegistry = { component: WormholeModal, shouldMount: (state) => state.application.openModal?.name === ModalName.Wormhole, }, + [ModalName.ReportTokenIssue]: { + component: ReportTokenModal, + shouldMount: (state) => state.application.openModal?.name === ModalName.ReportTokenIssue, + }, } as const export const ModalRenderer = ({ diff --git a/apps/web/src/components/Toucan/Auction/hooks/useAuctionBlockPolling.ts b/apps/web/src/components/Toucan/Auction/hooks/useAuctionBlockPolling.ts new file mode 100644 index 00000000000..184f63f5431 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/hooks/useAuctionBlockPolling.ts @@ -0,0 +1,55 @@ +import { useAuctionStore, useAuctionStoreActions } from 'components/Toucan/Auction/store/useAuctionStore' +import { useEffect, useMemo } from 'react' +import { EVMUniverseChainId } from 'uniswap/src/features/chains/types' +// biome-ignore lint/style/noRestrictedImports: Use wagmi version because it supports a chain being passed in +import { useBlockNumber } from 'wagmi' + +/** + * Polls for the current block number on the auction's chain and updates the store + * Uses wagmi's useBlockNumber hook with watch enabled for automatic polling + * Polling interval is configured globally in wagmi config (12s for all chains) + * Polling automatically stops once the auction has ended to conserve RPC calls + * @param chainId - The chain ID to poll for block numbers + * @param endBlock - Auction end blocks to determine if polling is needed + */ +export function useAuctionBlockPolling(chainId: EVMUniverseChainId | undefined, endBlock: number | undefined): void { + const { setCurrentBlockNumberAndUpdateProgress } = useAuctionStoreActions() + const currentBlockNumber = useAuctionStore((state) => state.currentBlockNumber) + + // Determine if we need polling based on auction state + const shouldPoll = useMemo((): boolean => { + if (!chainId || !endBlock) { + return false + } + + // First poll - we need to know current block + if (!currentBlockNumber) { + return true + } + + const current = Number(currentBlockNumber) + + // Auction ended - no need to poll + if (current > endBlock) { + return false + } + + // Auction active or upcoming - keep polling + return true + }, [chainId, endBlock, currentBlockNumber]) + + const { data: blockNumber } = useBlockNumber({ + chainId, + watch: shouldPoll, + query: { + enabled: shouldPoll, + }, + }) + + // biome-ignore lint/correctness/useExhaustiveDependencies: setCurrentBlockNumberAndUpdateProgress is stable from store actions + useEffect(() => { + if (blockNumber !== undefined) { + setCurrentBlockNumberAndUpdateProgress(blockNumber) + } + }, [blockNumber]) +} diff --git a/apps/web/src/components/Toucan/Auction/store/AuctionStoreContextProvider.tsx b/apps/web/src/components/Toucan/Auction/store/AuctionStoreContextProvider.tsx index dd80aaf5916..b3002f57b96 100644 --- a/apps/web/src/components/Toucan/Auction/store/AuctionStoreContextProvider.tsx +++ b/apps/web/src/components/Toucan/Auction/store/AuctionStoreContextProvider.tsx @@ -1,3 +1,4 @@ +import { useAuctionBlockPolling } from 'components/Toucan/Auction/hooks/useAuctionBlockPolling' import { AuctionStoreContext } from 'components/Toucan/Auction/store/AuctionStoreContext' import { createAuctionStore } from 'components/Toucan/Auction/store/createAuctionStore' import { useAuctionStore, useAuctionStoreActions } from 'components/Toucan/Auction/store/useAuctionStore' @@ -31,6 +32,13 @@ function useUpdateTokenColorInAuctionStore() { function AuctionStoreProviderInner({ children }: PropsWithChildren) { useUpdateTokenColorInAuctionStore() + const { chainId, endBlock } = useAuctionStore((state) => ({ + chainId: state.auctionDetails?.chainId, + endBlock: state.auctionDetails?.endBlock, + })) + + useAuctionBlockPolling(chainId, endBlock) + return children } diff --git a/apps/web/src/components/Toucan/Auction/store/createAuctionStore.ts b/apps/web/src/components/Toucan/Auction/store/createAuctionStore.ts index d3bd716a315..bf0ce51f878 100644 --- a/apps/web/src/components/Toucan/Auction/store/createAuctionStore.ts +++ b/apps/web/src/components/Toucan/Auction/store/createAuctionStore.ts @@ -1,5 +1,6 @@ import { FAKE_AUCTION_DATA, FAKE_CHECKPOINT_DATA } from 'components/Toucan/Auction/store/mockData' -import { AuctionStoreState, DisplayMode } from 'components/Toucan/Auction/store/types' +import { AuctionProgressState, AuctionStoreState, DisplayMode } from 'components/Toucan/Auction/store/types' +import { computeAuctionProgress } from 'components/Toucan/Auction/utils/computeAuctionProgress' import type { StoreApi, UseBoundStore } from 'zustand' import { create } from 'zustand' import { devtools } from 'zustand/middleware' @@ -15,6 +16,13 @@ export const createAuctionStore = (_auctionId?: string): AuctionStore => { checkpointData: FAKE_CHECKPOINT_DATA, tokenColor: undefined, // Will be set by useSrcColor in provider displayMode: DisplayMode.VALUATION, + currentBlockNumber: undefined, + progress: { + state: AuctionProgressState.NOT_STARTED, + blocksRemaining: undefined, + progressPercentage: undefined, + isGraduated: false, + }, // Actions actions: { @@ -24,6 +32,20 @@ export const createAuctionStore = (_auctionId?: string): AuctionStore => { setDisplayMode: (mode) => { set({ displayMode: mode }) }, + /** + * Updates the current block number and automatically recomputes all auction progress state. + * This will update progress.state, progress.blocksRemaining, progress.progressPercentage, and progress.isGraduated. + * @param blockNumber - The new current block number from the blockchain + */ + setCurrentBlockNumberAndUpdateProgress: (blockNumber) => { + set((state) => ({ + currentBlockNumber: blockNumber, + progress: computeAuctionProgress({ + currentBlock: blockNumber, + auctionDetails: state.auctionDetails, + }), + })) + }, }, }), { diff --git a/apps/web/src/components/Toucan/Auction/store/types.ts b/apps/web/src/components/Toucan/Auction/store/types.ts index d6dcbf3f164..112209ab442 100644 --- a/apps/web/src/components/Toucan/Auction/store/types.ts +++ b/apps/web/src/components/Toucan/Auction/store/types.ts @@ -1,9 +1,9 @@ -import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { EVMUniverseChainId } from 'uniswap/src/features/chains/types' // potentially missing clearing price export interface AuctionDetails { auctionId: string - chainId: UniverseChainId + chainId: EVMUniverseChainId tokenSymbol: string tokenAddress: string tokenName: string // this is missing from what Rob sent @@ -27,16 +27,36 @@ export enum DisplayMode { TOKEN_PRICE = 'TOKEN_PRICE', } +export enum AuctionProgressState { + NOT_STARTED = 'NOT_STARTED', + IN_PROGRESS = 'IN_PROGRESS', + ENDED = 'ENDED', +} + +/** + * Computed auction progress information + * These fields are automatically updated when currentBlockNumber changes + */ +export interface AuctionProgressData { + state: AuctionProgressState + blocksRemaining: number | undefined + progressPercentage: number | undefined + isGraduated: boolean +} + interface AuctionState { auctionDetails: AuctionDetails | null checkpointData: CheckpointData | null tokenColor?: string displayMode: DisplayMode + currentBlockNumber: bigint | undefined + progress: AuctionProgressData } interface AuctionActions { setTokenColor: (color?: string) => void setDisplayMode: (mode: DisplayMode) => void + setCurrentBlockNumberAndUpdateProgress: (blockNumber: bigint | undefined) => void } export type AuctionStoreState = AuctionState & { diff --git a/apps/web/src/components/Toucan/Auction/utils/computeAuctionProgress.ts b/apps/web/src/components/Toucan/Auction/utils/computeAuctionProgress.ts new file mode 100644 index 00000000000..151be43bfc2 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/utils/computeAuctionProgress.ts @@ -0,0 +1,76 @@ +import type { AuctionDetails, AuctionProgressData } from 'components/Toucan/Auction/store/types' +import { AuctionProgressState } from 'components/Toucan/Auction/store/types' + +function getAuctionProgressState({ + currentBlock, + startBlock, + endBlock, +}: { + currentBlock: bigint | number | undefined + startBlock: number | undefined + endBlock: number | undefined +}): AuctionProgressState { + if (!currentBlock || !startBlock || !endBlock) { + return AuctionProgressState.NOT_STARTED + } + + const current = typeof currentBlock === 'bigint' ? Number(currentBlock) : currentBlock + + if (current < startBlock) { + return AuctionProgressState.NOT_STARTED + } + + if (current > endBlock) { + return AuctionProgressState.ENDED + } + + return AuctionProgressState.IN_PROGRESS +} + +/** + * Computes all auction progress information from current block and auction details + * This is a pure function that can be tested independently of the store + * @param params - Object containing current block and auction details + * @param params.currentBlock - The current block number + * @param params.auctionDetails - The auction details containing start/end blocks + * @returns Computed auction progress state and derived values + */ +export function computeAuctionProgress({ + currentBlock, + auctionDetails, +}: { + currentBlock: bigint | undefined + auctionDetails: AuctionDetails | null +}): AuctionProgressData { + const state = getAuctionProgressState({ + currentBlock, + startBlock: auctionDetails?.startBlock, + endBlock: auctionDetails?.endBlock, + }) + + let blocksRemaining: number | undefined + let progressPercentage: number | undefined + + if (currentBlock && auctionDetails) { + const current = Number(currentBlock) + const { startBlock, endBlock } = auctionDetails + + if (state === AuctionProgressState.IN_PROGRESS) { + blocksRemaining = endBlock - current + const totalBlocks = endBlock - startBlock + const elapsedBlocks = current - startBlock + // TODO | Toucan: if progress is percentage sold rather than blocks passed, this needs to be updated + progressPercentage = totalBlocks > 0 ? Math.min(100, (elapsedBlocks / totalBlocks) * 100) : 0 + } + } + + // TODO | Toucan: update with graduation logic once schema from back end has been decided on + const isGraduated = false + + return { + state, + blocksRemaining, + progressPercentage, + isGraduated, + } +} diff --git a/apps/web/src/components/animations/Wiggle.tsx b/apps/web/src/components/animations/Wiggle.tsx index a250c0b1b0d..4d14f81d594 100644 --- a/apps/web/src/components/animations/Wiggle.tsx +++ b/apps/web/src/components/animations/Wiggle.tsx @@ -1,52 +1,59 @@ -import { forwardRef, PropsWithChildren, useState } from 'react' +import { forwardRef, PropsWithChildren } from 'react' import { Flex, FlexProps, useSporeColors } from 'ui/src' +import { useBooleanState } from 'utilities/src/react/useBooleanState' -const wiggleKeyframe = ` +const getWiggleKeyframe = ({ wiggleAmount = 20 }: { wiggleAmount?: number }) => { + return ` @keyframes wiggle { 0% { transform: rotate(0deg) scale(1); } 30% { - transform: rotate(20deg) scale(1.1); + transform: rotate(${wiggleAmount}deg) scale(1.05); } 60% { - transform: rotate(-10deg) scale(1.2); + transform: rotate(-${wiggleAmount / 2}deg) scale(1.1); } 100% { - transform: rotate(0deg) scale(1.15); + transform: rotate(0deg) scale(1.06); } } ` +} -export const Wiggle = forwardRef & { iconColor?: string }>( - ({ iconColor, children, ...props }, ref) => { - const [isHovering, setIsHovering] = useState(false) - const colors = useSporeColors() +export const Wiggle = forwardRef< + any, + PropsWithChildren & { wiggleAmount?: number; iconColor?: string; isAnimating?: boolean } +>(({ wiggleAmount = 20, iconColor, children, isAnimating, ...props }, ref) => { + const { value: isHovering, setTrue: setIsHovering, setFalse: setIsHoveringFalse } = useBooleanState(false) + const colors = useSporeColors() + const wiggleKeyframe = getWiggleKeyframe({ wiggleAmount }) + // Use external isAnimating prop if provided, otherwise use internal hover state + const shouldAnimate = isAnimating !== undefined ? isAnimating : isHovering - return ( - <> - - setIsHovering(true)} - onHoverOut={() => setIsHovering(false)} - {...props} - style={{ - animationName: isHovering ? 'wiggle' : 'none', - animationDuration: '0.5s', - animationTimingFunction: 'ease-in-out', - animationFillMode: 'forwards', - animationIterationCount: 1, - animationDirection: 'normal', - transition: 'fill 0.3s ease-in-out', - fill: isHovering ? iconColor || colors.neutral1.val : colors.neutral1.val, - }} - > - {children} - - - ) - }, -) + return ( + <> + + + {children} + + + ) +}) Wiggle.displayName = 'Wiggle' diff --git a/apps/web/src/components/delegation/DelegationMismatchModal.tsx b/apps/web/src/components/delegation/DelegationMismatchModal.tsx index f1145037613..04be6c0f2ba 100644 --- a/apps/web/src/components/delegation/DelegationMismatchModal.tsx +++ b/apps/web/src/components/delegation/DelegationMismatchModal.tsx @@ -10,7 +10,7 @@ import { Blocked } from 'ui/src/components/icons/Blocked' import { Dialog } from 'uniswap/src/components/dialog/Dialog' import { uniswapUrls } from 'uniswap/src/constants/urls' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' -import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send.web' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { Trace } from 'uniswap/src/features/telemetry/Trace' import { useEvent } from 'utilities/src/react/hooks' @@ -78,24 +78,23 @@ function DelegationMismatchModal({ onClose }: DelegationMismatchModalProps) { } icon={} primaryButtonText={t('common.button.disconnect')} - primaryButtonOnClick={handleSwitchWallets} + primaryButtonOnPress={handleSwitchWallets} primaryButtonVariant="default" primaryButtonEmphasis="secondary" secondaryButtonText={t('common.button.continue')} - secondaryButtonOnClick={handleContinue} + secondaryButtonOnPress={handleContinue} secondaryButtonVariant="default" secondaryButtonEmphasis="primary" learnMoreUrl={uniswapUrls.helpArticleUrls.mismatchedImports} learnMoreTextColor="$accent1" learnMoreTextVariant="buttonLabel3" onClose={onClose} - buttonContainerProps={{ flexDirection: 'row', gap: '$spacing12' }} textAlign="left" > - + {FEATURES.map((feature, index) => ( - - + + {feature} diff --git a/apps/web/src/constants/icons/mxnIcon.tsx b/apps/web/src/constants/icons/mxnIcon.tsx index ec470473900..b07412bc0f6 100644 --- a/apps/web/src/constants/icons/mxnIcon.tsx +++ b/apps/web/src/constants/icons/mxnIcon.tsx @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import type { SVGProps } from 'constants/icons/types' const MXN_ICON = (props: SVGProps) => { diff --git a/apps/web/src/features/notifications/WebNotificationToastWrapper.tsx b/apps/web/src/features/notifications/WebNotificationToastWrapper.tsx index 1bdaa0df5ae..775daca1270 100644 --- a/apps/web/src/features/notifications/WebNotificationToastWrapper.tsx +++ b/apps/web/src/features/notifications/WebNotificationToastWrapper.tsx @@ -1,5 +1,6 @@ import { ChangeAssetVisibilityNotification } from 'uniswap/src/components/notifications/notifications/ChangeAssetVisibilityNotification' import { CopiedNotification } from 'uniswap/src/components/notifications/notifications/CopiedNotification' +import { SuccessNotification } from 'uniswap/src/components/notifications/notifications/SuccessNotification' import { useSelectAddressNotifications } from 'uniswap/src/features/notifications/slice/hooks' import { AppNotification, AppNotificationType } from 'uniswap/src/features/notifications/slice/types' import { useWallet } from 'uniswap/src/features/wallet/hooks/useWallet' @@ -22,6 +23,8 @@ function NotificationToastRouter({ notification }: { notification: AppNotificati return case AppNotificationType.AssetVisibility: return + case AppNotificationType.Success: + return default: return null } diff --git a/apps/web/src/hooks/useBlockCountdown.test.ts b/apps/web/src/hooks/useBlockCountdown.test.ts new file mode 100644 index 00000000000..8db90b7e289 --- /dev/null +++ b/apps/web/src/hooks/useBlockCountdown.test.ts @@ -0,0 +1,76 @@ +import { useBlockCountdown } from 'hooks/useBlockCountdown' +import { renderHook } from 'test-utils/render' +import { UniverseChainId } from 'uniswap/src/features/chains/types' + +const mockUseBlock = vi.fn() + +vi.mock('wagmi', async () => ({ + ...(await vi.importActual('wagmi')), + useBlock: () => mockUseBlock(), +})) + +describe('useBlockCountdown', () => { + beforeEach(() => { + vi.clearAllMocks() + vi.useFakeTimers() + }) + + afterEach(() => { + vi.useRealTimers() + }) + + it('should return undefined when chainId is undefined', () => { + mockUseBlock.mockReturnValue({ data: { timestamp: 1000000n } }) + + const { result } = renderHook(() => useBlockCountdown(undefined)) + + expect(result.current).toBeUndefined() + }) + + it('should return undefined when blockTimestamp is undefined', () => { + mockUseBlock.mockReturnValue({ data: undefined }) + + const { result } = renderHook(() => useBlockCountdown(UniverseChainId.Mainnet)) + + expect(result.current).toBeUndefined() + }) + + it('should calculate countdown for L1 chains', () => { + const now = 1000000 + const blockTimestamp = now - 5 // 5 seconds ago + vi.setSystemTime(now * 1000) + + mockUseBlock.mockReturnValue({ data: { timestamp: BigInt(blockTimestamp) } }) + + const { result } = renderHook(() => useBlockCountdown(UniverseChainId.Mainnet)) + + // With 12s block time and 5s elapsed, should have 7s remaining + expect(result.current).toBe(7) + }) + + it('should calculate countdown for L2 chains', () => { + const now = 1000000 + const blockTimestamp = now - 1 // 1 second ago + vi.setSystemTime(now * 1000) + + mockUseBlock.mockReturnValue({ data: { timestamp: BigInt(blockTimestamp) } }) + + const { result } = renderHook(() => useBlockCountdown(UniverseChainId.ArbitrumOne)) + + // With 3s block time and 1s elapsed, should have 2s remaining + expect(result.current).toBe(2) + }) + + it('should cycle countdown from max when reaching zero', () => { + const now = 1000000 + const blockTimestamp = now - 12 // Exactly 12 seconds ago (full L1 block time) + vi.setSystemTime(now * 1000) + + mockUseBlock.mockReturnValue({ data: { timestamp: BigInt(blockTimestamp) } }) + + const { result } = renderHook(() => useBlockCountdown(UniverseChainId.Mainnet)) + + // Should reset to max block time (12s) when countdown would be 0 + expect(result.current).toBe(12) + }) +}) diff --git a/apps/web/src/hooks/useBlockCountdown.ts b/apps/web/src/hooks/useBlockCountdown.ts new file mode 100644 index 00000000000..97cb6e018bf --- /dev/null +++ b/apps/web/src/hooks/useBlockCountdown.ts @@ -0,0 +1,55 @@ +import { useEffect, useState } from 'react' +import { EVMUniverseChainId } from 'uniswap/src/features/chains/types' +import { isMainnetChainId } from 'uniswap/src/features/chains/utils' +import { + AVERAGE_L1_BLOCK_TIME_MS, + AVERAGE_L2_BLOCK_TIME_MS, +} from 'uniswap/src/features/transactions/hooks/usePollingIntervalByChain' +import { ONE_SECOND_MS } from 'utilities/src/time/time' +import { useBlock } from 'wagmi' + +/** + * Hook that provides a countdown timer until the next block + * Calculates time remaining based on current block timestamp and average block time for the chain + * @param chainId - The EVM chain ID to track blocks for + * @returns The number of seconds remaining until the next block (estimated) + */ +export function useBlockCountdown(chainId: EVMUniverseChainId | undefined): number | undefined { + const [countdown, setCountdown] = useState(undefined) + + const { data: currentBlock } = useBlock({ chainId }) + const currentBlockTimestamp = currentBlock?.timestamp + + useEffect(() => { + if (!chainId || !currentBlockTimestamp) { + setCountdown(undefined) + return + } + + const averageBlockTimeMs = isMainnetChainId(chainId) ? AVERAGE_L1_BLOCK_TIME_MS : AVERAGE_L2_BLOCK_TIME_MS + const averageBlockTimeSeconds = averageBlockTimeMs / ONE_SECOND_MS + const blockTimestamp = Number(currentBlockTimestamp) + + const calculateCountdown = () => { + const now = Math.floor(Date.now() / ONE_SECOND_MS) + const elapsedSinceBlock = now - blockTimestamp + const remaining = averageBlockTimeSeconds - (elapsedSinceBlock % averageBlockTimeSeconds) + + // Ensure countdown cycles from max to 1 (never show 0) + return remaining < 1 ? averageBlockTimeSeconds : remaining + } + + setCountdown(calculateCountdown()) + + const interval = setInterval(() => { + setCountdown(calculateCountdown()) + }, ONE_SECOND_MS) + + // eslint-disable-next-line consistent-return + return () => { + clearInterval(interval) + } + }, [chainId, currentBlockTimestamp]) + + return countdown +} diff --git a/apps/web/src/hooks/useBlockTimestamp.ts b/apps/web/src/hooks/useBlockTimestamp.ts index 6c18c323cef..9ee76793660 100644 --- a/apps/web/src/hooks/useBlockTimestamp.ts +++ b/apps/web/src/hooks/useBlockTimestamp.ts @@ -52,7 +52,7 @@ export function useBlockTimestamp({ // For future blocks, calculate estimated timestamp const estimatedFutureTimestamp = useMemo(() => { - if (!blockNumber || !currentBlockTimestamp || !chainId) { + if (!blockNumber || !currentBlockTimestamp || !chainId || !currentBlockNumber) { return undefined } diff --git a/apps/web/src/index.tsx b/apps/web/src/index.tsx index def547dfb40..1d8376faf5b 100644 --- a/apps/web/src/index.tsx +++ b/apps/web/src/index.tsx @@ -7,7 +7,9 @@ import { TokenBalancesProvider } from 'appGraphql/data/apollo/TokenBalancesProvi import { getDeviceId } from '@amplitude/analytics-browser' import { ApolloProvider } from '@apollo/client' import { datadogRum } from '@datadog/browser-rum' +import { ApiInit, getSessionService } from '@universe/api' import type { StatsigUser } from '@universe/gating' +import { createChallengeSolverService, createSessionInitializationService } from '@universe/sessions' import { QueryClientPersistProvider } from 'components/PersistQueryClient' import { createWeb3Provider } from 'components/Web3Provider/createWeb3Provider' import { WebUniswapProvider } from 'components/Web3Provider/WebUniswapContext' @@ -71,6 +73,14 @@ const loadFiatOnRampTransactionsUpdater = () => import('state/fiatOnRampTransact const loadWebAccountsStoreUpdater = () => import('features/accounts/store/updater').then((m) => ({ default: m.WebAccountsStoreUpdater })) +const sessionInitService = createSessionInitializationService({ + sessionService: getSessionService({ + // TODO: Use real base url + getBaseUrl: () => 'https://entry-gateway.backend-dev.api.uniswap.org', + }), + challengeSolverService: createChallengeSolverService(), +}) + function Updaters() { const location = useLocation() @@ -97,6 +107,7 @@ function Updaters() { {FiatOnRampTransactionsUpdater && } {WebAccountsStoreUpdater && } + ) } diff --git a/apps/web/src/notification-renderer/NotificationContainer.tsx b/apps/web/src/notification-renderer/NotificationContainer.tsx new file mode 100644 index 00000000000..37aac18012a --- /dev/null +++ b/apps/web/src/notification-renderer/NotificationContainer.tsx @@ -0,0 +1,180 @@ +/* eslint-disable import/no-unused-modules */ +import { type InAppNotification } from '@universe/api' +import { type NotificationState, useNotificationStore } from 'notification-renderer/notificationStore' +import { memo, useCallback } from 'react' +import { Flex, Portal, Text } from 'ui/src' +import { logger } from 'utilities/src/logger/logger' +import { type StoreApi, type UseBoundStore } from 'zustand' + +interface NotificationItemProps { + notification: InAppNotification + onDismiss: (notificationId: string) => void +} + +/** + * Renders a single notification item + * TODO: delete this component once we have real UI built. + */ +const NotificationItem = memo(function NotificationItem({ notification, onDismiss }: NotificationItemProps) { + const handleDismiss = useCallback(() => { + onDismiss(notification.id) + }, [notification.id, onDismiss]) + + // TODO: Map notification types to real UI components + // For now, render a placeholder card with notification content + return ( + + + {notification.content.title} + + {notification.content.subtitle && ( + + {notification.content.subtitle} + + )} + {/* TODO: Render buttons if present */} + {notification.content.buttons && notification.content.buttons.length > 0 && ( + + {notification.content.buttons.map((button, index) => ( + + + {button.text} + + + ))} + + )} + + ) +}) + +/** + * Renders a banner-style notification in the lower-left corner + * TODO: this should only handle placement. Replace the NotificationItem with the actual banner UI component. + */ +const BannerNotification = memo(function BannerNotification({ + notification, + onDismiss, +}: { + notification: InAppNotification + onDismiss: (id: string) => void +}) { + return ( + + onDismiss(notification.id)} + > + + + + ) +}) + +/** + * Renders a modal-style notification centered with overlay + * TODO: Replace with actual modal component + */ +const ModalNotification = memo(function ModalNotification({ + notification, + onDismiss, +}: { + notification: InAppNotification + onDismiss: (id: string) => void +}) { + return ( + + onDismiss(notification.id)} + > + + + + ) +}) + +/** + * Routes a notification to the appropriate renderer based on its style + */ +function NotificationRenderer({ + notification, + onDismiss, +}: { + notification: InAppNotification + onDismiss: (id: string) => void +}) { + const style = notification.content.style + + switch (style) { + case 'CONTENT_STYLE_LOWER_LEFT_BANNER': + return + case 'CONTENT_STYLE_MODAL': + return + default: + logger.warn('NotificationContainer', 'renderNotification', `Unknown notification style: ${style}`, { + notification, + }) + return null + } +} + +/** + * NotificationContainer component + * Subscribes to the notification store and renders active notifications + * Should be mounted at the app root level + */ +export function NotificationContainer({ + onDismiss, + store = useNotificationStore, +}: { + onDismiss?: (notificationId: string) => void + store?: UseBoundStore> +}) { + const activeNotifications = store((state) => state.activeNotifications) + const removeNotification = store((state) => state.removeNotification) + + const handleDismiss = useCallback( + (notificationId: string) => { + removeNotification(notificationId) + onDismiss?.(notificationId) + }, + [removeNotification, onDismiss], + ) + + return ( + <> + {activeNotifications.map((notification) => ( + + ))} + + ) +} diff --git a/apps/web/src/notification-renderer/createWebNotificationRenderer.ts b/apps/web/src/notification-renderer/createWebNotificationRenderer.ts new file mode 100644 index 00000000000..b4bc96adcdc --- /dev/null +++ b/apps/web/src/notification-renderer/createWebNotificationRenderer.ts @@ -0,0 +1,44 @@ +/* eslint-disable import/no-unused-modules */ +import { type InAppNotification } from '@universe/api' +import { createNotificationRenderer, type NotificationRenderer } from '@universe/notifications' +import { type NotificationState } from 'notification-renderer/notificationStore' +import { type StoreApi, type UseBoundStore } from 'zustand' + +export interface CreateWebNotificationRendererContext { + onDismiss?: (notificationId: string) => void + store: UseBoundStore> +} + +/** + * Creates a web-specific NotificationRenderer that uses Zustand store. + * This renderer coordinates rendering for all notification types in the web app. + */ +export function createWebNotificationRenderer(ctx: CreateWebNotificationRendererContext): NotificationRenderer { + const store = ctx.store + + return createNotificationRenderer({ + render: (notification: InAppNotification): (() => void) => { + // Add notification to the store, which will trigger React to render it + store.getState().addNotification(notification) + + // Return cleanup function that removes the notification from the store + return (): void => { + store.getState().removeNotification(notification.id) + } + }, + + canRender: (notification: InAppNotification): boolean => { + const { activeNotifications } = store.getState() + const style = notification.content.style + + // EXAMPLE rule that needs insight into current render state: only one modal at a time + if (style === 'CONTENT_STYLE_MODAL') { + const hasActiveModal = activeNotifications.some((n) => n.content.style === 'CONTENT_STYLE_MODAL') + return !hasActiveModal + } + + // Other notification types can be rendered concurrently + return true + }, + }) +} diff --git a/apps/web/src/notification-renderer/notificationStore.ts b/apps/web/src/notification-renderer/notificationStore.ts new file mode 100644 index 00000000000..2452bafca01 --- /dev/null +++ b/apps/web/src/notification-renderer/notificationStore.ts @@ -0,0 +1,36 @@ +/* eslint-disable import/no-unused-modules */ +import { type InAppNotification } from '@universe/api' +import { create, type StoreApi, type UseBoundStore } from 'zustand' + +export interface NotificationState { + // Currently active notifications + activeNotifications: InAppNotification[] + // Add a notification to be rendered + addNotification: (notification: InAppNotification) => void + // Remove a notification from the active list + removeNotification: (notificationId: string) => void +} + +export const useNotificationStore: UseBoundStore> = create((set) => ({ + activeNotifications: [], + + addNotification: (notification: InAppNotification): void => { + set((state) => { + // The NotificationSystem should prevent duplicates, but we check here defensively just in case. + const exists = state.activeNotifications.some((n) => n.id === notification.id) + if (exists) { + return state + } + + return { + activeNotifications: [...state.activeNotifications, notification], + } + }) + }, + + removeNotification: (notificationId: string): void => { + set((state) => ({ + activeNotifications: state.activeNotifications.filter((n) => n.id !== notificationId), + })) + }, +})) diff --git a/apps/web/src/pages/CreatePosition/CreateLiquidityContextProvider.tsx b/apps/web/src/pages/CreatePosition/CreateLiquidityContextProvider.tsx index 2c735c9446a..25f52a29062 100644 --- a/apps/web/src/pages/CreatePosition/CreateLiquidityContextProvider.tsx +++ b/apps/web/src/pages/CreatePosition/CreateLiquidityContextProvider.tsx @@ -1,7 +1,7 @@ import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency, Price, Token } from '@uniswap/sdk-core' import { Pair } from '@uniswap/v2-sdk' -import { FeeAmount, TICK_SPACINGS, Pool as V3Pool } from '@uniswap/v3-sdk' +import { Pool as V3Pool } from '@uniswap/v3-sdk' import { Pool as V4Pool } from '@uniswap/v4-sdk' import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useDerivedPositionInfo } from 'components/Liquidity/Create/hooks/useDerivedPositionInfo' @@ -34,14 +34,8 @@ export const DEFAULT_DEPOSIT_STATE: DepositState = { exactAmounts: {}, } -const DEFAULT_FEE_DATA = { - feeAmount: FeeAmount.MEDIUM, - tickSpacing: TICK_SPACINGS[FeeAmount.MEDIUM], - isDynamic: false, -} - const DEFAULT_POSITION_STATE: PositionState = { - fee: DEFAULT_FEE_DATA, + fee: undefined, hook: undefined, userApprovedHook: undefined, protocolVersion: ProtocolVersion.V4, @@ -166,7 +160,7 @@ export function CreateLiquidityContextProvider({ const [feeTierSearchModalOpen, setFeeTierSearchModalOpen] = useState(false) const [dynamicFeeTierSpeedbumpData, setDynamicFeeTierSpeedbumpData] = useState({ open: false, - wishFeeData: DEFAULT_POSITION_STATE.fee, + wishFeeData: undefined, }) const [refetch, setRefetch] = useState<() => void>() @@ -209,6 +203,10 @@ export function CreateLiquidityContextProvider({ }, [derivedPositionInfo, priceRangeState, positionState]) const poolOrPair = useMemo(() => { + if (!derivedPriceRangeInfo) { + return undefined + } + if ( derivedPositionInfo.protocolVersion === ProtocolVersion.V2 && derivedPriceRangeInfo.protocolVersion === ProtocolVersion.V2 @@ -286,17 +284,17 @@ export function CreateLiquidityContextProvider({ poolId: derivedPositionInfo.poolId, poolOrPairLoading: derivedPositionInfo.poolOrPairLoading, creatingPoolOrPair: derivedPositionInfo.creatingPoolOrPair, - price: derivedPriceRangeInfo.price, + price: derivedPriceRangeInfo?.price, ticks: - derivedPriceRangeInfo.protocolVersion === ProtocolVersion.V2 + derivedPriceRangeInfo?.protocolVersion === ProtocolVersion.V2 || !derivedPriceRangeInfo ? [undefined, undefined] : derivedPriceRangeInfo.ticks, ticksAtLimit: - derivedPriceRangeInfo.protocolVersion === ProtocolVersion.V2 + derivedPriceRangeInfo?.protocolVersion === ProtocolVersion.V2 || !derivedPriceRangeInfo ? [false, false] : derivedPriceRangeInfo.ticksAtLimit, pricesAtTicks: - derivedPriceRangeInfo.protocolVersion === ProtocolVersion.V2 + derivedPriceRangeInfo?.protocolVersion === ProtocolVersion.V2 || !derivedPriceRangeInfo ? [undefined, undefined] : derivedPriceRangeInfo.pricesAtTicks, isNativeTokenAOnly, diff --git a/apps/web/src/pages/CreatePosition/CreatePosition.anvil.e2e.test.ts b/apps/web/src/pages/CreatePosition/CreatePosition.anvil.e2e.test.ts index 14d6390c300..7b19f6317e7 100644 --- a/apps/web/src/pages/CreatePosition/CreatePosition.anvil.e2e.test.ts +++ b/apps/web/src/pages/CreatePosition/CreatePosition.anvil.e2e.test.ts @@ -15,7 +15,6 @@ import { parseEther } from 'viem' const test = getTest({ withAnvil: true }) const WETH_ADDRESS = WETH.address -const DEFAULT_INITIAL_POOL_PRICE = '3000' function modifyGasLimit(data: { create: { gasLimit: string } }) { try { @@ -41,6 +40,9 @@ test.describe('Create position', () => { // eslint-disable-next-line await page.getByTestId('token-option-1-USDT').first().click() await page.getByRole('button', { name: 'Continue' }).click() + await graphql.waitForResponse('PoolPriceHistory') + await graphql.waitForResponse('AllV4Ticks') + await page.getByText('Full range').click() await reviewAndCreatePosition({ page }) }) @@ -60,7 +62,6 @@ test.describe('Create position', () => { await page.getByRole('button', { name: 'Continue' }).click() await graphql.waitForResponse('PoolPriceHistory') await graphql.waitForResponse('AllV4Ticks') - await page.getByText('Custom range').click() await page.getByTestId(TestID.RangeInputIncrement + '-0').click() await page.getByTestId(TestID.RangeInputDecrement + '-1').click() await reviewAndCreatePosition({ page }) @@ -125,12 +126,10 @@ test.describe('Create position', () => { await expect(page.getByText('New tier').first()).toBeVisible() await expect(page.getByText('Creating new pool')).toBeVisible() await page.getByRole('button', { name: 'Continue' }).click() - // Set initial price for new pool - await page.getByPlaceholder('0').first().fill(DEFAULT_INITIAL_POOL_PRICE) await reviewAndCreatePosition({ page }) }) - test('should create a position with a custom fee tier and a dynamic fee tier', async ({ page, anvil }) => { + test('should create a position with a dynamic fee tier', async ({ page, anvil }) => { const HOOK_ADDRESS = '0x09DEA99D714A3a19378e3D80D1ad22Ca46085080' await stubTradingApiEndpoint({ page, @@ -145,8 +144,6 @@ test.describe('Create position', () => { await page.getByRole('button', { name: 'Continue' }).click() await page.getByRole('button', { name: 'Continue' }).click() await page.getByRole('button', { name: 'Continue' }).click() - // Set initial price for new pool - await page.getByPlaceholder('0').first().fill(DEFAULT_INITIAL_POOL_PRICE) await reviewAndCreatePosition({ page }) }) }) diff --git a/apps/web/src/pages/CreatePosition/CreatePosition.e2e.test.ts b/apps/web/src/pages/CreatePosition/CreatePosition.e2e.test.ts index 5553e26635b..4d22d0754ed 100644 --- a/apps/web/src/pages/CreatePosition/CreatePosition.e2e.test.ts +++ b/apps/web/src/pages/CreatePosition/CreatePosition.e2e.test.ts @@ -1,4 +1,4 @@ -import { DYNAMIC_FEE_DATA } from 'components/Liquidity/Create/types' +import { DEFAULT_FEE_DATA, DYNAMIC_FEE_DATA } from 'components/Liquidity/Create/types' import ms from 'ms' import { expect, getTest, type Page } from 'playwright/fixtures' import { stubTradingApiEndpoint } from 'playwright/fixtures/tradingApi' @@ -59,7 +59,7 @@ test.describe('Create position', () => { // Confirm reset await page.getByRole('button', { name: 'Reset' }).click() const url = new URL(page.url()) - await expect(url.pathname).toBe(`/positions/create/v2`) + await expect(url.pathname).toContain(`/positions/create/v2`) await expect(page.getByRole('button', { name: 'New v2 position' })).not.toBeVisible() }) }) @@ -122,6 +122,20 @@ test.describe('Create position', () => { await expect(page.getByText('Dynamic fee tier')).toBeVisible() }) + + test('handles undefined fee', async ({ page }) => { + await page.goto(`/positions/create/v4`) + + await expect(page.getByText('-- fee tier')).toBeVisible() + + await page.getByRole('button', { name: 'Choose token' }).click() + await page.getByTestId(TestID.ExploreSearchInput).fill(USDT.address) + // eslint-disable-next-line + await page.getByTestId('token-option-1-USDT').first().click() + + // Verify the fee tier is set to the most used fee tier + await expect(page.getByText('-- fee tier')).not.toBeVisible() + }) }) test.describe('hook parsing', () => { @@ -237,7 +251,7 @@ test.describe('Create position', () => { test.describe('Price range state', () => { test('parses and restores complete priceRange state from URL', async ({ page }) => { // Test URL with all PriceRangeState fields populated - const testUrl = `/positions/create/v4?currencyA=NATIVE¤cyB=${USDT.address}&step=1&priceRangeState={"priceInverted":true,"fullRange":false,"minPrice":"0.00019382924070396673","maxPrice":"0.000350504530738769","initialPrice":""}&chain=ethereum&hook=undefined&depositState={"exactField":"TOKEN1","exactAmounts":{}}` + const testUrl = `/positions/create/v4?currencyA=NATIVE¤cyB=${USDT.address}&step=1&priceRangeState={"priceInverted":true,"fullRange":false,"minPrice":"0.00019382924070396673","maxPrice":"0.000350504530738769","initialPrice":""}&chain=ethereum&hook=undefined&depositState={"exactField":"TOKEN1","exactAmounts":{}}&fee=${JSON.stringify(DEFAULT_FEE_DATA)}` await page.goto(testUrl) @@ -278,7 +292,7 @@ test.describe('Create position', () => { const randomCoin = '0x2621Cb9FE8921351E9558D4CD8666688e1DcD689' await page.goto( - `/positions/create/v4?currencyA=NATIVE¤cyB=${randomCoin}&step=1&priceRangeState={"priceInverted":false,"fullRange":false,"minPrice":"2991.7083","maxPrice":"3990.1553","initialPrice":"3500.75","isInitialPriceDirty":true}`, + `/positions/create/v4?currencyA=NATIVE¤cyB=${randomCoin}&step=1&priceRangeState={"priceInverted":false,"fullRange":false,"minPrice":"2991.7083","maxPrice":"3990.1553","initialPrice":"3500.75","isInitialPriceDirty":true}&fee=${JSON.stringify(DEFAULT_FEE_DATA)}`, ) // Verify price inputs are populated @@ -307,7 +321,7 @@ test.describe('Create position', () => { test.describe('Deposit state', () => { test('parses and restores complete depositState from URL with TOKEN0 exact field', async ({ page }) => { // Test URL with TOKEN0 as exact field (TOKEN1 will be calculated) - const testUrl = `/positions/create/v4?currencyA=NATIVE¤cyB=${USDT.address}&step=1&depositState={"exactField":"TOKEN0","exactAmounts":{"TOKEN0":"1.25","TOKEN1":""}}` + const testUrl = `/positions/create/v4?currencyA=NATIVE¤cyB=${USDT.address}&step=1&depositState={"exactField":"TOKEN0","exactAmounts":{"TOKEN0":"1.25","TOKEN1":""}}&fee=${JSON.stringify(DEFAULT_FEE_DATA)}` await page.goto(testUrl) @@ -339,7 +353,7 @@ test.describe('Create position', () => { test('parses and restores complete depositState from URL with TOKEN1 exact field', async ({ page }) => { // Test URL with TOKEN1 as exact field (TOKEN0 will be calculated) - const testUrl = `/positions/create/v4?currencyA=NATIVE¤cyB=${USDT.address}&step=1&depositState={"exactField":"TOKEN1","exactAmounts":{"TOKEN0":"","TOKEN1":"3500.50"}}` + const testUrl = `/positions/create/v4?currencyA=NATIVE¤cyB=${USDT.address}&step=1&depositState={"exactField":"TOKEN1","exactAmounts":{"TOKEN0":"","TOKEN1":"3500.50"}}&fee=${JSON.stringify(DEFAULT_FEE_DATA)}` await page.goto(testUrl) @@ -377,13 +391,13 @@ test.describe('Create position', () => { test('token0 and token1 are sorted', async ({ page }) => { await page.goto(`/positions/create/v4?currencyA=NATIVE¤cyB=${USDT.address}`) await page.getByRole('button', { name: 'Continue' }).click() - await expect(page.getByText('ETH/USDT')).toBeVisible() + await expect(page.getByText('ETH/USDT').first()).toBeVisible() await expect(page.getByText('USDT/ETH')).not.toBeVisible() }) test('token0 and token1 are not sorted', async ({ page }) => { await page.goto(`/positions/create/v4?currencyA=${USDT.address}¤cyB=NATIVE`) await page.getByRole('button', { name: 'Continue' }).click() - await expect(page.getByText('ETH/USDT')).toBeVisible() + await expect(page.getByText('ETH/USDT').first()).toBeVisible() await expect(page.getByText('USDT/ETH')).not.toBeVisible() }) }) @@ -394,14 +408,14 @@ test.describe('Create position', () => { test('token0 and token1 are sorted', async ({ page }) => { await page.goto(`/positions/create/v4?currencyA=${USDT.address}¤cyB=${DAI.address}`) await page.getByRole('button', { name: 'Continue' }).click() - await expect(page.getByText('DAI/USDT')).toBeVisible() + await expect(page.getByText('DAI/USDT').first()).toBeVisible() await expect(page.getByText('USDT/DAI')).not.toBeVisible() }) test('token0 and token1 are not sorted', async ({ page }) => { await page.goto(`/positions/create/v4?currencyA=${DAI.address}¤cyB=${USDT.address}`) await page.getByRole('button', { name: 'Continue' }).click() - await expect(page.getByText('DAI/USDT')).toBeVisible() + await expect(page.getByText('DAI/USDT').first()).toBeVisible() await expect(page.getByText('USDT/DAI')).not.toBeVisible() }) }) @@ -412,14 +426,14 @@ test.describe('Create position', () => { test('token0 and token1 are sorted', async ({ page }) => { await page.goto(`/positions/create/v3?currencyA=NATIVE¤cyB=${USDT.address}`) await page.getByRole('button', { name: 'Continue' }).click() - await expect(page.getByText('ETH/USDT')).toBeVisible() + await expect(page.getByText('ETH/USDT').first()).toBeVisible() await expect(page.getByText('USDT/ETH')).not.toBeVisible() }) test('token0 and token1 are not sorted', async ({ page }) => { await page.goto(`/positions/create/v3?currencyA=${USDT.address}¤cyB=NATIVE`) await page.getByRole('button', { name: 'Continue' }).click() - await expect(page.getByText('ETH/USDT')).toBeVisible() + await expect(page.getByText('ETH/USDT').first()).toBeVisible() await expect(page.getByText('USDT/ETH')).not.toBeVisible() }) }) @@ -428,14 +442,14 @@ test.describe('Create position', () => { test('token0 and token1 are sorted', async ({ page }) => { await page.goto(`/positions/create/v3?currencyA=${WETH_ADDRESS}¤cyB=${USDT.address}`) await page.getByRole('button', { name: 'Continue' }).click() - await expect(page.getByText('WETH/USDT')).toBeVisible() + await expect(page.getByText('WETH/USDT').first()).toBeVisible() await expect(page.getByText('USDT/WETH')).not.toBeVisible() }) test('token0 and token1 are not sorted', async ({ page }) => { await page.goto(`/positions/create/v3?currencyA=${USDT.address}¤cyB=${WETH_ADDRESS}`) await page.getByRole('button', { name: 'Continue' }).click() - await expect(page.getByText('ETH/USDT')).toBeVisible() + await expect(page.getByText('ETH/USDT').first()).toBeVisible() await expect(page.getByText('USDT/ETH')).not.toBeVisible() }) }) @@ -446,14 +460,14 @@ test.describe('Create position', () => { test('token0 and token1 are sorted', async ({ page }) => { await page.goto(`/positions/create/v3?currencyA=${USDT.address}¤cyB=${DAI.address}`) await page.getByRole('button', { name: 'Continue' }).click() - await expect(page.getByText('DAI/USDT')).toBeVisible() + await expect(page.getByText('DAI/USDT').first()).toBeVisible() await expect(page.getByText('USDT/DAI')).not.toBeVisible() }) test('token0 and token1 are not sorted', async ({ page }) => { await page.goto(`/positions/create/v3?currencyA=${DAI.address}¤cyB=${USDT.address}`) await page.getByRole('button', { name: 'Continue' }).click() - await expect(page.getByText('DAI/USDT')).toBeVisible() + await expect(page.getByText('DAI/USDT').first()).toBeVisible() await expect(page.getByText('USDT/DAI')).not.toBeVisible() }) }) @@ -464,14 +478,14 @@ test.describe('Create position', () => { test('token0 and token1 are sorted', async ({ page }) => { await page.goto(`/positions/create/v2?currencyA=NATIVE¤cyB=${USDT.address}`) await page.getByRole('button', { name: 'Continue' }).click() - await expect(page.getByText('ETH/USDT')).toBeVisible() + await expect(page.getByText('ETH/USDT').first()).toBeVisible() await expect(page.getByText('USDT/ETH')).not.toBeVisible() }) test('token0 and token1 are not sorted', async ({ page }) => { await page.goto(`/positions/create/v2?currencyA=${USDT.address}¤cyB=NATIVE`) await page.getByRole('button', { name: 'Continue' }).click() - await expect(page.getByText('ETH/USDT')).toBeVisible() + await expect(page.getByText('ETH/USDT').first()).toBeVisible() await expect(page.getByText('USDT/ETH')).not.toBeVisible() }) }) @@ -480,14 +494,14 @@ test.describe('Create position', () => { test('token0 and token1 are sorted', async ({ page }) => { await page.goto(`/positions/create/v2?currencyA=${WETH_ADDRESS}¤cyB=${USDT.address}`) await page.getByRole('button', { name: 'Continue' }).click() - await expect(page.getByText('WETH/USDT')).toBeVisible() + await expect(page.getByText('WETH/USDT').first()).toBeVisible() await expect(page.getByText('USDT/WETH')).not.toBeVisible() }) test('token0 and token1 are not sorted', async ({ page }) => { await page.goto(`/positions/create/v2?currencyA=${USDT.address}¤cyB=${WETH_ADDRESS}`) await page.getByRole('button', { name: 'Continue' }).click() - await expect(page.getByText('ETH/USDT')).toBeVisible() + await expect(page.getByText('ETH/USDT').first()).toBeVisible() await expect(page.getByText('USDT/WETH')).not.toBeVisible() }) }) @@ -498,14 +512,14 @@ test.describe('Create position', () => { test('token0 and token1 are sorted', async ({ page }) => { await page.goto(`/positions/create/v2?currencyA=${USDT.address}¤cyB=${DAI.address}`) await page.getByRole('button', { name: 'Continue' }).click() - await expect(page.getByText('DAI/USDT')).toBeVisible() + await expect(page.getByText('DAI/USDT').first()).toBeVisible() await expect(page.getByText('USDT/DAI')).not.toBeVisible() }) test('token0 and token1 are not sorted', async ({ page }) => { await page.goto(`/positions/create/v2?currencyA=${DAI.address}¤cyB=${USDT.address}`) await page.getByRole('button', { name: 'Continue' }).click() - await expect(page.getByText('DAI/USDT')).toBeVisible() + await expect(page.getByText('DAI/USDT').first()).toBeVisible() await expect(page.getByText('USDT/DAI')).not.toBeVisible() }) }) @@ -574,7 +588,6 @@ async function incrementDecrementPrice({ page }: { page: Page }) { async function waitUntilInputFilled({ page }: { page: Page }) { await page.getByRole('button', { name: 'Continue' }).click() await page.waitForTimeout(ms('2s')) - await page.getByText('Custom range').click() await expect(async () => { const minValue = await page.getByTestId(TestID.RangeInput + '-0').inputValue() const maxValue = await page.getByTestId(TestID.RangeInput + '-1').inputValue() diff --git a/apps/web/src/pages/CreatePosition/CreatePosition.tsx b/apps/web/src/pages/CreatePosition/CreatePosition.tsx index 43f59b7b469..e90d11fd5a3 100644 --- a/apps/web/src/pages/CreatePosition/CreatePosition.tsx +++ b/apps/web/src/pages/CreatePosition/CreatePosition.tsx @@ -248,7 +248,7 @@ function CreatePositionContent({ currencyInputs={currencyInputs} setCurrencyInputs={setCurrencyInputs} initialPositionState={{ - fee: initialInputs.fee, + fee: initialInputs.fee ?? undefined, hook: initialInputs.hook ?? undefined, protocolVersion: initialProtocolVersion, }} diff --git a/apps/web/src/pages/CreatePosition/CreatePositionModal.tsx b/apps/web/src/pages/CreatePosition/CreatePositionModal.tsx index 6ff6df08151..3f7f235d6fa 100644 --- a/apps/web/src/pages/CreatePosition/CreatePositionModal.tsx +++ b/apps/web/src/pages/CreatePosition/CreatePositionModal.tsx @@ -181,8 +181,8 @@ export function CreatePositionModal({ version: protocolVersion, tickLower: ticks[0] ?? undefined, tickUpper: ticks[1] ?? undefined, - fee: fee.feeAmount, - tickSpacing: fee.tickSpacing, + fee: fee?.feeAmount, + tickSpacing: fee?.tickSpacing, currency0: currencyAmounts.TOKEN0.currency, currency1: currencyAmounts.TOKEN1.currency, currency0AmountUsd: currencyAmountsUSDValue?.TOKEN0, @@ -214,8 +214,8 @@ export function CreatePositionModal({ setCurrentTransactionStep, onSuccess, trace, - fee.feeAmount, - fee.tickSpacing, + fee?.feeAmount, + fee?.tickSpacing, ticks, hook, currencyAmountsUSDValue?.TOKEN0, diff --git a/apps/web/src/pages/CreatePosition/CreatePositionTxContext.tsx b/apps/web/src/pages/CreatePosition/CreatePositionTxContext.tsx index 381072e7788..aec02255633 100644 --- a/apps/web/src/pages/CreatePosition/CreatePositionTxContext.tsx +++ b/apps/web/src/pages/CreatePosition/CreatePositionTxContext.tsx @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency, CurrencyAmount } from '@uniswap/sdk-core' import { Pair } from '@uniswap/v2-sdk' @@ -226,7 +227,7 @@ export function generateCreateCalldataQueryParams({ tickSpacing, token0: getTokenOrZeroAddress(displayCurrencies.TOKEN0), token1: getTokenOrZeroAddress(displayCurrencies.TOKEN1), - fee: positionState.fee.isDynamic ? DYNAMIC_FEE_DATA.feeAmount : positionState.fee.feeAmount, + fee: positionState.fee?.isDynamic ? DYNAMIC_FEE_DATA.feeAmount : positionState.fee?.feeAmount, hooks: positionState.hook, }, }, diff --git a/apps/web/src/pages/Explore/tables/RecentTransactions.tsx b/apps/web/src/pages/Explore/tables/RecentTransactions.tsx index eca30c3327b..1ad9900ed60 100644 --- a/apps/web/src/pages/Explore/tables/RecentTransactions.tsx +++ b/apps/web/src/pages/Explore/tables/RecentTransactions.tsx @@ -41,6 +41,8 @@ const TableRow = styled(Flex, { alignItems: 'center', }) +type RecentTransactionType = GraphQLApi.PoolTransaction & { usdValueFormatted: string } + const RecentTransactions = memo(function RecentTransactions() { const activeLocalCurrency = useAppFiatCurrency() const { convertFiatAmountFormatted, formatNumberOrString } = useLocalizationContext() @@ -53,9 +55,18 @@ const RecentTransactions = memo(function RecentTransactions() { ]) const chainInfo = getChainInfo(useChainIdFromUrlParam() ?? UniverseChainId.Mainnet) const { t } = useTranslation() - const { transactions, loading, loadMore, errorV2, errorV3 } = useAllTransactions(chainInfo.backendChain.chain, filter) + const filteredTransactions = useFilteredTransactions(transactions) + const filteredTransactionsWithFiat = useMemo(() => { + return filteredTransactions.map((transaction) => { + return { + ...transaction, + // We have to format the fiat value in object, as cells are not reactive. + usdValueFormatted: convertFiatAmountFormatted(transaction.usdValue.value, NumberType.FiatTokenPrice), + } + }) + }, [filteredTransactions, convertFiatAmountFormatted]) const combinedError = errorV2 && errorV3 @@ -67,7 +78,7 @@ const RecentTransactions = memo(function RecentTransactions() { // TODO(WEB-3236): once GQL BE Transaction query is supported add usd, token0 amount, and token1 amount sort support const media = useMedia() const columns = useMemo(() => { - const columnHelper = createColumnHelper() + const columnHelper = createColumnHelper() const filteredColumns = [ !media.lg ? columnHelper.accessor((transaction) => transaction, { @@ -146,7 +157,7 @@ const RecentTransactions = memo(function RecentTransactions() { ), }), - columnHelper.accessor((transaction) => transaction.usdValue.value, { + columnHelper.accessor((transaction) => transaction.usdValueFormatted, { id: 'fiat-value', maxSize: 125, header: () => ( @@ -158,7 +169,7 @@ const RecentTransactions = memo(function RecentTransactions() { ), cell: (fiat) => ( - {convertFiatAmountFormatted(fiat.getValue?.(), NumberType.FiatTokenPrice)} + {fiat.getValue?.()} ), }), @@ -242,7 +253,6 @@ const RecentTransactions = memo(function RecentTransactions() { media.lg, filter, filterModalIsOpen, - convertFiatAmountFormatted, formatNumberOrString, showLoadingSkeleton, t, @@ -251,7 +261,7 @@ const RecentTransactions = memo(function RecentTransactions() { return (
{ if (!positionInfo) { return undefined diff --git a/apps/web/src/pages/MigrateV3/index.tsx b/apps/web/src/pages/MigrateV3/index.tsx index eaf4cc5cd12..b154a18d36c 100644 --- a/apps/web/src/pages/MigrateV3/index.tsx +++ b/apps/web/src/pages/MigrateV3/index.tsx @@ -6,7 +6,7 @@ import { getLPBaseAnalyticsProperties } from 'components/Liquidity/analytics' import { FormStepsWrapper, FormWrapper } from 'components/Liquidity/Create/FormWrapper' import { useLiquidityUrlState } from 'components/Liquidity/Create/hooks/useLiquidityUrlState' import { useLPSlippageValue } from 'components/Liquidity/Create/hooks/useLPSlippageValues' -import { DEFAULT_POSITION_STATE, PositionFlowStep } from 'components/Liquidity/Create/types' +import { DEFAULT_POSITION_STATE, InitialPosition, PositionFlowStep } from 'components/Liquidity/Create/types' import { LiquidityModalHeader } from 'components/Liquidity/LiquidityModalHeader' import { LiquidityPositionCard } from 'components/Liquidity/LiquidityPositionCard' import { LoadingRow } from 'components/Liquidity/Loader' @@ -272,7 +272,7 @@ function Toolbar({ currency1Amount, setCurrencyInputs, }: { - initialPosition: { tickLower: number; tickUpper: number; isOutOfRange: boolean } | undefined + initialPosition: InitialPosition | undefined currency0Amount: CurrencyAmount currency1Amount: CurrencyAmount setCurrencyInputs: Dispatch; tokenB: Maybe }>> @@ -289,14 +289,16 @@ function Toolbar({ priceRangeState.minPrice === DEFAULT_PRICE_RANGE_STATE.minPrice return ( - fee.feeAmount === DEFAULT_POSITION_STATE.fee.feeAmount && - fee.tickSpacing === DEFAULT_POSITION_STATE.fee.tickSpacing && - fee.isDynamic === DEFAULT_POSITION_STATE.fee.isDynamic && + fee && + initialPosition && + fee.feeAmount === initialPosition.fee.feeAmount && + fee.tickSpacing === initialPosition.fee.tickSpacing && + fee.isDynamic === initialPosition.fee.isDynamic && hook === DEFAULT_POSITION_STATE.hook && priceRangeState.initialPrice === DEFAULT_PRICE_RANGE_STATE.initialPrice && isRangeUnchanged ) - }, [fee, hook, priceRangeState, initialPosition?.isOutOfRange]) + }, [fee, hook, priceRangeState, initialPosition]) return ( @@ -311,6 +313,7 @@ function Toolbar({ ...DEFAULT_POSITION_STATE, initialPosition, protocolVersion, + fee: initialPosition?.fee, }) setCurrencyInputs({ tokenA: getCurrencyForProtocol(currency0Amount.currency, protocolVersion), diff --git a/apps/web/src/pages/Portfolio/Activity/Activity.tsx b/apps/web/src/pages/Portfolio/Activity/Activity.tsx index 595e1e66339..4f12b740f83 100644 --- a/apps/web/src/pages/Portfolio/Activity/Activity.tsx +++ b/apps/web/src/pages/Portfolio/Activity/Activity.tsx @@ -1,7 +1,13 @@ import { Row } from '@tanstack/react-table' -import { ActivityTable } from 'components/ActivityTable/ActivityTable' import { DropdownSelector } from 'components/Dropdowns/DropdownSelector' +import { POPUP_MEDIUM_DISMISS_MS } from 'components/Popups/constants' +import { popupRegistry } from 'components/Popups/registry' +import { PopupType } from 'components/Popups/types' +import { Cell } from 'components/Table/Cell' +import { DataRow } from 'components/Table/styled' +import { ActivityTable } from 'pages/Portfolio/Activity/ActivityTable/ActivityTable' import { + filterTransactionDetailsFromActivityItems, getTimePeriodFilterOptions, getTransactionTypeFilterOptions, getTransactionTypesForFilter, @@ -10,16 +16,18 @@ import { SearchInput } from 'pages/Portfolio/components/SearchInput' import { usePortfolioAddress } from 'pages/Portfolio/hooks/usePortfolioAddress' import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' -import { Flex, TouchableArea } from 'ui/src' +import { Flex, TouchableArea, useMedia } from 'ui/src' import { Calendar } from 'ui/src/components/icons/Calendar' import { Filter } from 'ui/src/components/icons/Filter' import { TransactionDetailsModal } from 'uniswap/src/components/activity/details/TransactionDetailsModal' import { ActivityItem } from 'uniswap/src/components/activity/generateActivityItemRenderer' -import { isLoadingItem, isSectionHeader } from 'uniswap/src/components/activity/utils' +import { isLoadingItem } from 'uniswap/src/components/activity/utils' import { useActivityData } from 'uniswap/src/features/activity/hooks/useActivityData' import { InterfacePageName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' import { TransactionDetails } from 'uniswap/src/features/transactions/types/transactionDetails' +import { useEvent } from 'utilities/src/react/hooks' +import { useInfiniteScroll } from 'utilities/src/react/useInfiniteScroll' import { ONE_DAY_MS } from 'utilities/src/time/time' const DROPDOWN_MIN_WIDTH = { @@ -27,7 +35,7 @@ const DROPDOWN_MIN_WIDTH = { timePeriod: 200, } -const PAGE_SIZE = 50 +const SEARCH_INPUT_WIDTH = 280 function isWithinTimePeriod(txTime: number, period: string): boolean { if (period === 'all') { @@ -57,18 +65,14 @@ function filterTransactions({ }): TransactionDetails[] { const allowedTypes = getTransactionTypesForFilter(typeFilter) - // Filter out loading items and section headers, leaving only TransactionDetails - const transactionItems = transactions.filter( - (item): item is TransactionDetails => !isLoadingItem(item) && !isSectionHeader(item), - ) - - return transactionItems + return filterTransactionDetailsFromActivityItems(transactions) .filter((tx) => allowedTypes === 'all' || allowedTypes.includes(tx.typeInfo.type)) .filter((tx) => isWithinTimePeriod(tx.addedTime, timeFilter)) } export default function PortfolioActivity() { const { t } = useTranslation() + const media = useMedia() const transactionTypeOptions = getTransactionTypeFilterOptions(t) const timePeriodOptions = getTimePeriodFilterOptions(t) const [selectedTransactionType, setSelectedTransactionType] = useState('all') @@ -80,7 +84,7 @@ export default function PortfolioActivity() { const portfolioAddress = usePortfolioAddress() - const activityData = useActivityData({ + const { sectionData, fetchNextPage, hasNextPage, isFetchingNextPage } = useActivityData({ evmOwner: portfolioAddress, ownerAddresses: [portfolioAddress], swapCallbacks: { @@ -91,18 +95,24 @@ export default function PortfolioActivity() { fiatOnRampParams: undefined, }) + const { sentinelRef } = useInfiniteScroll({ + onLoadMore: fetchNextPage, + hasNextPage, + isFetching: isFetchingNextPage, + }) + // Show loading skeleton while data is being fetched (sectionData contains loading items when loading) - const loading = Boolean(activityData.sectionData?.some(isLoadingItem)) + const loading = Boolean(sectionData?.some(isLoadingItem)) // Filter out section headers and loading items to get just transaction data const transactionData: TransactionDetails[] = useMemo( () => filterTransactions({ - transactions: activityData.sectionData || [], + transactions: sectionData || [], typeFilter: selectedTransactionType, timeFilter: selectedTimePeriod, - }).slice(0, PAGE_SIZE), // TODO: add infinite scroll once that stack gets merged - [activityData.sectionData, selectedTransactionType, selectedTimePeriod], + }), + [sectionData, selectedTransactionType, selectedTimePeriod], ) const error = false @@ -127,9 +137,25 @@ export default function PortfolioActivity() { setSelectedTransaction(null) } + const onReportTransaction = useEvent(() => { + popupRegistry.addPopup( + { type: PopupType.Success, message: t('common.reported') }, + 'report-transaction-success', + POPUP_MEDIUM_DISMISS_MS, + ) + }) + + const onUnhideTransaction = useEvent(() => { + popupRegistry.addPopup( + { type: PopupType.Unhide, assetName: t('common.activity') }, + 'unhide-transaction-success', + POPUP_MEDIUM_DISMISS_MS, + ) + }) + return ( - + {/* Filtering Controls */} @@ -163,20 +190,49 @@ export default function PortfolioActivity() { isOpen={timePeriodExpanded} toggleOpen={setTimePeriodExpanded} ButtonIcon={Calendar} + buttonStyle={{ width: 140, $md: { width: '100%' } }} + containerStyle={media.md ? { flexGrow: 1 } : undefined} dropdownStyle={{ minWidth: DROPDOWN_MIN_WIDTH.timePeriod }} /> - + - + + + + {/* Show skeleton loading indicator while fetching next page */} + {isFetchingNextPage && ( + + {[...Array(4)].map((_, index) => ( + + ))} + + )} + + {/* Intersection observer sentinel for infinite scroll */} + + {selectedTransaction && ( )} diff --git a/apps/web/src/components/ActivityTable/ActivityAddressCell.tsx b/apps/web/src/pages/Portfolio/Activity/ActivityTable/ActivityAddressCell.tsx similarity index 85% rename from apps/web/src/components/ActivityTable/ActivityAddressCell.tsx rename to apps/web/src/pages/Portfolio/Activity/ActivityTable/ActivityAddressCell.tsx index b47c5acf5cd..1ec2855bde5 100644 --- a/apps/web/src/components/ActivityTable/ActivityAddressCell.tsx +++ b/apps/web/src/pages/Portfolio/Activity/ActivityTable/ActivityAddressCell.tsx @@ -1,5 +1,5 @@ -import { AddressWithAvatar } from 'components/ActivityTable/AddressWithAvatar' -import { buildActivityRowFragments } from 'components/ActivityTable/registry' +import { AddressWithAvatar } from 'pages/Portfolio/Activity/ActivityTable/AddressWithAvatar' +import { buildActivityRowFragments } from 'pages/Portfolio/Activity/ActivityTable/registry' import { Flex } from 'ui/src' import { ArrowRight } from 'ui/src/components/icons/ArrowRight' import { TransactionDetails } from 'uniswap/src/features/transactions/types/transactionDetails' diff --git a/apps/web/src/components/ActivityTable/ActivityAmountCell.tsx b/apps/web/src/pages/Portfolio/Activity/ActivityTable/ActivityAmountCell.tsx similarity index 95% rename from apps/web/src/components/ActivityTable/ActivityAmountCell.tsx rename to apps/web/src/pages/Portfolio/Activity/ActivityTable/ActivityAmountCell.tsx index b3cddbac36b..7c9d8171c1a 100644 --- a/apps/web/src/components/ActivityTable/ActivityAmountCell.tsx +++ b/apps/web/src/pages/Portfolio/Activity/ActivityTable/ActivityAmountCell.tsx @@ -1,5 +1,5 @@ -import { buildActivityRowFragments } from 'components/ActivityTable/registry' -import { TokenAmountDisplay } from 'components/ActivityTable/TokenAmountDisplay' +import { buildActivityRowFragments } from 'pages/Portfolio/Activity/ActivityTable/registry' +import { TokenAmountDisplay } from 'pages/Portfolio/Activity/ActivityTable/TokenAmountDisplay' import { useTranslation } from 'react-i18next' import { Flex, Text } from 'ui/src' import { ArrowRight } from 'ui/src/components/icons/ArrowRight' @@ -11,7 +11,11 @@ import { useNativeCurrencyInfo, useWrappedNativeCurrencyInfo, } from 'uniswap/src/features/tokens/useCurrencyInfo' -import { TransactionDetails } from 'uniswap/src/features/transactions/types/transactionDetails' +import { + INFINITE_APPROVAL_AMOUNT, + REVOKE_APPROVAL_AMOUNT, + TransactionDetails, +} from 'uniswap/src/features/transactions/types/transactionDetails' import { getSymbolDisplayText } from 'uniswap/src/utils/currency' import { NumberType } from 'utilities/src/format/types' @@ -194,9 +198,9 @@ export function ActivityAmountCell({ transaction }: ActivityAmountCellProps) { if (singleCurrencyInfo && amount.approvalAmount !== undefined) { const amountText = - amount.approvalAmount === 'INF' + amount.approvalAmount === INFINITE_APPROVAL_AMOUNT ? t('transaction.amount.unlimited') - : amount.approvalAmount && amount.approvalAmount !== '0.0' + : amount.approvalAmount && amount.approvalAmount !== REVOKE_APPROVAL_AMOUNT ? formatter.formatNumberOrString({ value: amount.approvalAmount, type: NumberType.TokenNonTx }) : '' diff --git a/apps/web/src/components/ActivityTable/ActivityTable.tsx b/apps/web/src/pages/Portfolio/Activity/ActivityTable/ActivityTable.tsx similarity index 91% rename from apps/web/src/components/ActivityTable/ActivityTable.tsx rename to apps/web/src/pages/Portfolio/Activity/ActivityTable/ActivityTable.tsx index 97b62e13d1d..332cd9ea97b 100644 --- a/apps/web/src/components/ActivityTable/ActivityTable.tsx +++ b/apps/web/src/pages/Portfolio/Activity/ActivityTable/ActivityTable.tsx @@ -1,11 +1,11 @@ import { createColumnHelper, Row } from '@tanstack/react-table' -import { ActivityAddressCell } from 'components/ActivityTable/ActivityAddressCell' -import { ActivityAmountCell } from 'components/ActivityTable/ActivityAmountCell' -import { TimeCell } from 'components/ActivityTable/TimeCell' -import { TransactionTypeCell } from 'components/ActivityTable/TransactionTypeCell' import { Table } from 'components/Table' import { Cell } from 'components/Table/Cell' import { HeaderCell } from 'components/Table/styled' +import { ActivityAddressCell } from 'pages/Portfolio/Activity/ActivityTable/ActivityAddressCell' +import { ActivityAmountCell } from 'pages/Portfolio/Activity/ActivityTable/ActivityAmountCell' +import { TimeCell } from 'pages/Portfolio/Activity/ActivityTable/TimeCell' +import { TransactionTypeCell } from 'pages/Portfolio/Activity/ActivityTable/TransactionTypeCell' import { memo, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { Text } from 'ui/src' diff --git a/apps/web/src/components/ActivityTable/AddressWithAvatar.tsx b/apps/web/src/pages/Portfolio/Activity/ActivityTable/AddressWithAvatar.tsx similarity index 100% rename from apps/web/src/components/ActivityTable/AddressWithAvatar.tsx rename to apps/web/src/pages/Portfolio/Activity/ActivityTable/AddressWithAvatar.tsx diff --git a/apps/web/src/components/ActivityTable/TimeCell.tsx b/apps/web/src/pages/Portfolio/Activity/ActivityTable/TimeCell.tsx similarity index 100% rename from apps/web/src/components/ActivityTable/TimeCell.tsx rename to apps/web/src/pages/Portfolio/Activity/ActivityTable/TimeCell.tsx diff --git a/apps/web/src/components/ActivityTable/TokenAmountDisplay.tsx b/apps/web/src/pages/Portfolio/Activity/ActivityTable/TokenAmountDisplay.tsx similarity index 100% rename from apps/web/src/components/ActivityTable/TokenAmountDisplay.tsx rename to apps/web/src/pages/Portfolio/Activity/ActivityTable/TokenAmountDisplay.tsx diff --git a/apps/web/src/components/ActivityTable/TransactionTypeCell.tsx b/apps/web/src/pages/Portfolio/Activity/ActivityTable/TransactionTypeCell.tsx similarity index 93% rename from apps/web/src/components/ActivityTable/TransactionTypeCell.tsx rename to apps/web/src/pages/Portfolio/Activity/ActivityTable/TransactionTypeCell.tsx index 5c3f52d05e7..01383373c65 100644 --- a/apps/web/src/components/ActivityTable/TransactionTypeCell.tsx +++ b/apps/web/src/pages/Portfolio/Activity/ActivityTable/TransactionTypeCell.tsx @@ -1,5 +1,5 @@ -import { buildActivityRowFragments } from 'components/ActivityTable/registry' import { TableText } from 'components/Table/styled' +import { buildActivityRowFragments } from 'pages/Portfolio/Activity/ActivityTable/registry' import { getTransactionTypeFilterOptions } from 'pages/Portfolio/Activity/Filters/utils' import { useTranslation } from 'react-i18next' import { Flex } from 'ui/src' diff --git a/apps/web/src/components/ActivityTable/activityTableModels.ts b/apps/web/src/pages/Portfolio/Activity/ActivityTable/activityTableModels.ts similarity index 93% rename from apps/web/src/components/ActivityTable/activityTableModels.ts rename to apps/web/src/pages/Portfolio/Activity/ActivityTable/activityTableModels.ts index f1fc9d10af1..cc2e57fa02d 100644 --- a/apps/web/src/components/ActivityTable/activityTableModels.ts +++ b/apps/web/src/pages/Portfolio/Activity/ActivityTable/activityTableModels.ts @@ -4,6 +4,8 @@ * Each adapter returns raw IDs, amounts, addresses, and translation keys. */ +import { ActivityFilterType } from 'pages/Portfolio/Activity/Filters/utils' + /** * Represents the amount/token data for different transaction types */ @@ -43,7 +45,7 @@ type ActivityAmountModel = */ interface ActivityTypeLabel { /** Base group for filtering and icon mapping */ - baseGroup: 'swaps' | 'sent' | 'received' | 'deposits' | null + baseGroup: ActivityFilterType | null /** Optional override translation key for custom labels (e.g., "Wrapped"/"Unwrapped") */ overrideLabelKey?: string } diff --git a/apps/web/src/components/ActivityTable/registry.ts b/apps/web/src/pages/Portfolio/Activity/ActivityTable/registry.ts similarity index 89% rename from apps/web/src/components/ActivityTable/registry.ts rename to apps/web/src/pages/Portfolio/Activity/ActivityTable/registry.ts index 889b6d0451a..538a399791b 100644 --- a/apps/web/src/components/ActivityTable/registry.ts +++ b/apps/web/src/pages/Portfolio/Activity/ActivityTable/registry.ts @@ -1,5 +1,6 @@ import { UNI_ADDRESSES } from '@uniswap/sdk-core' -import { ActivityRowFragments } from 'components/ActivityTable/activityTableModels' +import { ActivityRowFragments } from 'pages/Portfolio/Activity/ActivityTable/activityTableModels' +import { ActivityFilterType } from 'pages/Portfolio/Activity/Filters/utils' import { AssetType } from 'uniswap/src/entities/assets' import { TransactionDetails, TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails' import { getValidAddress } from 'uniswap/src/utils/addresses' @@ -27,7 +28,7 @@ export function buildActivityRowFragments(details: TransactionDetails): Activity }, counterparty: null, typeLabel: { - baseGroup: 'swaps', + baseGroup: ActivityFilterType.Swaps, overrideLabelKey: 'transaction.status.swap.success', }, } @@ -43,7 +44,8 @@ export function buildActivityRowFragments(details: TransactionDetails): Activity }, counterparty: null, typeLabel: { - baseGroup: 'swaps', + baseGroup: ActivityFilterType.Swaps, + overrideLabelKey: 'transaction.status.swap.success', }, } @@ -59,7 +61,7 @@ export function buildActivityRowFragments(details: TransactionDetails): Activity }, counterparty: typeInfo.recipient ? getValidAddress({ address: typeInfo.recipient, chainId }) : null, typeLabel: { - baseGroup: 'sent', + baseGroup: ActivityFilterType.Sends, }, } } @@ -76,7 +78,7 @@ export function buildActivityRowFragments(details: TransactionDetails): Activity }, counterparty: typeInfo.sender ? getValidAddress({ address: typeInfo.sender, chainId }) : null, typeLabel: { - baseGroup: 'received', + baseGroup: ActivityFilterType.Receives, }, } } @@ -92,7 +94,7 @@ export function buildActivityRowFragments(details: TransactionDetails): Activity }, counterparty: typeInfo.spender ? getValidAddress({ address: typeInfo.spender, chainId }) : null, typeLabel: { - baseGroup: null, + baseGroup: ActivityFilterType.Approvals, overrideLabelKey: 'common.approved', }, } @@ -107,7 +109,7 @@ export function buildActivityRowFragments(details: TransactionDetails): Activity }, counterparty: null, typeLabel: { - baseGroup: 'swaps', + baseGroup: ActivityFilterType.Wraps, overrideLabelKey: typeInfo.unwrapped ? 'common.unwrapped' : 'common.wrapped', }, } @@ -126,7 +128,7 @@ export function buildActivityRowFragments(details: TransactionDetails): Activity ? getValidAddress({ address: typeInfo.dappInfo.address, chainId }) : null, typeLabel: { - baseGroup: null, + baseGroup: ActivityFilterType.CreatePool, overrideLabelKey: 'pool.create', }, } @@ -144,7 +146,7 @@ export function buildActivityRowFragments(details: TransactionDetails): Activity ? getValidAddress({ address: typeInfo.dappInfo.address, chainId }) : null, typeLabel: { - baseGroup: 'deposits', + baseGroup: ActivityFilterType.AddLiquidity, overrideLabelKey: 'common.addLiquidity', }, } @@ -162,7 +164,7 @@ export function buildActivityRowFragments(details: TransactionDetails): Activity ? getValidAddress({ address: typeInfo.dappInfo.address, chainId }) : null, typeLabel: { - baseGroup: null, + baseGroup: ActivityFilterType.RemoveLiquidity, overrideLabelKey: 'pool.removeLiquidity', }, } @@ -179,7 +181,7 @@ export function buildActivityRowFragments(details: TransactionDetails): Activity ? getValidAddress({ address: typeInfo.dappInfo.address, chainId }) : null, typeLabel: { - baseGroup: null, + baseGroup: ActivityFilterType.Mints, overrideLabelKey: 'transaction.status.mint.success', }, } @@ -202,7 +204,7 @@ export function buildActivityRowFragments(details: TransactionDetails): Activity }, counterparty: null, typeLabel: { - baseGroup: null, + baseGroup: ActivityFilterType.ClaimFees, overrideLabelKey: 'transaction.status.collected.fees', }, } @@ -217,7 +219,7 @@ export function buildActivityRowFragments(details: TransactionDetails): Activity }, counterparty: null, typeLabel: { - baseGroup: null, + baseGroup: ActivityFilterType.ClaimFees, overrideLabelKey: 'transaction.status.collected.fees', }, } @@ -234,7 +236,7 @@ export function buildActivityRowFragments(details: TransactionDetails): Activity }, counterparty: getValidAddress({ address: typeInfo.recipient, chainId }), typeLabel: { - baseGroup: null, + baseGroup: ActivityFilterType.ClaimFees, overrideLabelKey: 'common.claimed', }, } diff --git a/apps/web/src/pages/Portfolio/Activity/Filters/utils.ts b/apps/web/src/pages/Portfolio/Activity/Filters/utils.ts index 67df4ab0c17..53976427db1 100644 --- a/apps/web/src/pages/Portfolio/Activity/Filters/utils.ts +++ b/apps/web/src/pages/Portfolio/Activity/Filters/utils.ts @@ -1,24 +1,26 @@ import { SelectOption } from 'components/Dropdowns/DropdownSelector' -import { Approve } from 'ui/src/components/icons/Approve' -import { ArrowChange } from 'ui/src/components/icons/ArrowChange' -import { ArrowDownCircle } from 'ui/src/components/icons/ArrowDownCircle' -import { ArrowUpCircle } from 'ui/src/components/icons/ArrowUpCircle' -import { Dollar } from 'ui/src/components/icons/Dollar' +import { Box } from 'ui/src/components/icons/Box' +import { Coin } from 'ui/src/components/icons/Coin' +import { CoinConvert } from 'ui/src/components/icons/CoinConvert' +import { Lock } from 'ui/src/components/icons/Lock' +import { Minus } from 'ui/src/components/icons/Minus' +import { MoneyHand } from 'ui/src/components/icons/MoneyHand' import { Plus } from 'ui/src/components/icons/Plus' +import { Pools } from 'ui/src/components/icons/Pools' import { ReceiveAlt } from 'ui/src/components/icons/ReceiveAlt' import { SendAction } from 'ui/src/components/icons/SendAction' -import { Sparkle } from 'ui/src/components/icons/Sparkle' -import { Swap } from 'ui/src/components/icons/Swap' import { AppTFunction } from 'ui/src/i18n/types' -import { TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails' +import { ActivityItem } from 'uniswap/src/components/activity/generateActivityItemRenderer' +import { isLoadingItem, isSectionHeader } from 'uniswap/src/components/activity/utils' +import { TransactionDetails, TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails' -enum ActivityFilterType { +export enum ActivityFilterType { All = 'all', Sends = 'sends', Receives = 'receives', Swaps = 'swaps', Wraps = 'wraps', - Approves = 'approves', + Approvals = 'approvals', CreatePool = 'create-pool', AddLiquidity = 'add-liquidity', RemoveLiquidity = 'remove-liquidity', @@ -26,6 +28,29 @@ enum ActivityFilterType { ClaimFees = 'claim-fees', } +/** + * Type guard to check if an ActivityItem is a TransactionDetails + * @param item ActivityItem to check + * @returns true if the item is a TransactionDetails + */ +function isTransactionDetails(item: ActivityItem): item is TransactionDetails { + // Validate that the item has required TransactionDetails properties + return ( + 'typeInfo' in item && 'addedTime' in item && typeof item.typeInfo === 'object' && typeof item.addedTime === 'number' + ) +} + +/** + * Filters out loading items and section headers, leaving only TransactionDetails + * @param transactions ActivityItems to filter + * @returns only TransactionDetails items + */ +export function filterTransactionDetailsFromActivityItems(transactions: ActivityItem[]): TransactionDetails[] { + return transactions.filter( + (item): item is TransactionDetails => !isLoadingItem(item) && !isSectionHeader(item) && isTransactionDetails(item), + ) +} + export function getTransactionTypeFilterOptions(t: AppTFunction): Record { return { [ActivityFilterType.All]: { @@ -34,43 +59,43 @@ export function getTransactionTypeFilterOptions(t: AppTFunction): Record { navigate(buildPortfolioUrl(tab, chainId)) @@ -29,7 +29,6 @@ export default function PortfolioHeader() { backgroundColor="$surface1" paddingTop="$spacing40" zIndex="$header" - paddingBottom="$spacing16" $platform-web={{ position: 'sticky', top: INTERFACE_NAV_HEIGHT, diff --git a/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/ConnectedAddressDisplay.tsx b/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/ConnectedAddressDisplay.tsx index 7d3326517dc..292451beebd 100644 --- a/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/ConnectedAddressDisplay.tsx +++ b/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/ConnectedAddressDisplay.tsx @@ -4,7 +4,7 @@ import { useScroll } from 'hooks/useScroll' import { useEffect, useState } from 'react' import { AddressDisplay } from 'uniswap/src/components/accounts/AddressDisplay' -export default function ConnectedAddressDisplay() { +export function ConnectedAddressDisplay() { const { height: scrollHeight } = useScroll() const [isCompact, setIsCompact] = useState(false) // Use connected address rather than usePortfolioAddress because this is only for the connected view @@ -34,6 +34,7 @@ export default function ConnectedAddressDisplay() { hideAddressInSubtitle={isCompact} addressNumVisibleCharacters={4} accountIconTransition="all 0.3s ease" + animateAddressSubtitleHeight /> ) } diff --git a/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/DemoAddressDisplay.tsx b/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/DemoAddressDisplay.tsx index 4d6166b96cf..a9f2f5ab9c7 100644 --- a/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/DemoAddressDisplay.tsx +++ b/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/DemoAddressDisplay.tsx @@ -4,7 +4,7 @@ import { Flex, Text, Tooltip, useSporeColors } from 'ui/src' import { Eye } from 'ui/src/components/icons/Eye' import { iconSizes } from 'ui/src/theme' -export default function DemoAddressDisplay() { +export function DemoAddressDisplay() { const colors = useSporeColors() const { t } = useTranslation() diff --git a/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/PortfolioAddressDisplay.tsx b/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/PortfolioAddressDisplay.tsx index c2f6a8b9fbf..d17e4dc77e2 100644 --- a/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/PortfolioAddressDisplay.tsx +++ b/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/PortfolioAddressDisplay.tsx @@ -1,8 +1,8 @@ import useIsConnected from 'pages/Portfolio/Header/hooks/useIsConnected' -import ConnectedAddressDisplay from 'pages/Portfolio/Header/PortfolioAddressDisplay/ConnectedAddressDisplay' -import DemoAddressDisplay from 'pages/Portfolio/Header/PortfolioAddressDisplay/DemoAddressDisplay' +import { ConnectedAddressDisplay } from 'pages/Portfolio/Header/PortfolioAddressDisplay/ConnectedAddressDisplay' +import { DemoAddressDisplay } from 'pages/Portfolio/Header/PortfolioAddressDisplay/DemoAddressDisplay' -export default function PortfolioAddressDisplay(): JSX.Element { +export function PortfolioAddressDisplay(): JSX.Element { const isConnected = useIsConnected() return isConnected ? : diff --git a/apps/web/src/pages/Portfolio/Header/Tabs.tsx b/apps/web/src/pages/Portfolio/Header/Tabs.tsx index fcd8f6c2b4a..b1c90938bf9 100644 --- a/apps/web/src/pages/Portfolio/Header/Tabs.tsx +++ b/apps/web/src/pages/Portfolio/Header/Tabs.tsx @@ -1,13 +1,12 @@ -import { usePortfolioParams } from 'pages/Portfolio/Header/hooks/usePortfolioParams' +import { usePortfolioRoutes } from 'pages/Portfolio/Header/hooks/usePortfolioRoutes' import { PortfolioTabInfo, usePortfolioTabs } from 'pages/Portfolio/Header/hooks/usePortfolioTabs' -import { useLocation, useNavigate } from 'react-router' -import { Flex, Separator, Text, TouchableArea } from 'ui/src' +import { Link, useLocation } from 'react-router' +import { Flex, Separator, Text } from 'ui/src' import { getCurrentPageFromLocation } from 'utils/urlRoutes' export function PortfolioTabs() { const { pathname } = useLocation() - const navigate = useNavigate() - const { chainName } = usePortfolioParams() + const { chainName } = usePortfolioRoutes() const portfolioTabs = usePortfolioTabs() return ( @@ -19,11 +18,10 @@ export function PortfolioTabs() { const isActive = currentPage === tab.pageName return ( - navigate(tabPath)} - role="link" - tag="a" + style={{ textDecoration: 'none', paddingBottom: 12 }} aria-label={`Navigate to ${tab.label}`} > {tab.label} - + ) })} diff --git a/apps/web/src/pages/Portfolio/Header/hooks/usePortfolioParams.ts b/apps/web/src/pages/Portfolio/Header/hooks/usePortfolioRoutes.ts similarity index 63% rename from apps/web/src/pages/Portfolio/Header/hooks/usePortfolioParams.ts rename to apps/web/src/pages/Portfolio/Header/hooks/usePortfolioRoutes.ts index ba1523d3ba2..44752ba83da 100644 --- a/apps/web/src/pages/Portfolio/Header/hooks/usePortfolioParams.ts +++ b/apps/web/src/pages/Portfolio/Header/hooks/usePortfolioRoutes.ts @@ -1,5 +1,7 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { PortfolioTab } from 'pages/Portfolio/types' -import { useLocation, useSearchParams } from 'react-router' +import { useEffect } from 'react' +import { useLocation, useNavigate, useSearchParams } from 'react-router' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { getChainIdFromChainUrlParam, isChainUrlParam } from 'utils/chainParams' @@ -11,17 +13,26 @@ const PATHNAME_TO_TAB: Partial> = { '/portfolio/activity': PortfolioTab.Activity, } -export function usePortfolioParams(): { +export function usePortfolioRoutes(): { tab?: PortfolioTab chainName?: string chainId?: UniverseChainId } { const { pathname } = useLocation() const [searchParams] = useSearchParams() + const navigate = useNavigate() + const isPortfolioDefiTabEnabled = useFeatureFlag(FeatureFlags.PortfolioDefiTab) // Get tab from pathname mapping const tab = PATHNAME_TO_TAB[pathname] ?? PortfolioTab.Overview + // Redirect to overview if trying to access DeFi tab when feature flag is disabled + useEffect(() => { + if (tab === PortfolioTab.Defi && !isPortfolioDefiTabEnabled) { + navigate('/portfolio', { replace: true }) + } + }, [tab, isPortfolioDefiTabEnabled, navigate]) + // Get chainName from query parameters const chainNameParam = searchParams.get('chain') const chainName = chainNameParam && isChainUrlParam(chainNameParam) ? chainNameParam : undefined diff --git a/apps/web/src/pages/Portfolio/Header/hooks/usePortfolioTabs.ts b/apps/web/src/pages/Portfolio/Header/hooks/usePortfolioTabs.ts index 082d23c8385..decd8c997f7 100644 --- a/apps/web/src/pages/Portfolio/Header/hooks/usePortfolioTabs.ts +++ b/apps/web/src/pages/Portfolio/Header/hooks/usePortfolioTabs.ts @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useTranslation } from 'react-i18next' import { InterfacePageName } from 'uniswap/src/features/telemetry/constants' @@ -9,11 +10,14 @@ export type PortfolioTabInfo = { export function usePortfolioTabs(): PortfolioTabInfo[] { const { t } = useTranslation() + const isPortfolioDefiTabEnabled = useFeatureFlag(FeatureFlags.PortfolioDefiTab) return [ { path: '/portfolio', pageName: InterfacePageName.PortfolioPage, label: t('portfolio.overview.title') }, { path: '/portfolio/tokens', pageName: InterfacePageName.PortfolioTokensPage, label: t('portfolio.tokens.title') }, - { path: '/portfolio/defi', pageName: InterfacePageName.PortfolioDefiPage, label: t('portfolio.defi.title') }, + ...(isPortfolioDefiTabEnabled + ? [{ path: '/portfolio/defi', pageName: InterfacePageName.PortfolioDefiPage, label: t('portfolio.defi.title') }] + : []), { path: '/portfolio/nfts', pageName: InterfacePageName.PortfolioNftsPage, label: t('portfolio.nfts.title') }, { path: '/portfolio/activity', diff --git a/apps/web/src/pages/Portfolio/NFTs/NFTCard.tsx b/apps/web/src/pages/Portfolio/NFTs/NFTCard.tsx index 878c0a3cab8..c2d9e1eb437 100644 --- a/apps/web/src/pages/Portfolio/NFTs/NFTCard.tsx +++ b/apps/web/src/pages/Portfolio/NFTs/NFTCard.tsx @@ -1,17 +1,22 @@ import { SharedEventName } from '@uniswap/analytics-events' -import { useCallback, useMemo, useState } from 'react' +import { usePortfolioAddress } from 'pages/Portfolio/hooks/usePortfolioAddress' +import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' -import { AnimateTransition, Flex, Text, TouchableArea, useSporeColors } from 'ui/src' +import { AnimateTransition, animationPresets, Flex, Popover, Text, TouchableArea, useSporeColors } from 'ui/src' import { ArrowUpRight } from 'ui/src/components/icons/ArrowUpRight' import { MoreHorizontal } from 'ui/src/components/icons/MoreHorizontal' import { zIndexes } from 'ui/src/theme' import { iconSizes } from 'ui/src/theme/iconSizes' import { NetworkLogo } from 'uniswap/src/components/CurrencyLogo/NetworkLogo' +import { MenuContent } from 'uniswap/src/components/menus/ContextMenuContent' import { NftView, NftViewProps } from 'uniswap/src/components/nfts/NftView' +import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { fromGraphQLChain } from 'uniswap/src/features/chains/utils' +import { useNFTContextMenuItems } from 'uniswap/src/features/nfts/hooks/useNftContextMenuItems' import { ElementName, SectionName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' -import { getOpenseaLink, openUri } from 'uniswap/src/utils/linking' +import { getNftExplorerLink, getOpenseaLink, openUri } from 'uniswap/src/utils/linking' +import { useBooleanState } from 'utilities/src/react/useBooleanState' const FLOAT_UP_ON_HOVER_OFFSET = -4 @@ -39,77 +44,138 @@ type NftCardProps = Omit & { } export function NFTCard(props: NftCardProps): JSX.Element { - const [isHovered, setIsHovered] = useState(false) + const { value: isHovered, setTrue: setIsHovered, setFalse: setIsHoveredFalse } = useBooleanState(false) + const { value: isPopoverOpen, toggle: togglePopover, setFalse: closePopover } = useBooleanState(false) const colors = useSporeColors() const { t } = useTranslation() + const portfolioAddress = usePortfolioAddress() + const { defaultChainId } = useEnabledChains() + + // Combine hover state and popover open state to keep hovered styles when popover is open + const isActive = isHovered || isPopoverOpen + + // Active card styles for when hovering or popover is open + const activeCardStyles = useMemo( + () => ({ + y: FLOAT_UP_ON_HOVER_OFFSET, + rotate: `${generateRotationStyle(props.id)}deg`, + shadowColor: '$shadowColor', + boxShadow: `0px 4px 12px -3px ${colors.shadowColor.val}, 0px 2px 5px -2px ${colors.shadowColor.val}`, + }), + [props.id, colors.shadowColor.val], + ) + + // Generate chainId for the NFT + const chainId = useMemo(() => { + if (props.item.chain) { + return fromGraphQLChain(props.item.chain) ?? undefined + } + return undefined + }, [props.item.chain]) // Generate OpenSea URL for the NFT const openseaUrl = useMemo(() => { - if (props.item.chain && props.item.contractAddress && props.item.tokenId) { - const chainId = fromGraphQLChain(props.item.chain) - if (chainId) { - return getOpenseaLink({ - chainId, - contractAddress: props.item.contractAddress, - tokenId: props.item.tokenId, - }) - } + if (chainId && props.item.contractAddress && props.item.tokenId) { + return getOpenseaLink({ + chainId, + contractAddress: props.item.contractAddress, + tokenId: props.item.tokenId, + }) } return null - }, [props.item.chain, props.item.contractAddress, props.item.tokenId]) + }, [chainId, props.item.contractAddress, props.item.tokenId]) - const handlePress = useCallback(async () => { - if (openseaUrl) { - await openUri({ uri: openseaUrl }) + // Generate explorer URL for the NFT (fallback when no OpenSea) + const explorerUrl = useMemo(() => { + if (!openseaUrl && chainId && props.item.contractAddress && props.item.tokenId) { + return getNftExplorerLink({ + chainId, + fallbackChainId: defaultChainId, + contractAddress: props.item.contractAddress, + tokenId: props.item.tokenId, + }) } - sendAnalyticsEvent(SharedEventName.ELEMENT_CLICKED, { - element: ElementName.PortfolioNftItem, - section: SectionName.PortfolioNftsTab, - collection_name: props.item.collectionName, - collection_address: props.item.contractAddress, - token_id: props.item.tokenId, - }) - props.onPress?.() - }, [openseaUrl, props.item.collectionName, props.item.contractAddress, props.item.tokenId, props.onPress]) + return null + }, [openseaUrl, chainId, props.item.contractAddress, props.item.tokenId, defaultChainId]) + + // Generate context menu items + const menuItems = useNFTContextMenuItems({ + contractAddress: props.item.contractAddress, + tokenId: props.item.tokenId, + owner: props.owner, + walletAddresses: [portfolioAddress], + isSpam: props.item.isSpam, + showNotification: false, + chainId, + }) + + const handlePress = useCallback( + async (event?: any) => { + // Prefer OpenSea URL, fall back to block explorer if no OpenSea URL available + const url = openseaUrl || explorerUrl + if (url) { + await openUri({ uri: url }) + } + sendAnalyticsEvent(SharedEventName.ELEMENT_CLICKED, { + element: ElementName.PortfolioNftItem, + section: SectionName.PortfolioNftsTab, + collection_name: props.item.collectionName, + collection_address: props.item.contractAddress, + token_id: props.item.tokenId, + }) + props.onPress?.() + }, + [openseaUrl, explorerUrl, props.item.collectionName, props.item.contractAddress, props.item.tokenId, props.onPress], + ) return ( setIsHovered(true)} - onMouseLeave={() => setIsHovered(false)} + {...(isActive ? activeCardStyles : {})} + onMouseEnter={setIsHovered} + onMouseLeave={setIsHoveredFalse} onPress={handlePress} > {/* Context menu trigger icon */} - {/* TODO: open NFT context menu on click */} - event.stopPropagation()} - > - - + e.stopPropagation()}> + + + + + + + + + + + {/* Let the parent card handle the onPress */} {}} /> @@ -120,8 +186,8 @@ export function NFTCard(props: NftCardProps): JSX.Element { @@ -132,7 +198,7 @@ export function NFTCard(props: NftCardProps): JSX.Element { - {t('common.opensea.link')} + {openseaUrl ? t('common.opensea.link') : t('common.viewOnExplorer')} diff --git a/apps/web/src/pages/Portfolio/NFTs/NFTCardSkeleton.tsx b/apps/web/src/pages/Portfolio/NFTs/NFTCardSkeleton.tsx new file mode 100644 index 00000000000..1459cff602e --- /dev/null +++ b/apps/web/src/pages/Portfolio/NFTs/NFTCardSkeleton.tsx @@ -0,0 +1,22 @@ +import { Flex, Skeleton } from 'ui/src' + +// Custom skeleton loader that matches Portfolio NFTCard dimensions +export function NFTCardSkeleton(): JSX.Element { + return ( + + + + + + + + + + + + + + + + ) +} diff --git a/apps/web/src/pages/Portfolio/NFTs/Nfts.tsx b/apps/web/src/pages/Portfolio/NFTs/Nfts.tsx index d876b5a78f2..1522fb9a988 100644 --- a/apps/web/src/pages/Portfolio/NFTs/Nfts.tsx +++ b/apps/web/src/pages/Portfolio/NFTs/Nfts.tsx @@ -1,6 +1,7 @@ import { SearchInput } from 'pages/Portfolio/components/SearchInput' import { usePortfolioAddress } from 'pages/Portfolio/hooks/usePortfolioAddress' import { NFTCard } from 'pages/Portfolio/NFTs/NFTCard' +import { NFTCardSkeleton } from 'pages/Portfolio/NFTs/NFTCardSkeleton' import { filterNft } from 'pages/Portfolio/NFTs/utils/filterNfts' import { useCallback, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -14,7 +15,7 @@ import { assume0xAddress } from 'utils/wagmi' const LOADING_SKELETON_COUNT = 10 -export default function PortfolioNfts(): JSX.Element { +export function PortfolioNfts(): JSX.Element { const { t } = useTranslation() const owner = usePortfolioAddress() const nftsContainerRef = useRef(null) @@ -46,9 +47,21 @@ export default function PortfolioNfts(): JSX.Element { [lowercaseSearch, owner], ) + // Custom loading state with Portfolio-specific skeleton + const customLoadingState = useMemo( + () => ( + <> + {Array.from({ length: LOADING_SKELETON_COUNT }, (_, i) => ( + + ))} + + ), + [], + ) + return ( - + {numShown ? `${numShown}` : ''} {t('portfolio.nfts.title')} @@ -56,7 +69,7 @@ export default function PortfolioNfts(): JSX.Element { @@ -67,6 +80,7 @@ export default function PortfolioNfts(): JSX.Element { renderNFTItem={renderNFTItem} autoColumns loadingSkeletonCount={LOADING_SKELETON_COUNT} + customLoadingState={customLoadingState} /> diff --git a/apps/web/src/pages/Portfolio/Overview.tsx b/apps/web/src/pages/Portfolio/Overview.tsx deleted file mode 100644 index 5b7ecdafff3..00000000000 --- a/apps/web/src/pages/Portfolio/Overview.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import { createColumnHelper } from '@tanstack/react-table' -import { Table } from 'components/Table' -import { Cell } from 'components/Table/Cell' -import { HeaderCell, TableText } from 'components/Table/styled' -import { useTranslation } from 'react-i18next' -import { Flex, Text } from 'ui/src' -import { InterfacePageName } from 'uniswap/src/features/telemetry/constants' -import { Trace } from 'uniswap/src/features/telemetry/Trace' - -// Sample data type -interface SampleData { - id: string - name: string - value: string - status: string -} - -// Sample data -const sampleData: SampleData[] = [ - { id: '1', name: 'Ethereum', value: '$2,450.00', status: 'Active' }, - { id: '2', name: 'USDC', value: '$1,200.00', status: 'Active' }, - { id: '3', name: 'UNI', value: '$850.00', status: 'Active' }, - { id: '4', name: 'WETH', value: '$3,100.00', status: 'Active' }, -] - -export default function PortfolioOverview() { - const { t } = useTranslation() - - // Create table columns - const columnHelper = createColumnHelper() - const columns = [ - columnHelper.accessor('name', { - header: () => ( - - - Asset - - - ), - cell: (info) => ( - - {info.getValue()} - - ), - }), - columnHelper.accessor('value', { - header: () => ( - - - Value - - - ), - cell: (info) => ( - - {info.getValue()} - - ), - }), - columnHelper.accessor('status', { - header: () => ( - - - Status - - - ), - cell: (info) => ( - - {info.getValue()} - - ), - }), - ] - - return ( - - - {t('portfolio.overview.title')} - - {/* Basic Table */} - - Portfolio Assets -
- - - - ) -} diff --git a/apps/web/src/pages/Portfolio/Overview/ActionTiles.tsx b/apps/web/src/pages/Portfolio/Overview/ActionTiles.tsx new file mode 100644 index 00000000000..09f3f275a8a --- /dev/null +++ b/apps/web/src/pages/Portfolio/Overview/ActionTiles.tsx @@ -0,0 +1,60 @@ +import { BuyActionTile } from 'components/ActionTiles/BuyActionTile' +import { MoreActionTile } from 'components/ActionTiles/MoreActionTile' +import { SendActionTile } from 'components/ActionTiles/SendActionTile/SendActionTile' +import { SwapActionTile } from 'components/ActionTiles/SwapActionTile' +import { Flex, styled, useMedia } from 'ui/src' + +const ACTION_TILE_SECTION_WIDTH = 360 +const ACTION_TILE_GAP = 12 +const ACTION_TILE_WIDTH = `calc(50% - ${ACTION_TILE_GAP / 2}px)` + +const ActionTilesContainer = styled(Flex, { + flexDirection: 'row', + gap: '$spacing12', + flexWrap: 'wrap', + width: ACTION_TILE_SECTION_WIDTH, + $md: { width: '100%' }, + variants: { + singleRow: { + true: { + width: '100%', + flexWrap: 'nowrap', + }, + }, + } as const, +}) + +const ActionTileWrapper = styled(Flex, { + width: ACTION_TILE_WIDTH, + variants: { + singleRow: { + true: { + width: 'auto', + flexGrow: 1, + flexBasis: 0, + }, + }, + } as const, +}) + +export function OverviewActionTiles() { + const media = useMedia() + const isSingleRow = !!media.xl && !media.md + + return ( + + + + + + + + + + + + + + + ) +} diff --git a/apps/web/src/pages/Portfolio/Overview/Overview.tsx b/apps/web/src/pages/Portfolio/Overview/Overview.tsx new file mode 100644 index 00000000000..52aa51680e7 --- /dev/null +++ b/apps/web/src/pages/Portfolio/Overview/Overview.tsx @@ -0,0 +1,45 @@ +import { OverviewActionTiles } from 'pages/Portfolio/Overview/ActionTiles' +import { OverviewStatsTiles } from 'pages/Portfolio/Overview/StatsTiles' +import { Flex, Separator, styled, Text, useMedia } from 'ui/src' +import { InterfacePageName } from 'uniswap/src/features/telemetry/constants' +import { Trace } from 'uniswap/src/features/telemetry/Trace' + +const ACTION_TILE_SECTION_WIDTH = 360 + +const ActionsAndStatsContainer = styled(Flex, { + width: ACTION_TILE_SECTION_WIDTH, + gap: '$spacing16', + variants: { + fullWidth: { + true: { + width: '100%', + }, + false: { + width: ACTION_TILE_SECTION_WIDTH, + }, + }, + } as const, +}) + +export function PortfolioOverview() { + const media = useMedia() + const isFullWidth = media.xl + + return ( + + + + + Chart + + + + + + + + + + + ) +} diff --git a/apps/web/src/pages/Portfolio/Overview/StatsTiles.tsx b/apps/web/src/pages/Portfolio/Overview/StatsTiles.tsx new file mode 100644 index 00000000000..7e836f8edde --- /dev/null +++ b/apps/web/src/pages/Portfolio/Overview/StatsTiles.tsx @@ -0,0 +1,97 @@ +import { ValueWithFadedDecimals } from 'pages/Portfolio/components/ValueWithFadedDecimals/ValueWithFadedDecimals' +import { useSwapsThisWeek } from 'pages/Portfolio/Overview/hooks/useSwapsThisWeek' +import { useTranslation } from 'react-i18next' +import { EM_DASH, Flex, styled, Text, useMedia } from 'ui/src' +import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' +import { NumberType } from 'utilities/src/format/types' + +const BORDER_COLOR = '$surface3' +const BORDER_WIDTH = 1 + +const StatsContainer = styled(Flex, { + borderWidth: BORDER_WIDTH, + borderColor: BORDER_COLOR, + borderRadius: '$rounded16', + overflow: 'hidden', + variants: { + singleRow: { + true: { + flexDirection: 'row', + }, + }, + } as const, +}) + +const StatsGroup1 = styled(Flex, { + flexDirection: 'row', + borderColor: BORDER_COLOR, + borderBottomWidth: 1, + variants: { + singleRow: { + true: { + borderBottomWidth: 0, + borderRightWidth: 1, + width: '50%', + }, + }, + } as const, +}) + +const StatsGroup2 = styled(Flex, { + flexDirection: 'row', + variants: { + singleRow: { + true: { + width: '50%', + }, + }, + } as const, +}) + +export function OverviewStatsTiles() { + const { t } = useTranslation() + const media = useMedia() + const isSingleRow = !!media.xl && !media.md + const { count: swapCount, totalVolumeUSD, isLoading } = useSwapsThisWeek() + const { convertFiatAmountFormatted } = useLocalizationContext() + + const hasVolumeData = totalVolumeUSD > 0 + + return ( + + + + + {t('portfolio.overview.stats.swapsThisWeek')} + + + {swapCount} + + + + + {t('portfolio.overview.stats.swappedThisWeek')} + + + + + + + + {t('portfolio.overview.stats.averageSwapSize')} + + + + + + {t('portfolio.overview.stats.totalSwapVolume')} + + + + + + ) +} diff --git a/apps/web/src/pages/Portfolio/Overview/hooks/useSwapsThisWeek.ts b/apps/web/src/pages/Portfolio/Overview/hooks/useSwapsThisWeek.ts new file mode 100644 index 00000000000..a0a4276069f --- /dev/null +++ b/apps/web/src/pages/Portfolio/Overview/hooks/useSwapsThisWeek.ts @@ -0,0 +1,51 @@ +import { + ActivityFilterType, + filterTransactionDetailsFromActivityItems, + getTransactionTypesForFilter, +} from 'pages/Portfolio/Activity/Filters/utils' +import { usePortfolioAddress } from 'pages/Portfolio/hooks/usePortfolioAddress' +import { useMemo } from 'react' +import { ActivityItem } from 'uniswap/src/components/activity/generateActivityItemRenderer' +import { useActivityData } from 'uniswap/src/features/activity/hooks/useActivityData' +import { TransactionDetails } from 'uniswap/src/features/transactions/types/transactionDetails' +import { ONE_DAY_MS } from 'utilities/src/time/time' + +function filterSwapsTypeLast7Days(transactions: ActivityItem[]): TransactionDetails[] { + const allowedTypes = getTransactionTypesForFilter(ActivityFilterType.Swaps) + const now = Date.now() + const sevenDaysAgo = now - 7 * ONE_DAY_MS + + return filterTransactionDetailsFromActivityItems(transactions) + .filter((tx: TransactionDetails) => allowedTypes !== 'all' && allowedTypes.includes(tx.typeInfo.type)) + .filter((tx: TransactionDetails) => tx.addedTime >= sevenDaysAgo) +} + +export function useSwapsThisWeek() { + const portfolioAddress = usePortfolioAddress() + + const { sectionData, isLoading } = useActivityData({ + evmOwner: portfolioAddress, + ownerAddresses: [portfolioAddress], + swapCallbacks: { + useLatestSwapTransaction: () => undefined, + useSwapFormTransactionState: () => undefined, + onRetryGenerator: () => () => {}, + }, + fiatOnRampParams: undefined, + }) + + const swapsLast7Days = useMemo(() => (sectionData ? filterSwapsTypeLast7Days(sectionData) : []), [sectionData]) + + const totalVolumeUSD = useMemo( + () => + swapsLast7Days.reduce((sum, tx) => { + // Note: transactedUSDValue is only populated for GraphQL transactions + // REST API transactions don't provide USD values, so this will be 0 + const usdValue = tx.typeInfo.transactedUSDValue ?? 0 + return sum + usdValue + }, 0), + [swapsLast7Days], + ) + + return { count: swapsLast7Days.length, totalVolumeUSD, isLoading } +} diff --git a/apps/web/src/pages/Portfolio/Portfolio.tsx b/apps/web/src/pages/Portfolio/Portfolio.tsx index 8959a955b19..908f85078e2 100644 --- a/apps/web/src/pages/Portfolio/Portfolio.tsx +++ b/apps/web/src/pages/Portfolio/Portfolio.tsx @@ -1,7 +1,7 @@ import { Layers, PortfolioDisconnectedDemoViewProperties, useExperimentValueFromLayer } from '@universe/gating' -import PortfolioConnectWalletBanner from 'pages/Portfolio/ConnectWalletBanner' +import { PortfolioConnectWalletBanner } from 'pages/Portfolio/ConnectWalletBanner' import { ConnectWalletBottomOverlay } from 'pages/Portfolio/ConnectWalletBottomOverlay' -import PortfolioHeader from 'pages/Portfolio/Header/Header' +import { PortfolioHeader } from 'pages/Portfolio/Header/Header' import useIsConnected from 'pages/Portfolio/Header/hooks/useIsConnected' import { PortfolioContent } from 'pages/Portfolio/PortfolioContent' import PortfolioDisconnectedView from 'pages/Portfolio/PortfolioDisconnectedView' diff --git a/apps/web/src/pages/Portfolio/PortfolioContent.tsx b/apps/web/src/pages/Portfolio/PortfolioContent.tsx index 9f859aaa643..efbc638a1fe 100644 --- a/apps/web/src/pages/Portfolio/PortfolioContent.tsx +++ b/apps/web/src/pages/Portfolio/PortfolioContent.tsx @@ -1,23 +1,25 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import PortfolioActivity from 'pages/Portfolio/Activity/Activity' -import PortfolioDefi from 'pages/Portfolio/Defi' -import { usePortfolioParams } from 'pages/Portfolio/Header/hooks/usePortfolioParams' +import { PortfolioDefi } from 'pages/Portfolio/Defi' +import { usePortfolioRoutes } from 'pages/Portfolio/Header/hooks/usePortfolioRoutes' import { usePortfolioTabsAnimation } from 'pages/Portfolio/Header/hooks/usePortfolioTabsAnimation' -import PortfolioNfts from 'pages/Portfolio/NFTs/Nfts' -import PortfolioOverview from 'pages/Portfolio/Overview' -import PortfolioTokens from 'pages/Portfolio/Tokens/Tokens' +import { PortfolioNfts } from 'pages/Portfolio/NFTs/Nfts' +import { PortfolioOverview } from 'pages/Portfolio/Overview/Overview' +import { PortfolioTokens } from 'pages/Portfolio/Tokens/Tokens' import { PortfolioTab } from 'pages/Portfolio/types' import { useLocation } from 'react-router' import { Flex } from 'ui/src' import { TransitionItem } from 'ui/src/animations/components/AnimatePresencePager' -const renderPortfolioContent = (tab: PortfolioTab | undefined) => { +const renderPortfolioContent = (tab: PortfolioTab | undefined, isPortfolioDefiTabEnabled: boolean) => { switch (tab) { case PortfolioTab.Overview: return case PortfolioTab.Tokens: return case PortfolioTab.Defi: - return + // If defi tab is disabled, usePortfolioRoutes will redirect to overview tab + return isPortfolioDefiTabEnabled ? : <> case PortfolioTab.Nfts: return case PortfolioTab.Activity: @@ -30,12 +32,13 @@ const renderPortfolioContent = (tab: PortfolioTab | undefined) => { export function PortfolioContent({ disabled }: { disabled?: boolean }): JSX.Element { const { pathname } = useLocation() const animationType = usePortfolioTabsAnimation(pathname) - const { tab } = usePortfolioParams() + const { tab } = usePortfolioRoutes() + const isPortfolioDefiTabEnabled = useFeatureFlag(FeatureFlags.PortfolioDefiTab) return ( - {renderPortfolioContent(tab)} + {renderPortfolioContent(tab, isPortfolioDefiTabEnabled)} ) diff --git a/apps/web/src/pages/Portfolio/Tokens/Table/TokensAllocationChart.tsx b/apps/web/src/pages/Portfolio/Tokens/Table/TokensAllocationChart.tsx index 4698d8dea44..6ca845da49f 100644 --- a/apps/web/src/pages/Portfolio/Tokens/Table/TokensAllocationChart.tsx +++ b/apps/web/src/pages/Portfolio/Tokens/Table/TokensAllocationChart.tsx @@ -3,7 +3,7 @@ import { PercentageAllocationItem, } from 'components/PercentageAllocationChart/PercentageAllocationChart' import { TokenData } from 'pages/Portfolio/Tokens/hooks/useTransformTokenTableData' -import React, { useMemo } from 'react' +import { useMemo } from 'react' import { iconSizes } from 'ui/src/theme' import { NetworkLogo } from 'uniswap/src/components/CurrencyLogo/NetworkLogo' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' diff --git a/apps/web/src/pages/Portfolio/Tokens/Table/TokensContextMenuWrapper.tsx b/apps/web/src/pages/Portfolio/Tokens/Table/TokensContextMenuWrapper.tsx index 3bd16b1bd30..db6a0cbde68 100644 --- a/apps/web/src/pages/Portfolio/Tokens/Table/TokensContextMenuWrapper.tsx +++ b/apps/web/src/pages/Portfolio/Tokens/Table/TokensContextMenuWrapper.tsx @@ -1,16 +1,30 @@ +import { Currency } from '@uniswap/sdk-core' +import { useModalState } from 'hooks/useModalState' +import { useAtom } from 'jotai' import useIsConnected from 'pages/Portfolio/Header/hooks/useIsConnected' import { TokenData } from 'pages/Portfolio/Tokens/hooks/useTransformTokenTableData' import { PropsWithChildren, useMemo } from 'react' import { ContextMenuTriggerMode } from 'uniswap/src/components/menus/types' import { TokenBalanceItemContextMenu } from 'uniswap/src/components/portfolio/TokenBalanceItemContextMenu' +import { ReportTokenIssueModalPropsAtom } from 'uniswap/src/components/reporting/ReportTokenIssueModal' import { PortfolioBalance } from 'uniswap/src/features/dataApi/types' +import { ModalName } from 'uniswap/src/features/telemetry/constants' +import { useEvent } from 'utilities/src/react/hooks' -export default function TokensContextMenuWrapper({ +export function TokensContextMenuWrapper({ tokenData, triggerMode, children, }: PropsWithChildren<{ tokenData: TokenData; triggerMode?: ContextMenuTriggerMode }>): React.ReactNode { const isConnected = useIsConnected() + + const { openModal } = useModalState(ModalName.ReportTokenIssue) + const [, setModalProps] = useAtom(ReportTokenIssueModalPropsAtom) + const openReportTokenModal = useEvent((currency: Currency) => { + setModalProps({ source: 'portfolio', currency, isMarkedSpam: portfolioBalance?.currencyInfo.isSpam }) + openModal() + }) + const portfolioBalance: PortfolioBalance | undefined = useMemo(() => { if (!tokenData.currencyInfo) { return undefined @@ -32,7 +46,11 @@ export default function TokensContextMenuWrapper({ } return ( - + openReportTokenModal(portfolioBalance.currencyInfo.currency)} + > {children} ) diff --git a/apps/web/src/pages/Portfolio/Tokens/Table/TokensTable.tsx b/apps/web/src/pages/Portfolio/Tokens/Table/TokensTable.tsx index 39c41307320..1ff226efd1e 100644 --- a/apps/web/src/pages/Portfolio/Tokens/Table/TokensTable.tsx +++ b/apps/web/src/pages/Portfolio/Tokens/Table/TokensTable.tsx @@ -1,6 +1,6 @@ import { NetworkStatus } from '@apollo/client' import { TokenData } from 'pages/Portfolio/Tokens/hooks/useTransformTokenTableData' -import TokensTableInner from 'pages/Portfolio/Tokens/Table/TokensTableInner' +import { TokensTableInner } from 'pages/Portfolio/Tokens/Table/TokensTableInner' import { useState } from 'react' import { useTranslation } from 'react-i18next' import { ScrollSync } from 'react-scroll-sync' @@ -17,7 +17,7 @@ interface TokensTableProps { error?: Error | undefined } -export default function TokensTable({ visible, hidden, loading, refetching, networkStatus, error }: TokensTableProps) { +export function TokensTable({ visible, hidden, loading, refetching, networkStatus, error }: TokensTableProps) { const { t } = useTranslation() const [isOpen, setIsOpen] = useState(false) const tableLoading = loading && !refetching diff --git a/apps/web/src/pages/Portfolio/Tokens/Table/TokensTableInner.tsx b/apps/web/src/pages/Portfolio/Tokens/Table/TokensTableInner.tsx index aeb4600af6a..0708180aee7 100644 --- a/apps/web/src/pages/Portfolio/Tokens/Table/TokensTableInner.tsx +++ b/apps/web/src/pages/Portfolio/Tokens/Table/TokensTableInner.tsx @@ -4,13 +4,13 @@ import { Cell } from 'components/Table/Cell' import { HeaderCell } from 'components/Table/styled' import { ValueWithFadedDecimals } from 'pages/Portfolio/components/ValueWithFadedDecimals/ValueWithFadedDecimals' import { TokenData } from 'pages/Portfolio/Tokens/hooks/useTransformTokenTableData' -import Allocation from 'pages/Portfolio/Tokens/Table/columns/Allocation' -import Balance from 'pages/Portfolio/Tokens/Table/columns/Balance' -import ContextMenuButton from 'pages/Portfolio/Tokens/Table/columns/ContextMenuButton' -import RelativeChange1D from 'pages/Portfolio/Tokens/Table/columns/RelativeChange1D' -import TokenDisplay from 'pages/Portfolio/Tokens/Table/columns/TokenDisplay' -import Value from 'pages/Portfolio/Tokens/Table/columns/Value' -import TokensContextMenuWrapper from 'pages/Portfolio/Tokens/Table/TokensContextMenuWrapper' +import { Allocation } from 'pages/Portfolio/Tokens/Table/columns/Allocation' +import { Balance } from 'pages/Portfolio/Tokens/Table/columns/Balance' +import { ContextMenuButton } from 'pages/Portfolio/Tokens/Table/columns/ContextMenuButton' +import { RelativeChange1D } from 'pages/Portfolio/Tokens/Table/columns/RelativeChange1D' +import { TokenDisplay } from 'pages/Portfolio/Tokens/Table/columns/TokenDisplay' +import { Value } from 'pages/Portfolio/Tokens/Table/columns/Value' +import { TokensContextMenuWrapper } from 'pages/Portfolio/Tokens/Table/TokensContextMenuWrapper' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import { Text } from 'ui/src' @@ -20,7 +20,7 @@ const hasRow = (obj: unknown): obj is { row: { original: T } } => { return typeof maybeRow === 'object' && maybeRow !== null && 'original' in maybeRow && maybeRow.original !== undefined } -export default function TokensTableInner({ +export function TokensTableInner({ tokenData, hideHeader, loading = false, diff --git a/apps/web/src/pages/Portfolio/Tokens/Table/columns/Allocation.tsx b/apps/web/src/pages/Portfolio/Tokens/Table/columns/Allocation.tsx index 56c05d51489..f317d23350b 100644 --- a/apps/web/src/pages/Portfolio/Tokens/Table/columns/Allocation.tsx +++ b/apps/web/src/pages/Portfolio/Tokens/Table/columns/Allocation.tsx @@ -3,7 +3,7 @@ import { memo } from 'react' import { Flex, Progress } from 'ui/src' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' -const Allocation = memo(function Allocation({ value }: { value: number }): JSX.Element { +export const Allocation = memo(function Allocation({ value }: { value: number }): JSX.Element { const { formatPercent } = useLocalizationContext() return ( @@ -11,7 +11,7 @@ const Allocation = memo(function Allocation({ value }: { value: number }): JSX.E {formatPercent(value, 1)} {EM_DASH} } @@ -16,5 +16,3 @@ const Balance = memo(function Balance({ value, symbol }: TokenData['balance']) { ) }) Balance.displayName = 'Balance' - -export default Balance diff --git a/apps/web/src/pages/Portfolio/Tokens/Table/columns/ContextMenuButton.tsx b/apps/web/src/pages/Portfolio/Tokens/Table/columns/ContextMenuButton.tsx index b5740c01957..a2d03164ce5 100644 --- a/apps/web/src/pages/Portfolio/Tokens/Table/columns/ContextMenuButton.tsx +++ b/apps/web/src/pages/Portfolio/Tokens/Table/columns/ContextMenuButton.tsx @@ -1,5 +1,5 @@ import { TokenData } from 'pages/Portfolio/Tokens/hooks/useTransformTokenTableData' -import TokensContextMenuWrapper from 'pages/Portfolio/Tokens/Table/TokensContextMenuWrapper' +import { TokensContextMenuWrapper } from 'pages/Portfolio/Tokens/Table/TokensContextMenuWrapper' import { Flex } from 'ui/src' import { MoreHorizontal } from 'ui/src/components/icons/MoreHorizontal' import { ContextMenuTriggerMode } from 'uniswap/src/components/menus/types' @@ -8,7 +8,7 @@ interface ContextMenuButtonProps { tokenData: TokenData } -export default function ContextMenuButton({ tokenData }: ContextMenuButtonProps) { +export function ContextMenuButton({ tokenData }: ContextMenuButtonProps) { return ( diff --git a/apps/web/src/pages/Portfolio/Tokens/Table/columns/RelativeChange1D.tsx b/apps/web/src/pages/Portfolio/Tokens/Table/columns/RelativeChange1D.tsx index b88bec65c59..b9696548fb4 100644 --- a/apps/web/src/pages/Portfolio/Tokens/Table/columns/RelativeChange1D.tsx +++ b/apps/web/src/pages/Portfolio/Tokens/Table/columns/RelativeChange1D.tsx @@ -5,7 +5,7 @@ import { EM_DASH } from 'ui/src' import { breakpoints } from 'ui/src/theme' import { RelativeChange } from 'uniswap/src/components/RelativeChange/RelativeChange' -const RelativeChange1D = memo(function RelativeChange1D({ value }: { value: number | undefined }): JSX.Element { +export const RelativeChange1D = memo(function RelativeChange1D({ value }: { value: number | undefined }): JSX.Element { const { width: tableWidth } = useTableSize() if (!value && value !== 0) { @@ -24,5 +24,3 @@ const RelativeChange1D = memo(function RelativeChange1D({ value }: { value: numb ) }) RelativeChange1D.displayName = 'RelativeChange1D' - -export default RelativeChange1D diff --git a/apps/web/src/pages/Portfolio/Tokens/Table/columns/TokenDisplay.tsx b/apps/web/src/pages/Portfolio/Tokens/Table/columns/TokenDisplay.tsx index 40b77c53a70..cd22c891c5e 100644 --- a/apps/web/src/pages/Portfolio/Tokens/Table/columns/TokenDisplay.tsx +++ b/apps/web/src/pages/Portfolio/Tokens/Table/columns/TokenDisplay.tsx @@ -5,7 +5,7 @@ import { TokenLogo } from 'uniswap/src/components/CurrencyLogo/TokenLogo' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' import { getSymbolDisplayText } from 'uniswap/src/utils/currency' -const TokenDisplay = memo(function TokenDisplay({ currencyInfo }: { currencyInfo: CurrencyInfo | null }) { +export const TokenDisplay = memo(function TokenDisplay({ currencyInfo }: { currencyInfo: CurrencyInfo | null }) { if (!currencyInfo) { return {EM_DASH} } @@ -33,5 +33,3 @@ const TokenDisplay = memo(function TokenDisplay({ currencyInfo }: { currencyInfo ) }) TokenDisplay.displayName = 'TokenDisplay' - -export default TokenDisplay diff --git a/apps/web/src/pages/Portfolio/Tokens/Table/columns/Value.tsx b/apps/web/src/pages/Portfolio/Tokens/Table/columns/Value.tsx index 51b7fb9c245..6709e7e15d7 100644 --- a/apps/web/src/pages/Portfolio/Tokens/Table/columns/Value.tsx +++ b/apps/web/src/pages/Portfolio/Tokens/Table/columns/Value.tsx @@ -3,7 +3,7 @@ import { ValueWithFadedDecimals } from 'pages/Portfolio/components/ValueWithFade import { memo } from 'react' import { EM_DASH } from 'ui/src' -const Value = memo(function Value({ value }: { value: string }) { +export const Value = memo(function Value({ value }: { value: string }) { if (!value && value !== '0') { return {EM_DASH} } @@ -11,5 +11,3 @@ const Value = memo(function Value({ value }: { value: string }) { return }) Value.displayName = 'Value' - -export default Value diff --git a/apps/web/src/pages/Portfolio/Tokens/Tokens.tsx b/apps/web/src/pages/Portfolio/Tokens/Tokens.tsx index 4e44c419bcf..e3ea39f49c5 100644 --- a/apps/web/src/pages/Portfolio/Tokens/Tokens.tsx +++ b/apps/web/src/pages/Portfolio/Tokens/Tokens.tsx @@ -1,9 +1,10 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { SearchInput } from 'pages/Portfolio/components/SearchInput' -import { usePortfolioParams } from 'pages/Portfolio/Header/hooks/usePortfolioParams' +import { usePortfolioRoutes } from 'pages/Portfolio/Header/hooks/usePortfolioRoutes' import { usePortfolioAddress } from 'pages/Portfolio/hooks/usePortfolioAddress' import { useTransformTokenTableData } from 'pages/Portfolio/Tokens/hooks/useTransformTokenTableData' import { TokensAllocationChart } from 'pages/Portfolio/Tokens/Table/TokensAllocationChart' -import TokensTable from 'pages/Portfolio/Tokens/Table/TokensTable' +import { TokensTable } from 'pages/Portfolio/Tokens/Table/TokensTable' import { filterTokensBySearch } from 'pages/Portfolio/Tokens/utils/filterTokensBySearch' import { memo, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -35,12 +36,13 @@ const TokenCountIndicator = memo(({ count }: { count: number }) => { TokenCountIndicator.displayName = 'TokenCountIndicator' -export default function PortfolioTokens() { +export function PortfolioTokens() { const portfolioAddress = usePortfolioAddress() const { t } = useTranslation() const [search, setSearch] = useState('') const { chains: enabledChains } = useEnabledChains() - const { chainId: urlChainId } = usePortfolioParams() + const { chainId: urlChainId } = usePortfolioRoutes() + const isPortfolioTokensAllocationChartEnabled = useFeatureFlag(FeatureFlags.PortfolioTokensAllocationChart) // Parse search query to extract chain filter and search term const { chainFilter, searchTerm } = useMemo(() => { @@ -90,7 +92,7 @@ export default function PortfolioTokens() { {(tokenData && tokenData.length > 0) || loading ? ( <> - + {isPortfolioTokensAllocationChartEnabled && } {(filteredTokenData?.length ?? 0) > 0 || loading ? ( {EM_DASH} + return {EM_DASH} } return ( - + {prefixSymbol} {wholeNumber} {decimalNumber && ( <> - + {/* $neutral2 needs to be last so it overrides the textProps color */} + {decimalSeparator} {decimalNumber} - + {suffix} )} {suffixSymbol} - + ) } diff --git a/apps/web/src/pages/Positions/PositionPage.tsx b/apps/web/src/pages/Positions/PositionPage.tsx index 5f923abfd40..4d5f81f6bc9 100644 --- a/apps/web/src/pages/Positions/PositionPage.tsx +++ b/apps/web/src/pages/Positions/PositionPage.tsx @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { BigNumber } from '@ethersproject/bignumber' import { Position, PositionStatus, ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency, CurrencyAmount, Percent, Price } from '@uniswap/sdk-core' @@ -8,6 +9,7 @@ import { WrappedLiquidityPositionRangeChart } from 'components/Charts/LiquidityP import { Dropdown } from 'components/Dropdowns/Dropdown' import { BaseQuoteFiatAmount } from 'components/Liquidity/BaseQuoteFiatAmount' import { useGetRangeDisplay } from 'components/Liquidity/hooks/useGetRangeDisplay' +import { useReportPositionHandler } from 'components/Liquidity/hooks/useReportPositionHandler' import { LiquidityPositionAmountRows } from 'components/Liquidity/LiquidityPositionAmountRows' import { LiquidityPositionInfo } from 'components/Liquidity/LiquidityPositionInfo' import { LiquidityPositionStackedBars } from 'components/Liquidity/LiquidityPositionStackedBars' @@ -46,6 +48,7 @@ import { useSporeColors, } from 'ui/src' import { ExchangeHorizontal } from 'ui/src/components/icons/ExchangeHorizontal' +import { Flag } from 'ui/src/components/icons/Flag' import { InfoCircleFilled } from 'ui/src/components/icons/InfoCircleFilled' import { RotatableChevron } from 'ui/src/components/icons/RotatableChevron' import { useDeviceDimensions } from 'ui/src/hooks/useDeviceDimensions' @@ -63,6 +66,7 @@ import { InterfacePageName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' import { useCurrencyInfos } from 'uniswap/src/features/tokens/useCurrencyInfo' import { useUSDCValue } from 'uniswap/src/features/transactions/hooks/useUSDCPrice' +import { usePositionVisibilityCheck } from 'uniswap/src/features/visibility/hooks/usePositionVisibilityCheck' import { areAddressesEqual } from 'uniswap/src/utils/addresses' import { buildCurrencyId, currencyId, currencyIdToAddress } from 'uniswap/src/utils/currencyId' import { NumberType } from 'utilities/src/format/types' @@ -164,6 +168,23 @@ function PositionPage({ chainId }: { chainId: EVMUniverseChainId | undefined }) } }, [positionInfo]) + const isPositionVisible = usePositionVisibilityCheck() + const isVisible = + positionInfo !== undefined && + isPositionVisible({ + poolId: positionInfo.poolId, + tokenId: positionInfo.tokenId, + chainId: positionInfo.chainId, + isFlaggedSpam: positionInfo.isHidden, + }) + + const isDataReportingEnabled = useFeatureFlag(FeatureFlags.DataReportingAbilities) + const reportPositionHandler = useReportPositionHandler({ + position: positionInfo, + isVisible, + navigateToPositions: true, + }) + const [priceInverted, setPriceInverted] = useState(false) const { maxPrice, minPrice, tokenASymbol, tokenBSymbol, isFullRange } = useGetRangeDisplay({ @@ -585,6 +606,19 @@ function PositionPage({ chainId }: { chainId: EVMUniverseChainId | undefined }) totalApr={positionInfo.totalApr} /> )} + {isDataReportingEnabled && ( + + + {t('reporting.pool.details.title')} + + + + + {t('nft.reportSpam')} + + + + )} diff --git a/apps/web/src/pages/Positions/index.tsx b/apps/web/src/pages/Positions/index.tsx index 43c75054aeb..ead8e364964 100644 --- a/apps/web/src/pages/Positions/index.tsx +++ b/apps/web/src/pages/Positions/index.tsx @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { PositionStatus, ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { FeatureFlags, useFeatureFlag } from '@universe/gating' import PROVIDE_LIQUIDITY from 'assets/images/provideLiquidity.png' @@ -15,7 +16,6 @@ import { PositionInfo } from 'components/Liquidity/types' import { getPositionUrl } from 'components/Liquidity/utils/getPositionUrl' import { parseRestPosition } from 'components/Liquidity/utils/parseFromRest' import { useAccount } from 'hooks/useAccount' -import { useInfiniteScroll } from 'hooks/useInfiniteScroll' import { useLpIncentives } from 'hooks/useLpIncentives' import { atom, useAtom } from 'jotai' import { TopPools } from 'pages/Positions/TopPools' @@ -41,6 +41,7 @@ import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import Trace from 'uniswap/src/features/telemetry/Trace' import { useIsMissingPlatformWallet } from 'uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useIsMissingPlatformWallet' import { usePositionVisibilityCheck } from 'uniswap/src/features/visibility/hooks/usePositionVisibilityCheck' +import { useInfiniteScroll } from 'utilities/src/react/useInfiniteScroll' // The BE limits the number of positions by chain and protocol version. // PAGE_SIZE=25 means the limit is at most 25 positions * x chains * y protocol versions. diff --git a/apps/web/src/pages/Swap/Buy/BuyForm.tsx b/apps/web/src/pages/Swap/Buy/BuyForm.tsx index bd2d054592a..2de783c634e 100644 --- a/apps/web/src/pages/Swap/Buy/BuyForm.tsx +++ b/apps/web/src/pages/Swap/Buy/BuyForm.tsx @@ -21,7 +21,7 @@ import { StyledNumericalInput, useWidthAdjustedDisplayValue, } from 'pages/Swap/common/shared' -import { useCallback, useEffect, useMemo } from 'react' +import { useCallback, useEffect, useMemo, useRef } from 'react' import { useTranslation } from 'react-i18next' import { useNavigate, useSearchParams } from 'react-router' import { Flex, styled, Text } from 'ui/src' @@ -110,6 +110,7 @@ function BuyFormInner({ disabled, initialCurrency }: BuyFormProps) { const prevQuoteCurrency = usePrevious(quoteCurrency) const postWidthAdjustedDisplayValue = useWidthAdjustedDisplayValue(inputAmount) const hiddenObserver = useResizeObserver() + const inputRef = useRef(null) useEffect(() => { const fiatValue = inputInFiat ? inputAmount : derivedBuyFormInfo.amountOut @@ -284,7 +285,15 @@ function BuyFormInner({ disabled, initialCurrency }: BuyFormProps) { countryCode={selectedCountry?.countryCode} /> - + inputRef.current?.focus()} + > {error && ( {error.message} @@ -309,6 +318,7 @@ function BuyFormInner({ disabled, initialCurrency }: BuyFormProps) { : (quoteCurrency?.currencyInfo?.currency.decimals ?? DEFAULT_FIAT_DECIMALS) } testId={TestID.BuyFormAmountInput} + ref={inputRef} /> {inputAmount} diff --git a/apps/web/src/pages/Swap/Buy/OffRampConfirmTransferModal.tsx b/apps/web/src/pages/Swap/Buy/OffRampConfirmTransferModal.tsx index d6f1a82f21f..206ca827f5d 100644 --- a/apps/web/src/pages/Swap/Buy/OffRampConfirmTransferModal.tsx +++ b/apps/web/src/pages/Swap/Buy/OffRampConfirmTransferModal.tsx @@ -243,9 +243,9 @@ export const OffRampConfirmTransferModal = ({ title={t('fiatOffRamp.error.populateSend.title')} subtext={t('fiatOffRamp.error.populateSend.description')} icon={} - hasIconBackground + iconBackgroundColor="$surface3" primaryButtonText={t('common.close')} - primaryButtonOnClick={onClose} + primaryButtonOnPress={onClose} primaryButtonVariant="default" modalName={ModalName.FiatOffRampConfirmTransferError} /> diff --git a/apps/web/src/pages/Swap/Buy/shared.test.tsx b/apps/web/src/pages/Swap/Buy/shared.test.tsx index 456a25967b7..3c8dc43610d 100644 --- a/apps/web/src/pages/Swap/Buy/shared.test.tsx +++ b/apps/web/src/pages/Swap/Buy/shared.test.tsx @@ -228,9 +228,9 @@ describe('getCountryFromLocale', () => { it.each([ [Locale.EnglishUnitedStates, 'US'], - [Locale.ItalianItaly, 'IT'], [Locale.JapaneseJapan, 'JP'], [Locale.PortugueseBrazil, 'BR'], + [Locale.PortuguesePortugal, 'PT'], ])('should extract country code %s correctly as %s', (locale, expectedCountryCode) => { // Arrange mockNavigatorLocale.mockReturnValue(locale) diff --git a/apps/web/src/pages/Swap/Limit/LimitForm.tsx b/apps/web/src/pages/Swap/Limit/LimitForm.tsx index 762c656b716..8de3248a240 100644 --- a/apps/web/src/pages/Swap/Limit/LimitForm.tsx +++ b/apps/web/src/pages/Swap/Limit/LimitForm.tsx @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { Currency, CurrencyAmount, Token } from '@uniswap/sdk-core' import { UNIVERSAL_ROUTER_ADDRESS, UniversalRouterVersion } from '@uniswap/universal-router-sdk' import { FeatureFlags, useFeatureFlag } from '@universe/gating' diff --git a/apps/web/src/pages/Swap/Send/NewAddressSpeedBump.tsx b/apps/web/src/pages/Swap/Send/NewAddressSpeedBump.tsx index f005c911092..fbb7251fb13 100644 --- a/apps/web/src/pages/Swap/Send/NewAddressSpeedBump.tsx +++ b/apps/web/src/pages/Swap/Send/NewAddressSpeedBump.tsx @@ -50,32 +50,20 @@ export const NewAddressSpeedBumpModal = ({ isOpen, onDismiss, onConfirm }: SendM isOpen={isOpen} onClose={onDismiss} icon={} - hasIconBackground + iconBackgroundColor="$surface3" title={t('speedBump.newAddress.warning.title')} subtext={t('speedBump.newAddress.warning.description')} modalName={ModalName.NewAddressSpeedBump} primaryButtonText={t('common.button.close')} - primaryButtonOnClick={onDismiss} + primaryButtonOnPress={onDismiss} primaryButtonVariant="default" primaryButtonEmphasis="secondary" secondaryButtonText={t('common.button.continue')} - secondaryButtonOnClick={onConfirm} + secondaryButtonOnPress={onConfirm} secondaryButtonVariant="branded" displayHelpCTA - buttonContainerProps={{ - flexDirection: 'row', - }} > - - - + ) } diff --git a/apps/web/src/pages/Swap/Send/SendReviewModal.tsx b/apps/web/src/pages/Swap/Send/SendReviewModal.tsx index f46fa093cf3..61fd13d3e99 100644 --- a/apps/web/src/pages/Swap/Send/SendReviewModal.tsx +++ b/apps/web/src/pages/Swap/Send/SendReviewModal.tsx @@ -18,7 +18,7 @@ import { useAppFiatCurrency } from 'uniswap/src/features/fiatCurrency/hooks' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { useGetPasskeyAuthStatus } from 'uniswap/src/features/passkey/hooks/useGetPasskeyAuthStatus' import { ElementName, UniswapEventName } from 'uniswap/src/features/telemetry/constants' -import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send.web' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import Trace from 'uniswap/src/features/telemetry/Trace' import { useUSDCValue } from 'uniswap/src/features/transactions/hooks/useUSDCPrice' import { LowNativeBalanceModal } from 'uniswap/src/features/transactions/modals/LowNativeBalanceModal' diff --git a/apps/web/src/pages/Swap/Send/SmartContractSpeedBump.tsx b/apps/web/src/pages/Swap/Send/SmartContractSpeedBump.tsx index b1d576434a2..7b2b3c40f5e 100644 --- a/apps/web/src/pages/Swap/Send/SmartContractSpeedBump.tsx +++ b/apps/web/src/pages/Swap/Send/SmartContractSpeedBump.tsx @@ -14,21 +14,18 @@ export const SmartContractSpeedBumpModal = ({ isOpen, onDismiss, onConfirm }: Se isOpen={isOpen} onClose={onDismiss} icon={} - hasIconBackground + iconBackgroundColor="$surface3" title={t('speedBump.smartContractAddress.warning.title')} subtext={t('speedBump.smartContractAddress.warning.description')} modalName={ModalName.SmartContractSpeedBump} primaryButtonText={t('common.button.cancel')} - primaryButtonOnClick={onDismiss} + primaryButtonOnPress={onDismiss} primaryButtonVariant="default" primaryButtonEmphasis="secondary" secondaryButtonText={t('common.button.continue')} - secondaryButtonOnClick={onConfirm} + secondaryButtonOnPress={onConfirm} secondaryButtonVariant="branded" displayHelpCTA - buttonContainerProps={{ - flexDirection: 'row', - }} /> ) } diff --git a/apps/web/src/pages/Swap/Send/__snapshots__/NewAddressSpeedBump.test.tsx.snap b/apps/web/src/pages/Swap/Send/__snapshots__/NewAddressSpeedBump.test.tsx.snap index 31ea36f5a43..5408e17f2d8 100644 --- a/apps/web/src/pages/Swap/Send/__snapshots__/NewAddressSpeedBump.test.tsx.snap +++ b/apps/web/src/pages/Swap/Send/__snapshots__/NewAddressSpeedBump.test.tsx.snap @@ -85,7 +85,7 @@ exports[`NewAddressSpeedBumpModal > should not render AccountIcon if account has should not render AccountIcon if account has target="_blank" >
should not render AccountIcon if account has /> Get help @@ -146,10 +146,10 @@ exports[`NewAddressSpeedBumpModal > should not render AccountIcon if account has
should not render AccountIcon if account has />
- - New address - - - You haven’t transacted with this address before. Make sure it’s the correct address before continuing. - + + New address + + + You haven’t transacted with this address before. Make sure it’s the correct address before continuing. + +
should not render AccountIcon if account has 0x9984b4b4E408e8D618A879e5315BD30952c89103
-
+
+ - + -
+ Close + +
diff --git a/apps/web/src/pages/Swap/Send/__snapshots__/SmartContractSpeedbump.test.tsx.snap b/apps/web/src/pages/Swap/Send/__snapshots__/SmartContractSpeedbump.test.tsx.snap index d31f6ee0ccb..c4af2ea822e 100644 --- a/apps/web/src/pages/Swap/Send/__snapshots__/SmartContractSpeedbump.test.tsx.snap +++ b/apps/web/src/pages/Swap/Send/__snapshots__/SmartContractSpeedbump.test.tsx.snap @@ -95,7 +95,7 @@ exports[`SmartContractSpeedBumpModal > should render correctly 1`] = ` should render correctly 1`] = ` target="_blank" >
should render correctly 1`] = ` /> Get help @@ -156,10 +156,10 @@ exports[`SmartContractSpeedBumpModal > should render correctly 1`] = `
should render correctly 1`] = ` />
- - Is this a wallet address? - - - You’re about to send tokens to a special type of address - a smart contract. Double-check it’s the address you intended to send to. If it’s wrong, your tokens could be lost forever. -
- - + You’re about to send tokens to a special type of address - a smart contract. Double-check it’s the address you intended to send to. If it’s wrong, your tokens could be lost forever. +
+
+ + +
diff --git a/apps/web/src/pages/Swap/index.tsx b/apps/web/src/pages/Swap/index.tsx index a06928cb810..be25c386ad8 100644 --- a/apps/web/src/pages/Swap/index.tsx +++ b/apps/web/src/pages/Swap/index.tsx @@ -17,8 +17,7 @@ import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import { useLocation, useNavigate } from 'react-router' import { MultichainContextProvider } from 'state/multichain/MultichainContext' -import { useSwapCallback } from 'state/sagas/transactions/swapSaga' -import { useWrapCallback } from 'state/sagas/transactions/wrapSaga' +import { useSwapHandlers } from 'state/sagas/transactions/useSwapHandlers' import { useInitialCurrencyState } from 'state/swap/hooks' import { SwapAndLimitContextProvider } from 'state/swap/SwapContext' import type { CurrencyState } from 'state/swap/types' @@ -259,8 +258,7 @@ function UniversalSwapFlow({ const { pathname } = useLocation() const navigate = useNavigate() const { t } = useTranslation() - const swapCallback = useSwapCallback() - const wrapCallback = useWrapCallback() + const swapHandlers = useSwapHandlers() const LimitFormWrapper = useDeferredComponent(() => import('pages/Swap/Limit/LimitForm').then((module) => ({ @@ -346,7 +344,7 @@ function UniversalSwapFlow({ )} {currentTab === SwapTab.Swap && ( - + { it('should translate locale to a user language, retaining customization', async () => { const result: any = await migrator(previousState, 19) expect(result.user.userLocale).toBe(undefined) - expect(result.userSettings.currentLanguage).toBe(Language.Italian) + expect(result.userSettings.currentLanguage).toBe(Language.Japanese) }) }) diff --git a/apps/web/src/state/migrations/22.test.ts b/apps/web/src/state/migrations/22.test.ts index 9937a520529..f4a81fb6379 100644 --- a/apps/web/src/state/migrations/22.test.ts +++ b/apps/web/src/state/migrations/22.test.ts @@ -29,6 +29,8 @@ vi.mock('utilities/src/platform', () => ({ isWebApp: true, isMobileApp: false, isExtensionApp: false, + isIOS: false, + isAndroid: false, })) vi.mock('uniswap/src/features/language/utils', () => ({ diff --git a/apps/web/src/state/migrations/58.test.ts b/apps/web/src/state/migrations/58.test.ts new file mode 100644 index 00000000000..f92f8982808 --- /dev/null +++ b/apps/web/src/state/migrations/58.test.ts @@ -0,0 +1,176 @@ +import { migration58 } from 'state/migrations/58' +import { Language } from 'uniswap/src/features/language/constants' + +const previousState = { + _persist: { + version: 57, + rehydrated: true, + }, + userSettings: { + currentLanguage: Language.English, + }, +} + +describe('migration to v58', () => { + it('should preserve English language settings', () => { + const result: any = migration58(previousState) + expect(result.userSettings.currentLanguage).toEqual(Language.English) + expect(result._persist.version).toEqual(58) + }) + + it('should preserve supported non-English language settings (French)', () => { + const frenchState = { + ...previousState, + userSettings: { currentLanguage: Language.French }, + } + const result: any = migration58(frenchState) + expect(result.userSettings.currentLanguage).toEqual(Language.French) + expect(result._persist.version).toEqual(58) + }) + + it('should preserve supported Spanish variants', () => { + const spanishState = { + ...previousState, + userSettings: { currentLanguage: Language.SpanishSpain }, + } + const result: any = migration58(spanishState) + expect(result.userSettings.currentLanguage).toEqual(Language.SpanishSpain) + expect(result._persist.version).toEqual(58) + }) + + it('should preserve Vietnamese language settings', () => { + const vietnameseState = { + ...previousState, + userSettings: { currentLanguage: Language.Vietnamese }, + } + const result: any = migration58(vietnameseState) + expect(result.userSettings.currentLanguage).toEqual(Language.Vietnamese) + expect(result._persist.version).toEqual(58) + }) + + // Test removed languages with browser language detection + describe('removed languages', () => { + const originalNavigator = global.navigator + + beforeEach(() => { + // Reset navigator.language to default English + Object.defineProperty(global.navigator, 'language', { + writable: true, + configurable: true, + value: 'en-US', + }) + }) + + afterAll(() => { + // Restore original navigator + Object.defineProperty(global, 'navigator', { + value: originalNavigator, + configurable: true, + writable: true, + }) + }) + + it('should migrate Italian to English when browser language is en-US', () => { + const italianState = { + ...previousState, + userSettings: { currentLanguage: 'it' as Language }, + } + const result: any = migration58(italianState) + expect(result.userSettings.currentLanguage).toEqual(Language.English) + expect(result._persist.version).toEqual(58) + }) + + it('should migrate Hungarian to browser language when browser is fr-FR', () => { + Object.defineProperty(global.navigator, 'language', { + writable: true, + configurable: true, + value: 'fr-FR', + }) + const hungarianState = { + ...previousState, + userSettings: { currentLanguage: 'hu' as Language }, // Hungarian - removed language + } + const result: any = migration58(hungarianState) + expect(result.userSettings.currentLanguage).toEqual(Language.French) + expect(result._persist.version).toEqual(58) + }) + + it('should migrate Czech to browser language when browser is ja-JP', () => { + Object.defineProperty(global.navigator, 'language', { + writable: true, + configurable: true, + value: 'ja-JP', + }) + const czechState = { + ...previousState, + userSettings: { currentLanguage: 'cs' as Language }, // Czech - removed language + } + const result: any = migration58(czechState) + expect(result.userSettings.currentLanguage).toEqual(Language.Japanese) + expect(result._persist.version).toEqual(58) + }) + + it('should migrate Polish to English when browser language is unavailable', () => { + Object.defineProperty(global.navigator, 'language', { + writable: true, + configurable: true, + value: undefined, + }) + const polishState = { + ...previousState, + userSettings: { currentLanguage: 'pl' as Language }, + } + const result: any = migration58(polishState) + expect(result.userSettings.currentLanguage).toEqual(Language.English) + expect(result._persist.version).toEqual(58) + }) + + it('should migrate Ukrainian to English when browser language is unsupported', () => { + Object.defineProperty(global.navigator, 'language', { + writable: true, + configurable: true, + value: 'xx-XX', // Unsupported language code + }) + const ukrainianState = { + ...previousState, + userSettings: { currentLanguage: 'uk' as Language }, + } + const result: any = migration58(ukrainianState) + expect(result.userSettings.currentLanguage).toEqual(Language.English) + expect(result._persist.version).toEqual(58) + }) + + it('should migrate Afrikaans to English when navigator.language throws exception', () => { + Object.defineProperty(global.navigator, 'language', { + get() { + throw new Error('Navigator not available') + }, + configurable: true, + }) + const afrikaansState = { + ...previousState, + userSettings: { currentLanguage: 'af' as Language }, // Afrikaans - removed language + } + const result: any = migration58(afrikaansState) + expect(result.userSettings.currentLanguage).toEqual(Language.English) + expect(result._persist.version).toEqual(58) + }) + }) + + it('should handle undefined state', () => { + const result = migration58(undefined) + expect(result).toBeUndefined() + }) + + it('should handle state without userSettings', () => { + const stateWithoutUserSettings = { + _persist: { + version: 57, + rehydrated: true, + }, + } + const result: any = migration58(stateWithoutUserSettings) + expect(result._persist.version).toEqual(58) + expect(result.userSettings).toBeUndefined() + }) +}) diff --git a/apps/web/src/state/migrations/58.ts b/apps/web/src/state/migrations/58.ts new file mode 100644 index 00000000000..f80b9a8acf6 --- /dev/null +++ b/apps/web/src/state/migrations/58.ts @@ -0,0 +1,73 @@ +import { PersistState } from 'redux-persist' +import { Language, mapLocaleToLanguage } from 'uniswap/src/features/language/constants' +import { navigatorLocale } from 'uniswap/src/features/language/hooks' + +type PersistAppStateV58 = { + _persist: PersistState + userSettings?: { + currentLanguage: Language + } +} + +// Languages that were removed +const REMOVED_LANGUAGES: Language[] = [ + 'af' as Language, // Afrikaans + 'ar' as Language, // Arabic + 'ca-ES' as Language, // Catalan + 'cs' as Language, // Czech + 'da' as Language, // Danish + 'el' as Language, // Greek + 'fi' as Language, // Finnish + 'he' as Language, // Hebrew + 'hi' as Language, // Hindi + 'hu' as Language, // Hungarian + 'it' as Language, // Italian + 'ms' as Language, // Malay + 'no' as Language, // Norwegian + 'pl' as Language, // Polish + 'ro' as Language, // Romanian + 'sr' as Language, // Serbian + 'sv' as Language, // Swedish + 'sw' as Language, // Swahili + 'uk' as Language, // Ukrainian + 'ur' as Language, // Urdu +] + +/** + * Gets the browser's default language, falling back to English if unavailable + */ +function getBrowserLanguageOrEnglish(): Language { + try { + const locale = navigatorLocale() + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (locale && mapLocaleToLanguage[locale]) { + return mapLocaleToLanguage[locale] + } + } catch { + // If there's any error accessing navigator language, fall back to English + } + return Language.English +} + +/** + * Migration 58: Reset currentLanguage to browser default (or English if unavailable) if it is set to a removed language + */ +export const migration58 = (state: PersistAppStateV58 | undefined) => { + if (!state?.userSettings) { + return state ? { ...state, _persist: { ...state._persist, version: 58 } } : undefined + } + + // Check if the current language is one of the removed languages + if (REMOVED_LANGUAGES.includes(state.userSettings.currentLanguage)) { + return { + ...state, + userSettings: { + ...state.userSettings, + currentLanguage: getBrowserLanguageOrEnglish(), + }, + _persist: { ...state._persist, version: 58 }, + } + } + + return { ...state, _persist: { ...state._persist, version: 58 } } +} diff --git a/apps/web/src/state/migrations/59.test.ts b/apps/web/src/state/migrations/59.test.ts new file mode 100644 index 00000000000..9a434de057b --- /dev/null +++ b/apps/web/src/state/migrations/59.test.ts @@ -0,0 +1,21 @@ +import { migration59 } from 'state/migrations/59' + +const previousState = { + _persist: { + version: 58, + rehydrated: true, + }, + visibility: { + tokens: {}, + positions: {}, + nfts: {}, + }, +} + +describe('migration to v59', () => { + it('should properly set activity visibility state as empty and update persist version', async () => { + const result = migration59(previousState) + expect(result?._persist.version).toEqual(59) + expect(result?.visibility.activity).toEqual({}) + }) +}) diff --git a/apps/web/src/state/migrations/59.ts b/apps/web/src/state/migrations/59.ts new file mode 100644 index 00000000000..1bbc602a9df --- /dev/null +++ b/apps/web/src/state/migrations/59.ts @@ -0,0 +1,20 @@ +import { PersistState } from 'redux-persist' +import { VisibilityState } from 'uniswap/src/features/visibility/slice' +import { addActivityVisibility } from 'uniswap/src/state/uniswapMigrations' + +type PersistAppState = { + _persist: PersistState + visibility?: Omit +} +export const migration59 = (state: PersistAppState | undefined) => { + if (!state) { + return undefined + } + + const newState = addActivityVisibility(state) + + return { + ...newState, + _persist: { ...state._persist, version: 59 }, + } +} diff --git a/apps/web/src/state/mint/v3/hooks.tsx b/apps/web/src/state/mint/v3/hooks.tsx index 2ae57b1bc60..a3562eac084 100644 --- a/apps/web/src/state/mint/v3/hooks.tsx +++ b/apps/web/src/state/mint/v3/hooks.tsx @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { Currency, CurrencyAmount, Price, Rounding, Token } from '@uniswap/sdk-core' import { encodeSqrtRatioX96, diff --git a/apps/web/src/state/routing/types.ts b/apps/web/src/state/routing/types.ts index 70669c030fb..b4c0bba7f1a 100644 --- a/apps/web/src/state/routing/types.ts +++ b/apps/web/src/state/routing/types.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { BigNumber } from '@ethersproject/bignumber' import { AddressZero } from '@ethersproject/constants' import { PermitTransferFromData } from '@uniswap/permit2-sdk' diff --git a/apps/web/src/state/routing/utils.ts b/apps/web/src/state/routing/utils.ts index a53cafd5603..6d338f2c7ff 100644 --- a/apps/web/src/state/routing/utils.ts +++ b/apps/web/src/state/routing/utils.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { BigNumber } from '@ethersproject/bignumber' import { MixedRouteSDK } from '@uniswap/router-sdk' import { Currency, CurrencyAmount, Percent, Token, TradeType } from '@uniswap/sdk-core' diff --git a/apps/web/src/state/sagas/transactions/useSwapHandlers.test.ts b/apps/web/src/state/sagas/transactions/useSwapHandlers.test.ts new file mode 100644 index 00000000000..8f075d213a5 --- /dev/null +++ b/apps/web/src/state/sagas/transactions/useSwapHandlers.test.ts @@ -0,0 +1,470 @@ +import { FeeType, TradingApi } from '@universe/api' +import { useSwapCallback } from 'state/sagas/transactions/swapSaga' +import { useSwapHandlers, validateWrapParams } from 'state/sagas/transactions/useSwapHandlers' +import { renderHook } from 'test-utils/render' +import { AccountType } from 'uniswap/src/features/accounts/types' +import { DEFAULT_GAS_STRATEGY } from 'uniswap/src/features/gas/utils' +import { Platform } from 'uniswap/src/features/platforms/types/Platform' +import { ExecuteSwapParams } from 'uniswap/src/features/transactions/swap/types/swapHandlers' +import { + ValidatedClassicSwapTxAndGasInfo, + ValidatedSwapTxContext, +} from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' +import { isWrap } from 'uniswap/src/features/transactions/swap/utils/routing' +import { WrapType } from 'uniswap/src/features/transactions/types/wrap' +import { SignerMnemonicAccountDetails } from 'uniswap/src/features/wallet/types/AccountDetails' + +// Create mock functions in hoisted scope so they're available to vi.mock +const { mockSwapCallbackFn, mockWrapCallbackFn } = vi.hoisted(() => ({ + mockSwapCallbackFn: vi.fn(), + mockWrapCallbackFn: vi.fn(), +})) + +// Mock dependencies - only mock the hooks, not the sagas themselves +vi.mock('state/sagas/transactions/swapSaga', () => ({ + useSwapCallback: vi.fn(() => mockSwapCallbackFn), + swapSaga: { + wrappedSaga: vi.fn(), + actions: { + trigger: vi.fn(), + }, + }, +})) + +vi.mock('state/sagas/transactions/wrapSaga', () => ({ + useWrapCallback: vi.fn(() => mockWrapCallbackFn), + wrapSaga: { + wrappedSaga: vi.fn(), + actions: { + trigger: vi.fn(), + }, + }, +})) + +vi.mock('uniswap/src/features/transactions/swap/utils/routing', () => ({ + isWrap: vi.fn(), +})) + +describe('validateWrapParams', () => { + const mockInputCurrencyAmount = { + currency: { symbol: 'ETH' }, + quotient: BigInt(1000000000000000000), + } as any + + const mockAccount: SignerMnemonicAccountDetails = { + platform: Platform.EVM, + accountType: AccountType.SignerMnemonic, + address: '0x123', + walletMeta: { + id: 'test-wallet-id', + name: 'Test Wallet', + }, + } + + const mockSwapTxContext: ValidatedClassicSwapTxAndGasInfo = { + routing: TradingApi.Routing.CLASSIC, + txRequests: [ + { + chainId: 1, + to: '0xabc', + from: '0x123', + data: '0x', + value: '0', + }, + ], + gasFeeEstimation: { + wrapEstimate: { + gasLimit: '21000', + maxFeePerGas: '1000000000', + maxPriorityFeePerGas: '1000000000', + type: FeeType.EIP1559, + strategy: DEFAULT_GAS_STRATEGY, + gasFee: '21000000000000', + }, + }, + includesDelegation: false, + unsigned: false, + permit: undefined, + trade: {} as any, + approveTxRequest: undefined, + revocationTxRequest: undefined, + gasFee: { + value: '21000', + isLoading: false, + error: null, + }, + swapRequestArgs: undefined, + } + + it('should return validated params when all required fields are present', () => { + const params: ExecuteSwapParams = { + account: mockAccount, + swapTxContext: mockSwapTxContext, + isAutoSlippage: true, + onSuccess: vi.fn(), + onFailure: vi.fn(), + onPending: vi.fn(), + setCurrentStep: vi.fn(), + setSteps: vi.fn(), + wrapType: WrapType.Wrap, + inputCurrencyAmount: mockInputCurrencyAmount, + } + + const result = validateWrapParams(params) + + expect(result).toEqual({ + inputCurrencyAmount: mockInputCurrencyAmount, + wrapType: WrapType.Wrap, + }) + }) + + it('should throw error when inputCurrencyAmount is missing', () => { + const params: ExecuteSwapParams = { + account: mockAccount, + swapTxContext: mockSwapTxContext, + isAutoSlippage: true, + onSuccess: vi.fn(), + onFailure: vi.fn(), + onPending: vi.fn(), + setCurrentStep: vi.fn(), + setSteps: vi.fn(), + wrapType: WrapType.Wrap, + inputCurrencyAmount: undefined, + } + + expect(() => validateWrapParams(params)).toThrow('Missing required wrap parameters') + }) + + it('should throw error when wrapType is missing', () => { + const params: ExecuteSwapParams = { + account: mockAccount, + swapTxContext: mockSwapTxContext, + isAutoSlippage: true, + onSuccess: vi.fn(), + onFailure: vi.fn(), + onPending: vi.fn(), + setCurrentStep: vi.fn(), + setSteps: vi.fn(), + wrapType: undefined, + inputCurrencyAmount: mockInputCurrencyAmount, + } + + expect(() => validateWrapParams(params)).toThrow('Missing required wrap parameters') + }) + + it('should throw error when both wrapType and inputCurrencyAmount are missing', () => { + const params: ExecuteSwapParams = { + account: mockAccount, + swapTxContext: mockSwapTxContext, + isAutoSlippage: true, + onSuccess: vi.fn(), + onFailure: vi.fn(), + onPending: vi.fn(), + setCurrentStep: vi.fn(), + setSteps: vi.fn(), + wrapType: undefined, + inputCurrencyAmount: undefined, + } + + expect(() => validateWrapParams(params)).toThrow('Missing required wrap parameters') + }) +}) + +describe('useSwapHandlers', () => { + const mockOnSuccess = vi.fn() + const mockOnFailure = vi.fn() + const mockOnPending = vi.fn() + const mockSetCurrentStep = vi.fn() + const mockSetSteps = vi.fn() + + const mockAccount: SignerMnemonicAccountDetails = { + platform: Platform.EVM, + accountType: AccountType.SignerMnemonic, + address: '0x123', + walletMeta: { + id: 'test-wallet-id', + name: 'Test Wallet', + }, + } + + const mockSwapTxContext: ValidatedClassicSwapTxAndGasInfo = { + routing: TradingApi.Routing.CLASSIC, + txRequests: [ + { + chainId: 1, + to: '0xabc', + from: '0x123', + data: '0x', + value: '0', + }, + ], + gasFeeEstimation: { + wrapEstimate: { + gasLimit: '21000', + maxFeePerGas: '1000000000', + maxPriorityFeePerGas: '1000000000', + type: FeeType.EIP1559, + strategy: DEFAULT_GAS_STRATEGY, + gasFee: '21000000000000', + }, + }, + includesDelegation: false, + unsigned: false, + permit: undefined, + trade: {} as any, + approveTxRequest: undefined, + revocationTxRequest: undefined, + gasFee: { + value: '21000', + isLoading: false, + error: null, + }, + swapRequestArgs: undefined, + } + + const baseExecuteParams: ExecuteSwapParams = { + account: mockAccount, + swapTxContext: mockSwapTxContext, + isAutoSlippage: true, + onSuccess: mockOnSuccess, + onFailure: mockOnFailure, + onPending: mockOnPending, + setCurrentStep: mockSetCurrentStep, + setSteps: mockSetSteps, + } + + beforeEach(() => { + vi.clearAllMocks() + }) + + describe('prepareAndSign', () => { + it('should be a no-op callback that returns a promise', async () => { + const { result } = renderHook(() => useSwapHandlers()) + + await expect(result.current.prepareAndSign({ swapTxContext: mockSwapTxContext })).resolves.toBeUndefined() + }) + + it('should not call any callbacks', async () => { + const { result } = renderHook(() => useSwapHandlers()) + + await result.current.prepareAndSign({ swapTxContext: mockSwapTxContext }) + + expect(mockSwapCallbackFn).not.toHaveBeenCalled() + expect(mockWrapCallbackFn).not.toHaveBeenCalled() + }) + }) + + describe('execute', () => { + describe('when transaction is a wrap', () => { + beforeEach(() => { + vi.mocked(isWrap).mockReturnValue(true) + }) + + it('should call wrapCallback with correct parameters', async () => { + const mockInputCurrencyAmount = { + currency: { symbol: 'ETH' }, + quotient: BigInt(1000000000000000000), + } as any + + const params: ExecuteSwapParams = { + ...baseExecuteParams, + wrapType: WrapType.Wrap, + inputCurrencyAmount: mockInputCurrencyAmount, + txId: 'test-tx-id', + } + + const { result } = renderHook(() => useSwapHandlers()) + await result.current.execute(params) + + expect(mockWrapCallbackFn).toHaveBeenCalledWith({ + account: mockAccount, + inputCurrencyAmount: mockInputCurrencyAmount, + txRequest: mockSwapTxContext.txRequests![0], + txId: 'test-tx-id', + wrapType: WrapType.Wrap, + gasEstimate: mockSwapTxContext.gasFeeEstimation.wrapEstimate, + onSuccess: mockOnSuccess, + onFailure: mockOnFailure, + }) + expect(mockSwapCallbackFn).not.toHaveBeenCalled() + }) + + it('should call onFailure when inputCurrencyAmount is missing', async () => { + const params: ExecuteSwapParams = { + ...baseExecuteParams, + wrapType: WrapType.Wrap, + inputCurrencyAmount: undefined, + } + + const { result } = renderHook(() => useSwapHandlers()) + await result.current.execute(params) + + expect(mockOnFailure).toHaveBeenCalledWith(new Error('Missing required wrap parameters')) + expect(mockWrapCallbackFn).not.toHaveBeenCalled() + expect(mockSwapCallbackFn).not.toHaveBeenCalled() + }) + + it('should call onFailure when wrapType is missing', async () => { + const mockInputCurrencyAmount = { + currency: { symbol: 'ETH' }, + quotient: BigInt(1000000000000000000), + } as any + + const params: ExecuteSwapParams = { + ...baseExecuteParams, + wrapType: undefined, + inputCurrencyAmount: mockInputCurrencyAmount, + } + + const { result } = renderHook(() => useSwapHandlers()) + await result.current.execute(params) + + expect(mockOnFailure).toHaveBeenCalledWith(new Error('Missing required wrap parameters')) + expect(mockWrapCallbackFn).not.toHaveBeenCalled() + expect(mockSwapCallbackFn).not.toHaveBeenCalled() + }) + + it('should call onFailure when both wrapType and inputCurrencyAmount are missing', async () => { + const params: ExecuteSwapParams = { + ...baseExecuteParams, + wrapType: undefined, + inputCurrencyAmount: undefined, + } + + const { result } = renderHook(() => useSwapHandlers()) + await result.current.execute(params) + + expect(mockOnFailure).toHaveBeenCalledWith(new Error('Missing required wrap parameters')) + expect(mockWrapCallbackFn).not.toHaveBeenCalled() + expect(mockSwapCallbackFn).not.toHaveBeenCalled() + }) + }) + + describe('when transaction is a regular swap', () => { + beforeEach(() => { + vi.mocked(isWrap).mockReturnValue(false) + }) + + it('should call swapCallback with correct parameters', async () => { + const mockCurrencyInAmountUSD = { + currency: { symbol: 'USD' }, + quotient: BigInt(1000), + } as any + + const mockCurrencyOutAmountUSD = { + currency: { symbol: 'USD' }, + quotient: BigInt(2000), + } as any + + const params: ExecuteSwapParams = { + ...baseExecuteParams, + currencyInAmountUSD: mockCurrencyInAmountUSD, + currencyOutAmountUSD: mockCurrencyOutAmountUSD, + isAutoSlippage: false, + presetPercentage: 50, + preselectAsset: true, + txId: 'test-swap-tx-id', + isFiatInputMode: true, + } + + const { result } = renderHook(() => useSwapHandlers()) + await result.current.execute(params) + + expect(mockSwapCallbackFn).toHaveBeenCalledWith({ + account: mockAccount, + swapTxContext: mockSwapTxContext, + currencyInAmountUSD: mockCurrencyInAmountUSD, + currencyOutAmountUSD: mockCurrencyOutAmountUSD, + isAutoSlippage: false, + presetPercentage: 50, + preselectAsset: true, + onSuccess: mockOnSuccess, + onFailure: mockOnFailure, + onPending: mockOnPending, + txId: 'test-swap-tx-id', + setCurrentStep: mockSetCurrentStep, + setSteps: mockSetSteps, + isFiatInputMode: true, + includesDelegation: false, + }) + expect(mockWrapCallbackFn).not.toHaveBeenCalled() + }) + + it('should call swapCallback with optional parameters as undefined', async () => { + const params: ExecuteSwapParams = { + ...baseExecuteParams, + } + + const { result } = renderHook(() => useSwapHandlers()) + await result.current.execute(params) + + expect(mockSwapCallbackFn).toHaveBeenCalledWith({ + account: mockAccount, + swapTxContext: mockSwapTxContext, + currencyInAmountUSD: undefined, + currencyOutAmountUSD: undefined, + isAutoSlippage: true, + presetPercentage: undefined, + preselectAsset: undefined, + onSuccess: mockOnSuccess, + onFailure: mockOnFailure, + onPending: mockOnPending, + txId: undefined, + setCurrentStep: mockSetCurrentStep, + setSteps: mockSetSteps, + isFiatInputMode: undefined, + includesDelegation: false, + }) + expect(mockWrapCallbackFn).not.toHaveBeenCalled() + }) + + it('should pass includesDelegation from swapTxContext', async () => { + const txContextWithDelegation = { + ...mockSwapTxContext, + includesDelegation: true, + } as unknown as ValidatedSwapTxContext + + const params: ExecuteSwapParams = { + ...baseExecuteParams, + swapTxContext: txContextWithDelegation, + } + + const { result } = renderHook(() => useSwapHandlers()) + await result.current.execute(params) + + expect(mockSwapCallbackFn).toHaveBeenCalledWith( + expect.objectContaining({ + includesDelegation: true, + }), + ) + }) + }) + }) + + describe('memoization', () => { + it('should memoize the returned handlers object', () => { + const { result, rerender } = renderHook(() => useSwapHandlers()) + const firstResult = result.current + + rerender() + const secondResult = result.current + + expect(firstResult).toBe(secondResult) + }) + + it('should update handlers when dependencies change', () => { + const { result, rerender } = renderHook(() => useSwapHandlers()) + const firstResult = result.current + + // Change the mock implementation - clear and set new value + mockSwapCallbackFn.mockClear() + const newMockSwapCallback = vi.fn() + vi.mocked(useSwapCallback).mockReturnValueOnce(newMockSwapCallback) + + rerender() + const secondResult = result.current + + expect(firstResult).not.toBe(secondResult) + }) + }) +}) diff --git a/apps/web/src/state/sagas/transactions/useSwapHandlers.ts b/apps/web/src/state/sagas/transactions/useSwapHandlers.ts new file mode 100644 index 00000000000..8fb0a8040a5 --- /dev/null +++ b/apps/web/src/state/sagas/transactions/useSwapHandlers.ts @@ -0,0 +1,115 @@ +import { Currency, CurrencyAmount } from '@uniswap/sdk-core' +import { useCallback, useMemo } from 'react' +import { useSwapCallback } from 'state/sagas/transactions/swapSaga' +import { useWrapCallback } from 'state/sagas/transactions/wrapSaga' +import { + ExecuteSwapCallback, + ExecuteSwapParams, + PrepareSwapCallback, + SwapHandlers, +} from 'uniswap/src/features/transactions/swap/types/swapHandlers' +import { isWrap } from 'uniswap/src/features/transactions/swap/utils/routing' +import { WrapType } from 'uniswap/src/features/transactions/types/wrap' + +/** + * Validates that all required parameters for a wrap transaction are present. + * @throws {Error} If inputCurrencyAmount or wrapType is missing + * @returns Validated wrap parameters + */ +export function validateWrapParams(params: ExecuteSwapParams): { + inputCurrencyAmount: CurrencyAmount + wrapType: WrapType.Wrap | WrapType.Unwrap +} { + if (!params.inputCurrencyAmount || !params.wrapType) { + throw new Error('Missing required wrap parameters') + } + return { + inputCurrencyAmount: params.inputCurrencyAmount, + wrapType: params.wrapType, + } +} + +/** + * Web implementation of SwapHandlers that routes between swap and wrap callbacks. + * This provides a unified interface without implementing pre-signing (web doesn't need it). + */ +export function useSwapHandlers(): SwapHandlers { + const swapCallback = useSwapCallback() + const wrapCallback = useWrapCallback() + + // Web doesn't pre-sign transactions, so this is a no-op + const prepareAndSign: PrepareSwapCallback = useCallback(async () => {}, []) + + // Execute routes to the appropriate callback based on transaction type + const execute: ExecuteSwapCallback = useCallback( + async (params) => { + const { + account, + swapTxContext, + currencyInAmountUSD, + currencyOutAmountUSD, + isAutoSlippage, + presetPercentage, + preselectAsset, + onSuccess, + onFailure, + onPending, + txId, + setCurrentStep, + setSteps, + isFiatInputMode, + } = params + + // Route to appropriate callback based on transaction type + if (isWrap(swapTxContext)) { + // Handle wrap transactions + try { + const { inputCurrencyAmount, wrapType } = validateWrapParams(params) + const txRequest = swapTxContext.txRequests[0] + + wrapCallback({ + account, + inputCurrencyAmount, + txRequest, + txId, + wrapType, + gasEstimate: swapTxContext.gasFeeEstimation.wrapEstimate, + onSuccess, + onFailure, + }) + } catch (error) { + onFailure(error instanceof Error ? error : new Error('Unknown validation error')) + return + } + } else { + // Handle regular swap transactions + swapCallback({ + account, + swapTxContext, + currencyInAmountUSD, + currencyOutAmountUSD, + isAutoSlippage, + presetPercentage, + preselectAsset, + onSuccess, + onFailure, + onPending, + txId, + setCurrentStep, + setSteps, + isFiatInputMode, + includesDelegation: swapTxContext.includesDelegation, + }) + } + }, + [swapCallback, wrapCallback], + ) + + return useMemo( + () => ({ + prepareAndSign, + execute, + }), + [prepareAndSign, execute], + ) +} diff --git a/apps/web/src/state/sagas/transactions/utils.ts b/apps/web/src/state/sagas/transactions/utils.ts index 1905efecf5a..aedd28f7a63 100644 --- a/apps/web/src/state/sagas/transactions/utils.ts +++ b/apps/web/src/state/sagas/transactions/utils.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { datadogRum } from '@datadog/browser-rum' import type { TransactionResponse } from '@ethersproject/abstract-provider' import type { JsonRpcSigner, Web3Provider } from '@ethersproject/providers' diff --git a/apps/web/src/state/swap/hooks.tsx b/apps/web/src/state/swap/hooks.tsx index e95c837cd79..9666d5f81ec 100644 --- a/apps/web/src/state/swap/hooks.tsx +++ b/apps/web/src/state/swap/hooks.tsx @@ -259,9 +259,9 @@ export function useInitialCurrencyState(): { const { initialInputCurrencyAddress, initialChainId } = useMemo(() => { // Default to native if no query params or chain is not compatible with testnet or mainnet mode if (!hasCurrencyQueryParams || !isSupportedChainCompatible) { - const initialChainId = persistedFilteredChainIds?.input + const initialChainId = persistedFilteredChainIds?.input ?? defaultChainId return { - initialInputCurrencyAddress: getNativeAddress(initialChainId ?? defaultChainId), + initialInputCurrencyAddress: getNativeAddress(initialChainId), initialChainId, } } diff --git a/apps/web/src/state/walletCapabilities/hooks/useMismatchAccount.ts b/apps/web/src/state/walletCapabilities/hooks/useMismatchAccount.ts index 1b5633726c5..e4e7d3da995 100644 --- a/apps/web/src/state/walletCapabilities/hooks/useMismatchAccount.ts +++ b/apps/web/src/state/walletCapabilities/hooks/useMismatchAccount.ts @@ -12,7 +12,7 @@ import { selectHasShownMismatchToast } from 'uniswap/src/features/behaviorHistor import { setHasShownMismatchToast } from 'uniswap/src/features/behaviorHistory/slice' import { createHasMismatchUtil, type HasMismatchUtil } from 'uniswap/src/features/smartWallet/mismatch/mismatch' import { UniswapEventName } from 'uniswap/src/features/telemetry/constants' -import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send.web' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { getLogger } from 'utilities/src/logger/logger' import { useEvent } from 'utilities/src/react/hooks' diff --git a/apps/web/src/state/walletCapabilities/reducer.ts b/apps/web/src/state/walletCapabilities/reducer.ts index 3c4ee42b3a9..25e26757d0c 100644 --- a/apps/web/src/state/walletCapabilities/reducer.ts +++ b/apps/web/src/state/walletCapabilities/reducer.ts @@ -7,7 +7,7 @@ import { import type { GetCapabilitiesResult } from 'state/walletCapabilities/lib/types' import { GetCapabilitiesStatus, WalletCapabilitiesState } from 'state/walletCapabilities/types' import { InterfaceEventName } from 'uniswap/src/features/telemetry/constants' -import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send.web' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { InterfaceUserPropertyName, setUserProperty } from 'uniswap/src/features/telemetry/user' import { hexToNumber } from 'utilities/src/addresses/hex' diff --git a/apps/web/src/utils/showSwitchNetworkNotification.ts b/apps/web/src/utils/showSwitchNetworkNotification.ts index 55eab0d0d7a..a96d6a745c9 100644 --- a/apps/web/src/utils/showSwitchNetworkNotification.ts +++ b/apps/web/src/utils/showSwitchNetworkNotification.ts @@ -1,3 +1,4 @@ +import { POPUP_MEDIUM_DISMISS_MS } from 'components/Popups/constants' import { popupRegistry } from 'components/Popups/registry' import { PopupType, SwitchNetworkAction } from 'components/Popups/types' @@ -8,8 +9,6 @@ type SwitchNetworkNotificationCallbackType = { action: SwitchNetworkAction } -const POPUP_DURATION = 3000 - export function showSwitchNetworkNotification({ chainId, prevChainId, @@ -33,7 +32,7 @@ export function showSwitchNetworkNotification({ outputChainId, }, `bridge-${chainId}-to-${outputChainId}`, - POPUP_DURATION, + POPUP_MEDIUM_DISMISS_MS, ) break } else if (prevChainId) { @@ -44,7 +43,7 @@ export function showSwitchNetworkNotification({ action: SwitchNetworkAction.Swap, }, `switchNetwork-${chainId}`, - POPUP_DURATION, + POPUP_MEDIUM_DISMISS_MS, ) break } @@ -57,7 +56,7 @@ export function showSwitchNetworkNotification({ action, }, `switchNetwork-${chainId}`, - POPUP_DURATION, + POPUP_MEDIUM_DISMISS_MS, ) break } diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index 31f14d0e75b..37166c28172 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -45,9 +45,6 @@ "vite/*" ], "references": [ - { - "path": "../../packages/ui" - }, { "path": "../../packages/utilities" }, @@ -55,10 +52,19 @@ "path": "../../packages/uniswap" }, { - "path": "../../packages/api" + "path": "../../packages/ui" + }, + { + "path": "../../packages/sessions" }, { "path": "../../packages/gating" + }, + { + "path": "../../packages/notifications" + }, + { + "path": "../../packages/api" } ] } diff --git a/bun.lock b/bun.lock index d06d2a9e293..4d5718468f6 100644 --- a/bun.lock +++ b/bun.lock @@ -32,7 +32,6 @@ "i18next-parser": "8.6.0", "inquirer": "8.2.6", "js-yaml": "4.1.0", - "jsonc-parser": "3.2.0", "knip": "5.50.5", "lefthook": "1.12.2", "moti": "0.29.0", @@ -44,6 +43,34 @@ "wrangler": "4.28.0", }, }, + "apps/api-self-serve": { + "name": "api-self-serve", + "dependencies": { + "@react-router/node": "7.6.3", + "@react-router/serve": "7.6.3", + "class-variance-authority": "0.7.1", + "clsx": "2.1.1", + "isbot": "5.1.31", + "lucide-react": "0.548.0", + "react": "18.3.1", + "react-dom": "18.3.1", + "react-router": "7.6.3", + "tailwind-merge": "3.3.1", + "tailwindcss-animate": "1.0.7", + }, + "devDependencies": { + "@react-router/dev": "7.6.3", + "@tailwindcss/vite": "4.1.13", + "@types/node": "22.13.1", + "@types/react": "18.3.18", + "@uniswap/eslint-config": "workspace:^", + "eslint": "8.44.0", + "tailwindcss": "4.1.16", + "typescript": "5.3.3", + "vite": "npm:rolldown-vite@7.0.10", + "vite-tsconfig-paths": "5.1.4", + }, + }, "apps/extension": { "name": "@uniswap/extension", "version": "0.0.0", @@ -62,12 +89,14 @@ "@types/uuid": "9.0.1", "@uniswap/analytics-events": "2.43.0", "@uniswap/client-embeddedwallet": "0.0.16", + "@uniswap/sdk-core": "7.7.2", "@uniswap/uniswapx-sdk": "3.0.0-beta.7", "@uniswap/universal-router-sdk": "4.19.5", "@uniswap/v3-sdk": "3.25.2", "@uniswap/v4-sdk": "1.21.2", "@universe/api": "workspace:^", "@universe/gating": "workspace:^", + "@universe/sessions": "workspace:^", "@wxt-dev/module-react": "1.1.3", "confusing-browser-globals": "1.0.11", "dotenv-webpack": "8.0.1", @@ -198,6 +227,7 @@ "@uniswap/sdk-core": "7.7.2", "@universe/api": "workspace:^", "@universe/gating": "workspace:^", + "@universe/sessions": "workspace:^", "@walletconnect/core": "2.21.4", "@walletconnect/react-native-compat": "2.21.4", "@walletconnect/types": "2.21.4", @@ -381,6 +411,8 @@ "@uniswap/v4-sdk": "1.21.2", "@universe/api": "workspace:^", "@universe/gating": "workspace:^", + "@universe/notifications": "workspace:^", + "@universe/sessions": "workspace:^", "@visx/group": "2.17.0", "@visx/responsive": "3.12.0", "@visx/shape": "2.18.0", @@ -493,7 +525,7 @@ "@types/uuid": "9.0.1", "@types/wcag-contrast": "3.0.0", "@types/xml2js": "0.4.14", - "@uniswap/client-trading": "0.1.0", + "@uniswap/client-trading": "0.1.2", "@uniswap/default-token-list": "11.19.0", "@uniswap/eslint-config": "workspace:^", "@vercel/og": "0.5.8", @@ -590,7 +622,7 @@ "@uniswap/client-data-api": "0.0.18", "@uniswap/client-embeddedwallet": "0.0.16", "@uniswap/client-explore": "0.0.17", - "@uniswap/client-trading": "0.1.0", + "@uniswap/client-trading": "0.1.2", "@universe/config": "workspace:^", "@universe/sessions": "workspace:^", "expo-secure-store": "14.0.1", @@ -604,6 +636,7 @@ "@graphql-codegen/typescript-operations": "3.0.4", "@graphql-codegen/typescript-react-apollo": "3.3.7", "@graphql-codegen/typescript-resolvers": "3.2.1", + "@testing-library/react": "16.1.0", "@types/chrome": "0.0.304", "@types/node": "22.13.1", "@types/react": "18.3.18", @@ -707,12 +740,17 @@ "packages/notifications": { "name": "@universe/notifications", "version": "0.0.0", + "dependencies": { + "@tanstack/react-query": "5.77.2", + }, "devDependencies": { "@types/node": "22.13.1", "@uniswap/eslint-config": "workspace:^", + "@vitest/coverage-v8": "3.2.1", "depcheck": "1.4.7", "eslint": "8.44.0", "typescript": "5.3.3", + "vitest": "3.2.1", }, }, "packages/sessions": { @@ -722,7 +760,7 @@ "@connectrpc/connect": "1.4.0", "@connectrpc/connect-web": "1.4.0", "@tanstack/react-query": "5.77.2", - "@uniswap/client-platform-service": "0.0.5", + "@uniswap/client-platform-service": "0.0.6", "utilities": "workspace:^", }, "devDependencies": { @@ -805,6 +843,7 @@ "@bufbuild/protobuf": "1.10.0", "@connectrpc/connect": "1.4.0", "@connectrpc/connect-query": "1.4.1", + "@connectrpc/connect-web": "1.4.0", "@datadog/browser-logs": "5.20.0", "@datadog/browser-rum": "5.23.3", "@ethersproject/abstract-provider": "5.8.0", @@ -832,7 +871,7 @@ "@uniswap/client-embeddedwallet": "0.0.16", "@uniswap/client-explore": "0.0.17", "@uniswap/client-search": "0.0.10", - "@uniswap/client-trading": "0.1.0", + "@uniswap/client-trading": "0.1.2", "@uniswap/permit2-sdk": "1.3.0", "@uniswap/router-sdk": "2.0.2", "@uniswap/sdk-core": "7.7.2", @@ -990,7 +1029,6 @@ "@bufbuild/protobuf": "1.10.0", "@ethersproject/abstract-signer": "5.7.0", "@ethersproject/bignumber": "5.7.0", - "@ethersproject/constants": "5.7.0", "@ethersproject/contracts": "5.7.0", "@ethersproject/providers": "5.7.2", "@gorhom/bottom-sheet": "4.6.4", @@ -1004,7 +1042,6 @@ "@uniswap/permit2-sdk": "1.3.0", "@uniswap/router-sdk": "2.0.2", "@uniswap/sdk-core": "7.7.2", - "@uniswap/universal-router-sdk": "4.19.5", "@universe/api": "workspace:^", "@universe/gating": "workspace:^", "apollo3-cache-persist": "0.14.1", @@ -1077,7 +1114,6 @@ "multiformats@9.9.0": "patches/multiformats@9.9.0.patch", "react-native-reanimated@3.16.7": "patches/react-native-reanimated@3.16.7.patch", "@gorhom/bottom-sheet@4.6.4": "patches/@gorhom%2Fbottom-sheet@4.6.4.patch", - "lightweight-charts@4.1.1": "patches/lightweight-charts@4.1.1.patch", "react-native-tab-view@3.5.2": "patches/react-native-tab-view@3.5.2.patch", "react-native-context-menu-view@1.15.0": "patches/react-native-context-menu-view@1.15.0.patch", "@tamagui/web@1.125.17": "patches/@tamagui%2Fweb@1.125.17.patch", @@ -1197,89 +1233,89 @@ "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], - "@aws-sdk/client-cloudwatch-logs": ["@aws-sdk/client-cloudwatch-logs@3.913.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/eventstream-serde-browser": "^4.2.2", "@smithy/eventstream-serde-config-resolver": "^4.3.2", "@smithy/eventstream-serde-node": "^4.2.2", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-ztaUBCI6ps90O5sERy5ZP8aGC2+Ks9kvOJrdpGFMKcTVtyHP1xTB/FDfNvmz2s25S8W7yeCokvs1fvoKcLyniQ=="], + "@aws-sdk/client-cloudwatch-logs": ["@aws-sdk/client-cloudwatch-logs@3.917.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.916.0", "@aws-sdk/credential-provider-node": "3.917.0", "@aws-sdk/middleware-host-header": "3.914.0", "@aws-sdk/middleware-logger": "3.914.0", "@aws-sdk/middleware-recursion-detection": "3.914.0", "@aws-sdk/middleware-user-agent": "3.916.0", "@aws-sdk/region-config-resolver": "3.914.0", "@aws-sdk/types": "3.914.0", "@aws-sdk/util-endpoints": "3.916.0", "@aws-sdk/util-user-agent-browser": "3.914.0", "@aws-sdk/util-user-agent-node": "3.916.0", "@smithy/config-resolver": "^4.4.0", "@smithy/core": "^3.17.1", "@smithy/eventstream-serde-browser": "^4.2.3", "@smithy/eventstream-serde-config-resolver": "^4.3.3", "@smithy/eventstream-serde-node": "^4.2.3", "@smithy/fetch-http-handler": "^5.3.4", "@smithy/hash-node": "^4.2.3", "@smithy/invalid-dependency": "^4.2.3", "@smithy/middleware-content-length": "^4.2.3", "@smithy/middleware-endpoint": "^4.3.5", "@smithy/middleware-retry": "^4.4.5", "@smithy/middleware-serde": "^4.2.3", "@smithy/middleware-stack": "^4.2.3", "@smithy/node-config-provider": "^4.3.3", "@smithy/node-http-handler": "^4.4.3", "@smithy/protocol-http": "^5.3.3", "@smithy/smithy-client": "^4.9.1", "@smithy/types": "^4.8.0", "@smithy/url-parser": "^4.2.3", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.4", "@smithy/util-defaults-mode-node": "^4.2.6", "@smithy/util-endpoints": "^3.2.3", "@smithy/util-middleware": "^4.2.3", "@smithy/util-retry": "^4.2.3", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-AuiBx+Jq8KfQaQWnaJg2U7T4AzK6EeK4N5QZD27TX3zB1saa5aceAkFZqb57pjf/G+hGx3wv2Y93hLIxGg1oyg=="], - "@aws-sdk/client-cognito-identity": ["@aws-sdk/client-cognito-identity@3.913.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-TdEwasoXnLIb90z7NL1vLbEprzY0vdRqZH97ubIUDo8EaJ6WrJ35Um5g0rcnWKR6C+P9lKKI4mVv2BI2EwY94Q=="], + "@aws-sdk/client-cognito-identity": ["@aws-sdk/client-cognito-identity@3.916.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.916.0", "@aws-sdk/credential-provider-node": "3.916.0", "@aws-sdk/middleware-host-header": "3.914.0", "@aws-sdk/middleware-logger": "3.914.0", "@aws-sdk/middleware-recursion-detection": "3.914.0", "@aws-sdk/middleware-user-agent": "3.916.0", "@aws-sdk/region-config-resolver": "3.914.0", "@aws-sdk/types": "3.914.0", "@aws-sdk/util-endpoints": "3.916.0", "@aws-sdk/util-user-agent-browser": "3.914.0", "@aws-sdk/util-user-agent-node": "3.916.0", "@smithy/config-resolver": "^4.4.0", "@smithy/core": "^3.17.1", "@smithy/fetch-http-handler": "^5.3.4", "@smithy/hash-node": "^4.2.3", "@smithy/invalid-dependency": "^4.2.3", "@smithy/middleware-content-length": "^4.2.3", "@smithy/middleware-endpoint": "^4.3.5", "@smithy/middleware-retry": "^4.4.5", "@smithy/middleware-serde": "^4.2.3", "@smithy/middleware-stack": "^4.2.3", "@smithy/node-config-provider": "^4.3.3", "@smithy/node-http-handler": "^4.4.3", "@smithy/protocol-http": "^5.3.3", "@smithy/smithy-client": "^4.9.1", "@smithy/types": "^4.8.0", "@smithy/url-parser": "^4.2.3", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.4", "@smithy/util-defaults-mode-node": "^4.2.6", "@smithy/util-endpoints": "^3.2.3", "@smithy/util-middleware": "^4.2.3", "@smithy/util-retry": "^4.2.3", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-MGpWcn350e/liZrsh8gdJMcBKwE4/pcNvSr3Dw+tB+ZVZlVFdHGFyeQVaknz8UWZXrfUK5KCbvahotmaQOs1pg=="], - "@aws-sdk/client-iam": ["@aws-sdk/client-iam@3.913.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-3UR3EJ/2eutWpcs6LdtLl4JTJ4u/TZZEoLryUConEchrBNNtSVBG2CXrG7In1hS4l0t5TlkW/ruEZyLZJiqFfw=="], + "@aws-sdk/client-iam": ["@aws-sdk/client-iam@3.917.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.916.0", "@aws-sdk/credential-provider-node": "3.917.0", "@aws-sdk/middleware-host-header": "3.914.0", "@aws-sdk/middleware-logger": "3.914.0", "@aws-sdk/middleware-recursion-detection": "3.914.0", "@aws-sdk/middleware-user-agent": "3.916.0", "@aws-sdk/region-config-resolver": "3.914.0", "@aws-sdk/types": "3.914.0", "@aws-sdk/util-endpoints": "3.916.0", "@aws-sdk/util-user-agent-browser": "3.914.0", "@aws-sdk/util-user-agent-node": "3.916.0", "@smithy/config-resolver": "^4.4.0", "@smithy/core": "^3.17.1", "@smithy/fetch-http-handler": "^5.3.4", "@smithy/hash-node": "^4.2.3", "@smithy/invalid-dependency": "^4.2.3", "@smithy/middleware-content-length": "^4.2.3", "@smithy/middleware-endpoint": "^4.3.5", "@smithy/middleware-retry": "^4.4.5", "@smithy/middleware-serde": "^4.2.3", "@smithy/middleware-stack": "^4.2.3", "@smithy/node-config-provider": "^4.3.3", "@smithy/node-http-handler": "^4.4.3", "@smithy/protocol-http": "^5.3.3", "@smithy/smithy-client": "^4.9.1", "@smithy/types": "^4.8.0", "@smithy/url-parser": "^4.2.3", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.4", "@smithy/util-defaults-mode-node": "^4.2.6", "@smithy/util-endpoints": "^3.2.3", "@smithy/util-middleware": "^4.2.3", "@smithy/util-retry": "^4.2.3", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.3", "tslib": "^2.6.2" } }, "sha512-Q/vcxWhZSZr5nl6IgWpRHhE+8eaRM2hwe6IzBis4n34Ksj3HVhEUkFlpa5WfPr+80TJ9/8lXyuKeY/jfg/VUcA=="], - "@aws-sdk/client-lambda": ["@aws-sdk/client-lambda@3.913.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/eventstream-serde-browser": "^4.2.2", "@smithy/eventstream-serde-config-resolver": "^4.3.2", "@smithy/eventstream-serde-node": "^4.2.2", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-stream": "^4.5.2", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-Z1POaV/q+unF0G6PEDO0p6JrepJI6DXkVAl4RQiN1hZRshsfZxPQtsanKqMHLEi/OyhqnoVxy1buSNHjuumTdg=="], + "@aws-sdk/client-lambda": ["@aws-sdk/client-lambda@3.917.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.916.0", "@aws-sdk/credential-provider-node": "3.917.0", "@aws-sdk/middleware-host-header": "3.914.0", "@aws-sdk/middleware-logger": "3.914.0", "@aws-sdk/middleware-recursion-detection": "3.914.0", "@aws-sdk/middleware-user-agent": "3.916.0", "@aws-sdk/region-config-resolver": "3.914.0", "@aws-sdk/types": "3.914.0", "@aws-sdk/util-endpoints": "3.916.0", "@aws-sdk/util-user-agent-browser": "3.914.0", "@aws-sdk/util-user-agent-node": "3.916.0", "@smithy/config-resolver": "^4.4.0", "@smithy/core": "^3.17.1", "@smithy/eventstream-serde-browser": "^4.2.3", "@smithy/eventstream-serde-config-resolver": "^4.3.3", "@smithy/eventstream-serde-node": "^4.2.3", "@smithy/fetch-http-handler": "^5.3.4", "@smithy/hash-node": "^4.2.3", "@smithy/invalid-dependency": "^4.2.3", "@smithy/middleware-content-length": "^4.2.3", "@smithy/middleware-endpoint": "^4.3.5", "@smithy/middleware-retry": "^4.4.5", "@smithy/middleware-serde": "^4.2.3", "@smithy/middleware-stack": "^4.2.3", "@smithy/node-config-provider": "^4.3.3", "@smithy/node-http-handler": "^4.4.3", "@smithy/protocol-http": "^5.3.3", "@smithy/smithy-client": "^4.9.1", "@smithy/types": "^4.8.0", "@smithy/url-parser": "^4.2.3", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.4", "@smithy/util-defaults-mode-node": "^4.2.6", "@smithy/util-endpoints": "^3.2.3", "@smithy/util-middleware": "^4.2.3", "@smithy/util-retry": "^4.2.3", "@smithy/util-stream": "^4.5.4", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.3", "tslib": "^2.6.2" } }, "sha512-2KTwtR5KUt6IkVqTZXIlHu2lUNJxv5kAVUGfjHs2Gg0tZDNNveyFOdcya2tMxEOgbkSdkn5QsM/+A3bo3fLo6w=="], - "@aws-sdk/client-sfn": ["@aws-sdk/client-sfn@3.913.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-XVonl1v6mqz+FxevEvY+CBEOi+fTG3Ht2BTwWRM3F0XUwOo4ONH4+jo54rEEbq12zVW3M53k+rMfUDyy1pSLiw=="], + "@aws-sdk/client-sfn": ["@aws-sdk/client-sfn@3.917.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.916.0", "@aws-sdk/credential-provider-node": "3.917.0", "@aws-sdk/middleware-host-header": "3.914.0", "@aws-sdk/middleware-logger": "3.914.0", "@aws-sdk/middleware-recursion-detection": "3.914.0", "@aws-sdk/middleware-user-agent": "3.916.0", "@aws-sdk/region-config-resolver": "3.914.0", "@aws-sdk/types": "3.914.0", "@aws-sdk/util-endpoints": "3.916.0", "@aws-sdk/util-user-agent-browser": "3.914.0", "@aws-sdk/util-user-agent-node": "3.916.0", "@smithy/config-resolver": "^4.4.0", "@smithy/core": "^3.17.1", "@smithy/fetch-http-handler": "^5.3.4", "@smithy/hash-node": "^4.2.3", "@smithy/invalid-dependency": "^4.2.3", "@smithy/middleware-content-length": "^4.2.3", "@smithy/middleware-endpoint": "^4.3.5", "@smithy/middleware-retry": "^4.4.5", "@smithy/middleware-serde": "^4.2.3", "@smithy/middleware-stack": "^4.2.3", "@smithy/node-config-provider": "^4.3.3", "@smithy/node-http-handler": "^4.4.3", "@smithy/protocol-http": "^5.3.3", "@smithy/smithy-client": "^4.9.1", "@smithy/types": "^4.8.0", "@smithy/url-parser": "^4.2.3", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.4", "@smithy/util-defaults-mode-node": "^4.2.6", "@smithy/util-endpoints": "^3.2.3", "@smithy/util-middleware": "^4.2.3", "@smithy/util-retry": "^4.2.3", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-z6ta22wjkldIng9yECsCBcAW+f1I++FV4t3/Nzxtd9VI4cvsV6JZdWdplUPPl9EHvqw3p4qEMWrc8iSzEcM80A=="], - "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.911.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-N9QAeMvN3D1ZyKXkQp4aUgC4wUMuA5E1HuVCkajc0bq1pnH4PIke36YlrDGGREqPlyLFrXCkws2gbL5p23vtlg=="], + "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.916.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.916.0", "@aws-sdk/middleware-host-header": "3.914.0", "@aws-sdk/middleware-logger": "3.914.0", "@aws-sdk/middleware-recursion-detection": "3.914.0", "@aws-sdk/middleware-user-agent": "3.916.0", "@aws-sdk/region-config-resolver": "3.914.0", "@aws-sdk/types": "3.914.0", "@aws-sdk/util-endpoints": "3.916.0", "@aws-sdk/util-user-agent-browser": "3.914.0", "@aws-sdk/util-user-agent-node": "3.916.0", "@smithy/config-resolver": "^4.4.0", "@smithy/core": "^3.17.1", "@smithy/fetch-http-handler": "^5.3.4", "@smithy/hash-node": "^4.2.3", "@smithy/invalid-dependency": "^4.2.3", "@smithy/middleware-content-length": "^4.2.3", "@smithy/middleware-endpoint": "^4.3.5", "@smithy/middleware-retry": "^4.4.5", "@smithy/middleware-serde": "^4.2.3", "@smithy/middleware-stack": "^4.2.3", "@smithy/node-config-provider": "^4.3.3", "@smithy/node-http-handler": "^4.4.3", "@smithy/protocol-http": "^5.3.3", "@smithy/smithy-client": "^4.9.1", "@smithy/types": "^4.8.0", "@smithy/url-parser": "^4.2.3", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.4", "@smithy/util-defaults-mode-node": "^4.2.6", "@smithy/util-endpoints": "^3.2.3", "@smithy/util-middleware": "^4.2.3", "@smithy/util-retry": "^4.2.3", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-Eu4PtEUL1MyRvboQnoq5YKg0Z9vAni3ccebykJy615xokVZUdA3di2YxHM/hykDQX7lcUC62q9fVIvh0+UNk/w=="], - "@aws-sdk/core": ["@aws-sdk/core@3.911.0", "", { "dependencies": { "@aws-sdk/types": "3.910.0", "@aws-sdk/xml-builder": "3.911.0", "@smithy/core": "^3.16.1", "@smithy/node-config-provider": "^4.3.2", "@smithy/property-provider": "^4.2.2", "@smithy/protocol-http": "^5.3.2", "@smithy/signature-v4": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-k4QG9A+UCq/qlDJFmjozo6R0eXXfe++/KnCDMmajehIE9kh+b/5DqlGvAmbl9w4e92LOtrY6/DN3mIX1xs4sXw=="], + "@aws-sdk/core": ["@aws-sdk/core@3.916.0", "", { "dependencies": { "@aws-sdk/types": "3.914.0", "@aws-sdk/xml-builder": "3.914.0", "@smithy/core": "^3.17.1", "@smithy/node-config-provider": "^4.3.3", "@smithy/property-provider": "^4.2.3", "@smithy/protocol-http": "^5.3.3", "@smithy/signature-v4": "^5.3.3", "@smithy/smithy-client": "^4.9.1", "@smithy/types": "^4.8.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.3", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-1JHE5s6MD5PKGovmx/F1e01hUbds/1y3X8rD+Gvi/gWVfdg5noO7ZCerpRsWgfzgvCMZC9VicopBqNHCKLykZA=="], - "@aws-sdk/credential-provider-cognito-identity": ["@aws-sdk/credential-provider-cognito-identity@3.913.0", "", { "dependencies": { "@aws-sdk/client-cognito-identity": "3.913.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-AYZNpy3eEFzopzntLcrkEQQ1qyhg0V7BL8U77QdLSYtzoYvI9CqnWOGdWnNSEUp+Mpbk1VJyPzVfkDoDq5kX6g=="], + "@aws-sdk/credential-provider-cognito-identity": ["@aws-sdk/credential-provider-cognito-identity@3.916.0", "", { "dependencies": { "@aws-sdk/client-cognito-identity": "3.916.0", "@aws-sdk/types": "3.914.0", "@smithy/property-provider": "^4.2.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-B0KoCIzEb5e98qaIF6PyXVBEvbi7yyInSoSSpP7ZmlRxanB4an/h54q5QwHPN+zGBqrGBiXbz9HvOLP2c29yww=="], - "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-6FWRwWn3LUZzLhqBXB+TPMW2ijCWUqGICSw8bVakEdODrvbiv1RT/MVUayzFwz/ek6e6NKZn6DbSWzx07N9Hjw=="], + "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.916.0", "", { "dependencies": { "@aws-sdk/core": "3.916.0", "@aws-sdk/types": "3.914.0", "@smithy/property-provider": "^4.2.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-3gDeqOXcBRXGHScc6xb7358Lyf64NRG2P08g6Bu5mv1Vbg9PKDyCAZvhKLkG7hkdfAM8Yc6UJNhbFxr1ud/tCQ=="], - "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/node-http-handler": "^4.4.1", "@smithy/property-provider": "^4.2.2", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/util-stream": "^4.5.2", "tslib": "^2.6.2" } }, "sha512-xUlwKmIUW2fWP/eM3nF5u4CyLtOtyohlhGJ5jdsJokr3MrQ7w0tDITO43C9IhCn+28D5UbaiWnKw5ntkw7aVfA=="], + "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.916.0", "", { "dependencies": { "@aws-sdk/core": "3.916.0", "@aws-sdk/types": "3.914.0", "@smithy/fetch-http-handler": "^5.3.4", "@smithy/node-http-handler": "^4.4.3", "@smithy/property-provider": "^4.2.3", "@smithy/protocol-http": "^5.3.3", "@smithy/smithy-client": "^4.9.1", "@smithy/types": "^4.8.0", "@smithy/util-stream": "^4.5.4", "tslib": "^2.6.2" } }, "sha512-NmooA5Z4/kPFJdsyoJgDxuqXC1C6oPMmreJjbOPqcwo6E/h2jxaG8utlQFgXe5F9FeJsMx668dtxVxSYnAAqHQ=="], - "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.913.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-env": "3.911.0", "@aws-sdk/credential-provider-http": "3.911.0", "@aws-sdk/credential-provider-process": "3.911.0", "@aws-sdk/credential-provider-sso": "3.911.0", "@aws-sdk/credential-provider-web-identity": "3.911.0", "@aws-sdk/nested-clients": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/credential-provider-imds": "^4.2.2", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-iR4c4NQ1OSRKQi0SxzpwD+wP1fCy+QNKtEyCajuVlD0pvmoIHdrm5THK9e+2/7/SsQDRhOXHJfLGxHapD74WJw=="], + "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.917.0", "", { "dependencies": { "@aws-sdk/core": "3.916.0", "@aws-sdk/credential-provider-env": "3.916.0", "@aws-sdk/credential-provider-http": "3.916.0", "@aws-sdk/credential-provider-process": "3.916.0", "@aws-sdk/credential-provider-sso": "3.916.0", "@aws-sdk/credential-provider-web-identity": "3.917.0", "@aws-sdk/nested-clients": "3.916.0", "@aws-sdk/types": "3.914.0", "@smithy/credential-provider-imds": "^4.2.3", "@smithy/property-provider": "^4.2.3", "@smithy/shared-ini-file-loader": "^4.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-rvQ0QamLySRq+Okc0ZqFHZ3Fbvj3tYuWNIlzyEKklNmw5X5PM1idYKlOJflY2dvUGkIqY3lUC9SC2WL+1s7KIw=="], - "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.913.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.911.0", "@aws-sdk/credential-provider-http": "3.911.0", "@aws-sdk/credential-provider-ini": "3.913.0", "@aws-sdk/credential-provider-process": "3.911.0", "@aws-sdk/credential-provider-sso": "3.911.0", "@aws-sdk/credential-provider-web-identity": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/credential-provider-imds": "^4.2.2", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-HQPLkKDxS83Q/nZKqg9bq4igWzYQeOMqhpx5LYs4u1GwsKeCsYrrfz12Iu4IHNWPp9EnGLcmdfbfYuqZGrsaSQ=="], + "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.917.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.916.0", "@aws-sdk/credential-provider-http": "3.916.0", "@aws-sdk/credential-provider-ini": "3.917.0", "@aws-sdk/credential-provider-process": "3.916.0", "@aws-sdk/credential-provider-sso": "3.916.0", "@aws-sdk/credential-provider-web-identity": "3.917.0", "@aws-sdk/types": "3.914.0", "@smithy/credential-provider-imds": "^4.2.3", "@smithy/property-provider": "^4.2.3", "@smithy/shared-ini-file-loader": "^4.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-n7HUJ+TgU9wV/Z46yR1rqD9hUjfG50AKi+b5UXTlaDlVD8bckg40i77ROCllp53h32xQj/7H0yBIYyphwzLtmg=="], - "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-mKshhV5jRQffZjbK9x7bs+uC2IsYKfpzYaBamFsEov3xtARCpOiKaIlM8gYKFEbHT2M+1R3rYYlhhl9ndVWS2g=="], + "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.916.0", "", { "dependencies": { "@aws-sdk/core": "3.916.0", "@aws-sdk/types": "3.914.0", "@smithy/property-provider": "^4.2.3", "@smithy/shared-ini-file-loader": "^4.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-SXDyDvpJ1+WbotZDLJW1lqP6gYGaXfZJrgFSXIuZjHb75fKeNRgPkQX/wZDdUvCwdrscvxmtyJorp2sVYkMcvA=="], - "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.911.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.911.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/token-providers": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-JAxd4uWe0Zc9tk6+N0cVxe9XtJVcOx6Ms0k933ZU9QbuRMH6xti/wnZxp/IvGIWIDzf5fhqiGyw5MSyDeI5b1w=="], + "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.916.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.916.0", "@aws-sdk/core": "3.916.0", "@aws-sdk/token-providers": "3.916.0", "@aws-sdk/types": "3.914.0", "@smithy/property-provider": "^4.2.3", "@smithy/shared-ini-file-loader": "^4.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-gu9D+c+U/Dp1AKBcVxYHNNoZF9uD4wjAKYCjgSN37j4tDsazwMEylbbZLuRNuxfbXtizbo4/TiaxBXDbWM7AkQ=="], - "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/nested-clients": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-urIbXWWG+cm54RwwTFQuRwPH0WPsMFSDF2/H9qO2J2fKoHRURuyblFCyYG3aVKZGvFBhOizJYexf5+5w3CJKBw=="], + "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.917.0", "", { "dependencies": { "@aws-sdk/core": "3.916.0", "@aws-sdk/nested-clients": "3.916.0", "@aws-sdk/types": "3.914.0", "@smithy/property-provider": "^4.2.3", "@smithy/shared-ini-file-loader": "^4.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-pZncQhFbwW04pB0jcD5OFv3x2gAddDYCVxyJVixgyhSw7bKCYxqu6ramfq1NxyVpmm+qsw+ijwi/3cCmhUHF/A=="], - "@aws-sdk/credential-providers": ["@aws-sdk/credential-providers@3.913.0", "", { "dependencies": { "@aws-sdk/client-cognito-identity": "3.913.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-cognito-identity": "3.913.0", "@aws-sdk/credential-provider-env": "3.911.0", "@aws-sdk/credential-provider-http": "3.911.0", "@aws-sdk/credential-provider-ini": "3.913.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/credential-provider-process": "3.911.0", "@aws-sdk/credential-provider-sso": "3.911.0", "@aws-sdk/credential-provider-web-identity": "3.911.0", "@aws-sdk/nested-clients": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/credential-provider-imds": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/property-provider": "^4.2.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-KnkvoLXGszXNV7IMLdUH2Smo+tr4MiHUp2zkkrhl+6uXdSWpEAhlARSA8OPIxgVMabUW1AWDumN7Km7z0GvnWg=="], + "@aws-sdk/credential-providers": ["@aws-sdk/credential-providers@3.916.0", "", { "dependencies": { "@aws-sdk/client-cognito-identity": "3.916.0", "@aws-sdk/core": "3.916.0", "@aws-sdk/credential-provider-cognito-identity": "3.916.0", "@aws-sdk/credential-provider-env": "3.916.0", "@aws-sdk/credential-provider-http": "3.916.0", "@aws-sdk/credential-provider-ini": "3.916.0", "@aws-sdk/credential-provider-node": "3.916.0", "@aws-sdk/credential-provider-process": "3.916.0", "@aws-sdk/credential-provider-sso": "3.916.0", "@aws-sdk/credential-provider-web-identity": "3.916.0", "@aws-sdk/nested-clients": "3.916.0", "@aws-sdk/types": "3.914.0", "@smithy/config-resolver": "^4.4.0", "@smithy/core": "^3.17.1", "@smithy/credential-provider-imds": "^4.2.3", "@smithy/node-config-provider": "^4.3.3", "@smithy/property-provider": "^4.2.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-wazu2awF69ohF3AaDlYkD+tanaqwJ309o9GawNg3o1oW7orhdcvh6P8BftSjuIzuAMiauvQquxcUrNTLxHtvOA=="], - "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.910.0", "", { "dependencies": { "@aws-sdk/types": "3.910.0", "@smithy/protocol-http": "^5.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-F9Lqeu80/aTM6S/izZ8RtwSmjfhWjIuxX61LX+/9mxJyEkgaECRxv0chsLQsLHJumkGnXRy/eIyMLBhcTPF5vg=="], + "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.914.0", "", { "dependencies": { "@aws-sdk/types": "3.914.0", "@smithy/protocol-http": "^5.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-7r9ToySQ15+iIgXMF/h616PcQStByylVkCshmQqcdeynD/lCn2l667ynckxW4+ql0Q+Bo/URljuhJRxVJzydNA=="], - "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.910.0", "", { "dependencies": { "@aws-sdk/types": "3.910.0", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-3LJyyfs1USvRuRDla1pGlzGRtXJBXD1zC9F+eE9Iz/V5nkmhyv52A017CvKWmYoR0DM9dzjLyPOI0BSSppEaTw=="], + "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.914.0", "", { "dependencies": { "@aws-sdk/types": "3.914.0", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-/gaW2VENS5vKvJbcE1umV4Ag3NuiVzpsANxtrqISxT3ovyro29o1RezW/Avz/6oJqjnmgz8soe9J1t65jJdiNg=="], - "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.910.0", "", { "dependencies": { "@aws-sdk/types": "3.910.0", "@aws/lambda-invoke-store": "^0.0.1", "@smithy/protocol-http": "^5.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-m/oLz0EoCy+WoIVBnXRXJ4AtGpdl0kPE7U+VH9TsuUzHgxY1Re/176Q1HWLBRVlz4gr++lNsgsMWEC+VnAwMpw=="], + "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.914.0", "", { "dependencies": { "@aws-sdk/types": "3.914.0", "@aws/lambda-invoke-store": "^0.0.1", "@smithy/protocol-http": "^5.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-yiAjQKs5S2JKYc+GrkvGMwkUvhepXDigEXpSJqUseR/IrqHhvGNuOxDxq+8LbDhM4ajEW81wkiBbU+Jl9G82yQ=="], - "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@smithy/core": "^3.16.1", "@smithy/protocol-http": "^5.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-rY3LvGvgY/UI0nmt5f4DRzjEh8135A2TeHcva1bgOmVfOI4vkkGfA20sNRqerOkSO6hPbkxJapO50UJHFzmmyA=="], + "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.916.0", "", { "dependencies": { "@aws-sdk/core": "3.916.0", "@aws-sdk/types": "3.914.0", "@aws-sdk/util-endpoints": "3.916.0", "@smithy/core": "^3.17.1", "@smithy/protocol-http": "^5.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-mzF5AdrpQXc2SOmAoaQeHpDFsK2GE6EGcEACeNuoESluPI2uYMpuuNMYrUufdnIAIyqgKlis0NVxiahA5jG42w=="], - "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.911.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-lp/sXbdX/S0EYaMYPVKga0omjIUbNNdFi9IJITgKZkLC6CzspihIoHd5GIdl4esMJevtTQQfkVncXTFkf/a4YA=="], + "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.916.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.916.0", "@aws-sdk/middleware-host-header": "3.914.0", "@aws-sdk/middleware-logger": "3.914.0", "@aws-sdk/middleware-recursion-detection": "3.914.0", "@aws-sdk/middleware-user-agent": "3.916.0", "@aws-sdk/region-config-resolver": "3.914.0", "@aws-sdk/types": "3.914.0", "@aws-sdk/util-endpoints": "3.916.0", "@aws-sdk/util-user-agent-browser": "3.914.0", "@aws-sdk/util-user-agent-node": "3.916.0", "@smithy/config-resolver": "^4.4.0", "@smithy/core": "^3.17.1", "@smithy/fetch-http-handler": "^5.3.4", "@smithy/hash-node": "^4.2.3", "@smithy/invalid-dependency": "^4.2.3", "@smithy/middleware-content-length": "^4.2.3", "@smithy/middleware-endpoint": "^4.3.5", "@smithy/middleware-retry": "^4.4.5", "@smithy/middleware-serde": "^4.2.3", "@smithy/middleware-stack": "^4.2.3", "@smithy/node-config-provider": "^4.3.3", "@smithy/node-http-handler": "^4.4.3", "@smithy/protocol-http": "^5.3.3", "@smithy/smithy-client": "^4.9.1", "@smithy/types": "^4.8.0", "@smithy/url-parser": "^4.2.3", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.4", "@smithy/util-defaults-mode-node": "^4.2.6", "@smithy/util-endpoints": "^3.2.3", "@smithy/util-middleware": "^4.2.3", "@smithy/util-retry": "^4.2.3", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-tgg8e8AnVAer0rcgeWucFJ/uNN67TbTiDHfD+zIOPKep0Z61mrHEoeT/X8WxGIOkEn4W6nMpmS4ii8P42rNtnA=="], - "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.910.0", "", { "dependencies": { "@aws-sdk/types": "3.910.0", "@smithy/node-config-provider": "^4.3.2", "@smithy/types": "^4.7.1", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-gzQAkuHI3xyG6toYnH/pju+kc190XmvnB7X84vtN57GjgdQJICt9So/BD0U6h+eSfk9VBnafkVrAzBzWMEFZVw=="], + "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.914.0", "", { "dependencies": { "@aws-sdk/types": "3.914.0", "@smithy/config-resolver": "^4.4.0", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-KlmHhRbn1qdwXUdsdrJ7S/MAkkC1jLpQ11n+XvxUUUCGAJd1gjC7AjxPZUM7ieQ2zcb8bfEzIU7al+Q3ZT0u7Q=="], - "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/nested-clients": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-O1c5F1pbEImgEe3Vr8j1gpWu69UXWj3nN3vvLGh77hcrG5dZ8I27tSP5RN4Labm8Dnji/6ia+vqSYpN8w6KN5A=="], + "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.916.0", "", { "dependencies": { "@aws-sdk/core": "3.916.0", "@aws-sdk/nested-clients": "3.916.0", "@aws-sdk/types": "3.914.0", "@smithy/property-provider": "^4.2.3", "@smithy/shared-ini-file-loader": "^4.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-13GGOEgq5etbXulFCmYqhWtpcEQ6WI6U53dvXbheW0guut8fDFJZmEv7tKMTJgiybxh7JHd0rWcL9JQND8DwoQ=="], - "@aws-sdk/types": ["@aws-sdk/types@3.910.0", "", { "dependencies": { "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-o67gL3vjf4nhfmuSUNNkit0d62QJEwwHLxucwVJkR/rw9mfUtAWsgBs8Tp16cdUbMgsyQtCQilL8RAJDoGtadQ=="], + "@aws-sdk/types": ["@aws-sdk/types@3.914.0", "", { "dependencies": { "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-kQWPsRDmom4yvAfyG6L1lMmlwnTzm1XwMHOU+G5IFlsP4YEaMtXidDzW/wiivY0QFrhfCz/4TVmu0a2aPU57ug=="], - "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.910.0", "", { "dependencies": { "@aws-sdk/types": "3.910.0", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-endpoints": "^3.2.2", "tslib": "^2.6.2" } }, "sha512-6XgdNe42ibP8zCQgNGDWoOF53RfEKzpU/S7Z29FTTJ7hcZv0SytC0ZNQQZSx4rfBl036YWYwJRoJMlT4AA7q9A=="], + "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.916.0", "", { "dependencies": { "@aws-sdk/types": "3.914.0", "@smithy/types": "^4.8.0", "@smithy/url-parser": "^4.2.3", "@smithy/util-endpoints": "^3.2.3", "tslib": "^2.6.2" } }, "sha512-bAgUQwvixdsiGNcuZSDAOWbyHlnPtg8G8TyHD6DTfTmKTHUW6tAn+af/ZYJPXEzXhhpwgJqi58vWnsiDhmr7NQ=="], "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.893.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg=="], - "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.910.0", "", { "dependencies": { "@aws-sdk/types": "3.910.0", "@smithy/types": "^4.7.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-iOdrRdLZHrlINk9pezNZ82P/VxO/UmtmpaOAObUN+xplCUJu31WNM2EE/HccC8PQw6XlAudpdA6HDTGiW6yVGg=="], + "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.914.0", "", { "dependencies": { "@aws-sdk/types": "3.914.0", "@smithy/types": "^4.8.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-rMQUrM1ECH4kmIwlGl9UB0BtbHy6ZuKdWFrIknu8yGTRI/saAucqNTh5EI1vWBxZ0ElhK5+g7zOnUuhSmVQYUA=="], - "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.911.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/node-config-provider": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-3l+f6ooLF6Z6Lz0zGi7vSKSUYn/EePPizv88eZQpEAFunBHv+CSVNPtxhxHfkm7X9tTsV4QGZRIqo3taMLolmA=="], + "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.916.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.916.0", "@aws-sdk/types": "3.914.0", "@smithy/node-config-provider": "^4.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-CwfWV2ch6UdjuSV75ZU99N03seEUb31FIUrXBnwa6oONqj/xqXwrxtlUMLx6WH3OJEE4zI3zt5PjlTdGcVwf4g=="], - "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.911.0", "", { "dependencies": { "@smithy/types": "^4.7.1", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" } }, "sha512-/yh3oe26bZfCVGrIMRM9Z4hvvGJD+qx5tOLlydOkuBkm72aXON7D9+MucjJXTAcI8tF2Yq+JHa0478eHQOhnLg=="], + "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.914.0", "", { "dependencies": { "@smithy/types": "^4.8.0", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" } }, "sha512-k75evsBD5TcIjedycYS7QXQ98AmOtbnxRJOPtCo0IwYRmy7UvqgS/gBL5SmrIqeV6FDSYRQMgdBxSMp6MLmdew=="], "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.0.1", "", {}, "sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw=="], "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - "@babel/compat-data": ["@babel/compat-data@7.28.4", "", {}, "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw=="], + "@babel/compat-data": ["@babel/compat-data@7.28.5", "", {}, "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA=="], "@babel/core": ["@babel/core@7.26.0", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.0", "@babel/generator": "^7.26.0", "@babel/helper-compilation-targets": "^7.25.9", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.0", "@babel/parser": "^7.26.0", "@babel/template": "^7.25.9", "@babel/traverse": "^7.25.9", "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg=="], - "@babel/eslint-parser": ["@babel/eslint-parser@7.28.4", "", { "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.11.0", "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "sha512-Aa+yDiH87980jR6zvRfFuCR1+dLb00vBydhTL+zI992Rz/wQhSvuxjmOOuJOgO3XmakO6RykRGD2S1mq1AtgHA=="], + "@babel/eslint-parser": ["@babel/eslint-parser@7.28.5", "", { "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.11.0", "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "sha512-fcdRcWahONYo+JRnJg1/AekOacGvKx12Gu0qXJXFi2WBqQA1i7+O5PaxRB7kxE/Op94dExnCiiar6T09pvdHpA=="], - "@babel/generator": ["@babel/generator@7.28.3", "", { "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw=="], + "@babel/generator": ["@babel/generator@7.28.5", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ=="], "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], - "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.3", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.3", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg=="], + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.5", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ=="], - "@babel/helper-create-regexp-features-plugin": ["@babel/helper-create-regexp-features-plugin@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ=="], + "@babel/helper-create-regexp-features-plugin": ["@babel/helper-create-regexp-features-plugin@7.28.5", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw=="], "@babel/helper-define-polyfill-provider": ["@babel/helper-define-polyfill-provider@0.6.5", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "debug": "^4.4.1", "lodash.debounce": "^4.0.8", "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg=="], "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], - "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA=="], + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.28.5", "", { "dependencies": { "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5" } }, "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg=="], "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], @@ -1297,7 +1333,7 @@ "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], - "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], @@ -1307,9 +1343,9 @@ "@babel/highlight": ["@babel/highlight@7.25.9", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw=="], - "@babel/parser": ["@babel/parser@7.28.4", "", { "dependencies": { "@babel/types": "^7.28.4" }, "bin": "./bin/babel-parser.js" }, "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg=="], + "@babel/parser": ["@babel/parser@7.28.5", "", { "dependencies": { "@babel/types": "^7.28.5" }, "bin": "./bin/babel-parser.js" }, "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="], - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ["@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA=="], + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ["@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q=="], "@babel/plugin-bugfix-safari-class-field-initializer-scope": ["@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA=="], @@ -1397,7 +1433,7 @@ "@babel/plugin-transform-block-scoped-functions": ["@babel/plugin-transform-block-scoped-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg=="], - "@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.28.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A=="], + "@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g=="], "@babel/plugin-transform-class-properties": ["@babel/plugin-transform-class-properties@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA=="], @@ -1407,7 +1443,7 @@ "@babel/plugin-transform-computed-properties": ["@babel/plugin-transform-computed-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/template": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw=="], - "@babel/plugin-transform-destructuring": ["@babel/plugin-transform-destructuring@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A=="], + "@babel/plugin-transform-destructuring": ["@babel/plugin-transform-destructuring@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw=="], "@babel/plugin-transform-dotall-regex": ["@babel/plugin-transform-dotall-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw=="], @@ -1417,7 +1453,7 @@ "@babel/plugin-transform-dynamic-import": ["@babel/plugin-transform-dynamic-import@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A=="], - "@babel/plugin-transform-exponentiation-operator": ["@babel/plugin-transform-exponentiation-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ=="], + "@babel/plugin-transform-exponentiation-operator": ["@babel/plugin-transform-exponentiation-operator@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw=="], "@babel/plugin-transform-export-namespace-from": ["@babel/plugin-transform-export-namespace-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ=="], @@ -1431,7 +1467,7 @@ "@babel/plugin-transform-literals": ["@babel/plugin-transform-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA=="], - "@babel/plugin-transform-logical-assignment-operators": ["@babel/plugin-transform-logical-assignment-operators@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw=="], + "@babel/plugin-transform-logical-assignment-operators": ["@babel/plugin-transform-logical-assignment-operators@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA=="], "@babel/plugin-transform-member-expression-literals": ["@babel/plugin-transform-member-expression-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ=="], @@ -1439,7 +1475,7 @@ "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw=="], - "@babel/plugin-transform-modules-systemjs": ["@babel/plugin-transform-modules-systemjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA=="], + "@babel/plugin-transform-modules-systemjs": ["@babel/plugin-transform-modules-systemjs@7.28.5", "", { "dependencies": { "@babel/helper-module-transforms": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew=="], "@babel/plugin-transform-modules-umd": ["@babel/plugin-transform-modules-umd@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w=="], @@ -1457,7 +1493,7 @@ "@babel/plugin-transform-optional-catch-binding": ["@babel/plugin-transform-optional-catch-binding@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q=="], - "@babel/plugin-transform-optional-chaining": ["@babel/plugin-transform-optional-chaining@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg=="], + "@babel/plugin-transform-optional-chaining": ["@babel/plugin-transform-optional-chaining@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ=="], "@babel/plugin-transform-parameters": ["@babel/plugin-transform-parameters@7.27.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg=="], @@ -1487,7 +1523,7 @@ "@babel/plugin-transform-reserved-words": ["@babel/plugin-transform-reserved-words@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw=="], - "@babel/plugin-transform-runtime": ["@babel/plugin-transform-runtime@7.28.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg=="], + "@babel/plugin-transform-runtime": ["@babel/plugin-transform-runtime@7.28.5", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w=="], "@babel/plugin-transform-shorthand-properties": ["@babel/plugin-transform-shorthand-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ=="], @@ -1499,7 +1535,7 @@ "@babel/plugin-transform-typeof-symbol": ["@babel/plugin-transform-typeof-symbol@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw=="], - "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg=="], + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.5", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA=="], "@babel/plugin-transform-unicode-escapes": ["@babel/plugin-transform-unicode-escapes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg=="], @@ -1515,7 +1551,7 @@ "@babel/preset-modules": ["@babel/preset-modules@0.1.6-no-external-plugins", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA=="], - "@babel/preset-react": ["@babel/preset-react@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-transform-react-display-name": "^7.27.1", "@babel/plugin-transform-react-jsx": "^7.27.1", "@babel/plugin-transform-react-jsx-development": "^7.27.1", "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA=="], + "@babel/preset-react": ["@babel/preset-react@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-transform-react-display-name": "^7.28.0", "@babel/plugin-transform-react-jsx": "^7.27.1", "@babel/plugin-transform-react-jsx-development": "^7.27.1", "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ=="], "@babel/preset-typescript": ["@babel/preset-typescript@7.26.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-validator-option": "^7.25.9", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-transform-modules-commonjs": "^7.25.9", "@babel/plugin-transform-typescript": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg=="], @@ -1525,11 +1561,11 @@ "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], - "@babel/traverse": ["@babel/traverse@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/types": "^7.28.4", "debug": "^4.3.1" } }, "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ=="], + "@babel/traverse": ["@babel/traverse@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "debug": "^4.3.1" } }, "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ=="], - "@babel/traverse--for-generate-function-map": ["@babel/traverse@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/types": "^7.28.4", "debug": "^4.3.1" } }, "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ=="], + "@babel/traverse--for-generate-function-map": ["@babel/traverse@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "debug": "^4.3.1" } }, "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ=="], - "@babel/types": ["@babel/types@7.28.4", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q=="], + "@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="], "@bcoe/v8-coverage": ["@bcoe/v8-coverage@1.0.2", "", {}, "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA=="], @@ -1721,9 +1757,9 @@ "@egjs/hammerjs": ["@egjs/hammerjs@2.0.17", "", { "dependencies": { "@types/hammerjs": "^2.0.36" } }, "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A=="], - "@emnapi/core": ["@emnapi/core@1.5.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg=="], + "@emnapi/core": ["@emnapi/core@1.6.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg=="], - "@emnapi/runtime": ["@emnapi/runtime@1.5.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ=="], + "@emnapi/runtime": ["@emnapi/runtime@1.6.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA=="], "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], @@ -1809,7 +1845,7 @@ "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], - "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], "@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="], @@ -2423,6 +2459,12 @@ "@npmcli/fs": ["@npmcli/fs@3.1.1", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg=="], + "@npmcli/git": ["@npmcli/git@4.1.0", "", { "dependencies": { "@npmcli/promise-spawn": "^6.0.0", "lru-cache": "^7.4.4", "npm-pick-manifest": "^8.0.0", "proc-log": "^3.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^3.0.0" } }, "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ=="], + + "@npmcli/package-json": ["@npmcli/package-json@4.0.1", "", { "dependencies": { "@npmcli/git": "^4.1.0", "glob": "^10.2.2", "hosted-git-info": "^6.1.1", "json-parse-even-better-errors": "^3.0.0", "normalize-package-data": "^5.0.0", "proc-log": "^3.0.0", "semver": "^7.5.3" } }, "sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q=="], + + "@npmcli/promise-spawn": ["@npmcli/promise-spawn@6.0.2", "", { "dependencies": { "which": "^3.0.0" } }, "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg=="], + "@nx/devkit": ["@nx/devkit@21.3.11", "", { "dependencies": { "ejs": "^3.1.7", "enquirer": "~2.3.6", "ignore": "^5.0.4", "minimatch": "9.0.3", "semver": "^7.5.3", "tmp": "~0.2.1", "tslib": "^2.3.0", "yargs-parser": "21.1.1" }, "peerDependencies": { "nx": "21.3.11" } }, "sha512-JOV8TAa9K5+ZwTA/EUi0g5qcKEg5vmi0AyOUsrNUHlv3BgQnwZtPLDDTPPZ+ezq24o6YzgwueZWj3CLEdMHEDg=="], "@nx/eslint": ["@nx/eslint@21.3.11", "", { "dependencies": { "@nx/devkit": "21.3.11", "@nx/js": "21.3.11", "semver": "^7.5.3", "tslib": "^2.3.0", "typescript": "~5.8.2" }, "peerDependencies": { "@zkochan/js-yaml": "0.0.7", "eslint": "^8.0.0 || ^9.0.0" }, "optionalPeers": ["@zkochan/js-yaml"] }, "sha512-9jeD8QuU3OMcItjtw0QHl5cwohLeA9R+lajNJoOjS2tUGXTHWb8NOcEZBXWMcML+eV1iloIDW8/P4jV4BYqP2w=="], @@ -2673,19 +2715,27 @@ "@react-navigation/stack": ["@react-navigation/stack@7.3.2", "", { "dependencies": { "@react-navigation/elements": "^2.4.2", "color": "^4.2.3" }, "peerDependencies": { "@react-navigation/native": "^7.1.9", "react": ">= 18.2.0", "react-native": "*", "react-native-gesture-handler": ">= 2.0.0", "react-native-safe-area-context": ">= 4.0.0", "react-native-screens": ">= 4.0.0" } }, "sha512-DAkuLCguUFjeOTmNtklMZSQJPcG3sl5h5M7VVms4xdGHO6RtNJ3ntJGTXYK/yFcDedLURKqBlJl5+4yTLORitQ=="], + "@react-router/dev": ["@react-router/dev@7.6.3", "", { "dependencies": { "@babel/core": "^7.21.8", "@babel/generator": "^7.21.5", "@babel/parser": "^7.21.8", "@babel/plugin-syntax-decorators": "^7.22.10", "@babel/plugin-syntax-jsx": "^7.21.4", "@babel/preset-typescript": "^7.21.5", "@babel/traverse": "^7.23.2", "@babel/types": "^7.22.5", "@npmcli/package-json": "^4.0.1", "@react-router/node": "7.6.3", "arg": "^5.0.1", "babel-dead-code-elimination": "^1.0.6", "chokidar": "^4.0.0", "dedent": "^1.5.3", "es-module-lexer": "^1.3.1", "exit-hook": "2.2.1", "jsesc": "3.0.2", "lodash": "^4.17.21", "pathe": "^1.1.2", "picocolors": "^1.1.1", "prettier": "^2.7.1", "react-refresh": "^0.14.0", "semver": "^7.3.7", "set-cookie-parser": "^2.6.0", "tinyglobby": "^0.2.14", "valibot": "^0.41.0", "vite-node": "^3.1.4" }, "peerDependencies": { "@react-router/serve": "^7.6.3", "react-router": "^7.6.3", "typescript": "^5.1.0", "vite": "^5.1.0 || ^6.0.0 || ^7.0.0", "wrangler": "^3.28.2 || ^4.0.0" }, "optionalPeers": ["@react-router/serve", "typescript", "wrangler"], "bin": { "react-router": "bin.js" } }, "sha512-nnJQMVeE+LDViFTQDxeQV5FcfJ48a6aCScrFHwPHWgViQmiJxUBtDU1Pl7XZKEoTus5KDg/W3Vz2spiY6wXg3Q=="], + + "@react-router/express": ["@react-router/express@7.6.3", "", { "dependencies": { "@react-router/node": "7.6.3" }, "peerDependencies": { "express": "^4.17.1 || ^5", "react-router": "7.6.3", "typescript": "^5.1.0" }, "optionalPeers": ["typescript"] }, "sha512-45wLv2pNVDfnd4mZXYaxbqGE2wOzisQQAXSCHrWhkUn9CvJkaqC9cx82rzfB1UnGvyeupZxGgLxaG0b38pTEOA=="], + + "@react-router/node": ["@react-router/node@7.6.3", "", { "dependencies": { "@mjackson/node-fetch-server": "^0.2.0" }, "peerDependencies": { "react-router": "7.6.3", "typescript": "^5.1.0" }, "optionalPeers": ["typescript"] }, "sha512-CgqYAGjrfW/Al0LbWhQ60joDci5/H3ix4IU5UwlKLtqmNPzuSUTBkCrxit3jHuMYqaBaGfyRpT7kIeb1YZ4nqA=="], + + "@react-router/serve": ["@react-router/serve@7.6.3", "", { "dependencies": { "@react-router/express": "7.6.3", "@react-router/node": "7.6.3", "compression": "^1.7.4", "express": "^4.19.2", "get-port": "5.1.1", "morgan": "^1.10.0", "source-map-support": "^0.5.21" }, "peerDependencies": { "react-router": "7.6.3" }, "bin": { "react-router-serve": "bin.js" } }, "sha512-SbIXApeaNPM9rCkrcFU+VXYXCIh332cT2L0ikykWBCe6O9ZGE6Y1q5ZQ8puEf5Pmqwm77kIRoY9rACUbnXzfxA=="], + "@redux-devtools/extension": ["@redux-devtools/extension@3.3.0", "", { "dependencies": { "@babel/runtime": "^7.23.2", "immutable": "^4.3.4" }, "peerDependencies": { "redux": "^3.1.0 || ^4.0.0 || ^5.0.0" } }, "sha512-X34S/rC8S/M1BIrkYD1mJ5f8vlH0BDqxXrs96cvxSBo4FhMdbhU+GUGsmNYov1xjSyLMHgo8NYrUG8bNX7525g=="], "@redux-saga/core": ["@redux-saga/core@1.2.3", "", { "dependencies": { "@babel/runtime": "^7.6.3", "@redux-saga/deferred": "^1.2.1", "@redux-saga/delay-p": "^1.2.1", "@redux-saga/is": "^1.1.3", "@redux-saga/symbols": "^1.1.3", "@redux-saga/types": "^1.2.1", "redux": "^4.0.4", "typescript-tuple": "^2.2.1" } }, "sha512-U1JO6ncFBAklFTwoQ3mjAeQZ6QGutsJzwNBjgVLSWDpZTRhobUzuVDS1qH3SKGJD8fvqoaYOjp6XJ3gCmeZWgA=="], - "@redux-saga/deferred": ["@redux-saga/deferred@1.2.1", "", {}, "sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g=="], + "@redux-saga/deferred": ["@redux-saga/deferred@1.3.1", "", {}, "sha512-0YZ4DUivWojXBqLB/TmuRRpDDz7tyq1I0AuDV7qi01XlLhM5m51W7+xYtIckH5U2cMlv9eAuicsfRAi1XHpXIg=="], - "@redux-saga/delay-p": ["@redux-saga/delay-p@1.2.1", "", { "dependencies": { "@redux-saga/symbols": "^1.1.3" } }, "sha512-MdiDxZdvb1m+Y0s4/hgdcAXntpUytr9g0hpcOO1XFVyyzkrDu3SKPgBFOtHn7lhu7n24ZKIAT1qtKyQjHqRd+w=="], + "@redux-saga/delay-p": ["@redux-saga/delay-p@1.3.1", "", { "dependencies": { "@redux-saga/symbols": "^1.2.1" } }, "sha512-597I7L5MXbD/1i3EmcaOOjL/5suxJD7p5tnbV1PiWnE28c2cYiIHqmSMK2s7us2/UrhOL2KTNBiD0qBg6KnImg=="], - "@redux-saga/is": ["@redux-saga/is@1.1.3", "", { "dependencies": { "@redux-saga/symbols": "^1.1.3", "@redux-saga/types": "^1.2.1" } }, "sha512-naXrkETG1jLRfVfhOx/ZdLj0EyAzHYbgJWkXbB3qFliPcHKiWbv/ULQryOAEKyjrhiclmr6AMdgsXFyx7/yE6Q=="], + "@redux-saga/is": ["@redux-saga/is@1.2.1", "", { "dependencies": { "@redux-saga/symbols": "^1.2.1", "@redux-saga/types": "^1.3.1" } }, "sha512-x3aWtX3GmQfEvn8dh0ovPbsXgK9JjpiR24wKztpGbZP8JZUWWvUgKrvnWZ/T/4iphOBftyVc9VrIwhAnsM+OFA=="], - "@redux-saga/symbols": ["@redux-saga/symbols@1.1.3", "", {}, "sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg=="], + "@redux-saga/symbols": ["@redux-saga/symbols@1.2.1", "", {}, "sha512-3dh+uDvpBXi7EUp/eO+N7eFM4xKaU4yuGBXc50KnZGzIrR/vlvkTFQsX13zsY8PB6sCFYAgROfPSRUj8331QSA=="], - "@redux-saga/types": ["@redux-saga/types@1.2.1", "", {}, "sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA=="], + "@redux-saga/types": ["@redux-saga/types@1.3.1", "", {}, "sha512-YRCrJdhQLobGIQ8Cj1sta3nn6DrZDTSUnrIYhS2e5V590BmfVDleKoAquclAiKSBKWJwmuXTb+b4BL6rSHnahw=="], "@reduxjs/toolkit": ["@reduxjs/toolkit@1.9.3", "", { "dependencies": { "immer": "^9.0.16", "redux": "^4.2.0", "redux-thunk": "^2.4.2", "reselect": "^4.1.7" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18", "react-redux": "^7.2.1 || ^8.0.2" }, "optionalPeers": ["react", "react-redux"] }, "sha512-GU2TNBQVofL09VGmuSioNPQIu6Ml0YLf4EJhgj0AvBadRlCGzUWet8372LjvO4fqKZF2vH1xU0htAa7BrK9pZg=="], @@ -2709,7 +2759,7 @@ "@reown/walletkit": ["@reown/walletkit@1.2.8", "", { "dependencies": { "@walletconnect/core": "2.21.4", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/logger": "2.1.2", "@walletconnect/sign-client": "2.21.4", "@walletconnect/types": "2.21.4", "@walletconnect/utils": "2.21.4" } }, "sha512-X3EO9P6+Dvc++h8OwpBtBhGmq+890UlG/o0Ilb98l5ByDr3QVcYOURRIPVcV6pkTJ9sE6sVDXW7RIRiYSnQp2g=="], - "@repeaterjs/repeater": ["@repeaterjs/repeater@3.0.4", "", {}, "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA=="], + "@repeaterjs/repeater": ["@repeaterjs/repeater@3.0.6", "", {}, "sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA=="], "@resvg/resvg-wasm": ["@resvg/resvg-wasm@2.4.1", "", {}, "sha512-yi6R0HyHtsoWTRA06Col4WoDs7SvlXU3DLMNP2bdAgs7HK18dTEVl1weXgxRzi8gwLteGUbIg29zulxIB3GSdg=="], @@ -2833,15 +2883,15 @@ "@slack/types": ["@slack/types@2.15.0", "", {}, "sha512-livb1gyG3J8ATLBJ3KjZfjHpTRz9btY1m5cgNuXxWJbhwRB1Gwb8Ly6XLJm2Sy1W6h+vLgqIHg7IwKrF1C1Szg=="], - "@slack/web-api": ["@slack/web-api@7.11.0", "", { "dependencies": { "@slack/logger": "^4.0.0", "@slack/types": "^2.17.0", "@types/node": ">=18.0.0", "@types/retry": "0.12.0", "axios": "^1.11.0", "eventemitter3": "^5.0.1", "form-data": "^4.0.4", "is-electron": "2.2.2", "is-stream": "^2", "p-queue": "^6", "p-retry": "^4", "retry": "^0.13.1" } }, "sha512-m+dGluB7OTebNqEt7wRXyvUfjUGLBuqN4ZAjEmQvu7oeKmVNBXO+mQbH9nop0f/GCvkGK52aaoOWz0H1ole2xg=="], + "@slack/web-api": ["@slack/web-api@7.12.0", "", { "dependencies": { "@slack/logger": "^4.0.0", "@slack/types": "^2.18.0", "@types/node": ">=18.0.0", "@types/retry": "0.12.0", "axios": "^1.11.0", "eventemitter3": "^5.0.1", "form-data": "^4.0.4", "is-electron": "2.2.2", "is-stream": "^2", "p-queue": "^6", "p-retry": "^4", "retry": "^0.13.1" } }, "sha512-LrDxjYyqjeYYQGVdVZ6EYHunFmzveOr2pFpShr6TzW4KNFpdNNnpKekjtMg0PJlOsMibSySLGQqiBZQDasmRCA=="], "@slack/webhook": ["@slack/webhook@7.0.6", "", { "dependencies": { "@slack/types": "^2.9.0", "@types/node": ">=18.0.0", "axios": "^1.11.0" } }, "sha512-RvNCcOjNbzl5uQ2TZsbTJ+A+5ptoWMwnyd/W4lKzeXFToIwebeaZiuntcP0usmhZHj1LH9H1T9WN6Bt1B/DLyg=="], "@smithy/abort-controller": ["@smithy/abort-controller@4.2.3", "", { "dependencies": { "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-xWL9Mf8b7tIFuAlpjKtRPnHrR8XVrwTj5NPYO/QwZPtc0SDLsPxb56V5tzi5yspSMytISHybifez+4jlrx0vkQ=="], - "@smithy/config-resolver": ["@smithy/config-resolver@4.3.3", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.3", "@smithy/types": "^4.8.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.3", "tslib": "^2.6.2" } }, "sha512-xSql8A1Bl41O9JvGU/CtgiLBlwkvpHTSKRlvz9zOBvBCPjXghZ6ZkcVzmV2f7FLAA+80+aqKmIOmy8pEDrtCaw=="], + "@smithy/config-resolver": ["@smithy/config-resolver@4.4.0", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.3", "@smithy/types": "^4.8.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-endpoints": "^3.2.3", "@smithy/util-middleware": "^4.2.3", "tslib": "^2.6.2" } }, "sha512-Kkmz3Mup2PGp/HNJxhCWkLNdlajJORLSjwkcfrj0E7nu6STAEdcMR1ir5P9/xOmncx8xXfru0fbUYLlZog/cFg=="], - "@smithy/core": ["@smithy/core@3.17.0", "", { "dependencies": { "@smithy/middleware-serde": "^4.2.3", "@smithy/protocol-http": "^5.3.3", "@smithy/types": "^4.8.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-middleware": "^4.2.3", "@smithy/util-stream": "^4.5.3", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-Tir3DbfoTO97fEGUZjzGeoXgcQAUBRDTmuH9A8lxuP8ATrgezrAJ6cLuRvwdKN4ZbYNlHgKlBX69Hyu3THYhtg=="], + "@smithy/core": ["@smithy/core@3.17.1", "", { "dependencies": { "@smithy/middleware-serde": "^4.2.3", "@smithy/protocol-http": "^5.3.3", "@smithy/types": "^4.8.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-middleware": "^4.2.3", "@smithy/util-stream": "^4.5.4", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-V4Qc2CIb5McABYfaGiIYLTmo/vwNIK7WXI5aGveBd9UcdhbOMwcvIMxIw/DJj1S9QgOMa/7FBkarMdIC0EOTEQ=="], "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.2.3", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.3", "@smithy/property-provider": "^4.2.3", "@smithy/types": "^4.8.0", "@smithy/url-parser": "^4.2.3", "tslib": "^2.6.2" } }, "sha512-hA1MQ/WAHly4SYltJKitEsIDVsNmXcQfYBRv2e+q04fnqtAX5qXaybxy/fhUeAMCnQIdAjaGDb04fMHQefWRhw=="], @@ -2865,9 +2915,9 @@ "@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.2.3", "", { "dependencies": { "@smithy/protocol-http": "^5.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-/atXLsT88GwKtfp5Jr0Ks1CSa4+lB+IgRnkNrrYP0h1wL4swHNb0YONEvTceNKNdZGJsye+W2HH8W7olbcPUeA=="], - "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.3.4", "", { "dependencies": { "@smithy/core": "^3.17.0", "@smithy/middleware-serde": "^4.2.3", "@smithy/node-config-provider": "^4.3.3", "@smithy/shared-ini-file-loader": "^4.3.3", "@smithy/types": "^4.8.0", "@smithy/url-parser": "^4.2.3", "@smithy/util-middleware": "^4.2.3", "tslib": "^2.6.2" } }, "sha512-/RJhpYkMOaUZoJEkddamGPPIYeKICKXOu/ojhn85dKDM0n5iDIhjvYAQLP3K5FPhgB203O3GpWzoK2OehEoIUw=="], + "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.3.5", "", { "dependencies": { "@smithy/core": "^3.17.1", "@smithy/middleware-serde": "^4.2.3", "@smithy/node-config-provider": "^4.3.3", "@smithy/shared-ini-file-loader": "^4.3.3", "@smithy/types": "^4.8.0", "@smithy/url-parser": "^4.2.3", "@smithy/util-middleware": "^4.2.3", "tslib": "^2.6.2" } }, "sha512-SIzKVTvEudFWJbxAaq7f2GvP3jh2FHDpIFI6/VAf4FOWGFZy0vnYMPSRj8PGYI8Hjt29mvmwSRgKuO3bK4ixDw=="], - "@smithy/middleware-retry": ["@smithy/middleware-retry@4.4.4", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.3", "@smithy/protocol-http": "^5.3.3", "@smithy/service-error-classification": "^4.2.3", "@smithy/smithy-client": "^4.9.0", "@smithy/types": "^4.8.0", "@smithy/util-middleware": "^4.2.3", "@smithy/util-retry": "^4.2.3", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-vSgABQAkuUHRO03AhR2rWxVQ1un284lkBn+NFawzdahmzksAoOeVMnXXsuPViL4GlhRHXqFaMlc8Mj04OfQk1w=="], + "@smithy/middleware-retry": ["@smithy/middleware-retry@4.4.5", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.3", "@smithy/protocol-http": "^5.3.3", "@smithy/service-error-classification": "^4.2.3", "@smithy/smithy-client": "^4.9.1", "@smithy/types": "^4.8.0", "@smithy/util-middleware": "^4.2.3", "@smithy/util-retry": "^4.2.3", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-DCaXbQqcZ4tONMvvdz+zccDE21sLcbwWoNqzPLFlZaxt1lDtOE2tlVpRSwcTOJrjJSUThdgEYn7HrX5oLGlK9A=="], "@smithy/middleware-serde": ["@smithy/middleware-serde@4.2.3", "", { "dependencies": { "@smithy/protocol-http": "^5.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-8g4NuUINpYccxiCXM5s1/V+uLtts8NcX4+sPEbvYQDZk4XoJfDpq5y2FQxfmUL89syoldpzNzA0R9nhzdtdKnQ=="], @@ -2875,7 +2925,7 @@ "@smithy/node-config-provider": ["@smithy/node-config-provider@4.3.3", "", { "dependencies": { "@smithy/property-provider": "^4.2.3", "@smithy/shared-ini-file-loader": "^4.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-NzI1eBpBSViOav8NVy1fqOlSfkLgkUjUTlohUSgAEhHaFWA3XJiLditvavIP7OpvTjDp5u2LhtlBhkBlEisMwA=="], - "@smithy/node-http-handler": ["@smithy/node-http-handler@4.4.2", "", { "dependencies": { "@smithy/abort-controller": "^4.2.3", "@smithy/protocol-http": "^5.3.3", "@smithy/querystring-builder": "^4.2.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-MHFvTjts24cjGo1byXqhXrbqm7uznFD/ESFx8npHMWTFQVdBZjrT1hKottmp69LBTRm/JQzP/sn1vPt0/r6AYQ=="], + "@smithy/node-http-handler": ["@smithy/node-http-handler@4.4.3", "", { "dependencies": { "@smithy/abort-controller": "^4.2.3", "@smithy/protocol-http": "^5.3.3", "@smithy/querystring-builder": "^4.2.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-MAwltrDB0lZB/H6/2M5PIsISSwdI5yIh6DaBB9r0Flo9nx3y0dzl/qTMJPd7tJvPdsx6Ks/cwVzheGNYzXyNbQ=="], "@smithy/property-provider": ["@smithy/property-provider@2.2.0", "", { "dependencies": { "@smithy/types": "^2.12.0", "tslib": "^2.6.2" } }, "sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg=="], @@ -2891,7 +2941,7 @@ "@smithy/signature-v4": ["@smithy/signature-v4@5.3.3", "", { "dependencies": { "@smithy/is-array-buffer": "^4.2.0", "@smithy/protocol-http": "^5.3.3", "@smithy/types": "^4.8.0", "@smithy/util-hex-encoding": "^4.2.0", "@smithy/util-middleware": "^4.2.3", "@smithy/util-uri-escape": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-CmSlUy+eEYbIEYN5N3vvQTRfqt0lJlQkaQUIf+oizu7BbDut0pozfDjBGecfcfWf7c62Yis4JIEgqQ/TCfodaA=="], - "@smithy/smithy-client": ["@smithy/smithy-client@4.9.0", "", { "dependencies": { "@smithy/core": "^3.17.0", "@smithy/middleware-endpoint": "^4.3.4", "@smithy/middleware-stack": "^4.2.3", "@smithy/protocol-http": "^5.3.3", "@smithy/types": "^4.8.0", "@smithy/util-stream": "^4.5.3", "tslib": "^2.6.2" } }, "sha512-qz7RTd15GGdwJ3ZCeBKLDQuUQ88m+skh2hJwcpPm1VqLeKzgZvXf6SrNbxvx7uOqvvkjCMXqx3YB5PDJyk00ww=="], + "@smithy/smithy-client": ["@smithy/smithy-client@4.9.1", "", { "dependencies": { "@smithy/core": "^3.17.1", "@smithy/middleware-endpoint": "^4.3.5", "@smithy/middleware-stack": "^4.2.3", "@smithy/protocol-http": "^5.3.3", "@smithy/types": "^4.8.0", "@smithy/util-stream": "^4.5.4", "tslib": "^2.6.2" } }, "sha512-Ngb95ryR5A9xqvQFT5mAmYkCwbXvoLavLFwmi7zVg/IowFPCfiqRfkOKnbc/ZRL8ZKJ4f+Tp6kSu6wjDQb8L/g=="], "@smithy/types": ["@smithy/types@4.8.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ=="], @@ -2907,9 +2957,9 @@ "@smithy/util-config-provider": ["@smithy/util-config-provider@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q=="], - "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.3.3", "", { "dependencies": { "@smithy/property-provider": "^4.2.3", "@smithy/smithy-client": "^4.9.0", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-vqHoybAuZXbFXZqgzquiUXtdY+UT/aU33sxa4GBPkiYklmR20LlCn+d3Wc3yA5ZM13gQ92SZe/D8xh6hkjx+IQ=="], + "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.3.4", "", { "dependencies": { "@smithy/property-provider": "^4.2.3", "@smithy/smithy-client": "^4.9.1", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-qI5PJSW52rnutos8Bln8nwQZRpyoSRN6k2ajyoUHNMUzmWqHnOJCnDELJuV6m5PML0VkHI+XcXzdB+6awiqYUw=="], - "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.2.4", "", { "dependencies": { "@smithy/config-resolver": "^4.3.3", "@smithy/credential-provider-imds": "^4.2.3", "@smithy/node-config-provider": "^4.3.3", "@smithy/property-provider": "^4.2.3", "@smithy/smithy-client": "^4.9.0", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-X5/xrPHedifo7hJUUWKlpxVb2oDOiqPUXlvsZv1EZSjILoutLiJyWva3coBpn00e/gPSpH8Rn2eIbgdwHQdW7Q=="], + "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.2.6", "", { "dependencies": { "@smithy/config-resolver": "^4.4.0", "@smithy/credential-provider-imds": "^4.2.3", "@smithy/node-config-provider": "^4.3.3", "@smithy/property-provider": "^4.2.3", "@smithy/smithy-client": "^4.9.1", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-c6M/ceBTm31YdcFpgfgQAJaw3KbaLuRKnAz91iMWFLSrgxRpYm03c3bu5cpYojNMfkV9arCUelelKA7XQT36SQ=="], "@smithy/util-endpoints": ["@smithy/util-endpoints@3.2.3", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-aCfxUOVv0CzBIkU10TubdgKSx5uRvzH064kaiPEWfNIvKOtNpu642P4FP1hgOFkjQIkDObrfIDnKMKkeyrejvQ=="], @@ -2919,7 +2969,7 @@ "@smithy/util-retry": ["@smithy/util-retry@2.2.0", "", { "dependencies": { "@smithy/service-error-classification": "^2.1.5", "@smithy/types": "^2.12.0", "tslib": "^2.6.2" } }, "sha512-q9+pAFPTfftHXRytmZ7GzLFFrEGavqapFc06XxzZFcSIGERXMerXxCitjOG1prVDR9QdjqotF40SWvbqcCpf8g=="], - "@smithy/util-stream": ["@smithy/util-stream@4.5.3", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.3.4", "@smithy/node-http-handler": "^4.4.2", "@smithy/types": "^4.8.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-hex-encoding": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-oZvn8a5bwwQBNYHT2eNo0EU8Kkby3jeIg1P2Lu9EQtqDxki1LIjGRJM6dJ5CZUig8QmLxWxqOKWvg3mVoOBs5A=="], + "@smithy/util-stream": ["@smithy/util-stream@4.5.4", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.3.4", "@smithy/node-http-handler": "^4.4.3", "@smithy/types": "^4.8.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-hex-encoding": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-+qDxSkiErejw1BAIXUFBSfM5xh3arbz1MmxlbMCKanDDZtVEQ7PSKW9FQS0Vud1eI/kYn0oCTVKyNzRlq+9MUw=="], "@smithy/util-uri-escape": ["@smithy/util-uri-escape@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA=="], @@ -2975,7 +3025,7 @@ "@sparkfabrik/react-native-idfa-aaid": ["@sparkfabrik/react-native-idfa-aaid@1.2.0", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-Cczob0A4FsX/kZ6YK23YnrkmsFYfhYcTRXPNnnnbAbbhngHw7MJ1N6RTwVr0/vYQMiY12TYgbeShFYExjY2bUA=="], - "@speed-highlight/core": ["@speed-highlight/core@1.2.7", "", {}, "sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g=="], + "@speed-highlight/core": ["@speed-highlight/core@1.2.8", "", {}, "sha512-IGytNtnUnPIobIbOq5Y6LIlqiHNX+vnToQIS7lj6L5819C+rA8TXRDkkG8vePsiBOGcoW9R6i+dp2YBUKdB09Q=="], "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], @@ -3161,6 +3211,36 @@ "@szmarczak/http-timer": ["@szmarczak/http-timer@1.1.2", "", { "dependencies": { "defer-to-connect": "^1.0.1" } }, "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA=="], + "@tailwindcss/node": ["@tailwindcss/node@4.1.13", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.5.1", "lightningcss": "1.30.1", "magic-string": "^0.30.18", "source-map-js": "^1.2.1", "tailwindcss": "4.1.13" } }, "sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw=="], + + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.13", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.13", "@tailwindcss/oxide-darwin-arm64": "4.1.13", "@tailwindcss/oxide-darwin-x64": "4.1.13", "@tailwindcss/oxide-freebsd-x64": "4.1.13", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.13", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.13", "@tailwindcss/oxide-linux-arm64-musl": "4.1.13", "@tailwindcss/oxide-linux-x64-gnu": "4.1.13", "@tailwindcss/oxide-linux-x64-musl": "4.1.13", "@tailwindcss/oxide-wasm32-wasi": "4.1.13", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.13", "@tailwindcss/oxide-win32-x64-msvc": "4.1.13" } }, "sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA=="], + + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.13", "", { "os": "android", "cpu": "arm64" }, "sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew=="], + + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.13", "", { "os": "darwin", "cpu": "arm64" }, "sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ=="], + + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.13", "", { "os": "darwin", "cpu": "x64" }, "sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw=="], + + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.13", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ=="], + + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.13", "", { "os": "linux", "cpu": "arm" }, "sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw=="], + + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ=="], + + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.13", "", { "os": "linux", "cpu": "x64" }, "sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ=="], + + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.13", "", { "os": "linux", "cpu": "x64" }, "sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ=="], + + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.13", "", { "dependencies": { "@emnapi/core": "^1.4.5", "@emnapi/runtime": "^1.4.5", "@emnapi/wasi-threads": "^1.0.4", "@napi-rs/wasm-runtime": "^0.2.12", "@tybys/wasm-util": "^0.10.0", "tslib": "^2.8.0" }, "cpu": "none" }, "sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA=="], + + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.13", "", { "os": "win32", "cpu": "arm64" }, "sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg=="], + + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.13", "", { "os": "win32", "cpu": "x64" }, "sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw=="], + + "@tailwindcss/vite": ["@tailwindcss/vite@4.1.13", "", { "dependencies": { "@tailwindcss/node": "4.1.13", "@tailwindcss/oxide": "4.1.13", "tailwindcss": "4.1.13" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-0PmqLQ010N58SbMTJ7BVJ4I2xopiQn/5i6nlb4JmxzQf8zcS5+m2Cv6tqh+sfDwtIdjoEnOvwsGQ1hkUi8QEHQ=="], + "@tamagui/accordion": ["@tamagui/accordion@1.125.17", "", { "dependencies": { "@tamagui/collapsible": "1.125.17", "@tamagui/collection": "1.125.17", "@tamagui/compose-refs": "1.125.17", "@tamagui/constants": "1.125.17", "@tamagui/core": "1.125.17", "@tamagui/create-context": "1.125.17", "@tamagui/polyfill-dev": "1.125.17", "@tamagui/stacks": "1.125.17", "@tamagui/text": "1.125.17", "@tamagui/use-controllable-state": "1.125.17" }, "peerDependencies": { "react": "*" } }, "sha512-c4xIsb/wWBI3EU3sOduQF13obQFLy8n1+J0jlya79teQjyWJdIpWAkuB6ri+eRiQXFTgRmoH+fsGY2qwEac8hw=="], "@tamagui/adapt": ["@tamagui/adapt@1.125.17", "", { "dependencies": { "@tamagui/constants": "1.125.17", "@tamagui/core": "1.125.17", "@tamagui/helpers": "1.125.17", "@tamagui/portal": "1.125.17", "@tamagui/z-index-stack": "1.125.17" } }, "sha512-BR8+Cys9OPwN8cTjwzVZSJ6h7IvHQagNmu/PFPPyRoVc3DidItn7H3lTQXiF9FMLLULdX6+zelYnTZaKTGDsEg=="], @@ -3447,7 +3527,7 @@ "@types/caseless": ["@types/caseless@0.12.5", "", {}, "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg=="], - "@types/chai": ["@types/chai@5.2.2", "", { "dependencies": { "@types/deep-eql": "*" } }, "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg=="], + "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="], "@types/chrome": ["@types/chrome@0.0.304", "", { "dependencies": { "@types/filesystem": "*", "@types/har-format": "*" } }, "sha512-ms9CLILU+FEMK7gcmgz/Mtn2E81YQWiMIzCFF8ktp98EVNIIfoqaDTD4+ailOCq1sGjbnEmfJxQ1FAsQtk5M3A=="], @@ -3531,7 +3611,7 @@ "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], - "@types/express": ["@types/express@4.17.23", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ=="], + "@types/express": ["@types/express@4.17.24", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "sha512-Mbrt4SRlXSTWryOnHAh2d4UQ/E7n9lZyGSi6KgX+4hkuL9soYbLOVXVhnk/ODp12YsGc95f4pOvqywJ6kngUwg=="], "@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.7", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg=="], @@ -3559,7 +3639,7 @@ "@types/http-errors": ["@types/http-errors@2.0.5", "", {}, "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg=="], - "@types/http-proxy": ["@types/http-proxy@1.17.16", "", { "dependencies": { "@types/node": "*" } }, "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w=="], + "@types/http-proxy": ["@types/http-proxy@1.17.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw=="], "@types/inquirer": ["@types/inquirer@9.0.8", "", { "dependencies": { "@types/through": "*", "rxjs": "^7.2.0" } }, "sha512-CgPD5kFGWsb8HJ5K7rfWlifao87m4ph8uioU7OTncJevmE/VLIqAAjfQtko578JZg7/f69K4FgqYym3gNr7DeA=="], @@ -3655,11 +3735,11 @@ "@types/semver": ["@types/semver@7.7.1", "", {}, "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA=="], - "@types/send": ["@types/send@0.17.5", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w=="], + "@types/send": ["@types/send@0.17.6", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="], "@types/serve-index": ["@types/serve-index@1.9.4", "", { "dependencies": { "@types/express": "*" } }, "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug=="], - "@types/serve-static": ["@types/serve-static@1.15.9", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "<1" } }, "sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA=="], + "@types/serve-static": ["@types/serve-static@1.15.10", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "<1" } }, "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw=="], "@types/sockjs": ["@types/sockjs@0.3.36", "", { "dependencies": { "@types/node": "*" } }, "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q=="], @@ -3695,12 +3775,10 @@ "@types/xml2js": ["@types/xml2js@0.4.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ=="], - "@types/yargs": ["@types/yargs@17.0.33", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA=="], + "@types/yargs": ["@types/yargs@17.0.34", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A=="], "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], - "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], - "@types/zxcvbn": ["@types/zxcvbn@4.4.2", "", {}, "sha512-T7SEL8b/eN7AEhHQ8oFt7c6Y+l3p8OpH7KwJIe+5oBOPLMMioPeMsUTB3huNgEnXhiittV8Ohdw21Jg8E/f70Q=="], "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@6.20.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.20.0", "@typescript-eslint/type-utils": "6.20.0", "@typescript-eslint/utils": "6.20.0", "@typescript-eslint/visitor-keys": "6.20.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-fTwGQUnjhoYHeSF6m5pWNkzmDDdsKELYrOBxhjMrofPqCkoC2k3B2wvGHFxa1CTIqkEn88nlW1HVMztjo2K8Hg=="], @@ -3733,11 +3811,11 @@ "@uniswap/client-explore": ["@uniswap/client-explore@0.0.17", "", {}, "sha512-k9iw893eclMhguG6nm3zF0leffvRpuQYeSznVKuZbi7fbRhuIwOBDLqOql1jKN1RVEk4Ml1bIWUfj2/VTvyMsA=="], - "@uniswap/client-platform-service": ["@uniswap/client-platform-service@0.0.5", "", {}, "sha512-vqxYuCRpddynuaF9+umgIEdo6EYFb+8VJvamjT6E1p1fx0MC0YATWfQvASzKkPS6oKjKzUBQz8nxCLT+v7aNNg=="], + "@uniswap/client-platform-service": ["@uniswap/client-platform-service@0.0.6", "", {}, "sha512-Y4pGCicASZWRpBN3Of4XzI3PN/mB8Ty08aLmz1wCLZGP+BvJbtx56R93kJHEzS9uouKFCSH9RVV7xBkAgiASXg=="], "@uniswap/client-search": ["@uniswap/client-search@0.0.10", "", {}, "sha512-ykHIxTR0dRtI3dK1ubHu2jNe+hfhDjyUfqA/dlNVrjM67GLYjF1Ls4kWi/cfR131XeRWj9gVsZv30CgzkOicAQ=="], - "@uniswap/client-trading": ["@uniswap/client-trading@0.1.0", "", {}, "sha512-LWjbAUk3TFvWOlfbXweyME12EUmO6jEQPiCM9jaHA6pWtlWOWPbQcCXuDWy3iwHklupoqhnyiLGj8CFgvpl0lA=="], + "@uniswap/client-trading": ["@uniswap/client-trading@0.1.2", "", {}, "sha512-97gBRUytNo0TDCw+z3tPJxENmi9N4JFj+DjDHIGs12ag74gJTFhtvUVRISXg89y3ie1JbrWY97gQzgOFK/mw6A=="], "@uniswap/default-token-list": ["@uniswap/default-token-list@11.19.0", "", {}, "sha512-H/YLpxeZUrzT4Ki8mi4k5UiadREiLHg7WUqCv0Qt/VkOjX2mIBhrxCj1Wh61/J7lK0XqOjksfpm6RG1+YErPoQ=="], @@ -4021,7 +4099,7 @@ "@wxt-dev/module-react": ["@wxt-dev/module-react@1.1.3", "", { "dependencies": { "@vitejs/plugin-react": "^4.3.4" }, "peerDependencies": { "wxt": ">=0.19.16" } }, "sha512-ede2FLS3sdJwtyI61jvY1UiF194ouv3wxm+fCYjfP4FfvoXQbif8UuusYBC0KSa/L2AL9Cfa/lEvsdNYrKFUaA=="], - "@wxt-dev/storage": ["@wxt-dev/storage@1.2.5", "", { "dependencies": { "@wxt-dev/browser": "workspace:^", "async-mutex": "^0.5.0", "dequal": "^2.0.3" } }, "sha512-EwYRKi41IzWNSNxgm3Inf4haQ740+QpM2hwFLFfe5ICSIkYhdCdCJ4g7gYE98LA9X5vIp+EgJw5x/pZ8fgK6ug=="], + "@wxt-dev/storage": ["@wxt-dev/storage@1.2.6", "", { "dependencies": { "@wxt-dev/browser": "^0.1.4", "async-mutex": "^0.5.0", "dequal": "^2.0.3" } }, "sha512-f6AknnpJvhNHW4s0WqwSGCuZAj0fjP3EVNPBO5kB30pY+3Zt/nqZGqJN6FgBLCSkYjPJ8VL1hNX5LMVmvxQoDw=="], "@xmldom/xmldom": ["@xmldom/xmldom@0.7.7", "", {}, "sha512-RwEdIYho2kjbSZ7fpvhkHy5wk1Y3x0O6e/EHL3/SoiAfFWH+yhV2/XZQvsBoAeGRNFwgScJS/gRZv+uIwoj7yA=="], @@ -4105,6 +4183,8 @@ "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + "api-self-serve": ["api-self-serve@workspace:apps/api-self-serve"], + "apisauce": ["apisauce@3.2.1", "", { "dependencies": { "axios": "^1.10.0" } }, "sha512-zNepv7QeZBjz8UcdRJJXk/pPpgZHoge1DEbklKmefXbwGKrw6tGvzLsBHTl9LVjTjdhC0XM0GU5FtUPv60H2aA=="], "apollo-link-rest": ["apollo-link-rest@0.9.0", "", { "peerDependencies": { "@apollo/client": ">=3", "graphql": ">=0.11", "qs": ">=6" } }, "sha512-kuXjR56Y12w0TZcqwVaONKlipB6g3Ya1dAy4NMCaylPpNXq6tO+qzQFPUyDJC7B0JoJPIFjxPV2rAet4uGM4UQ=="], @@ -4187,7 +4267,7 @@ "ast-types-flow": ["ast-types-flow@0.0.8", "", {}, "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="], - "ast-v8-to-istanbul": ["ast-v8-to-istanbul@0.3.7", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "estree-walker": "^3.0.3", "js-tokens": "^9.0.1" } }, "sha512-kr1Hy6YRZBkGQSb6puP+D6FQ59Cx4m0siYhAxygMCAgadiWQ6oxAxQXHOMvJx67SJ63jRoVIIg5eXzUbbct1ww=="], + "ast-v8-to-istanbul": ["ast-v8-to-istanbul@0.3.8", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "estree-walker": "^3.0.3", "js-tokens": "^9.0.1" } }, "sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ=="], "astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="], @@ -4207,7 +4287,7 @@ "atomic-sleep": ["atomic-sleep@1.0.0", "", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="], - "atomically": ["atomically@2.0.3", "", { "dependencies": { "stubborn-fs": "^1.2.5", "when-exit": "^2.1.1" } }, "sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw=="], + "atomically": ["atomically@2.1.0", "", { "dependencies": { "stubborn-fs": "^2.0.0", "when-exit": "^2.1.4" } }, "sha512-+gDffFXRW6sl/HCwbta7zK4uNqbPjv4YJEAdz7Vu+FLQHe77eZ4bvbJGi4hE0QPeJlMYMA3piXEr1UL3dAwx7Q=="], "auto-bind": ["auto-bind@4.0.0", "", {}, "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ=="], @@ -4217,7 +4297,7 @@ "axe-core": ["axe-core@4.11.0", "", {}, "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ=="], - "axios": ["axios@1.12.2", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw=="], + "axios": ["axios@1.13.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-zt40Pz4zcRXra9CVV31KeyofwiNvAbJ5B6YPz9pMJ+yOSLikvPT4Yi5LjfgjRa9CawVYBaD1JQzIVcIvBejKeA=="], "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], @@ -4225,6 +4305,8 @@ "babel-core": ["babel-core@7.0.0-bridge.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg=="], + "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.10", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA=="], + "babel-jest": ["babel-jest@29.7.0", "", { "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg=="], "babel-literal-to-ast": ["babel-literal-to-ast@2.1.0", "", { "dependencies": { "@babel/parser": "^7.1.6", "@babel/traverse": "^7.1.6", "@babel/types": "^7.1.6" }, "peerDependencies": { "@babel/core": "^7.1.2" } }, "sha512-CxfpQ0ysQ0bZOhlaPgcWjl79Em16Rhqc6++UAFn0A3duiXmuyhhj8yyl9PYbj0I0CyjrHovdDbp2QEKT7uIMxw=="], @@ -4287,9 +4369,9 @@ "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "bare-events": ["bare-events@2.8.0", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-AOhh6Bg5QmFIXdViHbMc2tLDsBIRxdkIaIddPslJF9Z5De3APBScuqGP2uThXnIpqFrgoxMNC6km7uXNIMLHXA=="], + "bare-events": ["bare-events@2.8.1", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-oxSAxTS1hRfnyit2CL5QpAOS5ixfBjj6ex3yTNvXyY/kE719jQ/IjuESJBK2w5v4wwQRAHGseVJXx9QBYOtFGQ=="], - "bare-fs": ["bare-fs@4.4.11", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4", "bare-url": "^2.2.2", "fast-fifo": "^1.3.2" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-Bejmm9zRMvMTRoHS+2adgmXw1ANZnCNx+B5dgZpGwlP1E3x6Yuxea8RToddHUbWtVV0iUMWqsgZr8+jcgUI2SA=="], + "bare-fs": ["bare-fs@4.5.0", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4", "bare-url": "^2.2.2", "fast-fifo": "^1.3.2" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-GljgCjeupKZJNetTqxKaQArLK10vpmK28or0+RwWjEl5Rk+/xG3wkpmkv+WrcBm3q1BwHKlnhXzR8O37kcvkXQ=="], "bare-os": ["bare-os@3.6.2", "", {}, "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A=="], @@ -4297,7 +4379,7 @@ "bare-stream": ["bare-stream@2.7.0", "", { "dependencies": { "streamx": "^2.21.0" }, "peerDependencies": { "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-buffer", "bare-events"] }, "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A=="], - "bare-url": ["bare-url@2.3.0", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-c+RCqMSZbkz97Mw1LWR0gcOqwK82oyYKfLoHJ8k13ybi1+I80ffdDzUy0TdAburdrR/kI0/VuN8YgEnJqX+Nyw=="], + "bare-url": ["bare-url@2.3.1", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-v2yl0TnaZTdEnelkKtXZGnotiV6qATBlnNuUMrHl6v9Lmmrh9mw9RYyImPU7/4RahumSwQS1k2oKXcRfXcbjJw=="], "base-x": ["base-x@5.0.1", "", {}, "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg=="], @@ -4305,7 +4387,7 @@ "base64-sol": ["base64-sol@1.0.1", "", {}, "sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.8.17", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-j5zJcx6golJYTG6c05LUZ3Z8Gi+M62zRT/ycz4Xq4iCOdpcxwg7ngEYD4KA0eWZC7U17qh/Smq8bYbACJ0ipBA=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.8.20", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ=="], "basic-auth": ["basic-auth@2.0.1", "", { "dependencies": { "safe-buffer": "5.1.2" } }, "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg=="], @@ -4397,7 +4479,7 @@ "browserify-zlib": ["browserify-zlib@0.2.0", "", { "dependencies": { "pako": "~1.0.5" } }, "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA=="], - "browserslist": ["browserslist@4.26.3", "", { "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", "electron-to-chromium": "^1.5.227", "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w=="], + "browserslist": ["browserslist@4.27.0", "", { "dependencies": { "baseline-browser-mapping": "^2.8.19", "caniuse-lite": "^1.0.30001751", "electron-to-chromium": "^1.5.238", "node-releases": "^2.0.26", "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" } }, "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw=="], "bs-logger": ["bs-logger@0.2.6", "", { "dependencies": { "fast-json-stable-stringify": "2.x" } }, "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog=="], @@ -4541,6 +4623,8 @@ "cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="], + "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], + "classnames": ["classnames@2.5.1", "", {}, "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="], "clean-css": ["clean-css@5.3.3", "", { "dependencies": { "source-map": "~0.6.0" } }, "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg=="], @@ -4553,8 +4637,6 @@ "cli-cursor": ["cli-cursor@3.1.0", "", { "dependencies": { "restore-cursor": "^3.1.0" } }, "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="], - "cli-highlight": ["cli-highlight@2.1.11", "", { "dependencies": { "chalk": "^4.0.0", "highlight.js": "^10.7.1", "mz": "^2.4.0", "parse5": "^5.1.1", "parse5-htmlparser2-tree-adapter": "^6.0.0", "yargs": "^16.0.0" }, "bin": { "highlight": "bin/highlight" } }, "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg=="], - "cli-spinners": ["cli-spinners@2.6.1", "", {}, "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g=="], "cli-truncate": ["cli-truncate@2.1.0", "", { "dependencies": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" } }, "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg=="], @@ -4579,7 +4661,7 @@ "cloneable-readable": ["cloneable-readable@1.1.3", "", { "dependencies": { "inherits": "^2.0.1", "process-nextick-args": "^2.0.0", "readable-stream": "^2.3.5" } }, "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ=="], - "clsx": ["clsx@1.2.1", "", {}, "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg=="], + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], "co": ["co@4.6.0", "", {}, "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ=="], @@ -5085,7 +5167,7 @@ "ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="], - "electron-to-chromium": ["electron-to-chromium@1.5.237", "", {}, "sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg=="], + "electron-to-chromium": ["electron-to-chromium@1.5.240", "", {}, "sha512-OBwbZjWgrCOH+g6uJsA2/7Twpas2OlepS9uvByJjR2datRDuKGYeD+nP8lBBks2qnB7bGJNHDUx7c/YLaT3QMQ=="], "elliptic": ["elliptic@6.5.7", "", { "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q=="], @@ -5125,6 +5207,8 @@ "eol": ["eol@0.9.1", "", {}, "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg=="], + "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="], + "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], "error-stack-parser": ["error-stack-parser@2.1.4", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="], @@ -5375,8 +5459,6 @@ "extract-files": ["extract-files@11.0.0", "", {}, "sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ=="], - "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], - "eyes": ["eyes@0.1.8", "", {}, "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ=="], "fancy-canvas": ["fancy-canvas@2.1.0", "", {}, "sha512-nifxXJ95JNLFR2NgRV4/MxVP45G9909wJTEKz5fg/TZS20JJZA6hfgRVh/bC9bwl2zBtBNcYPjiBE4njQHVBwQ=="], @@ -5499,7 +5581,7 @@ "flow-enums-runtime": ["flow-enums-runtime@0.0.6", "", {}, "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw=="], - "flow-parser": ["flow-parser@0.288.0", "", {}, "sha512-JnObnfMUNoPLaWafBnA/al7ZF2t6yFPXSJriHZZWWw3+9z7Zhwk4NMA+ZxE1WI1Z50/ti/mjsDcGl/TMy/qLhg=="], + "flow-parser": ["flow-parser@0.289.0", "", {}, "sha512-w4sVnH6ddNAIxokoz0mGyiIIdzvqncFhAYW+RmkPbPSSTYozG6yhqAixzaWeBCQf2qqXJTlHkoKPnf/BAj8Ofw=="], "flush-write-stream": ["flush-write-stream@1.1.1", "", { "dependencies": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" } }, "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w=="], @@ -5521,6 +5603,8 @@ "form-data": ["form-data@4.0.0", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww=="], + "form-data-encoder": ["form-data-encoder@4.1.0", "", {}, "sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw=="], + "formdata-node": ["formdata-node@6.0.3", "", {}, "sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg=="], "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], @@ -5615,7 +5699,7 @@ "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], - "get-tsconfig": ["get-tsconfig@4.12.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw=="], + "get-tsconfig": ["get-tsconfig@4.13.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ=="], "get-uri": ["get-uri@6.0.5", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg=="], @@ -5751,8 +5835,6 @@ "hey-listen": ["hey-listen@1.0.8", "", {}, "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q=="], - "highlight.js": ["highlight.js@10.7.3", "", {}, "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A=="], - "hmac-drbg": ["hmac-drbg@1.0.1", "", { "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg=="], "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], @@ -6043,6 +6125,8 @@ "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + "isbot": ["isbot@5.1.31", "", {}, "sha512-DPgQshehErHAqSCKDb3rNW03pa2wS/v5evvUqtxt6TTnHRqAG8FdzcSSJs9656pK6Y+NT7K9R4acEYXLHYfpUQ=="], + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], "isobject": ["isobject@3.0.1", "", {}, "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="], @@ -6203,7 +6287,7 @@ "jsep": ["jsep@1.4.0", "", {}, "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw=="], - "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + "jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="], "json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="], @@ -6273,7 +6357,7 @@ "koalas": ["koalas@1.0.2", "", {}, "sha512-RYhBbYaTTTHId3l6fnMZc3eGQNW6FVCqMG6AMwA5I1Mafr6AflaXeoi6x3xQuATRotGYRLk6+1ELZH4dstFNOA=="], - "ky": ["ky@1.12.0", "", {}, "sha512-YRLmSUHCwOJRBMArtqMRLOmO7fewn3yOoui6aB8ERkRVXupa0UiaQaKbIXteMt4jUElhbdqTMsLFHs8APxxUoQ=="], + "ky": ["ky@1.13.0", "", {}, "sha512-JeNNGs44hVUp2XxO3FY9WV28ymG7LgO4wju4HL/dCq1A8eKDcFgVrdCn1ssn+3Q/5OQilv5aYsL0DMt5mmAV9w=="], "language-subtag-registry": ["language-subtag-registry@0.3.23", "", {}, "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ=="], @@ -6463,11 +6547,13 @@ "lru_map": ["lru_map@0.3.3", "", {}, "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ=="], + "lucide-react": ["lucide-react@0.548.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-63b16z63jM9yc1MwxajHeuu0FRZFsDtljtDjYm26Kd86UQ5HQzu9ksEtoUUw4RBuewodw/tGFmvipePvRsKeDA=="], + "lz-string": ["lz-string@1.5.0", "", { "bin": { "lz-string": "bin/bin.js" } }, "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="], "madge": ["madge@6.1.0", "", { "dependencies": { "chalk": "^4.1.1", "commander": "^7.2.0", "commondir": "^1.0.1", "debug": "^4.3.1", "dependency-tree": "^9.0.0", "detective-amd": "^4.0.1", "detective-cjs": "^4.0.0", "detective-es6": "^3.0.0", "detective-less": "^1.0.2", "detective-postcss": "^6.1.0", "detective-sass": "^4.0.1", "detective-scss": "^3.0.0", "detective-stylus": "^2.0.1", "detective-typescript": "^9.0.0", "ora": "^5.4.1", "pluralize": "^8.0.0", "precinct": "^8.1.0", "pretty-ms": "^7.0.1", "rc": "^1.2.7", "stream-to-array": "^2.3.0", "ts-graphviz": "^1.5.0", "walkdir": "^0.4.1" }, "peerDependencies": { "typescript": "^3.9.5 || ^4.9.5 || ^5" }, "optionalPeers": ["typescript"], "bin": { "madge": "bin/cli.js" } }, "sha512-irWhT5RpFOc6lkzGHKLihonCVgM0YtfNUh4IrFeW3EqHpnt/JHUG3z26j8PeJEktCGB4tmGOOOJi1Rl/ACWucQ=="], - "magic-string": ["magic-string@0.30.19", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw=="], + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], "magicast": ["magicast@0.3.5", "", { "dependencies": { "@babel/parser": "^7.25.4", "@babel/types": "^7.25.4", "source-map-js": "^1.2.0" } }, "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ=="], @@ -6639,6 +6725,8 @@ "moore": ["moore@1.0.0", "", {}, "sha512-xcsFo/jgtMuVaGePHod5TdSzxnRAQQ4wFpDmFuu34lHvx5sNMsioA84NW7iBWYZ10jHR/nyGaDkhunMJxqAzkw=="], + "morgan": ["morgan@1.10.1", "", { "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", "depd": "~2.0.0", "on-finished": "~2.3.0", "on-headers": "~1.1.0" } }, "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A=="], + "moti": ["moti@0.27.2", "", { "dependencies": { "framer-motion": "^6.5.1" }, "peerDependencies": { "react-native-reanimated": "*" } }, "sha512-QYH9Id14Zdjx9L75iMPyvxUN+GvHZ4lk6QhUyA63kWgXyqPT2yMnEIbk7hIeQ0WQDW2eLAXEi2/6FJkS7TEwsw=="], "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], @@ -6725,7 +6813,7 @@ "node-preload": ["node-preload@0.2.1", "", { "dependencies": { "process-on-spawn": "^1.0.0" } }, "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ=="], - "node-releases": ["node-releases@2.0.25", "", {}, "sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA=="], + "node-releases": ["node-releases@2.0.26", "", {}, "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA=="], "node-source-walk": ["node-source-walk@5.0.2", "", { "dependencies": { "@babel/parser": "^7.21.4" } }, "sha512-Y4jr/8SRS5hzEdZ7SGuvZGwfORvNsSsNRwDXx5WisiqzsVfeftDvRgfeqWNgZvWSJbgubTRVRYBzK6UO+ErqjA=="], @@ -6733,7 +6821,7 @@ "node-vibrant": ["node-vibrant@3.1.6", "", { "dependencies": { "@jimp/custom": "^0.16.1", "@jimp/plugin-resize": "^0.16.1", "@jimp/types": "^0.16.1", "@types/lodash": "^4.14.53", "@types/node": "^10.11.7", "lodash": "^4.17.20", "url": "^0.11.0" } }, "sha512-Wlc/hQmBMOu6xon12ZJHS2N3M+I6J8DhrD3Yo6m5175v8sFkVIN+UjhKVRcO+fqvre89ASTpmiFEP3nPO13SwA=="], - "normalize-package-data": ["normalize-package-data@3.0.3", "", { "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" } }, "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA=="], + "normalize-package-data": ["normalize-package-data@5.0.0", "", { "dependencies": { "hosted-git-info": "^6.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q=="], "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], @@ -6745,8 +6833,14 @@ "now-and-later": ["now-and-later@2.0.1", "", { "dependencies": { "once": "^1.3.2" } }, "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ=="], + "npm-install-checks": ["npm-install-checks@6.3.0", "", { "dependencies": { "semver": "^7.1.1" } }, "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw=="], + + "npm-normalize-package-bin": ["npm-normalize-package-bin@3.0.1", "", {}, "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ=="], + "npm-package-arg": ["npm-package-arg@11.0.1", "", { "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^3.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ=="], + "npm-pick-manifest": ["npm-pick-manifest@8.0.2", "", { "dependencies": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", "npm-package-arg": "^10.0.0", "semver": "^7.3.5" } }, "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg=="], + "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], "npmlog": ["npmlog@4.1.2", "", { "dependencies": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", "gauge": "~2.7.3", "set-blocking": "~2.0.0" } }, "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg=="], @@ -7221,8 +7315,12 @@ "promise": ["promise@8.3.0", "", { "dependencies": { "asap": "~2.0.6" } }, "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg=="], + "promise-inflight": ["promise-inflight@1.0.1", "", {}, "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g=="], + "promise-map-series": ["promise-map-series@0.3.0", "", {}, "sha512-3npG2NGhTc8BWBolLLf8l/92OxMGaRLbqvIh9wjCHhDXNvk4zsxaTaCpiCunW09qWPrN2zeNSNwRLVBrQQtutA=="], + "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], + "promise-toolbox": ["promise-toolbox@0.21.0", "", { "dependencies": { "make-error": "^1.3.2" } }, "sha512-NV8aTmpwrZv+Iys54sSFOBx3tuVaOBvvrft5PNppnxy9xpU/akHbaWIril22AB22zaPgrgwKdD0KsrM0ptUtpg=="], "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], @@ -7253,7 +7351,7 @@ "public-encrypt": ["public-encrypt@4.0.3", "", { "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", "create-hash": "^1.1.0", "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" } }, "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q=="], - "publish-browser-extension": ["publish-browser-extension@3.0.2", "", { "dependencies": { "cac": "^6.7.14", "cli-highlight": "^2.1.11", "consola": "^3.4.2", "dotenv": "^16.6.1", "extract-zip": "^2.0.1", "formdata-node": "^6.0.3", "listr2": "^8.3.3", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", "lodash.snakecase": "^4.1.1", "ofetch": "^1.4.1", "open": "^10.2.0", "ora": "^6.3.1", "prompts": "^2.4.2", "zod": "^3.25.76" }, "bin": { "publish-extension": "bin/publish-extension.cjs" } }, "sha512-yZLPF/WyyaKYUHmurDcSMYpgZLqpUkx/4482bLpelHyRlyghjo3951pJXw/KunMnO6pdwWEZGr0AJnvlls2H8g=="], + "publish-browser-extension": ["publish-browser-extension@3.0.3", "", { "dependencies": { "cac": "^6.7.14", "consola": "^3.4.2", "dotenv": "^17.2.3", "form-data-encoder": "^4.1.0", "formdata-node": "^6.0.3", "listr2": "^8.3.3", "ofetch": "^1.4.1", "zod": "^3.25.76 || ^4.0.0" }, "bin": { "publish-extension": "bin/publish-extension.cjs" } }, "sha512-cBINZCkLo7YQaGoUvEHthZ0sDzgJQht28IS+SFMT2omSNhGsPiVNRkWir3qLiTrhGhW9Ci2KVHpA1QAMoBdL2g=="], "pump": ["pump@2.0.1", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA=="], @@ -7267,7 +7365,7 @@ "pvtsutils": ["pvtsutils@1.3.6", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg=="], - "pvutils": ["pvutils@1.1.3", "", {}, "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ=="], + "pvutils": ["pvutils@1.1.5", "", {}, "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA=="], "q": ["q@1.5.1", "", {}, "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw=="], @@ -8015,7 +8113,9 @@ "structured-headers": ["structured-headers@0.4.1", "", {}, "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg=="], - "stubborn-fs": ["stubborn-fs@1.2.5", "", {}, "sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g=="], + "stubborn-fs": ["stubborn-fs@2.0.0", "", { "dependencies": { "stubborn-utils": "^1.0.1" } }, "sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA=="], + + "stubborn-utils": ["stubborn-utils@1.0.1", "", {}, "sha512-bwtct4FpoH1eYdSMFc84fxnYynWwsy2u0joj94K+6caiPnjZIpwTLHT2u7CFAS0GumaBZVB5Y2GkJ46mJS76qg=="], "stubs": ["stubs@3.0.0", "", {}, "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw=="], @@ -8069,11 +8169,15 @@ "system-architecture": ["system-architecture@0.1.0", "", {}, "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA=="], - "tabbable": ["tabbable@6.2.0", "", {}, "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="], + "tabbable": ["tabbable@6.3.0", "", {}, "sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ=="], "table": ["table@6.9.0", "", { "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1" } }, "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A=="], - "tailwindcss": ["tailwindcss@3.4.18", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ=="], + "tailwind-merge": ["tailwind-merge@3.3.1", "", {}, "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g=="], + + "tailwindcss": ["tailwindcss@4.1.16", "", {}, "sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA=="], + + "tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="], "tamagui": ["tamagui@1.125.17", "", { "dependencies": { "@tamagui/accordion": "1.125.17", "@tamagui/adapt": "1.125.17", "@tamagui/alert-dialog": "1.125.17", "@tamagui/animate-presence": "1.125.17", "@tamagui/avatar": "1.125.17", "@tamagui/button": "1.125.17", "@tamagui/card": "1.125.17", "@tamagui/checkbox": "1.125.17", "@tamagui/compose-refs": "1.125.17", "@tamagui/constants": "1.125.17", "@tamagui/core": "1.125.17", "@tamagui/create-context": "1.125.17", "@tamagui/dialog": "1.125.17", "@tamagui/elements": "1.125.17", "@tamagui/fake-react-native": "1.125.17", "@tamagui/focusable": "1.125.17", "@tamagui/font-size": "1.125.17", "@tamagui/form": "1.125.17", "@tamagui/get-button-sized": "1.125.17", "@tamagui/get-font-sized": "1.125.17", "@tamagui/get-token": "1.125.17", "@tamagui/group": "1.125.17", "@tamagui/helpers-tamagui": "1.125.17", "@tamagui/image": "1.125.17", "@tamagui/label": "1.125.17", "@tamagui/linear-gradient": "1.125.17", "@tamagui/list-item": "1.125.17", "@tamagui/polyfill-dev": "1.125.17", "@tamagui/popover": "1.125.17", "@tamagui/popper": "1.125.17", "@tamagui/portal": "1.125.17", "@tamagui/progress": "1.125.17", "@tamagui/radio-group": "1.125.17", "@tamagui/react-native-media-driver": "1.125.17", "@tamagui/scroll-view": "1.125.17", "@tamagui/select": "1.125.17", "@tamagui/separator": "1.125.17", "@tamagui/shapes": "1.125.17", "@tamagui/sheet": "1.125.17", "@tamagui/slider": "1.125.17", "@tamagui/stacks": "1.125.17", "@tamagui/switch": "1.125.17", "@tamagui/tabs": "1.125.17", "@tamagui/text": "1.125.17", "@tamagui/theme": "1.125.17", "@tamagui/toggle-group": "1.125.17", "@tamagui/tooltip": "1.125.17", "@tamagui/use-controllable-state": "1.125.17", "@tamagui/use-debounce": "1.125.17", "@tamagui/use-force-update": "1.125.17", "@tamagui/use-window-dimensions": "1.125.17", "@tamagui/visually-hidden": "1.125.17", "@tamagui/z-index-stack": "1.125.17" }, "peerDependencies": { "react": "*" } }, "sha512-m4yuxv3QzTq8ZfAAGjveygla9sjSB9JqfpPk5H1dYWYtc2oL89NKZcUCw+0iwTsxe43bbDE/xC02IRi7+zWvSg=="], @@ -8377,7 +8481,7 @@ "upath": ["upath@1.2.0", "", {}, "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="], - "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], + "update-browserslist-db": ["update-browserslist-db@1.1.4", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A=="], "update-check": ["update-check@1.5.4", "", { "dependencies": { "registry-auth-token": "3.3.2", "registry-url": "3.1.0" } }, "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ=="], @@ -8433,6 +8537,8 @@ "v8-to-istanbul": ["v8-to-istanbul@9.3.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" } }, "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA=="], + "valibot": ["valibot@0.41.0", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-igDBb8CTYr8YTQlOKgaN9nSS0Be7z+WRuaeYqGf3Cjz3aKmSnqEmYnkfVjzIuumGqfHpa3fLIvMEAfhrpqN8ng=="], + "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], "validate-npm-package-name": ["validate-npm-package-name@3.0.0", "", { "dependencies": { "builtins": "^1.0.3" } }, "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw=="], @@ -8753,7 +8859,7 @@ "@apollo/client/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@ardatan/relay-compiler/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "@ardatan/relay-compiler/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "@ardatan/relay-compiler/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], @@ -8785,6 +8891,8 @@ "@aws-sdk/client-cloudwatch-logs/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@aws-sdk/client-cognito-identity/@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.916.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.916.0", "@aws-sdk/credential-provider-http": "3.916.0", "@aws-sdk/credential-provider-ini": "3.916.0", "@aws-sdk/credential-provider-process": "3.916.0", "@aws-sdk/credential-provider-sso": "3.916.0", "@aws-sdk/credential-provider-web-identity": "3.916.0", "@aws-sdk/types": "3.914.0", "@smithy/credential-provider-imds": "^4.2.3", "@smithy/property-provider": "^4.2.3", "@smithy/shared-ini-file-loader": "^4.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-8TrMpHqct0zTalf2CP2uODiN/PH9LPdBC6JDgPVK0POELTT4ITHerMxIhYGEiKN+6E4oRwSjM/xVTHCD4nMcrQ=="], + "@aws-sdk/client-cognito-identity/@smithy/util-retry": ["@smithy/util-retry@4.2.3", "", { "dependencies": { "@smithy/service-error-classification": "^4.2.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-lLPWnakjC0q9z+OtiXk+9RPQiYPNAovt2IXD3CP4LkOnd9NpUsxOjMx1SnoUVB7Orb7fZp67cQMtTBKMFDvOGg=="], "@aws-sdk/client-cognito-identity/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -8841,6 +8949,12 @@ "@aws-sdk/credential-provider-web-identity/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@aws-sdk/credential-providers/@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.916.0", "", { "dependencies": { "@aws-sdk/core": "3.916.0", "@aws-sdk/credential-provider-env": "3.916.0", "@aws-sdk/credential-provider-http": "3.916.0", "@aws-sdk/credential-provider-process": "3.916.0", "@aws-sdk/credential-provider-sso": "3.916.0", "@aws-sdk/credential-provider-web-identity": "3.916.0", "@aws-sdk/nested-clients": "3.916.0", "@aws-sdk/types": "3.914.0", "@smithy/credential-provider-imds": "^4.2.3", "@smithy/property-provider": "^4.2.3", "@smithy/shared-ini-file-loader": "^4.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-iR0FofvdPs87o6MhfNPv0F6WzB4VZ9kx1hbvmR7bSFCk7l0gc7G4fHJOg4xg2lsCptuETboX3O/78OQ2Djeakw=="], + + "@aws-sdk/credential-providers/@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.916.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.916.0", "@aws-sdk/credential-provider-http": "3.916.0", "@aws-sdk/credential-provider-ini": "3.916.0", "@aws-sdk/credential-provider-process": "3.916.0", "@aws-sdk/credential-provider-sso": "3.916.0", "@aws-sdk/credential-provider-web-identity": "3.916.0", "@aws-sdk/types": "3.914.0", "@smithy/credential-provider-imds": "^4.2.3", "@smithy/property-provider": "^4.2.3", "@smithy/shared-ini-file-loader": "^4.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-8TrMpHqct0zTalf2CP2uODiN/PH9LPdBC6JDgPVK0POELTT4ITHerMxIhYGEiKN+6E4oRwSjM/xVTHCD4nMcrQ=="], + + "@aws-sdk/credential-providers/@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.916.0", "", { "dependencies": { "@aws-sdk/core": "3.916.0", "@aws-sdk/nested-clients": "3.916.0", "@aws-sdk/types": "3.914.0", "@smithy/property-provider": "^4.2.3", "@smithy/shared-ini-file-loader": "^4.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-VFnL1EjHiwqi2kR19MLXjEgYBuWViCuAKLGSFGSzfFF/+kSpamVrOSFbqsTk8xwHan8PyNnQg4BNuusXwwLoIw=="], + "@aws-sdk/credential-providers/@smithy/property-provider": ["@smithy/property-provider@4.2.3", "", { "dependencies": { "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-+1EZ+Y+njiefCohjlhyOcy1UNYjT+1PwGFHCxA/gYctjg3DQWAU19WigOXAco/Ql8hZokNehpzLd0/+3uCreqQ=="], "@aws-sdk/credential-providers/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -8891,12 +9005,16 @@ "@babel/runtime/regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="], + "@binance/w3w-qrcode-modal/tailwindcss": ["tailwindcss@3.4.18", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ=="], + "@chromatic-com/storybook/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], "@cloudflare/kv-asset-handler/mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], "@cloudflare/vite-plugin/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + "@coinbase/wallet-sdk/clsx": ["clsx@1.2.1", "", {}, "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg=="], + "@commitlint/config-validator/ajv": ["ajv@8.12.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA=="], "@commitlint/format/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -8987,10 +9105,34 @@ "@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], + "@ethersproject/abstract-signer/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "@ethersproject/abstract-signer/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "@ethersproject/address/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + "@ethersproject/basex/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + "@ethersproject/constants/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "@ethersproject/contracts/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "@ethersproject/contracts/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "@ethersproject/hash/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "@ethersproject/hash/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "@ethersproject/hdnode/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "@ethersproject/hdnode/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "@ethersproject/json-wallets/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + "@ethersproject/providers/ws": ["ws@7.4.6", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="], + "@ethersproject/signing-key/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + "@ethersproject/solidity/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], "@ethersproject/solidity/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], @@ -9009,6 +9151,14 @@ "@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], + "@ethersproject/units/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "@ethersproject/wallet/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "@ethersproject/wallet/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "@ethersproject/web/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + "@expo/bunyan/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], "@expo/cli/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -9075,7 +9225,7 @@ "@expo/json-file/@babel/code-frame": ["@babel/code-frame@7.10.4", "", { "dependencies": { "@babel/highlight": "^7.10.4" } }, "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg=="], - "@expo/metro-config/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "@expo/metro-config/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "@expo/metro-config/@expo/json-file": ["@expo/json-file@9.0.2", "", { "dependencies": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3", "write-file-atomic": "^2.3.0" } }, "sha512-yAznIUrybOIWp3Uax7yRflB0xsEpvIwIEqIjao9SGi2Gaa+N0OamWfe0fnXBSWF+2zzF4VvqwT4W5zwelchfgw=="], @@ -9279,6 +9429,8 @@ "@graphql-tools/executor/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@graphql-tools/executor-graphql-ws/@repeaterjs/repeater": ["@repeaterjs/repeater@3.0.4", "", {}, "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA=="], + "@graphql-tools/executor-graphql-ws/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "@graphql-tools/executor-graphql-ws/ws": ["ws@8.13.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA=="], @@ -9417,7 +9569,7 @@ "@jest/test-result/@jest/types": ["@jest/types@30.2.0", "", { "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg=="], - "@jest/transform/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "@jest/transform/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "@jest/transform/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -9513,6 +9665,18 @@ "@nicolo-ribaudo/eslint-scope-5-internals/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], + "@npmcli/git/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], + + "@npmcli/git/which": ["which@3.0.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg=="], + + "@npmcli/package-json/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "@npmcli/package-json/hosted-git-info": ["hosted-git-info@6.1.3", "", { "dependencies": { "lru-cache": "^7.5.1" } }, "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw=="], + + "@npmcli/package-json/json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], + + "@npmcli/promise-spawn/which": ["which@3.0.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg=="], + "@nx/eslint/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "@nx/js/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -9583,7 +9747,7 @@ "@react-native/babel-plugin-codegen/@react-native/codegen": ["@react-native/codegen@0.76.6", "", { "dependencies": { "@babel/parser": "^7.25.3", "glob": "^7.1.1", "hermes-parser": "0.23.1", "invariant": "^2.2.4", "jscodeshift": "^0.14.0", "mkdirp": "^0.5.1", "nullthrows": "^1.1.1", "yargs": "^17.6.2" }, "peerDependencies": { "@babel/preset-env": "^7.1.6" } }, "sha512-BABb3e5G/+hyQYEYi0AODWh2km2d8ERoASZr6Hv90pVXdUHRYR+yxCatX7vSd9rnDUYndqRTzD0hZWAucPNAKg=="], - "@react-native/babel-preset/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "@react-native/babel-preset/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "@react-native/codegen/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], @@ -9599,15 +9763,29 @@ "@react-native/dev-middleware/ws": ["ws@6.2.3", "", { "dependencies": { "async-limiter": "~1.0.0" } }, "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA=="], - "@react-native/metro-babel-transformer/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "@react-native/metro-babel-transformer/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "@react-native/metro-babel-transformer/@react-native/babel-preset": ["@react-native/babel-preset@0.77.2", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-default-from": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-transform-arrow-functions": "^7.24.7", "@babel/plugin-transform-async-generator-functions": "^7.25.4", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoping": "^7.25.0", "@babel/plugin-transform-class-properties": "^7.25.4", "@babel/plugin-transform-classes": "^7.25.4", "@babel/plugin-transform-computed-properties": "^7.24.7", "@babel/plugin-transform-destructuring": "^7.24.8", "@babel/plugin-transform-flow-strip-types": "^7.25.2", "@babel/plugin-transform-for-of": "^7.24.7", "@babel/plugin-transform-function-name": "^7.25.1", "@babel/plugin-transform-literals": "^7.25.2", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-modules-commonjs": "^7.24.8", "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", "@babel/plugin-transform-numeric-separator": "^7.24.7", "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-optional-catch-binding": "^7.24.7", "@babel/plugin-transform-optional-chaining": "^7.24.8", "@babel/plugin-transform-parameters": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-react-display-name": "^7.24.7", "@babel/plugin-transform-react-jsx": "^7.25.2", "@babel/plugin-transform-react-jsx-self": "^7.24.7", "@babel/plugin-transform-react-jsx-source": "^7.24.7", "@babel/plugin-transform-regenerator": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", "@babel/plugin-transform-shorthand-properties": "^7.24.7", "@babel/plugin-transform-spread": "^7.24.7", "@babel/plugin-transform-sticky-regex": "^7.24.7", "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", "@babel/template": "^7.25.0", "@react-native/babel-plugin-codegen": "0.77.2", "babel-plugin-syntax-hermes-parser": "0.25.1", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" } }, "sha512-If6X4I0z6W5aVzqZS4JOrN7sh08w1QzEL8Q66i3g0wI8K8ZK+V+/ARlEmboy14VtcOYlmmjXEqSCv+Z2o9cuKg=="], "@react-navigation/core/react-is": ["react-is@19.2.0", "", {}, "sha512-x3Ax3kNSMIIkyVYhWPyO09bu0uttcAIoecO/um/rKGQ4EltYWVYtyiGkS/3xMynrbVQdS69Jhlv8FXUEZehlzA=="], - "@react-navigation/native-stack/@react-navigation/elements": ["@react-navigation/elements@2.6.5", "", { "dependencies": { "color": "^4.2.3", "use-latest-callback": "^0.2.4", "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "@react-native-masked-view/masked-view": ">= 0.2.0", "@react-navigation/native": "^7.1.18", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0" }, "optionalPeers": ["@react-native-masked-view/masked-view"] }, "sha512-HOaekvFeoqKyaSKP2hakL7OUnw0jIhk/1wMjcovUKblT76LMTumZpriqsc30m/Vnyy1a8zgp4VsuA1xftcalgQ=="], + "@react-navigation/native-stack/@react-navigation/elements": ["@react-navigation/elements@2.7.1", "", { "dependencies": { "color": "^4.2.3", "use-latest-callback": "^0.2.4", "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "@react-native-masked-view/masked-view": ">= 0.2.0", "@react-navigation/native": "^7.1.19", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0" }, "optionalPeers": ["@react-native-masked-view/masked-view"] }, "sha512-IZO8lx8+ftfbBdaL79FB4mo8PuaMLHnGt4iPLx0TRocIaHHUaPcb4R1ble1DGKeRuyeBbFHu2uLTD1YRDE0lsg=="], - "@react-navigation/stack/@react-navigation/elements": ["@react-navigation/elements@2.6.5", "", { "dependencies": { "color": "^4.2.3", "use-latest-callback": "^0.2.4", "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "@react-native-masked-view/masked-view": ">= 0.2.0", "@react-navigation/native": "^7.1.18", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0" }, "optionalPeers": ["@react-native-masked-view/masked-view"] }, "sha512-HOaekvFeoqKyaSKP2hakL7OUnw0jIhk/1wMjcovUKblT76LMTumZpriqsc30m/Vnyy1a8zgp4VsuA1xftcalgQ=="], + "@react-navigation/stack/@react-navigation/elements": ["@react-navigation/elements@2.7.1", "", { "dependencies": { "color": "^4.2.3", "use-latest-callback": "^0.2.4", "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "@react-native-masked-view/masked-view": ">= 0.2.0", "@react-navigation/native": "^7.1.19", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0" }, "optionalPeers": ["@react-native-masked-view/masked-view"] }, "sha512-IZO8lx8+ftfbBdaL79FB4mo8PuaMLHnGt4iPLx0TRocIaHHUaPcb4R1ble1DGKeRuyeBbFHu2uLTD1YRDE0lsg=="], + + "@react-router/dev/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], + + "@react-router/dev/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "@react-router/dev/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "@react-router/dev/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], + + "@react-router/node/@mjackson/node-fetch-server": ["@mjackson/node-fetch-server@0.2.0", "", {}, "sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng=="], + + "@react-router/serve/get-port": ["get-port@5.1.1", "", {}, "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ=="], + + "@react-router/serve/source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], "@reduxjs/toolkit/redux-thunk": ["redux-thunk@2.4.2", "", { "peerDependencies": { "redux": "^4" } }, "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q=="], @@ -9683,10 +9861,12 @@ "@shopify/flash-list/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@slack/web-api/@slack/types": ["@slack/types@2.17.0", "", {}, "sha512-30KdPUBGJczlchnV8tKSxFG1yPk6rb8waba6HAoNHOy99zomzovQo6WpH9vQsY0g3RlxgVLojxKMRe0WjEjFWw=="], + "@slack/web-api/@slack/types": ["@slack/types@2.18.0", "", {}, "sha512-ZKrdeoppbM+3l2KKOi4/3oFYKCEwiW3dQfdHZDcecJ9rAmEqWPnARYmac9taZNitb0xnSgu6GOpHgwaKI8se2g=="], "@slack/web-api/form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], + "@slack/webhook/@slack/types": ["@slack/types@2.18.0", "", {}, "sha512-ZKrdeoppbM+3l2KKOi4/3oFYKCEwiW3dQfdHZDcecJ9rAmEqWPnARYmac9taZNitb0xnSgu6GOpHgwaKI8se2g=="], + "@smithy/abort-controller/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "@smithy/config-resolver/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -9867,13 +10047,13 @@ "@surma/rollup-plugin-off-main-thread/magic-string": ["magic-string@0.25.9", "", { "dependencies": { "sourcemap-codec": "^1.4.8" } }, "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ=="], - "@svgr/core/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "@svgr/core/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "@svgr/core/cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="], "@svgr/hast-util-to-babel-ast/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], - "@svgr/plugin-jsx/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "@svgr/plugin-jsx/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "@svgr/plugin-svgo/cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="], @@ -9887,9 +10067,29 @@ "@swc/jest/@jest/create-cache-key-function": ["@jest/create-cache-key-function@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0" } }, "sha512-44F4l4Enf+MirJN8X/NhdGkl71k5rBYiwdVlo4HxOwbu0sHV8QKrGEedb1VUU4K3W7fBKE0HGfbn7eZm0Ti3zg=="], - "@tamagui/babel-plugin-fully-specified/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "@tailwindcss/node/lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="], + + "@tailwindcss/node/tailwindcss": ["tailwindcss@4.1.13", "", {}, "sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w=="], + + "@tailwindcss/oxide/tar": ["tar@7.5.1", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.6.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.6.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], - "@tamagui/build/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" }, "bundled": true }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], + + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + + "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@tailwindcss/vite/tailwindcss": ["tailwindcss@4.1.13", "", {}, "sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w=="], + + "@tamagui/babel-plugin-fully-specified/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], + + "@tamagui/build/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "@tamagui/build/esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], @@ -9897,7 +10097,7 @@ "@tamagui/generate-themes/fs-extra": ["fs-extra@11.3.2", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A=="], - "@tamagui/static/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "@tamagui/static/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "@tamagui/static/esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], @@ -9977,7 +10177,7 @@ "@visx/shape/d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="], - "@vitejs/plugin-react/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "@vitejs/plugin-react/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "@vitest/browser/@testing-library/user-event": ["@testing-library/user-event@14.6.1", "", { "peerDependencies": { "@testing-library/dom": ">=7.21.4" } }, "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw=="], @@ -10089,6 +10289,8 @@ "axios/form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], + "babel-dead-code-elimination/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], + "babel-jest/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "babel-loader/loader-utils": ["loader-utils@1.4.2", "", { "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^1.0.1" } }, "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg=="], @@ -10111,7 +10313,7 @@ "babel-preset-expo/babel-plugin-react-native-web": ["babel-plugin-react-native-web@0.19.13", "", {}, "sha512-4hHoto6xaN23LCyZgL9LJZc3olmAxd7b6jDzlZnKXAh4rRAbZRKNBJoOOdp46OBqgy+K0t0guTj5/mhA8inymQ=="], - "babel-preset-react-app/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "babel-preset-react-app/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "babel-preset-react-app/@babel/plugin-proposal-private-property-in-object": ["@babel/plugin-proposal-private-property-in-object@7.21.11", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.21.0", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw=="], @@ -10181,6 +10383,8 @@ "capital-case/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "cbw-sdk/clsx": ["clsx@1.2.1", "", {}, "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg=="], + "chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], "chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], @@ -10207,14 +10411,6 @@ "clean-css/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - "cli-highlight/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "cli-highlight/parse5": ["parse5@5.1.1", "", {}, "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug=="], - - "cli-highlight/parse5-htmlparser2-tree-adapter": ["parse5-htmlparser2-tree-adapter@6.0.1", "", { "dependencies": { "parse5": "^6.0.1" } }, "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA=="], - - "cli-highlight/yargs": ["yargs@16.2.0", "", { "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } }, "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw=="], - "clipboardy/execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="], "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], @@ -10351,7 +10547,7 @@ "eslint/strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - "eslint-config-react-app/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "eslint-config-react-app/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -10461,8 +10657,6 @@ "external-editor/tmp": ["tmp@0.0.33", "", { "dependencies": { "os-tmpdir": "~1.0.2" } }, "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="], - "extract-zip/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], - "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "fast-url-parser/punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="], @@ -10659,7 +10853,7 @@ "is-upper-case/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "istanbul-lib-instrument/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "istanbul-lib-instrument/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "istanbul-lib-processinfo/p-map": ["p-map@3.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ=="], @@ -10707,7 +10901,7 @@ "jest-cli/jest-validate": ["jest-validate@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", "pretty-format": "^29.7.0" } }, "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw=="], - "jest-config/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "jest-config/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "jest-config/@jest/types": ["@jest/types@30.2.0", "", { "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg=="], @@ -10811,7 +11005,7 @@ "jest-runtime/strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], - "jest-snapshot/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "jest-snapshot/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "jest-snapshot/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -10851,7 +11045,7 @@ "jest-watcher/jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="], - "jscodeshift/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "jscodeshift/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "jscodeshift/write-file-atomic": ["write-file-atomic@5.0.1", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" } }, "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw=="], @@ -10919,13 +11113,17 @@ "matcher-collection/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "md5.js/hash-base": ["hash-base@3.1.2", "", { "dependencies": { "inherits": "^2.0.4", "readable-stream": "^2.3.8", "safe-buffer": "^5.2.1", "to-buffer": "^1.2.1" } }, "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg=="], + + "meow/normalize-package-data": ["normalize-package-data@3.0.3", "", { "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" } }, "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA=="], + "meow/type-fest": ["type-fest@0.18.1", "", {}, "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw=="], "meow/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], "merge-options/is-plain-obj": ["is-plain-obj@2.1.0", "", {}, "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="], - "metro/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "metro/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "metro/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -10945,7 +11143,7 @@ "metro/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], - "metro-babel-transformer/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "metro-babel-transformer/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "metro-config/cosmiconfig": ["cosmiconfig@5.2.1", "", { "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", "js-yaml": "^3.13.1", "parse-json": "^4.0.0" } }, "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA=="], @@ -10965,9 +11163,9 @@ "metro-symbolicate/vlq": ["vlq@1.0.1", "", {}, "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w=="], - "metro-transform-plugins/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "metro-transform-plugins/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], - "metro-transform-worker/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "metro-transform-worker/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "metro-transform-worker/metro-source-map": ["metro-source-map@0.81.1", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-symbolicate": "0.81.1", "nullthrows": "^1.1.1", "ob1": "0.81.1", "source-map": "^0.5.6", "vlq": "^1.0.0" } }, "sha512-1i8ROpNNiga43F0ZixAXoFE/SS3RqcRDCCslpynb+ytym0VI7pkTH1woAN2HI9pczYtPrp3Nq0AjRpsuY35ieA=="], @@ -11025,6 +11223,12 @@ "module-lookup-amd/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "morgan/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "morgan/on-finished": ["on-finished@2.3.0", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww=="], + + "morgan/on-headers": ["on-headers@1.1.0", "", {}, "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A=="], + "moti/framer-motion": ["framer-motion@6.5.1", "", { "dependencies": { "@motionone/dom": "10.12.0", "framesync": "6.0.1", "hey-listen": "^1.0.8", "popmotion": "11.0.3", "style-value-types": "5.0.0", "tslib": "^2.1.0" }, "optionalDependencies": { "@emotion/is-prop-valid": "^0.8.2" }, "peerDependencies": { "react": ">=16.8 || ^17.0.0 || ^18.0.0", "react-dom": ">=16.8 || ^17.0.0 || ^18.0.0" } }, "sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw=="], "multicodec/uint8arrays": ["uint8arrays@2.1.10", "", { "dependencies": { "multiformats": "^9.4.2" } }, "sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A=="], @@ -11059,10 +11263,12 @@ "node-vibrant/@types/node": ["@types/node@10.17.60", "", {}, "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="], - "normalize-package-data/hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], + "normalize-package-data/hosted-git-info": ["hosted-git-info@6.1.3", "", { "dependencies": { "lru-cache": "^7.5.1" } }, "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw=="], "npm-package-arg/validate-npm-package-name": ["validate-npm-package-name@5.0.1", "", {}, "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ=="], + "npm-pick-manifest/npm-package-arg": ["npm-package-arg@10.1.0", "", { "dependencies": { "hosted-git-info": "^6.0.0", "proc-log": "^3.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA=="], + "nx/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "nx/dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], @@ -11135,7 +11341,7 @@ "playwright/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], - "playwright-slack-report/commander": ["commander@14.0.1", "", {}, "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A=="], + "playwright-slack-report/commander": ["commander@14.0.2", "", {}, "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ=="], "playwright-slack-report/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], @@ -11205,6 +11411,8 @@ "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + "promise-retry/retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], "proxy-addr/ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], @@ -11219,14 +11427,10 @@ "public-encrypt/bn.js": ["bn.js@4.12.2", "", {}, "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw=="], - "publish-browser-extension/dotenv": ["dotenv@16.6.1", "", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="], + "publish-browser-extension/dotenv": ["dotenv@17.2.3", "", {}, "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w=="], "publish-browser-extension/listr2": ["listr2@8.3.3", "", { "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ=="], - "publish-browser-extension/open": ["open@10.2.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "wsl-utils": "^0.1.0" } }, "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA=="], - - "publish-browser-extension/ora": ["ora@6.3.1", "", { "dependencies": { "chalk": "^5.0.0", "cli-cursor": "^4.0.0", "cli-spinners": "^2.6.1", "is-interactive": "^2.0.0", "is-unicode-supported": "^1.1.0", "log-symbols": "^5.1.0", "stdin-discarder": "^0.1.0", "strip-ansi": "^7.0.1", "wcwidth": "^1.0.1" } }, "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ=="], - "publish-browser-extension/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "pvtsutils/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -11261,7 +11465,7 @@ "react-devtools-core/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], - "react-docgen/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "react-docgen/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "react-docgen/strip-indent": ["strip-indent@4.1.1", "", {}, "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA=="], @@ -11315,7 +11519,7 @@ "react-remove-scroll-bar/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "react-scripts/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "react-scripts/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "react-scripts/@svgr/webpack": ["@svgr/webpack@5.5.0", "", { "dependencies": { "@babel/core": "^7.12.3", "@babel/plugin-transform-react-constant-elements": "^7.12.1", "@babel/preset-env": "^7.12.1", "@babel/preset-react": "^7.12.5", "@svgr/core": "^5.5.0", "@svgr/plugin-jsx": "^5.5.0", "@svgr/plugin-svgo": "^5.5.0", "loader-utils": "^2.0.0" } }, "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g=="], @@ -11331,6 +11535,8 @@ "react-scripts/jest-watch-typeahead": ["jest-watch-typeahead@1.1.0", "", { "dependencies": { "ansi-escapes": "^4.3.1", "chalk": "^4.0.0", "jest-regex-util": "^28.0.0", "jest-watcher": "^28.0.0", "slash": "^4.0.0", "string-length": "^5.0.1", "strip-ansi": "^7.0.1" }, "peerDependencies": { "jest": "^27.0.0 || ^28.0.0" } }, "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw=="], + "react-scripts/tailwindcss": ["tailwindcss@3.4.18", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ=="], + "react-scripts/terser-webpack-plugin": ["terser-webpack-plugin@5.3.14", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw=="], "react-style-singleton/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -11355,6 +11561,8 @@ "recursive-readdir/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "regjsparser/jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + "relay-runtime/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], "renderkid/css-select": ["css-select@4.3.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" } }, "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ=="], @@ -11549,12 +11757,6 @@ "table/slice-ansi": ["slice-ansi@4.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ=="], - "tailwindcss/jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], - - "tailwindcss/lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], - - "tailwindcss/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], - "tamagui-loader/esbuild-loader": ["esbuild-loader@4.4.0", "", { "dependencies": { "esbuild": "^0.25.0", "get-tsconfig": "^4.10.1", "loader-utils": "^2.0.4", "webpack-sources": "^1.4.3" }, "peerDependencies": { "webpack": "^4.40.0 || ^5.0.0" } }, "sha512-4J+hXTpTtEdzUNLoY8ReqDNJx2NoldfiljRCiKbeYUuZmVaiJeDqFgyAzz8uOopaekwRoCcqBFyEroGQLFVZ1g=="], "tamagui-loader/loader-utils": ["loader-utils@3.3.1", "", {}, "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg=="], @@ -11729,7 +11931,7 @@ "widest-line/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], - "workbox-build/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "workbox-build/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "workbox-build/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], @@ -11793,6 +11995,12 @@ "@aws-sdk/client-cloudwatch-logs/@smithy/util-retry/@smithy/service-error-classification": ["@smithy/service-error-classification@4.2.3", "", { "dependencies": { "@smithy/types": "^4.8.0" } }, "sha512-NkxsAxFWwsPsQiwFG2MzJ/T7uIR6AQNh1SzcxSUnmmIqIQMlLRQDKhc17M7IYjiuBXhrQRjQTo3CxX+DobS93g=="], + "@aws-sdk/client-cognito-identity/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.916.0", "", { "dependencies": { "@aws-sdk/core": "3.916.0", "@aws-sdk/credential-provider-env": "3.916.0", "@aws-sdk/credential-provider-http": "3.916.0", "@aws-sdk/credential-provider-process": "3.916.0", "@aws-sdk/credential-provider-sso": "3.916.0", "@aws-sdk/credential-provider-web-identity": "3.916.0", "@aws-sdk/nested-clients": "3.916.0", "@aws-sdk/types": "3.914.0", "@smithy/credential-provider-imds": "^4.2.3", "@smithy/property-provider": "^4.2.3", "@smithy/shared-ini-file-loader": "^4.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-iR0FofvdPs87o6MhfNPv0F6WzB4VZ9kx1hbvmR7bSFCk7l0gc7G4fHJOg4xg2lsCptuETboX3O/78OQ2Djeakw=="], + + "@aws-sdk/client-cognito-identity/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.916.0", "", { "dependencies": { "@aws-sdk/core": "3.916.0", "@aws-sdk/nested-clients": "3.916.0", "@aws-sdk/types": "3.914.0", "@smithy/property-provider": "^4.2.3", "@smithy/shared-ini-file-loader": "^4.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-VFnL1EjHiwqi2kR19MLXjEgYBuWViCuAKLGSFGSzfFF/+kSpamVrOSFbqsTk8xwHan8PyNnQg4BNuusXwwLoIw=="], + + "@aws-sdk/client-cognito-identity/@aws-sdk/credential-provider-node/@smithy/property-provider": ["@smithy/property-provider@4.2.3", "", { "dependencies": { "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-+1EZ+Y+njiefCohjlhyOcy1UNYjT+1PwGFHCxA/gYctjg3DQWAU19WigOXAco/Ql8hZokNehpzLd0/+3uCreqQ=="], + "@aws-sdk/client-cognito-identity/@smithy/util-retry/@smithy/service-error-classification": ["@smithy/service-error-classification@4.2.3", "", { "dependencies": { "@smithy/types": "^4.8.0" } }, "sha512-NkxsAxFWwsPsQiwFG2MzJ/T7uIR6AQNh1SzcxSUnmmIqIQMlLRQDKhc17M7IYjiuBXhrQRjQTo3CxX+DobS93g=="], "@aws-sdk/client-iam/@smithy/util-retry/@smithy/service-error-classification": ["@smithy/service-error-classification@4.2.3", "", { "dependencies": { "@smithy/types": "^4.8.0" } }, "sha512-NkxsAxFWwsPsQiwFG2MzJ/T7uIR6AQNh1SzcxSUnmmIqIQMlLRQDKhc17M7IYjiuBXhrQRjQTo3CxX+DobS93g=="], @@ -11811,6 +12019,12 @@ "@babel/register/source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "@binance/w3w-qrcode-modal/tailwindcss/jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], + + "@binance/w3w-qrcode-modal/tailwindcss/lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], + + "@binance/w3w-qrcode-modal/tailwindcss/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + "@chromatic-com/storybook/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "@commitlint/format/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -12083,7 +12297,7 @@ "@jest/core/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "@jest/core/jest-config/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "@jest/core/jest-config/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "@jest/core/jest-config/@jest/test-sequencer": ["@jest/test-sequencer@29.7.0", "", { "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "slash": "^3.0.0" } }, "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw=="], @@ -12103,7 +12317,7 @@ "@jest/fake-timers/jest-util/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "@jest/reporters/@jest/transform/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "@jest/reporters/@jest/transform/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "@jest/reporters/@jest/transform/babel-plugin-istanbul": ["babel-plugin-istanbul@7.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^6.0.0" } }, "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA=="], @@ -12169,6 +12383,14 @@ "@nicolo-ribaudo/eslint-scope-5-internals/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], + "@npmcli/package-json/glob/foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "@npmcli/package-json/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@npmcli/package-json/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "@npmcli/package-json/hosted-git-info/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], + "@nx/js/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "@nx/js/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -12261,6 +12483,10 @@ "@react-native/metro-babel-transformer/@react-native/babel-preset/@react-native/babel-plugin-codegen": ["@react-native/babel-plugin-codegen@0.77.2", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.77.2" } }, "sha512-2PShbsfsa4NZS+Zt0y2tl1AoWza5podKFmPE5qcYjJoN915VoH3BRkiTVlSpYNKmdvs31o1aQuXAMQDTh7DZ/g=="], + "@react-router/dev/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "@react-router/serve/source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/sign-client": ["@walletconnect/sign-client@2.21.0", "", { "dependencies": { "@walletconnect/core": "2.21.0", "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/logger": "2.1.2", "@walletconnect/time": "1.0.2", "@walletconnect/types": "2.21.0", "@walletconnect/utils": "2.21.0", "events": "3.3.0" } }, "sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA=="], "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/types": ["@walletconnect/types@2.21.0", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "events": "3.3.0" } }, "sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw=="], @@ -12377,6 +12603,34 @@ "@swc/jest/@jest/create-cache-key-function/@jest/types": ["@jest/types@30.2.0", "", { "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg=="], + "@tailwindcss/node/lightningcss/lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ=="], + + "@tailwindcss/node/lightningcss/lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA=="], + + "@tailwindcss/node/lightningcss/lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig=="], + + "@tailwindcss/node/lightningcss/lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.1", "", { "os": "linux", "cpu": "arm" }, "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q=="], + + "@tailwindcss/node/lightningcss/lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw=="], + + "@tailwindcss/node/lightningcss/lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ=="], + + "@tailwindcss/node/lightningcss/lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw=="], + + "@tailwindcss/node/lightningcss/lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ=="], + + "@tailwindcss/node/lightningcss/lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA=="], + + "@tailwindcss/node/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="], + + "@tailwindcss/oxide/tar/chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "@tailwindcss/oxide/tar/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "@tailwindcss/oxide/tar/minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], + + "@tailwindcss/oxide/tar/yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + "@tamagui/build/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="], "@tamagui/build/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q=="], @@ -12577,7 +12831,7 @@ "babel-plugin-emotion/babel-plugin-macros/cosmiconfig": ["cosmiconfig@6.0.0", "", { "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.7.2" } }, "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg=="], - "babel-plugin-istanbul/istanbul-lib-instrument/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "babel-plugin-istanbul/istanbul-lib-instrument/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "babel-plugin-istanbul/test-exclude/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], @@ -12633,16 +12887,6 @@ "chromium-edge-launcher/lighthouse-logger/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - "cli-highlight/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - - "cli-highlight/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - - "cli-highlight/parse5-htmlparser2-tree-adapter/parse5": ["parse5@6.0.1", "", {}, "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="], - - "cli-highlight/yargs/cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], - - "cli-highlight/yargs/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], - "clipboardy/execa/get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], "clipboardy/execa/human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="], @@ -12691,7 +12935,7 @@ "create-jest/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "create-jest/jest-config/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "create-jest/jest-config/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "create-jest/jest-config/@jest/test-sequencer": ["@jest/test-sequencer@29.7.0", "", { "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "slash": "^3.0.0" } }, "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw=="], @@ -12967,8 +13211,6 @@ "express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - "extract-zip/get-stream/pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], - "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "find-file-up/resolve-dir/expand-tilde": ["expand-tilde@1.2.2", "", { "dependencies": { "os-homedir": "^1.0.1" } }, "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q=="], @@ -13165,7 +13407,7 @@ "jest-cli/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "jest-cli/jest-config/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "jest-cli/jest-config/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "jest-cli/jest-config/@jest/test-sequencer": ["@jest/test-sequencer@29.7.0", "", { "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "slash": "^3.0.0" } }, "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw=="], @@ -13437,6 +13679,10 @@ "matcher-collection/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "md5.js/hash-base/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "meow/normalize-package-data/hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], + "metro-config/cosmiconfig/import-fresh": ["import-fresh@2.0.0", "", { "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" } }, "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg=="], "metro-config/cosmiconfig/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], @@ -13489,6 +13735,8 @@ "module-lookup-amd/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "morgan/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + "moti/framer-motion/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "multimatch/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], @@ -13517,7 +13765,11 @@ "node-stdlib-browser/pkg-dir/find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], - "normalize-package-data/hosted-git-info/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + "normalize-package-data/hosted-git-info/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], + + "npm-pick-manifest/npm-package-arg/hosted-git-info": ["hosted-git-info@6.1.3", "", { "dependencies": { "lru-cache": "^7.5.1" } }, "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw=="], + + "npm-pick-manifest/npm-package-arg/validate-npm-package-name": ["validate-npm-package-name@5.0.1", "", {}, "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ=="], "nx/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -13527,7 +13779,7 @@ "nyc/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - "nyc/istanbul-lib-instrument/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "nyc/istanbul-lib-instrument/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "nyc/istanbul-lib-source-maps/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], @@ -13583,24 +13835,6 @@ "publish-browser-extension/listr2/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], - "publish-browser-extension/open/define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], - - "publish-browser-extension/ora/chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="], - - "publish-browser-extension/ora/cli-cursor": ["cli-cursor@4.0.0", "", { "dependencies": { "restore-cursor": "^4.0.0" } }, "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg=="], - - "publish-browser-extension/ora/cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], - - "publish-browser-extension/ora/is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="], - - "publish-browser-extension/ora/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="], - - "publish-browser-extension/ora/log-symbols": ["log-symbols@5.1.0", "", { "dependencies": { "chalk": "^5.0.0", "is-unicode-supported": "^1.1.0" } }, "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA=="], - - "publish-browser-extension/ora/stdin-discarder": ["stdin-discarder@0.1.0", "", { "dependencies": { "bl": "^5.0.0" } }, "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ=="], - - "publish-browser-extension/ora/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "qrcode/yargs/cliui": ["cliui@6.0.0", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ=="], "qrcode/yargs/y18n": ["y18n@4.0.3", "", {}, "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="], @@ -13651,13 +13885,13 @@ "react-native-monorepo-tools/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - "react-native-svg-transformer/@svgr/core/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "react-native-svg-transformer/@svgr/core/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "react-native-svg-transformer/@svgr/core/@svgr/babel-preset": ["@svgr/babel-preset@8.1.0", "", { "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", "@svgr/babel-plugin-transform-svg-component": "8.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug=="], "react-native-svg-transformer/@svgr/core/cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="], - "react-native-svg-transformer/@svgr/plugin-jsx/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "react-native-svg-transformer/@svgr/plugin-jsx/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "react-native-svg-transformer/@svgr/plugin-jsx/@svgr/babel-preset": ["@svgr/babel-preset@8.1.0", "", { "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", "@svgr/babel-plugin-transform-svg-component": "8.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug=="], @@ -13707,6 +13941,12 @@ "react-scripts/jest-watch-typeahead/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "react-scripts/tailwindcss/jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], + + "react-scripts/tailwindcss/lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], + + "react-scripts/tailwindcss/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + "react-scripts/terser-webpack-plugin/schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], "react-scripts/terser-webpack-plugin/terser": ["terser@5.44.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w=="], @@ -13885,13 +14125,13 @@ "vite-plugin-bundlesize/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "vite-plugin-svgr/@svgr/core/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "vite-plugin-svgr/@svgr/core/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "vite-plugin-svgr/@svgr/core/@svgr/babel-preset": ["@svgr/babel-preset@8.1.0", "", { "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", "@svgr/babel-plugin-transform-svg-component": "8.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug=="], "vite-plugin-svgr/@svgr/core/cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="], - "vite-plugin-svgr/@svgr/plugin-jsx/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "vite-plugin-svgr/@svgr/plugin-jsx/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "vite-plugin-svgr/@svgr/plugin-jsx/@svgr/babel-preset": ["@svgr/babel-preset@8.1.0", "", { "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", "@svgr/babel-plugin-transform-svg-component": "8.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug=="], @@ -14171,6 +14411,8 @@ "@metamask/sdk/cross-fetch/node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + "@npmcli/package-json/glob/foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "@nx/js/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "@nx/workspace/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -14213,7 +14455,7 @@ "@react-native/babel-plugin-codegen/@react-native/codegen/hermes-parser/hermes-estree": ["hermes-estree@0.23.1", "", {}, "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg=="], - "@react-native/babel-plugin-codegen/@react-native/codegen/jscodeshift/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "@react-native/babel-plugin-codegen/@react-native/codegen/jscodeshift/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "@react-native/babel-plugin-codegen/@react-native/codegen/jscodeshift/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -14345,10 +14587,6 @@ "chromium-edge-launcher/lighthouse-logger/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - "cli-highlight/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - - "cli-highlight/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - "clipboardy/execa/npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], "clipboardy/execa/onetime/mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], @@ -14437,7 +14675,7 @@ "expo-modules-autolinking/find-up/locate-path/p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], - "expo/babel-preset-expo/@react-native/babel-preset/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], + "expo/babel-preset-expo/@react-native/babel-preset/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "expo/babel-preset-expo/@react-native/babel-preset/@react-native/babel-plugin-codegen": ["@react-native/babel-plugin-codegen@0.76.9", "", { "dependencies": { "@react-native/codegen": "0.76.9" } }, "sha512-vxL/vtDEIYHfWKm5oTaEmwcnNGsua/i9OjIxBDBFiJDu5i5RU3bpmDiXQm/bJxrJNPRp5lW0I0kpGihVhnMAIQ=="], @@ -14675,6 +14913,12 @@ "madge/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "md5.js/hash-base/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "md5.js/hash-base/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "meow/normalize-package-data/hosted-git-info/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + "metro-config/cosmiconfig/import-fresh/resolve-from": ["resolve-from@3.0.0", "", {}, "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw=="], "metro-config/cosmiconfig/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], @@ -14703,7 +14947,7 @@ "node-stdlib-browser/pkg-dir/find-up/locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], - "normalize-package-data/hosted-git-info/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + "npm-pick-manifest/npm-package-arg/hosted-git-info/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], "nx/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -14749,12 +14993,6 @@ "publish-browser-extension/listr2/wrap-ansi/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "publish-browser-extension/ora/cli-cursor/restore-cursor": ["restore-cursor@4.0.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg=="], - - "publish-browser-extension/ora/stdin-discarder/bl": ["bl@5.1.0", "", { "dependencies": { "buffer": "^6.0.3", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ=="], - - "publish-browser-extension/ora/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "qrcode/yargs/yargs-parser/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], "quick-temp/rimraf/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], @@ -14819,7 +15057,7 @@ "react-scripts/babel-jest/@jest/transform/write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], - "react-scripts/babel-jest/@jest/types/@types/yargs": ["@types/yargs@16.0.9", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA=="], + "react-scripts/babel-jest/@jest/types/@types/yargs": ["@types/yargs@16.0.10", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-0xbOE6Ht/oj0MTVVXCCdEZzUk7adwW3YB1Tg1ZBm95jrkrUMI0VA4sf3SgxC1TG8p5aKkn3jxT9A2BDw1mM/TQ=="], "react-scripts/babel-jest/babel-preset-jest/babel-plugin-jest-hoist": ["babel-plugin-jest-hoist@27.5.1", "", { "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.0.0", "@types/babel__traverse": "^7.0.6" } }, "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ=="], @@ -14827,7 +15065,7 @@ "react-scripts/babel-jest/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "react-scripts/jest-resolve/@jest/types/@types/yargs": ["@types/yargs@16.0.9", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA=="], + "react-scripts/jest-resolve/@jest/types/@types/yargs": ["@types/yargs@16.0.10", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-0xbOE6Ht/oj0MTVVXCCdEZzUk7adwW3YB1Tg1ZBm95jrkrUMI0VA4sf3SgxC1TG8p5aKkn3jxT9A2BDw1mM/TQ=="], "react-scripts/jest-resolve/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -15113,8 +15351,6 @@ "@walletconnect/logger/pino/pino-abstract-transport/duplexify/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "cli-highlight/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "create-jest/jest-config/@jest/test-sequencer/@jest/test-result/@jest/console": ["@jest/console@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0" } }, "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg=="], "create-jest/jest-config/@jest/test-sequencer/jest-haste-map/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], @@ -15247,6 +15483,8 @@ "lint-staged/listr2/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + "meow/normalize-package-data/hosted-git-info/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + "metro-config/jest-validate/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "metro-file-map/jest-worker/jest-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -15283,8 +15521,6 @@ "publish-browser-extension/listr2/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "publish-browser-extension/ora/stdin-discarder/bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "quick-temp/rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], "react-dev-utils/find-up/locate-path/p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], diff --git a/bunfig.toml b/bunfig.toml index 4cdb2e085d6..7e77312bf13 100644 --- a/bunfig.toml +++ b/bunfig.toml @@ -6,6 +6,7 @@ telemetry = false # Use node_modules (default behavior) linkStrategy = "node" +linker = "hoisted" # Save exact versions (equivalent to defaultSemverRangePrefix: '') save = "exact" diff --git a/config/jest-presets/jest/jest-preset.js b/config/jest-presets/jest/jest-preset.js index c151e795496..234dc5839ea 100644 --- a/config/jest-presets/jest/jest-preset.js +++ b/config/jest-presets/jest/jest-preset.js @@ -19,7 +19,7 @@ module.exports = { // '/packages/**/src/**/*.ts', // ], moduleDirectories: ['node_modules', 'src'], - moduleFileExtensions: ['jest.tsx', 'jest.ts', 'ts', 'tsx', 'js', 'mjs', 'cjs', 'jsx', 'json', 'node', 'mp4'], + moduleFileExtensions: ['web.tsx', 'web.ts', 'jest.tsx', 'jest.ts', 'ts', 'tsx', 'js', 'mjs', 'cjs', 'jsx', 'json', 'node', 'mp4'], moduleNameMapper: { '.+\\.(css|style|less|sass|scss|png|jpg|ttf|woff|woff2|mp4)$': 'jest-transform-stub', // Jest by default doesn't support absolute imports out of the box diff --git a/config/jest-presets/jest/setup.js b/config/jest-presets/jest/setup.js index 53cf1b368e0..bc4893acdfb 100644 --- a/config/jest-presets/jest/setup.js +++ b/config/jest-presets/jest/setup.js @@ -48,6 +48,17 @@ jest.mock('expo-haptics', () => ({ })) jest.mock('expo-linear-gradient', () => ({ LinearGradient: () => 'ExpoLinearGradient' })) jest.mock('expo-screen-capture', () => ({ addScreenshotListener: jest.fn() })) +jest.mock('expo-secure-store', () => ({ + getItemAsync: jest.fn(() => Promise.resolve(null)), + setItemAsync: jest.fn(() => Promise.resolve()), + deleteItemAsync: jest.fn(() => Promise.resolve()), +})) +jest.mock('expo-local-authentication', () => ({ + authenticateAsync: jest.fn(() => Promise.resolve({ success: true })), + hasHardwareAsync: jest.fn(() => Promise.resolve(true)), + isEnrolledAsync: jest.fn(() => Promise.resolve(true)), + supportedAuthenticationTypesAsync: jest.fn(() => Promise.resolve([1, 2])), +})) // Mock Amplitde log reporting jest.mock('@amplitude/analytics-react-native', () => ({ diff --git a/package.json b/package.json index f42f4722421..a914f1ad9eb 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,6 @@ "i18next-parser": "8.6.0", "inquirer": "8.2.6", "js-yaml": "4.1.0", - "jsonc-parser": "3.2.0", "knip": "5.50.5", "lefthook": "1.12.2", "moti": "0.29.0", @@ -43,7 +42,7 @@ }, "engines": { "node": "=22.13.1", - "bun": ">=1.2.21", + "bun": ">=1.3.1", "npm": "please-use-bun" }, "manypkg": { @@ -170,7 +169,7 @@ "g:test": "nx run-many -t test", "g:test:coverage": "nx run-many -t test -- --collectCoverage=true", "g:test:coverage:rest": "nx run-many -t test --projects uniswap,@uniswap/eslint-config -- --collectCoverage=true", - "g:test:coverage:vitest": "nx run-many -t test:coverage --projects @universe/api,@universe/sessions,utilities,ui", + "g:test:coverage:vitest": "nx run-many -t test:coverage --projects @universe/api,@universe/notifications,@universe/sessions,utilities,ui", "g:test:coverage:web": "nx test @universe/web -- --coverage", "g:test:coverage:web:set1": "nx test:set1 @universe/web -- --coverage", "g:test:coverage:web:set2": "nx test:set2 @universe/web -- --coverage", @@ -186,6 +185,8 @@ "i18n:upload": "dotenv -e .env.defaults -c -- bun run i18n:_upload", "i18n:_download": "crowdin download", "i18n:download": "dotenv -e .env.defaults -c -- bun run i18n:_download", + "tradingapi:schema": "nx run-many -t tradingapi:schema", + "tradingapi:generate": "nx run-many -t tradingapi:generate", "upgrade:tamagui": "bun update '*tamagui*' '@tamagui/*'", "upgrade:tamagui:canary": "bun update '*tamagui*'@canary '@tamagui/*'@canary", "wallet:release:setup-cherry-pick-branches": "bunx tsx ./scripts/wallet-releases/generate-cherry-pick-branches-for-release.ts", @@ -196,7 +197,6 @@ "workspaces": ["apps/*", "packages/*", "config/*", "tools/uniswap-nx"], "patchedDependencies": { "@gorhom/bottom-sheet@4.6.4": "patches/@gorhom%2Fbottom-sheet@4.6.4.patch", - "lightweight-charts@4.1.1": "patches/lightweight-charts@4.1.1.patch", "multiformats@9.9.0": "patches/multiformats@9.9.0.patch", "react-native-context-menu-view@1.15.0": "patches/react-native-context-menu-view@1.15.0.patch", "react-native-fast-image@8.6.3": "patches/react-native-fast-image@8.6.3.patch", diff --git a/packages/api/package.json b/packages/api/package.json index 974abf0ef5b..f5197982523 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -28,7 +28,7 @@ "@uniswap/client-data-api": "0.0.18", "@uniswap/client-embeddedwallet": "0.0.16", "@uniswap/client-explore": "0.0.17", - "@uniswap/client-trading": "0.1.0", + "@uniswap/client-trading": "0.1.2", "@universe/config": "workspace:^", "@universe/sessions": "workspace:^", "expo-secure-store": "14.0.1", @@ -42,6 +42,7 @@ "@graphql-codegen/typescript-operations": "3.0.4", "@graphql-codegen/typescript-react-apollo": "3.3.7", "@graphql-codegen/typescript-resolvers": "3.2.1", + "@testing-library/react": "16.1.0", "@types/chrome": "0.0.304", "@types/node": "22.13.1", "@types/react": "18.3.18", diff --git a/packages/api/src/clients/base/createFetchClient.ts b/packages/api/src/clients/base/createFetchClient.ts index 2923a59ff46..ffd9e04137c 100644 --- a/packages/api/src/clients/base/createFetchClient.ts +++ b/packages/api/src/clients/base/createFetchClient.ts @@ -35,10 +35,6 @@ export function createFetchClient({ } return fetch(`${baseUrl}${path}`, { ...options, - // Do NOT remove this, session cookies need to be sent with the request! - // Note: this causes CORS errors when running web locally - // TODO(app-infra): Re-enable this when we have a solution - // credentials: 'include', headers, }) as Promise } diff --git a/packages/api/src/clients/graphql/queries.ts b/packages/api/src/clients/graphql/queries.ts index ed65c0624de..cd316c21637 100644 --- a/packages/api/src/clients/graphql/queries.ts +++ b/packages/api/src/clients/graphql/queries.ts @@ -10,7 +10,6 @@ export enum GQLQueries { TokenDetailsScreen = 'TokenDetailsScreen', TokenPriceHistory = 'TokenPriceHistory', TokenProjects = 'TokenProjects', - TransactionList = 'TransactionList', TopTokens = 'TopTokens', SearchTokens = 'SearchTokens', ExploreSearch = 'ExploreSearch', diff --git a/packages/api/src/clients/graphql/web/token.graphql b/packages/api/src/clients/graphql/web/token.graphql index a1bb2b6ad9b..da03c9b3284 100644 --- a/packages/api/src/clients/graphql/web/token.graphql +++ b/packages/api/src/clients/graphql/web/token.graphql @@ -40,6 +40,7 @@ query TokenWeb($chain: Chain!, $address: String = null) { homepageUrl twitterName logoUrl + isSpam tokens { id chain @@ -77,6 +78,7 @@ query TokenProjectWeb($chain: Chain!, $address: String = null) { homepageUrl twitterName logoUrl + isSpam tokens { id chain diff --git a/packages/api/src/clients/notifications/types.ts b/packages/api/src/clients/notifications/types.ts index d0b31810112..c9acbe09b44 100644 --- a/packages/api/src/clients/notifications/types.ts +++ b/packages/api/src/clients/notifications/types.ts @@ -5,16 +5,47 @@ export interface NotificationsClientContext { getApiPathPrefix?: () => string } +/** + * Content style types for notifications + * These determine how the notification is displayed and deduplication rules + * TODO: This will be replaced with OpenAPI-generated types once the spec is integrated + */ +export type NotificationContentStyle = 'CONTENT_STYLE_LOWER_LEFT_BANNER' | 'CONTENT_STYLE_MODAL' | string // Allow other styles that may be added + +/** + * Button configuration for notification content + * TODO: This will be replaced with OpenAPI-generated types once the spec is integrated + */ +export interface NotificationButton { + text: string + onClickType: string + onClickLink?: string + isPrimary?: boolean +} + +/** + * TODO: This will be replaced with OpenAPI-generated types once the spec is integrated + */ +export interface NotificationContent { + title: string + subtitle?: string + style: NotificationContentStyle + buttons?: NotificationButton[] + backgroundOnClickType?: string + backgroundType?: string + onDismissClick?: string +} + /** * In-app notification returned by the notifications API * TODO: This will be replaced with OpenAPI-generated types once the spec is integrated */ export interface InAppNotification { - notification_id: string - notification_name: string - meta_data: Record - content: Record - criteria: Record + id: string + notificationName: string + metaData: Record + content: NotificationContent + timestamp?: number } /** diff --git a/packages/api/src/clients/trading/createTradingApiClient.ts b/packages/api/src/clients/trading/createTradingApiClient.ts index 84eb4149f0c..7541bfed9a1 100644 --- a/packages/api/src/clients/trading/createTradingApiClient.ts +++ b/packages/api/src/clients/trading/createTradingApiClient.ts @@ -46,11 +46,11 @@ import type { import { RoutingPreference } from '@universe/api/src/clients/trading/__generated__' import type { DiscriminatedQuoteResponse, - ExistingTradeRequest, - NewTradeRequest, + ExistingPlanRequest, + NewPlanRequest, + PlanResponse, SwappableTokensParams, - TradeResponse, - UpdateExistingTradeRequest, + UpdateExistingPlanRequest, } from '@universe/api/src/clients/trading/tradeTypes' import { logger } from 'utilities/src/logger/logger' @@ -71,12 +71,12 @@ export const TRADING_API_PATHS = { order: 'order', orders: 'orders', quote: 'quote', + plan: 'plan', swap: 'swap', swap5792: 'swap_5792', swap7702: 'swap_7702', swappableTokens: 'swappable_tokens', swaps: 'swaps', - trade: 'trade', wallet: { checkDelegation: 'wallet/check_delegation', encode7702: 'wallet/encode_7702', @@ -120,10 +120,10 @@ export interface TradingApiClient { checkWalletDelegationWithoutBatching: ( params: WalletCheckDelegationRequestBody, ) => Promise - fetchNewTrade: (params: NewTradeRequest) => Promise - fetchTrade: (params: ExistingTradeRequest) => Promise - updateExistingTrade: (params: UpdateExistingTradeRequest) => Promise - getExistingTrade: (params: ExistingTradeRequest) => Promise + createNewPlan: (params: NewPlanRequest) => Promise + fetchPlan: (params: ExistingPlanRequest) => Promise + updateExistingPlan: (params: UpdateExistingPlanRequest) => Promise + getExistingPlan: (params: ExistingPlanRequest) => Promise } type IndicativeQuoteRequest = Pick< @@ -385,9 +385,9 @@ export function createTradingApiClient(ctx: TradingClientContext): TradingApiCli }) // TODO: SWAP-429 - Uses this endpoint. - const fetchNewTrade = createFetcher({ + const fetchNewPlan = createFetcher({ client, - url: getApiPath(TRADING_API_PATHS.trade), + url: getApiPath(TRADING_API_PATHS.plan), method: 'post', transformRequest: async () => ({ headers: getCombinedHeaders(), @@ -395,9 +395,9 @@ export function createTradingApiClient(ctx: TradingClientContext): TradingApiCli }) // TODO: SWAP-434 - Uses this endpoint. - const fetchTrade = createFetcher({ + const fetchPlan = createFetcher({ client, - url: getApiPath(TRADING_API_PATHS.trade), + url: getApiPath(TRADING_API_PATHS.plan), method: 'post', transformRequest: async () => ({ headers: getCombinedHeaders(), @@ -405,27 +405,27 @@ export function createTradingApiClient(ctx: TradingClientContext): TradingApiCli }) // TODO: SWAP-434 - Uses this endpoint. - const updateExistingTrade = createFetcher({ + const updateExistingPlan = createFetcher({ client, - url: getApiPath(TRADING_API_PATHS.trade), + url: getApiPath(TRADING_API_PATHS.plan), method: 'patch', transformRequest: async ({ params, url }) => ({ headers: getCombinedHeaders(), params: { steps: params.steps, }, - url: `${url}/${params.tradeId}`, + url: `${url}/${params.planId}`, }), }) // TODO: SWAP-438 - Uses this endpoint. - const getExistingTrade = createFetcher({ + const getExistingPlan = createFetcher({ client, - url: getApiPath(TRADING_API_PATHS.trade), + url: getApiPath(TRADING_API_PATHS.plan), method: 'get', transformRequest: async ({ params, url }) => ({ headers: getCombinedHeaders(), - url: `${url}/${params.tradeId}`, + url: `${url}/${params.planId}`, }), }) @@ -452,9 +452,9 @@ export function createTradingApiClient(ctx: TradingClientContext): TradingApiCli fetchClaimLpIncentiveRewards, fetchWalletEncoding7702, checkWalletDelegationWithoutBatching, - fetchNewTrade, - fetchTrade, - updateExistingTrade, - getExistingTrade, + createNewPlan: fetchNewPlan, + fetchPlan, + updateExistingPlan, + getExistingPlan, } } diff --git a/packages/api/src/clients/trading/tradeTypes.ts b/packages/api/src/clients/trading/tradeTypes.ts index 7d415342ea1..858f3d45068 100644 --- a/packages/api/src/clients/trading/tradeTypes.ts +++ b/packages/api/src/clients/trading/tradeTypes.ts @@ -60,23 +60,24 @@ export interface PlanStep { timeEstimateMs: number } -export interface TradeResponse { - tradeId: string +export interface PlanResponse { + planId: string steps: PlanStep[] expectedOutput: number timeEstimateMs: number //ms gasFee: string } -export interface NewTradeRequest { +export interface NewPlanRequest { quote: Quote + routing: Routing.CHAINED } -export interface ExistingTradeRequest { - tradeId: string +export interface ExistingPlanRequest { + planId: string } -export interface UpdateExistingTradeRequest extends ExistingTradeRequest { +export interface UpdateExistingPlanRequest extends ExistingPlanRequest { steps: { stepId: string proof: StepProof diff --git a/packages/api/src/components/ApiInit.test.tsx b/packages/api/src/components/ApiInit.test.tsx new file mode 100644 index 00000000000..352389c9b18 --- /dev/null +++ b/packages/api/src/components/ApiInit.test.tsx @@ -0,0 +1,306 @@ +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { render, waitFor } from '@testing-library/react' +import { ApiInit } from '@universe/api/src/components/ApiInit' +import { + createChallengeSolverService, + createDeviceIdService, + createSessionInitializationService, + createSessionRepository, + createSessionService, + createSessionStorage, + type DeviceIdService, + type SessionInitializationService, + type SessionService, + type SessionStorage, +} from '@universe/sessions' +import React from 'react' +import { sleep } from 'utilities/src/time/timing' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +// Mock platform detection - we're testing as extension by default +vi.mock('utilities/src/platform', () => ({ + isWeb: false, + isExtension: true, + isInterface: false, +})) + +// Mock the session service enabled flag +vi.mock('@universe/api/src/getIsSessionServiceEnabled', () => ({ + getIsSessionServiceEnabled: vi.fn(() => true), +})) + +describe('ApiInit Integration', () => { + // Services and mocked boundaries + let queryClient: QueryClient + let mockStorage: Map + let mockApiClient: { + initSession: ReturnType + challenge: ReturnType + verify: ReturnType + upgradeSession: ReturnType + } + let sessionStorage: SessionStorage + let deviceIdService: DeviceIdService + let sessionService: SessionService + let initService: SessionInitializationService + + beforeEach(() => { + vi.clearAllMocks() + + // Mock only the boundaries (storage and network) + mockStorage = new Map() + mockApiClient = { + initSession: vi.fn().mockResolvedValue({ + sessionId: 'test-session-123', + needChallenge: false, + extra: {}, + }), + challenge: vi.fn().mockResolvedValue({ + challengeId: 'challenge-456', + botDetectionType: 'Turnstile', + extra: { sitekey: 'mock-sitekey' }, + }), + verify: vi.fn().mockResolvedValue({ + retry: false, + }), + upgradeSession: vi.fn().mockResolvedValue({ + retry: false, + }), + } + + // Create REAL service instances with mocked boundaries + sessionStorage = createSessionStorage({ + getSessionId: async () => mockStorage.get('sessionId') || null, + setSessionId: async (id) => { + mockStorage.set('sessionId', id) + }, + clearSessionId: async () => { + mockStorage.delete('sessionId') + }, + }) + + deviceIdService = createDeviceIdService({ + getDeviceId: async () => mockStorage.get('deviceId') || '', + setDeviceId: async (id) => { + mockStorage.set('deviceId', id) + }, + removeDeviceId: async () => { + mockStorage.delete('deviceId') + }, + }) + + const sessionRepository = createSessionRepository({ + client: mockApiClient as any, + }) + + sessionService = createSessionService({ + sessionStorage, + deviceIdService, + sessionRepository, + }) + + const challengeSolverService = createChallengeSolverService() + // Add a mock solver for Turnstile + challengeSolverService.getSolver = vi.fn().mockReturnValue({ + solve: vi.fn().mockResolvedValue('mock-solution'), + }) + + initService = createSessionInitializationService({ + sessionService, + challengeSolverService, + }) + + // Fresh query client for each test + queryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: false, + gcTime: 0, + }, + }, + }) + }) + + afterEach(() => { + vi.clearAllMocks() + }) + + it('initializes session and makes it available for API requests', async () => { + // Act: Render the component + render( + + + , + ) + + // Assert: Session was initialized + await waitFor(() => { + expect(mockApiClient.initSession).toHaveBeenCalled() + }) + + // Wait a bit for async storage operations to complete + await sleep(50) + + // Assert: Session is now stored and retrievable + const storedSession = await sessionStorage.get() + expect(storedSession?.sessionId).toBe('test-session-123') + + // Verify storage was actually set + expect(mockStorage.get('sessionId')).toBe('test-session-123') + }) + + it('completes challenge flow when required by server', async () => { + // Setup: Server requires challenge + mockApiClient.initSession.mockResolvedValue({ + sessionId: 'challenge-session', + needChallenge: true, + extra: {}, + }) + + // Act + render( + + + , + ) + + // Assert: Full flow completes + await waitFor(() => { + expect(mockApiClient.initSession).toHaveBeenCalled() + expect(mockApiClient.challenge).toHaveBeenCalled() + expect(mockApiClient.verify).toHaveBeenCalled() + }) + + // Assert: Session is stored after challenge + const storedSession = await sessionStorage.get() + expect(storedSession?.sessionId).toBe('challenge-session') + }) + + it('uses existing session without re-initialization', async () => { + // Setup: Pre-populate storage with existing session + await sessionStorage.set({ sessionId: 'existing-session' }) + + // Mock the service to simulate finding existing session + sessionService.getSessionState = vi.fn().mockResolvedValue({ + sessionId: 'existing-session', + }) + + // Act + render( + + + , + ) + + // Wait for initialization check + await waitFor(() => { + expect(sessionService.getSessionState).toHaveBeenCalled() + }) + + // Assert: API init was NOT called since session exists + expect(mockApiClient.initSession).not.toHaveBeenCalled() + }) + + it('retries initialization on transient failures', async () => { + // Use fake timers to speed up retry delays + vi.useFakeTimers() + + let attemptCount = 0 + + // Mock the initialize method of the initService directly + // This will properly trigger React Query's retry logic + initService.initialize = vi.fn().mockImplementation(async () => { + attemptCount++ + if (attemptCount < 3) { + throw new Error('Network error') + } + // Mock successful initialization after retries + await sessionStorage.set({ sessionId: 'retry-success' }) + return { sessionId: 'retry-success', needChallenge: false, extra: {} } + }) + + // Use query client with no default retries - component controls retry + const retryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: false, // Let component control retries + }, + }, + }) + + // Act + render( + + + , + ) + + // Fast-forward through the retry delays + await vi.waitFor( + async () => { + // Advance timers to trigger retries + await vi.advanceTimersByTimeAsync(1000) // First retry after 1000ms + await vi.advanceTimersByTimeAsync(2000) // Second retry after 2000ms + expect(initService.initialize).toHaveBeenCalledTimes(3) + }, + { timeout: 500 }, // Much faster with fake timers + ) + + const storedSession = await sessionStorage.get() + expect(storedSession?.sessionId).toBe('retry-success') + + // Restore real timers + vi.useRealTimers() + }) + + it('prevents duplicate initialization on re-renders', async () => { + const { rerender } = render( + + + , + ) + + await waitFor(() => { + expect(mockApiClient.initSession).toHaveBeenCalledTimes(1) + }) + + // Re-render multiple times + rerender( + + + , + ) + + rerender( + + + , + ) + + // Wait to ensure no additional calls + await sleep(100) + + // Assert: Still only initialized once due to React Query caching + expect(mockApiClient.initSession).toHaveBeenCalledTimes(1) + }) + + it('should not initialize session when feature flag is disabled', async () => { + // Mock the feature flag as disabled + const { getIsSessionServiceEnabled } = await import('@universe/api/src/getIsSessionServiceEnabled') + vi.mocked(getIsSessionServiceEnabled).mockReturnValue(false) + + render( + + + , + ) + + // Wait to ensure no calls are made + await new Promise((resolve) => setTimeout(resolve, 100)) + + // Assert: No session initialization should occur + expect(mockApiClient.initSession).not.toHaveBeenCalled() + expect(mockApiClient.challenge).not.toHaveBeenCalled() + expect(mockApiClient.upgradeSession).not.toHaveBeenCalled() + }) +}) diff --git a/packages/api/src/components/ApiInit.tsx b/packages/api/src/components/ApiInit.tsx new file mode 100644 index 00000000000..cf2e2e32d51 --- /dev/null +++ b/packages/api/src/components/ApiInit.tsx @@ -0,0 +1,50 @@ +import { queryOptions, useQuery } from '@tanstack/react-query' +import { getIsSessionServiceEnabled } from '@universe/api/src/getIsSessionServiceEnabled' +import type { SessionInitializationService, SessionInitResult } from '@universe/sessions' +import { SessionError } from '@universe/sessions' +import { useMemo } from 'react' +import { ReactQueryCacheKey } from 'utilities/src/reactQuery/cache' + +interface ApiInitProps { + sessionInitService: SessionInitializationService +} + +function createInitServiceQuery(ctx: { + sessionInitService: SessionInitializationService +}): ReturnType> { + return queryOptions({ + queryKey: [ReactQueryCacheKey.Session, 'initialization'], + queryFn: async (): Promise => { + return await ctx.sessionInitService.initialize() + }, + retry: (failureCount, error) => { + // Don't retry any session-related errors - these are terminal errors + if (error instanceof SessionError) { + return false + } + // For other errors (network issues, etc.), retry up to 3 times + return failureCount < 3 + }, + retryDelay: (attemptIndex: number) => Math.min(1000 * 2 ** attemptIndex, 30000), // Exponential backoff + refetchOnMount: false, + refetchOnWindowFocus: false, + refetchOnReconnect: false, + }) +} + +function ApiInit({ sessionInitService }: ApiInitProps): null { + const query = useMemo(() => createInitServiceQuery({ sessionInitService }), [sessionInitService]) + + // Short-circuit if session service is disabled + const shouldInitialize = getIsSessionServiceEnabled() + + useQuery({ + ...query, + enabled: shouldInitialize, + }) + + return null +} + +export { ApiInit } +export type { ApiInitProps } diff --git a/packages/api/src/getDeviceIdService.ts b/packages/api/src/getDeviceIdService.ts new file mode 100644 index 00000000000..ec6945516c1 --- /dev/null +++ b/packages/api/src/getDeviceIdService.ts @@ -0,0 +1,25 @@ +import { createStorageDriver } from '@universe/api/src/storage/createStorageDriver' +import { createDeviceIdService, DeviceIdService } from '@universe/sessions' + +const DEVICE_ID_KEY = 'UNISWAP_DEVICE_ID' + +function getDeviceIdService(): DeviceIdService { + const driver = createStorageDriver() + + const service = createDeviceIdService({ + getDeviceId: async () => { + const deviceId = await driver.get(DEVICE_ID_KEY) + return deviceId || '' + }, + setDeviceId: async (deviceId: string) => { + await driver.set(DEVICE_ID_KEY, deviceId) + }, + removeDeviceId: async () => { + await driver.remove(DEVICE_ID_KEY) + }, + }) + + return service +} + +export { getDeviceIdService } diff --git a/packages/api/src/getSessionService.native.ts b/packages/api/src/getSessionService.native.ts index 14671c25695..ec23e8d66b7 100644 --- a/packages/api/src/getSessionService.native.ts +++ b/packages/api/src/getSessionService.native.ts @@ -1,16 +1,15 @@ -import { SharedQueryClient } from '@universe/api/src/clients/base/SharedQueryClient' +import { getDeviceIdService } from '@universe/api/src/getDeviceIdService' import { getIsSessionServiceEnabled } from '@universe/api/src/getIsSessionServiceEnabled' +import { getSessionStorage } from '@universe/api/src/getSessionStorage' +import { getTransport } from '@universe/api/src/transport' import { - createDeviceIdService, createNoopSessionService, createSessionClient, createSessionRepository, createSessionService, - createSessionStorage, - createTransport, type SessionService, } from '@universe/sessions' -import * as SecureStore from 'expo-secure-store' +import { REQUEST_SOURCE } from 'utilities/src/platform/requestSource' function getSessionService(ctx: { getBaseUrl: () => string }): SessionService { if (!getIsSessionServiceEnabled()) { @@ -19,40 +18,18 @@ function getSessionService(ctx: { getBaseUrl: () => string }): SessionService { return getMobileSessionService(ctx) } -const SESSION_ID_KEY = 'UNISWAP_SESSION_ID' - -const mobileSessionStorage = createSessionStorage({ - getSessionId: async () => { - const sessionId = await SecureStore.getItemAsync(SESSION_ID_KEY) - return sessionId ?? null - }, - setSessionId: async (sessionId) => { - await SecureStore.setItemAsync(SESSION_ID_KEY, sessionId) - }, - clearSessionId: async () => { - await SecureStore.deleteItemAsync(SESSION_ID_KEY) - }, -}) - -const deviceIdService = createDeviceIdService({ - queryClient: SharedQueryClient, -}) - function getMobileSessionService(ctx: { getBaseUrl: () => string }): SessionService { const sessionClient = createSessionClient({ - transport: createTransport({ + transport: getTransport({ getBaseUrl: ctx.getBaseUrl, - getSessionId: (): Promise => mobileSessionStorage.get().then((state) => state?.sessionId ?? null), - getDeviceId: deviceIdService.getDeviceId, + getHeaders: () => ({ 'x-request-source': REQUEST_SOURCE }), }), }) + const sessionStorage = getSessionStorage() + const deviceIdService = getDeviceIdService() const sessionRepository = createSessionRepository({ client: sessionClient }) - - return createSessionService({ - sessionStorage: mobileSessionStorage, - sessionRepository, - }) + return createSessionService({ sessionStorage, deviceIdService, sessionRepository }) } export { getSessionService } diff --git a/packages/api/src/getSessionService.web.ts b/packages/api/src/getSessionService.web.ts index 7da87e5883c..d739de51bcb 100644 --- a/packages/api/src/getSessionService.web.ts +++ b/packages/api/src/getSessionService.web.ts @@ -1,17 +1,16 @@ -import { SharedQueryClient } from '@universe/api/src/clients/base/SharedQueryClient' +import { getDeviceIdService } from '@universe/api/src/getDeviceIdService' import { getIsSessionServiceEnabled } from '@universe/api/src/getIsSessionServiceEnabled' +import { getSessionStorage } from '@universe/api/src/getSessionStorage' +import { getTransport } from '@universe/api/src/transport' import { - createDeviceIdService, createNoopSessionService, createSessionClient, createSessionRepository, createSessionService, - createSessionStorage, - createTransport, type SessionService, } from '@universe/sessions' -import { getChromeWithThrow } from 'utilities/src/chrome/chrome' -import { isExtensionApp, isWebApp } from 'utilities/src/platform' +import { isWebApp } from 'utilities/src/platform' +import { REQUEST_SOURCE } from 'utilities/src/platform/requestSource' function getSessionService(ctx: { getBaseUrl: () => string }): SessionService { if (!getIsSessionServiceEnabled()) { @@ -19,48 +18,51 @@ function getSessionService(ctx: { getBaseUrl: () => string }): SessionService { } if (isWebApp) { // Web doesn't have a session service (cookies are automatically handled by the browser) - return createNoopSessionService() + return getWebAppSessionService(ctx) } return getExtensionSessionService(ctx) } -const SESSION_ID_KEY = 'UNISWAP_SESSION_ID' +/** + * In production, web won't need an explicit session service since cookies are automatically handled by the backend+browser. + * + * For testing, we need this since SessionService is the only backend service that has CORS configured to handle the credentials header. + * + * When more services are added to the Entry Gateway, we can remove this and rely on those typical requests to instantiate the cookie. + */ +function getWebAppSessionService(ctx: { getBaseUrl: () => string }): SessionService { + const sessionClient = createSessionClient({ + transport: getTransport({ + getBaseUrl: ctx.getBaseUrl, + getHeaders: () => ({ 'x-request-source': REQUEST_SOURCE }), + options: { + credentials: 'include', + }, + }), + }) -const chromeSessionStorage = createSessionStorage({ - getSessionId: async () => { - const chrome = getChromeWithThrow() - const sessionId = await chrome.storage.local.get(SESSION_ID_KEY) - return (sessionId as { [SESSION_ID_KEY]: string } | null)?.[SESSION_ID_KEY] ?? null - }, - setSessionId: async (sessionId) => { - const chrome = getChromeWithThrow() - await chrome.storage.local.set({ [SESSION_ID_KEY]: sessionId }) - }, - clearSessionId: async () => { - const chrome = getChromeWithThrow() - await chrome.storage.local.remove(SESSION_ID_KEY) - }, -}) + const sessionRepository = createSessionRepository({ client: sessionClient }) -const deviceIdService = createDeviceIdService({ - queryClient: SharedQueryClient, -}) + return createSessionService({ + sessionStorage: getSessionStorage(), + deviceIdService: getDeviceIdService(), + sessionRepository, + }) +} function getExtensionSessionService(ctx: { getBaseUrl: () => string }): SessionService { const sessionClient = createSessionClient({ - transport: createTransport({ + transport: getTransport({ getBaseUrl: ctx.getBaseUrl, - getSessionId: isExtensionApp - ? (): Promise => chromeSessionStorage.get().then((state) => state?.sessionId ?? null) - : undefined, - getDeviceId: isExtensionApp ? deviceIdService.getDeviceId : undefined, + getHeaders: () => ({ 'x-request-source': REQUEST_SOURCE }), }), }) const sessionRepository = createSessionRepository({ client: sessionClient }) return createSessionService({ - sessionStorage: chromeSessionStorage, + sessionStorage: getSessionStorage(), + deviceIdService: getDeviceIdService(), sessionRepository, }) } diff --git a/packages/api/src/getSessionStorage.native.ts b/packages/api/src/getSessionStorage.native.ts new file mode 100644 index 00000000000..995a84e87b9 --- /dev/null +++ b/packages/api/src/getSessionStorage.native.ts @@ -0,0 +1,24 @@ +import { createStorageDriver } from '@universe/api/src/storage/createStorageDriver' +import { createSessionStorage, SessionStorage } from '@universe/sessions' + +const SESSION_ID_KEY = 'UNISWAP_SESSION_ID' + +function getSessionStorage(): SessionStorage { + const driver = createStorageDriver() + + const storage = createSessionStorage({ + getSessionId: async () => { + return driver.get(SESSION_ID_KEY) + }, + setSessionId: async (sessionId) => { + await driver.set(SESSION_ID_KEY, sessionId) + }, + clearSessionId: async () => { + await driver.remove(SESSION_ID_KEY) + }, + }) + + return storage +} + +export { getSessionStorage } diff --git a/packages/api/src/getSessionStorage.ts b/packages/api/src/getSessionStorage.ts new file mode 100644 index 00000000000..4133a7d11bb --- /dev/null +++ b/packages/api/src/getSessionStorage.ts @@ -0,0 +1,8 @@ +import { type SessionStorage } from '@universe/sessions' +import { PlatformSplitStubError } from 'utilities/src/errors' + +function getSessionStorage(): SessionStorage { + throw new PlatformSplitStubError('getSessionStorage') +} + +export { getSessionStorage } diff --git a/packages/api/src/getSessionStorage.web.ts b/packages/api/src/getSessionStorage.web.ts new file mode 100644 index 00000000000..ae4d392010b --- /dev/null +++ b/packages/api/src/getSessionStorage.web.ts @@ -0,0 +1,30 @@ +import { createSessionStorage, SessionStorage } from '@universe/sessions' +import { getChromeWithThrow } from 'utilities/src/chrome/chrome' +import { isExtensionApp } from 'utilities/src/platform' + +const SESSION_ID_KEY = 'UNISWAP_SESSION_ID' + +const chromeSessionStorage = createSessionStorage({ + getSessionId: async () => { + const chrome = getChromeWithThrow() + const sessionId = await chrome.storage.local.get(SESSION_ID_KEY) + return (sessionId as { [SESSION_ID_KEY]: string } | null)?.[SESSION_ID_KEY] ?? null + }, + setSessionId: async (sessionId) => { + const chrome = getChromeWithThrow() + await chrome.storage.local.set({ [SESSION_ID_KEY]: sessionId }) + }, + clearSessionId: async () => { + const chrome = getChromeWithThrow() + await chrome.storage.local.remove(SESSION_ID_KEY) + }, +}) + +function getSessionStorage(): SessionStorage { + if (!isExtensionApp) { + throw new Error('[getSessionStorage.web.ts] getSessionStorage is not supported on web, only extension') + } + return chromeSessionStorage +} + +export { getSessionStorage } diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index f9a95b99786..fe09c20fdde 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -70,16 +70,16 @@ export { type DiscriminatedQuoteResponse, type DutchQuoteResponse, type DutchV3QuoteResponse, - type ExistingTradeRequest, + type ExistingPlanRequest, Method, - type NewTradeRequest, + type NewPlanRequest, type PlanStep, PlanStepStatus, type PriorityQuoteResponse, type SwappableTokensParams, - type TradeResponse, + type PlanResponse, type UnwrapQuoteResponse, - type UpdateExistingTradeRequest, + type UpdateExistingPlanRequest, type WrapQuoteResponse, } from '@universe/api/src/clients/trading/tradeTypes' export { @@ -163,6 +163,11 @@ export { createFetcher, objectToQueryString, } from '@universe/api/src/clients/base/utils' + +// Session API +export { ApiInit } from '@universe/api/src/components/ApiInit' +export { getSessionService } from '@universe/api/src/getSessionService' + export type { UseQueryApiHelperHookArgs, UseQueryWithImmediateGarbageCollectionApiHelperHookArgs, @@ -175,3 +180,5 @@ export { RankingType, SpamCode, } from '@universe/api/src/clients/content/types' + +export { getTransport } from '@universe/api/src/transport' diff --git a/packages/api/src/storage/createStorageDriver.native.ts b/packages/api/src/storage/createStorageDriver.native.ts new file mode 100644 index 00000000000..62d59e006fc --- /dev/null +++ b/packages/api/src/storage/createStorageDriver.native.ts @@ -0,0 +1,19 @@ +import { StorageDriver } from '@universe/api/src/storage/types' +import * as SecureStore from 'expo-secure-store' + +export function createStorageDriver(): StorageDriver { + return { + async get(key: string): Promise { + const value = await SecureStore.getItemAsync(key) + return value ?? null + }, + + async set(key: string, value: string): Promise { + await SecureStore.setItemAsync(key, value) + }, + + async remove(key: string): Promise { + await SecureStore.deleteItemAsync(key) + }, + } +} diff --git a/packages/api/src/storage/createStorageDriver.ts b/packages/api/src/storage/createStorageDriver.ts new file mode 100644 index 00000000000..0d721c6cbe4 --- /dev/null +++ b/packages/api/src/storage/createStorageDriver.ts @@ -0,0 +1,8 @@ +import { StorageDriver } from '@universe/api/src/storage/types' +import { PlatformSplitStubError } from 'utilities/src/errors' + +export function createStorageDriver(): StorageDriver { + throw new PlatformSplitStubError('createStorageDriver') +} + +export type { StorageDriver } from '@universe/api/src/storage/types' diff --git a/packages/api/src/storage/createStorageDriver.web.ts b/packages/api/src/storage/createStorageDriver.web.ts new file mode 100644 index 00000000000..1b289b5bc41 --- /dev/null +++ b/packages/api/src/storage/createStorageDriver.web.ts @@ -0,0 +1,35 @@ +import { type StorageDriver } from '@universe/api/src/storage/types' +import { getChromeWithThrow } from 'utilities/src/chrome/chrome' +import { isTestEnv } from 'utilities/src/environment/env' +import { isExtensionApp } from 'utilities/src/platform' + +export function createStorageDriver(): StorageDriver { + if (!isExtensionApp && !isTestEnv()) { + throw new Error('[StorageDriver.web.ts] Storage driver is not supported on web, only extension') + } + + return { + async get(key: string): Promise { + const chrome = getChromeWithThrow() + const result = await chrome.storage.local.get(key) + const value = result[key] + if (value === undefined || value === null) { + return null + } + if (typeof value !== 'string') { + throw new Error(`[StorageDriver.web.ts] Storage driver currently expects string values, got ${typeof value}`) + } + return value + }, + + async set(key: string, value: string): Promise { + const chrome = getChromeWithThrow() + await chrome.storage.local.set({ [key]: value }) + }, + + async remove(key: string): Promise { + const chrome = getChromeWithThrow() + await chrome.storage.local.remove(key) + }, + } +} diff --git a/packages/api/src/storage/types.ts b/packages/api/src/storage/types.ts new file mode 100644 index 00000000000..ad6223d3c94 --- /dev/null +++ b/packages/api/src/storage/types.ts @@ -0,0 +1,9 @@ +/** + * Storage driver interface for key-value storage + * Platform-specific implementations handle the actual storage mechanism + */ +export interface StorageDriver { + get(key: string): Promise + set(key: string, value: string): Promise + remove(key: string): Promise +} diff --git a/packages/api/src/transport.ts b/packages/api/src/transport.ts new file mode 100644 index 00000000000..f988678a08a --- /dev/null +++ b/packages/api/src/transport.ts @@ -0,0 +1,85 @@ +import { type ConnectTransportOptions, createConnectTransport } from '@connectrpc/connect-web' +import { getDeviceIdService } from '@universe/api/src/getDeviceIdService' +import { getSessionStorage } from '@universe/api/src/getSessionStorage' +import { isWebApp } from 'utilities/src/platform' + +interface SessionTransportOptions { + getSessionId?: () => Promise + getDeviceId?: () => Promise + getBaseUrl: () => string + getHeaders?: () => object + options?: Partial +} + +/** + * Creates a Connect transport that includes session and device headers. + * + * This is the most basic transport util. Use this if you have a new use case for a transport. + * (For example, a TestTransport that doesn't use the Session storage) + * Otherwise, you can use the getTransport util. + */ +function createTransport(ctx: SessionTransportOptions): ReturnType { + const { getSessionId, getDeviceId, getBaseUrl, getHeaders, options } = ctx + + const transportOptions: ConnectTransportOptions = { + baseUrl: getBaseUrl(), + interceptors: [ + (next) => async (request) => { + // Add session ID header for mobile/extension + // Web uses cookies automatically + if (!isWebApp) { + const [sessionId, deviceId] = await Promise.all([getSessionId?.(), getDeviceId?.()]) + if (sessionId) { + request.header.set('X-Session-ID', sessionId) + } + if (deviceId) { + request.header.set('X-Device-ID', deviceId) + } + } + + const extraHeaders = getHeaders?.() + if (extraHeaders) { + Object.entries(extraHeaders).forEach(([key, value]) => { + request.header.set(key, value) + }) + } + + return next(request) + }, + ], + ...options, + } + + return createConnectTransport(transportOptions) +} + +/** + * Configures a Connect transport that uses the primary Session storage. + */ +function getTransport(ctx: { + getBaseUrl: () => string + getHeaders?: () => object + options?: Partial +}): ReturnType { + return createTransport({ + getBaseUrl: ctx.getBaseUrl, + async getSessionId() { + if (isWebApp) { + return null + } + return getSessionStorage() + .get() + .then((session) => session?.sessionId ?? null) + }, + async getDeviceId() { + if (isWebApp) { + return null + } + return getDeviceIdService().getDeviceId() + }, + getHeaders: ctx.getHeaders, + options: ctx.options, + }) +} + +export { getTransport } diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json index 0f29167ca20..160538ee18c 100644 --- a/packages/api/tsconfig.json +++ b/packages/api/tsconfig.json @@ -1,6 +1,14 @@ { "extends": "../../config/tsconfig/app.json", - "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.json"], + "include": [ + "src/**/*.ts", + "src/*.ts", + "src/**/*.d.ts", + "src/**/*.json", + "src/**/*.ts", + "src/**/*.tsx", + "src/**/*.mts" + ], "exclude": ["src/**/*.spec.ts", "src/**/*.spec.tsx", "src/**/*.test.ts", "src/**/*.test.tsx"], "compilerOptions": { "noEmit": false, diff --git a/packages/api/vitest.config.ts b/packages/api/vitest.config.ts index 1a48e6d0dbf..21e3f9ea3ca 100644 --- a/packages/api/vitest.config.ts +++ b/packages/api/vitest.config.ts @@ -2,7 +2,8 @@ import { defineConfig } from 'vitest/config' export default defineConfig({ test: { - environment: 'node', + watch: false, + environment: 'jsdom', coverage: { exclude: ['**/__generated__/**', '**/node_modules/**', '**/dist/**', '**/*.config.*', '**/scripts/**'], }, diff --git a/packages/biome-config/package.json b/packages/biome-config/package.json index 3a13d66e5cf..fe6a99e4475 100644 --- a/packages/biome-config/package.json +++ b/packages/biome-config/package.json @@ -9,7 +9,8 @@ ".": "./compiled/base.json" }, "scripts": { - "prepare": "bun ./scripts/generate.js && biome check --write" + "prepare": "bun ./scripts/generate.js && biome check --write", + "test": "bun test" }, "keywords": ["biome", "config", "linting", "formatting"], "license": "MIT" diff --git a/packages/biome-config/src/extractor.test.js b/packages/biome-config/src/extractor.test.js new file mode 100644 index 00000000000..b8252293770 --- /dev/null +++ b/packages/biome-config/src/extractor.test.js @@ -0,0 +1,138 @@ +import { describe, expect, test } from 'bun:test' +import { extractGlobalRuleValues } from './extractor.js' + +describe('extractGlobalRuleValues', () => { + test('should extract simple rule values', () => { + const config = { + linter: { + rules: { + style: { + noRestrictedImports: { + level: 'error', + options: { + paths: { + lodash: 'Use lodash-es', + }, + }, + }, + }, + }, + }, + } + + const result = extractGlobalRuleValues(config) + + expect(result.has('linter.rules.style.noRestrictedImports')).toBe(true) + expect(result.get('linter.rules.style.noRestrictedImports')).toMatchObject({ + level: 'error', + options: { + paths: { + lodash: 'Use lodash-es', + }, + }, + }) + }) + + test('should extract nested rule values', () => { + const config = { + linter: { + rules: { + complexity: { + noExtraBooleanCast: { + level: 'error', + }, + }, + style: { + noNegationElse: { + level: 'warn', + }, + }, + }, + }, + } + + const result = extractGlobalRuleValues(config) + + expect(result.size).toBe(2) + expect(result.has('linter.rules.complexity.noExtraBooleanCast')).toBe(true) + expect(result.has('linter.rules.style.noNegationElse')).toBe(true) + }) + + test('should handle config without linter rules', () => { + const config = { + formatter: { + enabled: true, + }, + } + + const result = extractGlobalRuleValues(config) + + expect(result.size).toBe(0) + }) + + test('should handle empty linter rules', () => { + const config = { + linter: { + rules: {}, + }, + } + + const result = extractGlobalRuleValues(config) + + expect(result.size).toBe(0) + }) + + test('should only extract objects with level or options', () => { + const config = { + linter: { + rules: { + style: { + noRestrictedImports: { + level: 'error', + options: { + paths: { + lodash: 'Use lodash-es', + }, + }, + }, + someOtherKey: { + randomProperty: 'value', + }, + }, + }, + }, + } + + const result = extractGlobalRuleValues(config) + + // Should only extract the rule with level/options + expect(result.size).toBe(1) + expect(result.has('linter.rules.style.noRestrictedImports')).toBe(true) + expect(result.has('linter.rules.style.someOtherKey')).toBe(false) + }) + + test('should not walk into arrays', () => { + const config = { + linter: { + rules: { + style: { + noRestrictedGlobals: { + level: 'error', + options: { + deniedGlobals: ['event', 'name'], + }, + }, + }, + }, + }, + } + + const result = extractGlobalRuleValues(config) + + expect(result.size).toBe(1) + expect(result.has('linter.rules.style.noRestrictedGlobals')).toBe(true) + + const rule = result.get('linter.rules.style.noRestrictedGlobals') + expect(Array.isArray(rule.options.deniedGlobals)).toBe(true) + }) +}) diff --git a/packages/biome-config/src/fixtures/array-merge-config.jsonc b/packages/biome-config/src/fixtures/array-merge-config.jsonc new file mode 100644 index 00000000000..79a1af1f4ac --- /dev/null +++ b/packages/biome-config/src/fixtures/array-merge-config.jsonc @@ -0,0 +1,52 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "linter": { + "enabled": true, + "rules": { + "style": { + "noRestrictedImports": { + "level": "error", + "options": { + "patterns": [ + { + "group": ["localStorage/*"], + "message": "Please do not import from localStorage" + }, + { + "group": ["global/*"], + "message": "Please do not import from global" + } + ] + } + } + } + } + }, + "overrides": [ + { + "include": ["src/legacy/**"], + "linter": { + "rules": { + "style": { + "noRestrictedImports": { + "level": "error", + "options": { + "patterns": [ + "__INCLUDE_GLOBAL_VALUES__", + { + "group": ["localStorage/*"], + "message": "Please do not import from localStorage" + }, + { + "group": ["sessionStorage/*"], + "message": "Please do not import from sessionStorage" + } + ] + } + } + } + } + } + } + ] +} diff --git a/packages/biome-config/src/fixtures/no-markers-config.jsonc b/packages/biome-config/src/fixtures/no-markers-config.jsonc new file mode 100644 index 00000000000..652ff94965a --- /dev/null +++ b/packages/biome-config/src/fixtures/no-markers-config.jsonc @@ -0,0 +1,37 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "linter": { + "enabled": true, + "rules": { + "style": { + "noRestrictedImports": { + "level": "error", + "options": { + "paths": { + "lodash": "Use lodash-es instead" + } + } + } + } + } + }, + "overrides": [ + { + "include": ["src/custom/**"], + "linter": { + "rules": { + "style": { + "noRestrictedImports": { + "level": "error", + "options": { + "paths": { + "react": "Custom restriction" + } + } + } + } + } + } + } + ] +} diff --git a/packages/biome-config/src/fixtures/off-override-config.jsonc b/packages/biome-config/src/fixtures/off-override-config.jsonc new file mode 100644 index 00000000000..007f90c48c2 --- /dev/null +++ b/packages/biome-config/src/fixtures/off-override-config.jsonc @@ -0,0 +1,41 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "linter": { + "enabled": true, + "rules": { + "style": { + "noRestrictedImports": { + "level": "error", + "options": { + "paths": { + "lodash": "Use lodash-es instead", + "moment": "Use date-fns instead", + "jquery": "No jQuery allowed" + } + } + } + } + } + }, + "overrides": [ + { + "include": ["src/vendor/**"], + "linter": { + "rules": { + "style": { + "noRestrictedImports": { + "level": "error", + "options": { + "paths": { + "__INCLUDE_GLOBAL_VALUES__": true, + "jquery": "off", + "axios": "Use fetch instead" + } + } + } + } + } + } + } + ] +} diff --git a/packages/biome-config/src/fixtures/simple-config.jsonc b/packages/biome-config/src/fixtures/simple-config.jsonc new file mode 100644 index 00000000000..7d28922c13d --- /dev/null +++ b/packages/biome-config/src/fixtures/simple-config.jsonc @@ -0,0 +1,45 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "linter": { + "enabled": true, + "rules": { + "style": { + "noRestrictedImports": { + "level": "error", + "options": { + "paths": { + "lodash": "Use lodash-es instead", + "moment": "Use date-fns instead" + } + } + }, + "noRestrictedGlobals": { + "level": "error", + "options": { + "deniedGlobals": ["event", "name"] + } + } + } + } + }, + "overrides": [ + { + "include": ["src/test/**"], + "linter": { + "rules": { + "style": { + "noRestrictedImports": { + "level": "error", + "options": { + "paths": { + "__INCLUDE_GLOBAL_VALUES__": true, + "react": "Use preact in tests" + } + } + } + } + } + } + } + ] +} diff --git a/packages/biome-config/src/merger.js b/packages/biome-config/src/merger.js index 64daabea710..67e72450d38 100644 --- a/packages/biome-config/src/merger.js +++ b/packages/biome-config/src/merger.js @@ -42,6 +42,28 @@ function mergeObjectValues(globalValues, localValues) { return merged } +/** + * Normalizes an item for comparison by sorting object keys + * This ensures objects with the same properties but different order are treated as equal + * + * @param {*} item - Item to normalize (object, primitive, etc.) + * @returns {string} Normalized JSON string representation + */ +function normalizeForComparison(item) { + if (typeof item !== 'object' || item === null) { + return JSON.stringify(item) + } + + // Sort object keys to ensure consistent serialization + const sortedKeys = Object.keys(item).sort() + const normalized = {} + for (const key of sortedKeys) { + normalized[key] = item[key] + } + + return JSON.stringify(normalized) +} + /** * Merges global array values into local array values (generic array merge) * @@ -53,12 +75,24 @@ function mergeObjectValues(globalValues, localValues) { * @returns {Array} Merged array (marker removed) */ function mergeArrayValues(globalValues, localValues) { - // Filter out marker from local values - const cleanLocal = localValues.filter((item) => item !== '__INCLUDE_GLOBAL_VALUES__') + // Filter out marker and deduplicate local values + const seen = new Set() + const cleanLocal = [] + + for (const item of localValues) { + if (item === '__INCLUDE_GLOBAL_VALUES__') { + continue + } + + const normalized = normalizeForComparison(item) + if (!seen.has(normalized)) { + seen.add(normalized) + cleanLocal.push(item) + } + } - // Deduplicate by JSON serialization - local items take precedence - const existingItems = new Set(cleanLocal.map(JSON.stringify)) - const newItems = globalValues.filter((item) => !existingItems.has(JSON.stringify(item))) + // Add global items that don't already exist in local + const newItems = globalValues.filter((item) => !seen.has(normalizeForComparison(item))) return [...cleanLocal, ...newItems] } diff --git a/packages/biome-config/src/merger.test.js b/packages/biome-config/src/merger.test.js new file mode 100644 index 00000000000..47a12311c41 --- /dev/null +++ b/packages/biome-config/src/merger.test.js @@ -0,0 +1,178 @@ +import { describe, expect, test } from 'bun:test' +import { mergeArrayValues, mergeObjectValues } from './merger.js' + +describe('mergeObjectValues', () => { + test('should merge global and local object values', () => { + const global = { + lodash: 'Use lodash-es', + moment: 'Use date-fns', + } + + const local = { + __INCLUDE_GLOBAL_VALUES__: true, + react: 'Custom restriction', + } + + const result = mergeObjectValues(global, local) + + expect(result).toMatchObject({ + lodash: 'Use lodash-es', + moment: 'Use date-fns', + react: 'Custom restriction', + }) + + expect(result.__INCLUDE_GLOBAL_VALUES__).toBeUndefined() + }) + + test('should prioritize local values over global', () => { + const global = { + lodash: 'Use lodash-es', + moment: 'Use date-fns', + } + + const local = { + __INCLUDE_GLOBAL_VALUES__: true, + lodash: 'Lodash is fine actually', + } + + const result = mergeObjectValues(global, local) + + expect(result.lodash).toBe('Lodash is fine actually') + expect(result.moment).toBe('Use date-fns') + }) + + test('should handle "off" overrides', () => { + const global = { + lodash: 'Use lodash-es', + moment: 'Use date-fns', + jquery: 'No jQuery', + } + + const local = { + __INCLUDE_GLOBAL_VALUES__: true, + jquery: 'off', + react: 'Custom restriction', + } + + const result = mergeObjectValues(global, local) + + expect(result.lodash).toBe('Use lodash-es') + expect(result.moment).toBe('Use date-fns') + expect(result.jquery).toBeUndefined() + expect(result.react).toBe('Custom restriction') + }) + + test('should remove marker from result', () => { + const global = { + lodash: 'Use lodash-es', + } + + const local = { + __INCLUDE_GLOBAL_VALUES__: true, + react: 'Custom restriction', + } + + const result = mergeObjectValues(global, local) + + expect(result.__INCLUDE_GLOBAL_VALUES__).toBeUndefined() + }) + + test('should handle empty global object', () => { + const global = {} + + const local = { + __INCLUDE_GLOBAL_VALUES__: true, + react: 'Custom restriction', + } + + const result = mergeObjectValues(global, local) + + expect(result).toMatchObject({ + react: 'Custom restriction', + }) + }) + + test('should handle empty local object (except marker)', () => { + const global = { + lodash: 'Use lodash-es', + } + + const local = { + __INCLUDE_GLOBAL_VALUES__: true, + } + + const result = mergeObjectValues(global, local) + + expect(result).toMatchObject({ + lodash: 'Use lodash-es', + }) + }) +}) + +describe('mergeArrayValues', () => { + test('should merge global and local arrays', () => { + const global = ['event', 'name', 'global'] + const local = ['__INCLUDE_GLOBAL_VALUES__', 'localStorage', 'sessionStorage'] + + const result = mergeArrayValues(global, local) + + expect(result).toEqual(['localStorage', 'sessionStorage', 'event', 'name', 'global']) + }) + + test('should deduplicate merged arrays', () => { + const global = ['event', 'name', 'global'] + const local = ['__INCLUDE_GLOBAL_VALUES__', 'event', 'localStorage'] + + const result = mergeArrayValues(global, local) + + // Should not have duplicates + expect(result.filter((x) => x === 'event')).toHaveLength(1) + + // Should maintain local precedence (local items first) + expect(result).toEqual(['event', 'localStorage', 'name', 'global']) + }) + + test('should remove marker from result', () => { + const global = ['event', 'name'] + const local = ['__INCLUDE_GLOBAL_VALUES__', 'localStorage'] + + const result = mergeArrayValues(global, local) + + expect(result).not.toContain('__INCLUDE_GLOBAL_VALUES__') + }) + + test('should handle empty global array', () => { + const global = [] + const local = ['__INCLUDE_GLOBAL_VALUES__', 'localStorage'] + + const result = mergeArrayValues(global, local) + + expect(result).toEqual(['localStorage']) + }) + + test('should handle local array with only marker', () => { + const global = ['event', 'name'] + const local = ['__INCLUDE_GLOBAL_VALUES__'] + + const result = mergeArrayValues(global, local) + + expect(result).toEqual(['event', 'name']) + }) + + test('should deduplicate complex objects', () => { + const global = [{ path: 'lodash', message: 'Use lodash-es' }] + const local = [ + '__INCLUDE_GLOBAL_VALUES__', + { path: 'lodash', message: 'Use lodash-es' }, + { path: 'moment', message: 'Use date-fns' }, + { message: 'Use date-fns', path: 'moment' }, + ] + + const result = mergeArrayValues(global, local) + + // Should deduplicate based on JSON serialization + expect(result).toHaveLength(2) + expect(result[0]).toMatchObject({ path: 'lodash', message: 'Use lodash-es' }) + expect(result[1]).toMatchObject({ path: 'moment', message: 'Use date-fns' }) + }) +}) diff --git a/packages/biome-config/src/processor.test.js b/packages/biome-config/src/processor.test.js new file mode 100644 index 00000000000..658f6ad6ffa --- /dev/null +++ b/packages/biome-config/src/processor.test.js @@ -0,0 +1,336 @@ +import { describe, expect, test } from 'bun:test' +import fs from 'node:fs' +import path from 'node:path' +import { parse as parseJsonc } from 'jsonc-parser' +import { extractGlobalRuleValues } from './extractor.js' +import { processConfig } from './processor.js' + +/** + * Helper to load and process a fixture file + */ +function processFixture(fixtureName) { + const fixturePath = path.join(__dirname, 'fixtures', fixtureName) + const content = fs.readFileSync(fixturePath, 'utf8') + const config = parseJsonc(content) + const globalRules = extractGlobalRuleValues(config) + return processConfig(config, globalRules) +} + +describe('Biome Config Processor', () => { + describe('Object Marker Resolution', () => { + test('should merge global paths with override paths', () => { + const result = processFixture('simple-config.jsonc') + + const override = result.overrides[0] + const paths = override.linter.rules.style.noRestrictedImports.options.paths + + // Should include both global and override paths + expect(paths).toMatchObject({ + lodash: 'Use lodash-es instead', + moment: 'Use date-fns instead', + react: 'Use preact in tests', + }) + + // Should not include marker + expect(paths.__INCLUDE_GLOBAL_VALUES__).toBeUndefined() + }) + + test('should handle "off" overrides correctly', () => { + const result = processFixture('off-override-config.jsonc') + + const override = result.overrides[0] + const paths = override.linter.rules.style.noRestrictedImports.options.paths + + // Should include global paths except the one turned off + expect(paths.lodash).toBe('Use lodash-es instead') + expect(paths.moment).toBe('Use date-fns instead') + + // Should not include the "off" path + expect(paths.jquery).toBeUndefined() + + // Should include override-specific path + expect(paths.axios).toBe('Use fetch instead') + + // Should not include marker + expect(paths.__INCLUDE_GLOBAL_VALUES__).toBeUndefined() + }) + }) + + describe('Array Marker Resolution', () => { + test('should merge global array with override array', () => { + const result = processFixture('array-merge-config.jsonc') + + const override = result.overrides[0] + const patterns = override.linter.rules.style.noRestrictedImports.options.patterns + + // Should include both global and override items + expect(patterns).toEqual( + expect.arrayContaining([ + { + group: ['global/*'], + message: 'Please do not import from global', + }, + { + group: ['localStorage/*'], + message: 'Please do not import from localStorage', + }, + { + group: ['sessionStorage/*'], + message: 'Please do not import from sessionStorage', + }, + ]), + ) + + // Should not include marker + expect(patterns).not.toContain('__INCLUDE_GLOBAL_VALUES__') + }) + + test('should deduplicate merged arrays', () => { + const config = { + linter: { + rules: { + style: { + noRestrictedImports: { + level: 'error', + options: { + patterns: [ + { + group: ['event/*'], + message: 'Do not import from event', + }, + { + group: ['name/*'], + message: 'Do not import from name', + }, + ], + }, + }, + }, + }, + }, + overrides: [ + { + include: ['src/**'], + linter: { + rules: { + style: { + noRestrictedImports: { + level: 'error', + options: { + patterns: [ + '__INCLUDE_GLOBAL_VALUES__', + { + group: ['event/*'], + message: 'Do not import from event', + }, + { + group: ['localStorage/*'], + message: 'Do not import from localStorage', + }, + ], + }, + }, + }, + }, + }, + }, + ], + } + + const globalRules = extractGlobalRuleValues(config) + const result = processConfig(config, globalRules) + + const patterns = result.overrides[0].linter.rules.style.noRestrictedImports.options.patterns + + // Should not have duplicates + const eventPatterns = patterns.filter((x) => JSON.stringify(x.group) === JSON.stringify(['event/*'])) + expect(eventPatterns).toHaveLength(1) + + // Should maintain override order (local items first) + expect(patterns[0]).toMatchObject({ + group: ['event/*'], + message: 'Do not import from event', + }) + expect(patterns[1]).toMatchObject({ + group: ['localStorage/*'], + message: 'Do not import from localStorage', + }) + expect(patterns[2]).toMatchObject({ + group: ['name/*'], + message: 'Do not import from name', + }) + }) + }) + + describe('No Markers', () => { + test('should not modify overrides without markers', () => { + const result = processFixture('no-markers-config.jsonc') + + const override = result.overrides[0] + const paths = override.linter.rules.style.noRestrictedImports.options.paths + + // Should only have override path + expect(paths).toMatchObject({ + react: 'Custom restriction', + }) + + // Should not include global paths + expect(paths.lodash).toBeUndefined() + }) + }) + + describe('Edge Cases', () => { + test('should handle config with no overrides', () => { + const config = { + linter: { + rules: { + style: { + noRestrictedImports: { + level: 'error', + options: { + paths: { + lodash: 'Use lodash-es', + }, + }, + }, + }, + }, + }, + } + + const globalRules = extractGlobalRuleValues(config) + const result = processConfig(config, globalRules) + + // Should return unchanged + expect(result).toEqual(config) + }) + + test('should handle override without linter rules', () => { + const config = { + linter: { + rules: { + style: { + noRestrictedImports: { + level: 'error', + options: { + paths: { + lodash: 'Use lodash-es', + }, + }, + }, + }, + }, + }, + overrides: [ + { + include: ['src/**'], + formatter: { + enabled: false, + }, + }, + ], + } + + const globalRules = extractGlobalRuleValues(config) + const result = processConfig(config, globalRules) + + // Should handle override without linter rules gracefully + expect(result.overrides[0]).toMatchObject({ + include: ['src/**'], + formatter: { + enabled: false, + }, + }) + }) + + test('should handle empty global rules', () => { + const config = { + linter: { + rules: {}, + }, + overrides: [ + { + include: ['src/**'], + linter: { + rules: { + style: { + noRestrictedImports: { + level: 'error', + options: { + paths: { + __INCLUDE_GLOBAL_VALUES__: true, + react: 'Custom restriction', + }, + }, + }, + }, + }, + }, + }, + ], + } + + const globalRules = extractGlobalRuleValues(config) + const result = processConfig(config, globalRules) + + const paths = result.overrides[0].linter.rules.style.noRestrictedImports.options.paths + + // Should only include override paths + expect(paths).toMatchObject({ + react: 'Custom restriction', + }) + + // Should remove marker + expect(paths.__INCLUDE_GLOBAL_VALUES__).toBeUndefined() + }) + }) + + describe('Immutability', () => { + test('should not mutate original config', () => { + const originalConfig = { + linter: { + rules: { + style: { + noRestrictedImports: { + level: 'error', + options: { + paths: { + lodash: 'Use lodash-es', + }, + }, + }, + }, + }, + }, + overrides: [ + { + include: ['src/**'], + linter: { + rules: { + style: { + noRestrictedImports: { + level: 'error', + options: { + paths: { + __INCLUDE_GLOBAL_VALUES__: true, + react: 'Custom restriction', + }, + }, + }, + }, + }, + }, + }, + ], + } + + const globalRules = extractGlobalRuleValues(originalConfig) + processConfig(originalConfig, globalRules) + + // Original config should still have the marker + expect( + originalConfig.overrides[0].linter.rules.style.noRestrictedImports.options.paths.__INCLUDE_GLOBAL_VALUES__, + ).toBe(true) + }) + }) +}) diff --git a/packages/eslint-config/base.js b/packages/eslint-config/base.js index c34ff7f2322..4e36a5a27c7 100644 --- a/packages/eslint-config/base.js +++ b/packages/eslint-config/base.js @@ -40,6 +40,7 @@ module.exports = { 'no-extra-boolean-cast': 'error', 'object-shorthand': ['error', 'always'], 'consistent-return': ['error', { treatUndefinedAsUnspecified: false }], + 'max-lines': ['error', 500], // cap file length // Disallow unnecessary curly braces in JSX props and children 'react/jsx-curly-brace-presence': ['error', { props: 'never', children: 'never' }], 'max-params': ['error', { max: 2 }], @@ -160,5 +161,12 @@ module.exports = { extends: ['plugin:jest/recommended'], plugins: ['jest'], }, + { + // Allow test files to exceed max-lines limit + files: ['**/*.test.ts', '**/*.test.tsx', '**/__tests__/**/*.[jt]s?(x)', '**/?(*.)+(spec|test).[tj]s?(x)'], + rules: { + 'max-lines': 'off', + }, + }, ], } diff --git a/packages/eslint-config/native.js b/packages/eslint-config/native.js index 57227c0a5eb..f4e60168039 100644 --- a/packages/eslint-config/native.js +++ b/packages/eslint-config/native.js @@ -37,7 +37,6 @@ module.exports = { // Complexity Rules 'max-depth': ['error', 4], // prevent deeply nested code paths which are hard to read 'max-nested-callbacks': ['error', 3], - 'max-lines': ['error', 500], // cap file length complexity: ['error', 20], // restrict cyclomatic complexity (number of linearly independent paths) // disable prettier linting, as we format with biome: diff --git a/packages/gating/src/configs.ts b/packages/gating/src/configs.ts index 9752b9af739..70b09ab11fe 100644 --- a/packages/gating/src/configs.ts +++ b/packages/gating/src/configs.ts @@ -82,7 +82,6 @@ export enum DynamicConfigs { DatadogIgnoredErrors = 'datadog_ignored_errors', EmbeddedWalletConfig = 'embedded_wallet_config', ExtensionBiometricUnlock = 'extension_biometric_unlock_config', - DeepLinkUrlAllowlist = 'deep_link_url_allowlist', // Web AstroChain = 'astro_chain', @@ -158,10 +157,6 @@ export enum ExtensionBiometricUnlockConfigKey { EnableUnlocking = 'enableUnlocking', } -export enum DeepLinkUrlAllowlistConfigKey { - AllowedUrls = 'allowedUrls', -} - export enum SyncTransactionSubmissionChainIdsConfigKey { ChainIds = 'chainIds', } @@ -259,7 +254,6 @@ export type DynamicConfigKeys = { [DynamicConfigs.DatadogSessionSampleRate]: DatadogSessionSampleRateKey [DynamicConfigs.EmbeddedWalletConfig]: EmbeddedWalletConfigKey [DynamicConfigs.ExtensionBiometricUnlock]: ExtensionBiometricUnlockConfigKey - [DynamicConfigs.DeepLinkUrlAllowlist]: DeepLinkUrlAllowlistConfigKey [DynamicConfigs.SyncTransactionSubmissionChainIds]: SyncTransactionSubmissionChainIdsConfigKey // Web @@ -288,13 +282,3 @@ export type UwULinkAllowlist = { contracts: UwULinkAllowlistItem[] tokenRecipients: UwULinkAllowlistItem[] } - -export type DeepLinkUrlAllowlistItem = { - url: string - description?: string - openInApp?: boolean // If true, opens in in-app browser; if false, opens in external browser -} - -export type DeepLinkUrlAllowlist = { - allowedUrls: DeepLinkUrlAllowlistItem[] -} diff --git a/packages/gating/src/flags.ts b/packages/gating/src/flags.ts index 6e0f3b10d5b..be0ddc64cd1 100644 --- a/packages/gating/src/flags.ts +++ b/packages/gating/src/flags.ts @@ -12,6 +12,7 @@ export enum FeatureFlags { BlockaidFotLogging, BridgedAssetsBannerV2, ChainedActions, + DataReportingAbilities, DisableSwap7702, EmbeddedWallet, FiatOffRamp, @@ -53,9 +54,7 @@ export enum FeatureFlags { Eip5792Methods, EnableRestoreSeedPhrase, SmartWalletSettings, - SwapPreSign, TradingApiSwapConfirmation, - UseAlarmsApi, // Web AATestWeb, @@ -72,6 +71,8 @@ export enum FeatureFlags { PoolInfoEndpoint, PoolSearch, PortfolioPage, + PortfolioDefiTab, + PortfolioTokensAllocationChart, PriceRangeInputV2, SolanaPromo, Toucan, @@ -90,6 +91,7 @@ export const SHARED_FEATURE_FLAG_NAMES = new Map([ [FeatureFlags.BlockaidFotLogging, 'blockaid_fot_logging'], [FeatureFlags.BridgedAssetsBannerV2, 'bridged_assets_banner_v2'], [FeatureFlags.ChainedActions, 'enable_chained_actions'], + [FeatureFlags.DataReportingAbilities, 'data_reporting_abilities'], [FeatureFlags.DisableSwap7702, 'disable-swap-7702'], [FeatureFlags.EmbeddedWallet, 'embedded_wallet'], [FeatureFlags.EnablePermitMismatchUX, 'enable_permit2_mismatch_ux'], @@ -135,6 +137,8 @@ export const WEB_FEATURE_FLAG_NAMES = new Map([ [FeatureFlags.PoolInfoEndpoint, 'pool_info_endpoint'], [FeatureFlags.PoolSearch, 'pool_search'], [FeatureFlags.PortfolioPage, 'portfolio_page'], + [FeatureFlags.PortfolioDefiTab, 'portfolio_defi_tab'], + [FeatureFlags.PortfolioTokensAllocationChart, 'portfolio_tokens_allocation_chart'], [FeatureFlags.PortoWalletConnector, 'porto_wallet_connector'], [FeatureFlags.PriceRangeInputV2, 'price_range_input_v2'], [FeatureFlags.SolanaPromo, 'solana_promo'], @@ -161,8 +165,6 @@ export const WALLET_FEATURE_FLAG_NAMES = new Map([ [FeatureFlags.PrivateRpc, 'mev-blocker'], [FeatureFlags.Scantastic, 'scantastic'], [FeatureFlags.SmartWalletSettings, 'smart_wallet_settings'], - [FeatureFlags.SwapPreSign, 'swap_pre_sign'], - [FeatureFlags.UseAlarmsApi, 'use_alarms_api'], [FeatureFlags.UwULink, 'uwu-link'], ]) diff --git a/packages/gating/src/index.ts b/packages/gating/src/index.ts index efe852ff1f6..be8835fcc68 100644 --- a/packages/gating/src/index.ts +++ b/packages/gating/src/index.ts @@ -1,7 +1,6 @@ export type { DatadogIgnoredErrorsValType, DatadogSessionSampleRateValType, - DeepLinkUrlAllowlist, DynamicConfigKeys, ForceUpgradeStatus, ForceUpgradeTranslations, @@ -17,7 +16,6 @@ export { ChainsConfigKey, DatadogIgnoredErrorsConfigKey, DatadogSessionSampleRateKey, - DeepLinkUrlAllowlistConfigKey, DynamicConfigs, EmbeddedWalletConfigKey, ExtensionBiometricUnlockConfigKey, diff --git a/packages/notifications/README.md b/packages/notifications/README.md index afbab0c0cfb..a649567a066 100644 --- a/packages/notifications/README.md +++ b/packages/notifications/README.md @@ -7,8 +7,8 @@ Client-side notification system for fetching, processing, storing, and displayin ``` NotificationSystem (orchestrator) ├── NotificationDataSource → Fetch/websocket notification data -├── NotificationTracker → Track shown/dismissed state -├── NotificationProcessor → Filter & prioritize notifications +├── NotificationTracker → No-op (backend handles deduplication) +├── NotificationProcessor → Filter & prioritize notifications ├── NotificationChainCoordinator → Handle multi-step notification flows └── NotificationRenderer → Platform-specific UI rendering ``` @@ -39,7 +39,7 @@ import { createNotificationSystem } from '@universe/notifications' const notificationSystem = createNotificationSystem({ dataSources: [getFetchNotificationDataSource({ apiClient })], - tracker: createLocalNotificationTracker({ storageDriver }), + tracker: createNoopNotificationTracker(), processor: createNotificationProcessor(), renderer: createNotificationRenderer(), chainCoordinator: createNotificationChainCoordinator() diff --git a/packages/notifications/package.json b/packages/notifications/package.json index fdcf387b687..04f7b122563 100644 --- a/packages/notifications/package.json +++ b/packages/notifications/package.json @@ -1,14 +1,27 @@ { "name": "@universe/notifications", "version": "0.0.0", + "dependencies": { + "@tanstack/react-query": "5.77.2" + }, "devDependencies": { "@types/node": "22.13.1", "@uniswap/eslint-config": "workspace:^", + "@vitest/coverage-v8": "3.2.1", "depcheck": "1.4.7", "eslint": "8.44.0", - "typescript": "5.3.3" + "typescript": "5.3.3", + "vitest": "3.2.1" + }, + "scripts": { + "lint:biome": "nx lint:biome notifications", + "lint:biome:fix": "nx lint:biome:fix notifications", + "lint": "nx lint notifications", + "lint:fix": "nx lint:fix notifications", + "typecheck": "nx typecheck notifications", + "test": "nx test notifications", + "test:coverage": "nx test:coverage notifications" }, - "scripts": {}, "nx": { "includedScripts": [] }, diff --git a/packages/notifications/project.json b/packages/notifications/project.json index 83f11f630fe..821b487eb42 100644 --- a/packages/notifications/project.json +++ b/packages/notifications/project.json @@ -11,6 +11,18 @@ "lint:eslint": {}, "lint:eslint:fix": {}, "lint": {}, - "lint:fix": {} + "lint:fix": {}, + "test": { + "command": "vitest run", + "options": { + "cwd": "{projectRoot}" + } + }, + "test:coverage": { + "command": "vitest run --coverage", + "options": { + "cwd": "{projectRoot}" + } + } } } diff --git a/packages/notifications/src/global.d.ts b/packages/notifications/src/global.d.ts new file mode 100644 index 00000000000..d6a57aae330 --- /dev/null +++ b/packages/notifications/src/global.d.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line @typescript-eslint/triple-slash-reference +/// diff --git a/packages/notifications/src/index.ts b/packages/notifications/src/index.ts index e69de29bb2d..947e1552161 100644 --- a/packages/notifications/src/index.ts +++ b/packages/notifications/src/index.ts @@ -0,0 +1,20 @@ +export { + type CreatePollingNotificationDataSourceContext, + createPollingNotificationDataSource, +} from './notification-data-source/implementations/createPollingNotificationDataSource' +export { type NotificationDataSource } from './notification-data-source/NotificationDataSource' +export { + type GetNotificationQueryOptionsContext, + getNotificationQueryOptions, +} from './notification-data-source/notificationQueryOptions' +export { createBaseNotificationProcessor } from './notification-processor/implementations/createBaseNotificationProcessor' +export { type NotificationProcessor } from './notification-processor/NotificationProcessor' +export { createNotificationRenderer } from './notification-renderer/implementations/createNotificationRenderer' +export { type NotificationRenderer } from './notification-renderer/NotificationRenderer' +export { createNotificationSystem } from './notification-system/implementations/createNotificationSystem' +export { + type NotificationSystem, + type NotificationSystemConfig, +} from './notification-system/NotificationSystem' +export { createNoopNotificationTracker } from './notification-tracker/implementations/createNoopNotificationTracker' +export { type NotificationTracker } from './notification-tracker/NotificationTracker' diff --git a/packages/notifications/src/notification-data-source/NotificationDataSource.ts b/packages/notifications/src/notification-data-source/NotificationDataSource.ts new file mode 100644 index 00000000000..bbf68f4ed70 --- /dev/null +++ b/packages/notifications/src/notification-data-source/NotificationDataSource.ts @@ -0,0 +1,8 @@ +import { type InAppNotification } from '@universe/api' + +export interface NotificationDataSource { + // Start receiving notifications (implementation determines mechanism: fetch, websocket, polling, etc.) + start(onNotifications: (notifications: InAppNotification[]) => void): void + // Stop receiving notifications and cleanup + stop(): Promise +} diff --git a/packages/notifications/src/notification-data-source/implementations/createNotificationDataSource.ts b/packages/notifications/src/notification-data-source/implementations/createNotificationDataSource.ts new file mode 100644 index 00000000000..43773f0c519 --- /dev/null +++ b/packages/notifications/src/notification-data-source/implementations/createNotificationDataSource.ts @@ -0,0 +1,19 @@ +import { type InAppNotification } from '@universe/api' +import { type NotificationDataSource } from '@universe/notifications/src/notification-data-source/NotificationDataSource' + +/** + * Basic implementation of the NotificationDataSource interface. + */ +export function createNotificationDataSource(ctx: { + start: (onNotifications: (notifications: InAppNotification[]) => void) => void + stop: () => Promise +}): NotificationDataSource { + return { + start: (onNotifications: (notifications: InAppNotification[]) => void): void => { + ctx.start(onNotifications) + }, + stop: async (): Promise => { + await ctx.stop() + }, + } +} diff --git a/packages/notifications/src/notification-data-source/implementations/createPollingNotificationDataSource.test.ts b/packages/notifications/src/notification-data-source/implementations/createPollingNotificationDataSource.test.ts new file mode 100644 index 00000000000..838978a1c4d --- /dev/null +++ b/packages/notifications/src/notification-data-source/implementations/createPollingNotificationDataSource.test.ts @@ -0,0 +1,359 @@ +import { QueryClient } from '@tanstack/react-query' +import type { InAppNotification, NotificationsApiClient } from '@universe/api' +import { createPollingNotificationDataSource } from '@universe/notifications/src/notification-data-source/implementations/createPollingNotificationDataSource' +import { getNotificationQueryOptions } from '@universe/notifications/src/notification-data-source/notificationQueryOptions' +import { ReactQueryCacheKey } from 'utilities/src/reactQuery/cache' +import { afterEach, beforeEach, describe, expect, it, type Mock, vi } from 'vitest' + +vi.mock('utilities/src/logger/logger', () => ({ + logger: { + error: vi.fn(), + }, +})) + +describe('createPollingNotificationDataSource', () => { + let queryClient: QueryClient + let mockApiClient: NotificationsApiClient + let mockNotifications: InAppNotification[] + + beforeEach(() => { + vi.clearAllMocks() + queryClient = new QueryClient() + + mockNotifications = [ + { + notification_id: '1', + notification_name: 'test_notification', + meta_data: { foo: 'bar' }, + content: { message: 'Hello' }, + criteria: {}, + }, + { + notification_id: '2', + notification_name: 'another_notification', + meta_data: { baz: 'qux' }, + content: { message: 'World' }, + criteria: {}, + }, + ] + + mockApiClient = { + getNotifications: vi.fn().mockResolvedValue(mockNotifications), + } + }) + + afterEach(() => { + queryClient.clear() + }) + + it('creates a notification data source with start and stop methods', () => { + const testQueryClient = new QueryClient({ + defaultOptions: { queries: { retry: false } }, + }) + + const dataSource = createPollingNotificationDataSource({ + queryClient: testQueryClient, + queryOptions: getNotificationQueryOptions({ + apiClient: mockApiClient, + }), + }) + + expect(dataSource).toBeDefined() + expect(typeof dataSource.start).toBe('function') + expect(typeof dataSource.stop).toBe('function') + }) + + it('calls onNotifications when notifications are received', async () => { + const testQueryClient = new QueryClient({ + defaultOptions: { queries: { retry: false } }, + }) + + const dataSource = createPollingNotificationDataSource({ + queryClient: testQueryClient, + queryOptions: getNotificationQueryOptions({ + apiClient: mockApiClient, + }), + }) + + const onNotifications = vi.fn() + dataSource.start(onNotifications) + + // Wait for the query to resolve + await vi.waitFor(() => { + expect(onNotifications).toHaveBeenCalledWith(mockNotifications) + }) + + await dataSource.stop() + }) + + it('calls apiClient.getNotifications when started', async () => { + const testQueryClient = new QueryClient({ + defaultOptions: { queries: { retry: false } }, + }) + + const dataSource = createPollingNotificationDataSource({ + queryClient: testQueryClient, + queryOptions: getNotificationQueryOptions({ + apiClient: mockApiClient, + }), + }) + + const onNotifications = vi.fn() + dataSource.start(onNotifications) + + await vi.waitFor(() => { + expect(mockApiClient.getNotifications).toHaveBeenCalled() + }) + + await dataSource.stop() + }) + + it('does not start twice if already active', async () => { + const testQueryClient = new QueryClient({ + defaultOptions: { queries: { retry: false } }, + }) + + const dataSource = createPollingNotificationDataSource({ + queryClient: testQueryClient, + queryOptions: getNotificationQueryOptions({ + apiClient: mockApiClient, + }), + }) + + const onNotifications = vi.fn() + dataSource.start(onNotifications) + + // Try to start again + dataSource.start(onNotifications) + + // Wait a bit to ensure no double calls + await vi.waitFor(() => { + expect(mockApiClient.getNotifications).toHaveBeenCalledTimes(1) + }) + + await dataSource.stop() + }) + + it('handles API errors gracefully', async () => { + const testQueryClient = new QueryClient({ + defaultOptions: { queries: { retry: false } }, + }) + + const error = new Error('API Error') + mockApiClient.getNotifications = vi.fn().mockRejectedValue(error) + + const dataSource = createPollingNotificationDataSource({ + queryClient: testQueryClient, + queryOptions: getNotificationQueryOptions({ + apiClient: mockApiClient, + }), + }) + + const onNotifications = vi.fn() + dataSource.start(onNotifications) + + // Wait for error handling + await vi.waitFor(() => { + expect(mockApiClient.getNotifications).toHaveBeenCalled() + }) + + // onNotifications should not be called on error + expect(onNotifications).not.toHaveBeenCalled() + + await dataSource.stop() + }) + + it('stops polling when stop is called', async () => { + const testQueryClient = new QueryClient({ + defaultOptions: { queries: { retry: false } }, + }) + + const dataSource = createPollingNotificationDataSource({ + queryClient: testQueryClient, + queryOptions: getNotificationQueryOptions({ + apiClient: mockApiClient, + pollIntervalMs: 100, // Short interval for testing + }), + }) + + const onNotifications = vi.fn() + dataSource.start(onNotifications) + + await vi.waitFor(() => { + expect(onNotifications).toHaveBeenCalled() + }) + + const callCountBeforeStop = (mockApiClient.getNotifications as Mock).mock.calls.length + + await dataSource.stop() + + // Wait a bit longer than poll interval + await new Promise((resolve) => setTimeout(resolve, 200)) + + // Should not have made additional API calls after stop + expect((mockApiClient.getNotifications as Mock).mock.calls.length).toBe(callCountBeforeStop) + }) + + it('can be started again after stopping', async () => { + const testQueryClient = new QueryClient({ + defaultOptions: { queries: { retry: false } }, + }) + + const dataSource = createPollingNotificationDataSource({ + queryClient: testQueryClient, + queryOptions: getNotificationQueryOptions({ + apiClient: mockApiClient, + }), + }) + + const onNotifications = vi.fn() + + // Start, wait, then stop + dataSource.start(onNotifications) + await vi.waitFor(() => { + expect(onNotifications).toHaveBeenCalledWith(mockNotifications) + }) + await dataSource.stop() + + // Wait a bit for cleanup to complete + await new Promise((resolve) => setTimeout(resolve, 50)) + + // Clear the query cache completely + testQueryClient.clear() + + // Clear mocks + vi.clearAllMocks() + mockApiClient.getNotifications = vi.fn().mockResolvedValue(mockNotifications) + + // Start again with a new callback + const onNotifications2 = vi.fn() + dataSource.start(onNotifications2) + await vi.waitFor(() => { + expect(onNotifications2).toHaveBeenCalledWith(mockNotifications) + }) + + await dataSource.stop() + }) + + it('uses custom poll interval when provided', async () => { + const testQueryClient = new QueryClient({ + defaultOptions: { queries: { retry: false } }, + }) + + const customPollInterval = 100 + const dataSource = createPollingNotificationDataSource({ + queryClient: testQueryClient, + queryOptions: getNotificationQueryOptions({ + apiClient: mockApiClient, + pollIntervalMs: customPollInterval, + }), + }) + + const onNotifications = vi.fn() + dataSource.start(onNotifications) + + // Wait for initial call + await vi.waitFor(() => { + expect(mockApiClient.getNotifications).toHaveBeenCalled() + }) + + // Verify the data source was created successfully with custom interval + // Note: Testing actual polling behavior is complex due to React Query's internal timing + // The main goal is to ensure the custom interval is accepted without errors + expect(dataSource).toBeDefined() + expect(typeof dataSource.start).toBe('function') + expect(typeof dataSource.stop).toBe('function') + + await dataSource.stop() + }) + + it('passes empty array to onNotifications when API returns empty array', async () => { + const testQueryClient = new QueryClient({ + defaultOptions: { queries: { retry: false } }, + }) + + mockApiClient.getNotifications = vi.fn().mockResolvedValue([]) + + const dataSource = createPollingNotificationDataSource({ + queryClient: testQueryClient, + queryOptions: getNotificationQueryOptions({ + apiClient: mockApiClient, + }), + }) + + const onNotifications = vi.fn() + dataSource.start(onNotifications) + + await vi.waitFor(() => { + expect(onNotifications).toHaveBeenCalledWith([]) + }) + + await dataSource.stop() + }) + + it('cancels queries when stopped', async () => { + const testQueryClient = new QueryClient({ + defaultOptions: { queries: { retry: false } }, + }) + + const dataSource = createPollingNotificationDataSource({ + queryClient: testQueryClient, + queryOptions: getNotificationQueryOptions({ + apiClient: mockApiClient, + }), + }) + + const cancelQueriesSpy = vi.spyOn(testQueryClient, 'cancelQueries') + + const onNotifications = vi.fn() + dataSource.start(onNotifications) + + await vi.waitFor(() => { + expect(onNotifications).toHaveBeenCalled() + }) + + await dataSource.stop() + + expect(cancelQueriesSpy).toHaveBeenCalledWith({ queryKey: [ReactQueryCacheKey.Notifications] }) + + cancelQueriesSpy.mockRestore() + }) + + it('retries failed requests according to retry configuration', async () => { + let callCount = 0 + mockApiClient.getNotifications = vi.fn().mockImplementation(() => { + callCount++ + if (callCount <= 2) { + return Promise.reject(new Error('Temporary error')) + } + return Promise.resolve(mockNotifications) + }) + + // Create a fresh QueryClient to test actual retry behavior from queryOptions + const retryQueryClient = new QueryClient() + + const dataSource = createPollingNotificationDataSource({ + queryClient: retryQueryClient, + queryOptions: getNotificationQueryOptions({ + apiClient: mockApiClient, + }), + }) + + const onNotifications = vi.fn() + dataSource.start(onNotifications) + + // Should eventually succeed after retries + await vi.waitFor( + () => { + expect(onNotifications).toHaveBeenCalledWith(mockNotifications) + }, + { timeout: 5000 }, + ) + + // Should have made multiple attempts (initial + 2 retries) + expect(callCount).toBe(3) + + await dataSource.stop() + retryQueryClient.clear() + }) +}) diff --git a/packages/notifications/src/notification-data-source/implementations/createPollingNotificationDataSource.ts b/packages/notifications/src/notification-data-source/implementations/createPollingNotificationDataSource.ts new file mode 100644 index 00000000000..92551139b07 --- /dev/null +++ b/packages/notifications/src/notification-data-source/implementations/createPollingNotificationDataSource.ts @@ -0,0 +1,91 @@ +import { type QueryClient, type QueryKey, QueryObserver } from '@tanstack/react-query' +import { type InAppNotification } from '@universe/api' +import { createNotificationDataSource } from '@universe/notifications/src/notification-data-source/implementations/createNotificationDataSource' +import { type NotificationDataSource } from '@universe/notifications/src/notification-data-source/NotificationDataSource' +import { logger } from 'utilities/src/logger/logger' +import { type QueryOptionsResult } from 'utilities/src/reactQuery/queryOptions' + +export interface CreatePollingNotificationDataSourceContext { + queryClient: QueryClient + queryOptions: QueryOptionsResult +} + +/** + * Creates a polling notification data source using React Query. + * This handles the lifecycle orchestration of the query (start/stop). + * + * Example usage: + * ```typescript + * import { createPollingNotificationDataSource, getNotificationQueryOptions } from '@universe/notifications' + * + * const queryOptions = getNotificationQueryOptions({ + * apiClient: myNotificationsApiClient, + * pollIntervalMs: 120000, // Optional: 2 minutes + * }) + * + * const queryClient = useQueryClient() + * + * const dataSource = createPollingNotificationDataSource({ + * queryClient: SharedQueryClient, + * queryOptions, + * }) + * + * // Start polling and handle notifications + * dataSource.start((notifications) => { + * console.log('Received notifications:', notifications) + * }) + * + * // Stop polling and cleanup + * dataSource.stop() + * ``` + */ +export function createPollingNotificationDataSource( + ctx: CreatePollingNotificationDataSourceContext, +): NotificationDataSource { + const { queryClient, queryOptions } = ctx + + let unsubscribe: (() => void) | null = null + let isActive = false + + const start = (onNotifications: (notifications: InAppNotification[]) => void): void => { + if (isActive) { + return // Prevent multiple starts + } + + isActive = true + + const observer = new QueryObserver( + queryClient, + queryOptions, + ) + + unsubscribe = observer.subscribe((result) => { + if (result.data) { + onNotifications(result.data) + } else if (result.error) { + logger.error(result.error, { + tags: { file: 'createPollingNotificationDataSource', function: 'subscribe' }, + }) + } + }) + } + + const stop = async (): Promise => { + if (unsubscribe) { + unsubscribe() + unsubscribe = null + } + + try { + await queryClient.cancelQueries({ queryKey: queryOptions.queryKey }) + } catch (error) { + logger.error(error, { + tags: { file: 'createPollingNotificationDataSource', function: 'stop' }, + }) + } finally { + isActive = false + } + } + + return createNotificationDataSource({ start, stop }) +} diff --git a/packages/notifications/src/notification-data-source/notificationQueryOptions.ts b/packages/notifications/src/notification-data-source/notificationQueryOptions.ts new file mode 100644 index 00000000000..267a02fee8b --- /dev/null +++ b/packages/notifications/src/notification-data-source/notificationQueryOptions.ts @@ -0,0 +1,58 @@ +import { queryOptions } from '@tanstack/react-query' +import type { InAppNotification, NotificationsApiClient } from '@universe/api' +import { logger } from 'utilities/src/logger/logger' +import { ReactQueryCacheKey } from 'utilities/src/reactQuery/cache' +import { type QueryOptionsResult } from 'utilities/src/reactQuery/queryOptions' +import { ONE_MINUTE_MS } from 'utilities/src/time/time' + +const DEFAULT_POLL_INTERVAL_MS = 2 * ONE_MINUTE_MS + +export interface GetNotificationQueryOptionsContext { + apiClient: NotificationsApiClient + pollIntervalMs?: number +} + +/** + * Creates query options for polling notifications. + * This can be used directly in hooks or injected into the notification data source. + * + * @example + * ```typescript + * import { getNotificationQueryOptions } from '@universe/notifications' + * import { useQuery } from '@tanstack/react-query' + * + * // Use in a hook + * const queryOptions = getNotificationQueryOptions({ apiClient }) + * const { data } = useQuery(queryOptions) + * + * // Or inject into data source + * const dataSource = createFetchNotificationDataSource({ + * queryClient, + * queryOptions, + * }) + * ``` + */ +export function getNotificationQueryOptions( + ctx: GetNotificationQueryOptionsContext, +): QueryOptionsResult { + const { apiClient, pollIntervalMs = DEFAULT_POLL_INTERVAL_MS } = ctx + + return queryOptions({ + queryKey: [ReactQueryCacheKey.Notifications], + queryFn: async (): Promise => { + try { + return await apiClient.getNotifications() + } catch (error) { + logger.error(error, { + tags: { file: 'notificationQueryOptions', function: 'queryFn' }, + }) + throw error + } + }, + refetchInterval: pollIntervalMs, + refetchIntervalInBackground: true, + staleTime: pollIntervalMs - 1000, + retry: 2, + retryDelay: (attemptIndex: number): number => Math.min(1000 * 2 ** attemptIndex, 30000), + }) +} diff --git a/packages/notifications/src/notification-processor/NotificationProcessor.ts b/packages/notifications/src/notification-processor/NotificationProcessor.ts new file mode 100644 index 00000000000..960f103081d --- /dev/null +++ b/packages/notifications/src/notification-processor/NotificationProcessor.ts @@ -0,0 +1,7 @@ +import { type InAppNotification } from '@universe/api' + +export interface NotificationProcessor { + // Process incoming notifications against current state + // Returns only notifications that should be rendered + process(notifications: InAppNotification[]): Promise +} diff --git a/packages/notifications/src/notification-processor/implementations/createBaseNotificationProcessor.test.ts b/packages/notifications/src/notification-processor/implementations/createBaseNotificationProcessor.test.ts new file mode 100644 index 00000000000..3da43d2050e --- /dev/null +++ b/packages/notifications/src/notification-processor/implementations/createBaseNotificationProcessor.test.ts @@ -0,0 +1,320 @@ +import type { InAppNotification } from '@universe/api' +import { createBaseNotificationProcessor } from '@universe/notifications/src/notification-processor/implementations/createBaseNotificationProcessor' +import type { NotificationTracker } from '@universe/notifications/src/notification-tracker/NotificationTracker' +import { describe, expect, it } from 'vitest' + +describe('createBaseNotificationProcessor', () => { + const createMockNotification = (params: { + name: string + timestamp: number + style: string + id?: string + }): InAppNotification => + ({ + id: params.id ?? `${params.name}-id`, + notificationName: params.name, + timestamp: params.timestamp, + content: { style: params.style, title: `${params.name}-title` }, + metaData: {}, + userId: 'user-1', + }) as InAppNotification + + const createMockTracker = (processedIds: Set = new Set()): NotificationTracker => ({ + getProcessedIds: async () => processedIds, + isProcessed: async (id: string) => processedIds.has(id), + track: async (): Promise => {}, + }) + + describe('initialization', () => { + it('creates a notification processor with process method', () => { + const tracker = createMockTracker() + const processor = createBaseNotificationProcessor(tracker) + + expect(processor).toBeDefined() + expect(typeof processor.process).toBe('function') + }) + }) + + describe('chronological sorting', () => { + it('sorts notifications by timestamp in ascending order (oldest first)', async () => { + const tracker = createMockTracker() + const processor = createBaseNotificationProcessor(tracker) + const notifications: InAppNotification[] = [ + createMockNotification({ name: 'notif-3', timestamp: 3000, style: 'CONTENT_STYLE_MODAL' }), + createMockNotification({ name: 'notif-1', timestamp: 1000, style: 'CONTENT_STYLE_BANNER' }), + createMockNotification({ name: 'notif-2', timestamp: 2000, style: 'CONTENT_STYLE_POPOVER' }), + ] + + const result = await processor.process(notifications) + + expect(result).toHaveLength(3) + expect(result[0].notificationName).toBe('notif-1') + expect(result[0].timestamp).toBe(1000) + expect(result[1].notificationName).toBe('notif-2') + expect(result[1].timestamp).toBe(2000) + expect(result[2].notificationName).toBe('notif-3') + expect(result[2].timestamp).toBe(3000) + }) + + it('treats notifications without timestamp as 0 (oldest)', async () => { + const tracker = createMockTracker() + const processor = createBaseNotificationProcessor(tracker) + const notifWithoutTimestamp: InAppNotification = { + id: 'notif-no-timestamp-id', + notificationName: 'notif-no-timestamp', + content: { style: 'CONTENT_STYLE_MODAL', title: 'notif-no-timestamp-title' }, + userId: 'user-1', + metaData: {}, + } as InAppNotification + const notifications: InAppNotification[] = [ + createMockNotification({ name: 'notif-2', timestamp: 2000, style: 'CONTENT_STYLE_BANNER' }), + notifWithoutTimestamp, + createMockNotification({ name: 'notif-1', timestamp: 1000, style: 'CONTENT_STYLE_POPOVER' }), + ] + + const result = await processor.process(notifications) + + expect(result[0].notificationName).toBe('notif-no-timestamp') + expect(result[1].notificationName).toBe('notif-1') + expect(result[2].notificationName).toBe('notif-2') + }) + + it('maintains stable sort for notifications with same timestamp', async () => { + const tracker = createMockTracker() + const processor = createBaseNotificationProcessor(tracker) + const notifications: InAppNotification[] = [ + createMockNotification({ name: 'notif-1', timestamp: 1000, style: 'CONTENT_STYLE_MODAL' }), + createMockNotification({ name: 'notif-2', timestamp: 1000, style: 'CONTENT_STYLE_BANNER' }), + createMockNotification({ name: 'notif-3', timestamp: 1000, style: 'CONTENT_STYLE_POPOVER' }), + ] + + const result = await processor.process(notifications) + + // All have same timestamp, so should maintain insertion order + expect(result).toHaveLength(3) + expect(result[0].notificationName).toBe('notif-1') + expect(result[1].notificationName).toBe('notif-2') + expect(result[2].notificationName).toBe('notif-3') + }) + + it('handles notifications with very large timestamps', async () => { + const tracker = createMockTracker() + const processor = createBaseNotificationProcessor(tracker) + const notifications: InAppNotification[] = [ + createMockNotification({ name: 'notif-1', timestamp: Number.MAX_SAFE_INTEGER, style: 'CONTENT_STYLE_MODAL' }), + createMockNotification({ name: 'notif-2', timestamp: 1000, style: 'CONTENT_STYLE_BANNER' }), + ] + + const result = await processor.process(notifications) + + expect(result).toHaveLength(2) + expect(result[0].notificationName).toBe('notif-2') + expect(result[1].notificationName).toBe('notif-1') + }) + + it('handles empty notifications array', async () => { + const tracker = createMockTracker() + const processor = createBaseNotificationProcessor(tracker) + const result = await processor.process([]) + + expect(result).toEqual([]) + }) + + it('handles single notification', async () => { + const tracker = createMockTracker() + const processor = createBaseNotificationProcessor(tracker) + const notifications: InAppNotification[] = [ + createMockNotification({ name: 'notif-1', timestamp: 1000, style: 'CONTENT_STYLE_MODAL' }), + ] + + const result = await processor.process(notifications) + + expect(result).toHaveLength(1) + expect(result[0].notificationName).toBe('notif-1') + }) + + it('handles notifications with negative timestamps', async () => { + const tracker = createMockTracker() + const processor = createBaseNotificationProcessor(tracker) + const notifications: InAppNotification[] = [ + createMockNotification({ name: 'notif-1', timestamp: 1000, style: 'CONTENT_STYLE_MODAL' }), + createMockNotification({ name: 'notif-2', timestamp: -500, style: 'CONTENT_STYLE_BANNER' }), + createMockNotification({ name: 'notif-3', timestamp: 0, style: 'CONTENT_STYLE_POPOVER' }), + ] + + const result = await processor.process(notifications) + + expect(result).toHaveLength(3) + expect(result[0].notificationName).toBe('notif-2') // -500 + expect(result[1].notificationName).toBe('notif-3') // 0 + expect(result[2].notificationName).toBe('notif-1') // 1000 + }) + }) + + describe('filtering processed notifications', () => { + it('filters out notifications that are in processedIds', async () => { + const processedIds = new Set(['id-2']) + const tracker = createMockTracker(processedIds) + const processor = createBaseNotificationProcessor(tracker) + const notifications: InAppNotification[] = [ + createMockNotification({ name: 'notif-1', timestamp: 1000, style: 'CONTENT_STYLE_MODAL', id: 'id-1' }), + createMockNotification({ name: 'notif-2', timestamp: 2000, style: 'CONTENT_STYLE_BANNER', id: 'id-2' }), + createMockNotification({ name: 'notif-3', timestamp: 3000, style: 'CONTENT_STYLE_POPOVER', id: 'id-3' }), + ] + + const result = await processor.process(notifications) + + expect(result).toHaveLength(2) + expect(result[0].notificationName).toBe('notif-1') + expect(result[1].notificationName).toBe('notif-3') + }) + + it('filters out multiple processed notifications', async () => { + const processedIds = new Set(['id-1', 'id-3']) + const tracker = createMockTracker(processedIds) + const processor = createBaseNotificationProcessor(tracker) + const notifications: InAppNotification[] = [ + createMockNotification({ name: 'notif-1', timestamp: 1000, style: 'CONTENT_STYLE_MODAL', id: 'id-1' }), + createMockNotification({ name: 'notif-2', timestamp: 2000, style: 'CONTENT_STYLE_BANNER', id: 'id-2' }), + createMockNotification({ name: 'notif-3', timestamp: 3000, style: 'CONTENT_STYLE_POPOVER', id: 'id-3' }), + createMockNotification({ name: 'notif-4', timestamp: 4000, style: 'CONTENT_STYLE_MODAL', id: 'id-4' }), + ] + + const result = await processor.process(notifications) + + expect(result).toHaveLength(2) + expect(result[0].notificationName).toBe('notif-2') + expect(result[1].notificationName).toBe('notif-4') + }) + + it('returns all notifications when processedIds is empty', async () => { + const tracker = createMockTracker() + const processor = createBaseNotificationProcessor(tracker) + const notifications: InAppNotification[] = [ + createMockNotification({ name: 'notif-1', timestamp: 1000, style: 'CONTENT_STYLE_MODAL' }), + createMockNotification({ name: 'notif-2', timestamp: 2000, style: 'CONTENT_STYLE_BANNER' }), + ] + + const result = await processor.process(notifications) + + expect(result).toHaveLength(2) + expect(result[0].notificationName).toBe('notif-1') + expect(result[1].notificationName).toBe('notif-2') + }) + + it('returns empty array when all notifications are processed', async () => { + const processedIds = new Set(['id-1', 'id-2']) + const tracker = createMockTracker(processedIds) + const processor = createBaseNotificationProcessor(tracker) + const notifications: InAppNotification[] = [ + createMockNotification({ name: 'notif-1', timestamp: 1000, style: 'CONTENT_STYLE_MODAL', id: 'id-1' }), + createMockNotification({ name: 'notif-2', timestamp: 2000, style: 'CONTENT_STYLE_BANNER', id: 'id-2' }), + ] + + const result = await processor.process(notifications) + + expect(result).toEqual([]) + }) + + it('filters and sorts remaining notifications', async () => { + const processedIds = new Set(['id-2', 'id-4']) + const tracker = createMockTracker(processedIds) + const processor = createBaseNotificationProcessor(tracker) + const notifications: InAppNotification[] = [ + createMockNotification({ name: 'notif-3', timestamp: 3000, style: 'CONTENT_STYLE_MODAL', id: 'id-3' }), + createMockNotification({ name: 'notif-1', timestamp: 1000, style: 'CONTENT_STYLE_BANNER', id: 'id-1' }), + createMockNotification({ name: 'notif-4', timestamp: 4000, style: 'CONTENT_STYLE_POPOVER', id: 'id-4' }), + createMockNotification({ name: 'notif-2', timestamp: 2000, style: 'CONTENT_STYLE_MODAL', id: 'id-2' }), + ] + + const result = await processor.process(notifications) + + // Should filter out id-2 and id-4, then sort remaining by timestamp + expect(result).toHaveLength(2) + expect(result[0].notificationName).toBe('notif-1') // timestamp 1000 + expect(result[1].notificationName).toBe('notif-3') // timestamp 3000 + }) + }) + + describe('edge cases', () => { + it('preserves original notification objects without mutation', async () => { + const tracker = createMockTracker() + const processor = createBaseNotificationProcessor(tracker) + const originalNotifications: InAppNotification[] = [ + createMockNotification({ name: 'notif-1', timestamp: 1000, style: 'CONTENT_STYLE_MODAL' }), + createMockNotification({ name: 'notif-2', timestamp: 2000, style: 'CONTENT_STYLE_BANNER' }), + ] + const originalNotificationsCopy = JSON.parse(JSON.stringify(originalNotifications)) + + await processor.process(originalNotifications) + + expect(originalNotifications).toEqual(originalNotificationsCopy) + }) + + it('returns all notifications in sorted order regardless of style', async () => { + const tracker = createMockTracker() + const processor = createBaseNotificationProcessor(tracker) + const notifications: InAppNotification[] = [ + createMockNotification({ name: 'modal-1', timestamp: 3000, style: 'CONTENT_STYLE_MODAL' }), + createMockNotification({ name: 'banner-1', timestamp: 1000, style: 'CONTENT_STYLE_LOWER_LEFT_BANNER' }), + createMockNotification({ name: 'modal-2', timestamp: 4000, style: 'CONTENT_STYLE_MODAL' }), + createMockNotification({ name: 'banner-2', timestamp: 2000, style: 'CONTENT_STYLE_LOWER_LEFT_BANNER' }), + ] + + const result = await processor.process(notifications) + + // Should return all 4 notifications sorted by timestamp + expect(result).toHaveLength(4) + expect(result[0].notificationName).toBe('banner-1') // 1000 + expect(result[1].notificationName).toBe('banner-2') // 2000 + expect(result[2].notificationName).toBe('modal-1') // 3000 + expect(result[3].notificationName).toBe('modal-2') // 4000 + }) + + it('handles notifications with null or undefined content properties gracefully', async () => { + const tracker = createMockTracker() + const processor = createBaseNotificationProcessor(tracker) + const notificationWithNullStyle: InAppNotification = { + id: 'notif-null-id', + notificationName: 'notif-null', + timestamp: 1000, + content: { style: 'LOWER_LEFT_BANNER', title: 'notif-null-title' }, + userId: 'user-1', + metaData: {}, + } as InAppNotification + + const notifications: InAppNotification[] = [ + notificationWithNullStyle, + createMockNotification({ name: 'notif-valid', timestamp: 2000, style: 'CONTENT_STYLE_MODAL' }), + ] + + // Should not throw + const result = await processor.process(notifications) + + expect(result).toHaveLength(2) + expect(result[0].notificationName).toBe('notif-null') + expect(result[1].notificationName).toBe('notif-valid') + }) + + it('maintains correct behavior with very large notification lists', async () => { + const tracker = createMockTracker() + const processor = createBaseNotificationProcessor(tracker) + const notifications: InAppNotification[] = [] + + // Create 100 notifications with various timestamps + for (let i = 0; i < 100; i++) { + notifications.push( + createMockNotification({ name: `notif-${i}`, timestamp: (99 - i) * 1000, style: 'CONTENT_STYLE_MODAL' }), + ) + } + + const result = await processor.process(notifications) + + // Should return all 100 in sorted order + expect(result).toHaveLength(100) + expect(result[0].notificationName).toBe('notif-99') // timestamp 0 + expect(result[1].notificationName).toBe('notif-98') // timestamp 1000 + expect(result[99].notificationName).toBe('notif-0') // timestamp 99000 + }) + }) +}) diff --git a/packages/notifications/src/notification-processor/implementations/createBaseNotificationProcessor.ts b/packages/notifications/src/notification-processor/implementations/createBaseNotificationProcessor.ts new file mode 100644 index 00000000000..65b2daa2ff2 --- /dev/null +++ b/packages/notifications/src/notification-processor/implementations/createBaseNotificationProcessor.ts @@ -0,0 +1,39 @@ +import { type InAppNotification } from '@universe/api' +import { createNotificationProcessor } from '@universe/notifications/src/notification-processor/implementations/createNotificationProcessor' +import { type NotificationProcessor } from '@universe/notifications/src/notification-processor/NotificationProcessor' +import { type NotificationTracker } from '@universe/notifications/src/notification-tracker/NotificationTracker' + +/** + * Creates a base notification processor that implements style-based deduplication and ordering. + * + * Processing rules: + * 1. Filters out notifications that have already been processed (tracked) + * 2. Sorts remaining notifications chronologically (by timestamp) + * 3. Filter "sub" notifications and separate them from the "main" notifications + * @param tracker - The NotificationTracker to check which notifications have been processed + * @returns A NotificationProcessor that applies these rules + */ +export function createBaseNotificationProcessor(tracker: NotificationTracker): NotificationProcessor { + return createNotificationProcessor({ + process: async (notifications: InAppNotification[]): Promise => { + // Step 1: Get processed IDs from the tracker + const processedIds = await tracker.getProcessedIds() + + // Step 2: Filter out notifications that are locally tracked + const filtered = notifications.filter((notification) => !processedIds.has(notification.id)) + + // Step 3: Sort chronologically by timestamp (oldest first) + // Notifications without timestamp will be treated as 0 (oldest) + const sorted = [...filtered].sort((a, b) => { + const timeA = a.timestamp ?? 0 + const timeB = b.timestamp ?? 0 + return timeA - timeB + }) + + // Step 4: Filter "sub" notifications and separate them from the "main" notifications + // TODO + + return sorted + }, + }) +} diff --git a/packages/notifications/src/notification-processor/implementations/createNotificationProcessor.test.ts b/packages/notifications/src/notification-processor/implementations/createNotificationProcessor.test.ts new file mode 100644 index 00000000000..5072a498ae5 --- /dev/null +++ b/packages/notifications/src/notification-processor/implementations/createNotificationProcessor.test.ts @@ -0,0 +1,130 @@ +import type { InAppNotification } from '@universe/api' +import { createNotificationProcessor } from '@universe/notifications/src/notification-processor/implementations/createNotificationProcessor' +import { describe, expect, it, vi } from 'vitest' + +describe('createNotificationProcessor', () => { + it('creates a notification processor with process method', () => { + const mockProcess = vi.fn() + const processor = createNotificationProcessor({ + process: mockProcess, + }) + + expect(processor).toBeDefined() + expect(typeof processor.process).toBe('function') + }) + + it('delegates process call to injected process function', async () => { + const mockNotifications: InAppNotification[] = [ + { + id: 'test-notif-1-id', + metaData: {}, + notificationName: 'test-notif-1', + timestamp: 1000, + content: { style: 'CONTENT_STYLE_MODAL', title: 'test-notif-1-title' }, + userId: 'user-1', + } as InAppNotification, + ] + const mockResult: InAppNotification[] = [ + { + id: 'result-notif-id', + metaData: {}, + notificationName: 'result-notif', + timestamp: 2000, + content: { style: 'CONTENT_STYLE_MODAL', title: 'result-notif-title' }, + userId: 'user-1', + } as InAppNotification, + ] + + const mockProcess = vi.fn().mockResolvedValue(mockResult) + const processor = createNotificationProcessor({ + process: mockProcess, + }) + + const result = await processor.process(mockNotifications) + + expect(mockProcess).toHaveBeenCalledWith(mockNotifications) + expect(result).toBe(mockResult) + }) + + it('preserves the exact arguments passed to process method', async () => { + const notifications: InAppNotification[] = [ + { + id: 'notif-1-id', + metaData: {}, + notificationName: 'notif-1', + timestamp: 1000, + content: { style: 'CONTENT_STYLE_MODAL', title: 'notif-1-title' }, + userId: 'user-1', + } as InAppNotification, + { + id: 'notif-2-id', + metaData: {}, + notificationName: 'notif-2', + timestamp: 2000, + content: { style: 'CONTENT_STYLE_BANNER', title: 'notif-2-title' }, + userId: 'user-1', + } as InAppNotification, + ] + + let capturedNotifications: InAppNotification[] | undefined + + const mockProcess = vi.fn(async (notifs) => { + capturedNotifications = notifs + return [] + }) + + const processor = createNotificationProcessor({ + process: mockProcess, + }) + + await processor.process(notifications) + + expect(capturedNotifications).toBe(notifications) + }) + + it('returns empty array when injected process returns empty array', async () => { + const mockProcess = vi.fn().mockResolvedValue([]) + const processor = createNotificationProcessor({ + process: mockProcess, + }) + + const result = await processor.process([]) + + expect(result).toEqual([]) + }) + + it('handles multiple calls with different arguments', async () => { + const mockProcess = vi.fn(async (notifications) => notifications) + const processor = createNotificationProcessor({ + process: mockProcess, + }) + + const notifs1: InAppNotification[] = [ + { + id: 'notif-1-id', + metaData: {}, + notificationName: 'notif-1', + timestamp: 1000, + content: { style: 'CONTENT_STYLE_MODAL', title: 'notif-1-title' }, + userId: 'user-1', + } as InAppNotification, + ] + const notifs2: InAppNotification[] = [ + { + id: 'notif-2-id', + metaData: {}, + notificationName: 'notif-2', + timestamp: 2000, + content: { style: 'CONTENT_STYLE_BANNER', title: 'notif-2-title' }, + userId: 'user-1', + } as InAppNotification, + ] + + const result1 = await processor.process(notifs1) + const result2 = await processor.process(notifs2) + + expect(mockProcess).toHaveBeenCalledTimes(2) + expect(result1).toEqual(notifs1) + expect(result2).toEqual(notifs2) + }) +}) diff --git a/packages/notifications/src/notification-processor/implementations/createNotificationProcessor.ts b/packages/notifications/src/notification-processor/implementations/createNotificationProcessor.ts new file mode 100644 index 00000000000..23bb7dcfa8b --- /dev/null +++ b/packages/notifications/src/notification-processor/implementations/createNotificationProcessor.ts @@ -0,0 +1,12 @@ +import { type InAppNotification } from '@universe/api' +import { type NotificationProcessor } from '@universe/notifications/src/notification-processor/NotificationProcessor' + +export function createNotificationProcessor(ctx: { + process: (notifications: InAppNotification[]) => Promise +}): NotificationProcessor { + return { + process: async (notifications: InAppNotification[]): Promise => { + return ctx.process(notifications) + }, + } +} diff --git a/packages/notifications/src/notification-renderer/NotificationRenderer.ts b/packages/notifications/src/notification-renderer/NotificationRenderer.ts new file mode 100644 index 00000000000..e13c357a4c5 --- /dev/null +++ b/packages/notifications/src/notification-renderer/NotificationRenderer.ts @@ -0,0 +1,8 @@ +import { type InAppNotification } from '@universe/api' + +export interface NotificationRenderer { + // Render a notification and return cleanup function + render(notification: InAppNotification): () => void + // Check if a notification type can be rendered (e.g., only one modal at a time) + canRender(notification: InAppNotification): boolean +} diff --git a/packages/notifications/src/notification-renderer/implementations/createNotificationRenderer.ts b/packages/notifications/src/notification-renderer/implementations/createNotificationRenderer.ts new file mode 100644 index 00000000000..1a998800b01 --- /dev/null +++ b/packages/notifications/src/notification-renderer/implementations/createNotificationRenderer.ts @@ -0,0 +1,16 @@ +import { type InAppNotification } from '@universe/api' +import { type NotificationRenderer } from '@universe/notifications/src/notification-renderer/NotificationRenderer' + +export function createNotificationRenderer(ctx: { + render: (notification: InAppNotification) => () => void + canRender: (notification: InAppNotification) => boolean +}): NotificationRenderer { + return { + render: (notification: InAppNotification): (() => void) => { + return ctx.render(notification) + }, + canRender: (notification: InAppNotification): boolean => { + return ctx.canRender(notification) + }, + } +} diff --git a/packages/notifications/src/notification-system/NotificationSystem.ts b/packages/notifications/src/notification-system/NotificationSystem.ts new file mode 100644 index 00000000000..c1ee4930f40 --- /dev/null +++ b/packages/notifications/src/notification-system/NotificationSystem.ts @@ -0,0 +1,23 @@ +import { type NotificationDataSource } from '@universe/notifications/src/notification-data-source/NotificationDataSource' +import { type NotificationProcessor } from '@universe/notifications/src/notification-processor/NotificationProcessor' +import { type NotificationRenderer } from '@universe/notifications/src/notification-renderer/NotificationRenderer' +import { type NotificationTracker } from '@universe/notifications/src/notification-tracker/NotificationTracker' + +export interface NotificationSystemConfig { + // Multiple sources can feed notifications + dataSources: NotificationDataSource[] + tracker: NotificationTracker + processor: NotificationProcessor + renderer: NotificationRenderer +} + +export interface NotificationSystem { + // Initialize and start fetching notifications + initialize(): Promise + // Mark notification as processed - called by the UI when dismissed + onDismiss(notificationId: string): Promise + // Handle other actions + onButtonClick(notificationId: string, button: string): void + // Cleanup and teardown + destroy(): void +} diff --git a/packages/notifications/src/notification-system/implementations/createNotificationSystem.test.ts b/packages/notifications/src/notification-system/implementations/createNotificationSystem.test.ts new file mode 100644 index 00000000000..43bad575ce0 --- /dev/null +++ b/packages/notifications/src/notification-system/implementations/createNotificationSystem.test.ts @@ -0,0 +1,548 @@ +import type { InAppNotification } from '@universe/api' +import type { NotificationDataSource } from '@universe/notifications/src/notification-data-source/NotificationDataSource' +import type { NotificationProcessor } from '@universe/notifications/src/notification-processor/NotificationProcessor' +import type { NotificationRenderer } from '@universe/notifications/src/notification-renderer/NotificationRenderer' +import { createNotificationSystem } from '@universe/notifications/src/notification-system/implementations/createNotificationSystem' +import type { + NotificationTracker, + TrackingMetadata, +} from '@universe/notifications/src/notification-tracker/NotificationTracker' +import { describe, expect, it, vi } from 'vitest' + +describe('createNotificationSystem', () => { + const createMockNotification = (params: { name: string; timestamp: number; id?: string }): InAppNotification => + ({ + id: params.id ?? `${params.name}-id`, + notificationName: params.name, + timestamp: params.timestamp, + content: { style: 'CONTENT_STYLE_MODAL', title: `${params.name}-title` }, + metaData: {}, + userId: 'user-1', + }) as InAppNotification + + function createMockDataSource(): { + dataSource: NotificationDataSource + triggerNotifications: (notifications: InAppNotification[]) => void + } { + let callback: ((notifications: InAppNotification[]) => void) | undefined + + return { + dataSource: { + start: (onNotifications): void => { + callback = onNotifications + }, + stop: vi.fn().mockResolvedValue(undefined), + }, + triggerNotifications: (notifications): void => { + if (callback) { + callback(notifications) + } + }, + } + } + + function createMockTracker(initialProcessedIds: Set = new Set()): { + tracker: NotificationTracker + getTrackedCalls: () => Array<{ id: string; metadata: TrackingMetadata }> + } { + const trackedCalls: Array<{ id: string; metadata: TrackingMetadata }> = [] + + return { + tracker: { + isProcessed: vi.fn((id: string) => Promise.resolve(initialProcessedIds.has(id))), + getProcessedIds: vi.fn(() => Promise.resolve(new Set(initialProcessedIds))), + track: vi.fn((id: string, metadata: TrackingMetadata) => { + trackedCalls.push({ id, metadata }) + initialProcessedIds.add(id) + return Promise.resolve() + }), + }, + getTrackedCalls: () => trackedCalls, + } + } + + function createMockProcessor( + filterFn?: (notifications: InAppNotification[]) => InAppNotification[], + ): NotificationProcessor { + return { + process: vi.fn((notifications: InAppNotification[]) => { + if (filterFn) { + return Promise.resolve(filterFn(notifications)) + } + // Default: return all notifications + return Promise.resolve(notifications) + }), + } + } + + function createMockRenderer(canRenderAll = true): { + renderer: NotificationRenderer + getRenderedNotifications: () => InAppNotification[] + getCleanupCallCount: () => number + } { + const rendered: InAppNotification[] = [] + let cleanupCallCount = 0 + + return { + renderer: { + render: vi.fn((notification: InAppNotification) => { + rendered.push(notification) + return () => { + cleanupCallCount++ + } + }), + canRender: vi.fn(() => canRenderAll), + }, + getRenderedNotifications: () => rendered, + getCleanupCallCount: () => cleanupCallCount, + } + } + + describe('initialization', () => { + it('creates a notification system with required methods', () => { + const { dataSource } = createMockDataSource() + const { tracker } = createMockTracker() + const processor = createMockProcessor() + const { renderer } = createMockRenderer() + + const system = createNotificationSystem({ + dataSources: [dataSource], + tracker, + processor, + renderer, + }) + + expect(system).toBeDefined() + expect(typeof system.initialize).toBe('function') + expect(typeof system.onDismiss).toBe('function') + expect(typeof system.onButtonClick).toBe('function') + expect(typeof system.destroy).toBe('function') + }) + + it('starts all data sources during initialization', async () => { + const { dataSource: dataSource1 } = createMockDataSource() + const { dataSource: dataSource2 } = createMockDataSource() + const { tracker } = createMockTracker() + const processor = createMockProcessor() + const { renderer } = createMockRenderer() + + const startSpy1 = vi.spyOn(dataSource1, 'start') + const startSpy2 = vi.spyOn(dataSource2, 'start') + + const system = createNotificationSystem({ + dataSources: [dataSource1, dataSource2], + tracker, + processor, + renderer, + }) + + await system.initialize() + + expect(startSpy1).toHaveBeenCalledOnce() + expect(startSpy2).toHaveBeenCalledOnce() + }) + }) + + describe('notification handling', () => { + it('processes and renders new notifications', async () => { + const { dataSource, triggerNotifications } = createMockDataSource() + const { tracker } = createMockTracker() + const processor = createMockProcessor() + const { renderer, getRenderedNotifications } = createMockRenderer() + + const system = createNotificationSystem({ + dataSources: [dataSource], + tracker, + processor, + renderer, + }) + + await system.initialize() + + const notifications = [ + createMockNotification({ name: 'notif-1', timestamp: 1000, id: 'id-1' }), + createMockNotification({ name: 'notif-2', timestamp: 2000, id: 'id-2' }), + ] + + triggerNotifications(notifications) + + // Wait for async handling + await new Promise((resolve) => setTimeout(resolve, 10)) + + expect(processor.process).toHaveBeenCalledWith(notifications) + expect(getRenderedNotifications()).toHaveLength(2) + }) + + it('filters out already-processed notifications', async () => { + const { dataSource, triggerNotifications } = createMockDataSource() + const { tracker } = createMockTracker(new Set(['id-1'])) + // Create processor that filters out id-1 + const processor = createMockProcessor((notifications) => notifications.filter((n) => n.id !== 'id-1')) + const { renderer, getRenderedNotifications } = createMockRenderer() + + const system = createNotificationSystem({ + dataSources: [dataSource], + tracker, + processor, + renderer, + }) + + await system.initialize() + + const notifications = [ + createMockNotification({ name: 'notif-1', timestamp: 1000, id: 'id-1' }), + createMockNotification({ name: 'notif-2', timestamp: 2000, id: 'id-2' }), + ] + + triggerNotifications(notifications) + + // Wait for async handling + await new Promise((resolve) => setTimeout(resolve, 10)) + + // Only notif-2 should be rendered (notif-1 was already processed) + expect(getRenderedNotifications()).toHaveLength(1) + expect(getRenderedNotifications()[0].id).toBe('id-2') + }) + + it('does not render notifications that cannot be rendered', async () => { + const { dataSource, triggerNotifications } = createMockDataSource() + const { tracker } = createMockTracker() + const processor = createMockProcessor() + const { renderer, getRenderedNotifications } = createMockRenderer(false) + + const system = createNotificationSystem({ + dataSources: [dataSource], + tracker, + processor, + renderer, + }) + + await system.initialize() + + const notifications = [createMockNotification({ name: 'notif-1', timestamp: 1000, id: 'id-1' })] + + triggerNotifications(notifications) + + // Wait for async handling + await new Promise((resolve) => setTimeout(resolve, 10)) + + expect(renderer.canRender).toHaveBeenCalled() + expect(getRenderedNotifications()).toHaveLength(0) + }) + + it('does not render the same notification twice', async () => { + const { dataSource, triggerNotifications } = createMockDataSource() + const { tracker } = createMockTracker() + const processor = createMockProcessor() + const { renderer, getRenderedNotifications } = createMockRenderer() + + const system = createNotificationSystem({ + dataSources: [dataSource], + tracker, + processor, + renderer, + }) + + await system.initialize() + + const notifications = [createMockNotification({ name: 'notif-1', timestamp: 1000, id: 'id-1' })] + + // Trigger same notification twice + triggerNotifications(notifications) + await new Promise((resolve) => setTimeout(resolve, 10)) + + triggerNotifications(notifications) + await new Promise((resolve) => setTimeout(resolve, 10)) + + // Should only be rendered once + expect(getRenderedNotifications()).toHaveLength(1) + }) + + it('handles notifications from multiple data sources', async () => { + const { dataSource: dataSource1, triggerNotifications: trigger1 } = createMockDataSource() + const { dataSource: dataSource2, triggerNotifications: trigger2 } = createMockDataSource() + const { tracker } = createMockTracker() + const processor = createMockProcessor() + const { renderer, getRenderedNotifications } = createMockRenderer() + + const system = createNotificationSystem({ + dataSources: [dataSource1, dataSource2], + tracker, + processor, + renderer, + }) + + await system.initialize() + + trigger1([createMockNotification({ name: 'notif-1', timestamp: 1000, id: 'id-1' })]) + await new Promise((resolve) => setTimeout(resolve, 10)) + + trigger2([createMockNotification({ name: 'notif-2', timestamp: 2000, id: 'id-2' })]) + await new Promise((resolve) => setTimeout(resolve, 10)) + + expect(getRenderedNotifications()).toHaveLength(2) + }) + }) + + describe('onDismiss', () => { + it('tracks dismissed notification with dismiss strategy', async () => { + const { dataSource } = createMockDataSource() + const { tracker, getTrackedCalls } = createMockTracker() + const processor = createMockProcessor() + const { renderer } = createMockRenderer() + + const system = createNotificationSystem({ + dataSources: [dataSource], + tracker, + processor, + renderer, + }) + + await system.initialize() + await system.onDismiss('id-1') + + const trackedCalls = getTrackedCalls() + expect(trackedCalls).toHaveLength(1) + expect(trackedCalls[0].id).toBe('id-1') + expect(trackedCalls[0].metadata.strategy).toBe('dismiss') + }) + + it('calls cleanup function for rendered notification', async () => { + const { dataSource, triggerNotifications } = createMockDataSource() + const { tracker } = createMockTracker() + const processor = createMockProcessor() + const { renderer, getCleanupCallCount } = createMockRenderer() + + const system = createNotificationSystem({ + dataSources: [dataSource], + tracker, + processor, + renderer, + }) + + await system.initialize() + + const notifications = [createMockNotification({ name: 'notif-1', timestamp: 1000, id: 'id-1' })] + + triggerNotifications(notifications) + await new Promise((resolve) => setTimeout(resolve, 10)) + + expect(getCleanupCallCount()).toBe(0) + + await system.onDismiss('id-1') + + expect(getCleanupCallCount()).toBe(1) + }) + + it('handles dismiss for non-rendered notification gracefully', async () => { + const { dataSource } = createMockDataSource() + const { tracker } = createMockTracker() + const processor = createMockProcessor() + const { renderer, getCleanupCallCount } = createMockRenderer() + + const system = createNotificationSystem({ + dataSources: [dataSource], + tracker, + processor, + renderer, + }) + + await system.initialize() + + // Dismiss notification that was never rendered + await system.onDismiss('non-existent-id') + + // Should not throw and should still track + expect(tracker.track).toHaveBeenCalled() + expect(getCleanupCallCount()).toBe(0) + }) + + it('adds dismissed notification to processed IDs', async () => { + const { dataSource, triggerNotifications } = createMockDataSource() + const { tracker } = createMockTracker() + // Create processor that filters based on tracker's processed IDs + const processor: NotificationProcessor = { + process: vi.fn(async (notifications: InAppNotification[]) => { + const processedIds = await tracker.getProcessedIds() + return notifications.filter((n) => !processedIds.has(n.id)) + }), + } + const { renderer, getRenderedNotifications } = createMockRenderer() + + const system = createNotificationSystem({ + dataSources: [dataSource], + tracker, + processor, + renderer, + }) + + await system.initialize() + + const notification = createMockNotification({ name: 'notif-1', timestamp: 1000, id: 'id-1' }) + + // Render notification + triggerNotifications([notification]) + await new Promise((resolve) => setTimeout(resolve, 10)) + + // Dismiss it + await system.onDismiss('id-1') + + // Try to render it again - should not render + const renderedCountBefore = getRenderedNotifications().length + triggerNotifications([notification]) + await new Promise((resolve) => setTimeout(resolve, 10)) + + expect(getRenderedNotifications().length).toBe(renderedCountBefore) + }) + }) + + describe('onButtonClick', () => { + it('handles button click without throwing', () => { + const { dataSource } = createMockDataSource() + const { tracker } = createMockTracker() + const processor = createMockProcessor() + const { renderer } = createMockRenderer() + + const system = createNotificationSystem({ + dataSources: [dataSource], + tracker, + processor, + renderer, + }) + + expect(() => system.onButtonClick('id-1', 'primary-button')).not.toThrow() + }) + }) + + describe('destroy', () => { + it('stops all data sources', async () => { + const { dataSource: dataSource1 } = createMockDataSource() + const { dataSource: dataSource2 } = createMockDataSource() + const { tracker } = createMockTracker() + const processor = createMockProcessor() + const { renderer } = createMockRenderer() + + const system = createNotificationSystem({ + dataSources: [dataSource1, dataSource2], + tracker, + processor, + renderer, + }) + + await system.initialize() + system.destroy() + + expect(dataSource1.stop).toHaveBeenCalledOnce() + expect(dataSource2.stop).toHaveBeenCalledOnce() + }) + + it('calls cleanup for all active renders', async () => { + const { dataSource, triggerNotifications } = createMockDataSource() + const { tracker } = createMockTracker() + const processor = createMockProcessor() + const { renderer, getCleanupCallCount } = createMockRenderer() + + const system = createNotificationSystem({ + dataSources: [dataSource], + tracker, + processor, + renderer, + }) + + await system.initialize() + + const notifications = [ + createMockNotification({ name: 'notif-1', timestamp: 1000, id: 'id-1' }), + createMockNotification({ name: 'notif-2', timestamp: 2000, id: 'id-2' }), + createMockNotification({ name: 'notif-3', timestamp: 3000, id: 'id-3' }), + ] + + triggerNotifications(notifications) + await new Promise((resolve) => setTimeout(resolve, 10)) + + expect(getCleanupCallCount()).toBe(0) + + system.destroy() + + expect(getCleanupCallCount()).toBe(3) + }) + + it('can be called before initialization without error', () => { + const { dataSource } = createMockDataSource() + const { tracker } = createMockTracker() + const processor = createMockProcessor() + const { renderer } = createMockRenderer() + + const system = createNotificationSystem({ + dataSources: [dataSource], + tracker, + processor, + renderer, + }) + + expect(() => system.destroy()).not.toThrow() + }) + }) + + describe('edge cases', () => { + it('handles empty notification arrays', async () => { + const { dataSource, triggerNotifications } = createMockDataSource() + const { tracker } = createMockTracker() + const processor = createMockProcessor() + const { renderer, getRenderedNotifications } = createMockRenderer() + + const system = createNotificationSystem({ + dataSources: [dataSource], + tracker, + processor, + renderer, + }) + + await system.initialize() + + triggerNotifications([]) + await new Promise((resolve) => setTimeout(resolve, 10)) + + expect(getRenderedNotifications()).toHaveLength(0) + }) + + it('handles processor returning empty array', async () => { + const { dataSource, triggerNotifications } = createMockDataSource() + const { tracker } = createMockTracker() + const processor = createMockProcessor(() => []) // Always return empty + const { renderer, getRenderedNotifications } = createMockRenderer() + + const system = createNotificationSystem({ + dataSources: [dataSource], + tracker, + processor, + renderer, + }) + + await system.initialize() + + const notifications = [createMockNotification({ name: 'notif-1', timestamp: 1000, id: 'id-1' })] + + triggerNotifications(notifications) + await new Promise((resolve) => setTimeout(resolve, 10)) + + expect(getRenderedNotifications()).toHaveLength(0) + }) + + it('handles system with no data sources', async () => { + const { tracker } = createMockTracker() + const processor = createMockProcessor() + const { renderer } = createMockRenderer() + + const system = createNotificationSystem({ + dataSources: [], + tracker, + processor, + renderer, + }) + + await expect(system.initialize()).resolves.not.toThrow() + expect(() => system.destroy()).not.toThrow() + }) + }) +}) diff --git a/packages/notifications/src/notification-system/implementations/createNotificationSystem.ts b/packages/notifications/src/notification-system/implementations/createNotificationSystem.ts new file mode 100644 index 00000000000..464b7bacd85 --- /dev/null +++ b/packages/notifications/src/notification-system/implementations/createNotificationSystem.ts @@ -0,0 +1,96 @@ +import { type InAppNotification } from '@universe/api' +import { + type NotificationSystem, + type NotificationSystemConfig, +} from '@universe/notifications/src/notification-system/NotificationSystem' +import { getLogger } from 'utilities/src/logger/logger' + +export function createNotificationSystem(config: NotificationSystemConfig): NotificationSystem { + const { dataSources, tracker, processor, renderer } = config + + const activeRenders = new Map void>() + + const processedIds: Set = new Set() + + async function handleNotifications(notifications: InAppNotification[]): Promise { + const notificationsToRender = await processor.process(notifications) + + for (const notification of notificationsToRender) { + if (!renderer.canRender(notification)) { + continue + } + + if (activeRenders.has(notification.id)) { + continue + } + + const cleanup = renderer.render(notification) + activeRenders.set(notification.id, cleanup) + + // TODO: send onRender analytics event + + processedIds.add(notification.id) + } + } + + return { + async initialize(): Promise { + for (const dataSource of dataSources) { + dataSource.start((notifications) => { + // TODO: send onNotificationReceived analytics event + handleNotifications(notifications).catch((error) => { + getLogger().error(error, { + tags: { + file: 'createNotificationSystem', + function: 'handleNotifications', + }, + }) + }) + }) + } + }, + + async onDismiss(notificationId: string): Promise { + await tracker.track(notificationId, { + timestamp: Date.now(), + strategy: 'dismiss', + }) + + // TODO: send onDismiss analytics event + + const cleanup = activeRenders.get(notificationId) + if (cleanup) { + cleanup() + activeRenders.delete(notificationId) + } + + // Add to processed IDs if not already there + processedIds.add(notificationId) + }, + + onButtonClick(_notificationId: string, _button: string): void { + // TODO: send onButtonClick analytics event + // TODO: handle button click (e.g. trigger next notification) + }, + + destroy(): void { + // Stop all data sources + for (const dataSource of dataSources) { + dataSource.stop().catch((error) => { + getLogger().error(error, { + tags: { + file: 'createNotificationSystem', + function: 'destroy', + }, + }) + }) + } + + // Clean up all active renders + for (const cleanup of activeRenders.values()) { + cleanup() + } + activeRenders.clear() + }, + } +} diff --git a/packages/notifications/src/notification-tracker/NotificationTracker.ts b/packages/notifications/src/notification-tracker/NotificationTracker.ts new file mode 100644 index 00000000000..cdff7160ff0 --- /dev/null +++ b/packages/notifications/src/notification-tracker/NotificationTracker.ts @@ -0,0 +1,15 @@ +export interface TrackingMetadata { + timestamp: number + strategy: 'render' | 'dismiss' | 'duration' | 'max-views' +} + +export interface NotificationTracker { + // Check if a notification has been processed + isProcessed(notificationId: string): Promise + // Get all processed notification IDs + getProcessedIds(): Promise> + // Track notification as processed + track(notificationId: string, metadata: TrackingMetadata): Promise + // Optional cleanup for old entries + cleanup?(olderThan: number): Promise +} diff --git a/packages/notifications/src/notification-tracker/implementations/createNoopNotificationTracker.ts b/packages/notifications/src/notification-tracker/implementations/createNoopNotificationTracker.ts new file mode 100644 index 00000000000..bddac6cace1 --- /dev/null +++ b/packages/notifications/src/notification-tracker/implementations/createNoopNotificationTracker.ts @@ -0,0 +1,48 @@ +import { createNotificationTracker } from '@universe/notifications/src/notification-tracker/implementations/createNotificationTracker' +import { + NotificationTracker, + TrackingMetadata, +} from '@universe/notifications/src/notification-tracker/NotificationTracker' + +/** + * Creates a no-op notification tracker that doesn't persist any state. + * + * Since the backend will only send each notification to a user once in Phase 1, + * client-side tracking is not needed. This implementation satisfies the + * NotificationTracker interface without performing any actual tracking. + * + * Example usage: + * ```typescript + * import { createNoopNotificationTracker } from '@universe/notifications' + * + * const tracker = createNoopNotificationTracker() + * + * // All operations are no-ops + * const processed = await tracker.isProcessed('notif-123') // always false + * await tracker.track('notif-123', { timestamp: Date.now(), strategy: 'render' }) // no-op + * ``` + */ +export function createNoopNotificationTracker(): NotificationTracker { + const isProcessed = async (_notificationId: string): Promise => { + return false + } + + const getProcessedIds = async (): Promise> => { + return new Set() + } + + const track = async (_notificationId: string, _metadata: TrackingMetadata): Promise => { + // no-op + } + + const cleanup = async (_olderThan: number): Promise => { + // no-op + } + + return createNotificationTracker({ + isProcessed, + getProcessedIds, + track, + cleanup, + }) +} diff --git a/packages/notifications/src/notification-tracker/implementations/createNotificationTracker.ts b/packages/notifications/src/notification-tracker/implementations/createNotificationTracker.ts new file mode 100644 index 00000000000..72a1353cf1d --- /dev/null +++ b/packages/notifications/src/notification-tracker/implementations/createNotificationTracker.ts @@ -0,0 +1,31 @@ +import { + NotificationTracker, + TrackingMetadata, +} from '@universe/notifications/src/notification-tracker/NotificationTracker' + +/** + * Basic implementation of the NotificationTracker interface. + */ +export function createNotificationTracker(ctx: { + isProcessed: (notificationId: string) => Promise + getProcessedIds: () => Promise> + track: (notificationId: string, metadata: TrackingMetadata) => Promise + cleanup?: (olderThan: number) => Promise +}): NotificationTracker { + return { + isProcessed: async (notificationId: string): Promise => { + return ctx.isProcessed(notificationId) + }, + getProcessedIds: async (): Promise> => { + return ctx.getProcessedIds() + }, + track: async (notificationId: string, metadata: TrackingMetadata): Promise => { + return ctx.track(notificationId, metadata) + }, + cleanup: ctx.cleanup + ? async (olderThan: number): Promise => { + return ctx.cleanup?.(olderThan) + } + : undefined, + } +} diff --git a/packages/notifications/tsconfig.json b/packages/notifications/tsconfig.json index 6fbf4aa3e1b..e5031d913f7 100644 --- a/packages/notifications/tsconfig.json +++ b/packages/notifications/tsconfig.json @@ -1,12 +1,15 @@ { "extends": "../../config/tsconfig/app.json", - "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.json", "src/global.d.ts"], + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.json", "../../index.d.ts"], "exclude": ["src/**/*.spec.ts", "src/**/*.spec.tsx", "src/**/*.test.ts", "src/**/*.test.tsx"], "compilerOptions": { "noEmit": false, "emitDeclarationOnly": true, "types": ["node"], - "paths": {} + "baseUrl": ".", + "paths": { + "@universe/notifications/*": ["./*"] + } }, "references": [] } diff --git a/packages/notifications/vitest.config.ts b/packages/notifications/vitest.config.ts new file mode 100644 index 00000000000..1a48e6d0dbf --- /dev/null +++ b/packages/notifications/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + environment: 'node', + coverage: { + exclude: ['**/__generated__/**', '**/node_modules/**', '**/dist/**', '**/*.config.*', '**/scripts/**'], + }, + }, +}) diff --git a/packages/sessions/package.json b/packages/sessions/package.json index 5cbe62472cc..b3f7039f1ed 100644 --- a/packages/sessions/package.json +++ b/packages/sessions/package.json @@ -15,7 +15,7 @@ "@connectrpc/connect": "1.4.0", "@connectrpc/connect-web": "1.4.0", "@tanstack/react-query": "5.77.2", - "@uniswap/client-platform-service": "0.0.5", + "@uniswap/client-platform-service": "0.0.6", "utilities": "workspace:^" }, "devDependencies": { diff --git a/packages/sessions/src/challenge-solvers/createChallengeSolverService.ts b/packages/sessions/src/challenge-solvers/createChallengeSolverService.ts new file mode 100644 index 00000000000..a6d558963d5 --- /dev/null +++ b/packages/sessions/src/challenge-solvers/createChallengeSolverService.ts @@ -0,0 +1,47 @@ +import { BotDetectionType } from '@uniswap/client-platform-service/dist/uniswap/platformservice/v1/sessionService_pb' +import { createHashcashMockSolver } from '@universe/sessions/src/challenge-solvers/createHashcashMockSolver' +import { createNoneMockSolver } from '@universe/sessions/src/challenge-solvers/createNoneMockSolver' +import { createTurnstileMockSolver } from '@universe/sessions/src/challenge-solvers/createTurnstileMockSolver' +import type { ChallengeSolver, ChallengeSolverService } from '@universe/sessions/src/challenge-solvers/types' + +interface CreateChallengeSolverServiceContext { + /** + * Optional custom solvers to override defaults + * Allows injection of real implementations or custom mocks + */ + solvers?: Map +} + +function createChallengeSolverService(ctx: CreateChallengeSolverServiceContext = {}): ChallengeSolverService { + // Use injected solvers or fall back to default mocks + const solvers = ctx.solvers ?? createDefaultSolvers() + + function getSolver(type: BotDetectionType): ChallengeSolver | null { + // Handle None type explicitly + if (type === BotDetectionType.BOT_DETECTION_NONE) { + return { + solve: async (): Promise => { + throw new Error('No solver available for bot detection type: None') + }, + } + } + + return solvers.get(type) ?? null + } + + return { getSolver } +} + +/** + * Creates the default set of mock solvers for development/testing + */ +function createDefaultSolvers(): Map { + return new Map([ + [BotDetectionType.BOT_DETECTION_NONE, createNoneMockSolver()], + [BotDetectionType.BOT_DETECTION_TURNSTILE, createTurnstileMockSolver()], + [BotDetectionType.BOT_DETECTION_HASHCASH, createHashcashMockSolver()], + ]) +} + +export { createChallengeSolverService } +export type { CreateChallengeSolverServiceContext } diff --git a/packages/sessions/src/challenge-solvers/createHashcashMockSolver.ts b/packages/sessions/src/challenge-solvers/createHashcashMockSolver.ts new file mode 100644 index 00000000000..d814f3f3ec6 --- /dev/null +++ b/packages/sessions/src/challenge-solvers/createHashcashMockSolver.ts @@ -0,0 +1,39 @@ +import type { ChallengeData, ChallengeSolver } from '@universe/sessions/src/challenge-solvers/types' +import { sleep } from 'utilities/src/time/timing' + +/** + * Creates a mock Hashcash proof-of-work solver for development/testing + * + * In production, this would: + * - Extract difficulty/bits from challengeData.extra + * - Iterate through nonces to find hash with required leading zeros + * - Return actual proof-of-work solution + * + * Hashcash format: version:bits:date:resource::nonce:base64 + */ +function createHashcashMockSolver(): ChallengeSolver { + async function solve(challengeData: ChallengeData): Promise { + // Extract difficulty from extra data + const difficulty = challengeData.extra?.bits || '20' + + // Simulate proof-of-work computation time + // Real implementation would iterate through nonces + const iterations = parseInt(difficulty) / 4 + for (let i = 0; i < iterations; i++) { + await sleep(100) // Simulate work + } + + // Generate mock hashcash solution + const nonce = Math.random().toString(36).substring(2, 15) + const mockHash = btoa(`${challengeData.challengeId}${nonce}`).slice(0, 27) + const timestamp = new Date().toISOString().slice(2, 8).replace(/-/g, '') + const resource = challengeData.challengeId.slice(0, 16) + + // Return in hashcash format + return `1:${difficulty}:${timestamp}:${resource}::${nonce}:${mockHash}` + } + + return { solve } +} + +export { createHashcashMockSolver } diff --git a/packages/sessions/src/challenge-solvers/createNoneMockSolver.ts b/packages/sessions/src/challenge-solvers/createNoneMockSolver.ts new file mode 100644 index 00000000000..93e5ecfece9 --- /dev/null +++ b/packages/sessions/src/challenge-solvers/createNoneMockSolver.ts @@ -0,0 +1,11 @@ +import type { ChallengeData, ChallengeSolver } from '@universe/sessions/src/challenge-solvers/types' + +function createNoneMockSolver(): ChallengeSolver { + async function solve(_challengeData: ChallengeData): Promise { + return '' + } + + return { solve } +} + +export { createNoneMockSolver } diff --git a/packages/sessions/src/challenge-solvers/createTurnstileMockSolver.ts b/packages/sessions/src/challenge-solvers/createTurnstileMockSolver.ts new file mode 100644 index 00000000000..fd56b98197b --- /dev/null +++ b/packages/sessions/src/challenge-solvers/createTurnstileMockSolver.ts @@ -0,0 +1,30 @@ +import type { ChallengeData, ChallengeSolver } from '@universe/sessions/src/challenge-solvers/types' +import { sleep } from 'utilities/src/time/timing' + +/** + * Creates a mock Turnstile challenge solver for development/testing + * + * In production, this would integrate with Cloudflare Turnstile: + * - Load Turnstile script + * - Render widget with sitekey from challengeData.extra + * - Return actual token from Turnstile API + */ +function createTurnstileMockSolver(): ChallengeSolver { + async function solve(challengeData: ChallengeData): Promise { + // Simulate widget render delay + await sleep(300) + + // Simulate challenge solving time (random between 200-500ms) + const solvingTime = 200 + Math.random() * 300 + await sleep(solvingTime) + + // Return mock Turnstile token + const timestamp = Date.now() + const challengeIdPrefix = challengeData.challengeId.slice(0, 8) + return `mock_turnstile_token_${timestamp}_${challengeIdPrefix}` + } + + return { solve } +} + +export { createTurnstileMockSolver } diff --git a/packages/sessions/src/challenge-solvers/createTurnstileSolver.ts b/packages/sessions/src/challenge-solvers/createTurnstileSolver.ts new file mode 100644 index 00000000000..61f6f2aef60 --- /dev/null +++ b/packages/sessions/src/challenge-solvers/createTurnstileSolver.ts @@ -0,0 +1,177 @@ +import type { ChallengeData, ChallengeSolver } from '@universe/sessions/src/challenge-solvers/types' + +// Declare Turnstile types inline to avoid import issues +interface TurnstileWidget { + render: (container: string | HTMLElement, options: TurnstileOptions) => string + remove: (widgetId: string) => void + reset: (widgetId: string) => void + getResponse: (widgetId: string) => string | undefined + ready: (callback: () => void) => void +} + +interface TurnstileOptions { + sitekey: string + action?: string + theme?: 'light' | 'dark' | 'auto' + size?: 'normal' | 'compact' | 'flexible' + callback?: (token: string) => void + 'error-callback'?: (error: string) => void + 'expired-callback'?: () => void +} + +// Extend the Window interface to include turnstile +declare global { + interface Window { + turnstile?: TurnstileWidget + } +} + +/** + * Creates a Turnstile challenge solver. + * + * This integrates with Cloudflare Turnstile using explicit rendering: + * - Dynamically loads Turnstile script if not present + * - Creates a temporary DOM container + * - Renders widget with sitekey and action from challengeData.extra + * - Returns the verification token from Turnstile API + */ +function createTurnstileSolver(): ChallengeSolver { + async function solve(challengeData: ChallengeData): Promise { + // Parse challenge data from server + const challengeDataStr = challengeData.extra?.challengeData + if (!challengeDataStr) { + throw new Error('Missing challengeData in challenge extra') + } + + let parsedData: { siteKey: string; action: string } + try { + parsedData = JSON.parse(challengeDataStr) + } catch (error) { + throw new Error('Failed to parse challengeData', { cause: error }) + } + + const { siteKey, action } = parsedData + if (!siteKey) { + throw new Error('Missing siteKey in challengeData') + } + + // Ensure Turnstile script is loaded + await loadTurnstileScript() + + // Create temporary container for the widget + const containerId = `turnstile-${challengeData.challengeId}` + const container = document.createElement('div') + container.id = containerId + container.style.position = 'fixed' + container.style.top = '-9999px' // Hide off-screen + container.style.left = '-9999px' + document.body.appendChild(container) + + try { + // Wait for Turnstile to be ready and render widget + const token = await new Promise((resolve, reject) => { + if (!window.turnstile) { + reject(new Error('Turnstile API not available')) + return + } + + window.turnstile.ready(() => { + if (!window.turnstile) { + reject(new Error('Turnstile API not available after ready')) + return + } + + window.turnstile.render(container, { + sitekey: siteKey, + action, + theme: 'light', + size: 'normal', + callback: (tokenValue: string) => { + resolve(tokenValue) + }, + 'error-callback': (error: string) => { + reject(new Error(`Turnstile error: ${error}`)) + }, + 'expired-callback': () => { + reject(new Error('Turnstile token expired')) + }, + }) + + // Set timeout to prevent hanging + setTimeout(() => { + reject(new Error('Turnstile challenge timeout')) + }, 30000) // 30 second timeout + }) + }) + + return token + } finally { + // Clean up: remove the container + if (container.parentNode) { + container.parentNode.removeChild(container) + } + } + } + + return { solve } +} + +/** + * Dynamically loads the Turnstile script if not already present + */ +function loadTurnstileScript(): Promise { + return new Promise((resolve, reject) => { + // Check if Turnstile is already loaded + if (window.turnstile) { + resolve() + return + } + + // Check if script is already in DOM + const existingScript = document.querySelector('script[src*="challenges.cloudflare.com/turnstile"]') + if (existingScript) { + // Script exists, wait for it to load + const checkLoaded = setInterval(() => { + if (window.turnstile) { + clearInterval(checkLoaded) + resolve() + } + }, 100) + + // Timeout after 10 seconds + setTimeout(() => { + clearInterval(checkLoaded) + reject(new Error('Turnstile script load timeout')) + }, 10000) + return + } + + // Create and inject the script + const script = document.createElement('script') + script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit' + script.async = true + script.defer = true + + script.onload = (): void => { + // Wait for turnstile to actually be available on window + const checkInterval = setInterval(() => { + if (window.turnstile) { + clearInterval(checkInterval) + resolve() + } + }, 100) + + // Timeout after 5 seconds + setTimeout(() => { + clearInterval(checkInterval) + reject(new Error('Turnstile did not initialize after script load')) + }, 5000) + } + + script.onerror = (): void => reject(new Error('Failed to load Turnstile script')) + + document.head.appendChild(script) + }) +} + +export { createTurnstileSolver } diff --git a/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts b/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts new file mode 100644 index 00000000000..424e096648a --- /dev/null +++ b/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts @@ -0,0 +1,312 @@ +import { BotDetectionType } from '@uniswap/client-platform-service/dist/uniswap/platformservice/v1/sessionService_pb' +import { createTurnstileSolver } from '@universe/sessions/src/challenge-solvers/createTurnstileSolver' +import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest' + +// Mock window.turnstile API +const mockTurnstileAPI = { + render: vi.fn(), + remove: vi.fn(), + reset: vi.fn(), + getResponse: vi.fn(), + ready: vi.fn(), +} + +// Setup DOM mocks +beforeAll(() => { + const originalCreateElement = document.createElement.bind(document) + vi.spyOn(document, 'createElement').mockImplementation((tagName: string) => { + const element = originalCreateElement(tagName) + if (tagName === 'div') { + // Track created divs for assertions + // eslint-disable-next-line no-extra-semi + ;(element as any)._testCreated = true + } + return element + }) + + vi.spyOn(document.head, 'appendChild').mockImplementation((node) => { + if (node instanceof HTMLScriptElement && node.src.includes('challenges.cloudflare.com')) { + // Simulate script load immediately + setTimeout(() => { + // Set up the mock turnstile API + // eslint-disable-next-line no-extra-semi + ;(window as any).turnstile = mockTurnstileAPI + if (node.onload) { + node.onload({} as Event) + } + }, 0) + } + return node + }) + + const originalBodyAppendChild = document.body.appendChild.bind(document.body) + vi.spyOn(document.body, 'appendChild').mockImplementation((node) => { + // eslint-disable-next-line no-extra-semi + ;(node as any)._testAppended = true + // Actually append to the DOM so we can query it later + return originalBodyAppendChild(node) + }) + + vi.spyOn(Element.prototype, 'removeChild').mockImplementation(function (this: Element, child: Node) { + // eslint-disable-next-line no-extra-semi + ;(child as any)._testRemoved = true + return child + }) +}) + +afterAll(() => { + vi.restoreAllMocks() +}) + +describe('Turnstile Solver Integration Tests', () => { + beforeEach(() => { + // Configure mock Turnstile API behavior + mockTurnstileAPI.ready.mockImplementation((callback: () => void) => { + // Call the callback immediately + callback() + }) + + mockTurnstileAPI.render.mockImplementation((container: string | HTMLElement, options: any) => { + // Simulate successful render and call the callback with a test token + if (options.callback) { + setTimeout(() => { + options.callback('test-turnstile-solution-token') + }, 10) // Small delay to simulate async behavior + } + return 'widget-123' // Return a mock widget ID + }) + }) + + afterEach(() => { + // Clean up DOM + document.querySelectorAll('div[id^="turnstile-"]').forEach((el) => el.remove()) + + // Reset mocks to default successful behavior + vi.clearAllMocks() + ;(window as any).turnstile = undefined + }) + + it('verifies Turnstile solver basic functionality', async () => { + // Create a challenge solver directly to test + const turnstileSolver = createTurnstileSolver() + + // Create challenge data with proper structure + const challengeData = { + challengeId: 'dom-test-challenge-123', + botDetectionType: BotDetectionType.BOT_DETECTION_TURNSTILE, + extra: { + challengeData: JSON.stringify({ + siteKey: '0x4AAAAAABiAHneWOWZHzZtO', + action: 'session_verification', + }), + }, + } + + // Execute the solver and wait for solution + const solution = await turnstileSolver.solve(challengeData) + + // Verify solution was returned + expect(solution).toBe('test-turnstile-solution-token') + + // Verify script injection was attempted + expect(document.head.appendChild).toHaveBeenCalledWith( + expect.objectContaining({ + src: 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit', + async: true, + defer: true, + }), + ) + }) + + it('handles Turnstile solver errors properly', async () => { + // Configure mock to simulate an error with proper timing + mockTurnstileAPI.render.mockImplementation(async (container: string | HTMLElement, options: any) => { + if (options['error-callback']) { + // Use microtask to ensure promise handlers are set up + await Promise.resolve().then(() => { + options['error-callback']('NETWORK_ERROR') + }) + } + return 'widget-error-123' + }) + + const turnstileSolver = createTurnstileSolver() + const challengeData = { + challengeId: 'error-test-123', + botDetectionType: BotDetectionType.BOT_DETECTION_TURNSTILE, + extra: { + challengeData: JSON.stringify({ + siteKey: 'test-site-key', + action: 'test-action', + }), + }, + } + + // Should reject with Turnstile error + await expect(turnstileSolver.solve(challengeData)).rejects.toThrow('Turnstile error: NETWORK_ERROR') + }) + + it('handles expired tokens', async () => { + // Configure mock to simulate token expiration + mockTurnstileAPI.render.mockImplementation(async (container: string | HTMLElement, options: any) => { + if (options['expired-callback']) { + // Use microtask to ensure promise handlers are set up + await Promise.resolve().then(() => { + options['expired-callback']() + }) + } + return 'widget-expired-123' + }) + + const turnstileSolver = createTurnstileSolver() + const challengeData = { + challengeId: 'expired-test-123', + botDetectionType: BotDetectionType.BOT_DETECTION_TURNSTILE, + extra: { + challengeData: JSON.stringify({ + siteKey: 'test-site-key', + action: 'test-action', + }), + }, + } + + // Should reject with expiration error + await expect(turnstileSolver.solve(challengeData)).rejects.toThrow('Turnstile token expired') + }) + + it('handles timeout scenarios', async () => { + // Configure mock to never call any callbacks + mockTurnstileAPI.render.mockImplementation(() => { + // Don't call any callbacks - simulate timeout + return 'widget-timeout-123' + }) + + const turnstileSolver = createTurnstileSolver() + const challengeData = { + challengeId: 'timeout-test-123', + botDetectionType: BotDetectionType.BOT_DETECTION_TURNSTILE, + extra: { + challengeData: JSON.stringify({ + siteKey: 'test-site-key', + action: 'test-action', + }), + }, + } + + // Should reject with timeout error after 30 seconds + await expect(turnstileSolver.solve(challengeData)).rejects.toThrow('Turnstile challenge timeout') + }, 35000) // Extend test timeout since we're testing a 30s timeout + + it('handles missing challenge data', async () => { + const turnstileSolver = createTurnstileSolver() + const challengeData = { + challengeId: 'missing-data-123', + botDetectionType: BotDetectionType.BOT_DETECTION_TURNSTILE, + extra: {}, // Missing challengeData + } + + // Should reject with missing data error + await expect(turnstileSolver.solve(challengeData)).rejects.toThrow('Missing challengeData in challenge extra') + }) + + it('handles invalid challenge data JSON', async () => { + const turnstileSolver = createTurnstileSolver() + const challengeData = { + challengeId: 'invalid-json-123', + botDetectionType: BotDetectionType.BOT_DETECTION_TURNSTILE, + extra: { + challengeData: 'invalid-json-{', + }, + } + + // Should reject with JSON parse error + await expect(turnstileSolver.solve(challengeData)).rejects.toThrow('Failed to parse challengeData') + }) + + it('handles missing siteKey in challenge data', async () => { + const turnstileSolver = createTurnstileSolver() + const challengeData = { + challengeId: 'missing-sitekey-123', + botDetectionType: BotDetectionType.BOT_DETECTION_TURNSTILE, + extra: { + challengeData: JSON.stringify({ + action: 'test-action', + // Missing siteKey + }), + }, + } + + // Should reject with missing siteKey error + await expect(turnstileSolver.solve(challengeData)).rejects.toThrow('Missing siteKey in challengeData') + }) + + it('handles script loading failures', async () => { + // Mock script loading failure + vi.spyOn(document.head, 'appendChild').mockImplementationOnce((node) => { + if (node instanceof HTMLScriptElement && node.src.includes('challenges.cloudflare.com')) { + setTimeout(() => { + if (node.onerror) { + node.onerror({} as Event) + } + }, 0) + } + return node + }) + + const turnstileSolver = createTurnstileSolver() + const challengeData = { + challengeId: 'script-fail-123', + botDetectionType: BotDetectionType.BOT_DETECTION_TURNSTILE, + extra: { + challengeData: JSON.stringify({ + siteKey: 'test-site-key', + action: 'test-action', + }), + }, + } + + // Should reject with script loading error + await expect(turnstileSolver.solve(challengeData)).rejects.toThrow('Failed to load Turnstile script') + }) + + it('handles multiple concurrent solve requests', async () => { + const turnstileSolver = createTurnstileSolver() + + // Create multiple challenge data objects + const challenges = Array.from({ length: 3 }, (_, i) => ({ + challengeId: `concurrent-test-${i}`, + botDetectionType: BotDetectionType.BOT_DETECTION_TURNSTILE, + extra: { + challengeData: JSON.stringify({ + siteKey: `test-site-key-${i}`, + action: 'test-action', + }), + }, + })) + + // Configure mock to return different tokens for each widget + let widgetCounter = 0 + mockTurnstileAPI.render.mockImplementation((container: string | HTMLElement, options: any) => { + const widgetId = `widget-${widgetCounter++}` + if (options.callback) { + setTimeout(() => { + options.callback(`solution-for-${widgetId}`) + }, 10) + } + return widgetId + }) + + // Execute all solvers concurrently + const solutionPromises = challenges.map((challenge) => turnstileSolver.solve(challenge)) + + // Wait for all solutions + const solutions = await Promise.all(solutionPromises) + + // Verify all solutions are unique + expect(solutions).toHaveLength(3) + expect(new Set(solutions).size).toBe(3) + solutions.forEach((solution) => { + expect(solution).toMatch(/^solution-for-widget-\d+$/) + }) + }) +}) diff --git a/packages/sessions/src/challenge-solvers/types.ts b/packages/sessions/src/challenge-solvers/types.ts new file mode 100644 index 00000000000..1c70ec12ff6 --- /dev/null +++ b/packages/sessions/src/challenge-solvers/types.ts @@ -0,0 +1,17 @@ +import type { BotDetectionType } from '@universe/sessions/src/session-service/types' + +interface ChallengeData { + challengeId: string + botDetectionType: BotDetectionType + extra?: Record +} + +interface ChallengeSolver { + solve(challengeData: ChallengeData): Promise +} + +interface ChallengeSolverService { + getSolver(type: BotDetectionType): ChallengeSolver | null +} + +export type { ChallengeData, ChallengeSolver, ChallengeSolverService } diff --git a/packages/sessions/src/challengeFlow.integration.test.ts b/packages/sessions/src/challengeFlow.integration.test.ts new file mode 100644 index 00000000000..ae6dd9da370 --- /dev/null +++ b/packages/sessions/src/challengeFlow.integration.test.ts @@ -0,0 +1,380 @@ +import { + BotDetectionType, + ChallengeResponse, + DeleteSessionResponse, + InitSessionResponse, + VerifyResponse, +} from '@uniswap/client-platform-service/dist/uniswap/platformservice/v1/sessionService_pb' +import { createChallengeSolverService } from '@universe/sessions/src/challenge-solvers/createChallengeSolverService' +import type { ChallengeSolver } from '@universe/sessions/src/challenge-solvers/types' +import { + createSessionInitializationService, + type SessionInitializationService, +} from '@universe/sessions/src/session-initialization/createSessionInitializationService' +import { createSessionRepository } from '@universe/sessions/src/session-repository/createSessionRepository' +import { createSessionService } from '@universe/sessions/src/session-service/createSessionService' +import type { SessionService } from '@universe/sessions/src/session-service/types' +import { + createMockSessionClient, + createTestTransport, + InMemoryDeviceIdService, + InMemorySessionStorage, + type MockEndpoints, +} from '@universe/sessions/src/test-utils' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +// Mock Turnstile solver for integration tests +const mockTurnstileSolve = vi.fn() + +describe('Challenge Flow Integration Tests', () => { + let sessionStorage: InMemorySessionStorage + let deviceIdService: InMemoryDeviceIdService + let sessionService: SessionService + let sessionInitializationService: SessionInitializationService + let mockEndpoints: MockEndpoints + + beforeEach(() => { + // Initialize in-memory storage + sessionStorage = new InMemorySessionStorage() + deviceIdService = new InMemoryDeviceIdService() + + // Set up mock endpoints with default responses + mockEndpoints = { + '/uniswap.platformservice.v1.SessionService/InitSession': async (): Promise => { + return new InitSessionResponse({ + sessionId: 'test-session-123', + needChallenge: true, + extra: {}, + }) + }, + '/uniswap.platformservice.v1.SessionService/Challenge': async (): Promise => { + return new ChallengeResponse({ + challengeId: '02c241f3-8d45-4a88-842a-d364c30a6c44', + botDetectionType: BotDetectionType.BOT_DETECTION_TURNSTILE, + extra: { + challengeData: '{"siteKey":"0x4AAAAAABiAHneWOWZHzZtO","action":"session_verification"}', + }, + }) + }, + '/uniswap.platformservice.v1.SessionService/Verify': async (): Promise => { + return new VerifyResponse({ + retry: false, + }) + }, + '/uniswap.platformservice.v1.SessionService/DeleteSession': async (): Promise => { + return new DeleteSessionResponse({}) + }, + } as unknown as MockEndpoints + + // Create test transport + createTestTransport(mockEndpoints) + + // Create session client + const sessionClient = createMockSessionClient(mockEndpoints, sessionStorage, deviceIdService) + + // Create repository + const sessionRepository = createSessionRepository({ + client: sessionClient as any, + }) + + // Create session service + sessionService = createSessionService({ + sessionStorage, + deviceIdService, + sessionRepository, + }) + + // Create challenge solver service with mock Turnstile solver + const challengeSolverService = createChallengeSolverService() + + // Mock the Turnstile solver + mockTurnstileSolve.mockResolvedValue('test-turnstile-solution-token') + challengeSolverService.getSolver = (type: BotDetectionType): ChallengeSolver | null => { + if (type === BotDetectionType.BOT_DETECTION_TURNSTILE) { + return { + solve: mockTurnstileSolve, + } + } + return null + } + + // Create session initialization service + sessionInitializationService = createSessionInitializationService({ + sessionService, + challengeSolverService, + }) + }) + + afterEach(async () => { + // Clean up any stored data + await sessionStorage.clear() + await deviceIdService.removeDeviceId() + + // Reset mocks + vi.clearAllMocks() + mockTurnstileSolve.mockResolvedValue('test-turnstile-solution-token') + }) + + it('initializes a session with needChallenge: true and completes challenge flow', async () => { + // Update mock to return needChallenge: true + mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] = + async (): Promise => { + return new InitSessionResponse({ + sessionId: '776973bd-bbc2-452b-9c35-1b72c475afbd', + needChallenge: true, + extra: {}, + }) + } + + // Track calls to verify flow + const initCalls: Array<{ request: any; headers: Record }> = [] + const challengeCalls: Array<{ request: any; headers: Record }> = [] + const verifyCalls: Array<{ request: any; headers: Record }> = [] + + // Wrap handlers to track calls + const originalInit = mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] + mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] = async ( + request, + headers, + ): Promise => { + initCalls.push({ request, headers }) + return originalInit(request, headers) + } + + const originalChallenge = mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge'] + mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge'] = async ( + request, + headers, + ): Promise => { + challengeCalls.push({ request, headers }) + return originalChallenge(request, headers) + } + + const originalVerify = mockEndpoints['/uniswap.platformservice.v1.SessionService/Verify'] + mockEndpoints['/uniswap.platformservice.v1.SessionService/Verify'] = async ( + request, + headers, + ): Promise => { + verifyCalls.push({ request, headers }) + return originalVerify(request, headers) + } + + // Execute the full initialization flow + await sessionInitializationService.initialize() + + // Verify all API calls were made in the correct order + expect(initCalls).toHaveLength(1) + expect(challengeCalls).toHaveLength(1) + expect(verifyCalls).toHaveLength(1) + + // Verify session was stored + const storedSession = await sessionStorage.get() + expect(storedSession?.sessionId).toBe('776973bd-bbc2-452b-9c35-1b72c475afbd') + + // Verify challenge request had session headers + expect(challengeCalls[0].headers['X-Session-ID']).toBe('776973bd-bbc2-452b-9c35-1b72c475afbd') + + // Verify upgrade request had correct challenge ID and solution + expect(verifyCalls[0].request).toMatchObject({ + challengeId: '02c241f3-8d45-4a88-842a-d364c30a6c44', + solution: 'test-turnstile-solution-token', + }) + expect(verifyCalls[0].headers['X-Session-ID']).toBe('776973bd-bbc2-452b-9c35-1b72c475afbd') + }) + + it('handles challenge flow with proper request/response data', async () => { + // Set device ID + await deviceIdService.setDeviceId('66629fec-ff9d-430b-8a31-d256b4128527') + + // Initialize session first + await sessionService.initSession() + + // Request challenge + const challengeResponse = await sessionService.requestChallenge() + + expect(challengeResponse).toEqual({ + challengeId: '02c241f3-8d45-4a88-842a-d364c30a6c44', + botDetectionType: BotDetectionType.BOT_DETECTION_TURNSTILE, + extra: { + challengeData: '{"siteKey":"0x4AAAAAABiAHneWOWZHzZtO","action":"session_verification"}', + }, + }) + + // Verify mock solver is configured + expect(mockTurnstileSolve).toHaveBeenCalledTimes(0) + + // Simulate solving the challenge and upgrading session + const solution = 'test-turnstile-solution-token' + const upgradeResponse = await sessionService.upgradeSession({ + solution, + challengeId: challengeResponse.challengeId, + }) + expect(upgradeResponse.retry).toBe(false) + }) + + it('reuses existing session without re-initialization', async () => { + // When the check is re-enabled, this test should pass + + // Pre-populate storage with existing session + await sessionStorage.set({ sessionId: 'existing-session-123' }) + await deviceIdService.setDeviceId('existing-device-123') + + // Track calls + const initCalls: any[] = [] + const originalInit = mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] + mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] = async ( + request, + headers, + ): Promise => { + initCalls.push({ request, headers }) + return originalInit(request, headers) + } + + // Initialize should skip API call + await sessionInitializationService.initialize() + + // Verify no initialization call was made + expect(initCalls).toHaveLength(0) + + // Verify existing session is still in storage + const storedSession = await sessionStorage.get() + expect(storedSession?.sessionId).toBe('existing-session-123') + }) + + it('handles challenge retry when upgrade fails', async () => { + // Set up to require challenge + mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] = + async (): Promise => { + return new InitSessionResponse({ + sessionId: 'retry-session-123', + needChallenge: true, + extra: {}, + }) + } + + // Make first verify attempt fail with retry + let verifyAttempts = 0 + mockEndpoints['/uniswap.platformservice.v1.SessionService/Verify'] = async (): Promise => { + verifyAttempts++ + if (verifyAttempts === 1) { + return new VerifyResponse({ retry: true }) + } + return new VerifyResponse({ retry: false }) + } + + // Track challenge calls + const challengeCalls: any[] = [] + const originalChallenge = mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge'] + mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge'] = async ( + request, + headers, + ): Promise => { + challengeCalls.push({ request, headers }) + return originalChallenge(request, headers) + } + + // Execute flow + await sessionInitializationService.initialize() + + // Should have made 2 challenge requests (initial + retry) + expect(challengeCalls).toHaveLength(2) + expect(verifyAttempts).toBe(2) + + // Session should be stored after successful retry + const storedSession = await sessionStorage.get() + expect(storedSession?.sessionId).toBe('retry-session-123') + }) + + it('respects maximum retry limit for challenges', async () => { + // Set up to require challenge + mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] = + async (): Promise => { + return new InitSessionResponse({ + sessionId: 'max-retry-session', + needChallenge: true, + extra: {}, + }) + } + + // Always return retry: true + mockEndpoints['/uniswap.platformservice.v1.SessionService/Verify'] = async (): Promise => { + return new VerifyResponse({ retry: true }) + } + + // Track attempts + const challengeCalls: any[] = [] + const verifyCalls: any[] = [] + + const originalChallenge = mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge'] + mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge'] = async ( + request, + headers, + ): Promise => { + challengeCalls.push({ request, headers }) + return originalChallenge(request, headers) + } + + const originalVerify = mockEndpoints['/uniswap.platformservice.v1.SessionService/Verify'] + mockEndpoints['/uniswap.platformservice.v1.SessionService/Verify'] = async ( + request, + headers, + ): Promise => { + verifyCalls.push({ request, headers }) + return originalVerify(request, headers) + } + + // Should throw after max retries + await expect(sessionInitializationService.initialize()).rejects.toThrow() + + // Should have attempted 4 times (1 initial + 3 retries) + expect(challengeCalls).toHaveLength(4) + expect(verifyCalls).toHaveLength(4) + }) + + it('handles device ID in headers for challenge requests', async () => { + // Set device ID + await deviceIdService.setDeviceId('test-device-456') + await sessionService.initSession() + + // Track challenge request to verify headers + let capturedHeaders: Record = {} + const originalChallenge = mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge'] + mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge'] = async ( + request, + headers, + ): Promise => { + capturedHeaders = headers + return originalChallenge(request, headers) + } + + // Request challenge + await sessionService.requestChallenge() + + // Verify device ID was included in headers + expect(capturedHeaders['X-Device-ID']).toBe('test-device-456') + expect(capturedHeaders['X-Session-ID']).toBe('test-session-123') + }) + + it('handles missing device ID gracefully', async () => { + // Don't set device ID + await sessionService.initSession() + + // Track challenge request to verify headers + let capturedHeaders: Record = {} + const originalChallenge = mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge'] + mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge'] = async ( + request, + headers, + ): Promise => { + capturedHeaders = headers + return originalChallenge(request, headers) + } + + // Request challenge + await sessionService.requestChallenge() + + // Verify only session ID was included in headers + expect(capturedHeaders['X-Device-ID']).toBeUndefined() + expect(capturedHeaders['X-Session-ID']).toBe('test-session-123') + }) +}) diff --git a/packages/sessions/src/device-id/createDeviceIdService.ts b/packages/sessions/src/device-id/createDeviceIdService.ts index b68d4807142..83e58915dfd 100644 --- a/packages/sessions/src/device-id/createDeviceIdService.ts +++ b/packages/sessions/src/device-id/createDeviceIdService.ts @@ -1,15 +1,18 @@ -import type { QueryClient } from '@tanstack/react-query' import type { DeviceIdService } from '@universe/sessions/src/device-id/types' -import { uniqueIdQuery } from 'utilities/src/device/uniqueIdQuery' -function createDeviceIdService(ctx: { queryClient: QueryClient }): DeviceIdService { - async function getDeviceId(): Promise { - const data = await ctx.queryClient.ensureQueryData(uniqueIdQuery()) - return data - } +function createDeviceIdService(ctx: { + getDeviceId: () => Promise + setDeviceId: (deviceId: string) => Promise + removeDeviceId: () => Promise +}): DeviceIdService { + const getDeviceId = ctx.getDeviceId + const setDeviceId = ctx.setDeviceId + const removeDeviceId = ctx.removeDeviceId return { getDeviceId, + setDeviceId, + removeDeviceId, } } diff --git a/packages/sessions/src/device-id/types.ts b/packages/sessions/src/device-id/types.ts index d4d52483f06..9b1b90f14c8 100644 --- a/packages/sessions/src/device-id/types.ts +++ b/packages/sessions/src/device-id/types.ts @@ -3,13 +3,9 @@ * Platform-specific implementations handle device identification */ interface DeviceIdService { - /** - * Get or generate device ID - * - iOS/Android: System-provided ID - * - Extension: Generated UUID - * - Web: Not used (EGW handles) - */ - getDeviceId(): Promise + getDeviceId(): Promise + setDeviceId(deviceId: string): Promise + removeDeviceId(): Promise } export type { DeviceIdService } diff --git a/packages/sessions/src/index.ts b/packages/sessions/src/index.ts index c93bd2d7103..aa2a770703f 100644 --- a/packages/sessions/src/index.ts +++ b/packages/sessions/src/index.ts @@ -18,13 +18,44 @@ export type { SessionRepository } from '@universe/sessions/src/session-repositor // Session Service export { createNoopSessionService } from '@universe/sessions/src/session-service/createNoopSessionService' export { createSessionService } from '@universe/sessions/src/session-service/createSessionService' -export type { SessionService } from '@universe/sessions/src/session-service/types' +export type { + SessionService, + InitSessionResponse, + ChallengeResponse, + UpgradeSessionRequest, + UpgradeSessionResponse, +} from '@universe/sessions/src/session-service/types' // Session Storage export { createSessionStorage } from '@universe/sessions/src/session-storage/createSessionStorage' -export type { SessionStorage } from '@universe/sessions/src/session-storage/types' +export type { SessionStorage, SessionState } from '@universe/sessions/src/session-storage/types' // Session Client export { createSessionClient } from '@universe/sessions/src/session-repository/createSessionClient' export type { SessionServiceClient } from '@universe/sessions/src/session-repository/createSessionClient' -export { createTransport } from '@universe/sessions/src/session-repository/transport' + +// Session Initialization +export { createSessionInitializationService } from '@universe/sessions/src/session-initialization/createSessionInitializationService' +export { + SessionError, + MaxChallengeRetriesError, + NoSolverAvailableError, +} from '@universe/sessions/src/session-initialization/sessionErrors' +export type { + SessionInitializationService, + SessionInitResult, +} from '@universe/sessions/src/session-initialization/createSessionInitializationService' + +// Challenge Solvers +export { createChallengeSolverService } from '@universe/sessions/src/challenge-solvers/createChallengeSolverService' +export { createTurnstileMockSolver } from '@universe/sessions/src/challenge-solvers/createTurnstileMockSolver' +export { createHashcashMockSolver } from '@universe/sessions/src/challenge-solvers/createHashcashMockSolver' +export { createNoneMockSolver } from '@universe/sessions/src/challenge-solvers/createNoneMockSolver' +export { createTurnstileSolver } from '@universe/sessions/src/challenge-solvers/createTurnstileSolver' +export type { + ChallengeSolver, + ChallengeSolverService, + ChallengeData, +} from '@universe/sessions/src/challenge-solvers/types' + +export { BotDetectionType } from '@uniswap/client-platform-service/dist/uniswap/platformservice/v1/sessionService_pb' diff --git a/packages/sessions/src/session-initialization/createSessionInitializationService.test.ts b/packages/sessions/src/session-initialization/createSessionInitializationService.test.ts new file mode 100644 index 00000000000..4b3e57e5854 --- /dev/null +++ b/packages/sessions/src/session-initialization/createSessionInitializationService.test.ts @@ -0,0 +1,296 @@ +import { createSessionInitializationService } from '@universe/sessions/src/session-initialization/createSessionInitializationService' +import { BotDetectionType } from '@universe/sessions/src/session-service/types' +import { + createMockChallengeSolverService, + createMockSessionService, + TestScenarios, +} from '@universe/sessions/src/test-utils/mocks' +import { beforeEach, describe, expect, it, vi } from 'vitest' + +describe('createSessionInitializationService', () => { + let sessionService: ReturnType + let challengeSolverService: ReturnType + + beforeEach(() => { + sessionService = createMockSessionService() + challengeSolverService = createMockChallengeSolverService() + }) + + describe('initialize()', () => { + describe('when session already exists', () => { + it('returns existing session without creating new one', async () => { + // Setup + TestScenarios.withExistingSession(sessionService, 'existing-123') + + const service = createSessionInitializationService({ + sessionService, + challengeSolverService, + }) + + // Execute + const result = await service.initialize() + + // Verify behavior + expect(result).toEqual({ + sessionId: 'existing-123', + isNewSession: false, + }) + + // Verify no unnecessary calls were made + expect(sessionService.initSession).not.toHaveBeenCalled() + expect(sessionService.requestChallenge).not.toHaveBeenCalled() + expect(sessionService.upgradeSession).not.toHaveBeenCalled() + }) + }) + + describe('when creating new session', () => { + it('initializes session without challenge when not required', async () => { + // Setup + TestScenarios.withNoChallenge(sessionService) + + const service = createSessionInitializationService({ + sessionService, + challengeSolverService, + }) + + // Execute + const result = await service.initialize() + + // Verify behavior + expect(result).toEqual({ + sessionId: 'new-session-111', + isNewSession: true, + }) + + // Verify correct flow + expect(sessionService.initSession).toHaveBeenCalled() + expect(sessionService.requestChallenge).not.toHaveBeenCalled() + }) + + it('completes full challenge flow when required', async () => { + // Setup + TestScenarios.withChallengeRequired(sessionService, BotDetectionType.BOT_DETECTION_TURNSTILE) + + const service = createSessionInitializationService({ + sessionService, + challengeSolverService, + }) + + // Execute + const result = await service.initialize() + + // Verify behavior + expect(result).toEqual({ + sessionId: 'new-session-222', + isNewSession: true, + }) + + // Verify complete flow executed + expect(sessionService.initSession).toHaveBeenCalled() + expect(sessionService.requestChallenge).toHaveBeenCalled() + expect(sessionService.upgradeSession).toHaveBeenCalled() + + // Verify solver was used + expect(challengeSolverService.getSolver).toHaveBeenCalledWith(BotDetectionType.BOT_DETECTION_TURNSTILE) + }) + + it('uses correct solver for challenge type', async () => { + // Setup with Hashcash challenge + TestScenarios.withChallengeRequired(sessionService, BotDetectionType.BOT_DETECTION_HASHCASH) + + const service = createSessionInitializationService({ + sessionService, + challengeSolverService, + }) + + // Execute + await service.initialize() + + // Verify correct solver was requested + expect(challengeSolverService.getSolver).toHaveBeenCalledWith(BotDetectionType.BOT_DETECTION_HASHCASH) + }) + + it('passes solution to upgrade session', async () => { + // Setup + TestScenarios.withChallengeRequired(sessionService) + const expectedSolution = 'test-solution-xyz' + const mockSolver = { + solve: vi.fn().mockResolvedValue(expectedSolution), + } + challengeSolverService.getSolver = vi.fn().mockReturnValue(mockSolver) + + const service = createSessionInitializationService({ + sessionService, + challengeSolverService, + }) + + // Execute + await service.initialize() + + // Verify solution was passed correctly + expect(sessionService.upgradeSession).toHaveBeenCalledWith({ + solution: expectedSolution, + challengeId: 'challenge-333', + }) + }) + }) + + describe('when server requests retry', () => { + it('retries challenge when server requests', async () => { + // Setup + TestScenarios.withChallengeRequired(sessionService) + TestScenarios.withServerRetry(sessionService, 1) // Retry once then succeed + + const service = createSessionInitializationService({ + sessionService, + challengeSolverService, + }) + + // Execute + const result = await service.initialize() + + // Verify success + expect(result.isNewSession).toBe(true) + + // Verify retry happened (challenge requested twice) + expect(sessionService.requestChallenge).toHaveBeenCalledTimes(2) + expect(sessionService.upgradeSession).toHaveBeenCalledTimes(2) + }) + + it('fails after maximum retry attempts', async () => { + // Setup - server always requests retry + TestScenarios.withChallengeRequired(sessionService) + vi.mocked(sessionService.upgradeSession).mockResolvedValue({ retry: true }) + + const service = createSessionInitializationService({ + sessionService, + challengeSolverService, + maxChallengeRetries: 2, + }) + + // Execute and verify failure + await expect(service.initialize()).rejects.toThrow( + 'Maximum challenge retry attempts (2) exceeded after 3 attempts', + ) + + // Verify correct number of attempts + expect(sessionService.requestChallenge).toHaveBeenCalledTimes(3) // Initial + 2 retries + }) + + it('succeeds within retry limit', async () => { + // Setup - succeed on 3rd attempt + TestScenarios.withChallengeRequired(sessionService) + TestScenarios.withServerRetry(sessionService, 2) + + const service = createSessionInitializationService({ + sessionService, + challengeSolverService, + maxChallengeRetries: 3, + }) + + // Execute + const result = await service.initialize() + + // Verify success + expect(result.isNewSession).toBe(true) + expect(sessionService.upgradeSession).toHaveBeenCalledTimes(3) + }) + }) + + describe('error handling', () => { + it('throws when no solver available for challenge type', async () => { + // Setup + TestScenarios.withChallengeRequired(sessionService) + challengeSolverService.getSolver = vi.fn().mockReturnValue(null) + + const service = createSessionInitializationService({ + sessionService, + challengeSolverService, + }) + + // Execute and verify + await expect(service.initialize()).rejects.toThrow('No solver available for bot detection type: 1') + }) + + it('propagates sessionService errors', async () => { + // Setup + const error = new Error('Network error') + sessionService.getSessionState = vi.fn().mockRejectedValue(error) + + const service = createSessionInitializationService({ + sessionService, + challengeSolverService, + }) + + // Execute and verify + await expect(service.initialize()).rejects.toThrow('Network error') + }) + + it('propagates solver errors', async () => { + // Setup + TestScenarios.withChallengeRequired(sessionService) + const error = new Error('Solver failed') + const failingSolver = { + solve: vi.fn().mockRejectedValue(error), + } + challengeSolverService.getSolver = vi.fn().mockReturnValue(failingSolver) + + const service = createSessionInitializationService({ + sessionService, + challengeSolverService, + }) + + // Execute and verify + await expect(service.initialize()).rejects.toThrow('Solver failed') + }) + }) + + describe('edge cases', () => { + it('handles empty session ID from initSession', async () => { + // Setup + sessionService.getSessionState = vi.fn().mockResolvedValue(null) + sessionService.initSession = vi.fn().mockResolvedValue({ + sessionId: undefined, + needChallenge: false, + extra: {}, + }) + + const service = createSessionInitializationService({ + sessionService, + challengeSolverService, + }) + + // Execute + const result = await service.initialize() + + // Verify behavior - should return empty string, not undefined + expect(result.sessionId).toBe('') + expect(result.isNewSession).toBe(true) + }) + + it('handles None bot detection type', async () => { + // Setup + TestScenarios.withChallengeRequired(sessionService, BotDetectionType.BOT_DETECTION_NONE) + const noneSolver = { + solve: vi.fn().mockResolvedValue(''), + } + challengeSolverService.getSolver = vi + .fn() + // eslint-disable-next-line max-nested-callbacks + .mockImplementation((type) => (type === BotDetectionType.BOT_DETECTION_NONE ? noneSolver : null)) + + const service = createSessionInitializationService({ + sessionService, + challengeSolverService, + }) + + // Execute + await service.initialize() + + // Verify None type was handled + expect(challengeSolverService.getSolver).toHaveBeenCalledWith(BotDetectionType.BOT_DETECTION_NONE) + expect(noneSolver.solve).toHaveBeenCalled() + }) + }) + }) +}) diff --git a/packages/sessions/src/session-initialization/createSessionInitializationService.ts b/packages/sessions/src/session-initialization/createSessionInitializationService.ts new file mode 100644 index 00000000000..0d4175bc960 --- /dev/null +++ b/packages/sessions/src/session-initialization/createSessionInitializationService.ts @@ -0,0 +1,97 @@ +import type { ChallengeSolverService } from '@universe/sessions/src/challenge-solvers/types' +import { + MaxChallengeRetriesError, + NoSolverAvailableError, +} from '@universe/sessions/src/session-initialization/sessionErrors' +import type { SessionService } from '@universe/sessions/src/session-service/types' + +interface SessionInitResult { + sessionId: string + isNewSession: boolean +} + +interface SessionInitializationService { + /** + * Orchestrates the complete session initialization flow: + * 1. Checks for existing session + * 2. Creates new session if needed + * 3. Handles challenge solving if required + * + * @throws Error if initialization fails + */ + initialize(): Promise +} + +function createSessionInitializationService(ctx: { + sessionService: SessionService + challengeSolverService: ChallengeSolverService + maxChallengeRetries?: number +}): SessionInitializationService { + async function handleChallengeFlow(attemptCount = 0): Promise { + const maxRetries = ctx.maxChallengeRetries ?? 3 + + const challenge = await ctx.sessionService.requestChallenge() + + // get our solver for the challenge type + const solver = ctx.challengeSolverService.getSolver(challenge.botDetectionType) + if (!solver) { + throw new NoSolverAvailableError(challenge.botDetectionType) + } + + // Solve the challenge + const solution = await solver.solve({ + challengeId: challenge.challengeId, + botDetectionType: challenge.botDetectionType, + extra: challenge.extra, + }) + + // Upgrade session with the solution + const result = await ctx.sessionService.upgradeSession({ + solution, + challengeId: challenge.challengeId, + }) + + if (!result.retry) { + // Upgrade was successful, stop here + return + } + + // Handle server retry request + if (attemptCount >= maxRetries) { + throw new MaxChallengeRetriesError(maxRetries, attemptCount + 1) + } + + await handleChallengeFlow(attemptCount + 1) // Recursive call with incremented count + } + + async function initialize(): Promise { + // Step 1: Check for existing session + const existingSession = await ctx.sessionService.getSessionState() + + if (existingSession?.sessionId) { + return { + sessionId: existingSession.sessionId, + isNewSession: false, + } + } + + // Step 2: Initialize new session + const initResponse = await ctx.sessionService.initSession() + + // Step 3: Handle challenge if required + if (initResponse.needChallenge) { + await handleChallengeFlow() + } + + // Return the result + return { + sessionId: initResponse.sessionId || '', + isNewSession: true, + } + } + + return { initialize } +} + +export { createSessionInitializationService } +export type { SessionInitializationService, SessionInitResult } diff --git a/packages/sessions/src/session-initialization/sessionErrors.ts b/packages/sessions/src/session-initialization/sessionErrors.ts new file mode 100644 index 00000000000..c865c85a5d6 --- /dev/null +++ b/packages/sessions/src/session-initialization/sessionErrors.ts @@ -0,0 +1,32 @@ +/** + * Base class for session-related errors that should not trigger retries at higher levels. + */ +export abstract class SessionError extends Error { + constructor(message: string, name: string) { + super(message) + this.name = name + } +} + +/** + * Error thrown when maximum challenge retry attempts are exceeded. + * This error should not trigger additional retries at higher levels. + */ +export class MaxChallengeRetriesError extends SessionError { + constructor(maxRetries: number, actualAttempts: number) { + super( + `Maximum challenge retry attempts (${maxRetries}) exceeded after ${actualAttempts} attempts`, + 'MaxChallengeRetriesError', + ) + } +} + +/** + * Error thrown when no solver is available for a challenge type. + * This error should not trigger additional retries at higher levels. + */ +export class NoSolverAvailableError extends SessionError { + constructor(botDetectionType: number) { + super(`No solver available for bot detection type: ${botDetectionType}`, 'NoSolverAvailableError') + } +} diff --git a/packages/sessions/src/session-repository/createSessionClient.ts b/packages/sessions/src/session-repository/createSessionClient.ts index a3242bbb59e..4029d201cc1 100644 --- a/packages/sessions/src/session-repository/createSessionClient.ts +++ b/packages/sessions/src/session-repository/createSessionClient.ts @@ -1,5 +1,5 @@ import { createPromiseClient, type PromiseClient, type Transport } from '@connectrpc/connect' -import { SessionService } from '@uniswap/client-platform-service/dist/uniswap/sessionservice/v1/sessionService_connect' +import { SessionService } from '@uniswap/client-platform-service/dist/uniswap/platformservice/v1/sessionService_connect' type SessionServiceClient = PromiseClient diff --git a/packages/sessions/src/session-repository/createSessionRepository.test.ts b/packages/sessions/src/session-repository/createSessionRepository.test.ts index 8367b9e922b..2d6e2c23f0d 100644 --- a/packages/sessions/src/session-repository/createSessionRepository.test.ts +++ b/packages/sessions/src/session-repository/createSessionRepository.test.ts @@ -1,9 +1,9 @@ import type { PromiseClient } from '@connectrpc/connect' -import type { SessionService } from '@uniswap/client-platform-service/dist/uniswap/sessionservice/v1/sessionService_connect' +import type { SessionService } from '@uniswap/client-platform-service/dist/uniswap/platformservice/v1/sessionService_connect' import { ChallengeResponse, InitSessionResponse, -} from '@uniswap/client-platform-service/dist/uniswap/sessionservice/v1/sessionService_pb' +} from '@uniswap/client-platform-service/dist/uniswap/platformservice/v1/sessionService_pb' import { createSessionRepository } from '@universe/sessions/src/session-repository/createSessionRepository' import { describe, expect, it, type MockedFunction, vi } from 'vitest' @@ -19,16 +19,16 @@ describe('createSessionRepository', () => { extra: {}, }), challenge: vi.fn().mockResolvedValue({ - // Proto returns challenge as JSON string - challenge: JSON.stringify({ - challengeId: 'challenge-123', - botDetectionType: 1, - extra: { sitekey: 'test-key' }, - }), + challengeId: 'challenge-123', + botDetectionType: 1, + extra: { sitekey: 'test-key' }, + }), + verify: vi.fn().mockResolvedValue({ + retry: false, }), - upgradeSession: vi.fn().mockResolvedValue({}), + updateSession: vi.fn().mockResolvedValue({}), deleteSession: vi.fn().mockResolvedValue({}), - introspect: vi.fn().mockResolvedValue({}), // Required by proto but not used + introspectSession: vi.fn().mockResolvedValue({}), // Required by proto but not used }) describe('session initialization behaviors', () => { @@ -90,7 +90,7 @@ describe('createSessionRepository', () => { it('handles empty challenge response gracefully', async () => { const mockClient = createMockClient() - mockClient.challenge.mockResolvedValue(new ChallengeResponse({ challenge: undefined })) + mockClient.challenge.mockResolvedValue(new ChallengeResponse({ challengeId: undefined })) const repository = createSessionRepository({ client: mockClient }) const result = await repository.challenge({}) @@ -123,7 +123,13 @@ describe('createSessionRepository', () => { challengeId: 'challenge-123', }) - // Always returns retry: false for now (proto doesn't support retry yet) + // Verify the client was called correctly + expect(mockClient.verify).toHaveBeenCalledWith({ + solution: 'solution-token', + challengeId: 'challenge-123', + }) + + // Should return retry status expect(result).toEqual({ retry: false }) }) @@ -143,7 +149,7 @@ describe('createSessionRepository', () => { it('provides meaningful error when upgrade fails', async () => { const mockClient = createMockClient() - mockClient.upgradeSession.mockRejectedValue(new Error('Invalid solution')) + mockClient.verify.mockRejectedValue(new Error('Invalid solution')) const repository = createSessionRepository({ client: mockClient }) diff --git a/packages/sessions/src/session-repository/createSessionRepository.ts b/packages/sessions/src/session-repository/createSessionRepository.ts index e4aa1dc4564..26a568c63ea 100644 --- a/packages/sessions/src/session-repository/createSessionRepository.ts +++ b/packages/sessions/src/session-repository/createSessionRepository.ts @@ -28,23 +28,10 @@ export function createSessionRepository(ctx: CreateSessionRepositoryDeps): Sessi try { const response = await client.challenge({}) - // Map the protobuf response to our interface - // The proto has 'challenge' field, we need to extract challenge details from it - // biome-ignore lint/suspicious/noExplicitAny: TODO use schema to parse the response - let challengeData = {} as any - if (response.challenge) { - try { - challengeData = JSON.parse(response.challenge) - } catch (parseError) { - const errorMessage = parseError instanceof Error ? parseError.message : String(parseError) - throw new Error(`Failed to parse challenge JSON: ${errorMessage}`, { cause: parseError }) - } - } - return { - challengeId: challengeData.challengeId || '', - botDetectionType: challengeData.botDetectionType || 0, - extra: challengeData.extra || {}, + challengeId: response.challengeId || '', + botDetectionType: response.botDetectionType || 0, + extra: response.extra, } } catch (error) { throw new Error(`Failed to get challenge: ${error}`) @@ -53,14 +40,14 @@ export function createSessionRepository(ctx: CreateSessionRepositoryDeps): Sessi const upgradeSession: SessionRepository['upgradeSession'] = async (request) => { try { - await client.upgradeSession({ + const verifyResponse = await client.verify({ solution: request.solution, - // Note: The proto only has 'solution' field, no challengeId or walletAddress + challengeId: request.challengeId, }) // The response structure needs to be mapped from actual proto response return { - retry: false, // Default since proto doesn't have this field + retry: verifyResponse.retry, } } catch (error) { throw new Error(`Failed to upgrade session: ${error}`) diff --git a/packages/sessions/src/session-repository/transport.ts b/packages/sessions/src/session-repository/transport.ts deleted file mode 100644 index 0bb30ee8422..00000000000 --- a/packages/sessions/src/session-repository/transport.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { type ConnectTransportOptions, createConnectTransport } from '@connectrpc/connect-web' -import { isWebApp } from 'utilities/src/platform' - -interface SessionTransportOptions { - getSessionId?: () => Promise - getDeviceId?: () => Promise - getBaseUrl: () => string -} - -export function createTransport(ctx: SessionTransportOptions): ReturnType { - const { getSessionId, getDeviceId, getBaseUrl } = ctx - - const transportOptions: ConnectTransportOptions = { - baseUrl: getBaseUrl(), - interceptors: [ - (next) => async (request) => { - // Add session ID header for mobile/extension - // Web uses cookies automatically - if (!isWebApp) { - const [sessionId, deviceId] = await Promise.all([getSessionId?.(), getDeviceId?.()]) - if (sessionId) { - request.header.set('X-Session-ID', sessionId) - } - if (deviceId) { - request.header.set('X-Device-ID', deviceId) - } - } - return next(request) - }, - ], - // Include credentials for cookie support on web - // Note: this causes CORS errors when running web locally - // TODO(app-infra): Re-enable this when we have a solution - // credentials: isWebApp ? 'include' : 'omit', - } - - return createConnectTransport(transportOptions) -} diff --git a/packages/sessions/src/session-repository/types.ts b/packages/sessions/src/session-repository/types.ts index d646b07305d..23e204a9291 100644 --- a/packages/sessions/src/session-repository/types.ts +++ b/packages/sessions/src/session-repository/types.ts @@ -1,11 +1,4 @@ -/** - * Bot detection types from protobuf enum - */ -enum BotDetectionType { - None = 0, - Turnstile = 1, - Hashcash = 2, -} +import { BotDetectionType } from '@uniswap/client-platform-service/dist/uniswap/platformservice/v1/sessionService_pb' /** * Response from session initialization diff --git a/packages/sessions/src/session-service/createNoopSessionService.ts b/packages/sessions/src/session-service/createNoopSessionService.ts index cacf6eb041f..eea4ca2944a 100644 --- a/packages/sessions/src/session-service/createNoopSessionService.ts +++ b/packages/sessions/src/session-service/createNoopSessionService.ts @@ -1,12 +1,21 @@ +import { BotDetectionType } from '@uniswap/client-platform-service/dist/uniswap/platformservice/v1/sessionService_pb' import type { SessionService } from '@universe/sessions/src/session-service/types' function createNoopSessionService(): SessionService { - const initSession: SessionService['initSession'] = async () => {} + const initSession: SessionService['initSession'] = async () => ({ needChallenge: false }) const removeSession: SessionService['removeSession'] = async () => {} const getSessionState: SessionService['getSessionState'] = async () => null + const requestChallenge: SessionService['requestChallenge'] = async () => ({ + challengeId: 'noop-challenge-123', + botDetectionType: BotDetectionType.BOT_DETECTION_NONE, + extra: {}, + }) + const upgradeSession: SessionService['upgradeSession'] = async () => ({ retry: false }) return { initSession, + requestChallenge, + upgradeSession, removeSession, getSessionState, } diff --git a/packages/sessions/src/session-service/createSessionService.test.ts b/packages/sessions/src/session-service/createSessionService.test.ts index 09ba8e49941..f913424c7d2 100644 --- a/packages/sessions/src/session-service/createSessionService.test.ts +++ b/packages/sessions/src/session-service/createSessionService.test.ts @@ -1,3 +1,4 @@ +import type { DeviceIdService } from '@universe/sessions/src/device-id/types' import type { SessionRepository } from '@universe/sessions/src/session-repository/types' import { createSessionService } from '@universe/sessions/src/session-service/createSessionService' import type { SessionService } from '@universe/sessions/src/session-service/types' @@ -7,6 +8,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' describe('createSessionService', () => { let storage: SessionStorage let repository: SessionRepository + let deviceIdService: DeviceIdService let service: SessionService beforeEach(() => { @@ -22,6 +24,17 @@ describe('createSessionService', () => { }, } + let deviceIdData: string | null = null + deviceIdService = { + getDeviceId: async (): Promise => deviceIdData || '', + setDeviceId: async (deviceId: string): Promise => { + deviceIdData = deviceId + }, + removeDeviceId: async (): Promise => { + deviceIdData = null + }, + } + // In-memory repository implementation repository = { initSession: async (): Promise<{ @@ -41,6 +54,7 @@ describe('createSessionService', () => { service = createSessionService({ sessionStorage: storage, sessionRepository: repository, + deviceIdService, }) }) @@ -74,6 +88,7 @@ describe('createSessionService', () => { service = createSessionService({ sessionStorage: storage, sessionRepository: repository, + deviceIdService, }) await service.initSession() @@ -147,6 +162,7 @@ describe('createSessionService', () => { const service2 = createSessionService({ sessionStorage: storage, sessionRepository: repository, + deviceIdService, }) expect(await service2.getSessionState()).toEqual({ sessionId: 'test-session-123' }) @@ -168,6 +184,7 @@ describe('createSessionService', () => { const service2 = createSessionService({ sessionStorage: storage2, sessionRepository: repository, + deviceIdService, }) await service.initSession() @@ -272,4 +289,21 @@ describe('createSessionService', () => { expect(secondSession).toEqual({ sessionId: 'new-session-789' }) }) }) + describe('device ID handling', () => { + it('sets and gets device ID', async () => { + // Second initialization should replace + repository.initSession = async (): Promise<{ + sessionId?: string + needChallenge: boolean + extra: Record + }> => ({ + sessionId: 'new-session-789', + needChallenge: false, + extra: { device_id: 'test-device-id' }, + }) + + await service.initSession() + expect(await deviceIdService.getDeviceId()).toBe('test-device-id') + }) + }) }) diff --git a/packages/sessions/src/session-service/createSessionService.ts b/packages/sessions/src/session-service/createSessionService.ts index 555553fbd7e..6ad3343ea5d 100644 --- a/packages/sessions/src/session-service/createSessionService.ts +++ b/packages/sessions/src/session-service/createSessionService.ts @@ -1,16 +1,40 @@ +import type { DeviceIdService } from '@universe/sessions/src/device-id/types' import type { SessionRepository } from '@universe/sessions/src/session-repository/types' -import type { SessionService } from '@universe/sessions/src/session-service/types' +import type { + ChallengeResponse, + InitSessionResponse, + SessionService, + UpgradeSessionRequest, + UpgradeSessionResponse, +} from '@universe/sessions/src/session-service/types' import type { SessionStorage } from '@universe/sessions/src/session-storage/types' +/** + * Creates a Session Service instance. + * Orchestrates usage of the Session Repository (remote) and Session Storage (local). + */ export function createSessionService(ctx: { sessionStorage: SessionStorage + deviceIdService: DeviceIdService sessionRepository: SessionRepository }): SessionService { - async function initSession(): Promise { + async function initSession(): Promise { const result = await ctx.sessionRepository.initSession() if (result.sessionId) { await ctx.sessionStorage.set({ sessionId: result.sessionId }) } + if (result.extra.device_id) { + await ctx.deviceIdService.setDeviceId(result.extra.device_id) + } + return result + } + + async function requestChallenge(): Promise { + return ctx.sessionRepository.challenge({}) + } + + async function upgradeSession(input: UpgradeSessionRequest): Promise { + return ctx.sessionRepository.upgradeSession(input) } async function removeSession(): Promise { @@ -23,6 +47,8 @@ export function createSessionService(ctx: { return { initSession, + requestChallenge, + upgradeSession, removeSession, getSessionState, } diff --git a/packages/sessions/src/session-service/types.ts b/packages/sessions/src/session-service/types.ts index ce857d4bc22..28829971455 100644 --- a/packages/sessions/src/session-service/types.ts +++ b/packages/sessions/src/session-service/types.ts @@ -1,9 +1,39 @@ +import { BotDetectionType } from '@uniswap/client-platform-service/dist/uniswap/platformservice/v1/sessionService_pb' +import { SessionState } from '@universe/sessions/src/session-storage/types' + +interface InitSessionResponse { + sessionId?: string + needChallenge: boolean + extra?: Record +} + +interface ChallengeResponse { + challengeId: string + botDetectionType: BotDetectionType + extra?: Record +} + +interface UpgradeSessionRequest { + solution: string + challengeId: string + // walletAddress?: string +} + +interface UpgradeSessionResponse { + retry: boolean +} + +/** + * Interface used by clients to interact with Sessions. + * For business logic and dependencies, see {@link createSessionService} + */ interface SessionService { - initSession(): Promise - removeSession(): Promise - getSessionState(): Promise<{ - sessionId: string - } | null> + initSession: () => Promise + requestChallenge: () => Promise + upgradeSession: (input: UpgradeSessionRequest) => Promise + removeSession: () => Promise + getSessionState: () => Promise } -export type { SessionService } +export type { SessionService, InitSessionResponse, ChallengeResponse, UpgradeSessionRequest, UpgradeSessionResponse } +export { BotDetectionType } diff --git a/packages/sessions/src/session-storage/createSessionStorage.ts b/packages/sessions/src/session-storage/createSessionStorage.ts index f55c77063cd..5503530916a 100644 --- a/packages/sessions/src/session-storage/createSessionStorage.ts +++ b/packages/sessions/src/session-storage/createSessionStorage.ts @@ -1,5 +1,8 @@ import { SessionStorage } from '@universe/sessions/src/session-storage/types' +/** + * Creates a Session Storage instance, given a set of functions to interact with a storage driver. + */ function createSessionStorage(ctx: { getSessionId: () => Promise setSessionId: (sessionId: string) => Promise diff --git a/packages/sessions/src/session-storage/types.ts b/packages/sessions/src/session-storage/types.ts index f07e12baee3..50bcfffc81b 100644 --- a/packages/sessions/src/session-storage/types.ts +++ b/packages/sessions/src/session-storage/types.ts @@ -2,6 +2,10 @@ interface SessionState { sessionId: string } +/** + * Interface to interact with session storage. + * For business logic and dependencies, see {@link createSessionStorage} + */ interface SessionStorage { get(): Promise set(session: SessionState): Promise diff --git a/packages/sessions/src/sessionLifecycle.integration.test.ts b/packages/sessions/src/sessionLifecycle.integration.test.ts new file mode 100644 index 00000000000..bdf2c20979d --- /dev/null +++ b/packages/sessions/src/sessionLifecycle.integration.test.ts @@ -0,0 +1,251 @@ +import { + BotDetectionType, + ChallengeResponse, + DeleteSessionResponse, + InitSessionResponse, + IntrospectSessionResponse, + UpdateSessionResponse, + VerifyResponse, +} from '@uniswap/client-platform-service/dist/uniswap/platformservice/v1/sessionService_pb' +import { createSessionRepository } from '@universe/sessions/src/session-repository/createSessionRepository' +import { createSessionService } from '@universe/sessions/src/session-service/createSessionService' +import type { SessionService } from '@universe/sessions/src/session-service/types' +import { + createMockSessionClient, + InMemoryDeviceIdService, + InMemorySessionStorage, + type MockEndpoints, +} from '@universe/sessions/src/test-utils' +import { afterEach, beforeEach, describe, expect, it } from 'vitest' + +describe('Session Lifecycle Integration Tests', () => { + let sessionStorage: InMemorySessionStorage + let deviceIdService: InMemoryDeviceIdService + let sessionService: SessionService + let mockEndpoints: MockEndpoints + + beforeEach(() => { + // Initialize in-memory storage + sessionStorage = new InMemorySessionStorage() + deviceIdService = new InMemoryDeviceIdService() + + // Set up mock endpoints with default responses + mockEndpoints = { + '/uniswap.platformservice.v1.SessionService/InitSession': async (): Promise => { + return new InitSessionResponse({ + sessionId: 'test-session-123', + needChallenge: false, + extra: {}, + }) + }, + '/uniswap.platformservice.v1.SessionService/Challenge': async (): Promise => { + return new ChallengeResponse({ + challengeId: 'challenge-123', + botDetectionType: BotDetectionType.BOT_DETECTION_TURNSTILE, + extra: { sitekey: 'test-key' }, + }) + }, + '/uniswap.platformservice.v1.SessionService/Verify': async (): Promise => { + return new VerifyResponse({ + retry: false, + }) + }, + '/uniswap.platformservice.v1.SessionService/DeleteSession': async (): Promise => { + return new DeleteSessionResponse({}) + }, + '/uniswap.platformservice.v1.SessionService/IntrospectSession': async (): Promise => { + return new IntrospectSessionResponse({}) + }, + '/uniswap.platformservice.v1.SessionService/UpdateSession': async (): Promise => { + return new UpdateSessionResponse({}) + }, + } + + // Create session client with test transport + const sessionClient = createMockSessionClient(mockEndpoints, sessionStorage, deviceIdService) + + // Create repository + const sessionRepository = createSessionRepository({ + client: sessionClient as any, + }) + + // Create session service + sessionService = createSessionService({ + sessionStorage, + deviceIdService, + sessionRepository, + }) + }) + + afterEach(async () => { + // Clean up any stored data + await sessionStorage.clear() + await deviceIdService.removeDeviceId() + }) + + it('initializes and stores a session', async () => { + const response = await sessionService.initSession() + + expect(response).toEqual({ + sessionId: 'test-session-123', + needChallenge: false, + extra: {}, + }) + + // Verify session was stored + const storedSession = await sessionStorage.get() + expect(storedSession?.sessionId).toBe('test-session-123') + }) + + it('handles session initialization without challenge requirement', async () => { + // Override default to return needChallenge: false + mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] = + async (): Promise => { + return new InitSessionResponse({ + sessionId: 'simple-session-123', + needChallenge: false, + extra: {}, + }) + } + + await deviceIdService.setDeviceId('simple-device-123') + + // Initialize + const response = await sessionService.initSession() + + // Verify response + expect(response.sessionId).toBe('simple-session-123') + expect(response.needChallenge).toBe(false) + + // Session should be stored + const storedSession = await sessionStorage.get() + expect(storedSession?.sessionId).toBe('simple-session-123') + }) + + it('properly clears session on deletion', async () => { + // Initialize a session first + await sessionService.initSession() + + // Verify session exists + let storedSession = await sessionStorage.get() + expect(storedSession?.sessionId).toBe('test-session-123') + + // Delete session + await sessionService.removeSession() + + // Verify session is cleared + storedSession = await sessionStorage.get() + expect(storedSession).toBeNull() + }) + + it('stores session ID when provided (mobile/extension behavior)', async () => { + mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] = + async (): Promise => { + return new InitSessionResponse({ + sessionId: 'mobile-session-123', + needChallenge: false, + extra: {}, + }) + } + + const response = await sessionService.initSession() + + expect(response.sessionId).toBe('mobile-session-123') + + // Session should be stored + const storedSession = await sessionStorage.get() + expect(storedSession?.sessionId).toBe('mobile-session-123') + }) + + it('handles web sessions without storing session ID when undefined', async () => { + mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] = + async (): Promise => { + return new InitSessionResponse({ + sessionId: undefined, + needChallenge: true, + extra: { sitekey: 'turnstile-key' }, + }) + } + + const response = await sessionService.initSession() + + expect(response.sessionId).toBeUndefined() + expect(response.needChallenge).toBe(true) + + // Session should not be stored + const storedSession = await sessionStorage.get() + expect(storedSession).toBeNull() + }) + + it('retrieves existing session state', async () => { + // Initialize a session + await sessionService.initSession() + + // Get session state + const sessionState = await sessionService.getSessionState() + + expect(sessionState).toEqual({ + sessionId: 'test-session-123', + }) + }) + + it('returns null when no session exists', async () => { + // Don't initialize any session + const sessionState = await sessionService.getSessionState() + + expect(sessionState).toBeNull() + }) + + it('handles multiple initialization attempts', async () => { + // First initialization + await sessionService.initSession() + + const firstSession = await sessionStorage.get() + expect(firstSession?.sessionId).toBe('test-session-123') + + // Update mock to return different session + mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] = + async (): Promise => { + return new InitSessionResponse({ + sessionId: 'new-session-789', + needChallenge: false, + extra: {}, + }) + } + + // Second initialization should replace the first + await sessionService.initSession() + + const secondSession = await sessionStorage.get() + expect(secondSession?.sessionId).toBe('new-session-789') + }) + + it('sets and retrieves device ID through init response', async () => { + mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'] = + async (): Promise => { + return new InitSessionResponse({ + sessionId: 'device-test-session', + needChallenge: false, + extra: { device_id: 'new-device-123' }, + }) + } + + await sessionService.initSession() + + // Device ID should be stored + const deviceId = await deviceIdService.getDeviceId() + expect(deviceId).toBe('new-device-123') + }) + + it('preserves existing device ID when not provided in response', async () => { + // Set device ID first + await deviceIdService.setDeviceId('existing-device-456') + + // Init without device_id in response + await sessionService.initSession() + + // Device ID should remain unchanged + const deviceId = await deviceIdService.getDeviceId() + expect(deviceId).toBe('existing-device-456') + }) +}) diff --git a/packages/sessions/src/test-utils.ts b/packages/sessions/src/test-utils.ts new file mode 100644 index 00000000000..42951636e9e --- /dev/null +++ b/packages/sessions/src/test-utils.ts @@ -0,0 +1,176 @@ +/** biome-ignore-all lint/suspicious/noExplicitAny: mock handlers */ +import type { PartialMessage } from '@bufbuild/protobuf' +import type { CallOptions } from '@connectrpc/connect' +import { createConnectTransport } from '@connectrpc/connect-web' +import { + type ChallengeRequest, + type ChallengeResponse, + type DeleteSessionRequest, + type DeleteSessionResponse, + type InitSessionRequest, + type InitSessionResponse, + type IntrospectSessionRequest, + type IntrospectSessionResponse, + type UpdateSessionRequest, + type UpdateSessionResponse, + type VerifyRequest, + type VerifyResponse, +} from '@uniswap/client-platform-service/dist/uniswap/platformservice/v1/sessionService_pb' +import type { DeviceIdService } from '@universe/sessions/src/device-id/types' +import type { SessionServiceClient } from '@universe/sessions/src/session-repository/createSessionClient' +import type { SessionState, SessionStorage } from '@universe/sessions/src/session-storage/types' +// Types for our test transport +export interface MockEndpointHandler { + (request: any, headers: Record): Promise +} + +export interface MockEndpoints { + '/uniswap.platformservice.v1.SessionService/InitSession': MockEndpointHandler + '/uniswap.platformservice.v1.SessionService/Challenge': MockEndpointHandler + '/uniswap.platformservice.v1.SessionService/Verify': MockEndpointHandler + '/uniswap.platformservice.v1.SessionService/DeleteSession': MockEndpointHandler + '/uniswap.platformservice.v1.SessionService/IntrospectSession': MockEndpointHandler + '/uniswap.platformservice.v1.SessionService/UpdateSession': MockEndpointHandler +} + +// Test transport that intercepts requests and returns mock responses +export function createTestTransport(mockEndpoints: MockEndpoints): ReturnType { + return createConnectTransport({ + baseUrl: 'https://test.api.uniswap.org', + interceptors: [ + (_next) => async (request) => { + const url = request.url + const path = new URL(url).pathname + const handler = mockEndpoints[path as keyof MockEndpoints] + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (!handler) { + throw new Error(`No mock handler for ${path}`) + } + + // Extract headers + const headers: Record = {} + request.header.forEach((value, key) => { + headers[key] = value + }) + + const requestData = request.message + + const responseData = await handler(requestData, headers) + + // Return properly typed response + return { + stream: false as const, + service: request.service, + method: request.method, + header: new Headers(), + message: responseData, + trailer: new Headers(), + } + }, + ], + }) +} + +// In-memory storage implementations +export class InMemorySessionStorage implements SessionStorage { + private state: SessionState | null = null + + async get(): Promise { + return this.state + } + + async set(session: SessionState): Promise { + this.state = session + } + + async clear(): Promise { + this.state = null + } +} + +export class InMemoryDeviceIdService implements DeviceIdService { + private deviceId: string | null = null + + async getDeviceId(): Promise { + return this.deviceId + } + + async setDeviceId(id: string): Promise { + this.deviceId = id + } + + async removeDeviceId(): Promise { + this.deviceId = null + } +} + +// Create a mock session client for testing +// eslint-disable-next-line max-params +export function createMockSessionClient( + mockEndpoints: MockEndpoints, + sessionStorage: SessionStorage, + deviceIdService: DeviceIdService, +): SessionServiceClient { + return { + initSession: async ( + request: PartialMessage, + _options?: CallOptions, + ): Promise => { + const response = await mockEndpoints['/uniswap.platformservice.v1.SessionService/InitSession'](request, {}) + return response as InitSessionResponse + }, + challenge: async ( + request: PartialMessage, + _options?: CallOptions, + ): Promise => { + const sessionId = await sessionStorage.get() + const deviceId = await deviceIdService.getDeviceId() + const headers: Record = {} + if (sessionId?.sessionId) { + headers['X-Session-ID'] = sessionId.sessionId + } + if (deviceId) { + headers['X-Device-ID'] = deviceId + } + + const response = await mockEndpoints['/uniswap.platformservice.v1.SessionService/Challenge'](request, headers) + return response as ChallengeResponse + }, + verify: async (request: PartialMessage, _options?: CallOptions): Promise => { + const sessionId = await sessionStorage.get() + const deviceId = await deviceIdService.getDeviceId() + const headers: Record = {} + if (sessionId?.sessionId) { + headers['X-Session-ID'] = sessionId.sessionId + } + if (deviceId) { + headers['X-Device-ID'] = deviceId + } + + const response = await mockEndpoints['/uniswap.platformservice.v1.SessionService/Verify'](request, headers) + return response as VerifyResponse + }, + deleteSession: async ( + request: PartialMessage, + _options?: CallOptions, + ): Promise => { + const response = await mockEndpoints['/uniswap.platformservice.v1.SessionService/DeleteSession'](request, {}) + return response as DeleteSessionResponse + }, + introspectSession: async ( + request: PartialMessage, + _options?: CallOptions, + ): Promise => { + const response = await mockEndpoints['/uniswap.platformservice.v1.SessionService/IntrospectSession'](request, {}) + return response as IntrospectSessionResponse + }, + updateSession: async ( + request: PartialMessage, + _options?: CallOptions, + ): Promise => { + const response = await mockEndpoints['/uniswap.platformservice.v1.SessionService/UpdateSession'](request, {}) + return response as UpdateSessionResponse + }, + } +} diff --git a/packages/sessions/src/test-utils/mocks.ts b/packages/sessions/src/test-utils/mocks.ts new file mode 100644 index 00000000000..134ead1d2bb --- /dev/null +++ b/packages/sessions/src/test-utils/mocks.ts @@ -0,0 +1,120 @@ +import type { ChallengeSolver, ChallengeSolverService } from '@universe/sessions/src/challenge-solvers/types' +import type { SessionService } from '@universe/sessions/src/session-service/types' +import { BotDetectionType } from '@universe/sessions/src/session-service/types' +import { vi } from 'vitest' + +/** + * Creates a mock SessionService with sensible defaults + * All methods are vi.fn() mocks that can be overridden + */ +export function createMockSessionService(overrides: Partial = {}): SessionService { + return { + getSessionState: vi.fn().mockResolvedValue(null), + initSession: vi.fn().mockResolvedValue({ + sessionId: 'mock-session-123', + needChallenge: false, + extra: {}, + }), + requestChallenge: vi.fn().mockResolvedValue({ + challengeId: 'mock-challenge-456', + botDetectionType: BotDetectionType.BOT_DETECTION_TURNSTILE, + extra: { sitekey: 'mock-sitekey' }, + }), + upgradeSession: vi.fn().mockResolvedValue({ + retry: false, + }), + removeSession: vi.fn().mockResolvedValue(undefined), + ...overrides, + } +} + +/** + * Creates a mock ChallengeSolver + */ +export function createMockChallengeSolver( + solveFn: () => Promise = async (): Promise => 'mock-solution', +): ChallengeSolver { + return { + solve: vi.fn().mockImplementation(solveFn), + } +} + +/** + * Creates a mock ChallengeSolverService + */ +export function createMockChallengeSolverService( + solvers: Map = new Map(), +): ChallengeSolverService { + // Default solvers if not provided + if (solvers.size === 0) { + solvers.set( + BotDetectionType.BOT_DETECTION_TURNSTILE, + createMockChallengeSolver(async () => 'mock-turnstile-token'), + ) + solvers.set( + BotDetectionType.BOT_DETECTION_HASHCASH, + createMockChallengeSolver(async () => 'mock-hashcash-proof'), + ) + } + + return { + getSolver: vi.fn().mockImplementation((type: BotDetectionType) => solvers.get(type) || null), + } +} + +/** + * Test scenario helpers for common setups + */ +export const TestScenarios = { + /** + * Setup for when a session already exists + */ + withExistingSession(service: SessionService, sessionId = 'existing-session-789'): void { + vi.mocked(service.getSessionState).mockResolvedValue({ sessionId }) + }, + + /** + * Setup for when initialization requires no challenge + */ + withNoChallenge(service: SessionService): void { + vi.mocked(service.getSessionState).mockResolvedValue(null) + vi.mocked(service.initSession).mockResolvedValue({ + sessionId: 'new-session-111', + needChallenge: false, + extra: {}, + }) + }, + + /** + * Setup for when initialization requires a challenge + */ + withChallengeRequired(service: SessionService, challengeType = BotDetectionType.BOT_DETECTION_TURNSTILE): void { + vi.mocked(service.getSessionState).mockResolvedValue(null) + vi.mocked(service.initSession).mockResolvedValue({ + sessionId: 'new-session-222', + needChallenge: true, + extra: {}, + }) + vi.mocked(service.requestChallenge).mockResolvedValue({ + challengeId: 'challenge-333', + botDetectionType: challengeType, + extra: { sitekey: 'test-sitekey' }, + }) + vi.mocked(service.upgradeSession).mockResolvedValue({ + retry: false, + }) + }, + + /** + * Setup for when server requests challenge retry + */ + withServerRetry(service: SessionService, retriesBeforeSuccess = 1): void { + let attemptCount = 0 + vi.mocked(service.upgradeSession).mockImplementation(async () => { + attemptCount++ + return { + retry: attemptCount <= retriesBeforeSuccess, + } + }) + }, +} diff --git a/packages/sessions/vitest.config.ts b/packages/sessions/vitest.config.ts index 616edaceb98..21e3f9ea3ca 100644 --- a/packages/sessions/vitest.config.ts +++ b/packages/sessions/vitest.config.ts @@ -2,6 +2,8 @@ import { defineConfig } from 'vitest/config' export default defineConfig({ test: { + watch: false, + environment: 'jsdom', coverage: { exclude: ['**/__generated__/**', '**/node_modules/**', '**/dist/**', '**/*.config.*', '**/scripts/**'], }, diff --git a/packages/ui/src/assets/graphics/bridged-assets-v2-card-banner-dark.png b/packages/ui/src/assets/graphics/bridged-assets-v2-card-banner-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0751a3a30e3d7a9fabf6d65a8e11b4cdca5710 GIT binary patch literal 81953 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%0AGxCI!co?^ncHJF76r#-@7 zJo0lvt;&uV;(aB6LpWL97@1zL;S@1E68esYiM>P3A#z~)w)~*yEY*2{NoY%%71ZVd2j=DhQ`%+y7;KW3@}_; z--2QrN@u!l+HcoLVIGWI=2ZVjFHzOTTfWm6L+dHte|^b7?jTC5A=0nM!+;PKHw0jX zW$$H>3<%HbTSNzJ3%w8La6SFD(Pu-Pfv*qw{oLFx-&B9@z zW8~O@TKL5knn@eL#*1(w(FhCS+z7ab;*ok0->i8Avtv2*Rn2B4q-MbI>a!Crfo@Ko z118g)2wQ5AicmRdtl!{HGOcK5sC4!5uqtoR~X>H8~xt`cVYyWRM&3=_){LbEH+1;RG@AAssja3oJ z63Ia`-tb;5dgAaW|JDR9Oq$J8i=~xDQG0E~zj)?v$yO0wWi*R^vt9>wTQrsSYNHDS zG3%}Lx6#-Om;NXK1TILR*yjp?Lf$rNvlN@{1kL8QBqhR1%9NJqSdX{a`C3F$Gh27< z*|E59I||SlN1nDcQ_uHu(YBQ4TunBVk5OAxGfg`L^Vu|e(esOcR!W2H68$`F$moS* ztY&rH;ID1&Nf)-f7d{w$z(HNugH|`VZ9A8C1aH8QRfZd9HmbMfkmXB{Xh~Zm+ciM-CwTs8JIu-StT1w5@it`%3ewT>-A9J#21#K3o-K)&*g$AHG6`FNF4K>SC5fj`MWM?+k7i#&kAm%G3)jS* zbKi|6g@E;ZnA~2eT=Q4LUBNp`6V3u0rd*iayyP|HGB1xaE2lH9BKGSBRb1{k_Oxk! zY|`Y#0F&>Qm#udVXy->)E5$N&rKXiXbK^df5KS%=8=HKIP!Suu1Fj!)W0jZaqL4=u zbvkQ*)rlXG%%3JuNa^^^<1YARC6&sUp*gHJT_tGBgmSrfUcq_5KbaUKP?L(^2PMhI zLL#hcJG}da*bG^uZpD(u!e}-pr>FFt)}Lq7wN!~Eq3)5ONA~WI(k10ie*C2(Vr`(% zCVQk;Qea4qBF;e2(EXSABM4^o&cDOS(^ul+7QHVOt60@<9IxsT?JLR$Qa zhLt#-v|Iv@Ng?)bAnCq$S@%SL!6Cdgu*X!Hj%p{$SozRs4>v7Z`%s4`7_oNAK@VTM z(_7QqyiIDfUU)vu?Kl4ND%eCj8f|WNs%?z#Un=}x5?NThQ=z9Fry2Z0SDv&Tkt6){ z_B-h1`i|H7eDR0rNfOZEg>BVH7W3y#K;0B?Cusc>G%Yk!-#vBx|fa9 z`tpuEX4`+-*bR|hne!hK8|;Wl=-;N4M`Z!y(YB$0)fwdsGHPywX8pfaf2o_3

5` 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 SvPlm16+kH^$trQ + + diff --git a/packages/ui/src/assets/icons/chart-bar-crossed.svg b/packages/ui/src/assets/icons/chart-bar-crossed.svg new file mode 100644 index 00000000000..eed7727cee2 --- /dev/null +++ b/packages/ui/src/assets/icons/chart-bar-crossed.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/ui/src/assets/icons/credit-card.svg b/packages/ui/src/assets/icons/credit-card.svg new file mode 100644 index 00000000000..145d6c52406 --- /dev/null +++ b/packages/ui/src/assets/icons/credit-card.svg @@ -0,0 +1,6 @@ + + + diff --git a/packages/ui/src/assets/icons/money-hand.svg b/packages/ui/src/assets/icons/money-hand.svg new file mode 100644 index 00000000000..15019ba1cc8 --- /dev/null +++ b/packages/ui/src/assets/icons/money-hand.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/ui/src/assets/icons/shield-magnifying-glass.svg b/packages/ui/src/assets/icons/shield-magnifying-glass.svg new file mode 100644 index 00000000000..ff3282b3a85 --- /dev/null +++ b/packages/ui/src/assets/icons/shield-magnifying-glass.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/ui/src/assets/index.ts b/packages/ui/src/assets/index.ts index 68a142eb43c..2b15916d751 100644 --- a/packages/ui/src/assets/index.ts +++ b/packages/ui/src/assets/index.ts @@ -55,6 +55,8 @@ export const UNITAG_LIGHT_SMALL = require('./graphics/unitag-light-small.png') export const PUSH_NOTIFICATIONS_CARD_BANNER = require('./graphics/push-notifications-card-banner.png') export const BRIDGED_ASSETS_CARD_BANNER = require('./graphics/bridged-assets-card-banner.png') +export const BRIDGED_ASSETS_V2_CARD_BANNER_DARK = require('./graphics/bridged-assets-v2-card-banner-dark.png') +export const BRIDGED_ASSETS_V2_CARD_BANNER_LIGHT = require('./graphics/bridged-assets-v2-card-banner-light.png') export const BRIDGED_ASSETS_V2_WEB_BANNER = require('./graphics/bridged-assets-v2-web-banner.png') export const ONBOARDING_NOTIFICATIONS_DARK = { diff --git a/packages/ui/src/components/icons/Box.tsx b/packages/ui/src/components/icons/Box.tsx new file mode 100644 index 00000000000..2fbf927ae6b --- /dev/null +++ b/packages/ui/src/components/icons/Box.tsx @@ -0,0 +1,17 @@ +import { Path, Svg } from 'react-native-svg' + +// eslint-disable-next-line no-relative-import-paths/no-relative-import-paths +import { createIcon } from '../factories/createIcon' + +export const [Box, AnimatedBox] = createIcon({ + name: 'Box', + getIcon: (props) => ( + + + + ), + defaultFill: '#131313', +}) diff --git a/packages/ui/src/components/icons/ChartBarCrossed.tsx b/packages/ui/src/components/icons/ChartBarCrossed.tsx new file mode 100644 index 00000000000..36b8577593b --- /dev/null +++ b/packages/ui/src/components/icons/ChartBarCrossed.tsx @@ -0,0 +1,17 @@ +import { Path, Svg } from 'react-native-svg' + +// eslint-disable-next-line no-relative-import-paths/no-relative-import-paths +import { createIcon } from '../factories/createIcon' + +export const [ChartBarCrossed, AnimatedChartBarCrossed] = createIcon({ + name: 'ChartBarCrossed', + getIcon: (props) => ( + + + + + ), +}) diff --git a/packages/ui/src/components/icons/CreditCard.tsx b/packages/ui/src/components/icons/CreditCard.tsx new file mode 100644 index 00000000000..658e7cba3ef --- /dev/null +++ b/packages/ui/src/components/icons/CreditCard.tsx @@ -0,0 +1,16 @@ +import { Path, Svg } from 'react-native-svg' + +// eslint-disable-next-line no-relative-import-paths/no-relative-import-paths +import { createIcon } from '../factories/createIcon' + +export const [CreditCard, AnimatedCreditCard] = createIcon({ + name: 'CreditCard', + getIcon: (props) => ( + + + + ), +}) diff --git a/packages/ui/src/components/icons/MoneyHand.tsx b/packages/ui/src/components/icons/MoneyHand.tsx new file mode 100644 index 00000000000..144c650b2bd --- /dev/null +++ b/packages/ui/src/components/icons/MoneyHand.tsx @@ -0,0 +1,17 @@ +import { Path, Svg } from 'react-native-svg' + +// eslint-disable-next-line no-relative-import-paths/no-relative-import-paths +import { createIcon } from '../factories/createIcon' + +export const [MoneyHand, AnimatedMoneyHand] = createIcon({ + name: 'MoneyHand', + getIcon: (props) => ( + + + + ), + defaultFill: '#131313', +}) diff --git a/packages/ui/src/components/icons/ShieldMagnifyingGlass.tsx b/packages/ui/src/components/icons/ShieldMagnifyingGlass.tsx new file mode 100644 index 00000000000..e037faff641 --- /dev/null +++ b/packages/ui/src/components/icons/ShieldMagnifyingGlass.tsx @@ -0,0 +1,16 @@ +import { Path, Svg } from 'react-native-svg' + +// eslint-disable-next-line no-relative-import-paths/no-relative-import-paths +import { createIcon } from '../factories/createIcon' + +export const [ShieldMagnifyingGlass, AnimatedShieldMagnifyingGlass] = createIcon({ + name: 'ShieldMagnifyingGlass', + getIcon: (props) => ( + + + + ), +}) diff --git a/packages/ui/src/components/icons/exported.ts b/packages/ui/src/components/icons/exported.ts index b9d9724bff8..256286f2fab 100644 --- a/packages/ui/src/components/icons/exported.ts +++ b/packages/ui/src/components/icons/exported.ts @@ -28,12 +28,14 @@ export * from './BlockExplorer' export * from './Blocked' export * from './Bolt' export * from './BookOpen' +export * from './Box' export * from './Buy' export * from './Calendar' export * from './Camera' export * from './CameraScan' export * from './Chart' export * from './ChartBar' +export * from './ChartBarCrossed' export * from './ChartPie' export * from './ChartPyramid' export * from './Check' @@ -58,6 +60,7 @@ export * from './Contrast' export * from './CopyAlt' export * from './CopySheets' export * from './Coupon' +export * from './CreditCard' export * from './DocumentList' export * from './Dollar' export * from './Dot' @@ -119,6 +122,7 @@ export * from './MessageText' export * from './Minus' export * from './MinusCircle' export * from './Mobile' +export * from './MoneyHand' export * from './Moon' export * from './MoreHorizontal' export * from './NoNfts' @@ -170,6 +174,7 @@ export * from './SettingsWarning' export * from './Share' export * from './ShareArrow' export * from './ShieldCheck' +export * from './ShieldMagnifyingGlass' export * from './Shuffle' export * from './Sign' export * from './Signature' diff --git a/packages/ui/src/components/switch/Switch.web.tsx b/packages/ui/src/components/switch/Switch.web.tsx index bb49103f534..447737a3175 100644 --- a/packages/ui/src/components/switch/Switch.web.tsx +++ b/packages/ui/src/components/switch/Switch.web.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react' -import { OpaqueColorValue } from 'react-native' +import { type OpaqueColorValue } from 'react-native' import type { ColorTokens, GetThemeValueForKey } from 'tamagui' import { Switch as TamaguiSwitch } from 'tamagui' import { Check } from 'ui/src/components/icons' @@ -163,7 +163,7 @@ export function Switch({ <> {/* focus ring outer */} ({ + getItemAsync: jest.fn(() => Promise.resolve(null)), + setItemAsync: jest.fn(() => Promise.resolve()), + deleteItemAsync: jest.fn(() => Promise.resolve()), +})) + import 'utilities/jest-package-mocks' import 'uniswap/jest-package-mocks' import 'config/jest-presets/ui/ui-package-mocks' diff --git a/packages/uniswap/package.json b/packages/uniswap/package.json index 7dcbba8c7e1..60b5e65d698 100644 --- a/packages/uniswap/package.json +++ b/packages/uniswap/package.json @@ -24,6 +24,7 @@ "@bufbuild/protobuf": "1.10.0", "@connectrpc/connect": "1.4.0", "@connectrpc/connect-query": "1.4.1", + "@connectrpc/connect-web": "1.4.0", "@datadog/browser-logs": "5.20.0", "@datadog/browser-rum": "5.23.3", "@ethersproject/abstract-provider": "5.8.0", @@ -51,7 +52,7 @@ "@uniswap/client-embeddedwallet": "0.0.16", "@uniswap/client-explore": "0.0.17", "@uniswap/client-search": "0.0.10", - "@uniswap/client-trading": "0.1.0", + "@uniswap/client-trading": "0.1.2", "@uniswap/permit2-sdk": "1.3.0", "@uniswap/router-sdk": "2.0.2", "@uniswap/sdk-core": "7.7.2", diff --git a/packages/uniswap/src/components/TokenSelector/hooks.test.ts b/packages/uniswap/src/components/TokenSelector/hooks.test.ts index 7970d994ec6..2d99f029260 100644 --- a/packages/uniswap/src/components/TokenSelector/hooks.test.ts +++ b/packages/uniswap/src/components/TokenSelector/hooks.test.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-lines */ import { ApolloError } from '@apollo/client' import { ConnectError } from '@connectrpc/connect' import { UseQueryResult } from '@tanstack/react-query' diff --git a/packages/uniswap/src/components/accounts/AddressDisplay.tsx b/packages/uniswap/src/components/accounts/AddressDisplay.tsx index fcfe160feab..dc31feebcad 100644 --- a/packages/uniswap/src/components/accounts/AddressDisplay.tsx +++ b/packages/uniswap/src/components/accounts/AddressDisplay.tsx @@ -2,7 +2,16 @@ import { SharedEventName } from '@uniswap/analytics-events' import { PropsWithChildren, useMemo, useState } from 'react' import type { FlexAlignType, LayoutChangeEvent } from 'react-native' import { useDispatch } from 'react-redux' -import { AnimatableCopyIcon, ColorTokens, Flex, SpaceTokens, Text, TextProps, TouchableArea } from 'ui/src' +import { + AnimatableCopyIcon, + ColorTokens, + Flex, + HeightAnimator, + SpaceTokens, + Text, + TextProps, + TouchableArea, +} from 'ui/src' import { fonts } from 'ui/src/theme' import { DisplayNameText } from 'uniswap/src/components/accounts/DisplayNameText' import { useUniswapContext } from 'uniswap/src/contexts/UniswapContext' @@ -49,6 +58,7 @@ type AddressDisplayProps = { showViewOnlyBadge?: boolean addressNumVisibleCharacters?: 4 | 6 accountIconTransition?: string + animateAddressSubtitleHeight?: boolean // TODO WALL-4545 Added flag to disable forced width causing trouble in other screens disableForcedWidth?: boolean @@ -73,6 +83,21 @@ function CopyButtonWrapper({ children, onPress }: PropsWithChildren{children} } +function ConditionalHeightAnimator({ + animateHeight, + children, + open, +}: { + animateHeight: boolean + children: JSX.Element + open: boolean +}): JSX.Element | null { + if (animateHeight) { + return {children} + } + return open ? children : null +} + /** Helper component to display AccountIcon and formatted address */ export function AddressDisplay({ @@ -104,6 +129,7 @@ export function AddressDisplay({ displayNameTextAlign, addressNumVisibleCharacters = 6, accountIconTransition, + animateAddressSubtitleHeight = false, }: AddressDisplayProps): JSX.Element { const dispatch = useDispatch() const { useWalletDisplayName } = useUniswapContext() @@ -194,8 +220,7 @@ export function AddressDisplay({ )} - {/* TODO(PORT-453): re-add HeightAnimator on web */} - {showAddressAsSubtitle && ( + - )} + ) diff --git a/packages/uniswap/src/components/activity/details/TransactionDetailsModal.tsx b/packages/uniswap/src/components/activity/details/TransactionDetailsModal.tsx index c991fc153f5..19f274bfda7 100644 --- a/packages/uniswap/src/components/activity/details/TransactionDetailsModal.tsx +++ b/packages/uniswap/src/components/activity/details/TransactionDetailsModal.tsx @@ -46,9 +46,11 @@ import { isExtensionApp, isWebPlatform } from 'utilities/src/platform' import { useBooleanState } from 'utilities/src/react/useBooleanState' type TransactionDetailsModalProps = { + transactionDetails: TransactionDetails authTrigger?: AuthTrigger onClose: () => void - transactionDetails: TransactionDetails + onReportTransaction?: () => void + onUnhideTransaction?: () => void } export function TransactionDetailsHeader({ @@ -170,9 +172,11 @@ const isNFTActivity = (typeInfo: TransactionTypeInfo): boolean => { } export function TransactionDetailsModal({ + transactionDetails, authTrigger, onClose, - transactionDetails, + onReportTransaction, + onUnhideTransaction, }: TransactionDetailsModalProps): JSX.Element { const { t } = useTranslation() const { typeInfo, status, addedTime } = transactionDetails @@ -189,8 +193,11 @@ export function TransactionDetailsModal({ const isCancelable = useIsCancelable(transactionDetails) && !readonly const transactionActions = useTransactionActions({ - authTrigger, transaction: transactionDetails, + authTrigger, + onClose, + onReportTransaction, + onUnhideTransaction, }) const { openCancelModal, renderModals, menuItems } = transactionActions diff --git a/packages/uniswap/src/components/activity/details/transactions/ApproveTransactionDetails.tsx b/packages/uniswap/src/components/activity/details/transactions/ApproveTransactionDetails.tsx index a22b367d192..bec46019623 100644 --- a/packages/uniswap/src/components/activity/details/transactions/ApproveTransactionDetails.tsx +++ b/packages/uniswap/src/components/activity/details/transactions/ApproveTransactionDetails.tsx @@ -10,7 +10,9 @@ import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { useCurrencyInfo } from 'uniswap/src/features/tokens/useCurrencyInfo' import { ApproveTransactionInfo, + INFINITE_APPROVAL_AMOUNT, Permit2ApproveTransactionInfo, + REVOKE_APPROVAL_AMOUNT, TransactionDetails, TransactionType, } from 'uniswap/src/features/transactions/types/transactionDetails' @@ -19,8 +21,6 @@ import { buildCurrencyId } from 'uniswap/src/utils/currencyId' import { NumberType } from 'utilities/src/format/types' import { isWebPlatform } from 'utilities/src/platform' -const INFINITE_AMOUNT = 'INF' -const ZERO_AMOUNT = '0.0' export function ApproveTransactionDetails({ transactionDetails, typeInfo, @@ -42,9 +42,9 @@ export function ApproveTransactionDetails({ const approvalAmount = typeInfo.type === TransactionType.Approve ? typeInfo.approvalAmount : typeInfo.amount const amount = - approvalAmount === INFINITE_AMOUNT + approvalAmount === INFINITE_APPROVAL_AMOUNT ? t('transaction.amount.unlimited') - : approvalAmount && approvalAmount !== ZERO_AMOUNT + : approvalAmount && approvalAmount !== REVOKE_APPROVAL_AMOUNT ? formatNumberOrString({ value: approvalAmount, type: NumberType.TokenNonTx }) : '' diff --git a/packages/uniswap/src/components/activity/hooks/useFormattedCurrencyAmountAndUSDValue.ts b/packages/uniswap/src/components/activity/hooks/useFormattedCurrencyAmountAndUSDValue.ts index 76090cb784f..bda8dbfb71f 100644 --- a/packages/uniswap/src/components/activity/hooks/useFormattedCurrencyAmountAndUSDValue.ts +++ b/packages/uniswap/src/components/activity/hooks/useFormattedCurrencyAmountAndUSDValue.ts @@ -39,7 +39,7 @@ export function useFormattedCurrencyAmountAndUSDValue({ return { tilde: isApproximateAmount ? '~' : '', - amount: `${formattedAmount}`, + amount: formattedAmount, value: value ? formatter.convertFiatAmountFormatted(parseFloat(value.toExact()), NumberType.FiatTokenQuantity) : '-', // default placeholder string for when value is loading diff --git a/packages/uniswap/src/components/activity/summaries/ApproveSummaryItem.tsx b/packages/uniswap/src/components/activity/summaries/ApproveSummaryItem.tsx index 571719150c9..4603db610a0 100644 --- a/packages/uniswap/src/components/activity/summaries/ApproveSummaryItem.tsx +++ b/packages/uniswap/src/components/activity/summaries/ApproveSummaryItem.tsx @@ -9,6 +9,8 @@ import { useLocalizationContext } from 'uniswap/src/features/language/Localizati import { useCurrencyInfo } from 'uniswap/src/features/tokens/useCurrencyInfo' import { ApproveTransactionInfo, + INFINITE_APPROVAL_AMOUNT, + REVOKE_APPROVAL_AMOUNT, TransactionDetails, TransactionType, } from 'uniswap/src/features/transactions/types/transactionDetails' @@ -16,9 +18,6 @@ import { getSymbolDisplayText } from 'uniswap/src/utils/currency' import { buildCurrencyId } from 'uniswap/src/utils/currencyId' import { NumberType } from 'utilities/src/format/types' -const INFINITE_AMOUNT = 'INF' -const ZERO_AMOUNT = '0.0' - export function ApproveSummaryItem({ transaction, index, @@ -32,9 +31,9 @@ export function ApproveSummaryItem({ const { approvalAmount } = transaction.typeInfo const amount = - approvalAmount === INFINITE_AMOUNT + approvalAmount === INFINITE_APPROVAL_AMOUNT ? t('transaction.amount.unlimited') - : approvalAmount && approvalAmount !== ZERO_AMOUNT + : approvalAmount && approvalAmount !== REVOKE_APPROVAL_AMOUNT ? formatNumberOrString({ value: approvalAmount, type: NumberType.TokenNonTx }) : '' diff --git a/packages/uniswap/src/components/activity/summaries/TransactionSummaryLayout.tsx b/packages/uniswap/src/components/activity/summaries/TransactionSummaryLayout.tsx index 6fda8d8c51f..f44b88309ba 100644 --- a/packages/uniswap/src/components/activity/summaries/TransactionSummaryLayout.tsx +++ b/packages/uniswap/src/components/activity/summaries/TransactionSummaryLayout.tsx @@ -69,8 +69,8 @@ const TransactionSummaryLayoutContent = memo(function _TransactionSummaryLayoutC caption, icon, index, - onRetry, isQueued, + onRetry, }: TransactionSummaryLayoutProps & { isQueued: boolean }): JSX.Element { diff --git a/packages/uniswap/src/components/activity/types.ts b/packages/uniswap/src/components/activity/types.ts index 8115658c292..cee4f8f0d9f 100644 --- a/packages/uniswap/src/components/activity/types.ts +++ b/packages/uniswap/src/components/activity/types.ts @@ -14,10 +14,10 @@ export interface TransactionSummaryLayoutProps { } export interface SummaryItemProps { + index?: number authTrigger?: AuthTrigger transaction: TransactionDetails swapCallbacks?: SwapSummaryCallbacks - index?: number } export interface SwapSummaryCallbacks { diff --git a/packages/uniswap/src/components/dialog/Dialog.test.tsx b/packages/uniswap/src/components/dialog/Dialog.test.tsx index a84850b980d..df6364edce6 100644 --- a/packages/uniswap/src/components/dialog/Dialog.test.tsx +++ b/packages/uniswap/src/components/dialog/Dialog.test.tsx @@ -29,9 +29,9 @@ describe('Dialog component', () => { subtext="Mock Subtext" modalName={ModalName.Dialog} primaryButtonText="Primary Button" - primaryButtonOnClick={mockPrimaryClick} + primaryButtonOnPress={mockPrimaryClick} secondaryButtonText="Close" - secondaryButtonOnClick={mockOnClose} + secondaryButtonOnPress={mockOnClose} onClose={mockOnClose} {...props} />, @@ -63,7 +63,7 @@ describe('Dialog component', () => { it('handles secondary button click when provided', () => { const { getByText } = renderDialog({ secondaryButtonText: 'Secondary Button', - secondaryButtonOnClick: mockSecondaryClick, + secondaryButtonOnPress: mockSecondaryClick, }) fireEvent.press(getByText('Secondary Button')) diff --git a/packages/uniswap/src/components/dialog/Dialog.web.tsx b/packages/uniswap/src/components/dialog/Dialog.web.tsx index fef4a4c7d27..d7f7739ddb2 100644 --- a/packages/uniswap/src/components/dialog/Dialog.web.tsx +++ b/packages/uniswap/src/components/dialog/Dialog.web.tsx @@ -10,87 +10,106 @@ export function Dialog({ onClose, icon, title, + titleColor, subtext, learnMoreUrl, learnMoreTextColor = '$neutral1', learnMoreTextVariant = 'body3', modalName, primaryButtonText, - primaryButtonOnClick, - primaryButtonVariant = 'branded', - primaryButtonEmphasis, + primaryButtonOnPress, + primaryButtonVariant = 'default', + primaryButtonEmphasis = 'primary', isPrimaryButtonLoading, secondaryButtonText, - secondaryButtonOnClick, + secondaryButtonOnPress, secondaryButtonVariant = 'default', secondaryButtonEmphasis = 'secondary', buttonContainerProps, alignment = isExtensionApp ? 'top' : undefined, children, + footer, textAlign = 'center', displayHelpCTA = false, - hasIconBackground = false, + iconBackgroundColor, }: DialogProps): JSX.Element { return ( - + {displayHelpCTA && } - - {hasIconBackground ? ( + + + {icon} + + + + {title} + + {typeof subtext === 'string' ? ( + + {subtext} + + ) : ( + subtext + )} + {learnMoreUrl && ( + + )} + + {children && ( - {icon} + {children} - ) : ( - icon - )} - - {title} - - {typeof subtext === 'string' ? ( - - {subtext} - - ) : ( - subtext )} - {learnMoreUrl && ( - + {footer} + + + {secondaryButtonText && secondaryButtonOnPress && ( + )} - {children} - + {primaryButtonText && primaryButtonOnPress && ( - {secondaryButtonText && secondaryButtonOnClick && ( - - )} - + )} ) diff --git a/packages/uniswap/src/components/dialog/DialogProps.tsx b/packages/uniswap/src/components/dialog/DialogProps.tsx index 1e101e68407..e1fa86208b6 100644 --- a/packages/uniswap/src/components/dialog/DialogProps.tsx +++ b/packages/uniswap/src/components/dialog/DialogProps.tsx @@ -7,24 +7,26 @@ export interface DialogProps { onClose: () => void icon: ReactNode title: string | ReactNode + titleColor?: TextProps['color'] subtext: string | ReactNode learnMoreUrl?: string learnMoreTextColor?: TextProps['color'] learnMoreTextVariant?: TextProps['variant'] modalName: ModalNameType - primaryButtonText: string - primaryButtonOnClick: () => void + primaryButtonText?: string + primaryButtonOnPress?: () => void primaryButtonVariant?: ButtonVariant primaryButtonEmphasis?: ButtonEmphasis isPrimaryButtonLoading?: boolean secondaryButtonText?: string - secondaryButtonOnClick?: () => void + secondaryButtonOnPress?: () => void secondaryButtonVariant?: ButtonVariant secondaryButtonEmphasis?: ButtonEmphasis buttonContainerProps?: FlexProps children?: ReactNode + footer?: ReactNode alignment?: 'top' | 'center' textAlign?: 'center' | 'left' displayHelpCTA?: boolean - hasIconBackground?: boolean + iconBackgroundColor?: FlexProps['backgroundColor'] } diff --git a/packages/uniswap/src/components/dialog/GetHelpHeader.tsx b/packages/uniswap/src/components/dialog/GetHelpHeader.tsx index 6005ae0e178..c4cd04068e4 100644 --- a/packages/uniswap/src/components/dialog/GetHelpHeader.tsx +++ b/packages/uniswap/src/components/dialog/GetHelpHeader.tsx @@ -15,19 +15,23 @@ function GetHelpButton({ url }: { url?: string }): JSX.Element { - - + + {t('common.getHelp.button')} diff --git a/packages/uniswap/src/components/dropdowns/ActionSheetDropdown.tsx b/packages/uniswap/src/components/dropdowns/ActionSheetDropdown.tsx index c5f37067ff4..b79c24a89d5 100644 --- a/packages/uniswap/src/components/dropdowns/ActionSheetDropdown.tsx +++ b/packages/uniswap/src/components/dropdowns/ActionSheetDropdown.tsx @@ -151,6 +151,7 @@ export function ActionSheetDropdown({ direction={isOpen ? 'up' : 'down'} height={iconSizes.icon20} width={iconSizes.icon20} + $group-item-hover={{}} /> )} diff --git a/packages/uniswap/src/components/lists/items/tokens/TokenOptionItemContextMenu.tsx b/packages/uniswap/src/components/lists/items/tokens/TokenOptionItemContextMenu.tsx index 9c264efc15a..7279da86d08 100644 --- a/packages/uniswap/src/components/lists/items/tokens/TokenOptionItemContextMenu.tsx +++ b/packages/uniswap/src/components/lists/items/tokens/TokenOptionItemContextMenu.tsx @@ -25,7 +25,7 @@ import { pushNotification } from 'uniswap/src/features/notifications/slice/slice import { AppNotificationType, CopyNotificationType } from 'uniswap/src/features/notifications/slice/types' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { ElementName } from 'uniswap/src/features/telemetry/constants' -import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send.web' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { setClipboard } from 'uniswap/src/utils/clipboard' import { currencyAddress, currencyId, currencyIdToAddress, currencyIdToChain } from 'uniswap/src/utils/currencyId' import { getTokenDetailsURL } from 'uniswap/src/utils/linking' diff --git a/packages/uniswap/src/components/modals/WarningModal/WarningModal.tsx b/packages/uniswap/src/components/modals/WarningModal/WarningModal.tsx index 6c33809056d..a68da312900 100644 --- a/packages/uniswap/src/components/modals/WarningModal/WarningModal.tsx +++ b/packages/uniswap/src/components/modals/WarningModal/WarningModal.tsx @@ -1,20 +1,26 @@ -import { type PropsWithChildren, type ReactNode, useContext } from 'react' +import { type PropsWithChildren, type ReactNode, useContext, useState } from 'react' +import { useTranslation } from 'react-i18next' import type { ColorValue } from 'react-native' import { Button, Flex, FlexProps, Text, TouchableArea, useSporeColors } from 'ui/src' import type { ButtonEmphasis, ButtonProps } from 'ui/src/components/buttons/Button/types' import { AlertTriangleFilled } from 'ui/src/components/icons/AlertTriangleFilled' +import { ShieldMagnifyingGlass } from 'ui/src/components/icons/ShieldMagnifyingGlass' import { X } from 'ui/src/components/icons/X' import { opacify, zIndexes } from 'ui/src/theme' import { Modal } from 'uniswap/src/components/modals/Modal' +import { useBottomSheetSafeKeyboard } from 'uniswap/src/components/modals/useBottomSheetSafeKeyboard' import { getAlertColor } from 'uniswap/src/components/modals/WarningModal/getAlertColor' import { WarningSeverity } from 'uniswap/src/components/modals/WarningModal/types' +import { ReportInput } from 'uniswap/src/components/reporting/input' import type { ModalNameType } from 'uniswap/src/features/telemetry/constants' -import { ElementName } from 'uniswap/src/features/telemetry/constants' +import { ElementName, SectionName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' import type { SwapFormStore } from 'uniswap/src/features/transactions/swap/stores/swapFormStore/createSwapFormStore' import { SwapFormStoreContext } from 'uniswap/src/features/transactions/swap/stores/swapFormStore/SwapFormStoreContext' import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { isMobileApp, isWebPlatform } from 'utilities/src/platform' +import { useEvent } from 'utilities/src/react/hooks' +import { useBooleanState } from 'utilities/src/react/useBooleanState' export const useMaybeSwapFormStoreBase = (): SwapFormStore | null => useContext(SwapFormStoreContext) @@ -22,6 +28,7 @@ type WarningModalContentProps = { onClose?: () => void onReject?: () => void onAcknowledge?: () => void + sendReport?: (reportText: string) => void hideHandlebar?: boolean modalName: ModalNameType title?: string @@ -90,6 +97,51 @@ function WarningModalIcon({ ) } +function ReportWarningModalContent({ + onBack, + onSendReport, + wrapperProps, + children, +}: PropsWithChildren<{ + onBack: () => void + onSendReport: (reportText: string) => void + wrapperProps: FlexProps +}>): JSX.Element { + const colors = useSporeColors() + const { t } = useTranslation() + const [reportText, setReportText] = useState('') + + const { keyboardHeight } = useBottomSheetSafeKeyboard() + + return ( + + + } + backgroundIconColor={colors.surface3.val} + alertHeaderTextColor="$neutral1" + /> + + {t('reporting.token.warning.report.title')} + + + {t('reporting.token.warning.report.subtitle')} + + {keyboardHeight === 0 && children} + + + + + + + + ) +} + export function WarningModalContent({ onClose, onReject, @@ -113,23 +165,42 @@ export function WarningModalContent({ showCloseButton = false, acknowledgeButtonEmphasis = 'primary', closeHeaderComponent, + sendReport, ...props }: PropsWithChildren): JSX.Element { + const { t } = useTranslation() const { headerText: alertHeaderTextColor } = getAlertColor(severity) const defaultButtonSize = isMobileApp ? 'medium' : 'small' const buttonSize = passedButtonSize ?? defaultButtonSize + const { value: shouldShowReportUI, setTrue: showReportUI, setFalse: hideReportUI } = useBooleanState(false) + + const onSendReport = useEvent((reportText: string) => { + sendReport?.(reportText) + onClose?.() + }) + + const wrapperProps: FlexProps = { + centered: true, + gap: '$spacing12', + maxWidth, + pb: isWebPlatform ? '$none' : '$spacing12', + pt: hideHandlebar ? '$spacing24' : '$spacing12', + px: isWebPlatform ? '$none' : '$spacing24', + ...props, + } + + if (shouldShowReportUI) { + return ( + + {children} + + ) + } + return ( - + {showCloseButton && onClose && !closeHeaderComponent && ( @@ -180,6 +251,13 @@ export function WarningModalContent({ )} )} + {sendReport && ( + + + {t('reporting.token.warning.button')} + + + )} ) } diff --git a/packages/uniswap/src/components/modals/useBottomSheetSafeKeyboard.web.tsx b/packages/uniswap/src/components/modals/useBottomSheetSafeKeyboard.web.tsx index 01771a0919c..d37ba86a9a6 100644 --- a/packages/uniswap/src/components/modals/useBottomSheetSafeKeyboard.web.tsx +++ b/packages/uniswap/src/components/modals/useBottomSheetSafeKeyboard.web.tsx @@ -1,6 +1,6 @@ import { KeyboardInfo } from 'uniswap/src/components/modals/useBottomSheetSafeKeyboard' -import { NotImplementedError } from 'utilities/src/errors' export function useBottomSheetSafeKeyboard(): KeyboardInfo { - throw new NotImplementedError('useBottomSheetSafeKeyboard') + // Not yet accounting for mWeb + return { keyboardHeight: 0 } } diff --git a/packages/uniswap/src/components/nfts/NftsList.tsx b/packages/uniswap/src/components/nfts/NftsList.tsx index 69eae879547..cb05e4142e1 100644 --- a/packages/uniswap/src/components/nfts/NftsList.tsx +++ b/packages/uniswap/src/components/nfts/NftsList.tsx @@ -21,6 +21,8 @@ export type NftsListProps = Omit< autoColumns?: boolean /** Web-only: when true, use a flex-wrap container instead of 2-col grid */ wrapFlex?: boolean + /** Custom loading state skeleton - if provided, overrides default loading skeleton */ + customLoadingState?: JSX.Element }, 'renderItem' | 'data' > & { diff --git a/packages/uniswap/src/components/nfts/NftsList.web.tsx b/packages/uniswap/src/components/nfts/NftsList.web.tsx index 1e92a24062b..53e5f5fea55 100644 --- a/packages/uniswap/src/components/nfts/NftsList.web.tsx +++ b/packages/uniswap/src/components/nfts/NftsList.web.tsx @@ -55,6 +55,7 @@ export function NftsList({ customEmptyState, autoColumns = false, loadingSkeletonCount = 6, + customLoadingState, }: NftsListProps): JSX.Element { const { t } = useTranslation() @@ -129,16 +130,18 @@ export function NftsList({ [nfts, shouldAddInLoadingItem], ) - const loadingState = useMemo( - () => ( + const loadingState = useMemo(() => { + if (customLoadingState) { + return customLoadingState + } + return ( <> {Array.from({ length: loadingSkeletonCount }, (_, i) => ( ))} - ), - [loadingSkeletonCount], - ) + ) + }, [loadingSkeletonCount, customLoadingState]) const emptyState = useMemo( () => diff --git a/packages/uniswap/src/components/nfts/ShowNFTModal.tsx b/packages/uniswap/src/components/nfts/ShowNFTModal.tsx index a425d8cdc26..4f3d1ea4359 100644 --- a/packages/uniswap/src/components/nfts/ShowNFTModal.tsx +++ b/packages/uniswap/src/components/nfts/ShowNFTModal.tsx @@ -7,7 +7,7 @@ import { InfoLinkModal } from 'uniswap/src/components/modals/InfoLinkModal' import { uniswapUrls } from 'uniswap/src/constants/urls' import { ModalName, WalletEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' -import { isExtensionApp } from 'utilities/src/platform' +import { isMobileApp } from 'utilities/src/platform' export function ShowNFTModal(): JSX.Element { const { t } = useTranslation() @@ -36,7 +36,7 @@ export function ShowNFTModal(): JSX.Element { diff --git a/packages/uniswap/src/components/portfolio/PortfolioEmptyState.tsx b/packages/uniswap/src/components/portfolio/PortfolioEmptyState.tsx index b881bc996a1..24f27baa0cf 100644 --- a/packages/uniswap/src/components/portfolio/PortfolioEmptyState.tsx +++ b/packages/uniswap/src/components/portfolio/PortfolioEmptyState.tsx @@ -1,4 +1,4 @@ -import { FlashList } from '@shopify/flash-list' +import { CellContainer, FlashList } from '@shopify/flash-list' import React, { useMemo } from 'react' import { useTranslation } from 'react-i18next' import type { StyleProp, ViewStyle } from 'react-native' @@ -164,9 +164,9 @@ const LogoRendererComponent = ({ const cellStyle = [style, { zIndex: -index }] return ( - + {children} - + ) } diff --git a/packages/uniswap/src/components/portfolio/TokenBalanceItemContextMenu.native.tsx b/packages/uniswap/src/components/portfolio/TokenBalanceItemContextMenu.native.tsx index aad08bd7a3c..d0ed77ad5bd 100644 --- a/packages/uniswap/src/components/portfolio/TokenBalanceItemContextMenu.native.tsx +++ b/packages/uniswap/src/components/portfolio/TokenBalanceItemContextMenu.native.tsx @@ -87,6 +87,7 @@ export function TokenBalanceItemContextMenu({ portfolioBalance, excludedActions, openContractAddressExplainerModal, + openReportTokenModal, copyAddressToClipboard, onPressToken: onPressToken, }: PropsWithChildren): JSX.Element { @@ -97,6 +98,7 @@ export function TokenBalanceItemContextMenu({ tokenSymbolForNotification: portfolioBalance.currencyInfo.currency.symbol, portfolioBalance, openContractAddressExplainerModal, + openReportTokenModal, copyAddressToClipboard, closeMenu: () => {}, }) @@ -137,4 +139,5 @@ const actionToIcon: Record = { share: 'square.and.arrow.up', toggleVisibility: 'eye', copyAddress: 'doc.on.doc', + reportToken: 'flag', } diff --git a/packages/uniswap/src/components/portfolio/TokenBalanceItemContextMenu.tsx b/packages/uniswap/src/components/portfolio/TokenBalanceItemContextMenu.tsx index 21363bc3336..0a7dba48aa5 100644 --- a/packages/uniswap/src/components/portfolio/TokenBalanceItemContextMenu.tsx +++ b/packages/uniswap/src/components/portfolio/TokenBalanceItemContextMenu.tsx @@ -8,6 +8,7 @@ export interface TokenBalanceItemContextMenuProps { portfolioBalance: PortfolioBalance excludedActions?: TokenMenuActionType[] openContractAddressExplainerModal?: () => void + openReportTokenModal: () => void copyAddressToClipboard?: (address: string) => Promise triggerMode?: ContextMenuTriggerMode onPressToken?: () => void diff --git a/packages/uniswap/src/components/portfolio/TokenBalanceItemContextMenu.web.tsx b/packages/uniswap/src/components/portfolio/TokenBalanceItemContextMenu.web.tsx index 9c002a31a8e..df3564b0ef1 100644 --- a/packages/uniswap/src/components/portfolio/TokenBalanceItemContextMenu.web.tsx +++ b/packages/uniswap/src/components/portfolio/TokenBalanceItemContextMenu.web.tsx @@ -13,6 +13,7 @@ export function TokenBalanceItemContextMenu({ portfolioBalance, excludedActions, openContractAddressExplainerModal, + openReportTokenModal, copyAddressToClipboard, triggerMode, onPressToken: onPressToken, @@ -27,6 +28,7 @@ export function TokenBalanceItemContextMenu({ tokenSymbolForNotification: portfolioBalance.currencyInfo.currency.symbol, portfolioBalance, openContractAddressExplainerModal, + openReportTokenModal, copyAddressToClipboard, closeMenu, }) diff --git a/packages/uniswap/src/components/portfolio/TokenBalanceListWeb.tsx b/packages/uniswap/src/components/portfolio/TokenBalanceListWeb.tsx index 1634e964ba5..51cabd9d9ed 100644 --- a/packages/uniswap/src/components/portfolio/TokenBalanceListWeb.tsx +++ b/packages/uniswap/src/components/portfolio/TokenBalanceListWeb.tsx @@ -1,4 +1,5 @@ import { NetworkStatus } from '@apollo/client' +import { Currency } from '@uniswap/sdk-core' import { memo, useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' @@ -26,6 +27,7 @@ type TokenBalanceListProps = { onPressReceive: () => void onPressBuy: () => void onPressToken?: (currencyId: CurrencyId) => void + openReportTokenModal: (currency: Currency, isMarkedSpam: Maybe) => void backgroundImageWrapperCallback?: React.FC<{ children: React.ReactNode }> } @@ -35,6 +37,7 @@ export const TokenBalanceListWeb = memo(function _TokenBalanceList({ onPressReceive, onPressBuy, onPressToken, + openReportTokenModal, backgroundImageWrapperCallback, }: TokenBalanceListProps): JSX.Element { return ( @@ -47,6 +50,7 @@ export const TokenBalanceListWeb = memo(function _TokenBalanceList({ > @@ -58,6 +62,7 @@ export const TokenBalanceListWeb = memo(function _TokenBalanceList({ function TokenBalanceListInner({ onPressReceive, onPressBuy, + openReportTokenModal, backgroundImageWrapperCallback, }: Omit): JSX.Element { const { t } = useTranslation() @@ -117,15 +122,25 @@ function TokenBalanceListInner({ )} - + - {hiddenTokensExpanded && } + {hiddenTokensExpanded && ( + + )} ) } -const TokenBalanceItems = ({ animated, rows }: { animated?: boolean; rows: string[] }): JSX.Element => { +const TokenBalanceItems = ({ + animated, + rows, + openReportTokenModal, +}: { + animated?: boolean + rows: string[] + openReportTokenModal: (currency: Currency, isMarkedSpam: Maybe) => void +}): JSX.Element => { return ( {rows.map((balance: TokenBalanceListRow) => { - return + return })} ) } -const TokenBalanceItemRow = memo(function TokenBalanceItemRow({ item }: { item: TokenBalanceListRow }) { +const TokenBalanceItemRow = memo(function TokenBalanceItemRow({ + item, + openReportTokenModal, +}: { + item: TokenBalanceListRow + openReportTokenModal: (currency: Currency, isMarkedSpam: Maybe) => void +}) { const { balancesById, isWarmLoading, onPressToken } = useTokenBalanceListContext() const dispatch = useDispatch() @@ -201,6 +222,9 @@ const TokenBalanceItemRow = memo(function TokenBalanceItemRow({ item }: { item: + openReportTokenModal(portfolioBalance.currencyInfo.currency, portfolioBalance.currencyInfo.isSpam) + } onPressToken={handlePressToken} > = { + title: string + subtitle?: string + value: T +} + +export type ReportModalProps = { + modalName: ModalNameType + icon: GeneratedIcon + reportOptions: ReportOption[] + textOptionValue: T + currency?: Currency + submitReport: ({ checkedItems, reportText }: { checkedItems: Set; reportText: string }) => void +} + +export function ReportTokenModal({ + modalName, + currency, + icon: Icon, + reportOptions, + textOptionValue, + isOpen, + submitReport, + onClose, +}: ReportModalProps & BaseModalProps): JSX.Element { + const { t } = useTranslation() + const [checkedItems, setCheckedItems] = useState>(new Set()) + const [reportText, setReportText] = useState('') + + const { keyboardHeight } = useBottomSheetSafeKeyboard() + + // Clear form whenever a new currency is selected + // biome-ignore lint/correctness/useExhaustiveDependencies: we intentionally retrigger on currency change or open/close + useEffect(() => { + setCheckedItems(new Set()) + setReportText('') + }, [currency, isOpen]) + + const handleItemPress = useEvent((option: T) => { + setCheckedItems((prev) => { + const newSet = new Set(prev) + if (prev.has(option)) { + newSet.delete(option) + } else { + newSet.add(option) + } + return newSet + }) + }) + + return ( + + + {isWebPlatform && !isMobileWeb && ( + + + + )} + + + + + + + {t('reporting.token.report.title.withSymbol', { symbol: currency?.symbol ?? '' })} + + + + {reportOptions.map((option: ReportOption) => { + if (keyboardHeight > 0 && option.value !== textOptionValue) { + return null + } + return ( + handleItemPress(option.value)} + > + handleItemPress(option.value) : undefined} + /> + + + {option.title} + + {option.subtitle && ( + + {option.subtitle} + + )} + + + ) + })} + {checkedItems.has(textOptionValue) && ( + + )} + + + + + + + + ) +} diff --git a/packages/uniswap/src/components/reporting/ReportTokenDataModal.tsx b/packages/uniswap/src/components/reporting/ReportTokenDataModal.tsx new file mode 100644 index 00000000000..f82a6e7aee0 --- /dev/null +++ b/packages/uniswap/src/components/reporting/ReportTokenDataModal.tsx @@ -0,0 +1,101 @@ +import { Currency } from '@uniswap/sdk-core' +import { useMemo } from 'react' +import { useTranslation } from 'react-i18next' +import { useDispatch } from 'react-redux' +import { ChartBarCrossed } from 'ui/src/components/icons/ChartBarCrossed' +import { BaseModalProps } from 'uniswap/src/components/BridgedAsset/BridgedAssetModal' +import { ReportOption, ReportTokenModal } from 'uniswap/src/components/reporting/ReportModal' +import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' +import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' +import { submitTokenDataReport, TokenDataReportOption } from 'uniswap/src/features/reporting/reports' +import { ModalName } from 'uniswap/src/features/telemetry/constants' +import { NATIVE_ANALYTICS_ADDRESS_VALUE } from 'uniswap/src/utils/currencyId' +import { useEvent } from 'utilities/src/react/hooks' + +export type ReportTokenDataModalProps = { + currency?: Currency + isMarkedSpam?: Maybe + onReportSuccess?: () => void +} + +export function ReportTokenDataModal({ + currency, + isOpen, + isMarkedSpam, + onReportSuccess, + onClose, +}: ReportTokenDataModalProps & BaseModalProps): JSX.Element { + const { t } = useTranslation() + const dispatch = useDispatch() + + const submitReport = useEvent( + ({ checkedItems, reportText }: { checkedItems: Set; reportText: string }) => { + if (!currency) { + return + } + + // Submit report to amplitude + submitTokenDataReport({ + chainId: currency.chainId, + tokenAddress: currency.isNative ? NATIVE_ANALYTICS_ADDRESS_VALUE : currency.address, + tokenName: currency.name, + isMarkedSpam, + reportOptions: Array.from(checkedItems), + reportText, + }) + + // Close the modal and register success + onReportSuccess?.() + dispatch( + pushNotification({ + type: AppNotificationType.Success, + title: t('common.reported'), + }), + ) + onClose() + }, + ) + + const reportOptions: ReportOption[] = useMemo( + () => [ + { + title: t('reporting.token.data.options.price.title'), + subtitle: t('reporting.token.data.options.price.subtitle'), + value: TokenDataReportOption.Price, + }, + { + title: t('reporting.token.data.options.volume.title'), + subtitle: t('reporting.token.data.options.volume.subtitle'), + value: TokenDataReportOption.Volume, + }, + { + title: t('reporting.token.data.options.priceChart.title'), + subtitle: t('reporting.token.data.options.priceChart.subtitle'), + value: TokenDataReportOption.PriceChart, + }, + { + title: t('reporting.token.data.options.tokenDetails.title'), + subtitle: t('reporting.token.data.options.tokenDetails.subtitle'), + value: TokenDataReportOption.TokenDetails, + }, + { + title: t('reporting.token.options.other.title'), + value: TokenDataReportOption.Other, + }, + ], + [t], + ) + + return ( + + ) +} diff --git a/packages/uniswap/src/components/reporting/ReportTokenIssueModal.tsx b/packages/uniswap/src/components/reporting/ReportTokenIssueModal.tsx new file mode 100644 index 00000000000..4f487ee8b6a --- /dev/null +++ b/packages/uniswap/src/components/reporting/ReportTokenIssueModal.tsx @@ -0,0 +1,131 @@ +import { Currency } from '@uniswap/sdk-core' +import { TokenReportEventType } from '@universe/api/src/clients/data/createDataServiceApiClient' +import { atom } from 'jotai' +import { useMemo } from 'react' +import { useTranslation } from 'react-i18next' +import { useDispatch } from 'react-redux' +import { Flag } from 'ui/src/components/icons/Flag' +import { BaseModalProps } from 'uniswap/src/components/BridgedAsset/BridgedAssetModal' +import { ReportOption, ReportTokenModal } from 'uniswap/src/components/reporting/ReportModal' +import { DataServiceApiClient } from 'uniswap/src/data/apiClients/dataApi/DataApiClient' +import { normalizeCurrencyIdForMapLookup } from 'uniswap/src/data/cache' +import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' +import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' +import { submitTokenIssueReport, TokenReportOption } from 'uniswap/src/features/reporting/reports' +import { ModalName } from 'uniswap/src/features/telemetry/constants' +import { setTokenVisibility } from 'uniswap/src/features/visibility/slice' +import { currencyId, NATIVE_ANALYTICS_ADDRESS_VALUE } from 'uniswap/src/utils/currencyId' +import { isProdEnv } from 'utilities/src/environment/env' +import { logger } from 'utilities/src/logger/logger' +import { useEvent } from 'utilities/src/react/hooks' + +export type ReportTokenModalProps = { + currency?: Currency + source?: 'portfolio' | 'token-details' + isMarkedSpam?: Maybe + onReportSuccess?: () => void +} + +export const ReportTokenIssueModalPropsAtom = atom< + Pick | undefined +>(undefined) + +export function ReportTokenIssueModal({ + currency, + isOpen, + source = 'token-details', + isMarkedSpam, + onReportSuccess, + onClose, +}: ReportTokenModalProps & BaseModalProps): JSX.Element { + const { t } = useTranslation() + const dispatch = useDispatch() + + const submitReport = useEvent( + async ({ checkedItems, reportText }: { checkedItems: Set; reportText: string }) => { + if (!currency) { + return + } + + // Update the visibility of the token in the portfolio + dispatch( + setTokenVisibility({ currencyId: normalizeCurrencyIdForMapLookup(currencyId(currency)), isVisible: false }), + ) + + // Submit report to amplitude + submitTokenIssueReport({ + source, + chainId: currency.chainId, + tokenAddress: currency.isNative ? NATIVE_ANALYTICS_ADDRESS_VALUE : currency.address, + tokenName: currency.name, + isMarkedSpam, + reportOptions: Array.from(checkedItems), + reportText, + }) + + if (!currency.isNative && isProdEnv()) { + // Submit report directly to the data API, ignoring native tokens + DataServiceApiClient.submitTokenReport({ + chainId: currency.chainId, + address: currency.address, + event: TokenReportEventType.FalseNegative, + }).catch((error: unknown) => { + // Still show success since analytics and local hiding succeeded, but log the issue for monitoring + logger.warn('ReportTokenIssueModal', 'submitReport', 'Failed to submit token report to backend', { + error: error instanceof Error ? error.message : String(error), + chainId: currency.chainId, + address: currency.address, + }) + }) + } + + // Close the modal and register success + onReportSuccess?.() + dispatch( + pushNotification({ + type: AppNotificationType.Success, + title: t('common.reported'), + }), + ) + onClose() + }, + ) + + const reportOptions: ReportOption[] = useMemo( + () => [ + { + title: t('reporting.token.options.spam.title'), + subtitle: t('reporting.token.options.spam.subtitle'), + value: TokenReportOption.Spam, + }, + { + title: t('reporting.token.options.imposter.title'), + subtitle: t('reporting.token.options.imposter.subtitle'), + value: TokenReportOption.Imposter, + }, + { + title: t('reporting.token.options.hiddenFees.title'), + subtitle: t('reporting.token.options.hiddenFees.subtitle'), + value: TokenReportOption.HiddenFees, + }, + { + title: t('reporting.token.options.other.title'), + value: TokenReportOption.Other, + }, + ], + [t], + ) + + return ( + + ) +} diff --git a/packages/uniswap/src/components/reporting/input.tsx b/packages/uniswap/src/components/reporting/input.tsx new file mode 100644 index 00000000000..f2e08666fd1 --- /dev/null +++ b/packages/uniswap/src/components/reporting/input.tsx @@ -0,0 +1,28 @@ +import { fonts } from 'ui/src/theme' +import { TextInput, TextInputProps } from 'uniswap/src/components/input/TextInput' +import { isMobileApp } from 'utilities/src/platform' + +export function ReportInput({ + setReportText, + placeholder, +}: { + placeholder: TextInputProps['placeholder'] + setReportText: TextInputProps['onChangeText'] +}): JSX.Element { + return ( + + ) +} diff --git a/packages/uniswap/src/constants/urls.ts b/packages/uniswap/src/constants/urls.ts index eac8a643e31..34ec4c8d90a 100644 --- a/packages/uniswap/src/constants/urls.ts +++ b/packages/uniswap/src/constants/urls.ts @@ -50,7 +50,7 @@ export const uniswapUrls = { mismatchedImports: createHelpArticleUrl('36393527081997'), mobileWalletHelp: createHelpArticleUrl('20317941356429'), moonpayRegionalAvailability: createHelpArticleUrl('11306664890381-Why-isn-t-MoonPay-available-in-my-region-'), - multichainDelegation: createHelpArticleUrl('36392482755341'), + multichainDelegation: createHelpArticleUrl('36391987158797'), networkFeeInfo: createHelpArticleUrl('8370337377805-What-is-a-network-fee-'), poolOutOfSync: createHelpArticleUrl('25845512413069'), positionsLearnMore: createHelpArticleUrl('8829880740109'), @@ -153,6 +153,7 @@ export const uniswapUrls = { poolInfo: `${tradingApiVersionPrefix}/lp/pool_info`, order: `${tradingApiVersionPrefix}/order`, orders: `${tradingApiVersionPrefix}/orders`, + plan: `${tradingApiVersionPrefix}/plan`, priceDiscrepancy: `${tradingApiVersionPrefix}/lp/price_discrepancy`, quote: `${tradingApiVersionPrefix}/quote`, swap: `${tradingApiVersionPrefix}/swap`, @@ -160,7 +161,6 @@ export const uniswapUrls = { swap7702: `${tradingApiVersionPrefix}/swap_7702`, swappableTokens: `${tradingApiVersionPrefix}/swappable_tokens`, swaps: `${tradingApiVersionPrefix}/swaps`, - trade: `${tradingApiVersionPrefix}/trade`, wallet: { checkDelegation: `${tradingApiVersionPrefix}/wallet/check_delegation`, encode7702: `${tradingApiVersionPrefix}/wallet/encode_7702`, diff --git a/packages/uniswap/src/data/apiClients/createUniswapFetchClient.ts b/packages/uniswap/src/data/apiClients/createUniswapFetchClient.ts index 23a31c8549d..69b9f5ab94b 100644 --- a/packages/uniswap/src/data/apiClients/createUniswapFetchClient.ts +++ b/packages/uniswap/src/data/apiClients/createUniswapFetchClient.ts @@ -1,12 +1,12 @@ import { createFetchClient, type FetchClient } from '@universe/api' import { uniswapUrls } from 'uniswap/src/constants/urls' import { getVersionHeader } from 'uniswap/src/data/constants' -import { isMobileApp } from 'utilities/src/platform' +import { isMobileApp, isWebApp } from 'utilities/src/platform' import { REQUEST_SOURCE } from 'utilities/src/platform/requestSource' export const BASE_UNISWAP_HEADERS = { 'x-request-source': REQUEST_SOURCE, - 'x-app-version': getVersionHeader(), + ...(!isWebApp ? { 'x-app-version': getVersionHeader() } : {}), ...(isMobileApp ? { Origin: uniswapUrls.apiOrigin } : {}), } diff --git a/packages/uniswap/src/data/rest/auctions/auctionService.ts b/packages/uniswap/src/data/rest/auctions/auctionService.ts new file mode 100644 index 00000000000..09530404105 --- /dev/null +++ b/packages/uniswap/src/data/rest/auctions/auctionService.ts @@ -0,0 +1,44 @@ +/** + * TODO | Toucan: Remove these stubs once backend endpoints are available + * Stubbed auction service methods + * + * These are temporary function stubs that throw errors. When the backend generates + * the actual connect-query service, replace this entire file with a single line: + * example: + * export * from '@uniswap/client-data-api/dist/data/v1/api-AuctionService_connectquery' + * + * That will provide the real service methods with proper protobuf Message types. + */ + +import type { + GetAuctionDetailsRequest, + GetAuctionDetailsResponse, + GetAuctionsRequest, + GetAuctionsResponse, + GetBidConcentrationRequest, + GetBidConcentrationResponse, + GetBidsByWalletRequest, + GetBidsByWalletResponse, + GetLatestCheckpointRequest, + GetLatestCheckpointResponse, +} from 'uniswap/src/data/rest/auctions/types' + +export async function getAuctions(_input?: GetAuctionsRequest): Promise { + throw new Error('AuctionService.getAuctions: Not implemented - awaiting backend endpoint') +} + +export async function getBidsByWallet(_input: GetBidsByWalletRequest): Promise { + throw new Error('AuctionService.getBidsByWallet: Not implemented - awaiting backend endpoint') +} + +export async function getBidConcentration(_input: GetBidConcentrationRequest): Promise { + throw new Error('AuctionService.getBidConcentration: Not implemented - awaiting backend endpoint') +} + +export async function getAuctionDetails(_input: GetAuctionDetailsRequest): Promise { + throw new Error('AuctionService.getAuctionDetails: Not implemented - awaiting backend endpoint') +} + +export async function getLatestCheckpoint(_input: GetLatestCheckpointRequest): Promise { + throw new Error('AuctionService.getLatestCheckpoint: Not implemented - awaiting backend endpoint') +} diff --git a/packages/uniswap/src/data/rest/auctions/paths.ts b/packages/uniswap/src/data/rest/auctions/paths.ts new file mode 100644 index 00000000000..f14054e6c12 --- /dev/null +++ b/packages/uniswap/src/data/rest/auctions/paths.ts @@ -0,0 +1,12 @@ +/** + * TODO | Toucan: Update these paths once backend endpoints are finalized + */ +export const AUCTION_API_PATHS = { + getAuctions: '/get-auctions', + getBidsByWallet: '/get-bids-by-wallet', + getBidConcentration: '/get-bid-concentration', + getAuctionDetails: '/get-auction-details', + getLatestCheckpoint: '/get-latest-checkpoint', +} as const + +export type AuctionApiPath = (typeof AUCTION_API_PATHS)[keyof typeof AUCTION_API_PATHS] diff --git a/packages/uniswap/src/data/rest/auctions/types.ts b/packages/uniswap/src/data/rest/auctions/types.ts new file mode 100644 index 00000000000..cb8e071df6a --- /dev/null +++ b/packages/uniswap/src/data/rest/auctions/types.ts @@ -0,0 +1,80 @@ +// TODO | Toucan: remove these types once they can be auto-generated +export interface GetBidsByWalletRequest { + wallet_id: string + auction_id?: string + page_size?: number + page_token?: string +} + +export interface Bid { + bid_id: string + auction_id: string + wallet_id: string + tx_hash: string + tokens_allocated: string + max_price: string + created_at: string + status: string + starting_block: string + base_currency_spent: string + base_currency_initial: string +} + +export interface GetBidsByWalletResponse { + bids: Bid[] + next_page_token?: string +} + +export interface GetBidConcentrationRequest { + auction_id: string +} + +export interface GetBidConcentrationResponse { + /** + * Map of tick_price -> volume + * Represents the distribution of auction bids at all ticks + */ + bid_concentration: Record +} + +export interface Auction { + auction_id: string + chain_id: number + token_symbol: string + token_address: string + token_name: string + creator_address: string + start_block: string + end_block: string + total_supply: string + tick_size: string + graduation_threshold_mps: string + bid_token_address: string +} + +export interface GetAuctionDetailsRequest { + auction_id: string +} + +export interface GetAuctionDetailsResponse { + auction: Auction +} + +export interface GetAuctionsRequest { + page_size?: number + page_token?: string +} + +export interface GetAuctionsResponse { + auctions: Auction[] + next_page_token?: string +} + +export interface GetLatestCheckpointRequest { + auction_id: string +} + +export interface GetLatestCheckpointResponse { + clearing_price: string + cumulative_mps: string +} diff --git a/packages/uniswap/src/data/rest/auctions/useGetAuctionDetailsQuery.ts b/packages/uniswap/src/data/rest/auctions/useGetAuctionDetailsQuery.ts new file mode 100644 index 00000000000..6565b3ad37e --- /dev/null +++ b/packages/uniswap/src/data/rest/auctions/useGetAuctionDetailsQuery.ts @@ -0,0 +1,31 @@ +import { type UseQueryResult, useQuery } from '@tanstack/react-query' +import { getAuctionDetails } from 'uniswap/src/data/rest/auctions/auctionService' +import { AUCTION_API_PATHS } from 'uniswap/src/data/rest/auctions/paths' +import type { GetAuctionDetailsRequest, GetAuctionDetailsResponse } from 'uniswap/src/data/rest/auctions/types' +import { ReactQueryCacheKey } from 'utilities/src/reactQuery/cache' +import { MAX_REACT_QUERY_CACHE_TIME_MS, ONE_SECOND_MS } from 'utilities/src/time/time' + +const STALE_TIME = 5 * 60 * ONE_SECOND_MS + +export function useGetAuctionDetailsQuery({ + input, + enabled = true, + staleTime = STALE_TIME, + gcTime = MAX_REACT_QUERY_CACHE_TIME_MS, + select, +}: { + input: GetAuctionDetailsRequest + enabled?: boolean + staleTime?: number + gcTime?: number + select?: (data: GetAuctionDetailsResponse) => TSelectData +}): UseQueryResult { + return useQuery({ + queryKey: [ReactQueryCacheKey.AuctionApi, AUCTION_API_PATHS.getAuctionDetails, input] as const, + queryFn: async () => getAuctionDetails(input), + enabled, + staleTime, + gcTime, + select, + }) +} diff --git a/packages/uniswap/src/data/rest/auctions/useGetAuctionsQuery.ts b/packages/uniswap/src/data/rest/auctions/useGetAuctionsQuery.ts new file mode 100644 index 00000000000..51d2a5913b6 --- /dev/null +++ b/packages/uniswap/src/data/rest/auctions/useGetAuctionsQuery.ts @@ -0,0 +1,32 @@ +import { keepPreviousData, type UseQueryResult, useQuery } from '@tanstack/react-query' +import { getAuctions } from 'uniswap/src/data/rest/auctions/auctionService' +import { AUCTION_API_PATHS } from 'uniswap/src/data/rest/auctions/paths' +import type { GetAuctionsRequest, GetAuctionsResponse } from 'uniswap/src/data/rest/auctions/types' +import { ReactQueryCacheKey } from 'utilities/src/reactQuery/cache' +import { ONE_SECOND_MS } from 'utilities/src/time/time' + +const STALE_TIME = 60 * ONE_SECOND_MS + +export function useGetAuctionsQuery({ + input, + enabled = true, + staleTime = STALE_TIME, + refetchInterval = false, + select, +}: { + input?: GetAuctionsRequest + enabled?: boolean + staleTime?: number + refetchInterval?: number | false + select?: (data: GetAuctionsResponse) => TSelectData +}): UseQueryResult { + return useQuery({ + queryKey: [ReactQueryCacheKey.AuctionApi, AUCTION_API_PATHS.getAuctions, input] as const, + queryFn: async () => getAuctions(input), + enabled, + staleTime, + refetchInterval, + placeholderData: keepPreviousData, + select, + }) +} diff --git a/packages/uniswap/src/data/rest/auctions/useGetBidConcentrationQuery.ts b/packages/uniswap/src/data/rest/auctions/useGetBidConcentrationQuery.ts new file mode 100644 index 00000000000..b6c356ad746 --- /dev/null +++ b/packages/uniswap/src/data/rest/auctions/useGetBidConcentrationQuery.ts @@ -0,0 +1,31 @@ +import { type UseQueryResult, useQuery } from '@tanstack/react-query' +import { getBidConcentration } from 'uniswap/src/data/rest/auctions/auctionService' +import { AUCTION_API_PATHS } from 'uniswap/src/data/rest/auctions/paths' +import type { GetBidConcentrationRequest, GetBidConcentrationResponse } from 'uniswap/src/data/rest/auctions/types' +import { ReactQueryCacheKey } from 'utilities/src/reactQuery/cache' +import { ONE_SECOND_MS } from 'utilities/src/time/time' + +const STALE_TIME = 30 * ONE_SECOND_MS + +export function useGetBidConcentrationQuery({ + input, + enabled = true, + staleTime = STALE_TIME, + refetchInterval = false, + select, +}: { + input: GetBidConcentrationRequest + enabled?: boolean + staleTime?: number + refetchInterval?: number | false + select?: (data: GetBidConcentrationResponse) => TSelectData +}): UseQueryResult { + return useQuery({ + queryKey: [ReactQueryCacheKey.AuctionApi, AUCTION_API_PATHS.getBidConcentration, input] as const, + queryFn: async () => getBidConcentration(input), + enabled, + staleTime, + refetchInterval, + select, + }) +} diff --git a/packages/uniswap/src/data/rest/auctions/useGetBidsByWalletInfiniteQuery.ts b/packages/uniswap/src/data/rest/auctions/useGetBidsByWalletInfiniteQuery.ts new file mode 100644 index 00000000000..613cb74d66e --- /dev/null +++ b/packages/uniswap/src/data/rest/auctions/useGetBidsByWalletInfiniteQuery.ts @@ -0,0 +1,35 @@ +import { InfiniteData, type UseInfiniteQueryResult, useInfiniteQuery } from '@tanstack/react-query' +import { getBidsByWallet } from 'uniswap/src/data/rest/auctions/auctionService' +import { AUCTION_API_PATHS } from 'uniswap/src/data/rest/auctions/paths' +import type { GetBidsByWalletRequest, GetBidsByWalletResponse } from 'uniswap/src/data/rest/auctions/types' +import { ReactQueryCacheKey } from 'utilities/src/reactQuery/cache' + +export function useGetBidsByWalletInfiniteQuery({ + input, + enabled = true, + staleTime, + refetchInterval = false, +}: { + input: Omit + enabled?: boolean + staleTime?: number + refetchInterval?: number | false +}): UseInfiniteQueryResult, Error> { + return useInfiniteQuery< + GetBidsByWalletResponse, + Error, + InfiniteData, + readonly [ReactQueryCacheKey.AuctionApi, string, Omit, 'infinite'] + >({ + queryKey: [ReactQueryCacheKey.AuctionApi, AUCTION_API_PATHS.getBidsByWallet, input, 'infinite'] as const, + queryFn: async ({ pageParam }): Promise => { + const pageToken = typeof pageParam === 'string' ? pageParam : undefined + return await getBidsByWallet(pageToken ? { ...input, page_token: pageToken } : input) + }, + initialPageParam: undefined as string | undefined, + getNextPageParam: (lastPage): string | undefined => lastPage.next_page_token || undefined, + enabled, + staleTime, + refetchInterval, + }) +} diff --git a/packages/uniswap/src/data/rest/auctions/useGetBidsByWalletQuery.ts b/packages/uniswap/src/data/rest/auctions/useGetBidsByWalletQuery.ts new file mode 100644 index 00000000000..a836da2c5b2 --- /dev/null +++ b/packages/uniswap/src/data/rest/auctions/useGetBidsByWalletQuery.ts @@ -0,0 +1,32 @@ +import { keepPreviousData, type UseQueryResult, useQuery } from '@tanstack/react-query' +import { getBidsByWallet } from 'uniswap/src/data/rest/auctions/auctionService' +import { AUCTION_API_PATHS } from 'uniswap/src/data/rest/auctions/paths' +import type { GetBidsByWalletRequest, GetBidsByWalletResponse } from 'uniswap/src/data/rest/auctions/types' +import { ReactQueryCacheKey } from 'utilities/src/reactQuery/cache' +import { ONE_SECOND_MS } from 'utilities/src/time/time' + +const STALE_TIME = 30 * ONE_SECOND_MS + +export function useGetBidsByWalletQuery({ + input, + enabled = true, + staleTime = STALE_TIME, + refetchInterval = false, + select, +}: { + input: GetBidsByWalletRequest + enabled?: boolean + staleTime?: number + refetchInterval?: number | false + select?: (data: GetBidsByWalletResponse) => TSelectData +}): UseQueryResult { + return useQuery({ + queryKey: [ReactQueryCacheKey.AuctionApi, AUCTION_API_PATHS.getBidsByWallet, input] as const, + queryFn: async () => getBidsByWallet(input), + enabled, + staleTime, + refetchInterval, + placeholderData: keepPreviousData, + select, + }) +} diff --git a/packages/uniswap/src/data/rest/auctions/useGetLatestCheckpointQuery.ts b/packages/uniswap/src/data/rest/auctions/useGetLatestCheckpointQuery.ts new file mode 100644 index 00000000000..5a4bfee8033 --- /dev/null +++ b/packages/uniswap/src/data/rest/auctions/useGetLatestCheckpointQuery.ts @@ -0,0 +1,31 @@ +import { type UseQueryResult, useQuery } from '@tanstack/react-query' +import { getLatestCheckpoint } from 'uniswap/src/data/rest/auctions/auctionService' +import { AUCTION_API_PATHS } from 'uniswap/src/data/rest/auctions/paths' +import type { GetLatestCheckpointRequest, GetLatestCheckpointResponse } from 'uniswap/src/data/rest/auctions/types' +import { ReactQueryCacheKey } from 'utilities/src/reactQuery/cache' +import { ONE_SECOND_MS } from 'utilities/src/time/time' + +const STALE_TIME = 2 * ONE_SECOND_MS + +export function useGetLatestCheckpointQuery({ + input, + enabled = true, + staleTime = STALE_TIME, + refetchInterval = false, + select, +}: { + input: GetLatestCheckpointRequest + enabled?: boolean + staleTime?: number + refetchInterval?: number | false + select?: (data: GetLatestCheckpointResponse) => TSelectData +}): UseQueryResult { + return useQuery({ + queryKey: [ReactQueryCacheKey.AuctionApi, AUCTION_API_PATHS.getLatestCheckpoint, input] as const, + queryFn: async () => getLatestCheckpoint(input), + enabled, + staleTime, + refetchInterval, + select, + }) +} diff --git a/packages/uniswap/src/data/rest/base.ts b/packages/uniswap/src/data/rest/base.ts index 6371e2e9119..f08bd4ed1e8 100644 --- a/packages/uniswap/src/data/rest/base.ts +++ b/packages/uniswap/src/data/rest/base.ts @@ -1,29 +1,29 @@ -import { createConnectTransportWithDefaults } from '@universe/api' +import { Transport } from '@connectrpc/connect' +import { ConnectTransportOptions } from '@connectrpc/connect-web' +import { getTransport } from '@universe/api' import { uniswapUrls } from 'uniswap/src/constants/urls' import { BASE_UNISWAP_HEADERS } from 'uniswap/src/data/apiClients/createUniswapFetchClient' import { isMobileApp } from 'utilities/src/platform' +export const createConnectTransportWithDefaults = (options: Partial = {}): Transport => + getTransport({ + getBaseUrl: () => uniswapUrls.apiBaseUrlV2, + getHeaders: () => (isMobileApp ? BASE_UNISWAP_HEADERS : {}), + options, + }) + /** * Connectrpc transports for Uniswap REST BE service */ -export const uniswapGetTransport = createConnectTransportWithDefaults( - { - baseUrl: uniswapUrls.apiBaseUrlV2, - // Mobile app needs to manually set headers - additionalHeaders: isMobileApp ? BASE_UNISWAP_HEADERS : undefined, - }, - { useHttpGet: true }, -) +export const uniswapGetTransport = createConnectTransportWithDefaults({ useHttpGet: true }) +export const uniswapPostTransport = createConnectTransportWithDefaults() -export const uniswapPostTransport = createConnectTransportWithDefaults({ - baseUrl: uniswapUrls.apiBaseUrlV2, - // Mobile app needs to manually set headers - additionalHeaders: isMobileApp ? BASE_UNISWAP_HEADERS : undefined, -}) +// The string arg to pass to the BE for chainId to get data for all networks +export const ALL_NETWORKS_ARG = 'ALL_NETWORKS' /** * To add a ConnectRPC hook for a new BE client service: - * 1. Create a new file in the appropriate directory with a name matching the service + * 1. Create a new file in the `data/rest` directory with a name matching the service * 2. Copy the below template replacing `newService` with the service name * a. The client service, Request, and Response types are imported from the generated client * b. You can use exploreStats as a reference for how to structure the hook diff --git a/packages/uniswap/src/data/rest/getPools.ts b/packages/uniswap/src/data/rest/getPools.ts index 1dcc0a98ead..27b908c8e6c 100644 --- a/packages/uniswap/src/data/rest/getPools.ts +++ b/packages/uniswap/src/data/rest/getPools.ts @@ -7,8 +7,8 @@ import { listPools } from '@uniswap/client-data-api/dist/data/v1/api-DataApiServ import { uniswapGetTransport } from 'uniswap/src/data/rest/base' export function useGetPoolsByTokens( - input?: PartialMessage, - enabled = true, + input: PartialMessage, + enabled: boolean, ): UseQueryResult { return useQuery(listPools, input, { transport: uniswapGetTransport, enabled }) } diff --git a/packages/uniswap/src/data/rest/listTransactions.ts b/packages/uniswap/src/data/rest/listTransactions.ts index b0e63b6787a..49590586111 100644 --- a/packages/uniswap/src/data/rest/listTransactions.ts +++ b/packages/uniswap/src/data/rest/listTransactions.ts @@ -1,6 +1,13 @@ import { PartialMessage } from '@bufbuild/protobuf' import { createPromiseClient } from '@connectrpc/connect' -import { queryOptions, UseQueryResult, useQuery } from '@tanstack/react-query' +import { + InfiniteData, + infiniteQueryOptions, + queryOptions, + UseInfiniteQueryOptions, + UseInfiniteQueryResult, + useInfiniteQuery, +} from '@tanstack/react-query' import { DataApiService } from '@uniswap/client-data-api/dist/data/v1/api_connect' import { ListTransactionsRequest, ListTransactionsResponse } from '@uniswap/client-data-api/dist/data/v1/api_pb' import { transformInput, WithoutWalletAccount } from '@universe/api' @@ -19,17 +26,30 @@ type GetListTransactionsInput = { } } & Pick, 'enabled' | 'refetchInterval' | 'select'> +type GetListTransactionsInfiniteInput = { + input?: WithoutWalletAccount> & { + evmAddress?: string + svmAddress?: string + } + enabled?: boolean + refetchInterval?: number +} + const transactionsClient = createPromiseClient(DataApiService, uniswapGetTransport) +const EMPTY_LIST_RESPONSE = new ListTransactionsResponse({ + transactions: [], + nextPageToken: undefined, +}) + /** - * Wrapper around query for DataApiService/ListTransactions - * This fetches data for user transactions + * Wrapper around infinite query for DataApiService/ListTransactions + * This fetches data for user transactions with infinite scrolling support */ -export function useListTransactionsQuery( - params: GetListTransactionsInput, -): UseQueryResult { - // TODO(WALL-6996): use useInfiniteQuery to support infinite scrolling and pagination - return useQuery(getListTransactionsQuery(params)) +export function useListTransactionsQuery( + params: GetListTransactionsInfiniteInput, +): UseInfiniteQueryResult, Error> { + return useInfiniteQuery(getListTransactionsInfiniteQuery(params)) } type GetListTransactionsQuery = QueryOptionsResult< @@ -43,6 +63,49 @@ type GetListTransactionsQuery = QueryOpt ] > +type GetListTransactionsInfiniteQuery = UseInfiniteQueryOptions< + ListTransactionsResponse, + Error, + InfiniteData, + ListTransactionsResponse, + (Record | undefined)[], + string | undefined +> + +export const getListTransactionsInfiniteQuery = ({ + input, + enabled, + refetchInterval, +}: GetListTransactionsInfiniteInput): GetListTransactionsInfiniteQuery => { + const transformedInput = transformInput(input) + + const { walletAccount, ...inputWithoutAddress } = transformedInput ?? {} + const address = walletAccount?.platformAddresses[0]?.address + + return infiniteQueryOptions({ + queryKey: [ReactQueryCacheKey.ListTransactions, address, inputWithoutAddress], + queryFn: ({ pageParam }: { pageParam?: string }) => { + if (!transformedInput) { + return Promise.resolve(EMPTY_LIST_RESPONSE) + } + + const requestWithPageToken = { + ...transformedInput, + pageToken: pageParam, + } + + return transactionsClient.listTransactions(requestWithPageToken) + }, + initialPageParam: undefined, + getNextPageParam: (lastPage) => { + return lastPage.nextPageToken || undefined + }, + placeholderData: (prev) => prev, // this prevents the loading skeleton from appearing when refetching + refetchInterval, + enabled: !!input && enabled, + }) +} + export const getListTransactionsQuery = ({ input, enabled, diff --git a/packages/uniswap/src/dialog-preferences/DialogPreferencesService.ts b/packages/uniswap/src/dialog-preferences/DialogPreferencesService.ts new file mode 100644 index 00000000000..5b437a68e68 --- /dev/null +++ b/packages/uniswap/src/dialog-preferences/DialogPreferencesService.ts @@ -0,0 +1,40 @@ +/** + * Service for managing dialog visibility preferences (e.g., "don't show again" functionality) + */ +export interface DialogPreferencesService { + /** + * Check if a dialog should be shown to the user + * @param dialogId Unique identifier for the dialog + * @returns true if dialog should be shown, false if user has hidden it + */ + shouldShowDialog(dialogId: string): Promise + + /** + * Mark a dialog as hidden (user selected "don't show again") + * @param dialogId Unique identifier for the dialog + */ + markDialogHidden(dialogId: string): Promise + + /** + * Reset a dialog's visibility preference (show it again) + * @param dialogId Unique identifier for the dialog + */ + resetDialog(dialogId: string): Promise +} + +/** + * Storage driver interface for persisting dialog preferences + * TODO: remove this when the packages/utilities implementation is merged (PR #23685) + */ +export interface StorageDriver { + get(key: string): Promise + set(key: string, value: string): Promise + remove(key: string): Promise +} + +/** + * Context/dependencies for creating a DialogPreferencesService + */ +export interface DialogPreferencesServiceContext { + storage: StorageDriver +} diff --git a/packages/uniswap/src/dialog-preferences/implementations/createDialogPreferencesService.test.ts b/packages/uniswap/src/dialog-preferences/implementations/createDialogPreferencesService.test.ts new file mode 100644 index 00000000000..776fae2eefd --- /dev/null +++ b/packages/uniswap/src/dialog-preferences/implementations/createDialogPreferencesService.test.ts @@ -0,0 +1,156 @@ +import type { StorageDriver } from 'uniswap/src/dialog-preferences' +import { createDialogPreferencesService } from 'uniswap/src/dialog-preferences' +import { logger } from 'utilities/src/logger/logger' + +jest.mock('utilities/src/logger/logger', () => ({ + logger: { + debug: jest.fn(), + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), + }, +})) + +describe('createDialogPreferencesService', () => { + let mockStorage: jest.Mocked + + beforeEach(() => { + mockStorage = { + get: jest.fn(), + set: jest.fn(), + remove: jest.fn(), + } + jest.clearAllMocks() + }) + + describe('shouldShowDialog', () => { + it('returns true when dialog has not been hidden', async () => { + mockStorage.get.mockResolvedValue(null) + const service = createDialogPreferencesService({ storage: mockStorage }) + + const result = await service.shouldShowDialog('test-dialog') + + expect(result).toBe(true) + expect(mockStorage.get).toHaveBeenCalledWith('uniswap-dialog_hidden_test-dialog') + }) + + it('returns false when dialog has been hidden', async () => { + mockStorage.get.mockResolvedValue(JSON.stringify({ hidden: true })) + const service = createDialogPreferencesService({ storage: mockStorage }) + + const result = await service.shouldShowDialog('test-dialog') + + expect(result).toBe(false) + expect(mockStorage.get).toHaveBeenCalledWith('uniswap-dialog_hidden_test-dialog') + }) + + it('returns true when storage get fails (graceful degradation)', async () => { + const error = new Error('Storage unavailable') + mockStorage.get.mockRejectedValue(error) + const service = createDialogPreferencesService({ storage: mockStorage }) + + const result = await service.shouldShowDialog('test-dialog') + + expect(result).toBe(true) + expect(logger.error).toHaveBeenCalledWith(error, { + tags: { file: 'createDialogPreferencesService', function: 'shouldShowDialog' }, + extra: { dialogId: 'test-dialog' }, + }) + }) + + it('handles different dialog IDs independently', async () => { + mockStorage.get.mockImplementation(async (key) => { + if (key === 'uniswap-dialog_hidden_dialog-a') { + return JSON.stringify({ hidden: true }) + } + return null + }) + const service = createDialogPreferencesService({ storage: mockStorage }) + + const resultA = await service.shouldShowDialog('dialog-a') + const resultB = await service.shouldShowDialog('dialog-b') + + expect(resultA).toBe(false) + expect(resultB).toBe(true) + }) + }) + + describe('markDialogHidden', () => { + it('stores the hidden preference', async () => { + mockStorage.set.mockResolvedValue(undefined) + const service = createDialogPreferencesService({ storage: mockStorage }) + + await service.markDialogHidden('test-dialog') + + expect(mockStorage.set).toHaveBeenCalledWith( + 'uniswap-dialog_hidden_test-dialog', + JSON.stringify({ hidden: true }), + ) + }) + + it('handles storage failures gracefully', async () => { + const error = new Error('Storage full') + mockStorage.set.mockRejectedValue(error) + const service = createDialogPreferencesService({ storage: mockStorage }) + + await expect(service.markDialogHidden('test-dialog')).resolves.toBeUndefined() + + expect(logger.error).toHaveBeenCalledWith(error, { + tags: { file: 'createDialogPreferencesService', function: 'markDialogHidden' }, + extra: { dialogId: 'test-dialog' }, + }) + }) + }) + + describe('resetDialog', () => { + it('removes the hidden preference', async () => { + mockStorage.remove.mockResolvedValue(undefined) + const service = createDialogPreferencesService({ storage: mockStorage }) + + await service.resetDialog('test-dialog') + + expect(mockStorage.remove).toHaveBeenCalledWith('uniswap-dialog_hidden_test-dialog') + }) + + it('handles storage failures gracefully', async () => { + const error = new Error('Storage unavailable') + mockStorage.remove.mockRejectedValue(error) + const service = createDialogPreferencesService({ storage: mockStorage }) + + await expect(service.resetDialog('test-dialog')).resolves.toBeUndefined() + + expect(logger.error).toHaveBeenCalledWith(error, { + tags: { file: 'createDialogPreferencesService', function: 'resetDialog' }, + extra: { dialogId: 'test-dialog' }, + }) + }) + }) + + describe('full workflow', () => { + it('handles show -> hide -> reset -> show cycle', async () => { + const storage = new Map() + const workingStorage: StorageDriver = { + get: async (key) => storage.get(key) ?? null, + set: async (key, value) => { + storage.set(key, value) + }, + remove: async (key) => { + storage.delete(key) + }, + } + + const service = createDialogPreferencesService({ storage: workingStorage }) + + // Initially should show + expect(await service.shouldShowDialog('workflow-test')).toBe(true) + + // Hide the dialog + await service.markDialogHidden('workflow-test') + expect(await service.shouldShowDialog('workflow-test')).toBe(false) + + // Reset the dialog + await service.resetDialog('workflow-test') + expect(await service.shouldShowDialog('workflow-test')).toBe(true) + }) + }) +}) diff --git a/packages/uniswap/src/dialog-preferences/implementations/createDialogPreferencesService.ts b/packages/uniswap/src/dialog-preferences/implementations/createDialogPreferencesService.ts new file mode 100644 index 00000000000..d96147df6ec --- /dev/null +++ b/packages/uniswap/src/dialog-preferences/implementations/createDialogPreferencesService.ts @@ -0,0 +1,60 @@ +import type { + DialogPreferencesService, + DialogPreferencesServiceContext, +} from 'uniswap/src/dialog-preferences/DialogPreferencesService' +import { logger } from 'utilities/src/logger/logger' + +const STORAGE_KEY_PREFIX = 'dialog_hidden_' +const getStorageKey = (dialogId: string): string => `uniswap-${STORAGE_KEY_PREFIX}${dialogId}` + +/** + * Creates a dialog preferences service that manages "don't show again" preferences + * @param ctx Context containing storage driver dependency + * @returns DialogPreferencesService instance + */ +export function createDialogPreferencesService(ctx: DialogPreferencesServiceContext): DialogPreferencesService { + const { storage } = ctx + + return { + async shouldShowDialog(dialogId: string): Promise { + try { + const key = getStorageKey(dialogId) + const value = await storage.get(key) + return JSON.parse(value ?? '{}').hidden !== true + } catch (error) { + // If storage fails, default to showing the dialog + logger.error(error, { + tags: { file: 'createDialogPreferencesService', function: 'shouldShowDialog' }, + extra: { dialogId }, + }) + return true + } + }, + + async markDialogHidden(dialogId: string): Promise { + try { + const key = getStorageKey(dialogId) + await storage.set(key, JSON.stringify({ hidden: true })) + } catch (error) { + // Silent failure - user's preference won't be saved but doesn't break UX + logger.error(error, { + tags: { file: 'createDialogPreferencesService', function: 'markDialogHidden' }, + extra: { dialogId }, + }) + } + }, + + async resetDialog(dialogId: string): Promise { + try { + const key = getStorageKey(dialogId) + await storage.remove(key) + } catch (error) { + // Silent failure - dialog will remain hidden but doesn't break UX + logger.error(error, { + tags: { file: 'createDialogPreferencesService', function: 'resetDialog' }, + extra: { dialogId }, + }) + } + }, + } +} diff --git a/packages/uniswap/src/dialog-preferences/index.ts b/packages/uniswap/src/dialog-preferences/index.ts new file mode 100644 index 00000000000..46dcecc7efd --- /dev/null +++ b/packages/uniswap/src/dialog-preferences/index.ts @@ -0,0 +1,8 @@ +/* eslint-disable check-file/no-index */ + +export type { + DialogPreferencesService, + DialogPreferencesServiceContext, + StorageDriver, +} from 'uniswap/src/dialog-preferences/DialogPreferencesService' +export { createDialogPreferencesService } from 'uniswap/src/dialog-preferences/implementations/createDialogPreferencesService' diff --git a/packages/uniswap/src/features/accounts/AccountIcon.tsx b/packages/uniswap/src/features/accounts/AccountIcon.tsx index 8943940e84c..161cce48342 100644 --- a/packages/uniswap/src/features/accounts/AccountIcon.tsx +++ b/packages/uniswap/src/features/accounts/AccountIcon.tsx @@ -41,6 +41,8 @@ export function AccountIcon({ const avatarUri = avatarUriOverride || avatar + const sizeTransitionStyle = transition ? { transition } : {} + return ( - onPressEmptyState?: () => void skip?: boolean extraTransactions?: ActivityItem[] + onPressEmptyState?: () => void } -export type ActivityRenderData = { +export type ActivityRenderData = PaginationControls & { maybeEmptyComponent: JSX.Element | null renderActivityItem: ActivityItemRenderer sectionData: ActivityItem[] | undefined keyExtractor: (item: ActivityItem) => string + isLoading: boolean + refetch: () => Promise } export function useActivityData({ @@ -64,14 +67,15 @@ export function useActivityData({ }) }, [swapCallbacks, authTrigger]) - const { onRetry, isError, sectionData, keyExtractor } = useFormattedTransactionDataForActivity({ - evmAddress: evmOwner, - svmAddress: svmOwner, - ownerAddresses, - fiatOnRampParams, - hideSpamTokens, - skip, - }) + const { isLoading, onRetry, isError, sectionData, keyExtractor, fetchNextPage, hasNextPage, isFetchingNextPage } = + useFormattedTransactionDataForActivity({ + evmAddress: evmOwner, + svmAddress: svmOwner, + ownerAddresses, + fiatOnRampParams, + hideSpamTokens, + skip, + }) const sectionDataWithExtra: ActivityItem[] | undefined = useMemo(() => { if (extraTransactions?.length) { @@ -121,6 +125,11 @@ export function useActivityData({ renderActivityItem, sectionData: sectionDataWithExtra, keyExtractor, + fetchNextPage, + hasNextPage, + isFetchingNextPage, + isLoading, + refetch: onRetry, } } diff --git a/packages/uniswap/src/features/activity/hooks/useFormattedTransactionDataForActivity.ts b/packages/uniswap/src/features/activity/hooks/useFormattedTransactionDataForActivity.ts index 6519d4da676..dcd8b2f036d 100644 --- a/packages/uniswap/src/features/activity/hooks/useFormattedTransactionDataForActivity.ts +++ b/packages/uniswap/src/features/activity/hooks/useFormattedTransactionDataForActivity.ts @@ -11,15 +11,24 @@ import { isLoadingItem, isSectionHeader, LoadingItem } from 'uniswap/src/compone import { formatTransactionsByDate } from 'uniswap/src/features/activity/formatTransactionsByDate' import { useMergeLocalAndRemoteTransactions } from 'uniswap/src/features/activity/hooks/useMergeLocalAndRemoteTransactions' import { useListTransactions } from 'uniswap/src/features/dataApi/listTransactions/listTransactions' +import { PaginationControls } from 'uniswap/src/features/dataApi/types' import { useLocalizedDayjs } from 'uniswap/src/features/language/localizedDayjs' import { useCurrencyIdToVisibility } from 'uniswap/src/features/transactions/selectors' import { TransactionDetails } from 'uniswap/src/features/transactions/types/transactionDetails' import { isLimitOrder } from 'uniswap/src/features/transactions/utils/uniswapX.utils' import { selectNftsVisibility } from 'uniswap/src/features/visibility/selectors' +import { isAndroid } from 'utilities/src/platform' const LOADING_ITEM = (index: number): LoadingItem => ({ itemType: 'LOADING', id: index }) const LOADING_DATA = [LOADING_ITEM(1), LOADING_ITEM(2), LOADING_ITEM(3), LOADING_ITEM(4)] +const MAX_ACTIVITY_ITEMS = isAndroid ? 100 : 250 + +function hasReachedLimit(transactions: TransactionDetails[] | undefined): boolean { + const currentTransactionCount = transactions?.length ?? 0 + return currentTransactionCount >= MAX_ACTIVITY_ITEMS +} + // Contract for returning Transaction data type TransactionListQueryArgs = QueryHookOptions< @@ -38,13 +47,13 @@ interface UseFormattedTransactionDataOptions { type FormattedTransactionInputs = UseFormattedTransactionDataOptions & TransactionListQueryArgs -export interface FormattedTransactionDataResult { +export interface FormattedTransactionDataResult extends PaginationControls { hasData: boolean isLoading: boolean isError: Error | undefined sectionData: ActivityItem[] | undefined keyExtractor: (item: ActivityItem) => string - onRetry: () => void + onRetry: () => Promise skip?: boolean } @@ -71,6 +80,9 @@ export function useFormattedTransactionDataForActivity({ error, refetch, networkStatus, + fetchNextPage, + hasNextPage, + isFetchingNextPage, } = useListTransactions({ evmAddress, svmAddress, @@ -145,6 +157,9 @@ export function useFormattedTransactionDataForActivity({ isError: error ?? undefined, isLoading: loading, keyExtractor, + fetchNextPage, + hasNextPage: hasNextPage && !hasReachedLimit(transactions), + isFetchingNextPage, } } diff --git a/packages/uniswap/src/features/activity/hooks/useTransactionActions.tsx b/packages/uniswap/src/features/activity/hooks/useTransactionActions.tsx index 04eca5b78cf..e3a45cb0be1 100644 --- a/packages/uniswap/src/features/activity/hooks/useTransactionActions.tsx +++ b/packages/uniswap/src/features/activity/hooks/useTransactionActions.tsx @@ -1,7 +1,9 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { providers } from 'ethers/lib/ethers' import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' +import { Eye, Flag } from 'ui/src/components/icons' import { Clear } from 'ui/src/components/icons/Clear' import { CopySheets } from 'ui/src/components/icons/CopySheets' import { HelpCenter } from 'ui/src/components/icons/HelpCenter' @@ -13,6 +15,7 @@ import { AccountType } from 'uniswap/src/features/accounts/types' import { AuthTrigger } from 'uniswap/src/features/auth/types' import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' import { AppNotificationType, CopyNotificationType } from 'uniswap/src/features/notifications/slice/types' +import { submitActivitySpamReport } from 'uniswap/src/features/reporting/reports' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { CancelConfirmationView } from 'uniswap/src/features/transactions/components/cancel/CancelConfirmationView' import { useIsCancelable } from 'uniswap/src/features/transactions/hooks/useIsCancelable' @@ -24,12 +27,16 @@ import { TransactionType, } from 'uniswap/src/features/transactions/types/transactionDetails' import { isFinalizedTx } from 'uniswap/src/features/transactions/types/utils' +import { useIsActivityHidden } from 'uniswap/src/features/visibility/hooks/useIsActivityHidden' +import { setActivityVisibility } from 'uniswap/src/features/visibility/slice' import { useWallet } from 'uniswap/src/features/wallet/hooks/useWallet' import { setClipboard } from 'uniswap/src/utils/clipboard' import { openFORSupportLink, openUri } from 'uniswap/src/utils/linking' import { logger } from 'utilities/src/logger/logger' import { isWebPlatform } from 'utilities/src/platform' import { useEvent } from 'utilities/src/react/hooks' +import { noop } from 'utilities/src/react/noop' +import { ONE_SECOND_MS } from 'utilities/src/time/time' enum SupportLinkParams { WalletAddress = 'tf_11041337007757', @@ -39,11 +46,17 @@ enum SupportLinkParams { } export function useTransactionActions({ - authTrigger, transaction, + authTrigger, + onClose, + onReportTransaction, + onUnhideTransaction, }: { - authTrigger?: AuthTrigger transaction: TransactionDetails + authTrigger?: AuthTrigger + onClose?: () => void + onReportTransaction?: () => void + onUnhideTransaction?: () => void }): { renderModals: () => JSX.Element openCancelModal: () => void @@ -60,7 +73,12 @@ export function useTransactionActions({ const isCancelable = useIsCancelable(transaction) && !readonly - const baseActionItems = useTransactionActionItems(transaction) + const baseActionItems = useTransactionActionItems({ + transactionDetails: transaction, + onClose: onClose ?? noop, + onReportTransaction, + onUnhideTransaction, + }) const handleCancel = useEvent((txRequest: providers.TransactionRequest): void => { dispatch( @@ -131,12 +149,23 @@ export function useTransactionActions({ } } -function useTransactionActionItems(transactionDetails: TransactionDetails): MenuOptionItem[] { +function useTransactionActionItems({ + transactionDetails, + onClose, + onReportTransaction, + onUnhideTransaction, +}: { + transactionDetails: TransactionDetails + onClose: () => void + onReportTransaction?: () => void + onUnhideTransaction?: () => void +}): MenuOptionItem[] { const { t } = useTranslation() const dispatch = useDispatch() - const transactionId = getTransactionId(transactionDetails) + const isHiddenActivity = useIsActivityHidden(transactionDetails.id) + const onRampProviderName = transactionDetails.typeInfo.type === TransactionType.OnRampPurchase || transactionDetails.typeInfo.type === TransactionType.OnRampTransfer || @@ -144,8 +173,10 @@ function useTransactionActionItems(transactionDetails: TransactionDetails): Menu ? transactionDetails.typeInfo.serviceProvider.name : undefined - const items: MenuOptionItem[] = useMemo(() => { - const _items: MenuOptionItem[] = [] + const isDataReportingAbilitiesEnabled = useFeatureFlag(FeatureFlags.DataReportingAbilities) + + const transactionActionItems: MenuOptionItem[] = useMemo(() => { + const items: MenuOptionItem[] = [] if (transactionId) { const copyLabel = onRampProviderName @@ -154,7 +185,7 @@ function useTransactionActionItems(transactionDetails: TransactionDetails): Menu }) : t('transaction.action.copy') - _items.push({ + items.push({ label: copyLabel, Icon: CopySheets, onPress: async (): Promise => { @@ -169,7 +200,7 @@ function useTransactionActionItems(transactionDetails: TransactionDetails): Menu }) } - _items.push({ + items.push({ label: t('settings.action.help'), Icon: HelpCenter, onPress: async (): Promise => { @@ -183,7 +214,7 @@ function useTransactionActionItems(transactionDetails: TransactionDetails): Menu transactionDetails.options.timeoutTimestampMs && transactionDetails.options.timeoutTimestampMs < Date.now() ) { - _items.push({ + items.push({ label: t('transaction.action.clear'), Icon: Clear, onPress: async (): Promise => { @@ -192,10 +223,67 @@ function useTransactionActionItems(transactionDetails: TransactionDetails): Menu }) } - return _items - }, [dispatch, onRampProviderName, t, transactionDetails, transactionId]) + if (isDataReportingAbilitiesEnabled) { + if (isHiddenActivity) { + items.push({ + label: t('reporting.activity.unhide.action'), + Icon: Eye, + onPress: async (): Promise => { + // Set visibility to true + dispatch(setActivityVisibility({ transactionId: transactionDetails.id, isVisible: true })) + + // Show unhiding success + onUnhideTransaction?.() + dispatch( + pushNotification({ + type: AppNotificationType.AssetVisibility, + visible: false, + hideDelay: 2 * ONE_SECOND_MS, + assetName: t('common.activity'), + }), + ) + }, + }) + } else { + items.push({ + label: t('nft.reportSpam'), + Icon: Flag, + destructive: true, + onPress: async (): Promise => { + // Send analytics report + submitActivitySpamReport({ transactionDetails }) + // Set visibility to false + dispatch(setActivityVisibility({ transactionId: transactionDetails.id, isVisible: false })) + // Report success + onReportTransaction?.() + dispatch( + pushNotification({ + type: AppNotificationType.Success, + title: t('common.reported'), + }), + ) + // close modal + onClose() + }, + }) + } + } + + return items + }, [ + dispatch, + onRampProviderName, + t, + transactionDetails, + transactionId, + onClose, + isDataReportingAbilitiesEnabled, + onReportTransaction, + onUnhideTransaction, + isHiddenActivity, + ]) - return items + return transactionActionItems } async function openSupportLink(transactionDetails: TransactionDetails): Promise { diff --git a/packages/uniswap/src/features/activity/utils/getTransactionSummaryTitle.ts b/packages/uniswap/src/features/activity/utils/getTransactionSummaryTitle.ts index 6cf0d81dbed..0c023f52e7d 100644 --- a/packages/uniswap/src/features/activity/utils/getTransactionSummaryTitle.ts +++ b/packages/uniswap/src/features/activity/utils/getTransactionSummaryTitle.ts @@ -1,6 +1,7 @@ import { AppTFunction } from 'ui/src/i18n/types' import { NFTTradeType, + REVOKE_APPROVAL_AMOUNT, TransactionDetails, TransactionStatus, TransactionType, @@ -107,7 +108,7 @@ function getTransactionTypeVerbs( } } case TransactionType.Approve: - if (typeInfo.approvalAmount === '0.0') { + if (typeInfo.approvalAmount === REVOKE_APPROVAL_AMOUNT) { return { success: externalDappName ? t('transaction.status.revoke.successDapp', { externalDappName }) diff --git a/packages/uniswap/src/features/dataApi/listTransactions/listTransactions.test.ts b/packages/uniswap/src/features/dataApi/listTransactions/listTransactions.test.ts index 86b169850f0..3f064f4f851 100644 --- a/packages/uniswap/src/features/dataApi/listTransactions/listTransactions.test.ts +++ b/packages/uniswap/src/features/dataApi/listTransactions/listTransactions.test.ts @@ -1,5 +1,6 @@ import { renderHook } from '@testing-library/react' import { useListTransactions } from 'uniswap/src/features/dataApi/listTransactions/listTransactions' +import { renderHookWithProviders } from 'uniswap/src/test/render' // Mock the chains hook jest.mock('uniswap/src/features/chains/hooks/useEnabledChains', () => ({ @@ -29,11 +30,14 @@ describe('useListTransactions', () => { error: undefined, refetch: jest.fn(), status: 'success', + fetchNextPage: jest.fn(), + hasNextPage: false, + isFetchingNextPage: false, }) }) it('should call REST API with correct parameters and return expected properties', () => { - const { result } = renderHook(() => + const { result } = renderHookWithProviders(() => useListTransactions({ evmAddress: mockAddress, pageSize: mockPageSize, @@ -45,6 +49,9 @@ describe('useListTransactions', () => { expect(result.current).toHaveProperty('networkStatus') expect(result.current).toHaveProperty('refetch') expect(result.current).toHaveProperty('error') + expect(result.current).toHaveProperty('fetchNextPage') + expect(result.current).toHaveProperty('hasNextPage') + expect(result.current).toHaveProperty('isFetchingNextPage') // Verify REST hook was called with correct parameters expect(mockUseListTransactionsQuery).toHaveBeenCalledWith({ @@ -55,12 +62,11 @@ describe('useListTransactions', () => { fiatOnRampParams: undefined, }, enabled: true, - select: expect.any(Function), }) }) it('should skip REST API when address is not provided', () => { - const { result } = renderHook(() => + const { result } = renderHookWithProviders(() => useListTransactions({ pageSize: mockPageSize, }), @@ -82,7 +88,6 @@ describe('useListTransactions', () => { fiatOnRampParams: undefined, }, enabled: false, - select: expect.any(Function), }) }) @@ -96,9 +101,12 @@ describe('useListTransactions', () => { error: undefined, refetch: mockRefetch, status: 'success', + fetchNextPage: jest.fn(), + hasNextPage: false, + isFetchingNextPage: false, }) - const { result } = renderHook(() => + const { result } = renderHookWithProviders(() => useListTransactions({ evmAddress: mockAddress, pageSize: mockPageSize, @@ -118,14 +126,13 @@ describe('useListTransactions', () => { fiatOnRampParams: undefined, }, enabled: false, - select: expect.any(Function), }) }) it('should pass fiatOnRampParams to REST API', () => { const mockFiatOnRampParams = {} as const - renderHook(() => + renderHookWithProviders(() => useListTransactions({ evmAddress: mockAddress, pageSize: mockPageSize, @@ -142,14 +149,13 @@ describe('useListTransactions', () => { fiatOnRampParams: mockFiatOnRampParams, }, enabled: true, - select: expect.any(Function), }) }) it('should use custom chainIds when provided', () => { const customChainIds = [42, 137] - renderHook(() => + renderHookWithProviders(() => useListTransactions({ evmAddress: mockAddress, pageSize: mockPageSize, @@ -166,7 +172,6 @@ describe('useListTransactions', () => { fiatOnRampParams: undefined, }, enabled: true, - select: expect.any(Function), }) }) }) diff --git a/packages/uniswap/src/features/dataApi/listTransactions/listTransactions.ts b/packages/uniswap/src/features/dataApi/listTransactions/listTransactions.ts index 857dbd10c1a..1d815fbb29e 100644 --- a/packages/uniswap/src/features/dataApi/listTransactions/listTransactions.ts +++ b/packages/uniswap/src/features/dataApi/listTransactions/listTransactions.ts @@ -1,18 +1,22 @@ import { PartialMessage } from '@bufbuild/protobuf' import { FiatOnRampParams, ListTransactionsResponse } from '@uniswap/client-data-api/dist/data/v1/api_pb' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' +import { useMemo } from 'react' +import { useSelector } from 'react-redux' import { useListTransactionsQuery } from 'uniswap/src/data/rest/listTransactions' import { parseRestResponseToTransactionDetails } from 'uniswap/src/features/activity/parseRestResponse' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { mapRestStatusToNetworkStatus } from 'uniswap/src/features/dataApi/balances/utils' -import { BaseResult } from 'uniswap/src/features/dataApi/types' +import { BaseResult, PaginationControls } from 'uniswap/src/features/dataApi/types' +import { useHideReportedActivitySetting } from 'uniswap/src/features/settings/hooks' import { TransactionDetails } from 'uniswap/src/features/transactions/types/transactionDetails' +import { selectActivityVisibility } from 'uniswap/src/features/visibility/selectors' import { CurrencyIdToVisibility, NFTKeyToVisibility } from 'uniswap/src/features/visibility/slice' -import { useEvent } from 'utilities/src/react/hooks' const DEFAULT_PAGE_SIZE = 100 -export type TransactionListDataResult = BaseResult +export type TransactionListDataResult = BaseResult & PaginationControls type ListTransactionsQueryArgs = { evmAddress?: Address svmAddress?: Address @@ -44,25 +48,15 @@ export function useListTransactions({ // Use provided pageSize or fallback to default const finalPageSize = pageSize ?? DEFAULT_PAGE_SIZE - const selectFormattedData = useEvent((transactionData: ListTransactionsResponse | undefined) => { - if (!transactionData) { - return undefined - } - - return parseRestResponseToTransactionDetails({ - data: transactionData, - hideSpamTokens, - nftVisibility, - tokenVisibilityOverrides, - }) - }) - const { - data: formattedTransactions, + data: infiniteData, isLoading, error, refetch, status: restStatus, + fetchNextPage, + hasNextPage, + isFetchingNextPage, } = useListTransactionsQuery({ input: { evmAddress, @@ -72,14 +66,100 @@ export function useListTransactions({ fiatOnRampParams, }, enabled: !!(evmAddress || svmAddress) && !skip, - select: selectFormattedData, }) + // Flatten all pages and parse transaction data + const formattedTransactions = useMemo(() => { + if (!infiniteData?.pages.length) { + return undefined + } + + const flattenedTransactions = infiniteData.pages + .filter((page): page is ListTransactionsResponse => page !== undefined) + .flatMap((page) => Array.from(page.transactions)) + // Transactions appear incomplete when the app first loads + // Type assertion needed because protobuf types assume transaction always exists + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + .filter((transaction) => transaction.transaction !== undefined) + + const dedupedTransactions = dedupeTransactions(flattenedTransactions) + + // Create a flattened response to parse + const flattenedResponse: ListTransactionsResponse = { + transactions: dedupedTransactions, + nextPageToken: infiniteData.pages[infiniteData.pages.length - 1]?.nextPageToken, + } as ListTransactionsResponse + + const parsedTransactions = parseRestResponseToTransactionDetails({ + data: flattenedResponse, + hideSpamTokens, + nftVisibility, + tokenVisibilityOverrides, + }) + + return parsedTransactions + }, [infiniteData, hideSpamTokens, nftVisibility, tokenVisibilityOverrides]) + + const filteredTransactions = useFilteredTransactionsByVisibility(formattedTransactions) + return { - data: formattedTransactions, + data: filteredTransactions, loading: isLoading, networkStatus: mapRestStatusToNetworkStatus(restStatus), refetch, error: error ?? undefined, + fetchNextPage, + hasNextPage: !!hasNextPage, + isFetchingNextPage, + } +} + +function dedupeTransactions( + transactions: ListTransactionsResponse['transactions'], +): ListTransactionsResponse['transactions'] { + const seenTransactionHashes = new Set() + + return transactions.filter((transaction) => { + const uniqueId = getUniqueTransactionId(transaction) + + // If there's no unique ID we can't dedupe it, so keep it + if (!uniqueId) { + return true + } + + if (seenTransactionHashes.has(uniqueId)) { + return false + } + + seenTransactionHashes.add(uniqueId) + return true + }) +} + +function useFilteredTransactionsByVisibility( + transactions: TransactionDetails[] | undefined, +): TransactionDetails[] | undefined { + const isDataReportingAbilitiesEnabled = useFeatureFlag(FeatureFlags.DataReportingAbilities) + const activityIdToVisibility = useSelector(selectActivityVisibility) + const hideReportedActivity = useHideReportedActivitySetting() + + // Skip filtering if data reporting abilities are not enabled or there are no transactions + if (!hideReportedActivity || !isDataReportingAbilitiesEnabled) { + return transactions + } + + return transactions?.filter((transaction) => activityIdToVisibility[transaction.id]?.isVisible ?? true) +} + +function getUniqueTransactionId(transaction: ListTransactionsResponse['transactions'][0]): string | undefined { + switch (transaction.transaction.case) { + case 'onChain': + return transaction.transaction.value.transactionHash + case 'uniswapX': + return transaction.transaction.value.orderHash + case 'fiatOnRamp': + return transaction.transaction.value.externalSessionId + default: + return undefined } } diff --git a/packages/uniswap/src/features/dataApi/tokenDetails/useTokenDetailsData.ts b/packages/uniswap/src/features/dataApi/tokenDetails/useTokenDetailsData.ts new file mode 100644 index 00000000000..a74196fecd7 --- /dev/null +++ b/packages/uniswap/src/features/dataApi/tokenDetails/useTokenDetailsData.ts @@ -0,0 +1,94 @@ +/** + * Shared hooks for token detail data across mobile and web + * + * Data source preference: + * - CoinGecko (TokenProjectMarket) first for: price, marketCap, FDV, 52w high/low, 24hr price change + * - Subgraph (TokenMarket) fallback and exclusive for: volume + */ + +import { useMemo } from 'react' +import { + useTokenMarketPartsFragment, + useTokenProjectMarketsPartsFragment, +} from 'uniswap/src/data/graphql/uniswap-data-api/fragments' +import type { CurrencyId } from 'uniswap/src/types/currency' + +/** + * Returns the current spot price for a token + * + * IMPORTANT: For multi-chain tokens (e.g., USDC on Ethereum vs Polygon), this returns + * the per-chain price, NOT the aggregated project price. This ensures each chain's + * token page shows the correct price for that specific chain. + * + * Prefers per-chain subgraph data, falls back to aggregated CoinGecko data + */ +export function useTokenSpotPrice(currencyId: CurrencyId): number | undefined { + const tokenMarket = useTokenMarketPartsFragment({ currencyId }).data.market + const projectMarkets = useTokenProjectMarketsPartsFragment({ currencyId }).data.project?.markets + + return useMemo(() => { + return tokenMarket?.price?.value ?? projectMarkets?.[0]?.price?.value + }, [tokenMarket?.price?.value, projectMarkets?.[0]?.price?.value]) +} + +/** + * Returns the 24hr price change percentage for a token + */ +export function useTokenPriceChange(currencyId: CurrencyId): number | undefined { + const projectMarkets = useTokenProjectMarketsPartsFragment({ currencyId }).data.project?.markets + + return useMemo(() => { + return projectMarkets?.[0]?.pricePercentChange24h?.value + }, [projectMarkets?.[0]?.pricePercentChange24h?.value]) +} + +/** + * Returns market statistics for a token with defensive fallback logic + * + * Each stat will automatically fallback to the alternate source if available, + * ensuring the UI always displays data when any source has it. + */ +export interface TokenMarketStats { + marketCap: number | undefined + fdv: number | undefined + volume: number | undefined + high52w: number | undefined + low52w: number | undefined +} + +export function useTokenMarketStats(currencyId: CurrencyId): TokenMarketStats { + const tokenMarket = useTokenMarketPartsFragment({ currencyId }).data.market + const projectMarkets = useTokenProjectMarketsPartsFragment({ currencyId }).data.project?.markets + + return useMemo(() => { + const currentPrice = projectMarkets?.[0]?.price?.value ?? tokenMarket?.price?.value + const marketCap = projectMarkets?.[0]?.marketCap?.value ?? undefined + const fdv = projectMarkets?.[0]?.fullyDilutedValuation?.value ?? undefined + const volume = tokenMarket?.volume?.value ?? undefined + const rawHigh52w = projectMarkets?.[0]?.priceHigh52W?.value ?? tokenMarket?.priceHigh52W?.value ?? undefined + const rawLow52w = projectMarkets?.[0]?.priceLow52W?.value ?? tokenMarket?.priceLow52W?.value ?? undefined + + // Adjust 52w bounds if current price exceeds them + const high52w = + currentPrice !== undefined && rawHigh52w !== undefined ? Math.max(currentPrice, rawHigh52w) : rawHigh52w + const low52w = currentPrice !== undefined && rawLow52w !== undefined ? Math.min(currentPrice, rawLow52w) : rawLow52w + + return { + marketCap, + fdv, + volume, + high52w, + low52w, + } + }, [ + projectMarkets?.[0]?.price?.value, + projectMarkets?.[0]?.marketCap?.value, + projectMarkets?.[0]?.fullyDilutedValuation?.value, + projectMarkets?.[0]?.priceHigh52W?.value, + projectMarkets?.[0]?.priceLow52W?.value, + tokenMarket?.volume?.value, + tokenMarket?.price?.value, + tokenMarket?.priceHigh52W?.value, + tokenMarket?.priceLow52W?.value, + ]) +} diff --git a/packages/uniswap/src/features/dataApi/types.ts b/packages/uniswap/src/features/dataApi/types.ts index acb786fb064..cfffcde1f3f 100644 --- a/packages/uniswap/src/features/dataApi/types.ts +++ b/packages/uniswap/src/features/dataApi/types.ts @@ -16,6 +16,12 @@ export interface BaseResult { error?: Error } +export interface PaginationControls { + fetchNextPage: () => void + hasNextPage: boolean + isFetchingNextPage: boolean +} + export enum TokenList { Default = 'default', NonDefault = 'non_default', diff --git a/packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.test.ts b/packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.test.ts index fbf15548f29..7966c5b8a2f 100644 --- a/packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.test.ts +++ b/packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.test.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-lines */ import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' import { formatChartFiatDelta } from 'uniswap/src/features/fiatCurrency/priceChart/priceChartConversion' import { FormatNumberOrStringInput } from 'uniswap/src/features/language/formatter' diff --git a/packages/uniswap/src/features/language/constants.ts b/packages/uniswap/src/features/language/constants.ts index b184eb76baf..c06b3094c96 100644 --- a/packages/uniswap/src/features/language/constants.ts +++ b/packages/uniswap/src/features/language/constants.ts @@ -6,32 +6,16 @@ import { isWebApp } from 'utilities/src/platform' * resource strings in i18n.ts, and supported localizations in the Uniswap Xcode project. */ export enum Language { - Afrikaans = 'af', - Arabic = 'ar', - Catalan = 'ca-ES', ChineseSimplified = 'zh', // Defaulting overarching Chinese language code to Simplified ChineseTraditional = 'zh-Hant', - Czech = 'cs', - Danish = 'da', Dutch = 'nl', English = 'en', - Finnish = 'fi', French = 'fr', - Greek = 'el', - Hebrew = 'he', - Hindi = 'hi', - Hungarian = 'hu', Indonesian = 'id', - Italian = 'it', Japanese = 'ja', Korean = 'ko', - Malay = 'ms', - Norwegian = 'no', - Polish = 'pl', Portuguese = 'pt', - Romanian = 'ro', Russian = 'ru', - Serbian = 'sr', SpanishSpain = 'es', SpanishLatam = 'es-419', SpanishBelize = 'es-BZ', @@ -55,11 +39,7 @@ export enum Language { SpanishParaguay = 'es-PY', SpanishUruguay = 'es-UY', SpanishVenezuela = 'es-VE', - Swahili = 'sw', - Swedish = 'sv', Turkish = 'tr', - Ukrainian = 'uk', - Urdu = 'ur', Vietnamese = 'vi', } @@ -100,28 +80,15 @@ export const WALLET_SUPPORTED_LANGUAGES: Language[] = [ // order as they appear in the language dropdown export const WEB_SUPPORTED_LANGUAGES: Language[] = [ Language.English, - Language.Afrikaans, - Language.Arabic, - Language.Catalan, Language.ChineseSimplified, Language.ChineseTraditional, - Language.Danish, Language.Dutch, - Language.Finnish, Language.French, - Language.Greek, - Language.Hebrew, - Language.Hindi, - Language.Hungarian, Language.Indonesian, - Language.Italian, Language.Japanese, Language.Korean, - Language.Malay, - Language.Polish, Language.Portuguese, Language.Russian, - Language.Serbian, Language.SpanishSpain, Language.SpanishLatam, Language.SpanishUnitedStates, @@ -145,11 +112,7 @@ export const WEB_SUPPORTED_LANGUAGES: Language[] = [ Language.SpanishPeru, Language.SpanishPuertoRico, Language.SpanishElSalvador, - Language.Swahili, - Language.Swedish, Language.Turkish, - Language.Ukrainian, - Language.Urdu, Language.Vietnamese, ] @@ -169,33 +132,17 @@ export const mapDeviceLanguageToLanguage: Record = { * Matches to locale codes for languages provided by Crowdin */ export enum Locale { - Afrikaans = 'af-ZA', - ArabicSaudi = 'ar-SA', - Catalan = 'ca-ES', ChineseSimplified = 'zh-Hans', ChineseTraditional = 'zh-Hant', - CzechCzechia = 'cs-CZ', - DanishDenmark = 'da-DK', DutchNetherlands = 'nl-NL', EnglishUnitedStates = 'en-US', - FinnishFinland = 'fi-FI', FrenchFrance = 'fr-FR', - GreekGreece = 'el-GR', - HebrewIsrael = 'he-IL', - HindiIndia = 'hi-IN', - HungarianHungarian = 'hu-HU', IndonesianIndonesia = 'id-ID', - ItalianItaly = 'it-IT', JapaneseJapan = 'ja-JP', KoreanKorea = 'ko-KR', - MalayMalaysia = 'ms-MY', - NorwegianNorway = 'no-NO', - PolishPoland = 'pl-PL', PortugueseBrazil = 'pt-BR', PortuguesePortugal = 'pt-PT', - RomanianRomania = 'ro-RO', RussianRussia = 'ru-RU', - Serbian = 'sr-SP', SpanishLatam = 'es-419', SpanishBelize = 'es-BZ', SpanishCuba = 'es-CU', @@ -219,11 +166,7 @@ export enum Locale { SpanishParaguay = 'es-PY', SpanishUruguay = 'es-UY', SpanishVenezuela = 'es-VE', - SwahiliTanzania = 'sw-TZ', - SwedishSweden = 'sv-SE', TurkishTurkey = 'tr-TR', - UkrainianUkraine = 'uk-UA', - UrduPakistan = 'ur-PK', VietnameseVietnam = 'vi-VN', } @@ -234,30 +177,15 @@ export const DEFAULT_LOCALE: Locale = Locale.EnglishUnitedStates * This is needed because we not support all locales and default languages to specific locales */ export const mapLanguageToLocale: Record = { - [Language.Afrikaans]: Locale.Afrikaans, - [Language.Arabic]: Locale.ArabicSaudi, - [Language.Catalan]: Locale.Catalan, [Language.ChineseSimplified]: Locale.ChineseSimplified, [Language.ChineseTraditional]: Locale.ChineseTraditional, - [Language.Czech]: Locale.CzechCzechia, - [Language.Danish]: Locale.DanishDenmark, [Language.Dutch]: Locale.DutchNetherlands, [Language.English]: Locale.EnglishUnitedStates, - [Language.Finnish]: Locale.FinnishFinland, [Language.French]: Locale.FrenchFrance, - [Language.Greek]: Locale.GreekGreece, - [Language.Hebrew]: Locale.HebrewIsrael, - [Language.Hindi]: Locale.HindiIndia, - [Language.Hungarian]: Locale.HungarianHungarian, [Language.Indonesian]: Locale.IndonesianIndonesia, - [Language.Italian]: Locale.ItalianItaly, [Language.Japanese]: Locale.JapaneseJapan, [Language.Korean]: Locale.KoreanKorea, - [Language.Malay]: Locale.MalayMalaysia, - [Language.Norwegian]: Locale.NorwegianNorway, - [Language.Polish]: Locale.PolishPoland, [Language.Portuguese]: Locale.PortuguesePortugal, - [Language.Romanian]: Locale.RomanianRomania, [Language.Russian]: Locale.RussianRussia, [Language.SpanishSpain]: Locale.SpanishSpain, [Language.SpanishLatam]: Locale.SpanishLatam, @@ -282,12 +210,7 @@ export const mapLanguageToLocale: Record = { [Language.SpanishParaguay]: Locale.SpanishParaguay, [Language.SpanishUruguay]: Locale.SpanishUruguay, [Language.SpanishVenezuela]: Locale.SpanishVenezuela, - [Language.Serbian]: Locale.Serbian, - [Language.Swahili]: Locale.SwahiliTanzania, - [Language.Swedish]: Locale.SwedishSweden, [Language.Turkish]: Locale.TurkishTurkey, - [Language.Ukrainian]: Locale.UkrainianUkraine, - [Language.Urdu]: Locale.UrduPakistan, [Language.Vietnamese]: Locale.VietnameseVietnam, } @@ -296,33 +219,17 @@ export const mapLanguageToLocale: Record = { * This is needed because we not support all locales and default languages to specific locales */ export const mapLocaleToLanguage: Record = { - [Locale.Afrikaans]: Language.Afrikaans, - [Locale.ArabicSaudi]: Language.Arabic, - [Locale.Catalan]: Language.Catalan, [Locale.ChineseSimplified]: Language.ChineseSimplified, [Locale.ChineseTraditional]: Language.ChineseTraditional, - [Locale.CzechCzechia]: Language.Czech, - [Locale.DanishDenmark]: Language.Danish, [Locale.DutchNetherlands]: Language.Dutch, [Locale.EnglishUnitedStates]: Language.English, - [Locale.FinnishFinland]: Language.Finnish, [Locale.FrenchFrance]: Language.French, - [Locale.GreekGreece]: Language.Greek, - [Locale.HebrewIsrael]: Language.Hebrew, - [Locale.HindiIndia]: Language.Hindi, - [Locale.HungarianHungarian]: Language.Hungarian, [Locale.IndonesianIndonesia]: Language.Indonesian, - [Locale.ItalianItaly]: Language.Italian, [Locale.JapaneseJapan]: Language.Japanese, [Locale.KoreanKorea]: Language.Korean, - [Locale.MalayMalaysia]: Language.Malay, - [Locale.NorwegianNorway]: Language.Norwegian, - [Locale.PolishPoland]: Language.Polish, [Locale.PortugueseBrazil]: Language.Portuguese, [Locale.PortuguesePortugal]: Language.Portuguese, - [Locale.RomanianRomania]: Language.Romanian, [Locale.RussianRussia]: Language.Russian, - [Locale.Serbian]: Language.Serbian, [Locale.SpanishSpain]: Language.SpanishSpain, [Locale.SpanishLatam]: Language.SpanishLatam, [Locale.SpanishBelize]: Language.SpanishBelize, @@ -346,10 +253,6 @@ export const mapLocaleToLanguage: Record = { [Locale.SpanishParaguay]: Language.SpanishParaguay, [Locale.SpanishUruguay]: Language.SpanishUruguay, [Locale.SpanishVenezuela]: Language.SpanishVenezuela, - [Locale.SwahiliTanzania]: Language.Swahili, - [Locale.SwedishSweden]: Language.Swedish, [Locale.TurkishTurkey]: Language.Turkish, - [Locale.UkrainianUkraine]: Language.Ukrainian, - [Locale.UrduPakistan]: Language.Urdu, [Locale.VietnameseVietnam]: Language.Vietnamese, } diff --git a/packages/uniswap/src/features/language/hooks.tsx b/packages/uniswap/src/features/language/hooks.tsx index 5e76bb6999f..e5c8fb0bc3f 100644 --- a/packages/uniswap/src/features/language/hooks.tsx +++ b/packages/uniswap/src/features/language/hooks.tsx @@ -39,24 +39,6 @@ export function getLocale(language: Language): Locale { */ export function getLanguageInfo(t: AppTFunction, language: Language): LanguageInfo { const languageToLanguageInfo: Record = { - [Language.Afrikaans]: { - displayName: t('language.afrikaans'), - originName: t('language.afrikaans', { lng: getLocale(Language.Afrikaans) }), - loggingName: 'Afrikaans', - locale: getLocale(Language.Afrikaans), - }, - [Language.Arabic]: { - displayName: t('language.arabic'), - originName: t('language.arabic', { lng: getLocale(Language.Arabic) }), - loggingName: 'Arabic', - locale: getLocale(Language.Arabic), - }, - [Language.Catalan]: { - displayName: t('language.catalan'), - originName: t('language.catalan', { lng: getLocale(Language.Catalan) }), - loggingName: 'Catalan', - locale: getLocale(Language.Catalan), - }, [Language.ChineseSimplified]: { displayName: t('language.chineseSimplified'), originName: t('language.chineseSimplified', { lng: getLocale(Language.ChineseSimplified) }), @@ -71,18 +53,6 @@ export function getLanguageInfo(t: AppTFunction, language: Language): LanguageIn loggingName: 'Chinese, Traditional', locale: getLocale(Language.ChineseTraditional), }, - [Language.Czech]: { - displayName: t('language.czech'), - originName: t('language.czech', { lng: getLocale(Language.Czech) }), - loggingName: 'Czech', - locale: getLocale(Language.Czech), - }, - [Language.Danish]: { - displayName: t('language.danish'), - originName: t('language.danish', { lng: getLocale(Language.Danish) }), - loggingName: 'Danish', - locale: getLocale(Language.Danish), - }, [Language.Dutch]: { displayName: t('language.dutch'), originName: t('language.dutch', { lng: getLocale(Language.Dutch) }), @@ -95,54 +65,18 @@ export function getLanguageInfo(t: AppTFunction, language: Language): LanguageIn loggingName: 'English', locale: getLocale(Language.English), }, - [Language.Finnish]: { - displayName: t('language.finnish'), - originName: t('language.finnish', { lng: getLocale(Language.Finnish) }), - loggingName: 'Finnish', - locale: getLocale(Language.Finnish), - }, [Language.French]: { displayName: t('language.french'), originName: t('language.french', { lng: getLocale(Language.French) }), loggingName: 'French', locale: getLocale(Language.French), }, - [Language.Greek]: { - displayName: t('language.greek'), - originName: t('language.greek', { lng: getLocale(Language.Greek) }), - loggingName: 'Greek', - locale: getLocale(Language.Greek), - }, - [Language.Hebrew]: { - displayName: t('language.hebrew'), - originName: t('language.hebrew', { lng: getLocale(Language.Hebrew) }), - loggingName: 'Hebrew', - locale: getLocale(Language.Hebrew), - }, - [Language.Hindi]: { - displayName: t('language.hindi'), - originName: t('language.hindi', { lng: getLocale(Language.Hindi) }), - loggingName: 'Hindi', - locale: getLocale(Language.Hindi), - }, - [Language.Hungarian]: { - displayName: t('language.hungarian'), - originName: t('language.hungarian', { lng: getLocale(Language.Hungarian) }), - loggingName: 'Hungarian', - locale: getLocale(Language.Hungarian), - }, [Language.Indonesian]: { displayName: t('language.indonesian'), originName: t('language.indonesian', { lng: getLocale(Language.Indonesian) }), loggingName: 'Indonesian', locale: getLocale(Language.Indonesian), }, - [Language.Italian]: { - displayName: t('language.italian'), - originName: t('language.italian', { lng: getLocale(Language.Italian) }), - loggingName: 'Italian', - locale: getLocale(Language.Italian), - }, [Language.Japanese]: { displayName: t('language.japanese'), originName: t('language.japanese', { lng: getLocale(Language.Japanese) }), @@ -155,48 +89,18 @@ export function getLanguageInfo(t: AppTFunction, language: Language): LanguageIn loggingName: 'Korean', locale: getLocale(Language.Korean), }, - [Language.Malay]: { - displayName: t('language.malay'), - originName: t('language.malay', { lng: getLocale(Language.Malay) }), - loggingName: 'Malay', - locale: getLocale(Language.Malay), - }, - [Language.Norwegian]: { - displayName: t('language.norwegian'), - originName: t('language.norwegian', { lng: getLocale(Language.Norwegian) }), - loggingName: 'Norweigan', - locale: getLocale(Language.Norwegian), - }, - [Language.Polish]: { - displayName: t('language.polish'), - originName: t('language.polish', { lng: getLocale(Language.Polish) }), - loggingName: 'Polish', - locale: getLocale(Language.Polish), - }, [Language.Portuguese]: { displayName: t('language.portuguese'), originName: t('language.portuguese', { lng: getLocale(Language.Portuguese) }), loggingName: 'Portuguese', locale: getLocale(Language.Portuguese), }, - [Language.Romanian]: { - displayName: t('language.romanian'), - originName: t('language.romanian', { lng: getLocale(Language.Romanian) }), - loggingName: 'Romanian', - locale: getLocale(Language.Romanian), - }, [Language.Russian]: { displayName: t('language.russian'), originName: t('language.russian', { lng: getLocale(Language.Russian) }), loggingName: 'Russian', locale: getLocale(Language.Russian), }, - [Language.Serbian]: { - displayName: t('language.serbian'), - originName: t('language.serbian', { lng: getLocale(Language.Serbian) }), - loggingName: 'Serbian', - locale: getLocale(Language.Serbian), - }, [Language.SpanishSpain]: { displayName: t('language.spanishSpain'), originName: t('language.spanishSpain', { lng: getLocale(Language.SpanishSpain) }), @@ -335,36 +239,12 @@ export function getLanguageInfo(t: AppTFunction, language: Language): LanguageIn loggingName: 'Spanish (Venezuela)', locale: getLocale(Language.SpanishVenezuela), }, - [Language.Swahili]: { - displayName: t('language.swahili'), - originName: t('language.swahili', { lng: getLocale(Language.Swahili) }), - loggingName: 'Swahili', - locale: getLocale(Language.Swahili), - }, - [Language.Swedish]: { - displayName: t('language.swedish'), - originName: t('language.swedish', { lng: getLocale(Language.Swedish) }), - loggingName: 'Swedish', - locale: getLocale(Language.Swedish), - }, [Language.Turkish]: { displayName: t('language.turkish'), originName: t('language.turkish', { lng: getLocale(Language.Turkish) }), loggingName: 'Turkish', locale: getLocale(Language.Turkish), }, - [Language.Ukrainian]: { - displayName: t('language.ukrainian'), - originName: t('language.ukrainian', { lng: getLocale(Language.Ukrainian) }), - loggingName: 'Ukrainian', - locale: getLocale(Language.Ukrainian), - }, - [Language.Urdu]: { - displayName: t('language.urdu'), - originName: t('language.urdu', { lng: getLocale(Language.Urdu) }), - loggingName: 'Urdu', - locale: getLocale(Language.Urdu), - }, [Language.Vietnamese]: { displayName: t('language.vietnamese'), originName: t('language.vietnamese', { lng: getLocale(Language.Vietnamese) }), diff --git a/packages/uniswap/src/features/language/localizedDayjs.ts b/packages/uniswap/src/features/language/localizedDayjs.ts index 484f1590040..8684b513fca 100644 --- a/packages/uniswap/src/features/language/localizedDayjs.ts +++ b/packages/uniswap/src/features/language/localizedDayjs.ts @@ -4,17 +4,12 @@ import localizedFormat from 'dayjs/plugin/localizedFormat' import 'dayjs/locale/en' import 'dayjs/locale/es' import 'dayjs/locale/fr' -import 'dayjs/locale/hi' import 'dayjs/locale/id' import 'dayjs/locale/ja' -import 'dayjs/locale/ms-my' import 'dayjs/locale/nl' import 'dayjs/locale/pt' import 'dayjs/locale/ru' -import 'dayjs/locale/th' import 'dayjs/locale/tr' -import 'dayjs/locale/uk' -import 'dayjs/locale/ur' import 'dayjs/locale/vi' import 'dayjs/locale/zh-cn' import 'dayjs/locale/zh-tw' @@ -45,33 +40,17 @@ export type LocalizedDayjs = typeof dayjs // Supported ones found here https://github.com/iamkun/dayjs/tree/dev/src/locale const mapLocaleToSupportedDayjsLocale: Record = { - [Locale.Afrikaans]: 'af', - [Locale.ArabicSaudi]: 'ar-sa', - [Locale.Catalan]: 'ca', [Locale.ChineseSimplified]: 'zh-cn', [Locale.ChineseTraditional]: 'zh-tw', - [Locale.CzechCzechia]: 'cs', - [Locale.DanishDenmark]: 'da', [Locale.DutchNetherlands]: 'nl', [Locale.EnglishUnitedStates]: 'en-us', - [Locale.FinnishFinland]: 'fi', [Locale.FrenchFrance]: 'fr', - [Locale.GreekGreece]: 'el', - [Locale.HebrewIsrael]: 'he', - [Locale.HindiIndia]: 'hi', - [Locale.HungarianHungarian]: 'hu', [Locale.IndonesianIndonesia]: 'id', - [Locale.ItalianItaly]: 'it', [Locale.JapaneseJapan]: 'ja', [Locale.KoreanKorea]: 'ko', - [Locale.MalayMalaysia]: 'ms', - [Locale.NorwegianNorway]: 'no', - [Locale.PolishPoland]: 'pl', [Locale.PortugueseBrazil]: 'pt-br', [Locale.PortuguesePortugal]: 'pt', - [Locale.RomanianRomania]: 'ro', [Locale.RussianRussia]: 'ru', - [Locale.Serbian]: 'sr', [Locale.SpanishSpain]: 'es-es', [Locale.SpanishLatam]: 'es-mx', [Locale.SpanishArgentina]: 'es-mx', @@ -95,11 +74,7 @@ const mapLocaleToSupportedDayjsLocale: Record = { [Locale.SpanishUruguay]: 'es-mx', [Locale.SpanishVenezuela]: 'es-mx', [Locale.SpanishUnitedStates]: 'es-us', - [Locale.SwahiliTanzania]: 'sw', - [Locale.SwedishSweden]: 'sv', [Locale.TurkishTurkey]: 'tr', - [Locale.UkrainianUkraine]: 'uk', - [Locale.UrduPakistan]: 'ur', [Locale.VietnameseVietnam]: 'vi', } diff --git a/packages/uniswap/src/features/nfts/hooks/useNftContextMenuItems.tsx b/packages/uniswap/src/features/nfts/hooks/useNftContextMenuItems.tsx index 99c9236debd..f7831777dd2 100644 --- a/packages/uniswap/src/features/nfts/hooks/useNftContextMenuItems.tsx +++ b/packages/uniswap/src/features/nfts/hooks/useNftContextMenuItems.tsx @@ -19,6 +19,7 @@ import { useNavigateToNftExplorerLink } from 'uniswap/src/features/nfts/hooks/us import { getIsNftHidden, getNFTAssetKey } from 'uniswap/src/features/nfts/utils' import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' import { AppNotificationType, CopyNotificationType } from 'uniswap/src/features/notifications/slice/types' +import { submitNFTSpamReport } from 'uniswap/src/features/reporting/reports' import { WalletEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { selectNftsVisibility } from 'uniswap/src/features/visibility/selectors' @@ -77,18 +78,26 @@ export function useNFTContextMenuItems({ } try { + // Submit report to Amplitude to track metrics + submitNFTSpamReport({ + chainId, + contractAddress, + }) + // Submit report to API await DataServiceApiClient.submitTokenReport({ chainId, address: contractAddress, event: TokenReportEventType.FalseNegative, }) - dispatch( - pushNotification({ - type: AppNotificationType.Success, - title: t('notification.spam.NFT.successful'), - }), - ) + if (showNotification) { + dispatch( + pushNotification({ + type: AppNotificationType.Success, + title: t('common.reported'), + }), + ) + } } catch (e) { logger.error(e, { tags: { file: 'useNftContextMenu.tsx', function: 'onPressReport' }, @@ -102,15 +111,17 @@ export function useNFTContextMenuItems({ return } - dispatch( - pushNotification({ - type: AppNotificationType.Error, - errorMessage: t('notification.spam.NFT.failed'), - }), - ) + if (showNotification) { + dispatch( + pushNotification({ + type: AppNotificationType.Error, + errorMessage: t('notification.spam.NFT.failed'), + }), + ) + } return } - }, [t, dispatch, contractAddress, isVisible, chainId, nftKey]) + }, [t, dispatch, contractAddress, isVisible, chainId, nftKey, showNotification]) const onPressHiddenStatus = useCallback(() => { if (!nftKey) { @@ -144,13 +155,15 @@ export function useNFTContextMenuItems({ return } await setClipboard(contractAddress) - dispatch( - pushNotification({ - type: AppNotificationType.Copied, - copyType: CopyNotificationType.Address, - }), - ) - }, [contractAddress, dispatch]) + if (showNotification) { + dispatch( + pushNotification({ + type: AppNotificationType.Copied, + copyType: CopyNotificationType.Address, + }), + ) + } + }, [contractAddress, dispatch, showNotification]) const openseaUri = useMemo(() => { if (chainId && contractAddress && tokenId) { diff --git a/packages/uniswap/src/features/portfolio/TokenBalanceListContext.tsx b/packages/uniswap/src/features/portfolio/TokenBalanceListContext.tsx index 017f6dcbc7a..86574ce397a 100644 --- a/packages/uniswap/src/features/portfolio/TokenBalanceListContext.tsx +++ b/packages/uniswap/src/features/portfolio/TokenBalanceListContext.tsx @@ -88,6 +88,15 @@ export function TokenBalanceListContextProvider({ const rows = useMemo(() => { const shownTokensArray = shownTokens ?? [] + + const testnetModeRowIds = [ + // When we're on testnet mode, we want to show all tokens, without splitting to hidden ones + ...sortPortfolioBalances({ + balances: [...shownTokensArray, ...(sortedHiddenTokens ?? [])], + isTestnetModeEnabled, + }), + ].map((token) => token.currencyInfo.currencyId) + const newRowIds = [ // Always sort tokens to ensure proper ordering after instant balance updates // In prod, sort by USD value; in testnet mode, sort by native balances @@ -102,9 +111,11 @@ export function TokenBalanceListContextProvider({ return token.currencyInfo.currencyId }) + const modeDependentRowIds = isTestnetModeEnabled ? testnetModeRowIds : newRowIds + // We do this extra step to make sure we return the same array reference if the currency IDs for each row haven't changed. - if (!rowsRef.current || !isEqual(rowsRef.current, newRowIds)) { - rowsRef.current = newRowIds + if (!rowsRef.current || !isEqual(rowsRef.current, modeDependentRowIds)) { + rowsRef.current = modeDependentRowIds } return rowsRef.current diff --git a/packages/uniswap/src/features/portfolio/balances/hooks/useTokenContextMenuOptions.ts b/packages/uniswap/src/features/portfolio/balances/hooks/useTokenContextMenuOptions.ts index 141e5f1405c..50b0a46af87 100644 --- a/packages/uniswap/src/features/portfolio/balances/hooks/useTokenContextMenuOptions.ts +++ b/packages/uniswap/src/features/portfolio/balances/hooks/useTokenContextMenuOptions.ts @@ -1,8 +1,10 @@ import { SharedEventName } from '@uniswap/analytics-events' import { isNativeCurrency } from '@uniswap/universal-router-sdk' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' +import { ChartBarCrossed, Flag } from 'ui/src/components/icons' import { CoinConvert } from 'ui/src/components/icons/CoinConvert' import { CopySheets } from 'ui/src/components/icons/CopySheets' import { ExternalLink } from 'ui/src/components/icons/ExternalLink' @@ -24,7 +26,7 @@ import { pushNotification } from 'uniswap/src/features/notifications/slice/slice import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' import { ElementName, SectionName, WalletEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' -import { useTokenVisibility } from 'uniswap/src/features/visibility/selectors' +import { useTokenVisibility } from 'uniswap/src/features/visibility/hooks/useTokenVisibility' import { setTokenVisibility } from 'uniswap/src/features/visibility/slice' import { CurrencyField, CurrencyId } from 'uniswap/src/types/currency' import { areCurrencyIdsEqual, currencyIdToAddress, currencyIdToChain } from 'uniswap/src/utils/currencyId' @@ -39,6 +41,8 @@ export enum TokenMenuActionType { ViewDetails = 'viewDetails', ToggleVisibility = 'toggleVisibility', CopyAddress = 'copyAddress', + ReportToken = 'reportToken', + DataIssue = 'dataIssue', } interface TokenMenuParams { @@ -48,6 +52,8 @@ interface TokenMenuParams { portfolioBalance?: Nullable excludedActions?: TokenMenuActionType[] openContractAddressExplainerModal?: () => void + openReportTokenModal: () => void + openReportDataIssueModal?: () => void copyAddressToClipboard?: (address: string) => Promise closeMenu: () => void } @@ -61,13 +67,17 @@ export function useTokenContextMenuOptions({ portfolioBalance, excludedActions, openContractAddressExplainerModal, + openReportTokenModal, + openReportDataIssueModal, copyAddressToClipboard, closeMenu, }: TokenMenuParams): MenuOptionItemWithId[] { const { t } = useTranslation() const dispatch = useDispatch() - const { defaultChainId } = useEnabledChains() + const isDataReportingEnabled = useFeatureFlag(FeatureFlags.DataReportingAbilities) + + const { defaultChainId } = useEnabledChains() const activeAddresses = useActiveAddresses() const { navigateToSwapFlow, navigateToReceive, navigateToSendFlow, handleShareToken, navigateToTokenDetails } = @@ -221,12 +231,30 @@ export function useTokenContextMenuOptions({ actions.push({ id: TokenMenuActionType.ToggleVisibility, label: isVisible ? t('tokens.action.hide') : t('tokens.action.unhide'), - destructive: isVisible, onPress: onPressHiddenStatus, Icon: isVisible ? EyeOff : Eye, }) } + if (isDataReportingEnabled && openReportDataIssueModal) { + actions.push({ + id: TokenMenuActionType.DataIssue, + label: t('reporting.token.data.title'), + onPress: openReportDataIssueModal, + Icon: ChartBarCrossed, + }) + } + + if (isDataReportingEnabled && !isNative) { + actions.push({ + id: TokenMenuActionType.ReportToken, + label: t('reporting.token.report.title'), + onPress: openReportTokenModal, + Icon: Flag, + destructive: true, + }) + } + if (excludedActions) { const excludedActionIds = excludedActions.map((action) => action.toString()) const filteredActions: MenuOptionItemWithId[] = actions.filter( @@ -253,6 +281,9 @@ export function useTokenContextMenuOptions({ isTestnetModeEnabled, isNative, copyAddressToClipboard, + openReportTokenModal, + openReportDataIssueModal, + isDataReportingEnabled, ]) return menuActions diff --git a/packages/uniswap/src/features/portfolio/portfolioUpdates/constants.ts b/packages/uniswap/src/features/portfolio/portfolioUpdates/constants.ts index 252e5c0e669..e167a3c6cda 100644 --- a/packages/uniswap/src/features/portfolio/portfolioUpdates/constants.ts +++ b/packages/uniswap/src/features/portfolio/portfolioUpdates/constants.ts @@ -1,7 +1,3 @@ import { GQLQueries } from '@universe/api' -export const GQL_QUERIES_TO_REFETCH_ON_TXN_UPDATE = [ - GQLQueries.PortfolioBalances, - GQLQueries.TransactionList, - GQLQueries.NftsTab, -] +export const GQL_QUERIES_TO_REFETCH_ON_TXN_UPDATE = [GQLQueries.PortfolioBalances, GQLQueries.NftsTab] diff --git a/packages/uniswap/src/features/reporting/reports.ts b/packages/uniswap/src/features/reporting/reports.ts new file mode 100644 index 00000000000..13e7ce4d20c --- /dev/null +++ b/packages/uniswap/src/features/reporting/reports.ts @@ -0,0 +1,155 @@ +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' +import { Currency } from '@uniswap/sdk-core' +import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { UniswapEventName } from 'uniswap/src/features/telemetry/constants' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' +import { TransactionDetails } from 'uniswap/src/features/transactions/types/transactionDetails' +import { NATIVE_ANALYTICS_ADDRESS_VALUE } from 'uniswap/src/utils/currencyId' + +export enum TokenReportOption { + Spam = 'spam', + Imposter = 'imposter', + HiddenFees = 'hidden_fees', + Other = 'other', +} + +export enum TokenDataReportOption { + Price = 'price', + Volume = 'volume', + PriceChart = 'price_chart', + TokenDetails = 'token_details', + Other = 'other', +} + +export function submitTokenIssueReport({ + source, + chainId, + tokenAddress, + tokenName, + isMarkedSpam, + reportOptions, + reportText, +}: { + source: 'portfolio' | 'token-details' + chainId: UniverseChainId + tokenAddress?: string + tokenName?: string + isMarkedSpam?: Maybe + reportOptions: TokenReportOption[] + reportText: string +}): void { + sendAnalyticsEvent(UniswapEventName.SpamReportSubmitted, { + type: 'token', + source, + token_name: tokenName, + token_contract_address: tokenAddress ?? NATIVE_ANALYTICS_ADDRESS_VALUE, + chain_id: chainId, + is_marked_spam: isMarkedSpam, + spam_token: reportOptions.includes(TokenReportOption.Spam), + imposter_token: reportOptions.includes(TokenReportOption.Imposter), + hidden_fees: reportOptions.includes(TokenReportOption.HiddenFees), + something_else: reportOptions.includes(TokenReportOption.Other), + text: reportOptions.includes(TokenReportOption.Other) ? reportText : undefined, + }) +} + +export function submitTokenDataReport({ + chainId, + tokenAddress, + tokenName, + isMarkedSpam, + reportOptions, + reportText, +}: { + chainId: UniverseChainId + tokenAddress?: string + tokenName?: string + isMarkedSpam?: Maybe + reportOptions: TokenDataReportOption[] + reportText: string +}): void { + sendAnalyticsEvent(UniswapEventName.DataReportSubmitted, { + type: 'data', + token_name: tokenName, + token_contract_address: tokenAddress ?? NATIVE_ANALYTICS_ADDRESS_VALUE, + chain_id: chainId, + is_marked_spam: isMarkedSpam, + price: reportOptions.includes(TokenDataReportOption.Price), + volume: reportOptions.includes(TokenDataReportOption.Volume), + price_chart: reportOptions.includes(TokenDataReportOption.PriceChart), + token_details: reportOptions.includes(TokenDataReportOption.TokenDetails), + something_else: reportOptions.includes(TokenDataReportOption.Other), + text: reportOptions.includes(TokenDataReportOption.Other) ? reportText : undefined, + }) +} + +export function submitTokenWarningDataReport({ + chainId, + tokenAddress, + tokenName, + isMarkedSpam, + reportText, +}: { + chainId: UniverseChainId + tokenAddress?: string + tokenName?: string + isMarkedSpam?: Maybe + reportText: string +}): void { + sendAnalyticsEvent(UniswapEventName.DataReportSubmitted, { + type: 'token_warning', + token_name: tokenName, + token_contract_address: tokenAddress ?? NATIVE_ANALYTICS_ADDRESS_VALUE, + chain_id: chainId, + text: reportText, + is_marked_spam: isMarkedSpam, + }) +} + +export function submitNFTSpamReport({ + chainId, + contractAddress, +}: { + chainId: UniverseChainId + contractAddress?: string +}): void { + sendAnalyticsEvent(UniswapEventName.SpamReportSubmitted, { + type: 'nft', + chain_id: chainId, + contract_address: contractAddress, + }) +} + +export function submitActivitySpamReport({ transactionDetails }: { transactionDetails: TransactionDetails }): void { + sendAnalyticsEvent(UniswapEventName.SpamReportSubmitted, { + type: 'activity', + address: transactionDetails.ownerAddress, + transaction_id: transactionDetails.id, + chain_id: transactionDetails.chainId, + hash: transactionDetails.hash, + transaction_type: transactionDetails.typeInfo.type, + }) +} + +export function submitPoolSpamReport({ + poolId, + chainId, + version, + token0, + token1, +}: { + poolId: string + chainId: UniverseChainId + version: ProtocolVersion + token0: Currency + token1: Currency +}): void { + sendAnalyticsEvent(UniswapEventName.SpamReportSubmitted, { + type: 'pool', + pool_id: poolId, + chain_id: chainId, + version, + token0: token0.isNative ? NATIVE_ANALYTICS_ADDRESS_VALUE : token0.address, + token1: token1.isNative ? NATIVE_ANALYTICS_ADDRESS_VALUE : token1.address, + }) +} diff --git a/packages/uniswap/src/features/settings/constants.ts b/packages/uniswap/src/features/settings/constants.ts index 0191e7cfa07..c0a0871315c 100644 --- a/packages/uniswap/src/features/settings/constants.ts +++ b/packages/uniswap/src/features/settings/constants.ts @@ -1,4 +1,4 @@ -import { ONE_DAY_MS, ONE_HOUR_MS, ONE_MINUTE_MS } from 'utilities/src/time/time' +import { HOURS_IN_DAY, MINUTES_IN_HOUR } from 'utilities/src/time/time' export enum DeviceAccessTimeout { FiveMinutes = '5_MIN', @@ -19,23 +19,23 @@ export const ORDERED_DEVICE_ACCESS_TIMEOUTS: DeviceAccessTimeout[] = [ ] /** - * Converts DeviceAccessTimeout enum to milliseconds for timeout calculations + * Converts DeviceAccessTimeout enum to minutes for timeout calculations * @param timeout The DeviceAccessTimeout enum value - * @returns The timeout in milliseconds, or undefined for 'Never' + * @returns The timeout in minutes, or undefined for 'Never' */ -export function deviceAccessTimeoutToMs(timeout: DeviceAccessTimeout): number | undefined { +export function deviceAccessTimeoutToMinutes(timeout: DeviceAccessTimeout): number | undefined { switch (timeout) { case DeviceAccessTimeout.FiveMinutes: - return 5 * ONE_MINUTE_MS + return 5 case DeviceAccessTimeout.ThirtyMinutes: - return 30 * ONE_MINUTE_MS + return 30 case DeviceAccessTimeout.OneHour: - return ONE_HOUR_MS + return MINUTES_IN_HOUR case DeviceAccessTimeout.TwentyFourHours: - return ONE_DAY_MS + return HOURS_IN_DAY * MINUTES_IN_HOUR case DeviceAccessTimeout.Never: return undefined default: - return 30 * ONE_MINUTE_MS // Default fallback to 30 minutes + return 30 // Default fallback to 30 minutes } } diff --git a/packages/uniswap/src/features/settings/hooks.ts b/packages/uniswap/src/features/settings/hooks.ts index 1784c115dd0..6f765d63155 100644 --- a/packages/uniswap/src/features/settings/hooks.ts +++ b/packages/uniswap/src/features/settings/hooks.ts @@ -1,8 +1,9 @@ import { useSelector } from 'react-redux' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { - // biome-ignore lint/style/noRestrictedImports: legacy import will be migrated + // biome-ignore lint/style/noRestrictedImports: expected usage here selectIsTestnetModeEnabled, + selectWalletHideReportedActivitySetting, selectWalletHideSmallBalancesSetting, selectWalletHideSpamTokensSetting, } from 'uniswap/src/features/settings/selectors' @@ -18,6 +19,10 @@ export function useHideSpamTokensSetting(): boolean { return useSelector(selectWalletHideSpamTokensSetting) } +export function useHideReportedActivitySetting(): boolean { + return useSelector(selectWalletHideReportedActivitySetting) +} + export const TESTNET_MODE_BANNER_HEIGHT = 44 function useIsTestnetModeEnabled(): boolean { diff --git a/packages/uniswap/src/features/settings/selectors.ts b/packages/uniswap/src/features/settings/selectors.ts index cdf22a8e949..0080b300d13 100644 --- a/packages/uniswap/src/features/settings/selectors.ts +++ b/packages/uniswap/src/features/settings/selectors.ts @@ -1,4 +1,5 @@ import { Language } from 'uniswap/src/features/language/constants' +import { deviceAccessTimeoutToMinutes } from 'uniswap/src/features/settings/constants' import { UniswapState } from 'uniswap/src/state/uniswapReducer' export const selectWalletHideSmallBalancesSetting = (state: UniswapState): boolean => @@ -6,7 +7,13 @@ export const selectWalletHideSmallBalancesSetting = (state: UniswapState): boole export const selectWalletHideSpamTokensSetting = (state: UniswapState): boolean => state.userSettings.hideSpamTokens +export const selectWalletHideReportedActivitySetting = (state: UniswapState): boolean => + state.userSettings.hideReportedActivity ?? true + export const selectCurrentLanguage = (state: UniswapState): Language => state.userSettings.currentLanguage export const selectIsTestnetModeEnabled = (state: UniswapState): boolean => state.userSettings.isTestnetModeEnabled ?? false + +export const selectDeviceAccessTimeoutMinutes = (state: UniswapState): number | undefined => + deviceAccessTimeoutToMinutes(state.userSettings.deviceAccessTimeout) diff --git a/packages/uniswap/src/features/settings/slice.ts b/packages/uniswap/src/features/settings/slice.ts index 382be61f0b9..b7ae8e93c38 100644 --- a/packages/uniswap/src/features/settings/slice.ts +++ b/packages/uniswap/src/features/settings/slice.ts @@ -13,6 +13,7 @@ export interface UserSettingsState { currentCurrency: FiatCurrency hideSmallBalances: boolean hideSpamTokens: boolean + hideReportedActivity?: boolean isTestnetModeEnabled?: boolean hapticsEnabled: boolean deviceAccessTimeout: DeviceAccessTimeout @@ -23,6 +24,7 @@ export const initialUserSettingsState: UserSettingsState = { currentCurrency: FiatCurrency.UnitedStatesDollar, hideSmallBalances: true, hideSpamTokens: true, + hideReportedActivity: true, isTestnetModeEnabled: false, hapticsEnabled: true, deviceAccessTimeout: DEFAULT_DEVICE_ACCESS_TIMEOUT, @@ -38,6 +40,9 @@ const slice = createSlice({ setHideSpamTokens: (state, { payload }: PayloadAction) => { state.hideSpamTokens = payload }, + setHideReportedActivity: (state, { payload }: PayloadAction) => { + state.hideReportedActivity = payload + }, setCurrentLanguage: (state, action: PayloadAction) => { state.currentLanguage = action.payload }, @@ -64,6 +69,7 @@ const slice = createSlice({ export const { setHideSmallBalances, setHideSpamTokens, + setHideReportedActivity, setCurrentLanguage, setCurrentFiatCurrency, setIsTestnetModeEnabled, diff --git a/packages/uniswap/src/features/telemetry/constants/trace/modal.ts b/packages/uniswap/src/features/telemetry/constants/trace/modal.ts index 99b5f906616..6e9378476f8 100644 --- a/packages/uniswap/src/features/telemetry/constants/trace/modal.ts +++ b/packages/uniswap/src/features/telemetry/constants/trace/modal.ts @@ -128,6 +128,8 @@ export const ModalName = { RemoveLiquidity: 'remove-liquidity', RemoveSeedPhraseWarningModal: 'remove-seed-phrase-warning-modal', RemoveWallet: 'remove-wallet-modal', + ReportTokenData: 'report-token-data-modal', + ReportTokenIssue: 'report-token-issue-modal', ResetCreatePositionsForm: 'reset-create-positions-form', RestoreWallet: 'restore-wallet-modal', RestoreWalletSeedPhrase: 'restore-wallet-seed-phrase-modal', diff --git a/packages/uniswap/src/features/telemetry/constants/trace/section.ts b/packages/uniswap/src/features/telemetry/constants/trace/section.ts index 2629576f2d2..1214f097431 100644 --- a/packages/uniswap/src/features/telemetry/constants/trace/section.ts +++ b/packages/uniswap/src/features/telemetry/constants/trace/section.ts @@ -1,6 +1,7 @@ export enum SectionName { CurrencyInputPanel = 'currency-input-panel', CurrencyOutputPanel = 'currency-output-panel', + DisputeTokenWarning = 'dispute-token-warning', ExploreFavoriteTokensSection = 'explore-favorite-tokens-section', ExploreSearch = 'explore-search', ExploreTopTokensSection = 'explore-top-tokens-section', diff --git a/packages/uniswap/src/features/telemetry/constants/uniswap.ts b/packages/uniswap/src/features/telemetry/constants/uniswap.ts index b1d890932eb..3aa2c296613 100644 --- a/packages/uniswap/src/features/telemetry/constants/uniswap.ts +++ b/packages/uniswap/src/features/telemetry/constants/uniswap.ts @@ -3,6 +3,7 @@ export enum UniswapEventName { BalancesReportPerChain = 'Balances Report Per Chain', BlockaidFeesMismatch = 'Blockaid Fees Mismatch', ConversionEventSubmitted = 'Conversion Event Submitted', + DataReportSubmitted = 'Data Report Submitted', DelegationDetected = 'Delegation Detected', ExperimentQualifyingEvent = 'Experiment Qualifying Event', LowNetworkTokenInfoModalOpened = 'Low Network Token Info Modal Opened', @@ -12,6 +13,7 @@ export enum UniswapEventName { LpIncentiveCollectRewardsSuccess = 'LP Incentive Collect Rewards Success', LpIncentiveLearnMoreCtaClicked = 'LP Incentive Learn More CTA Clicked', SmartWalletMismatchDetected = 'Smart Wallet Mismatch Detected', + SpamReportSubmitted = 'Spam Report Submitted', TokenSelected = 'Token Selected', TooltipOpened = 'Tooltip Opened', // alphabetize additional values. diff --git a/packages/uniswap/src/features/telemetry/constants/wallet.ts b/packages/uniswap/src/features/telemetry/constants/wallet.ts index ac30e6cef36..d03306afeda 100644 --- a/packages/uniswap/src/features/telemetry/constants/wallet.ts +++ b/packages/uniswap/src/features/telemetry/constants/wallet.ts @@ -28,6 +28,7 @@ export enum WalletEventName { PortfolioBalanceFreshnessLag = 'Portfolio Balance Freshness Lag', SendRecipientSelected = 'Send Recipient Selected', ShareButtonClicked = 'Share Button Clicked', + SilentPushReceived = 'Silent Push Received', SwapSubmitted = 'Swap Submitted to Provider', CancelSubmitted = 'Cancel Submitted to Provider', SwapTransactionCancelled = 'Swap Transaction Cancelled', diff --git a/packages/uniswap/src/features/telemetry/types.ts b/packages/uniswap/src/features/telemetry/types.ts index a712650d81c..074e7da6d0e 100644 --- a/packages/uniswap/src/features/telemetry/types.ts +++ b/packages/uniswap/src/features/telemetry/types.ts @@ -4,6 +4,7 @@ import { TransactionRequest as EthersTransactionRequest } from '@ethersproject/p import { SerializedError } from '@reduxjs/toolkit' import { FetchBaseQueryError } from '@reduxjs/toolkit/dist/query' import { SharedEventName } from '@uniswap/analytics-events' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { OnChainStatus } from '@uniswap/client-trading/dist/trading/v1/api_pb' import { Currency, TradeType } from '@uniswap/sdk-core' import { TradingApi, UnitagClaimContext } from '@universe/api' @@ -30,6 +31,7 @@ import { WalletEventName, } from 'uniswap/src/features/telemetry/constants' import { TokenProtectionWarning } from 'uniswap/src/features/tokens/safetyUtils' +import { TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails' import { WrapType } from 'uniswap/src/features/transactions/types/wrap' import { CurrencyField } from 'uniswap/src/types/currency' import { LimitsExpiry } from 'uniswap/src/types/limits' @@ -489,6 +491,14 @@ export type LiquidityAnalyticsProperties = ITraceContext & { export type NotificationToggleLoggingType = 'settings_general_updates_enabled' | 'wallet_activity' +type TokenReportProperties = { + is_marked_spam?: Maybe + token_name?: string + token_contract_address?: string + chain_id: UniverseChainId + text?: string +} + // Please sort new values by EventName type! export type UniverseEventProperties = { [ExtensionEventName.BackgroundAttemptedToOpenSidebar]: { hasError: boolean } @@ -929,6 +939,18 @@ export type UniverseEventProperties = { eventName: string platformIdType: string } + [UniswapEventName.DataReportSubmitted]: + | (TokenReportProperties & { + type: 'data' + price?: boolean + volume?: boolean + price_chart?: boolean + token_details?: boolean + something_else?: boolean + }) + | (TokenReportProperties & { + type: 'token_warning' + }) [UniswapEventName.TokenSelected]: | (ITraceContext & AssetDetailsBaseProperties & @@ -961,6 +983,37 @@ export type UniverseEventProperties = { chainId: string delegatedAddress: string } + [UniswapEventName.SpamReportSubmitted]: + | (TokenReportProperties & { + type: 'token' + source: 'portfolio' | 'token-details' + spam_token: boolean + imposter_token: boolean + hidden_fees: boolean + something_else: boolean + }) + | { + type: 'nft' + chain_id?: UniverseChainId + contract_address?: Address + token_id?: string + } + | { + type: 'activity' + address?: Address + transaction_id: string + chain_id: UniverseChainId + hash?: string + transaction_type: TransactionType + } + | { + type: 'pool' + pool_id: string + version: ProtocolVersion + chain_id: UniverseChainId + token0: string + token1: string + } [UnitagEventName.UnitagBannerActionTaken]: { action: 'claim' | 'dismiss' entryPoint: 'home' | 'settings' @@ -1045,6 +1098,9 @@ export type UniverseEventProperties = { entity: ShareableEntity url: string } + [WalletEventName.SilentPushReceived]: { + template_id: string + } [WalletEventName.SwapSubmitted]: ( | { transaction_hash: string diff --git a/packages/uniswap/src/features/tokens/TokenWarningModal.tsx b/packages/uniswap/src/features/tokens/TokenWarningModal.tsx index 9c4a45d78d9..840509b5c5e 100644 --- a/packages/uniswap/src/features/tokens/TokenWarningModal.tsx +++ b/packages/uniswap/src/features/tokens/TokenWarningModal.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { TFunction } from 'i18next' import { useState } from 'react' import { Trans, useTranslation } from 'react-i18next' @@ -11,6 +12,7 @@ import { LearnMoreLink } from 'uniswap/src/components/text/LearnMoreLink' import WarningIcon from 'uniswap/src/components/warnings/WarningIcon' import { uniswapUrls } from 'uniswap/src/constants/urls' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' +import { submitTokenWarningDataReport } from 'uniswap/src/features/reporting/reports' import { ModalName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' import { useBlockaidFeeComparisonAnalytics } from 'uniswap/src/features/tokens/hooks/useBlockaidFeeComparisonAnalytics' @@ -31,6 +33,7 @@ import { useDismissedTokenWarnings } from 'uniswap/src/features/tokens/slice/hoo import { TokenWarningFlagsTable } from 'uniswap/src/features/tokens/TokenWarningFlagsTable' import { currencyIdToAddress } from 'uniswap/src/utils/currencyId' import { isMobileApp } from 'utilities/src/platform' +import { useEvent } from 'utilities/src/react/hooks' export interface FoTPercent { buyFeePercent?: number @@ -51,6 +54,7 @@ interface TokenWarningModalContentProps extends TokenWarningProps { onAcknowledgeButton: () => void onDismissTokenWarning0: () => void onDismissTokenWarning1?: () => void + onReportSuccess?: () => void } export interface TokenWarningModalProps extends TokenWarningProps { isVisible: boolean @@ -59,6 +63,7 @@ export interface TokenWarningModalProps extends TokenWarningProps { onToken1BlockAcknowledged?: () => void closeModalOnly: () => void // callback that purely just closes the modal onAcknowledge: () => void + onReportSuccess?: () => void // callback to send a report of an incorrect warning, which enables the report UI when applied } const BLOCKAID_LOGO_WIDTH = 50 @@ -76,6 +81,7 @@ function TokenWarningModalContent({ feeOnTransferOverride, onDismissTokenWarning0, onDismissTokenWarning1, + onReportSuccess, }: TokenWarningModalContentProps): JSX.Element | null { const { t } = useTranslation() @@ -138,6 +144,25 @@ function TokenWarningModalContent({ onAcknowledgeButton() } + const isDataReportingEnabled = useFeatureFlag(FeatureFlags.DataReportingAbilities) + const showReportUI = isDataReportingEnabled && tokenProtectionWarning > TokenProtectionWarning.NonDefault + + const sendReport = useEvent((reportText: string) => { + // send report to amplitude + submitTokenWarningDataReport({ + chainId: currencyInfo0.currency.chainId, + tokenAddress: currencyIdToAddress(currencyInfo0.currencyId), + tokenName: currencyInfo0.currency.name, + reportText, + }) + + // report success for the given case + onReportSuccess?.() + + // close the modal + onAcknowledgeButton() + }) + if (severity === WarningSeverity.None) { return null } @@ -190,6 +215,7 @@ function TokenWarningModalContent({ {titleText} } + sendReport={showReportUI ? sendReport : undefined} onReject={onRejectButton} onClose={onRejectButton} onAcknowledge={onAcknowledge} @@ -301,6 +327,7 @@ export default function TokenWarningModal({ onToken1BlockAcknowledged, onAcknowledge, closeModalOnly, + onReportSuccess, }: TokenWarningModalProps): JSX.Element | null { const colors = useSporeColors() const [warningIndex, setWarningIndex] = useState<0 | 1>(0) @@ -343,6 +370,7 @@ export default function TokenWarningModal({ hasSecondWarning={hasSecondWarning} shouldBeCombinedPlural={combinedPlural} feeOnTransferOverride={feeOnTransferOverride} + onReportSuccess={onReportSuccess} onRejectButton={onReject ?? closeModalOnly} onAcknowledgeButton={() => { if (hasSecondWarning) { @@ -365,6 +393,7 @@ export default function TokenWarningModal({ { setWarningIndex(0) diff --git a/packages/uniswap/src/features/tokens/hooks/useBlockaidFeeComparisonAnalytics.ts b/packages/uniswap/src/features/tokens/hooks/useBlockaidFeeComparisonAnalytics.ts index 54e01673dd8..7eb4e106016 100644 --- a/packages/uniswap/src/features/tokens/hooks/useBlockaidFeeComparisonAnalytics.ts +++ b/packages/uniswap/src/features/tokens/hooks/useBlockaidFeeComparisonAnalytics.ts @@ -3,7 +3,7 @@ import { useEffect, useRef } from 'react' import { getNativeAddress } from 'uniswap/src/constants/addresses' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' import { UniswapEventName } from 'uniswap/src/features/telemetry/constants' -import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send.web' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { getTokenProtectionFeeOnTransfer } from 'uniswap/src/features/tokens/safetyUtils' /** diff --git a/packages/uniswap/src/features/tokens/safetyUtils.test.ts b/packages/uniswap/src/features/tokens/safetyUtils.test.ts index d79825360ed..63eaff3c533 100644 --- a/packages/uniswap/src/features/tokens/safetyUtils.test.ts +++ b/packages/uniswap/src/features/tokens/safetyUtils.test.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-lines */ import { Currency, NativeCurrency, Token } from '@uniswap/sdk-core' import { GraphQLApi } from '@universe/api' import { WarningSeverity } from 'uniswap/src/components/modals/WarningModal/types' diff --git a/packages/uniswap/src/features/transactions/modals/HiddenTokenInfoModal.tsx b/packages/uniswap/src/features/transactions/modals/HiddenTokenInfoModal.tsx index 8cffd899ac6..fb089928536 100644 --- a/packages/uniswap/src/features/transactions/modals/HiddenTokenInfoModal.tsx +++ b/packages/uniswap/src/features/transactions/modals/HiddenTokenInfoModal.tsx @@ -5,7 +5,7 @@ import { ShieldCheck } from 'ui/src/components/icons/ShieldCheck' import { InfoLinkModal } from 'uniswap/src/components/modals/InfoLinkModal' import { uniswapUrls } from 'uniswap/src/constants/urls' import { ModalName, WalletEventName } from 'uniswap/src/features/telemetry/constants' -import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send.web' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' export function HiddenTokenInfoModal({ isOpen, onClose }: { isOpen: boolean; onClose: () => void }): JSX.Element { const { t } = useTranslation() diff --git a/packages/uniswap/src/features/transactions/modals/MaxBalanceInfoModal.tsx b/packages/uniswap/src/features/transactions/modals/MaxBalanceInfoModal.tsx index d91b4a402a5..0d67c3c2696 100644 --- a/packages/uniswap/src/features/transactions/modals/MaxBalanceInfoModal.tsx +++ b/packages/uniswap/src/features/transactions/modals/MaxBalanceInfoModal.tsx @@ -37,9 +37,7 @@ export function MaxBalanceInfoModal({ {isMax ? t('transaction.networkCost.maxNativeBalance.description') - : t('swap.warning.insufficientGas.button', { - currencySymbol: currencySymbol || '', - })} + : t('transaction.networkCost.presetNativeBalance.description')} } placement="top" @@ -52,11 +50,19 @@ export function MaxBalanceInfoModal({ <> {children} & { +type SwapArrowButtonProps = Pick< + TouchableAreaProps, + 'disabled' | 'testID' | 'onPress' | 'backgroundColor' | 'opacity' +> & { iconSize?: number } @@ -11,6 +14,7 @@ const hoverStyle: FlexProps['hoverStyle'] = { backgroundColor: '$surface2Hovered export function SwapArrowButton({ backgroundColor = '$surface2', + opacity = undefined, iconSize = iconSizes.icon24, disabled, onPress, @@ -30,6 +34,7 @@ export function SwapArrowButton({ hoverStyle={hoverStyle} disabled={disabled} testID={testID} + opacity={opacity} onPress={onPress} > diff --git a/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useInterfaceWrap.ts b/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useInterfaceWrap.ts deleted file mode 100644 index 8370bd3b2ac..00000000000 --- a/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useInterfaceWrap.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { useMemo } from 'react' -import { useSwapDependenciesStore } from 'uniswap/src/features/transactions/swap/stores/swapDependenciesStore/useSwapDependenciesStore' -import { - useSwapFormStore, - useSwapFormStoreDerivedSwapInfo, -} from 'uniswap/src/features/transactions/swap/stores/swapFormStore/useSwapFormStore' -import { useSwapTxStore } from 'uniswap/src/features/transactions/swap/stores/swapTxStore/useSwapTxStore' -import { isJupiter, isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing' -import { WrapType } from 'uniswap/src/features/transactions/types/wrap' -import { useWallet } from 'uniswap/src/features/wallet/hooks/useWallet' -import { CurrencyField } from 'uniswap/src/types/currency' -import { isWebApp } from 'utilities/src/platform' - -// TODO(WEB-5012): Align interface wrap UX into SwapReviewScreen -export function useInterfaceWrap(): { - isInterfaceWrap: boolean - onInterfaceWrap?: () => void -} { - // TODO(WALL-6391): remove direct usage and replace with SwapService - const wrapCallback = useSwapDependenciesStore((state) => state.wrapCallback) - const account = useWallet().evmAccount - const updateSwapForm = useSwapFormStore((s) => s.updateSwapForm) - const { currencyAmounts, txId, wrapType } = useSwapFormStoreDerivedSwapInfo((s) => ({ - currencyAmounts: s.currencyAmounts, - txId: s.txId, - wrapType: s.wrapType, - })) - const { txRequest, gasFeeEstimation } = useSwapTxStore((s) => { - if (isUniswapX(s) || isJupiter(s)) { - return { - txRequest: undefined, - gasFeeEstimation: s.gasFeeEstimation, - } - } - - return { - txRequest: s.txRequests?.[0], - gasFeeEstimation: s.gasFeeEstimation, - } - }) - - const isInterfaceWrap = isWebApp && wrapType !== WrapType.NotApplicable - - const onInterfaceWrap = useMemo(() => { - const inputCurrencyAmount = currencyAmounts[CurrencyField.INPUT] - if (!txRequest || !isInterfaceWrap || !account || !inputCurrencyAmount) { - return undefined - } - - const onSuccess = (): void => - updateSwapForm({ exactAmountFiat: undefined, exactAmountToken: '', isSubmitting: false }) - const onFailure = (): void => updateSwapForm({ isSubmitting: false }) - - return () => { - updateSwapForm({ isSubmitting: true }) - wrapCallback({ - account, - inputCurrencyAmount, - onSuccess, - onFailure, - txRequest, - txId, - wrapType, - gasEstimate: gasFeeEstimation.wrapEstimate, - }) - } - }, [ - currencyAmounts, - txRequest, - isInterfaceWrap, - account, - updateSwapForm, - wrapCallback, - txId, - wrapType, - gasFeeEstimation.wrapEstimate, - ]) - - return { isInterfaceWrap, onInterfaceWrap } -} diff --git a/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useIsSwapButtonDisabled.ts b/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useIsSwapButtonDisabled.ts index d7f90530b5f..9e29a1d3dcf 100644 --- a/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useIsSwapButtonDisabled.ts +++ b/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useIsSwapButtonDisabled.ts @@ -2,7 +2,6 @@ import { useActiveAddress, useActiveWallet } from 'uniswap/src/features/accounts import { SigningCapability } from 'uniswap/src/features/accounts/store/types/Wallet' import { useIsShowingWebFORNudge, useIsWebFORNudgeEnabled } from 'uniswap/src/features/providers/webForNudgeProvider' import { useTransactionModalContext } from 'uniswap/src/features/transactions/components/TransactionModal/TransactionModalContext' -import { useInterfaceWrap } from 'uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useInterfaceWrap' import { useIsMissingPlatformWallet } from 'uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useIsMissingPlatformWallet' import { useParsedSwapWarnings } from 'uniswap/src/features/transactions/swap/hooks/useSwapWarnings/useSwapWarnings' import { @@ -25,9 +24,6 @@ const useIsReviewButtonDisabled = (): boolean => { const { isBlocked: isBlockedAccount, isBlockedLoading: isBlockedAccountLoading } = useIsBlocked(activeAccountAddress) const { walletNeedsRestore } = useTransactionModalContext() - const { isInterfaceWrap, onInterfaceWrap } = useInterfaceWrap() - const isWrapDisabled = isInterfaceWrap && !onInterfaceWrap - return ( !!blockingWarning || isBlockedAccount || @@ -35,7 +31,6 @@ const useIsReviewButtonDisabled = (): boolean => { walletNeedsRestore || isSubmitting || isTradeMissing || - isWrapDisabled || isMissingPlatformWallet ) } diff --git a/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useSwapFormButtonText.ts b/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useSwapFormButtonText.ts index 292ec06cc5f..be565d133cc 100644 --- a/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useSwapFormButtonText.ts +++ b/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useSwapFormButtonText.ts @@ -5,7 +5,6 @@ import { useConnectionStatus } from 'uniswap/src/features/accounts/store/hooks' import { isSVMChain } from 'uniswap/src/features/platforms/utils/chains' import { useIsWebFORNudgeEnabled } from 'uniswap/src/features/providers/webForNudgeProvider' import { useTransactionModalContext } from 'uniswap/src/features/transactions/components/TransactionModal/TransactionModalContext' -import { useInterfaceWrap } from 'uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useInterfaceWrap' import { useIsAmountSelectionInvalid } from 'uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useIsAmountSelectionInvalid' import { useIsMissingPlatformWallet } from 'uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useIsMissingPlatformWallet' import { useIsTokenSelectionInvalid } from 'uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useIsTokenSelectionInvalid' @@ -13,10 +12,10 @@ import { useIsTradeIndicative } from 'uniswap/src/features/transactions/swap/com import { useParsedSwapWarnings } from 'uniswap/src/features/transactions/swap/hooks/useSwapWarnings/useSwapWarnings' import { getActionText } from 'uniswap/src/features/transactions/swap/review/SwapReviewScreen/SwapReviewFooter/SubmitSwapButton' import { useSwapFormStoreDerivedSwapInfo } from 'uniswap/src/features/transactions/swap/stores/swapFormStore/useSwapFormStore' +import { WrapType } from 'uniswap/src/features/transactions/types/wrap' import { CurrencyField } from 'uniswap/src/types/currency' export const useSwapFormButtonText = (): string => { - const { isInterfaceWrap } = useInterfaceWrap() const { t } = useTranslation() const { swapRedirectCallback } = useTransactionModalContext() const { currencies, wrapType, chainId } = useSwapFormStoreDerivedSwapInfo((s) => ({ @@ -39,6 +38,7 @@ export const useSwapFormButtonText = (): string => { const isIndicative = useIsTradeIndicative() const isWebFORNudgeEnabled = useIsWebFORNudgeEnabled() + const isWrap = wrapType !== WrapType.NotApplicable if (swapRedirectCallback) { return t('common.getStarted') @@ -82,7 +82,7 @@ export const useSwapFormButtonText = (): string => { return t('common.insufficientTokenBalance.error.simple', { tokenSymbol: nativeCurrency.symbol ?? '' }) } - if (isInterfaceWrap) { + if (isWrap) { return getActionText({ t, wrapType }) } diff --git a/packages/uniswap/src/features/transactions/swap/plan/planSaga.ts b/packages/uniswap/src/features/transactions/swap/plan/planSaga.ts index c3c8351dbcf..b28206898ab 100644 --- a/packages/uniswap/src/features/transactions/swap/plan/planSaga.ts +++ b/packages/uniswap/src/features/transactions/swap/plan/planSaga.ts @@ -1,5 +1,5 @@ import { Currency, CurrencyAmount } from '@uniswap/sdk-core' -import { PlanStepStatus, TradingApi } from '@universe/api' +import { PlanResponse, PlanStepStatus, TradingApi } from '@universe/api' import { call, delay, SagaGenerator } from 'typed-redux-saga' import { TradingApiClient } from 'uniswap/src/data/apiClients/tradingApi/TradingApiClient' import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' @@ -60,12 +60,12 @@ const MAX_ATTEMPTS = 60 */ function* waitForStepCompletion(params: { chainId: number - tradeId: string + planId: string targetStepId: string currentStepIndex: number inputAmount: CurrencyAmount }): SagaGenerator { - const { chainId, tradeId, targetStepId, currentStepIndex, inputAmount } = params + const { chainId, planId, targetStepId, currentStepIndex, inputAmount } = params const pollingInterval = getChainInfo(chainId).tradingApiPollingIntervalMs let attempt = 0 @@ -78,7 +78,7 @@ function* waitForStepCompletion(params: { maxAttempts: MAX_ATTEMPTS, }) - const tradeStatusResponse = yield* call(TradingApiClient.getExistingTrade, { tradeId }) + const tradeStatusResponse = yield* call(TradingApiClient.getExistingPlan, { planId }) const latestTargetStep = tradeStatusResponse.steps.find((_step) => _step.stepId === targetStepId) if (!latestTargetStep) { throw new Error(`Target stepId=${targetStepId} not found in latest plan.`) @@ -128,18 +128,20 @@ function* plan(params: SwapParams & PlanCalls) { return } - const { trade, tradeId: inputTradeId } = swapTxContext + const { trade, planId: inputPlanId } = swapTxContext - let response - if (!inputTradeId) { - response = yield* call(TradingApiClient.fetchNewTrade, { + let response: PlanResponse + if (!inputPlanId) { + // TODO: SWAP-429 - Update to ChainedQuoteResponse is added to the TAPI sdk + response = yield* call(TradingApiClient.createNewPlan, { quote: swapTxContext.trade.quote.quote, + routing: swapTxContext.trade.quote.routing, }) } else { - response = yield* call(TradingApiClient.updateExistingTrade, { tradeId: inputTradeId, steps: [] }) + response = yield* call(TradingApiClient.updateExistingPlan, { planId: inputPlanId, steps: [] }) } let steps: TransactionAndPlanStep[] = transformSteps(response.steps, swapTxContext.trade.inputAmount) - const tradeId = response.tradeId + const planId = response.planId let currentStepIndex = steps.findIndex((step) => step.status !== PlanStepStatus.COMPLETE) let currentStep = steps[currentStepIndex] @@ -194,9 +196,9 @@ function* plan(params: SwapParams & PlanCalls) { } if (hash || signature) { - logger.debug('planSaga', 'plan', '🚨 updating existing trade', tradeId, hash, signature) - yield* call(TradingApiClient.updateExistingTrade, { - tradeId, + logger.debug('planSaga', 'plan', '🚨 updating existing trade', planId, hash, signature) + yield* call(TradingApiClient.updateExistingPlan, { + planId, steps: [{ stepId: currentStep.stepId, proof: { txHash: hash, signature } }], }) } else { @@ -210,7 +212,7 @@ function* plan(params: SwapParams & PlanCalls) { const updatedSteps: TransactionAndPlanStep[] = yield* call(waitForStepCompletion, { chainId: swapChainId, - tradeId, + planId, targetStepId: currentStep.stepId, currentStepIndex, inputAmount: swapTxContext.trade.inputAmount, diff --git a/packages/uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/chained/chainedActionTxSwapAndGasInfoService.ts b/packages/uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/chained/chainedActionTxSwapAndGasInfoService.ts index 458ad69f92c..7253f411e71 100644 --- a/packages/uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/chained/chainedActionTxSwapAndGasInfoService.ts +++ b/packages/uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/chained/chainedActionTxSwapAndGasInfoService.ts @@ -1,14 +1,24 @@ import { TradeType } from '@uniswap/sdk-core' -import { TradingApi } from '@universe/api' +import { GasStrategy, TradingApi } from '@universe/api' import isEqual from 'lodash/isEqual' import omit from 'lodash/omit' import { TradingApiClient } from 'uniswap/src/data/apiClients/tradingApi/TradingApiClient' +import { convertGasFeeToDisplayValue } from 'uniswap/src/features/gas/hooks' import { GasFeeResult } from 'uniswap/src/features/gas/types' import type { SwapTxAndGasInfoService } from 'uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/swapTxAndGasInfoService' import { getSwapInputExceedsBalance } from 'uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/utils' +import { ChainedSwapTxAndGasInfo } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' import type { ChainedActionTrade } from 'uniswap/src/features/transactions/swap/types/trade' import { tryCatch } from 'utilities/src/errors' +const UNUSED_CHAINED_ACTIONS_FIELDS: Pick< + ChainedSwapTxAndGasInfo, + 'approveTxRequest' | 'revocationTxRequest' | 'txRequests' +> = { + approveTxRequest: undefined, + revocationTxRequest: undefined, + txRequests: undefined, +} /** * Creates a SwapTxAndGasInfoService for Chained Action trades. Since creating a trade is a non trivial * operation we only create 1 trade per quote. When the quote changes, we request a new trade plan, @@ -17,7 +27,7 @@ import { tryCatch } from 'utilities/src/errors' * @returns SwapTxAndGasInfoService for Chained Action trades */ export function createChainedActionSwapTxAndGasInfoService(): SwapTxAndGasInfoService { - let tradeId: string | undefined + let planId: string | undefined let prevQuote: TradingApi.Quote | undefined const service: SwapTxAndGasInfoService = { async getSwapTxAndGasInfo(params) { @@ -25,7 +35,7 @@ export function createChainedActionSwapTxAndGasInfoService(): SwapTxAndGasInfoSe const newQuote = trade.quote.quote if (!isSameQuote({ newQuote, tradeType: params.trade.tradeType, prevQuote })) { - tradeId = undefined + planId = undefined } prevQuote = newQuote @@ -33,38 +43,47 @@ export function createChainedActionSwapTxAndGasInfoService(): SwapTxAndGasInfoSe // TODO SWAP-485 - handle API error cases/skip conditions let tradeResponse - if (tradeId) { + if (planId) { const { data } = await tryCatch( - skip ? Promise.resolve(undefined) : TradingApiClient.getExistingTrade({ tradeId }), + skip ? Promise.resolve(undefined) : TradingApiClient.getExistingPlan({ planId }), ) tradeResponse = data } else { const { data } = await tryCatch( - skip ? Promise.resolve(undefined) : TradingApiClient.fetchNewTrade({ quote: trade.quote.quote }), + skip + ? Promise.resolve(undefined) + : TradingApiClient.createNewPlan({ quote: trade.quote.quote, routing: TradingApi.Routing.CHAINED }), ) tradeResponse = data } + // Preserve tradeId if previous fetch was skipped - tradeId = tradeResponse?.tradeId ?? tradeId + planId = tradeResponse?.planId ?? planId + + // @ts-expect-error TODO API-1530 SWAP-458: once fixed use convertGasFeeToDisplayValue(newQuote.gasFee, newQuote.gasStrategy) + const gasStrategy: GasStrategy | undefined = newQuote.gasStrategies?.[0] + ? { + // @ts-expect-error TODO API-1530 SWAP-458: once fixed use convertGasFeeToDisplayValue(newQuote.gasFee, newQuote.gasStrategy) + ...newQuote.gasStrategies[0], + displayLimitInflationFactor: 1, + } + : undefined - // TODO: SWAP-476 - add gas fee estimation const gasFee: GasFeeResult = { - value: trade.quote.quote.gasFee, - displayValue: trade.quote.quote.gasFeeUSD, + value: newQuote.gasFee, + displayValue: convertGasFeeToDisplayValue(newQuote.gasFee, gasStrategy), isLoading: false, error: null, } return { + ...UNUSED_CHAINED_ACTIONS_FIELDS, routing: TradingApi.Routing.CHAINED, trade, - approveTxRequest: undefined, - revocationTxRequest: undefined, gasFee, gasFeeEstimation: {}, includesDelegation: false, - txRequests: undefined, - tradeId, + planId, } }, } diff --git a/packages/uniswap/src/features/transactions/swap/services/executeSwapService.ts b/packages/uniswap/src/features/transactions/swap/services/executeSwapService.ts index 0a85b55f980..f817d1aae13 100644 --- a/packages/uniswap/src/features/transactions/swap/services/executeSwapService.ts +++ b/packages/uniswap/src/features/transactions/swap/services/executeSwapService.ts @@ -1,31 +1,16 @@ import type { PresetPercentage } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/types' import type { SwapTxStoreState } from 'uniswap/src/features/transactions/swap/stores/swapTxStore/createSwapTxStore' import type { DerivedSwapInfo } from 'uniswap/src/features/transactions/swap/types/derivedSwapInfo' -import type { SwapCallback, SwapCallbackParams } from 'uniswap/src/features/transactions/swap/types/swapCallback' +import type { SwapCallbackParams } from 'uniswap/src/features/transactions/swap/types/swapCallback' import type { ExecuteSwapCallback, PrepareSwapCallback, } from 'uniswap/src/features/transactions/swap/types/swapHandlers' import type { SwapTxAndGasInfo } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' import { isValidSwapTxContext } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' -import type { WrapCallback, WrapCallbackParams } from 'uniswap/src/features/transactions/swap/types/wrapCallback' -import { getEVMTxRequest, isWrap } from 'uniswap/src/features/transactions/swap/utils/routing' import { AccountDetails, isSignerMnemonicAccountDetails } from 'uniswap/src/features/wallet/types/AccountDetails' import { CurrencyField } from 'uniswap/src/types/currency' -type ExecuteSwapInput = { - currencyInAmountUSD: SwapCallbackParams['currencyInAmountUSD'] - currencyOutAmountUSD: SwapCallbackParams['currencyOutAmountUSD'] - isAutoSlippage: SwapCallbackParams['isAutoSlippage'] - txId: SwapCallbackParams['txId'] -} - -type ExecuteWrapInput = { - inputCurrencyAmount?: WrapCallbackParams['inputCurrencyAmount'] - txId: WrapCallbackParams['txId'] - wrapType?: WrapCallbackParams['wrapType'] -} - type ExecuteSwap = () => void export interface ExecuteSwapService { @@ -53,140 +38,59 @@ export function createExecuteSwapService(ctx: { onPending: () => void setCurrentStep: SwapCallbackParams['setCurrentStep'] setSteps: SwapCallbackParams['setSteps'] - swapCallback: SwapCallback - wrapCallback: WrapCallback - onPrepareSwap?: PrepareSwapCallback - onExecuteSwap?: ExecuteSwapCallback + onPrepareSwap: PrepareSwapCallback + onExecuteSwap: ExecuteSwapCallback }): { executeSwap: ExecuteSwap } { - function executeSwap(input: ExecuteSwapInput): void { - const swapTxContext = ctx.getSwapTxContext?.() - const account = ctx.getAccount?.() - if ( - !account || - !swapTxContext || - !isSignerMnemonicAccountDetails(account) || - !isValidSwapTxContext(swapTxContext) - ) { - return - } - const { presetPercentage, preselectAsset } = ctx.getPresetInfo() - - const txRequest = getEVMTxRequest(swapTxContext) - const isSmartWalletTransaction = txRequest?.to === account.address - - ctx.swapCallback({ - // input - txId: input.txId, - currencyInAmountUSD: input.currencyInAmountUSD, - currencyOutAmountUSD: input.currencyOutAmountUSD, - isAutoSlippage: input.isAutoSlippage, - // ctx - isFiatInputMode: ctx.getIsFiatMode?.(), - account, - swapTxContext, - presetPercentage, - preselectAsset, - isSmartWalletTransaction, - includesDelegation: swapTxContext.includesDelegation, - onSuccess: ctx.onSuccess, - onFailure: ctx.onFailure, - onPending: ctx.onPending, - setCurrentStep: ctx.setCurrentStep, - setSteps: ctx.setSteps, - }) - } - - function executeWrap(input: ExecuteWrapInput): void { - const account = ctx.getAccount?.() - const swapTxContext = ctx.getSwapTxContext?.() - - // validate that the account and swapTxContext are defined - if (!account || !swapTxContext) { - return - } - - const txRequest = isWrap(swapTxContext) ? swapTxContext.txRequests?.[0] : undefined - - if (!txRequest || !input.inputCurrencyAmount || !input.wrapType) { - return - } - - ctx.wrapCallback({ - // input - inputCurrencyAmount: input.inputCurrencyAmount, - txRequest, - txId: input.txId, - wrapType: input.wrapType, - // ctx - account, - gasEstimate: swapTxContext.gasFeeEstimation.wrapEstimate, - onSuccess: ctx.onSuccess, - onFailure: ctx.onFailure, - }) - } - - // Our unified interface - determines which operation to execute + // Unified execution pattern - handles both swaps and wraps through SwapHandlers return { executeSwap: (): void => { - if (ctx.onPrepareSwap && ctx.onExecuteSwap) { - // New unified pattern: Use SwapHandlers for both swaps and wraps - const { currencyAmounts, currencyAmountsUSDValue, txId, wrapType } = ctx.getDerivedSwapInfo() - const { customSlippageTolerance } = ctx.getTxSettings() - const swapTxContext = ctx.getSwapTxContext?.() - const account = ctx.getAccount?.() - - if ( - !account || - !swapTxContext || - !isSignerMnemonicAccountDetails(account) || - !isValidSwapTxContext(swapTxContext) - ) { - ctx.onFailure(new Error('Invalid account or swap context')) - return - } - - const { presetPercentage, preselectAsset } = ctx.getPresetInfo() - - ctx - .onExecuteSwap({ - account, - swapTxContext, - currencyInAmountUSD: currencyAmountsUSDValue[CurrencyField.INPUT] ?? undefined, - currencyOutAmountUSD: currencyAmountsUSDValue[CurrencyField.OUTPUT] ?? undefined, - isAutoSlippage: !customSlippageTolerance, - presetPercentage, - preselectAsset, - onSuccess: ctx.onSuccess, - onFailure: ctx.onFailure, - onPending: ctx.onPending, - txId, - setCurrentStep: ctx.setCurrentStep, - setSteps: ctx.setSteps, - isFiatInputMode: ctx.getIsFiatMode?.(), - // Wrap-specific parameters (will be undefined for regular swaps) - wrapType, - inputCurrencyAmount: currencyAmounts.input ?? undefined, - }) - .catch(ctx.onFailure) - } else { - // Legacy pattern: Direct callback execution - const { currencyAmounts, currencyAmountsUSDValue, txId, wrapType } = ctx.getDerivedSwapInfo() - const { customSlippageTolerance } = ctx.getTxSettings() - if (wrapType) { - executeWrap({ - txId, - wrapType, - inputCurrencyAmount: currencyAmounts.input ?? undefined, - }) - } else { - executeSwap({ - txId, - currencyInAmountUSD: currencyAmountsUSDValue[CurrencyField.INPUT] ?? undefined, - currencyOutAmountUSD: currencyAmountsUSDValue[CurrencyField.OUTPUT] ?? undefined, - isAutoSlippage: !customSlippageTolerance, - }) - } + const { currencyAmounts, currencyAmountsUSDValue, txId, wrapType } = ctx.getDerivedSwapInfo() + const { customSlippageTolerance } = ctx.getTxSettings() + const swapTxContext = ctx.getSwapTxContext?.() + const account = ctx.getAccount?.() + + if ( + !account || + !swapTxContext || + !isSignerMnemonicAccountDetails(account) || + !isValidSwapTxContext(swapTxContext) + ) { + ctx.onFailure( + new Error( + !account + ? 'No account available' + : !swapTxContext + ? 'Missing swap transaction context' + : !isSignerMnemonicAccountDetails(account) + ? 'Invalid account type - must be signer mnemonic account' + : 'Invalid swap transaction context', + ), + ) + return } + + const { presetPercentage, preselectAsset } = ctx.getPresetInfo() + + ctx + .onExecuteSwap({ + account, + swapTxContext, + currencyInAmountUSD: currencyAmountsUSDValue[CurrencyField.INPUT] ?? undefined, + currencyOutAmountUSD: currencyAmountsUSDValue[CurrencyField.OUTPUT] ?? undefined, + isAutoSlippage: !customSlippageTolerance, + presetPercentage, + preselectAsset, + onSuccess: ctx.onSuccess, + onFailure: ctx.onFailure, + onPending: ctx.onPending, + txId, + setCurrentStep: ctx.setCurrentStep, + setSteps: ctx.setSteps, + isFiatInputMode: ctx.getIsFiatMode?.(), + wrapType, + inputCurrencyAmount: currencyAmounts.input ?? undefined, + }) + .catch(ctx.onFailure) }, } } diff --git a/packages/uniswap/src/features/transactions/swap/services/hooks/useExecuteSwap.ts b/packages/uniswap/src/features/transactions/swap/services/hooks/useExecuteSwap.ts index 34d54c85e7c..004b719c87d 100644 --- a/packages/uniswap/src/features/transactions/swap/services/hooks/useExecuteSwap.ts +++ b/packages/uniswap/src/features/transactions/swap/services/hooks/useExecuteSwap.ts @@ -6,22 +6,19 @@ import type { GetExecuteSwapService } from 'uniswap/src/features/transactions/sw import { createExecuteSwapService } from 'uniswap/src/features/transactions/swap/services/executeSwapService' import { useSwapFormStore } from 'uniswap/src/features/transactions/swap/stores/swapFormStore/useSwapFormStore' import type { DerivedSwapInfo } from 'uniswap/src/features/transactions/swap/types/derivedSwapInfo' -import type { SetCurrentStepFn, SwapCallback } from 'uniswap/src/features/transactions/swap/types/swapCallback' +import type { SetCurrentStepFn } from 'uniswap/src/features/transactions/swap/types/swapCallback' import type { SwapHandlers } from 'uniswap/src/features/transactions/swap/types/swapHandlers' import type { SwapTxAndGasInfo } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' -import type { WrapCallback } from 'uniswap/src/features/transactions/swap/types/wrapCallback' import { useWallet } from 'uniswap/src/features/wallet/hooks/useWallet' import { useEvent } from 'utilities/src/react/hooks' interface UseSwapServiceParams { - swapCallback: SwapCallback - wrapCallback: WrapCallback - swapHandlers?: SwapHandlers + swapHandlers: SwapHandlers derivedSwapInfo: DerivedSwapInfo } export function useCreateGetExecuteSwapService(ctx: UseSwapServiceParams): GetExecuteSwapService { - const { swapCallback, wrapCallback, swapHandlers, derivedSwapInfo } = ctx + const { swapHandlers, derivedSwapInfo } = ctx const wallet = useWallet() const account = isSVMChain(derivedSwapInfo.chainId) ? wallet.svmAccount : wallet.evmAccount @@ -65,21 +62,10 @@ export function useCreateGetExecuteSwapService(ctx: UseSwapServiceParams): GetEx onPending: input.onPending, setCurrentStep: input.setCurrentStep, setSteps: input.setSteps, - swapCallback, - wrapCallback, - onPrepareSwap: swapHandlers?.prepareAndSign, - onExecuteSwap: swapHandlers?.execute, + onPrepareSwap: swapHandlers.prepareAndSign, + onExecuteSwap: swapHandlers.execute, }) }, - [ - swapCallback, - wrapCallback, - swapHandlers, - getAccount, - getDerivedSwapInfo, - getPresetInfo, - getIsFiatMode, - getTxSettings, - ], + [swapHandlers, getAccount, getDerivedSwapInfo, getPresetInfo, getIsFiatMode, getTxSettings], ) } diff --git a/packages/uniswap/src/features/transactions/swap/services/hooks/usePrepareSwap.ts b/packages/uniswap/src/features/transactions/swap/services/hooks/usePrepareSwap.ts index e2ed741a933..ec134e49a94 100644 --- a/packages/uniswap/src/features/transactions/swap/services/hooks/usePrepareSwap.ts +++ b/packages/uniswap/src/features/transactions/swap/services/hooks/usePrepareSwap.ts @@ -2,7 +2,6 @@ import { useUniswapContext } from 'uniswap/src/contexts/UniswapContext' import { AccountType } from 'uniswap/src/features/accounts/types' import { isSVMChain } from 'uniswap/src/features/platforms/utils/chains' import { useTransactionModalContext } from 'uniswap/src/features/transactions/components/TransactionModal/TransactionModalContext' -import { useInterfaceWrap } from 'uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useInterfaceWrap' import { useSwapFormWarningStoreActions } from 'uniswap/src/features/transactions/swap/form/stores/swapFormWarningStore/useSwapFormWarningStore' import { useNeedsBridgedAssetWarning } from 'uniswap/src/features/transactions/swap/hooks/useNeedsBridgedAssetWarning' import { useNeedsBridgingWarning } from 'uniswap/src/features/transactions/swap/hooks/useSwapWarnings/useNeedsBridgingWarning' @@ -28,7 +27,6 @@ export function usePrepareSwap(ctx: { warningService: WarningService }): () => v handleShowViewOnlyModal, handleShowBridgedAssetModal, } = useSwapFormWarningStoreActions() - const { isInterfaceWrap, onInterfaceWrap } = useInterfaceWrap() const { derivedSwapInfo, updateSwapForm, exactAmountToken, prefilledCurrencies, isMax } = useSwapFormStore((s) => ({ derivedSwapInfo: s.derivedSwapInfo, updateSwapForm: s.updateSwapForm, @@ -59,7 +57,6 @@ export function usePrepareSwap(ctx: { warningService: WarningService }): () => v // getAction isConnected: !!activeAccount, isViewOnlyWallet, - isInterfaceWrap, currencies, exactAmountToken, exactCurrencyField, @@ -74,7 +71,6 @@ export function usePrepareSwap(ctx: { warningService: WarningService }): () => v handleShowBridgingWarningModal, handleShowMaxNativeTransferModal, handleShowBridgedAssetModal, - onInterfaceWrap, updateSwapForm, setScreen, // shared diff --git a/packages/uniswap/src/features/transactions/swap/services/prepareSwapService.ts b/packages/uniswap/src/features/transactions/swap/services/prepareSwapService.ts index 4887c7effcc..a9b9c9cc0a1 100644 --- a/packages/uniswap/src/features/transactions/swap/services/prepareSwapService.ts +++ b/packages/uniswap/src/features/transactions/swap/services/prepareSwapService.ts @@ -47,7 +47,6 @@ interface GetActionContext { isConnected: boolean onConnectWallet?: (platform?: Platform) => void isViewOnlyWallet: boolean - isInterfaceWrap: boolean currencies: DerivedSwapInfo['currencies'] exactAmountToken?: string exactCurrencyField: CurrencyField @@ -62,7 +61,6 @@ const ReviewActionType = { REDIRECT: 'REDIRECT' as const, CONNECT_WALLET: 'CONNECT_WALLET' as const, SHOW_VIEW_ONLY: 'SHOW_VIEW_ONLY' as const, - INTERFACE_WRAP: 'INTERFACE_WRAP' as const, SHOW_TOKEN_WARNING: 'SHOW_TOKEN_WARNING' as const, SHOW_BRIDGING_WARNING: 'SHOW_BRIDGING_WARNING' as const, SHOW_LOW_BALANCE: 'SHOW_LOW_BALANCE' as const, @@ -84,7 +82,6 @@ type ReviewAction = | { type: typeof ReviewActionType.REDIRECT; payload: RedirectActionPayload } | { type: typeof ReviewActionType.CONNECT_WALLET; payload: ConnectWalletActionPayload } | { type: typeof ReviewActionType.SHOW_VIEW_ONLY } - | { type: typeof ReviewActionType.INTERFACE_WRAP } | { type: typeof ReviewActionType.SHOW_TOKEN_WARNING } | { type: typeof ReviewActionType.SHOW_BRIDGING_WARNING } | { type: typeof ReviewActionType.SHOW_LOW_BALANCE; payload: LowBalanceActionPayload } @@ -102,7 +99,6 @@ function createGetAction(ctx: GetActionContext): (args: CallbackArgs) => ReviewA isConnected, onConnectWallet, isViewOnlyWallet, - isInterfaceWrap, currencies, exactAmountToken, exactCurrencyField, @@ -129,8 +125,6 @@ function createGetAction(ctx: GetActionContext): (args: CallbackArgs) => ReviewA return { type: ReviewActionType.CONNECT_WALLET, payload: { platform: chainIdToPlatform(chainId) } } } else if (isViewOnlyWallet) { return { type: ReviewActionType.SHOW_VIEW_ONLY } - } else if (isInterfaceWrap) { - return { type: ReviewActionType.INTERFACE_WRAP } } else if (needsTokenProtectionWarning && !args.skipTokenProtectionWarning) { return { type: ReviewActionType.SHOW_TOKEN_WARNING } } else if (needsBridgingWarning && !args.skipBridgingWarning) { @@ -158,7 +152,6 @@ interface HandleEventActionContext { handleShowBridgedAssetModal: () => void swapRedirectCallback?: SwapRedirectFn onConnectWallet?: (platform?: Platform) => void - onInterfaceWrap?: () => void updateSwapForm: (newState: Partial) => void setScreen: (screen: TransactionScreen) => void } @@ -172,7 +165,6 @@ function createHandleEventAction(ctx: HandleEventActionContext): (action: Review handleShowBridgedAssetModal, swapRedirectCallback, onConnectWallet, - onInterfaceWrap, updateSwapForm, setScreen, } = ctx @@ -187,9 +179,6 @@ function createHandleEventAction(ctx: HandleEventActionContext): (action: Review case ReviewActionType.SHOW_VIEW_ONLY: handleShowViewOnlyModal() break - case ReviewActionType.INTERFACE_WRAP: - onInterfaceWrap?.() - break case ReviewActionType.SHOW_TOKEN_WARNING: handleShowTokenWarningModal() break diff --git a/packages/uniswap/src/features/transactions/swap/stores/swapDependenciesStore/SwapDependenciesStoreContextProvider.tsx b/packages/uniswap/src/features/transactions/swap/stores/swapDependenciesStore/SwapDependenciesStoreContextProvider.tsx index 0ba3f679ab6..3c369da9176 100644 --- a/packages/uniswap/src/features/transactions/swap/stores/swapDependenciesStore/SwapDependenciesStoreContextProvider.tsx +++ b/packages/uniswap/src/features/transactions/swap/stores/swapDependenciesStore/SwapDependenciesStoreContextProvider.tsx @@ -4,29 +4,21 @@ import { useCreateGetExecuteSwapService } from 'uniswap/src/features/transaction import { createSwapDependenciesStore } from 'uniswap/src/features/transactions/swap/stores/swapDependenciesStore/createSwapDependenciesStore' import { SwapDependenciesStoreContext } from 'uniswap/src/features/transactions/swap/stores/swapDependenciesStore/SwapDependenciesStoreContext' import { useSwapFormStore } from 'uniswap/src/features/transactions/swap/stores/swapFormStore/useSwapFormStore' -import type { SwapCallback } from 'uniswap/src/features/transactions/swap/types/swapCallback' import type { SwapHandlers } from 'uniswap/src/features/transactions/swap/types/swapHandlers' -import type { WrapCallback } from 'uniswap/src/features/transactions/swap/types/wrapCallback' import { useHasValueChanged } from 'utilities/src/react/useHasValueChanged' interface SwapDependenciesStoreContextProviderProps { children: ReactNode - swapCallback: SwapCallback - wrapCallback: WrapCallback - swapHandlers?: SwapHandlers + swapHandlers: SwapHandlers } export const SwapDependenciesStoreContextProvider = ({ children, - swapCallback, - wrapCallback, swapHandlers, }: SwapDependenciesStoreContextProviderProps): JSX.Element => { const derivedSwapInfo = useSwapFormStore((s) => s.derivedSwapInfo) const getExecuteSwapService = useCreateGetExecuteSwapService({ - swapCallback, - wrapCallback, swapHandlers, derivedSwapInfo, }) @@ -35,10 +27,9 @@ export const SwapDependenciesStoreContextProvider = ({ return { derivedSwapInfo, getExecuteSwapService, - prepareSwapTransaction: swapHandlers?.prepareAndSign, - wrapCallback, + prepareSwapTransaction: swapHandlers.prepareAndSign, } - }, [derivedSwapInfo, getExecuteSwapService, swapHandlers, wrapCallback]) + }, [derivedSwapInfo, getExecuteSwapService, swapHandlers]) const [store] = useState(() => createSwapDependenciesStore(derivedState)) diff --git a/packages/uniswap/src/features/transactions/swap/stores/swapDependenciesStore/createSwapDependenciesStore.ts b/packages/uniswap/src/features/transactions/swap/stores/swapDependenciesStore/createSwapDependenciesStore.ts index 49116aad509..b4c67c97f96 100644 --- a/packages/uniswap/src/features/transactions/swap/stores/swapDependenciesStore/createSwapDependenciesStore.ts +++ b/packages/uniswap/src/features/transactions/swap/stores/swapDependenciesStore/createSwapDependenciesStore.ts @@ -1,7 +1,6 @@ import type { GetExecuteSwapService } from 'uniswap/src/features/transactions/swap/services/executeSwapService' import type { DerivedSwapInfo } from 'uniswap/src/features/transactions/swap/types/derivedSwapInfo' import { PrepareSwapCallback } from 'uniswap/src/features/transactions/swap/types/swapHandlers' -import type { WrapCallback } from 'uniswap/src/features/transactions/swap/types/wrapCallback' import { isDevEnv } from 'utilities/src/environment/env' import type { StoreApi, UseBoundStore } from 'zustand' import { create } from 'zustand' @@ -11,12 +10,10 @@ export type SwapDependenciesState = { derivedSwapInfo: DerivedSwapInfo getExecuteSwapService: GetExecuteSwapService prepareSwapTransaction?: PrepareSwapCallback - wrapCallback: WrapCallback actions: { setDerivedSwapInfo: (derivedSwapInfo: DerivedSwapInfo) => void setGetExecuteSwapService: (getExecuteSwapService: GetExecuteSwapService) => void setPrepareSwapTransaction: (prepareSwapTransaction: PrepareSwapCallback) => void - setWrapCallback: (wrapCallback: WrapCallback) => void } } @@ -26,7 +23,6 @@ export const createSwapDependenciesStore = ({ derivedSwapInfo, getExecuteSwapService, prepareSwapTransaction, - wrapCallback, }: Omit): SwapDependenciesStore => create()( devtools( @@ -34,14 +30,12 @@ export const createSwapDependenciesStore = ({ derivedSwapInfo, getExecuteSwapService, prepareSwapTransaction, - wrapCallback, actions: { setDerivedSwapInfo: (newDerivedSwapInfo): void => set({ derivedSwapInfo: newDerivedSwapInfo }), setGetExecuteSwapService: (newGetExecuteSwapService): void => set({ getExecuteSwapService: newGetExecuteSwapService }), setPrepareSwapTransaction: (newPrepareSwapTransaction): void => set({ prepareSwapTransaction: newPrepareSwapTransaction }), - setWrapCallback: (newWrapCallback): void => set({ wrapCallback: newWrapCallback }), }, }), { diff --git a/packages/uniswap/src/features/transactions/swap/types/swapTxAndGasInfo.ts b/packages/uniswap/src/features/transactions/swap/types/swapTxAndGasInfo.ts index 843a9a600e1..78b200c51ea 100644 --- a/packages/uniswap/src/features/transactions/swap/types/swapTxAndGasInfo.ts +++ b/packages/uniswap/src/features/transactions/swap/types/swapTxAndGasInfo.ts @@ -128,7 +128,7 @@ export interface SolanaSwapTxAndGasInfo extends BaseSwapTxAndGasInfo { // TODO: SWAP-458 - Subject to change. export interface ChainedSwapTxAndGasInfo extends BaseSwapTxAndGasInfo { routing: TradingApi.Routing.CHAINED - tradeId: string | undefined + planId: string | undefined trade: ChainedActionTrade txRequests: PopulatedTransactionRequestArray | undefined /** Not needed for Chained Actions since it's already included in the steps/txRequests */ @@ -198,16 +198,6 @@ export type ValidatedChainedSwapTxAndGasInfo = Prettify< */ function validateSwapTxContext(swapTxContext: SwapTxAndGasInfo): ValidatedSwapTxContext | undefined { const gasFee = validateGasFeeResult(swapTxContext.gasFee) - // TODO: SWAP-476 - add gas fee estimation for chained actions - // move this function to the if(swapTxContext.trade) block - if (swapTxContext.trade && isChained(swapTxContext)) { - return { - ...swapTxContext, - // TODO SWAP-433: Add smart wallet delegation to chained actions - includesDelegation: false, - gasFee: { ...gasFee, value: gasFee?.value ?? '', isLoading: false, error: null }, - } - } if (!gasFee) { return undefined @@ -247,6 +237,9 @@ function validateSwapTxContext(swapTxContext: SwapTxAndGasInfo): ValidatedSwapTx } } else if (isJupiter(swapTxContext) && swapTxContext.transactionBase64) { return { ...swapTxContext, transactionBase64: swapTxContext.transactionBase64, gasFee } + } else if (isChained(swapTxContext)) { + const { includesDelegation } = swapTxContext + return { ...swapTxContext, gasFee, includesDelegation: includesDelegation ?? false } } else { return undefined } diff --git a/packages/uniswap/src/features/transactions/types/transactionDetails.ts b/packages/uniswap/src/features/transactions/types/transactionDetails.ts index bbf7702002e..f75a2cdc74a 100644 --- a/packages/uniswap/src/features/transactions/types/transactionDetails.ts +++ b/packages/uniswap/src/features/transactions/types/transactionDetails.ts @@ -312,6 +312,9 @@ export interface BaseTransactionInfo { isSmartWalletTransaction?: boolean } +export const INFINITE_APPROVAL_AMOUNT = 'INF' +export const REVOKE_APPROVAL_AMOUNT = '0.0' + export interface ApproveTransactionInfo extends BaseTransactionInfo { type: TransactionType.Approve tokenAddress: string diff --git a/packages/uniswap/src/features/unitags/fileUtils.web.ts b/packages/uniswap/src/features/unitags/fileUtils.web.ts index db92991b398..fda518a25bd 100644 --- a/packages/uniswap/src/features/unitags/fileUtils.web.ts +++ b/packages/uniswap/src/features/unitags/fileUtils.web.ts @@ -60,11 +60,26 @@ export async function uploadFileToS3( const formData = new FormData() + if (!blob.type || !blob.type.startsWith('image/')) { + throw new Error('Invalid image type') + } + // Add the S3 fields to the form data Object.entries(creds.s3UploadFields).forEach(([key, value]) => { formData.append(key, value) }) + // Add Content-Type if not already provided by S3 fields (required by S3 policy to start with "image/") + const existingContentType = creds.s3UploadFields['Content-Type'] + if (existingContentType) { + // Validate existing Content-Type is an image type + if (!existingContentType.startsWith('image/')) { + throw new Error('Invalid Content-Type in S3 upload fields: must be an image type') + } + } else { + formData.append('Content-Type', blob.type) + } + // Add the file to the form data formData.append('file', blob) diff --git a/packages/uniswap/src/features/visibility/hooks/useIsActivityHidden.ts b/packages/uniswap/src/features/visibility/hooks/useIsActivityHidden.ts new file mode 100644 index 00000000000..c13e0c02089 --- /dev/null +++ b/packages/uniswap/src/features/visibility/hooks/useIsActivityHidden.ts @@ -0,0 +1,7 @@ +import { useSelector } from 'react-redux' +import { selectActivityVisibility } from 'uniswap/src/features/visibility/selectors' + +export function useIsActivityHidden(transactionId: string): boolean { + const activityVisibility = useSelector(selectActivityVisibility) + return activityVisibility[transactionId]?.isVisible === false +} diff --git a/packages/uniswap/src/features/visibility/hooks/useTokenVisibility.ts b/packages/uniswap/src/features/visibility/hooks/useTokenVisibility.ts new file mode 100644 index 00000000000..0e92f9f9770 --- /dev/null +++ b/packages/uniswap/src/features/visibility/hooks/useTokenVisibility.ts @@ -0,0 +1,20 @@ +import { useMemo } from 'react' +import { useSelector } from 'react-redux' +import { normalizeCurrencyIdForMapLookup } from 'uniswap/src/data/cache' +import { selectTokensVisibility } from 'uniswap/src/features/visibility/selectors' +import type { CurrencyId } from 'uniswap/src/types/currency' + +/** + * Hook to determine token visibility by checking Redux state first, then falling back to cached flag + * @param currencyId - The currency ID to check visibility for + * @param cachedIsHidden - The cached isHidden flag from the API/portfolio balance + * @returns Whether the token should be visible + */ +export function useTokenVisibility(currencyId: CurrencyId, cachedIsHidden?: boolean | null): boolean { + const tokensVisibility = useSelector(selectTokensVisibility) + const normalizedCurrencyId = useMemo(() => normalizeCurrencyIdForMapLookup(currencyId), [currencyId]) + const manualVisibility = tokensVisibility[normalizedCurrencyId] + + // Check Redux state first, then fall back to cached isHidden flag + return manualVisibility?.isVisible !== undefined ? manualVisibility.isVisible : !cachedIsHidden +} diff --git a/packages/uniswap/src/features/visibility/selectors.ts b/packages/uniswap/src/features/visibility/selectors.ts index b28907d02c7..667ea7f034d 100644 --- a/packages/uniswap/src/features/visibility/selectors.ts +++ b/packages/uniswap/src/features/visibility/selectors.ts @@ -1,13 +1,10 @@ -import { useMemo } from 'react' -import { useSelector } from 'react-redux' -import { normalizeCurrencyIdForMapLookup } from 'uniswap/src/data/cache' import { + ActivityIdToVisibility, CurrencyIdToVisibility, NFTKeyToVisibility, PositionKeyToVisibility, } from 'uniswap/src/features/visibility/slice' import { UniswapRootState } from 'uniswap/src/state' -import type { CurrencyId } from 'uniswap/src/types/currency' export const selectPositionsVisibility = (state: UniswapRootState): PositionKeyToVisibility => state.visibility.positions @@ -16,17 +13,4 @@ export const selectTokensVisibility = (state: UniswapRootState): CurrencyIdToVis export const selectNftsVisibility = (state: UniswapRootState): NFTKeyToVisibility => state.visibility.nfts -/** - * Hook to determine token visibility by checking Redux state first, then falling back to cached flag - * @param currencyId - The currency ID to check visibility for - * @param cachedIsHidden - The cached isHidden flag from the API/portfolio balance - * @returns Whether the token should be visible - */ -export function useTokenVisibility(currencyId: CurrencyId, cachedIsHidden?: boolean | null): boolean { - const tokensVisibility = useSelector(selectTokensVisibility) - const normalizedCurrencyId = useMemo(() => normalizeCurrencyIdForMapLookup(currencyId), [currencyId]) - const manualVisibility = tokensVisibility[normalizedCurrencyId] - - // Check Redux state first, then fall back to cached isHidden flag - return manualVisibility?.isVisible !== undefined ? manualVisibility.isVisible : !cachedIsHidden -} +export const selectActivityVisibility = (state: UniswapRootState): ActivityIdToVisibility => state.visibility.activity diff --git a/packages/uniswap/src/features/visibility/slice.ts b/packages/uniswap/src/features/visibility/slice.ts index 63c55bc614c..a257957a5fe 100644 --- a/packages/uniswap/src/features/visibility/slice.ts +++ b/packages/uniswap/src/features/visibility/slice.ts @@ -7,17 +7,20 @@ export type Visibility = { isVisible: boolean } export type PositionKeyToVisibility = Record export type CurrencyIdToVisibility = Record export type NFTKeyToVisibility = Record +export type ActivityIdToVisibility = Record export interface VisibilityState { positions: PositionKeyToVisibility tokens: CurrencyIdToVisibility nfts: NFTKeyToVisibility + activity: ActivityIdToVisibility } export const initialVisibilityState: VisibilityState = { positions: {}, tokens: {}, nfts: {}, + activity: {}, } // Manages user-marked visibility states for positions and tokens @@ -25,20 +28,19 @@ export const slice = createSlice({ name: 'visibility', initialState: initialVisibilityState, reducers: { - togglePositionVisibility: ( + setPositionVisibility: ( state, { - payload: { poolId, tokenId, chainId }, + payload: { poolId, tokenId, chainId, isVisible }, }: PayloadAction<{ poolId: string tokenId: string | undefined chainId: UniverseChainId + isVisible: boolean }>, ) => { const positionId = getUniquePositionId({ poolId, tokenId, chainId }) - - const isVisible = state.positions[positionId]?.isVisible ?? true - state.positions[positionId] = { isVisible: !isVisible } + state.positions[positionId] = { isVisible } }, setTokenVisibility: ( state, @@ -52,8 +54,14 @@ export const slice = createSlice({ ) => { state.nfts[nftKey] = { isVisible } }, + setActivityVisibility: ( + state, + { payload: { transactionId, isVisible } }: PayloadAction<{ transactionId: string; isVisible: boolean }>, + ) => { + state.activity[transactionId] = { isVisible } + }, }, }) -export const { togglePositionVisibility, setTokenVisibility, setNftVisibility } = slice.actions +export const { setPositionVisibility, setTokenVisibility, setNftVisibility, setActivityVisibility } = slice.actions export const { reducer: visibilityReducer } = slice diff --git a/packages/uniswap/src/features/visibility/visibility.test.ts b/packages/uniswap/src/features/visibility/visibility.test.ts index 50a327ec4c3..40fb662793b 100644 --- a/packages/uniswap/src/features/visibility/visibility.test.ts +++ b/packages/uniswap/src/features/visibility/visibility.test.ts @@ -1,15 +1,16 @@ /* biome-ignore-all lint/suspicious/noExplicitAny: legacy code needs review */ - import { UniverseChainId } from 'uniswap/src/features/chains/types' import { + selectActivityVisibility, selectNftsVisibility, selectPositionsVisibility, selectTokensVisibility, } from 'uniswap/src/features/visibility/selectors' import { + setActivityVisibility, setNftVisibility, + setPositionVisibility, setTokenVisibility, - togglePositionVisibility, VisibilityState, visibilityReducer, } from 'uniswap/src/features/visibility/slice' @@ -21,20 +22,23 @@ jest.mock('uniswap/src/features/visibility/utils', () => ({ const mockedGetUniquePositionId = getUniquePositionId as jest.Mock +const makeEmptyVisibilityState = (): VisibilityState => ({ + positions: {}, + tokens: {}, + nfts: {}, + activity: {}, +}) + describe('visibility slice', () => { beforeEach(() => { jest.clearAllMocks() }) it('should return the initial state', () => { - expect(visibilityReducer(undefined, { type: 'unknown' })).toEqual({ - positions: {}, - tokens: {}, - nfts: {}, - }) + expect(visibilityReducer(undefined, { type: 'unknown' })).toEqual(makeEmptyVisibilityState()) }) - describe('togglePositionVisibility', () => { + describe('setPositionVisibility', () => { const poolId = 'pool1' const tokenId = 'token1' const chainId: UniverseChainId = 1 @@ -45,13 +49,9 @@ describe('visibility slice', () => { }) it('should toggle visibility from undefined to false', () => { - const initialState: VisibilityState = { - positions: {}, - tokens: {}, - nfts: {}, - } + const initialState: VisibilityState = makeEmptyVisibilityState() - const action = togglePositionVisibility({ poolId, tokenId, chainId }) + const action = setPositionVisibility({ poolId, tokenId, chainId, isVisible: false }) const newState = visibilityReducer(initialState, action) expect(newState.positions[positionId]?.isVisible).toBe(false) @@ -65,9 +65,10 @@ describe('visibility slice', () => { }, tokens: {}, nfts: {}, + activity: {}, } - const action = togglePositionVisibility({ poolId, tokenId, chainId }) + const action = setPositionVisibility({ poolId, tokenId, chainId, isVisible: true }) const newState = visibilityReducer(initialState, action) expect(newState.positions[positionId]?.isVisible).toBe(true) @@ -82,9 +83,10 @@ describe('visibility slice', () => { [tokenId]: { isVisible: true }, }, nfts: {}, + activity: {}, } - const action = togglePositionVisibility({ poolId, tokenId, chainId }) + const action = setPositionVisibility({ poolId, tokenId, chainId, isVisible: false }) const newState = visibilityReducer(initialState, action) expect(newState.positions[positionId]?.isVisible).toBe(false) @@ -130,11 +132,7 @@ describe('visibility slice', () => { const currencyId = 'token1' it('should set token visibility from undefined to false', () => { - const initialState: VisibilityState = { - positions: {}, - tokens: {}, - nfts: {}, - } + const initialState: VisibilityState = makeEmptyVisibilityState() const action = setTokenVisibility({ currencyId, isVisible: false }) const newState = visibilityReducer(initialState, action) @@ -149,6 +147,7 @@ describe('visibility slice', () => { [currencyId]: { isVisible: false }, }, nfts: {}, + activity: {}, } const action = setTokenVisibility({ currencyId, isVisible: true }) @@ -164,6 +163,7 @@ describe('visibility slice', () => { [currencyId]: { isVisible: true }, }, nfts: {}, + activity: {}, } const action = setTokenVisibility({ currencyId, isVisible: false }) @@ -174,11 +174,7 @@ describe('visibility slice', () => { it('selectTokensVisibility should return empty object if context not present', () => { const state: any = { - visibility: { - positions: {}, - tokens: {}, - nfts: {}, - }, + visibility: makeEmptyVisibilityState(), } const result = selectTokensVisibility(state) @@ -190,11 +186,7 @@ describe('visibility slice', () => { const nftKey = 'nft1' it('should set nft visibility from undefined to false', () => { - const initialState: VisibilityState = { - positions: {}, - tokens: {}, - nfts: {}, - } + const initialState: VisibilityState = makeEmptyVisibilityState() const action = setNftVisibility({ nftKey, isVisible: false }) const newState = visibilityReducer(initialState, action) @@ -209,6 +201,7 @@ describe('visibility slice', () => { nfts: { [nftKey]: { isVisible: false }, }, + activity: {}, } const action = setNftVisibility({ nftKey, isVisible: true }) @@ -224,6 +217,7 @@ describe('visibility slice', () => { nfts: { [nftKey]: { isVisible: true }, }, + activity: {}, } const action = setNftVisibility({ nftKey, isVisible: false }) @@ -234,15 +228,67 @@ describe('visibility slice', () => { it('selectNftsVisibility should return empty object if context not present', () => { const state: any = { - visibility: { - positions: {}, - tokens: {}, - nfts: {}, - }, + visibility: makeEmptyVisibilityState(), } const result = selectNftsVisibility(state) expect(result).toEqual({}) }) }) + + describe('setActivityVisibility', () => { + const chainId: UniverseChainId = UniverseChainId.Mainnet + const hash = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef' + const transactionId = `${chainId}-${hash}` + + it('should set activity visibility from undefined to false', () => { + const initialState: VisibilityState = makeEmptyVisibilityState() + + const action = setActivityVisibility({ transactionId, isVisible: false }) + const newState = visibilityReducer(initialState, action) + + expect(newState.activity[transactionId]?.isVisible).toBe(false) + }) + + it('should set activity visibility from false to true', () => { + const initialState: VisibilityState = { + positions: {}, + tokens: {}, + nfts: {}, + activity: { + [transactionId]: { isVisible: false }, + }, + } + + const action = setActivityVisibility({ transactionId, isVisible: true }) + const newState = visibilityReducer(initialState, action) + + expect(newState.activity[transactionId]?.isVisible).toBe(true) + }) + + it('should set activity visibility from true to false', () => { + const initialState: VisibilityState = { + positions: {}, + tokens: {}, + nfts: {}, + activity: { + [transactionId]: { isVisible: true }, + }, + } + + const action = setActivityVisibility({ transactionId, isVisible: false }) + const newState = visibilityReducer(initialState, action) + + expect(newState.activity[transactionId]?.isVisible).toBe(false) + }) + + it('selectActivityVisibility should return empty object if context not present', () => { + const state: any = { + visibility: makeEmptyVisibilityState(), + } + + const result = selectActivityVisibility(state) + expect(result).toEqual({}) + }) + }) }) diff --git a/packages/uniswap/src/i18n/i18n-setup.tsx b/packages/uniswap/src/i18n/i18n-setup.tsx index f3fafa0ec95..61cfdfc348a 100644 --- a/packages/uniswap/src/i18n/i18n-setup.tsx +++ b/packages/uniswap/src/i18n/i18n-setup.tsx @@ -5,16 +5,12 @@ import { initReactI18next } from 'react-i18next' import enUS from 'uniswap/src/i18n/locales/source/en-US.json' import esES from 'uniswap/src/i18n/locales/translations/es-ES.json' import frFR from 'uniswap/src/i18n/locales/translations/fr-FR.json' -import hiIN from 'uniswap/src/i18n/locales/translations/hi-IN.json' import idID from 'uniswap/src/i18n/locales/translations/id-ID.json' import jaJP from 'uniswap/src/i18n/locales/translations/ja-JP.json' -import msMY from 'uniswap/src/i18n/locales/translations/ms-MY.json' import nlNL from 'uniswap/src/i18n/locales/translations/nl-NL.json' import ptPT from 'uniswap/src/i18n/locales/translations/pt-PT.json' import ruRU from 'uniswap/src/i18n/locales/translations/ru-RU.json' import trTR from 'uniswap/src/i18n/locales/translations/tr-TR.json' -import ukUA from 'uniswap/src/i18n/locales/translations/uk-UA.json' -import urPK from 'uniswap/src/i18n/locales/translations/ur-PK.json' import viVN from 'uniswap/src/i18n/locales/translations/vi-VN.json' import zhCN from 'uniswap/src/i18n/locales/translations/zh-CN.json' import zhTW from 'uniswap/src/i18n/locales/translations/zh-TW.json' @@ -28,10 +24,8 @@ const resources = { 'nl-NL': { translation: nlNL, statsigKey: 'nl-NL' }, 'en-US': { translation: enUS, statsigKey: 'en-US' }, 'fr-FR': { translation: frFR, statsigKey: 'fr-FR' }, - 'hi-IN': { translation: hiIN, statsigKey: 'hi-IN' }, 'id-ID': { translation: idID, statsigKey: 'id-ID' }, 'ja-JP': { translation: jaJP, statsigKey: 'ja-JP' }, - 'ms-MY': { translation: msMY, statsigKey: 'ms-MY' }, 'pt-PT': { translation: ptPT, statsigKey: 'pt-PT' }, 'ru-RU': { translation: ruRU, statsigKey: 'ru-RU' }, // Spanish locales that use `,` as the decimal separator @@ -60,8 +54,6 @@ const resources = { 'es-UY': { translation: esES, statsigKey: 'es-ES' }, 'es-VE': { translation: esES, statsigKey: 'es-ES' }, 'tr-TR': { translation: trTR, statsigKey: 'tr-TR' }, - 'uk-UA': { translation: ukUA, statsigKey: 'uk-UA' }, - 'ur-PK': { translation: urPK, statsigKey: 'ur-PK' }, 'vi-VN': { translation: viVN, statsigKey: 'vi-VN' }, } diff --git a/packages/uniswap/src/i18n/locales/source/en-US.json b/packages/uniswap/src/i18n/locales/source/en-US.json index 3a9ccbeec20..f3bb8caf566 100644 --- a/packages/uniswap/src/i18n/locales/source/en-US.json +++ b/packages/uniswap/src/i18n/locales/source/en-US.json @@ -30,7 +30,6 @@ "account.drawer.modal.body": "Safely store and swap tokens with the Uniswap app. Available on iOS and Android.", "account.drawer.modal.dont": "Don’t have a Uniswap wallet?", "account.drawer.modal.scan": "Scan with Uniswap Wallet", - "account.drawer.spamToggle": "Hide unknown tokens & NFTs", "account.passkey.delete.acknowledge": "I’ve backed up my recovery phrase and understand that Uniswap Labs can’t help me recover my wallet if I failed to do so.", "account.passkey.delete.description": "Make sure you’ve backed up your recovery phrase using the Uniswap mobile app or browser extension.", "account.passkey.delete.descriptionEmphasized": "Without your recovery phrase, you may be unable to access your wallet.", @@ -115,6 +114,7 @@ "account.wallet.watch.placeholder": "ENS or address", "account.wallet.watch.title": "Enter a wallet address", "activity.pending": "{{pendingActivityCount}} Pending", + "activity.recentActivity": "Recent activity", "activity.transaction.lpRewards.descriptor": "{{symbol}} rewards collected", "activity.transaction.send.descriptor": "{{amountWithSymbol}} to {{walletAddress}}", "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} for {{amountWithSymbolB}}", @@ -257,6 +257,7 @@ "common.button.unlock": "Unlock", "common.button.view": "View", "common.button.viewDetails": "View details", + "common.button.viewMore": "View more", "common.button.yes": "Yes", "common.buy.label": "Buy", "common.buyAndSell": "Buy and sell on Uniswap", @@ -313,6 +314,7 @@ "common.deposit.toNetwork": "Deposit tokens to the {{label}} network.", "common.depositing": "Depositing", "common.depositTokens": "Deposit tokens", + "common.details": "Details", "common.detected": "Detected", "common.developers": "Developers", "common.device": "This device", @@ -370,6 +372,7 @@ "common.input.noRecipient.error": "Select recipient", "common.input.password.confirm": "Confirm password", "common.input.password.error.mismatch": "Passwords don’t match", + "common.input.password.error.same": "New password must be different from current password", "common.input.password.error.weak": "This password is too weak", "common.input.password.new": "New password", "common.input.password.placeholder": "Password", @@ -503,6 +506,8 @@ "common.remove.liquidity.canceled": "Remove liquidity canceled", "common.remove.liquidity.failed": "Remove liquidity failed", "common.removing.liquidity": "Removing liquidity", + "common.report": "Report", + "common.reported": "Reported", "common.resetLimit": "Reset {{symbol}} limit", "common.resetLimitWallet": "Reset {{symbol}} limit in wallet", "common.resettingLimit": "Resetting {{symbol}} limit...", @@ -532,6 +537,7 @@ "common.status": "Status", "common.step.number": "Step {{number}}", "common.step.number.of": "Step {{current}} of {{total}}", + "common.submit": "Submit", "common.swap": "Swap", "common.swap.expired": "Swap expired", "common.swap.failed": "Swap failed", @@ -797,6 +803,7 @@ "fee.tier.create": "Create fee tier", "fee.tier.create.button": "Create new fee tier", "fee.tier.create.description": "Creating a new tier will initialize in a new pool and result in higher than usual network costs.", + "fee.tier.default": "-- fee tier", "fee.tier.description": "The amount earned providing liquidity. Choose an amount that suits your risk tolerance and strategy.", "fee.tier.description.v2": "The amount earned providing liquidity. All v2 pools have fixed 0.3% fees. For more options, provide liquidity on v4.", "fee.tier.dynamic": "Dynamic fee tier", @@ -884,9 +891,9 @@ "hero.swap.title": "Swap anytime,
anywhere.", "hidden.nfts.info.banner.text": "Learn more about hidden NFTs", "hidden.nfts.info.text.button": "Hidden NFTs ({{numHidden}})", - "hidden.nfts.info.text.extension": "These are potential scams and NFTs you’ve hidden. You can right click on an NFT to unhide it.", "hidden.nfts.info.text.mobile": "These are potential scams and NFTs you’ve hidden. You can long press on an NFT to unhide it.", "hidden.nfts.info.text.title": "Hidden NFTs", + "hidden.nfts.info.text.web": "These are potential scams and NFTs you’ve hidden. You can click on an NFT to unhide it.", "hidden.tokens.info.banner.text": "Learn more about hidden tokens", "hidden.tokens.info.text.button": "Hidden tokens ({{numHidden}})", "hidden.tokens.info.text.info": "These are potential scams, small balances, and tokens you’ve hidden. Hidden tokens are not included in your total wallet balance.", @@ -957,32 +964,16 @@ "landing.uniswapX.subtitle": "Smarter swaps, zero friction.", "landing.walletBody": "The trusted self-custody crypto wallet and extension with millions of downloads, support from real humans, and a 4.8 rating.", "landing.walletSubtitle": "Swap, store, explore.", - "language.afrikaans": "Afrikaans", - "language.arabic": "Arabic", - "language.catalan": "Catalan", "language.chineseSimplified": "Chinese, Simplified", "language.chineseTraditional": "Chinese, Traditional", - "language.czech": "Czech", - "language.danish": "Danish", "language.dutch": "Dutch", "language.english": "English", - "language.finnish": "Finnish", "language.french": "French", - "language.greek": "Greek", - "language.hebrew": "Hebrew", - "language.hindi": "Hindi", - "language.hungarian": "Hungarian", "language.indonesian": "Indonesian", - "language.italian": "Italian", "language.japanese": "Japanese", "language.korean": "Korean", - "language.malay": "Malay", - "language.norwegian": "Norwegian", - "language.polish": "Polish", "language.portuguese": "Portuguese", - "language.romanian": "Romanian", "language.russian": "Russian", - "language.serbian": "Serbian", "language.spanishArgentina": "Spanish (Argentina)", "language.spanishBelize": "Spanish (Belize)", "language.spanishBolivia": "Spanish (Bolivia)", @@ -1006,11 +997,7 @@ "language.spanishUruguay": "Spanish (Uruguay)", "language.spanishUs": "Spanish (US)", "language.spanishVenezuela": "Spanish (Venezuela)", - "language.swahili": "Swahili", - "language.swedish": "Swedish", "language.turkish": "Turkish", - "language.ukrainian": "Ukrainian", - "language.urdu": "Urdu", "language.vietnamese": "Vietnamese", "large.price.difference": "Large price difference", "large.price.difference.tooltip": "Proceeding with this trade will result in a loss of funds. This difference can be due to large trades or low liquidity.", @@ -1114,7 +1101,6 @@ "notification.smartWallet.disabled.all": "Smart wallet disabled", "notification.smartWallet.disabled.plural": "Disabled on {{amount}} networks", "notification.spam.NFT.failed": "Could not report NFT. Try again later.", - "notification.spam.NFT.successful": "Reported", "notification.swap.network": "Swapping on {{network}}", "notification.swap.pending.swap": "Swap pending", "notification.swap.pending.unwrap": "Unwrap pending", @@ -1214,6 +1200,7 @@ "onboarding.home.intro.backup.description.mobile": "Set up a recovery plan if you ever lose your phone or get a new one.", "onboarding.home.intro.backup.title": "Back up your wallet", "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK, and JUP — now available on Unichain", + "onboarding.home.intro.bridgedAssets.description.v2": "DOGE, XRP, XPL, ZEC — now available on Unichain", "onboarding.home.intro.bridgedAssets.title": "Trade new tokens on Unichain", "onboarding.home.intro.fund.description": "Fund your wallet by buying crypto or transferring from another account.", "onboarding.home.intro.fund.title": "Get your first token", @@ -1438,15 +1425,18 @@ "poolFinder.availablePools.notFound.description": "No matching v2 pools found. Double-check your token selection and ensure you’re connected to the correct wallet.", "pools.explore": "Explore pools", "portfolio.activity.filters.timePeriod.all": "All time", - "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", + "portfolio.activity.filters.transactionType.addLiquidity": "Added liquidity", "portfolio.activity.filters.transactionType.all": "All types", "portfolio.activity.filters.transactionType.approvals": "Approvals", - "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", - "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.claimFees": "Claimed fees", + "portfolio.activity.filters.transactionType.createPool": "Pools created", "portfolio.activity.filters.transactionType.mints": "Mints", - "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", + "portfolio.activity.filters.transactionType.receives": "Receives", + "portfolio.activity.filters.transactionType.removeLiquidity": "Removed liquidity", + "portfolio.activity.filters.transactionType.sends": "Sends", "portfolio.activity.filters.transactionType.swaps": "Swaps", "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.search.placeholder": "Search activity", "portfolio.activity.table.column.address": "Address", "portfolio.activity.table.column.amount": "Amount", "portfolio.activity.table.column.time": "Time", @@ -1459,7 +1449,12 @@ "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", "portfolio.disconnected.demoWallet.title": "Demo wallet", "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", + "portfolio.nfts.search.placeholder": "Search your NFTs", "portfolio.nfts.title": "NFTs", + "portfolio.overview.stats.averageSwapSize": "Average swap size", + "portfolio.overview.stats.swappedThisWeek": "Swapped this week", + "portfolio.overview.stats.swapsThisWeek": "Swaps this week", + "portfolio.overview.stats.totalSwapVolume": "Total swap volume", "portfolio.overview.title": "Overview", "portfolio.title": "Portfolio", "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", @@ -1471,6 +1466,7 @@ "portfolio.tokens.table.column.token": "Token", "portfolio.tokens.table.column.value": "Value", "portfolio.tokens.title": "Tokens", + "portfolio.view": "View portfolio", "position.addHook": "Add a Hook", "position.addHook.tooltip": "Hooks are an advanced feature that enable pools to interact with smart contracts, unlocking various capabilities. Exercise caution when adding hooks, as some may be malicious or cause unintended consequences.", "position.addingHook": "Adding hook", @@ -1588,6 +1584,33 @@ "qrScanner.wallet.networks": "Supported networks", "range.outOfView": "Range out of view", "removeLiquidity.pooled": "Pooled {{symbol}}:", + "reporting.activity.unhide.action": "Unhide activity", + "reporting.pool.details.title": "Don’t recognize this position?", + "reporting.token.data.options.price.subtitle": "Token price is wrong or unavailable", + "reporting.token.data.options.price.title": "Price", + "reporting.token.data.options.priceChart.subtitle": "Data is wrong or incomplete", + "reporting.token.data.options.priceChart.title": "Price chart", + "reporting.token.data.options.tokenDetails.subtitle": "Token image, description, or link issue", + "reporting.token.data.options.tokenDetails.title": "Token details", + "reporting.token.data.options.volume.subtitle": "Token volume is wrong or unavailable", + "reporting.token.data.options.volume.title": "Volume", + "reporting.token.data.title": "Data issue", + "reporting.token.options.hiddenFees.subtitle": "Token has undisclosed fees when bought/sold", + "reporting.token.options.hiddenFees.title": "Hidden fees", + "reporting.token.options.imposter.subtitle": "Token seems fraudulent or misleading", + "reporting.token.options.imposter.title": "Imposter token", + "reporting.token.options.other.title": "Something else", + "reporting.token.options.spam.subtitle": "Token appeared in wallet unexpectedly", + "reporting.token.options.spam.title": "Spam token", + "reporting.token.report.button.disabled": "Select an issue", + "reporting.token.report.other.placeholder": "Describe the issue", + "reporting.token.report.title": "Report token", + "reporting.token.report.title.withSymbol": "Report {{symbol}}", + "reporting.token.warning.button": "This warning is incorrect", + "reporting.token.warning.report.placeholder": "Add details (optional)", + "reporting.token.warning.report.submit": "Report issue", + "reporting.token.warning.report.subtitle": "Report an issue if the warning below seems wrong. We’ll take a closer look.", + "reporting.token.warning.report.title": "Report an inaccurate warning", "revoke.failed.message": "A network or connection issue likely caused your revoke to fail. Check your connection and try again.", "routing.aggregateLiquidity": "When available, aggregates liquidity sources for better prices and gas free swaps.", "routing.aggregateLiquidity.uniswapx": "UniswapX aggregates liquidity sources on and off-chain, bringing you the best available prices and gas free swaps.", @@ -1735,6 +1758,7 @@ "settings.setting.backup.status.inProgress": "Backing up to {{cloudProviderName}}...", "settings.setting.backup.status.recoveryPhrase.backed": "Backed up", "settings.setting.backup.status.title": "{{cloudProviderName}} backup", + "settings.setting.balancesActivity.title": "Balances and activity", "settings.setting.beta.tooltip": "Coming soon", "settings.setting.biometrics.appAccess.subtitle.android": "Require face/fingerprint to open the app.", "settings.setting.biometrics.appAccess.subtitle.ios": "Require {{biometricsMethod}} to open app.", @@ -1786,7 +1810,8 @@ "settings.setting.privacy.analytics.title": "App analytics", "settings.setting.privateKeys.title": "Private keys", "settings.setting.recoveryPhrase.title": "Recovery phrase", - "settings.setting.smallBalances.title": "Portfolio balance", + "settings.setting.reportedActivity.subtitle": "Transactions you’ve reported as spam will be hidden from your activity feed.", + "settings.setting.reportedActivity.title": "Hide reported activity", "settings.setting.smartWallet.action.enable": "Enable", "settings.setting.smartWallet.action.smartWallet": "Smart wallet", "settings.setting.smartWallet.notEligible": "Not eligible", @@ -2290,6 +2315,8 @@ "transaction.networkCost.label": "Network cost", "transaction.networkCost.maxNativeBalance.description": "A small amount of the network token balance is reserved to cover the network cost of this transaction.", "transaction.networkCost.maxNativeBalance.title": "Why can’t I use my max balance?", + "transaction.networkCost.presetNativeBalance.description": "You don’t have enough balance to cover both this amount and the network cost of the transaction.", + "transaction.networkCost.presetNativeBalance.title": "Why can’t I use this amount?", "transaction.networkCost.veryHigh.label": "Very high network cost", "transaction.notification.error.cancel": "Unable to cancel transaction", "transaction.notification.error.replace": "Unable to replace transaction", diff --git a/packages/uniswap/src/i18n/locales/translations/af-ZA.json b/packages/uniswap/src/i18n/locales/translations/af-ZA.json deleted file mode 100644 index d714754e9dc..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/af-ZA.json +++ /dev/null @@ -1,2563 +0,0 @@ -{ - "account.authHeader.claimReward": "Eis {{amount}} beloning", - "account.cloud.backup.subtitle": "Daar is verskeie herstelfrases gerugsteun na jou {{cloudProviderName}}.", - "account.cloud.backup.title": "Kies 'n rugsteun om te herstel", - "account.cloud.button.restore.android": "Herstel vanaf Google Drive", - "account.cloud.button.restore.ios": "Herstel vanaf iCloud", - "account.cloud.empty.description": "Dit lyk of jy nie enige van jou herstelfrases na {{cloudProviderName}}gerugsteun het nie.", - "account.cloud.empty.title": "0 rugsteun gevind", - "account.cloud.error.backup.message": "Kon nie rugsteun invoer nie weens 'n gebrek aan toestemmings, onderbreking van magtiging of weens 'n wolkfout", - "account.cloud.error.backup.title": "Kon nie rugsteun invoer nie", - "account.cloud.error.password.title": "Ongeldige Wagwoord. Probeer asseblief weer.", - "account.cloud.error.unavailable.button.cancel": "Nie nou nie", - "account.cloud.error.unavailable.button.settings": "Gaan na instellings", - "account.cloud.error.unavailable.message.android": "Verifieer asseblief dat jy by 'n Google-rekening aangemeld is met Google Drive op hierdie toestel geaktiveer en probeer weer.", - "account.cloud.error.unavailable.message.ios": "Verifieer asseblief dat jy by 'n Apple ID aangemeld is met iCloud Drive op hierdie toestel geaktiveer en probeer weer.", - "account.cloud.error.unavailable.title.android": "Google Drive nie beskikbaar nie", - "account.cloud.error.unavailable.title.ios": "iCloud Drive nie beskikbaar nie", - "account.cloud.loading.title": "Soek tans vir rugsteun...", - "account.cloud.lockout.time.hours_one": "Te veel pogings. Probeer weer oor 1 uur.", - "account.cloud.lockout.time.hours_other": "Te veel pogings. Probeer weer oor {{count}} uur.", - "account.cloud.lockout.time.minutes_one": "Te veel pogings. Probeer weer oor 1 minuut.", - "account.cloud.lockout.time.minutes_other": "Te veel pogings. Probeer weer oor {{count}} minute.", - "account.cloud.password.input": "Sleutel wagwoord in", - "account.cloud.password.recoveryPhrase": "Voer eerder jou herstelfrase in", - "account.cloud.password.subtitle": "Hierdie wagwoord word vereis om jou herstelfrase-rugsteun van {{cloudProviderName}}te herstel.", - "account.cloud.password.title": "Voer rugsteunwagwoord in", - "account.downloadWallet.subtitle": "Rugsteun jou beursie, handel onderweg, kry regstreekse pryswaarskuwings en meer.", - "account.drawer.gitHash": "Git-hash: ", - "account.drawer.gitVersion": "Weergawe: ", - "account.drawer.modal.body": "Berg en ruil tokens veilig met die Uniswap-toepassing. Beskikbaar op iOS en Android.", - "account.drawer.modal.dont": "Het jy nie 'n Uniswap-beursie nie?", - "account.drawer.modal.scan": "Skandeer met Uniswap Wallet", - "account.drawer.spamToggle": "Versteek onbekende tekens en NFT's", - "account.passkey.delete.acknowledge": "Ek het my herstelfrase gerugsteun en verstaan dat Uniswap Labs my nie kan help om my beursie te herstel as ek dit nie doen nie.", - "account.passkey.delete.description": "Maak seker dat jy jou herstelfrase gerugsteun het deur die Uniswap-mobiele toepassing of blaaieruitbreiding te gebruik.", - "account.passkey.delete.descriptionEmphasized": "Sonder jou herstelfrase kan jy dalk nie toegang tot jou beursie kry nie.", - "account.passkey.delete.speedbump.description": "Voordat u voortgaan, voltooi die volgende stappe om te verhoed dat u toegang tot u beursie en alle fondse verloor.", - "account.passkey.delete.speedbump.step1": "Laai die Uniswap-mobiele toepassing of blaaieruitbreiding af", - "account.passkey.delete.speedbump.step2": "Rugsteun jou herstelfrase", - "account.passkey.delete.speedbump.title": "Is jy seker?", - "account.passkey.delete.title": "Vee wagwoord uit?", - "account.passkey.log.in.title": "Teken aan met wagwoord", - "account.passkey.type.crossplatform": "Foon, tablet of sekuriteitsleutel", - "account.passkey.type.platform": "Blaaier of bedryfstelsel", - "account.passkey.verify.button": "Verifieer met wagwoord", - "account.passkey.verify.description": "Gebruik asseblief jou wagwoord om jou identiteit te verifieer voordat jy voortgaan. Dit help om jou rekening veilig te hou.", - "account.passkey.verify.title": "Kom ons verifieer eers dat dit jy is", - "account.portfolio.activity.canceledBelow": "Hierdie bestelling is gekanselleer omdat jou saldo onder die insetbedrag gegaan het.", - "account.portfolio.activity.signLimit": "Hierdie bestelling sal nie gevul word nie omdat jou saldo onder die insetbedrag gegaan het. Verhoog jou balans om reg te maak.", - "account.recoveryPhrase.education.part1": "'n Herstelfrase (of saadfrase) is 'n stel woorde wat nodig is om toegang tot jou beursie te kry, soos 'n wagwoord.", - "account.recoveryPhrase.education.part2": "Jy kan jou herstelfrase op 'n nuwe toestel invoer om jou beursie en sy inhoud te herstel.", - "account.recoveryPhrase.education.part3": "Maar as jy jou herstelfraseverloor, sal jy toegang tot jou beursie verloor.", - "account.recoveryPhrase.education.part4": "In plaas daarvan om jou herstelfrase te memoriseer, kan jy dit rugsteun na {{cloudProviderName}} en dit met 'n wagwoord beskerm.", - "account.recoveryPhrase.education.part5": "Jy kan ook jou herstelfrase handmatig rugsteun deur dit neer te skryf en dit op 'n veilige plek te stoor.", - "account.recoveryPhrase.education.part6": "Ons beveel aan om beide tipes rugsteunte gebruik, want as jy jou herstelfrase verloor, sal jy nie jou beursie kan herstel nie.", - "account.recoveryPhrase.error.invalid": "Ongeldige frase", - "account.recoveryPhrase.error.invalidWord": "Ongeldige woord: {{word}}", - "account.recoveryPhrase.error.phraseLength": "Herstelfrase moet 12-24 woorde wees", - "account.recoveryPhrase.error.wordIsAddress": "Jy het 'n adres ingevoer, nie 'n herstelfrase nie", - "account.recoveryPhrase.error.wrong": "Verkeerde herstelfrase", - "account.recoveryPhrase.helpText.import": "Hoe vind ek my herstelfrase?", - "account.recoveryPhrase.helpText.restoring": "Probeer weer soek", - "account.recoveryPhrase.input": "Tik jou herstelfrase", - "account.recoveryPhrase.remove.final.description": "Maak seker dat jy jou herstelfrase neergeskryf het of dit op {{cloudProviderName}}gerugsteun het. Andersins sal jy nie toegang tot jou fondse hê nie.", - "account.recoveryPhrase.remove.final.title": "Jy verwyder jou herstelfrase", - "account.recoveryPhrase.remove.import.description": "Jy kan net een herstelfrase op 'n slag stoor. Om voort te gaan om 'n nuwe een in te voer, sal jy jou huidige herstelfrase en enige geassosieerde beursies van hierdie toestel moet verwyder.", - "account.recoveryPhrase.remove.initial.description": "Dit sal jou beursie saam met jou herstelfrase van hierdie toestel verwyder.", - "account.recoveryPhrase.remove.initial.title": "Jy verwyder tans {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "Jou herstelfrase sal gestoor bly totdat jy alle oorblywende beursies uitvee.", - "account.recoveryPhrase.subtitle.import": "Jou herstelfrase sal net plaaslik op jou toestel gestoor word.", - "account.recoveryPhrase.subtitle.restoring": "Voer jou herstelfrase hieronder in, of probeer weer na rugsteun soek.", - "account.recoveryPhrase.title.import": "Voer jou herstelfrase in", - "account.recoveryPhrase.title.restoring": "Geen rugsteun gevind nie", - "account.wallet.action.copy": "Kopieer adres", - "account.wallet.action.manageConnections": "Bestuur verbindings", - "account.wallet.action.report": "Rapporteer profiel", - "account.wallet.action.viewExplorer": "Kyk op {{blockExplorerName}}", - "account.wallet.button.add": "Voeg beursie by", - "account.wallet.button.addViewOnly": "Voeg 'n kyk-alleen-beursie by", - "account.wallet.button.create": "Skep 'n nuwe beursie", - "account.wallet.button.import": "Voer 'n nuwe beursie in", - "account.wallet.button.manage": "Beursie-instellings", - "account.wallet.button.remove": "Verwyder beursie", - "account.wallet.button.watch": "Kyk na 'n beursie", - "account.wallet.create.placeholder": "Beursie {{index}}", - "account.wallet.edit.label.input.placeholder": "Beursie-etiket", - "account.wallet.header.button.disabled.title": "Wysig profiel", - "account.wallet.header.button.title": "Wysig etiket", - "account.wallet.header.viewOnly": "Uitsig-beursies", - "account.wallet.menu.claimUsername": "Eis gebruikernaam op", - "account.wallet.menu.copy.title": "Kopieer beursie-adres", - "account.wallet.menu.edit.title": "Wysig etiket", - "account.wallet.menu.manageConnections": "Bestuur verbindings", - "account.wallet.menu.remove.title": "Verwyder beursie", - "account.wallet.remove.check": "Ek het my herstelfrase gerugsteun en verstaan dat Uniswap Labs my nie kan help om my beursies te herstel as ek dit nie doen nie.", - "account.wallet.remove.title": "Verwyder {{name}}", - "account.wallet.remove.viewOnly": "Jy kan altyd terugkyk-alleen-beursies byvoeg deur die beursie se adres in te voer.", - "account.wallet.restore.new_device.description": "Omdat jy op 'n nuwe toestel is, sal jy jou herstelfrase moet herstel of jou wolkrugsteunwagwoord moet invoer om voort te gaan.", - "account.wallet.restore.new_device.title": "Herwin jou beursie", - "account.wallet.restore.seed_phrase.description": "Jou herstelfrase ontbreek op jou toestel. Om te verseker dat jy nooit toegang tot jou fondse verloor nie, moet jy jou beursie herstel.", - "account.wallet.restore.seed_phrase.title": "Herstel jou beursie", - "account.wallet.select.error": "Kon nie adresse laai nie", - "account.wallet.select.loading.subtitle": "Jou beursies sal hieronder verskyn.", - "account.wallet.select.loading.title": "Op soek na beursies", - "account.wallet.select.smartWalletDisclaimer": "Standaard sal alle kwalifiserende beursies slimbeursie-funksies gebruik sodra dit ingevoer is. Wat is 'n slimbeursie?", - "account.wallet.select.title_one_one": "Een beursie gevind", - "account.wallet.select.title_one_other": "Kies beursies om in te voer", - "account.wallet.viewOnly.button": "Voer beursie in", - "account.wallet.viewOnly.description": "Om tokens te ruil, te koop, te stuur en te ontvang, moet jy hierdie beursie se herstelfrase invoer.", - "account.wallet.viewOnly.title": "Hierdie beursie is slegs sigbaar", - "account.wallet.watch.error.alreadyImported": "Hierdie adres is reeds ingevoer", - "account.wallet.watch.error.notFound": "Adres nie gevind nie", - "account.wallet.watch.error.smartContract": "Adres is 'n slim kontrak", - "account.wallet.watch.message": "Deur 'n kykalleen-beursie by te voeg, kan jy die toepassing probeer of 'n beursie naspoor. Jy sal nie fondse kan ruil of stuur nie.", - "account.wallet.watch.placeholder": "ENS of adres", - "account.wallet.watch.title": "Voer 'n beursie-adres in", - "activity.pending": "{{pendingActivityCount}} Hangende", - "activity.transaction.lpRewards.descriptor": "{{symbol}} belonings ingesamel", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} tot {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} vir {{amountWithSymbolB}}", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} en {{amountWithSymbolB}}", - "addLiquidity.shareOfPool": "Deel van swembad", - "addressInput.recipient": "Ontvanger", - "analytics.allow": "Laat ontledings toe", - "analytics.allow.message": "Ons gebruik anonieme data om jou ervaring met Uniswap Labs-produkte te verbeter.", - "appRating.button.notReally": "Nie regtig nie", - "appRating.description": "Laat weet ons as jy 'n goeie ervaring met hierdie toepassing het", - "appRating.extension.review.description": "Kies 'n stergradering en gee 'n resensie in die Chrome Webwinkel.", - "appRating.extension.review.title": "Hersien Uniswap-uitbreiding?", - "appRating.extension.title": "Geniet jy Uniswap-uitbreiding?", - "appRating.feedback.button.send": "Stuur terugvoering", - "appRating.feedback.description": "Laat weet ons hoe ons jou ervaring kan verbeter", - "appRating.feedback.title": "Ons is jammer om dit te hoor.", - "appRating.mobile.title": "Geniet jy Uniswap Wallet?", - "bridgedAsset.modal.button": "Gaan voort met ruil", - "bridgedAsset.modal.description": "Hierdie is 'n {{chainName}} weergawe van {{currencySymbol}} wat gerugsteun word deur en dieselfde prys handhaaf as die oorspronklike {{currencySymbol}}.", - "bridgedAsset.modal.feature.securelyBacked": "Veilig gerugsteun", - "bridgedAsset.modal.feature.securelyBacked.description": "1:1 gerugsteun deur inheemse {{currencySymbol}}.", - "bridgedAsset.modal.feature.tradeSeamlessly": "Handel naatloos", - "bridgedAsset.modal.feature.tradeSeamlessly.description": "Koop en verkoop {{currencySymbol}} sonder om Uniswap te verlaat.", - "bridgedAsset.modal.feature.withdrawToNativeChain": "Onttrek na {{nativeChainName}}", - "bridgedAsset.modal.feature.withdrawToNativeChain.description": "Maak enige tyd 'n brug terug na die oorspronklike netwerk.", - "bridgedAsset.modal.title": "Ruil {{currencySymbol}} op {{chainName}}", - "bridgedAsset.send.warning.description": "Jy stuur 'n toegedraaide weergawe van {{currencySymbol}} op {{chainName}}. As jy dit na 'n gesentraliseerde beurs stuur, sal dit lei tot 'n permanente verlies van fondse.", - "bridgedAsset.send.warning.title": "Maak seker dat jy na 'n versoenbare adres stuur", - "bridgedAsset.tdp.description": "Dit is 'n oorbrugde weergawe van {{currencySymbol}} wat 1:1 ondersteun word deur inheemse {{currencySymbol}}.", - "bridgedAsset.wormhole.button": "Gaan voort na Wurmgat", - "bridgedAsset.wormhole.description": "Gaan voort na die Wormgat-portaal om jou {{currencySymbol}} van {{chainName}} na {{nativeChainName}}te oorbrug.", - "bridgedAsset.wormhole.title": "Onttrek {{currencySymbol}} tot {{nativeChainName}}", - "bridgedAsset.wormhole.toNativeChain": "tot {{nativeChainName}}", - "bridgedAsset.wormhole.withdrawToNativeChain": "Onttrek na {{nativeChainName}}", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "chart.candlestick": "Kandelaar", - "chart.error.pools": "Kan nie historiese data vir die huidige poel wys nie.", - "chart.error.tokens": "Kan nie historiese data vir die huidige token wys nie.", - "chart.line": "Lyngrafiek", - "chart.missingData": "Grafiekdata ontbreek", - "chart.price.label.close": "Naby", - "chart.price.label.high": "Hoog", - "chart.price.label.low": "Laag", - "chart.price.label.open": "Maak oop", - "chart.settings.unavailable.label": "Hierdie instelling is nie vir die huidige grafiek beskikbaar nie", - "claim.thanks": "Dankie dat jy deel is van die Uniswap-gemeenskap ", - "claim.uni.arrived": "UNI het opgedaag", - "common.about": "Oor", - "common.accept": "Aanvaar", - "common.active": "Aktief", - "common.activeNetworks": "Aktiewe netwerke", - "common.activity": "Aktiwiteit", - "common.add.label": "Voeg by", - "common.add.liquidity.canceled": "Voeg likiditeit by gekanselleer", - "common.addLiquidity": "Voeg likiditeit by", - "common.address": "Adres", - "common.addressOrENS": "Beursie-adres of ENS-naam", - "common.advanced": "Gevorderd", - "common.all": "Almal", - "common.allTime": "Van alle tye", - "common.and": "en", - "common.app": "Toep", - "common.approved": "Goedgekeur", - "common.approvePending": "Goedkeuring hangende...", - "common.approvePermitTx": "Keur versoek goed {{indexText}}", - "common.approvePermitTx.active": "Keur versoek goed{{indexText}} in beursie", - "common.approvePermitTx.explainer": "Wat is Permit2-goedkeurings?", - "common.approvePermitTx.pending": "Goedkeuring van versoek {{indexText}}...", - "common.approveSpend": "Keur {{symbol}} besteding goed", - "common.approving": "Goedkeurend", - "common.approximatelyValue": "~{{value}}", - "common.areYouSure": "Is jy seker?", - "common.automatic": "Outo", - "common.availableIn": "Uniswap beskikbaar in: ", - "common.availableOnIOSAndroidChrome": "Beskikbaar op iOS, Android en Chrome", - "common.backToPositions": "Terug na posisies", - "common.bestRoute": "Roete", - "common.bestRoute.with": "Roete via {{provider}}", - "common.biometrics.generic": "Biometrie", - "common.biometrics.touchId": "Raak-ID", - "common.biometrics.windowsHello": "Windows Hallo", - "common.blocked.ifError": "As jy glo dat dit 'n fout is, stuur asseblief 'n e-pos met jou adres na ", - "common.blocked.reason": "Hierdie adres is op die Uniswap Labs-koppelvlak geblokkeer omdat dit met een of meer geblokkeerde aktiwiteitegeassosieer word.", - "common.blockedAddress": "Geblokkeerde adres", - "common.blog": "Blog", - "common.bought": "Gekoop", - "common.brandAssets": "Handelsmerk bates", - "common.button.accept": "Aanvaar", - "common.button.back": "Terug", - "common.button.buy": "Koop", - "common.button.cancel": "Kanselleer", - "common.button.checkin": "Inboek", - "common.button.close": "Naby", - "common.button.confirm": "Bevestig", - "common.button.connect": "Koppel", - "common.button.continue": "Aanhou", - "common.button.copied": "Gekopieer", - "common.button.copy": "Kopieer", - "common.button.create": "Skep", - "common.button.delete": "Vee uit", - "common.button.disable": "Deaktiveer", - "common.button.disabling": "Deaktiveer", - "common.button.disconnect": "Ontkoppel", - "common.button.dismiss": "Verwerp", - "common.button.done": "Klaar", - "common.button.edit": "Wysig", - "common.button.enable": "Aktiveer", - "common.button.finish": "Voltooi", - "common.button.goBack": "Gaan terug", - "common.button.later": "Miskien later", - "common.button.learn": "Leer meer", - "common.button.next": "Volgende", - "common.button.notNow": "Nie nou nie", - "common.button.ok": "OK", - "common.button.paste": "Plak", - "common.button.pay": "Betaal", - "common.button.proceed": "Voortgaan", - "common.button.receive": "Ontvang", - "common.button.remove": "Verwyder", - "common.button.reset": "Stel terug", - "common.button.retry": "Probeer weer", - "common.button.reveal": "Onthul", - "common.button.review": "Resensie", - "common.button.save": "Stoor", - "common.button.scrollDown": "Rol af", - "common.button.sell": "Verkoop", - "common.button.send": "Stuur", - "common.button.setup": "Stel op", - "common.button.share": "Deel", - "common.button.showLess": "Wys minder", - "common.button.showMore": "Wys meer", - "common.button.sign": "Teken", - "common.button.skip": "Huppel", - "common.button.swap": "Ruil", - "common.button.tryAgain": "Probeer weer", - "common.button.understand": "ek verstaan", - "common.button.unlock": "Ontsluit", - "common.button.view": "Beskou", - "common.button.viewDetails": "Bekyk besonderhede", - "common.button.yes": "Ja", - "common.buy.label": "Koop", - "common.buyAndSell": "Koop en verkoop op Uniswap", - "common.cancellationSubmitted": "Kansellasie ingedien", - "common.cancellationSuccessful": "Kansellasie suksesvol", - "common.cancelOrder": "Kanselleer bestelling", - "common.card.error.description": "Iets het verkeerd geloop", - "common.card.error.title": "Oeps! Iets het verkeerd geloop.", - "common.careers": "Loopbane", - "common.chain.networkCost": "{{chain}} netwerkkoste", - "common.chart": "Grafiek", - "common.checkNetwork": "Gaan netwerkstatus hier na.", - "common.chromeExtension": "Uitbreiding", - "common.claim.failed": "Eis het misluk", - "common.claimed": "Geëis", - "common.claiming": "Eisend", - "common.claimUnis": "Eis jou UNI-tokens op", - "common.clear": "Duidelik", - "common.close": "Naby", - "common.closed": "Gesluit", - "common.collect.button": "Versamel", - "common.company": "Maatskappy", - "common.confirm": "Bevestig", - "common.confirmCancellation": "Bevestig kansellasie", - "common.confirmed": "Bevestig", - "common.confirmSend.button": "Bevestig stuur", - "common.confirmSwap": "Bevestig omruiling in beursie", - "common.confirmTimedOut": "Bevestiging het uitgetel. Probeer asseblief weer.", - "common.confirmTransfer": "Bevestig oordrag", - "common.confirmWallet": "Bevestig in beursie", - "common.connect.button": "Koppel", - "common.connectAWallet.button": "Koppel 'n beursie", - "common.connectAWallet.button.evm": "Koppel Ethereum-beursie", - "common.connectAWallet.button.evm.switch": "Skakel Ethereum-beursie oor", - "common.connectAWallet.button.svm": "Koppel Solana-beursie", - "common.connectAWallet.button.svm.switch": "Skakel Solana-beursie om", - "common.connectAWallet.button.switch": "Wissel beursie", - "common.connectTo": "Koppel aan {{platform}}", - "common.connectWallet.button": "Koppel beursie", - "common.contactUs.button": "Kontak Ons", - "common.copied": "Gekopieer", - "common.copy.address": "Kopieer adres", - "common.copy.poolId": "Kopieer poel-ID", - "common.copyLink.button": "Kopieer skakel", - "common.created.date": "Geskep {{date}}", - "common.currency": "Geldeenheid", - "common.currentPrice": "Huidige prys", - "common.custom": "Pasgemaak", - "common.customRange": "Pasgemaakte reeks", - "common.dataOutdated": "Data kan verouderd wees", - "common.day": "dag", - "common.default": "Verstek", - "common.defaultTradeOptions": "Standaard handel opsies", - "common.deposit.toNetwork": "Deponeer tokens na die {{label}} netwerk.", - "common.depositing": "Deponeer", - "common.depositTokens": "Deposito tokens", - "common.detected": "Bespeur", - "common.developers": "Ontwikkelaars", - "common.device": "Hierdie toestel", - "common.device.other": "Ander toestel", - "common.dismiss": "Verwerp", - "common.docs": "Dokumente", - "common.donate": "Skenk", - "common.done": "Klaar", - "common.dontShowAgain": "Moenie dit weer wys nie", - "common.download": "Aflaai", - "common.downloadAppStore": "Laai af in die App Store", - "common.downloadPlayStore": "Laai af in die Play Winkel", - "common.downloadUniswapApp": "Laai die Uniswap-toepassing af", - "common.downloadUniswapWallet": "Laai Uniswap-beursie af", - "common.dynamic": "Dinamies", - "common.edit.button": "Wysig", - "common.ended": "Geëindig", - "common.error.details": "Foutbesonderhede", - "common.error.general": "Iets het verkeerd geloop", - "common.error.label": "Fout", - "common.error.request": "Jammer, 'n fout het voorgekom tydens die verwerking van jou versoek. As jy ondersteuning versoek, maak seker dat jy die besonderhede van hierdie fout kopieer.", - "common.error.somethingWrong": "Iets het verkeerd geloop!", - "common.errorConnecting.error": "Konneksie fout", - "common.errorLoadingData.error": "Kon nie data laai nie", - "common.etherscan": "Etherscan", - "common.expiry": "Verval", - "common.explore": "Verken", - "common.explorer": "Verkenner", - "common.exploreTokens": "Verken tokens", - "common.extension": "Uniswap-uitbreiding", - "common.failedSwitchNetwork": "Kon nie netwerke verander nie", - "common.fee": "Fooi", - "common.fees": "Fooie", - "common.feesEarned": "Fooie verdien", - "common.feesEarnedPerBase": "{{symbolA}} per {{symbolB}}", - "common.for": "Vir", - "common.free": "Gratis", - "common.fullRange": "Volle omvang", - "common.getApp": "Kry app", - "common.getHelp.button": "Kry hulp", - "common.getStarted": "Begin", - "common.getSupport.button": "Kry ondersteuning", - "common.getTheApp": "Kry die toep", - "common.getUniswapWallet": "Kry Uniswap Wallet", - "common.getUniswapWallet.mobile": "Kry die Uniswap-mobiele toepassing", - "common.governance": "Bestuur", - "common.happyHolidays": "Gelukkige vakansies van die Uniswap-span!", - "common.help": "Hulp", - "common.helpCenter": "Hulp Sentrum", - "common.hidden": "Versteek", - "common.hide.button": "Versteek", - "common.highPrice": "Hoë prys", - "common.includes": "Sluit in", - "common.info.label": "Inligting", - "common.input.noRecipient.error": "Kies ontvanger", - "common.input.password.confirm": "Bevestig Wagwoord", - "common.input.password.error.mismatch": "Wagwoorde stem nie ooreen nie", - "common.input.password.error.weak": "Hierdie wagwoord is te swak", - "common.input.password.new": "Nuwe Wagwoord", - "common.input.password.placeholder": "Wagwoord", - "common.input.password.strength.medium": "Medium", - "common.input.password.strength.strong": "Sterk", - "common.input.password.strength.weak": "Swak", - "common.input.search": "Soek", - "common.insufficient.funds": "Onvoldoende fondse", - "common.insufficientBalance.error": "Onvoldoende balans", - "common.insufficientFundsForNetworkFee.error": "Onvoldoende fondse om netwerkkoste te dek", - "common.insufficientTokenBalance.error": "Onvoldoende {{tokenSymbol}} balans", - "common.insufficientTokenBalance.error.simple": "Nie genoeg {{tokenSymbol}}nie", - "common.invalidPair": "Ongeldige paar", - "common.invalidRecipient.error": "Ongeldige ontvanger", - "common.iOSAndroid": "iOS en Android", - "common.language": "Taal", - "common.learnMoreSwap": "Kom meer te wete oor ruiltransaksies", - "common.legalAndPrivacy": "Reg en privaatheid", - "common.less": "Minder", - "common.limit.cancel_one": "Kanselleer limiet", - "common.limit.cancel_other": "Kanselleer {{count}} limiete", - "common.limit.canceled": "Limiet gekanselleer", - "common.limit.executed": "Limiet uitgevoer", - "common.limit.expired": "Limiet het verval", - "common.limit.failed": "Limiet het misluk", - "common.limit.opened": "Limiet oopgemaak", - "common.limit.pending": "Beperk hangende", - "common.limits": "Perke", - "common.limits.approachMax": "Nader 100 limiet maksimum", - "common.limits.cancelProceed": "Kanselleer limiete om voort te gaan", - "common.limits.expires": "Verval {{timestamp}}", - "common.limits.open": "Oop perke", - "common.limits.when": "wanneer {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "Skakels", - "common.liquidity": "Likiditeit", - "common.liquidity.provision": "Likiditeitsvoorsiening", - "common.liquidity.removed": "Likiditeit verwyder", - "common.loading": "Laai tans", - "common.longText.button.less": "Lees minder", - "common.longText.button.more": "Lees meer", - "common.lowPrice": "Lae prys", - "common.manage": "Bestuur", - "common.market.label": "Mark", - "common.marketPrice": "Markprys", - "common.marketPrice.fetching": "Haal tans markprys …", - "common.marketPrice.label": "Markprys:", - "common.marketPrice.unavailable": "Markprys nie gevind nie. Doen asseblief jou eie navorsing om verlies aan fondse te voorkom.", - "common.max": "Maks", - "common.message": "Boodskap", - "common.migrate": "Migreer", - "common.migrate.liquidity.failed": "Migreer likiditeit het misluk", - "common.migrate.position": "Migreer posisie", - "common.migrated.liquidity": "Gemigreerde likiditeit", - "common.migrating.liquidity": "Migreer likiditeit", - "common.min": "Min", - "common.more": "Meer", - "common.moreDetails": "Meer besonderhede", - "common.navigation.settings": "Instellings", - "common.navigation.systemSettings": "Instellings", - "common.navigationButton": "Navigasie-knoppie", - "common.needHelp": "Het jy hulp nodig?", - "common.networkCost": "Netwerk koste", - "common.neverMind": "Toemaar", - "common.new": "Nuut", - "common.new.exclamation": "Nuut!", - "common.nft": "NFT", - "common.nfts": "NFT's", - "common.noAmount.error": "Voer 'n bedrag in", - "common.noData": "Geen data", - "common.none": "Geen", - "common.noResults": "Geen resultate gevind.", - "common.notAvailableInRegion.error": "Nie beskikbaar in jou streek nie", - "common.notCreated.label": "Nie geskep nie", - "common.notSupported": "Nie ondersteun nie", - "common.oneDay": "1 dag", - "common.oneDay.short": "1D", - "common.oneHour.short": "1H", - "common.oneMonth": "1 maand", - "common.oneWeek": "1 week", - "common.oneYear": "1 jaar", - "common.opensea.link": "Kyk op OpenSea", - "common.orderCanceled": "Bestelling gekanselleer", - "common.orderExecuted": "Opdrag uitgevoer", - "common.orderExpired": "Bestelling het verval", - "common.orderPending": "Bestelling hangende", - "common.outOfRange": "Buite bereik", - "common.pageNotFound": "Bladsy nie gevind nie!", - "common.passkey.count": "Wagsleutel {{number}}", - "common.passkeys": "Wagsleutels", - "common.passkeys.add": "Voeg 'n wagwoord by", - "common.passkeys.add.description": "Kies waar om jou nuwe wagwoord te stoor.", - "common.pastDay": "Verlede dag", - "common.pastFiveMinutes": "Afgelope vyf minute", - "common.pastHour": "Verlede uur", - "common.pastMonth": "Verlede maand", - "common.pastWeek": "Verlede week", - "common.pastYear": "Verlede jaar", - "common.pending": "Hangende", - "common.pending.cancellation": "Hangende kansellasie", - "common.pendingEllipsis": "Hangende …", - "common.permit": "Permit", - "common.plusMore": "+{{number}} meer", - "common.pool": "Swembad", - "common.pools": "Swembaddens", - "common.portfolio": "Portefeulje", - "common.poweredBy": "Aangedryf deur ", - "common.price": "Prys", - "common.priceUpdated": "Prys opgedateer", - "common.privacyChoices": "Jou privaatheidskeuses", - "common.privacyChoices.checkbox.description": "As dit gemerk is, sal ons nie jou data met derdepartyvennote deel vir gepersonaliseerde advertensies nie. Jy kan enige tyd deling aktiveer deur hierdie blokkie te ontmerk.", - "common.privacyChoices.checkbox.label": "Moenie my inligting deel nie", - "common.privacyChoices.description": "Ons kan toestelidentifiseerders met ons advertensievennote deel om ons dienste op ander webwerwe en platforms te bevorder. Waar dit kwalifiseer as verkoop, deel of geteikende advertensies ingevolge toepaslike wette, kan jy onttrek deur die \"moenie my inligting deel nie\"-blokkie te merk. Vir meer inligting oor ons privaatheidspraktyke, lees asseblief ons Privaatheidsbeleid.", - "common.privacyChoices.disclaimer": "Neem asseblief kennis dat jou keuse slegs van toepassing is op hierdie blaaier op hierdie toestel. Jy kan ook onttrek deur die Global Privaatheidsbeheer-instelling te aktiveer in die blaaier wat jy gebruik om toegang tot ons dienste te verkry. Gaan na jou instellings om meer opsies te sien.", - "common.privacyPolicy": "Privaatheidsbeleid", - "common.proceed": "Voortgaan", - "common.proceedInWallet": "Gaan voort in jou beursie", - "common.products": "Produkte", - "common.protocol": "Protokol", - "common.protocol.v2": "Uniswap v2", - "common.protocol.v3": "Uniswap v3", - "common.protocol.v4": "Uniswap v4", - "common.purchased": "Gekoop", - "common.rate": "Koers", - "common.readMore": "Lees meer", - "common.receive": "Ontvang", - "common.received": "Ontvang", - "common.recent": "Onlangs", - "common.refresh": "Verfris", - "common.reload.label": "Herlaai die toepassing", - "common.remove.label": "Verwyder", - "common.remove.liquidity.canceled": "Verwydering van likiditeit gekanselleer", - "common.remove.liquidity.failed": "Verwyder likiditeit het misluk", - "common.removing.liquidity": "Verwydering van likiditeit", - "common.resetLimit": "Stel {{symbol}} limiet terug", - "common.resetLimitWallet": "Stel {{symbol}} limiet in beursie terug", - "common.resettingLimit": "Stel tans {{symbol}} limiet terug …", - "common.revoke.approval.failed": "Herroepgoedkeuring het misluk", - "common.revoked.approval": "Goedkeuring herroep", - "common.revoking.approval": "Herroeping van goedkeuring", - "common.scanQRDownload": "Skandeer die QR-kode met jou foon om af te laai", - "common.selectRegion.label": "Kies jou streek", - "common.selectToken.label": "Kies 'n teken", - "common.sell.label": "Verkoop", - "common.send.button": "Stuur", - "common.send.failed": "Stuur misluk", - "common.sending": "Stuur", - "common.sent": "Gestuur", - "common.settings": "Instellings", - "common.share": "Deel", - "common.share.shareToTwitter": "Deel op Twitter", - "common.show.button": "Wys", - "common.showLess.button": "Wys minder", - "common.showMore.button": "Wys meer", - "common.signatureExpired": "Jou handtekening het verval.", - "common.signMessage": "Teken boodskap", - "common.signMessageWallet": "Teken boodskap in beursie", - "common.socials": "Sosiale media", - "common.sold": "Verkoop", - "common.stats": "Statistieke", - "common.status": "Status", - "common.step.number": "Stap {{number}}", - "common.step.number.of": "Stap {{current}} van {{total}}", - "common.swap": "Ruil", - "common.swap.expired": "Ruil het verval", - "common.swap.failed": "Omruil het misluk", - "common.swapPending": "Ruil hangende...", - "common.termsOfService": "Diensbepalings", - "common.text.connected": "Gekoppel", - "common.text.contract": "Kontrak", - "common.text.disconnected": "Ontkoppel", - "common.text.error": "Fout", - "common.text.notAvailable": "NVT", - "common.text.recipient": "Om", - "common.text.sender": "Van", - "common.text.unknown": "Onbekend", - "common.thisAccount": "hierdie rekening", - "common.thisMonth": "Hierdie maand", - "common.thisToken": "Hierdie teken", - "common.thisWeek": "Hierdie week", - "common.thisYear": "Hierdie jaar", - "common.time": "Tyd", - "common.time.minute.amt": "{{time}}m", - "common.time.minutes": "minute", - "common.time.past.days": "{{days}} dae", - "common.time.past.days.short": "{{days}}d", - "common.time.past.hours": "{{hours}} ure", - "common.time.past.hours.short": "{{hours}}h", - "common.time.past.minutes.short": "{{minutes}}m", - "common.time.past.months.short": "{{months}}ma", - "common.time.past.seconds.short": "{{seconds}}s", - "common.to": "om", - "common.today": "Vandag", - "common.tokenA": "Teken A", - "common.tokenAmount": "Tokenbedrag", - "common.tokenB": "Teken B", - "common.tokenName": "Token naam", - "common.tokens": "Tekens", - "common.totalUniswapTVL": "Totale Uniswap TVL", - "common.totalValueLocked": "TVL", - "common.trade": "Handel", - "common.trademarkPolicy": "Handelsmerkbeleid", - "common.transactionDetails": "Transaksiebesonderhede", - "common.transactionId": "Transaksie ID", - "common.transactionPending": "Transaksie hangende", - "common.transactions": "Transaksies", - "common.transactionSettings": "Transaksie-instellings", - "common.transfer_one": "oordrag", - "common.transfer_other": "oordragte", - "common.tryAgain.error": "Probeer weer", - "common.twitter": "Twitter", - "common.type.label": "Tik", - "common.unavailable": "Onbeskikbaar", - "common.unhide": "Ontsteek", - "common.unichain": "Unichain", - "common.uniswapMobile": "Uniswap Selfoon", - "common.uniswapWallet": "Uniswap beursie", - "common.uniswapX": "UniswapX", - "common.unknown": "Onbekend", - "common.unknownError.error": "Onbekende fout", - "common.unwrap.button": "Ontwikkel", - "common.unwrap.failed": "Ontwikkel het misluk", - "common.unwrapped": "Ontwikkel", - "common.unwrapping": "Ontwikkel", - "common.view.profile": "Bekyk profiel", - "common.viewOnExplorer": "Kyk op Explorer", - "common.volume": "Volume", - "common.vote": "Stem", - "common.wallet.approve": "Keur in beursie goed", - "common.wallet.label": "Beursie", - "common.warning": "Waarskuwing", - "common.webApp": "Web app", - "common.website": "Webwerf", - "common.whyApprove": "Hoekom moet ek 'n teken goedkeur?", - "common.whySign": "Hoekom word handtekeninge vereis?", - "common.whyWrap": "Hoekom moet ek my {{symbol}}toedraai?", - "common.withdraw": "Onttrek", - "common.withdrawal.amount": "Onttrekkingsbedrag", - "common.withinRange": "Binne bereik", - "common.wrap": "Draai {{symbol}}toe", - "common.wrap.failed": "Omvou het misluk", - "common.wrapIn": "Draai {{symbol}} in beursie toe", - "common.wrapped": "Toegedraai", - "common.wrapping": "Toedraai", - "common.wrappingToken": "Toedraai {{symbol}}...", - "common.yesterday": "Gister", - "common.your.account.had.insufficient.funds": "Jou rekening het onvoldoende fondse gehad om hierdie omruiling te voltooi.", - "common.your.account.has.insufficient.funds": "Jou rekening het onvoldoende fondse om hierdie ruil te voltooi.", - "common.your.connected.wallet": "Jou gekoppelde beursie", - "common.your.limit.could.not.be.fulfilled": "Jou limiet kon nie op hierdie stadium nagekom word nie. Probeer asseblief weer.", - "common.your.swap.could.not.be.fulfilled": "Jou omruiling kon nie op hierdie stadium vervul word nie. Probeer asseblief weer.", - "common.youreBuying": "Jy koop", - "common.youReceive": "Jy ontvang", - "common.youreSelling": "Jy verkoop", - "currency.ars": "Argentynse Peso", - "currency.aud": "Australiese dollar", - "currency.brl": "Brasiliaanse Real", - "currency.cad": "Kanadese Dollar", - "currency.cny": "Chinese Yuan", - "currency.cop": "Colombiaanse Peso", - "currency.eur": "Euro", - "currency.gbp": "Britse pond", - "currency.hkd": "Hong Kong Dollar", - "currency.idr": "Indonesiese roepia", - "currency.inr": "Indiese roepee", - "currency.jpy": "Japannese jen", - "currency.krw": "Suid-Koreaanse Won", - "currency.mxn": "Meksikaanse Peso", - "currency.ngn": "Nigeriese Naira", - "currency.pkr": "Pakistanse roepee", - "currency.rub": "Russiese roebel", - "currency.sgd": "Singapoer dollar", - "currency.try": "Turkse Lira", - "currency.uah": "Oekraïens grivna", - "currency.usd": "Amerikaanse dollar", - "currency.vnd": "Viëtnamese Dong", - "dapp.request.actionCannotBeCompleted.description": "Sommige funksies is nie beskikbaar nie, want jou slimbeursie-instellings word deur 'n ander beursie-app bestuur.", - "dapp.request.actionCannotBeCompleted.header": "Handtekening versoek", - "dapp.request.actionCannotBeCompleted.title": "Aksie kan nie voltooi word nie", - "dapp.request.approve.action": "Keur goed", - "dapp.request.approve.fallbackTitle": "Keur hierdie webwerf goed om toegang te verkry tot tekens", - "dapp.request.approve.helptext": "Laat hierdie werf toe om toegang tot hierdie teken te kry en dit vir transaksies te spandeer. Maak seker dat jy hierdie webwerf vertrou.", - "dapp.request.approve.label": "Beursie", - "dapp.request.approve.title": "Keur toegang tot {{tokenSymbol}}goed", - "dapp.request.base.title": "Transaksieversoek", - "dapp.request.bridge.description": "Beweeg ETH, USDC en meer oor {{numChains}}+ netwerke.", - "dapp.request.bridge.title": "Probeer oorbrug?", - "dapp.request.connect.helptext": "Laat hierdie webwerf toe om jou beursie-adres, balans te sien en goedkeurings vir transaksies te versoek.", - "dapp.request.connect.title": "Koppel aan werf", - "dapp.request.fallback.calldata.label": "Rou data", - "dapp.request.fallback.function.label": "Funksie", - "dapp.request.permit2.description": "Permit2 bestuur tokengoedkeurings oor verskeie dapps.", - "dapp.request.permit2.header": "Teken Permit 2", - "dapp.request.permit2approve.action": "Keur goed", - "dapp.request.permit2approve.helptext": "Permit2 bestuur tokengoedkeurings oor verskeie dapps.", - "dapp.request.permit2approve.title": "Goedkeur Permit2", - "dapp.request.reject.action": "Verwerp almal", - "dapp.request.reject.info": "Jy het {{totalRequestCount}} transaksieversoeke", - "dapp.request.revoke.action": "Herroep", - "dapp.request.revoke.helptext": "Laat hierdie werf toe om toegang te herroep om hierdie teken vir transaksies te spandeer. Maak seker dat jy hierdie webwerf vertrou.", - "dapp.request.revoke.title": "Herroep toegang tot {{tokenSymbol}}", - "dapp.request.signature.containsUnrenderableCharacters": "Hierdie boodskap bevat onweergeefbare karakters. Maak seker dat jy hierdie webwerf vertrou.", - "dapp.request.signature.decodeError": "Kon nie boodskap dekodeer nie", - "dapp.request.signature.header": "Handtekening versoek", - "dapp.request.signature.irregular": "Onreëlmatige handtekeningversoek", - "dapp.request.signature.irregular.description": "Maak seker dat jy hierdie webwerf vertrou voordat jy voortgaan", - "dapp.request.signature.irregular.understand": "Ek verstaan die risiko's", - "dapp.request.signature.toggleDataView.raw": "Bekyk rou data", - "dapp.request.signature.toggleDataView.readable": "Bekyk oorspronklike data", - "dapp.request.warning.notActive.message": "Maak seker dit is die regte een", - "dapp.request.warning.notActive.title": "Dit is nie jou aktiewe beursie nie", - "delegation.upgradeModal.description": "Hierdie beursie-opdatering gebruik slimkontrakte vir vinniger, laerkoste-transaksies. Leer meer", - "delegation.upgradeModal.enableSmartWallet": "Aktiveer slim beursie", - "delegation.upgradeModal.title": "Slimmer ruilings, laer koste", - "downloadApp.modal.connectExistingWallet": "Koppel bestaande beursie", - "downloadApp.modal.getStarted.description": "Kry onmiddellik toegang tot duisende tokens deur die wêreld se grootste onchain-mark.", - "downloadApp.modal.getStarted.title": "Begin binne sekondes omruil", - "downloadApp.modal.getTheApp.title": "Begin met Uniswap", - "downloadApp.modal.uniswapProducts.subtitle": "Uniswap-produkte werk naatloos saam om die beste onchain-ervaring te skep.", - "empty.swap.button.text": "Voeg fondse by om te ruil", - "error.dataUnavailable": "Data is op die oomblik nie beskikbaar nie; ons werk aan 'n regstelling", - "error.id": "Fout-ID: {{eventId}}", - "error.jupiterApi.execute.default.title": "Iets het verkeerd geloop met Jupiter API. Probeer asseblief weer.", - "error.jupiterApi.failedToLand": "(Kode {{code}}: Transaksie kon nie op die netwerk land nie)", - "error.jupiterApi.invalidBlockHeight": "(Kode -1004: Ongeldige blokhoogte)", - "error.jupiterApi.invalidMessageBytes": "(Kode -3: Ongeldige boodskapgrepe)", - "error.jupiterApi.invalidPayload": "(Kode -2002: Ongeldige vrag)", - "error.jupiterApi.invalidSignedTransaction": "(Kode -2: Ongeldige getekende transaksie)", - "error.jupiterApi.invalidTransaction": "(Kode -1002: Ongeldige transaksie)", - "error.jupiterApi.missingCachedOrder": "(Kode -1: Ontbrekende kasgeheue-bestelling)", - "error.jupiterApi.notFullySigned": "(Kode -1003: Transaksie nie volledig geteken nie)", - "error.jupiterApi.quoteExpired": "Hierdie aanhaling het verstryk, probeer asseblief weer. (Kode -2003)", - "error.jupiterApi.unknownErrorCode": "(Kode {{code}})", - "error.noData": "Geen data gevind nie", - "error.request.provideId": "Jammer, 'n fout het voorgekom tydens die verwerking van jou versoek. As jy ondersteuning versoek, maak seker dat jy jou fout-ID verskaf.", - "error.tokenApproval": "Tokengoedkeuring het misluk", - "error.tokenApproval.message": "'n Netwerk- of verbindingsprobleem het waarskynlik veroorsaak dat jou goedkeuring misluk het. Kontroleer jou verbinding en probeer weer.", - "error.tokenApprovalEdited": "Onvoldoende goedkeuringsbedrag", - "error.tokenApprovalEdited.message": "Die goedkeuringsbedrag wat in jou beursie gestel is, is te laag om hierdie transaksie te voltooi. Probeer asseblief weer en verhoog die bedrag.", - "errors.crash.message": "Iets het neergestort.", - "errors.crash.restart": "Herbegin app", - "errors.crash.title": "Uh Oh!", - "explore.more.pools": "Verken meer swembaddens", - "explore.more.unichain": "Verken Unichain-swembaddens", - "explore.search.label.ownedBy": "Besit deur {{ownerAddress}}", - "explore.search.placeholder": "Soek tekens en beursies", - "explore.search.section.nft": "NFT-versamelings", - "explore.search.section.popularNFT": "Gewilde NFT-versamelings", - "explore.search.section.wallets": "Beursies", - "explore.tokens.error": "Kon nie tokens laai nie", - "explore.tokens.favorite.action.add": "Gunsteling teken", - "explore.tokens.favorite.action.edit": "Wysig gunstelinge", - "explore.tokens.favorite.action.remove": "Verwyder gunsteling", - "explore.tokens.favorite.title.default": "Gunsteling tekens", - "explore.tokens.favorite.title.edit": "Wysig gunsteling tokens", - "explore.tokens.metadata.marketCap": "{{number}} MCap", - "explore.tokens.metadata.totalValueLocked": "{{number}} TVL", - "explore.tokens.metadata.volume": "{{number}} Vol", - "explore.tokens.sort.label.marketCap": "Markkapitalisasie", - "explore.tokens.sort.label.priceDecrease": "Prys afname", - "explore.tokens.sort.label.priceIncrease": "Prysverhoging", - "explore.tokens.sort.label.totalValueLocked": "TVL", - "explore.tokens.sort.label.volume": "Volume", - "explore.tokens.sort.option.marketCap": "Markkapitalisasie", - "explore.tokens.sort.option.priceDecrease": "Prysverlaging (24H)", - "explore.tokens.sort.option.priceIncrease": "Prysverhoging (24H)", - "explore.tokens.sort.option.totalValueLocked": "Verruil TVL", - "explore.tokens.sort.option.volume": "Uniswap volume (24H)", - "explore.tokens.top.title": "Top tokens", - "explore.v2TVL": "v2 TVL", - "explore.v3TVL": "v3 TVL", - "explore.v4TVL": "v4 TVL", - "explore.wallets.favorite.action.add": "Gunsteling beursie", - "explore.wallets.favorite.action.edit": "Wysig gunstelinge", - "explore.wallets.favorite.action.remove": "Verwyder gunsteling", - "explore.wallets.favorite.action.remove.short": "Ontfavoriet", - "explore.wallets.favorite.title.default": "Gunsteling beursies", - "explore.wallets.favorite.title.edit": "Wysig gunsteling beursies", - "extension.connection.network": "Netwerk", - "extension.connection.networks": "Netwerke", - "extension.connection.popup.trouble": "Sukkel om te koppel?", - "extension.connection.titleConnected": "Gekoppel", - "extension.connection.titleNotConnected": "Nie gekonnekteer nie", - "extension.lock.button.forgot": "Wagwoord vergeet?", - "extension.lock.button.reset": "Stel beursie terug", - "extension.lock.button.submit": "Ontsluit", - "extension.lock.password.error": "Verkeerde wagwoord. Probeer weer", - "extension.lock.password.reset.initial.description": "Uniswap kan nie help om jou wagwoord te herstel nie. Jy moet jou beursie terugstel deur jou 12-woord-herstelfrase weer in te voer.", - "extension.lock.password.reset.initial.help": "Waar vind ek my herstelfrase?", - "extension.lock.password.reset.initial.title": "Wagwoord vergeet", - "extension.lock.password.reset.speedbump.description": "Maak seker dat jy jou 12-woord-herstelfrase het voordat jy jou beursie terugstel. Andersins sal jy nie jou fondse kan verhaal nie.", - "extension.lock.password.reset.speedbump.help": "Ek het my herstelfrase verloor", - "extension.lock.password.reset.speedbump.title": "Voordat jy voortgaan", - "extension.lock.subtitle": "Voer jou wagwoord in om te ontsluit", - "extension.lock.title": "Welkom terug", - "extension.network.notSupported": "Nie-ondersteunde netwerk", - "extension.open": "Maak Uniswap-uitbreiding oop", - "extension.passwordPrompt.error.wrongPassword": "Verkeerde wagwoord. Probeer weer", - "extension.passwordPrompt.title": "Sleutel jou wagwoord in", - "extension.popup.chrome.button": "Maak uitbreiding oop", - "extension.popup.chrome.description": "Voltooi hierdie aksie deur die Uniswap-uitbreiding oop te maak.", - "extension.popup.chrome.title": "Gaan voort in Uniswap", - "extension.settings.defaultWallet.message": "Prioritiseer Uniswap-uitbreiding wanneer jy aan programme koppel.", - "extension.settings.defaultWallet.title": "Maak verstek beursie", - "extension.uninstall.reason.missingFeatures": "Uniswap Wallet het nie sekere kenmerke nie.", - "extension.uninstall.reason.notUsingCrypto": "Ek wil nie meer kripto gebruik nie", - "extension.uninstall.reason.other": "Ander redes", - "extension.uninstall.reason.switchingWallet": "Ek skakel oor na 'n ander beursie", - "extension.uninstall.subtitle": "As jy 'n oomblik het, sal ons graag wil hoor hoekom jy Uniswap Wallet verwyder het.", - "extension.uninstall.title": "Ons is hartseer om jou te sien gaan", - "extension.warning.storage.button": "Ondersteuning", - "extension.warning.storage.message": "Maak seker dat jy jou herstelfrase rugsteun om te verhoed dat jy toegang tot jou beursie en fondse verloor.", - "extension.warning.storage.title": "Jou blaaier se berging raak min", - "extensionPasskeyLogInPopUp.description": "Voer jou Uniswap-rekening in deur aan te meld met 'n bestaande wagwoord.", - "extensionPasskeyLogInPopUp.invalidReferrer": "Maak asseblief hierdie bladsy toe en probeer weer.", - "fee.bestForCustomizability": "Die beste vir aanpasbaarheid.", - "fee.bestForExotic": "Beste vir eksotiese pare.", - "fee.bestForMost": "Beste vir die meeste pare.", - "fee.bestForStablePairs": "Beste vir stabiele pare.", - "fee.bestForVeryStable": "Beste vir baie stabiele pare.", - "fee.dynamic": "Dinamiese fooi", - "fee.percentEarned": "Die % wat jy in fooie sal verdien.", - "fee.selectPercent": "{{pct}}% kies", - "fee.selectPercentDescription": "{{pct}}% van likiditeit gekies op hierdie vlak", - "fee.tier": "Fooi-vlak", - "fee.tier.create": "Skep fooi-vlak", - "fee.tier.create.button": "Skep nuwe fooi-vlak", - "fee.tier.create.description": "Die skep van 'n nuwe vlak sal in 'n nuwe poel geïnisialiseer en lei tot hoër as gewoonlik netwerkkoste.", - "fee.tier.description": "Die bedrag verdien wat likiditeit verskaf. Kies 'n bedrag wat pas by jou risikotoleransie en strategie.", - "fee.tier.description.v2": "Die bedrag verdien wat likiditeit verskaf. Alle v2-poele het vaste 0.3% fooie. Vir meer opsies, verskaf likiditeit op v4.", - "fee.tier.dynamic": "Dinamiese fooi-vlak", - "fee.tier.dynamic.create": "Skep dinamiese fooi-vlak", - "fee.tier.dynamic.create.info": "Jy is op die punt om 'n swembad met 'n dinamiese fooivlak te skep. Voordat u voortgaan, maak asseblief seker dat die geselekteerde haak dinamiese fooie ondersteun.", - "fee.tier.highestTvl": "Die hoogste waarde van TVL", - "fee.tier.label": "Die % wat jy in fooie sal verdien", - "fee.tier.missing.description": "Kan jy nie die vlak kry waarna jy soek nie?", - "fee.tier.new": "Nuwe vlak", - "fee.tier.percent.select": "{{percentage}} kies", - "fee.tier.recommended.description": "Aanbeveel op grond van die hoogste aandeel likiditeit vir die geselekteerde tokenpaar.", - "fee.tier.search": "Soek of skep ander fooivlakke", - "fee.tier.search.short": "Soek vlakke", - "fee.tier.select": "Kies fooivlak", - "fee.tier.select.existing.button": "Kies bestaande fooivlak", - "fee.tierExact": "{{fee}} fooivlak", - "fee.unavailable": "Verdiende fooie is nie sigbaar vir v2-posisies totdat likiditeit verwyder is nie.", - "fee.uncollected": "Sluit onafgehaalde fooie in:", - "fee.uniswap": "Fooi ({{percent}})", - "fee.uniswap.description": "Fooie word gehef om die beste ervaring met Uniswap te verseker.", - "fiatOffRamp.checkout.title": "Onttrek na", - "fiatOffRamp.connection.quote": "Verkoop {{amount}} ter waarde van {{currencySymbol}}", - "fiatOffRamp.error.balance": "Oorskry balans", - "fiatOffRamp.error.populateSend.description": "Wag asseblief 'n oomblik en probeer weer.", - "fiatOffRamp.error.populateSend.title": "Kan nie transaksie laai nie", - "fiatOffRamp.summary.total": "{{cryptoAmount}} vir {{fiatAmount}}", - "fiatOffRamp.unsupportedToken.back": "Gaan terug", - "fiatOffRamp.unsupportedToken.divider": "Onondersteunde tokens", - "fiatOffRamp.unsupportedToken.message": "Hierdie teken word nie ondersteun om te verkoop nie. Ruil hierdie bate na een van die ondersteunde tokens.", - "fiatOffRamp.unsupportedToken.swap": "Wissel na 'n ondersteunde teken", - "fiatOffRamp.unsupportedToken.title": "Ongesteunde teken", - "fiatOffRamp.welcome.tooltip": "Verkoop jou kripto na jou bankrekening of debietkaart.", - "fiatOnRamp.button.chooseToken": "Kies teken", - "fiatOnRamp.buy.info.description": "Jy sal dit nodig hê om netwerkkoste te betaal wanneer jy ruil.", - "fiatOnRamp.buy.info.title": "Begin met ETH", - "fiatOnRamp.cexTransferModal.description": "Die koop van kripto met 'n kaart word nie in jou streek ondersteun nie. Dra bates van 'n gesentraliseerde ruilrekening oor om jou beursie te finansier.", - "fiatOnRamp.cexTransferModal.title": "Dra oor om te begin", - "fiatOnRamp.checkout.title": "Afreken", - "fiatOnRamp.chooseMultiPlatformProvider.chooseNetwork": "Kies netwerk", - "fiatOnRamp.chooseMultiPlatformProvider.description": "Dit sal die beursie-adres bepaal waarop jy die fondse sal ontvang.", - "fiatOnRamp.chooseProvider.description": "Jy sal voortgaan na die verskaffer se portaal om die fooie te sien wat met jou transaksie geassosieer word.", - "fiatOnRamp.completeTransactionHeader": "Voltooi transaksie met {{serviceProvider}}", - "fiatOnRamp.connection.error": "Konneksie het misluk", - "fiatOnRamp.connection.errorDescription": "Iets het verkeerd geloop om met {{serviceProvider}}te koppel.", - "fiatOnRamp.connection.message": "Verbind jou met {{serviceProvider}}", - "fiatOnRamp.connection.quote": "Koop {{amount}} ter waarde van {{currencySymbol}}", - "fiatOnRamp.connection.terms": "Deur voort te gaan, erken jy dat jy onderhewig sal wees aan die Diensbepalings en Privaatheidsbeleid met {{serviceProvider}}, soos van toepassing.", - "fiatOnRamp.continueInTab": "Gaan na die {{serviceProvider}} -oortjie om voort te gaan. Dit is veilig om hierdie modaal nou te sluit.", - "fiatOnRamp.disclaimer": "Deur voort te gaan, erken jy dat jy onderhewig sal wees aan die Diensbepalings en Privaatheidsbeleid met {{serviceProvider}}, soos van toepassing.", - "fiatOnRamp.error.default": "Iets het verkeerd geloop.", - "fiatOnRamp.error.load": "Kon nie tokens laai om te koop nie", - "fiatOnRamp.error.max": "Maksimum {{amount}}", - "fiatOnRamp.error.min": "Minimum {{amount}}", - "fiatOnRamp.error.noQuotes": "Geen aanhalings gevind nie.", - "fiatOnRamp.error.unavailable": "Hierdie diens is nie in jou streek beskikbaar nie", - "fiatOnRamp.error.unsupported": "Word nie in streek ondersteun nie", - "fiatOnRamp.error.usd": "Slegs beskikbaar om in USD te koop", - "fiatOnRamp.noQuotes.error": "Geen aanhalings gevind nie", - "fiatOnRamp.paymentMethods.applePay": "Apple Pay", - "fiatOnRamp.paymentMethods.bank": "Bank", - "fiatOnRamp.paymentMethods.debit": "Debiet", - "fiatOnRamp.paymentMethods.googlePay": "Google Pay", - "fiatOnRamp.paymentMethods.paypal": "PayPal", - "fiatOnRamp.paymentMethods.venmo": "Venmo", - "fiatOnRamp.quote.advice": "Jy sal voortgaan na die verskaffer se portaal om die fooie te sien wat met jou transaksie geassosieer word.", - "fiatOnRamp.quote.type.list": "{{optionsList}}, en ander opsies", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "Van 'n rekening", - "fiatOnRamp.receiveCrypto.title": "Kry kripto", - "fiatOnRamp.receiveCrypto.transferFunds": "Befonds jou beursie deur kripto van 'n ander beursie of rekening oor te dra", - "fiatOnRamp.receiveCrypto.useThisAddress": "Gebruik hierdie adres om tokens te ontvang", - "fiatOnRamp.region.placeholder": "Soek volgens land of streek", - "fiatOnRamp.region.title": "Kies jou streek", - "fiatOnRamp.summary.total": "{{cryptoAmount}} vir {{fiatAmount}}", - "forceUpgrade.action.backup": "Rugsteun jou beursie", - "forceUpgrade.action.confirm": "Dateer nou op", - "forceUpgrade.action.learn": "Leer hoe om op te dateer", - "forceUpgrade.description.extension": "'n Nuwe weergawe van die toepassing is beskikbaar. Om voort te gaan om die Uniswap-uitbreiding te gebruik, dateer dit asseblief op na die nuutste weergawe.", - "forceUpgrade.description.wallet": "'n Nuwe weergawe van die toepassing is beskikbaar. Om voort te gaan om die Uniswap Wallet te gebruik, dateer dit asseblief op na die nuutste weergawe.", - "forceUpgrade.label.recoveryPhrase": "Herstel frase", - "forceUpgrade.title": "Dateer op na die nuutste weergawe", - "forceUpgrade.title.recommendedStatus": "'n Nuwe weergawe is beskikbaar", - "globalPreferences.title": "Globale voorkeure", - "hero.scroll": "Blaai om meer te wete te kom", - "hero.subtitle": "Koop en verkoop kripto op {{amount}}+ netwerke, insluitend Ethereum, Unichain en Base.", - "hero.swap.title": "Ruil enige tyd,
enige plek.", - "hidden.nfts.info.banner.text": "Kom meer te wete oor versteekte NFT's", - "hidden.nfts.info.text.button": "Versteekte NFT's ({{numHidden}})", - "hidden.nfts.info.text.extension": "Dit is potensiële swendelary en NFT's wat jy versteek het. Jy kan regskliek op 'n NFT om dit te ontsteek.", - "hidden.nfts.info.text.mobile": "Dit is potensiële swendelary en NFT's wat jy versteek het. Jy kan lank op 'n NFT druk om dit te ontsteek.", - "hidden.nfts.info.text.title": "Versteekte NFT's", - "hidden.tokens.info.banner.text": "Kom meer te wete oor versteekte tekens", - "hidden.tokens.info.text.button": "Versteekte tekens ({{numHidden}})", - "hidden.tokens.info.text.info": "Dit is potensiële swendelary, klein saldo's en tekens wat jy versteek het. Versteekte tekens is nie by jou totale beursiebalans ingesluit nie.", - "hidden.tokens.info.text.title": "Versteekte tekens", - "home.activity.empty.button": "Ontvang tekens of NFT's", - "home.activity.empty.description.default": "Wanneer jy tokens of NFT's goedkeur, verhandel of oordra, sal jou transaksies hier verskyn.", - "home.activity.empty.description.external": "Wanneer hierdie beursie transaksies doen, sal hulle hier verskyn.", - "home.activity.empty.title": "Nog geen aktiwiteit nie", - "home.activity.error.load": "Kon nie aktiwiteit laai nie", - "home.activity.title": "Aktiwiteit", - "home.banner.offline": "Jy is in vanlyn modus", - "home.banner.testnetMode": "Jy is in die toetsnetmodus", - "home.banner.testnetMode.nav": "Jy is in die toetsnet-modus. Skakel dit af in instellings.", - "home.empty.cexTransfer": "Oordrag", - "home.empty.cexTransfer.description": "Beweeg fondse vanaf 'n verhandelingsplatform.", - "home.empty.transfer": "Kry kripto", - "home.empty.transfer.description": "Skuif fondse uit 'n ander beursie.", - "home.explore.footer": "Tik hier om duisende tekens, NFT's en meer te verken", - "home.explore.title": "Verken tokens", - "home.extension.error": "Kon nie rekeninge laai nie", - "home.label.buy": "Koop", - "home.label.for": "Koop/Verkoop", - "home.label.receive": "Ontvang", - "home.label.send": "Stuur", - "home.label.swap": "Ruil", - "home.nfts.title": "NFT's", - "home.tokens.empty.action.buy.description": "Koop met 'n debietkaart of bankrekening.", - "home.tokens.empty.action.buy.title": "Koop kripto", - "home.tokens.empty.action.import.description": "Voer hierdie beursie se herstelfrase in om te begin ruil en stuur.", - "home.tokens.empty.action.import.title": "Voer beursie in", - "home.tokens.empty.action.receive.description": "Oordrag vanaf 'n ander beursie of rekening.", - "home.tokens.empty.action.receive.title": "Kry kripto", - "home.tokens.empty.description": "Wanneer hierdie beursie tokens koop of ontvang, sal hulle hier verskyn.", - "home.tokens.empty.title": "Nog geen tekens nie", - "home.tokens.empty.welcome.description": "Voeg fondse by om handel te begin", - "home.tokens.error.fetch": "Kon nie tokensaldo's haal nie", - "home.tokens.error.load": "Kon nie tokensaldo's laai nie", - "home.tokens.title": "Tekens", - "home.upsell.receive.cta": "Van 'n rekening", - "home.upsell.receive.title": "Kry kripto", - "home.warning.viewOnly": "Dit is 'n view-only beursie", - "interface.metatags.description": "Ruil kripto op Ethereum, Base, Arbitrum, Polygon, Unichain en meer. Die DeFi-platform wat deur miljoene vertrou word.", - "interface.metatags.title": "Uniswap-koppelvlak", - "landing.api": "API", - "landing.appsOverview": "Gebou vir al die maniere waarop jy ruil", - "landing.blog.description": "Bly op hoogte van die nuutste maatskappynuus, produkkenmerke en meer", - "landing.docs.description": "Verken ons biblioteek van ontwikkelaarsdokumente om met Uniswap te begin bou", - "landing.exploreUniverse": "Verken die heelal", - "landing.getStarted": "Handel op die wêreld se grootste DEX", - "landing.helpCenter.body": "Blaai deur die algemene vrae en kry ondersteuning van ons ondersteuningspan in die VSA", - "landing.protocolDescription": "Uniswap Labs dryf sommige van die mees gebruikte produkte in kripto aan. Ervaar toestemminglose toegang, bewese sekuriteit en toegewyde ondersteuning.", - "landing.protocolStats": "Uniswap-protokolstatistieke", - "landing.provideLiquidity.body": "Verskaf likiditeit en vorder fooie deur die Uniswap-koppelvlak te gebruik.", - "landing.provideLiquidity.subtitle": "Krag-aankettingmarkte.", - "landing.socials": "Volg Uniswap Labs op X, Farcaster, LinkedIn, en TikTok", - "landing.swapBody": "Kry toegang tot diep likiditeit, verken tokens, stel limietorders en verskaf likiditeit vir duisende tokens oor {{amount}} kettings.", - "landing.swapSubtitle": "Toestemminglose omruiling.", - "landing.tradingApi": "Handels-API", - "landing.tradingApiBody": "Gebruik dieselfde API wat die Uniswap-webtoepassing en -beursie aandryf, wat deur toonaangewende spanne regoor die wêreld vertrou word.", - "landing.tradingApiButton": "Integreer die Uniswap API", - "landing.tradingApiSubtitle": "DeFi, direk aan jou gebruikers.", - "landing.trusted": "Vertrou deur miljoene", - "landing.unichain.body": "Sluit aan by die gemeenskapsbou op die vinnige, gedesentraliseerde Ethereum L2 wat gebou is om die tuiste vir DeFi te wees.", - "landing.unichain.button": "Begin bou", - "landing.unichain.subtitle": "Die DeFi-ketting.", - "landing.uniswapX.body": "Gaslose transaksies en MEV-beskerming, met geen fooie vir mislukte ruilings nie.", - "landing.uniswapX.button": "Ervaar UniswapX", - "landing.uniswapX.subtitle": "Slimmer ruilings, nul wrywing.", - "landing.walletBody": "Die vertroude selfbewarende kripto-beursie en uitbreiding met miljoene aflaaie, ondersteuning van regte mense en 'n 4.8 gradering.", - "landing.walletSubtitle": "Ruil, bêre, verken.", - "language.afrikaans": "Afrikaans", - "language.arabic": "Arabies", - "language.catalan": "Katalaans", - "language.chineseSimplified": "Chinees, vereenvoudig", - "language.chineseTraditional": "Chinees, Tradisioneel", - "language.czech": "Tsjeggies", - "language.danish": "Deens", - "language.dutch": "Nederlands", - "language.english": "Engels", - "language.finnish": "Fins", - "language.french": "Frans", - "language.greek": "Grieks", - "language.hebrew": "Hebreeus", - "language.hindi": "Hindi", - "language.hungarian": "Hongaars", - "language.indonesian": "Indonesies", - "language.italian": "Italiaans", - "language.japanese": "Japannese", - "language.korean": "Koreaans", - "language.malay": "Maleis", - "language.norwegian": "Noors", - "language.polish": "Pools", - "language.portuguese": "Portugees", - "language.romanian": "Roemeens", - "language.russian": "Russies", - "language.serbian": "Serwies", - "language.spanishArgentina": "Spaans (Argentinië)", - "language.spanishBelize": "Spaans (Belize)", - "language.spanishBolivia": "Spaans (Bolivië)", - "language.spanishChile": "Spaans (Chili)", - "language.spanishColombia": "Spaans (Columbië)", - "language.spanishCostaRica": "Spaans (Costa Rica)", - "language.spanishCuba": "Spaans (Kuba)", - "language.spanishDominicanRepublic": "Spaans (Dominikaanse Republiek)", - "language.spanishEcuador": "Spaans (Ecuador)", - "language.spanishElSalvador": "Spaans (El Salvador)", - "language.spanishGuatemala": "Spaans (Guatemala)", - "language.spanishHonduras": "Spaans (Honduras)", - "language.spanishLatam": "Spaans (Latyns-Amerika)", - "language.spanishMexico": "Spaans (Mexiko)", - "language.spanishNicaragua": "Spaans (Nikaragua)", - "language.spanishPanama": "Spaans (Panama)", - "language.spanishParaguay": "Spaans (Paraguay)", - "language.spanishPeru": "Spaans (Peru)", - "language.spanishPuertoRico": "Spaans (Puerto Rico)", - "language.spanishSpain": "Spaans (Spanje)", - "language.spanishUruguay": "Spaans (Uruguay)", - "language.spanishUs": "Spaans (VS)", - "language.spanishVenezuela": "Spaans (Venezuela)", - "language.swahili": "Swahili", - "language.swedish": "Sweeds", - "language.turkish": "Turks", - "language.ukrainian": "Oekraïens", - "language.urdu": "Oerdoe", - "language.vietnamese": "Viëtnamees", - "large.price.difference": "Groot prysverskil", - "large.price.difference.tooltip": "Om met hierdie transaksie voort te gaan, sal 'n verlies aan fondse tot gevolg hê. Hierdie verskil kan wees as gevolg van groot transaksies of lae likiditeit.", - "limit.open.count_one": "1 oop limiet", - "limit.open.count_other": "{{count}} oop limiete", - "limitPrice.buyingAboveMarketPrice.error.description": "Jou limietprys is {{percentage}}% hoër as die mark. Pas jou limietprys aan om voort te gaan.", - "limitPrice.buyingAboveMarketPrice.error.title": "Koop {{tokenSymbol}} bo markprys", - "limitPrice.marketPriceNotAvailable.error.description": "Ons kan nie die huidige markprys bereken nie. Om te verhoed dat 'n bestelling onder markprys ingedien word, gaan asseblief jou netwerkverbinding na en probeer weer.", - "limitPrice.marketPriceNotAvailable.error.title": "Markprys nie beskikbaar nie", - "limitPrice.sellingBelowMarketPrice.error.description": "Jou limietprys is {{percentage}}% laer as die mark. Pas jou limietprys aan om voort te gaan.", - "limitPrice.sellingBelowMarketPrice.error.title": "Verkoop {{tokenSymbol}} onder markprys", - "limits.form.disclaimer.mainnet": "Slegs Ethereum mainnet tokens is beskikbaar vir limiete. ", - "limits.form.disclaimer.mainnet.short": "Slegs Mainnet-tokens is beskikbaar vir limiete.", - "limits.form.disclaimer.uniswapx": "Limiete sal dalk nie presies uitgevoer word wanneer tokens die gespesifiseerde prys bereik nie. ", - "limits.learnMore": "Kom meer te wete oor limiete", - "limits.price.input.label": "Wanneer 1 werd is", - "limits.price.label": "Beperk prys", - "limits.selectSupportedTokens": "Kies ondersteunde tokens", - "liquidity.hooks": "Haak op v4", - "liquidity.hooks.address.input": "Voer haakadres in", - "liquidity.hooks.address.tooltip": "Haakadres: {{address}}", - "liquidity.learnMoreLabel": "Kom meer te wete oor likiditeitsvoorsiening", - "liquidity.notEnough.label": "Nie genoeg likiditeit om akkurate USD-waarde te wys nie.", - "liquidity.provideOnProtocols": "Die verskaffing van likiditeit op verskillende protokolle", - "liquidityPool.page.title": "Voeg likiditeit by poele{{version}} op Uniswap", - "liquidityPool.positions.closed.title": "Geslote posisies", - "liquidityPool.positions.loadingMore": "Laai meer posisies...", - "liquidityPool.positions.page.title": "Bestuur {{quoteSymbol}}/{{baseSymbol}} poel likiditeit op Uniswap", - "liquidityPool.positions.page.version.description": "Bekyk jou aktiewe {{version}} likiditeitsposisies. Voeg nuwe posisies by.", - "liquidityPool.positions.page.version.title": "Bestuur poellikiditeit{{version}} op Uniswap", - "migrate.allowed": "Toegelaat", - "migrate.allowLpMigration": "Laat LP-tokenmigrasie toe", - "migrate.connectAccount": "Jy moet 'n rekening koppel wat hierdie posisie besit.", - "migrate.connectWallet": "Koppel aan 'n beursie om jou V2-likiditeit te sien.", - "migrate.contract": "Uniswap migrasie kontrak", - "migrate.firstLP": "Jy is die eerste likiditeitsverskaffer vir hierdie Uniswap V3-poel. Jou likiditeit sal migreer teen die huidige {{source}} prys.", - "migrate.highGasCost": "Jou transaksiekoste sal baie hoër wees aangesien dit die gas insluit om die swembad te skep.", - "migrate.invalidRange": "Ongeldige reeks gekies. Die minimum prys moet laer as die maksimum prys wees.", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} LP-tokens", - "migrate.migrating": "Migreer", - "migrate.missingV2Position": "Sien jy nie een van jou v2-posisies nie? Voer dit in.", - "migrate.noV2Liquidity": "Geen V2-likiditeit gevind nie.", - "migrate.positionNoFees": "Jou posisie sal nie fooie verdien of in ambagte gebruik word totdat die markprys in jou reeks beweeg nie.", - "migrate.priceDifference": "Prysverskil: ", - "migrate.priceWarning": "U moet slegs likiditeit in Uniswap V3 deponeer teen 'n prys wat u glo korrek is.
As die prys verkeerd lyk, kan jy óf 'n ruil maak om die prys te skuif óf wag vir iemand anders om dit te doen.", - "migrate.refund": "Ten minste {{amtA}} {{symA}} en {{amtB}} {{symB}} sal na jou beursie terugbetaal word weens geselekteerde prysklas.", - "migrate.selectFeeTier": "Kies fooivlak", - "migrate.setRange": "Stel prysklas", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Prys:", - "migrate.v2Description": "Hierdie instrument sal jou {{source}} likiditeit veilig na V3 migreer. Die proses is heeltemal vertroueloos danksy die <0>Uniswap-migrasiekontrak ↗", - "migrate.v2Instruction": "Vir elke poel wat hieronder gewys word, klik migreer om jou likiditeit uit Uniswap V2 te verwyder en dit in Uniswap V3 te deponeer.", - "migrate.v2Title": "Migreer V2-likiditeit", - "migrate.v3Price": "V3 {{sym}} Prys:", - "mint.v3.input.invalidPrice.error": "Ongeldige prysinvoer", - "mobileAppPromo.banner.getTheApp.link": "Kry die Uniswap Wallet-toepassing", - "mobileAppPromo.banner.title": "Uniswap: Crypto & NFT Wallet", - "moonpay.poweredBy": "Fiat oprit aangedryf deur MoonPay USA LLC", - "nav.createAccount.button": "Skep rekening", - "nav.logIn.button": "Meld aan", - "nav.logInOrConnect.title": "Meld aan of koppel", - "nav.products.tradingApi": "Integreer die protokol", - "nav.products.unichain": "Die DeFi-ketting", - "nav.products.uniswapX": "Die meta-aggregator", - "nav.products.wallet": "Ruil, bêre, verken", - "nav.signUp.button": "Teken in", - "nav.tabs.createPosition": "Skep posisie", - "nav.tabs.viewPositions": "Bekyk posisies", - "network.lostConnection": "Jy het dalk jou netwerkverbinding verloor.", - "network.mightBeDown": "{{network}} is dalk op die oomblik af, of jy het dalk jou netwerkverbinding verloor.", - "network.warning": "Netwerkwaarskuwing", - "nft.noPools": "Nog geen swembaddens nie", - "nft.reportSpam": "Rapporteer as strooipos", - "notFound.oops": "Oeps, neem my terug na Swap toe", - "notice.uk": "Hierdie webtoepassing word verskaf as 'n hulpmiddel vir gebruikers om op hul eie inisiatief met die Uniswap-protokol te kommunikeer, met geen onderskrywing of aanbeveling van kripto-geldeenheid-handelsaktiwiteite nie. Deur dit te doen, beveel Uniswap nie aan dat gebruikers of potensiële gebruikers betrokke raak by kriptobate-verhandelingsaktiwiteit nie, en gebruikers of potensiële gebruikers van die webtoepassing moet nie hierdie webblad of die inhoud daarvan beskou as enige vorm van aanbeveling, uitnodiging of aansporing om met kriptobates te handel nie. .", - "notice.uk.label": "VK vrywaring:", - "notification.assetVisibility.hidden": "{{assetName}} versteek", - "notification.assetVisibility.unhidden": "{{assetName}} ontsteek", - "notification.buy.network": "Koop op {{network}}", - "notification.copied.address": "Adres gekopieer", - "notification.copied.calldata": "Oproepdata is gekopieer", - "notification.copied.contractAddress": "Kontrakadres gekopieer", - "notification.copied.failed": "Kon nie na knipbord kopieer nie", - "notification.copied.image": "Prent gekopieer", - "notification.copied.linkUrl": "Skakel gekopieer", - "notification.copied.nftUrl": "NFT URL gekopieer", - "notification.copied.poolId": "Poel-ID gekopieer", - "notification.copied.tokenUrl": "Teken-URL gekopieer", - "notification.copied.transactionId": "Transaksie-ID gekopieer", - "notification.copied.unitag": "Gebruikersnaam gekopieer", - "notification.countryChange": "Het oorgeskakel na {{countryName}}", - "notification.limit.network": "Skep limietorder op {{network}}", - "notification.lp.network": "Verskaffing van likiditeit op {{network}}", - "notification.network.changed": "Het oorgeskakel na {{network}}", - "notification.passwordChanged": "Wagwoord verander", - "notification.poolFinder.network": "Soek vir swembad op {{network}}", - "notification.restore.success": "Beursie is herstel!", - "notification.sell.network": "Verkoop op {{network}}", - "notification.send.network": "Stuur tans op {{network}}", - "notification.smartWallet.disabled": "Gedeaktiveer op 1 netwerk", - "notification.smartWallet.disabled.all": "Slim beursie gedeaktiveer", - "notification.smartWallet.disabled.plural": "Gedeaktiveer op {{amount}} netwerke", - "notification.spam.NFT.failed": "Kon nie NFT rapporteer nie. Probeer later weer.", - "notification.spam.NFT.successful": "Gerapporteer", - "notification.swap.network": "Wissel op {{network}}", - "notification.swap.pending.swap": "Ruil hangende", - "notification.swap.pending.unwrap": "Ontwikkel hangende", - "notification.swap.pending.wrap": "Wikkel hangende", - "notification.transaction.approve.canceled": "Gekanselleer {{currencySymbol}} keur goed.", - "notification.transaction.approve.fail": "Kon nie {{currencySymbol}} goedkeur vir gebruik met {{address}}nie.", - "notification.transaction.approve.success": "Goedgekeur {{currencySymbol}} vir gebruik met {{address}}.", - "notification.transaction.pending": "Transaksie hangende", - "notification.transaction.swap.canceled": "Gekanselleer {{inputCurrencySymbol}}-{{outputCurrencySymbol}} ruil.", - "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} vir {{outputCurrencyAmountWithSymbol}} ruil het verval.", - "notification.transaction.swap.fail": "Kon nie {{inputCurrencyAmountWithSymbol}} vir {{outputCurrencyAmountWithSymbol}}omruil nie.", - "notification.transaction.swap.success": "Verruil {{inputCurrencyAmountWithSymbol}} vir {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.transfer.canceled": "Gekanselleer {{tokenNameOrAddress}} stuur", - "notification.transaction.transfer.fail": "Kon nie {{tokenNameOrAddress}} na {{walletNameOrAddress}}stuur nie", - "notification.transaction.transfer.received": "Ontvang {{tokenNameOrAddress}} van {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "Gestuur {{tokenNameOrAddress}} na {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "Kon nie transaksies met {{addressOrEnsName}}doen nie", - "notification.transaction.unknown.fail.short": "Transaksie het misluk", - "notification.transaction.unknown.success.full": "Handel met {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "Transaksie is bevestig", - "notification.transaction.unwrap.canceled": "Gekanselleer {{inputCurrencySymbol}} ontvou.", - "notification.transaction.unwrap.fail": "Kon nie {{inputCurrencyAmountWithSymbol}}ontvou nie.", - "notification.transaction.unwrap.success": "{{inputCurrencyAmountWithSymbol}} uitgepak en {{outputCurrencyAmountWithSymbol}}ontvang.", - "notification.transaction.wrap.canceled": "Gekanselleerde {{inputCurrencySymbol}} wrap.", - "notification.transaction.wrap.fail": "Kon nie {{inputCurrencyAmountWithSymbol}}toedraai nie.", - "notification.transaction.wrap.success": "{{inputCurrencyAmountWithSymbol}} toegedraai en {{outputCurrencyAmountWithSymbol}}ontvang.", - "notification.transfer.pending": "Stuur hangende", - "notification.walletConnect.confirmed": "Transaksie bevestig met {{dappName}}", - "notification.walletConnect.connected": "Gekoppel", - "notification.walletConnect.disconnected": "Ontkoppel", - "notification.walletConnect.failed": "Transaksie het misluk met {{dappName}}", - "notification.walletConnect.networkChanged.full": "Het oorgeskakel na {{networkName}}", - "notification.walletConnect.networkChanged.short": "Veranderde netwerke", - "notifications.scantastic.subtitle": "Gaan voort op Uniswap-uitbreiding", - "notifications.scantastic.title": "Sukses!", - "onboarding.backup.manual.banner": "Ons stel voor dat u dit op 'n stuk papier skryf en dit op 'n veilige plek bêre, soos 'n kluis.", - "onboarding.backup.manual.displayWarning.description": "Lees die volgende aandagtig deur voordat u verder gaan.", - "onboarding.backup.manual.displayWarning.note.access": "Hierdie herstelfrase gee jou volle toegang tot jou beursie en fondse", - "onboarding.backup.manual.displayWarning.note.secure": "Bekyk dit privaat en deel dit met niemand nie", - "onboarding.backup.manual.displayWarning.note.storage": "Skryf dit neer en hou dit op 'n veilige plek", - "onboarding.backup.manual.displayWarning.title": "'n Paar belangrike dinge om te weet", - "onboarding.backup.manual.error": "Ongeldige of verkeerd gespelde woord", - "onboarding.backup.manual.placeholder": "Geheime woord", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} voltooi", - "onboarding.backup.manual.selectedWordPlaceholder": "Kies woord", - "onboarding.backup.manual.subtitle_one": "Wat is die {{count}}eerste woord in jou herstelfrase?", - "onboarding.backup.manual.subtitle_two": "Wat is die {{count}}tweede woord in jou herstelfrase?", - "onboarding.backup.manual.subtitle_few": "Wat is die {{count}}ste woord in jou herstelfrase?", - "onboarding.backup.manual.subtitle_other": "Wat is die {{count}}de woord in jou herstelfrase?", - "onboarding.backup.manual.title": "Kom ons maak seker dat jy dit korrek aangeteken het", - "onboarding.backup.option.badge.quick": "Vinnig", - "onboarding.backup.option.cloud.description": "Rugsteun jou beursie via {{cloudProviderName}}, beskerm deur 'n herstelwagwoord.", - "onboarding.backup.option.cloud.title": "Stel 'n herstelwagwoord in", - "onboarding.backup.option.manual.description": "Teken jou 12 geheime woorde op 'n stuk papier op en bêre dit op 'n veilige plek.", - "onboarding.backup.option.manual.title": "Skryf herstelfrase neer", - "onboarding.backup.reminder.backupNowButton": "Rugsteun nou", - "onboarding.backup.reminder.remindMeLaterButton": "Herinner my later", - "onboarding.backup.reminder.title": "Rugsteun jou beursie", - "onboarding.backup.reminder.warning.description": "Rugsteun jou beursie sodat jy jou bates kan herwin as jy ooit jou foon verloor of 'n nuwe een kry.", - "onboarding.backup.reminder.warning.fundsLabel": "Fondse in gevaar", - "onboarding.backup.reminder.warning.title": "Jy kan jou fondse verloor", - "onboarding.backup.speedBump.cloud.description": "As jy dit ooit vergeet, kan ons dit nie vir jou terugstel nie. Skryf dit op 'n veilige plek neer of stoor dit veilig in 'n wagwoordbestuurder.", - "onboarding.backup.speedBump.cloud.disclaimer": "Ek verstaan dat Uniswap Labs nie my herstelwagwoord kan terugstel nie.", - "onboarding.backup.speedBump.cloud.title": "Dit is belangrik om hierdie wagwoord te stoor", - "onboarding.backup.speedBump.manual.description": "Maak seker dat jy jou herstelfrase korrek neergeskryf het en 'n veilige plek het om dit te stoor.", - "onboarding.backup.speedBump.manual.disclaimer": "Ek verstaan dat Uniswap Labs nie my beursie kan herwin as ek dit verloor nie.", - "onboarding.backup.speedBump.manual.title": "Voor jy klaar is...", - "onboarding.backup.subtitle": "Dit is hoe jy jou beursie sal herstel as jy die toepassing uitvee of jou toestel verloor.", - "onboarding.backup.title.existing": "Rugsteun jou beursie", - "onboarding.backup.title.new": "Kies jou rugsteunmetode", - "onboarding.backup.view.subtitle.message1": "Lees die volgende aandagtig deur voordat u verder gaan", - "onboarding.backup.view.subtitle.message2": "Jy sal al 12 hierdie geheime woorde moet invoer om jou beursie te herwin.", - "onboarding.backup.view.title": "Skryf jou herstelfrase neer", - "onboarding.backup.view.warning.message1": "Hierdie herstelfrase gee jou volle toegang tot jou beursie en fondse", - "onboarding.backup.view.warning.message2": "Skryf dit neer en hou dit op 'n veilige plek", - "onboarding.backup.view.warning.message3": "Bekyk dit privaat en deel dit met niemand nie", - "onboarding.cloud.confirm.description": "Jy sal dit moet invoer om jou fondse te verhaal. As jy dit ooit vergeet, kan ons dit nie vir jou terugkry nie.", - "onboarding.cloud.confirm.title": "Bevestig jou herstelwagwoord", - "onboarding.cloud.createPassword.description": "Jy sal dit moet invoer om jou fondse te verhaal. As jy dit ooit vergeet, kan ons dit nie vir jou terugkry nie.", - "onboarding.cloud.createPassword.title": "Skep jou herstelwagwoord", - "onboarding.complete.button": "Maak Uniswap-uitbreiding oop", - "onboarding.complete.description": "Jou beursie is gereed om kripto te stuur en te ontvang. Maak Uniswap-uitbreiding oop met die kortpad hieronder.", - "onboarding.complete.go_to_uniswap": "Gaan na Uniswap Web App", - "onboarding.complete.pin.description": "Klik op die pen-ikoon om Uniswap-uitbreiding by jou nutsbalk te voeg.", - "onboarding.complete.pin.title": "Pin Uniswap-uitbreiding", - "onboarding.complete.title": "Jy is gereed", - "onboarding.extension.biometrics.subtitle.fingerprint": "Kry vinnig en veilig toegang tot jou beursie met net jou vingerafdruk.", - "onboarding.extension.biometrics.title": "Aktiveer {{biometricsMethod}}", - "onboarding.extension.password.subtitle": "Jy sal dit nodig hê om jou beursie te ontsluit en toegang tot jou herstelfrase te kry", - "onboarding.extension.password.title.default": "Skep wagwoord", - "onboarding.extension.password.title.reset": "Herstel jou wagwoord", - "onboarding.extension.unsupported.android.description": "Uniswap-uitbreiding is slegs versoenbaar met Chrome op die rekenaar.", - "onboarding.extension.unsupported.android.title": "Chrome op selfoon word (nog) nie ondersteun nie", - "onboarding.extension.unsupported.description": "Uniswap-uitbreiding is tans net versoenbaar met Chrome.", - "onboarding.extension.unsupported.title": "Hierdie blaaier word (nog) nie ondersteun nie", - "onboarding.home.intro.backup.description.extension": "Stoor jou herstelfrase om te verseker dat jy nooit toegang tot jou beursie verloor nie.", - "onboarding.home.intro.backup.description.mobile": "Stel 'n herstelplan op as jy ooit jou foon verloor of 'n nuwe een kry.", - "onboarding.home.intro.backup.title": "Rugsteun jou beursie", - "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK, en JUP — nou beskikbaar op Unichain", - "onboarding.home.intro.bridgedAssets.title": "Ruil nuwe tokens op Unichain", - "onboarding.home.intro.fund.description": "Befonds jou beursie deur kripto te koop of oor te dra vanaf 'n ander rekening.", - "onboarding.home.intro.fund.title": "Kry jou eerste teken", - "onboarding.home.intro.label.required": "Vereis", - "onboarding.home.intro.label.swipe": "Swiep", - "onboarding.home.intro.pushNotifications.description": "Kry pryswaarskuwings oor jou gunsteling tokens, markneigings en meer.", - "onboarding.home.intro.pushNotifications.title": "Bly op hoogte", - "onboarding.home.intro.unitag.description": "Bou 'n persoonlike web3-profiel en deel maklik jou adres met vriende.", - "onboarding.home.intro.unitag.title": "Eis jou {{unitagDomain}} gebruikersnaam op", - "onboarding.import.error.invalidWords_one": "1 woord is ongeldig of verkeerd gespel", - "onboarding.import.error.invalidWords_other": "{{count}} woorde is ongeldig of verkeerd gespel", - "onboarding.import.method.restore.message.android": "Voeg beursies wat jy gerugsteun het by jou Google Drive-rekening.", - "onboarding.import.method.restore.message.ios": "Voeg beursies wat jy gerugsteun het by jou iCloud-rekening.", - "onboarding.import.method.restore.title": "Herstel 'n beursie", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.android": "Voer jou herstelwagwoord in om jou beursie via Google Drive-rugsteun te herstel.", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.ios": "Voer jou herstelwagwoord in om jou beursie via iCloud-rugsteun te herstel.", - "onboarding.import.method.restoreSeedPhrase.cloud.title.android": "Herstel vanaf Google Drive", - "onboarding.import.method.restoreSeedPhrase.cloud.title.ios": "Herstel vanaf iCloud", - "onboarding.import.method.restoreSeedPhrase.title": "Kies hoe om jou beursie te herstel", - "onboarding.import.method.restoreSeedPhrase.wallet.desc": "Voer jou 12 geheime woorde in wat jy voorheen op 'n veilige plek gestoor het.", - "onboarding.import.method.restoreSeedPhrase.wallet.title": "Voer herstelfrase in", - "onboarding.import.method.viewPrivateKeys.button.desc": "Bekyk jou privaat sleutel", - "onboarding.import.method.viewPrivateKeys.title": "Het jy nie enige van die bogenoemde nie? ", - "onboarding.import.onDeviceRecovery.other_options": "Skep of voer 'n ander beursie in", - "onboarding.import.onDeviceRecovery.other_options.label": "Wil jy nie enige van die bogenoemde hê nie?", - "onboarding.import.onDeviceRecovery.subtitle": "Kies by watter beursie jy weer wil aanmeld.", - "onboarding.import.onDeviceRecovery.title": "Welkom terug by Uniswap", - "onboarding.import.onDeviceRecovery.wallet.button": "Bekyk herstelfrase", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 ander beursie", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} ander beursies", - "onboarding.import.onDeviceRecovery.warning.caption": "Maak asseblief seker dat jy al die ander beursies gerugsteun het. As jy dit ooit wil herstel, sal jy hul herstelfrases of ooreenstemmende {{cloudProvider}} rugsteun nodig hê.", - "onboarding.import.onDeviceRecovery.warning.title": "Is jy seker?", - "onboarding.import.selectMethod.errorMessage": "'n Onverwagte fout het voorgekom. Probeer asseblief weer.", - "onboarding.import.selectMethod.mobileApp.subtitle": "Voer 'n beursie vanaf die mobiele toepassing in via QR-kode.", - "onboarding.import.selectMethod.mobileApp.title": "Gebruik Uniswap Mobile", - "onboarding.import.selectMethod.passkey.subtitle": "Sinkroniseer jou Uniswap-beursie met 'n bestaande wagwoordsleutel.", - "onboarding.import.selectMethod.passkey.title": "Teken aan met wagwoord", - "onboarding.import.selectMethod.recoveryPhrase.subtitle": "Voer in vanaf 'n ander kripto-beursie.", - "onboarding.import.selectMethod.recoveryPhrase.title": "Voer herstelfrase in", - "onboarding.import.selectMethod.title": "Meld aan of voer 'n beursie in", - "onboarding.import.title": "Kies hoe jy jou beursie wil byvoeg", - "onboarding.importMnemonic.button.default": "My herstelfrase is 12 woorde", - "onboarding.importMnemonic.button.importing": "Voer tans in …", - "onboarding.importMnemonic.button.longPhrase": "My herstelfrase is langer", - "onboarding.importMnemonic.error.invalidPhrase": "Die frase wat jy ingevoer het, is ongeldig", - "onboarding.importMnemonic.subtitle": "Tik of plak jou 12-woord-herstelfrase", - "onboarding.importMnemonic.title": "Voer jou herstelfrase in", - "onboarding.importPasskey.bringWindowToFront": "Bring venster na voor", - "onboarding.importPasskey.continueInSecureWindow": "Gaan voort in die veilige aanmeldvenster.", - "onboarding.intro.button.alreadyHave": "Ek het reeds 'n beursie", - "onboarding.intro.button.logInOrImport": "Meld aan of invoer", - "onboarding.intro.mobileScan.button": "Skandeer QR-kode om in te voer", - "onboarding.intro.mobileScan.title": "Het u die Uniswap-toepassing?", - "onboarding.landing.button.add": "Voeg 'n bestaande beursie by", - "onboarding.landing.button.create": "Skep 'n beursie", - "onboarding.landing.button.createAccount": "Skep 'n rekening", - "onboarding.name.choose": "Kies 'n gebruikernaam", - "onboarding.name.choose.subtitle": "Dit is 'n publieke naam wat enigiemand kan gebruik om vir jou kripto te stuur.", - "onboarding.notification.permission.message": "Om kennisgewings te ontvang, skakel kennisgewings vir Uniswap Wallet aan in jou toestel se instellings.", - "onboarding.notification.permission.title": "Kennisgewingstoestemming", - "onboarding.notification.subtitle": "Bly op hoogte van transaksiestatusse en groot prysveranderings vir gunsteling tokens.", - "onboarding.notification.title": "Skakel kennisgewings aan", - "onboarding.passkey.create": "Skep jou wagwoordsleutel", - "onboarding.passkey.loading.subtitle": "Dit behoort net 'n sekonde te neem.", - "onboarding.passkey.loading.title": "Soek tans jou beursie...", - "onboarding.passkey.secure": "Beveilig jou rekening", - "onboarding.passkey.secure.description": "Wagsleutels laat jou toe om vinnig en veilig toegang tot jou rekening te kry deur net jou gesig of vingerafdruk te gebruik.", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "Kom ons bevestig dat jy dit reg het. As jy dit verloor of dit verkeerd neerskryf, sal jy nie jou fondse kan verhaal nie.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "As jy dit verloor of dit verkeerd neerskryf, sal jy nie jou fondse kan verhaal nie.", - "onboarding.recoveryPhrase.confirm.title": "Kom ons bevestig dat jy dit reg het", - "onboarding.recoveryPhrase.view.subtitle": "Jy sal al 12 hierdie geheime woorde moet invoer om jou beursie te herwin.", - "onboarding.recoveryPhrase.view.title": "Skryf jou herstelfrase neer", - "onboarding.recoveryPhrase.view.title.hasPassword": "As jy ooit jou wagwoord vergeet...", - "onboarding.recoveryPhrase.warning.final.button": "ek is gereed", - "onboarding.recoveryPhrase.warning.final.message": "Jou herstelfrase is wat jou (en enigiemand wat dit het) toegang tot jou fondse gee. Maak seker dat jy dit vir jouself hou.", - "onboarding.recoveryPhrase.warning.final.title": "Doen hierdie stap in 'n privaat plek", - "onboarding.recoveryPhrase.warning.screenshot.message": "Enigiemand wat toegang tot jou foto's kry, kan toegang tot jou beursie kry. Ons beveel aan dat jy eerder jou woorde neerskryf.", - "onboarding.recoveryPhrase.warning.screenshot.title": "Skermkiekies is nie veilig nie", - "onboarding.resetPassword.complete.safety": "Kom meer te wete oor beursie-veiligheid", - "onboarding.resetPassword.complete.subtitle": "Gebruik jou nuwe wagwoord om jou beursie te ontsluit.", - "onboarding.resetPassword.complete.title": "Wagwoord herstel", - "onboarding.scan.error": "Kon nie die QR-kode laai nie", - "onboarding.scan.otp.error": "Die kode wat jy ingedien het, is verkeerd, of daar was 'n fout met die indiening. Probeer asseblief weer.", - "onboarding.scan.otp.failed": "Mislukte pogings: {{number}}", - "onboarding.scan.otp.subtitle": "Gaan jou Uniswap-selfoontoepassing na vir die 6-karakter-kode", - "onboarding.scan.otp.title": "Voer eenmalige kode in", - "onboarding.scan.subtitle": "Skandeer die QR-kode met die Uniswap-selfoontoepassing om jou beursie te begin invoer.", - "onboarding.scan.title": "Voer beursie vanaf die toepassing in", - "onboarding.scan.troubleScanning.message": "Voer in via herstelfrase", - "onboarding.scan.troubleScanning.title": "Sukkel om te skandeer?", - "onboarding.scan.wifi": "Koppel jou foon aan dieselfde WiFi-netwerk as jou rekenaar.", - "onboarding.security.alert.biometrics.message.android": "Om biometrie te gebruik, stel dit eers in instellings op", - "onboarding.security.alert.biometrics.message.ios": "Om {{biometricsMethod}}te gebruik, laat toegang in stelselinstellings toe", - "onboarding.security.alert.biometrics.title.android": "Biometrie is gedeaktiveer", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} is gedeaktiveer", - "onboarding.security.button.confirm.android": "Aktiveer biometrie", - "onboarding.security.button.confirm.ios": "Aktiveer {{biometricsMethod}}", - "onboarding.security.button.setup": "Stel op", - "onboarding.security.subtitle.android": "Voeg 'n ekstra laag sekuriteit by deur biometrie te vereis om transaksies te stuur.", - "onboarding.security.subtitle.ios": "Voeg 'n ekstra laag sekuriteit by deur {{biometricsMethod}} te vereis om transaksies te stuur.", - "onboarding.security.title": "Beskerm jou beursie", - "onboarding.selectWallets.error": "Kon nie adresse laai nie", - "onboarding.selectWallets.title.default": "Kies beursies om in te voer", - "onboarding.selectWallets.title.error": "Kon nie beursies invoer nie", - "onboarding.termsOfService": "Deur voort te gaan, stem ek in tot die Diensbepalings en stem in tot die Privaatheidsbeleid", - "onboarding.tooltip.recoveryPhrase.trigger": "Wat is 'n herstelfrase?", - "onboarding.wallet.continue": "Kom ons hou dit veilig", - "onboarding.wallet.defaultName": "Beursie {{number}}", - "onboarding.wallet.description.full": "Dit is jou persoonlike ruimte vir tokens, NFT's en al jou ambagte. Voltooi die opstel daarvan om jou fondse veilig te hou.", - "onboarding.wallet.title": "Welkom by jou nuwe beursie", - "onboarding.welcome.subtitle": "Kom ons maak klaar met die opstel van jou beursie.", - "onboarding.welcome.title": "Welkom!", - "outageBanner.message": "{{chainName}}{{versionDescription}} data is tans nie beskikbaar nie, maar ons verwag dat die probleem binnekort opgelos sal word.", - "outageBanner.message.sub": "Jy kan steeds sonder probleme omruil en likiditeit op hierdie ketting verskaf.", - "outageBanner.title": "{{versionName}} sal binnekort terug wees", - "passkeys.help.modal.subtitle": "As jy probleme ondervind met wagwoordsleutels, besoek Uniswap-ondersteuning vir hulp.", - "passkeys.help.modal.subtitle.invalidPasskey": "Jou versoek kon nie voltooi word nie. Probeer asseblief weer deur 'n wagwoordsleutel te gebruik wat geassosieer word met ", - "passkeys.help.modal.subtitle.technicalError": "Jou versoek kon nie voltooi word nie weens 'n onverwagte tegniese fout. Jou fondse is veilig. Probeer asseblief weer.", - "passkeys.help.modal.title": "Het jy hulp nodig?", - "passkeys.help.modal.title.invalidPasskey": "Ongeldige wagwoordsleutel", - "passkeys.help.modal.title.technicalError": "Tegniese fout", - "passkeys.manage.modal.subtitle": "Om wagwoorde by te voeg of te verwyder, meld asseblief aan by {{passkeyManagementUrl}}.", - "passkeys.manage.modal.title": "Bestuur wagwoorde", - "permit.approval.fail": "Toestemmingsgoedkeuring het misluk", - "permit.approval.fail.message": "Permit2 laat tokengoedkeurings toe om oor verskillende toepassings gedeel en bestuur te word.", - "pool.activeRange": "Aktiewe bosluisreeks", - "pool.addAs": "Voeg by as {{nativeWrappedSymbol}}", - "pool.apr": "APR", - "pool.apr.base": "Basis APR", - "pool.apr.description": "Gejaarliks gebaseer op 1 dag fooie", - "pool.apr.reward": "Beloning APR", - "pool.aprText": "Swembad APR", - "pool.balances": "Poolsaldo's", - "pool.closedCTA.description": "Jy kan hulle sien deur die filter bo-aan die bladsy te gebruik.", - "pool.closedCTA.title": "Op soek na jou geslote posisies?", - "pool.collectAs": "Versamel as {{nativeWrappedSymbol}}", - "pool.collectFees": "Versamel fooie", - "pool.connectEthereumToView": "Koppel 'n Ethereum-beursie om jou poele te sien", - "pool.create": "Skep nuwe swembad", - "pool.create.info": "Jou keuses sal 'n nuwe likiditeitspoel skep wat kan lei tot laer aanvanklike likiditeit en verhoogde wisselvalligheid. Oorweeg dit om by 'n bestaande swembad by te voeg om hierdie risiko's te verminder.", - "pool.createdPosition": "Geskep posisie", - "pool.createdPosition.canceled": "Skepping van posisie gekanselleer", - "pool.createdPosition.failed": "Kon nie posisie skep nie", - "pool.dynamic": "Dinamiese swembad", - "pool.earnings": "Verdienste", - "pool.earnings.empty": "Jy het nog geen verdienste nie", - "pool.explorers": "Verkenners", - "pool.import": "Invoer swembad", - "pool.import.link.description": "Sommige v2-posisies word nie outomaties vertoon nie.", - "pool.import.positions.v2": "Voer V2-posisies in", - "pool.import.positions.v2.selectPair.description": "Sommige v2-posisies word nie outomaties vertoon nie. Kies 'n tekenpaar om jou posisies in te voer en te bekyk.", - "pool.import.success": "Swembad ingevoer", - "pool.incentives.administeredRewards": "Belonings word versprei deur die outonome Merkl-verspreiderkontrak.", - "pool.incentives.collect": "Versamel", - "pool.incentives.collectedRewards": "Belonings ingesamel", - "pool.incentives.collectFailed": "Insameling het misluk, probeer asseblief weer.", - "pool.incentives.collectFailedNoRetry": "Kon nie belonings insamel nie.", - "pool.incentives.collectingRewards": "Versamel belonings", - "pool.incentives.collectRewards": "Versamel belonings", - "pool.incentives.collectRewardsCanceled": "Versamel belonings gekanselleer", - "pool.incentives.daysLeft": "dae oor", - "pool.incentives.eligible": "Kwalifiserende poele het tekenbelonings sodat jy meer kan verdien", - "pool.incentives.merklDocs": "Bereken deur Merkl uit emissiebelonings en poel TVL.", - "pool.incentives.rewardsDistribution": "Beloningsverspreiding", - "pool.incentives.rewardsEarned": "Belonings verdien", - "pool.incentives.similarPoolHasRewards": "'n Soortgelyke swembad het UNI-belonings", - "pool.incentives.switchPools": "Verander swembaddens", - "pool.incentives.timePeriod": "Tydsperiode", - "pool.incentives.uni.findMore": "Soek swembaddens met UNI-belonings", - "pool.incentives.yourRewards.error": "Jou belonings is tans nie beskikbaar nie", - "pool.incentives.yourRewards.error.description": "Belonings kon nie herwin word nie. Dit kan as gevolg van 'n netwerkprobleem wees. Probeer om die bladsy te herlaai.", - "pool.info": "Swembad inligting", - "pool.limitFluctuation.warning": "Neem asseblief kennis dat die uitvoering vir limiete kan wissel op grond van intydse markskommelings en Ethereum-netwerkopeenhoping. Limiete sal dalk nie presies uitgevoer word wanneer tokens die gespesifiseerde prys bereik nie.", - "pool.liquidity.data.error.message": "Kon nie data gaan haal wat vir jou transaksie vereis word nie.", - "pool.liquidity.outOfSync": "Pool en markprys wanverhouding", - "pool.liquidity.outOfSync.message": "Die pryse in hierdie poel verskil met die markpryse van die geselekteerde tokens. Pas jou prysklas dienooreenkomstig aan of wag vir die swembad om te herbalanseer om verliese te vermy.", - "pool.maxPrice": "Maksimum prys", - "pool.migrateLiquidity": "Migreer likiditeit", - "pool.migrateLiquidityDisabledTooltip": "Hierdie ketting ondersteun nie v4-likiditeitpoele nie.", - "pool.migrateToV4": "Migreer na v4", - "pool.minPrice": "Min prys", - "pool.newPosition.plus": "+ Nuwe posisie", - "pool.newPosition.title": "Nuwe posisie", - "pool.newSpecificPosition": "Nuwe {{symbol}} posisie", - "pool.notAvailableOnSolana": "Swembaddens is nie op Solana beskikbaar nie", - "pool.notFound.description": "Jammer, ons kan geen inligting vir hierdie swembad kry nie. Gaan die naam en adres na en probeer weer.", - "pool.notFound.title": "Swembad nie gevind nie", - "pool.openToStart.evmAndSolanaConnected": "Maak 'n nuwe posisie oop of skep 'n poel om te begin. Poele is nie op Solana beskikbaar nie.", - "pool.openToStart.evmOnly": "Maak 'n nuwe posisie oop of skep 'n swembad om te begin.", - "pool.percent": "{{pct}}% poel", - "pool.pooled": "Saamgevoeg {{sym}}:", - "pool.position": "Posisie", - "pool.positions": "Posisies", - "pool.positions.title": "Jou posisies", - "pool.positions.transaction.settings": "Transaksie-instellings", - "pool.positions.usdValueUnavailable": "USD-waarde nie beskikbaar nie", - "pool.positions.usdValueUnavailable.tooltip": "USD-waarde is tans nie beskikbaar vir hierdie posisie nie. Sien posisiebesonderhede vir gedeponeerde tokenbedrae.", - "pool.refresh.prices": "Herlaai pryse", - "pool.removeLiquidity": "Verwyder likiditeit", - "pool.rewardAPR": "Beloning APR (UNI)", - "pool.rewardAPR.percent": "{{pct}} beloning APR", - "pool.rewards": "Belonings", - "pool.rewardsPool.label": "Poeltekens in beloningspoel:", - "pool.selectPair": "Kies paar", - "pool.share.label": "Jou swembaddeel:", - "pool.specificPosition": "{{symbol}} posisie", - "pool.tokenPair": "Tokenpaar", - "pool.top.rewards": "Swembaddens met belonings", - "pool.top.tvl": "Top swembaddens deur TVL", - "pool.top.volume": "Poelpoele volgens 24H-volume", - "pool.totalAPR": "Totale APR", - "pool.totalTokens": "Jou totale swembadtokens:", - "pool.v2": "v2 swembaddens", - "pool.v3": "v3 swembaddens", - "pool.via": "{{tokenPair}} deur {{dex}}", - "pool.volOverTvl": "1D vol/TVL", - "pool.volume.thirtyDay": "30 dae volume", - "pool.volume.thirtyDay.short": "30D vol", - "pool.withdrawAs": "Onttrek as {{nativeWrappedSymbol}}", - "poolFinder.availablePools": "Beskikbare swembaddens", - "poolFinder.availablePools.found.description": "v2 poele wat ooreenstem met jou paar seleksie.", - "poolFinder.availablePools.notFound.description": "Geen bypassende v2-poele gevind nie. Gaan jou tokenkeuse dubbel na en maak seker dat jy aan die regte beursie gekoppel is.", - "pools.explore": "Verken swembaddens", - "portfolio.activity.filters.timePeriod.all": "Van alle tye", - "portfolio.activity.filters.transactionType.all": "Alle tipes", - "portfolio.activity.filters.transactionType.deposits": "Deposito's", - "portfolio.activity.filters.transactionType.staking": "Staking", - "portfolio.activity.filters.transactionType.swaps": "Ruiltransaksies", - "portfolio.activity.title": "Aktiwiteit", - "portfolio.connectWallet.summary": "Spoor tokens, poele en meer oor {{amount}}+ netwerke op", - "portfolio.defi.title": "DeFi", - "portfolio.description": "Volg jou kripto-portefeulje oor alle kettings en protokolle", - "portfolio.nfts.title": "NFT's", - "portfolio.overview.title": "Oorsig", - "portfolio.title": "Portefeulje", - "portfolio.tokens.table.column.allocation": "Toewysing", - "portfolio.tokens.table.column.balance": "Balans", - "portfolio.tokens.table.column.change1d": "1D Verandering", - "portfolio.tokens.table.column.price": "Prys", - "portfolio.tokens.table.column.token": "Teken", - "portfolio.tokens.table.column.value": "Waarde", - "portfolio.tokens.title": "Tekens", - "position.addHook": "Voeg 'n haak by", - "position.addHook.tooltip": "Hakies is 'n gevorderde kenmerk wat poele in staat stel om met slim kontrakte te kommunikeer, wat verskeie vermoëns ontsluit. Wees versigtig wanneer jy hake byvoeg, aangesien sommige kwaadwillig kan wees of onbedoelde gevolge kan veroorsaak.", - "position.addingHook": "Haak byvoeg", - "position.addingHook.disclaimer": "Die byvoeging van hake kan onbedoelde gevolge hê. Doen jou navorsing en gaan voort op eie risiko.", - "position.addingHook.hideProperties": "Versteek eiendomme", - "position.addingHook.invalidAddress": "Voer 'n geldige haakadres in", - "position.addingHook.viewProperties": "Bekyk eiendomme", - "position.create.confirm": "Bevestig posisie", - "position.create.invalidPrice": "Ongeldige prys", - "position.create.invalidRange": "Ongeldige reeks", - "position.create.modal.header": "Skep posisie", - "position.create.unsupportedSolana": "Solana-swembaddens word nie ondersteun nie.", - "position.create.unsupportedSolana.description": "Om 'n poel te skep, skakel oor na 'n ondersteunde EVM-ketting.", - "position.create.unsupportedToken.description": "Probeer om met 'n ander protokolweergawe te skep.", - "position.create.v2unsupportedChain": "Hierdie ketting word nie ondersteun vir v2-poele nie.", - "position.currentValue": "Huidige posisie waarde", - "position.default_price_strategies": "Prysstrategieë", - "position.default_price_strategies.error": "Kan nie prysstrategie stel nie", - "position.deposit.confirm.create.description.less": "Die aanvanklike prys wat ingevoer is, is {{value}}% minder as die markprys en kan 'n verlies aan fondse tot gevolg hê. Wil jy voortgaan?", - "position.deposit.confirm.create.description.more": "Die aanvanklike prys wat ingevoer is, is {{value}}% meer as die markprys en kan 'n verlies aan fondse tot gevolg hê. Wil jy voortgaan?", - "position.deposit.confirm.create.title": "Groot prysverskil met mark", - "position.deposit.description": "Spesifiseer die tekenbedrae vir jou likiditeitsbydrae.", - "position.depositedCurrency": "Gedeponeer {{currencySymbol}}", - "position.fot.warning": "{{token}} en ander \"Fooi by oordrag\"-tokens word slegs deur Uniswap v2 ondersteun.", - "position.fot.warning.cta": "Skep 'n v2 posisie", - "position.hook.disclaimer": "Ek verstaan die potensiële risiko's verbonde aan die byvoeging van hierdie haak.", - "position.hook.donateWarning": "Hierdie vlag kan lei tot veranderinge aan fooie wat verdien word.", - "position.hook.liquidityWarning": "Hierdie vlag kan veroorsaak dat die swembad die toevoeging van nuwe likiditeit blokkeer. Jou transaksie kan dalk terugdraai.", - "position.hook.removeWarning": "Kan veroorsaak dat u fondse gesluit word of u verhoed om fooie in te vorder.", - "position.hook.swapWarning": "Hierdie vlag kan likiditeitsverskaffers in staat stel om Just-In-Time-likiditeit makliker te benut, wat kan lei tot laer fooie wat verdien word.", - "position.hook.warningHeader": "Belangrik: haakrisiko's geïdentifiseer", - "position.hook.warningInfo": "Ons het potensiële risiko's met hierdie haak geïdentifiseer. Maak asseblief seker dat jy verstaan hoe hierdie haak werk voordat jy besluit om voort te gaan.", - "position.increase.fot": "Die byvoeging van likiditeit vir {{token}} en ander \"Fooi op Oordrag\"-tokens word nie ondersteun nie.", - "position.initialPrice": "Aanvanklike prys", - "position.initialPrice.difference.negative": "{{ value }}% minder as markprys", - "position.initialPrice.difference.positive": "{{ value }}% meer as markprys", - "position.initialPrice.info": "Wanneer jy 'n nuwe poel skep, moet jy die beginwisselkoers vir beide tokens stel. Hierdie koers sal die aanvanklike markprys weerspieël.", - "position.initialPrice.set": "Stel aanvanklike prys", - "position.initialPrice.useMarketPrice": "Gebruik markprys", - "position.migrate.liquidity": "Wanneer jy posisies migreer, kan jy nie jou tokenpaar verander nie, maar jy kan 'n haak byvoeg om funksionaliteit te verbeter.", - "position.migrate.v4unsupportedChain": "Hierdie ketting word nie vir v4-poele ondersteun nie.", - "position.new": "Nuwe posisie", - "position.new.protocol": "Nuwe {{protocol}} posisie", - "position.notFound": "Posisie nie gevind nie", - "position.notFound.description": "Besonderhede oor hierdie pos is nie beskikbaar nie. Maak asseblief seker dat jy met die regte beursie gekoppel is.", - "position.one_sided_lower": "Eensydige onderkant", - "position.one_sided_lower.description": "Verskaf likiditeit indien die prys daal", - "position.one_sided_upper": "Eensydige boonste gedeelte", - "position.one_sided_upper.description": "Verskaf likiditeit indien prys styg", - "position.protocol": "{{protocol}} posisie", - "position.provide.liquidity": "Kies die tokens waarvoor jy likiditeit wil verskaf. U kan tekens op alle ondersteunde netwerke kies.", - "position.provide.liquidityDescription": "Die verskaffing van volle reeks likiditeit verseker deurlopende markdeelname oor alle moontlike pryse, wat eenvoud bied, maar met potensiaal vir groter permanente verlies.", - "position.provide.liquidityDescription.creatingPool": "Deur 'n volledige reeks likiditeit te stel wanneer 'n poel geskep word, verseker deurlopende markdeelname oor alle moontlike pryse, wat eenvoud bied, maar met potensiaal vir groter permanente verlies.", - "position.provide.liquidityDescription.custom": "Pasgemaakte reeks laat jou toe om jou likiditeit binne spesifieke prysgrense te konsentreer, wat kapitaaldoeltreffendheid en fooi-verdienste verbeter, maar meer aktiewe bestuur vereis.", - "position.provide.outOfRange.closePosition": "Sluit posisie", - "position.provide.outOfRange.description": "Hierdie posisie se reeks kan nie tydens migrasie aangepas word nie. Om 'n nuwe reeks te stel, maak hierdie posisie toe en maak 'n nuwe v4-posisie oop.", - "position.provide.outOfRange.title": "Jy migreer tans 'n posisie buite bereik", - "position.removeHook": "Verwyder die haak", - "position.resetDescription": "Jou tokens, prys en reekskeuses sal teruggestel word.", - "position.setRange": "Stel prysklas", - "position.setRange.inputsBelow": "Gebruik die insette hieronder om jou reeks te stel.", - "position.stable": "Stal", - "position.stable.description": "Goed vir stablecoins of lae-volatiliteitspare", - "position.step.deposit": "Voer deposito bedrae in", - "position.step.price": "Stel aanvanklike prys en deposito bedrae", - "position.step.range": "Stel prysklas en deposito bedrae", - "position.step.select": "Kies tokenpaar en fooie", - "position.value": "Posisiewaarde", - "position.valueUnavailable": "USD-waarde is tans nie beskikbaar vir hierdie posisie nie. Sien posisiebesonderhede vir gedeponeerde tokenbedrae.", - "position.wide": "Breed", - "position.wide.description": "Goed vir wisselvallige pare", - "position.wrapped.unwrap": "Pak {{wrappedToken}}uit", - "position.wrapped.warning": "{{nativeToken}} vereis vir v4-poele", - "position.wrapped.warning.info": "Pak jou {{wrappedToken}} uit en deponeer {{nativeToken}} om meer koste-effektiewe en doeltreffende likiditeit te verskaf.", - "positions.noPositions.description": "Jy het geen likiditeitsposisies nie. Skep 'n nuwe posisie om fooie en belonings op kwalifiserende poele te begin verdien.", - "positions.noPositions.title": "Geen posisies nie", - "positions.welcome.connect.description": "Om jou posisies en belonings te sien, moet jy jou beursie koppel.", - "positions.welcome.connect.wallet": "Koppel jou beursie", - "privacy.anonymizedLogs": "Die toepassing teken anonieme gebruikstatistieke aan om mettertyd te verbeter.", - "privacy.autoRouter": "Die toepassing haal die optimale handelsroete vanaf 'n Uniswap Labs-bediener.", - "privacy.infura": "Die toepassing haal data op die ketting en bou kontrakoproepe met 'n Infura API.", - "privacy.thirdPartyApis": "Hierdie toepassing gebruik die volgende derdeparty-API's:", - "privacy.trm": "Die toepassing versamel jou beursie-adres veilig en deel dit met TRM Labs Inc. vir risiko- en voldoeningsredes.", - "privacy.uniswaptos": "Uniswap Labs se diensbepalings", - "privateKeys.export.modal.speedbump.bullet1": "Bekyk dit privaat", - "privateKeys.export.modal.speedbump.bullet2": "Moenie met iemand deel nie", - "privateKeys.export.modal.speedbump.bullet3": "Moet dit nooit by enige webwerwe of toepassings invoer nie", - "privateKeys.export.modal.speedbump.subtitle": "Enigiemand wat jou privaat sleutel ken, kan toegang tot jou beursie en fondse kry.", - "privateKeys.export.modal.speedbump.title": "Voordat jy voortgaan", - "privateKeys.export.modal.subtitle": "Dit lyk asof jy nie jou beursie ten volle kan herstel nie. Om seker te maak dat jy nooit toegang tot jou fondse verloor nie, kopieer jou privaat sleutel.", - "privateKeys.export.modal.title": "Voer jou private sleutel uit", - "privateKeys.export.modal.warning": "As jy jou foon verloor of die toepassing uitvee, sal jy hierdie sleutel in 'n ander beursie moet invoer.", - "privateKeys.view.button.continue": "Ek het hulle almal gekopieer.", - "privateKeys.view.button.continue.single": "Ek het dit gekopieer.", - "privateKeys.view.subtitle": "Jou privaat sleutel verleen toegang tot 'n spesifieke beursie. Elke beursie het 'n ander privaat sleutel.", - "privateKeys.view.title": "Privaat Sleutel", - "qrScanner.button.connections_one": "1 toepassing gekoppel", - "qrScanner.button.connections_other": "{{count}} programme gekoppel", - "qrScanner.error.camera.message": "Om 'n kode te skandeer, laat kameratoegang toe in stelselinstellings", - "qrScanner.error.camera.title": "Kamera is gedeaktiveer", - "qrScanner.error.none": "Geen QR-kode gevind nie", - "qrScanner.recipient.action.scan": "Skandeer 'n QR-kode", - "qrScanner.recipient.action.show": "Wys my QR-kode", - "qrScanner.recipient.error.message": "Maak seker dat jy 'n geldige Ethereum-adres QR-kode skandeer voordat jy weer probeer.", - "qrScanner.recipient.error.title": "Ongeldige QR-kode", - "qrScanner.request.message.unavailable": "Geen boodskap gevind nie.", - "qrScanner.request.method.default": "Versoek van {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "Handtekeningversoek van {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "Transaksieversoek van {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "Laat {{dappName}} toe om tot {{amount}} {{currencySymbol}}te gebruik?", - "qrScanner.request.withoutAmount": "Laat {{dappName}} toe om jou {{currencySymbol}}?", - "qrScanner.status.connecting": "Koppel tans …", - "qrScanner.status.loading": "Laai tans...", - "qrScanner.title": "Skandeer 'n QR-kode", - "qrScanner.wallet.networks": "Ondersteunde netwerke", - "range.outOfView": "Reeks buite sig", - "removeLiquidity.pooled": "Saamgevoeg {{symbol}}:", - "revoke.failed.message": "'n Netwerk- of verbindingsprobleem het waarskynlik veroorsaak dat jou herroeping misluk het. Kontroleer jou verbinding en probeer weer.", - "routing.aggregateLiquidity": "Wanneer beskikbaar, versamel likiditeitsbronne vir beter pryse en gasvrye ruiltransaksies.", - "routing.aggregateLiquidity.uniswapx": "UniswapX versamel likiditeitsbronne op en van die ketting af, wat jou die beste beskikbare pryse en gasvrye ruiltransaksies bied.", - "routing.cheapest": "Die Uniswap-kliënt kies die goedkoopste handelsopsie wat prys en netwerkkoste faktoriseer.", - "routing.cheapest.v4": "Die Uniswap-kliënt kies die optimale handelsopsie met inagneming van prys en netwerkkoste.", - "scantastic.code.expired": "Verval", - "scantastic.code.subtitle": "Voer hierdie kode in die Uniswap-uitbreiding in. Jou herstelfrase sal veilig geënkripteer en oorgedra word.", - "scantastic.code.timeRemaining.shorthand.hours": "Nuwe kode in {{hours}}h {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.minutes": "Nuwe kode in {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.seconds": "Nuwe kode in {{seconds}}s", - "scantastic.code.title": "Verruil eenmalige kode", - "scantastic.confirmation.button.continue": "Ja, gaan voort", - "scantastic.confirmation.label.browser": "Blaaier", - "scantastic.confirmation.label.device": "Toestel", - "scantastic.confirmation.subtitle": "Gaan net voort as jy 'n QR-kode van Uniswap-uitbreiding op 'n vertroude toestel skandeer.", - "scantastic.confirmation.title": "Probeer jy jou beursie invoer?", - "scantastic.confirmation.warning": "Pasop vir werwe en toepassings wat Uniswap naboots. Andersins kan jou beursie gekompromitteer word.", - "scantastic.error.encryption": "Kon nie saadfrase voorberei nie.", - "scantastic.error.noCode": "Geen OTP ontvang nie. Probeer asseblief weer.", - "scantastic.error.timeout.message": "Skandeer weer die QR-kode op die Uniswap-uitbreiding om voort te gaan om jou beursie te sinkroniseer.", - "scantastic.error.timeout.title": "Jou verbinding het uitgetel", - "scantastic.modal.ipMismatch.description": "Om hierdie QR-kode te skandeer, moet jou foon aan dieselfde WiFi-netwerk as jou rekenaar gekoppel wees en enige VPN's moet tydelik afgeskakel word.", - "scantastic.modal.ipMismatch.title": "Verander jou WiFi-netwerk", - "search.input.placeholder": "Soek tekens en poele", - "search.ukDisclaimer": "Vrywaring vir inwoners van die VK", - "send.button.review": "Hersien oordrag", - "send.gas.error.title": "NVT", - "send.gas.networkCost.title": "Netwerk koste", - "send.input.token.balance.title": "Balans: {{balance}} {{symbol}}", - "send.recipient.header": "Kies ontvanger", - "send.recipient.input.placeholder": "Soek ENS of adres", - "send.recipient.previous_one": "1 vorige oordrag", - "send.recipient.previous_other": "{{count}} vorige oordragte", - "send.recipient.results.empty": "Geen resultate gevind", - "send.recipient.results.error": "Die adres wat jy ingetik het bestaan óf nie óf is verkeerd gespel.", - "send.recipient.section.favorite": "Gunsteling beursies", - "send.recipient.section.recent": "Onlangs", - "send.recipient.section.search": "Soek Resultate", - "send.recipient.section.viewOnly": "Uitsig-beursies", - "send.recipient.section.yours": "Jou beursies", - "send.recipient.warning.viewOnly.message": "Stuur slegs fondse na hierdie beursie as jy die herstelfrase het of die eienaar van die beursie ken.", - "send.recipient.warning.viewOnly.title": "Jy het dit as 'n sigbare beursie", - "send.recipientSelect.search.empty.message": "Wanneer jy tokens na 'n beursie-adres stuur, sal hulle hier verskyn", - "send.recipientSelect.search.empty.title": "Geen beursies gestoor nie", - "send.review.modal.title": "Jy stuur", - "send.review.summary.button.title": "Bevestig stuur", - "send.search.empty.subtitle": "Die adres wat jy ingetik het bestaan óf nie óf is verkeerd gespel.", - "send.search.empty.title": "Geen resultate gevind", - "send.search.placeholder": "Soek ENS of adres", - "send.solanaSendNotSupported": "Stuur word nie op Solana ondersteun nie", - "send.title": "Stuur", - "send.unavailableOnSolana.message": "Stuur is nie beskikbaar op Solana-beursies nie", - "send.warning.blocked.default": "Hierdie beursie is geblokkeer", - "send.warning.blocked.modal.message": "Hierdie adres is op Uniswap Wallet geblokkeer omdat dit met een of meer geblokkeerde aktiwiteite geassosieer word. As jy glo dat dit 'n fout is, stuur 'n e-pos na compliance@uniswap.org.", - "send.warning.blocked.modal.title": "Geblokkeerde adres", - "send.warning.blocked.recipient": "Ontvanger se beursie is geblokkeer", - "send.warning.erc20.checkbox.description": "Jy probeer om fondse na 'n tekenadres te stuur. Dit kan 'n permanente verlies aan fondse tot gevolg hê.", - "send.warning.erc20.checkbox.heading": "Tokenadres is bespeur", - "send.warning.erc20.message": "Jy probeer om fondse na 'n tekenadres te stuur. Die stuur van kripto na hierdie tipe adres kan lei tot 'n permanente verlies van fondse.", - "send.warning.erc20.title": "Dit is 'n tekenadres", - "send.warning.insufficientFunds.message": "Jou {{currencySymbol}} saldo het verminder sedert jy die bedrag ingevoer het wat jy graag wil stuur", - "send.warning.insufficientFunds.title": "Nie genoeg {{currencySymbol}}nie", - "send.warning.insufficientGas.message.withNetwork": "Nie genoeg {{currencySymbol}} op {{networkName}} om te stuur", - "send.warning.insufficientGas.message.withoutNetwork": "Nie genoeg {{currencySymbol}} om te stuur", - "send.warning.modal.button.cta.blocking": "OK", - "send.warning.modal.button.cta.cancel": "Kanselleer", - "send.warning.modal.button.cta.confirm": "Bevestig", - "send.warning.newAddress.details.ENS": "ENS", - "send.warning.newAddress.details.username": "Gebruikersnaam", - "send.warning.newAddress.details.walletAddress": "Beursie-adres", - "send.warning.newAddress.message": "Jy het nog nie voorheen transaksies met hierdie adres gedoen nie. Bevestig asseblief dat die adres korrek is voordat u voortgaan.", - "send.warning.newAddress.title": "Nuwe adres", - "send.warning.self.message": "Jy probeer om fondse na jou huidige beursie te stuur. Die stuur van kripto na hierdie adres sal onnodige netwerkkoste meebring.", - "send.warning.self.title": "Dit is jou huidige beursie", - "send.warning.smartContract.message": "Jy is op die punt om fondse na 'n slim kontrakadres te stuur. Maak seker dit is die korrekte adres en dat dit tokens kan ontvang. Indien nie, kan dit 'n permanente verlies aan fondse tot gevolg hê.", - "send.warning.smartContract.title": "Dit is 'n slim kontrakadres", - "send.warning.viewOnly.message": "Jy moet hierdie beursie via herstelfrase invoer om bates te stuur.", - "send.warning.viewOnly.title": "Hierdie beursie is slegs sigbaar", - "send.youAreSending": "Jy stuur", - "sendRecipientForm.recentAddresses.label": "Onlangse", - "sendReviewModal.title": "Resensie stuur", - "setting.recoveryPhrase.account.show": "Wys herstelfrase", - "setting.recoveryPhrase.action.hide": "Versteek herstelfrase", - "setting.recoveryPhrase.remove": "Verwyder herstelfrase", - "setting.recoveryPhrase.remove.confirm.subtitle": "Ek verstaan dat Uniswap Labs my nie kan help om my beursie terug te kry as ek dit nie doen nie.", - "setting.recoveryPhrase.remove.confirm.title": "Ek het my herstelfrase gestoor", - "setting.recoveryPhrase.remove.initial.subtitle": "Maak seker jy het jou herstelfrase gestoor. Andersins sal jy toegang tot jou beursies verloor", - "setting.recoveryPhrase.remove.initial.title": "Voordat jy voortgaan", - "setting.recoveryPhrase.remove.subtitle": "Voer jou wagwoord in om te bevestig", - "setting.recoveryPhrase.remove.title": "Jy verwyder jou herstelfrase", - "setting.recoveryPhrase.view.warning.message1": "Enigiemand wat jou herstelfrase ken, kan toegang tot jou beursie en fondse kry", - "setting.recoveryPhrase.view.warning.message2": "Bekyk dit privaat", - "setting.recoveryPhrase.view.warning.message3": "Moenie met iemand deel nie", - "setting.recoveryPhrase.view.warning.message4": "Moet dit nooit by enige webwerwe of toepassings invoer nie", - "setting.recoveryPhrase.view.warning.title": "Voordat jy voortgaan", - "setting.recoveryPhrase.warning.view.message": "Enigiemand wat jou herstelfrase ken, kan toegang tot jou beursie en fondse kry.", - "setting.recoveryPhrase.warning.view.title": "Bekyk dit op 'n privaat plek", - "settings.action.enableInSettings": "Aktiveer in Instellings", - "settings.action.feedback": "Stuur terugvoering", - "settings.action.help": "Kry hulp", - "settings.action.lock": "Sluit beursie", - "settings.action.privacy": "Privaatheidsbeleid", - "settings.action.terms": "Diensbepalings", - "settings.connectWalletPlatform.warning": "Om Uniswap op {{platform}}te gebruik, koppel aan 'n beursie wat {{platform}}ondersteun.", - "settings.footer": "Met liefde gemaak, \nUniswap-span 🦄", - "settings.hideSmallBalances": "Versteek klein saldo's", - "settings.hideSmallBalances.subtitle": "Saldo's onder 1 USD sal van jou portefeulje weggesteek word.", - "settings.maxSlippage": "Maks. gly", - "settings.maxSlippage.amount": "{{amount}} maksimum gly", - "settings.section.about": "Oor", - "settings.section.preferences": "Voorkeure", - "settings.section.privacyAndSecurity": "Privaatheid en sekuriteit", - "settings.section.support": "Ondersteuning", - "settings.section.wallet.hidden.row.title": "{{numHidden}} ander beursies", - "settings.setting.advanced.title": "Gevorderd", - "settings.setting.advancedSettings": "Advanced settings", - "settings.setting.appearance.option.auto": "Outo", - "settings.setting.appearance.option.dark.subtitle": "Gebruik altyd donker tema.", - "settings.setting.appearance.option.dark.title": "Donker", - "settings.setting.appearance.option.device.subtitle": "Pas aan by jou toestel se instellings.", - "settings.setting.appearance.option.device.title": "Outo", - "settings.setting.appearance.option.light.subtitle": "Gebruik altyd ligte tema.", - "settings.setting.appearance.option.light.title": "Lig", - "settings.setting.appearance.title": "Tema", - "settings.setting.backup.create.description": "As u 'n wagwoord opstel, sal u rugsteun van u herstelfrase enkripteer, wat 'n ekstra vlak van beskerming byvoeg as u {{cloudProviderName}} -rekening ooit gekompromitteer word.", - "settings.setting.backup.create.title": "Rugsteun na {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "Omdat hierdie beursies 'n herstelfrase deel, sal dit ook die rugsteune vir hierdie beursies hieronder uitvee", - "settings.setting.backup.delete.confirm.title": "Is jy seker?", - "settings.setting.backup.delete.warning": "As jy jou {{cloudProviderName}} rugsteun uitvee, sal jy net jou beursie kan herstel met 'n handrugsteun van jou herstelfrase. Uniswap Labs kan nie jou bates herwin as jy jou herstelfrase verloor nie.", - "settings.setting.backup.error.message.full": "Kan nie die herstelfrase rugsteun na {{cloudProviderName}}nie. Maak asseblief seker dat jy {{cloudProviderName}} geaktiveer het met beskikbare stoorspasie en probeer weer.", - "settings.setting.backup.error.message.short": "Kan nie rugsteun uitvee nie", - "settings.setting.backup.error.title": "{{cloudProviderName}} fout", - "settings.setting.backup.modal.description": "Jy het nog nie jou herstelfrase na {{cloudProviderName}} gerugsteun nie. Deur dit te doen, kan jy jou beursie herwin net deur by {{cloudProviderName}} op enige toestel aangemeld te wees.", - "settings.setting.backup.modal.title": "Rugsteun herstelfrase na {{cloudProviderName}}?", - "settings.setting.backup.password.error.mismatch": "Wagwoorde stem nie ooreen nie", - "settings.setting.backup.password.medium": "Dit is 'n medium wagwoord", - "settings.setting.backup.password.placeholder.confirm": "Bevestig Wagwoord", - "settings.setting.backup.password.placeholder.create": "Skep wagwoord", - "settings.setting.backup.password.strong": "Dit is 'n sterk wagwoord", - "settings.setting.backup.password.weak": "Dit is 'n swak wagwoord", - "settings.setting.backup.recoveryPhrase.label": "Herstel frase", - "settings.setting.backup.selected": "{{cloudProviderName}} rugsteun", - "settings.setting.backup.status.action.delete": "Vee rugsteun uit", - "settings.setting.backup.status.complete": "Gerugsteun na {{cloudProviderName}}", - "settings.setting.backup.status.description": "Deur jou herstelfrase na {{cloudProviderName}}te laat rugsteun, kan jy jou beursie herwin net deur op enige toestel by jou {{cloudProviderName}} rekening aangemeld te wees.", - "settings.setting.backup.status.inProgress": "Rugsteun tans na {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "Gerugsteun", - "settings.setting.backup.status.title": "{{cloudProviderName}} rugsteun", - "settings.setting.beta.tooltip": "Kom binnekort", - "settings.setting.biometrics.appAccess.subtitle.android": "Vereis gesig/vingerafdruk om die toepassing oop te maak.", - "settings.setting.biometrics.appAccess.subtitle.ios": "Vereis {{biometricsMethod}} om toepassing oop te maak.", - "settings.setting.biometrics.appAccess.title": "Toegang tot die toepassing", - "settings.setting.biometrics.auth": "Bevestig asseblief", - "settings.setting.biometrics.extension.waitingForBiometricsModal.content": "Aktiveer {{biometricsMethod}} in jou blaaier- of stelselinstellings om voort te gaan.", - "settings.setting.biometrics.extension.waitingForBiometricsModal.title": "Wag vir {{biometricsMethod}}", - "settings.setting.biometrics.off.message.android": "Biometrie is tans afgeskakel vir Uniswap Wallet—jy kan dit in jou stelselinstellings aanskakel.", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} is tans afgeskakel vir Uniswap Wallet—jy kan dit in jou stelselinstellings aanskakel.", - "settings.setting.biometrics.off.title.android": "Biometrie is afgeskakel", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} is afgeskakel", - "settings.setting.biometrics.title": "Ontsluit gesig/vingerafdruk", - "settings.setting.biometrics.transactions.subtitle.android": "Vereis gesig/vingerafdruk om transaksies te doen.", - "settings.setting.biometrics.transactions.subtitle.ios": "Vereis {{biometricsMethod}} om transaksies te doen.", - "settings.setting.biometrics.transactions.title": "Transaksies", - "settings.setting.biometrics.unavailable.message.android": "Biometrie is nie op jou toestel opgestel nie. Om biometrie te gebruik, stel dit eers in Instellings op.", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} is nie op jou toestel opgestel nie. Om {{biometricsMethod}}te gebruik, stel dit eers in Instellings op.", - "settings.setting.biometrics.unavailable.title.android": "Biometrie is nie opgestel nie", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} is nie opgestel nie", - "settings.setting.biometrics.warning.message.android": "As jy nie biometrie aanskakel nie, kan enigiemand wat toegang tot jou toestel kry, Uniswap Wallet oopmaak en transaksies doen.", - "settings.setting.biometrics.warning.message.ios": "As jy nie {{biometricsMethod}}aanskakel nie, kan enigiemand wat toegang tot jou toestel kry, Uniswap Wallet oopmaak en transaksies doen.", - "settings.setting.biometrics.warning.title": "Is jy seker?", - "settings.setting.connections.disconnectAll": "Ontkoppel almal", - "settings.setting.connections.noConnectionsDescription": "Koppel aan 'n toepassing deur na 'n \"Connect Wallet\"- of \"Teken aan\"-knoppie te soek.", - "settings.setting.currency.title": "Plaaslike geldeenheid", - "settings.setting.deviceAccess.reset.title": "Herstel jou {{biometricsMethod}}", - "settings.setting.deviceAccess.title": "Toesteltoegang", - "settings.setting.deviceAccessTimeout.1hour": "1 uur", - "settings.setting.deviceAccessTimeout.24hours": "24 uur", - "settings.setting.deviceAccessTimeout.30minutes": "30 min", - "settings.setting.deviceAccessTimeout.5minutes": "5 min", - "settings.setting.deviceAccessTimeout.never": "Nooit", - "settings.setting.deviceAccessTimeout.title": "Outomatiese sluittydsberekening", - "settings.setting.hapticTouch.title": "Haptiese aanraking", - "settings.setting.helpCenter.title": "Hulp Sentrum", - "settings.setting.language.button.navigate": "Gaan na instellings", - "settings.setting.language.description.extension": "Verwissel verstekke na u stelseltaalinstellings. Om jou voorkeurtaal te verander, gaan na jou stelselinstellings.", - "settings.setting.language.description.mobile": "Verwissel verstekke na jou toestel se taalinstellings. Om jou voorkeurtaal te verander, gaan na \"Uniswap\" in jou toestelinstellings en tik op \"Taal\".", - "settings.setting.language.title": "Taal", - "settings.setting.notifications.row.activity.description": "Oordragte, versoeke en ander aktiwiteite", - "settings.setting.notifications.row.activity.title": "Beursie-aktiwiteit", - "settings.setting.notifications.row.updates.description": "Aanbevelings en nuwe kenmerke", - "settings.setting.notifications.row.updates.title": "Opdaterings vanaf Uniswap", - "settings.setting.notifications.title": "Kennisgewings", - "settings.setting.password.change.title": "Skep 'n nuwe wagwoord", - "settings.setting.password.title": "Verander wagwoord", - "settings.setting.permissions.title": "Toestemmings", - "settings.setting.privacy.analytics.description": "Ons gebruik anonieme gebruiksdata om jou ervaring oor Uniswap Labs-produkte te verbeter. Wanneer dit gedeaktiveer is, spoor ons slegs foute en noodsaaklike gebruik na.", - "settings.setting.privacy.analytics.title": "App-analise", - "settings.setting.privateKeys.title": "Privaat sleutels", - "settings.setting.recoveryPhrase.title": "Herstel frase", - "settings.setting.smallBalances.title": "Portefeuljebalans", - "settings.setting.smartWallet.action.enable": "Aktiveer", - "settings.setting.smartWallet.action.smartWallet": "Smart wallet", - "settings.setting.smartWallet.notEligible": "Nie in aanmerking nie", - "settings.setting.smartWallet.status.actionRequired": "Aksie vereis", - "settings.setting.smartWallet.status.active": "Aktief", - "settings.setting.smartWallet.status.inactive": "Onaktief", - "settings.setting.smartWallet.status.unavailable": "Onbeskikbaar", - "settings.setting.unknownTokens.subtitle": "Potensiële bedrogspul-tokens sal van jou portefeulje versteek word.", - "settings.setting.unknownTokens.title": "Versteek onbekende tekens", - "settings.setting.wallet.action.editLabel": "Wysig etiket", - "settings.setting.wallet.action.editProfile": "Wysig profiel", - "settings.setting.wallet.action.remove": "Verwyder beursie", - "settings.setting.wallet.connection.banner.description": "Bestuur verbindings via beursie-instellings deur op jou profielprent te klik.", - "settings.setting.wallet.connection.banner.title": "Verbindings het geskuif", - "settings.setting.wallet.connections.title": "Verbindings", - "settings.setting.wallet.editLabel.description": "Etikette is nie publiek nie. Hulle word plaaslik gestoor en net vir jou sigbaar.", - "settings.setting.wallet.editLabel.save": "Stoor veranderinge", - "settings.setting.wallet.label": "Bynaam", - "settings.setting.wallet.testnetMode.description": "Dit skakel toetsnette aan vir ontwikkelaars om kenmerke en transaksies uit te probeer sonder om werklike bates te gebruik. Tokens op toetsnette hou geen werklike waarde in nie.", - "settings.setting.wallet.testnetMode.title": "Toetsnet-modus", - "settings.switchNetwork.warning": "Om Uniswap op {{label}}te gebruik, verander die netwerk in jou beursie se instellings.", - "settings.title": "Instellings", - "settings.version": "Weergawe {{appVersion}}", - "smartWallet.actionRequired.cta": "Deaktiveer op 1 netwerk", - "smartWallet.actionRequired.cta.plural": "Deaktiveer op {{amount}} netwerke", - "smartWallet.actionRequired.description": "Die deaktivering van slim beursies is 'n kettingaksie wat 'n klein netwerkkoste vereis.", - "smartWallet.actionRequired.insufficientFunds": "Onvoldoende fondse", - "smartWallet.actionRequired.reactivate": "Hou aan om slim beursie te gebruik", - "smartWallet.actionRequired.title": "Slim beursie is aktief op 1 netwerk", - "smartWallet.actionRequired.title.plural": "Slim beursie is aktief op {{amount}} netwerke", - "smartWallet.activeNetworks.title": "Slim beursie is aktief op 1 netwerk", - "smartWallet.activeNetworks.title.plural": "Slim beursie is aktief op {{amount}} netwerke", - "smartWallet.banner.networkCost": "Includes a one-time cost to activate your smart wallet on {{chainName}}.", - "smartWallet.banner.text": "Aktiveer slimbeursie om tot 50% op netwerkkoste te bespaar.", - "smartWallet.confirmDisableSmartWallet.description": "Jy sal vinniger ruilings, afslag op netwerkkoste en ander komende verbeterings misloop.", - "smartWallet.confirmDisableSmartWallet.title": "Is jy seker?", - "smartWallet.insufficient.description": "Slim beursies kan nie op hierdie netwerke gedeaktiveer word totdat jy fondse het om netwerkkoste te dek nie.", - "smartWallet.insufficient.title": "Onvoldoende fondse op 1 netwerk", - "smartWallet.insufficient.title.plural": "Onvoldoende fondse op {{amount}} netwerke", - "smartWallet.InsufficientFunds.button.continue.text": "Gaan in elk geval voort", - "smartWallet.insufficientFunds.network.banner.description": "Kan nie deaktiveer nie weens onvoldoende fondse.", - "smartWallet.insufficientFunds.network.banner.title_one": "{{count}} netwerk uitgesluit", - "smartWallet.insufficientFunds.network.banner.title_other": "{{count}} netwerk uitgesluit", - "smartWallet.insufficientFunds.network.disable.text": "Gereed om te deaktiveer", - "smartWallet.insufficientFunds.network.text": "Jy benodig {{nativeCurrency}}", - "smartWallet.insufficientFunds.single.network.banner.title": "{{chain}} uitgesluit", - "smartWallet.modal.description.block1": "Slim beursies gebruik slim kontrakte vir vinniger, laerkoste-transaksies.", - "smartWallet.modal.description.block2": "Beursies wat reeds slimbeursie-funksies van 'n ander toepassing gebruik, sal nie beïnvloed word nie.", - "smartWallet.modal.title": "Slim beursie", - "smartWallets": "Slim beursies", - "smartWallets.activeNetworks.description": "Jou slim beursie word outomaties geaktiveer oor elke nuwe netwerk waarop jy oorskakel.", - "smartWallets.createdModal.description": "You’re getting faster transactions and lower network costs on every swap.", - "smartWallets.createdModal.title": "Slim beursie geskep", - "smartWallets.delegation.limitedSupport": "Jou beursie het beperkte ondersteuning", - "smartWallets.delegationMismatchModal.description": "{{walletName}} ondersteun nie die nuutste Ethereum-standaarde wat deur {{displayName}}gebruik word nie, daarom is sommige kenmerke nie beskikbaar nie.", - "smartWallets.delegationMismatchModal.features.1ClickSwaps": "1-klik ruilings", - "smartWallets.delegationMismatchModal.features.gasFreeSwaps": "Gasvrye ruilings", - "smartWallets.delegationMismatchModal.features.limitOrders": "Limietorders", - "smartWallets.delegationMismatchModal.limitOrders.unsupported": "Limietorders word nie deur jou beursie ondersteun nie.", - "smartWallets.delegationMismatchModal.title": "Beperkte beursie-ondersteuning", - "smartWallets.disable.failed": "'n Fout het voorgekom. Slim beursie is steeds aktief op 1 of meer netwerke. Probeer asseblief weer.", - "smartWallets.disable.modal.description": "Hierdie onchain-aksie vereis 'n netwerkkoste.", - "smartWallets.disable.modal.title": "Deaktiveer slim beursie", - "smartWallets.educationalModal.description": "Slim beursies bied vinniger, laekoste-transaksies met behulp van slimkontrakte.", - "smartWallets.educationalModal.info": "Wallies wat reeds slimbeursie-kenmerke van 'n ander toepassing gebruik, sal nie geraak word nie.", - "smartWallets.enabledModal.description": "Opdaterings sal op jou volgende ruil in werking tree.", - "smartWallets.enabledModal.description.dapp": "Opdaterings sal in werking tree op jou volgende transaksie.", - "smartWallets.enabledModal.description.dapp.line2": "Koppel jou beursie weer om dadelik slim beursie-funksies op programme te begin gebruik.", - "smartWallets.enabledModal.title": "Slim beursie geaktiveer", - "smartWallets.postSwapNudge.enable": "Aktiveer slim beursie", - "smartWallets.postSwapNudge.title": "Bespaar op jou volgende ruil", - "smartWallets.postSwapNudge.title.dapp": "Hierdie toepassing ondersteun slim beursies", - "smartWallets.unavailableModal.description": "'n Ander beursieverskaffer bestuur nou slim beursie-instellings vir {{displayName}}. Jy kan Uniswap soos normaalweg voortgaan om te gebruik.", - "smartWallets.unavailableModal.title": "Slim beursie-kenmerke is nie beskikbaar nie", - "solanaPromo.banner.description": "Ruil Solana-tokens direk op Uniswap.", - "solanaPromo.banner.title": "Solana is nou beskikbaar", - "solanaPromo.modal.connectWallet": "Koppel jou gunsteling Solana-beursie", - "solanaPromo.modal.startSwapping.button": "Begin omruil op Solana", - "solanaPromo.modal.swapInstantly": "Ruil duisende gewilde tokens onmiddellik om", - "solanaPromo.modal.viewTokenData": "Bekyk tokendata en pryse op een plek", - "speedBump.newAddress.warning.description": "Jy het nog nie voorheen transaksies met hierdie adres gedoen nie. Maak seker dit is die regte adres voordat jy voortgaan.", - "speedBump.newAddress.warning.title": "Nuwe adres", - "speedBump.smartContractAddress.warning.description": "Jy is op die punt om tokens na 'n spesiale tipe adres te stuur - 'n slim kontrak. Maak seker dat dit die adres is waarna jy wou stuur. As dit verkeerd is, kan jou tekens vir ewig verlore gaan.", - "speedBump.smartContractAddress.warning.title": "Is dit 'n beursie-adres?", - "stats.24fees": "24H fooie", - "stats.24swapVolume": "24H-ruilvolume", - "stats.24volume": "24H volume", - "stats.allTimeSwappers": "Alle tye swappers", - "stats.allTimeVolume": "Alle tye volume", - "stats.fdv": "FDV", - "stats.fdv.description": "Volledig verwaterde waardasie (FDV) bereken die totale markwaarde met die veronderstelling dat alle tokens in omloop is.", - "stats.marketCap": "Markkapitalisasie", - "stats.marketCap.description": "Markkapitalisasie is die totale markwaarde van 'n bate se sirkulerende aanbod.", - "stats.noStatsAvailable": "Geen statistieke beskikbaar nie", - "stats.tvl": "Totale waarde gesluit", - "stats.tvl.description": "Totale waarde gesluit (TVL) is die totale bedrag van die bate beskikbaar oor alle Uniswap-likiditeitpoele.", - "stats.volume.1d": "1 dae volume", - "stats.volume.1d.description": "1 dag volume is die bedrag van die bate wat gedurende die afgelope 24 uur op Uniswap verhandel is.", - "stats.volume.1d.long": "1D volume", - "stats.volume.1d.short": "1D vol", - "stats.volume.description": "Volume is die bedrag van die bate wat gedurende die geselekteerde tydraamwerk op Uniswap verhandel is.", - "swap.allow.oneTime": "Laat {{sym}} toe (een keer)", - "swap.approveAndSubmit": "Keur goed en dien in", - "swap.approveAndSwap": "Keur goed en ruil", - "swap.balance.amount": "Balans: {{amount}}", - "swap.bestPrice.through": "Roete via {{provider}}", - "swap.bestRoute.cost": "Die doeltreffendste roete sal na raming ~{{gasPrice}} in netwerkkoste kos. ", - "swap.bridging.title": "Ruil oor netwerke heen", - "swap.bridging.warning.description": "Jy ruil van {{fromNetwork}} na {{toNetwork}}. Dit staan ook bekend as \"oorbrugging\", wat jou tokens van een netwerk na 'n ander skuif.", - "swap.button.confirmSignAndSwap": "Bevestig teken en ruil", - "swap.button.confirmSwapAnyways": "Bevestig ruil in elk geval", - "swap.button.confirmUnwrap": "Bevestig uitpak", - "swap.button.max": "Maks", - "swap.button.review": "Resensie", - "swap.button.submitting": "Dien tans ruil in …", - "swap.button.submitting.keep.open": "Hou jou beursie oop...", - "swap.button.submitting.passkey": "Bevestig met wagwoord", - "swap.button.swap": "Ruil", - "swap.button.swapAnyways": "Ruil in elk geval", - "swap.button.unwrap": "Ontwikkel", - "swap.button.wrap": "Wikkel", - "swap.buy.countryModal.placeholder": "Soek volgens land of streek", - "swap.cancel.cannotExecute_one": "Jou ruil kan uitgevoer word voordat kansellasie verwerk word. Jou netwerkkoste kan nie terugbetaal word nie. Wil jy voortgaan?", - "swap.cancel.cannotExecute_other": "Jou omruilings kan uitgevoer word voordat kansellasie verwerk word. Jou netwerkkoste kan nie terugbetaal word nie. Wil jy voortgaan?", - "swap.confirmApproveAndSwap": "Bevestig goedkeuring en ruil", - "swap.confirmLimit": "Bevestig limiet", - "swap.confirmSwap": "Bevestig omruiling", - "swap.confirmWrap": "Bevestig omslag", - "swap.deadline.settings.title": "Ruil sperdatum", - "swap.deadline.settings.title.short": "Tx. sperdatum", - "swap.details.completed": "Ruil voltooi", - "swap.details.estimatedTime": "Geskatte tyd", - "swap.details.fasterUnichainSwaps": "Vinniger ruiltransaksies aangedryf deur Unichain", - "swap.details.feeOnTransfer": "{{tokenSymbol}} fooi", - "swap.details.feeOnTransfer.symbol": "{{tokenSymbol}} tekenfooi", - "swap.details.instant": "Kits", - "swap.details.newQuote.input": "Nuwe insette", - "swap.details.newQuote.output": "Nuwe uitset", - "swap.details.orderRouting": "Bestel roetering", - "swap.details.orderRoutingInfo": "Hierdie ruil word gelei via Across, 'n gedesentraliseerde protokol wat bates oor netwerke beweeg terwyl veiligheid, vinnige uitvoering en lae pryse geprioritiseer word.", - "swap.details.poweredBy": "Aangedryf deur", - "swap.details.rate": "Koers", - "swap.details.slippage": "Maksimum gly", - "swap.details.slippage.uniswap": "Uniswap Beskermde gly", - "swap.details.swappedIn.unichain": "Voltooi in {{time}}s op Unichain", - "swap.details.uniswapFee": "Fooi", - "swap.error.default": "Jy sal dalk jou gliptoleransie moet verhoog. Let wel: fooi-op-oordrag en herbasis-tokens is onversoenbaar met Uniswap V3.", - "swap.error.expectedToFail": "Daar word verwag dat jou ruil sal misluk.", - "swap.error.fiatInputUnavailable": "{{fiatCurrencyCode}} invoer nie beskikbaar nie", - "swap.error.modifiedByWallet": "Jou ruil is deur jou beursie gewysig. As dit 'n fout was, kanselleer asseblief onmiddellik of die risiko om jou fondse te verloor.", - "swap.error.rejected": "Transaksie afgekeur", - "swap.error.undefinedObject": "'n Fout het voorgekom toe hierdie omruiling probeer uitvoer word. Jy sal dalk jou gliptoleransie moet verhoog. As dit nie werk nie, kan daar 'n onverenigbaarheid wees met die teken wat jy verhandel. Let wel: fooi-op-oordrag en herbasis-tokens is onversoenbaar met Uniswap V3.", - "swap.error.unknown": "Onbekende fout.", - "swap.error.v2.expired": "Hierdie transaksie kon nie gestuur word nie omdat die sperdatum verby is. Kontroleer asseblief dat u transaksiesperdatum nie te laag is nie.", - "swap.error.v2.k": "Die Uniswap-onveranderlike x*y=k is nie deur die ruil bevredig nie. Dit beteken gewoonlik dat een van die tekens wat jy omruil pasgemaakte gedrag by oordrag insluit.", - "swap.error.v2.slippage": "Hierdie transaksie sal ook nie slaag nie as gevolg van prysbeweging of fooi by oordrag. Probeer om jou gliptoleransie te verhoog", - "swap.error.v2.transferInput": "Die invoertoken kan nie oorgedra word nie. Daar is dalk 'n probleem met die invoertoken.", - "swap.error.v2.transferOutput": "Die uitvoertoken kan nie oorgedra word nie. Daar kan 'n probleem met die uitsetteken wees.", - "swap.error.v3.slippage": "Hierdie transaksie sal nie slaag nie as gevolg van prysbeweging. Probeer om jou gliptoleransie te verhoog. Let wel: fooi op oordrag en herbasis-tokens is onversoenbaar met Uniswap V3.", - "swap.error.v3.transferOutput": "Die uitvoertoken kan nie oorgedra word nie. Daar kan 'n probleem met die uitsetteken wees. Let wel: fooi op oordrag en herbasis-tokens is onversoenbaar met Uniswap V3.", - "swap.estimatedDifference.label": "Daar sal 'n groot verskil tussen jou inset- en uitsetwaardes wees as gevolg van huidige likiditeit.", - "swap.expected.price": "Verwagte prys", - "swap.fail.batched": "Jou gekoppelde beursie ondersteun dalk nie 1-klik-ruilings nie. Probeer eerder 'n standaardruiling.", - "swap.fail.batched.retry": "Probeer standaard ruil", - "swap.fail.batched.title": "1-klik-ruiling het misluk", - "swap.fail.message": "Probeer glip na 'n hoër waarde aanpas.", - "swap.fail.uniswapX": "Ruil kon nie met UniswapX voltooi word nie. Probeer jou ruil weer om dit deur die klassieke Uniswap API te lei.", - "swap.fees.experience": "Hierdie fooi word op sommige tokenpare toegepas om die beste ervaring met Uniswap te verseker. Dit word in die uitsetteken betaal en is reeds by die kwotasie verreken.", - "swap.fees.jupiter.label": "Jupiter-fooi", - "swap.fees.jupiter.message": "Fooie op Solana word deur die Jupiter API gehef. Uniswap Labs ontvang nie hierdie fooie nie.", - "swap.fees.noFee": "Fooie word op uitgesoekte tokenpare toegepas om die beste ervaring met Uniswap te verseker. Daar is geen fooi verbonde aan hierdie ruil nie.", - "swap.finalizingQuote": "Finaliseer tans kwotasie...", - "swap.form.header": "Ruil", - "swap.form.warning.output.fotFees": "As gevolg van die tekenfooi van {{fotCurrencySymbol}}, kan ruilbedrae slegs deur die invoerveld ingevoer word", - "swap.form.warning.output.fotFees.fallback": "Weens tekenfooie kan ruilbedrae slegs deur die invoerveld ingevoer word", - "swap.form.warning.output.solana": "Presiese uitvoer word nie op Solana ondersteun nie", - "swap.form.warning.restore": "Herstel jou beursie om te ruil", - "swap.frontrun.warning": "Jou transaksie kan voorloper wees en 'n ongunstige handel tot gevolg hê.", - "swap.header.viewOnly": "Sien-alleen", - "swap.impactOfTrade": "Die impak wat u handel op die markprys van hierdie poel het.", - "swap.impactOfTrade.uniswapx": "Die verskil tussen markprys en uitvoeringsprys, met inagneming van UniswapX-gasbesparings.", - "swap.impactOfTrade.uniswapx.missing": "Prysimpakberekeninge kan dalk onbeskikbaar wees vir pare met lae likiditeit.", - "swap.inputEstimated.atMost": "Insette word geskat. Jy sal hoogstens verkoop of die transaksie sal terugkeer.", - "swap.limit": "Beperk", - "swap.limitFilled": "Limiet gevul!", - "swap.limitSubmitted": "Limiet ingedien", - "swap.marketPrice.outsideRange.label": "Die markprys is buite jou gespesifiseerde prysklas. Slegs enkelbate-deposito.", - "swap.min.price": "Minimum prys", - "swap.networkCost.paidIn": "Netwerkkoste word in {{sym}} op die {{chainName}} -netwerk betaal om transaksies te doen.", - "swap.orderRouting": "Bestel roetering", - "swap.outputEstimated.atLeast": "Uitset word geskat. Jy sal ten minste ontvang of die transaksie sal terugdraai.", - "swap.placeOrder": "Plaas bestelling", - "swap.priceImpact": "Prys impak", - "swap.request.title.full": "Ruil {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "Ruil tekens", - "swap.review": "Review ruil", - "swap.review.summary": "Jy ruil", - "swap.reviewLimit": "Hersien limiet", - "swap.route.optimizedGasCost": "Hierdie roete neem gesplete roetes, veelvuldige hops en netwerkkoste van elke stap in ag.", - "swap.routing.jupiter.description": "Jupiter versamel likiditeit uit verskeie bronne om jou die beste pryse te bied.", - "swap.routing.uniswapAutoRouter.description": "Die Uniswap Auto Router oorweeg optimale roetes en netwerkkoste om jou die beste pryse te bied.", - "swap.settings.deadline.tooltip": "Jou transaksie sal terugdraai as dit vir langer as hierdie tydperk hangende is. (Maksimum: 3 dae).", - "swap.settings.deadline.warning": "Hoë sperdatum", - "swap.settings.oneClickSwap.title": "1-klik ruilings", - "swap.settings.oneClickSwap.tooltip": "Bundel standaard handelsaksies saam vir vinniger, laerkoste-ruiltransaksies.", - "swap.settings.protection.description": "Met ruilbeskerming aan, sal jou Ethereum-transaksies teen toebroodjie-aanvalle beskerm word, met verminderde kanse op mislukking.", - "swap.settings.protection.subtitle.supported": "{{chainName}} Netwerk", - "swap.settings.protection.subtitle.unavailable": "Nie beskikbaar op {{chainName}}nie", - "swap.settings.protection.title": "Ruil beskerming", - "swap.settings.routingPreference.option.default.description": "Deur hierdie opsie te kies, identifiseer die mees doeltreffende roete vir jou ruil.", - "swap.settings.routingPreference.option.default.description.preV4": "Die Uniswap-kliënt kies die goedkoopste handelsopsie met inagneming van prys en netwerkkoste.", - "swap.settings.routingPreference.option.default.description.uniswapXUnavailable": "UniswapX nie beskikbaar vir jou beursie nie", - "swap.settings.routingPreference.option.default.tooltip": "'n Roete word geïdentifiseer met inagneming van v2, v3 en sekere v4-poele, met inagneming van beraamde prysimpak en netwerkkoste.", - "swap.settings.routingPreference.option.v2.title": "Aktiveer v2-poele", - "swap.settings.routingPreference.option.v3.title": "Aktiveer v3-poele", - "swap.settings.routingPreference.option.v4.hooks.title": "Aktiveer v4-haakpoele", - "swap.settings.routingPreference.option.v4.hooks.tooltip": "V4-hake roeteer ruiltransaksies deur 'n stel vooraf goedgekeurde hake.", - "swap.settings.routingPreference.option.v4.title": "Aktiveer v4-poele", - "swap.settings.routingPreference.title": "Handel opsies", - "swap.settings.slippage.alert": "Hoë gly", - "swap.settings.slippage.control.auto": "Outo", - "swap.settings.slippage.description": "Jou transaksie sal terugdraai as die prys meer as die glippersentasie verander.", - "swap.settings.slippage.input.message": "As die prys verder gly, sal jou transaksie terugdraai. Hieronder is die minimum bedrag wat jy gewaarborg is om te ontvang.", - "swap.settings.slippage.input.receive.title": "Ontvang ten minste", - "swap.settings.slippage.output.message": "As die prys verder gly, sal jou transaksie terugdraai. Hieronder is die maksimum bedrag wat jy sal moet spandeer.", - "swap.settings.slippage.output.spend.title": "Spandeer hoogstens", - "swap.settings.slippage.warning": "Baie hoë gly", - "swap.settings.slippage.warning.description": "Glip bo 20% sal waarskynlik lei tot 'n ongunstige handel. Verlaag jou instellings om die risiko van voorloper te verminder.", - "swap.settings.slippage.warning.hover": "Dit kan lei tot 'n ongunstige handel. Probeer om jou glip-instelling te verlaag.", - "swap.settings.slippage.warning.max": "Voer 'n waarde minder as {{maxSlippageTolerance}}in", - "swap.settings.slippage.warning.message": "Glip kan hoër wees as wat nodig is", - "swap.settings.slippage.warning.min": "Voer 'n waarde groter as 0 in", - "swap.settings.title": "Ruil instellings", - "swap.settings.transactionRevertPrice": "Jou transaksie sal terugdraai as die prys ongunstig verander met meer as hierdie persentasie.", - "swap.signAndSwap": "Teken en ruil", - "swap.slippage.amt": "{{amt}} glip", - "swap.slippage.bridging": "Geen gly wanneer oor netwerke geruil word nie", - "swap.slippage.description": "Verskil tussen verwagte en uitgevoerde prys op 'n ruiltransaksie. Verskille kan voorkom as gevolg van lae likiditeit, markwisselvalligheid of robotte. \n\nUniswap-beskerming beskerm teen voorlopersrobotte en MEV.", - "swap.slippage.settings.title": "Glip instellings", - "swap.slippage.tooltip": "Die maksimum prysbeweging voor jou transaksie sal terugkeer.", - "swap.slippageBelow.warning": "Glip onder {{amt}} kan lei tot 'n mislukte transaksie", - "swap.submitted": "Ruil ingedien", - "swap.success": "Ruil sukses!", - "swap.tokenOwnFees": "Sommige tokens neem 'n fooi wanneer dit gekoop of verkoop word, wat deur die token-uitreiker bepaal word. Uniswap ontvang nie enige van hierdie fooie nie.", - "swap.tradeRoutes": "Handelsroetes", - "swap.transaction.deadline": "Transaksie sperdatum", - "swap.transaction.revertAfter": "Jou transaksie sal terugdraai as dit vir langer as hierdie tydperk hangende is.", - "swap.warning.enterLargerAmount.title": "Voer 'n groter bedrag in", - "swap.warning.expectedFailure.increaseSlippage": "Probeer om jou glip te verhoog.", - "swap.warning.expectedFailure.titleMay": "Hierdie ruil kan misluk", - "swap.warning.insufficientBalance.title": "Jy het nie genoeg {{currencySymbol}}nie", - "swap.warning.insufficientGas.button": "Nie genoeg {{currencySymbol}}nie", - "swap.warning.insufficientGas.button.bridge": "Ruil vir {{ tokenSymbol }} op {{networkName}}", - "swap.warning.insufficientGas.button.buy": "Koop {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "Koop met kaart", - "swap.warning.insufficientGas.message.withNetwork": "Nie genoeg {{currencySymbol}} op {{networkName}} om te ruil", - "swap.warning.insufficientGas.message.withoutNetwork": "Nie genoeg {{currencySymbol}} om te ruil nie", - "swap.warning.insufficientGas.title": "Jy het nie genoeg {{currencySymbol}} om die netwerkkoste te dek nie", - "swap.warning.networkFee.allow": "Laat {{ inputTokenSymbol }} toe (een keer)", - "swap.warning.networkFee.delegation.message": "Dit is die koste om jou transaksie te verwerk en jou slim beursie op Unichain te aktiveer. Uniswap Labs ontvang geen deel van hierdie fooie nie.", - "swap.warning.networkFee.highRelativeToValue": "Die netwerkkoste oorskry 10% van jou totale transaksiewaarde. Dit is die koste om jou transaksie op die blokketting te verwerk. Uniswap ontvang geen deel van hierdie fooie nie.", - "swap.warning.networkFee.highRelativeToValue.unichain": "Die netwerkkoste oorskry 10% van jou totale transaksiewaarde. Dit is die koste om jou transaksie op die blokketting te verwerk.", - "swap.warning.networkFee.includesDelegation": "Sluit slim beursie-aktivering in", - "swap.warning.networkFee.message": "Dit is die koste om jou transaksie op die blokketting te verwerk. Uniswap ontvang geen deel van hierdie fooie nie.", - "swap.warning.networkFee.message.unichain": "Dit is die koste om jou transaksie op die blokketting te verwerk.", - "swap.warning.networkFee.message.uniswapX": "Dit is die koste om jou transaksie op die blokketting te verwerk. Uniswap ontvang geen deel van hierdie fooie nie. UniswapX versamel likiditeitsbronne vir beter pryse en gasvrye ruiltransaksies.", - "swap.warning.networkFee.message.uniswapX.title": "Geen netwerkkoste met UniswapX nie", - "swap.warning.networkFee.message.uniswapX.unichain": "Dit is die koste om jou transaksie op die blokketting te verwerk. UniswapX versamel likiditeitsbronne vir beter pryse en gasvrye ruiltransaksies.", - "swap.warning.noQuotesFound.bridging.message": "Geen oorbruggingskwotasies gevind nie. Probeer op hierdie tydstip die amptelike brug gebruik.", - "swap.warning.noQuotesFound.title": "Geen aanhalings gevind nie", - "swap.warning.noRoutesFound.message": "Daar is tans geen roetes beskikbaar vir jou geselekteerde tokens nie. Probeer asseblief 'n ander paar of kyk later weer.", - "swap.warning.noRoutesFound.title": "Geen roetes beskikbaar nie", - "swap.warning.offline.message": "Jy het dalk internetverbinding verloor of die netwerk is dalk af. Gaan asseblief jou internetverbinding na en probeer weer.", - "swap.warning.offline.title": "Jy is vanlyn", - "swap.warning.priceImpact.message": "As gevolg van die hoeveelheid {{outputCurrencySymbol}} likiditeit wat tans beskikbaar is, hoe meer {{inputCurrencySymbol}} jy probeer om te ruil, hoe minder {{outputCurrencySymbol}} sal jy ontvang.", - "swap.warning.priceImpact.message.veryHigh": "Hierdie transaksie sal 'n {{priceImpactValue}} prysimpak op die markprys van hierdie poel tot gevolg hê en sal lei tot 'n verlies aan fondse.", - "swap.warning.priceImpact.title": "Hoë prysimpak ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "Baie hoë prysimpak ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "Jou transaksie is nie ingedien nie omdat jy die program gesluit het.", - "swap.warning.queuedOrder.approvalFailed": "Jou transaksie is nie ingedien nie omdat tokengoedkeuring misluk het.", - "swap.warning.queuedOrder.stale": "Jou transaksie is nie ingedien nie omdat jy die program gesluit het of goedkeuring te lank geneem het.", - "swap.warning.queuedOrder.submissionFailed": "Kon nie jou transaksie indien nie.", - "swap.warning.queuedOrder.title": "Ruil gekanselleer", - "swap.warning.rateLimit.message": "Probeer asseblief weer oor 'n paar minute.", - "swap.warning.rateLimit.title": "Tarieflimiet oorskry", - "swap.warning.router.message": "Jy het dalk verbinding verloor of die netwerk is dalk af. As die probleem voortduur, probeer asseblief later weer.", - "swap.warning.router.title": "Hierdie handel kan nie nou voltooi word nie", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} is geblokkeer", - "swap.warning.tokenBlockedFallback.button": "Token is geblokkeer", - "swap.warning.uniswapFee.message": "Fooie word gehef om die beste ervaring met Uniswap te verseker.", - "swap.warning.uniswapFee.message.default": "Fooie word gehef om die beste ervaring met Uniswap te verseker. Daar is geen fooi verbonde aan hierdie ruil nie.", - "swap.warning.uniswapFee.message.included": "Fooie word toegepas om die beste ervaring met Uniswap te verseker, en is reeds by hierdie kwotasie ingesluit.", - "swap.warning.uniswapFee.title": "Ruil fooi", - "swap.warning.viewOnly.message": "Jy moet hierdie beursie via herstelfrase invoer om tekens te ruil.", - "swap.wrap.token": "Draai {{sym}}toe", - "tdp.balanceSummary.otherNetworks": "Op ander netwerke", - "tdp.balanceSummary.otherNetworksBalance": "Balanseer op ander netwerke", - "tdp.balanceSummary.title": "Jou balans", - "tdp.button.getToken": "Kry {{ tokenSymbol }}", - "tdp.button.getTokenFallback": "Kry Token", - "tdp.loading.title.default": "tokendata vir ", - "tdp.loading.title.withChain": "tekendata vir op {{chainName}}", - "tdp.nameNotFound": "Naam nie gevind nie", - "tdp.noInfoAvailable": "Geen tekeninligting beskikbaar nie", - "tdp.noTestnetSupportDescription": "Sommige toetsnette ondersteun nie ruil, stuur of koop van tekens nie.", - "tdp.symbolNotFound": "Simbool nie gevind nie", - "testnet.modal.swapDeepLink.description.toProdMode": "Hierdie aksie vereis dat toetsnetmodus gedeaktiveer word. Testnet-modus kan te eniger tyd binne instellings heraktiveer word.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "Hierdie aksie vereis dat toetsnetmodus geaktiveer word. Tokens op toetsnette hou geen werklike waarde in nie. Testnet-modus kan enige tyd binne instellings gedeaktiveer word.", - "testnet.modal.swapDeepLink.title.toProdMode": "Deaktiveer toetsnetmodus", - "testnet.modal.swapDeepLink.title.toTestnetMode": "Aktiveer toetsnetmodus", - "testnet.unsupported": "Hierdie funksionaliteit word nie in die toetsnetmodus ondersteun nie.", - "themeToggle.theme": "Tema", - "title.buySellTradeEthereum": "Koop, verkoop en verhandel Ethereum en ander top-tokens op Uniswap", - "title.createGovernanceOn": "Skep 'n nuwe bestuursvoorstel op Uniswap", - "title.createGovernanceTo": "Skep 'n nuwe bestuursvoorstel waaroor UNI-houers gestem kan word. UNI-tokens verteenwoordig stemgeregtigde aandele in Uniswap-bestuur.", - "title.earnFees": "Verdien fooie wanneer ander op Uniswap ruil deur tokens by likiditeitpoele te voeg.", - "title.easilyRemove": "Verwyder jou likiditeit maklik uit Uniswap v2 en deponeer in Uniswap v3.", - "title.easilyRemoveV4": "Verwyder u likiditeit maklik van Uniswap v2 en v3 om in Uniswap v4 te deponeer.", - "title.extension.uninstall": "Uitbreiding gedeïnstalleer", - "title.extensionPasskeyLogIn": "Teken aan met Wagwoord", - "title.managePasskeys": "Uniswap | Bestuur jou wagwoorde", - "title.migratev2": "Migreer v2-poellikiditeit na Uniswap v3", - "title.migratev3": "Migreer poellikiditeit na Uniswap v4", - "title.placeLimit": "Plaas limietbestellings op Uniswap", - "title.realTime": "Intydse pryse, kaarte, transaksiedata en meer.", - "title.removeLiquidityv2": "Verwyder swembadlikiditeit (v2) op Uniswap", - "title.removePoolLiquidity": "Verwyder swembadlikiditeit op Uniswap", - "title.removeTokensv2": "Verwyder jou tokens uit v2-likiditeitpoele.", - "title.removev3Liquidity": "Verwyder jou tokens uit v3-likiditeitpoele.", - "title.sendCrypto": "Stuur kripto", - "title.sendTokens": "Stuur tokens op Uniswap", - "title.swappingMadeSimple": "Koop en verkoop kripto onmiddellik op Ethereum, Base, Arbitrum, Polygon, Unichain en meer. Die DeFi-platform wat deur miljoene vertrou word.", - "title.tradeTokens": "Handel tokens en verskaf likiditeit. Intydse pryse, kaarte, transaksiedata en meer.", - "title.uniswapTradeCrypto": "Uniswap | Verhandel kripto op DeFi se toonaangewende beurs ", - "title.uniToken": "UNI-tokens verteenwoordig stemgeregtigde aandele in Uniswap-bestuur. Jy kan self oor elke voorstel stem of jou stemme aan 'n derde party delegeer.", - "title.voteOnGov": "Stem oor bestuursvoorstelle op Uniswap", - "token.balances.main": "Jou balans", - "token.balances.other": "Saldo's op ander netwerke", - "token.balances.viewOnly": "{{ownerAddress}}se balans", - "token.bridge": "{{label}} tekenbrug", - "token.chart.candlestick.unavailable": "Kandelaarkaarte is nie vir hierdie teken beskikbaar nie", - "token.chart.tooltip": "Fooie: {{amount}}", - "token.details": "Tokenbesonderhede", - "token.error.unknown": "Onbekende teken", - "token.fee.buy.label": "koop fooi", - "token.fee.label": "fooi", - "token.fee.sell.label": "verkoopfooi", - "token.links.title": "Skakels", - "token.links.twitter": "Twitter", - "token.links.website": "Webwerf", - "token.notFound.description": "Jammer, ons kan geen inligting vir hierdie teken kry nie. Gaan die naam en adres na en probeer weer.", - "token.notFound.title": "Token nie gevind nie", - "token.priceExplorer.error.description": "Iets het verkeerd geloop.", - "token.priceExplorer.error.title": "Kon nie pryskaart laai nie", - "token.priceExplorer.timeRangeLabel.all": "Van alle tye", - "token.priceExplorer.timeRangeLabel.day": "1D", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 Dag", - "token.priceExplorer.timeRangeLabel.hour": "1H", - "token.priceExplorer.timeRangeLabel.month": "1M", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 maand", - "token.priceExplorer.timeRangeLabel.week": "1W", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 Week", - "token.priceExplorer.timeRangeLabel.year": "1Y", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 Jaar", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} is nie beskikbaar nie", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} en {{tokenSymbol1}} is nie beskikbaar nie", - "token.safety.fee.detected": "Tekenfooi opgespoor", - "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs ontvang nie enige van hierdie fooie nie.", - "token.safety.warning.alwaysDoYourResearch": "Doen altyd jou navorsing", - "token.safety.warning.blocked.description.default_one": "Jy kan nie hierdie teken verhandel met die Uniswap-toepassing nie.", - "token.safety.warning.blocked.description.default_other": "Jy kan nie hierdie tokens verhandel met die Uniswap-toepassing nie.", - "token.safety.warning.copyContractAddress.message": "Dit is 'n kontrakadres, wat dien as 'n unieke identifiseerder vir tokens op die blokketting. Enige kripto wat jy na hierdie adres stuur, sal verlore gaan.", - "token.safety.warning.copyContractAddress.title": "Moenie kripto na hierdie adres stuur nie", - "token.safety.warning.dontShowWarningAgain": "Moenie weer vir my hierdie waarskuwing wys nie", - "token.safety.warning.dontShowWarningAgainShort": "Moenie weer wys nie", - "token.safety.warning.doYourOwnResearch": "Doen altyd jou eie navorsing voordat jy voortgaan.", - "token.safety.warning.feeDescription": "Laai 'n wanneer {{action}}", - "token.safety.warning.flaggedAsMalicious": "Gemerk as kwaadwillig", - "token.safety.warning.flaggedAsSuspicious": "Gemerk as verdag", - "token.safety.warning.fotHigh.title": "Hoë fooi bespeur", - "token.safety.warning.fotLow.title": "Fooi bespeur", - "token.safety.warning.fotVeryHigh.title": "Baie hoë fooi bespeur", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} is as onverkoopbaar gemerk. Om hierdie teken te ruil kan lei tot 'n verlies van jou fondse.", - "token.safety.warning.honeypot.title": "100% verkoopfooi bespeur", - "token.safety.warning.impersonator": "Verpersoonlik 'n ander teken", - "token.safety.warning.impersonator.title": "Nabootser-token bespeur", - "token.safety.warning.malicious.general.message": "{{tokenSymbol}} is deur Blockaid as kwaadwillig gemerk.", - "token.safety.warning.malicious.impersonator.message": "{{tokenSymbol}} is deur Blockaid gevlag omdat hy probeer het om 'n ander teken te kopieer. Dit is dalk nie die teken wat jy wil ruil nie.", - "token.safety.warning.malicious.impersonator.message.short": "{{tokenSymbol}} is dalk nie die teken wat jy wil ruil nie.", - "token.safety.warning.malicious.title": "Kwaadwillige teken bespeur", - "token.safety.warning.mayResultInLoss": "Om dit te ruil kan 'n verlies aan fondse tot gevolg hê.", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} word nie op toonaangewende Amerikaanse gesentraliseerde beurse verhandel nie.", - "token.safety.warning.notListedOnExchanges": "Nie gelys op toonaangewende Amerikaanse uitruilings nie", - "token.safety.warning.potentialHoneypot.card.message": "{{tokenSymbol}} is deur Blockaid as verdag gemerk.", - "token.safety.warning.potentialHoneypot.modal.message": "{{tokenSymbol}} is deur Blockaid as 'n potensiële heuningpot gemerk. Doen altyd jou eie navorsing voordat jy voortgaan.", - "token.safety.warning.potentialHoneypot.title": "Potensiële heuningpot bespeur", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} is as onverkoopbaar gemerk.", - "token.safety.warning.sellFee100.title": "100% verkoopfooi bespeur", - "token.safety.warning.spam.message": "{{tokenSymbol}} is deur Blockaid as strooipos gevlag.", - "token.safety.warning.spam.title": "Strooipos-token bespeur", - "token.safety.warning.spamsUsers": "Spams gebruikers", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} hef 'n {{buyFeePercent}} fooi wanneer dit gekoop word en {{sellFeePercent}} wanneer dit verkoop word.", - "token.safety.warning.tokenChargesFee.buy.message": "{{tokenSymbol}} hef 'n {{feePercent}} fooi wanneer dit gekoop word.", - "token.safety.warning.tokenChargesFee.buy.message.descriptive": "{{tokenSymbol}} hef 'n fooi van {{feePercent}} wanneer dit gekoop word. Om dit te ruil kan lei tot 'n verlies aan fondse. Uniswap Labs ontvang geeneen van hierdie fooie nie.", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} hef 'n {{feePercent}} fooi wanneer dit verkoop word.", - "token.safety.warning.tokenChargesFee.sell.message.descriptive": "{{tokenSymbol}} hef 'n {{feePercent}} fooi wanneer dit verkoop word. Om dit te ruil kan lei tot 'n verlies aan fondse. Uniswap Labs ontvang geeneen van hierdie fooie nie.", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} hef 'n fooi wanneer dit gekoop of verkoop word.", - "token.safetyLevel.blocked.message": "Jy kan nie hierdie token verhandel met die Uniswap Wallet nie.", - "token.safetyLevel.medium.message.plural": "Hierdie tokens word nie op toonaangewende Amerikaanse gesentraliseerde uitruilings verhandel nie. Doen altyd jou eie navorsing voordat jy voortgaan.", - "token.selector.search.error": "Kon nie soekresultate laai nie", - "token.stats.fullyDilutedValuation": "Volledig verwaterde waardasie", - "token.stats.marketCap": "Markkapitalisasie", - "token.stats.priceHighYear": "52W hoog", - "token.stats.priceLowYear": "52W laag", - "token.stats.section.about": "Ongeveer {{token}}", - "token.stats.title": "Statistieke", - "token.stats.translation.original": "Wys oorspronklike", - "token.stats.translation.translate": "Vertaal na {{language}}", - "token.stats.volume": "24h Volume", - "token.symbol.input.fallback": "Invoertoken", - "token.symbol.output.fallback": "Uitvoerteken", - "token.wrap.fail.message": "Swaps op die Uniswap-protokol kan begin en eindig met ETH. Tydens die omruiling word ETH egter in WETH toegedraai.", - "token.zeroNativeBalance.description.mainnet": "Jy sal 'n teken op Ethereum moet ruil om {{ tokenSymbol }}te kry. Omruiling vereis ETH vir netwerkkoste.", - "token.zeroNativeBalance.description.otherChains": "Jy sal 'n teken op {{ chainName }} moet omruil om {{ tokenSymbol }}te kry. Omruiling vereis {{ chainName }} {{ nativeTokenSymbol }} vir netwerkkoste.", - "token.zeroNativeBalance.subtitle": "{{ tokenSymbol }} is nie beskikbaar vir direkte aankoop nie.", - "token.zeroNativeBalance.title.mainnet": "Jy benodig {{ nativeTokenName }}", - "token.zeroNativeBalance.title.otherChains": "Jy benodig {{ nativeTokenName }} op {{ chainName }}", - "tokens.action.hide": "Versteek teken", - "tokens.action.unhide": "Versteek teken", - "tokens.nfts.action.viewOnExplorer": "Kyk op {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "Kon nie NFT-versameling laai nie", - "tokens.nfts.collection.label.items": "Items", - "tokens.nfts.collection.label.owners": "Eienaars", - "tokens.nfts.collection.label.priceFloor": "Vloer", - "tokens.nfts.collection.label.swapVolume": "Volume", - "tokens.nfts.connectEthereumToView": "Koppel 'n Ethereum-beursie om jou NFT's te sien", - "tokens.nfts.details.contract.address": "Kontrak adres", - "tokens.nfts.details.error.load.title": "Kon nie NFT-besonderhede laai nie", - "tokens.nfts.details.network": "Netwerk", - "tokens.nfts.details.owner": "Besit deur", - "tokens.nfts.details.price": "Huidige prys", - "tokens.nfts.details.recentPrice": "Laaste verkoopprys", - "tokens.nfts.details.traits": "Eienskappe", - "tokens.nfts.empty.description": "Geen NFT's gevind nie", - "tokens.nfts.error.unavailable": "Inhoud nie beskikbaar nie", - "tokens.nfts.hidden.action.hide": "Versteek NFT", - "tokens.nfts.hidden.action.unhide": "Versteek NFT", - "tokens.nfts.link.collection": "Versameling webwerf", - "tokens.nfts.list.error.load.title": "Kon nie NFT's laai nie", - "tokens.nfts.list.none.button": "Ontvang NFT's", - "tokens.nfts.list.none.description.default": "Dra NFT's van 'n ander beursie oor om te begin.", - "tokens.nfts.list.none.description.external": "Wanneer hierdie beursie NFT's koop of ontvang, sal hulle hier verskyn.", - "tokens.nfts.list.none.title": "Nog geen NFT's nie", - "tokens.nfts.notAvailableOnSolana": "NFT's is nie op Solana beskikbaar nie", - "tokens.selector.button.choose": "Kies teken", - "tokens.selector.empty.buy.message": "Koop kripto met 'n kaart of bank om tokens te stuur.", - "tokens.selector.empty.buy.title": "Koop kripto", - "tokens.selector.empty.receive.title": "Ontvang tekens", - "tokens.selector.empty.title": "Nog geen tekens nie", - "tokens.selector.error.load": "Kon nie tokens laai nie", - "tokens.selector.search.empty": "Geen resultate gevind vir {{searchText}}", - "tokens.selector.search.placeholder": "Soek tekens", - "tokens.selector.section.bridging": "Ruil oor netwerke", - "tokens.selector.section.favorite": "Gunstelinge", - "tokens.selector.section.otherNetworksSearchResults": "Tokens gevind op ander netwerke", - "tokens.selector.section.otherSearchResults": "Ander tekens op {{network}}", - "tokens.selector.section.recent": "Onlangse soektogte", - "tokens.selector.section.search": "Soek Resultate", - "tokens.selector.section.trending": "Tokens met 24H-volume", - "tokens.selector.section.yours": "Jou tekens", - "tokens.table.search.placeholder.pools": "Soek swembaddens", - "tokens.table.search.placeholder.tokens": "Soek tekens", - "tokens.table.search.placeholder.transactions": "Soek transaksies", - "toucan.auction.bidConcentration": "Toekan-konsentrasie", - "toucan.auction.bidConcentration.tooltip.description": "Toekan-nutswenkbeskrywing", - "toucan.auction.bidConcentration.tooltip.title": "Toekan-nutswenktitel", - "toucan.auctions": "Veilings", - "toucan.bidForm.maxBudget": "Maksimum begroting", - "toucan.bidForm.placeBid": "Plaas jou bod", - "toucan.displayMode.tokenPrice": "Tekenprys", - "toucan.displayMode.valuation": "Waardasie", - "transaction.action.cancel.button": "Kanselleer transaksie", - "transaction.action.cancel.description": "As jy hierdie transaksie kanselleer voordat dit deur die netwerk verwerk word, sal jy 'n nuwe netwerkkoste in plaas van die oorspronklike een betaal.", - "transaction.action.cancel.title": "Kanselleer hierdie transaksie?", - "transaction.action.clear": "Vee hangende uit", - "transaction.action.copy": "Kopieer transaksie-ID", - "transaction.action.copyProvider": "Kopieer {{providerName}} transaksie-ID", - "transaction.amount.unlimited": "Onbeperk", - "transaction.callData": "Bel data", - "transaction.details.dappName": "Toep", - "transaction.details.from": "Van", - "transaction.details.networkFee": "Netwerk koste", - "transaction.details.networkFee.swap": "Ruilnetwerkkoste", - "transaction.details.providerFee": "Verskaffersfooi", - "transaction.details.swapRate": "Koers", - "transaction.details.transaction": "Transaksie", - "transaction.details.uniswapFee": "Fooi ({{ feePercent }}%)", - "transaction.network.all": "Alle netwerke", - "transaction.networkCost.description": "Die koste om jou transaksie op die blokketting te verwerk. Uniswap is geoptimaliseer vir minimale netwerkkoste.", - "transaction.networkCost.includesSmartWalletActivation": "Sluit slim beursie-aktivering in", - "transaction.networkCost.label": "Netwerk koste", - "transaction.networkCost.maxNativeBalance.description": "'n Klein bedrag van die netwerktokensaldo word gereserveer om die netwerkkoste van hierdie transaksie te dek.", - "transaction.networkCost.maxNativeBalance.title": "Hoekom kan ek nie my maksimum balans gebruik nie?", - "transaction.networkCost.veryHigh.label": "Baie hoë netwerkkoste", - "transaction.notification.error.cancel": "Kan nie transaksie kanselleer nie", - "transaction.notification.error.replace": "Kan nie transaksie vervang nie", - "transaction.status.approval.canceled": "Goedkeuring gekanselleer", - "transaction.status.approval.failed": "Goedkeuring het misluk", - "transaction.status.approve.canceled": "Gekanselleer keur goed", - "transaction.status.approve.canceling": "Kanselleer tans goedkeuring", - "transaction.status.approve.failed": "Kon nie goedkeur nie", - "transaction.status.approve.pending": "Goedkeurend", - "transaction.status.approve.success": "Goedgekeur", - "transaction.status.approve.successDapp": "Goedgekeur op {{externalDappName}}", - "transaction.status.buy.canceled": "Gekanselleerde koop", - "transaction.status.buy.canceling": "Kanselleer koop", - "transaction.status.buy.failed": "Kon nie koop nie", - "transaction.status.buy.pending": "Koop", - "transaction.status.buy.success": "Gekoop", - "transaction.status.buy.successDapp": "Gekoop op {{externalDappName}}", - "transaction.status.claim.canceled": "Fooi-invordering gekanselleer", - "transaction.status.claim.canceling": "Kansellasiefooi-invordering", - "transaction.status.claim.failed": "Fooi-invordering het misluk", - "transaction.status.claim.pending": "Invordering van fooie", - "transaction.status.claim.success": "Fooie ingevorder", - "transaction.status.collect.fees.canceled": "Invorderingsfooie gekanselleer", - "transaction.status.collect.fees.failed": "Invorderingsfooie het misluk", - "transaction.status.collected.fees": "Gevorderde fooie", - "transaction.status.collecting.fees": "Invordering van fooie", - "transaction.status.confirm.canceled": "Gekanselleer bevestig", - "transaction.status.confirm.canceling": "Hangende kansellasie", - "transaction.status.confirm.failed": "Kon nie bevestig nie", - "transaction.status.confirm.pending": "Transaksie aan die gang", - "transaction.status.confirm.success": "Transaksie is bevestig", - "transaction.status.confirm.successDapp": "Transaksie is op {{externalDappName}}bevestig", - "transaction.status.createPair.canceled": "Skep paar gekanselleer", - "transaction.status.createPair.canceling": "Kanselleer skep paar", - "transaction.status.createPair.failed": "Kon nie paar skep nie", - "transaction.status.createPair.pending": "Skep paar", - "transaction.status.createPair.success": "Paar geskep", - "transaction.status.createPool.canceled": "Skepping van poel gekanselleer", - "transaction.status.createPool.canceling": "Kanselleer skep van poel", - "transaction.status.createPool.failed": "Kon nie poel skep nie", - "transaction.status.createPool.pending": "Skep swembad", - "transaction.status.createPool.success": "Geskep swembad", - "transaction.status.liquidityDecrease.canceled": "Verwydering van likiditeit gekanselleer", - "transaction.status.liquidityDecrease.canceling": "Kanselleer verwydering van likiditeit", - "transaction.status.liquidityDecrease.failed": "Verwyder likiditeit het misluk", - "transaction.status.liquidityDecrease.pending": "Verwydering van likiditeit", - "transaction.status.liquidityDecrease.success": "Verwyder likiditeit", - "transaction.status.liquidityIncrease.canceled": "Voeg likiditeit by gekanselleer", - "transaction.status.liquidityIncrease.canceling": "Kanselleer byvoeging van likiditeit", - "transaction.status.liquidityIncrease.failed": "Kon nie likiditeit byvoeg nie", - "transaction.status.liquidityIncrease.pending": "Byvoeging van likiditeit", - "transaction.status.liquidityIncrease.success": "Bygevoeg likiditeit", - "transaction.status.lpIncentivesClaim.canceled": "Gekanselleerde LP-beloningseis", - "transaction.status.lpIncentivesClaim.canceling": "Kanselleer LP-beloningseis", - "transaction.status.lpIncentivesClaim.failed": "Kon nie LP-belonings eis nie", - "transaction.status.lpIncentivesClaim.pending": "Eis LP-belonings op", - "transaction.status.lpIncentivesClaim.success": "LP-belonings geëis", - "transaction.status.migrateLiquidity.canceled": "Migrasie van likiditeit gekanselleer", - "transaction.status.mint.canceled": "Gekanselleerde kruisement", - "transaction.status.mint.canceling": "Kanselleer kruisement", - "transaction.status.mint.failed": "Kon nie slaan nie", - "transaction.status.mint.pending": "Muntwerk", - "transaction.status.mint.success": "Gemunt", - "transaction.status.mint.successDapp": "Gemunt op {{externalDappName}}", - "transaction.status.offramp.canceled": "Afrit gekanselleer", - "transaction.status.offramp.failed": "Afrit het misluk", - "transaction.status.offramp.pending": "Aframping", - "transaction.status.offramp.success": "Afgeramp", - "transaction.status.onramp.canceled": "Oprit gekanselleer", - "transaction.status.onramp.failed": "Aanloop het misluk", - "transaction.status.onramp.pending": "Aanryplek", - "transaction.status.onramp.success": "Opgeramp", - "transaction.status.permit.approved": "Permit goedgekeur", - "transaction.status.permit.canceled": "Permit tx gekanselleer", - "transaction.status.permit.failed": "Permit het misluk", - "transaction.status.purchase.canceled": "Gekanselleerde aankoop", - "transaction.status.purchase.canceling": "Kanselleer tans aankoop", - "transaction.status.purchase.failed": "Aankoop het misluk", - "transaction.status.purchase.failedOn": "Kon nie koop op {{serviceProvider}}nie", - "transaction.status.purchase.pending": "Koop", - "transaction.status.purchase.pendingOn": "Aankoop op {{serviceProvider}}", - "transaction.status.purchase.successOn": "Gekoop op {{serviceProvider}}", - "transaction.status.receive.canceled": "Gekanselleer ontvang", - "transaction.status.receive.canceling": "Kanselleer ontvang", - "transaction.status.receive.failed": "Ontvangs het misluk", - "transaction.status.receive.failedFrom": "Kon nie van {{serviceProvider}}ontvang nie", - "transaction.status.receive.pending": "Ontvangs", - "transaction.status.receive.pendingFrom": "Ontvang van {{serviceProvider}}", - "transaction.status.receive.success": "Ontvang", - "transaction.status.receive.successDapp": "Ontvang op {{externalDappName}}", - "transaction.status.receive.successFrom": "Ontvang van {{serviceProvider}}", - "transaction.status.removeDelegation.canceled": "Verwydering van delegering gekanselleer", - "transaction.status.removeDelegation.failed": "Verwydering van delegering het misluk", - "transaction.status.removeDelegation.pending": "Verwydering van delegering", - "transaction.status.removeDelegation.success": "Delegering verwyder", - "transaction.status.revoke.canceled": "Gekanselleer herroep", - "transaction.status.revoke.canceling": "Kanselleer herroeping", - "transaction.status.revoke.failed": "Kon nie herroep nie", - "transaction.status.revoke.pending": "Herroeping", - "transaction.status.revoke.success": "Herroep", - "transaction.status.revoke.successDapp": "Herroep op {{externalDappName}}", - "transaction.status.sale.canceled": "Gekanselleerde uitverkoping", - "transaction.status.sale.canceling": "Kanselleer uitverkoping", - "transaction.status.sale.failedOn": "Verkoping het misluk via {{serviceProvider}}", - "transaction.status.sale.pendingCard.msg": "Kom meer te wete oor die verkoop van kripto.", - "transaction.status.sale.pendingCard.title": "Hoekom is my uitverkoping nog hangende?", - "transaction.status.sale.pendingOn": "Verkoop via {{serviceProvider}}", - "transaction.status.sale.successOn": "Verkoop via {{serviceProvider}}", - "transaction.status.sell.canceled": "Verkoop gekanselleer", - "transaction.status.sell.canceling": "Kanselleer verkoop", - "transaction.status.sell.failed": "Kon nie verkoop nie", - "transaction.status.sell.pending": "Verkoop", - "transaction.status.sell.success": "Verkoop", - "transaction.status.sell.successDapp": "Verkoop op {{externalDappName}}", - "transaction.status.send.canceled": "Gekanselleer stuur", - "transaction.status.send.canceling": "Kanselleer tans stuur", - "transaction.status.send.failed": "Kon nie stuur nie", - "transaction.status.send.pending": "Stuur", - "transaction.status.send.success": "Gestuur", - "transaction.status.send.successDapp": "Gestuur op {{externalDappName}}", - "transaction.status.swap.canceled": "Ruil gekanselleer", - "transaction.status.swap.canceling": "Kanselleer tans ruil", - "transaction.status.swap.expired": "Ruil het verval", - "transaction.status.swap.failed": "Kon nie omruil nie", - "transaction.status.swap.insufficientFunds": "Onvoldoende fondse", - "transaction.status.swap.pending": "Omruil", - "transaction.status.swap.success": "Omgeruil", - "transaction.status.swap.successDapp": "Omgeruil op {{externalDappName}}", - "transaction.status.unwrap.canceled": "Ontwikkeling gekanselleer", - "transaction.status.unwrap.canceling": "Kanselleer tans ontwikkel", - "transaction.status.unwrap.failed": "Kon nie ontvou nie", - "transaction.status.unwrap.pending": "Ontwikkel", - "transaction.status.unwrap.success": "Ontwikkel", - "transaction.status.unwrap.successDapp": "Ontwikkel op {{externalDappName}}", - "transaction.status.wrap.canceled": "Gekanselleerde wrap", - "transaction.status.wrap.canceling": "Kanselleer tans omvou", - "transaction.status.wrap.failed": "Kon nie toevou nie", - "transaction.status.wrap.pending": "Toedraai", - "transaction.status.wrap.success": "Toegedraai", - "transaction.status.wrap.successDapp": "Toegedraai op {{externalDappName}}", - "transaction.submittedOn": "Ingedien op", - "transaction.summary.liquidity": "{{firstAmountWithSymbol}} en {{secondAmountWithSymbol}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} tot {{recipientAddress}}", - "transaction.summary.received.noAmount": "Ontvang van {{name}}", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} vanaf {{senderAddress}}", - "transaction.summary.sent.noAmount": "Gestuur na {{name}}", - "transaction.warning.insufficientGas.modal.message": "Jy benodig ~{{tokenAmount}} {{tokenSymbol}} () op {{networkName}} om hierdie transaksie se netwerkkoste te dek. Ruil {{tokenSymbol}} uit 'n ander ketting of koop met jou kaart om voort te gaan.", - "transaction.warning.insufficientGas.modal.message.noAction": "Jy benodig ~{{tokenAmount}} {{tokenSymbol}} () op {{networkName}} om hierdie transaksie se netwerkkoste te dek.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount": "Jy benodig ~{{tokenAmount}} {{tokenSymbol}} () op {{networkName}} om hierdie transaksie se netwerkkoste te dek.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount.noAction": "Om vir hierdie teken te ruil, benodig jy meer {{tokenSymbol}} op {{networkName}}.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "Nie genoeg {{tokenSymbol}} op {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Nie genoeg {{tokenSymbol}}nie", - "transaction.warning.maxNative.message": "Jy gaan die meeste van jou netwerktokensaldo spandeer. Dit kan onvoldoende fondse laat om toekomstige netwerkkoste te dek.", - "transaction.warning.maxNative.title": "Lae netwerktokenbalans", - "transaction.watcher.error.cancel": "Kan nie transaksie kanselleer nie", - "transaction.watcher.error.status": "Kon nie transaksiestatus nagaan nie", - "uniswapX.aggregatesLiquidity": " versamel likiditeitsbronne vir beter pryse en gasvrye ruiltransaksies.", - "uniswapX.cost": "UniswapX verwyder die tipiese koste om transaksies op die blokketting uit te voer.", - "uniswapx.description": "UniswapX versamel likiditeitsbronne vir beter pryse en gasvrye ruiltransaksies.", - "uniswapx.description.unsupported": "UniswapX is tans nie beskikbaar nie, want jou slim beursie-instellings word deur 'n ander beursie-app bestuur.", - "uniswapx.included": "Sluit UniswapXin", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "Kom meer te wete oor ruil met UniswapX", - "uniswapx.unavailable.title": "UniswapX is nie beskikbaar nie", - "uniswapx.v2QuoteFailed": "UniswapX v2 harde kwotasie het misluk. Probeer weer met klassieke ruil.", - "unitags.banner.button.claim": "Eis nou", - "unitags.banner.subtitle": "Bou 'n persoonlike web3-profiel en deel maklik jou adres met vriende.", - "unitags.banner.title.compact": "Eis jou {{unitagDomain}} gebruikersnaam op en bou jou aanpasbare profiel uit.", - "unitags.banner.title.full": "Eis jou {{unitagDomain}} gebruikersnaam op", - "unitags.choosePhoto.option.cameraRoll": "Kies uit kamerarol", - "unitags.choosePhoto.option.computer": "Laai op vanaf rekenaar", - "unitags.choosePhoto.option.nft": "Kies 'n NFT", - "unitags.choosePhoto.option.remove": "Verwyder profielfoto", - "unitags.claim.available": "Beskikbaar", - "unitags.claim.confirmation.customize": "Pas profiel aan", - "unitags.claim.confirmation.description": "{{unitagAddress}} is gereed om kripto te stuur en te ontvang. Gaan voort om jou beursie uit te bou deur jou web3-profiel aan te pas.", - "unitags.claim.confirmation.success.long": "Jy het dit!", - "unitags.claim.confirmation.success.short": "het dit!", - "unitags.claim.error.addressLimit": "Jy het reeds die maksimum aantal veranderinge aan jou gebruikernaam vir hierdie adres gemaak", - "unitags.claim.error.avatar": "Kon nie avatar stel nie. Probeer later weer.", - "unitags.claim.error.default": "Kon nie gebruikernaam eis nie. Probeer later weer.", - "unitags.claim.error.deviceLimit": "Jy het die maksimum aantal gebruikersname bereik wat aktief kan wees vir hierdie toestel", - "unitags.claim.error.general": "Kan nie gebruikernaam opeis nie", - "unitags.claim.error.unavailable": "Hierdie gebruikernaam is nie beskikbaar nie", - "unitags.claim.error.unknown": "Onbekende fout", - "unitags.claim.username.default": "jou naam", - "unitags.delete.confirm.subtitle": "Jy is op die punt om jou gebruikernaam en aanpasbare profielbesonderhede uit te vee. Jy sal dit nie kan terugeis nie.", - "unitags.delete.confirm.title": "Is jy seker?", - "unitags.editProfile.placeholder": "gebruikersnaam", - "unitags.editUsername.confirm.subtitle": "Jy is op die punt om jou gebruikersnaam te verander. Sodra jy dit verander het, kan jy dit nooit weer opeis nie.", - "unitags.editUsername.confirm.title": "Is jy seker?", - "unitags.editUsername.title": "Wysig jou gebruikersnaam", - "unitags.editUsername.warning.default": "Sodra jy jou gebruikersnaam verander het, kan jy dit nooit weer opeis nie. Jy kan dit net 2 keer verander.", - "unitags.editUsername.warning.max": "Jy het die maksimum aantal 2 gebruikernameveranderings bereik.", - "unitags.extension.intro.buttton": "Eis 'n gebruikernaam op", - "unitags.extension.intro.description": "Sê totsiens vir 0x-adresse. Gebruikersname is leesbare name wat dit makliker maak om kripto te stuur en te ontvang.", - "unitags.extension.intro.title": "Stel gebruikersname bekend", - "unitags.extension.intro.upsell.customizable": "Aanpasbare profiele", - "unitags.extension.intro.upsell.ens": "Aangedryf deur ENS subdomeine", - "unitags.extension.intro.upsell.free": "Vry om te eis", - "unitags.intro.features.ens": "Aangedryf deur ENS subdomeine", - "unitags.intro.features.free": "Vry om te eis", - "unitags.intro.features.profile": "Aanpasbare profiele", - "unitags.intro.subtitle": "Sê totsiens vir 0x-adresse. Gebruikersname is leesbare name wat dit makliker maak om kripto te stuur en te ontvang.", - "unitags.intro.title": "Stel gebruikersname bekend", - "unitags.notification.delete.error": "Kon nie gebruikernaam uitvee nie. Probeer later weer.", - "unitags.notification.delete.title": "Gebruikersnaam is uitgevee", - "unitags.notification.profile.error": "Kon nie profiel opdateer nie. Probeer later weer.", - "unitags.notification.profile.title": "Profiel opgedateer", - "unitags.notification.username.error": "Kon nie gebruikernaam verander nie. Probeer later weer.", - "unitags.notification.username.title": "Gebruikersnaam verander", - "unitags.onboarding.claim.subtitle": "Dit is jou persoonlike adres waarna mense kripto kan stuur.", - "unitags.onboarding.claim.title.choose": "Skep jou gebruikersnaam", - "unitags.onboarding.claim.title.claim": "Eis jou gebruikersnaam op", - "unitags.onboarding.info.description": "Gebruikersname transformeer komplekse 0x-adresse in leesbare name. Deur 'n {{unitagDomain}} gebruikersnaam op te eis, kan jy maklik kripto stuur en ontvang en 'n publieke web3-profiel uitbou.", - "unitags.onboarding.info.title": "'n Vereenvoudigde adres", - "unitags.onboarding.profile.subtitle": "Laai jou eie op of hou by jou unieke Unicon. Jy kan dit altyd later verander.", - "unitags.onboarding.profile.title": "Kies 'n profielfoto", - "unitags.profile.action.delete": "Vee gebruikersnaam uit", - "unitags.profile.action.edit": "Wysig gebruikernaam", - "unitags.profile.bio.label": "Bio", - "unitags.profile.bio.placeholder": "Tik 'n bio vir jou profiel", - "unitags.profile.links.twitter": "Twitter", - "unitags.username.error.chars": "Gebruikersname kan slegs letters en syfers bevat", - "unitags.username.error.max": "Gebruikersname kan nie meer as {{number}} karakters wees nie", - "unitags.username.error.min": "Gebruikersname moet ten minste {{number}} karakters wees", - "unitags.username.error.uppercase": "Gebruikersname kan slegs kleinletters en syfers bevat", - "uwulink.error.insufficientTokens": "Nie genoeg {{tokenSymbol}} op {{chain}}", - "v2.notAvailable": "Uniswap V2 is nie op hierdie netwerk beskikbaar nie.", - "wallet.appSignIn": "Meld aan met die toepassing", - "wallet.connectingAgreement": "Deur 'n beursie te koppel, stem jy in tot Uniswap Labs se Diensbepalings en stem in tot sy Privaatheidsbeleid.", - "wallet.connectionFailed.message": "Verbindingspoging het misluk. Probeer asseblief weer en volg die stappe om in jou beursie te koppel.", - "wallet.mismatch.popup.description": "Sommige funksies word nie deur jou gekoppelde beursie ondersteun nie.", - "wallet.mismatch.popup.title": "Beperkte beursie-ondersteuning", - "wallet.other": "Ander beursies", - "wallet.scanToConnect": "Skandeer QR-kode om aan te sluit", - "wallet.wrongNet": "Jou beursie is aan die verkeerde netwerk gekoppel.", - "walletConnect.dapps.empty.description": "Koppel aan 'n toepassing deur 'n kode via WalletConnect te skandeer", - "walletConnect.dapps.manage.empty.title": "Geen programme gekoppel nie", - "walletConnect.dapps.manage.title": "Verbindings", - "walletConnect.error.connection.message": "Uniswap Wallet ondersteun tans {{chainNames}}. Gebruik asseblief net \"{{dappName}}\" op hierdie kettings", - "walletConnect.error.connection.title": "Konneksie fout", - "walletConnect.error.general.message": "Daar was 'n probleem met WalletConnect. Probeer asseblief weer", - "walletConnect.error.general.title": "WalletConnect-fout", - "walletConnect.error.scantastic.message": "Daar was 'n probleem met jou QR-kode. Probeer asseblief weer", - "walletConnect.error.scantastic.title": "Ongeldige QR-kode", - "walletConnect.error.unsupported.message": "Maak seker dat jy 'n geldige WalletConnect-, Ethereum-adres of Uniswap Extension QR-kode skandeer voordat jy weer probeer.", - "walletConnect.error.unsupported.title": "Ongeldige QR-kode", - "walletConnect.error.unsupportedV1.message": "WalletConnect v1 word nie meer ondersteun nie. Die toepassing waaraan jy probeer koppel, moet opgradeer na WalletConnect v2.", - "walletConnect.error.unsupportedV1.title": "Ongeldige QR-kode", - "walletConnect.error.uwu.scan": "Daar was 'n probleem met die skandering van hierdie QR-kode.", - "walletConnect.error.uwu.title": "UwU Skakel fout", - "walletConnect.error.uwu.unsupported": "Hierdie QR-kode word nie ondersteun nie.", - "walletConnect.pending.button.connect": "Koppel", - "walletConnect.pending.button.reject": "Verwerp", - "walletConnect.pending.button.scrollDown": "Rollees af om aan te sluit", - "walletConnect.pending.threat.confirmationText": "Ek verstaan die risiko's", - "walletConnect.pending.threat.description": "Die ondertekening van boodskappe of transaksies vanaf hierdie toepassing kan lei tot 'n verlies aan fondse.", - "walletConnect.pending.threat.title": "Kwaadwillige toepassing bespeur", - "walletConnect.pending.title": "Koppel aan {{dappName}}", - "walletConnect.pending.unverified.description": "Maak seker dat jy hierdie webwerf vertrou voordat jy voortgaan. ", - "walletConnect.pending.unverified.title": "Ongeverifieerde toepassing", - "walletConnect.permissions.option.requestApprovals": "Versoek transaksiegoedkeurings", - "walletConnect.permissions.option.transferAssets": "Move funds without permission", - "walletConnect.permissions.option.viewTokenBalances": "View your balance and activity", - "walletConnect.permissions.title": "App permissions", - "walletConnect.request.bundledTransactions.label_one": "Enkelgebundelde transaksie", - "walletConnect.request.bundledTransactions.label_other": "{{count}} gebundelde transaksies", - "walletConnect.request.button.scrollDown": "Rollees af om te teken", - "walletConnect.request.button.sign": "Teken", - "walletConnect.request.details.label.function": "Funksie", - "walletConnect.request.details.label.sending": "Stuur", - "walletConnect.request.details.label.token": "Teken", - "walletConnect.request.details.label.tokens": "Tekens", - "walletConnect.request.error.insufficientFunds": "Jy het nie genoeg {{currencySymbol}} om hierdie transaksie te voltooi nie.", - "walletConnect.request.error.network": "Internet- of netwerkverbindingsfout", - "walletConnect.request.warning.batch.message": "Wees versigtig: hierdie versoek bevat veelvuldige transaksies en kan bates oordra", - "walletConnect.request.warning.general.message": "Wees versigtig: hierdie boodskap kan bates oordra", - "walletConnect.request.warning.message": "Om boodskappe of transaksies te teken, sal jy die beursie se herstelfrase moet invoer.", - "walletConnect.request.warning.title": "Hierdie beursie is in slegs-sig-modus", - "web.explore.description": "Ontdek en ondersoek tekens op {{network}}. Verken top swembaddens. Bekyk intydse pryse, handelsvolume, TVL, kaarte en transaksiedata.", - "web.explore.title.pools": "Verken top swembaddens op {{network}} op Uniswap", - "web.explore.title.tokens": "Verken top tokens op {{network}} op Uniswap", - "web.explore.title.transactions": "Verken toptransaksies op {{network}} op Uniswap" -} diff --git a/packages/uniswap/src/i18n/locales/translations/ar-SA.json b/packages/uniswap/src/i18n/locales/translations/ar-SA.json deleted file mode 100644 index a10e2e0aef2..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/ar-SA.json +++ /dev/null @@ -1,2563 +0,0 @@ -{ - "account.authHeader.claimReward": "المطالبة بمكافأة {{amount}}", - "account.cloud.backup.subtitle": "هناك العديد من عبارات الاسترداد التي تم نسخها احتياطيًا إلى {{cloudProviderName}}.", - "account.cloud.backup.title": "حدد نسخة احتياطية لاستعادتها", - "account.cloud.button.restore.android": "استعادة من جوجل درايف", - "account.cloud.button.restore.ios": "استعادة من iCloud", - "account.cloud.empty.description": "يبدو أنك لم تقم بنسخ أي من عبارات الاسترداد احتياطيًا إلى {{cloudProviderName}}.", - "account.cloud.empty.title": "تم العثور على 0 نسخ احتياطية", - "account.cloud.error.backup.message": "فشل استيراد النسخ الاحتياطية بسبب نقص الأذونات، أو انقطاع التفويض، أو بسبب خطأ في السحابة", - "account.cloud.error.backup.title": "حدث خطأ أثناء استيراد النسخ الاحتياطية", - "account.cloud.error.password.title": "رمز مرور خاطئ. حاول مرة اخرى.", - "account.cloud.error.unavailable.button.cancel": "ليس الآن", - "account.cloud.error.unavailable.button.settings": "اذهب للاعدادات", - "account.cloud.error.unavailable.message.android": "يرجى التحقق من تسجيل الدخول إلى حساب Google مع تمكين Google Drive على هذا الجهاز والمحاولة مرة أخرى.", - "account.cloud.error.unavailable.message.ios": "يرجى التحقق من تسجيل الدخول إلى معرف Apple مع تمكين iCloud Drive على هذا الجهاز والمحاولة مرة أخرى.", - "account.cloud.error.unavailable.title.android": "جوجل درايف غير متوفر", - "account.cloud.error.unavailable.title.ios": "iCloud Drive غير متوفر", - "account.cloud.loading.title": "جارٍ البحث عن النسخ الاحتياطية...", - "account.cloud.lockout.time.hours_one": "محاولات كثيرة. حاول مرة أخرى خلال ساعة واحدة.", - "account.cloud.lockout.time.hours_other": "محاولات كثيرة. حاول مرة أخرى خلال {{count}} ساعات.", - "account.cloud.lockout.time.minutes_one": "محاولات كثيرة. حاول مرة أخرى خلال دقيقة واحدة.", - "account.cloud.lockout.time.minutes_other": "محاولات كثيرة. حاول مرة أخرى خلال {{count}} دقائق.", - "account.cloud.password.input": "أدخل كلمة المرور", - "account.cloud.password.recoveryPhrase": "أدخل عبارة الاسترداد بدلاً من ذلك", - "account.cloud.password.subtitle": "كلمة المرور هذه مطلوبة لاستعادة النسخة الاحتياطية لعبارة الاسترداد من {{cloudProviderName}}.", - "account.cloud.password.title": "أدخل كلمة المرور الاحتياطية", - "account.downloadWallet.subtitle": "قم بعمل نسخة احتياطية لمحفظتك، وقم بالتداول أثناء التنقل، واحصل على تنبيهات الأسعار المباشرة، والمزيد.", - "account.drawer.gitHash": "تجزئة Git: ", - "account.drawer.gitVersion": "إصدار: ", - "account.drawer.modal.body": "قم بتخزين الرموز المميزة ومبادلةها بأمان باستخدام تطبيق Uniswap. متوفر على نظامي iOS وAndroid.", - "account.drawer.modal.dont": "ليس لديك محفظة Uniswap؟", - "account.drawer.modal.scan": "المسح باستخدام Uniswap Wallet", - "account.drawer.spamToggle": "إخفاء الرموز غير المعروفة وNFTs", - "account.passkey.delete.acknowledge": "لقد قمت بعمل نسخة احتياطية لعبارة الاسترداد الخاصة بي وأدرك أن Uniswap Labs لا يمكنها مساعدتي في استرداد محفظتي إذا فشلت في القيام بذلك.", - "account.passkey.delete.description": "تأكد من أنك قمت بعمل نسخة احتياطية لعبارة الاسترداد الخاصة بك باستخدام تطبيق Uniswap للجوال أو ملحق المتصفح.", - "account.passkey.delete.descriptionEmphasized": "بدون عبارة الاسترداد الخاصة بك، قد لا تتمكن من الوصول إلى محفظتك.", - "account.passkey.delete.speedbump.description": "قبل الاستمرار، قم بإكمال الخطوات التالية لتجنب فقدان الوصول إلى محفظتك وجميع الأموال.", - "account.passkey.delete.speedbump.step1": "قم بتنزيل تطبيق Uniswap للجوال أو ملحق المتصفح", - "account.passkey.delete.speedbump.step2": "قم بعمل نسخة احتياطية لعبارة الاسترداد الخاصة بك", - "account.passkey.delete.speedbump.title": "هل أنت متأكد؟", - "account.passkey.delete.title": "حذف مفتاح المرور؟", - "account.passkey.log.in.title": "تسجيل الدخول باستخدام مفتاح المرور", - "account.passkey.type.crossplatform": "الهاتف أو الجهاز اللوحي أو مفتاح الأمان", - "account.passkey.type.platform": "المتصفح أو نظام التشغيل", - "account.passkey.verify.button": "التحقق باستخدام مفتاح المرور", - "account.passkey.verify.description": "قبل المتابعة، يُرجى استخدام كلمة المرور للتحقق من هويتك. هذا يُساعد في الحفاظ على أمان حسابك.", - "account.passkey.verify.title": "أولاً، دعنا نتأكد من أنك أنت", - "account.portfolio.activity.canceledBelow": "تم إلغاء هذا الطلب نظرًا لأن رصيدك انخفض إلى أقل من المبلغ المُدخل.", - "account.portfolio.activity.signLimit": "لن يتم تنفيذ هذا الطلب نظرًا لأن رصيدك انخفض إلى أقل من المبلغ المُدخل. زيادة رصيدك لإصلاح.", - "account.recoveryPhrase.education.part1": "عبارة الاسترداد (أو العبارة الأولية) هي مجموعة من الكلمات مطلوبة للوصول إلى محفظتك، مثل كلمة المرور.", - "account.recoveryPhrase.education.part2": "يمكنك إدخال عبارة الاسترداد الخاصة بك على جهاز جديد لاستعادة محفظتك ومحتوياتها.", - "account.recoveryPhrase.education.part3": "ولكن، إذا فقدت عبارة الاسترداد، فسوف تفقد إمكانية الوصول إلى محفظتك.", - "account.recoveryPhrase.education.part4": "بدلاً من حفظ عبارة الاسترداد، يمكنك نسخها احتياطيًا إلى {{cloudProviderName}} وحمايتها بكلمة مرور.", - "account.recoveryPhrase.education.part5": "يمكنك أيضًا إجراء نسخ احتياطي لعبارة الاسترداد يدويًا عن طريق كتابتها وتخزينها في مكان آمن.", - "account.recoveryPhrase.education.part6": "نوصي باستخدام كلا النوعين من النسخ الاحتياطية، لأنه إذا فقدت عبارة الاسترداد، فلن تتمكن من استعادة محفظتك.", - "account.recoveryPhrase.error.invalid": "عبارة غير صالحة", - "account.recoveryPhrase.error.invalidWord": "كلمة غير صالحة: {{word}}", - "account.recoveryPhrase.error.phraseLength": "يجب أن تكون عبارة الاسترداد من 12 إلى 24 كلمة", - "account.recoveryPhrase.error.wordIsAddress": "لقد أدخلت عنوانًا، وليس عبارة استرداد", - "account.recoveryPhrase.error.wrong": "عبارة استرداد خاطئة", - "account.recoveryPhrase.helpText.import": "كيف يمكنني العثور على عبارة الاسترداد الخاصة بي؟", - "account.recoveryPhrase.helpText.restoring": "حاول البحث مرة أخرى", - "account.recoveryPhrase.input": "اكتب عبارة الاسترداد الخاصة بك", - "account.recoveryPhrase.remove.final.description": "تأكد من كتابة عبارة الاسترداد أو نسخها احتياطيًا على {{cloudProviderName}}. لن تتمكن من الوصول إلى أموالك بطريقة أخرى.", - "account.recoveryPhrase.remove.final.title": "أنت تقوم بإزالة عبارة الاسترداد ", - "account.recoveryPhrase.remove.import.description": "يمكنك تخزين عبارة استرداد واحدة فقط في كل مرة. لمواصلة استيراد واحدة جديدة، ستحتاج إلى إزالة عبارة الاسترداد الحالية وأي محافظ مرتبطة بها من هذا الجهاز.", - "account.recoveryPhrase.remove.initial.description": "سيؤدي هذا إلى إزالة محفظتك من هذا الجهاز بالإضافة إلى عبارة الاسترداد الخاصة بك.", - "account.recoveryPhrase.remove.initial.title": "أنت تقوم بإزالة {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "ستظل عبارة الاسترداد الخاصة بك مخزنة حتى تقوم بحذف جميع المحافظ المتبقية.", - "account.recoveryPhrase.subtitle.import": "سيتم تخزين عبارة الاسترداد محليًا على جهازك فقط.", - "account.recoveryPhrase.subtitle.restoring": "أدخل عبارة الاسترداد أدناه، أو حاول البحث عن النسخ الاحتياطية مرة أخرى.", - "account.recoveryPhrase.title.import": "أدخل عبارة الاسترداد الخاصة بك", - "account.recoveryPhrase.title.restoring": "لم يتم العثور على نسخ احتياطية", - "account.wallet.action.copy": "نسخ العنوان", - "account.wallet.action.manageConnections": "إدارة الاتصالات", - "account.wallet.action.report": "الملف الشخصي تقرير", - "account.wallet.action.viewExplorer": "عرض على {{blockExplorerName}}", - "account.wallet.button.add": "أضف محفظة", - "account.wallet.button.addViewOnly": "أضف محفظة للعرض فقط", - "account.wallet.button.create": "إنشاء محفظة جديدة", - "account.wallet.button.import": "استيراد محفظة جديدة", - "account.wallet.button.manage": "إعدادات المحفظة", - "account.wallet.button.remove": "إزالة المحفظة", - "account.wallet.button.watch": "مشاهدة المحفظة", - "account.wallet.create.placeholder": "المحفظة {{index}}", - "account.wallet.edit.label.input.placeholder": "تسمية المحفظة", - "account.wallet.header.button.disabled.title": "تعديل الملف الشخصي", - "account.wallet.header.button.title": "تحرير التسمية", - "account.wallet.header.viewOnly": "محافظ للعرض فقط", - "account.wallet.menu.claimUsername": "المطالبة باسم المستخدم", - "account.wallet.menu.copy.title": "انسخ عنوان المحفظة", - "account.wallet.menu.edit.title": "تحرير التسمية", - "account.wallet.menu.manageConnections": "إدارة اتصالات", - "account.wallet.menu.remove.title": "إزالة المحفظة", - "account.wallet.remove.check": "لقد قمت بعمل نسخة احتياطية من عبارة الاسترداد الخاصة بي وأدركت أن Uniswap Labs لا يمكنها مساعدتي في استعادة محفظتي إذا فشلت في القيام بذلك.", - "account.wallet.remove.title": "إزالة {{name}}", - "account.wallet.remove.viewOnly": "يمكنك دائمًا إضافة محافظ للعرض الخلفي فقط عن طريق إدخال عنوان المحفظة.", - "account.wallet.restore.new_device.description": "نظرًا لأنك تستخدم جهازًا جديدًا، فستحتاج إلى استعادة عبارة الاسترداد أو إدخال كلمة مرور النسخ الاحتياطي السحابي للمتابعة.", - "account.wallet.restore.new_device.title": "استرد محفظتك", - "account.wallet.restore.seed_phrase.description": "عبارة الاسترداد مفقودة من جهازك. لضمان عدم فقدانك الوصول إلى أموالك، سنحتاج منك استعادة محفظتك.", - "account.wallet.restore.seed_phrase.title": "استعادة محفظتك", - "account.wallet.select.error": "تعذر تحميل العناوين", - "account.wallet.select.loading.subtitle": "سوف تظهر محافظك أدناه.", - "account.wallet.select.loading.title": "البحث عن محافظ", - "account.wallet.select.smartWalletDisclaimer": "افتراضيًا، ستستخدم جميع المحافظ المؤهلة ميزات المحفظة الذكية بمجرد استيرادها. ما هي المحفظة الذكية؟", - "account.wallet.select.title_one_one": "تم العثور على محفظة واحدة", - "account.wallet.select.title_one_other": "حدد محافظ للاستيراد", - "account.wallet.viewOnly.button": "استيراد المحفظة", - "account.wallet.viewOnly.description": "لمبادلة الرموز المميزة وشرائها وإرسالها واستلامها، يتعين عليك استيراد عبارة الاسترداد الخاصة بهذه المحفظة.", - "account.wallet.viewOnly.title": "هذه المحفظة للعرض فقط", - "account.wallet.watch.error.alreadyImported": "تم استيراد هذا العنوان بالفعل", - "account.wallet.watch.error.notFound": "لم يتم العثور على العنوان", - "account.wallet.watch.error.smartContract": "العنوان هو عقد ذكي", - "account.wallet.watch.message": "تتيح لك إضافة محفظة للعرض فقط تجربة التطبيق أو تتبع المحفظة. لن تتمكن من مبادلة أو إرسال الأموال.", - "account.wallet.watch.placeholder": "إنس أو العنوان", - "account.wallet.watch.title": "أدخل عنوان المحفظة", - "activity.pending": "{{pendingActivityCount}} معلق", - "activity.transaction.lpRewards.descriptor": "{{symbol}} المكافآت التي تم جمعها", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} إلى {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} لـ {{amountWithSymbolB}}", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} و {{amountWithSymbolB}}", - "addLiquidity.shareOfPool": "حصة من بركة", - "addressInput.recipient": "متلقي", - "analytics.allow": "السماح بالتحليلات", - "analytics.allow.message": "نحن نستخدم بيانات مجهولة المصدر لتعزيز تجربتك مع منتجات Uniswap Labs.", - "appRating.button.notReally": "ليس حقيقيًا", - "appRating.description": "أخبرنا إذا كانت لديك تجربة جيدة مع هذا التطبيق", - "appRating.extension.review.description": "اختر تقييمًا نجميًا واترك مراجعة على متجر Chrome الإلكتروني.", - "appRating.extension.review.title": "مراجعة ملحق Uniswap؟", - "appRating.extension.title": "هل تستمتع بامتداد Uniswap؟", - "appRating.feedback.button.send": "ارسل رأيك", - "appRating.feedback.description": "اسمحوا لنا أن نعرف كيف يمكننا تحسين تجربتك", - "appRating.feedback.title": "نأسف لسماع ذلك.", - "appRating.mobile.title": "هل تستمتع بمحفظة Uniswap؟", - "bridgedAsset.modal.button": "استمر في المبادلة", - "bridgedAsset.modal.description": "هذه نسخة {{chainName}} من {{currencySymbol}} مدعومة وتحافظ على نفس السعر مثل النسخة الأصلية {{currencySymbol}}.", - "bridgedAsset.modal.feature.securelyBacked": "مدعومة بشكل آمن", - "bridgedAsset.modal.feature.securelyBacked.description": "1:1 مدعومة بواسطة {{currencySymbol}}الأصلية.", - "bridgedAsset.modal.feature.tradeSeamlessly": "التجارة بسلاسة", - "bridgedAsset.modal.feature.tradeSeamlessly.description": "قم بالشراء والبيع {{currencySymbol}} دون مغادرة Uniswap.", - "bridgedAsset.modal.feature.withdrawToNativeChain": "سحب إلى {{nativeChainName}}", - "bridgedAsset.modal.feature.withdrawToNativeChain.description": "العودة إلى الشبكة الأصلية في أي وقت.", - "bridgedAsset.modal.title": "تداول {{currencySymbol}} على {{chainName}}", - "bridgedAsset.send.warning.description": "أنت تُرسل نسخةً مُغلّفةً من {{currencySymbol}} إلى {{chainName}}. إرسالها إلى بورصة مركزية سيؤدي إلى خسارة دائمة للأموال.", - "bridgedAsset.send.warning.title": "تأكد من أنك ترسل إلى عنوان متوافق", - "bridgedAsset.tdp.description": "هذه نسخة جسرية من {{currencySymbol}} مدعومة بنسبة 1:1 بواسطة {{currencySymbol}}الأصلية.", - "bridgedAsset.wormhole.button": "استمر إلى الثقب الدودي", - "bridgedAsset.wormhole.description": "استمر إلى بوابة Wormhole لربط {{currencySymbol}} من {{chainName}} إلى {{nativeChainName}}.", - "bridgedAsset.wormhole.title": "سحب {{currencySymbol}} إلى {{nativeChainName}}", - "bridgedAsset.wormhole.toNativeChain": "إلى {{nativeChainName}}", - "bridgedAsset.wormhole.withdrawToNativeChain": "سحب إلى {{nativeChainName}}", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}دقيقة {{seconds}}ثانية", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}دقيقة", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}س", - "chart.candlestick": "شمعدان", - "chart.error.pools": "غير قادر على عرض البيانات التاريخية للمجمع الحالي.", - "chart.error.tokens": "غير قادر على عرض البيانات التاريخية للرمز المميز الحالي.", - "chart.line": "خط الرسم البياني", - "chart.missingData": "بيانات الرسم البياني مفقودة", - "chart.price.label.close": "يغلق", - "chart.price.label.high": "عالي", - "chart.price.label.low": "قليل", - "chart.price.label.open": "يفتح", - "chart.settings.unavailable.label": "هذا الإعداد غير متوفر للمخطط الحالي", - "claim.thanks": "شكرًا لكونك جزءًا من مجتمع Uniswap ", - "claim.uni.arrived": "وصلت UNI", - "common.about": "عن", - "common.accept": "يقبل", - "common.active": "نشيط", - "common.activeNetworks": "الشبكات النشطة", - "common.activity": "نشاط", - "common.add.label": "يضيف", - "common.add.liquidity.canceled": "إضافة السيولة الملغاة", - "common.addLiquidity": "أضف السيولة", - "common.address": "عنوان", - "common.addressOrENS": "عنوان المحفظة أو اسم ENS", - "common.advanced": "متقدم", - "common.all": "الجميع", - "common.allTime": "كل الوقت", - "common.and": "و", - "common.app": "برنامج", - "common.approved": "موافقة", - "common.approvePending": "في انتظار الموافقة...", - "common.approvePermitTx": "الموافقة على الطلب {{indexText}}", - "common.approvePermitTx.active": "الموافقة على الطلب{{indexText}} في المحفظة", - "common.approvePermitTx.explainer": "ما هي موافقات Permit2؟", - "common.approvePermitTx.pending": "جاري الموافقة على الطلب {{indexText}}...", - "common.approveSpend": "الموافقة على الإنفاق {{symbol}}", - "common.approving": "الموافقة", - "common.approximatelyValue": "~{{value}}", - "common.areYouSure": "هل أنت متأكد؟", - "common.automatic": "آلي", - "common.availableIn": "Uniswap متاح في: ", - "common.availableOnIOSAndroidChrome": "متوفر على أنظمة iOS، وAndroid، وChrome", - "common.backToPositions": "العودة إلى المواقف", - "common.bestRoute": "طريق", - "common.bestRoute.with": "الطريق عبر {{provider}}", - "common.biometrics.generic": "القياسات الحيوية", - "common.biometrics.touchId": "معرف اللمس", - "common.biometrics.windowsHello": "ويندوز هيلو", - "common.blocked.ifError": "إذا كنت تعتقد أن هذا خطأ، فيرجى إرسال بريد إلكتروني يتضمن عنوانك إلى ", - "common.blocked.reason": "تم حظر هذا العنوان على واجهة Uniswap Labs لأنه مرتبط بواحد أو أكثر من الأنشطة المحظورة .", - "common.blockedAddress": "العنوان المحظور", - "common.blog": "مدونة", - "common.bought": "مُشترى", - "common.brandAssets": "أصول العلامة التجارية", - "common.button.accept": "يقبل", - "common.button.back": "خلف", - "common.button.buy": "يشتري", - "common.button.cancel": "يلغي", - "common.button.checkin": "تحقق في", - "common.button.close": "يغلق", - "common.button.confirm": "يتأكد", - "common.button.connect": "يتصل", - "common.button.continue": "يكمل", - "common.button.copied": "نسخ", - "common.button.copy": "ينسخ", - "common.button.create": "يخلق", - "common.button.delete": "يمسح", - "common.button.disable": "إبطال", - "common.button.disabling": "تعطيل", - "common.button.disconnect": "قطع الاتصال", - "common.button.dismiss": "رفض", - "common.button.done": "منتهي", - "common.button.edit": "يحرر", - "common.button.enable": "يُمكَِن", - "common.button.finish": "ينهي", - "common.button.goBack": "عُد", - "common.button.later": "ربما في وقت لاحق", - "common.button.learn": "يتعلم أكثر", - "common.button.next": "التالي", - "common.button.notNow": "ليس الآن", - "common.button.ok": "نعم", - "common.button.paste": "معجون", - "common.button.pay": "يدفع", - "common.button.proceed": "يتابع", - "common.button.receive": "يستلم", - "common.button.remove": "يزيل", - "common.button.reset": "إعادة ضبط", - "common.button.retry": "أعد المحاولة", - "common.button.reveal": "يكشف", - "common.button.review": "مراجعة", - "common.button.save": "يحفظ", - "common.button.scrollDown": "حرك الفأرة لأسفل", - "common.button.sell": "يبيع", - "common.button.send": "يرسل", - "common.button.setup": "يثبت", - "common.button.share": "يشارك", - "common.button.showLess": "عرض أقل", - "common.button.showMore": "أظهر المزيد", - "common.button.sign": "لافتة", - "common.button.skip": "يتخطى", - "common.button.swap": "تبديل", - "common.button.tryAgain": "حاول ثانية", - "common.button.understand": "أفهم", - "common.button.unlock": "الغاء القفل", - "common.button.view": "منظر", - "common.button.viewDetails": "عرض التفاصيل", - "common.button.yes": "نعم", - "common.buy.label": "يشتري", - "common.buyAndSell": "البيع والشراء على Uniswap", - "common.cancellationSubmitted": "تم إرسال الإلغاء", - "common.cancellationSuccessful": "تم الإلغاء بنجاح", - "common.cancelOrder": "الغاء الطلب", - "common.card.error.description": "هناك خطأ ما", - "common.card.error.title": "أُووبس! هناك خطأ ما.", - "common.careers": "وظائف", - "common.chain.networkCost": "{{chain}} تكلفة الشبكة", - "common.chart": "جدول", - "common.checkNetwork": "تحقق من حالة الشبكة هنا.", - "common.chromeExtension": "امتداد", - "common.claim.failed": "فشلت المطالبة", - "common.claimed": "ادعى", - "common.claiming": "المطالبة", - "common.claimUnis": "المطالبة برموز UNI الخاصة بك", - "common.clear": "واضح", - "common.close": "يغلق", - "common.closed": "مغلق", - "common.collect.button": "يجمع", - "common.company": "شركة", - "common.confirm": "يتأكد", - "common.confirmCancellation": "تأكيد الالغاء", - "common.confirmed": "مؤكد", - "common.confirmSend.button": "تأكيد الإرسال", - "common.confirmSwap": "تأكيد المبادلة في المحفظة", - "common.confirmTimedOut": "انتهت مهلة التأكيد. الرجاء اعادة المحاولة.", - "common.confirmTransfer": "تأكيد التحويل", - "common.confirmWallet": "تأكيد في المحفظة", - "common.connect.button": "يتصل", - "common.connectAWallet.button": "قم بتوصيل المحفظة", - "common.connectAWallet.button.evm": "ربط محفظة الإيثريوم", - "common.connectAWallet.button.evm.switch": "تبديل محفظة الإيثريوم", - "common.connectAWallet.button.svm": "ربط محفظة سولانا", - "common.connectAWallet.button.svm.switch": "محفظة سويتش سولانا", - "common.connectAWallet.button.switch": "تبديل المحفظة", - "common.connectTo": "الاتصال بـ {{platform}}", - "common.connectWallet.button": "ربط المحفظة", - "common.contactUs.button": "اتصل بنا", - "common.copied": "نسخ", - "common.copy.address": "نسخ العنوان", - "common.copy.poolId": "نسخ معرف المجمع", - "common.copyLink.button": "نسخ الوصلة", - "common.created.date": "تم الإنشاء {{date}}", - "common.currency": "عملة", - "common.currentPrice": "السعر الحالي", - "common.custom": "مخصص", - "common.customRange": "مجموعة مخصصة", - "common.dataOutdated": "قد تكون البيانات قديمة", - "common.day": "يوم", - "common.default": "تقصير", - "common.defaultTradeOptions": "خيارات التجارة الافتراضية", - "common.deposit.toNetwork": "قم بإيداع الرموز المميزة في شبكة {{label}} .", - "common.depositing": "الإيداع", - "common.depositTokens": "إيداع الرموز", - "common.detected": "مُكتَشَف", - "common.developers": "المطورين", - "common.device": "هذا الجهاز", - "common.device.other": "جهاز آخر", - "common.dismiss": "رفض", - "common.docs": "المستندات", - "common.donate": "يتبرع", - "common.done": "منتهي", - "common.dontShowAgain": "لا تعرض هذا مرة أخرى", - "common.download": "تحميل", - "common.downloadAppStore": "تنزيل في متجر التطبيقات", - "common.downloadPlayStore": "تنزيل في متجر Play", - "common.downloadUniswapApp": "قم بتحميل تطبيق يونيسواب", - "common.downloadUniswapWallet": "تنزيل محفظة Uniswap", - "common.dynamic": "متحرك", - "common.edit.button": "يحرر", - "common.ended": "انتهت", - "common.error.details": "تفاصيل الخطأ", - "common.error.general": "هناك خطأ ما", - "common.error.label": "خطأ", - "common.error.request": "عذرًا، حدث خطأ أثناء معالجة طلبك. إذا طلبت الدعم، فتأكد من نسخ تفاصيل هذا الخطأ.", - "common.error.somethingWrong": "هناك خطأ ما!", - "common.errorConnecting.error": "خطأ في الإتصال", - "common.errorLoadingData.error": "حدث خطأ أثناء تحميل البيانات", - "common.etherscan": "اثيرسكان", - "common.expiry": "انقضاء", - "common.explore": "يستكشف", - "common.explorer": "إكسبلورر", - "common.exploreTokens": "استكشاف الرموز", - "common.extension": "ملحق يونيسواب", - "common.failedSwitchNetwork": "فشل في تبديل الشبكات", - "common.fee": "مصاريف", - "common.fees": "مصاريف", - "common.feesEarned": "الرسوم المكتسبة", - "common.feesEarnedPerBase": "{{symbolA}} لكل {{symbolB}}", - "common.for": "ل", - "common.free": "حر", - "common.fullRange": "مجموعة كاملة", - "common.getApp": "احصل على التطبيق", - "common.getHelp.button": "احصل على مساعدة", - "common.getStarted": "البدء", - "common.getSupport.button": "احصل على الدعم", - "common.getTheApp": "احصل على التطبيق", - "common.getUniswapWallet": "احصل على محفظة Uniswap", - "common.getUniswapWallet.mobile": "احصل على تطبيق Uniswap للجوال", - "common.governance": "الحكم", - "common.happyHolidays": "إجازة سعيدة من فريق Uniswap!", - "common.help": "يساعد", - "common.helpCenter": "مركز المساعدة", - "common.hidden": "مختفي", - "common.hide.button": "يخفي", - "common.highPrice": "غالي السعر", - "common.includes": "يشمل", - "common.info.label": "معلومات", - "common.input.noRecipient.error": "حدد المستلم", - "common.input.password.confirm": "تأكيد كلمة المرور", - "common.input.password.error.mismatch": "كلمات المرور غير متطابقة", - "common.input.password.error.weak": "كلمة المرور هذه ضعيفة جدًا", - "common.input.password.new": "كلمة المرور الجديدة", - "common.input.password.placeholder": "كلمة المرور", - "common.input.password.strength.medium": "واسطة", - "common.input.password.strength.strong": "قوي", - "common.input.password.strength.weak": "ضعيف", - "common.input.search": "يبحث", - "common.insufficient.funds": "رصيد غير كاف", - "common.insufficientBalance.error": "رصيد غير كاف", - "common.insufficientFundsForNetworkFee.error": "عدم كفاية الأموال لتغطية تكاليف الشبكة", - "common.insufficientTokenBalance.error": "رصيد {{tokenSymbol}} غير كافي", - "common.insufficientTokenBalance.error.simple": "لا يكفي {{tokenSymbol}}", - "common.invalidPair": "زوج غير صالح", - "common.invalidRecipient.error": "مستلم غير صالح", - "common.iOSAndroid": "iOS وأندرويد", - "common.language": "لغة", - "common.learnMoreSwap": "تعلم المزيد عن المقايضة", - "common.legalAndPrivacy": "القانونية والخصوصية", - "common.less": "أقل", - "common.limit.cancel_one": "إلغاء الحد", - "common.limit.cancel_other": "إلغاء {{count}} الحدود", - "common.limit.canceled": "تم إلغاء الحد", - "common.limit.executed": "تم تنفيذ الحد", - "common.limit.expired": "انتهى الحد", - "common.limit.failed": "فشل الحد", - "common.limit.opened": "تم فتح الحد", - "common.limit.pending": "الحد معلق", - "common.limits": "حدود", - "common.limits.approachMax": "يقترب من 100 الحد الأقصى", - "common.limits.cancelProceed": "قم بإلغاء الحدود للمتابعة", - "common.limits.expires": "تنتهي الصلاحية {{timestamp}}", - "common.limits.open": "حدود مفتوحة", - "common.limits.when": "عندما {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "روابط", - "common.liquidity": "السيولة", - "common.liquidity.provision": "توفير السيولة", - "common.liquidity.removed": "تمت إزالة السيولة", - "common.loading": "تحميل", - "common.longText.button.less": "أقرأ أقل", - "common.longText.button.more": "اقرأ أكثر", - "common.lowPrice": "سعر منخفض", - "common.manage": "يدير", - "common.market.label": "سوق", - "common.marketPrice": "سعر السوق", - "common.marketPrice.fetching": "جاري جلب سعر السوق...", - "common.marketPrice.label": "سعر السوق:", - "common.marketPrice.unavailable": "لم يتم العثور على سعر السوق. يُرجى إجراء بحثك الخاص لتجنب خسارة الأموال.", - "common.max": "الأعلى", - "common.message": "رسالة", - "common.migrate": "يهاجر", - "common.migrate.liquidity.failed": "فشل ترحيل السيولة", - "common.migrate.position": "نقل الموقع", - "common.migrated.liquidity": "السيولة المهاجرة", - "common.migrating.liquidity": "هجرة السيولة", - "common.min": "الحد الأدنى", - "common.more": "أكثر", - "common.moreDetails": "مزيد من التفاصيل", - "common.navigation.settings": "إعدادات", - "common.navigation.systemSettings": "إعدادات", - "common.navigationButton": "زر التنقل", - "common.needHelp": "تحتاج مساعدة؟", - "common.networkCost": "تكلفة الشبكة", - "common.neverMind": "لا تهتم", - "common.new": "جديد", - "common.new.exclamation": "جديد!", - "common.nft": "NFT", - "common.nfts": "الرموز غير القابلة للاستبدال", - "common.noAmount.error": "أدخل المبلغ", - "common.noData": "لايوجد بيانات", - "common.none": "لا أحد", - "common.noResults": "لم يتم العثور على نتائج.", - "common.notAvailableInRegion.error": "غير متوفر في منطقتك", - "common.notCreated.label": "لم يتم إنشاؤه", - "common.notSupported": "غير مدعوم", - "common.oneDay": "يوم 1", - "common.oneDay.short": "1د", - "common.oneHour.short": "1 ح", - "common.oneMonth": "شهر واحد", - "common.oneWeek": "أسبوع 1", - "common.oneYear": "1 سنة", - "common.opensea.link": "عرض على OpenSea", - "common.orderCanceled": "تم إلغاء الطلب", - "common.orderExecuted": "تم تنفيذ الأمر", - "common.orderExpired": "انتهت صلاحية الطلب", - "common.orderPending": "انتظار الطلب", - "common.outOfRange": "خارج النطاق", - "common.pageNotFound": "الصفحة غير موجودة!", - "common.passkey.count": "مفتاح المرور {{number}}", - "common.passkeys": "مفاتيح المرور", - "common.passkeys.add": "إضافة مفتاح المرور", - "common.passkeys.add.description": "اختر المكان الذي تريد حفظ مفتاح المرور الجديد فيه.", - "common.pastDay": "اليوم السابق", - "common.pastFiveMinutes": "الخمس دقائق الماضية", - "common.pastHour": "ساعة الماضية", - "common.pastMonth": "الشهر الماضي", - "common.pastWeek": "الأسبوع الماضي", - "common.pastYear": "السنة الفائتة", - "common.pending": "قيد الانتظار", - "common.pending.cancellation": "في انتظار الإلغاء", - "common.pendingEllipsis": "قيد الانتظار...", - "common.permit": "يسمح", - "common.plusMore": "+{{number}} المزيد", - "common.pool": "حمام سباحة", - "common.pools": "حمامات سباحة", - "common.portfolio": "مَلَفّ", - "common.poweredBy": "مدعوم بواسطة ", - "common.price": "سعر", - "common.priceUpdated": "تم تحديث السعر", - "common.privacyChoices": "خيارات الخصوصية الخاصة بك", - "common.privacyChoices.checkbox.description": "عند تحديد هذا المربع، لن نشارك بياناتك مع شركاء تابعين لجهات خارجية لأغراض الدعاية المخصصة. يمكنك تمكين المشاركة في أي وقت عن طريق إلغاء تحديد هذا المربع.", - "common.privacyChoices.checkbox.label": "لا تشارك معلوماتي", - "common.privacyChoices.description": "يجوز لنا مشاركة معرفات الأجهزة مع شركائنا الإعلانيين للترويج لخدماتنا على مواقع الويب والمنصات الأخرى. عندما يكون هذا مؤهلاً كبيع أو مشاركة أو إعلان مستهدف بموجب القوانين المعمول بها، يمكنك إلغاء الاشتراك من خلال تحديد مربع \"عدم مشاركة معلوماتي\". لمزيد من المعلومات حول ممارسات الخصوصية لدينا، يرجى مراجعة سياسة الخصوصية الخاصة بنا.", - "common.privacyChoices.disclaimer": "يرجى ملاحظة أن اختيارك سينطبق فقط على هذا المتصفح على هذا الجهاز. يمكنك أيضًا إلغاء الاشتراك من خلال تمكين إعداد التحكم العالمي في الخصوصية ضمن المتصفح الذي تستخدمه للوصول إلى خدماتنا. للاطلاع على المزيد من الخيارات، انتقل إلى الإعدادات.", - "common.privacyPolicy": "سياسة الخصوصية", - "common.proceed": "يتابع", - "common.proceedInWallet": "المضي قدما في محفظتك", - "common.products": "منتجات", - "common.protocol": "بروتوكول", - "common.protocol.v2": "Uniswap الإصدار 2", - "common.protocol.v3": "Uniswap الإصدار 3", - "common.protocol.v4": "Uniswap الإصدار 4", - "common.purchased": "تم شراؤها", - "common.rate": "معدل", - "common.readMore": "اقرأ أكثر", - "common.receive": "يستلم", - "common.received": "تلقى", - "common.recent": "مؤخرًا", - "common.refresh": "ينعش", - "common.reload.label": "أعد تحميل التطبيق", - "common.remove.label": "يزيل", - "common.remove.liquidity.canceled": "إزالة السيولة الملغاة", - "common.remove.liquidity.failed": "فشل إزالة السيولة", - "common.removing.liquidity": "إزالة السيولة", - "common.resetLimit": "إعادة تعيين {{symbol}} الحد", - "common.resetLimitWallet": "إعادة تعيين {{symbol}} الحد في المحفظة", - "common.resettingLimit": "إعادة تعيين {{symbol}} الحد...", - "common.revoke.approval.failed": "فشل إلغاء الموافقة", - "common.revoked.approval": "تم إلغاء الموافقة", - "common.revoking.approval": "إلغاء الموافقة", - "common.scanQRDownload": "امسح رمز الاستجابة السريعة ضوئيًا باستخدام هاتفك للتنزيل", - "common.selectRegion.label": "اختر منطقتك", - "common.selectToken.label": "حدد رمزًا مميزًا", - "common.sell.label": "يبيع", - "common.send.button": "يرسل", - "common.send.failed": "فشل إرسال", - "common.sending": "إرسال", - "common.sent": "مرسل", - "common.settings": "إعدادات", - "common.share": "يشارك", - "common.share.shareToTwitter": "شارك على تويتر", - "common.show.button": "يعرض", - "common.showLess.button": "عرض أقل", - "common.showMore.button": "أظهر المزيد", - "common.signatureExpired": "لقد انتهت صلاحية توقيعك.", - "common.signMessage": "توقيع الرسالة", - "common.signMessageWallet": "تسجيل الرسالة في المحفظة", - "common.socials": "وسائل التواصل الاجتماعي", - "common.sold": "مُباع", - "common.stats": "احصائيات", - "common.status": "حالة", - "common.step.number": "الخطوة {{number}}", - "common.step.number.of": "الخطوة {{current}} من {{total}}", - "common.swap": "تبديل", - "common.swap.expired": "انتهت صلاحية المبادلة", - "common.swap.failed": "فشل المبادلة", - "common.swapPending": "المبادلة معلقة...", - "common.termsOfService": "شروط الخدمة", - "common.text.connected": "متصل", - "common.text.contract": "عقد", - "common.text.disconnected": "انقطع الاتصال", - "common.text.error": "خطأ", - "common.text.notAvailable": "لا يوجد", - "common.text.recipient": "ل", - "common.text.sender": "من", - "common.text.unknown": "مجهول", - "common.thisAccount": "هذا الحساب", - "common.thisMonth": "هذا الشهر", - "common.thisToken": "هذه الرمز", - "common.thisWeek": "هذا الاسبوع", - "common.thisYear": "هذا العام", - "common.time": "وقت", - "common.time.minute.amt": "{{time}}م", - "common.time.minutes": "دقائق", - "common.time.past.days": "{{days}} أيام", - "common.time.past.days.short": "{{days}}د", - "common.time.past.hours": "{{hours}} ساعات", - "common.time.past.hours.short": "{{hours}}ح", - "common.time.past.minutes.short": "{{minutes}}م", - "common.time.past.months.short": "{{months}}مو", - "common.time.past.seconds.short": "{{seconds}}س", - "common.to": "ل", - "common.today": "اليوم", - "common.tokenA": "الرمز أ", - "common.tokenAmount": "مبلغ رمزي", - "common.tokenB": "الرمز ب", - "common.tokenName": "اسم الرمز المميز", - "common.tokens": "الرموز", - "common.totalUniswapTVL": "إجمالي Uniswap TVL", - "common.totalValueLocked": "تفل", - "common.trade": "تجارة", - "common.trademarkPolicy": "سياسة العلامات التجارية", - "common.transactionDetails": "تفاصيل الصفقه", - "common.transactionId": "رقم المعاملة", - "common.transactionPending": "الصفقة معلقة", - "common.transactions": "المعاملات", - "common.transactionSettings": "إعدادات المعاملات", - "common.transfer_one": "تحويل", - "common.transfer_other": "التحويلات", - "common.tryAgain.error": "حاول ثانية", - "common.twitter": "تويتر", - "common.type.label": "يكتب", - "common.unavailable": "غير متوفره", - "common.unhide": "إظهار", - "common.unichain": "يوني تشين", - "common.uniswapMobile": "يونيسواب موبايل", - "common.uniswapWallet": "محفظة يونيسواب", - "common.uniswapX": "يونيسوابكس", - "common.unknown": "مجهول", - "common.unknownError.error": "خطأ غير معروف", - "common.unwrap.button": "بسط", - "common.unwrap.failed": "فشل إلغاء التغليف", - "common.unwrapped": "يفك ربطة", - "common.unwrapping": "فك التغليف", - "common.view.profile": "عرض الملف الشخصي", - "common.viewOnExplorer": "عرض على اكسبلورر", - "common.volume": "مقدار", - "common.vote": "تصويت", - "common.wallet.approve": "الموافقة في المحفظة", - "common.wallet.label": "محفظة", - "common.warning": "تحذير", - "common.webApp": "التطبيق على شبكة الإنترنت", - "common.website": "موقع إلكتروني", - "common.whyApprove": "لماذا يتعين علي الموافقة على الرمز المميز؟", - "common.whySign": "لماذا التوقيعات مطلوبة؟", - "common.whyWrap": "لماذا يجب علي أن أغلف {{symbol}}؟", - "common.withdraw": "ينسحب", - "common.withdrawal.amount": "مبلغ السحب", - "common.withinRange": "في النطاق", - "common.wrap": "التفاف {{symbol}}", - "common.wrap.failed": "فشل الالتفاف", - "common.wrapIn": "لف {{symbol}} في المحفظة", - "common.wrapped": "مغطى", - "common.wrapping": "يلف", - "common.wrappingToken": "التفاف {{symbol}}...", - "common.yesterday": "أمس", - "common.your.account.had.insufficient.funds": "لم يكن لدى حسابك أموال كافية لإكمال عملية المبادلة هذه.", - "common.your.account.has.insufficient.funds": "لا يحتوي حسابك على أموال كافية لإكمال عملية المبادلة هذه.", - "common.your.connected.wallet": "محفظتك المتصلة", - "common.your.limit.could.not.be.fulfilled": "لا يمكن الوفاء بالحد الخاص بك في هذا الوقت. حاول مرة اخرى.", - "common.your.swap.could.not.be.fulfilled": "لا يمكن تنفيذ المبادلة الخاصة بك في هذا الوقت. حاول مرة اخرى.", - "common.youreBuying": "أنت تشتري", - "common.youReceive": "انت تستقبل", - "common.youreSelling": "انت تبيع", - "currency.ars": "البيزو الأرجنتيني", - "currency.aud": "دولار استرالي", - "currency.brl": "ريال برازيلي", - "currency.cad": "الدولار الكندي", - "currency.cny": "اليوان الصيني", - "currency.cop": "البيزو الكولومبي", - "currency.eur": "اليورو", - "currency.gbp": "الجنيه البريطاني", - "currency.hkd": "الدولار هونج كونج", - "currency.idr": "الروبية الاندونيسية", - "currency.inr": "الروبية الهندية", - "currency.jpy": "الين الياباني", - "currency.krw": "الوون الكوري الجنوبي", - "currency.mxn": "البيزو المكسيكي", - "currency.ngn": "نيرة نيجيرية", - "currency.pkr": "روبية باكستانية", - "currency.rub": "الروبل الروسي", - "currency.sgd": "دولار سينغافوري", - "currency.try": "الليرة التركية", - "currency.uah": "الهريفنيا الأوكرانية", - "currency.usd": "دولار الولايات المتحدة", - "currency.vnd": "دونغ الفيتنامية", - "dapp.request.actionCannotBeCompleted.description": "بعض الوظائف غير متاحة لأن إعدادات محفظتك الذكية يتم إدارتها بواسطة تطبيق محفظة مختلف.", - "dapp.request.actionCannotBeCompleted.header": "طلب التوقيع", - "dapp.request.actionCannotBeCompleted.title": "لا يمكن إكمال الإجراء", - "dapp.request.approve.action": "يعتمد", - "dapp.request.approve.fallbackTitle": "الموافقة على هذا الموقع للوصول إلى الرموز المميزة", - "dapp.request.approve.helptext": "السماح لهذا الموقع بالوصول إلى هذا الرمز المميز وإنفاقه للمعاملات. تأكد من ثقتك بهذا الموقع.", - "dapp.request.approve.label": "محفظة", - "dapp.request.approve.title": "الموافقة على الوصول إلى {{tokenSymbol}}", - "dapp.request.base.title": "طلب الصفقة", - "dapp.request.bridge.description": "انقل ETH وUSDC والمزيد عبر شبكات {{numChains}}+.", - "dapp.request.bridge.title": "تحاول الجسر؟", - "dapp.request.connect.helptext": "اسمح لهذا الموقع بعرض عنوان محفظتك ورصيدك وطلب الموافقات على المعاملات.", - "dapp.request.connect.title": "الاتصال بالموقع", - "dapp.request.fallback.calldata.label": "مسودة بيانات", - "dapp.request.fallback.function.label": "وظيفة", - "dapp.request.permit2.description": "يدير Permit2 موافقات الرمز المميز عبر تطبيقات dapp متعددة.", - "dapp.request.permit2.header": "تصريح التوقيع2", - "dapp.request.permit2approve.action": "يعتمد", - "dapp.request.permit2approve.helptext": "يدير Permit2 موافقات الرمز المميز عبر تطبيقات dapp متعددة.", - "dapp.request.permit2approve.title": "الموافقة على التصريح 2", - "dapp.request.reject.action": "رفض الكل", - "dapp.request.reject.info": "لديك {{totalRequestCount}} طلبات المعاملات", - "dapp.request.revoke.action": "سحب او إبطال", - "dapp.request.revoke.helptext": "اسمح لهذا الموقع بإلغاء الوصول إلى إنفاق هذا الرمز المميز للمعاملات. تأكد من ثقتك بهذا الموقع.", - "dapp.request.revoke.title": "قم بإلغاء الوصول إلى {{tokenSymbol}}", - "dapp.request.signature.containsUnrenderableCharacters": "تحتوي هذه الرسالة على أحرف غير قابلة للعرض. تأكد من ثقتك بهذا الموقع.", - "dapp.request.signature.decodeError": "فشل في فك تشفير الرسالة", - "dapp.request.signature.header": "طلب التوقيع", - "dapp.request.signature.irregular": "طلب توقيع غير منتظم", - "dapp.request.signature.irregular.description": "تأكد من ثقتك بهذا الموقع قبل المتابعة", - "dapp.request.signature.irregular.understand": "أنا أفهم المخاطر", - "dapp.request.signature.toggleDataView.raw": "عرض البيانات الخام", - "dapp.request.signature.toggleDataView.readable": "عرض البيانات الأصلية", - "dapp.request.warning.notActive.message": "تأكد من أنه هو الصحيح", - "dapp.request.warning.notActive.title": "هذه ليست محفظتك النشطة", - "delegation.upgradeModal.description": "يستخدم تحديث المحفظة هذا عقودًا ذكية لإجراء معاملات أسرع وأقل تكلفة. تعرف على المزيد", - "delegation.upgradeModal.enableSmartWallet": "تمكين المحفظة الذكية", - "delegation.upgradeModal.title": "مبادلات أكثر ذكاءً وتكاليف أقل", - "downloadApp.modal.connectExistingWallet": "ربط المحفظة الحالية", - "downloadApp.modal.getStarted.description": "احصل على إمكانية الوصول إلى آلاف الرموز المميزة على الفور من خلال أكبر سوق على السلسلة في العالم.", - "downloadApp.modal.getStarted.title": "ابدأ التبديل في ثوانٍ", - "downloadApp.modal.getTheApp.title": "ابدأ مع Uniswap", - "downloadApp.modal.uniswapProducts.subtitle": "تعمل منتجات Uniswap معًا بسلاسة لإنشاء أفضل تجربة على السلسلة.", - "empty.swap.button.text": "إضافة الأموال للمبادلة", - "error.dataUnavailable": "البيانات غير متوفرة في الوقت الراهن؛ نحن نعمل على حل المشكلة", - "error.id": "معرف الخطأ: {{eventId}}", - "error.jupiterApi.execute.default.title": "حدث خطأ في واجهة برمجة تطبيقات جوبيتر. يُرجى المحاولة مرة أخرى.", - "error.jupiterApi.failedToLand": "(الرمز {{code}}: فشلت المعاملة في الوصول إلى الشبكة)", - "error.jupiterApi.invalidBlockHeight": "(الرمز -1004: ارتفاع كتلة غير صالح)", - "error.jupiterApi.invalidMessageBytes": "(الرمز -3: بايتات الرسالة غير صالحة)", - "error.jupiterApi.invalidPayload": "(الرمز -2002: حمولة غير صالحة)", - "error.jupiterApi.invalidSignedTransaction": "(الرمز -2: معاملة موقعة غير صالحة)", - "error.jupiterApi.invalidTransaction": "(الرمز -1002: معاملة غير صالحة)", - "error.jupiterApi.missingCachedOrder": "(الرمز -1: طلب مخزن مؤقتًا مفقود)", - "error.jupiterApi.notFullySigned": "(الرمز -1003: المعاملة غير موقعة بالكامل)", - "error.jupiterApi.quoteExpired": "انتهت صلاحية هذا الاقتباس، يُرجى المحاولة مرة أخرى. (الرمز -2003)", - "error.jupiterApi.unknownErrorCode": "(الرمز {{code}})", - "error.noData": "لاتوجد بيانات", - "error.request.provideId": "عذرًا، حدث خطأ أثناء معالجة طلبك. إذا طلبت الدعم، فتأكد من تقديم معرف الخطأ الخاص بك.", - "error.tokenApproval": "فشلت الموافقة على الرمز المميز", - "error.tokenApproval.message": "من المحتمل أن مشكلة في الشبكة أو الاتصال تسببت في فشل موافقتك. تحقق من اتصالك وحاول مرة أخرى.", - "error.tokenApprovalEdited": "مبلغ الموافقة غير كاف", - "error.tokenApprovalEdited.message": "مبلغ الموافقة المحدد في محفظتك منخفض للغاية لإتمام هذه المعاملة. يرجى المحاولة مرة أخرى وزيادة المبلغ.", - "errors.crash.message": "لقد تحطم شيء ما.", - "errors.crash.restart": "أعد تشغيل التطبيق", - "errors.crash.title": "اه أوه!", - "explore.more.pools": "اكتشف المزيد من المسابح", - "explore.more.unichain": "استكشف حمامات سباحة Unichain", - "explore.search.label.ownedBy": "يملكها {{ownerAddress}}", - "explore.search.placeholder": "بحث الرموز والمحافظ", - "explore.search.section.nft": "مجموعات NFT", - "explore.search.section.popularNFT": "مجموعات NFT الشهيرة", - "explore.search.section.wallets": "محافظ", - "explore.tokens.error": "تعذر تحميل الرموز المميزة", - "explore.tokens.favorite.action.add": "الرمز المفضل", - "explore.tokens.favorite.action.edit": "تحرير المفضلة", - "explore.tokens.favorite.action.remove": "إزالة المفضلة", - "explore.tokens.favorite.title.default": "الرموز المفضلة", - "explore.tokens.favorite.title.edit": "تحرير الرموز المفضلة", - "explore.tokens.metadata.marketCap": "{{number}} مكاب", - "explore.tokens.metadata.totalValueLocked": "{{number}} تلفزيون إل", - "explore.tokens.metadata.volume": "{{number}} المجلد", - "explore.tokens.sort.label.marketCap": "القيمة السوقية", - "explore.tokens.sort.label.priceDecrease": "انخفاض الأسعار", - "explore.tokens.sort.label.priceIncrease": "زيادة الأسعار", - "explore.tokens.sort.label.totalValueLocked": "تفل", - "explore.tokens.sort.label.volume": "مقدار", - "explore.tokens.sort.option.marketCap": "القيمة السوقية", - "explore.tokens.sort.option.priceDecrease": "انخفاض السعر (24 ساعة)", - "explore.tokens.sort.option.priceIncrease": "زيادة الأسعار (24 ساعة)", - "explore.tokens.sort.option.totalValueLocked": "يونيسواب TVL", - "explore.tokens.sort.option.volume": "حجم Uniswap (24 ساعة)", - "explore.tokens.top.title": "أعلى الرموز", - "explore.v2TVL": "v2 TVL", - "explore.v3TVL": "الإصدار 3 TVL", - "explore.v4TVL": "v4 TVL", - "explore.wallets.favorite.action.add": "المحفظة المفضلة", - "explore.wallets.favorite.action.edit": "تحرير المفضلة", - "explore.wallets.favorite.action.remove": "إزالة المفضلة", - "explore.wallets.favorite.action.remove.short": "غير مفضل", - "explore.wallets.favorite.title.default": "المحافظ المفضلة", - "explore.wallets.favorite.title.edit": "تحرير المحافظ المفضلة", - "extension.connection.network": "شبكة", - "extension.connection.networks": "الشبكات", - "extension.connection.popup.trouble": "هل تواجه مشكلة في الاتصال؟", - "extension.connection.titleConnected": "متصل", - "extension.connection.titleNotConnected": "غير متصل", - "extension.lock.button.forgot": "هل نسيت كلمة السر?", - "extension.lock.button.reset": "إعادة ضبط المحفظة", - "extension.lock.button.submit": "الغاء القفل", - "extension.lock.password.error": "كلمة مرور خاطئة. حاول ثانية", - "extension.lock.password.reset.initial.description": "لا يمكن لـ Uniswap مساعدتك في استعادة كلمة المرور الخاصة بك. تحتاج إلى إعادة ضبط محفظتك عن طريق إعادة إدخال عبارة الاسترداد المكونة من 12 كلمة.", - "extension.lock.password.reset.initial.help": "أين أجد عبارة الاسترداد الخاصة بي؟", - "extension.lock.password.reset.initial.title": "هل نسيت كلمة السر", - "extension.lock.password.reset.speedbump.description": "تأكد من حصولك على عبارة الاسترداد المكونة من 12 كلمة قبل إعادة تعيين محفظتك. وإلا فلن تتمكن من استرداد أموالك.", - "extension.lock.password.reset.speedbump.help": "لقد فقدت عبارة الاسترداد الخاصة بي", - "extension.lock.password.reset.speedbump.title": "قبل المتابعة", - "extension.lock.subtitle": "أدخل كلمة المرور الخاصة بك لفتح", - "extension.lock.title": "مرحبًا بعودتك", - "extension.network.notSupported": "شبكة غير مدعومة", - "extension.open": "افتح ملحق Uniswap", - "extension.passwordPrompt.error.wrongPassword": "كلمة مرور خاطئة. حاول ثانية", - "extension.passwordPrompt.title": "ادخل رقمك السري", - "extension.popup.chrome.button": "تمديد مفتوح", - "extension.popup.chrome.description": "أكمل هذا الإجراء بفتح ملحق Uniswap.", - "extension.popup.chrome.title": "متابعة في Uniswap", - "extension.settings.defaultWallet.message": "إعطاء الأولوية لامتداد Uniswap عند الاتصال بالتطبيقات.", - "extension.settings.defaultWallet.title": "إنشاء محفظة افتراضية", - "extension.uninstall.reason.missingFeatures": "تفتقر محفظة Uniswap إلى بعض الميزات", - "extension.uninstall.reason.notUsingCrypto": "لم أعد أرغب في استخدام العملات المشفرة", - "extension.uninstall.reason.other": "أسباب أخرى", - "extension.uninstall.reason.switchingWallet": "سأنتقل إلى محفظة مختلفة", - "extension.uninstall.subtitle": "إذا كان لديك لحظة، فسوف نرغب في معرفة سبب قيامك بإلغاء تثبيت Uniswap Wallet", - "extension.uninstall.title": "نحن حزينون لرؤيتك ترحل", - "extension.warning.storage.button": "دعم", - "extension.warning.storage.message": "تأكد من عمل نسخة احتياطية من عبارة الاسترداد الخاصة بك لمنع فقدان الوصول إلى محفظتك وأموالك.", - "extension.warning.storage.title": "نفدت سعة تخزين متصفحك", - "extensionPasskeyLogInPopUp.description": "قم باستيراد حساب Uniswap الخاص بك عن طريق تسجيل الدخول باستخدام مفتاح المرور الحالي.", - "extensionPasskeyLogInPopUp.invalidReferrer": "يرجى إغلاق هذه الصفحة والمحاولة مرة أخرى.", - "fee.bestForCustomizability": "الأفضل للتخصيص.", - "fee.bestForExotic": "الأفضل للأزواج الغريبة.", - "fee.bestForMost": "الأفضل لمعظم الأزواج.", - "fee.bestForStablePairs": "الأفضل للأزواج المستقرة.", - "fee.bestForVeryStable": "الأفضل للأزواج المستقرة جدًا.", - "fee.dynamic": "رسوم ديناميكية", - "fee.percentEarned": "النسبة المئوية التي ستكسبها من الرسوم.", - "fee.selectPercent": "{{pct}}% اختر", - "fee.selectPercentDescription": "{{pct}}% من السيولة المختارة لهذا المستوى", - "fee.tier": "فئة الرسوم", - "fee.tier.create": "إنشاء مستوى الرسوم", - "fee.tier.create.button": "إنشاء مستوى رسوم جديد", - "fee.tier.create.description": "سيؤدي إنشاء طبقة جديدة إلى تهيئة مجموعة جديدة مما يؤدي إلى تكاليف شبكة أعلى من المعتاد.", - "fee.tier.description": "المبلغ الذي تم ربحه من خلال توفير السيولة. اختر المبلغ الذي يناسب قدرتك على تحمل المخاطر واستراتيجيتك.", - "fee.tier.description.v2": "المبلغ المكتسب من خلال توفير السيولة. جميع مجموعات v2 لديها رسوم ثابتة بنسبة 0.3%. لمزيد من الخيارات، قم بتوفير السيولة على v4.", - "fee.tier.dynamic": "مستوى الرسوم الديناميكي", - "fee.tier.dynamic.create": "إنشاء طبقة رسوم ديناميكية", - "fee.tier.dynamic.create.info": "أنت على وشك إنشاء مجموعة ذات مستوى رسوم ديناميكي. قبل المتابعة، يرجى التأكد من أن الخطاف المحدد يدعم الرسوم الديناميكية.", - "fee.tier.highestTvl": "أعلى قيمة TVL", - "fee.tier.label": "النسبة المئوية التي ستربحها من الرسوم", - "fee.tier.missing.description": "لم تتمكن من العثور على المستوى الذي تبحث عنه؟", - "fee.tier.new": "طبقة جديدة", - "fee.tier.percent.select": "{{percentage}} حدد", - "fee.tier.recommended.description": "يوصى به بناءً على وجود أعلى حصة من السيولة لزوج الرمز المحدد.", - "fee.tier.search": "البحث عن مستويات رسوم أخرى أو إنشاءها", - "fee.tier.search.short": "مستويات البحث", - "fee.tier.select": "حدد مستوى الرسوم", - "fee.tier.select.existing.button": "حدد مستوى الرسوم الحالي", - "fee.tierExact": "{{fee}} فئة الرسوم", - "fee.unavailable": "لن تكون الرسوم المكتسبة مرئية لمراكز v2 حتى تتم إزالة السيولة.", - "fee.uncollected": "يتضمن الرسوم غير المحصلة:", - "fee.uniswap": "الرسوم ({{percent}})", - "fee.uniswap.description": "يتم تطبيق الرسوم لضمان أفضل تجربة مع Uniswap.", - "fiatOffRamp.checkout.title": "سحب إلى", - "fiatOffRamp.connection.quote": "بيع ما قيمته {{amount}} من {{currencySymbol}}", - "fiatOffRamp.error.balance": "يتجاوز التوازن", - "fiatOffRamp.error.populateSend.description": "يرجى الانتظار لحظة ثم المحاولة مرة أخرى.", - "fiatOffRamp.error.populateSend.title": "لا يمكن تحميل المعاملة", - "fiatOffRamp.summary.total": "{{cryptoAmount}} لـ {{fiatAmount}}", - "fiatOffRamp.unsupportedToken.back": "عُد", - "fiatOffRamp.unsupportedToken.divider": "الرموز غير المدعومة", - "fiatOffRamp.unsupportedToken.message": "لا يُسمَح ببيع هذا الرمز. قم بتبديل هذا الأصل بأحد الرموز المدعومة.", - "fiatOffRamp.unsupportedToken.swap": "التبديل إلى رمز مدعوم", - "fiatOffRamp.unsupportedToken.title": "الرمز غير مدعوم", - "fiatOffRamp.welcome.tooltip": "بيع عملتك المشفرة إلى حسابك المصرفي أو بطاقة الخصم الخاصة بك.", - "fiatOnRamp.button.chooseToken": "اختر الرمز", - "fiatOnRamp.buy.info.description": "سوف تحتاج إليه لدفع تكاليف الشبكة عند التبديل.", - "fiatOnRamp.buy.info.title": "ابدأ مع ETH", - "fiatOnRamp.cexTransferModal.description": "لا يُدعم شراء العملات المشفرة باستخدام البطاقة في منطقتك. انقل الأصول من حساب تبادل مركزي لتمويل محفظتك.", - "fiatOnRamp.cexTransferModal.title": "نقل للبدء", - "fiatOnRamp.checkout.title": "الدفع", - "fiatOnRamp.chooseMultiPlatformProvider.chooseNetwork": "اختر الشبكة", - "fiatOnRamp.chooseMultiPlatformProvider.description": "سيحدد هذا عنوان المحفظة التي ستتلقى الأموال عليها.", - "fiatOnRamp.chooseProvider.description": "ستستمر في الوصول إلى بوابة المزود لمعرفة الرسوم المرتبطة بمعاملتك.", - "fiatOnRamp.completeTransactionHeader": "أكمل المعاملة باستخدام {{serviceProvider}}", - "fiatOnRamp.connection.error": "فشل الاتصال", - "fiatOnRamp.connection.errorDescription": "حدث خطأ ما أثناء الاتصال بـ {{serviceProvider}}.", - "fiatOnRamp.connection.message": "يوصلك إلى {{serviceProvider}}", - "fiatOnRamp.connection.quote": "شراء {{amount}} بقيمة {{currencySymbol}}", - "fiatOnRamp.connection.terms": "من خلال المتابعة، فإنك تقر بأنك ستخضع لـ شروط الخدمة و سياسة الخصوصية مع {{serviceProvider}}، حسب الاقتضاء.", - "fiatOnRamp.continueInTab": "انتقل إلى علامة التبويب {{serviceProvider}} للمتابعة. من الآمن إغلاق هذا الوضع الآن.", - "fiatOnRamp.disclaimer": "من خلال المتابعة، فإنك تقر بأنك ستخضع لـ شروط الخدمة و سياسة الخصوصية مع {{serviceProvider}}، حسب الاقتضاء.", - "fiatOnRamp.error.default": "هناك خطأ ما.", - "fiatOnRamp.error.load": "تعذر تحميل الرموز المميزة للشراء", - "fiatOnRamp.error.max": "الحد الأقصى {{amount}}", - "fiatOnRamp.error.min": "الحد الأدنى {{amount}}", - "fiatOnRamp.error.noQuotes": "لم يتم العثور على اقتباسات.", - "fiatOnRamp.error.unavailable": "هذه الخدمة غير متوفرة في منطقتك", - "fiatOnRamp.error.unsupported": "غير معتمد في المنطقة", - "fiatOnRamp.error.usd": "متاح فقط للشراء بالدولار الأمريكي", - "fiatOnRamp.noQuotes.error": "لم يتم العثور على اقتباسات", - "fiatOnRamp.paymentMethods.applePay": "أبل باي", - "fiatOnRamp.paymentMethods.bank": "بنك", - "fiatOnRamp.paymentMethods.debit": "دَين", - "fiatOnRamp.paymentMethods.googlePay": "جوجل باي", - "fiatOnRamp.paymentMethods.paypal": "باي بال", - "fiatOnRamp.paymentMethods.venmo": "فينمو", - "fiatOnRamp.quote.advice": "ستستمر في الوصول إلى بوابة المزود لمعرفة الرسوم المرتبطة بمعاملتك.", - "fiatOnRamp.quote.type.list": "{{optionsList}}وخيارات أخرى", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "من حساب", - "fiatOnRamp.receiveCrypto.title": "تلقي التشفير", - "fiatOnRamp.receiveCrypto.transferFunds": "قم بتمويل محفظتك عن طريق تحويل العملات المشفرة من محفظة أو حساب آخر", - "fiatOnRamp.receiveCrypto.useThisAddress": "استخدم هذا العنوان لتلقي الرموز على", - "fiatOnRamp.region.placeholder": "البحث حسب البلد أو المنطقة", - "fiatOnRamp.region.title": "اختر منطقتك", - "fiatOnRamp.summary.total": "{{cryptoAmount}} لـ {{fiatAmount}}", - "forceUpgrade.action.backup": "قم بعمل نسخة احتياطية من محفظتك", - "forceUpgrade.action.confirm": "تحديث الآن", - "forceUpgrade.action.learn": "تعرف على كيفية التحديث", - "forceUpgrade.description.extension": "يتوفر إصدار جديد من التطبيق. لمواصلة استخدام ملحق Uniswap، يرجى تحديثه إلى أحدث إصدار.", - "forceUpgrade.description.wallet": "يتوفر إصدار جديد من التطبيق. لمواصلة استخدام محفظة Uniswap، يرجى تحديثها إلى أحدث إصدار.", - "forceUpgrade.label.recoveryPhrase": "عبارة الاسترداد", - "forceUpgrade.title": "التحديث إلى الإصدار الأحدث", - "forceUpgrade.title.recommendedStatus": "إصدار جديد متاح", - "globalPreferences.title": "التفضيلات العالمية", - "hero.scroll": "قم بالتمرير لمعرفة المزيد", - "hero.subtitle": "قم بشراء وبيع العملات المشفرة على شبكات {{amount}}+ بما في ذلك Ethereum وUnichain وBase.", - "hero.swap.title": "قم بالتبديل في أي وقت،
في أي مكان.", - "hidden.nfts.info.banner.text": "تعرف على المزيد حول NFTs المخفية", - "hidden.nfts.info.text.button": "NFTs مخفية ({{numHidden}})", - "hidden.nfts.info.text.extension": "هذه هي عمليات الاحتيال المحتملة ورموز NFT التي قمت بإخفائها. يمكنك النقر بزر الماوس الأيمن على رمز NFT لإظهاره.", - "hidden.nfts.info.text.mobile": "هذه هي عمليات الاحتيال المحتملة ورموز NFT التي قمت بإخفائها. يمكنك الضغط لفترة طويلة على رمز NFT لإظهاره.", - "hidden.nfts.info.text.title": "NFTs مخفية", - "hidden.tokens.info.banner.text": "تعرف على المزيد حول الرموز المخفية", - "hidden.tokens.info.text.button": "الرموز المخفية ({{numHidden}})", - "hidden.tokens.info.text.info": "هذه هي عمليات الاحتيال المحتملة والأرصدة الصغيرة والرموز التي قمت بإخفائها. الرموز المخفية لا يتم تضمينها في إجمالي رصيد محفظتك.", - "hidden.tokens.info.text.title": "الرموز المخفية", - "home.activity.empty.button": "احصل على الرموز المميزة أو NFTs", - "home.activity.empty.description.default": "عند الموافقة على الرموز المميزة أو NFTs أو تداولها أو نقلها، ستظهر معاملاتك هنا.", - "home.activity.empty.description.external": "عندما تقوم هذه المحفظة بإجراء المعاملات، ستظهر هنا.", - "home.activity.empty.title": "لا يوجد نشاط بعد", - "home.activity.error.load": "تعذر تحميل النشاط", - "home.activity.title": "نشاط", - "home.banner.offline": "أنت في وضع غير متصل بالشبكة", - "home.banner.testnetMode": "أنت في وضع الشبكة التجريبية", - "home.banner.testnetMode.nav": "أنت في وضع الشبكة التجريبية. قم بإيقاف تشغيله في الإعدادات.", - "home.empty.cexTransfer": "تحويل", - "home.empty.cexTransfer.description": "نقل الأموال من منصة التداول.", - "home.empty.transfer": "تلقي التشفير", - "home.empty.transfer.description": "نقل الأموال من محفظة أخرى.", - "home.explore.footer": "انقر هنا لاستكشاف الآلاف من الرموز المميزة والرموز غير القابلة للاستبدال (NFTs) والمزيد", - "home.explore.title": "استكشاف الرموز", - "home.extension.error": "حدث خطأ أثناء تحميل الحسابات", - "home.label.buy": "يشتري", - "home.label.for": "شراء/بيع", - "home.label.receive": "يستلم", - "home.label.send": "يرسل", - "home.label.swap": "تبديل", - "home.nfts.title": "الرموز غير القابلة للاستبدال", - "home.tokens.empty.action.buy.description": "الشراء باستخدام بطاقة الخصم أو الحساب البنكي.", - "home.tokens.empty.action.buy.title": "شراء التشفير", - "home.tokens.empty.action.import.description": "أدخل عبارة الاسترداد الخاصة بهذه المحفظة لبدء التبديل والإرسال.", - "home.tokens.empty.action.import.title": "استيراد المحفظة", - "home.tokens.empty.action.receive.description": "نقل من محفظة أو حساب آخر.", - "home.tokens.empty.action.receive.title": "تلقي التشفير", - "home.tokens.empty.description": "عندما تقوم هذه المحفظة بشراء الرموز المميزة أو استلامها، ستظهر هنا.", - "home.tokens.empty.title": "لا توجد رموز حتى الآن", - "home.tokens.empty.welcome.description": "أضف الأموال لبدء التداول", - "home.tokens.error.fetch": "فشل جلب أرصدة الرموز المميزة", - "home.tokens.error.load": "تعذر تحميل أرصدة الرموز المميزة", - "home.tokens.title": "الرموز", - "home.upsell.receive.cta": "من حساب", - "home.upsell.receive.title": "تلقي التشفير", - "home.warning.viewOnly": "هذه محفظة للعرض فقط", - "interface.metatags.description": "تداول العملات المشفرة على منصات إيثريوم، بيس، أربيتروم، بوليغون، يوني تشين، وغيرها. منصة التمويل اللامركزي (DeFi) التي يثق بها الملايين.", - "interface.metatags.title": "واجهة يونيسواب", - "landing.api": "واجهة برمجة التطبيقات (API)", - "landing.appsOverview": "مُصمم لجميع الطرق التي يمكنك التبديل بها", - "landing.blog.description": "تعرف على أحدث أخبار الشركة وميزات المنتج والمزيد", - "landing.docs.description": "استكشف مكتبتنا من مستندات المطورين للبدء في البناء باستخدام Uniswap", - "landing.exploreUniverse": "استكشف الكون", - "landing.getStarted": "التداول على أكبر بورصة لامركزية في العالم", - "landing.helpCenter.body": "تصفح الأسئلة الشائعة واحصل على الدعم من فريق الدعم الخاص بنا الموجود في الولايات المتحدة", - "landing.protocolDescription": "تُشغّل Uniswap Labs بعضًا من أكثر المنتجات استخدامًا في عالم العملات المشفرة. استمتع بوصولٍ دون إذن، وأمانٍ مُثبت، ودعمٍ مُخصّص.", - "landing.protocolStats": "إحصائيات بروتوكول Uniswap", - "landing.provideLiquidity.body": "توفير السيولة وجمع الرسوم باستخدام واجهة Uniswap.", - "landing.provideLiquidity.subtitle": "أسواق الطاقة على السلسلة.", - "landing.socials": "تابع Uniswap Labs على Xو Farcasterو LinkedInو TikTok", - "landing.swapBody": "يمكنك الوصول إلى السيولة العميقة واستكشاف الرموز وتعيين أوامر الحد وتوفير السيولة لآلاف الرموز عبر سلاسل {{amount}} .", - "landing.swapSubtitle": "المبادلة بدون إذن.", - "landing.tradingApi": "واجهة برمجة التطبيقات للتداول", - "landing.tradingApiBody": "استخدم نفس واجهة برمجة التطبيقات التي تدعم تطبيق Uniswap Web والمحفظة، والتي تحظى بثقة الفرق الرائدة في جميع أنحاء العالم.", - "landing.tradingApiButton": "دمج واجهة برمجة التطبيقات Uniswap", - "landing.tradingApiSubtitle": "DeFi، مباشرة إلى المستخدمين.", - "landing.trusted": "موثوق بها من قبل الملايين", - "landing.unichain.body": "انضم إلى المجتمع الذي يبني على Ethereum L2 السريع واللامركزي المصمم ليكون موطنًا لـ DeFi.", - "landing.unichain.button": "ابدأ البناء", - "landing.unichain.subtitle": "سلسلة DeFi.", - "landing.uniswapX.body": "معاملات خالية من الغاز وحماية MEV، مع رسوم صفرية للمبادلات الفاشلة.", - "landing.uniswapX.button": "تجربة UniswapX", - "landing.uniswapX.subtitle": "تبديلات أكثر ذكاءً، بدون احتكاك.", - "landing.walletBody": "محفظة العملات المشفرة الموثوقة ذات الحفظ الذاتي والملحق مع ملايين التنزيلات والدعم من البشر الحقيقيين وتقييم 4.8 .", - "landing.walletSubtitle": "التبديل، التخزين، الاستكشاف.", - "language.afrikaans": "الأفريكانية", - "language.arabic": "عربي", - "language.catalan": "الكاتالونية", - "language.chineseSimplified": "الصينية المبسطة", - "language.chineseTraditional": "تقاليد صينية", - "language.czech": "التشيكية", - "language.danish": "دانماركي", - "language.dutch": "هولندي", - "language.english": "إنجليزي", - "language.finnish": "الفنلندية", - "language.french": "فرنسي", - "language.greek": "اليونانية", - "language.hebrew": "العبرية", - "language.hindi": "الهندية", - "language.hungarian": "المجرية", - "language.indonesian": "الاندونيسية", - "language.italian": "ايطالي", - "language.japanese": "اليابانية", - "language.korean": "كوري", - "language.malay": "لغة الملايو", - "language.norwegian": "النرويجية", - "language.polish": "بولندي", - "language.portuguese": "البرتغالية", - "language.romanian": "روماني", - "language.russian": "الروسية", - "language.serbian": "الصربية", - "language.spanishArgentina": "الإسبانية (الأرجنتين)", - "language.spanishBelize": "الإسبانية (بليز)", - "language.spanishBolivia": "الإسبانية (بوليفيا)", - "language.spanishChile": "الإسبانية (تشيلي)", - "language.spanishColombia": "الإسبانية (كولومبيا)", - "language.spanishCostaRica": "الإسبانية (كوستاريكا)", - "language.spanishCuba": "الإسبانية (كوبا)", - "language.spanishDominicanRepublic": "الإسبانية (جمهورية الدومينيكان)", - "language.spanishEcuador": "الإسبانية (الإكوادور)", - "language.spanishElSalvador": "الإسبانية (السلفادور)", - "language.spanishGuatemala": "الإسبانية (غواتيمالا)", - "language.spanishHonduras": "الإسبانية (هندوراس)", - "language.spanishLatam": "الإسبانية (أمريكا اللاتينية)", - "language.spanishMexico": "الإسبانية (المكسيك)", - "language.spanishNicaragua": "الإسبانية (نيكاراغوا)", - "language.spanishPanama": "الإسبانية (بنما)", - "language.spanishParaguay": "الإسبانية (باراغواي)", - "language.spanishPeru": "الإسبانية (بيرو)", - "language.spanishPuertoRico": "الإسبانية (بورتوريكو)", - "language.spanishSpain": "الإسبانية (إسبانيا)", - "language.spanishUruguay": "الإسبانية (أوروغواي)", - "language.spanishUs": "الإسبانية (الولايات المتحدة)", - "language.spanishVenezuela": "الإسبانية (فنزويلا)", - "language.swahili": "السواحلية", - "language.swedish": "السويدية", - "language.turkish": "اللغة التركية", - "language.ukrainian": "الأوكرانية", - "language.urdu": "الأردية", - "language.vietnamese": "الفيتنامية", - "large.price.difference": "فرق كبير في السعر", - "large.price.difference.tooltip": "سيؤدي الاستمرار في هذه الصفقة إلى خسارة أموال. قد يكون هذا الفرق ناتجًا عن صفقات كبيرة أو انخفاض السيولة.", - "limit.open.count_one": "1 الحد المفتوح", - "limit.open.count_other": "{{count}} حدود مفتوحة", - "limitPrice.buyingAboveMarketPrice.error.description": "سعر الحد الخاص بك أعلى بنسبة {{percentage}}% من السوق. اضبط سعر الحد الخاص بك للمضي قدمًا.", - "limitPrice.buyingAboveMarketPrice.error.title": "شراء {{tokenSymbol}} أعلى من سعر السوق", - "limitPrice.marketPriceNotAvailable.error.description": "نحن غير قادرين على حساب سعر السوق الحالي. لتجنب تقديم طلب بسعر أقل من سعر السوق، يرجى التحقق من اتصال الشبكة والمحاولة مرة أخرى.", - "limitPrice.marketPriceNotAvailable.error.title": "سعر السوق غير متوفر", - "limitPrice.sellingBelowMarketPrice.error.description": "سعر الحد الخاص بك هو {{percentage}}٪ أقل من السوق. اضبط سعر الحد الخاص بك للمضي قدمًا.", - "limitPrice.sellingBelowMarketPrice.error.title": "البيع {{tokenSymbol}} أقل من سعر السوق", - "limits.form.disclaimer.mainnet": "تتوفر فقط الرموز المميزة للشبكة الرئيسية لـ Ethereum للحدود. ", - "limits.form.disclaimer.mainnet.short": "رموز الشبكة الرئيسية فقط متاحة للحدود.", - "limits.form.disclaimer.uniswapx": "قد لا يتم تنفيذ الحدود تمامًا عندما تصل الرموز المميزة إلى السعر المحدد. ", - "limits.learnMore": "تعرف على المزيد حول الحدود", - "limits.price.input.label": "عندما يكون 1 يستحق", - "limits.price.label": "سعر الحد", - "limits.selectSupportedTokens": "حدد الرموز المدعومة", - "liquidity.hooks": "خطافات على الإصدار 4", - "liquidity.hooks.address.input": "أدخل عنوان الخطاف", - "liquidity.hooks.address.tooltip": "عنوان الخطاف: {{address}}", - "liquidity.learnMoreLabel": "تعرف على توفير السيولة", - "liquidity.notEnough.label": "لا توجد سيولة كافية لإظهار قيمة دقيقة للدولار الأمريكي.", - "liquidity.provideOnProtocols": "توفير السيولة على بروتوكولات مختلفة", - "liquidityPool.page.title": "أضف السيولة إلى المجمعات{{version}} على Uniswap", - "liquidityPool.positions.closed.title": "المراكز المغلقة", - "liquidityPool.positions.loadingMore": "جاري تحميل المزيد من المواضع...", - "liquidityPool.positions.page.title": "إدارة {{quoteSymbol}}/{{baseSymbol}} تجمع السيولة على Uniswap", - "liquidityPool.positions.page.version.description": "عرض مراكز السيولة النشطة الخاصة بك {{version}} . إضافة مناصب جديدة.", - "liquidityPool.positions.page.version.title": "إدارة سيولة المجمع{{version}} على Uniswap", - "migrate.allowed": "مسموح", - "migrate.allowLpMigration": "السماح بترحيل رمز LP المميز", - "migrate.connectAccount": "يجب عليك ربط الحساب الذي يملك هذا الموضع.", - "migrate.connectWallet": "اتصل بالمحفظة لعرض سيولة V2 الخاصة بك.", - "migrate.contract": "عقد الهجرة Uniswap", - "migrate.firstLP": "أنت المزود الأول للسيولة لمجموعة Uniswap V3 هذه. سوف تهاجر السيولة الخاصة بك بالسعر الحالي {{source}} .", - "migrate.highGasCost": "ستكون تكلفة معاملتك أعلى بكثير لأنها تتضمن الغاز اللازم لإنشاء المجمع.", - "migrate.invalidRange": "النطاق المحدد غير صالح. يجب أن يكون الحد الأدنى للسعر أقل من الحد الأقصى للسعر.", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} رموز LP", - "migrate.migrating": "الهجرة", - "migrate.missingV2Position": "ألا ترى أحد مواقع v2 الخاصة بك؟ استيراده.", - "migrate.noV2Liquidity": "لم يتم العثور على سيولة V2.", - "migrate.positionNoFees": "لن يكسب مركزك رسومًا ولن يتم استخدامه في الصفقات حتى يتحرك سعر السوق إلى النطاق الخاص بك.", - "migrate.priceDifference": "فرق السعر: ", - "migrate.priceWarning": "يجب عليك فقط إيداع السيولة في Uniswap V3 بالسعر الذي تعتقد أنه صحيح.
إذا بدا السعر غير صحيح، فيمكنك إما إجراء مبادلة لتحريك السعر أو الانتظار حتى يقوم شخص آخر بذلك.", - "migrate.refund": "سيتم رد {{amtA}} {{symA}} و {{amtB}} {{symB}} على الأقل إلى محفظتك بسبب النطاق السعري المحدد.", - "migrate.selectFeeTier": "حدد مستوى الرسوم", - "migrate.setRange": "تحديد النطاق السعري", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} السعر:", - "migrate.v2Description": "ستقوم هذه الأداة بترحيل سيولة {{source}} الخاصة بك بأمان إلى V3. العملية غير موثوقة تمامًا بفضل <0>عقد الترحيل Uniswap ↗", - "migrate.v2Instruction": "بالنسبة لكل مجموعة موضحة أدناه، انقر فوق ترحيل لإزالة السيولة الخاصة بك من Uniswap V2 وإيداعها في Uniswap V3.", - "migrate.v2Title": "ترحيل السيولة V2", - "migrate.v3Price": "V3 {{sym}} السعر:", - "mint.v3.input.invalidPrice.error": "إدخال السعر غير صالح", - "mobileAppPromo.banner.getTheApp.link": "احصل على تطبيق Uniswap Wallet", - "mobileAppPromo.banner.title": "Uniswap: محفظة العملات المشفرة وNFT", - "moonpay.poweredBy": "فيات onramp مدعوم من MoonPay USA LLC", - "nav.createAccount.button": "إنشاء حساب", - "nav.logIn.button": "تسجيل الدخول", - "nav.logInOrConnect.title": "تسجيل الدخول أو الاتصال", - "nav.products.tradingApi": "دمج البروتوكول", - "nav.products.unichain": "سلسلة DeFi", - "nav.products.uniswapX": "المجمع الفوقي", - "nav.products.wallet": "التبديل، التخزين، الاستكشاف", - "nav.signUp.button": "اشتراك", - "nav.tabs.createPosition": "إنشاء موقف", - "nav.tabs.viewPositions": "عرض المواقف", - "network.lostConnection": "ربما تكون قد فقدت اتصالك بالشبكة.", - "network.mightBeDown": "ربما يكون {{network}} معطلاً الآن، أو ربما فقدت اتصالك بالشبكة.", - "network.warning": "تحذير الشبكة", - "nft.noPools": "لا حمامات حتى الآن", - "nft.reportSpam": "الإبلاغ عن البريد العشوائي", - "notFound.oops": "عفوًا، أعدني إلى Swap", - "notice.uk": "يتم توفير تطبيق الويب هذا كأداة للمستخدمين للتفاعل مع بروتوكول Uniswap بمبادرة منهم، دون أي تأييد أو توصية لأنشطة تداول العملات المشفرة. ومن خلال القيام بذلك، لا توصي Uniswap المستخدمين أو المستخدمين المحتملين بالمشاركة في نشاط تداول الأصول المشفرة، ولا ينبغي للمستخدمين أو المستخدمين المحتملين لتطبيق الويب اعتبار صفحة الويب هذه أو محتوياتها على أنها تنطوي على أي شكل من أشكال التوصية أو الدعوة أو التحفيز للتعامل في الأصول المشفرة .", - "notice.uk.label": "إخلاء المسؤولية في المملكة المتحدة:", - "notification.assetVisibility.hidden": "{{assetName}} مخفي", - "notification.assetVisibility.unhidden": "{{assetName}} غير مخفي", - "notification.buy.network": "الشراء على {{network}}", - "notification.copied.address": "تم نسخ العنوان", - "notification.copied.calldata": "تم نسخ بيانات المكالمة", - "notification.copied.contractAddress": "تم نسخ عنوان العقد", - "notification.copied.failed": "فشل النسخ إلى الحافظة", - "notification.copied.image": "تم نسخ الصورة", - "notification.copied.linkUrl": "تم نسخ الرابط", - "notification.copied.nftUrl": "تم نسخ عنوان URL الخاص بـ NFT", - "notification.copied.poolId": "تم نسخ معرف المجمع", - "notification.copied.tokenUrl": "تم نسخ عنوان URL للرمز المميز", - "notification.copied.transactionId": "تم نسخ معرف المعاملة", - "notification.copied.unitag": "تم نسخ اسم المستخدم", - "notification.countryChange": "تم التبديل إلى {{countryName}}", - "notification.limit.network": "إنشاء أمر حد على {{network}}", - "notification.lp.network": "توفير السيولة على {{network}}", - "notification.network.changed": "تم التبديل إلى {{network}}", - "notification.passwordChanged": "تم تغيير كلمة السر", - "notification.poolFinder.network": "ابحث عن حمام السباحة على {{network}}", - "notification.restore.success": "استعادة المحفظة!", - "notification.sell.network": "البيع على {{network}}", - "notification.send.network": "يتم الإرسال على {{network}}", - "notification.smartWallet.disabled": "معطل على شبكة واحدة", - "notification.smartWallet.disabled.all": "تم تعطيل المحفظة الذكية", - "notification.smartWallet.disabled.plural": "معطل على شبكات {{amount}}", - "notification.spam.NFT.failed": "تعذر الإبلاغ عن NFT. حاول مرة أخرى لاحقًا.", - "notification.spam.NFT.successful": "تم الإبلاغ عنه", - "notification.swap.network": "المبادلة على {{network}}", - "notification.swap.pending.swap": "المبادلة معلقة", - "notification.swap.pending.unwrap": "إلغاء التغليف معلق", - "notification.swap.pending.wrap": "التفاف معلق", - "notification.transaction.approve.canceled": "تم الإلغاء {{currencySymbol}} الموافقة.", - "notification.transaction.approve.fail": "فشلت الموافقة على {{currencySymbol}} للاستخدام مع {{address}}.", - "notification.transaction.approve.success": "تمت الموافقة على {{currencySymbol}} للاستخدام مع {{address}}.", - "notification.transaction.pending": "الصفقة معلقة", - "notification.transaction.swap.canceled": "تم الإلغاء {{inputCurrencySymbol}}-{{outputCurrencySymbol}} المبادلة.", - "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} لـ {{outputCurrencyAmountWithSymbol}} انتهت صلاحية المبادلة.", - "notification.transaction.swap.fail": "فشل تبديل {{inputCurrencyAmountWithSymbol}} بـ {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.swap.success": "تم تبديل {{inputCurrencyAmountWithSymbol}} بـ {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.transfer.canceled": "تم الإلغاء {{tokenNameOrAddress}} إرسال", - "notification.transaction.transfer.fail": "فشل في إرسال {{tokenNameOrAddress}} إلى {{walletNameOrAddress}}", - "notification.transaction.transfer.received": "تم استلام {{tokenNameOrAddress}} من {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "تم الإرسال {{tokenNameOrAddress}} إلى {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "فشل التعامل مع {{addressOrEnsName}}", - "notification.transaction.unknown.fail.short": "فشل الاجراء", - "notification.transaction.unknown.success.full": "تم التعامل مع {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "تم تأكيد المعاملة", - "notification.transaction.unwrap.canceled": "تم الإلغاء {{inputCurrencySymbol}} إلغاء التغليف.", - "notification.transaction.unwrap.fail": "فشل في فك {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.unwrap.success": "تم فك التغليف {{inputCurrencyAmountWithSymbol}} وتم استلام {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.canceled": "تم إلغاء {{inputCurrencySymbol}} التفاف.", - "notification.transaction.wrap.fail": "فشل في الالتفاف {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.success": "ملفوفة {{inputCurrencyAmountWithSymbol}} ومستلمة {{outputCurrencyAmountWithSymbol}}.", - "notification.transfer.pending": "إرسال معلق", - "notification.walletConnect.confirmed": "تم تأكيد المعاملة بـ {{dappName}}", - "notification.walletConnect.connected": "متصل", - "notification.walletConnect.disconnected": "انقطع الاتصال", - "notification.walletConnect.failed": "فشلت المعاملة مع {{dappName}}", - "notification.walletConnect.networkChanged.full": "تم التبديل إلى {{networkName}}", - "notification.walletConnect.networkChanged.short": "الشبكات المحولة", - "notifications.scantastic.subtitle": "تابع على ملحق Uniswap", - "notifications.scantastic.title": "نجاح!", - "onboarding.backup.manual.banner": "نقترح كتابة هذا على قطعة من الورق وتخزينها في مكان آمن، مثل الخزنة.", - "onboarding.backup.manual.displayWarning.description": "اقرأ ما يلي بعناية قبل الاستمرار.", - "onboarding.backup.manual.displayWarning.note.access": "تمنحك عبارة الاسترداد هذه إمكانية الوصول الكامل إلى محفظتك وأموالك", - "onboarding.backup.manual.displayWarning.note.secure": "شاهد هذا بشكل خاص ولا تشاركه مع أي شخص", - "onboarding.backup.manual.displayWarning.note.storage": "اكتبها واحتفظ بها في مكان آمن", - "onboarding.backup.manual.displayWarning.title": "بعض الأشياء المهمة التي يجب معرفتها", - "onboarding.backup.manual.error": "كلمة غير صالحة أو بها أخطاء إملائية", - "onboarding.backup.manual.placeholder": "كلمة سرية", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} مكتمل", - "onboarding.backup.manual.selectedWordPlaceholder": "اختر كلمة", - "onboarding.backup.manual.subtitle_one": "ما هي الكلمة الأولى {{count}}في عبارة الاسترداد الخاصة بك؟", - "onboarding.backup.manual.subtitle_two": "ما هي الكلمة {{count}}الثانية في عبارة الاسترداد؟", - "onboarding.backup.manual.subtitle_few": "ما هي الكلمة {{count}}الثالثة في عبارة الاسترداد الخاصة بك؟", - "onboarding.backup.manual.subtitle_other": "ما هي الكلمة {{count}}في عبارة الاسترداد؟", - "onboarding.backup.manual.title": "دعونا نتأكد من أنك قمت بتسجيله بشكل صحيح", - "onboarding.backup.option.badge.quick": "سريع", - "onboarding.backup.option.cloud.description": "قم بعمل نسخة احتياطية لمحفظتك عبر {{cloudProviderName}}، المحمية بكلمة مرور الاسترداد.", - "onboarding.backup.option.cloud.title": "تعيين كلمة مرور الاسترداد", - "onboarding.backup.option.manual.description": "سجل كلماتك السرية الـ12 على قطعة من الورق واحتفظ بها في مكان آمن.", - "onboarding.backup.option.manual.title": "اكتب عبارة الاسترداد", - "onboarding.backup.reminder.backupNowButton": "النسخ الاحتياطي الآن", - "onboarding.backup.reminder.remindMeLaterButton": "ذكّرني لاحقًا", - "onboarding.backup.reminder.title": "قم بعمل نسخة احتياطية من محفظتك", - "onboarding.backup.reminder.warning.description": "قم بعمل نسخة احتياطية لمحفظتك حتى تتمكن من استعادة أصولك إذا فقدت هاتفك أو حصلت على هاتف جديد.", - "onboarding.backup.reminder.warning.fundsLabel": "الأموال المعرضة للخطر", - "onboarding.backup.reminder.warning.title": "قد تفقد أموالك", - "onboarding.backup.speedBump.cloud.description": "إذا نسيت كلمة المرور، فلن نتمكن من إعادة تعيينها لك. اكتبها في مكان آمن أو قم بتخزينها بأمان في مدير كلمات المرور.", - "onboarding.backup.speedBump.cloud.disclaimer": "أتفهم أن Uniswap Labs لا يمكنه إعادة تعيين كلمة المرور الخاصة بالاسترداد.", - "onboarding.backup.speedBump.cloud.title": "من المهم حفظ هذه الكلمة المرورية", - "onboarding.backup.speedBump.manual.description": "تأكد من كتابة عبارة الاسترداد الخاصة بك بشكل صحيح وأن لديك مكانًا آمنًا لتخزينها.", - "onboarding.backup.speedBump.manual.disclaimer": "أتفهم أن Uniswap Labs لن يتمكن من استعادة محفظتي إذا فقدتها.", - "onboarding.backup.speedBump.manual.title": "قبل الانتهاء...", - "onboarding.backup.subtitle": "هكذا ستستعيد محفظتك إذا قمت بحذف التطبيق أو فقدت جهازك.", - "onboarding.backup.title.existing": "قم بعمل نسخة احتياطية من محفظتك", - "onboarding.backup.title.new": "اختر طريقة النسخ الاحتياطي الخاصة بك", - "onboarding.backup.view.subtitle.message1": "اقرأ ما يلي بعناية قبل المتابعة", - "onboarding.backup.view.subtitle.message2": "ستحتاج إلى إدخال جميع هذه الكلمات السرية الـ 12 لاستعادة محفظتك.", - "onboarding.backup.view.title": "اكتب عبارة الاسترداد الخاصة بك", - "onboarding.backup.view.warning.message1": "تمنحك عبارة الاسترداد هذه إمكانية الوصول الكامل إلى محفظتك وأموالك", - "onboarding.backup.view.warning.message2": "اكتبها واحتفظ بها في مكان آمن", - "onboarding.backup.view.warning.message3": "شاهد هذا على الخاص و لا تشاركه مع أي شخص", - "onboarding.cloud.confirm.description": "سوف تحتاج إلى إدخال هذا الرمز لاسترداد أموالك. إذا نسيت إدخاله، فلن نتمكن من استرداده لك.", - "onboarding.cloud.confirm.title": "تأكيد كلمة المرور الخاصة بالاسترداد", - "onboarding.cloud.createPassword.description": "سوف تحتاج إلى إدخال هذا الرمز لاسترداد أموالك. إذا نسيت إدخاله، فلن نتمكن من استرداده لك.", - "onboarding.cloud.createPassword.title": "قم بإنشاء كلمة مرور الاسترداد الخاصة بك", - "onboarding.complete.button": "افتح ملحق Uniswap", - "onboarding.complete.description": "محفظتك جاهزة لإرسال واستقبال العملات المشفرة. افتح ملحق Uniswap باستخدام الاختصار أدناه.", - "onboarding.complete.go_to_uniswap": "انتقل إلى تطبيق الويب Uniswap", - "onboarding.complete.pin.description": "انقر فوق أيقونة الدبوس لإضافة Uniswap Extension إلى شريط الأدوات الخاص بك.", - "onboarding.complete.pin.title": "تثبيت ملحق Uniswap", - "onboarding.complete.title": "أنت جاهز تمامًا", - "onboarding.extension.biometrics.subtitle.fingerprint": "يمكنك الوصول إلى محفظتك بسرعة وأمان باستخدام بصمة إصبعك فقط.", - "onboarding.extension.biometrics.title": "تمكين {{biometricsMethod}}", - "onboarding.extension.password.subtitle": "ستحتاج إلى هذا لفتح محفظتك والوصول إلى عبارة الاسترداد الخاصة بك", - "onboarding.extension.password.title.default": "إنشاء كلمة المرور", - "onboarding.extension.password.title.reset": "اعد ضبط كلمه السر", - "onboarding.extension.unsupported.android.description": "ملحق Uniswap متوافق فقط مع Chrome على سطح المكتب.", - "onboarding.extension.unsupported.android.title": "Chrome على الهاتف المحمول غير مدعوم (حتى الآن)", - "onboarding.extension.unsupported.description": "ملحق Uniswap متوافق فقط مع Chrome في الوقت الحالي.", - "onboarding.extension.unsupported.title": "هذا المتصفح غير مدعوم (حتى الآن)", - "onboarding.home.intro.backup.description.extension": "احفظ عبارة الاسترداد الخاصة بك للتأكد من عدم فقدان الوصول إلى محفظتك أبدًا.", - "onboarding.home.intro.backup.description.mobile": "قم بإعداد خطة استرداد إذا فقدت هاتفك أو حصلت على هاتف جديد.", - "onboarding.home.intro.backup.title": "قم بعمل نسخة احتياطية من محفظتك", - "onboarding.home.intro.bridgedAssets.description": "SOL وWIF وBONK وJUP — متوفرة الآن على Unichain", - "onboarding.home.intro.bridgedAssets.title": "تداول رموز جديدة على Unichain", - "onboarding.home.intro.fund.description": "قم بتمويل محفظتك عن طريق شراء العملات المشفرة أو التحويل من حساب آخر.", - "onboarding.home.intro.fund.title": "احصل على أول رمز مميز لك", - "onboarding.home.intro.label.required": "مطلوب", - "onboarding.home.intro.label.swipe": "مرر سريعًا", - "onboarding.home.intro.pushNotifications.description": "احصل على تنبيهات الأسعار الخاصة بالرموز المفضلة لديك واتجاهات السوق والمزيد.", - "onboarding.home.intro.pushNotifications.title": "ابقى على اطلاع", - "onboarding.home.intro.unitag.description": "قم بإنشاء ملف تعريف web3 مخصص وشارك عنوانك بسهولة مع الأصدقاء.", - "onboarding.home.intro.unitag.title": "قم بالمطالبة باسم المستخدم {{unitagDomain}} الخاص بك", - "onboarding.import.error.invalidWords_one": "كلمة واحدة غير صالحة أو بها خطأ إملائي", - "onboarding.import.error.invalidWords_other": "{{count}} الكلمات غير صالحة أو بها أخطاء إملائية", - "onboarding.import.method.restore.message.android": "أضف المحافظ التي قمت بنسخها احتياطيًا إلى حساب Google Drive الخاص بك.", - "onboarding.import.method.restore.message.ios": "أضف المحافظ التي قمت بنسخها احتياطيًا إلى حساب iCloud الخاص بك.", - "onboarding.import.method.restore.title": "استعادة المحفظة", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.android": "أدخل كلمة المرور الخاصة بالاسترداد لاستعادة محفظتك عبر نسخة احتياطية على Google Drive.", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.ios": "أدخل كلمة المرور الخاصة بالاسترداد لاستعادة محفظتك عبر نسخة احتياطية على iCloud.", - "onboarding.import.method.restoreSeedPhrase.cloud.title.android": "استعادة من جوجل درايف", - "onboarding.import.method.restoreSeedPhrase.cloud.title.ios": "استعادة من iCloud", - "onboarding.import.method.restoreSeedPhrase.title": "حدد كيفية استعادة محفظتك", - "onboarding.import.method.restoreSeedPhrase.wallet.desc": "أدخل كلماتك السرية الـ12 التي قمت بتخزينها مسبقًا في مكان آمن.", - "onboarding.import.method.restoreSeedPhrase.wallet.title": "أدخل عبارة الاسترداد", - "onboarding.import.method.viewPrivateKeys.button.desc": "عرض مفتاحك الخاص", - "onboarding.import.method.viewPrivateKeys.title": "لا تملك أيًا من العناصر المذكورة أعلاه؟ ", - "onboarding.import.onDeviceRecovery.other_options": "إنشاء أو استيراد محفظة مختلفة", - "onboarding.import.onDeviceRecovery.other_options.label": "لا تريد أي مما سبق؟", - "onboarding.import.onDeviceRecovery.subtitle": "اختر المحفظة التي تريد تسجيل الدخول إليها مرة أخرى.", - "onboarding.import.onDeviceRecovery.title": "مرحبًا بك مرة أخرى في Uniswap", - "onboarding.import.onDeviceRecovery.wallet.button": "عرض عبارة الاسترداد", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 محفظة أخرى", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} محافظ أخرى", - "onboarding.import.onDeviceRecovery.warning.caption": "يرجى التأكد من عمل نسخة احتياطية لجميع المحافظ الأخرى. إذا كنت ترغب في استعادتها في أي وقت، فستحتاج إلى عبارات الاسترداد الخاصة بها أو النسخ الاحتياطية المقابلة لها {{cloudProvider}} .", - "onboarding.import.onDeviceRecovery.warning.title": "هل أنت متأكد؟", - "onboarding.import.selectMethod.errorMessage": "حدث خطأ غير متوقع. يُرجى المحاولة مرة أخرى.", - "onboarding.import.selectMethod.mobileApp.subtitle": "استيراد المحفظة من تطبيق الهاتف المحمول عبر رمز الاستجابة السريعة.", - "onboarding.import.selectMethod.mobileApp.title": "استخدم Uniswap Mobile", - "onboarding.import.selectMethod.passkey.subtitle": "قم بمزامنة محفظة Uniswap الخاصة بك باستخدام مفتاح المرور الموجود.", - "onboarding.import.selectMethod.passkey.title": "تسجيل الدخول باستخدام مفتاح المرور", - "onboarding.import.selectMethod.recoveryPhrase.subtitle": "الاستيراد من محفظة تشفير أخرى.", - "onboarding.import.selectMethod.recoveryPhrase.title": "أدخل عبارة الاسترداد", - "onboarding.import.selectMethod.title": "تسجيل الدخول أو استيراد المحفظة", - "onboarding.import.title": "اختر الطريقة التي تريد بها إضافة محفظتك", - "onboarding.importMnemonic.button.default": "عبارة الاسترداد الخاصة بي هي 12 كلمة", - "onboarding.importMnemonic.button.importing": "جاري الاستيراد...", - "onboarding.importMnemonic.button.longPhrase": "عبارة الاسترداد الخاصة بي أطول", - "onboarding.importMnemonic.error.invalidPhrase": "العبارة التي أدخلتها غير صالحة", - "onboarding.importMnemonic.subtitle": "اكتب أو الصق عبارة الاسترداد المكونة من 12 كلمة", - "onboarding.importMnemonic.title": "أدخل عبارة الاسترداد الخاصة بك", - "onboarding.importPasskey.bringWindowToFront": "إحضار النافذة إلى الأمام", - "onboarding.importPasskey.continueInSecureWindow": "متابعة في نافذة تسجيل الدخول الآمن.", - "onboarding.intro.button.alreadyHave": "لدي بالفعل محفظة", - "onboarding.intro.button.logInOrImport": "تسجيل الدخول أو الاستيراد", - "onboarding.intro.mobileScan.button": "مسح رمز الاستجابة السريعة للاستيراد", - "onboarding.intro.mobileScan.title": "هل لديك تطبيق Uniswap؟", - "onboarding.landing.button.add": "إضافة محفظة موجودة", - "onboarding.landing.button.create": "إنشاء محفظة", - "onboarding.landing.button.createAccount": "إنشاء حساب", - "onboarding.name.choose": "اختيار اسم المستخدم", - "onboarding.name.choose.subtitle": "هذا اسم عام يمكن لأي شخص استخدامه لإرسال العملات المشفرة إليك.", - "onboarding.notification.permission.message": "لتلقي الإشعارات، قم بتشغيل إشعارات Uniswap Wallet في إعدادات جهازك.", - "onboarding.notification.permission.title": "إذن الإخطارات", - "onboarding.notification.subtitle": "ابق على اطلاع دائم بحالة المعاملات والتغييرات الرئيسية في أسعار الرموز المفضلة لديك.", - "onboarding.notification.title": "تشغيل الإشعارات", - "onboarding.passkey.create": "إنشاء مفتاح المرور الخاص بك", - "onboarding.passkey.loading.subtitle": "يجب أن يستغرق هذا ثانية واحدة فقط.", - "onboarding.passkey.loading.title": "العثور على محفظتك...", - "onboarding.passkey.secure": "تأمين حسابك", - "onboarding.passkey.secure.description": "تتيح لك مفاتيح المرور الوصول إلى حسابك بسرعة وأمان باستخدام وجهك أو بصمة إصبعك فقط.", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "دعنا نتأكد من صحة ما كتبته. إذا فقدت هذا أو كتبته بشكل غير صحيح، فلن تتمكن من استرداد أموالك.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "إذا فقدت هذا المبلغ أو كتبته بطريقة غير صحيحة، فلن تتمكن من استرداد أموالك.", - "onboarding.recoveryPhrase.confirm.title": "دعونا نؤكد أنك حصلت على الأمر بشكل صحيح", - "onboarding.recoveryPhrase.view.subtitle": "ستحتاج إلى إدخال جميع هذه الكلمات السرية الـ 12 لاستعادة محفظتك.", - "onboarding.recoveryPhrase.view.title": "اكتب عبارة الاسترداد الخاصة بك", - "onboarding.recoveryPhrase.view.title.hasPassword": "إذا نسيت كلمة المرور الخاصة بك...", - "onboarding.recoveryPhrase.warning.final.button": "أنا مستعد", - "onboarding.recoveryPhrase.warning.final.message": "عبارة الاسترداد الخاصة بك هي ما يمنحك (ولأي شخص لديه) إمكانية الوصول إلى أموالك. تأكد من الاحتفاظ بها لنفسك.", - "onboarding.recoveryPhrase.warning.final.title": "قم بهذه الخطوة في مكان خاص", - "onboarding.recoveryPhrase.warning.screenshot.message": "يمكن لأي شخص يمكنه الوصول إلى صورك الوصول إلى محفظتك. ننصحك بكتابة كلماتك بدلاً من ذلك.", - "onboarding.recoveryPhrase.warning.screenshot.title": "لقطات الشاشة ليست آمنة", - "onboarding.resetPassword.complete.safety": "تعرف على المزيد حول سلامة المحفظة", - "onboarding.resetPassword.complete.subtitle": "استخدم كلمة المرور الجديدة لفتح محفظتك.", - "onboarding.resetPassword.complete.title": "إعادة تعيين كلمة المرور", - "onboarding.scan.error": "حدث خطأ أثناء تحميل رمز الاستجابة السريعة", - "onboarding.scan.otp.error": "الرمز الذي أرسلته غير صحيح، أو حدث خطأ أثناء الإرسال. حاول مرة اخرى.", - "onboarding.scan.otp.failed": "المحاولات الفاشلة: {{number}}", - "onboarding.scan.otp.subtitle": "تحقق من تطبيق الهاتف المحمول Uniswap الخاص بك للحصول على الرمز المكون من 6 أحرف", - "onboarding.scan.otp.title": "أدخل الرمز لمرة واحدة", - "onboarding.scan.subtitle": "امسح رمز الاستجابة السريعة ضوئيًا باستخدام تطبيق Uniswap للهاتف المحمول لبدء استيراد محفظتك.", - "onboarding.scan.title": "استيراد المحفظة من التطبيق", - "onboarding.scan.troubleScanning.message": "الاستيراد عبر عبارة الاسترداد", - "onboarding.scan.troubleScanning.title": "مشكلة في المسح الضوئي؟", - "onboarding.scan.wifi": "قم بتوصيل هاتفك بنفس شبكة WiFi المتصل بها جهاز الكمبيوتر الخاص بك.", - "onboarding.security.alert.biometrics.message.android": "لاستخدام البيانات الحيوية، قم بإعدادها أولاً في الإعدادات", - "onboarding.security.alert.biometrics.message.ios": "لاستخدام {{biometricsMethod}}، اسمح بالوصول في إعدادات النظام", - "onboarding.security.alert.biometrics.title.android": "تم تعطيل القياسات الحيوية", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} معطل", - "onboarding.security.button.confirm.android": "تمكين القياسات الحيوية", - "onboarding.security.button.confirm.ios": "تمكين {{biometricsMethod}}", - "onboarding.security.button.setup": "يثبت", - "onboarding.security.subtitle.android": "أضف طبقة إضافية من الأمان من خلال طلب القياسات الحيوية لإرسال المعاملات.", - "onboarding.security.subtitle.ios": "أضف طبقة إضافية من الأمان من خلال طلب {{biometricsMethod}} لإرسال المعاملات.", - "onboarding.security.title": "حماية محفظتك", - "onboarding.selectWallets.error": "تعذر تحميل العناوين", - "onboarding.selectWallets.title.default": "اختر محافظ للاستيراد", - "onboarding.selectWallets.title.error": "حدث خطأ أثناء استيراد المحافظ", - "onboarding.termsOfService": "من خلال المتابعة، أوافق على شروط الخدمة وأوافق على سياسة الخصوصية", - "onboarding.tooltip.recoveryPhrase.trigger": "ما هي عبارة الاسترداد؟", - "onboarding.wallet.continue": "دعونا نبقيها آمنة", - "onboarding.wallet.defaultName": "المحفظة {{number}}", - "onboarding.wallet.description.full": "هذه هي مساحتك الشخصية للرموز المميزة والرموز غير القابلة للاستبدال (NFTs) وجميع تداولاتك. قم بإنهاء إعداده للحفاظ على أمان أموالك.", - "onboarding.wallet.title": "مرحبًا بك في محفظتك الجديدة", - "onboarding.welcome.subtitle": "دعنا ننتهي من إعداد محفظتك.", - "onboarding.welcome.title": "مرحباً!", - "outageBanner.message": "{{chainName}}{{versionDescription}} البيانات غير متوفرة حاليًا، ولكننا نتوقع حل المشكلة قريبًا.", - "outageBanner.message.sub": "لا يزال بإمكانك مبادلة وتوفير السيولة على هذه السلسلة دون مشكلة.", - "outageBanner.title": "{{versionName}} سيعود قريبًا", - "passkeys.help.modal.subtitle": "إذا كنت تواجه مشكلة مع مفاتيح المرور، قم بزيارة دعم Uniswap للحصول على المساعدة.", - "passkeys.help.modal.subtitle.invalidPasskey": "لم يتم إكمال طلبك. يُرجى المحاولة مرة أخرى باستخدام كلمة مرور مرتبطة بـ ", - "passkeys.help.modal.subtitle.technicalError": "تعذّر إكمال طلبك بسبب خطأ فني غير متوقع. أموالك آمنة. يُرجى المحاولة مرة أخرى.", - "passkeys.help.modal.title": "تحتاج مساعدة؟", - "passkeys.help.modal.title.invalidPasskey": "مفتاح المرور غير صالح", - "passkeys.help.modal.title.technicalError": "خطأ فني", - "passkeys.manage.modal.subtitle": "لإضافة أو إزالة مفاتيح المرور، يرجى تسجيل الدخول إلى {{passkeyManagementUrl}}.", - "passkeys.manage.modal.title": "إدارة مفاتيح المرور", - "permit.approval.fail": "فشلت الموافقة على التصريح", - "permit.approval.fail.message": "يسمح Permit2 بمشاركة الموافقات الرمزية وإدارتها عبر تطبيقات مختلفة.", - "pool.activeRange": "نطاق القراد النشط", - "pool.addAs": "أضف كـ {{nativeWrappedSymbol}}", - "pool.apr": "معدل الفائدة السنوي", - "pool.apr.base": "معدل الفائدة السنوي الأساسي", - "pool.apr.description": "يتم احتسابها سنويًا بناءً على رسوم يوم واحد", - "pool.apr.reward": "معدل الفائدة السنوي للمكافأة", - "pool.aprText": "معدل الفائدة السنوي للمسبح", - "pool.balances": "أرصدة المجمع", - "pool.closedCTA.description": "يمكنك رؤيتهم باستخدام الفلتر الموجود أعلى الصفحة.", - "pool.closedCTA.title": "هل تبحث عن مواقفك المغلقة؟", - "pool.collectAs": "اجمع كـ {{nativeWrappedSymbol}}", - "pool.collectFees": "جمع الرسوم", - "pool.connectEthereumToView": "قم بتوصيل محفظة Ethereum لعرض مجموعاتك", - "pool.create": "إنشاء مجموعة جديدة", - "pool.create.info": "ستؤدي اختياراتك إلى إنشاء مجموعة سيولة جديدة قد تؤدي إلى انخفاض السيولة الأولية وزيادة التقلبات. فكر في إضافة استثمارات إلى مجموعة موجودة لتقليل هذه المخاطر.", - "pool.createdPosition": "تم إنشاء الموضع", - "pool.createdPosition.canceled": "تم إلغاء إنشاء الموضع", - "pool.createdPosition.failed": "فشل إنشاء الموضع", - "pool.dynamic": "حمام سباحة ديناميكي", - "pool.earnings": "الأرباح", - "pool.earnings.empty": "ليس لديك أي أرباح حتى الآن", - "pool.explorers": "المستكشفون", - "pool.import": "تجمع الاستيراد", - "pool.import.link.description": "لا يتم عرض بعض مواضع v2 تلقائيًا.", - "pool.import.positions.v2": "استيراد مواضع V2", - "pool.import.positions.v2.selectPair.description": "لا يتم عرض بعض مواضع الإصدار 2 تلقائيًا. حدد زوجًا من الرموز لاستيرادها وعرض مواضعك.", - "pool.import.success": "تم استيراد المسبح", - "pool.incentives.administeredRewards": "يتم توزيع المكافآت من خلال عقد موزع Merkl المستقل.", - "pool.incentives.collect": "يجمع", - "pool.incentives.collectedRewards": "المكافآت المجمعة", - "pool.incentives.collectFailed": "فشل التجميع، يرجى المحاولة مرة أخرى.", - "pool.incentives.collectFailedNoRetry": "فشلت عملية جمع المكافآت.", - "pool.incentives.collectingRewards": "جمع المكافآت", - "pool.incentives.collectRewards": "جمع المكافآت", - "pool.incentives.collectRewardsCanceled": "تم إلغاء جمع المكافآت", - "pool.incentives.daysLeft": "الأيام المتبقية", - "pool.incentives.eligible": "تتمتع المجمعات المؤهلة بمكافآت رمزية حتى تتمكن من كسب المزيد", - "pool.incentives.merklDocs": "تم حسابها بواسطة Merkl من مكافآت الانبعاثات و TVL المجمع.", - "pool.incentives.rewardsDistribution": "توزيع المكافآت", - "pool.incentives.rewardsEarned": "المكافآت المكتسبة", - "pool.incentives.similarPoolHasRewards": "يوجد مسبح مماثل به مكافآت UNI", - "pool.incentives.switchPools": "تبديل المجمعات", - "pool.incentives.timePeriod": "الفترة الزمنية", - "pool.incentives.uni.findMore": "ابحث عن مجموعات بها مكافآت UNI", - "pool.incentives.yourRewards.error": "مكافآتك غير متاحة الآن", - "pool.incentives.yourRewards.error.description": "تعذّر استرداد المكافآت. قد يكون السبب مشكلة في الشبكة. حاول إعادة تحميل الصفحة.", - "pool.info": "معلومات عن المسبح", - "pool.limitFluctuation.warning": "يرجى العلم أن تنفيذ الحدود قد يختلف بناءً على تقلبات السوق في الوقت الفعلي وازدحام شبكة Ethereum. قد لا يتم تنفيذ الحدود تمامًا عندما تصل الرموز المميزة إلى السعر المحدد.", - "pool.liquidity.data.error.message": "حدث خطأ أثناء جلب البيانات المطلوبة لمعاملتك.", - "pool.liquidity.outOfSync": "عدم تطابق أسعار المجمع والسوق", - "pool.liquidity.outOfSync.message": "تختلف الأسعار في هذا المجمع عن أسعار السوق للرموز المحددة. قم بتعديل نطاق السعر وفقًا لذلك أو انتظر حتى يستعيد المجمع توازنه لتجنب الخسائر.", - "pool.maxPrice": "السعر الأقصى", - "pool.migrateLiquidity": "نقل السيولة", - "pool.migrateLiquidityDisabledTooltip": "هذه السلسلة لا تدعم مجمعات السيولة v4.", - "pool.migrateToV4": "الانتقال إلى الإصدار 4", - "pool.minPrice": "سعر دقيقة", - "pool.newPosition.plus": "+ مركز جديد", - "pool.newPosition.title": "موقف جديد", - "pool.newSpecificPosition": "موضع جديد {{symbol}}", - "pool.notAvailableOnSolana": "لا تتوفر حمامات سباحة في سولانا", - "pool.notFound.description": "عذرًا، لم نتمكن من العثور على أي معلومات حول هذا المسبح. يُرجى التحقق من الاسم والعنوان ثم المحاولة مجددًا.", - "pool.notFound.title": "لم يتم العثور على المسبح", - "pool.openToStart.evmAndSolanaConnected": "افتح مركزًا جديدًا أو أنشئ مجموعة استثمارية للبدء. المجموعات الاستثمارية غير متاحة على منصة سولانا.", - "pool.openToStart.evmOnly": "افتح مركزًا جديدًا أو أنشئ مجموعة للبدء.", - "pool.percent": "{{pct}}% تجمع", - "pool.pooled": "مجمعة {{sym}}:", - "pool.position": "موضع", - "pool.positions": "المواقف", - "pool.positions.title": "مواقفك", - "pool.positions.transaction.settings": "إعدادات المعاملات", - "pool.positions.usdValueUnavailable": "القيمة بالدولار الأمريكي غير متوفرة", - "pool.positions.usdValueUnavailable.tooltip": "القيمة بالدولار الأمريكي غير متاحة حاليًا لهذا المركز. راجع تفاصيل المركز لمعرفة مبالغ الرموز المودعة.", - "pool.refresh.prices": "تحديث الأسعار", - "pool.removeLiquidity": "إزالة السيولة", - "pool.rewardAPR": "معدل النسبة السنوية للمكافأة (UNI)", - "pool.rewardAPR.percent": "{{pct}} معدل النسبة السنوية للمكافأة", - "pool.rewards": "المكافآت", - "pool.rewardsPool.label": "الرموز المميزة في مجموعة المكافآت:", - "pool.selectPair": "حدد الزوج", - "pool.share.label": "حصتك في المسبح:", - "pool.specificPosition": "{{symbol}} الموضع", - "pool.tokenPair": "زوج الرمز", - "pool.top.rewards": "مجموعات مع مكافآت", - "pool.top.tvl": "أفضل حمامات السباحة حسب TVL", - "pool.top.volume": "المجمعات حسب حجم 24 ساعة", - "pool.totalAPR": "إجمالي معدل النسبة السنوية", - "pool.totalTokens": "مجموع الرموز المجمعة الخاصة بك:", - "pool.v2": "حمامات v2", - "pool.v3": "حمامات v3", - "pool.via": "{{tokenPair}} عبر {{dex}}", - "pool.volOverTvl": "1D حجم/حجم الصورة", - "pool.volume.thirtyDay": "حجم 30 يوم", - "pool.volume.thirtyDay.short": "حجم 30D", - "pool.withdrawAs": "سحب كـ {{nativeWrappedSymbol}}", - "poolFinder.availablePools": "المسابح المتاحة", - "poolFinder.availablePools.found.description": "تجمعات v2 التي تتوافق مع اختيار الزوج الخاص بك.", - "poolFinder.availablePools.notFound.description": "لم يتم العثور على مجموعات v2 متطابقة. تحقق مرة أخرى من اختيار الرمز الخاص بك وتأكد من اتصالك بالمحفظة الصحيحة.", - "pools.explore": "استكشاف حمامات السباحة", - "portfolio.activity.filters.timePeriod.all": "كل الوقت", - "portfolio.activity.filters.transactionType.all": "جميع الأنواع", - "portfolio.activity.filters.transactionType.deposits": "الودائع", - "portfolio.activity.filters.transactionType.staking": "المراهنة", - "portfolio.activity.filters.transactionType.swaps": "المبادلات", - "portfolio.activity.title": "نشاط", - "portfolio.connectWallet.summary": "تتبع الرموز والمجموعات والمزيد عبر شبكات {{amount}}+", - "portfolio.defi.title": "التمويل اللامركزي", - "portfolio.description": "تتبع محفظة العملات المشفرة الخاصة بك عبر جميع السلاسل والبروتوكولات", - "portfolio.nfts.title": "الرموز غير القابلة للاستبدال", - "portfolio.overview.title": "ملخص", - "portfolio.title": "مَلَفّ", - "portfolio.tokens.table.column.allocation": "توزيع", - "portfolio.tokens.table.column.balance": "توازن", - "portfolio.tokens.table.column.change1d": "تغيير 1D", - "portfolio.tokens.table.column.price": "سعر", - "portfolio.tokens.table.column.token": "رمز مميز", - "portfolio.tokens.table.column.value": "قيمة", - "portfolio.tokens.title": "الرموز", - "position.addHook": "أضف خطافًا", - "position.addHook.tooltip": "تعتبر الخطافات ميزة متقدمة تتيح للمجموعات التفاعل مع العقود الذكية، مما يفتح المجال أمام قدرات مختلفة. توخ الحذر عند إضافة الخطافات، حيث قد تكون بعضها ضارة أو تسبب عواقب غير مقصودة.", - "position.addingHook": "إضافة الخطاف", - "position.addingHook.disclaimer": "قد يؤدي إضافة الخطافات إلى عواقب غير مقصودة. قم بإجراء البحث واستمر على مسؤوليتك الخاصة.", - "position.addingHook.hideProperties": "إخفاء الخصائص", - "position.addingHook.invalidAddress": "أدخل عنوان ربط صالحًا", - "position.addingHook.viewProperties": "عرض الخصائص", - "position.create.confirm": "تأكيد الموقع", - "position.create.invalidPrice": "سعر غير صالح", - "position.create.invalidRange": "نطاق غير صالح", - "position.create.modal.header": "إنشاء موقف", - "position.create.unsupportedSolana": "لا يتم دعم مجموعات Solana.", - "position.create.unsupportedSolana.description": "لإنشاء مجموعة، قم بالتبديل إلى سلسلة EVM المدعومة.", - "position.create.unsupportedToken.description": "حاول إنشاء إصدار بروتوكول مختلف.", - "position.create.v2unsupportedChain": "هذه السلسلة غير مدعومة لمجموعات v2.", - "position.currentValue": "قيمة الموضع الحالي", - "position.default_price_strategies": "استراتيجيات الأسعار", - "position.default_price_strategies.error": "غير قادر على تحديد استراتيجية السعر", - "position.deposit.confirm.create.description.less": "السعر الأولي المُدخل أقل بنسبة {{value}}% من سعر السوق، وقد يُؤدي إلى خسارة أموالك. هل ترغب في المُتابعة؟", - "position.deposit.confirm.create.description.more": "السعر الأولي المُدخل أعلى بنسبة {{value}}% من سعر السوق، وقد يُؤدي إلى خسارة أموالك. هل ترغب في المُتابعة؟", - "position.deposit.confirm.create.title": "فرق كبير في السعر مع السوق", - "position.deposit.description": "قم بتحديد المبالغ الرمزية لمساهمتك في السيولة.", - "position.depositedCurrency": "تم الإيداع {{currencySymbol}}", - "position.fot.warning": "{{token}} ورموز \"الرسوم على التحويل\" الأخرى مدعومة فقط بواسطة Uniswap v2.", - "position.fot.warning.cta": "إنشاء موضع v2", - "position.hook.disclaimer": "أتفهم المخاطر المحتملة التي قد تترتب على إضافة هذا الخطاف.", - "position.hook.donateWarning": "قد يؤدي هذا العلم إلى تغييرات في الرسوم المكتسبة.", - "position.hook.liquidityWarning": "قد يتسبب هذا العلم في منع المجمع من إضافة سيولة جديدة. قد يتم التراجع عن معاملتك.", - "position.hook.removeWarning": "قد يؤدي ذلك إلى قفل أموالك أو منعك من تحصيل الرسوم.", - "position.hook.swapWarning": "قد يسمح هذا العلم لمزودي السيولة بالاستفادة من السيولة في الوقت المناسب بسهولة أكبر، مما قد يؤدي إلى انخفاض الرسوم المكتسبة.", - "position.hook.warningHeader": "هام: تم تحديد مخاطر الخطاف", - "position.hook.warningInfo": "لقد حددنا المخاطر المحتملة المرتبطة بهذا الخطاف. يرجى التأكد من فهمك لكيفية عمل هذا الخطاف قبل اتخاذ قرار المتابعة.", - "position.increase.fot": "لا يتم دعم إضافة السيولة لـ {{token}} وغيرها من رموز \"الرسوم عند التحويل\".", - "position.initialPrice": "السعر المبدئي", - "position.initialPrice.difference.negative": "{{ value }}أقل بنسبة % من سعر السوق", - "position.initialPrice.difference.positive": "{{ value }}أكثر من سعر السوق بنسبة %", - "position.initialPrice.info": "عند إنشاء تجمع جديد، يجب تحديد سعر الصرف الابتدائي لكلا الرمزين. سيعكس هذا السعر سعر السوق الأولي.", - "position.initialPrice.set": "تحديد السعر الأولي", - "position.initialPrice.useMarketPrice": "استخدم سعر السوق", - "position.migrate.liquidity": "عند ترحيل المواضع، لا يمكنك تغيير زوج الرمز الخاص بك، ولكن يمكنك إضافة خطاف لتحسين الوظائف.", - "position.migrate.v4unsupportedChain": "هذه السلسلة غير مدعومة لمجموعات v4.", - "position.new": "موقف جديد", - "position.new.protocol": "موضع جديد {{protocol}}", - "position.notFound": "لم يتم العثور على الموضع", - "position.notFound.description": "التفاصيل المتعلقة بهذا الموضع غير متوفرة. يرجى التأكد من اتصالك بالمحفظة الصحيحة.", - "position.one_sided_lower": "سفلي من جانب واحد", - "position.one_sided_lower.description": "توفير السيولة إذا انخفض السعر", - "position.one_sided_upper": "الجزء العلوي من جانب واحد", - "position.one_sided_upper.description": "توفير السيولة إذا ارتفع السعر", - "position.protocol": "{{protocol}} الموضع", - "position.provide.liquidity": "اختر الرموز التي تريد توفير السيولة لها. يمكنك تحديد الرموز على جميع الشبكات المدعومة.", - "position.provide.liquidityDescription": "إن توفير السيولة الكاملة يضمن المشاركة المستمرة في السوق عبر جميع الأسعار الممكنة، مما يوفر البساطة ولكن مع إمكانية حدوث خسارة غير دائمة أكبر.", - "position.provide.liquidityDescription.creatingPool": "إن تحديد نطاق السيولة الكامل عند إنشاء تجمع يضمن المشاركة المستمرة في السوق عبر جميع الأسعار الممكنة، مما يوفر البساطة ولكن مع إمكانية حدوث خسارة غير دائمة أكبر.", - "position.provide.liquidityDescription.custom": "يتيح لك النطاق المخصص التركيز على السيولة ضمن حدود سعرية محددة، مما يعزز كفاءة رأس المال وأرباح الرسوم ولكنه يتطلب إدارة أكثر نشاطًا.", - "position.provide.outOfRange.closePosition": "إغلاق الموضع", - "position.provide.outOfRange.description": "لا يمكن تعديل نطاق هذا الموضع أثناء الترحيل. لتعيين نطاق جديد، أغلق هذا الموضع وافتح موضع v4 جديد.", - "position.provide.outOfRange.title": "أنت تقوم بنقل موضع خارج النطاق", - "position.removeHook": "إزالة الخطاف", - "position.resetDescription": "سيتم إعادة تعيين اختيارات الرموز والسعر والنطاق الخاصة بك.", - "position.setRange": "تحديد النطاق السعري", - "position.setRange.inputsBelow": "استخدم المدخلات أدناه لتعيين النطاق الخاص بك.", - "position.stable": "مستقر", - "position.stable.description": "مناسب للعملات المستقرة أو أزواج التقلبات المنخفضة", - "position.step.deposit": "أدخل مبالغ الإيداع", - "position.step.price": "تحديد السعر الأولي ومبالغ الإيداع", - "position.step.range": "تحديد نطاق السعر ومبالغ الإيداع", - "position.step.select": "حدد زوج الرمز والرسوم", - "position.value": "قيمة الموضع", - "position.valueUnavailable": "القيمة بالدولار الأمريكي غير متاحة حاليًا لهذا المركز. راجع تفاصيل المركز لمعرفة مبالغ الرموز المودعة.", - "position.wide": "واسع", - "position.wide.description": "جيد للأزواج المتقلبة", - "position.wrapped.unwrap": "افتح {{wrappedToken}}", - "position.wrapped.warning": "{{nativeToken}} مطلوب لمجموعات v4", - "position.wrapped.warning.info": "قم بفك {{wrappedToken}} وقم بإيداع {{nativeToken}} لتوفير سيولة أكثر فعالية من حيث التكلفة والكفاءة.", - "positions.noPositions.description": "ليس لديك أي مراكز سيولة. أنشئ مركزًا جديدًا لبدء ربح الرسوم والمكافآت من المجموعات المؤهلة.", - "positions.noPositions.title": "لا توجد مواقف", - "positions.welcome.connect.description": "للاطلاع على مراكزك ومكافآتك، يجب عليك ربط محفظتك.", - "positions.welcome.connect.wallet": "قم بتوصيل محفظتك", - "privacy.anonymizedLogs": "يسجل التطبيق إحصائيات الاستخدام مجهولة المصدر من أجل التحسين بمرور الوقت.", - "privacy.autoRouter": "يجلب التطبيق مسار التجارة الأمثل من خادم Uniswap Labs.", - "privacy.infura": "يقوم التطبيق بجلب البيانات الموجودة على السلسلة وإنشاء مكالمات تعاقدية باستخدام واجهة برمجة تطبيقات Infura.", - "privacy.thirdPartyApis": "يستخدم هذا التطبيق واجهات برمجة التطبيقات التابعة لجهات خارجية التالية:", - "privacy.trm": "يجمع التطبيق عنوان محفظتك بشكل آمن ويشاركه مع شركة TRM Labs Inc. لأسباب تتعلق بالمخاطر والامتثال.", - "privacy.uniswaptos": "شروط خدمة Uniswap Labs", - "privateKeys.export.modal.speedbump.bullet1": "شاهد هذا على انفراد", - "privateKeys.export.modal.speedbump.bullet2": "لا تشارك مع أي شخص", - "privateKeys.export.modal.speedbump.bullet3": "لا تدخله أبدًا إلى أي مواقع ويب أو تطبيقات", - "privateKeys.export.modal.speedbump.subtitle": "يمكن لأي شخص يعرف مفتاحك الخاص الوصول إلى محفظتك وأموالك.", - "privateKeys.export.modal.speedbump.title": "قبل المتابعة", - "privateKeys.export.modal.subtitle": "يبدو أنك غير قادر على استعادة محفظتك بالكامل. لضمان عدم فقدان الوصول إلى أموالك، انسخ مفتاحك الخاص.", - "privateKeys.export.modal.title": "تصدير مفتاحك الخاص", - "privateKeys.export.modal.warning": "إذا فقدت هاتفك أو حذفت التطبيق، فسوف تحتاج إلى استيراد هذا المفتاح إلى محفظة أخرى.", - "privateKeys.view.button.continue": "لقد قمت بنسخهم جميعا.", - "privateKeys.view.button.continue.single": "لقد نسخته.", - "privateKeys.view.subtitle": "مفتاحك الخاص يمنحك حق الوصول إلى محفظة محددة. لكل محفظة مفتاح خاص مختلف.", - "privateKeys.view.title": "المفتاح الخاص", - "qrScanner.button.connections_one": "تم ربط تطبيق واحد", - "qrScanner.button.connections_other": "{{count}} التطبيقات متصلة", - "qrScanner.error.camera.message": "لمسح رمز ضوئيًا، اسمح بالوصول إلى الكاميرا في إعدادات النظام", - "qrScanner.error.camera.title": "تم تعطيل الكاميرا", - "qrScanner.error.none": "لم يتم العثور على رمز الاستجابة السريعة", - "qrScanner.recipient.action.scan": "مسح رمز الاستجابة السريعة", - "qrScanner.recipient.action.show": "إظهار رمز الاستجابة السريعة الخاص بي", - "qrScanner.recipient.error.message": "تأكد من قيامك بمسح رمز QR صالح لعنوان Ethereum قبل المحاولة مرة أخرى.", - "qrScanner.recipient.error.title": "رمز الاستجابة السريعة غير صالح", - "qrScanner.request.message.unavailable": "لم يتم العثور على رسالة.", - "qrScanner.request.method.default": "طلب من {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "طلب التوقيع من {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "طلب المعاملة من {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "السماح لـ {{dappName}} باستخدام ما يصل إلى {{amount}} {{currencySymbol}}؟", - "qrScanner.request.withoutAmount": "هل تسمح لـ {{dappName}} باستخدام {{currencySymbol}}؟", - "qrScanner.status.connecting": "توصيل...", - "qrScanner.status.loading": "تحميل...", - "qrScanner.title": "مسح رمز الاستجابة السريعة", - "qrScanner.wallet.networks": "الشبكات المدعومة", - "range.outOfView": "المدى خارج نطاق الرؤية", - "removeLiquidity.pooled": "مجمعة {{symbol}}:", - "revoke.failed.message": "من المحتمل أن مشكلة في الشبكة أو الاتصال تسببت في فشل عملية الإلغاء. تحقق من اتصالك وحاول مرة أخرى.", - "routing.aggregateLiquidity": "عند توفرها، يتم تجميع مصادر السيولة للحصول على أسعار أفضل ومقايضات خالية من الغاز.", - "routing.aggregateLiquidity.uniswapx": "يقوم UniswapX بتجميع مصادر السيولة داخل وخارج السلسلة، مما يوفر لك أفضل الأسعار المتاحة ومقايضات خالية من الغاز.", - "routing.cheapest": "يقوم عميل Uniswap باختيار أرخص سعر لخيارات التداول وتكاليف الشبكة.", - "routing.cheapest.v4": "يقوم عميل Uniswap باختيار خيار التداول الأمثل مع الأخذ في الاعتبار السعر وتكاليف الشبكة.", - "scantastic.code.expired": "منتهي الصلاحية", - "scantastic.code.subtitle": "أدخل هذا الرمز في ملحق Uniswap. سيتم تشفير ونقل عبارة الاسترداد بأمان.", - "scantastic.code.timeRemaining.shorthand.hours": "كود جديد في {{hours}}h {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.minutes": "كود جديد في {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.seconds": "كود جديد في {{seconds}}s", - "scantastic.code.title": "Uniswap رمز لمرة واحدة", - "scantastic.confirmation.button.continue": "نعم، استمر", - "scantastic.confirmation.label.browser": "المتصفح", - "scantastic.confirmation.label.device": "جهاز", - "scantastic.confirmation.subtitle": "تابع فقط إذا كنت تقوم بمسح رمز الاستجابة السريعة من Uniswap Extension على جهاز موثوق به.", - "scantastic.confirmation.title": "هل تحاول استيراد محفظتك؟", - "scantastic.confirmation.warning": "احذر من المواقع والتطبيقات التي تنتحل صفة Uniswap. وإلا فقد تتعرض محفظتك للخطر.", - "scantastic.error.encryption": "فشل في إعداد عبارة البذور.", - "scantastic.error.noCode": "لم يتم تلقي كلمة المرور لمرة واحدة. حاول مرة اخرى.", - "scantastic.error.timeout.message": "قم بمسح رمز الاستجابة السريعة الموجود على ملحق Uniswap مرة أخرى لمواصلة مزامنة محفظتك.", - "scantastic.error.timeout.title": "انتهت مهلة اتصالك", - "scantastic.modal.ipMismatch.description": "لمسح رمز الاستجابة السريعة هذا، يجب أن يكون هاتفك متصلاً بنفس شبكة WiFi المتصل بها جهاز الكمبيوتر الخاص بك ويجب إيقاف تشغيل أي شبكات VPN مؤقتًا.", - "scantastic.modal.ipMismatch.title": "قم بتبديل شبكة WiFi الخاصة بك", - "search.input.placeholder": "البحث عن الرموز والمجموعات", - "search.ukDisclaimer": "إخلاء المسؤولية للمقيمين في المملكة المتحدة", - "send.button.review": "مراجعة النقل", - "send.gas.error.title": "لا يوجد", - "send.gas.networkCost.title": "تكلفة الشبكة", - "send.input.token.balance.title": "الرصيد: {{balance}} {{symbol}}", - "send.recipient.header": "حدد المستلم", - "send.recipient.input.placeholder": "بحث ENS أو العنوان", - "send.recipient.previous_one": "1 تحويل سابق", - "send.recipient.previous_other": "{{count}} الإنتقالات السابقة", - "send.recipient.results.empty": "لم يتم العثور على نتائج", - "send.recipient.results.error": "العنوان الذي كتبته إما غير موجود أو تم كتابته بشكل غير صحيح.", - "send.recipient.section.favorite": "المحافظ المفضلة", - "send.recipient.section.recent": "مؤخرًا", - "send.recipient.section.search": "نتائج البحث", - "send.recipient.section.viewOnly": "محافظ للعرض فقط", - "send.recipient.section.yours": "محافظك", - "send.recipient.warning.viewOnly.message": "لا ترسل الأموال إلى هذه المحفظة إلا إذا كان لديك عبارة الاسترداد أو تعرف مالك المحفظة.", - "send.recipient.warning.viewOnly.title": "لديك هذه كمحفظة للعرض فقط", - "send.recipientSelect.search.empty.message": "عند إرسال الرموز المميزة إلى عنوان المحفظة، ستظهر هنا", - "send.recipientSelect.search.empty.title": "لم يتم حفظ أي محافظ", - "send.review.modal.title": "أنت ترسل", - "send.review.summary.button.title": "تأكيد الإرسال", - "send.search.empty.subtitle": "العنوان الذي كتبته إما غير موجود أو تم كتابته بشكل غير صحيح.", - "send.search.empty.title": "لم يتم العثور على نتائج", - "send.search.placeholder": "بحث ENS أو العنوان", - "send.solanaSendNotSupported": "لا يتم دعم الإرسال على Solana", - "send.title": "يرسل", - "send.unavailableOnSolana.message": "الإرسال غير متاح على محافظ Solana", - "send.warning.blocked.default": "هذه المحفظة محظورة", - "send.warning.blocked.modal.message": "تم حظر هذا العنوان على Uniswap Wallet لأنه مرتبط بنشاط محظور واحد أو أكثر. إذا كنت تعتقد أن هذا خطأ، فيرجى إرسال بريد إلكتروني إلى العنوان@uniswap.org.", - "send.warning.blocked.modal.title": "العنوان المحظور", - "send.warning.blocked.recipient": "محفظة المستلم محظورة", - "send.warning.erc20.checkbox.description": "أنت تحاول إرسال الأموال إلى عنوان رمزي. قد يؤدي هذا إلى خسارة دائمة للأموال.", - "send.warning.erc20.checkbox.heading": "تم اكتشاف عنوان الرمز", - "send.warning.erc20.message": "أنت تحاول إرسال الأموال إلى عنوان رمزي. قد يؤدي إرسال العملات المشفرة إلى هذا النوع من العناوين إلى خسارة دائمة للأموال.", - "send.warning.erc20.title": "هذا عنوان رمزي", - "send.warning.insufficientFunds.message": "لقد انخفض رصيد {{currencySymbol}} الخاص بك منذ أن قمت بإدخال المبلغ الذي ترغب في إرساله", - "send.warning.insufficientFunds.title": "لا يكفي {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "لا يكفي {{currencySymbol}} على {{networkName}} للإرسال", - "send.warning.insufficientGas.message.withoutNetwork": "لا يكفي {{currencySymbol}} للإرسال", - "send.warning.modal.button.cta.blocking": "نعم", - "send.warning.modal.button.cta.cancel": "يلغي", - "send.warning.modal.button.cta.confirm": "يتأكد", - "send.warning.newAddress.details.ENS": "إنس", - "send.warning.newAddress.details.username": "اسم المستخدم", - "send.warning.newAddress.details.walletAddress": "عنوان المحفظة", - "send.warning.newAddress.message": "لم تقم بالتعامل مع هذا العنوان من قبل. يرجى التأكد من صحة العنوان قبل المتابعة.", - "send.warning.newAddress.title": "عنوان جديد", - "send.warning.self.message": "أنت تحاول إرسال الأموال إلى محفظتك الحالية. سيؤدي إرسال التشفير إلى هذا العنوان إلى تكبد تكاليف شبكة غير ضرورية.", - "send.warning.self.title": "هذه هي محفظتك الحالية", - "send.warning.smartContract.message": "أنت على وشك إرسال أموال إلى عنوان عقد ذكي. تأكد من أن هذا هو العنوان الصحيح وأنه يمكنه تلقي الرموز. إذا لم يكن كذلك، فقد يؤدي هذا إلى خسارة دائمة للأموال.", - "send.warning.smartContract.title": "هذا هو عنوان العقد الذكي", - "send.warning.viewOnly.message": "تحتاج إلى استيراد هذه المحفظة عبر عبارة الاسترداد لإرسال الأصول.", - "send.warning.viewOnly.title": "هذه المحفظة للعرض فقط", - "send.youAreSending": "أنت ترسل", - "sendRecipientForm.recentAddresses.label": "الأخيرة", - "sendReviewModal.title": "إرسال المراجعة", - "setting.recoveryPhrase.account.show": "إظهار عبارة الاسترداد", - "setting.recoveryPhrase.action.hide": "إخفاء عبارة الاسترداد", - "setting.recoveryPhrase.remove": "إزالة عبارة الاسترداد", - "setting.recoveryPhrase.remove.confirm.subtitle": "أدرك أن Uniswap Labs لا يمكنها مساعدتي في استعادة محفظتي إذا فشلت في القيام بذلك.", - "setting.recoveryPhrase.remove.confirm.title": "لقد قمت بحفظ عبارة الاسترداد الخاصة بي", - "setting.recoveryPhrase.remove.initial.subtitle": "تأكد من حفظ عبارة الاسترداد الخاصة بك. وإلا فسوف تفقد الوصول إلى محفظتك", - "setting.recoveryPhrase.remove.initial.title": "قبل المتابعة", - "setting.recoveryPhrase.remove.subtitle": "أدخل كلمة المرور الخاصة بك للتأكيد", - "setting.recoveryPhrase.remove.title": "أنت تقوم بإزالة عبارة الاسترداد ", - "setting.recoveryPhrase.view.warning.message1": "يمكن لأي شخص يعرف عبارة الاسترداد الخاصة بك الوصول إلى محفظتك وأموالك", - "setting.recoveryPhrase.view.warning.message2": "شاهد هذا على انفراد", - "setting.recoveryPhrase.view.warning.message3": "لا تشارك مع أي شخص", - "setting.recoveryPhrase.view.warning.message4": "لا تدخله أبدًا إلى أي مواقع ويب أو تطبيقات", - "setting.recoveryPhrase.view.warning.title": "قبل المتابعة", - "setting.recoveryPhrase.warning.view.message": "يمكن لأي شخص يعرف عبارة الاسترداد الخاصة بك الوصول إلى محفظتك وأموالك.", - "setting.recoveryPhrase.warning.view.title": "شاهد هذا في مكان خاص", - "settings.action.enableInSettings": "تمكين في الإعدادات", - "settings.action.feedback": "ارسل رأيك", - "settings.action.help": "احصل على مساعدة", - "settings.action.lock": "قفل المحفظة", - "settings.action.privacy": "سياسة الخصوصية", - "settings.action.terms": "شروط الخدمة", - "settings.connectWalletPlatform.warning": "لاستخدام Uniswap على {{platform}}، قم بالاتصال بمحفظة تدعم {{platform}}.", - "settings.footer": "صُنع بكل حب، \nفريق Uniswap 🦄", - "settings.hideSmallBalances": "إخفاء الأرصدة الصغيرة", - "settings.hideSmallBalances.subtitle": "سيتم إخفاء الأرصدة التي تقل عن 1 دولار أمريكي من محفظتك.", - "settings.maxSlippage": "الأعلى. انزلاق", - "settings.maxSlippage.amount": "{{amount}} أقصى انزلاق", - "settings.section.about": "عن", - "settings.section.preferences": "التفضيلات", - "settings.section.privacyAndSecurity": "الخصوصية والأمان", - "settings.section.support": "يدعم", - "settings.section.wallet.hidden.row.title": "{{numHidden}} محافظ أخرى", - "settings.setting.advanced.title": "متقدم", - "settings.setting.advancedSettings": "Advanced settings", - "settings.setting.appearance.option.auto": "آلي", - "settings.setting.appearance.option.dark.subtitle": "استخدم دائمًا المظهر الداكن.", - "settings.setting.appearance.option.dark.title": "مظلم", - "settings.setting.appearance.option.device.subtitle": "يتكيف مع إعدادات جهازك.", - "settings.setting.appearance.option.device.title": "آلي", - "settings.setting.appearance.option.light.subtitle": "استخدم دائمًا المظهر الفاتح.", - "settings.setting.appearance.option.light.title": "ضوء", - "settings.setting.appearance.title": "سمة", - "settings.setting.backup.create.description": "سيؤدي تعيين كلمة مرور إلى تشفير النسخة الاحتياطية لعبارة الاسترداد، مما يضيف مستوى إضافيًا من الحماية في حالة تعرض حسابك {{cloudProviderName}} للاختراق.", - "settings.setting.backup.create.title": "قم بالنسخ الاحتياطي إلى {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "ونظرًا لأن هذه المحافظ تشترك في عبارة استرداد، فإنها ستحذف أيضًا النسخ الاحتياطية لهذه المحافظ أدناه", - "settings.setting.backup.delete.confirm.title": "هل أنت متأكد؟", - "settings.setting.backup.delete.warning": "إذا قمت بحذف النسخة الاحتياطية {{cloudProviderName}} ، فلن تتمكن من استرداد محفظتك إلا من خلال نسخة احتياطية يدوية لعبارة الاسترداد الخاصة بك. لا تستطيع Uniswap Labs استرداد الأصول الخاصة بك إذا فقدت عبارة الاسترداد الخاصة بك.", - "settings.setting.backup.error.message.full": "غير قادر على عمل نسخة احتياطية لعبارة الاسترداد إلى {{cloudProviderName}}. يرجى التأكد من تمكين {{cloudProviderName}} مع مساحة التخزين المتوفرة والمحاولة مرة أخرى.", - "settings.setting.backup.error.message.short": "غير قادر على حذف النسخة الاحتياطية", - "settings.setting.backup.error.title": "{{cloudProviderName}} خطأ", - "settings.setting.backup.modal.description": "لم تقم بعمل نسخة احتياطية لعبارة الاسترداد الخاصة بك إلى {{cloudProviderName}} حتى الآن. ومن خلال القيام بذلك، يمكنك استرداد محفظتك بمجرد تسجيل الدخول إلى {{cloudProviderName}} على أي جهاز.", - "settings.setting.backup.modal.title": "نسخ عبارة الاسترداد احتياطيًا إلى {{cloudProviderName}}؟", - "settings.setting.backup.password.error.mismatch": "كلمة المرور غير مطابقة", - "settings.setting.backup.password.medium": "هذه كلمة مرور متوسطة", - "settings.setting.backup.password.placeholder.confirm": "تأكيد كلمة المرور", - "settings.setting.backup.password.placeholder.create": "إنشاء كلمة المرور", - "settings.setting.backup.password.strong": "هذه كلمة مرور قوية", - "settings.setting.backup.password.weak": "هذه كلمة مرور ضعيفة", - "settings.setting.backup.recoveryPhrase.label": "عبارة الاسترداد", - "settings.setting.backup.selected": "{{cloudProviderName}} النسخ الاحتياطي", - "settings.setting.backup.status.action.delete": "حذف النسخة الاحتياطية", - "settings.setting.backup.status.complete": "تم النسخ الاحتياطي إلى {{cloudProviderName}}", - "settings.setting.backup.status.description": "من خلال نسخ عبارة الاسترداد احتياطيًا إلى {{cloudProviderName}}، يمكنك استرداد محفظتك بمجرد تسجيل الدخول إلى حسابك {{cloudProviderName}} على أي جهاز.", - "settings.setting.backup.status.inProgress": "جارٍ النسخ الاحتياطي إلى {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "استعيدت", - "settings.setting.backup.status.title": "{{cloudProviderName}} النسخ الاحتياطي", - "settings.setting.beta.tooltip": "قريباً", - "settings.setting.biometrics.appAccess.subtitle.android": "يتطلب الوجه/بصمة الإصبع لفتح التطبيق.", - "settings.setting.biometrics.appAccess.subtitle.ios": "يتطلب {{biometricsMethod}} لفتح التطبيق.", - "settings.setting.biometrics.appAccess.title": "الوصول إلى التطبيق", - "settings.setting.biometrics.auth": "يرجى المصادقة", - "settings.setting.biometrics.extension.waitingForBiometricsModal.content": "قم بتمكين {{biometricsMethod}} في متصفحك أو إعدادات النظام للمتابعة.", - "settings.setting.biometrics.extension.waitingForBiometricsModal.title": "في انتظار {{biometricsMethod}}", - "settings.setting.biometrics.off.message.android": "تم إيقاف القياسات الحيوية حاليًا لـ Uniswap Wallet، ويمكنك تشغيلها في إعدادات النظام لديك.", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} معطل حاليًا لـ Uniswap Wallet — يمكنك تشغيله في إعدادات النظام لديك.", - "settings.setting.biometrics.off.title.android": "تم إيقاف القياسات الحيوية", - "settings.setting.biometrics.off.title.ios": "تم إيقاف تشغيل {{biometricsMethod}}", - "settings.setting.biometrics.title": "فتح القفل عن طريق الوجه/بصمة الإصبع", - "settings.setting.biometrics.transactions.subtitle.android": "يتطلب الوجه/بصمة الإصبع لإتمام المعاملات.", - "settings.setting.biometrics.transactions.subtitle.ios": "يتطلب {{biometricsMethod}} لإتمام المعاملة.", - "settings.setting.biometrics.transactions.title": "المعاملات", - "settings.setting.biometrics.unavailable.message.android": "لم يتم إعداد القياسات الحيوية على جهازك. لاستخدام القياسات الحيوية، قم بإعدادها أولاً في الإعدادات.", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} لم يتم إعداده على جهازك. لاستخدام {{biometricsMethod}}، قم بإعداده أولاً في الإعدادات.", - "settings.setting.biometrics.unavailable.title.android": "لم يتم إعداد القياسات الحيوية", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} لم يتم إعداده", - "settings.setting.biometrics.warning.message.android": "إذا لم تقم بتشغيل القياسات الحيوية، فيمكن لأي شخص يمكنه الوصول إلى جهازك فتح Uniswap Wallet وإجراء المعاملات.", - "settings.setting.biometrics.warning.message.ios": "إذا لم تقم بتشغيل {{biometricsMethod}}، فيمكن لأي شخص يمكنه الوصول إلى جهازك فتح Uniswap Wallet وإجراء المعاملات.", - "settings.setting.biometrics.warning.title": "هل أنت متأكد؟", - "settings.setting.connections.disconnectAll": "افصل كل شيء", - "settings.setting.connections.noConnectionsDescription": "قم بالاتصال بالتطبيق من خلال البحث عن زر \"Connect Wallet\" أو \"تسجيل الدخول\".", - "settings.setting.currency.title": "العملة المحلية", - "settings.setting.deviceAccess.reset.title": "إعادة تعيين {{biometricsMethod}}", - "settings.setting.deviceAccess.title": "الوصول إلى الجهاز", - "settings.setting.deviceAccessTimeout.1hour": "ساعة واحدة", - "settings.setting.deviceAccessTimeout.24hours": "24 ساعة", - "settings.setting.deviceAccessTimeout.30minutes": "30 دقيقة", - "settings.setting.deviceAccessTimeout.5minutes": "5 دقائق", - "settings.setting.deviceAccessTimeout.never": "أبداً", - "settings.setting.deviceAccessTimeout.title": "مهلة القفل التلقائي", - "settings.setting.hapticTouch.title": "اللمسة اللمسية", - "settings.setting.helpCenter.title": "مركز المساعدة", - "settings.setting.language.button.navigate": "اذهب للاعدادات", - "settings.setting.language.description.extension": "يتم تعيين Uniswap افتراضيًا على إعدادات لغة النظام لديك. لتغيير لغتك المفضلة، انتقل إلى إعدادات النظام لديك.", - "settings.setting.language.description.mobile": "يُضبط Uniswap افتراضيًا على لغة جهازك. لتغيير لغتك المفضلة، انتقل إلى \"Uniswap\" في إعدادات جهازك وانقر على \"اللغة\".", - "settings.setting.language.title": "لغة", - "settings.setting.notifications.row.activity.description": "التحويلات والطلبات والأنشطة الأخرى", - "settings.setting.notifications.row.activity.title": "نشاط المحفظة", - "settings.setting.notifications.row.updates.description": "التوصيات والميزات الجديدة", - "settings.setting.notifications.row.updates.title": "تحديثات من Uniswap", - "settings.setting.notifications.title": "إشعارات", - "settings.setting.password.change.title": "إنشاء كلمة مرور جديدة", - "settings.setting.password.title": "تغيير كلمة المرور", - "settings.setting.permissions.title": "الأذونات", - "settings.setting.privacy.analytics.description": "نحن نستخدم بيانات استخدام مجهولة المصدر لتحسين تجربتك عبر منتجات Uniswap Labs. عند التعطيل، فإننا نتتبع الأخطاء والاستخدام الأساسي فقط.", - "settings.setting.privacy.analytics.title": "تحليلات التطبيق", - "settings.setting.privateKeys.title": "المفاتيح الخاصة", - "settings.setting.recoveryPhrase.title": "عبارة الاسترداد", - "settings.setting.smallBalances.title": "رصيد المحفظة", - "settings.setting.smartWallet.action.enable": "يُمكَِن", - "settings.setting.smartWallet.action.smartWallet": "Smart wallet", - "settings.setting.smartWallet.notEligible": "غير مؤهل", - "settings.setting.smartWallet.status.actionRequired": "الإجراء المطلوب", - "settings.setting.smartWallet.status.active": "نشيط", - "settings.setting.smartWallet.status.inactive": "غير نشط", - "settings.setting.smartWallet.status.unavailable": "غير متوفره", - "settings.setting.unknownTokens.subtitle": "سيتم إخفاء رموز الاحتيال المحتملة من محفظتك.", - "settings.setting.unknownTokens.title": "إخفاء الرموز غير المعروفة", - "settings.setting.wallet.action.editLabel": "تحرير التسمية", - "settings.setting.wallet.action.editProfile": "تعديل الملف الشخصي", - "settings.setting.wallet.action.remove": "إزالة المحفظة", - "settings.setting.wallet.connection.banner.description": "يمكنك إدارة الاتصالات عبر إعدادات المحفظة، وذلك بالنقر على صورة ملفك الشخصي.", - "settings.setting.wallet.connection.banner.title": "لقد انتقلت الاتصالات", - "settings.setting.wallet.connections.title": "الاتصالات", - "settings.setting.wallet.editLabel.description": "التسميات ليست عامة. يتم تخزينها محليًا وتكون مرئية لك فقط.", - "settings.setting.wallet.editLabel.save": "حفظ التغييرات", - "settings.setting.wallet.label": "كنية", - "settings.setting.wallet.testnetMode.description": "يؤدي هذا إلى تشغيل شبكات الاختبار للمطورين لتجربة الميزات والمعاملات دون استخدام أصول حقيقية. لا تحمل الرموز الموجودة على شبكات الاختبار أي قيمة حقيقية.", - "settings.setting.wallet.testnetMode.title": "وضع الشبكة الاختبارية", - "settings.switchNetwork.warning": "لاستخدام Uniswap على {{label}}، قم بتبديل الشبكة في إعدادات محفظتك.", - "settings.title": "إعدادات", - "settings.version": "الإصدار {{appVersion}}", - "smartWallet.actionRequired.cta": "تعطيل على شبكة واحدة", - "smartWallet.actionRequired.cta.plural": "تعطيل على شبكات {{amount}}", - "smartWallet.actionRequired.description": "يعد تعطيل المحفظة الذكية إجراءً على السلسلة ويتطلب تكلفة شبكة صغيرة.", - "smartWallet.actionRequired.insufficientFunds": "رصيد غير كاف", - "smartWallet.actionRequired.reactivate": "استمر في استخدام المحفظة الذكية", - "smartWallet.actionRequired.title": "المحفظة الذكية نشطة على شبكة واحدة", - "smartWallet.actionRequired.title.plural": "المحفظة الذكية نشطة على شبكات {{amount}}", - "smartWallet.activeNetworks.title": "المحفظة الذكية نشطة على شبكة واحدة", - "smartWallet.activeNetworks.title.plural": "المحفظة الذكية نشطة على شبكات {{amount}}", - "smartWallet.banner.networkCost": "Includes a one-time cost to activate your smart wallet on {{chainName}}.", - "smartWallet.banner.text": "قم بتفعيل المحفظة الذكية لتوفير ما يصل إلى 50% من تكاليف الشبكة.", - "smartWallet.confirmDisableSmartWallet.description": "ستفقد عمليات التبديل السريعة وتكاليف الشبكة المخفضة والتحسينات الأخرى القادمة.", - "smartWallet.confirmDisableSmartWallet.title": "هل أنت متأكد؟", - "smartWallet.insufficient.description": "لا يمكن تعطيل المحفظة الذكية على هذه الشبكات حتى يتوفر لديك أموال لتغطية تكاليف الشبكة.", - "smartWallet.insufficient.title": "رصيد غير كاف على شبكة واحدة", - "smartWallet.insufficient.title.plural": "رصيد غير كافٍ على شبكات {{amount}}", - "smartWallet.InsufficientFunds.button.continue.text": "استمر على أية حال", - "smartWallet.insufficientFunds.network.banner.description": "لا يمكن تعطيله بسبب عدم كفاية الأموال.", - "smartWallet.insufficientFunds.network.banner.title_one": "{{count}} تم استبعاد الشبكة", - "smartWallet.insufficientFunds.network.banner.title_other": "{{count}} تم استبعاد الشبكة", - "smartWallet.insufficientFunds.network.disable.text": "جاهز للتعطيل", - "smartWallet.insufficientFunds.network.text": "أنت بحاجة إلى {{nativeCurrency}}", - "smartWallet.insufficientFunds.single.network.banner.title": "{{chain}} مستبعد", - "smartWallet.modal.description.block1": "تستخدم المحافظ الذكية العقود الذكية لإجراء معاملات أسرع وأقل تكلفة.", - "smartWallet.modal.description.block2": "لن تتأثر المحافظ التي تستخدم بالفعل ميزات المحفظة الذكية من تطبيق آخر.", - "smartWallet.modal.title": "المحفظة الذكية", - "smartWallets": "المحافظ الذكية", - "smartWallets.activeNetworks.description": "يتم تنشيط محفظتك الذكية تلقائيًا عبر كل شبكة جديدة تقوم بالتبديل عليها.", - "smartWallets.createdModal.description": "You’re getting faster transactions and lower network costs on every swap.", - "smartWallets.createdModal.title": "تم إنشاء المحفظة الذكية", - "smartWallets.delegation.limitedSupport": "محفظتك لديها دعم محدود", - "smartWallets.delegationMismatchModal.description": "{{walletName}} لا يدعم أحدث معايير Ethereum المستخدمة بواسطة {{displayName}}، لذا فإن بعض الميزات غير متوفرة.", - "smartWallets.delegationMismatchModal.features.1ClickSwaps": "المبادلات بنقرة واحدة", - "smartWallets.delegationMismatchModal.features.gasFreeSwaps": "مقايضات خالية من الغاز", - "smartWallets.delegationMismatchModal.features.limitOrders": "أوامر الحد", - "smartWallets.delegationMismatchModal.limitOrders.unsupported": "لا يتم دعم أوامر الحد الأقصى بواسطة محفظتك.", - "smartWallets.delegationMismatchModal.title": "دعم محدود للمحفظة", - "smartWallets.disable.failed": "حدث خطأ. المحفظة الذكية لا تزال نشطة على شبكة واحدة أو أكثر. يُرجى المحاولة مرة أخرى.", - "smartWallets.disable.modal.description": "يتطلب هذا الإجراء على السلسلة تكلفة الشبكة.", - "smartWallets.disable.modal.title": "تعطيل المحفظة الذكية", - "smartWallets.educationalModal.description": "توفر المحافظ الذكية معاملات أسرع وأقل تكلفة باستخدام العقود الذكية.", - "smartWallets.educationalModal.info": "لن تتأثر المحافظ التي تستخدم بالفعل ميزات المحفظة الذكية من تطبيق آخر.", - "smartWallets.enabledModal.description": "سيتم تطبيق التحديثات في عملية التبديل التالية.", - "smartWallets.enabledModal.description.dapp": "سيتم تطبيق التحديثات في معاملتك التالية.", - "smartWallets.enabledModal.description.dapp.line2": "أعد توصيل محفظتك لبدء استخدام ميزات المحفظة الذكية على التطبيقات على الفور.", - "smartWallets.enabledModal.title": "تم تمكين المحفظة الذكية", - "smartWallets.postSwapNudge.enable": "تمكين المحفظة الذكية", - "smartWallets.postSwapNudge.title": "وفر في عملية المبادلة القادمة", - "smartWallets.postSwapNudge.title.dapp": "يدعم هذا التطبيق المحافظ الذكية", - "smartWallets.unavailableModal.description": "يُدير موفر محفظة آخر إعدادات المحفظة الذكية لـ {{displayName}}. يمكنك الاستمرار في استخدام Uniswap كالمعتاد.", - "smartWallets.unavailableModal.title": "ميزات المحفظة الذكية غير متوفرة", - "solanaPromo.banner.description": "قم بتداول رموز Solana مباشرة على Uniswap.", - "solanaPromo.banner.title": "سولانا متاحة الآن", - "solanaPromo.modal.connectWallet": "قم بتوصيل محفظة Solana المفضلة لديك", - "solanaPromo.modal.startSwapping.button": "ابدأ بالتبديل على سولانا", - "solanaPromo.modal.swapInstantly": "قم بتبديل آلاف الرموز الرائجة على الفور", - "solanaPromo.modal.viewTokenData": "عرض بيانات الرموز والأسعار في مكان واحد", - "speedBump.newAddress.warning.description": "لم تقم بالتعامل مع هذا العنوان من قبل. تأكد من أنه العنوان الصحيح قبل المتابعة.", - "speedBump.newAddress.warning.title": "عنوان جديد", - "speedBump.smartContractAddress.warning.description": "أنت على وشك إرسال الرموز المميزة إلى نوع خاص من العناوين - عقد ذكي. تحقق مرة أخرى من العنوان الذي تنوي الإرسال إليه. إذا كان الأمر خاطئًا، فقد تفقد الرموز المميزة الخاصة بك إلى الأبد.", - "speedBump.smartContractAddress.warning.title": "هل هذا عنوان المحفظة؟", - "stats.24fees": "رسوم 24 ساعة", - "stats.24swapVolume": "حجم المبادلة على مدار 24 ساعة", - "stats.24volume": "حجم 24 ساعة", - "stats.allTimeSwappers": "مقايضة كل الوقت", - "stats.allTimeVolume": "حجم كل الوقت", - "stats.fdv": "اف دي في", - "stats.fdv.description": "يحسب التقييم المخفف بالكامل (FDV) إجمالي القيمة السوقية على افتراض أن جميع الرموز المميزة متداولة.", - "stats.marketCap": "القيمة السوقية", - "stats.marketCap.description": "القيمة السوقية هي القيمة السوقية الإجمالية للعرض المتداول للأصل.", - "stats.noStatsAvailable": "لا توجد إحصائيات متاحة", - "stats.tvl": "القيمة الإجمالية المقفلة", - "stats.tvl.description": "القيمة الإجمالية المقفلة (TVL) هي المبلغ الإجمالي للأصول المتاحة عبر جميع مجموعات السيولة Uniswap.", - "stats.volume.1d": "حجم 1 أيام", - "stats.volume.1d.description": "حجم اليوم الواحد هو مقدار الأصول التي تم تداولها على Uniswap خلال الـ 24 ساعة الماضية.", - "stats.volume.1d.long": "حجم أحادي الأبعاد", - "stats.volume.1d.short": "1D المجلد", - "stats.volume.description": "الحجم هو مقدار الأصول التي تم تداولها على Uniswap خلال الإطار الزمني المحدد.", - "swap.allow.oneTime": "السماح {{sym}} (مرة واحدة)", - "swap.approveAndSubmit": "الموافقة والتقديم", - "swap.approveAndSwap": "الموافقة والمبادلة", - "swap.balance.amount": "الرصيد: {{amount}}", - "swap.bestPrice.through": "الطريق عبر {{provider}}", - "swap.bestRoute.cost": "من المتوقع أن تبلغ تكلفة الطريق الأكثر كفاءة حوالي{{gasPrice}} في تكاليف الشبكة. ", - "swap.bridging.title": "التبديل عبر الشبكات", - "swap.bridging.warning.description": "أنت تقوم بالتبديل من {{fromNetwork}} إلى {{toNetwork}}. يُعرف هذا أيضًا باسم \"الربط\"، والذي ينقل رموزك من شبكة إلى أخرى.", - "swap.button.confirmSignAndSwap": "تأكيد التوقيع والتبديل", - "swap.button.confirmSwapAnyways": "تأكيد المبادلة على أي حال", - "swap.button.confirmUnwrap": "تأكيد فك التغليف", - "swap.button.max": "الأعلى", - "swap.button.review": "مراجعة", - "swap.button.submitting": "جاري ارسال المبادلة...", - "swap.button.submitting.keep.open": "أبقِ محفظتك مفتوحة...", - "swap.button.submitting.passkey": "تأكيد باستخدام مفتاح المرور", - "swap.button.swap": "تبديل", - "swap.button.swapAnyways": "تبادل على أية حال", - "swap.button.unwrap": "بسط", - "swap.button.wrap": "طَوّق", - "swap.buy.countryModal.placeholder": "البحث حسب البلد أو المنطقة", - "swap.cancel.cannotExecute_one": "يمكن تنفيذ المبادلة الخاصة بك قبل معالجة الإلغاء. لا يمكن استرداد تكاليف الشبكة الخاصة بك. هل ترغب في المتابعة؟", - "swap.cancel.cannotExecute_other": "يمكن تنفيذ مقايضاتك قبل معالجة الإلغاء. لا يمكن استرداد تكاليف الشبكة الخاصة بك. هل ترغب في المتابعة؟", - "swap.confirmApproveAndSwap": "تأكيد الموافقة والتبديل", - "swap.confirmLimit": "تأكيد الحد", - "swap.confirmSwap": "تأكيد المبادلة", - "swap.confirmWrap": "تأكيد الالتفاف", - "swap.deadline.settings.title": "الموعد النهائي للمبادلة", - "swap.deadline.settings.title.short": "الموعد النهائي لـ Tx.", - "swap.details.completed": "تم المبادلة بالكامل", - "swap.details.estimatedTime": "الوقت المقدر", - "swap.details.fasterUnichainSwaps": "تبادلات أسرع مدعومة بواسطة Unichain", - "swap.details.feeOnTransfer": "{{tokenSymbol}} رسوم", - "swap.details.feeOnTransfer.symbol": "{{tokenSymbol}} رسوم رمزية", - "swap.details.instant": "فوري", - "swap.details.newQuote.input": "مدخلات جديدة", - "swap.details.newQuote.output": "إخراج جديد", - "swap.details.orderRouting": "توجيه الطلب", - "swap.details.orderRoutingInfo": "يتم توجيه هذا التبادل عبر Across، وهو بروتوكول لامركزي ينقل الأصول عبر الشبكات مع إعطاء الأولوية للسلامة والتنفيذ السريع والأسعار المنخفضة.", - "swap.details.poweredBy": "مدعوم بواسطة", - "swap.details.rate": "معدل", - "swap.details.slippage": "أقصى انزلاق", - "swap.details.slippage.uniswap": "انزلاق Uniswap المحمي", - "swap.details.swappedIn.unichain": "تم الانتهاء منه في {{time}}ثانية على Unichain", - "swap.details.uniswapFee": "مصاريف", - "swap.error.default": "قد تحتاج إلى زيادة قدرتك على تحمل الانزلاق. ملاحظة: الرموز المميزة للرسوم عند النقل وإعادة الأساس غير متوافقة مع Uniswap V3.", - "swap.error.expectedToFail": "من المتوقع أن تفشل المبادلة الخاصة بك.", - "swap.error.fiatInputUnavailable": "{{fiatCurrencyCode}} الإدخال غير متاح", - "swap.error.modifiedByWallet": "تم تعديل المبادلة الخاصة بك من خلال محفظتك. إذا كان هذا خطأً، فيرجى الإلغاء فورًا وإلا ستخاطر بخسارة أموالك.", - "swap.error.rejected": "تم رفض المعاملة", - "swap.error.undefinedObject": "حدث خطأ أثناء محاولة تنفيذ عملية المبادلة هذه. قد تحتاج إلى زيادة قدرتك على تحمل الانزلاق. إذا لم ينجح ذلك، فقد يكون هناك عدم توافق مع الرمز المميز الذي تتداوله. ملاحظة: الرموز المميزة للرسوم عند النقل وإعادة الأساس غير متوافقة مع Uniswap V3.", - "swap.error.unknown": "خطأ غير معروف.", - "swap.error.v2.expired": "تعذر إرسال هذه المعاملة نظرًا لانتهاء الموعد النهائي. يرجى التأكد من أن الموعد النهائي لمعاملتك ليس منخفضًا جدًا.", - "swap.error.v2.k": "لم يكن Uniswap الثابت x*y=k راضيًا عن المبادلة. يعني هذا عادةً أن أحد الرموز المميزة التي تقوم بتبديلها يتضمن سلوكًا مخصصًا عند النقل.", - "swap.error.v2.slippage": "لن تنجح هذه المعاملة سواء بسبب حركة السعر أو رسوم التحويل. حاول زيادة قدرتك على تحمل الانزلاق", - "swap.error.v2.transferInput": "لا يمكن نقل رمز الإدخال. قد تكون هناك مشكلة في رمز الإدخال.", - "swap.error.v2.transferOutput": "لا يمكن نقل رمز الإخراج. قد تكون هناك مشكلة في رمز الإخراج.", - "swap.error.v3.slippage": "لن تنجح هذه الصفقة بسبب حركة السعر. حاول زيادة قدرتك على تحمل الانزلاق. ملحوظة: رسوم النقل ورموز إعادة التأسيس غير متوافقة مع Uniswap V3.", - "swap.error.v3.transferOutput": "لا يمكن نقل رمز الإخراج. قد تكون هناك مشكلة في رمز الإخراج. ملحوظة: رسوم النقل ورموز إعادة التأسيس غير متوافقة مع Uniswap V3.", - "swap.estimatedDifference.label": "سيكون هناك فرق كبير بين قيم المدخلات والمخرجات بسبب السيولة الحالية.", - "swap.expected.price": "السعر المتوقع", - "swap.fail.batched": "قد لا تدعم محفظتك المتصلة عمليات المبادلة بنقرة واحدة. جرّب عملية مبادلة قياسية بدلاً من ذلك.", - "swap.fail.batched.retry": "جرب المبادلة القياسية", - "swap.fail.batched.title": "فشل التبديل بنقرة واحدة", - "swap.fail.message": "حاول تعديل الانزلاق إلى قيمة أعلى.", - "swap.fail.uniswapX": "لا يمكن إكمال عملية المبادلة باستخدام UniswapX. حاول إجراء المبادلة مرة أخرى لتوجيهها عبر Uniswap API الكلاسيكي.", - "swap.fees.experience": "يتم تطبيق هذه الرسوم على بعض أزواج الرموز لضمان أفضل تجربة مع Uniswap. يتم دفعها في الرمز الناتج وقد تم تضمينها بالفعل في السعر.", - "swap.fees.jupiter.label": "رسوم المشتري", - "swap.fees.jupiter.message": "تُفرض رسوم سولانا عبر واجهة برمجة تطبيقات جوبيتر. لا تتقاضى Uniswap Labs هذه الرسوم.", - "swap.fees.noFee": "يتم تطبيق الرسوم على أزواج الرموز المميزة لضمان أفضل تجربة مع Uniswap. لا توجد رسوم مرتبطة بهذا المبادلة.", - "swap.finalizingQuote": "الانتهاء من الاقتباس...", - "swap.form.header": "تبديل", - "swap.form.warning.output.fotFees": "نظرًا لرسوم الرمز المميز التي تبلغ {{fotCurrencySymbol}}، لا يمكن إدخال مبالغ المبادلة إلا باستخدام حقل الإدخال", - "swap.form.warning.output.fotFees.fallback": "نظرًا لرسوم الرمز المميز، لا يمكن إدخال مبالغ المبادلة إلا باستخدام حقل الإدخال", - "swap.form.warning.output.solana": "لا يتم دعم الإخراج الدقيق على Solana", - "swap.form.warning.restore": "استعادة محفظتك للتبديل", - "swap.frontrun.warning": "قد تكون معاملتك في المقدمة وتؤدي إلى تجارة غير مواتية.", - "swap.header.viewOnly": "للاطلاع فقط", - "swap.impactOfTrade": "تأثير تجارتك على سعر السوق لهذا المجمع.", - "swap.impactOfTrade.uniswapx": "الفرق بين سعر السوق وسعر التنفيذ، مع الأخذ في الاعتبار توفير الغاز UniswapX.", - "swap.impactOfTrade.uniswapx.missing": "قد لا تكون حسابات تأثير السعر متاحة للأزواج ذات السيولة المنخفضة.", - "swap.inputEstimated.atMost": "يتم تقدير المدخلات. سوف تبيع على الأكثر أو ستعود المعاملة.", - "swap.limit": "حد", - "swap.limitFilled": "الحد ممتلئ!", - "swap.limitSubmitted": "الحد المقدم", - "swap.marketPrice.outsideRange.label": "سعر السوق خارج النطاق السعري المحدد. الودائع ذات الأصول الواحدة فقط.", - "swap.min.price": "الحد الأدنى للسعر", - "swap.networkCost.paidIn": "يتم دفع تكلفة الشبكة بـ {{sym}} على الشبكة {{chainName}} من أجل إجراء المعاملات.", - "swap.orderRouting": "توجيه الطلب", - "swap.outputEstimated.atLeast": "ويقدر الناتج. سوف تتلقى على الأقل أو سيتم إرجاع المعاملة.", - "swap.placeOrder": "مكان الامر", - "swap.priceImpact": "تأثير السعر", - "swap.request.title.full": "مبادلة {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "مبادلة الرموز", - "swap.review": "مراجعة المبادلة", - "swap.review.summary": "أنت تقوم بالتبديل", - "swap.reviewLimit": "حد المراجعة", - "swap.route.optimizedGasCost": "يأخذ هذا المسار في الاعتبار المسارات المنقسمة والقفزات المتعددة وتكاليف الشبكة لكل خطوة.", - "swap.routing.jupiter.description": "يقوم جوبيتر بتجميع السيولة من مصادر متعددة لتزويدك بأفضل الأسعار.", - "swap.routing.uniswapAutoRouter.description": "يأخذ جهاز Uniswap Auto Router في الاعتبار المسارات المثالية وتكاليف الشبكة لتزويدك بأفضل الأسعار.", - "swap.settings.deadline.tooltip": "سيتم استرداد معاملتك إذا ظلت معلقة لأكثر من هذه الفترة الزمنية. (الحد الأقصى: 3 أيام).", - "swap.settings.deadline.warning": "الموعد النهائي مرتفع", - "swap.settings.oneClickSwap.title": "المبادلات بنقرة واحدة", - "swap.settings.oneClickSwap.tooltip": "تجميع إجراءات التداول القياسية معًا لإجراء عمليات مقايضة أسرع وأقل تكلفة.", - "swap.settings.protection.description": "مع تشغيل حماية المبادلة، ستتم حماية معاملاتك على الإيثيريوم من هجمات الساندويتش، مع تقليل فرص الفشل.", - "swap.settings.protection.subtitle.supported": "{{chainName}} الشبكة", - "swap.settings.protection.subtitle.unavailable": "غير متوفر على {{chainName}}", - "swap.settings.protection.title": "حماية المبادلة", - "swap.settings.routingPreference.option.default.description": "يؤدي تحديد هذا الخيار إلى تحديد الطريق الأكثر كفاءة لعملية التبديل الخاصة بك.", - "swap.settings.routingPreference.option.default.description.preV4": "يقوم عميل Uniswap باختيار خيار التداول الأرخص مع الأخذ في الاعتبار السعر وتكاليف الشبكة.", - "swap.settings.routingPreference.option.default.description.uniswapXUnavailable": "UniswapX غير متاح لمحفظتك", - "swap.settings.routingPreference.option.default.tooltip": "يتم تحديد المسار مع الأخذ في الاعتبار مجموعات v2 وv3 وv4 معينة، مع الأخذ في الاعتبار تأثير السعر المقدر وتكاليف الشبكة.", - "swap.settings.routingPreference.option.v2.title": "تمكين مجموعات v2", - "swap.settings.routingPreference.option.v3.title": "تمكين مجموعات v3", - "swap.settings.routingPreference.option.v4.hooks.title": "تمكين مجموعات الخطاف v4", - "swap.settings.routingPreference.option.v4.hooks.tooltip": "تقوم خطافات V4 بتبادل المسارات من خلال مجموعة من الخطافات المعتمدة مسبقًا.", - "swap.settings.routingPreference.option.v4.title": "تمكين مجموعات v4", - "swap.settings.routingPreference.title": "خيارات التجارة", - "swap.settings.slippage.alert": "انزلاق عالي", - "swap.settings.slippage.control.auto": "آلي", - "swap.settings.slippage.description": "سيتم إرجاع معاملتك إذا تغير السعر بأكثر من نسبة الانزلاق.", - "swap.settings.slippage.input.message": "إذا انخفض السعر أكثر من ذلك، فسيتم إرجاع معاملتك. فيما يلي الحد الأدنى للمبلغ الذي نضمن حصولك عليه.", - "swap.settings.slippage.input.receive.title": "تلقي على الأقل", - "swap.settings.slippage.output.message": "إذا انخفض السعر أكثر من ذلك، فسيتم إرجاع معاملتك. فيما يلي الحد الأقصى للمبلغ الذي قد تحتاج إلى إنفاقه.", - "swap.settings.slippage.output.spend.title": "قضاء على الأكثر", - "swap.settings.slippage.warning": "انزلاق عالي جدًا", - "swap.settings.slippage.warning.description": "من المرجح أن يؤدي الانزلاق فوق 20% إلى تداول غير مواتٍ. لتقليل خطر الانطلاق، قم بخفض إعداداتك.", - "swap.settings.slippage.warning.hover": "قد يؤدي هذا إلى تداول غير مواتٍ. حاول خفض إعدادات الانزلاق.", - "swap.settings.slippage.warning.max": "أدخل قيمة أقل من {{maxSlippageTolerance}}", - "swap.settings.slippage.warning.message": "قد يكون الانزلاق أعلى من اللازم", - "swap.settings.slippage.warning.min": "أدخل قيمة أكبر من 0", - "swap.settings.title": "إعدادات المبادلة", - "swap.settings.transactionRevertPrice": "سيتم إرجاع معاملتك إذا تغير السعر بشكل غير مناسب بأكثر من هذه النسبة.", - "swap.signAndSwap": "التوقيع والمبادلة", - "swap.slippage.amt": "{{amt}} الإنزلاق", - "swap.slippage.bridging": "لا يوجد انزلاق عند التبديل عبر الشبكات", - "swap.slippage.description": "الفرق بين السعر المتوقع والسعر المُنفَّذ في المبادلة. قد يحدث هذا الفرق بسبب انخفاض السيولة، أو تقلبات السوق، أو الروبوتات. \n\nتوفر Uniswap Protection الحماية من الروبوتات الرائدة وMEV.", - "swap.slippage.settings.title": "إعدادات الانزلاق", - "swap.slippage.tooltip": "سيتم إرجاع الحد الأقصى لحركة السعر قبل معاملتك.", - "swap.slippageBelow.warning": "قد يؤدي الانزلاق تحت {{amt}} إلى فشل الصفقة", - "swap.submitted": "تم تقديم المبادلة", - "swap.success": "مبادلة النجاح!", - "swap.tokenOwnFees": "تأخذ بعض الرموز المميزة رسومًا عند شرائها أو بيعها، والتي يحددها مصدر الرمز المميز. لا يتلقى Uniswap أيًا من هذه الرسوم.", - "swap.tradeRoutes": "طرق التجارة", - "swap.transaction.deadline": "الموعد النهائي للمعاملة", - "swap.transaction.revertAfter": "سيتم إرجاع معاملتك إذا كانت معلقة لأكثر من هذه الفترة الزمنية.", - "swap.warning.enterLargerAmount.title": "أدخل مبلغًا أكبر", - "swap.warning.expectedFailure.increaseSlippage": "حاول زيادة الانزلاق الخاص بك.", - "swap.warning.expectedFailure.titleMay": "قد تفشل هذه المبادلة", - "swap.warning.insufficientBalance.title": "ليس لديك ما يكفي {{currencySymbol}}", - "swap.warning.insufficientGas.button": "لا يكفي {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "قم بالتبديل إلى {{ tokenSymbol }} على {{networkName}}", - "swap.warning.insufficientGas.button.buy": "شراء {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "شراء بالبطاقة", - "swap.warning.insufficientGas.message.withNetwork": "لا يكفي {{currencySymbol}} على {{networkName}} للتبديل", - "swap.warning.insufficientGas.message.withoutNetwork": "لا يكفي {{currencySymbol}} للتبديل", - "swap.warning.insufficientGas.title": "ليس لديك ما يكفي {{currencySymbol}} لتغطية تكلفة الشبكة", - "swap.warning.networkFee.allow": "السماح {{ inputTokenSymbol }} (مرة واحدة)", - "swap.warning.networkFee.delegation.message": "هذه هي تكلفة معالجة معاملتك وتفعيل محفظتك الذكية على Unichain. لا تتقاضى Uniswap Labs أي حصة من هذه الرسوم.", - "swap.warning.networkFee.highRelativeToValue": "تتجاوز تكلفة الشبكة 10% من إجمالي قيمة معاملتك. هذه هي تكلفة معالجة معاملتك على blockchain. لا تتلقى Uniswap أي حصة من هذه الرسوم.", - "swap.warning.networkFee.highRelativeToValue.unichain": "تتجاوز تكلفة الشبكة 10% من إجمالي قيمة معاملتك. هذه هي تكلفة معالجة معاملتك على blockchain.", - "swap.warning.networkFee.includesDelegation": "يتضمن تفعيل المحفظة الذكية", - "swap.warning.networkFee.message": "هذه هي تكلفة معالجة معاملتك على blockchain. لا يحصل Uniswap على أي حصة من هذه الرسوم.", - "swap.warning.networkFee.message.unichain": "هذه هي تكلفة معالجة معاملتك على blockchain.", - "swap.warning.networkFee.message.uniswapX": "هذه هي تكلفة معالجة معاملتك على blockchain. لا يحصل Uniswap على أي حصة من هذه الرسوم. UniswapX يجمع مصادر السيولة للحصول على أسعار أفضل ومقايضات خالية من الغاز.", - "swap.warning.networkFee.message.uniswapX.title": "لا توجد تكاليف للشبكة مع UniswapX", - "swap.warning.networkFee.message.uniswapX.unichain": "هذه هي تكلفة معالجة معاملتك على blockchain. UniswapX يجمع مصادر السيولة للحصول على أسعار أفضل ومقايضات خالية من الغاز.", - "swap.warning.noQuotesFound.bridging.message": "لم يتم العثور على اقتباسات ربط. حاول استخدام الرابط الرسمي في هذا الوقت.", - "swap.warning.noQuotesFound.title": "لم يتم العثور على اقتباسات", - "swap.warning.noRoutesFound.message": "لا تتوفر حاليًا أي مسارات للرموز المحددة. يُرجى تجربة زوج مختلف أو التحقق مرة أخرى لاحقًا.", - "swap.warning.noRoutesFound.title": "لا توجد طرق متاحة", - "swap.warning.offline.message": "ربما فقدت الاتصال بالإنترنت أو ربما تكون الشبكة معطلة. يرجى التحقق من اتصالك بالإنترنت والمحاولة مرة أخرى.", - "swap.warning.offline.title": "أنت غير متصل بالإنترنت", - "swap.warning.priceImpact.message": "نظرًا لكمية {{outputCurrencySymbol}} السيولة المتاحة حاليًا، كلما حاولت المبادلة {{inputCurrencySymbol}} أكثر، كلما قلت {{outputCurrencySymbol}} التي ستحصل عليها.", - "swap.warning.priceImpact.message.veryHigh": "ستؤدي هذه الصفقة إلى تأثير سعري بنسبة {{priceImpactValue}} على سعر السوق لهذا المجمع وسوف تؤدي إلى خسارة الأموال.", - "swap.warning.priceImpact.title": "تأثير ارتفاع الأسعار ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "تأثير سعر مرتفع جدًا ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "لم يتم إرسال معاملتك لأنك أغلقت التطبيق.", - "swap.warning.queuedOrder.approvalFailed": "لم يتم إرسال معاملتك بسبب فشل الموافقة على الرمز المميز.", - "swap.warning.queuedOrder.stale": "لم يتم إرسال معاملتك لأنك أغلقت التطبيق أو لأن الموافقة استغرقت وقتًا طويلاً.", - "swap.warning.queuedOrder.submissionFailed": "حدثت مشكلة أثناء إرسال معاملتك.", - "swap.warning.queuedOrder.title": "تم إلغاء المبادلة", - "swap.warning.rateLimit.message": "يرجى المحاولة مرة أخرى في بضع دقائق.", - "swap.warning.rateLimit.title": "حد معدل تجاوز", - "swap.warning.router.message": "ربما فقدت الاتصال أو ربما تكون الشبكة معطلة. إذا استمرت المشكلة، يرجى المحاولة مرة أخرى لاحقًا.", - "swap.warning.router.title": "لا يمكن إكمال هذه التجارة الآن", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} محظور", - "swap.warning.tokenBlockedFallback.button": "تم حظر الرمز", - "swap.warning.uniswapFee.message": "يتم تطبيق الرسوم لضمان أفضل تجربة مع Uniswap.", - "swap.warning.uniswapFee.message.default": "يتم تطبيق الرسوم لضمان أفضل تجربة مع Uniswap. لا توجد رسوم مرتبطة بهذا المبادلة.", - "swap.warning.uniswapFee.message.included": "يتم تطبيق الرسوم لضمان أفضل تجربة مع Uniswap، وقد تم أخذها في الاعتبار بالفعل في هذا العرض.", - "swap.warning.uniswapFee.title": "رسوم المبادلة", - "swap.warning.viewOnly.message": "تحتاج إلى استيراد هذه المحفظة عبر عبارة الاسترداد لمبادلة الرموز المميزة.", - "swap.wrap.token": "التفاف {{sym}}", - "tdp.balanceSummary.otherNetworks": "على الشبكات الأخرى", - "tdp.balanceSummary.otherNetworksBalance": "التوازن على الشبكات الأخرى", - "tdp.balanceSummary.title": "رصيدك", - "tdp.button.getToken": "احصل على {{ tokenSymbol }}", - "tdp.button.getTokenFallback": "احصل على الرمز", - "tdp.loading.title.default": "بيانات الرمز المميز لـ ", - "tdp.loading.title.withChain": "بيانات الرمز المميز لـ على {{chainName}}", - "tdp.nameNotFound": "لم يتم العثور على الاسم", - "tdp.noInfoAvailable": "لا توجد معلومات رمزية متاحة", - "tdp.noTestnetSupportDescription": "بعض شبكات الاختبار لا تدعم تبادل الرموز أو إرسالها أو شرائها.", - "tdp.symbolNotFound": "لم يتم العثور على الرمز", - "testnet.modal.swapDeepLink.description.toProdMode": "يتطلب هذا الإجراء تعطيل وضع الشبكة التجريبية. يمكن إعادة تمكين وضع الشبكة التجريبية في أي وقت ضمن الإعدادات.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "يتطلب هذا الإجراء تمكين وضع الشبكة التجريبية. لا تحمل الرموز الموجودة على الشبكات التجريبية أي قيمة حقيقية. يمكن تعطيل وضع الشبكة التجريبية في أي وقت ضمن الإعدادات.", - "testnet.modal.swapDeepLink.title.toProdMode": "تعطيل وضع الشبكة التجريبية", - "testnet.modal.swapDeepLink.title.toTestnetMode": "تمكين وضع الشبكة التجريبية", - "testnet.unsupported": "لا يتم دعم هذه الوظيفة في وضع الشبكة التجريبية.", - "themeToggle.theme": "سمة", - "title.buySellTradeEthereum": "قم بشراء وبيع وتداول Ethereum وغيرها من الرموز المميزة على Uniswap", - "title.createGovernanceOn": "قم بإنشاء مقترح حوكمة جديد على Uniswap", - "title.createGovernanceTo": "إنشاء مقترح حوكمة جديد ليتم التصويت عليه من قبل أصحاب UNI. تمثل رموز UNI حصص التصويت في إدارة Uniswap.", - "title.earnFees": "اربح رسومًا عندما يقوم الآخرون بالمبادلة على Uniswap عن طريق إضافة الرموز المميزة إلى مجمعات السيولة.", - "title.easilyRemove": "قم بإزالة السيولة الخاصة بك بسهولة من Uniswap v2 وقم بالإيداع في Uniswap v3.", - "title.easilyRemoveV4": "يمكنك بسهولة إزالة السيولة الخاصة بك من Uniswap v2 و v3 لإيداعها في Uniswap v4.", - "title.extension.uninstall": "تم إلغاء تثبيت الامتداد", - "title.extensionPasskeyLogIn": "تسجيل الدخول باستخدام مفتاح المرور", - "title.managePasskeys": "Uniswap | إدارة مفاتيح المرور الخاصة بك", - "title.migratev2": "قم بترحيل سيولة المجمع v2 إلى Uniswap v3", - "title.migratev3": "نقل سيولة المجمع إلى Uniswap v4", - "title.placeLimit": "ضع أوامر محدودة على Uniswap", - "title.realTime": "الأسعار في الوقت الفعلي، والرسوم البيانية، وبيانات المعاملات، والمزيد.", - "title.removeLiquidityv2": "قم بإزالة سيولة المجمع (الإصدار الثاني) على Uniswap", - "title.removePoolLiquidity": "قم بإزالة سيولة المجمع على Uniswap", - "title.removeTokensv2": "قم بإزالة الرموز المميزة الخاصة بك من مجمعات السيولة v2.", - "title.removev3Liquidity": "قم بإزالة الرموز المميزة الخاصة بك من مجمعات السيولة v3.", - "title.sendCrypto": "إرسال العملات المشفرة", - "title.sendTokens": "أرسل الرموز المميزة على Uniswap", - "title.swappingMadeSimple": "اشترِ وبع العملات المشفرة فورًا على منصات Ethereum وBase وArbitrum وPolygon وUnichain وغيرها. منصة DeFi التي يثق بها الملايين.", - "title.tradeTokens": "تداول الرموز وتوفير السيولة. الأسعار في الوقت الفعلي، والرسوم البيانية، وبيانات المعاملات، والمزيد.", - "title.uniswapTradeCrypto": "Uniswap | تداول العملات المشفرة على منصة DeFi الرائدة ", - "title.uniToken": "تمثل رموز UNI حصص التصويت في إدارة Uniswap. يمكنك التصويت على كل مقترح بنفسك أو تفويض أصواتك لطرف ثالث.", - "title.voteOnGov": "التصويت على مقترحات الإدارة على Uniswap", - "token.balances.main": "رصيدك", - "token.balances.other": "أرصدة على الشبكات الأخرى", - "token.balances.viewOnly": "{{ownerAddress}}رصيد", - "token.bridge": "{{label}} جسر رمزي", - "token.chart.candlestick.unavailable": "لا تتوفر مخططات الشموع لهذه الرمز", - "token.chart.tooltip": "الرسوم: {{amount}}", - "token.details": "تفاصيل الرمز", - "token.error.unknown": "رمز غير معروف", - "token.fee.buy.label": "رسوم الشراء", - "token.fee.label": "مصاريف", - "token.fee.sell.label": "رسوم البيع", - "token.links.title": "روابط", - "token.links.twitter": "تويتر", - "token.links.website": "موقع إلكتروني", - "token.notFound.description": "عذرًا، لم نتمكن من العثور على أي معلومات حول هذا الرمز. تحقق من الاسم والعنوان وحاول مرة أخرى.", - "token.notFound.title": "لم يتم العثور على الرمز", - "token.priceExplorer.error.description": "هناك خطأ ما.", - "token.priceExplorer.error.title": "تعذر تحميل مخطط الأسعار", - "token.priceExplorer.timeRangeLabel.all": "كل الوقت", - "token.priceExplorer.timeRangeLabel.day": "1د", - "token.priceExplorer.timeRangeLabel.day.verbose": "يوم واحد", - "token.priceExplorer.timeRangeLabel.hour": "1 ح", - "token.priceExplorer.timeRangeLabel.month": "1 م", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 شهر", - "token.priceExplorer.timeRangeLabel.week": "1 واط", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 اسبوع", - "token.priceExplorer.timeRangeLabel.year": "1 سنة", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 سنة", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} غير متاح", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} و {{tokenSymbol1}} غير متاحين", - "token.safety.fee.detected": "تم اكتشاف رسوم الرمز", - "token.safety.fees.uniswapLabsDoesNotReceive": "لا تتلقى Uniswap Labs أيًا من هذه الرسوم.", - "token.safety.warning.alwaysDoYourResearch": "قم دائمًا بإجراء بحثك", - "token.safety.warning.blocked.description.default_one": "لا يمكنك تداول هذا الرمز المميز باستخدام تطبيق Uniswap.", - "token.safety.warning.blocked.description.default_other": "لا يمكنك تداول هذه الرموز المميزة باستخدام تطبيق Uniswap.", - "token.safety.warning.copyContractAddress.message": "هذا عنوان عقد يعمل كمعرف فريد للرموز على blockchain. سيتم فقد أي عملة مشفرة ترسلها إلى هذا العنوان.", - "token.safety.warning.copyContractAddress.title": "لا ترسل العملات المشفرة إلى هذا العنوان", - "token.safety.warning.dontShowWarningAgain": "لا تظهر لي هذا التحذير مرة أخرى", - "token.safety.warning.dontShowWarningAgainShort": "لا تظهر مرة أخرى", - "token.safety.warning.doYourOwnResearch": "قم دائمًا بإجراء البحث بنفسك قبل المتابعة.", - "token.safety.warning.feeDescription": "يتم شحن عند {{action}}", - "token.safety.warning.flaggedAsMalicious": "تم وضع علامة عليه على أنه ضار", - "token.safety.warning.flaggedAsSuspicious": "تم وضع علامة عليه بأنه مشبوه", - "token.safety.warning.fotHigh.title": "تم اكتشاف رسوم عالية", - "token.safety.warning.fotLow.title": "تم اكتشاف الرسوم", - "token.safety.warning.fotVeryHigh.title": "تم اكتشاف رسوم عالية جدًا", - "token.safety.warning.honeypot.message": "تم تصنيف {{tokenSymbol}} على أنه غير قابل للبيع. قد يؤدي تبديل هذا الرمز إلى خسارة أموالك.", - "token.safety.warning.honeypot.title": "تم اكتشاف رسوم بيع بنسبة 100%", - "token.safety.warning.impersonator": "ينتحل شخصية رمز آخر", - "token.safety.warning.impersonator.title": "تم الكشف عن رمز المقلد", - "token.safety.warning.malicious.general.message": "تم تصنيف {{tokenSymbol}} على أنه ضار بواسطة Blockaid.", - "token.safety.warning.malicious.impersonator.message": "تم وضع علامة على {{tokenSymbol}} بواسطة Blockaid لمحاولة نسخ رمز مختلف. قد لا يكون الرمز الذي تبحث عن مبادلته.", - "token.safety.warning.malicious.impersonator.message.short": "قد لا يكون {{tokenSymbol}} هو الرمز الذي تبحث عن مبادلته.", - "token.safety.warning.malicious.title": "تم الكشف عن رمز ضار", - "token.safety.warning.mayResultInLoss": "قد يؤدي تبديله إلى خسارة الأموال.", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} لا يتم تداوله في البورصات المركزية الأمريكية الرائدة.", - "token.safety.warning.notListedOnExchanges": "غير مدرج في البورصات الأمريكية الرائدة", - "token.safety.warning.potentialHoneypot.card.message": "تم وضع علامة {{tokenSymbol}} على أنها مشبوهة بواسطة Blockaid.", - "token.safety.warning.potentialHoneypot.modal.message": "تم تصنيف {{tokenSymbol}} كأداة احتيال محتملة من قِبل Blockaid. ابحث جيدًا قبل المتابعة.", - "token.safety.warning.potentialHoneypot.title": "تم اكتشاف مصيدة عسل محتملة", - "token.safety.warning.sellFee100.message": "تم وضع علامة على {{ tokenSymbol }} على أنها غير قابلة للبيع.", - "token.safety.warning.sellFee100.title": "تم اكتشاف رسوم بيع بنسبة 100%", - "token.safety.warning.spam.message": "تم تصنيف {{tokenSymbol}} على أنه بريد عشوائي بواسطة Blockaid.", - "token.safety.warning.spam.title": "تم اكتشاف رمز البريد العشوائي", - "token.safety.warning.spamsUsers": "البريد العشوائي للمستخدمين", - "token.safety.warning.tokenChargesFee.both.message": "تتقاضى {{tokenSymbol}} رسومًا قدرها {{buyFeePercent}} عند الشراء و {{sellFeePercent}} عند البيع.", - "token.safety.warning.tokenChargesFee.buy.message": "تفرض {{tokenSymbol}} رسومًا قدرها {{feePercent}} عند الشراء.", - "token.safety.warning.tokenChargesFee.buy.message.descriptive": "{{tokenSymbol}} charges a {{feePercent}} fee when bought. Swapping it may result in a loss of funds. Uniswap Labs does not receive any of these fees.", - "token.safety.warning.tokenChargesFee.sell.message": "تفرض {{tokenSymbol}} رسومًا قدرها {{feePercent}} عند البيع.", - "token.safety.warning.tokenChargesFee.sell.message.descriptive": "{{tokenSymbol}} charges a {{feePercent}} fee when sold. Swapping it may result in a loss of funds. Uniswap Labs does not receive any of these fees.", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} يتقاضى رسومًا عند الشراء أو البيع.", - "token.safetyLevel.blocked.message": "لا يمكنك تداول هذا الرمز المميز باستخدام Uniswap Wallet.", - "token.safetyLevel.medium.message.plural": "لا يتم تداول هذه الرموز في البورصات المركزية الرائدة في الولايات المتحدة. لذا، احرص دائمًا على إجراء بحثك الخاص قبل المتابعة.", - "token.selector.search.error": "تعذر تحميل نتائج البحث", - "token.stats.fullyDilutedValuation": "التقييم المخفف بالكامل", - "token.stats.marketCap": "القيمة السوقية", - "token.stats.priceHighYear": "52 واط عالية", - "token.stats.priceLowYear": "52 واط منخفض", - "token.stats.section.about": "حول {{token}}", - "token.stats.title": "احصائيات", - "token.stats.translation.original": "إظهار النسخة الأصلية", - "token.stats.translation.translate": "ترجم إلى {{language}}", - "token.stats.volume": "حجم 24 ساعة", - "token.symbol.input.fallback": "رمز الإدخال", - "token.symbol.output.fallback": "رمز الإخراج", - "token.wrap.fail.message": "يمكن أن تبدأ عمليات المبادلة على بروتوكول Uniswap وتنتهي بـ ETH. ومع ذلك، أثناء المبادلة، يتم تغليف ETH في WETH.", - "token.zeroNativeBalance.description.mainnet": "ستحتاج إلى استبدال رمز مميز على إيثريوم للحصول على {{ tokenSymbol }}. يتطلب الاستبدال استخدام إيثريوم لتغطية تكاليف الشبكة.", - "token.zeroNativeBalance.description.otherChains": "ستحتاج إلى تبديل رمز على {{ chainName }} للحصول على {{ tokenSymbol }}. يتطلب التبديل {{ chainName }} {{ nativeTokenSymbol }} لتغطية تكاليف الشبكة.", - "token.zeroNativeBalance.subtitle": "{{ tokenSymbol }} غير متاح للشراء المباشر.", - "token.zeroNativeBalance.title.mainnet": "أنت بحاجة إلى {{ nativeTokenName }}", - "token.zeroNativeBalance.title.otherChains": "تحتاج إلى {{ nativeTokenName }} على {{ chainName }}", - "tokens.action.hide": "إخفاء الرمز", - "tokens.action.unhide": "إظهار الرمز المميز", - "tokens.nfts.action.viewOnExplorer": "عرض على {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "تعذر تحميل مجموعة NFT", - "tokens.nfts.collection.label.items": "أغراض", - "tokens.nfts.collection.label.owners": "أصحاب", - "tokens.nfts.collection.label.priceFloor": "أرضية", - "tokens.nfts.collection.label.swapVolume": "مقدار", - "tokens.nfts.connectEthereumToView": "قم بتوصيل محفظة Ethereum لعرض NFTs الخاصة بك", - "tokens.nfts.details.contract.address": "عنوان العقد", - "tokens.nfts.details.error.load.title": "تعذر تحميل تفاصيل NFT", - "tokens.nfts.details.network": "شبكة", - "tokens.nfts.details.owner": "مملوكة ل", - "tokens.nfts.details.price": "السعر الحالي", - "tokens.nfts.details.recentPrice": "سعر البيع الأخير", - "tokens.nfts.details.traits": "سمات", - "tokens.nfts.empty.description": "لم يتم العثور على NFTs", - "tokens.nfts.error.unavailable": "المحتوى غير متوفر", - "tokens.nfts.hidden.action.hide": "إخفاء NFT", - "tokens.nfts.hidden.action.unhide": "إظهار NFT", - "tokens.nfts.link.collection": "موقع المجموعة", - "tokens.nfts.list.error.load.title": "تعذر تحميل NFTs", - "tokens.nfts.list.none.button": "احصل على NFTs", - "tokens.nfts.list.none.description.default": "انقل NFTs من محفظة أخرى للبدء.", - "tokens.nfts.list.none.description.external": "عندما تشتري هذه المحفظة رموز NFT أو تستقبلها، ستظهر هنا.", - "tokens.nfts.list.none.title": "لا يوجد NFTs حتى الآن", - "tokens.nfts.notAvailableOnSolana": "NFTs غير متوفرة على Solana", - "tokens.selector.button.choose": "حدد الرمز المميز", - "tokens.selector.empty.buy.message": "قم بشراء العملات المشفرة باستخدام بطاقة أو بنك لإرسال الرموز المميزة.", - "tokens.selector.empty.buy.title": "شراء التشفير", - "tokens.selector.empty.receive.title": "تلقي الرموز", - "tokens.selector.empty.title": "لا توجد رموز حتى الآن", - "tokens.selector.error.load": "تعذر تحميل الرموز المميزة", - "tokens.selector.search.empty": "لم يتم العثور على نتائج ل {{searchText}}", - "tokens.selector.search.placeholder": "رموز البحث", - "tokens.selector.section.bridging": "التبديل عبر الشبكات", - "tokens.selector.section.favorite": "المفضلة", - "tokens.selector.section.otherNetworksSearchResults": "الرموز الموجودة على شبكات أخرى", - "tokens.selector.section.otherSearchResults": "رموز أخرى على {{network}}", - "tokens.selector.section.recent": "عمليات البحث الأخيرة", - "tokens.selector.section.search": "نتائج البحث", - "tokens.selector.section.trending": "الرموز حسب حجم 24 ساعة", - "tokens.selector.section.yours": "الرموز الخاصة بك", - "tokens.table.search.placeholder.pools": "بحث في حمامات السباحة", - "tokens.table.search.placeholder.tokens": "رموز البحث", - "tokens.table.search.placeholder.transactions": "البحث عن المعاملات", - "toucan.auction.bidConcentration": "تركيز الطوقان", - "toucan.auction.bidConcentration.tooltip.description": "وصف تلميح أداة الطوقان", - "toucan.auction.bidConcentration.tooltip.title": "عنوان تلميح أداة الطوقان", - "toucan.auctions": "المزادات", - "toucan.bidForm.maxBudget": "الميزانية القصوى", - "toucan.bidForm.placeBid": "ضع عرضك", - "toucan.displayMode.tokenPrice": "سعر الرمز", - "toucan.displayMode.valuation": "تقييم", - "transaction.action.cancel.button": "إلغاء الصفقة", - "transaction.action.cancel.description": "إذا قمت بإلغاء هذه المعاملة قبل معالجتها بواسطة الشبكة، فستدفع تكلفة شبكة جديدة بدلاً من التكلفة الأصلية.", - "transaction.action.cancel.title": "هل تريد إلغاء هذه الصفقة؟", - "transaction.action.clear": "مسح المعلق", - "transaction.action.copy": "نسخ معرف المعاملة", - "transaction.action.copyProvider": "انسخ {{providerName}} معرف المعاملة", - "transaction.amount.unlimited": "غير محدود", - "transaction.callData": "بيانات الاتصال", - "transaction.details.dappName": "برنامج", - "transaction.details.from": "من", - "transaction.details.networkFee": "تكلفة الشبكة", - "transaction.details.networkFee.swap": "تكلفة شبكة المبادلة", - "transaction.details.providerFee": "رسوم مقدم الخدمة", - "transaction.details.swapRate": "معدل", - "transaction.details.transaction": "عملية", - "transaction.details.uniswapFee": "الرسوم ({{ feePercent }}%)", - "transaction.network.all": "جميع الشبكات", - "transaction.networkCost.description": "تكلفة معالجة معاملتك على بلوكتشين. Uniswap مُحسّن لتوفير أدنى تكاليف الشبكة.", - "transaction.networkCost.includesSmartWalletActivation": "يتضمن تفعيل المحفظة الذكية", - "transaction.networkCost.label": "تكلفة الشبكة", - "transaction.networkCost.maxNativeBalance.description": "يتم حجز مبلغ صغير من رصيد رمز الشبكة لتغطية تكلفة الشبكة لهذه المعاملة.", - "transaction.networkCost.maxNativeBalance.title": "لماذا لا أستطيع استخدام الحد الأقصى لرصيدى؟", - "transaction.networkCost.veryHigh.label": "تكلفة الشبكة عالية جدًا", - "transaction.notification.error.cancel": "غير قادر على إلغاء المعاملة", - "transaction.notification.error.replace": "غير قادر على استبدال المعاملة", - "transaction.status.approval.canceled": "تم إلغاء الموافقة", - "transaction.status.approval.failed": "فشلت الموافقة", - "transaction.status.approve.canceled": "تم إلغاء الموافقة", - "transaction.status.approve.canceling": "إلغاء الموافقة", - "transaction.status.approve.failed": "فشلت الموافقة", - "transaction.status.approve.pending": "الموافقة", - "transaction.status.approve.success": "موافقة", - "transaction.status.approve.successDapp": "تمت الموافقة عليه في {{externalDappName}}", - "transaction.status.buy.canceled": "تم إلغاء الشراء", - "transaction.status.buy.canceling": "إلغاء الشراء", - "transaction.status.buy.failed": "فشل في الشراء", - "transaction.status.buy.pending": "شراء", - "transaction.status.buy.success": "مُشترى", - "transaction.status.buy.successDapp": "تم شراؤه على {{externalDappName}}", - "transaction.status.claim.canceled": "تم إلغاء تحصيل الرسوم", - "transaction.status.claim.canceling": "إلغاء تحصيل الرسوم", - "transaction.status.claim.failed": "فشل تحصيل الرسوم", - "transaction.status.claim.pending": "تحصيل الرسوم", - "transaction.status.claim.success": "الرسوم المحصلة", - "transaction.status.collect.fees.canceled": "تحصيل الرسوم الملغاة", - "transaction.status.collect.fees.failed": "فشل جمع الرسوم", - "transaction.status.collected.fees": "الرسوم المجمعة", - "transaction.status.collecting.fees": "تحصيل الرسوم", - "transaction.status.confirm.canceled": "تم الإلغاء تأكيد", - "transaction.status.confirm.canceling": "في انتظار الإلغاء", - "transaction.status.confirm.failed": "فشل التأكيد", - "transaction.status.confirm.pending": "المعاملة قيد التقدم", - "transaction.status.confirm.success": "تم تأكيد المعاملة", - "transaction.status.confirm.successDapp": "تم تأكيد المعاملة على {{externalDappName}}", - "transaction.status.createPair.canceled": "تم إلغاء إنشاء الزوج", - "transaction.status.createPair.canceling": "إلغاء إنشاء الزوج", - "transaction.status.createPair.failed": "فشل في إنشاء الزوج", - "transaction.status.createPair.pending": "إنشاء زوج", - "transaction.status.createPair.success": "تم إنشاء الزوج", - "transaction.status.createPool.canceled": "تم إلغاء إنشاء المجمع", - "transaction.status.createPool.canceling": "إلغاء إنشاء المجمع", - "transaction.status.createPool.failed": "فشل في إنشاء المجمع", - "transaction.status.createPool.pending": "إنشاء تجمع", - "transaction.status.createPool.success": "تجمع تم إنشاؤه", - "transaction.status.liquidityDecrease.canceled": "إزالة السيولة الملغاة", - "transaction.status.liquidityDecrease.canceling": "إلغاء إزالة السيولة", - "transaction.status.liquidityDecrease.failed": "فشل إزالة السيولة", - "transaction.status.liquidityDecrease.pending": "إزالة السيولة", - "transaction.status.liquidityDecrease.success": "تمت إزالة السيولة", - "transaction.status.liquidityIncrease.canceled": "إضافة السيولة الملغاة", - "transaction.status.liquidityIncrease.canceling": "إلغاء إضافة السيولة", - "transaction.status.liquidityIncrease.failed": "فشلت إضافة السيولة", - "transaction.status.liquidityIncrease.pending": "إضافة السيولة", - "transaction.status.liquidityIncrease.success": "السيولة المضافة", - "transaction.status.lpIncentivesClaim.canceled": "تم إلغاء مطالبة مكافآت LP", - "transaction.status.lpIncentivesClaim.canceling": "إلغاء المطالبة بمكافآت LP", - "transaction.status.lpIncentivesClaim.failed": "فشل في المطالبة بمكافآت LP", - "transaction.status.lpIncentivesClaim.pending": "المطالبة بمكافآت LP", - "transaction.status.lpIncentivesClaim.success": "مكافآت LP المطالب بها", - "transaction.status.migrateLiquidity.canceled": "تم إلغاء نقل السيولة", - "transaction.status.mint.canceled": "نعناع ملغى", - "transaction.status.mint.canceling": "إلغاء النعناع", - "transaction.status.mint.failed": "فشل في النعناع", - "transaction.status.mint.pending": "سك العملة", - "transaction.status.mint.success": "سكت", - "transaction.status.mint.successDapp": "تم سكها على {{externalDappName}}", - "transaction.status.offramp.canceled": "تم إلغاء المنحدر", - "transaction.status.offramp.failed": "فشل الخروج", - "transaction.status.offramp.pending": "الخروج من الطريق", - "transaction.status.offramp.success": "تم إيقافه", - "transaction.status.onramp.canceled": "تم إلغاء Onramp", - "transaction.status.onramp.failed": "فشل المنحدر", - "transaction.status.onramp.pending": "الصعود", - "transaction.status.onramp.success": "منحدر", - "transaction.status.permit.approved": "تمت الموافقة على التصريح", - "transaction.status.permit.canceled": "تم إلغاء تصريح المعاملة", - "transaction.status.permit.failed": "فشل التصريح", - "transaction.status.purchase.canceled": "تم إلغاء الشراء", - "transaction.status.purchase.canceling": "إلغاء الشراء", - "transaction.status.purchase.failed": "فشل الشراء", - "transaction.status.purchase.failedOn": "فشل الشراء على {{serviceProvider}}", - "transaction.status.purchase.pending": "شراء", - "transaction.status.purchase.pendingOn": "الشراء على {{serviceProvider}}", - "transaction.status.purchase.successOn": "تم الشراء على {{serviceProvider}}", - "transaction.status.receive.canceled": "تم إلغاء الاستلام", - "transaction.status.receive.canceling": "إلغاء الاستلام", - "transaction.status.receive.failed": "فشل الاستلام", - "transaction.status.receive.failedFrom": "فشل الاستلام من {{serviceProvider}}", - "transaction.status.receive.pending": "يستلم", - "transaction.status.receive.pendingFrom": "الاستلام من {{serviceProvider}}", - "transaction.status.receive.success": "تلقى", - "transaction.status.receive.successDapp": "تم الاستلام في {{externalDappName}}", - "transaction.status.receive.successFrom": "تم الاستلام من {{serviceProvider}}", - "transaction.status.removeDelegation.canceled": "إزالة التفويض الملغى", - "transaction.status.removeDelegation.failed": "فشلت إزالة التفويض", - "transaction.status.removeDelegation.pending": "إزالة التفويض", - "transaction.status.removeDelegation.success": "تمت إزالة الوفد", - "transaction.status.revoke.canceled": "تم الإلغاء", - "transaction.status.revoke.canceling": "إلغاء إبطال", - "transaction.status.revoke.failed": "فشل في الإلغاء", - "transaction.status.revoke.pending": "إبطال", - "transaction.status.revoke.success": "إلغاء - فسخ", - "transaction.status.revoke.successDapp": "تم الإلغاء في {{externalDappName}}", - "transaction.status.sale.canceled": "تم إلغاء البيع", - "transaction.status.sale.canceling": "الغاء البيع", - "transaction.status.sale.failedOn": "فشل البيع عبر {{serviceProvider}}", - "transaction.status.sale.pendingCard.msg": "تعرف على المزيد حول بيع العملات المشفرة.", - "transaction.status.sale.pendingCard.title": "لماذا لا يزال بيعي معلقا؟", - "transaction.status.sale.pendingOn": "البيع عبر {{serviceProvider}}", - "transaction.status.sale.successOn": "تم البيع عبر {{serviceProvider}}", - "transaction.status.sell.canceled": "تم إلغاء البيع", - "transaction.status.sell.canceling": "إلغاء البيع", - "transaction.status.sell.failed": "فشل في البيع", - "transaction.status.sell.pending": "يبيع", - "transaction.status.sell.success": "مُباع", - "transaction.status.sell.successDapp": "تم بيعه بتاريخ {{externalDappName}}", - "transaction.status.send.canceled": "تم إلغاء الإرسال", - "transaction.status.send.canceling": "إلغاء الإرسال", - "transaction.status.send.failed": "فشل فى الارسال", - "transaction.status.send.pending": "إرسال", - "transaction.status.send.success": "مرسل", - "transaction.status.send.successDapp": "تم الإرسال في {{externalDappName}}", - "transaction.status.swap.canceled": "تم إلغاء المبادلة", - "transaction.status.swap.canceling": "إلغاء المبادلة", - "transaction.status.swap.expired": "انتهت صلاحية المبادلة", - "transaction.status.swap.failed": "فشل المبادلة", - "transaction.status.swap.insufficientFunds": "رصيد غير كاف", - "transaction.status.swap.pending": "مبادلة", - "transaction.status.swap.success": "مبادلة", - "transaction.status.swap.successDapp": "تم التبديل على {{externalDappName}}", - "transaction.status.unwrap.canceled": "إلغاء بسط", - "transaction.status.unwrap.canceling": "إلغاء بسط", - "transaction.status.unwrap.failed": "فشل في فك التغليف", - "transaction.status.unwrap.pending": "فك التغليف", - "transaction.status.unwrap.success": "يفك ربطة", - "transaction.status.unwrap.successDapp": "غير ملفوف على {{externalDappName}}", - "transaction.status.wrap.canceled": "التفاف ملغى", - "transaction.status.wrap.canceling": "إلغاء التفاف", - "transaction.status.wrap.failed": "فشل في الالتفاف", - "transaction.status.wrap.pending": "يلف", - "transaction.status.wrap.success": "مغطى", - "transaction.status.wrap.successDapp": "ملفوفة على {{externalDappName}}", - "transaction.submittedOn": "تم تقديمه في", - "transaction.summary.liquidity": "{{firstAmountWithSymbol}} و {{secondAmountWithSymbol}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} إلى {{recipientAddress}}", - "transaction.summary.received.noAmount": "تم الاستلام من {{name}}", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} من {{senderAddress}}", - "transaction.summary.sent.noAmount": "تم الإرسال إلى {{name}}", - "transaction.warning.insufficientGas.modal.message": "تحتاج إلى ~{{tokenAmount}} {{tokenSymbol}} () على {{networkName}} لتغطية تكلفة الشبكة لهذه المعاملة. قم بتبديل {{tokenSymbol}} من سلسلة أخرى أو قم بالشراء باستخدام بطاقتك للمتابعة.", - "transaction.warning.insufficientGas.modal.message.noAction": "أنت بحاجة إلى ~{{tokenAmount}} {{tokenSymbol}} () على {{networkName}} لتغطية تكلفة الشبكة لهذه المعاملة.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount": "أنت بحاجة إلى ~{{tokenAmount}} {{tokenSymbol}} () على {{networkName}} لتغطية تكلفة الشبكة لهذه المعاملة.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount.noAction": "لتبديل هذا الرمز، تحتاج إلى المزيد من {{tokenSymbol}} على {{networkName}}.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "لا يكفي {{tokenSymbol}} على {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "لا يكفي {{tokenSymbol}}", - "transaction.warning.maxNative.message": "أنت على وشك إنفاق معظم رصيد رمز الشبكة الخاص بك. وقد يؤدي هذا إلى عدم بقاء أموال كافية لتغطية تكاليف الشبكة في المستقبل.", - "transaction.warning.maxNative.title": "رصيد رمز الشبكة منخفض", - "transaction.watcher.error.cancel": "غير قادر على إلغاء المعاملة", - "transaction.watcher.error.status": "حدث خطأ أثناء التحقق من حالة المعاملة", - "uniswapX.aggregatesLiquidity": " تجميع مصادر السيولة للحصول على أسعار أفضل ومقايضات خالية من الغاز.", - "uniswapX.cost": "تقوم UniswapX بإزالة التكاليف النموذجية لإجراء المعاملات على blockchain.", - "uniswapx.description": "يقوم UniswapX بتجميع مصادر السيولة للحصول على أسعار أفضل ومقايضات خالية من الغاز.", - "uniswapx.description.unsupported": "UniswapX غير متاح حاليًا لأن إعدادات محفظتك الذكية تتم إدارتها بواسطة تطبيق محفظة مختلف.", - "uniswapx.included": "يشمل UniswapX", - "uniswapx.item": " يوني سواب إكس ", - "uniswapx.label": "يونيسوابكس", - "uniswapX.learnMore": "تعرف على المزيد حول المبادلة باستخدام UniswapX", - "uniswapx.unavailable.title": "UniswapX غير متاح", - "uniswapx.v2QuoteFailed": "فشل الاقتباس الثابت UniswapX v2. أعد المحاولة باستخدام المبادلة الكلاسيكية.", - "unitags.banner.button.claim": "يدعون الآن", - "unitags.banner.subtitle": "قم بإنشاء ملف تعريف web3 مخصص وشارك عنوانك بسهولة مع الأصدقاء.", - "unitags.banner.title.compact": "اطلب اسم المستخدم الخاص بك {{unitagDomain}} وقم ببناء ملفك الشخصي القابل للتخصيص.", - "unitags.banner.title.full": "قم بالمطالبة باسم المستخدم {{unitagDomain}} الخاص بك", - "unitags.choosePhoto.option.cameraRoll": "اختر من لفة الكاميرا", - "unitags.choosePhoto.option.computer": "تحميل من الكمبيوتر", - "unitags.choosePhoto.option.nft": "اختر NFT", - "unitags.choosePhoto.option.remove": "إزالة الصورة الشخصية", - "unitags.claim.available": "متاح", - "unitags.claim.confirmation.customize": "تخصيص الملف الشخصي", - "unitags.claim.confirmation.description": "{{unitagAddress}} جاهز لإرسال واستقبال العملات المشفرة. استمر في إنشاء محفظتك عن طريق تخصيص ملف تعريف web3 الخاص بك.", - "unitags.claim.confirmation.success.long": "لك ذالك!", - "unitags.claim.confirmation.success.short": "فهمتها!", - "unitags.claim.error.addressLimit": "لقد قمت بالفعل بإجراء الحد الأقصى لعدد التغييرات على اسم المستخدم الخاص بك لهذا العنوان", - "unitags.claim.error.avatar": "لا يمكن تعيين الصورة الرمزية. حاول مرة أخرى في وقت لاحق.", - "unitags.claim.error.default": "لا يمكن المطالبة باسم المستخدم. حاول مرة أخرى في وقت لاحق.", - "unitags.claim.error.deviceLimit": "لقد وصلت إلى الحد الأقصى لعدد أسماء المستخدمين التي يمكن أن تكون نشطة لهذا الجهاز", - "unitags.claim.error.general": "غير قادر على المطالبة باسم المستخدم", - "unitags.claim.error.unavailable": "اسم المستخدم هذا غير متوفر", - "unitags.claim.error.unknown": "خطأ غير معروف", - "unitags.claim.username.default": "اسمك", - "unitags.delete.confirm.subtitle": "أنت على وشك حذف اسم المستخدم الخاص بك وتفاصيل الملف الشخصي القابلة للتخصيص. لن تتمكن من استعادتها.", - "unitags.delete.confirm.title": "هل أنت متأكد؟", - "unitags.editProfile.placeholder": "اسم المستخدم", - "unitags.editUsername.confirm.subtitle": "أنت على وشك تغيير اسم المستخدم الخاص بك. بمجرد تغييره، لا يمكنك المطالبة به مرة أخرى أبدًا.", - "unitags.editUsername.confirm.title": "هل أنت متأكد؟", - "unitags.editUsername.title": "تعديل اسم المستخدم الخاص بك", - "unitags.editUsername.warning.default": "بمجرد تغيير اسم المستخدم الخاص بك، لن تتمكن من المطالبة به مرة أخرى. يمكنك فقط تغييره 2 مرة.", - "unitags.editUsername.warning.max": "لقد وصلت إلى الحد الأقصى لعدد تغييري اسم مستخدم.", - "unitags.extension.intro.buttton": "المطالبة باسم المستخدم", - "unitags.extension.intro.description": "قل وداعًا للعناوين 0x. أسماء المستخدمين هي أسماء قابلة للقراءة تسهل إرسال واستقبال العملات المشفرة.", - "unitags.extension.intro.title": "إدخال أسماء المستخدمين", - "unitags.extension.intro.upsell.customizable": "ملفات تعريف قابلة للتخصيص", - "unitags.extension.intro.upsell.ens": "مدعوم من نطاقات ENS الفرعية", - "unitags.extension.intro.upsell.free": "حرية المطالبة", - "unitags.intro.features.ens": "مدعوم من نطاقات ENS الفرعية", - "unitags.intro.features.free": "حرية المطالبة", - "unitags.intro.features.profile": "ملفات تعريف قابلة للتخصيص", - "unitags.intro.subtitle": "قل وداعًا للعناوين 0x. أسماء المستخدمين هي أسماء قابلة للقراءة تسهل إرسال واستقبال العملات المشفرة.", - "unitags.intro.title": "إدخال أسماء المستخدمين", - "unitags.notification.delete.error": "لا يمكن حذف اسم المستخدم. حاول مرة أخرى في وقت لاحق.", - "unitags.notification.delete.title": "تم حذف اسم المستخدم", - "unitags.notification.profile.error": "لا يمكن تحديث الملف الشخصي. حاول مرة أخرى في وقت لاحق.", - "unitags.notification.profile.title": "تحديث الملف الشخصي", - "unitags.notification.username.error": "لا يمكن تغيير اسم المستخدم. حاول مرة أخرى في وقت لاحق.", - "unitags.notification.username.title": "تم تغيير اسم المستخدم", - "unitags.onboarding.claim.subtitle": "هذا هو عنوانك الشخصي الذي يمكن للأشخاص إرسال العملات المشفرة إليه.", - "unitags.onboarding.claim.title.choose": "إنشاء اسم المستخدم الخاص بك", - "unitags.onboarding.claim.title.claim": "المطالبة باسم المستخدم الخاص بك", - "unitags.onboarding.info.description": "تقوم أسماء المستخدمين بتحويل عناوين 0x المعقدة إلى أسماء قابلة للقراءة. من خلال المطالبة باسم مستخدم {{unitagDomain}} ، يمكنك بسهولة إرسال واستقبال العملات المشفرة وإنشاء ملف تعريف web3 عام.", - "unitags.onboarding.info.title": "عنوان مبسط", - "unitags.onboarding.profile.subtitle": "قم بتحميل ما لديك أو التزم بـ Unicon الفريد الخاص بك. يمكنك دائمًا تغيير هذا لاحقًا.", - "unitags.onboarding.profile.title": "اختر صورة الملف الشخصي", - "unitags.profile.action.delete": "حذف اسم المستخدم", - "unitags.profile.action.edit": "تحرير اسم المستخدم", - "unitags.profile.bio.label": "السيرة الذاتية", - "unitags.profile.bio.placeholder": "اكتب السيرة الذاتية لملفك الشخصي", - "unitags.profile.links.twitter": "تويتر", - "unitags.username.error.chars": "يمكن أن تحتوي أسماء المستخدمين على أحرف وأرقام فقط", - "unitags.username.error.max": "لا يمكن أن تزيد أسماء المستخدمين عن {{number}} أحرف", - "unitags.username.error.min": "يجب أن تتكون أسماء المستخدمين من {{number}} حرفًا على الأقل", - "unitags.username.error.uppercase": "يمكن أن تحتوي أسماء المستخدمين على أحرف وأرقام صغيرة فقط", - "uwulink.error.insufficientTokens": "لا يكفي {{tokenSymbol}} على {{chain}}", - "v2.notAvailable": "Uniswap V2 غير متوفر على هذه الشبكة.", - "wallet.appSignIn": "تسجيل الدخول باستخدام التطبيق", - "wallet.connectingAgreement": "من خلال ربط المحفظة، فإنك توافق على شروط الخدمة الخاصة بـ Uniswap Labs وتوافق على سياسة الخصوصيةالخاصة بها.", - "wallet.connectionFailed.message": "فشلت محاولة الاتصال. يُرجى المحاولة مرة أخرى باتباع خطوات الاتصال بمحفظتك.", - "wallet.mismatch.popup.description": "بعض الميزات غير مدعومة من قبل محفظتك المتصلة.", - "wallet.mismatch.popup.title": "دعم محدود للمحفظة", - "wallet.other": "محافظ أخرى", - "wallet.scanToConnect": "مسح رمز الاستجابة السريعة للاتصال", - "wallet.wrongNet": "محفظتك متصلة بالشبكة الخاطئة.", - "walletConnect.dapps.empty.description": "اتصل بأحد التطبيقات عن طريق مسح الرمز ضوئيًا عبر WalletConnect", - "walletConnect.dapps.manage.empty.title": "لا توجد تطبيقات متصلة", - "walletConnect.dapps.manage.title": "الاتصالات", - "walletConnect.error.connection.message": "تدعم محفظة Uniswap حاليًا {{chainNames}}. الرجاء استخدام \"{{dappName}}\" فقط في هذه السلاسل", - "walletConnect.error.connection.title": "خطأ في الإتصال", - "walletConnect.error.general.message": "حدثت مشكلة في WalletConnect. حاول مرة اخرى", - "walletConnect.error.general.title": "خطأ في WalletConnect", - "walletConnect.error.scantastic.message": "حدثت مشكلة في رمز الاستجابة السريعة الخاص بك. حاول مرة اخرى", - "walletConnect.error.scantastic.title": "رمز الاستجابة السريعة غير صالح", - "walletConnect.error.unsupported.message": "تأكد من قيامك بمسح رمز QR صالح لـ WalletConnect أو Ethereum أو Uniswap Extension قبل المحاولة مرة أخرى.", - "walletConnect.error.unsupported.title": "رمز الاستجابة السريعة غير صالح", - "walletConnect.error.unsupportedV1.message": "لم يعد WalletConnect v1 مدعومًا. يحتاج التطبيق الذي تحاول الاتصال به إلى الترقية إلى WalletConnect v2.", - "walletConnect.error.unsupportedV1.title": "رمز الاستجابة السريعة غير صالح", - "walletConnect.error.uwu.scan": "حدثت مشكلة أثناء مسح رمز الاستجابة السريعة هذا.", - "walletConnect.error.uwu.title": "خطأ في رابط UwU", - "walletConnect.error.uwu.unsupported": "رمز الاستجابة السريعة هذا غير مدعوم.", - "walletConnect.pending.button.connect": "يتصل", - "walletConnect.pending.button.reject": "يرفض", - "walletConnect.pending.button.scrollDown": "قم بالتمرير لأسفل للاتصال", - "walletConnect.pending.threat.confirmationText": "أنا أفهم المخاطر", - "walletConnect.pending.threat.description": "قد يؤدي توقيع الرسائل أو المعاملات من هذا التطبيق إلى خسارة الأموال.", - "walletConnect.pending.threat.title": "تم اكتشاف تطبيق ضار", - "walletConnect.pending.title": "اتصل بـ {{dappName}}", - "walletConnect.pending.unverified.description": "تأكد من أنك تثق بهذا الموقع قبل المتابعة. ", - "walletConnect.pending.unverified.title": "تطبيق غير مُتحقق", - "walletConnect.permissions.option.requestApprovals": "طلب الموافقات على المعاملات", - "walletConnect.permissions.option.transferAssets": "Move funds without permission", - "walletConnect.permissions.option.viewTokenBalances": "View your balance and activity", - "walletConnect.permissions.title": "App permissions", - "walletConnect.request.bundledTransactions.label_one": "معاملة مجمعة واحدة", - "walletConnect.request.bundledTransactions.label_other": "{{count}} المعاملات المجمعة", - "walletConnect.request.button.scrollDown": "قم بالتمرير لأسفل للتوقيع", - "walletConnect.request.button.sign": "لافتة", - "walletConnect.request.details.label.function": "وظيفة", - "walletConnect.request.details.label.sending": "إرسال", - "walletConnect.request.details.label.token": "رمز مميز", - "walletConnect.request.details.label.tokens": "الرموز", - "walletConnect.request.error.insufficientFunds": "ليس لديك ما يكفي من {{currencySymbol}} لإكمال هذه المعاملة.", - "walletConnect.request.error.network": "خطأ في الاتصال بالإنترنت أو الشبكة", - "walletConnect.request.warning.batch.message": "كن حذرًا: يحتوي هذا الطلب على معاملات متعددة وقد يؤدي إلى نقل الأصول", - "walletConnect.request.warning.general.message": "كن حذرًا: هذه الرسالة قد تنقل الأصول", - "walletConnect.request.warning.message": "من أجل التوقيع على الرسائل أو المعاملات، ستحتاج إلى استيراد عبارة استرداد المحفظة.", - "walletConnect.request.warning.title": "هذه المحفظة في وضع العرض فقط", - "web.explore.description": "اكتشف الرموز المميزة وابحث عنها على {{network}}. اكتشف أفضل حمامات السباحة. عرض الأسعار في الوقت الحقيقي، وحجم التداول، وTVL، والرسوم البيانية، وبيانات المعاملات.", - "web.explore.title.pools": "استكشف أفضل المجمعات على {{network}} على Uniswap", - "web.explore.title.tokens": "اكتشف أهم الرموز المميزة على {{network}} على Uniswap", - "web.explore.title.transactions": "اكتشف أهم المعاملات على {{network}} على Uniswap" -} diff --git a/packages/uniswap/src/i18n/locales/translations/ca-ES.json b/packages/uniswap/src/i18n/locales/translations/ca-ES.json deleted file mode 100644 index 3fecdb8ce51..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/ca-ES.json +++ /dev/null @@ -1,2563 +0,0 @@ -{ - "account.authHeader.claimReward": "Reclama {{amount}} recompensa", - "account.cloud.backup.subtitle": "Hi ha diverses frases de recuperació amb còpies de seguretat al vostre {{cloudProviderName}}.", - "account.cloud.backup.title": "Seleccioneu una còpia de seguretat per restaurar", - "account.cloud.button.restore.android": "Restaura des de Google Drive", - "account.cloud.button.restore.ios": "Restaura des d'iCloud", - "account.cloud.empty.description": "Sembla que no heu fet una còpia de seguretat de cap de les vostres frases de recuperació a {{cloudProviderName}}.", - "account.cloud.empty.title": "S'han trobat 0 còpies de seguretat", - "account.cloud.error.backup.message": "No s'han pogut importar les còpies de seguretat a causa de la manca de permisos, la interrupció de l'autorització o un error al núvol", - "account.cloud.error.backup.title": "S'ha produït un error en importar les còpies de seguretat", - "account.cloud.error.password.title": "Contrasenya invàlida. Siusplau torna-ho a provar.", - "account.cloud.error.unavailable.button.cancel": "Ara no", - "account.cloud.error.unavailable.button.settings": "Vés a la configuració", - "account.cloud.error.unavailable.message.android": "Verifiqueu que hàgiu iniciat la sessió en un compte de Google amb Google Drive habilitat en aquest dispositiu i torneu-ho a provar.", - "account.cloud.error.unavailable.message.ios": "Si us plau, verifiqueu que hàgiu iniciat la sessió amb un ID d'Apple amb iCloud Drive habilitat en aquest dispositiu i torneu-ho a provar.", - "account.cloud.error.unavailable.title.android": "Google Drive no disponible", - "account.cloud.error.unavailable.title.ios": "iCloud Drive no disponible", - "account.cloud.loading.title": "S'estan cercant còpies de seguretat...", - "account.cloud.lockout.time.hours_one": "Massa intents. Torna-ho a provar d'aquí a 1 hora.", - "account.cloud.lockout.time.hours_other": "Massa intents. Torna-ho a provar d'aquí a {{count}} hores.", - "account.cloud.lockout.time.minutes_one": "Massa intents. Torna-ho a provar d'aquí a 1 minut.", - "account.cloud.lockout.time.minutes_other": "Massa intents. Torna-ho a provar d'aquí a {{count}} minuts.", - "account.cloud.password.input": "Introduir la contrasenya", - "account.cloud.password.recoveryPhrase": "Introduïu la vostra frase de recuperació", - "account.cloud.password.subtitle": "Aquesta contrasenya és necessària per recuperar la còpia de seguretat de la frase de recuperació de {{cloudProviderName}}.", - "account.cloud.password.title": "Introduïu la contrasenya de seguretat", - "account.downloadWallet.subtitle": "Fes una còpia de seguretat de la cartera, opera des de qualsevol lloc, rep alertes de preus en directe i molt més.", - "account.drawer.gitHash": "Hash de Git: ", - "account.drawer.gitVersion": "Versió: ", - "account.drawer.modal.body": "Emmagatzema i intercanvia fitxes de manera segura amb l'aplicació Uniswap. Disponible a iOS i Android.", - "account.drawer.modal.dont": "No tens cartera Uniswap?", - "account.drawer.modal.scan": "Escaneja amb Uniswap Wallet", - "account.drawer.spamToggle": "Amaga fitxes i NFT desconeguts", - "account.passkey.delete.acknowledge": "He fet una còpia de seguretat de la meva frase de recuperació i entenc que Uniswap Labs no em pot ajudar a recuperar la meva cartera si no ho he fet.", - "account.passkey.delete.description": "Assegureu-vos que heu fet una còpia de seguretat de la vostra frase de recuperació mitjançant l'aplicació mòbil Uniswap o l'extensió del navegador.", - "account.passkey.delete.descriptionEmphasized": "Sense la vostra frase de recuperació, és possible que no pugueu accedir a la vostra cartera.", - "account.passkey.delete.speedbump.description": "Abans de continuar, seguiu els passos següents per evitar perdre l'accés a la vostra cartera i a tots els fons.", - "account.passkey.delete.speedbump.step1": "Baixeu l'aplicació mòbil Uniswap o l'extensió del navegador", - "account.passkey.delete.speedbump.step2": "Fes una còpia de seguretat de la teva frase de recuperació", - "account.passkey.delete.speedbump.title": "Estàs segur?", - "account.passkey.delete.title": "Vols suprimir la contrasenya?", - "account.passkey.log.in.title": "Inicia la sessió amb la clau d'accés", - "account.passkey.type.crossplatform": "Telèfon, tauleta o clau de seguretat", - "account.passkey.type.platform": "Navegador o sistema operatiu", - "account.passkey.verify.button": "Verifica amb la clau d'accés", - "account.passkey.verify.description": "Abans de continuar, si us plau, utilitzeu la vostra contrasenya per verificar la vostra identitat. Això ajuda a mantenir el vostre compte segur.", - "account.passkey.verify.title": "Primer, verifiquem que ets tu", - "account.portfolio.activity.canceledBelow": "Aquesta comanda s'ha cancel·lat perquè el vostre saldo va ser inferior a l'import introduït.", - "account.portfolio.activity.signLimit": "Aquesta comanda no s'omplirà perquè el vostre saldo va ser inferior a l'import introduït. Augmenta el teu saldo per arreglar.", - "account.recoveryPhrase.education.part1": "Una frase de recuperació (o frase inicial) és un conjunt de paraules necessàries per accedir a la vostra cartera, com una contrasenya.", - "account.recoveryPhrase.education.part2": "Pots introduir la teva frase de recuperació en un dispositiu nou per restaurar la teva cartera i el seu contingut.", - "account.recoveryPhrase.education.part3": "Però, si perds la teva frase de recuperació, perdràs l'accés a la teva cartera.", - "account.recoveryPhrase.education.part4": "En lloc de memoritzar la vostra frase de recuperació, podeu fer-ne una còpia de seguretat a {{cloudProviderName}} i protegir-la amb una contrasenya.", - "account.recoveryPhrase.education.part5": "També podeu fer una còpia de seguretat manual de la vostra frase de recuperació escrivint-la i emmagatzemant-la en un lloc segur.", - "account.recoveryPhrase.education.part6": "Us recomanem que utilitzeu ambdós tipus de còpies de seguretatperquè si perdeu la frase de recuperació, no podreu restaurar la cartera.", - "account.recoveryPhrase.error.invalid": "Frase no vàlida", - "account.recoveryPhrase.error.invalidWord": "Paraula no vàlida: {{word}}", - "account.recoveryPhrase.error.phraseLength": "La frase de recuperació ha de tenir entre 12 i 24 paraules", - "account.recoveryPhrase.error.wordIsAddress": "Has introduït una adreça, no una frase de recuperació", - "account.recoveryPhrase.error.wrong": "Frase de recuperació incorrecta", - "account.recoveryPhrase.helpText.import": "Com trobo la meva frase de recuperació?", - "account.recoveryPhrase.helpText.restoring": "Prova de cercar de nou", - "account.recoveryPhrase.input": "Escriviu la vostra frase de recuperació", - "account.recoveryPhrase.remove.final.description": "Assegureu-vos que hàgiu anotat la vostra frase de recuperació o n'heu fet una còpia de seguretat a {{cloudProviderName}}. No podreu accedir als vostres fons d'una altra manera.", - "account.recoveryPhrase.remove.final.title": "Esteu eliminant la vostra frase de recuperació ", - "account.recoveryPhrase.remove.import.description": "Només podeu emmagatzemar una frase de recuperació alhora. Per continuar important-ne un de nou, haureu d'eliminar la vostra frase de recuperació actual i les carteres associades d'aquest dispositiu.", - "account.recoveryPhrase.remove.initial.description": "Això eliminarà la vostra cartera d'aquest dispositiu juntament amb la vostra frase de recuperació.", - "account.recoveryPhrase.remove.initial.title": "Esteu suprimint {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "La vostra frase de recuperació romandrà emmagatzemada fins que suprimiu totes les carteres restants.", - "account.recoveryPhrase.subtitle.import": "La vostra frase de recuperació només s'emmagatzemarà localment al vostre dispositiu.", - "account.recoveryPhrase.subtitle.restoring": "Introduïu la vostra frase de recuperació a continuació o proveu de cercar còpies de seguretat de nou.", - "account.recoveryPhrase.title.import": "Introduïu la vostra frase de recuperació", - "account.recoveryPhrase.title.restoring": "No s'han trobat còpies de seguretat", - "account.wallet.action.copy": "Copia l'adreça", - "account.wallet.action.manageConnections": "Gestionar connexions", - "account.wallet.action.report": "Informe del perfil", - "account.wallet.action.viewExplorer": "Veure a {{blockExplorerName}}", - "account.wallet.button.add": "Afegeix cartera", - "account.wallet.button.addViewOnly": "Afegiu una cartera de només visualització", - "account.wallet.button.create": "Creeu una cartera nova", - "account.wallet.button.import": "Importa una cartera nova", - "account.wallet.button.manage": "Configuració de la cartera", - "account.wallet.button.remove": "Traieu la cartera", - "account.wallet.button.watch": "Vigila una cartera", - "account.wallet.create.placeholder": "Cartera {{index}}", - "account.wallet.edit.label.input.placeholder": "Etiqueta de cartera", - "account.wallet.header.button.disabled.title": "Edita el perfil", - "account.wallet.header.button.title": "Edita l'etiqueta", - "account.wallet.header.viewOnly": "Carteres de només visualització", - "account.wallet.menu.claimUsername": "Reclama el nom d'usuari", - "account.wallet.menu.copy.title": "Copia l'adreça de la cartera", - "account.wallet.menu.edit.title": "Edita l'etiqueta", - "account.wallet.menu.manageConnections": "Gestionar les connexions", - "account.wallet.menu.remove.title": "Traieu la cartera", - "account.wallet.remove.check": "Vaig fer una còpia de seguretat de la meva frase de recuperació i entenc que Uniswap Labs no em pot ajudar a recuperar les meves carteres si no ho vaig fer.", - "account.wallet.remove.title": "Elimina {{name}}", - "account.wallet.remove.viewOnly": "Sempre podeu afegir carteres de només visualització posterior introduint l'adreça de la cartera.", - "account.wallet.restore.new_device.description": "Com que fas servir un dispositiu nou, hauràs de restaurar la frase de recuperació o introduir la contrasenya de la còpia de seguretat al núvol per continuar.", - "account.wallet.restore.new_device.title": "Recupera la teva cartera", - "account.wallet.restore.seed_phrase.description": "Falta la frase de recuperació al dispositiu. Per assegurar-nos que no perdràs mai l'accés als teus fons, necessitem que restauris el moneder.", - "account.wallet.restore.seed_phrase.title": "Restaura la teva cartera", - "account.wallet.select.error": "No s'han pogut carregar les adreces", - "account.wallet.select.loading.subtitle": "Les vostres carteres apareixeran a continuació.", - "account.wallet.select.loading.title": "Buscant carteres", - "account.wallet.select.smartWalletDisclaimer": "Per defecte, tots els moneders elegibles utilitzaran funcions de moneder intel·ligent un cop importats. Què és un moneder intel·ligent?", - "account.wallet.select.title_one_one": "S'ha trobat una cartera", - "account.wallet.select.title_one_other": "Seleccioneu carteres per importar", - "account.wallet.viewOnly.button": "Importa cartera", - "account.wallet.viewOnly.description": "Per intercanviar, comprar, enviar i rebre fitxes, heu d'importar la frase de recuperació d'aquesta cartera.", - "account.wallet.viewOnly.title": "Aquesta cartera és només de visualització", - "account.wallet.watch.error.alreadyImported": "Aquesta adreça ja s'ha importat", - "account.wallet.watch.error.notFound": "No s'ha trobat l'adreça", - "account.wallet.watch.error.smartContract": "L'adreça és un contracte intel·ligent", - "account.wallet.watch.message": "Afegir una cartera de només visualització us permet provar l'aplicació o fer un seguiment d'una cartera. No podreu intercanviar ni enviar fons.", - "account.wallet.watch.placeholder": "ENS o adreça", - "account.wallet.watch.title": "Introduïu una adreça de cartera", - "activity.pending": "{{pendingActivityCount}} Pendent", - "activity.transaction.lpRewards.descriptor": "{{symbol}} recompenses recollides", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} a {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} per a {{amountWithSymbolB}}", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} i {{amountWithSymbolB}}", - "addLiquidity.shareOfPool": "Quota de piscina", - "addressInput.recipient": "Destinatari", - "analytics.allow": "Permet analítiques", - "analytics.allow.message": "Utilitzem dades anònimes per millorar la vostra experiència amb els productes d'Uniswap Labs.", - "appRating.button.notReally": "No realment", - "appRating.description": "Feu-nos saber si teniu una bona experiència amb aquesta aplicació", - "appRating.extension.review.description": "Trieu una puntuació amb estrelles i deixeu una ressenya a Chrome Web Store.", - "appRating.extension.review.title": "Revisar l'extensió Uniswap?", - "appRating.extension.title": "Us agrada l'extensió Uniswap?", - "appRating.feedback.button.send": "Enviar comentaris", - "appRating.feedback.description": "Feu-nos saber com podem millorar la vostra experiència", - "appRating.feedback.title": "Ens sap greu escoltar-ho.", - "appRating.mobile.title": "Us agrada Uniswap Wallet?", - "bridgedAsset.modal.button": "Continua intercanviant", - "bridgedAsset.modal.description": "Aquesta és una versió {{chainName}} de {{currencySymbol}} que està recolzada per i manté el mateix preu que la versió nativa {{currencySymbol}}.", - "bridgedAsset.modal.feature.securelyBacked": "Amb suport segur", - "bridgedAsset.modal.feature.securelyBacked.description": "1:1 recolzat per {{currencySymbol}}natiu.", - "bridgedAsset.modal.feature.tradeSeamlessly": "Comerça sense problemes", - "bridgedAsset.modal.feature.tradeSeamlessly.description": "Compra i ven {{currencySymbol}} sense sortir d'Uniswap.", - "bridgedAsset.modal.feature.withdrawToNativeChain": "Retirar-se a {{nativeChainName}}", - "bridgedAsset.modal.feature.withdrawToNativeChain.description": "Torna a connectar-te a la xarxa nativa en qualsevol moment.", - "bridgedAsset.modal.title": "Intercanvia {{currencySymbol}} a {{chainName}}", - "bridgedAsset.send.warning.description": "Esteu enviant una versió empaquetada de {{currencySymbol}} el {{chainName}}. Enviar-la a una plataforma d'intercanvi centralitzada comportarà una pèrdua permanent de fons.", - "bridgedAsset.send.warning.title": "Assegureu-vos que envieu a una adreça compatible", - "bridgedAsset.tdp.description": "Aquesta és una versió en pont de {{currencySymbol}} que té una proporció 1:1 i està recolzada per {{currencySymbol}}natiu.", - "bridgedAsset.wormhole.button": "Continua cap al forat de cuc", - "bridgedAsset.wormhole.description": "Continua fins al portal del Forat de Cuc per fer un pont entre el teu {{currencySymbol}} i el teu {{chainName}} i el teu {{nativeChainName}}.", - "bridgedAsset.wormhole.title": "Retirar {{currencySymbol}} a {{nativeChainName}}", - "bridgedAsset.wormhole.toNativeChain": "a {{nativeChainName}}", - "bridgedAsset.wormhole.withdrawToNativeChain": "Retirar-se a {{nativeChainName}}", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "chart.candlestick": "Candelera", - "chart.error.pools": "No es poden mostrar les dades històriques del grup actual.", - "chart.error.tokens": "No es poden mostrar les dades històriques del testimoni actual.", - "chart.line": "Gràfic de línies", - "chart.missingData": "Falten dades del gràfic", - "chart.price.label.close": "Tanca", - "chart.price.label.high": "Alt", - "chart.price.label.low": "baix", - "chart.price.label.open": "Obert", - "chart.settings.unavailable.label": "Aquesta configuració no està disponible per al gràfic actual", - "claim.thanks": "Gràcies per formar part de la comunitat Uniswap ", - "claim.uni.arrived": "Ha arribat la UNI", - "common.about": "Sobre", - "common.accept": "Acceptar", - "common.active": "Actiu", - "common.activeNetworks": "Xarxes actives", - "common.activity": "Activitat", - "common.add.label": "Afegeix", - "common.add.liquidity.canceled": "Afegir liquiditat cancel·lada", - "common.addLiquidity": "Afegeix liquiditat", - "common.address": "Adreça", - "common.addressOrENS": "Adreça de cartera o nom de l'ENS", - "common.advanced": "Avançat", - "common.all": "Tots", - "common.allTime": "Tot el temps", - "common.and": "i", - "common.app": "App", - "common.approved": "Aprovat", - "common.approvePending": "Aprovació pendent...", - "common.approvePermitTx": "Aprova la sol·licitud {{indexText}}", - "common.approvePermitTx.active": "Aprova la sol·licitud{{indexText}} al moneder", - "common.approvePermitTx.explainer": "Què són les aprovacions de Permit2?", - "common.approvePermitTx.pending": "Aprovant la sol·licitud {{indexText}}...", - "common.approveSpend": "Aprova la despesa de {{symbol}}", - "common.approving": "Aprovant", - "common.approximatelyValue": "~{{value}}", - "common.areYouSure": "Estàs segur?", - "common.automatic": "Automàtic", - "common.availableIn": "Uniswap disponible a: ", - "common.availableOnIOSAndroidChrome": "Disponible a iOS, Android i Chrome", - "common.backToPositions": "Tornar a les posicions", - "common.bestRoute": "Ruta", - "common.bestRoute.with": "Ruta via {{provider}}", - "common.biometrics.generic": "Biometria", - "common.biometrics.touchId": "Identificació tàctil", - "common.biometrics.windowsHello": "Hola de Windows", - "common.blocked.ifError": "Si creieu que es tracta d'un error, envieu un correu electrònic amb la vostra adreça a ", - "common.blocked.reason": "Aquesta adreça està bloquejada a la interfície d'Uniswap Labs perquè està associada a una o més activitats bloquejades.", - "common.blockedAddress": "Adreça bloquejada", - "common.blog": "Bloc", - "common.bought": "Comprat", - "common.brandAssets": "Actius de marca", - "common.button.accept": "Acceptar", - "common.button.back": "esquena", - "common.button.buy": "Compra", - "common.button.cancel": "Cancel · lar", - "common.button.checkin": "Registrar", - "common.button.close": "Tanca", - "common.button.confirm": "Confirmeu", - "common.button.connect": "Connecta't", - "common.button.continue": "Continua", - "common.button.copied": "Copiat", - "common.button.copy": "Còpia", - "common.button.create": "Crear", - "common.button.delete": "Suprimeix", - "common.button.disable": "Desactiva", - "common.button.disabling": "Desactivació", - "common.button.disconnect": "Desconnecta", - "common.button.dismiss": "Descartar", - "common.button.done": "Fet", - "common.button.edit": "Edita", - "common.button.enable": "Activa", - "common.button.finish": "Acabar", - "common.button.goBack": "Torna", - "common.button.later": "Potser després", - "common.button.learn": "Aprèn més", - "common.button.next": "Pròxim", - "common.button.notNow": "Ara no", - "common.button.ok": "D'acord", - "common.button.paste": "Enganxa", - "common.button.pay": "Pagar", - "common.button.proceed": "Continuar", - "common.button.receive": "Rebre", - "common.button.remove": "Eliminar", - "common.button.reset": "Restableix", - "common.button.retry": "Torna-ho a provar", - "common.button.reveal": "Revelar", - "common.button.review": "Revisió", - "common.button.save": "Desa", - "common.button.scrollDown": "Desplaça cap avall", - "common.button.sell": "Vendre", - "common.button.send": "Enviar", - "common.button.setup": "Configurar", - "common.button.share": "Compartir", - "common.button.showLess": "Mostra menys", - "common.button.showMore": "Mostra més", - "common.button.sign": "Signe", - "common.button.skip": "Omet", - "common.button.swap": "Canviar", - "common.button.tryAgain": "Torna-ho a provar", - "common.button.understand": "entenc", - "common.button.unlock": "Descobrir", - "common.button.view": "Veure", - "common.button.viewDetails": "Veure detalls", - "common.button.yes": "Sí", - "common.buy.label": "Compra", - "common.buyAndSell": "Compra i ven a Uniswap", - "common.cancellationSubmitted": "S'ha enviat la cancel·lació", - "common.cancellationSuccessful": "Cancel·lació correcta", - "common.cancelOrder": "Cancel · lar la comanda", - "common.card.error.description": "Alguna cosa ha anat malament", - "common.card.error.title": "Vaja! Alguna cosa ha anat malament.", - "common.careers": "Carreres professionals", - "common.chain.networkCost": "{{chain}} cost de xarxa", - "common.chart": "Gràfic", - "common.checkNetwork": "Comproveu l'estat de la xarxa aquí.", - "common.chromeExtension": "Extensió", - "common.claim.failed": "La reclamació ha fallat", - "common.claimed": "Reclamat", - "common.claiming": "Reclamació", - "common.claimUnis": "Reclameu les vostres fitxes UNI", - "common.clear": "Clar", - "common.close": "Tanca", - "common.closed": "Tancat", - "common.collect.button": "Recull", - "common.company": "Companyia", - "common.confirm": "Confirmeu", - "common.confirmCancellation": "Confirmeu la cancel·lació", - "common.confirmed": "Confirmat", - "common.confirmSend.button": "Confirmeu l'enviament", - "common.confirmSwap": "Confirmeu l'intercanvi a la cartera", - "common.confirmTimedOut": "S'ha esgotat el temps de confirmació. Si us plau, torna-ho a provar.", - "common.confirmTransfer": "Confirma la transferència", - "common.confirmWallet": "Confirmeu a la cartera", - "common.connect.button": "Connecta't", - "common.connectAWallet.button": "Connecteu una cartera", - "common.connectAWallet.button.evm": "Connecta la cartera Ethereum", - "common.connectAWallet.button.evm.switch": "Canvia la cartera Ethereum", - "common.connectAWallet.button.svm": "Connecta la cartera Solana", - "common.connectAWallet.button.svm.switch": "Canvia la cartera Solana", - "common.connectAWallet.button.switch": "Canvia de cartera", - "common.connectTo": "Connecta't a {{platform}}", - "common.connectWallet.button": "Connecta la cartera", - "common.contactUs.button": "Contacta amb nosaltres", - "common.copied": "Copiat", - "common.copy.address": "Copia l'adreça", - "common.copy.poolId": "Copia l'ID del grup", - "common.copyLink.button": "Copia l'enllaç", - "common.created.date": "S'ha creat {{date}}", - "common.currency": "Moneda", - "common.currentPrice": "Preu actual", - "common.custom": "Personalitzat", - "common.customRange": "Gamma personalitzada", - "common.dataOutdated": "Les dades poden estar obsoletes", - "common.day": "dia", - "common.default": "Per defecte", - "common.defaultTradeOptions": "Opcions comercials per defecte", - "common.deposit.toNetwork": "Diposita fitxes a la xarxa {{label}} .", - "common.depositing": "Dipositant", - "common.depositTokens": "Dipòsit de fitxes", - "common.detected": "Detectat", - "common.developers": "Desenvolupadors", - "common.device": "Aquest dispositiu", - "common.device.other": "Un altre dispositiu", - "common.dismiss": "Descartar", - "common.docs": "Documents", - "common.donate": "Donar", - "common.done": "Fet", - "common.dontShowAgain": "No tornis a mostrar això", - "common.download": "descarregar", - "common.downloadAppStore": "Descarrega a l'App Store", - "common.downloadPlayStore": "Descarrega a Play Store", - "common.downloadUniswapApp": "Descarrega l'aplicació Uniswap", - "common.downloadUniswapWallet": "Descarrega el moneder Uniswap", - "common.dynamic": "Dinàmic", - "common.edit.button": "Edita", - "common.ended": "S'ha acabat", - "common.error.details": "Detalls de l'error", - "common.error.general": "Alguna cosa ha anat malament", - "common.error.label": "Error", - "common.error.request": "Ho sentim, s'ha produït un error en processar la vostra sol·licitud. Si sol·liciteu assistència, assegureu-vos de copiar els detalls d'aquest error.", - "common.error.somethingWrong": "Alguna cosa ha anat malament!", - "common.errorConnecting.error": "Error de connexió", - "common.errorLoadingData.error": "S'ha produït un error en carregar les dades", - "common.etherscan": "Etherscan", - "common.expiry": "Caducitat", - "common.explore": "Explora", - "common.explorer": "Explorador", - "common.exploreTokens": "Explora fitxes", - "common.extension": "Extensió Uniswap", - "common.failedSwitchNetwork": "No s'ha pogut canviar de xarxa", - "common.fee": "Quota", - "common.fees": "Comissions", - "common.feesEarned": "Comissions guanyades", - "common.feesEarnedPerBase": "{{symbolA}} per {{symbolB}}", - "common.for": "Per", - "common.free": "Gratuït", - "common.fullRange": "Gamma completa", - "common.getApp": "Obteniu l'aplicació", - "common.getHelp.button": "Aconseguir ajuda", - "common.getStarted": "Comença", - "common.getSupport.button": "Obteniu suport", - "common.getTheApp": "Obtenir l'aplicació", - "common.getUniswapWallet": "Obteniu Uniswap Wallet", - "common.getUniswapWallet.mobile": "Obteniu l'aplicació mòbil Uniswap", - "common.governance": "Governança", - "common.happyHolidays": "Bones festes de l'equip d'Uniswap!", - "common.help": "Ajuda", - "common.helpCenter": "Centre d'ajuda", - "common.hidden": "Ocult", - "common.hide.button": "Amaga", - "common.highPrice": "Preu alt", - "common.includes": "Inclou", - "common.info.label": "Informació", - "common.input.noRecipient.error": "Seleccioneu el destinatari", - "common.input.password.confirm": "Confirma la contrassenya", - "common.input.password.error.mismatch": "Les contrasenyes no coincideixen", - "common.input.password.error.weak": "Aquesta contrasenya és massa feble", - "common.input.password.new": "Nova contrasenya", - "common.input.password.placeholder": "Contrasenya", - "common.input.password.strength.medium": "Mitjana", - "common.input.password.strength.strong": "Fort", - "common.input.password.strength.weak": "Feble", - "common.input.search": "Cerca", - "common.insufficient.funds": "Fons insuficients", - "common.insufficientBalance.error": "Balanç insuficient", - "common.insufficientFundsForNetworkFee.error": "Fons insuficients per cobrir el cost de la xarxa", - "common.insufficientTokenBalance.error": "Balanç {{tokenSymbol}} insuficient", - "common.insufficientTokenBalance.error.simple": "No n'hi ha prou {{tokenSymbol}}", - "common.invalidPair": "Parell no vàlid", - "common.invalidRecipient.error": "Destinatari no vàlid", - "common.iOSAndroid": "iOS i Android", - "common.language": "Llenguatge", - "common.learnMoreSwap": "Més informació sobre els intercanvis", - "common.legalAndPrivacy": "Legal i Privacitat", - "common.less": "Menys", - "common.limit.cancel_one": "Cancel·la el límit", - "common.limit.cancel_other": "Cancel·la els límits de {{count}}", - "common.limit.canceled": "Límit cancel·lat", - "common.limit.executed": "Límit executat", - "common.limit.expired": "El límit ha caducat", - "common.limit.failed": "El límit ha fallat", - "common.limit.opened": "Límit obert", - "common.limit.pending": "Límit pendent", - "common.limits": "Límits", - "common.limits.approachMax": "S'acosta al límit màxim de 100", - "common.limits.cancelProceed": "Cancel·la els límits per continuar", - "common.limits.expires": "Caduca {{timestamp}}", - "common.limits.open": "Límits oberts", - "common.limits.when": "quan {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "Enllaços", - "common.liquidity": "Liquiditat", - "common.liquidity.provision": "Provisió de liquiditat", - "common.liquidity.removed": "Liquiditat eliminada", - "common.loading": "Carregant", - "common.longText.button.less": "Llegeix menys", - "common.longText.button.more": "Llegeix més", - "common.lowPrice": "Preu baix", - "common.manage": "Gestionar", - "common.market.label": "Mercat", - "common.marketPrice": "Preu de mercat", - "common.marketPrice.fetching": "S'està buscant el preu del mercat...", - "common.marketPrice.label": "Preu de mercat:", - "common.marketPrice.unavailable": "No s'ha trobat el preu de mercat. Si us plau, fes la teva pròpia investigació per evitar la pèrdua de fons.", - "common.max": "Màx", - "common.message": "Missatge", - "common.migrate": "Migrar", - "common.migrate.liquidity.failed": "Ha fallat la migració de liquiditat", - "common.migrate.position": "Migrar posició", - "common.migrated.liquidity": "Liquiditat migrada", - "common.migrating.liquidity": "Liquiditat migratòria", - "common.min": "Min", - "common.more": "Més", - "common.moreDetails": "Més detalls", - "common.navigation.settings": "Configuració", - "common.navigation.systemSettings": "Configuració", - "common.navigationButton": "Botó de navegació", - "common.needHelp": "Necessitar ajuda?", - "common.networkCost": "Cost de la xarxa", - "common.neverMind": "No importa", - "common.new": "Nou", - "common.new.exclamation": "Nou!", - "common.nft": "NFT", - "common.nfts": "NFT", - "common.noAmount.error": "Introduïu una quantitat", - "common.noData": "No hi ha dades", - "common.none": "Cap", - "common.noResults": "Sense resultats.", - "common.notAvailableInRegion.error": "No disponible a la teva regió", - "common.notCreated.label": "No creat", - "common.notSupported": "No s'admet", - "common.oneDay": "1 dia", - "common.oneDay.short": "1D", - "common.oneHour.short": "1H", - "common.oneMonth": "1 mes", - "common.oneWeek": "1 setmana", - "common.oneYear": "1 any", - "common.opensea.link": "Veure a OpenSea", - "common.orderCanceled": "Comanda cancel·lada", - "common.orderExecuted": "Ordre executada", - "common.orderExpired": "La comanda ha caducat", - "common.orderPending": "Comanda pendent", - "common.outOfRange": "Fora de rang", - "common.pageNotFound": "Pàgina no trobada!", - "common.passkey.count": "Clau d'accés {{number}}", - "common.passkeys": "Claus d'accés", - "common.passkeys.add": "Afegiu una contrasenya", - "common.passkeys.add.description": "Trieu on desar la vostra nova clau de pas.", - "common.pastDay": "Dia passat", - "common.pastFiveMinutes": "Darrers cinc minuts", - "common.pastHour": "Hora passada", - "common.pastMonth": "El mes passat", - "common.pastWeek": "La setmana passada", - "common.pastYear": "L'any passat", - "common.pending": "Pendents", - "common.pending.cancellation": "Pendent de cancel·lació", - "common.pendingEllipsis": "Pendents...", - "common.permit": "Permís", - "common.plusMore": "+{{number}} més", - "common.pool": "Piscina", - "common.pools": "Piscines", - "common.portfolio": "Cartera", - "common.poweredBy": "Desenvolupat per ", - "common.price": "Preu", - "common.priceUpdated": "Preu actualitzat", - "common.privacyChoices": "Les vostres opcions de privadesa", - "common.privacyChoices.checkbox.description": "Quan estigui marcat, no compartirem les vostres dades amb socis de tercers per a publicitat personalitzada. Pots activar l'ús compartit en qualsevol moment desmarcant aquesta casella.", - "common.privacyChoices.checkbox.label": "No comparteixis la meva informació", - "common.privacyChoices.description": "Podem compartir identificadors de dispositius amb els nostres socis publicitaris per promocionar els nostres serveis en altres llocs web i plataformes. Quan això es qualifica com a venda, compartició o publicitat orientada segons les lleis aplicables, podeu desactivar-vos marcant la casella \"no comparteixis la meva informació\". Per obtenir més informació sobre les nostres pràctiques de privadesa, reviseu la nostra Política de privadesa.", - "common.privacyChoices.disclaimer": "Tingueu en compte que la vostra selecció només s'aplicarà a aquest navegador d'aquest dispositiu. També podeu desactivar-vos activant la configuració del Control global de privadesa al navegador que utilitzeu per accedir als nostres serveis. Per veure més opcions, aneu a la vostra configuració.", - "common.privacyPolicy": "Política de privacitat", - "common.proceed": "Continuar", - "common.proceedInWallet": "Continua amb la teva cartera", - "common.products": "Productes", - "common.protocol": "Protocol", - "common.protocol.v2": "Uniswap v2", - "common.protocol.v3": "Uniswap v3", - "common.protocol.v4": "Uniswap v4", - "common.purchased": "Comprat", - "common.rate": "Taxa", - "common.readMore": "Llegeix més", - "common.receive": "Rebre", - "common.received": "Rebut", - "common.recent": "Recent", - "common.refresh": "Actualitza", - "common.reload.label": "Torna a carregar l'aplicació", - "common.remove.label": "Eliminar", - "common.remove.liquidity.canceled": "Eliminació de liquiditat cancel·lada", - "common.remove.liquidity.failed": "S'ha produït un error en eliminar la liquiditat", - "common.removing.liquidity": "Eliminació de liquiditat", - "common.resetLimit": "Restableix el límit de {{symbol}}", - "common.resetLimitWallet": "Restableix el límit de {{symbol}} a la cartera", - "common.resettingLimit": "S'està restablint el límit {{symbol}} ...", - "common.revoke.approval.failed": "No s'ha pogut revocar l'aprovació", - "common.revoked.approval": "Aprovació revocada", - "common.revoking.approval": "Revocació de l'aprovació", - "common.scanQRDownload": "Escaneja el codi QR amb el telèfon per descarregar-lo", - "common.selectRegion.label": "Seleccioneu la vostra regió", - "common.selectToken.label": "Seleccioneu un testimoni", - "common.sell.label": "Vendre", - "common.send.button": "Enviar", - "common.send.failed": "L'enviament ha fallat", - "common.sending": "Enviament", - "common.sent": "Enviat", - "common.settings": "Configuració", - "common.share": "Compartir", - "common.share.shareToTwitter": "Comparteix a Twitter", - "common.show.button": "Espectacle", - "common.showLess.button": "Mostra menys", - "common.showMore.button": "Mostra més", - "common.signatureExpired": "La teva signatura ha caducat.", - "common.signMessage": "Signar missatge", - "common.signMessageWallet": "Signa el missatge a la cartera", - "common.socials": "Xarxes socials", - "common.sold": "Vengut", - "common.stats": "Estadístiques", - "common.status": "Estat", - "common.step.number": "Pas {{number}}", - "common.step.number.of": "Pas {{current}} de {{total}}", - "common.swap": "Canviar", - "common.swap.expired": "L'intercanvi ha caducat", - "common.swap.failed": "L'intercanvi ha fallat", - "common.swapPending": "Canvi pendent...", - "common.termsOfService": "Termes del servei", - "common.text.connected": "Connectat", - "common.text.contract": "Contracte", - "common.text.disconnected": "Desconnectat", - "common.text.error": "Error", - "common.text.notAvailable": "N/A", - "common.text.recipient": "A", - "common.text.sender": "Des de", - "common.text.unknown": "Desconegut", - "common.thisAccount": "aquest compte", - "common.thisMonth": "Aquest mes", - "common.thisToken": "Aquest testimoni", - "common.thisWeek": "Aquesta setmana", - "common.thisYear": "Aquest any", - "common.time": "Temps", - "common.time.minute.amt": "{{time}}m", - "common.time.minutes": "minuts", - "common.time.past.days": "{{days}} dies", - "common.time.past.days.short": "{{days}}d", - "common.time.past.hours": "{{hours}} hores", - "common.time.past.hours.short": "{{hours}}h", - "common.time.past.minutes.short": "{{minutes}}m", - "common.time.past.months.short": "{{months}}mes", - "common.time.past.seconds.short": "{{seconds}}s", - "common.to": "a", - "common.today": "Avui", - "common.tokenA": "Fitxa A", - "common.tokenAmount": "Import del testimoni", - "common.tokenB": "Fitxa B", - "common.tokenName": "Nom del testimoni", - "common.tokens": "Fitxes", - "common.totalUniswapTVL": "Total Uniswap TVL", - "common.totalValueLocked": "TVL", - "common.trade": "Comerç", - "common.trademarkPolicy": "Política de marques comercials", - "common.transactionDetails": "Detalls de la transacció", - "common.transactionId": "Identificador de transacció", - "common.transactionPending": "Transacció pendent", - "common.transactions": "Transaccions", - "common.transactionSettings": "Configuració de la transacció", - "common.transfer_one": "transferència", - "common.transfer_other": "transferències", - "common.tryAgain.error": "Torna-ho a provar", - "common.twitter": "Twitter", - "common.type.label": "Tipus", - "common.unavailable": "No disponible", - "common.unhide": "Mostra", - "common.unichain": "Unichain", - "common.uniswapMobile": "Uniswap Mobile", - "common.uniswapWallet": "Cartera Uniswap", - "common.uniswapX": "UniswapX", - "common.unknown": "Desconegut", - "common.unknownError.error": "Error desconegut", - "common.unwrap.button": "Desembolicar", - "common.unwrap.failed": "S'ha produït un error en desembalar", - "common.unwrapped": "Desembolicat", - "common.unwrapping": "Desembolcall", - "common.view.profile": "Veure perfil", - "common.viewOnExplorer": "Veure a l'Explorador", - "common.volume": "Volum", - "common.vote": "Vota", - "common.wallet.approve": "Aprovar a la cartera", - "common.wallet.label": "Cartera", - "common.warning": "Avís", - "common.webApp": "Aplicació web", - "common.website": "Lloc web", - "common.whyApprove": "Per què he d'aprovar un testimoni?", - "common.whySign": "Per què cal les signatures?", - "common.whyWrap": "Per què he d'embolicar el meu {{symbol}}?", - "common.withdraw": "Retirar", - "common.withdrawal.amount": "Import de la retirada", - "common.withinRange": "En rang", - "common.wrap": "Emboliqui {{symbol}}", - "common.wrap.failed": "Ha fallat l'embolcall", - "common.wrapIn": "Emboliqui {{symbol}} a la cartera", - "common.wrapped": "Embolicat", - "common.wrapping": "Embolcall", - "common.wrappingToken": "Embolicant {{symbol}}...", - "common.yesterday": "Ahir", - "common.your.account.had.insufficient.funds": "El vostre compte no tenia prou fons per completar aquest intercanvi.", - "common.your.account.has.insufficient.funds": "El vostre compte no té prou fons per completar aquest intercanvi.", - "common.your.connected.wallet": "La teva cartera connectada", - "common.your.limit.could.not.be.fulfilled": "El vostre límit no s'ha pogut complir en aquest moment. Siusplau torna-ho a provar.", - "common.your.swap.could.not.be.fulfilled": "El vostre intercanvi no s'ha pogut complir en aquest moment. Siusplau torna-ho a provar.", - "common.youreBuying": "Estàs comprant", - "common.youReceive": "Vostè rep", - "common.youreSelling": "Estàs venent", - "currency.ars": "Peso argentí", - "currency.aud": "Dòlar australià", - "currency.brl": "Real brasiler", - "currency.cad": "Dòlar canadenc", - "currency.cny": "Yuan xinès", - "currency.cop": "Peso colombià", - "currency.eur": "Euro", - "currency.gbp": "Lliura britànica", - "currency.hkd": "Dòlar de Hong Kong", - "currency.idr": "Rupia indonèsia", - "currency.inr": "Rupia índia", - "currency.jpy": "Ien japonès", - "currency.krw": "Won sud-coreà", - "currency.mxn": "peso mexicà", - "currency.ngn": "Naira nigeriana", - "currency.pkr": "Rupia pakistanesa", - "currency.rub": "Ruble rus", - "currency.sgd": "Dòlar de Singapur", - "currency.try": "Lira turca", - "currency.uah": "Hryvnia ucraïnesa", - "currency.usd": "Dòlar dels Estats Units", - "currency.vnd": "Dong vietnamita", - "dapp.request.actionCannotBeCompleted.description": "Algunes funcionalitats no estan disponibles perquè la configuració del moneder intel·ligent la gestiona una altra aplicació de moneder.", - "dapp.request.actionCannotBeCompleted.header": "Sol·licitud de signatura", - "dapp.request.actionCannotBeCompleted.title": "No es pot completar l'acció", - "dapp.request.approve.action": "Aprovar", - "dapp.request.approve.fallbackTitle": "Aprova aquest lloc per accedir als testimonis", - "dapp.request.approve.helptext": "Permet que aquest lloc accedeixi i gasti aquest testimoni per a transaccions. Assegureu-vos de confiar en aquest lloc.", - "dapp.request.approve.label": "Cartera", - "dapp.request.approve.title": "Aprova l'accés a {{tokenSymbol}}", - "dapp.request.base.title": "Sol·licitud de transacció", - "dapp.request.bridge.description": "Mou ETH, USDC i més a través de xarxes {{numChains}}+.", - "dapp.request.bridge.title": "Intenta fer un pont?", - "dapp.request.connect.helptext": "Permet que aquest lloc vegi l'adreça de la cartera, el saldo i sol·liciti aprovacions per a transaccions.", - "dapp.request.connect.title": "Connecteu-vos al lloc", - "dapp.request.fallback.calldata.label": "Dades en brut", - "dapp.request.fallback.function.label": "Funció", - "dapp.request.permit2.description": "Permit2 gestiona les aprovacions de testimonis en múltiples dapps.", - "dapp.request.permit2.header": "Signar el permís 2", - "dapp.request.permit2approve.action": "Aprovar", - "dapp.request.permit2approve.helptext": "Permit2 gestiona les aprovacions de testimonis en múltiples dapps.", - "dapp.request.permit2approve.title": "Aprova el permís 2", - "dapp.request.reject.action": "Rebutja-ho tot", - "dapp.request.reject.info": "Tens {{totalRequestCount}} sol·licituds de transacció", - "dapp.request.revoke.action": "Revocar", - "dapp.request.revoke.helptext": "Permet que aquest lloc revoqui l'accés per gastar aquest testimoni per a transaccions. Assegureu-vos de confiar en aquest lloc.", - "dapp.request.revoke.title": "Revoca l'accés a {{tokenSymbol}}", - "dapp.request.signature.containsUnrenderableCharacters": "Aquest missatge conté caràcters no representables. Assegureu-vos de confiar en aquest lloc.", - "dapp.request.signature.decodeError": "No s'ha pogut descodificar el missatge", - "dapp.request.signature.header": "Sol·licitud de signatura", - "dapp.request.signature.irregular": "Sol·licitud de signatura irregular", - "dapp.request.signature.irregular.description": "Assegureu-vos de confiar en aquest lloc abans de continuar", - "dapp.request.signature.irregular.understand": "Entenc els riscos", - "dapp.request.signature.toggleDataView.raw": "Veure dades en brut", - "dapp.request.signature.toggleDataView.readable": "Veure les dades originals", - "dapp.request.warning.notActive.message": "Assegureu-vos que sigui el correcte", - "dapp.request.warning.notActive.title": "Aquesta no és la vostra cartera activa", - "delegation.upgradeModal.description": "Aquesta actualització de la cartera utilitza contractes intel·ligents per a transaccions més ràpides i de menor cost. Més informació", - "delegation.upgradeModal.enableSmartWallet": "Activa la cartera intel·ligent", - "delegation.upgradeModal.title": "Intercanvis més intel·ligents, costos més baixos", - "downloadApp.modal.connectExistingWallet": "Connecteu la cartera existent", - "downloadApp.modal.getStarted.description": "Aconsegueix accés a milers de fitxes a l'instant a través del mercat onchain més gran del món.", - "downloadApp.modal.getStarted.title": "Comenceu a canviar en segons", - "downloadApp.modal.getTheApp.title": "Comenceu amb Uniswap", - "downloadApp.modal.uniswapProducts.subtitle": "Els productes Uniswap funcionen perfectament junts per crear la millor experiència onchain.", - "empty.swap.button.text": "Afegir fons a l'intercanvi", - "error.dataUnavailable": "Les dades no estan disponibles en aquest moment; estem treballant en una solució", - "error.id": "Identificador d'error: {{eventId}}", - "error.jupiterApi.execute.default.title": "S'ha produït un error amb l'API de Júpiter. Torna-ho a provar.", - "error.jupiterApi.failedToLand": "(Codi {{code}}: La transacció no ha pogut aterrar a la xarxa)", - "error.jupiterApi.invalidBlockHeight": "(Codi -1004: Alçada de bloc no vàlida)", - "error.jupiterApi.invalidMessageBytes": "(Codi -3: Bytes de missatge no vàlids)", - "error.jupiterApi.invalidPayload": "(Codi -2002: Càrrega útil no vàlida)", - "error.jupiterApi.invalidSignedTransaction": "(Codi -2: Transacció signada no vàlida)", - "error.jupiterApi.invalidTransaction": "(Codi -1002: Transacció no vàlida)", - "error.jupiterApi.missingCachedOrder": "(Codi -1: Falta l'ordre emmagatzemat a la memòria cau)", - "error.jupiterApi.notFullySigned": "(Codi -1003: Transacció no completament signada)", - "error.jupiterApi.quoteExpired": "Aquesta cita ha esgotat el temps d'espera, si us plau, torna-ho a intentar. (Codi -2003)", - "error.jupiterApi.unknownErrorCode": "(Codi {{code}})", - "error.noData": "No s'han trobat dades", - "error.request.provideId": "Ho sentim, s'ha produït un error en processar la vostra sol·licitud. Si sol·liciteu assistència, assegureu-vos de proporcionar el vostre identificador d'error.", - "error.tokenApproval": "L'aprovació del testimoni ha fallat", - "error.tokenApproval.message": "És probable que un problema de xarxa o de connexió hagi provocat que la teva aprovació hagi fallat. Comprova la connexió i torna-ho a provar.", - "error.tokenApprovalEdited": "Import d'aprovació insuficient", - "error.tokenApprovalEdited.message": "L'import d'aprovació establert a la cartera és massa baix per completar aquesta transacció. Si us plau, torna-ho a provar i augmenta la quantitat.", - "errors.crash.message": "Alguna cosa es va estavellar.", - "errors.crash.restart": "Reinicieu l'aplicació", - "errors.crash.title": "UH oh!", - "explore.more.pools": "Exploreu més piscines", - "explore.more.unichain": "Explora les piscines Unichain", - "explore.search.label.ownedBy": "Propietat de {{ownerAddress}}", - "explore.search.placeholder": "Cerca fitxes i carteres", - "explore.search.section.nft": "Col·leccions NFT", - "explore.search.section.popularNFT": "Col·leccions populars de NFT", - "explore.search.section.wallets": "Carteres", - "explore.tokens.error": "No s'han pogut carregar les fitxes", - "explore.tokens.favorite.action.add": "Fitxa preferida", - "explore.tokens.favorite.action.edit": "Edita els preferits", - "explore.tokens.favorite.action.remove": "Elimina el favorit", - "explore.tokens.favorite.title.default": "Fitxes preferides", - "explore.tokens.favorite.title.edit": "Editeu fitxes preferides", - "explore.tokens.metadata.marketCap": "{{number}} MCap", - "explore.tokens.metadata.totalValueLocked": "{{number}} TVL", - "explore.tokens.metadata.volume": "{{number}} Vol", - "explore.tokens.sort.label.marketCap": "Capitalització de mercat", - "explore.tokens.sort.label.priceDecrease": "Disminució de preus", - "explore.tokens.sort.label.priceIncrease": "Increment de preu", - "explore.tokens.sort.label.totalValueLocked": "TVL", - "explore.tokens.sort.label.volume": "Volum", - "explore.tokens.sort.option.marketCap": "Capitalització de mercat", - "explore.tokens.sort.option.priceDecrease": "Disminució del preu (24 h)", - "explore.tokens.sort.option.priceIncrease": "Augment de preu (24 h)", - "explore.tokens.sort.option.totalValueLocked": "Uniswap TVL", - "explore.tokens.sort.option.volume": "Volum Uniswap (24 h)", - "explore.tokens.top.title": "Top fitxes", - "explore.v2TVL": "v2 TVL", - "explore.v3TVL": "v3 TVL", - "explore.v4TVL": "v4 TVL", - "explore.wallets.favorite.action.add": "Cartera preferida", - "explore.wallets.favorite.action.edit": "Edita els preferits", - "explore.wallets.favorite.action.remove": "Elimina el favorit", - "explore.wallets.favorite.action.remove.short": "Eliminar dels preferits", - "explore.wallets.favorite.title.default": "Carteres preferides", - "explore.wallets.favorite.title.edit": "Editeu les carteres preferides", - "extension.connection.network": "Xarxa", - "extension.connection.networks": "Xarxes", - "extension.connection.popup.trouble": "Tens problemes per connectar-te?", - "extension.connection.titleConnected": "Connectat", - "extension.connection.titleNotConnected": "No connectat", - "extension.lock.button.forgot": "Has oblidat la contrasenya?", - "extension.lock.button.reset": "Restableix la cartera", - "extension.lock.button.submit": "Descobrir", - "extension.lock.password.error": "Contrasenya incorrecta. Torna-ho a provar", - "extension.lock.password.reset.initial.description": "Uniswap no pot ajudar a recuperar la contrasenya. Heu de restablir la vostra cartera tornant a introduir la vostra frase de recuperació de 12 paraules.", - "extension.lock.password.reset.initial.help": "On trobo la meva frase de recuperació?", - "extension.lock.password.reset.initial.title": "Has oblidat la contrasenya", - "extension.lock.password.reset.speedbump.description": "Assegureu-vos de tenir la vostra frase de recuperació de 12 paraules abans de restablir la cartera. En cas contrari, no podreu recuperar els vostres fons.", - "extension.lock.password.reset.speedbump.help": "Vaig perdre la meva frase de recuperació", - "extension.lock.password.reset.speedbump.title": "Abans de continuar", - "extension.lock.subtitle": "Introdueix la teva contrasenya per desbloquejar", - "extension.lock.title": "Benvingut de nou", - "extension.network.notSupported": "Xarxa no compatible", - "extension.open": "Obriu l'extensió Uniswap", - "extension.passwordPrompt.error.wrongPassword": "Contrasenya incorrecta. Torna-ho a provar", - "extension.passwordPrompt.title": "Fica la teva contrasenya", - "extension.popup.chrome.button": "Extensió oberta", - "extension.popup.chrome.description": "Completeu aquesta acció obrint l'extensió Uniswap.", - "extension.popup.chrome.title": "Continueu en Uniswap", - "extension.settings.defaultWallet.message": "Doneu prioritat a l'extensió Uniswap quan us connecteu a aplicacions.", - "extension.settings.defaultWallet.title": "Crea la cartera predeterminada", - "extension.uninstall.reason.missingFeatures": "A Uniswap Wallet li falten certes funcions", - "extension.uninstall.reason.notUsingCrypto": "Ja no vull utilitzar criptomonedes", - "extension.uninstall.reason.other": "Altres motius", - "extension.uninstall.reason.switchingWallet": "Canvio a una cartera diferent", - "extension.uninstall.subtitle": "Si tens un moment, ens agradaria molt saber per què has desinstal·lat Uniswap Wallet.", - "extension.uninstall.title": "Ens sap greu veure't marxar", - "extension.warning.storage.button": "Fes una còpia de seguretat", - "extension.warning.storage.message": "Assegureu-vos de fer una còpia de seguretat de la vostra frase de recuperació per evitar perdre l'accés a la vostra cartera i fons.", - "extension.warning.storage.title": "El teu navegador s'està quedant sense emmagatzematge", - "extensionPasskeyLogInPopUp.description": "Importa el teu compte d'Uniswap iniciant la sessió amb una contrasenya existent.", - "extensionPasskeyLogInPopUp.invalidReferrer": "Si us plau, tanqueu aquesta pàgina i torneu-ho a intentar.", - "fee.bestForCustomizability": "El millor per a la personalització.", - "fee.bestForExotic": "El millor per a parelles exòtiques.", - "fee.bestForMost": "El millor per a la majoria de parelles.", - "fee.bestForStablePairs": "El millor per a parelles estables.", - "fee.bestForVeryStable": "El millor per a parelles molt estables.", - "fee.dynamic": "Quota dinàmica", - "fee.percentEarned": "El % que guanyaràs en comissions.", - "fee.selectPercent": "{{pct}}% de selecció", - "fee.selectPercentDescription": "{{pct}}% de liquiditat seleccionat aquest nivell", - "fee.tier": "Nivell de tarifes", - "fee.tier.create": "Crea un nivell de tarifa", - "fee.tier.create.button": "Crea un nou nivell de tarifes", - "fee.tier.create.description": "La creació d'un nivell nou s'iniciarà en un grup nou i comportarà costos de xarxa superiors als habituals.", - "fee.tier.description": "La quantitat guanyada aportant liquiditat. Trieu una quantitat que s'adapti a la vostra estratègia i tolerància al risc.", - "fee.tier.description.v2": "La quantitat guanyada aportant liquiditat. Tots els grups v2 tenen tarifes fixes del 0,3%. Per obtenir més opcions, proporcioneu liquiditat a la v4.", - "fee.tier.dynamic": "Nivell de tarifes dinàmics", - "fee.tier.dynamic.create": "Creació d'un nivell dinàmic de tarifes", - "fee.tier.dynamic.create.info": "Esteu a punt de crear un grup amb un nivell de tarifa dinàmic. Abans de continuar, assegureu-vos que el ganxo seleccionat admet les tarifes dinàmiques.", - "fee.tier.highestTvl": "TVL més alta", - "fee.tier.label": "El % que guanyaràs en comissions", - "fee.tier.missing.description": "No trobeu el nivell que busqueu?", - "fee.tier.new": "Nou nivell", - "fee.tier.percent.select": "{{percentage}} selecciona", - "fee.tier.recommended.description": "Recomanat en funció de tenir la quota més alta de liquiditat per al parell de fitxes seleccionat.", - "fee.tier.search": "Cerqueu o creeu altres nivells de tarifes", - "fee.tier.search.short": "Cerca nivells", - "fee.tier.select": "Seleccioneu el nivell de tarifa", - "fee.tier.select.existing.button": "Seleccioneu el nivell de tarifa existent", - "fee.tierExact": "nivell de tarifa {{fee}}", - "fee.unavailable": "Les comissions guanyades no són visibles per a les posicions v2 fins que s'elimini la liquiditat.", - "fee.uncollected": "Inclou comissions no cobrades:", - "fee.uniswap": "Tarifa ({{percent}})", - "fee.uniswap.description": "S'apliquen comissions per garantir la millor experiència amb Uniswap.", - "fiatOffRamp.checkout.title": "Retirar-se a", - "fiatOffRamp.connection.quote": "Venint {{amount}} per valor de {{currencySymbol}}", - "fiatOffRamp.error.balance": "Supera l'equilibri", - "fiatOffRamp.error.populateSend.description": "Si us plau, espereu un moment i torneu-ho a intentar.", - "fiatOffRamp.error.populateSend.title": "No es pot carregar la transacció", - "fiatOffRamp.summary.total": "{{cryptoAmount}} per a {{fiatAmount}}", - "fiatOffRamp.unsupportedToken.back": "Torna", - "fiatOffRamp.unsupportedToken.divider": "Fitxes no compatibles", - "fiatOffRamp.unsupportedToken.message": "Aquest testimoni no s'admet per vendre. Canvia aquest actiu per un dels testimonis admesos.", - "fiatOffRamp.unsupportedToken.swap": "Canvia a un testimoni compatible", - "fiatOffRamp.unsupportedToken.title": "Token no compatible", - "fiatOffRamp.welcome.tooltip": "Veniu la vostra criptografia al vostre compte bancari o targeta de dèbit.", - "fiatOnRamp.button.chooseToken": "Trieu el testimoni", - "fiatOnRamp.buy.info.description": "Ho necessitaràs per pagar els costos de xarxa quan facis el canvi.", - "fiatOnRamp.buy.info.title": "Comença amb ETH", - "fiatOnRamp.cexTransferModal.description": "La vostra regió no admet la compra de cripto amb una targeta. Transferiu actius des d'un compte de canvi centralitzat per finançar la vostra cartera.", - "fiatOnRamp.cexTransferModal.title": "Transferència per començar", - "fiatOnRamp.checkout.title": "Finalitzar la compra", - "fiatOnRamp.chooseMultiPlatformProvider.chooseNetwork": "Tria la xarxa", - "fiatOnRamp.chooseMultiPlatformProvider.description": "Això determinarà l'adreça del moneder on rebràs els fons.", - "fiatOnRamp.chooseProvider.description": "Continuareu al portal del proveïdor per veure les tarifes associades a la vostra transacció.", - "fiatOnRamp.completeTransactionHeader": "Completa la transacció amb {{serviceProvider}}", - "fiatOnRamp.connection.error": "Connexió fallida", - "fiatOnRamp.connection.errorDescription": "S'ha produït un error en connectar amb {{serviceProvider}}.", - "fiatOnRamp.connection.message": "Us connecto a {{serviceProvider}}", - "fiatOnRamp.connection.quote": "Comprar {{amount}} per valor de {{currencySymbol}}", - "fiatOnRamp.connection.terms": "En continuar, reconeixeu que estarà subjecte a les Condicions del servei i Política de privadesa amb {{serviceProvider}}, segons correspongui.", - "fiatOnRamp.continueInTab": "Aneu a la pestanya {{serviceProvider}} per continuar. És segur tancar aquest modal ara.", - "fiatOnRamp.disclaimer": "En continuar, reconeixeu que estarà subjecte a les Condicions del servei i Política de privadesa amb {{serviceProvider}}, segons correspongui.", - "fiatOnRamp.error.default": "Alguna cosa ha anat malament.", - "fiatOnRamp.error.load": "No s'han pogut carregar fitxes per comprar", - "fiatOnRamp.error.max": "Màxim {{amount}}", - "fiatOnRamp.error.min": "Mínim {{amount}}", - "fiatOnRamp.error.noQuotes": "No s'han trobat cites.", - "fiatOnRamp.error.unavailable": "Aquest servei no està disponible a la vostra regió", - "fiatOnRamp.error.unsupported": "No s'admet a la regió", - "fiatOnRamp.error.usd": "Només disponible per comprar en USD", - "fiatOnRamp.noQuotes.error": "No s'han trobat cites", - "fiatOnRamp.paymentMethods.applePay": "Apple Pay", - "fiatOnRamp.paymentMethods.bank": "Banc", - "fiatOnRamp.paymentMethods.debit": "Dèbit", - "fiatOnRamp.paymentMethods.googlePay": "Google Pay", - "fiatOnRamp.paymentMethods.paypal": "PayPal", - "fiatOnRamp.paymentMethods.venmo": "Venmo", - "fiatOnRamp.quote.advice": "Continuareu al portal del proveïdor per veure les tarifes associades a la vostra transacció.", - "fiatOnRamp.quote.type.list": "{{optionsList}}, i altres opcions", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "Des d'un compte", - "fiatOnRamp.receiveCrypto.title": "Rebre cripto", - "fiatOnRamp.receiveCrypto.transferFunds": "Finança la teva cartera transferint criptografia des d'una altra cartera o compte", - "fiatOnRamp.receiveCrypto.useThisAddress": "Feu servir aquesta adreça per rebre tokens a", - "fiatOnRamp.region.placeholder": "Cerca per país o regió", - "fiatOnRamp.region.title": "Seleccioneu la vostra regió", - "fiatOnRamp.summary.total": "{{cryptoAmount}} per a {{fiatAmount}}", - "forceUpgrade.action.backup": "Fes una còpia de seguretat de la teva cartera", - "forceUpgrade.action.confirm": "Actualitza ara", - "forceUpgrade.action.learn": "Aprèn a actualitzar", - "forceUpgrade.description.extension": "Hi ha disponible una nova versió de l'aplicació. Per continuar utilitzant l'extensió Uniswap, actualitzeu-la a la darrera versió.", - "forceUpgrade.description.wallet": "Hi ha disponible una nova versió de l'aplicació. Per continuar utilitzant Uniswap Wallet, actualitzeu-lo a la darrera versió.", - "forceUpgrade.label.recoveryPhrase": "Frase de recuperació", - "forceUpgrade.title": "Actualitza a la darrera versió", - "forceUpgrade.title.recommendedStatus": "Hi ha disponible una nova versió", - "globalPreferences.title": "Preferències globals", - "hero.scroll": "Desplaceu-vos per obtenir més informació", - "hero.subtitle": "Compra i ven criptomonedes a {{amount}}+ xarxes com ara Ethereum, Unichain i Base.", - "hero.swap.title": "Canvia en qualsevol moment,
a qualsevol lloc.", - "hidden.nfts.info.banner.text": "Obteniu més informació sobre les NFT ocultes", - "hidden.nfts.info.text.button": "NFT ocults ({{numHidden}})", - "hidden.nfts.info.text.extension": "Aquestes són possibles estafes i NFT que heu amagat. Podeu fer clic amb el botó dret sobre un NFT per mostrar-lo.", - "hidden.nfts.info.text.mobile": "Aquestes són possibles estafes i NFT que heu amagat. Podeu prémer llargament un NFT per mostrar-lo.", - "hidden.nfts.info.text.title": "NFT ocults", - "hidden.tokens.info.banner.text": "Més informació sobre les fitxes ocultes", - "hidden.tokens.info.text.button": "Fitxes ocultes ({{numHidden}})", - "hidden.tokens.info.text.info": "Es tracta d'estafes potencials, petits saldos i fitxes que heu amagat. Els fitxes ocults no s'inclouen al saldo total de la cartera.", - "hidden.tokens.info.text.title": "Fitxes ocultes", - "home.activity.empty.button": "Rebeu fitxes o NFT", - "home.activity.empty.description.default": "Quan aproveu, intercanvieu o transferiu fitxes o NFT, les vostres transaccions apareixeran aquí.", - "home.activity.empty.description.external": "Quan aquesta cartera faci transaccions, apareixeran aquí.", - "home.activity.empty.title": "Encara no hi ha activitat", - "home.activity.error.load": "No s'ha pogut carregar l'activitat", - "home.activity.title": "Activitat", - "home.banner.offline": "Esteu en mode fora de línia", - "home.banner.testnetMode": "Esteu en mode testnet", - "home.banner.testnetMode.nav": "Esteu en mode testnet. Desactiva aquesta opció a la configuració.", - "home.empty.cexTransfer": "Transferència", - "home.empty.cexTransfer.description": "Moure fons des d'una plataforma comercial.", - "home.empty.transfer": "Rebre cripto", - "home.empty.transfer.description": "Moure fons d'una altra cartera.", - "home.explore.footer": "Toca aquí per explorar milers de fitxes, NFT i molt més", - "home.explore.title": "Explora fitxes", - "home.extension.error": "S'ha produït un error en carregar els comptes", - "home.label.buy": "Compra", - "home.label.for": "Compra/venda", - "home.label.receive": "Rebre", - "home.label.send": "Enviar", - "home.label.swap": "Canviar", - "home.nfts.title": "NFT", - "home.tokens.empty.action.buy.description": "Compra amb targeta de dèbit o compte bancari.", - "home.tokens.empty.action.buy.title": "Comprar cripto", - "home.tokens.empty.action.import.description": "Introduïu la frase de recuperació d'aquesta cartera per començar a canviar i enviar.", - "home.tokens.empty.action.import.title": "Importa cartera", - "home.tokens.empty.action.receive.description": "Transferència des d'una altra cartera o compte.", - "home.tokens.empty.action.receive.title": "Rebre cripto", - "home.tokens.empty.description": "Quan aquesta cartera compri o rebi fitxes, apareixeran aquí.", - "home.tokens.empty.title": "Encara no hi ha fitxes", - "home.tokens.empty.welcome.description": "Afegiu fons per començar a operar", - "home.tokens.error.fetch": "No s'han pogut obtenir els saldos de testimonis", - "home.tokens.error.load": "No s'han pogut carregar els saldos de testimonis", - "home.tokens.title": "Fitxes", - "home.upsell.receive.cta": "Des d'un compte", - "home.upsell.receive.title": "Rebre cripto", - "home.warning.viewOnly": "Aquesta és una cartera de només visualització", - "interface.metatags.description": "Intercanvia criptomonedes a Ethereum, Base, Arbitrum, Polygon, Unichain i més. La plataforma DeFi on confien milions de persones.", - "interface.metatags.title": "Interfície Uniswap", - "landing.api": "API", - "landing.appsOverview": "Creat per a totes les maneres en què canvies", - "landing.blog.description": "Posa't al dia de les darreres notícies de l'empresa, les característiques dels productes i molt més", - "landing.docs.description": "Explora la nostra biblioteca de documents per a desenvolupadors per començar a crear amb Uniswap", - "landing.exploreUniverse": "Explora l'UNIVERS", - "landing.getStarted": "Opera al DEX més gran del món", - "landing.helpCenter.body": "Navegueu per les preguntes freqüents i obteniu ajuda del nostre equip d'assistència amb seu als Estats Units", - "landing.protocolDescription": "Uniswap Labs impulsa alguns dels productes més utilitzats en criptomonedes. Experimenta accés sense permisos, seguretat provada i assistència dedicada.", - "landing.protocolStats": "Estadístiques del protocol Uniswap", - "landing.provideLiquidity.body": "Proporcioneu liquiditat i cobreu comissions mitjançant la interfície Uniswap.", - "landing.provideLiquidity.subtitle": "Mercats Power onchain.", - "landing.socials": "Segueix Uniswap Labs a X, Farcaster, LinkedIn, i TikTok", - "landing.swapBody": "Accedeix a una gran liquiditat, explora tokens, estableix ordres límit i proporciona liquiditat per a milers de tokens a través de cadenes {{amount}} .", - "landing.swapSubtitle": "Intercanvi sense permís.", - "landing.tradingApi": "API de negociació", - "landing.tradingApiBody": "Feu servir la mateixa API que alimenta l'aplicació web i el moneder Uniswap, en què confien els equips líders de tot el món.", - "landing.tradingApiButton": "Integra l'API d'Uniswap", - "landing.tradingApiSubtitle": "DeFi, directament als vostres usuaris.", - "landing.trusted": "milions de persones confiades", - "landing.unichain.body": "Uneix-te a la comunitat que crea Ethereum L2, una plataforma ràpida i descentralitzada que vol ser la llar de DeFi.", - "landing.unichain.button": "Comença a construir", - "landing.unichain.subtitle": "La cadena DeFi.", - "landing.uniswapX.body": "Transaccions sense gas i protecció MEV, sense comissions per swaps fallits.", - "landing.uniswapX.button": "Experimenta UniswapX", - "landing.uniswapX.subtitle": "Intercanvis més intel·ligents, zero fricció.", - "landing.walletBody": "El moneder i l'extensió de criptomonedes d'autocustòdia de confiança amb milions de descàrregues, suport d'humans reals i una qualificació de 4,8 .", - "landing.walletSubtitle": "Intercanvia, emmagatzema, explora.", - "language.afrikaans": "Afrikàans", - "language.arabic": "àrab", - "language.catalan": "català", - "language.chineseSimplified": "Xinès, simplificat", - "language.chineseTraditional": "Xinès, tradicional", - "language.czech": "txec", - "language.danish": "danès", - "language.dutch": "holandès", - "language.english": "Anglès", - "language.finnish": "finès", - "language.french": "francès", - "language.greek": "grec", - "language.hebrew": "hebreu", - "language.hindi": "hindi", - "language.hungarian": "hongarès", - "language.indonesian": "indonesi", - "language.italian": "italià", - "language.japanese": "japonès", - "language.korean": "coreà", - "language.malay": "Malai", - "language.norwegian": "noruec", - "language.polish": "polonès", - "language.portuguese": "portuguès", - "language.romanian": "romanès", - "language.russian": "rus", - "language.serbian": "serbi", - "language.spanishArgentina": "Espanyol (Argentina)", - "language.spanishBelize": "Espanyol (Belize)", - "language.spanishBolivia": "Espanyol (Bolívia)", - "language.spanishChile": "Espanyol (Xile)", - "language.spanishColombia": "Espanyol (Colòmbia)", - "language.spanishCostaRica": "Espanyol (Costa Rica)", - "language.spanishCuba": "Espanyol (Cuba)", - "language.spanishDominicanRepublic": "Espanyol (República Dominicana)", - "language.spanishEcuador": "Espanyol (Equador)", - "language.spanishElSalvador": "Espanyol (El Salvador)", - "language.spanishGuatemala": "Espanyol (Guatemala)", - "language.spanishHonduras": "Espanyol (Hondures)", - "language.spanishLatam": "espanyol (Amèrica Llatina)", - "language.spanishMexico": "Espanyol (Mèxic)", - "language.spanishNicaragua": "Espanyol (Nicaragua)", - "language.spanishPanama": "Espanyol (Panamà)", - "language.spanishParaguay": "Espanyol (Paraguai)", - "language.spanishPeru": "Espanyol (Perú)", - "language.spanishPuertoRico": "Espanyol (Puerto Rico)", - "language.spanishSpain": "espanyol (Espanya)", - "language.spanishUruguay": "Espanyol (Uruguai)", - "language.spanishUs": "espanyol (EUA)", - "language.spanishVenezuela": "Espanyol (Veneçuela)", - "language.swahili": "suahili", - "language.swedish": "suec", - "language.turkish": "turc", - "language.ukrainian": "Ucraïnès", - "language.urdu": "Urdú", - "language.vietnamese": "vietnamita", - "large.price.difference": "Gran diferència de preu", - "large.price.difference.tooltip": "Continuar amb aquesta operació comportarà una pèrdua de fons. Aquesta diferència pot ser deguda a grans operacions o a poca liquiditat.", - "limit.open.count_one": "1 límit obert", - "limit.open.count_other": "{{count}} límits oberts", - "limitPrice.buyingAboveMarketPrice.error.description": "El vostre preu límit és un {{percentage}}% superior al de mercat. Ajusteu el vostre preu límit per continuar.", - "limitPrice.buyingAboveMarketPrice.error.title": "Compra {{tokenSymbol}} per sobre del preu de mercat", - "limitPrice.marketPriceNotAvailable.error.description": "No podem calcular el preu de mercat actual. Per evitar enviar una comanda per sota del preu de mercat, comproveu la vostra connexió de xarxa i torneu-ho a provar.", - "limitPrice.marketPriceNotAvailable.error.title": "Preu de mercat no disponible", - "limitPrice.sellingBelowMarketPrice.error.description": "El vostre preu límit és {{percentage}}% inferior al de mercat. Ajusteu el vostre preu límit per continuar.", - "limitPrice.sellingBelowMarketPrice.error.title": "Venda {{tokenSymbol}} per sota del preu de mercat", - "limits.form.disclaimer.mainnet": "Només els tokens de la xarxa principal d'Ethereum estan disponibles per als límits. ", - "limits.form.disclaimer.mainnet.short": "Només les fitxes Mainnet estan disponibles per als límits.", - "limits.form.disclaimer.uniswapx": "És possible que els límits no s'executin exactament quan les fitxes arribin al preu especificat. ", - "limits.learnMore": "Més informació sobre els límits", - "limits.price.input.label": "Quan val 1 ", - "limits.price.label": "Preu límit", - "limits.selectSupportedTokens": "Seleccioneu fitxes compatibles", - "liquidity.hooks": "Enganxa a v4", - "liquidity.hooks.address.input": "Introduïu l'adreça del ganxo", - "liquidity.hooks.address.tooltip": "Adreça del ganxo: {{address}}", - "liquidity.learnMoreLabel": "Obteniu informació sobre l'oferta de liquiditat", - "liquidity.notEnough.label": "No hi ha prou liquiditat per mostrar el valor en USD precís.", - "liquidity.provideOnProtocols": "Aportar liquiditat en diferents protocols", - "liquidityPool.page.title": "Afegiu liquiditat als grups{{version}} a Uniswap", - "liquidityPool.positions.closed.title": "Posicions tancades", - "liquidityPool.positions.loadingMore": "S'estan carregant més posicions...", - "liquidityPool.positions.page.title": "Gestioneu la liquiditat del grup {{quoteSymbol}}/{{baseSymbol}} a Uniswap", - "liquidityPool.positions.page.version.description": "Consulteu les vostres posicions de liquiditat {{version}} actives. Afegeix noves posicions.", - "liquidityPool.positions.page.version.title": "Gestioneu la liquiditat del grup{{version}} a Uniswap", - "migrate.allowed": "Permès", - "migrate.allowLpMigration": "Permet la migració del testimoni LP", - "migrate.connectAccount": "Heu de connectar un compte que sigui propietari d'aquesta posició.", - "migrate.connectWallet": "Connecteu-vos a una cartera per veure la vostra liquiditat V2.", - "migrate.contract": "Contracte de migració Uniswap", - "migrate.firstLP": "Sou el primer proveïdor de liquiditat d'aquest grup Uniswap V3. La vostra liquiditat migrarà al preu actual de {{source}} .", - "migrate.highGasCost": "El vostre cost de transacció serà molt més elevat, ja que inclou el gas per crear la piscina.", - "migrate.invalidRange": "L'interval seleccionat no és vàlid. El preu mínim ha de ser inferior al preu màxim.", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} fitxes LP", - "migrate.migrating": "Migració", - "migrate.missingV2Position": "No veieu cap de les vostres posicions v2? Importa'l.", - "migrate.noV2Liquidity": "No s'ha trobat liquiditat V2.", - "migrate.positionNoFees": "La vostra posició no guanyarà comissions ni s'utilitzarà en transaccions fins que el preu de mercat no es mogui al vostre rang.", - "migrate.priceDifference": "Diferència de preu: ", - "migrate.priceWarning": "Només hauríeu de dipositar liquiditat a Uniswap V3 a un preu que cregueu correcte.
Si el preu sembla incorrecte, podeu fer un intercanvi per moure el preu o esperar que algú altre ho faci.", - "migrate.refund": "Com a mínim {{amtA}} {{symA}} i {{amtB}} {{symB}} es reemborsaran a la vostra cartera a causa de l'interval de preus seleccionat.", - "migrate.selectFeeTier": "Seleccioneu el nivell de tarifa", - "migrate.setRange": "Estableix el rang de preus", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Preu:", - "migrate.v2Description": "Aquesta eina migrarà de manera segura la vostra liquiditat {{source}} a V3. El procés és completament sense confiança gràcies al contracte de migració <0>Uniswap ↗", - "migrate.v2Instruction": "Per a cada grup que es mostra a continuació, feu clic a migra per eliminar la vostra liquiditat d'Uniswap V2 i dipositar-la a Uniswap V3.", - "migrate.v2Title": "Migrar liquiditat V2", - "migrate.v3Price": "V3 {{sym}} Preu:", - "mint.v3.input.invalidPrice.error": "Entrada de preu no vàlida", - "mobileAppPromo.banner.getTheApp.link": "Obteniu l'aplicació Uniswap Wallet", - "mobileAppPromo.banner.title": "Uniswap: cartera Crypto i NFT", - "moonpay.poweredBy": "Fiat onramp impulsat per MoonPay USA LLC", - "nav.createAccount.button": "Crea un compte", - "nav.logIn.button": "Inicieu sessió", - "nav.logInOrConnect.title": "Inicia la sessió o connecta't", - "nav.products.tradingApi": "Integrar el protocol", - "nav.products.unichain": "La cadena DeFi", - "nav.products.uniswapX": "El metaagregador", - "nav.products.wallet": "Intercanvia, emmagatzema, explora", - "nav.signUp.button": "Registra't", - "nav.tabs.createPosition": "Crear posició", - "nav.tabs.viewPositions": "Veure posicions", - "network.lostConnection": "És possible que hàgiu perdut la connexió a la xarxa.", - "network.mightBeDown": "És possible que {{network}} estigui inactiva en aquest moment o que hagis perdut la connexió de xarxa.", - "network.warning": "Avís de xarxa", - "nft.noPools": "Encara no hi ha piscines", - "nft.reportSpam": "Informa com a correu brossa", - "notFound.oops": "Vaja, torna'm a Swap", - "notice.uk": "Aquesta aplicació web es proporciona com una eina perquè els usuaris interactuïn amb el Protocol Uniswap per iniciativa pròpia, sense cap aprovació ni recomanació d'activitats de comerç de criptomoneda. En fer-ho, Uniswap no recomana que els usuaris o usuaris potencials participin en activitats de comerç de criptoactius, i els usuaris o usuaris potencials de l'aplicació web no haurien de considerar que aquesta pàgina web o el seu contingut impliquin cap forma de recomanació, invitació o incentivació per negociar amb criptoactius. .", - "notice.uk.label": "Exempció de responsabilitat del Regne Unit:", - "notification.assetVisibility.hidden": "{{assetName}} amagat", - "notification.assetVisibility.unhidden": "{{assetName}} no amagat", - "notification.buy.network": "Comprant a {{network}}", - "notification.copied.address": "S'ha copiat l'adreça", - "notification.copied.calldata": "S'han copiat les dades de la trucada", - "notification.copied.contractAddress": "S'ha copiat l'adreça del contracte", - "notification.copied.failed": "No s'ha pogut copiar al porta-retalls", - "notification.copied.image": "Imatge copiada", - "notification.copied.linkUrl": "Enllaç copiat", - "notification.copied.nftUrl": "URL NFT copiat", - "notification.copied.poolId": "ID de la piscina copiat", - "notification.copied.tokenUrl": "S'ha copiat l'URL del testimoni", - "notification.copied.transactionId": "S'ha copiat l'identificador de la transacció", - "notification.copied.unitag": "S'ha copiat el nom d'usuari", - "notification.countryChange": "S'ha canviat a {{countryName}}", - "notification.limit.network": "Creant ordre límit a {{network}}", - "notification.lp.network": "Proporcionar liquiditat a {{network}}", - "notification.network.changed": "S'ha canviat a {{network}}", - "notification.passwordChanged": "La contrasenya ha canviat", - "notification.poolFinder.network": "Cerca piscina a {{network}}", - "notification.restore.success": "Cartera restaurada!", - "notification.sell.network": "Venent a {{network}}", - "notification.send.network": "S'està enviant el {{network}}", - "notification.smartWallet.disabled": "Desactivat en 1 xarxa", - "notification.smartWallet.disabled.all": "Cartera intel·ligent desactivada", - "notification.smartWallet.disabled.plural": "Desactivat a les xarxes {{amount}}", - "notification.spam.NFT.failed": "No s'ha pogut informar de NFT. Torna-ho a provar més tard.", - "notification.spam.NFT.successful": "Informat", - "notification.swap.network": "Canvi a {{network}}", - "notification.swap.pending.swap": "Canvi pendent", - "notification.swap.pending.unwrap": "Desembolcall pendent", - "notification.swap.pending.wrap": "Embolcall pendent", - "notification.transaction.approve.canceled": "S'ha cancel·lat {{currencySymbol}} aprovació.", - "notification.transaction.approve.fail": "No s'ha pogut aprovar {{currencySymbol}} per utilitzar-lo amb {{address}}.", - "notification.transaction.approve.success": "{{currencySymbol}} aprovat per utilitzar-lo amb {{address}}.", - "notification.transaction.pending": "Transacció pendent", - "notification.transaction.swap.canceled": "S'ha cancel·lat l'intercanvi {{inputCurrencySymbol}}-{{outputCurrencySymbol}} .", - "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} per a l'intercanvi {{outputCurrencyAmountWithSymbol}} ha caducat.", - "notification.transaction.swap.fail": "No s'ha pogut canviar {{inputCurrencyAmountWithSymbol}} per {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.swap.success": "S'ha canviat {{inputCurrencyAmountWithSymbol}} per {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.transfer.canceled": "S'ha cancel·lat l'enviament de {{tokenNameOrAddress}}", - "notification.transaction.transfer.fail": "No s'ha pogut enviar {{tokenNameOrAddress}} a {{walletNameOrAddress}}", - "notification.transaction.transfer.received": "S'ha rebut {{tokenNameOrAddress}} de {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "S'ha enviat {{tokenNameOrAddress}} a {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "No s'ha pogut realitzar la transacció amb {{addressOrEnsName}}", - "notification.transaction.unknown.fail.short": "La transacció ha fallat", - "notification.transaction.unknown.success.full": "Transaccionat amb {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "Transacció confirmada", - "notification.transaction.unwrap.canceled": "S'ha cancel·lat el {{inputCurrencySymbol}} desembolicat.", - "notification.transaction.unwrap.fail": "No s'ha pogut desenrotllar {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.unwrap.success": "S'ha desembolicat {{inputCurrencyAmountWithSymbol}} i s'ha rebut {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.canceled": "S'ha cancel·lat {{inputCurrencySymbol}} embolcall.", - "notification.transaction.wrap.fail": "No s'ha pogut embolicar {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.success": "S'ha embolicat {{inputCurrencyAmountWithSymbol}} i s'ha rebut {{outputCurrencyAmountWithSymbol}}.", - "notification.transfer.pending": "Enviament pendent", - "notification.walletConnect.confirmed": "Transacció confirmada amb {{dappName}}", - "notification.walletConnect.connected": "Connectat", - "notification.walletConnect.disconnected": "Desconnectat", - "notification.walletConnect.failed": "La transacció ha fallat amb {{dappName}}", - "notification.walletConnect.networkChanged.full": "S'ha canviat a {{networkName}}", - "notification.walletConnect.networkChanged.short": "Xarxes commutades", - "notifications.scantastic.subtitle": "Continueu a l'extensió Uniswap", - "notifications.scantastic.title": "Èxit!", - "onboarding.backup.manual.banner": "Us suggerim escriure això en un paper i guardar-lo en un lloc segur, com una caixa forta.", - "onboarding.backup.manual.displayWarning.description": "Llegiu atentament el següent abans de continuar.", - "onboarding.backup.manual.displayWarning.note.access": "Aquesta frase de recuperació us ofereix accés complet a la vostra cartera i fons", - "onboarding.backup.manual.displayWarning.note.secure": "Mireu això en privat i no ho compartiu amb ningú", - "onboarding.backup.manual.displayWarning.note.storage": "Anoteu-lo i guardeu-lo en un lloc segur", - "onboarding.backup.manual.displayWarning.title": "Algunes coses importants a saber", - "onboarding.backup.manual.error": "Paraula no vàlida o mal escrita", - "onboarding.backup.manual.placeholder": "Paraula secreta", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} completat", - "onboarding.backup.manual.selectedWordPlaceholder": "Seleccioneu la paraula", - "onboarding.backup.manual.subtitle_one": "Quina és la {{count}}primera paraula de la teva frase de recuperació?", - "onboarding.backup.manual.subtitle_two": "Quina és la {{count}}segona paraula de la teva frase de recuperació?", - "onboarding.backup.manual.subtitle_few": "Quina és la {{count}}primera paraula de la teva frase de recuperació?", - "onboarding.backup.manual.subtitle_other": "Quina és la {{count}}a la paraula de la teva frase de recuperació?", - "onboarding.backup.manual.title": "Assegurem-nos que l'heu gravat correctament", - "onboarding.backup.option.badge.quick": "Ràpid", - "onboarding.backup.option.cloud.description": "Feu una còpia de seguretat de la vostra cartera mitjançant {{cloudProviderName}}, protegit per una contrasenya de recuperació.", - "onboarding.backup.option.cloud.title": "Establiu una contrasenya de recuperació", - "onboarding.backup.option.manual.description": "Anota les teves 12 paraules secretes en un paper i emmagatzema'l en un lloc segur.", - "onboarding.backup.option.manual.title": "Escriu la frase de recuperació", - "onboarding.backup.reminder.backupNowButton": "Fes una còpia de seguretat ara", - "onboarding.backup.reminder.remindMeLaterButton": "Recorda'm més tard", - "onboarding.backup.reminder.title": "Fes una còpia de seguretat de la teva cartera", - "onboarding.backup.reminder.warning.description": "Fes una còpia de seguretat de la cartera per poder recuperar els teus actius si mai perds el telèfon o en compres un de nou.", - "onboarding.backup.reminder.warning.fundsLabel": "Fons en risc", - "onboarding.backup.reminder.warning.title": "Podríeu perdre els vostres fons", - "onboarding.backup.speedBump.cloud.description": "Si alguna vegada ho oblideu, no us el podem restablir. Anoteu-lo en un lloc segur o deseu-lo de manera segura en un gestor de contrasenyes.", - "onboarding.backup.speedBump.cloud.disclaimer": "Entenc que Uniswap Labs no pot restablir la meva contrasenya de recuperació.", - "onboarding.backup.speedBump.cloud.title": "És important desar aquesta contrasenya", - "onboarding.backup.speedBump.manual.description": "Assegureu-vos que heu escrit la vostra frase de recuperació correctament i que tingueu un lloc segur per guardar-la.", - "onboarding.backup.speedBump.manual.disclaimer": "Entenc que Uniswap Labs no pot recuperar la meva cartera si la perdo.", - "onboarding.backup.speedBump.manual.title": "Abans d'acabar...", - "onboarding.backup.subtitle": "Així és com recuperareu la vostra cartera si suprimiu l'aplicació o perds el dispositiu.", - "onboarding.backup.title.existing": "Fes una còpia de seguretat de la teva cartera", - "onboarding.backup.title.new": "Trieu el vostre mètode de còpia de seguretat", - "onboarding.backup.view.subtitle.message1": "Llegiu atentament el següent abans de continuar", - "onboarding.backup.view.subtitle.message2": "Haureu d'introduir les 12 paraules secretes per recuperar la vostra cartera.", - "onboarding.backup.view.title": "Escriu la teva frase de recuperació", - "onboarding.backup.view.warning.message1": "Aquesta frase de recuperació us ofereix accés complet a la vostra cartera i fons", - "onboarding.backup.view.warning.message2": "Anoteu-lo i guardeu-lo en un lloc segur", - "onboarding.backup.view.warning.message3": "Mireu això en privat i no ho compartiu amb ningú", - "onboarding.cloud.confirm.description": "Haureu d'introduir-lo per recuperar els vostres fons. Si mai l'oblides, no us el podrem recuperar.", - "onboarding.cloud.confirm.title": "Confirmeu la vostra contrasenya de recuperació", - "onboarding.cloud.createPassword.description": "Haureu d'introduir-lo per recuperar els vostres fons. Si mai l'oblides, no us el podrem recuperar.", - "onboarding.cloud.createPassword.title": "Creeu la vostra contrasenya de recuperació", - "onboarding.complete.button": "Obriu l'extensió Uniswap", - "onboarding.complete.description": "La vostra cartera està preparada per enviar i rebre cripto. Obriu l'extensió Uniswap amb la drecera següent.", - "onboarding.complete.go_to_uniswap": "Aneu a l'aplicació web Uniswap", - "onboarding.complete.pin.description": "Feu clic a la icona del pin per afegir l'extensió Uniswap a la vostra barra d'eines.", - "onboarding.complete.pin.title": "Fixeu l'extensió Uniswap", - "onboarding.complete.title": "Estàs tot a punt", - "onboarding.extension.biometrics.subtitle.fingerprint": "Accedeix a la teva cartera de manera ràpida i segura només amb la teva empremta digital.", - "onboarding.extension.biometrics.title": "Activa {{biometricsMethod}}", - "onboarding.extension.password.subtitle": "Ho necessitareu per desbloquejar la vostra cartera i accedir a la vostra frase de recuperació", - "onboarding.extension.password.title.default": "Crea una contrasenya", - "onboarding.extension.password.title.reset": "Restablir la contrasenya", - "onboarding.extension.unsupported.android.description": "L'extensió Uniswap només és compatible amb Chrome a l'escriptori.", - "onboarding.extension.unsupported.android.title": "Chrome al mòbil no és compatible (encara)", - "onboarding.extension.unsupported.description": "L'extensió Uniswap només és compatible amb Chrome ara mateix.", - "onboarding.extension.unsupported.title": "Aquest navegador no és compatible (encara)", - "onboarding.home.intro.backup.description.extension": "Desa la frase de recuperació per assegurar-te que no perdràs mai l'accés al teu moneder.", - "onboarding.home.intro.backup.description.mobile": "Estableix un pla de recuperació si mai perds el telèfon o en compres un de nou.", - "onboarding.home.intro.backup.title": "Fes una còpia de seguretat de la teva cartera", - "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK i JUP, ara disponibles a Unichain", - "onboarding.home.intro.bridgedAssets.title": "Intercanvia nous tokens a Unichain", - "onboarding.home.intro.fund.description": "Finança la teva cartera comprant cripto o transferint des d'un altre compte.", - "onboarding.home.intro.fund.title": "Aconsegueix el teu primer testimoni", - "onboarding.home.intro.label.required": "Obligatori", - "onboarding.home.intro.label.swipe": "Llisca", - "onboarding.home.intro.pushNotifications.description": "Obteniu alertes de preus sobre les vostres fitxes preferides, tendències del mercat i molt més.", - "onboarding.home.intro.pushNotifications.title": "Estigueu al corrent", - "onboarding.home.intro.unitag.description": "Creeu un perfil web3 personalitzat i compartiu fàcilment la vostra adreça amb els amics.", - "onboarding.home.intro.unitag.title": "Reclameu el vostre nom d'usuari {{unitagDomain}}", - "onboarding.import.error.invalidWords_one": "1 paraula no és vàlida o està mal escrita", - "onboarding.import.error.invalidWords_other": "Les paraules {{count}} no són vàlides o estan mal escrites", - "onboarding.import.method.restore.message.android": "Afegiu carteres de les quals hàgiu creat una còpia de seguretat al vostre compte de Google Drive.", - "onboarding.import.method.restore.message.ios": "Afegiu carteres de les quals hàgiu creat una còpia de seguretat al vostre compte d'iCloud.", - "onboarding.import.method.restore.title": "Restaura una cartera", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.android": "Introdueix la contrasenya de recuperació per restaurar el moneder mitjançant la còpia de seguretat de Google Drive.", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.ios": "Introdueix la contrasenya de recuperació per restaurar el moneder mitjançant una còpia de seguretat de l'iCloud.", - "onboarding.import.method.restoreSeedPhrase.cloud.title.android": "Restaura des de Google Drive", - "onboarding.import.method.restoreSeedPhrase.cloud.title.ios": "Restaura des d'iCloud", - "onboarding.import.method.restoreSeedPhrase.title": "Selecciona com restaurar la teva cartera", - "onboarding.import.method.restoreSeedPhrase.wallet.desc": "Introdueix les 12 paraules secretes que has guardat prèviament en un lloc segur.", - "onboarding.import.method.restoreSeedPhrase.wallet.title": "Introduïu la frase de recuperació", - "onboarding.import.method.viewPrivateKeys.button.desc": "Veure la teva clau privada", - "onboarding.import.method.viewPrivateKeys.title": "No tens cap dels anteriors? ", - "onboarding.import.onDeviceRecovery.other_options": "Creeu o importeu una cartera diferent", - "onboarding.import.onDeviceRecovery.other_options.label": "No vols res de les anteriors?", - "onboarding.import.onDeviceRecovery.subtitle": "Trieu a quina cartera voleu tornar a iniciar la sessió.", - "onboarding.import.onDeviceRecovery.title": "Benvingut de nou a Uniswap", - "onboarding.import.onDeviceRecovery.wallet.button": "Visualitza la frase de recuperació", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 cartera més", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} altres carteres", - "onboarding.import.onDeviceRecovery.warning.caption": "Assegureu-vos d'haver fet una còpia de seguretat de totes les altres carteres. Si mai voleu restaurar-los, necessitareu les seves frases de recuperació o les còpies de seguretat {{cloudProvider}} corresponents.", - "onboarding.import.onDeviceRecovery.warning.title": "Estàs segur?", - "onboarding.import.selectMethod.errorMessage": "S'ha produït un error inesperat. Si us plau, torna-ho a provar.", - "onboarding.import.selectMethod.mobileApp.subtitle": "Importa una cartera des de l'aplicació mòbil mitjançant un codi QR.", - "onboarding.import.selectMethod.mobileApp.title": "Utilitzeu Uniswap Mobile", - "onboarding.import.selectMethod.passkey.subtitle": "Sincronitza la teva cartera Uniswap amb una clau d'accés existent.", - "onboarding.import.selectMethod.passkey.title": "Inicia la sessió amb la clau d'accés", - "onboarding.import.selectMethod.recoveryPhrase.subtitle": "Importa des d'una altra cartera criptogràfica.", - "onboarding.import.selectMethod.recoveryPhrase.title": "Introduïu la frase de recuperació", - "onboarding.import.selectMethod.title": "Inicia la sessió o importa una cartera", - "onboarding.import.title": "Trieu com voleu afegir la vostra cartera", - "onboarding.importMnemonic.button.default": "La meva frase de recuperació té 12 paraules", - "onboarding.importMnemonic.button.importing": "S'està important...", - "onboarding.importMnemonic.button.longPhrase": "La meva frase de recuperació és més llarga", - "onboarding.importMnemonic.error.invalidPhrase": "La frase que has introduït no és vàlida", - "onboarding.importMnemonic.subtitle": "Escriviu o enganxeu la vostra frase de recuperació de 12 paraules", - "onboarding.importMnemonic.title": "Introduïu la vostra frase de recuperació", - "onboarding.importPasskey.bringWindowToFront": "Porta la finestra al davant", - "onboarding.importPasskey.continueInSecureWindow": "Continueu a la finestra d'inici de sessió segura.", - "onboarding.intro.button.alreadyHave": "Ja tinc cartera", - "onboarding.intro.button.logInOrImport": "Inicia la sessió o importa", - "onboarding.intro.mobileScan.button": "Escaneja el codi QR per importar", - "onboarding.intro.mobileScan.title": "Tens l'aplicació Uniswap?", - "onboarding.landing.button.add": "Afegiu una cartera existent", - "onboarding.landing.button.create": "Crea una cartera", - "onboarding.landing.button.createAccount": "Creeu un compte", - "onboarding.name.choose": "Trieu un nom d'usuari", - "onboarding.name.choose.subtitle": "Aquest és un nom públic que qualsevol pot utilitzar per enviar-vos cripto.", - "onboarding.notification.permission.message": "Per rebre notificacions, activeu les notificacions per a Uniswap Wallet a la configuració del vostre dispositiu.", - "onboarding.notification.permission.title": "Permís de notificacions", - "onboarding.notification.subtitle": "Manteniu-vos actualitzat sobre l'estat de les transaccions i els canvis importants de preu dels fitxes preferits.", - "onboarding.notification.title": "Activa les notificacions", - "onboarding.passkey.create": "Crea la teva clau d'accés", - "onboarding.passkey.loading.subtitle": "Això hauria de trigar només un segon.", - "onboarding.passkey.loading.title": "Trobar la teva cartera...", - "onboarding.passkey.secure": "Assegureu el vostre compte", - "onboarding.passkey.secure.description": "Les claus d'accés us permeten accedir de manera ràpida i segura al vostre compte només amb la vostra cara o empremta digital.", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "Confirmem que ho has encertat. Si ho perdeu o anoteu de manera incorrecta, no podreu recuperar els vostres fons.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "Si ho perdeu o anoteu de manera incorrecta, no podreu recuperar els vostres fons.", - "onboarding.recoveryPhrase.confirm.title": "Confirmem que ho has encertat", - "onboarding.recoveryPhrase.view.subtitle": "Haureu d'introduir les 12 paraules secretes per recuperar la vostra cartera.", - "onboarding.recoveryPhrase.view.title": "Escriu la teva frase de recuperació", - "onboarding.recoveryPhrase.view.title.hasPassword": "Si mai oblides la teva contrasenya...", - "onboarding.recoveryPhrase.warning.final.button": "estic preparat", - "onboarding.recoveryPhrase.warning.final.message": "La vostra frase de recuperació és la que us permet (i qualsevol que la tingui) accés als vostres fons. Assegureu-vos de guardar-ho per a vosaltres mateixos.", - "onboarding.recoveryPhrase.warning.final.title": "Fes aquest pas en un lloc privat", - "onboarding.recoveryPhrase.warning.screenshot.message": "Qualsevol persona que tingui accés a les teves fotos pot accedir a la teva cartera. Us recomanem que anoteu les vostres paraules.", - "onboarding.recoveryPhrase.warning.screenshot.title": "Les captures de pantalla no són segures", - "onboarding.resetPassword.complete.safety": "Obteniu més informació sobre la seguretat de la cartera", - "onboarding.resetPassword.complete.subtitle": "Utilitzeu la vostra nova contrasenya per desbloquejar la vostra cartera.", - "onboarding.resetPassword.complete.title": "Restableix la contrasenya", - "onboarding.scan.error": "S'ha produït un error en carregar el codi QR", - "onboarding.scan.otp.error": "El codi que heu enviat és incorrecte o s'ha produït un error en enviar-lo. Siusplau torna-ho a provar.", - "onboarding.scan.otp.failed": "Intents fallits: {{number}}", - "onboarding.scan.otp.subtitle": "Comproveu la vostra aplicació mòbil Uniswap per obtenir el codi de 6 caràcters", - "onboarding.scan.otp.title": "Introduïu el codi únic", - "onboarding.scan.subtitle": "Escaneja el codi QR amb l'aplicació mòbil Uniswap per començar a importar la teva cartera.", - "onboarding.scan.title": "Importa la cartera des de l'aplicació", - "onboarding.scan.troubleScanning.message": "Importa mitjançant frase de recuperació", - "onboarding.scan.troubleScanning.title": "Problemes per escanejar?", - "onboarding.scan.wifi": "Connecta el teu telèfon a la mateixa xarxa WiFi que l'ordinador.", - "onboarding.security.alert.biometrics.message.android": "Per utilitzar la biometria, primer configura-la a la configuració", - "onboarding.security.alert.biometrics.message.ios": "Per utilitzar {{biometricsMethod}}, permet l'accés a la configuració del sistema", - "onboarding.security.alert.biometrics.title.android": "La biometria està desactivada", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} està desactivat", - "onboarding.security.button.confirm.android": "Activa la biometria", - "onboarding.security.button.confirm.ios": "Activa {{biometricsMethod}}", - "onboarding.security.button.setup": "Configurar", - "onboarding.security.subtitle.android": "Afegiu una capa addicional de seguretat requerint la biometria per enviar transaccions.", - "onboarding.security.subtitle.ios": "Afegiu una capa addicional de seguretat requerint {{biometricsMethod}} per enviar transaccions.", - "onboarding.security.title": "Protegeix la teva cartera", - "onboarding.selectWallets.error": "No s'han pogut carregar les adreces", - "onboarding.selectWallets.title.default": "Trieu carteres per importar", - "onboarding.selectWallets.title.error": "S'ha produït un error en importar carteres", - "onboarding.termsOfService": "En continuar, accepto les Condicions del servei i accepto la Política de privadesa", - "onboarding.tooltip.recoveryPhrase.trigger": "Què és una frase de recuperació?", - "onboarding.wallet.continue": "Mantem-ho segur", - "onboarding.wallet.defaultName": "Cartera {{number}}", - "onboarding.wallet.description.full": "Aquest és el vostre espai personal per a fitxes, NFT i totes les vostres operacions. Acabeu de configurar-lo per mantenir els vostres fons segurs.", - "onboarding.wallet.title": "Benvingut a la teva nova cartera", - "onboarding.welcome.subtitle": "Acabem de configurar la teva cartera.", - "onboarding.welcome.title": "Benvingut!", - "outageBanner.message": "Les dades de {{chainName}}{{versionDescription}} no estan disponibles ara mateix, però esperem que el problema es resolgui aviat.", - "outageBanner.message.sub": "Encara podeu intercanviar i proporcionar liquiditat en aquesta cadena sense problemes.", - "outageBanner.title": "{{versionName}} tornarà aviat", - "passkeys.help.modal.subtitle": "Si teniu problemes amb les claus de contrasenya, visiteu l'assistència d'Uniswap per obtenir ajuda.", - "passkeys.help.modal.subtitle.invalidPasskey": "La vostra sol·licitud no s'ha pogut completar. Si us plau, torna-ho a provar utilitzant una contrasenya associada amb ", - "passkeys.help.modal.subtitle.technicalError": "La vostra sol·licitud no s'ha pogut completar a causa d'un error tècnic inesperat. Els teus fons estan segurs. Si us plau, torna-ho a provar.", - "passkeys.help.modal.title": "Necessitar ajuda?", - "passkeys.help.modal.title.invalidPasskey": "Clau d'accés no vàlida", - "passkeys.help.modal.title.technicalError": "Error tècnic", - "passkeys.manage.modal.subtitle": "Per afegir o eliminar contrasenyes, inicieu la sessió a {{passkeyManagementUrl}}.", - "passkeys.manage.modal.title": "Gestioneu les claus de pas", - "permit.approval.fail": "L'aprovació del permís ha fallat", - "permit.approval.fail.message": "Permit2 permet compartir i gestionar les aprovacions de testimonis entre diferents aplicacions.", - "pool.activeRange": "Interval de tick actiu", - "pool.addAs": "Afegeix com a {{nativeWrappedSymbol}}", - "pool.apr": "APR", - "pool.apr.base": "TAE base", - "pool.apr.description": "Anualitzat en funció de les tarifes d'1 dia", - "pool.apr.reward": "Recompensa TAE", - "pool.aprText": "APR de la piscina", - "pool.balances": "Balanços de piscina", - "pool.closedCTA.description": "Podeu veure'ls utilitzant el filtre de la part superior de la pàgina.", - "pool.closedCTA.title": "Busques les teves posicions tancades?", - "pool.collectAs": "Recolliu com a {{nativeWrappedSymbol}}", - "pool.collectFees": "Recaptar quotes", - "pool.connectEthereumToView": "Connecta una cartera Ethereum per veure les teves reserves", - "pool.create": "Creació de piscina nova", - "pool.create.info": "Les vostres seleccions crearan un nou conjunt de liquiditat que pot provocar una liquiditat inicial més baixa i una major volatilitat. Penseu en afegir-hi una piscina existent per minimitzar aquests riscos.", - "pool.createdPosition": "Posició creada", - "pool.createdPosition.canceled": "Creació de posició cancel·lada", - "pool.createdPosition.failed": "No s'ha pogut crear la posició", - "pool.dynamic": "Piscina dinàmica", - "pool.earnings": "Guanys", - "pool.earnings.empty": "Encara no tens guanys", - "pool.explorers": "Exploradors", - "pool.import": "Grup d'importació", - "pool.import.link.description": "Algunes posicions v2 no es mostren automàticament.", - "pool.import.positions.v2": "Importa posicions V2", - "pool.import.positions.v2.selectPair.description": "Algunes posicions v2 no es mostren automàticament. Seleccioneu un parell de fitxes per importar i veure les vostres posicions.", - "pool.import.success": "S'ha importat la piscina", - "pool.incentives.administeredRewards": "Les recompenses es distribueixen mitjançant el contracte de distribuïdor autònom de Merkl.", - "pool.incentives.collect": "Recull", - "pool.incentives.collectedRewards": "Recompenses recollides", - "pool.incentives.collectFailed": "S'ha produït un error en la recollida, si us plau, torna-ho a provar.", - "pool.incentives.collectFailedNoRetry": "No s'ha pogut recollir les recompenses.", - "pool.incentives.collectingRewards": "Recollida de recompenses", - "pool.incentives.collectRewards": "Recull recompenses", - "pool.incentives.collectRewardsCanceled": "Recollida de recompenses cancel·lada", - "pool.incentives.daysLeft": "queden dies", - "pool.incentives.eligible": "Els grups elegibles tenen recompenses fitxes perquè pugueu guanyar més", - "pool.incentives.merklDocs": "Calculat per Merkl a partir de les recompenses d'emissions i el grup TVL.", - "pool.incentives.rewardsDistribution": "Distribució de recompenses", - "pool.incentives.rewardsEarned": "Recompenses guanyades", - "pool.incentives.similarPoolHasRewards": "Un grup similar té recompenses UNI", - "pool.incentives.switchPools": "Canvia de piscines", - "pool.incentives.timePeriod": "Període de temps", - "pool.incentives.uni.findMore": "Trobeu piscines amb recompenses UNI", - "pool.incentives.yourRewards.error": "Les teves recompenses no estan disponibles en aquest moment", - "pool.incentives.yourRewards.error.description": "No s'han pogut recuperar les recompenses. Això pot ser degut a un problema de xarxa. Prova de tornar a carregar la pàgina.", - "pool.info": "Informació de la piscina", - "pool.limitFluctuation.warning": "Tingueu en compte que l'execució dels límits pot variar segons les fluctuacions del mercat en temps real i la congestió de la xarxa Ethereum. És possible que els límits no s'executin exactament quan les fitxes arribin al preu especificat.", - "pool.liquidity.data.error.message": "S'ha produït un error en obtenir les dades necessàries per a la vostra transacció.", - "pool.liquidity.outOfSync": "Desconcordança de preus del grup i del mercat", - "pool.liquidity.outOfSync.message": "Els preus d'aquest grup difereixen amb els preus de mercat de les fitxes seleccionades. Ajusteu el vostre rang de preus en conseqüència o espereu que el grup es reequilibri per evitar pèrdues.", - "pool.maxPrice": "Preu màxim", - "pool.migrateLiquidity": "Migrar liquiditat", - "pool.migrateLiquidityDisabledTooltip": "Aquesta cadena no admet grups de liquiditat v4.", - "pool.migrateToV4": "Migrar a la v4", - "pool.minPrice": "Preu mínim", - "pool.newPosition.plus": "+ Nova posició", - "pool.newPosition.title": "Nova posició", - "pool.newSpecificPosition": "Nova posició {{symbol}}", - "pool.notAvailableOnSolana": "No hi ha piscines disponibles a Solana.", - "pool.notFound.description": "Ho sentim, no podem trobar cap informació sobre aquesta piscina. Comproveu el nom i l'adreça i torneu-ho a provar.", - "pool.notFound.title": "No s'ha trobat la piscina", - "pool.openToStart.evmAndSolanaConnected": "Obre una nova posició o crea un grup per començar. Els grups no estan disponibles a Solana.", - "pool.openToStart.evmOnly": "Obre una posició nova o crea un grup per començar.", - "pool.percent": "{{pct}}% piscina", - "pool.pooled": "Agrupat {{sym}}:", - "pool.position": "Posició", - "pool.positions": "Posicions", - "pool.positions.title": "Les teves posicions", - "pool.positions.transaction.settings": "Configuració de la transacció", - "pool.positions.usdValueUnavailable": "El valor en USD no està disponible", - "pool.positions.usdValueUnavailable.tooltip": "El valor en USD no està disponible actualment per a aquesta posició. Consulteu els detalls de la posició per a les quantitats de testimoni dipositats.", - "pool.refresh.prices": "Actualitzar preus", - "pool.removeLiquidity": "Eliminar liquiditat", - "pool.rewardAPR": "TAE de recompensa (UNI)", - "pool.rewardAPR.percent": "{{pct}} recompensa TAE", - "pool.rewards": "Recompenses", - "pool.rewardsPool.label": "Fitxes del grup de recompenses:", - "pool.selectPair": "Seleccioneu parell", - "pool.share.label": "Comparteix la teva piscina:", - "pool.specificPosition": "posició {{symbol}}", - "pool.tokenPair": "Parell de fitxes", - "pool.top.rewards": "Piscines amb recompenses", - "pool.top.tvl": "Les millors piscines de TVL", - "pool.top.volume": "Piscines per volum de 24 hores", - "pool.totalAPR": "TAE total", - "pool.totalTokens": "El total de fitxes del grup:", - "pool.v2": "piscines v2", - "pool.v3": "piscines v3", - "pool.via": "{{tokenPair}} via {{dex}}", - "pool.volOverTvl": "1D vol/TVL", - "pool.volume.thirtyDay": "volum de 30 dies", - "pool.volume.thirtyDay.short": "30D vol", - "pool.withdrawAs": "Retira't com a {{nativeWrappedSymbol}}", - "poolFinder.availablePools": "Piscines disponibles", - "poolFinder.availablePools.found.description": "grups v2 que coincideixen amb la vostra selecció de parella.", - "poolFinder.availablePools.notFound.description": "No s'han trobat grups v2 coincidents. Comproveu la vostra selecció de testimoni i assegureu-vos que esteu connectat a la cartera correcta.", - "pools.explore": "Explora les piscines", - "portfolio.activity.filters.timePeriod.all": "Tot el temps", - "portfolio.activity.filters.transactionType.all": "Tots els tipus", - "portfolio.activity.filters.transactionType.deposits": "Dipòsits", - "portfolio.activity.filters.transactionType.staking": "Apostar", - "portfolio.activity.filters.transactionType.swaps": "Intercanvis", - "portfolio.activity.title": "Activitat", - "portfolio.connectWallet.summary": "Fes un seguiment de fitxes, grups i més a través de {{amount}}+ xarxes", - "portfolio.defi.title": "DeFi", - "portfolio.description": "Fes un seguiment de la teva cartera de criptomonedes a través de totes les cadenes i protocols", - "portfolio.nfts.title": "NFT", - "portfolio.overview.title": "Visió general", - "portfolio.title": "Cartera", - "portfolio.tokens.table.column.allocation": "Assignació", - "portfolio.tokens.table.column.balance": "Balanç", - "portfolio.tokens.table.column.change1d": "Canvi 1D", - "portfolio.tokens.table.column.price": "Preu", - "portfolio.tokens.table.column.token": "testimoni", - "portfolio.tokens.table.column.value": "Valor", - "portfolio.tokens.title": "Fitxes", - "position.addHook": "Afegiu un ganxo", - "position.addHook.tooltip": "Els ganxos són una funció avançada que permet als grups interactuar amb contractes intel·ligents, desbloquejant diverses capacitats. Aneu amb compte quan afegiu ganxos, ja que alguns poden ser maliciosos o causar conseqüències no desitjades.", - "position.addingHook": "Afegir ganxo", - "position.addingHook.disclaimer": "Afegir ganxos pot tenir conseqüències no desitjades. Feu la vostra recerca i procediu sota el vostre propi risc.", - "position.addingHook.hideProperties": "Amaga propietats", - "position.addingHook.invalidAddress": "Introduïu una adreça de ganxo vàlida", - "position.addingHook.viewProperties": "Veure propietats", - "position.create.confirm": "Confirma la posició", - "position.create.invalidPrice": "Preu no vàlid", - "position.create.invalidRange": "Interval no vàlid", - "position.create.modal.header": "Creació de posició", - "position.create.unsupportedSolana": "Les agrupacions Solana no són compatibles.", - "position.create.unsupportedSolana.description": "Per crear un grup, canvieu a una cadena EVM compatible.", - "position.create.unsupportedToken.description": "Prova de crear amb una versió de protocol diferent.", - "position.create.v2unsupportedChain": "Aquesta cadena no és compatible amb els grups v2.", - "position.currentValue": "Valor de la posició actual", - "position.default_price_strategies": "Estratègies de preus", - "position.default_price_strategies.error": "No es pot establir l'estratègia de preus", - "position.deposit.confirm.create.description.less": "El preu inicial introduït és {{value}}% inferior al preu de mercat i pot provocar una pèrdua de fons. Vols continuar?", - "position.deposit.confirm.create.description.more": "El preu inicial introduït és {{value}}% més que el preu de mercat i pot provocar una pèrdua de fons. Vols continuar?", - "position.deposit.confirm.create.title": "Gran diferència de preu amb el mercat", - "position.deposit.description": "Especifiqueu les quantitats testimonials per a la vostra aportació de liquiditat.", - "position.depositedCurrency": "Dipositat {{currencySymbol}}", - "position.fot.warning": "Uniswap v2 només admet {{token}} i altres fitxes de \"Comissió per transferència\".", - "position.fot.warning.cta": "Creeu una posició v2", - "position.hook.disclaimer": "Entenc els riscos potencials que comporta afegir aquest ganxo.", - "position.hook.donateWarning": "Aquesta bandera pot comportar canvis en les tarifes obtingudes.", - "position.hook.liquidityWarning": "Aquesta bandera pot fer que el grup bloquegi l'addició de nova liquiditat. La vostra transacció es pot revertir.", - "position.hook.removeWarning": "Pot fer que els vostres fons es bloquegin o que us impedeixin cobrar comissions.", - "position.hook.swapWarning": "Aquesta bandera pot permetre als proveïdors de liquiditat aprofitar més fàcilment la liquiditat just a temps, la qual cosa pot comportar menys comissions guanyades.", - "position.hook.warningHeader": "Important: riscos d'enganxament identificats", - "position.hook.warningInfo": "Hem identificat riscos potencials amb aquest ganxo. Si us plau, assegureu-vos d'entendre com funciona aquest ganxo abans de decidir continuar.", - "position.increase.fot": "No s'admet afegir liquiditat per a {{token}} i altres fitxes de \"Comissió per transferència\".", - "position.initialPrice": "Preu inicial", - "position.initialPrice.difference.negative": "{{ value }}% menys que el preu de mercat", - "position.initialPrice.difference.positive": "{{ value }}% més que el preu de mercat", - "position.initialPrice.info": "Quan creeu un grup nou, heu d'establir el tipus de canvi inicial per a ambdues fitxes. Aquesta taxa reflectirà el preu inicial de mercat.", - "position.initialPrice.set": "Estableix el preu inicial", - "position.initialPrice.useMarketPrice": "Utilitzeu el preu de mercat", - "position.migrate.liquidity": "Quan migreu posicions, no podeu canviar el vostre parell de fitxes, però podeu afegir un ganxo per millorar la funcionalitat.", - "position.migrate.v4unsupportedChain": "Aquesta cadena no és compatible amb les agrupacions v4.", - "position.new": "Nova posició", - "position.new.protocol": "Nova posició {{protocol}}", - "position.notFound": "No s'ha trobat la posició", - "position.notFound.description": "Els detalls sobre aquesta posició no estan disponibles. Comproveu que esteu connectat amb la cartera correcta.", - "position.one_sided_lower": "Inferior unilateral", - "position.one_sided_lower.description": "Liquiditat de subministrament si el preu baixa", - "position.one_sided_upper": "Part superior d'una sola cara", - "position.one_sided_upper.description": "Liquiditat de subministrament si el preu puja", - "position.protocol": "{{protocol}} posició", - "position.provide.liquidity": "Trieu els fitxes als quals voleu proporcionar liquiditat. Podeu seleccionar fitxes a totes les xarxes admeses.", - "position.provide.liquidityDescription": "Proporcionar liquiditat de gamma completa garanteix una participació contínua del mercat a tots els preus possibles, oferint simplicitat però amb potencial per a pèrdues impermanents més altes.", - "position.provide.liquidityDescription.creatingPool": "L'establiment d'una liquiditat de gamma completa en crear un grup garanteix una participació contínua del mercat a tots els preus possibles, oferint simplicitat però amb un potencial de pèrdua impermanent més gran.", - "position.provide.liquidityDescription.custom": "El rang personalitzat us permet concentrar la vostra liquiditat dins de límits de preus específics, millorant l'eficiència del capital i els guanys de comissions, però requerint una gestió més activa.", - "position.provide.outOfRange.closePosition": "Posició tancada", - "position.provide.outOfRange.description": "L'interval d'aquesta posició no es pot ajustar durant la migració. Per establir un interval nou, tanqueu aquesta posició i obriu una nova posició v4.", - "position.provide.outOfRange.title": "Esteu migrant una posició fora de l'abast", - "position.removeHook": "Traieu el ganxo", - "position.resetDescription": "Les vostres seleccions de fitxes, preu i rang es restabliran.", - "position.setRange": "Estableix el rang de preus", - "position.setRange.inputsBelow": "Utilitzeu les entrades següents per definir el vostre rang.", - "position.stable": "Estable", - "position.stable.description": "Bo per a stablecoins o parells de baixa volatilitat", - "position.step.deposit": "Introduïu els imports dels dipòsits", - "position.step.price": "Establiu el preu inicial i els imports dels dipòsits", - "position.step.range": "Estableix el rang de preus i els imports dels dipòsits", - "position.step.select": "Seleccioneu parell de fitxes i tarifes", - "position.value": "Valor de posició", - "position.valueUnavailable": "El valor en USD no està disponible actualment per a aquesta posició. Consulteu els detalls de la posició per a les quantitats de testimoni dipositats.", - "position.wide": "Ampla", - "position.wide.description": "Bo per a parells volàtils", - "position.wrapped.unwrap": "Desembolica {{wrappedToken}}", - "position.wrapped.warning": "{{nativeToken}} necessari per a les agrupacions v4", - "position.wrapped.warning.info": "Desembolica el teu {{wrappedToken}} i diposita el {{nativeToken}} per proporcionar una liquiditat més rendible i eficient.", - "positions.noPositions.description": "No tens cap posició de liquiditat. Crea una nova posició per començar a guanyar comissions i recompenses en fons elegibles.", - "positions.noPositions.title": "Sense posicions", - "positions.welcome.connect.description": "Per veure les teves posicions i recompenses has de connectar el teu moneder.", - "positions.welcome.connect.wallet": "Connecta la teva cartera", - "privacy.anonymizedLogs": "L'aplicació registra estadístiques d'ús anònimes per tal de millorar amb el temps.", - "privacy.autoRouter": "L'aplicació obté la ruta comercial òptima des d'un servidor d'Uniswap Labs.", - "privacy.infura": "L'aplicació obté dades a la cadena i crea trucades de contracte amb una API Infura.", - "privacy.thirdPartyApis": "Aquesta aplicació utilitza les següents API de tercers:", - "privacy.trm": "L'aplicació recopila de forma segura l'adreça de la cartera i la comparteix amb TRM Labs Inc. per motius de risc i de compliment.", - "privacy.uniswaptos": "Condicions del servei d'Uniswap Labs", - "privateKeys.export.modal.speedbump.bullet1": "Veure això en privat", - "privateKeys.export.modal.speedbump.bullet2": "No compartiu amb ningú", - "privateKeys.export.modal.speedbump.bullet3": "No l'introduïu mai a cap lloc web o aplicació", - "privateKeys.export.modal.speedbump.subtitle": "Qualsevol persona que conegui la teva clau privada pot accedir a la teva cartera i als teus fons.", - "privateKeys.export.modal.speedbump.title": "Abans de continuar", - "privateKeys.export.modal.subtitle": "Sembla que no pots restaurar completament el teu moneder. Per assegurar-te que no perds mai l'accés als teus fons, copia la teva clau privada.", - "privateKeys.export.modal.title": "Exporta la teva clau privada", - "privateKeys.export.modal.warning": "Si perds el telèfon o suprimeixes l'aplicació, hauràs d'importar aquesta clau a una altra cartera.", - "privateKeys.view.button.continue": "Els vaig copiar tots.", - "privateKeys.view.button.continue.single": "Ho vaig copiar.", - "privateKeys.view.subtitle": "La teva clau privada et dóna accés a una cartera específica. Cada cartera té una clau privada diferent.", - "privateKeys.view.title": "Clau privada", - "qrScanner.button.connections_one": "1 aplicació connectada", - "qrScanner.button.connections_other": "{{count}} aplicacions connectades", - "qrScanner.error.camera.message": "Per escanejar un codi, permet l'accés a la càmera a la configuració del sistema", - "qrScanner.error.camera.title": "La càmera està desactivada", - "qrScanner.error.none": "No s'ha trobat cap codi QR", - "qrScanner.recipient.action.scan": "Escaneja un codi QR", - "qrScanner.recipient.action.show": "Mostra el meu codi QR", - "qrScanner.recipient.error.message": "Assegureu-vos que esteu escanejant un codi QR d'adreça d'Ethereum vàlid abans de tornar-ho a provar.", - "qrScanner.recipient.error.title": "Codi QR no vàlid", - "qrScanner.request.message.unavailable": "No s'ha trobat cap missatge.", - "qrScanner.request.method.default": "Sol·licitud des de {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "Sol·licitud de signatura de {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "Sol·licitud de transacció de {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "Permetre que {{dappName}} utilitzi fins a {{amount}} {{currencySymbol}}?", - "qrScanner.request.withoutAmount": "Permetre que {{dappName}} utilitzi el vostre {{currencySymbol}}?", - "qrScanner.status.connecting": "Connectant...", - "qrScanner.status.loading": "Carregant...", - "qrScanner.title": "Escaneja un codi QR", - "qrScanner.wallet.networks": "Xarxes compatibles", - "range.outOfView": "Gamma fora de vista", - "removeLiquidity.pooled": "Agrupat {{symbol}}:", - "revoke.failed.message": "És probable que un problema de xarxa o de connexió hagi provocat l'error de revocació. Comprova la connexió i torna-ho a provar.", - "routing.aggregateLiquidity": "Quan està disponible, agrega fonts de liquiditat per obtenir millors preus i permutes sense gas.", - "routing.aggregateLiquidity.uniswapx": "UniswapX agrega fonts de liquiditat dins i fora de la cadena, oferint-vos els millors preus disponibles i swaps sense gas.", - "routing.cheapest": "El client d'Uniswap selecciona l'opció comercial més barata tenint en compte el preu i els costos de xarxa.", - "routing.cheapest.v4": "El client Uniswap selecciona l'opció comercial òptima tenint en compte el preu i els costos de la xarxa.", - "scantastic.code.expired": "Caducat", - "scantastic.code.subtitle": "Introduïu aquest codi a l'extensió Uniswap. La vostra frase de recuperació s'encriptarà i es transferirà de manera segura.", - "scantastic.code.timeRemaining.shorthand.hours": "Codi nou en {{hours}}h {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.minutes": "Codi nou en {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.seconds": "Codi nou en {{seconds}}s", - "scantastic.code.title": "Codi d'un sol intercanvi", - "scantastic.confirmation.button.continue": "Sí, continua", - "scantastic.confirmation.label.browser": "Navegador", - "scantastic.confirmation.label.device": "Dispositiu", - "scantastic.confirmation.subtitle": "Continueu només si esteu escanejant un codi QR de l'extensió Uniswap en un dispositiu de confiança.", - "scantastic.confirmation.title": "Estàs provant d'importar la teva cartera?", - "scantastic.confirmation.warning": "Aneu amb compte amb els llocs i les aplicacions que suplantin Uniswap. En cas contrari, la vostra cartera es pot veure compromesa.", - "scantastic.error.encryption": "No s'ha pogut preparar la frase llavor.", - "scantastic.error.noCode": "No s'ha rebut cap OTP. Siusplau torna-ho a provar.", - "scantastic.error.timeout.message": "Torna a escanejar el codi QR de l'extensió Uniswap per continuar sincronitzant la teva cartera.", - "scantastic.error.timeout.title": "S'ha esgotat el temps de connexió", - "scantastic.modal.ipMismatch.description": "Per escanejar aquest codi QR, el telèfon ha d'estar connectat a la mateixa xarxa WiFi que l'ordinador i qualsevol VPN s'hauria d'apagar temporalment.", - "scantastic.modal.ipMismatch.title": "Canvia la teva xarxa WiFi", - "search.input.placeholder": "Cerca fitxes i pools", - "search.ukDisclaimer": "Exempció de responsabilitat per als residents del Regne Unit", - "send.button.review": "Revisió de la transferència", - "send.gas.error.title": "N/A", - "send.gas.networkCost.title": "Cost de la xarxa", - "send.input.token.balance.title": "Balanç: {{balance}} {{symbol}}", - "send.recipient.header": "Seleccioneu el destinatari", - "send.recipient.input.placeholder": "Cerca ENS o adreça", - "send.recipient.previous_one": "1 trasllat anterior", - "send.recipient.previous_other": "{{count}} transferències anteriors", - "send.recipient.results.empty": "Sense resultats", - "send.recipient.results.error": "L'adreça que heu escrit no existeix o està mal escrita.", - "send.recipient.section.favorite": "Carteres preferides", - "send.recipient.section.recent": "Recent", - "send.recipient.section.search": "Resultats de la cerca", - "send.recipient.section.viewOnly": "Carteres de només visualització", - "send.recipient.section.yours": "Les teves carteres", - "send.recipient.warning.viewOnly.message": "Només envieu fons a aquesta cartera si teniu la frase de recuperació o coneixeu el propietari de la cartera.", - "send.recipient.warning.viewOnly.title": "Teniu això com a cartera de només visualització", - "send.recipientSelect.search.empty.message": "Quan envieu fitxes a una adreça de cartera, es mostraran aquí", - "send.recipientSelect.search.empty.title": "No s'han guardat carteres", - "send.review.modal.title": "Estàs enviant", - "send.review.summary.button.title": "Confirmeu l'enviament", - "send.search.empty.subtitle": "L'adreça que heu escrit no existeix o està mal escrita.", - "send.search.empty.title": "Sense resultats", - "send.search.placeholder": "Cerca ENS o adreça", - "send.solanaSendNotSupported": "L'enviament no és compatible amb Solana", - "send.title": "Enviar", - "send.unavailableOnSolana.message": "L'enviament no està disponible als moneders Solana", - "send.warning.blocked.default": "Aquesta cartera està bloquejada", - "send.warning.blocked.modal.message": "Aquesta adreça està bloquejada a Uniswap Wallet perquè està associada a una o més activitats bloquejades. Si creieu que es tracta d'un error, envieu un correu electrònic a compliance@uniswap.org.", - "send.warning.blocked.modal.title": "Adreça bloquejada", - "send.warning.blocked.recipient": "La cartera del destinatari està bloquejada", - "send.warning.erc20.checkbox.description": "Esteu intentant enviar fons a una adreça de testimoni. Això pot provocar una pèrdua permanent de fons.", - "send.warning.erc20.checkbox.heading": "S'ha detectat l'adreça del testimoni", - "send.warning.erc20.message": "Esteu intentant enviar fons a una adreça de testimoni. L'enviament de criptografia a aquest tipus d'adreça pot provocar una pèrdua permanent de fons.", - "send.warning.erc20.title": "Aquesta és una adreça testimonial", - "send.warning.insufficientFunds.message": "El vostre saldo de {{currencySymbol}} ha disminuït des que heu introduït l'import que voleu enviar", - "send.warning.insufficientFunds.title": "No n'hi ha prou {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "No hi ha prou {{currencySymbol}} el {{networkName}} per enviar", - "send.warning.insufficientGas.message.withoutNetwork": "No hi ha prou {{currencySymbol}} per enviar", - "send.warning.modal.button.cta.blocking": "D'acord", - "send.warning.modal.button.cta.cancel": "Cancel · lar", - "send.warning.modal.button.cta.confirm": "Confirmeu", - "send.warning.newAddress.details.ENS": "ENS", - "send.warning.newAddress.details.username": "Nom d'usuari", - "send.warning.newAddress.details.walletAddress": "Adreça de cartera", - "send.warning.newAddress.message": "No heu fet cap transacció amb aquesta adreça abans. Si us plau, confirmeu que l'adreça és correcta abans de continuar.", - "send.warning.newAddress.title": "Nova adreça", - "send.warning.self.message": "Esteu intentant enviar fons a la vostra cartera actual. L'enviament de criptografia a aquesta adreça comportarà costos de xarxa innecessaris.", - "send.warning.self.title": "Aquesta és la teva cartera actual", - "send.warning.smartContract.message": "Esteu a punt d'enviar fons a una adreça de contracte intel·ligent. Assegureu-vos que aquesta és l'adreça correcta i que pot rebre fitxes. Si no, això pot provocar una pèrdua permanent de fons.", - "send.warning.smartContract.title": "Aquesta és una adreça de contracte intel·ligent", - "send.warning.viewOnly.message": "Heu d'importar aquesta cartera mitjançant una frase de recuperació per enviar actius.", - "send.warning.viewOnly.title": "Aquesta cartera és només de visualització", - "send.youAreSending": "Estàs enviant", - "sendRecipientForm.recentAddresses.label": "Recents", - "sendReviewModal.title": "Revisió enviada", - "setting.recoveryPhrase.account.show": "Mostra la frase de recuperació", - "setting.recoveryPhrase.action.hide": "Amaga la frase de recuperació", - "setting.recoveryPhrase.remove": "Elimina la frase de recuperació", - "setting.recoveryPhrase.remove.confirm.subtitle": "Entenc que Uniswap Labs no em pot ajudar a recuperar la meva cartera si no ho he fet.", - "setting.recoveryPhrase.remove.confirm.title": "Vaig guardar la meva frase de recuperació", - "setting.recoveryPhrase.remove.initial.subtitle": "Assegureu-vos que hàgiu desat la frase de recuperació. En cas contrari, perdràs l'accés a les teves carteres", - "setting.recoveryPhrase.remove.initial.title": "Abans de continuar", - "setting.recoveryPhrase.remove.subtitle": "Introduïu la vostra contrasenya per confirmar", - "setting.recoveryPhrase.remove.title": "Esteu eliminant la vostra frase de recuperació ", - "setting.recoveryPhrase.view.warning.message1": "Qualsevol persona que conegui la vostra frase de recuperació pot accedir a la vostra cartera i fons", - "setting.recoveryPhrase.view.warning.message2": "Veure això en privat", - "setting.recoveryPhrase.view.warning.message3": "No compartiu amb ningú", - "setting.recoveryPhrase.view.warning.message4": "No l'introduïu mai a cap lloc web o aplicació", - "setting.recoveryPhrase.view.warning.title": "Abans de continuar", - "setting.recoveryPhrase.warning.view.message": "Qualsevol persona que conegui la vostra frase de recuperació pot accedir a la vostra cartera i fons.", - "setting.recoveryPhrase.warning.view.title": "Veure això en un lloc privat", - "settings.action.enableInSettings": "Activa a Configuració", - "settings.action.feedback": "Enviar comentaris", - "settings.action.help": "Aconseguir ajuda", - "settings.action.lock": "Bloqueja la cartera", - "settings.action.privacy": "Política de privacitat", - "settings.action.terms": "Termes del servei", - "settings.connectWalletPlatform.warning": "Per utilitzar Uniswap a {{platform}}, connecteu-vos a un moneder que admeti {{platform}}.", - "settings.footer": "Fet amb amor, \nUniswap Team 🦄", - "settings.hideSmallBalances": "Amaga petits saldos", - "settings.hideSmallBalances.subtitle": "Els saldos inferiors a 1 USD s'amagaran de la vostra cartera.", - "settings.maxSlippage": "Màx. lliscament", - "settings.maxSlippage.amount": "{{amount}} lliscament màxim", - "settings.section.about": "Sobre", - "settings.section.preferences": "Preferències", - "settings.section.privacyAndSecurity": "Privacitat i seguretat", - "settings.section.support": "Suport", - "settings.section.wallet.hidden.row.title": "{{numHidden}} altres carteres", - "settings.setting.advanced.title": "Avançat", - "settings.setting.advancedSettings": "Advanced settings", - "settings.setting.appearance.option.auto": "Automàtic", - "settings.setting.appearance.option.dark.subtitle": "Feu servir sempre un tema fosc.", - "settings.setting.appearance.option.dark.title": "fosc", - "settings.setting.appearance.option.device.subtitle": "S'adapta a la configuració del dispositiu.", - "settings.setting.appearance.option.device.title": "Automàtic", - "settings.setting.appearance.option.light.subtitle": "Feu servir sempre un tema lleuger.", - "settings.setting.appearance.option.light.title": "Llum", - "settings.setting.appearance.title": "Tema", - "settings.setting.backup.create.description": "L'establiment d'una contrasenya xifrarà la còpia de seguretat de la frase de recuperació, afegint un nivell addicional de protecció si el vostre compte {{cloudProviderName}} es veu compromès.", - "settings.setting.backup.create.title": "Fes una còpia de seguretat fins a {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "Com que aquestes carteres comparteixen una frase de recuperació, també se suprimiran les còpies de seguretat d'aquestes carteres a continuació", - "settings.setting.backup.delete.confirm.title": "Estàs segur?", - "settings.setting.backup.delete.warning": "Si suprimiu la vostra còpia de seguretat {{cloudProviderName}} , només podreu recuperar la vostra cartera amb una còpia de seguretat manual de la vostra frase de recuperació. Uniswap Labs no pot recuperar els vostres actius si perds la frase de recuperació.", - "settings.setting.backup.error.message.full": "No es pot fer una còpia de seguretat de la frase de recuperació a {{cloudProviderName}}. Assegureu-vos que teniu {{cloudProviderName}} habilitat amb espai d'emmagatzematge disponible i torneu-ho a provar.", - "settings.setting.backup.error.message.short": "No es pot suprimir la còpia de seguretat", - "settings.setting.backup.error.title": "Error {{cloudProviderName}}", - "settings.setting.backup.modal.description": "Encara no has fet una còpia de seguretat de la teva frase de recuperació a {{cloudProviderName}} . En fer-ho, podeu recuperar la vostra cartera només tenint la sessió iniciada a {{cloudProviderName}} des de qualsevol dispositiu.", - "settings.setting.backup.modal.title": "Còpia de seguretat de la frase de recuperació a {{cloudProviderName}}?", - "settings.setting.backup.password.error.mismatch": "Les contrasenyes no coincideixen", - "settings.setting.backup.password.medium": "Aquesta és una contrasenya mitjana", - "settings.setting.backup.password.placeholder.confirm": "Confirma la contrassenya", - "settings.setting.backup.password.placeholder.create": "Crea una contrasenya", - "settings.setting.backup.password.strong": "Aquesta és una contrasenya segura", - "settings.setting.backup.password.weak": "Aquesta és una contrasenya feble", - "settings.setting.backup.recoveryPhrase.label": "Frase de recuperació", - "settings.setting.backup.selected": "{{cloudProviderName}} còpia de seguretat", - "settings.setting.backup.status.action.delete": "Suprimeix la còpia de seguretat", - "settings.setting.backup.status.complete": "S'ha fet una còpia de seguretat a {{cloudProviderName}}", - "settings.setting.backup.status.description": "Si tens una còpia de seguretat de la teva frase de recuperació a {{cloudProviderName}}, pots recuperar la teva cartera només iniciant sessió al teu compte {{cloudProviderName}} des de qualsevol dispositiu.", - "settings.setting.backup.status.inProgress": "S'està fent una còpia de seguretat a {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "Còpia de seguretat", - "settings.setting.backup.status.title": "{{cloudProviderName}} còpia de seguretat", - "settings.setting.beta.tooltip": "Pròximament", - "settings.setting.biometrics.appAccess.subtitle.android": "Requereix la cara/l'empremta digital per obrir l'aplicació.", - "settings.setting.biometrics.appAccess.subtitle.ios": "Requereix {{biometricsMethod}} per obrir l'aplicació.", - "settings.setting.biometrics.appAccess.title": "Accés a l'aplicació", - "settings.setting.biometrics.auth": "Si us plau, autentiqueu-vos", - "settings.setting.biometrics.extension.waitingForBiometricsModal.content": "Activa {{biometricsMethod}} a la configuració del navegador o del sistema per continuar.", - "settings.setting.biometrics.extension.waitingForBiometricsModal.title": "Esperant {{biometricsMethod}}", - "settings.setting.biometrics.off.message.android": "Actualment, la biometria està desactivada per a Uniswap Wallet; podeu activar-la a la configuració del vostre sistema.", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} actualment està desactivat per a Uniswap Wallet; podeu activar-lo a la configuració del vostre sistema.", - "settings.setting.biometrics.off.title.android": "La biometria està desactivada", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} està desactivat", - "settings.setting.biometrics.title": "Desbloqueig de cara/empremta digital", - "settings.setting.biometrics.transactions.subtitle.android": "Requereix la cara/empremta digital per fer la transacció.", - "settings.setting.biometrics.transactions.subtitle.ios": "Requereix {{biometricsMethod}} per fer transaccions.", - "settings.setting.biometrics.transactions.title": "Transaccions", - "settings.setting.biometrics.unavailable.message.android": "La biometria no està configurada al vostre dispositiu. Per utilitzar la biometria, configureu-la primer a Configuració.", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} no està configurat al teu dispositiu. Per utilitzar {{biometricsMethod}}, configureu-lo primer a Configuració.", - "settings.setting.biometrics.unavailable.title.android": "La biometria no està configurada", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} no està configurat", - "settings.setting.biometrics.warning.message.android": "Si no activeu la biometria, qualsevol persona que tingui accés al vostre dispositiu pot obrir Uniswap Wallet i fer transaccions.", - "settings.setting.biometrics.warning.message.ios": "Si no activeu {{biometricsMethod}}, qualsevol persona que tingui accés al vostre dispositiu pot obrir Uniswap Wallet i fer transaccions.", - "settings.setting.biometrics.warning.title": "Estàs segur?", - "settings.setting.connections.disconnectAll": "Desconnectar-ho tot", - "settings.setting.connections.noConnectionsDescription": "Connecteu-vos a una aplicació cercant un botó \"Connecta Wallet\" o \"Iniciar sessió\".", - "settings.setting.currency.title": "Moneda local", - "settings.setting.deviceAccess.reset.title": "Restableix el teu {{biometricsMethod}}", - "settings.setting.deviceAccess.title": "Accés al dispositiu", - "settings.setting.deviceAccessTimeout.1hour": "1 hora", - "settings.setting.deviceAccessTimeout.24hours": "24 hores", - "settings.setting.deviceAccessTimeout.30minutes": "30 minuts", - "settings.setting.deviceAccessTimeout.5minutes": "5 minuts", - "settings.setting.deviceAccessTimeout.never": "Mai", - "settings.setting.deviceAccessTimeout.title": "Temps d'espera del bloqueig automàtic", - "settings.setting.hapticTouch.title": "Tacte hàptic", - "settings.setting.helpCenter.title": "Centre d'ajuda", - "settings.setting.language.button.navigate": "Vés a la configuració", - "settings.setting.language.description.extension": "Uniswap és per defecte a la configuració d'idioma del vostre sistema. Per canviar el vostre idioma preferit, aneu a la configuració del vostre sistema.", - "settings.setting.language.description.mobile": "Uniswap és per defecte a la configuració d'idioma del dispositiu. Per canviar el vostre idioma preferit, aneu a \"Uniswap\" a la configuració del dispositiu i toqueu \"Idioma\".", - "settings.setting.language.title": "Llenguatge", - "settings.setting.notifications.row.activity.description": "Trasllats, sol·licituds i altres activitats", - "settings.setting.notifications.row.activity.title": "Activitat de cartera", - "settings.setting.notifications.row.updates.description": "Recomanacions i novetats", - "settings.setting.notifications.row.updates.title": "Actualitzacions d'Uniswap", - "settings.setting.notifications.title": "Notificacions", - "settings.setting.password.change.title": "Crea una contrasenya nova", - "settings.setting.password.title": "Canvia la contrasenya", - "settings.setting.permissions.title": "Permisos", - "settings.setting.privacy.analytics.description": "Utilitzem dades d'ús anònimes per millorar la vostra experiència amb els productes d'Uniswap Labs. Quan està desactivat, només fem un seguiment dels errors i de l'ús essencial.", - "settings.setting.privacy.analytics.title": "Analítica d'aplicacions", - "settings.setting.privateKeys.title": "Claus privades", - "settings.setting.recoveryPhrase.title": "Frase de recuperació", - "settings.setting.smallBalances.title": "Balanç de cartera", - "settings.setting.smartWallet.action.enable": "Activa", - "settings.setting.smartWallet.action.smartWallet": "Smart wallet", - "settings.setting.smartWallet.notEligible": "No apte", - "settings.setting.smartWallet.status.actionRequired": "Acció requerida", - "settings.setting.smartWallet.status.active": "Actiu", - "settings.setting.smartWallet.status.inactive": "Inactiu", - "settings.setting.smartWallet.status.unavailable": "No disponible", - "settings.setting.unknownTokens.subtitle": "Els possibles testimonis d'estafa s'amagaran de la vostra cartera.", - "settings.setting.unknownTokens.title": "Amaga fitxes desconegudes", - "settings.setting.wallet.action.editLabel": "Edita l'etiqueta", - "settings.setting.wallet.action.editProfile": "Edita el perfil", - "settings.setting.wallet.action.remove": "Traieu la cartera", - "settings.setting.wallet.connection.banner.description": "Gestioneu les connexions mitjançant la configuració de la cartera fent clic a la vostra imatge de perfil.", - "settings.setting.wallet.connection.banner.title": "Les connexions s'han mogut", - "settings.setting.wallet.connections.title": "Connexions", - "settings.setting.wallet.editLabel.description": "Les etiquetes no són públiques. S'emmagatzemen localment i només els podeu veure.", - "settings.setting.wallet.editLabel.save": "Guardar canvis", - "settings.setting.wallet.label": "Pseudònim", - "settings.setting.wallet.testnetMode.description": "Això activa les xarxes de prova perquè els desenvolupadors puguin provar funcions i transaccions sense utilitzar actius reals. Els testimonis de les xarxes de prova no tenen cap valor real.", - "settings.setting.wallet.testnetMode.title": "Mode Testnet", - "settings.switchNetwork.warning": "Per utilitzar Uniswap a {{label}}, canvieu la xarxa a la configuració de la cartera.", - "settings.title": "Configuració", - "settings.version": "Versió {{appVersion}}", - "smartWallet.actionRequired.cta": "Desactiva en 1 xarxa", - "smartWallet.actionRequired.cta.plural": "Desactiva a les xarxes {{amount}}", - "smartWallet.actionRequired.description": "Desactivar el moneder intel·ligent és una acció en cadena que requereix un petit cost de xarxa.", - "smartWallet.actionRequired.insufficientFunds": "Fons insuficients", - "smartWallet.actionRequired.reactivate": "Continua utilitzant la cartera intel·ligent", - "smartWallet.actionRequired.title": "El moneder intel·ligent està actiu en 1 xarxa", - "smartWallet.actionRequired.title.plural": "El moneder intel·ligent està actiu a les xarxes {{amount}}", - "smartWallet.activeNetworks.title": "El moneder intel·ligent està actiu en 1 xarxa", - "smartWallet.activeNetworks.title.plural": "El moneder intel·ligent està actiu a les xarxes {{amount}}", - "smartWallet.banner.networkCost": "Includes a one-time cost to activate your smart wallet on {{chainName}}.", - "smartWallet.banner.text": "Activa la cartera intel·ligent per estalviar fins a un 50% en costos de xarxa.", - "smartWallet.confirmDisableSmartWallet.description": "Et perdràs intercanvis més ràpids, costos de xarxa amb descompte i altres millores futures.", - "smartWallet.confirmDisableSmartWallet.title": "Estàs segur?", - "smartWallet.insufficient.description": "El moneder intel·ligent no es pot desactivar en aquestes xarxes fins que no tingueu fons per cobrir els costos de la xarxa.", - "smartWallet.insufficient.title": "Fons insuficients en 1 xarxa", - "smartWallet.insufficient.title.plural": "Fons insuficients a les xarxes {{amount}}", - "smartWallet.InsufficientFunds.button.continue.text": "Continua igualment", - "smartWallet.insufficientFunds.network.banner.description": "No es pot desactivar per falta de fons.", - "smartWallet.insufficientFunds.network.banner.title_one": "{{count}} xarxa exclosa", - "smartWallet.insufficientFunds.network.banner.title_other": "{{count}} xarxa exclosa", - "smartWallet.insufficientFunds.network.disable.text": "Llest per desactivar", - "smartWallet.insufficientFunds.network.text": "Necessites {{nativeCurrency}}", - "smartWallet.insufficientFunds.single.network.banner.title": "{{chain}} exclòs", - "smartWallet.modal.description.block1": "Els moneders intel·ligents utilitzen contractes intel·ligents per a transaccions més ràpides i de menor cost.", - "smartWallet.modal.description.block2": "Els moneders que ja utilitzen funcions de moneder intel·ligent d'una altra aplicació no es veuran afectats.", - "smartWallet.modal.title": "Cartera intel·ligent", - "smartWallets": "Carteres intel·ligents", - "smartWallets.activeNetworks.description": "El teu moneder intel·ligent s'activa automàticament a cada nova xarxa a la qual fas intercanvi.", - "smartWallets.createdModal.description": "You’re getting faster transactions and lower network costs on every swap.", - "smartWallets.createdModal.title": "S'ha creat una cartera intel·ligent", - "smartWallets.delegation.limitedSupport": "El vostre moneder té compatibilitat limitada", - "smartWallets.delegationMismatchModal.description": "{{walletName}} no és compatible amb els darrers estàndards d'Ethereum utilitzats per {{displayName}}, per la qual cosa algunes funcions no estan disponibles.", - "smartWallets.delegationMismatchModal.features.1ClickSwaps": "Intercanvis amb 1 clic", - "smartWallets.delegationMismatchModal.features.gasFreeSwaps": "Intercanvis sense gas", - "smartWallets.delegationMismatchModal.features.limitOrders": "Ordres limitades", - "smartWallets.delegationMismatchModal.limitOrders.unsupported": "El vostre moneder no admet les ordres limitades.", - "smartWallets.delegationMismatchModal.title": "Suport limitat de cartera", - "smartWallets.disable.failed": "S'ha produït un error. El moneder intel·ligent encara està actiu en 1 o més xarxes. Torna-ho a provar.", - "smartWallets.disable.modal.description": "Aquesta acció en cadena requereix un cost de xarxa.", - "smartWallets.disable.modal.title": "Desactiva la cartera intel·ligent", - "smartWallets.educationalModal.description": "Els moneders intel·ligents proporcionen transaccions més ràpides i de baix cost mitjançant contractes intel·ligents.", - "smartWallets.educationalModal.info": "Les carteres que ja utilitzen funcions de cartera intel·ligent d'una altra aplicació no es veuran afectades.", - "smartWallets.enabledModal.description": "Les actualitzacions tindran efecte en el proper intercanvi.", - "smartWallets.enabledModal.description.dapp": "Les actualitzacions tindran efecte en la teva propera transacció.", - "smartWallets.enabledModal.description.dapp.line2": "Reconnecta el teu moneder per començar a utilitzar les funcions del moneder intel·ligent a les aplicacions immediatament.", - "smartWallets.enabledModal.title": "Cartera intel·ligent activada", - "smartWallets.postSwapNudge.enable": "Activa la cartera intel·ligent", - "smartWallets.postSwapNudge.title": "Estalvia en el teu proper intercanvi", - "smartWallets.postSwapNudge.title.dapp": "Aquesta aplicació admet moneders intel·ligents", - "smartWallets.unavailableModal.description": "Un proveïdor de moneders diferent ara gestiona la configuració del moneder intel·ligent per a {{displayName}}. Podeu continuar utilitzant Uniswap com sempre.", - "smartWallets.unavailableModal.title": "Les funcions de la cartera intel·ligent no estan disponibles", - "solanaPromo.banner.description": "Intercanvia fitxes de Solana directament a Uniswap.", - "solanaPromo.banner.title": "Solana ja està disponible", - "solanaPromo.modal.connectWallet": "Connecta la teva cartera Solana preferida", - "solanaPromo.modal.startSwapping.button": "Comença a intercanviar a Solana", - "solanaPromo.modal.swapInstantly": "Intercanvia milers de fitxes de moda a l'instant", - "solanaPromo.modal.viewTokenData": "Veure les dades i els preus dels tokens en un sol lloc", - "speedBump.newAddress.warning.description": "No heu fet cap transacció amb aquesta adreça abans. Assegureu-vos que sigui l'adreça correcta abans de continuar.", - "speedBump.newAddress.warning.title": "Nova adreça", - "speedBump.smartContractAddress.warning.description": "Esteu a punt d'enviar fitxes a un tipus especial d'adreça: un contracte intel·ligent. Comproveu que sigui l'adreça a la qual voleu enviar. Si està malament, les vostres fitxes es podrien perdre per sempre.", - "speedBump.smartContractAddress.warning.title": "Aquesta és una adreça de cartera?", - "stats.24fees": "Tarifes 24 h", - "stats.24swapVolume": "Volum d'intercanvi de 24 hores", - "stats.24volume": "Volum 24 h", - "stats.allTimeSwappers": "Tots els intercanviadors de temps", - "stats.allTimeVolume": "Volum de tot el temps", - "stats.fdv": "FDV", - "stats.fdv.description": "La valoració totalment diluïda (FDV) calcula el valor total de mercat assumint que tots els fitxes estan en circulació.", - "stats.marketCap": "Capitalització de mercat", - "stats.marketCap.description": "La capitalització de mercat és el valor total de mercat de l'oferta circulant d'un actiu.", - "stats.noStatsAvailable": "No hi ha estadístiques disponibles", - "stats.tvl": "Valor total bloquejat", - "stats.tvl.description": "El valor total bloquejat (TVL) és l'import total de l'actiu disponible en tots els grups de liquiditat d'Uniswap.", - "stats.volume.1d": "volum de 1 dies", - "stats.volume.1d.description": "El volum d'1 dia és l'import de l'actiu que s'ha negociat a Uniswap durant les últimes 24 hores.", - "stats.volume.1d.long": "Volum 1D", - "stats.volume.1d.short": "1D vol", - "stats.volume.description": "El volum és la quantitat de l'actiu que s'ha negociat a Uniswap durant el període de temps seleccionat.", - "swap.allow.oneTime": "Permet {{sym}} (una vegada)", - "swap.approveAndSubmit": "Aprovar i enviar", - "swap.approveAndSwap": "Aprovar i intercanviar", - "swap.balance.amount": "Balanç: {{amount}}", - "swap.bestPrice.through": "Ruta via {{provider}}", - "swap.bestRoute.cost": "Es calcula que la ruta més eficient costa ~{{gasPrice}} en costos de xarxa. ", - "swap.bridging.title": "Canvi entre xarxes", - "swap.bridging.warning.description": "Estàs canviant de {{fromNetwork}} a {{toNetwork}}. Això també es coneix com \"pont\", que mou els vostres fitxes d'una xarxa a una altra.", - "swap.button.confirmSignAndSwap": "Confirma el signe i canvia", - "swap.button.confirmSwapAnyways": "Confirma l'intercanvi de totes maneres", - "swap.button.confirmUnwrap": "Confirma el desembalatge", - "swap.button.max": "Màx", - "swap.button.review": "Revisió", - "swap.button.submitting": "S'està enviant l'intercanvi...", - "swap.button.submitting.keep.open": "Mantingueu la cartera oberta...", - "swap.button.submitting.passkey": "Confirma amb la clau d'accés", - "swap.button.swap": "Canviar", - "swap.button.swapAnyways": "Canvia de totes maneres", - "swap.button.unwrap": "Desembolicar", - "swap.button.wrap": "Embolicar", - "swap.buy.countryModal.placeholder": "Cerca per país o regió", - "swap.cancel.cannotExecute_one": "El vostre intercanvi es podria executar abans que es processi la cancel·lació. Els costos de la vostra xarxa no es poden reemborsar. Vols continuar?", - "swap.cancel.cannotExecute_other": "Els vostres intercanvis es podrien executar abans que es processi la cancel·lació. Els costos de la vostra xarxa no es poden reemborsar. Vols continuar?", - "swap.confirmApproveAndSwap": "Confirma l'aprovació i l'intercanvi", - "swap.confirmLimit": "Confirmeu el límit", - "swap.confirmSwap": "Confirmeu l'intercanvi", - "swap.confirmWrap": "Confirma l'embalatge", - "swap.deadline.settings.title": "Termini de canvi", - "swap.deadline.settings.title.short": "Tx. termini", - "swap.details.completed": "Intercanvi complet", - "swap.details.estimatedTime": "Hora estimada", - "swap.details.fasterUnichainSwaps": "Intercanvis més ràpids impulsats per Unichain", - "swap.details.feeOnTransfer": "{{tokenSymbol}} quota", - "swap.details.feeOnTransfer.symbol": "{{tokenSymbol}} comissió de token", - "swap.details.instant": "Instantània", - "swap.details.newQuote.input": "Nova entrada", - "swap.details.newQuote.output": "Sortida nova", - "swap.details.orderRouting": "Encaminament de comandes", - "swap.details.orderRoutingInfo": "Aquest intercanvi s'encamina mitjançant Across, un protocol descentralitzat que mou els actius a través de les xarxes alhora que prioritza la seguretat, l'execució ràpida i els preus baixos.", - "swap.details.poweredBy": "Desenvolupat per", - "swap.details.rate": "Taxa", - "swap.details.slippage": "Lliscament màxim", - "swap.details.slippage.uniswap": "Uniswap, protecció contra lliscaments", - "swap.details.swappedIn.unichain": "Completat en {{time}}s a Unichain", - "swap.details.uniswapFee": "Quota", - "swap.error.default": "És possible que hàgiu d'augmentar la vostra tolerància al lliscament. Nota: els fitxes de tarifa per transferència i de rebase són incompatibles amb Uniswap V3.", - "swap.error.expectedToFail": "S'espera que el vostre intercanvi falli.", - "swap.error.fiatInputUnavailable": "Entrada {{fiatCurrencyCode}} no disponible", - "swap.error.modifiedByWallet": "El vostre intercanvi s'ha modificat a través de la vostra cartera. Si es tracta d'un error, cancel·leu immediatament o arrisqueu a perdre els vostres fons.", - "swap.error.rejected": "Transacció rebutjada", - "swap.error.undefinedObject": "S'ha produït un error en intentar executar aquest intercanvi. És possible que hàgiu d'augmentar la vostra tolerància al lliscament. Si això no funciona, pot haver-hi una incompatibilitat amb el testimoni que esteu negociant. Nota: els fitxes de tarifa per transferència i de rebase són incompatibles amb Uniswap V3.", - "swap.error.unknown": "Error desconegut.", - "swap.error.v2.expired": "Aquesta transacció no s'ha pogut enviar perquè ha passat el termini. Comproveu que el termini de transacció no sigui massa baix.", - "swap.error.v2.k": "L'invariant Uniswap x*y=k no es va satisfer amb l'intercanvi. Això normalment significa que un dels testimonis que intercanvieu incorpora un comportament personalitzat en la transferència.", - "swap.error.v2.slippage": "Aquesta transacció no tindrà èxit a causa del moviment del preu o de la tarifa de transferència. Intenteu augmentar la vostra tolerància al lliscament", - "swap.error.v2.transferInput": "El testimoni d'entrada no es pot transferir. Pot haver-hi un problema amb el testimoni d'entrada.", - "swap.error.v2.transferOutput": "El testimoni de sortida no es pot transferir. Pot haver-hi un problema amb el testimoni de sortida.", - "swap.error.v3.slippage": "Aquesta transacció no tindrà èxit a causa del moviment del preu. Intenteu augmentar la vostra tolerància al lliscament. Nota: la tarifa de les fitxes de transferència i rebase no és compatible amb Uniswap V3.", - "swap.error.v3.transferOutput": "El testimoni de sortida no es pot transferir. Pot haver-hi un problema amb el testimoni de sortida. Nota: la tarifa de les fitxes de transferència i rebase no és compatible amb Uniswap V3.", - "swap.estimatedDifference.label": "Hi haurà una gran diferència entre els valors d'entrada i sortida a causa de la liquiditat actual.", - "swap.expected.price": "Preu previst", - "swap.fail.batched": "És possible que el teu moneder connectat no admeti els intercanvis amb un sol clic. Prova un intercanvi estàndard.", - "swap.fail.batched.retry": "Prova l'intercanvi estàndard", - "swap.fail.batched.title": "L'intercanvi amb 1 clic ha fallat", - "swap.fail.message": "Intenteu ajustar el lliscament a un valor més alt.", - "swap.fail.uniswapX": "L'intercanvi no s'ha pogut completar amb UniswapX. Torneu a provar l'intercanvi per encaminar-lo a través de la clàssica API d'Uniswap.", - "swap.fees.experience": "Aquesta tarifa s'aplica a alguns parells de fitxes per garantir la millor experiència amb Uniswap. Es paga al testimoni de sortida i ja s'ha inclòs a la cotització.", - "swap.fees.jupiter.label": "Tarifa de Júpiter", - "swap.fees.jupiter.message": "Les comissions a Solana les cobra l'API de Jupiter. Uniswap Labs no les rep.", - "swap.fees.noFee": "Les tarifes s'apliquen a parells de fitxes seleccionats per garantir la millor experiència amb Uniswap. No hi ha cap comissió associada amb aquest intercanvi.", - "swap.finalizingQuote": "S'està acabant la cotització...", - "swap.form.header": "Canviar", - "swap.form.warning.output.fotFees": "A causa de la comissió testimonial de {{fotCurrencySymbol}}, els imports d'intercanvi només es poden introduir mitjançant el camp d'entrada", - "swap.form.warning.output.fotFees.fallback": "A causa de les comissions testimonials, els imports d'intercanvi només es poden introduir mitjançant el camp d'entrada", - "swap.form.warning.output.solana": "La sortida exacta no és compatible amb Solana.", - "swap.form.warning.restore": "Restaura la teva cartera per canviar-la", - "swap.frontrun.warning": "La vostra transacció pot ser una oportunitat i donar lloc a un comerç desfavorable.", - "swap.header.viewOnly": "Només visualització", - "swap.impactOfTrade": "L'impacte que el vostre comerç té en el preu de mercat d'aquest grup.", - "swap.impactOfTrade.uniswapx": "La diferència entre el preu de mercat i el preu d'execució, tenint en compte l'estalvi de gas d'UniswapX.", - "swap.impactOfTrade.uniswapx.missing": "És possible que els càlculs d'impacte dels preus no estiguin disponibles per a parelles amb poca liquiditat.", - "swap.inputEstimated.atMost": "S'estima l'entrada. Vendreu com a màxim o la transacció es revertirà.", - "swap.limit": "Límit", - "swap.limitFilled": "Límit omplert!", - "swap.limitSubmitted": "Límit enviat", - "swap.marketPrice.outsideRange.label": "El preu de mercat està fora del rang de preus especificat. Només dipòsit d'un sol actiu.", - "swap.min.price": "Preu mínim", - "swap.networkCost.paidIn": "El cost de la xarxa es paga en {{sym}} a la xarxa {{chainName}} per poder realitzar transaccions.", - "swap.orderRouting": "Encaminament de comandes", - "swap.outputEstimated.atLeast": "S'estima la sortida. Rebràs almenys o la transacció es revertirà.", - "swap.placeOrder": "Fes la comanda", - "swap.priceImpact": "Impacte en el preu", - "swap.request.title.full": "Canvia {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "Canvia fitxes", - "swap.review": "Intercanvi de ressenyes", - "swap.review.summary": "Estàs intercanviant", - "swap.reviewLimit": "Límit de revisió", - "swap.route.optimizedGasCost": "Aquesta ruta té en compte les rutes dividides, els salts múltiples i els costos de xarxa de cada pas.", - "swap.routing.jupiter.description": "Júpiter agrega liquiditat de múltiples fonts per oferir-vos els millors preus.", - "swap.routing.uniswapAutoRouter.description": "El router automàtic Uniswap té en compte les rutes i els costos de xarxa òptims per oferir-vos els millors preus.", - "swap.settings.deadline.tooltip": "La transacció es revertirà si està pendent durant més d'aquest període de temps. (Màxim: 3 dies).", - "swap.settings.deadline.warning": "Termini elevat", - "swap.settings.oneClickSwap.title": "Intercanvis amb 1 clic", - "swap.settings.oneClickSwap.tooltip": "Agrupa les accions comercials estàndard per a swaps més ràpids i de menor cost.", - "swap.settings.protection.description": "Amb la protecció d'intercanvi activada, les vostres transaccions d'Ethereum estaran protegides dels atacs sandvitx, amb possibilitats de fracàs reduïdes.", - "swap.settings.protection.subtitle.supported": "{{chainName}} Xarxa", - "swap.settings.protection.subtitle.unavailable": "No disponible el {{chainName}}", - "swap.settings.protection.title": "Protecció d'intercanvi", - "swap.settings.routingPreference.option.default.description": "Si seleccioneu aquesta opció, s'identifica la ruta més eficient per al vostre intercanvi.", - "swap.settings.routingPreference.option.default.description.preV4": "El client Uniswap selecciona l'opció comercial més barata tenint en compte el preu i els costos de xarxa.", - "swap.settings.routingPreference.option.default.description.uniswapXUnavailable": "UniswapX no disponible per al teu moneder", - "swap.settings.routingPreference.option.default.tooltip": "S'identifica una ruta tenint en compte els grups v2, v3 i determinats v4, tenint en compte l'impacte estimat del preu i els costos de xarxa.", - "swap.settings.routingPreference.option.v2.title": "Habilita els grups v2", - "swap.settings.routingPreference.option.v3.title": "Habilita els grups v3", - "swap.settings.routingPreference.option.v4.hooks.title": "Habilita els grups de ganxos v4", - "swap.settings.routingPreference.option.v4.hooks.tooltip": "Els hooks V4 enruten els swaps a través d'un conjunt de hooks preaprovats.", - "swap.settings.routingPreference.option.v4.title": "Habilita els grups v4", - "swap.settings.routingPreference.title": "Opcions comercials", - "swap.settings.slippage.alert": "Alt lliscament", - "swap.settings.slippage.control.auto": "Automàtic", - "swap.settings.slippage.description": "La vostra transacció es revertirà si el preu canvia més que el percentatge de lliscament.", - "swap.settings.slippage.input.message": "Si el preu baixa més, la transacció es revertirà. A continuació es mostra la quantitat mínima que es garanteix rebre.", - "swap.settings.slippage.input.receive.title": "Rebre almenys", - "swap.settings.slippage.output.message": "Si el preu baixa més, la transacció es revertirà. A continuació es mostra la quantitat màxima que hauríeu de gastar.", - "swap.settings.slippage.output.spend.title": "Gastar com a màxim", - "swap.settings.slippage.warning": "Lliscament molt alt", - "swap.settings.slippage.warning.description": "És probable que un lliscament per sobre del 20% es tradueixi en un comerç desfavorable. Per reduir el risc de ser de primera línia, reduïu la configuració.", - "swap.settings.slippage.warning.hover": "Això pot donar lloc a un comerç desfavorable. Proveu de reduir la configuració de lliscament.", - "swap.settings.slippage.warning.max": "Introduïu un valor inferior a {{maxSlippageTolerance}}", - "swap.settings.slippage.warning.message": "El lliscament pot ser més gran del necessari", - "swap.settings.slippage.warning.min": "Introduïu un valor superior a 0", - "swap.settings.title": "Canvia la configuració", - "swap.settings.transactionRevertPrice": "La vostra transacció es revertirà si el preu canvia desfavorablement en més d'aquest percentatge.", - "swap.signAndSwap": "Signar i intercanviar", - "swap.slippage.amt": "{{amt}} lliscament", - "swap.slippage.bridging": "Cap lliscament quan es canvia entre xarxes", - "swap.slippage.description": "Diferència entre el preu esperat i el preu executat en un swap. Les diferències poden aparèixer a causa de la baixa liquiditat, la volatilitat del mercat o els bots. \n\nUniswap Protection protegeix contra els bots que s'encarreguen del front running i els MEV.", - "swap.slippage.settings.title": "Configuració de lliscament", - "swap.slippage.tooltip": "El moviment màxim del preu abans de la transacció es revertirà.", - "swap.slippageBelow.warning": "El lliscament per sota de {{amt}} pot donar lloc a una transacció fallida", - "swap.submitted": "S'ha enviat l'intercanvi", - "swap.success": "Canvi d'èxit!", - "swap.tokenOwnFees": "Algunes fitxes cobren una tarifa quan es compren o venen, que l'estableix l'emissor del token. Uniswap no rep cap d'aquestes tarifes.", - "swap.tradeRoutes": "Rutes comercials", - "swap.transaction.deadline": "Termini de transacció", - "swap.transaction.revertAfter": "La transacció es revertirà si està pendent durant més d'aquest període de temps.", - "swap.warning.enterLargerAmount.title": "Introduïu una quantitat més gran", - "swap.warning.expectedFailure.increaseSlippage": "Intenta augmentar el teu lliscament.", - "swap.warning.expectedFailure.titleMay": "Aquest intercanvi pot fallar", - "swap.warning.insufficientBalance.title": "No en tens prou {{currencySymbol}}", - "swap.warning.insufficientGas.button": "No n'hi ha prou {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "Canvia per {{ tokenSymbol }} a {{networkName}}", - "swap.warning.insufficientGas.button.buy": "Compra {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "Compra amb targeta", - "swap.warning.insufficientGas.message.withNetwork": "No hi ha prou {{currencySymbol}} a {{networkName}} per canviar", - "swap.warning.insufficientGas.message.withoutNetwork": "No hi ha prou {{currencySymbol}} per intercanviar", - "swap.warning.insufficientGas.title": "No teniu prou {{currencySymbol}} per cobrir el cost de la xarxa", - "swap.warning.networkFee.allow": "Permet {{ inputTokenSymbol }} (una vegada)", - "swap.warning.networkFee.delegation.message": "Aquest és el cost per processar la teva transacció i activar el teu moneder intel·ligent a Unichain. Uniswap Labs no rep cap part d'aquestes comissions.", - "swap.warning.networkFee.highRelativeToValue": "El cost de la xarxa supera el 10% del valor total de la transacció. Aquest és el cost per processar la vostra transacció a la cadena de blocs. Uniswap no rep cap part d'aquestes tarifes.", - "swap.warning.networkFee.highRelativeToValue.unichain": "El cost de la xarxa supera el 10% del valor total de la transacció. Aquest és el cost per processar la vostra transacció a la cadena de blocs.", - "swap.warning.networkFee.includesDelegation": "Inclou l'activació de la cartera intel·ligent", - "swap.warning.networkFee.message": "Aquest és el cost per processar la vostra transacció a la cadena de blocs. Uniswap no rep cap part d'aquestes tarifes.", - "swap.warning.networkFee.message.unichain": "Aquest és el cost per processar la vostra transacció a la cadena de blocs.", - "swap.warning.networkFee.message.uniswapX": "Aquest és el cost per processar la vostra transacció a la cadena de blocs. Uniswap no rep cap part d'aquestes tarifes. UniswapX agrega fonts de liquiditat per obtenir millors preus i permutes sense gas.", - "swap.warning.networkFee.message.uniswapX.title": "Sense costos de xarxa amb UniswapX", - "swap.warning.networkFee.message.uniswapX.unichain": "Aquest és el cost per processar la vostra transacció a la cadena de blocs. UniswapX agrega fonts de liquiditat per obtenir millors preus i permutes sense gas.", - "swap.warning.noQuotesFound.bridging.message": "No s'han trobat cites de pont. Proveu d'utilitzar el pont oficial en aquest moment.", - "swap.warning.noQuotesFound.title": "No s'han trobat cites", - "swap.warning.noRoutesFound.message": "Actualment no hi ha rutes disponibles per a les fitxes seleccionades. Si us plau, prova amb un parell diferent o torna a comprovar més tard.", - "swap.warning.noRoutesFound.title": "No hi ha rutes disponibles", - "swap.warning.offline.message": "És possible que hàgiu perdut la connexió a Internet o que la xarxa estigui inactiva. Comprova la teva connexió a Internet i torna-ho a provar.", - "swap.warning.offline.title": "Estàs fora de línia", - "swap.warning.priceImpact.message": "A causa de la quantitat de {{outputCurrencySymbol}} liquiditat disponible actualment, com més {{inputCurrencySymbol}} intenteu intercanviar, menys {{outputCurrencySymbol}} rebràs.", - "swap.warning.priceImpact.message.veryHigh": "Aquesta transacció provocarà un impacte de {{priceImpactValue}} sobre el preu de mercat d'aquest grup i suposarà una pèrdua de fons.", - "swap.warning.priceImpact.title": "Alt impacte en el preu ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "Impacte en el preu molt alt ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "La teva transacció no s'ha enviat perquè has tancat l'aplicació.", - "swap.warning.queuedOrder.approvalFailed": "La vostra transacció no s'ha enviat perquè l'aprovació del testimoni ha fallat.", - "swap.warning.queuedOrder.stale": "La teva transacció no s'ha enviat perquè has tancat l'aplicació o l'aprovació ha trigat massa.", - "swap.warning.queuedOrder.submissionFailed": "S'ha produït un problema en enviar la transacció.", - "swap.warning.queuedOrder.title": "Intercanvi cancel·lat", - "swap.warning.rateLimit.message": "Si us plau, torna-ho a provar d'aquí a uns minuts.", - "swap.warning.rateLimit.title": "Passar els límits de velocitat", - "swap.warning.router.message": "És possible que hàgiu perdut la connexió o que la xarxa estigui inactiva. Si el problema persisteix, torneu-ho a provar més tard.", - "swap.warning.router.title": "Aquest comerç no es pot completar ara mateix", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} està bloquejat", - "swap.warning.tokenBlockedFallback.button": "El testimoni està bloquejat", - "swap.warning.uniswapFee.message": "S'apliquen comissions per garantir la millor experiència amb Uniswap.", - "swap.warning.uniswapFee.message.default": "S'apliquen tarifes per garantir la millor experiència amb Uniswap. No hi ha cap comissió associada amb aquest intercanvi.", - "swap.warning.uniswapFee.message.included": "Les tarifes s'apliquen per garantir la millor experiència amb Uniswap i ja s'han tingut en compte en aquesta cotització.", - "swap.warning.uniswapFee.title": "Comissió d'intercanvi", - "swap.warning.viewOnly.message": "Heu d'importar aquesta cartera mitjançant una frase de recuperació per intercanviar fitxes.", - "swap.wrap.token": "Emboliqui {{sym}}", - "tdp.balanceSummary.otherNetworks": "En altres xarxes", - "tdp.balanceSummary.otherNetworksBalance": "Equilibri en altres xarxes", - "tdp.balanceSummary.title": "El teu saldo", - "tdp.button.getToken": "Obteniu {{ tokenSymbol }}", - "tdp.button.getTokenFallback": "Aconsegueix el Token", - "tdp.loading.title.default": "dades de testimoni per a ", - "tdp.loading.title.withChain": "dades de testimoni per a el {{chainName}}", - "tdp.nameNotFound": "No s'ha trobat el nom", - "tdp.noInfoAvailable": "No hi ha informació de testimoni disponible", - "tdp.noTestnetSupportDescription": "Algunes xarxes de prova no admeten l'intercanvi, l'enviament o la compra de fitxes.", - "tdp.symbolNotFound": "No s'ha trobat el símbol", - "testnet.modal.swapDeepLink.description.toProdMode": "Aquesta acció requereix que el mode testnet estigui desactivat. El mode Testnet es pot tornar a activar en qualsevol moment dins de la configuració.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "Aquesta acció requereix que el mode testnet estigui habilitat. Els testimonis de les xarxes de prova no tenen cap valor real. El mode Testnet es pot desactivar en qualsevol moment dins de la configuració.", - "testnet.modal.swapDeepLink.title.toProdMode": "Desactiva el mode testnet", - "testnet.modal.swapDeepLink.title.toTestnetMode": "Activa el mode testnet", - "testnet.unsupported": "Aquesta funcionalitat no és compatible amb el mode Testnet.", - "themeToggle.theme": "Tema", - "title.buySellTradeEthereum": "Compreu, veneu i comercialitzeu Ethereum i altres fitxes principals a Uniswap", - "title.createGovernanceOn": "Crear una nova proposta de govern a Uniswap", - "title.createGovernanceTo": "Crear una nova proposta de govern per ser votada pels titulars d'UNI. Els fitxes UNI representen accions amb dret a vot en el govern d'Uniswap.", - "title.earnFees": "Guanyeu comissions quan altres intercanvien a Uniswap afegint fitxes als grups de liquiditat.", - "title.easilyRemove": "Traieu fàcilment la vostra liquiditat d'Uniswap v2 i dipositeu a Uniswap v3.", - "title.easilyRemoveV4": "Traieu fàcilment la vostra liquiditat d'Uniswap v2 i v3 per dipositar-la a Uniswap v4.", - "title.extension.uninstall": "Extensió desinstal·lada", - "title.extensionPasskeyLogIn": "Inicia la sessió amb la clau d'accés", - "title.managePasskeys": "Uniswap | Gestioneu les vostres claus de pas", - "title.migratev2": "Migreu la liquiditat del grup v2 a Uniswap v3", - "title.migratev3": "Migreu la liquiditat del grup a Uniswap v4", - "title.placeLimit": "Feu comandes limitades a Uniswap", - "title.realTime": "Preus en temps real, gràfics, dades de transaccions i molt més.", - "title.removeLiquidityv2": "Elimineu la liquiditat del grup (v2) a Uniswap", - "title.removePoolLiquidity": "Elimineu la liquiditat del grup a Uniswap", - "title.removeTokensv2": "Traieu les vostres fitxes dels grups de liquiditat v2.", - "title.removev3Liquidity": "Traieu les vostres fitxes dels grups de liquiditat v3.", - "title.sendCrypto": "Enviar criptomoneda", - "title.sendTokens": "Envieu fitxes a Uniswap", - "title.swappingMadeSimple": "Compra i ven criptomonedes a l'instant a Ethereum, Base, Arbitrum, Polygon, Unichain i més. La plataforma DeFi en què milions de persones confien.", - "title.tradeTokens": "Intercanvieu fitxes i proporcioneu liquiditat. Preus en temps real, gràfics, dades de transaccions i molt més.", - "title.uniswapTradeCrypto": "Uniswap | Opera amb criptomonedes a la borsa líder de DeFi ", - "title.uniToken": "Els fitxes UNI representen accions amb dret a vot en el govern d'Uniswap. Podeu votar cada proposta vosaltres mateixos o delegar els vostres vots en un tercer.", - "title.voteOnGov": "Vota les propostes de govern a Uniswap", - "token.balances.main": "El teu saldo", - "token.balances.other": "Balanços en altres xarxes", - "token.balances.viewOnly": "El saldo de {{ownerAddress}}", - "token.bridge": "{{label}} pont de fitxes", - "token.chart.candlestick.unavailable": "Els gràfics de candelera no estan disponibles per a aquest testimoni", - "token.chart.tooltip": "Tarifes: {{amount}}", - "token.details": "Detalls del testimoni", - "token.error.unknown": "Fitxa desconeguda", - "token.fee.buy.label": "quota de compra", - "token.fee.label": "quota", - "token.fee.sell.label": "quota de venda", - "token.links.title": "Enllaços", - "token.links.twitter": "Twitter", - "token.links.website": "Lloc web", - "token.notFound.description": "Ho sentim, no podem trobar cap informació sobre aquest testimoni. Comproveu el nom i l'adreça i torneu-ho a provar.", - "token.notFound.title": "No s'ha trobat el testimoni", - "token.priceExplorer.error.description": "Alguna cosa ha anat malament.", - "token.priceExplorer.error.title": "No s'ha pogut carregar el gràfic de preus", - "token.priceExplorer.timeRangeLabel.all": "Tot el temps", - "token.priceExplorer.timeRangeLabel.day": "1D", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 dia", - "token.priceExplorer.timeRangeLabel.hour": "1H", - "token.priceExplorer.timeRangeLabel.month": "1M", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 mes", - "token.priceExplorer.timeRangeLabel.week": "1W", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 setmana", - "token.priceExplorer.timeRangeLabel.year": "1 any", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 any", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} no està disponible", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} i {{tokenSymbol1}} no estan disponibles", - "token.safety.fee.detected": "S'ha detectat una comissió per token", - "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs no rep cap d'aquestes tarifes.", - "token.safety.warning.alwaysDoYourResearch": "Feu sempre la vostra recerca", - "token.safety.warning.blocked.description.default_one": "No podeu intercanviar aquest testimoni mitjançant l'aplicació Uniswap.", - "token.safety.warning.blocked.description.default_other": "No podeu intercanviar aquests fitxes amb l'aplicació Uniswap.", - "token.safety.warning.copyContractAddress.message": "Aquesta és una adreça de contracte, que actua com a identificador únic per a fitxes a la cadena de blocs. Qualsevol criptografia que envieu a aquesta adreça es perdrà.", - "token.safety.warning.copyContractAddress.title": "No envieu criptografia a aquesta adreça", - "token.safety.warning.dontShowWarningAgain": "No em tornis a mostrar aquest avís", - "token.safety.warning.dontShowWarningAgainShort": "No tornar a mostrar", - "token.safety.warning.doYourOwnResearch": "Feu sempre la vostra pròpia investigació abans de continuar.", - "token.safety.warning.feeDescription": "Cobra un quan {{action}}", - "token.safety.warning.flaggedAsMalicious": "Marcat com a maliciós", - "token.safety.warning.flaggedAsSuspicious": "Marcat com a sospitós", - "token.safety.warning.fotHigh.title": "S'ha detectat una tarifa elevada", - "token.safety.warning.fotLow.title": "S'ha detectat una tarifa", - "token.safety.warning.fotVeryHigh.title": "S'ha detectat una tarifa molt alta", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} s'ha marcat com a no venedor. L'intercanvi d'aquest testimoni pot provocar la pèrdua dels vostres fons.", - "token.safety.warning.honeypot.title": "S'ha detectat una tarifa de venda del 100%.", - "token.safety.warning.impersonator": "Suplanta un altre testimoni", - "token.safety.warning.impersonator.title": "S'ha detectat un testimoni d'imitador", - "token.safety.warning.malicious.general.message": "{{tokenSymbol}} ha estat marcat com a maliciós per Blockaid.", - "token.safety.warning.malicious.impersonator.message": "Blockaid ha marcat {{tokenSymbol}} per intentar copiar un testimoni diferent. Pot ser que no sigui el testimoni que voleu intercanviar.", - "token.safety.warning.malicious.impersonator.message.short": "És possible que {{tokenSymbol}} no sigui el testimoni que voleu intercanviar.", - "token.safety.warning.malicious.title": "S'ha detectat un testimoni maliciós", - "token.safety.warning.mayResultInLoss": "Canviar-lo pot provocar una pèrdua de fons.", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} no es negocia a les principals borses centralitzades dels EUA.", - "token.safety.warning.notListedOnExchanges": "No cotitza a les principals borses dels EUA", - "token.safety.warning.potentialHoneypot.card.message": "{{tokenSymbol}} ha estat marcat com a sospitós per Blockaid.", - "token.safety.warning.potentialHoneypot.modal.message": "Blockaid ha marcat {{tokenSymbol}} com a pot potencial. Feu sempre la vostra pròpia investigació abans de continuar.", - "token.safety.warning.potentialHoneypot.title": "S'ha detectat un pot de mel potencial", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} s'ha marcat com a no venedor.", - "token.safety.warning.sellFee100.title": "S'ha detectat una tarifa de venda del 100%.", - "token.safety.warning.spam.message": "{{tokenSymbol}} ha estat marcat com a correu brossa per Blockaid.", - "token.safety.warning.spam.title": "S'ha detectat un testimoni de correu brossa", - "token.safety.warning.spamsUsers": "Usuaris de correu brossa", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} cobra una tarifa de {{buyFeePercent}} quan es compra i {{sellFeePercent}} quan es ven.", - "token.safety.warning.tokenChargesFee.buy.message": "{{tokenSymbol}} cobra una tarifa de {{feePercent}} quan es compra.", - "token.safety.warning.tokenChargesFee.buy.message.descriptive": "{{tokenSymbol}} cobra una comissió de {{feePercent}} quan es compra. L'intercanvi pot comportar una pèrdua de fons. Uniswap Labs no rep cap d'aquestes comissions.", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} cobra una tarifa de {{feePercent}} quan es ven.", - "token.safety.warning.tokenChargesFee.sell.message.descriptive": "{{tokenSymbol}} cobra una comissió de {{feePercent}} quan es ven. L'intercanvi pot comportar una pèrdua de fons. Uniswap Labs no rep cap d'aquestes comissions.", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} cobra una tarifa quan es compra o es ven.", - "token.safetyLevel.blocked.message": "No podeu intercanviar aquest testimoni amb Uniswap Wallet.", - "token.safetyLevel.medium.message.plural": "Aquestes fitxes no es comercialitzen a les principals borses centralitzades dels EUA. Feu sempre la vostra pròpia investigació abans de continuar.", - "token.selector.search.error": "No s'han pogut carregar els resultats de la cerca", - "token.stats.fullyDilutedValuation": "Valoració totalment diluïda", - "token.stats.marketCap": "Cap de mercat", - "token.stats.priceHighYear": "52 W alt", - "token.stats.priceLowYear": "52W baix", - "token.stats.section.about": "Sobre {{token}}", - "token.stats.title": "Estadístiques", - "token.stats.translation.original": "Mostra l'original", - "token.stats.translation.translate": "Tradueix a {{language}}", - "token.stats.volume": "Volum 24h", - "token.symbol.input.fallback": "Fitxa d'entrada", - "token.symbol.output.fallback": "Fitxa de sortida", - "token.wrap.fail.message": "Els intercanvis del protocol Uniswap poden començar i acabar amb ETH. Tanmateix, durant l'intercanvi, ETH s'embolica a WETH.", - "token.zeroNativeBalance.description.mainnet": "Haureu d'intercanviar un testimoni a Ethereum per obtenir {{ tokenSymbol }}. L'intercanvi requereix ETH per als costos de xarxa.", - "token.zeroNativeBalance.description.otherChains": "Haureu d'intercanviar un testimoni a {{ chainName }} per obtenir {{ tokenSymbol }}. L'intercanvi requereix {{ chainName }} {{ nativeTokenSymbol }} per als costos de xarxa.", - "token.zeroNativeBalance.subtitle": "{{ tokenSymbol }} no està disponible per a la compra directa.", - "token.zeroNativeBalance.title.mainnet": "Necessites {{ nativeTokenName }}", - "token.zeroNativeBalance.title.otherChains": "Necessites {{ nativeTokenName }} a {{ chainName }}", - "tokens.action.hide": "Amaga el testimoni", - "tokens.action.unhide": "Mostra el testimoni", - "tokens.nfts.action.viewOnExplorer": "Veure a {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "No s'ha pogut carregar la col·lecció NFT", - "tokens.nfts.collection.label.items": "Elements", - "tokens.nfts.collection.label.owners": "Propietaris", - "tokens.nfts.collection.label.priceFloor": "Pis", - "tokens.nfts.collection.label.swapVolume": "Volum", - "tokens.nfts.connectEthereumToView": "Connecta una cartera Ethereum per veure els teus NFT", - "tokens.nfts.details.contract.address": "Adreça del contracte", - "tokens.nfts.details.error.load.title": "No s'han pogut carregar els detalls de NFT", - "tokens.nfts.details.network": "Xarxa", - "tokens.nfts.details.owner": "Propietat de", - "tokens.nfts.details.price": "Preu actual", - "tokens.nfts.details.recentPrice": "Últim preu de venda", - "tokens.nfts.details.traits": "Característiques", - "tokens.nfts.empty.description": "No s'han trobat NFT", - "tokens.nfts.error.unavailable": "Contingut no disponible", - "tokens.nfts.hidden.action.hide": "Amaga NFT", - "tokens.nfts.hidden.action.unhide": "Mostra NFT", - "tokens.nfts.link.collection": "Web de la col·lecció", - "tokens.nfts.list.error.load.title": "No s'han pogut carregar NFT", - "tokens.nfts.list.none.button": "Rebre NFT", - "tokens.nfts.list.none.description.default": "Transfereix NFT d'una altra cartera per començar.", - "tokens.nfts.list.none.description.external": "Quan aquesta cartera compri o rebi NFT, apareixeran aquí.", - "tokens.nfts.list.none.title": "Encara no hi ha NFT", - "tokens.nfts.notAvailableOnSolana": "Els NFT no estan disponibles a Solana", - "tokens.selector.button.choose": "Seleccioneu el testimoni", - "tokens.selector.empty.buy.message": "Compra cripto amb una targeta o un banc per enviar fitxes.", - "tokens.selector.empty.buy.title": "Comprar cripto", - "tokens.selector.empty.receive.title": "Rebre fitxes", - "tokens.selector.empty.title": "Encara no hi ha fitxes", - "tokens.selector.error.load": "No s'han pogut carregar les fitxes", - "tokens.selector.search.empty": "No s'han trobat resultats per a {{searchText}}", - "tokens.selector.search.placeholder": "Cerca fitxes", - "tokens.selector.section.bridging": "Canvia entre xarxes", - "tokens.selector.section.favorite": "Preferits", - "tokens.selector.section.otherNetworksSearchResults": "Fitxes que es troben a altres xarxes", - "tokens.selector.section.otherSearchResults": "Altres fitxes a {{network}}", - "tokens.selector.section.recent": "Recerques recents", - "tokens.selector.section.search": "Resultats de la cerca", - "tokens.selector.section.trending": "Fitxes per volum de 24 hores", - "tokens.selector.section.yours": "Les teves fitxes", - "tokens.table.search.placeholder.pools": "Cerca piscines", - "tokens.table.search.placeholder.tokens": "Cerca fitxes", - "tokens.table.search.placeholder.transactions": "Cerca transaccions", - "toucan.auction.bidConcentration": "Concentració de tucans", - "toucan.auction.bidConcentration.tooltip.description": "Descripció de la informació emergent del tucà", - "toucan.auction.bidConcentration.tooltip.title": "Títol de la descripció emergent del tucà", - "toucan.auctions": "Subhastes", - "toucan.bidForm.maxBudget": "Pressupost màxim", - "toucan.bidForm.placeBid": "Fes la teva oferta", - "toucan.displayMode.tokenPrice": "Preu del token", - "toucan.displayMode.valuation": "Valoració", - "transaction.action.cancel.button": "Cancel·la la transacció", - "transaction.action.cancel.description": "Si cancel·leu aquesta transacció abans de ser processada per la xarxa, pagareu un nou cost de xarxa en lloc de l'original.", - "transaction.action.cancel.title": "Cancel·lar aquesta transacció?", - "transaction.action.clear": "Esborra pendent", - "transaction.action.copy": "Copia l'identificador de transacció", - "transaction.action.copyProvider": "Copia {{providerName}} ID de transacció", - "transaction.amount.unlimited": "Il·limitat", - "transaction.callData": "Dades de la trucada", - "transaction.details.dappName": "App", - "transaction.details.from": "Des de", - "transaction.details.networkFee": "Cost de la xarxa", - "transaction.details.networkFee.swap": "Cost de xarxa d'intercanvi", - "transaction.details.providerFee": "Tarifa del proveïdor", - "transaction.details.swapRate": "Taxa", - "transaction.details.transaction": "Transacció", - "transaction.details.uniswapFee": "Comissió ({{ feePercent }}%)", - "transaction.network.all": "Totes les xarxes", - "transaction.networkCost.description": "El cost de processar la teva transacció a la cadena de blocs. Uniswap està optimitzat per a costos de xarxa mínims.", - "transaction.networkCost.includesSmartWalletActivation": "Inclou l'activació de la cartera intel·ligent", - "transaction.networkCost.label": "Cost de la xarxa", - "transaction.networkCost.maxNativeBalance.description": "Es reserva una petita quantitat del saldo del testimoni de xarxa per cobrir el cost de la xarxa d'aquesta transacció.", - "transaction.networkCost.maxNativeBalance.title": "Per què no puc utilitzar el meu saldo màxim?", - "transaction.networkCost.veryHigh.label": "Cost de xarxa molt elevat", - "transaction.notification.error.cancel": "No es pot cancel·lar la transacció", - "transaction.notification.error.replace": "No es pot substituir la transacció", - "transaction.status.approval.canceled": "Aprovació cancel·lada", - "transaction.status.approval.failed": "L'aprovació ha fallat", - "transaction.status.approve.canceled": "Aprovació cancel·lada", - "transaction.status.approve.canceling": "S'està cancel·lant l'aprovació", - "transaction.status.approve.failed": "No s'ha pogut aprovar", - "transaction.status.approve.pending": "Aprovant", - "transaction.status.approve.success": "Aprovat", - "transaction.status.approve.successDapp": "Aprovat el {{externalDappName}}", - "transaction.status.buy.canceled": "Compra cancel·lada", - "transaction.status.buy.canceling": "S'està cancel·lant la compra", - "transaction.status.buy.failed": "No s'ha pogut comprar", - "transaction.status.buy.pending": "Comprant", - "transaction.status.buy.success": "Comprat", - "transaction.status.buy.successDapp": "Comprat el {{externalDappName}}", - "transaction.status.claim.canceled": "Cobrament de taxes cancel·lat", - "transaction.status.claim.canceling": "Cancel·lació del cobrament de taxes", - "transaction.status.claim.failed": "Error en el cobrament de la taxa", - "transaction.status.claim.pending": "Recaptació de taxes", - "transaction.status.claim.success": "Taxes recaptades", - "transaction.status.collect.fees.canceled": "Comissions de cobrament cancel·lades", - "transaction.status.collect.fees.failed": "No s'han pogut cobrar les taxes", - "transaction.status.collected.fees": "Comissions cobrades", - "transaction.status.collecting.fees": "Recaptació de taxes", - "transaction.status.confirm.canceled": "Confirmació cancel·lada", - "transaction.status.confirm.canceling": "Pendent de cancel·lació", - "transaction.status.confirm.failed": "No s'ha pogut confirmar", - "transaction.status.confirm.pending": "Transacció en curs", - "transaction.status.confirm.success": "Transacció confirmada", - "transaction.status.confirm.successDapp": "Transacció confirmada el {{externalDappName}}", - "transaction.status.createPair.canceled": "Creació de parell cancel·lada", - "transaction.status.createPair.canceling": "Cancel·lant la creació de la parella", - "transaction.status.createPair.failed": "No s'ha pogut crear la parella", - "transaction.status.createPair.pending": "Creant parella", - "transaction.status.createPair.success": "Parella creada", - "transaction.status.createPool.canceled": "Creació del grup cancel·lada", - "transaction.status.createPool.canceling": "Cancel·lant la creació del grup", - "transaction.status.createPool.failed": "No s'ha pogut crear el grup", - "transaction.status.createPool.pending": "Creació de piscina", - "transaction.status.createPool.success": "Piscina creada", - "transaction.status.liquidityDecrease.canceled": "Eliminació de liquiditat cancel·lada", - "transaction.status.liquidityDecrease.canceling": "Cancel·lació de l'eliminació de liquiditat", - "transaction.status.liquidityDecrease.failed": "S'ha produït un error en eliminar la liquiditat", - "transaction.status.liquidityDecrease.pending": "Eliminació de liquiditat", - "transaction.status.liquidityDecrease.success": "Liquiditat eliminada", - "transaction.status.liquidityIncrease.canceled": "Afegir liquiditat cancel·lada", - "transaction.status.liquidityIncrease.canceling": "Cancel·lació de l'addició de liquiditat", - "transaction.status.liquidityIncrease.failed": "No s'ha pogut afegir liquiditat", - "transaction.status.liquidityIncrease.pending": "Afegir liquiditat", - "transaction.status.liquidityIncrease.success": "Liquiditat afegida", - "transaction.status.lpIncentivesClaim.canceled": "Reclamació de recompenses LP cancel·lada", - "transaction.status.lpIncentivesClaim.canceling": "Cancel·lació de la reclamació de recompenses LP", - "transaction.status.lpIncentivesClaim.failed": "No s'han pogut reclamar les recompenses de LP", - "transaction.status.lpIncentivesClaim.pending": "Reclamació de recompenses LP", - "transaction.status.lpIncentivesClaim.success": "Recompenses LP reclamades", - "transaction.status.migrateLiquidity.canceled": "Migració de liquiditat cancel·lada", - "transaction.status.mint.canceled": "Menta cancel·lada", - "transaction.status.mint.canceling": "Cancel·lant la menta", - "transaction.status.mint.failed": "No s'ha pogut encunyar", - "transaction.status.mint.pending": "Encunyació", - "transaction.status.mint.success": "Encunyat", - "transaction.status.mint.successDapp": "Encunyat el {{externalDappName}}", - "transaction.status.offramp.canceled": "Rampa de sortida cancel·lada", - "transaction.status.offramp.failed": "La rampa de sortida ha fallat", - "transaction.status.offramp.pending": "Desviació de rampes", - "transaction.status.offramp.success": "Desviat de la rampa", - "transaction.status.onramp.canceled": "Rampa d'accés cancel·lada", - "transaction.status.onramp.failed": "La rampa d'accés ha fallat", - "transaction.status.onramp.pending": "Onramping", - "transaction.status.onramp.success": "Onramped", - "transaction.status.permit.approved": "Permís aprovat", - "transaction.status.permit.canceled": "Transacció de permís cancel·lada", - "transaction.status.permit.failed": "Permís fallit", - "transaction.status.purchase.canceled": "Compra cancel·lada", - "transaction.status.purchase.canceling": "S'està cancel·lant la compra", - "transaction.status.purchase.failed": "La compra ha fallat", - "transaction.status.purchase.failedOn": "No s'ha pogut comprar el {{serviceProvider}}", - "transaction.status.purchase.pending": "Compres", - "transaction.status.purchase.pendingOn": "Compres el {{serviceProvider}}", - "transaction.status.purchase.successOn": "Comprat el {{serviceProvider}}", - "transaction.status.receive.canceled": "Recepció cancel·lada", - "transaction.status.receive.canceling": "S'està cancel·lant la recepció", - "transaction.status.receive.failed": "La recepció ha fallat", - "transaction.status.receive.failedFrom": "No s'ha pogut rebre de {{serviceProvider}}", - "transaction.status.receive.pending": "Recepció", - "transaction.status.receive.pendingFrom": "S'està rebent des de {{serviceProvider}}", - "transaction.status.receive.success": "Rebut", - "transaction.status.receive.successDapp": "Rebut el {{externalDappName}}", - "transaction.status.receive.successFrom": "Rebut de {{serviceProvider}}", - "transaction.status.removeDelegation.canceled": "Eliminació de la delegació cancel·lada", - "transaction.status.removeDelegation.failed": "No s'ha pogut eliminar la delegació.", - "transaction.status.removeDelegation.pending": "Eliminació de la delegació", - "transaction.status.removeDelegation.success": "Delegació eliminada", - "transaction.status.revoke.canceled": "Revocació cancel·lada", - "transaction.status.revoke.canceling": "S'està cancel·lant la revocació", - "transaction.status.revoke.failed": "No s'ha pogut revocar", - "transaction.status.revoke.pending": "Revocant", - "transaction.status.revoke.success": "Revocat", - "transaction.status.revoke.successDapp": "Revocat el {{externalDappName}}", - "transaction.status.sale.canceled": "Venda cancel·lada", - "transaction.status.sale.canceling": "Anul·lació de venda", - "transaction.status.sale.failedOn": "La venda ha fallat mitjançant {{serviceProvider}}", - "transaction.status.sale.pendingCard.msg": "Obteniu més informació sobre la venda de cripto.", - "transaction.status.sale.pendingCard.title": "Per què la meva venda encara està pendent?", - "transaction.status.sale.pendingOn": "Ven a través de {{serviceProvider}}", - "transaction.status.sale.successOn": "Venut a través de {{serviceProvider}}", - "transaction.status.sell.canceled": "Venda cancel·lada", - "transaction.status.sell.canceling": "S'està cancel·lant la venda", - "transaction.status.sell.failed": "No s'ha pogut vendre", - "transaction.status.sell.pending": "Venda", - "transaction.status.sell.success": "Vengut", - "transaction.status.sell.successDapp": "Venut el {{externalDappName}}", - "transaction.status.send.canceled": "Enviament cancel·lat", - "transaction.status.send.canceling": "S'està cancel·lant l'enviament", - "transaction.status.send.failed": "Error a l'enviar", - "transaction.status.send.pending": "Enviament", - "transaction.status.send.success": "Enviat", - "transaction.status.send.successDapp": "Enviat el {{externalDappName}}", - "transaction.status.swap.canceled": "Intercanvi cancel·lat", - "transaction.status.swap.canceling": "S'està cancel·lant l'intercanvi", - "transaction.status.swap.expired": "L'intercanvi ha caducat", - "transaction.status.swap.failed": "No s'ha pogut canviar", - "transaction.status.swap.insufficientFunds": "Fons insuficients", - "transaction.status.swap.pending": "Canvi", - "transaction.status.swap.success": "Canviat", - "transaction.status.swap.successDapp": "Canviat a {{externalDappName}}", - "transaction.status.unwrap.canceled": "Desembolcall cancel·lat", - "transaction.status.unwrap.canceling": "S'està cancel·lant el desplegament", - "transaction.status.unwrap.failed": "No s'ha pogut desenrotllar", - "transaction.status.unwrap.pending": "Desembolcall", - "transaction.status.unwrap.success": "Desembolicat", - "transaction.status.unwrap.successDapp": "Desembolicat el {{externalDappName}}", - "transaction.status.wrap.canceled": "Embolcall cancel·lat", - "transaction.status.wrap.canceling": "S'està cancel·lant l'embolcall", - "transaction.status.wrap.failed": "No s'ha pogut embolicar", - "transaction.status.wrap.pending": "Embolcall", - "transaction.status.wrap.success": "Embolicat", - "transaction.status.wrap.successDapp": "Embolcallat a {{externalDappName}}", - "transaction.submittedOn": "Enviat el", - "transaction.summary.liquidity": "{{firstAmountWithSymbol}} i {{secondAmountWithSymbol}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} a {{recipientAddress}}", - "transaction.summary.received.noAmount": "Rebut de {{name}}", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} de {{senderAddress}}", - "transaction.summary.sent.noAmount": "Enviat a {{name}}", - "transaction.warning.insufficientGas.modal.message": "Necessites{{tokenAmount}} {{tokenSymbol}} () el {{networkName}} per cobrir el cost de xarxa d'aquesta transacció. Canvia {{tokenSymbol}} d'una altra cadena o compra amb la teva targeta per continuar.", - "transaction.warning.insufficientGas.modal.message.noAction": "Necessites{{tokenAmount}} {{tokenSymbol}} () el {{networkName}} per cobrir el cost de xarxa d'aquesta transacció.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount": "Necessites{{tokenAmount}} {{tokenSymbol}} () el {{networkName}} per cobrir el cost de xarxa d'aquesta transacció.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount.noAction": "Per canviar per aquest testimoni, necessiteu més {{tokenSymbol}} a {{networkName}}.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "No n'hi ha prou {{tokenSymbol}} a {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "No n'hi ha prou {{tokenSymbol}}", - "transaction.warning.maxNative.message": "Esteu a punt de gastar la major part del vostre saldo de testimoni de xarxa. Això pot deixar fons insuficients per cobrir els costos futurs de la xarxa.", - "transaction.warning.maxNative.title": "Baix balanç de fitxes de xarxa", - "transaction.watcher.error.cancel": "No es pot cancel·lar la transacció", - "transaction.watcher.error.status": "S'ha produït un error en comprovar l'estat de la transacció", - "uniswapX.aggregatesLiquidity": " agrega fonts de liquiditat per obtenir millors preus i permutes sense gas.", - "uniswapX.cost": "UniswapX elimina els costos típics de les transaccions a la cadena de blocs.", - "uniswapx.description": "UniswapX agrega fonts de liquiditat per obtenir millors preus i permutes sense gas.", - "uniswapx.description.unsupported": "UniswapX no està disponible actualment perquè la configuració del moneder intel·ligent està gestionada per una altra aplicació de moneder.", - "uniswapx.included": "Inclou UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "Més informació sobre l'intercanvi amb UniswapX", - "uniswapx.unavailable.title": "UniswapX no està disponible", - "uniswapx.v2QuoteFailed": "S'ha produït un error en la cotització d'UniswapX v2. Torna-ho a provar amb l'intercanvi clàssic.", - "unitags.banner.button.claim": "Reclama ara", - "unitags.banner.subtitle": "Creeu un perfil web3 personalitzat i compartiu fàcilment la vostra adreça amb els amics.", - "unitags.banner.title.compact": "Reclama el teu {{unitagDomain}} nom d'usuari i crea el teu perfil personalitzable.", - "unitags.banner.title.full": "Reclameu el vostre nom d'usuari {{unitagDomain}}", - "unitags.choosePhoto.option.cameraRoll": "Trieu entre el carret de la càmera", - "unitags.choosePhoto.option.computer": "Carregar des de l'ordinador", - "unitags.choosePhoto.option.nft": "Trieu un NFT", - "unitags.choosePhoto.option.remove": "Elimina la foto de perfil", - "unitags.claim.available": "Disponible", - "unitags.claim.confirmation.customize": "Personalitza el perfil", - "unitags.claim.confirmation.description": "{{unitagAddress}} està llest per enviar i rebre criptografia. Continueu creant la vostra cartera personalitzant el vostre perfil web3.", - "unitags.claim.confirmation.success.long": "Ho tens!", - "unitags.claim.confirmation.success.short": "ho tinc!", - "unitags.claim.error.addressLimit": "Ja heu fet el nombre màxim de canvis al vostre nom d'usuari per a aquesta adreça", - "unitags.claim.error.avatar": "No s'ha pogut establir l'avatar. Torna-ho a provar més tard.", - "unitags.claim.error.default": "No s'ha pogut reclamar el nom d'usuari. Torna-ho a provar més tard.", - "unitags.claim.error.deviceLimit": "Heu arribat al nombre màxim de noms d'usuari que poden estar actius per a aquest dispositiu", - "unitags.claim.error.general": "No es pot reclamar el nom d'usuari", - "unitags.claim.error.unavailable": "Aquest nom d'usuari no està disponible", - "unitags.claim.error.unknown": "Error desconegut", - "unitags.claim.username.default": "el teu nom", - "unitags.delete.confirm.subtitle": "Esteu a punt d'eliminar el vostre nom d'usuari i els detalls del perfil personalitzables. No el podràs recuperar.", - "unitags.delete.confirm.title": "Estàs segur?", - "unitags.editProfile.placeholder": "nom d'usuari", - "unitags.editUsername.confirm.subtitle": "Estàs a punt de canviar el teu nom d'usuari. Un cop el canvieu, no el podreu reclamar mai més.", - "unitags.editUsername.confirm.title": "Estàs segur?", - "unitags.editUsername.title": "Editeu el vostre nom d'usuari", - "unitags.editUsername.warning.default": "Un cop canvieu el vostre nom d'usuari, no podreu reclamar-lo mai més. Només el podeu canviar 2 vegades.", - "unitags.editUsername.warning.max": "Heu assolit el nombre màxim de 2 canvis de noms d'usuari.", - "unitags.extension.intro.buttton": "Reclama un nom d'usuari", - "unitags.extension.intro.description": "Digues adéu a les adreces 0x. Els noms d'usuari són noms llegibles que faciliten l'enviament i la recepció de criptografia.", - "unitags.extension.intro.title": "Presentació dels noms d'usuari", - "unitags.extension.intro.upsell.customizable": "Perfils personalitzables", - "unitags.extension.intro.upsell.ens": "Desenvolupat per subdominis ENS", - "unitags.extension.intro.upsell.free": "Lliure de reclamar", - "unitags.intro.features.ens": "Desenvolupat per subdominis ENS", - "unitags.intro.features.free": "Lliure de reclamar", - "unitags.intro.features.profile": "Perfils personalitzables", - "unitags.intro.subtitle": "Digues adéu a les adreces 0x. Els noms d'usuari són noms llegibles que faciliten l'enviament i la recepció de criptografia.", - "unitags.intro.title": "Presentació dels noms d'usuari", - "unitags.notification.delete.error": "No s'ha pogut suprimir el nom d'usuari. Torna-ho a provar més tard.", - "unitags.notification.delete.title": "S'ha suprimit el nom d'usuari", - "unitags.notification.profile.error": "No s'ha pogut actualitzar el perfil. Torna-ho a provar més tard.", - "unitags.notification.profile.title": "Perfil actualitzat", - "unitags.notification.username.error": "No s'ha pogut canviar el nom d'usuari. Torna-ho a provar més tard.", - "unitags.notification.username.title": "El nom d'usuari ha canviat", - "unitags.onboarding.claim.subtitle": "Aquesta és la vostra adreça personalitzada a la qual la gent pot enviar criptografia.", - "unitags.onboarding.claim.title.choose": "Crea el teu nom d'usuari", - "unitags.onboarding.claim.title.claim": "Reclama el teu nom d'usuari", - "unitags.onboarding.info.description": "Els noms d'usuari transformen adreces complexes 0x en noms llegibles. En reclamar un nom d'usuari {{unitagDomain}} , podeu enviar i rebre criptografia fàcilment i crear un perfil web3 públic.", - "unitags.onboarding.info.title": "Una adreça simplificada", - "unitags.onboarding.profile.subtitle": "Pengeu el vostre o seguiu amb la vostra Unicon única. Sempre ho pots canviar més tard.", - "unitags.onboarding.profile.title": "Tria una foto de perfil", - "unitags.profile.action.delete": "Esborra el nom d'usuari", - "unitags.profile.action.edit": "Edita el nom d'usuari", - "unitags.profile.bio.label": "bio", - "unitags.profile.bio.placeholder": "Escriu una biografia per al teu perfil", - "unitags.profile.links.twitter": "Twitter", - "unitags.username.error.chars": "Els noms d'usuari només poden contenir lletres i números", - "unitags.username.error.max": "Els noms d'usuari no poden tenir més de {{number}} caràcters", - "unitags.username.error.min": "Els noms d'usuari han de tenir almenys {{number}} caràcters", - "unitags.username.error.uppercase": "Els noms d'usuari només poden contenir lletres minúscules i números", - "uwulink.error.insufficientTokens": "No n'hi ha prou {{tokenSymbol}} a {{chain}}", - "v2.notAvailable": "Uniswap V2 no està disponible en aquesta xarxa.", - "wallet.appSignIn": "Inicia sessió amb l'aplicació", - "wallet.connectingAgreement": "En connectar una cartera, accepteu les Condicions del servei d'Uniswap Labs i accepteu la seva Política de privadesa.", - "wallet.connectionFailed.message": "L'intent de connexió ha fallat. Si us plau, torneu-ho a intentar seguint els passos per connectar-vos al vostre moneder.", - "wallet.mismatch.popup.description": "Algunes funcions no són compatibles amb el teu moneder connectat.", - "wallet.mismatch.popup.title": "Suport limitat de cartera", - "wallet.other": "Altres carteres", - "wallet.scanToConnect": "Escaneja el codi QR per connectar-te", - "wallet.wrongNet": "La vostra cartera està connectada a la xarxa incorrecta.", - "walletConnect.dapps.empty.description": "Connecteu-vos a una aplicació escanejant un codi mitjançant WalletConnect", - "walletConnect.dapps.manage.empty.title": "No hi ha cap aplicació connectada", - "walletConnect.dapps.manage.title": "Connexions", - "walletConnect.error.connection.message": "Uniswap Wallet actualment admet {{chainNames}}. Utilitzeu només \"{{dappName}}\" en aquestes cadenes", - "walletConnect.error.connection.title": "Error de connexió", - "walletConnect.error.general.message": "Hi ha hagut un problema amb WalletConnect. Siusplau torna-ho a provar", - "walletConnect.error.general.title": "Error de WalletConnect", - "walletConnect.error.scantastic.message": "Hi ha hagut un problema amb el teu codi QR. Siusplau torna-ho a provar", - "walletConnect.error.scantastic.title": "Codi QR no vàlid", - "walletConnect.error.unsupported.message": "Assegureu-vos que esteu escanejant un codi QR de WalletConnect, d'Ethereum o d'extensió Uniswap vàlid abans de tornar-ho a provar.", - "walletConnect.error.unsupported.title": "Codi QR no vàlid", - "walletConnect.error.unsupportedV1.message": "WalletConnect v1 ja no és compatible. L'aplicació a la qual esteu intentant connectar-vos ha d'actualitzar a WalletConnect v2.", - "walletConnect.error.unsupportedV1.title": "Codi QR no vàlid", - "walletConnect.error.uwu.scan": "S'ha produït un problema en escanejar aquest codi QR.", - "walletConnect.error.uwu.title": "Error d'enllaç UwU", - "walletConnect.error.uwu.unsupported": "Aquest codi QR no és compatible.", - "walletConnect.pending.button.connect": "Connecta't", - "walletConnect.pending.button.reject": "Rebutja", - "walletConnect.pending.button.scrollDown": "Desplaceu-vos cap avall per connectar-vos", - "walletConnect.pending.threat.confirmationText": "Entenc els riscos", - "walletConnect.pending.threat.description": "Signar missatges o transaccions des d'aquesta aplicació podria provocar una pèrdua de fons.", - "walletConnect.pending.threat.title": "Aplicació maliciosa detectada", - "walletConnect.pending.title": "Connecta't a {{dappName}}", - "walletConnect.pending.unverified.description": "Assegureu-vos de confiar en aquest lloc abans de continuar. ", - "walletConnect.pending.unverified.title": "Aplicació no verificada", - "walletConnect.permissions.option.requestApprovals": "Sol·licitar aprovacions de transaccions", - "walletConnect.permissions.option.transferAssets": "Move funds without permission", - "walletConnect.permissions.option.viewTokenBalances": "View your balance and activity", - "walletConnect.permissions.title": "App permissions", - "walletConnect.request.bundledTransactions.label_one": "Transacció agrupada única", - "walletConnect.request.bundledTransactions.label_other": "{{count}} transaccions agrupades", - "walletConnect.request.button.scrollDown": "Desplaceu-vos cap avall per signar", - "walletConnect.request.button.sign": "Signe", - "walletConnect.request.details.label.function": "Funció", - "walletConnect.request.details.label.sending": "Enviament", - "walletConnect.request.details.label.token": "Token", - "walletConnect.request.details.label.tokens": "Fitxes", - "walletConnect.request.error.insufficientFunds": "No tens prou {{currencySymbol}} per completar aquesta transacció.", - "walletConnect.request.error.network": "Error de connexió a Internet o a la xarxa", - "walletConnect.request.warning.batch.message": "Aneu amb compte: aquesta sol·licitud conté diverses transaccions i podria transferir actius", - "walletConnect.request.warning.general.message": "Aneu amb compte: aquest missatge pot transferir recursos", - "walletConnect.request.warning.message": "Per signar missatges o transaccions, haureu d'importar la frase de recuperació de la cartera.", - "walletConnect.request.warning.title": "Aquesta cartera està en mode de només visualització", - "web.explore.description": "Descobriu i investiga fitxes sobre {{network}}. Explora les millors piscines. Veure preus en temps real, volum de negociació, TVL, gràfics i dades de transaccions.", - "web.explore.title.pools": "Explora els millors grups a {{network}} a Uniswap", - "web.explore.title.tokens": "Explora les fitxes principals a {{network}} a Uniswap", - "web.explore.title.transactions": "Exploreu les principals transaccions a {{network}} a Uniswap" -} diff --git a/packages/uniswap/src/i18n/locales/translations/cs-CZ.json b/packages/uniswap/src/i18n/locales/translations/cs-CZ.json deleted file mode 100644 index 7a56b3008ec..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/cs-CZ.json +++ /dev/null @@ -1,2384 +0,0 @@ -{ - "account.authHeader.claimReward": "Získejte odměnu {{amount}}", - "account.cloud.backup.subtitle": "Do vašeho {{cloudProviderName}}je zálohováno několik frází pro obnovení.", - "account.cloud.backup.title": "Vyberte zálohu, kterou chcete obnovit", - "account.cloud.button.restore.android": "Obnovit z Disku Google", - "account.cloud.button.restore.ios": "Obnovit z iCloud", - "account.cloud.empty.description": "Zdá se, že jste nezazálohovali žádnou ze svých obnovovacích frází do {{cloudProviderName}}.", - "account.cloud.empty.title": "Bylo nalezeno 0 záloh", - "account.cloud.error.backup.message": "Import záloh se nezdařil kvůli nedostatku oprávnění, přerušení autorizace nebo kvůli chybě cloudu", - "account.cloud.error.backup.title": "Chyba při importu záloh", - "account.cloud.error.password.title": "Neplatné heslo. Prosím zkuste to znovu.", - "account.cloud.error.unavailable.button.cancel": "Teď ne", - "account.cloud.error.unavailable.button.settings": "Jdi do nastavení", - "account.cloud.error.unavailable.message.android": "Ověřte prosím, že jste přihlášeni k účtu Google s povoleným Diskem Google na tomto zařízení, a zkuste to znovu.", - "account.cloud.error.unavailable.message.ios": "Ověřte, zda jste na tomto zařízení přihlášeni k Apple ID s povoleným iCloud Drive, a zkuste to znovu.", - "account.cloud.error.unavailable.title.android": "Disk Google není k dispozici", - "account.cloud.error.unavailable.title.ios": "iCloud Drive není k dispozici", - "account.cloud.loading.title": "Vyhledávání záloh...", - "account.cloud.lockout.time.hours_one": "Příliš mnoho pokusů. Zkuste to znovu za 1 hodinu.", - "account.cloud.lockout.time.hours_other": "Příliš mnoho pokusů. Zkuste to znovu za {{count}} hodin.", - "account.cloud.lockout.time.minutes_one": "Příliš mnoho pokusů. Zkuste to znovu za 1 minutu.", - "account.cloud.lockout.time.minutes_other": "Příliš mnoho pokusů. Zkuste to znovu za {{count}} minut.", - "account.cloud.password.input": "Zadejte heslo", - "account.cloud.password.recoveryPhrase": "Místo toho zadejte svou frázi pro obnovení", - "account.cloud.password.subtitle": "Toto heslo je vyžadováno k obnovení zálohy fráze pro obnovení z {{cloudProviderName}}.", - "account.cloud.password.title": "Zadejte záložní heslo", - "account.drawer.gitVersion": "Verze: ", - "account.drawer.modal.body": "Bezpečně ukládejte a vyměňujte tokeny pomocí aplikace Uniswap. K dispozici pro iOS a Android.", - "account.drawer.modal.dont": "Nemáte Uniswap peněženku?", - "account.drawer.modal.scan": "Skenujte pomocí Uniswap Wallet", - "account.drawer.spamToggle": "Skryjte neznámé tokeny a NFT", - "account.porfolio.activity.cancelledBelow": "Tato objednávka byla zrušena, protože váš zůstatek klesl pod vstupní částku.", - "account.portfolio.activity.signLimit": "Tato objednávka nebude vyřízena, protože váš zůstatek klesl pod vstupní částku. Chcete-li opravit, zvyšte svůj zůstatek.", - "account.recoveryPhrase.education.part1": "Fráze pro obnovení (nebo počáteční fráze) je sada slov požadovaných pro přístup k vaší peněžence, jako heslo.", - "account.recoveryPhrase.education.part2": "Můžete zadat svou frázi pro obnovení na novém zařízení a obnovit tak svou peněženku a její obsah.", - "account.recoveryPhrase.education.part3": "Pokud ale ztratíte frázi pro obnovení, ztratíte přístup ke své peněžence.", - "account.recoveryPhrase.education.part4": "Místo toho, abyste si zapamatovali frázi pro obnovení, můžete ji zálohovat na {{cloudProviderName}} a chránit ji heslem.", - "account.recoveryPhrase.education.part5": "Svou frázi pro obnovení můžete také ručně zálohovat tak, že si ji zapíšete a uložíte ji na bezpečné místo.", - "account.recoveryPhrase.education.part6": "Doporučujeme používat oba typy záloh, protože pokud ztratíte frázi pro obnovení, nebudete moci obnovit svou peněženku.", - "account.recoveryPhrase.error.invalid": "Neplatná fráze", - "account.recoveryPhrase.error.invalidWord": "Neplatné slovo: {{word}}", - "account.recoveryPhrase.error.phraseLength": "Fráze pro obnovení musí mít 12–24 slov", - "account.recoveryPhrase.error.wrong": "Špatná fráze pro obnovení", - "account.recoveryPhrase.helpText.import": "Jak najdu svou frázi pro obnovení?", - "account.recoveryPhrase.helpText.restoring": "Zkuste hledat znovu", - "account.recoveryPhrase.input": "Zadejte frázi pro obnovení", - "account.recoveryPhrase.remove.final.description": "Ujistěte se, že jste si svou frázi pro obnovení zapsali nebo ji zálohovali na {{cloudProviderName}}. Jinak se ke svým prostředkům nedostanete.", - "account.recoveryPhrase.remove.final.title": "Odstraňujete frázi pro obnovení ", - "account.recoveryPhrase.remove.import.description": "Najednou můžete uložit pouze jednu frázi pro obnovení. Chcete-li pokračovat v importu nového, budete muset z tohoto zařízení odstranit aktuální frázi pro obnovení a všechny související peněženky.", - "account.recoveryPhrase.remove.initial.description": "Tím z tohoto zařízení odstraníte svou peněženku spolu s vaší frází pro obnovení.", - "account.recoveryPhrase.remove.initial.title": "Odebíráte {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "Sdílí stejnou frázi obnovení jako {{walletNames, list}}. Vaše fráze pro obnovení zůstane uložena, dokud nesmažete všechny zbývající peněženky.", - "account.recoveryPhrase.subtitle.import": "Vaše fráze pro obnovení bude uložena pouze lokálně ve vašem zařízení.", - "account.recoveryPhrase.subtitle.restoring": "Níže zadejte frázi pro obnovení nebo zkuste znovu vyhledat zálohy.", - "account.recoveryPhrase.title.import": "Zadejte frázi pro obnovení", - "account.recoveryPhrase.title.restoring": "Nebyly nalezeny žádné zálohy", - "account.transactionSummary.addLiquidity": "Přidejte {{baseSymbol}}/{{quoteSymbol}} V3 likviditu", - "account.transactionSummary.addLiquidityv2": "Přidejte a do Uniswap V2", - "account.transactionSummary.approve": "Schválit {{tokenSymbol}}", - "account.transactionSummary.claimFor": "Nárokujte za {{username}}", - "account.transactionSummary.claimReward": "Získejte odměnu UNI za {{username}}", - "account.transactionSummary.collectFees": "Sbírejte poplatky {{symbol0}}/{{symbol1}}", - "account.transactionSummary.createAddLiquidity": "Vytvořte skupinu a přidejte {{baseSymbol}}/{{quoteSymbol}} V3 likviditu", - "account.transactionSummary.createPool": "Vytvořte {{baseSymbol}}/{{quoteSymbol}} V3 fond", - "account.transactionSummary.decision.abstain": "Hlasujte pro zdržení se hlasování o návrhu {{proposalKey}} s důvodem "{{reason}}"", - "account.transactionSummary.decision.against": "Hlasujte proti návrhu {{proposalKey}} s důvodem "{{reason}}"", - "account.transactionSummary.decision.for": "Hlasujte pro návrh {{proposalKey}} s důvodem "{{reason: info.reason}}"", - "account.transactionSummary.delegateSummary": "Delegujte hlasovací právo na {{username}}", - "account.transactionSummary.depositLiquidity": "Likvidita vkladů", - "account.transactionSummary.executeProposal": "Provést návrh {{proposalKey}}.", - "account.transactionSummary.migrateLiquidity": "Migrujte {{baseSymbol}}/{{quoteSymbol}} likviditu do V3", - "account.transactionSummary.queueProposal": "Návrh fronty {{proposalKey}}.", - "account.transactionSummary.removeLiquiditySummary": "Odeberte a ", - "account.transactionSummary.revoke": "Zrušit {{tokenSymbol}}", - "account.transactionSummary.sendSummary": "Odesláno uživateli {{recipient}}", - "account.transactionSummary.submitProposal": "Odeslat nový návrh", - "account.transactionSummary.swapExactIn": "Vyměňte přesně za ", - "account.transactionSummary.swapExactOut": "Vyměňte za přesně ", - "account.transactionSummary.unwrapTo": "Rozbalte na {{symbol}}", - "account.transactionSummary.vote.abstain": "Hlasujte pro zdržení se hlasování o návrhu {{proposalKey}}", - "account.transactionSummary.vote.against": "Hlasujte proti návrhu {{proposalKey}}", - "account.transactionSummary.vote.for": "Hlasujte pro návrh {{proposalKey}}", - "account.transactionSummary.withdrawLiquidity": "Vybrat uloženou likviditu", - "account.transactionSummary.wrapTo": "Zabalte do {{symbol}}", - "account.wallet.action.copy": "Zkopírujte adresu peněženky", - "account.wallet.action.report": "Nahlásit profil", - "account.wallet.action.settings": "Nastavení peněženky", - "account.wallet.action.viewExplorer": "Zobrazit na {{blockExplorerName}}", - "account.wallet.button.add": "Přidat peněženku", - "account.wallet.button.addViewOnly": "Přidejte peněženku pouze pro zobrazení", - "account.wallet.button.create": "Vytvořte novou peněženku", - "account.wallet.button.import": "Importujte novou peněženku", - "account.wallet.button.manage": "Spravovat peněženku", - "account.wallet.button.remove": "Odstraňte peněženku", - "account.wallet.button.restore": "Obnovit peněženku", - "account.wallet.button.watch": "Sledujte peněženku", - "account.wallet.create.placeholder": "Peněženka {{index}}", - "account.wallet.edit.label.input.placeholder": "Štítek peněženky", - "account.wallet.header.button.disabled.title": "Upravit profil", - "account.wallet.header.button.title": "Upravit štítek", - "account.wallet.header.other": "Vaše další peněženky", - "account.wallet.header.viewOnly": "Peněženky pouze pro prohlížení", - "account.wallet.menu.copy.title": "Zkopírujte adresu peněženky", - "account.wallet.menu.edit.title": "Upravit štítek", - "account.wallet.menu.remove.title": "Odstraňte peněženku", - "account.wallet.remove.check": "Zálohoval jsem svou frázi pro obnovení a chápu, že Uniswap Labs mi nemůže pomoci obnovit mé peněženky, pokud tak neučiním.", - "account.wallet.remove.title": "Odebrat {{name}}", - "account.wallet.remove.viewOnly": "Peněženky s možností zpětného zobrazení můžete vždy přidat zadáním adresy peněženky.", - "account.wallet.restore.description": "Protože používáte nové zařízení, budete muset obnovit svou frázi pro obnovení. To vám umožní vyměňovat a odesílat tokeny.", - "account.wallet.select.error": "Adresy se nepodařilo načíst", - "account.wallet.select.loading.subtitle": "Vaše peněženky se zobrazí níže.", - "account.wallet.select.loading.title": "Hledání peněženek", - "account.wallet.select.title_one_one": "Jedna peněženka nalezena", - "account.wallet.select.title_one_other": "Vyberte peněženky k importu", - "account.wallet.viewOnly.button": "Import peněženky", - "account.wallet.viewOnly.description": "Chcete-li vyměnit, koupit, odeslat a přijmout tokeny, musíte importovat frázi pro obnovení této peněženky.", - "account.wallet.viewOnly.title": "Tato peněženka je pouze pro prohlížení", - "account.wallet.watch.error.alreadyImported": "Tato adresa je již importována", - "account.wallet.watch.error.notFound": "Adresa nenalezena", - "account.wallet.watch.error.smartContract": "Adresa je chytrá smlouva", - "account.wallet.watch.message": "Přidání peněženky pouze pro zobrazení vám umožní vyzkoušet aplikaci nebo sledovat peněženku. Nebudete moci swapovat nebo posílat prostředky.", - "account.wallet.watch.placeholder": "ENS nebo adresa", - "account.wallet.watch.title": "Zadejte adresu peněženky", - "activity.pending": "{{pendingActivityCount}} Čeká na vyřízení", - "activity.transaction.receive.descriptor": "{{amountWithSymbol}} z {{walletAddress}}", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} až {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} pro {{amountWithSymbolB}}", - "activity.transaction.swap.descriptor.formatted": " pro ", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} a {{amountWithSymbolB}}", - "activity.transaction.tokens.descriptor.formatted": " a ", - "addLiquidity.shareOfPool": "Podíl bazénu", - "addressInput.recipient": "Příjemce", - "analytics.allow": "Povolit analýzu", - "analytics.allow.message": "Anonymizovaná data používáme k vylepšení vaší zkušenosti s produkty Uniswap Labs.", - "appRating.button.notReally": "Spíš ne", - "appRating.description": "Dejte nám vědět, zda máte s touto aplikací dobré zkušenosti", - "appRating.extension.review.description": "Vyberte hodnocení hvězdičkami a zanechte recenzi v Internetovém obchodě Chrome.", - "appRating.extension.review.title": "Zkontrolovat rozšíření Uniswap?", - "appRating.extension.title": "Líbí se vám rozšíření Uniswap?", - "appRating.feedback.button.send": "Poslat zpětnou vazbu", - "appRating.feedback.description": "Dejte nám vědět, jak můžeme zlepšit vaši zkušenost", - "appRating.feedback.title": "To nás mrzí.", - "appRating.mobile.title": "Líbí se vám Uniswap Wallet?", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "burn.input.enterAPercent.error": "Zadejte procento", - "chart.candlestick": "Svícen", - "chart.error.pools": "Nelze zobrazit historická data pro aktuální fond.", - "chart.error.tokens": "Nelze zobrazit historická data pro aktuální token.", - "chart.line": "Spojnicový graf", - "chart.missingData": "Chybí data grafu", - "chart.price.label.close": "Zavřít", - "chart.price.label.high": "Vysoký", - "chart.price.label.low": "Nízký", - "chart.price.label.open": "OTEVŘENO", - "chart.settings.unavailable.label": "Toto nastavení není pro aktuální graf k dispozici", - "claim.thanks": "Děkujeme, že jste součástí komunity Uniswap ", - "claim.uni.arrived": "UNI dorazila", - "common.accept": "Akceptovat", - "common.activity": "Aktivita", - "common.add.label": "Přidat", - "common.add.liquidity.cancelled": "Přidání likvidity zrušeno", - "common.add.liquidity.failed": "Přidání likvidity se nezdařilo", - "common.add.v2.liquidity.cancelled": "Přidání likvidity V2 zrušeno", - "common.add.v2.liquidity.failed": "Přidání likvidity V2 se nezdařilo", - "common.added.liquidity": "Přidaná likvidita", - "common.added.v2.liquidity": "Přidána likvidita V2", - "common.addedLiquidity": "Přidána likvidita", - "common.adding.liquidity": "Přidání likvidity", - "common.adding.v2.liquidity": "Přidání likvidity V2", - "common.addLiquidity": "Přidejte likviditu", - "common.addressOrENS": "Adresa peněženky nebo název ENS", - "common.advanced": "Moderní", - "common.all": "Vše", - "common.allTime": "Pořád", - "common.amount.label": "Množství", - "common.amountDeposited.label": "{{amount}} Vloženo", - "common.and": "a", - "common.app": "Aplikace", - "common.approval.cancelled": "Schválení zrušeno", - "common.approval.failed": "Schválení se nezdařilo", - "common.approve": "Schvalovat", - "common.approved": "Schválený", - "common.approvePending": "Čeká se na schválení...", - "common.approveSpend": "Schválit {{symbol}} výdaje", - "common.approving": "Schvalování", - "common.areYouSure": "Jsi si jistá?", - "common.automatic": "Auto", - "common.availableIn": "Uniswap dostupný v: ", - "common.availableOnIOSAndroid": "K dispozici pro iOS a Android", - "common.availableOnIOSAndroidChrome": "K dispozici pro iOS, Android a Chrome", - "common.backToPositions": "Zpět na pozice", - "common.blocked.ifError": "Pokud se domníváte, že se jedná o chybu, zašlete prosím e-mail s vaší adresou na adresu ", - "common.blocked.reason": "Tato adresa je v rozhraní Uniswap Labs blokována, protože je spojena s jednou nebo více blokovanými aktivitami.", - "common.blockedAddress": "Blokovaná adresa", - "common.blog": "Blog", - "common.borrow.cancelled": "Půjčka zrušena", - "common.borrow.failed": "Půjčka se nezdařila", - "common.borrowed": "Půjčeno", - "common.borrowing": "Půjčování", - "common.bought": "Koupeno", - "common.brandAssets": "Podklady značky", - "common.burn.cancelled": "Vypalování zrušeno", - "common.burn.failed": "Vypálení se nezdařilo", - "common.burned": "Spálený", - "common.burning": "Hořící", - "common.button.accept": "Akceptovat", - "common.button.back": "Zadní", - "common.button.buy": "Koupit", - "common.button.cancel": "zrušení", - "common.button.checkin": "Přihlaste se", - "common.button.close": "Zavřít", - "common.button.confirm": "Potvrdit", - "common.button.connect": "Připojit", - "common.button.continue": "Pokračovat", - "common.button.copied": "Zkopírováno", - "common.button.copy": "kopírovat", - "common.button.create": "Vytvořit", - "common.button.delete": "Vymazat", - "common.button.disconnect": "Odpojit", - "common.button.dismiss": "Zavrhnout", - "common.button.done": "Hotovo", - "common.button.edit": "Upravit", - "common.button.enable": "Umožnit", - "common.button.finish": "Dokončit", - "common.button.goBack": "Vraťte se", - "common.button.later": "Možná později", - "common.button.learn": "Zjistěte více", - "common.button.next": "další", - "common.button.notNow": "Teď ne", - "common.button.ok": "OK", - "common.button.paste": "Vložit", - "common.button.pay": "Platit", - "common.button.receive": "Dostávat", - "common.button.remove": "Odstranit", - "common.button.reset": "Resetovat", - "common.button.restore": "Obnovit", - "common.button.retry": "Zkuste to znovu", - "common.button.reveal": "Odhalit", - "common.button.review": "Posouzení", - "common.button.save": "Uložit", - "common.button.scrollDown": "Posunout dolů", - "common.button.sell": "Prodat", - "common.button.send": "Poslat", - "common.button.setup": "Založit", - "common.button.share": "Podíl", - "common.button.showLess": "Ukaž méně", - "common.button.showMore": "Zobrazit více", - "common.button.sign": "Podepsat", - "common.button.skip": "Přeskočit", - "common.button.swap": "Vyměňte", - "common.button.tryAgain": "Zkus to znovu", - "common.button.understand": "Chápu", - "common.button.view": "Pohled", - "common.button.viewDetails": "Zobrazit podrobnosti", - "common.button.yes": "Ano", - "common.buy.cancelled": "Nákup zrušen", - "common.buy.failed": "Nákup se nezdařil", - "common.buy.label": "Koupit", - "common.buyAndSell": "Nakupujte a prodávejte na Uniswapu", - "common.buying": "Nákup", - "common.by": "Podle", - "common.cancel.failed": "Zrušení se nezdařilo", - "common.cancellation.cancelled": "Zrušení zrušeno", - "common.cancellationSubmitted": "Storno odesláno", - "common.cancellationSuccessful": "Zrušení bylo úspěšné", - "common.cancelled": "Zrušeno", - "common.cancelling": "Probíhá zrušení", - "common.cancelOrder": "Zrušit objednávku", - "common.card.error.description": "Něco se pokazilo", - "common.card.error.title": "Jejda! Něco se pokazilo.", - "common.careers": "Kariéra", - "common.chartType": "Typ grafu", - "common.checkNetwork": "Zde zkontrolujte stav sítě .", - "common.chromeExtension": "Rozšíření", - "common.claim.cancelled": "Reklamace zrušena", - "common.claim.failed": "Reklamace se nezdařila", - "common.claimed": "Nárokováno", - "common.claiming": "Nárokování", - "common.claimUnis": "Získejte své UNI tokeny", - "common.clear": "Jasný", - "common.close": "Zavřít", - "common.closed": "ZAVŘENO", - "common.collect.button": "Sbírat", - "common.collect.fees.cancelled": "Výběr poplatků zrušen", - "common.collect.fees.failed": "Výběr poplatků se nezdařil", - "common.collected.fees": "Vybrané poplatky", - "common.collecting.fees": "Vybírání poplatků", - "common.company": "Společnost", - "common.confirm": "Potvrdit", - "common.confirmCancellation": "Potvrďte zrušení", - "common.confirmSend.button": "Potvrďte odeslání", - "common.confirmSwap": "Potvrďte swap v peněžence", - "common.confirmTimedOut": "Vypršel časový limit potvrzení. Zkuste to znovu.", - "common.confirmTransaction.button": "Potvrďte tuto transakci ve své peněžence", - "common.confirmWallet": "Potvrďte v peněžence", - "common.connect.button": "Připojit", - "common.connectAWallet.button": "Připojte peněženku", - "common.connectingWallet": "Připojování peněženky...", - "common.connectWallet.button": "Připojte peněženku", - "common.contactUs.button": "Kontaktujte nás", - "common.contractInteraction": "Interakce se smlouvou", - "common.copied": "Zkopírováno", - "common.copy.address": "Zkopírujte adresu", - "common.copyLink.button": "Kopírovat odkaz", - "common.create": "Vytvořit", - "common.create.pool.cancelled": "Vytvoření fondu bylo zrušeno", - "common.create.pool.failed": "Vytvoření fondu se nezdařilo", - "common.created.pool": "Vytvořený bazén", - "common.creating.pool": "Vytváření bazénu", - "common.currency": "Měna", - "common.currentPrice": "Aktuální cena", - "common.currentPrice.label": "Aktuální cena:", - "common.currentPrice.unavailable": "Aktuální cena není k dispozici", - "common.custom": "Zvyk", - "common.customRange": "Vlastní rozsah", - "common.dataOutdated": "Data mohou být zastaralá", - "common.default": "Výchozí", - "common.defaultTradeOptions": "Výchozí obchodní možnosti", - "common.delegate.cancelled": "Delegace zrušena", - "common.delegate.failed": "Delegát selhal", - "common.delegated": "Delegovaný", - "common.delegating": "Delegování", - "common.deploy.cancelled": "Nasazení zrušeno", - "common.deploy.failed": "Nasazení se nezdařilo", - "common.deployed": "Nasazeno", - "common.deploying": "Nasazení", - "common.deposit.cancelled": "Vklad zrušen", - "common.deposit.failed": "Vklad se nezdařil", - "common.deposit.toNetwork": "Vložte tokeny do sítě {{label}} .", - "common.deposited": "Uloženo", - "common.depositing": "Ukládání", - "common.depositTokens": "Vkladové tokeny", - "common.detailed.label": "Detailní", - "common.detected": "Zjištěno", - "common.developers": "Vývojáři", - "common.dismiss": "Zavrhnout", - "common.displaySettings": "Nastavení obrazovky", - "common.dnsRegistrar": "Registrátor DNS", - "common.donate": "Darovat", - "common.dontShowAgain": "Už to nezobrazovat", - "common.download": "Stažení", - "common.downloadAppStore": "Stáhněte si v App Store", - "common.downloadPlayStore": "Stáhnout v Obchodě Play", - "common.downloadUniswap": "Stáhněte si Uniswap", - "common.downloadUniswapApp": "Stáhněte si aplikaci Uniswap", - "common.dynamic": "Dynamický", - "common.edit.button": "Upravit", - "common.error.general": "Něco se pokazilo", - "common.error.label": "Chyba", - "common.error.request": "Omlouváme se, při zpracování vašeho požadavku došlo k chybě. Pokud požadujete podporu, nezapomeňte zkopírovat podrobnosti o této chybě.", - "common.error.somethingWrong": "Něco se pokazilo!", - "common.error.wrong.tryAgain": "Něco se pokazilo. Prosím zkuste to znovu.", - "common.errorConnecting.error": "Chyba při připojování", - "common.errorLoadingData.error": "Chyba při načítání dat", - "common.ethereumNameService": "Ethereum Name Service", - "common.etherscan": "Etherscan", - "common.etherscan.link": "Zobrazit na Etherscan", - "common.ethRegistrarController": "Registrátor ETH", - "common.execute.cancelled": "Provedení zrušeno", - "common.execute.failed": "Provedení se nezdařilo", - "common.executed": "Popraven", - "common.executing": "Provádění", - "common.expired": "Platnost vypršela", - "common.expiry": "Uplynutí", - "common.explore": "Prozkoumat", - "common.explorer": "Badatel", - "common.exploreTokens": "Prozkoumejte tokeny", - "common.extension": "Uniswap rozšíření", - "common.failed.error": "Nepodařilo se", - "common.failedSwitchNetwork": "Přepnutí sítí se nezdařilo", - "common.fee": "Poplatek", - "common.fees": "Poplatky", - "common.feesEarned.label": "{{symbol}} Získané poplatky:", - "common.feesEarnedPerBase": "{{symbolA}} za {{symbolB}}", - "common.fetchingRoute": "Načítání trasy", - "common.floor": "Podlaha", - "common.floorPrice": "Podlahová cena", - "common.for": "Pro", - "common.fullRange": "Plný rozsah", - "common.getApp": "Získejte aplikaci", - "common.getHelp.button": "Získejte pomoc", - "common.getStarted": "Začněte", - "common.getSupport.button": "Dostat podporu", - "common.getTheApp": "Získat aplikaci", - "common.getUniswapWallet": "Získejte Uniswap Wallet", - "common.governance": "Vládnutí", - "common.happyHolidays": "Veselé svátky od týmu Uniswap!", - "common.helpCenter": "Centrum nápovědy", - "common.hidden": "Skrytý", - "common.hide.button": "Skrýt", - "common.highPrice": "Vysoká cena", - "common.includes": "Zahrnuje", - "common.info.label": "Info", - "common.input.noRecipient.error": "Vyberte příjemce", - "common.input.password.confirm": "Potvrďte heslo", - "common.input.password.error.mismatch": "Hesla se neshodují", - "common.input.password.error.weak": "Toto heslo je příliš slabé", - "common.input.password.new": "Nové heslo", - "common.input.password.placeholder": "Heslo", - "common.input.password.strength.medium": "Střední", - "common.input.password.strength.strong": "Silný", - "common.input.password.strength.weak": "Slabý", - "common.input.search": "Vyhledávání", - "common.insufficient.funds": "Nedostatečné finanční prostředky", - "common.insufficientBalance.error": "Nedostatečná rovnováha", - "common.insufficientFundsForNetworkFee.error": "Nedostatek finančních prostředků na pokrytí síťových nákladů", - "common.insufficientLiquidity": "Nedostatečná likvidita", - "common.insufficientTokenBalance.error": "Nedostatečný zůstatek {{tokenSymbol}}", - "common.insufficientTokenBalance.error.simple": "Nedostatečné {{tokenSymbol}}", - "common.invalidPair": "Neplatný pár", - "common.invalidRecipient.error": "Neplatný příjemce", - "common.iOSAndroid": "iOS a Android", - "common.language": "Jazyk", - "common.lastPrice": "Poslední cena", - "common.learnMoreSwap": "Zjistěte více o swapech", - "common.legalAndPrivacy": "Právní otázky a soukromí", - "common.less": "Méně", - "common.limit.cancel_one": "Zrušit limit", - "common.limit.cancel_other": "Zrušte limity {{count}}", - "common.limit.cancelled": "Limit zrušen", - "common.limit.executed": "Limit byl proveden", - "common.limit.expired": "Limit vypršel", - "common.limit.failed": "Limit se nezdařil", - "common.limit.opened": "Limit otevřen", - "common.limit.pending": "Limit čeká na vyřízení", - "common.limits": "Limity", - "common.limits.approachMax": "Blíží se maximální limit 100", - "common.limits.cancelProceed": "Chcete-li pokračovat, zrušte limity", - "common.limits.expires": "Platnost vyprší {{timestamp}}", - "common.limits.open": "Otevřené limity", - "common.limits.when": "když {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "Odkazy", - "common.liquidity": "Likvidita", - "common.liquidity.removed": "Likvidita odstraněna", - "common.loading": "načítání", - "common.loadingAllowance": "Přídavek na zatížení", - "common.loadMore": "Načíst více", - "common.longText.button.less": "Méně čtěte", - "common.longText.button.more": "Přečtěte si více", - "common.lowPrice": "Nízká cena", - "common.manage": "Spravovat", - "common.market.label": "Trh", - "common.max": "Max", - "common.migrate": "Migrovat", - "common.migrate.liquidity.cancelled": "Migrace likvidity zrušena", - "common.migrate.liquidity.failed": "Migrace likvidity selhala", - "common.migrate.position": "Migrovat pozici", - "common.migrate.v3": "Migrujte na V3", - "common.migrated.liquidity": "Migrovaná likvidita", - "common.migrating.liquidity": "Migrace likvidity", - "common.min": "Min", - "common.mint.cancelled": "Mincovna zrušena", - "common.mint.failed": "Mincovna selhala", - "common.minted": "Ražené", - "common.minting": "Ražba", - "common.mobile": "Mobilní", - "common.more": "Více", - "common.multiDevice": "Více zařízení", - "common.navigation.settings": "Nastavení", - "common.navigation.systemSettings": "Nastavení", - "common.navigationButton": "Navigační tlačítko", - "common.needHelp": "Potřebovat pomoc?", - "common.networkCost": "Náklady na síť", - "common.neverMind": "Nevadí", - "common.new": "Nový", - "common.new.exclamation": "Nový!", - "common.nfts": "NFT", - "common.noActivity": "Zatím žádná aktivita", - "common.noAmount.error": "Zadejte částku", - "common.noData": "Žádná data", - "common.noResults": "Nebyly nalezeny žádné výsledky.", - "common.notAvailableInRegion.error": "Není k dispozici ve vaší oblasti", - "common.notCreated.label": "Nevytvořeno", - "common.notSupported": "Není podporováno", - "common.oneDay": "1 den", - "common.oneHour": "1 hodina", - "common.oneMonth": "1 měsíc", - "common.oneWeek": "1 týden", - "common.oneYear": "1 rok", - "common.orderCancelled": "Objednávka zrušena", - "common.orderExecuted": "Objednávka provedena", - "common.orderExpired": "Platnost objednávky vypršela", - "common.orderPending": "Objednávka čeká na vyřízení", - "common.outOfRange": "Mimo dosah", - "common.pageNotFound": "Stránka nenalezena!", - "common.passkey": "Přístupový klíč", - "common.pastDay": "Minulý den", - "common.pastFiveMinutes": "Posledních pět minut", - "common.pastHour": "Poslední hodina", - "common.pastMonth": "Minulý měsíc", - "common.pastWeek": "Minulý týden", - "common.pastYear": "Minulý rok", - "common.pay.button": "Platit", - "common.pending": "čekající", - "common.pending.cancellation": "Čeká na zrušení", - "common.pendingEllipsis": "Čekající...", - "common.permit2": "Povolení2", - "common.pool": "Bazén", - "common.pools": "Bazény", - "common.positionUnavailable": "Pozice není k dispozici", - "common.poweredBy": "Provozováno na ", - "common.preview": "Náhled", - "common.price": "Cena", - "common.priceImpact": "Upozornění na cenový dopad", - "common.priceUpdated": "Cena aktualizována", - "common.privacyChoices": "Vaše možnosti ochrany osobních údajů", - "common.privacyChoices.checkbox.description": "Po zaškrtnutí nebudeme vaše údaje sdílet s partnery třetích stran pro personalizovanou reklamu. Sdílení můžete kdykoli povolit zrušením zaškrtnutí tohoto políčka.", - "common.privacyChoices.checkbox.label": "Nesdílejte mé informace", - "common.privacyChoices.description": "Můžeme sdílet identifikátory zařízení s našimi reklamními partnery za účelem propagace našich služeb na jiných webech a platformách. Pokud se to podle platných zákonů kvalifikuje jako prodej, sdílení nebo cílená reklama, můžete se odhlásit zaškrtnutím políčka „nesdílet moje údaje“. Další informace o našich postupech ochrany osobních údajů naleznete v našich Zásadách ochrany osobních údajů.", - "common.privacyChoices.disclaimer": "Upozorňujeme, že váš výběr bude platit pouze pro tento prohlížeč v tomto zařízení. Můžete se také odhlásit povolením nastavení Global Privacy Control v prohlížeči, který používáte pro přístup k našim službám. Chcete-li zobrazit další možnosti, přejděte do nastavení.", - "common.privacyPolicy": "Zásady ochrany osobních údajů", - "common.proceed": "Pokračovat", - "common.proceedInWallet": "Pokračujte ve své peněžence", - "common.proceedInWallet.short": "Pokračujte v peněžence", - "common.protocol": "Protokol", - "common.publicResolver": "Veřejný řešitel", - "common.purchased": "Zakoupeno", - "common.queue.cancelled": "Fronta zrušena", - "common.queue.failed": "Fronta se nezdařila", - "common.queued": "Ve frontě", - "common.queuing": "Zařazení do fronty", - "common.rate": "Hodnotit", - "common.readMore": "Přečtěte si více", - "common.receive": "Dostávat", - "common.receive.cancelled": "Příjem zrušen", - "common.receive.failed": "Příjem se nezdařil", - "common.received": "Přijato", - "common.receiving": "Příjem", - "common.recent": "Nedávné", - "common.rejected": "Odmítnuto", - "common.reload.label": "Znovu načtěte aplikaci", - "common.remove.label": "Odstranit", - "common.remove.liquidity.cancelled": "Odstraňte likviditu zrušena", - "common.remove.liquidity.failed": "Odebrání likvidity se nezdařilo", - "common.removeAmount": "Odebrat množství", - "common.removedLiquidity": "Odstraněná likvidita", - "common.removeItem": "Odebrat položku", - "common.removing.liquidity": "Odstranění likvidity", - "common.repaid": "Splaceno", - "common.repay.cancelled": "Splácení zrušeno", - "common.repay.failed": "Splácení se nezdařilo", - "common.repaying": "Splácení", - "common.resetLimit": "Resetovat limit {{symbol}}", - "common.resetLimitWallet": "Resetujte limit {{symbol}} v peněžence", - "common.resettingLimit": "Resetování limitu {{symbol}} ...", - "common.resolveIssues_one": "Vyřešte problém", - "common.resolveIssues_other": "Vyřešte {{count}} problémů", - "common.restricted.region": "Omezený region", - "common.return.label": "Vrátit se", - "common.returnToTop": "Návrat nahoru", - "common.reverseRegistrar": "Zpětný registrátor", - "common.revoke.approval.failed": "Zrušení schválení se nezdařilo", - "common.revoked.approval": "Odvoláno schválení", - "common.revokedApproval": "Zrušené schválení", - "common.revoking.approval": "Odvolání schválení", - "common.samePrice": "Stejná cena", - "common.scanQRDownload": "Ke stažení naskenujte QR kód pomocí telefonu", - "common.selectRegion.label": "Vyberte svůj region", - "common.selectToken.label": "Vyberte token", - "common.selfCustodial": "Samovazba", - "common.sell.label": "Prodat", - "common.send.button": "Poslat", - "common.send.cancelled": "Odeslání zrušeno", - "common.send.failed": "Odeslání se nezdařilo", - "common.sending": "Odesílání", - "common.sent": "Odesláno", - "common.settings": "Nastavení", - "common.share": "Podíl", - "common.share.shareToTwitter": "Sdílejte na Twitteru", - "common.share.twitter": "Sdílejte na Twitteru", - "common.show.button": "Ukázat", - "common.showLess.button": "Ukaž méně", - "common.showMore.button": "Zobrazit více", - "common.signatureExpired": "Platnost vašeho podpisu vypršela.", - "common.signMessage": "Podepsat zprávu", - "common.signMessageWallet": "Podepsat zprávu v peněžence", - "common.simple.label": "Jednoduchý", - "common.sold": "Prodáno", - "common.stats": "Statistiky", - "common.status": "Postavení", - "common.stayConnected": "Zůstaň připojen", - "common.step.number": "Krok {{number}}", - "common.submit.proposal.cancelled": "Odeslání návrhu bylo zrušeno", - "common.submit.proposal.failed": "Odeslání návrhu se nezdařilo", - "common.submitted.proposal": "Podaný návrh", - "common.submitting.proposal": "Podání návrhu", - "common.success": "Úspěch", - "common.swap": "Vyměňte", - "common.swap.cancelled": "Výměna zrušena", - "common.swap.expired": "Platnost swapu vypršela", - "common.swap.failed": "Výměna se nezdařila", - "common.swapped": "Vyměněno", - "common.swapPending": "Čeká se na výměnu...", - "common.swapping": "Výměna", - "common.switchNetworks": "Přepnout sítě", - "common.termsOfService": "Podmínky služby", - "common.text.connected": "Připojeno", - "common.text.contract": "Smlouva", - "common.text.disconnected": "Odpojeno", - "common.text.error": "Chyba", - "common.text.notAvailable": "N/A", - "common.text.recipient": "Na", - "common.text.sender": "Z", - "common.text.unknown": "Neznámý", - "common.thisMonth": "Tento měsíc", - "common.thisWeek": "Tento týden", - "common.thisYear": "Tento rok", - "common.time": "Čas", - "common.time.days": "dní", - "common.time.days_one": "den", - "common.time.days_other": "dní", - "common.time.hours": "hodin", - "common.time.hours_one": "hodina", - "common.time.hours_other": "hodin", - "common.time.minute.amt": "{{time}}m", - "common.time.minutes": "minut", - "common.time.months": "měsíce", - "common.time.months_one": "měsíc", - "common.time.months_other": "měsíce", - "common.time.past.days": "Před {{days}}d", - "common.time.past.hours": "Před {{hours}}h", - "common.time.past.minutes": "Před {{minutes}}m", - "common.time.past.months": "{{months}}před měsícem", - "common.time.past.seconds": "Před {{seconds}}s", - "common.time.weeks": "týdnů", - "common.time.weeks_one": "týden", - "common.time.weeks_other": "týdnů", - "common.tip.label": "Spropitné:", - "common.to": "na", - "common.today": "Dnes", - "common.tokenA": "Token A", - "common.tokenAmount": "Tokenová částka", - "common.tokenB": "Token B", - "common.tokenName": "Název tokenu", - "common.tokens": "Tokeny", - "common.totalValueLocked": "TVL", - "common.trade": "Obchod", - "common.trademarkPolicy": "Zásady používání ochranných známek", - "common.transactionDetails": "Detaily transakce", - "common.transactionId": "ID transakce", - "common.transactionPending": "Transakce čeká na vyřízení", - "common.transactions": "Transakce", - "common.transactionSettings": "Nastavení transakcí", - "common.transactionSubmitted": "Transakce odeslána", - "common.transfer_one": "převod", - "common.transfer_other": "převody", - "common.tryAgain.error": "Zkus to znovu", - "common.twitter": "Cvrlikání", - "common.type.label": "Typ", - "common.unavailable": "Není k dispozici", - "common.uniGovernance": "Správa UNI", - "common.uniswapMobile": "Uniswap Mobile", - "common.uniswapProtocol": "Uniswap protokol", - "common.uniswapTVL": "Uniswap TVL", - "common.uniswapWallet": "Uniswap peněženka", - "common.uniswapX": "UniswapX", - "common.unknown": "Neznámý", - "common.unknownApproval": "Neznámé schválení", - "common.unknownBridge": "Neznámý most", - "common.unknownError.error": "Neznámá chyba", - "common.unknownLend": "Neznámá půjčka", - "common.unknownMint": "Neznámá mincovna", - "common.unknownSend": "Neznámé Odeslat", - "common.unknownSwap": "Neznámá výměna", - "common.unsupportedAsset_one": "Nepodporované dílo", - "common.unsupportedAsset_other": "Nepodporovaná aktiva", - "common.unwrap.button": "Rozbalit", - "common.unwrap.failed": "Rozbalení se nezdařilo", - "common.unwrapped": "Rozbalené", - "common.unwrapping": "Rozbalování", - "common.view.profile": "Zobrazit profil", - "common.viewOnBlockExplorer": "Zobrazit v Průzkumníku bloků", - "common.viewOnExplorer": "Zobrazit v Průzkumníku", - "common.volume": "Hlasitost", - "common.vote": "Hlasování", - "common.vote.cancelled": "Hlasování zrušeno", - "common.vote.failed": "Hlasování se nezdařilo", - "common.voted": "Hlasováno", - "common.voting": "Hlasování", - "common.wallet.approve": "Schválit v peněžence", - "common.wallet.label": "Peněženka", - "common.walletForSwapping": "Peněženka stvořená pro výměnu. K dispozici pro iOS a Android.", - "common.warning": "Varování", - "common.webApp": "Webová aplikace", - "common.website": "webová stránka", - "common.whyApprove": "Proč musím schvalovat token?", - "common.whySign": "Proč jsou vyžadovány podpisy?", - "common.whyWrap": "Proč musím zabalit svůj {{symbol}}?", - "common.withdraw.failed": "Výběr se nezdařil", - "common.withdrawal.amount": "Částka výběru", - "common.withdrawal.cancelled": "Výběr zrušen", - "common.withdrawing": "Odebírání", - "common.withdrew": "Stáhl se", - "common.withinRange": "V dosahu", - "common.wrap": "Zabalte {{symbol}}", - "common.wrap.button": "Zabalit", - "common.wrap.cancelled": "Zabalení zrušeno", - "common.wrap.failed": "Zabalení se nezdařilo", - "common.wrapIn": "Zabalte {{symbol}} do peněženky", - "common.wrapped": "Zabalené", - "common.wrapping": "Obal", - "common.wrappingToken": "Balení {{symbol}}...", - "common.wrongNetwork": "Špatná síť", - "common.your.account.had.insufficient.funds": "Váš účet neměl dostatek prostředků k dokončení této výměny.", - "common.your.account.has.insufficient.funds": "Na vašem účtu není dostatek prostředků k dokončení této výměny.", - "common.your.limit.could.not.be.fulfilled": "Váš limit se v tuto chvíli nepodařilo splnit. Prosím zkuste to znovu.", - "common.your.swap.could.not.be.fulfilled": "Váš swap nemohl být v tuto chvíli proveden. Prosím zkuste to znovu.", - "common.youreBuying": "Kupujete", - "common.youReceive": "Obdržíš", - "common.youreSending": "Ty posíláš", - "common.youWillReceive": "Obdržíte", - "currency.aud": "Australský dolar", - "currency.brl": "Brazilský Real", - "currency.cad": "Kanadský dolar", - "currency.cny": "Čínský jüan", - "currency.eur": "Euro", - "currency.gbp": "Britská libra", - "currency.hkd": "Hongkongský dolar", - "currency.idr": "Indonéská rupie", - "currency.inr": "indická rupie", - "currency.jpy": "japonský jen", - "currency.krw": "Jihokorejský won", - "currency.ngn": "Nigerijská Naira", - "currency.pkr": "Pákistánská rupie", - "currency.rub": "Ruský rubl", - "currency.sgd": "Singapurský dolar", - "currency.thb": "thajský baht", - "currency.try": "Turecká lira", - "currency.uah": "Ukrajinská hřivna", - "currency.usd": "Americký dolar", - "currency.vnd": "Vietnamský Dong", - "dapp.request.approve.action": "Schvalovat", - "dapp.request.approve.fallbackTitle": "Schvalte tento web pro přístup k tokenům", - "dapp.request.approve.helptext": "Povolit tomuto webu přístup a utratit tento token za transakce. Ujistěte se, že tomuto webu důvěřujete.", - "dapp.request.approve.label": "Peněženka", - "dapp.request.approve.title": "Schvalte přístup k {{tokenSymbol}}", - "dapp.request.base.title": "Žádost o transakci", - "dapp.request.bridge.description": "Přesuňte ETH, USDC a další přes {{numChains}}+ sítě.", - "dapp.request.bridge.title": "Snažíte se přemostit?", - "dapp.request.connect.helptext": "Umožněte tomuto webu zobrazit adresu vaší peněženky, zůstatek a požádat o schválení transakcí.", - "dapp.request.connect.title": "Připojte se k webu", - "dapp.request.fallback.calldata.label": "Nezpracovaná data", - "dapp.request.fallback.function.label": "Funkce", - "dapp.request.permit2.description": "Permit2 spravuje schvalování tokenů ve více aplikacích.", - "dapp.request.permit2.header": "Podepište povolení 2", - "dapp.request.reject.action": "Odmítnout vše", - "dapp.request.reject.info": "Máte {{totalRequestCount}} požadavků na transakce", - "dapp.request.revoke.action": "Zrušit", - "dapp.request.revoke.helptext": "Povolit tomuto webu zrušit přístup k útratě tohoto tokenu za transakce. Ujistěte se, že tomuto webu důvěřujete.", - "dapp.request.revoke.title": "Odebrat přístup k {{tokenSymbol}}", - "dapp.request.signature.containsUnrenderableCharacters": "Tato zpráva obsahuje nevykreslitelné znaky. Ujistěte se, že tomuto webu důvěřujete.", - "dapp.request.signature.error.712-spec-compliance": "SignTypedDataRequestContent přijatá data k podpisu, která nesplňují specifikaci EIP-712.", - "dapp.request.signature.header": "Žádost o podpis", - "dapp.request.signature.toggleDataView.raw": "Zobrazit nezpracovaná data", - "dapp.request.signature.toggleDataView.readable": "Zobrazit původní data", - "dapp.request.warning.notActive.message": "Ujistěte se, že je to ten pravý", - "dapp.request.warning.notActive.title": "Toto není vaše aktivní peněženka", - "downloadApp.modal.alreadyHaveWallet": "Už máte peněženku? ", - "downloadApp.modal.alreadyHaveWallet.signInLink": "Přihlaste se zde", - "downloadApp.modal.getStarted.description": "Začněte stažením peněženky Uniswap, která je k dispozici ve vašem telefonu nebo prohlížeči.", - "downloadApp.modal.getStarted.title": "Začněte s Uniswap", - "downloadApp.modal.signUp.description": "Začněte stažením peněženky Uniswap, která je k dispozici ve vašem telefonu nebo prohlížeči.", - "downloadApp.modal.signUp.description.embeddedWallet": "Začněte během několika sekund tím, že se níže zaregistrujete nebo si stáhnete naši peněženku, která je dostupná ve vašem telefonu nebo prohlížeči.", - "downloadApp.modal.signUp.title": "Zaregistrujte se pomocí Uniswap", - "downloadApp.modal.uniswapProducts.subtitle": "Uniswap produkty bezproblémově spolupracují a vytvářejí ten nejlepší onchain zážitek.", - "error.access.expiry": "To poskytuje přístup protokolu Uniswap k vašemu tokenu pro obchodování. Z bezpečnostních důvodů vyprší po 30 dnech.", - "error.dataUnavailable": "Data jsou v tuto chvíli nedostupná; pracujeme na opravě", - "error.id": "ID chyby: {{eventId}}", - "error.noData": "Nenalezena žádná data", - "error.request.provideId": "Omlouváme se, při zpracování vašeho požadavku došlo k chybě. Pokud požadujete podporu, nezapomeňte uvést své ID chyby.", - "error.tokenApproval": "Schválení tokenu se nezdařilo", - "error.tokenApprovalEdited": "Nedostatečná částka schválení", - "error.tokenApprovalEdited.message": "Schválená částka nastavená ve vaší peněžence je příliš nízká na dokončení této transakce. Zkuste to znovu a zvyšte částku.", - "errors.crash.message": "Něco se zhroutilo.", - "errors.crash.restart": "Restartujte aplikaci", - "errors.crash.title": "A jé!", - "explore.more.pools": "Prozkoumejte další bazény", - "explore.search.action.clear": "Jasný", - "explore.search.action.viewEtherscan": "Zobrazit na {{blockExplorerName}}", - "explore.search.empty.full": "Nebyly nalezeny žádné výsledky pro \"{{searchQuery}}\"", - "explore.search.error": "Výsledky vyhledávání se nepodařilo načíst", - "explore.search.label.ownedBy": "Vlastníkem {{ownerAddress}}", - "explore.search.placeholder": "Prohledejte tokeny a peněženky", - "explore.search.section.nft": "Sbírky NFT", - "explore.search.section.popularNFT": "Populární kolekce NFT", - "explore.search.section.popularTokenInfo": "Populární tokeny jsou identifikovány na základě jejich objemu obchodování na Uniswapu za posledních 24 hodin.", - "explore.search.section.popularTokens": "Populární tokeny", - "explore.search.section.recent": "Nedávná vyhledávání", - "explore.search.section.tokens": "Tokeny", - "explore.search.section.wallets": "Peněženky", - "explore.tokens.error": "Tokeny se nepodařilo načíst", - "explore.tokens.favorite.action.add": "Oblíbený token", - "explore.tokens.favorite.action.edit": "Upravit oblíbené", - "explore.tokens.favorite.action.remove": "Odebrat oblíbené", - "explore.tokens.favorite.title.default": "Oblíbené žetony", - "explore.tokens.favorite.title.edit": "Upravte oblíbené tokeny", - "explore.tokens.metadata.marketCap": "{{number}} MCap", - "explore.tokens.metadata.totalValueLocked": "{{number}} TVL", - "explore.tokens.metadata.volume": "{{number}} Sv", - "explore.tokens.sort.label.marketCap": "Tržní kapitalizace", - "explore.tokens.sort.label.priceDecrease": "Snížení ceny", - "explore.tokens.sort.label.priceIncrease": "Navýšení ceny", - "explore.tokens.sort.label.totalValueLocked": "TVL", - "explore.tokens.sort.label.volume": "Hlasitost", - "explore.tokens.sort.option.marketCap": "Tržní kapitalizace", - "explore.tokens.sort.option.priceDecrease": "Snížení ceny (24 hodin)", - "explore.tokens.sort.option.priceIncrease": "Zvýšení ceny (24 hodin)", - "explore.tokens.sort.option.totalValueLocked": "Uniswap TVL", - "explore.tokens.sort.option.volume": "Uniswap objem (24h)", - "explore.tokens.top.title": "Top tokeny", - "explore.unableToDisplayHistorical": "Nelze zobrazit historická data objemu pro aktuální řetězec.", - "explore.unableToDisplayHistoricalTVL": "Nelze zobrazit historická data TVL pro aktuální řetězec.", - "explore.uniVolume": "Uniswap svazek", - "explore.wallets.favorite.action.add": "Oblíbená peněženka", - "explore.wallets.favorite.action.edit": "Upravit oblíbené", - "explore.wallets.favorite.action.remove": "Odebrat oblíbené", - "explore.wallets.favorite.title.default": "Oblíbené peněženky", - "explore.wallets.favorite.title.edit": "Upravte oblíbené peněženky", - "extension.connection.networks": "sítě", - "extension.connection.popup": "Vaše peněženka není připojena k tomuto webu. Hledejte tlačítko „Připojit peněženku“ nebo „Přihlásit se“.", - "extension.connection.popup.trouble": "Máte potíže s připojením?", - "extension.connection.popupWithButton": "Vaše peněženka není připojena k tomuto webu.", - "extension.connection.titleConnected": "Připojeno", - "extension.connection.titleNotConnected": "Nepřipojený", - "extension.lock.button.forgot": "zapomenuté heslo?", - "extension.lock.button.reset": "Resetovat peněženku", - "extension.lock.button.submit": "Odemknout", - "extension.lock.password.error": "Špatné heslo. Zkus to znovu", - "extension.lock.password.reset.initial.description": "Uniswap nemůže pomoci obnovit vaše heslo. Musíte resetovat svou peněženku opětovným zadáním 12slovné fráze pro obnovení.", - "extension.lock.password.reset.initial.help": "Kde najdu svou frázi pro obnovení?", - "extension.lock.password.reset.initial.title": "Zapomenuté heslo", - "extension.lock.password.reset.speedbump.description": "Před resetováním peněženky se ujistěte, že máte svou 12slovou frázi pro obnovení. V opačném případě nebudete moci získat zpět své prostředky.", - "extension.lock.password.reset.speedbump.help": "Ztratil jsem frázi pro zotavení", - "extension.lock.password.reset.speedbump.title": "Než budete pokračovat", - "extension.lock.subtitle": "Pro odemknutí zadejte heslo", - "extension.lock.title": "Vítej zpět", - "extension.network.notSupported": "Nepodporovaná síť", - "extension.open": "Otevřete rozšíření Uniswap", - "extension.popup.chrome.button": "Otevřete rozšíření", - "extension.popup.chrome.description": "Dokončete tuto akci otevřením rozšíření Uniswap.", - "extension.popup.chrome.title": "Pokračujte v Uniswapu", - "extension.settings.password.enter.title": "Zadejte své současné heslo", - "extension.settings.password.error.wrong": "Špatné heslo", - "extension.settings.password.placeholder": "Aktuální heslo", - "extension.warning.storage.button": "Záloha", - "extension.warning.storage.message": "Nezapomeňte si zálohovat frázi pro obnovení, abyste neztratili přístup ke své peněžence a finančním prostředkům.", - "extension.warning.storage.title": "V prohlížeči dochází místo", - "fee.bestForExotic": "Nejlepší pro exotické páry.", - "fee.bestForMost": "Nejlepší pro většinu párů.", - "fee.bestForStablePairs": "Nejlepší pro stabilní páry.", - "fee.bestForVeryStable": "Nejlepší pro velmi stabilní páry.", - "fee.dynamic": "Dynamický poplatek", - "fee.percentEarned": "% získáte na poplatcích.", - "fee.selectPercent": "{{pct}}% vybrat", - "fee.selectPercentDescription": "{{pct}}% likvidity vybrané pro tuto úroveň", - "fee.tier": "Úroveň poplatků", - "fee.tier.create": "Vytvořte úroveň poplatků", - "fee.tier.create.button": "Vytvořte novou úroveň poplatků", - "fee.tier.create.description": "Vytvoření nové vrstvy bude inicializovat v novém fondu a bude mít za následek vyšší než obvyklé síťové náklady.", - "fee.tier.description": "Vydělaná částka poskytující likviditu. Vyberte si částku, která vyhovuje vaší toleranci k riziku a strategii.", - "fee.tier.description.v2": "Vydělaná částka poskytující likviditu. Všechny fondy v2 mají fixní poplatky 0,3 %. Pro více možností poskytněte likviditu na v4.", - "fee.tier.dynamic": "Dynamická úroveň poplatků", - "fee.tier.dynamic.create": "Vytvoření dynamické úrovně poplatků", - "fee.tier.dynamic.create.info": "Chystáte se vytvořit fond s dynamickou úrovní poplatků. Než budete pokračovat, ujistěte se, že vybraný háček podporuje dynamické poplatky.", - "fee.tier.highestTvl": "Nejvyšší TVL", - "fee.tier.label": "% získáte na poplatcích", - "fee.tier.missing.description": "Nemůžete najít úroveň, kterou hledáte?", - "fee.tier.new": "Nová úroveň", - "fee.tier.percent.select": "{{percentage}} vyberte", - "fee.tier.recommended.description": "Doporučeno na základě nejvyššího podílu likvidity pro vybraný pár tokenů.", - "fee.tier.search": "Vyhledejte nebo vytvořte další úrovně poplatků", - "fee.tier.search.short": "Hledejte úrovně", - "fee.tier.select": "Vyberte úroveň poplatků", - "fee.tier.select.existing.button": "Vyberte stávající úroveň poplatků", - "fee.tierExact": "{{fee}} úroveň poplatku", - "fee.unavailable": "Vydělané poplatky nejsou u pozic v2 viditelné, dokud není odstraněna likvidita.", - "fee.uncollected": "Zahrnuje nevybrané poplatky:", - "fiatOffRamp.checkout.title": "Prodej s", - "fiatOffRamp.connection.quote": "Prodej {{amount}} v hodnotě {{currencySymbol}}", - "fiatOffRamp.error.balance": "Překračuje rovnováhu", - "fiatOffRamp.summary.total": "{{cryptoAmount}} pro {{fiatAmount}}", - "fiatOffRamp.unsupportedToken.back": "Vraťte se", - "fiatOffRamp.unsupportedToken.divider": "Nepodporované tokeny", - "fiatOffRamp.unsupportedToken.message": "Prodej tohoto tokenu není podporován. Vyměňte toto aktivum za jeden z podporovaných tokenů.", - "fiatOffRamp.unsupportedToken.swap": "Vyměňte za podporovaný token", - "fiatOffRamp.unsupportedToken.title": "Nepodporovaný token", - "fiatOffRamp.welcome.tooltip": "Prodejte své krypto na svůj bankovní účet nebo debetní kartu.", - "fiatOnRamp.button.chooseToken": "Vyberte token", - "fiatOnRamp.cexTransferModal.description": "Nákup kryptoměn kartou není ve vašem regionu podporován. Převeďte aktiva z centralizovaného výměnného účtu, abyste mohli financovat svou peněženku.", - "fiatOnRamp.cexTransferModal.title": "Začněte převodem", - "fiatOnRamp.checkout.title": "Pokladna s", - "fiatOnRamp.checkoutWith": "Pokladna s", - "fiatOnRamp.chooseProvider.description": "Budete pokračovat na portál poskytovatele, kde uvidíte poplatky spojené s vaší transakcí.", - "fiatOnRamp.completeTransactionHeader": "Dokončete transakci s {{serviceProvider}}", - "fiatOnRamp.connection.error": "Připojení se nezdařilo", - "fiatOnRamp.connection.errorDescription": "Při připojování k {{serviceProvider}}se něco pokazilo.", - "fiatOnRamp.connection.message": "Připojujeme vás k {{serviceProvider}}", - "fiatOnRamp.connection.quote": "Nákup {{amount}} v hodnotě {{currencySymbol}}", - "fiatOnRamp.connection.terms": "Pokračováním potvrzujete, že se na vás budou vztahovat Podmínky služby a Zásady ochrany osobních údajů s {{serviceProvider}}, podle toho, co je relevantní.", - "fiatOnRamp.continueInTab": "Přejděte na kartu {{serviceProvider}} a pokračujte. Nyní je bezpečné tento modal zavřít.", - "fiatOnRamp.disclaimer": "Pokračováním potvrzujete, že se na vás budou vztahovat Podmínky služby a Zásady ochrany osobních údajů s {{serviceProvider}}, podle toho, co je relevantní.", - "fiatOnRamp.error.default": "Něco se pokazilo.", - "fiatOnRamp.error.load": "Nepodařilo se načíst tokeny k nákupu", - "fiatOnRamp.error.max": "Maximum {{amount}}", - "fiatOnRamp.error.min": "Minimálně {{amount}}", - "fiatOnRamp.error.noQuotes": "Nebyly nalezeny žádné citace.", - "fiatOnRamp.error.unavailable": "Tato služba není ve vašem regionu dostupná", - "fiatOnRamp.error.unsupported": "Není podporováno v regionu", - "fiatOnRamp.error.usd": "Lze zakoupit pouze v USD", - "fiatOnRamp.exchangeRate": "{{outputAmount}} {{outputSymbol}} pro {{inputAmount}} {{inputSymbol}}", - "fiatOnRamp.noQuotes.error": "Nebyly nalezeny žádné citace", - "fiatOnRamp.purchasedOn": "Zakoupeno {{serviceProvider}}", - "fiatOnRamp.quote.advice": "Budete pokračovat na portál poskytovatele, kde uvidíte poplatky spojené s vaší transakcí.", - "fiatOnRamp.quote.type.list": "{{optionsList}}a další možnosti", - "fiatOnRamp.quote.type.other": "Jiné možnosti", - "fiatOnRamp.quote.type.recent": "Nedávno použité", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "Z účtu", - "fiatOnRamp.receiveCrypto.title": "Přijímat kryptoměny", - "fiatOnRamp.receiveCrypto.transferFunds": "Financujte svou peněženku převodem kryptoměn z jiné peněženky nebo účtu", - "fiatOnRamp.region.placeholder": "Vyhledávání podle země nebo regionu", - "fiatOnRamp.region.title": "Vyberte svůj region", - "fiatOnRamp.summary.total": "{{cryptoAmount}} pro {{fiatAmount}}", - "forceUpgrade.action.confirm": "Aktualizujte nyní", - "forceUpgrade.action.learn": "Přečtěte si, jak aktualizovat", - "forceUpgrade.action.recoveryPhrase": "Zobrazit frázi pro obnovení", - "forceUpgrade.description.extension": "K dispozici je nová verze aplikace. Chcete-li nadále používat rozšíření Uniswap, aktualizujte jej na nejnovější verzi.", - "forceUpgrade.description.wallet": "K dispozici je nová verze aplikace. Chcete-li nadále používat peněženku Uniswap, aktualizujte ji na nejnovější verzi.", - "forceUpgrade.label.recoveryPhrase": "Fráze obnovy", - "forceUpgrade.title": "Aktualizujte na nejnovější verzi", - "globalPreferences.title": "Globální preference", - "hero.scroll": "Posuňte se a dozvíte se více", - "hero.subtitle": "Největší onchain tržiště. Nakupujte a prodávejte kryptoměny na Ethereu a dalších 11+ řetězcích.", - "hero.swap.title": "Výměna kdykoli,
kdekoli.", - "hidden.nfts.info.banner.text": "Zjistěte více o skrytých NFT", - "hidden.nfts.info.text.button": "Skryté NFT ({{numHidden}})", - "hidden.nfts.info.text.extension": "Toto jsou potenciální podvody a NFT, které jste skryli. Můžete kliknout pravým tlačítkem na NFT a zobrazit jej.", - "hidden.nfts.info.text.mobile": "Toto jsou potenciální podvody a NFT, které jste skryli. NFT můžete dlouhým stisknutím odkrýt.", - "hidden.nfts.info.text.title": "Skryté NFT", - "hidden.tokens.info.banner.text": "Další informace o skrytých tokenech", - "hidden.tokens.info.text.button": "Skryté tokeny ({{numHidden}})", - "hidden.tokens.info.text.info": "Toto jsou potenciální podvody, malé zůstatky a tokeny, které jste skryli. Skryté tokeny nejsou zahrnuty do celkového zůstatku v peněžence.", - "hidden.tokens.info.text.title": "Skryté tokeny", - "home.activity.empty.button": "Přijímejte tokeny nebo NFT", - "home.activity.empty.description.default": "Když schválíte, obchodujete nebo převádíte tokeny nebo NFT, vaše transakce se zobrazí zde.", - "home.activity.empty.description.external": "Až tato peněženka provede transakce, zobrazí se zde.", - "home.activity.empty.title": "Zatím žádná aktivita", - "home.activity.error.load": "Aktivitu se nepodařilo načíst", - "home.activity.title": "Aktivita", - "home.banner.offline": "Jste v režimu offline", - "home.banner.testnetMode": "Jste v režimu testovací sítě", - "home.banner.testnetMode.nav": "Jste v režimu testovací sítě. Vypněte to v nastavení.", - "home.explore.footer": "Klepnutím sem prozkoumáte tisíce tokenů, NFT a další", - "home.explore.title": "Prozkoumejte tokeny", - "home.extension.error": "Chyba při načítání účtů", - "home.label.buy": "Koupit", - "home.label.for": "Koupit/prodat", - "home.label.receive": "Dostávat", - "home.label.send": "Poslat", - "home.label.swap": "Vyměňte", - "home.nfts.title": "NFT", - "home.tokens.empty.action.buy.description": "Nákup debetní kartou nebo bankovním účtem.", - "home.tokens.empty.action.buy.title": "Kupte si Crypto", - "home.tokens.empty.action.import.description": "Zadejte obnovovací frázi této peněženky a začněte vyměňovat a odesílat.", - "home.tokens.empty.action.import.title": "Import peněženky", - "home.tokens.empty.action.receive.description": "Převod z jiné peněženky nebo účtu.", - "home.tokens.empty.action.receive.title": "Přijímat kryptoměny", - "home.tokens.empty.description": "Když tato peněženka zakoupí nebo obdrží tokeny, zobrazí se zde.", - "home.tokens.empty.title": "Zatím žádné tokeny", - "home.tokens.empty.welcome": "Vítejte ve své peněžence!", - "home.tokens.empty.welcome.description": "Vypadá to, že máte novou peněženku. Pojďme to zafinancovat, než provedete svou první výměnu.", - "home.tokens.error.fetch": "Nepodařilo se načíst zůstatky tokenů", - "home.tokens.error.load": "Zůstatky tokenů se nepodařilo načíst", - "home.tokens.title": "Tokeny", - "home.upsell.receive.cta": "Z účtu", - "home.upsell.receive.description": "Financujte svou peněženku převodem kryptoměn z jiné peněženky nebo účtu", - "home.upsell.receive.title": "Přijímat kryptoměny", - "home.warning.viewOnly": "Toto je peněženka pouze pro prohlížení", - "interface.metatags.description": "Swap nebo poskytnutí likvidity na Uniswap protokolu", - "interface.metatags.title": "Uniswap rozhraní", - "landing.buildNextGen": "Vytvářejte další generaci otevřených aplikací a nástrojů.", - "landing.connectWithUs": "spojit se s námi", - "landing.devDocs": "Dokumenty pro vývojáře", - "landing.directToDeFi": "Přejděte přímo na DeFi", - "landing.followOnX": "Sledujte @Uniswap na X pro nejnovější aktualizace", - "landing.protocolDescription": "Produkty Uniswap jsou poháněny protokolem Uniswap. Protokol je největším onchain tržištěm s miliardami dolarů v týdenním objemu v tisících tokenů na Ethereu a 7+ dalších řetězcích.", - "landing.provideLiquidity.message": "Poskytujte likviditu poolům na Uniswap protokolu a získejte poplatky za swapy.", - "landing.swapSimple": "Výměna byla jednoduchá. Získejte přístup k tisícům tokenů na 11+ řetězcích.", - "landing.teamInsights": "Postřehy a novinky od týmu", - "landing.trusted": "Věří miliony", - "language.afrikaans": "afrikánština", - "language.arabic": "arabština", - "language.catalan": "katalánština", - "language.chineseSimplified": "Zjednodušená čínština", - "language.chineseTraditional": "čínština, tradiční", - "language.czech": "čeština", - "language.danish": "dánština", - "language.dutch": "holandský", - "language.english": "Angličtina", - "language.finnish": "finština", - "language.french": "francouzština", - "language.greek": "řecký", - "language.hebrew": "hebrejština", - "language.hindi": "hindština", - "language.hungarian": "maďarský", - "language.indonesian": "indonéština", - "language.italian": "italština", - "language.japanese": "japonský", - "language.korean": "korejština", - "language.malay": "malajština", - "language.norwegian": "norský", - "language.polish": "polština", - "language.portuguese": "portugalština", - "language.romanian": "rumunština", - "language.russian": "ruština", - "language.serbian": "srbština", - "language.spanishLatam": "španělština (Latinská Amerika)", - "language.spanishSpain": "španělština (Španělsko)", - "language.spanishUs": "španělština (USA)", - "language.swahili": "svahilština", - "language.swedish": "švédský", - "language.turkish": "turečtina", - "language.ukrainian": "ukrajinština", - "language.urdu": "Urdu", - "language.vietnamese": "vietnamština", - "limit.open.count_one": "1 otevřený limit", - "limit.open.count_other": "{{count}} otevřené limity", - "limitPrice.buyingAboveMarketPrice.error.description": "Vaše limitní cena je o {{percentage}}% vyšší než tržní. Chcete-li pokračovat, upravte svou limitní cenu.", - "limitPrice.buyingAboveMarketPrice.error.title": "Nákup {{tokenSymbol}} nad tržní cenou", - "limitPrice.marketPriceNotAvailable.error.description": "Aktuální tržní cenu nejsme schopni spočítat. Chcete-li se vyhnout odeslání objednávky pod tržní cenou, zkontrolujte připojení k síti a zkuste to znovu.", - "limitPrice.marketPriceNotAvailable.error.title": "Tržní cena není k dispozici", - "limitPrice.sellingBelowMarketPrice.error.description": "Vaše limitní cena je o {{percentage}}% nižší než tržní. Chcete-li pokračovat, upravte svou limitní cenu.", - "limitPrice.sellingBelowMarketPrice.error.title": "Prodej {{tokenSymbol}} pod tržní cenou", - "limits.form.disclaimer.mainnet": "Pro limity jsou k dispozici pouze tokeny sítě Ethereum. ", - "limits.form.disclaimer.mainnet.short": "Pro limity jsou k dispozici pouze tokeny sítě Mainnet.", - "limits.form.disclaimer.uniswapx": "Limity se nemusí splnit přesně, když tokeny dosáhnou zadané ceny. ", - "limits.learnMore": "Zjistěte více o limitech", - "limits.price.input.label": "Když má hodnotu 1 ", - "limits.price.label": "Limitní cena", - "limits.selectSupportedTokens": "Vyberte podporované tokeny", - "liquidity.hooks": "Háčky na v4", - "liquidity.hooks.address.input": "Zadejte adresu háčku", - "liquidity.learnMoreLabel": "Přečtěte si o poskytování likvidity", - "liquidity.notEnough.label": "Nedostatek likvidity k zobrazení přesné hodnoty USD.", - "liquidity.provideOnProtocols": "Poskytování likvidity na různých protokolech", - "liquidityPool.chart.tooltip.amount": "{{token}} likvidita: {{amount}}", - "liquidityPool.page.title": "Přidejte likviditu do poolů{{version}} na Uniswapu", - "liquidityPool.positions.closed.title": "Uzavřené pozice", - "liquidityPool.positions.page.title": "Spravujte {{quoteSymbol}}/{{baseSymbol}} likviditu fondu na Uniswapu", - "liquidityPool.positions.page.version.description": "Prohlédněte si své aktivní {{version}} pozice likvidity. Přidejte nové pozice.", - "liquidityPool.positions.page.version.title": "Spravujte likviditu fondu{{version}} na Uniswapu", - "liquidityPool.positions.price.formatted": " za ", - "migrate.allowed": "Povoleno", - "migrate.allowLpMigration": "Povolit migraci tokenu LP", - "migrate.connectAccount": "Musíte připojit účet.", - "migrate.connectWallet": "Připojte se k peněžence a zobrazte svou likviditu V2.", - "migrate.contract": "Uniswap migrační smlouva", - "migrate.firstLP": "Jste prvním poskytovatelem likvidity pro tento fond Uniswap V3. Vaše likvidita bude migrovat za aktuální cenu {{source}} .", - "migrate.highGasCost": "Vaše transakční náklady budou mnohem vyšší, protože zahrnují plyn na vytvoření fondu.", - "migrate.invalidRange": "Vybrán neplatný rozsah. Minimální cena musí být nižší než maximální cena.", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} žetony LP", - "migrate.migrating": "Migrace", - "migrate.missingV2Position": "Nevidíte jednu ze svých pozic v2? Importujte jej.", - "migrate.noV2Liquidity": "Nebyla nalezena žádná likvidita V2.", - "migrate.positionNoFees": "Vaše pozice nebude vydělávat poplatky ani nebude použita v obchodech, dokud se tržní cena neposune do vašeho rozmezí.", - "migrate.priceDifference": "Cenový rozdíl: ", - "migrate.priceWarning": "Do Uniswap V3 byste měli vkládat likviditu pouze za cenu, kterou považujete za správnou.
Pokud se cena zdá nesprávná, můžete buď provést swap a cenu přesunout, nebo počkat, až to udělá někdo jiný.", - "migrate.refund": "Do vaší peněženky bude vráceno alespoň {{amtA}} {{symA}} a {{amtB}} {{symB}} vzhledem k vybranému cenovému rozpětí.", - "migrate.selectFeeTier": "Vyberte úroveň poplatků", - "migrate.setRange": "Nastavit cenové rozpětí", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Cena:", - "migrate.v2Description": "Tento nástroj bezpečně migruje vaši {{source}} likviditu do V3. Proces je zcela nedůvěryhodný díky smlouvě o migraci <0>Uniswap ↗", - "migrate.v2Instruction": "U každého níže zobrazeného fondu klikněte na migrovat, abyste odstranili svou likviditu z Uniswap V2 a vložili ji do Uniswap V3.", - "migrate.v2Title": "Migrujte likviditu V2", - "migrate.v3Price": "V3 {{sym}} Cena:", - "mint.v3.input.invalidPrice.error": "Neplatný údaj o ceně", - "mobileAppPromo.banner.getTheApp.link": "Získejte aplikaci Uniswap Wallet", - "mobileAppPromo.banner.title": "Uniswap: Crypto & NFT Wallet", - "moonpay.poweredBy": "Fiat onramp poháněný společností MoonPay USA LLC", - "moonpay.restricted.region": "Moonpay není v některých regionech k dispozici. Kliknutím se dozvíte více.", - "nav.createAccount.button": "Vytvořit účet", - "nav.logIn.button": "Přihlaste se", - "nav.signIn.button": "Přihlaste se", - "nav.signUp.button": "Zaregistrujte se", - "nav.tabs.createPosition": "Vytvořte pozici", - "nav.tabs.viewPositions": "Zobrazit pozice", - "network.lostConnection": "Možná jste ztratili připojení k síti.", - "network.mightBeDown": "{{network}} může být právě teď mimo provoz nebo jste možná ztratili připojení k síti.", - "network.warning": "Upozornění sítě", - "nft.addToBag": "Přidat do batohu", - "nft.authorsCollectionOnUni": "{{name}}sbírka NFT na Uniswapu", - "nft.bag": "Taška", - "nft.blockedCollection": "Tato sbírka je zablokována", - "nft.blockedOpenSea": "Blokováno na OpenSea", - "nft.buyTransferNFTToStart": "Začněte nákupem nebo převodem NFT do této peněženky.", - "nft.buyTransferTokensToStart": "Začněte nákupem nebo převodem tokenů do této peněženky.", - "nft.card.notAvailable": "Obsah zatím není
dostupný", - "nft.chainSupportComingSoon": "{{chainName}} podpora již brzy", - "nft.collection.title": "Prozkoumejte a nakupujte na Uniswapu", - "nft.collectionOnUni": "Kolekce NFT na Uniswapu", - "nft.collectonOnAddress": "Sbírka NFT na Uniswap - {{address}}", - "nft.complete": "Kompletní!", - "nft.editListings": "Upravit výpisy", - "nft.event": "událost", - "nft.explore": "Prozkoumejte NFT", - "nft.learnWhy": "Přečtěte si proč", - "nft.list.header.lastPrice": "Poslední", - "nft.list.title": "Seznam NFT", - "nft.listedSignificantly_one": "Jeden NFT je uveden {{percentage}} pod minimální cenou kolekce. Jste si jistý, že chcete pokračovat?", - "nft.listedSignificantly_other": "{{count}} NFT jsou uvedeny výrazně pod minimální cenou kolekce. Jste si jistý, že chcete pokračovat?", - "nft.listForSale": "Seznam na prodej", - "nft.lowPrice": "Nízká katalogová cena", - "nft.marketplace.royalty.header": "{{marketName}} poplatky", - "nft.maxFees": "Max poplatky", - "nft.maxRoyalties": "Maximální autorské honoráře", - "nft.noItems": "Žádné položky k zobrazení", - "nft.noneAtAddress": "Na této adrese neexistují žádná aktiva sbírky", - "nft.noPools": "Zatím žádné bazény", - "nft.notListed": "Nezapsáno", - "nft.proceedsIfSold": "Výtěžek v případě prodeje", - "nft.profile.priceInput.warning.alreadyListed": "Již uvedeno na {{tokenAmountWithSymbol}}", - "nft.profile.priceInput.warning.belowFloor": "{{percentage}} pod minimální cenou.", - "nft.refundsInEth": "Náhrady za nedostupné položky budou uvedeny v ETH", - "nft.removeFromBag": "Vyjměte ze sáčku", - "nft.reportSpam": "Nahlásit jako spam", - "nft.returnToExplore": "Návrat do NFT Explore", - "nft.returnToMy": "Návrat na Moje NFT", - "nft.setPrices": "Chcete-li pokračovat, nastavte ceny", - "nft.startListing": "Začněte zapisovat", - "nft.successListed": "Úspěšně uvedeno", - "nft.sweep": "Zametat", - "nft.unavailableToList": "Nedostupné pro výpis", - "nft.whyTransaction": "Proč je vyžadována transakce?", - "nft.whyTransaction.reason": "Zalistování NFT vyžaduje jednorázový souhlas tržiště pro každou kolekci NFT.", - "nft.willAppearHere": "Zde se zobrazí vaše onchain transakce a krypto nákupy.", - "nft.wishGranted": "Uniswap splnil vaše přání!", - "nfts.collection.action.approve_one": "Schválit sbírku", - "nfts.collection.action.approve_other": "Schvalovat sbírky", - "nfts.collection.action.sign_one": "Výpis znamení", - "nfts.collection.action.sign_other": "Podepsat výpisy", - "nfts.marketplace.fees.deltaMax": "{{percentChanged}} max", - "nfts.my": "Moje NFT", - "nfts.noneYet": "Zatím žádné NFT", - "nfts.sell": "Prodám NFT", - "nfts.viewAndSell": "Prohlížejte a prodávejte NFT", - "notFound.oops": "Jejda, vezměte mě zpět do Swapu", - "notice.uk": "Tato webová aplikace je poskytována jako nástroj pro uživatele k interakci s protokolem Uniswap z jejich vlastní iniciativy, bez schvalování nebo doporučení obchodních aktivit s kryptoměnami. Uniswap přitom nedoporučuje, aby se uživatelé nebo potenciální uživatelé zapojovali do obchodování s kryptoaktivami, a uživatelé nebo potenciální uživatelé webové aplikace by neměli považovat tuto webovou stránku nebo její obsah za obsahující jakoukoli formu doporučení, výzvy nebo pobídky k obchodování s kryptoaktivy. .", - "notice.uk.label": "Zřeknutí se odpovědnosti Spojeného království:", - "notification.assetVisibility.hidden": "{{assetName}} skryto", - "notification.assetVisibility.unhidden": "{{assetName}} zobrazeno", - "notification.copied.address": "Adresa zkopírována", - "notification.copied.calldata": "Data volání byla zkopírována", - "notification.copied.contractAddress": "Adresa smlouvy zkopírována", - "notification.copied.failed": "Kopírování do schránky se nezdařilo", - "notification.copied.image": "Obrázek zkopírován", - "notification.copied.nftUrl": "Adresa URL NFT byla zkopírována", - "notification.copied.tokenUrl": "Adresa URL tokenu byla zkopírována", - "notification.copied.transactionId": "ID transakce zkopírováno", - "notification.copied.unitag": "Uživatelské jméno bylo zkopírováno", - "notification.countryChange": "Přepnuto na {{countryName}}", - "notification.network.changed": "Přepnuto na {{network}}", - "notification.passwordChanged": "heslo změněno", - "notification.restore.success": "Peněženka obnovena!", - "notification.send.network": "Odesílání na {{network}}", - "notification.spam.NFT.successful": "Nahlášeno", - "notification.swap.network": "Výměna na {{network}}", - "notification.swap.pending.swap": "Čeká se na výměnu", - "notification.swap.pending.unwrap": "Rozbalení čeká na vyřízení", - "notification.swap.pending.wrap": "Čeká se na zabalení", - "notification.transaction.approve.canceled": "Zrušeno {{currencySymbol}} schválit.", - "notification.transaction.approve.fail": "Nepodařilo se schválit {{currencySymbol}} pro použití s {{address}}.", - "notification.transaction.approve.success": "Schváleno {{currencySymbol}} pro použití s {{address}}.", - "notification.transaction.pending": "Transakce čeká na vyřízení", - "notification.transaction.swap.canceled": "Zrušeno {{inputCurrencySymbol}}-{{outputCurrencySymbol}} swap.", - "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} za {{outputCurrencyAmountWithSymbol}} swap vypršel.", - "notification.transaction.swap.fail": "Nepodařilo se vyměnit {{inputCurrencyAmountWithSymbol}} za {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.swap.success": "Vyměněno {{inputCurrencyAmountWithSymbol}} za {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.transfer.canceled": "Zrušeno {{tokenNameOrAddress}} odeslání", - "notification.transaction.transfer.fail": "Odeslání {{tokenNameOrAddress}} na {{walletNameOrAddress}}se nezdařilo", - "notification.transaction.transfer.received": "Přijato {{tokenNameOrAddress}} od {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "Odesláno {{tokenNameOrAddress}} uživateli {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "Transakce s {{addressOrEnsName}}se nezdařila", - "notification.transaction.unknown.fail.short": "Transakce selhala", - "notification.transaction.unknown.success.full": "Transakce s {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "Transakce potvrzena", - "notification.transaction.unwrap.canceled": "Zrušeno {{inputCurrencySymbol}} rozbalení.", - "notification.transaction.unwrap.fail": "Nepodařilo se rozbalit {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.unwrap.success": "Rozbaleno {{inputCurrencyAmountWithSymbol}} a přijato {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.canceled": "Zrušeno {{inputCurrencySymbol}} zalomení.", - "notification.transaction.wrap.fail": "Nepodařilo se zabalit {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.success": "Zabaleno {{inputCurrencyAmountWithSymbol}} a přijato {{outputCurrencyAmountWithSymbol}}.", - "notification.transfer.pending": "Odeslat čeká na vyřízení", - "notification.walletConnect.confirmed": "Transakce potvrzena {{dappName}}", - "notification.walletConnect.connected": "Připojeno", - "notification.walletConnect.disconnected": "Odpojeno", - "notification.walletConnect.failed": "Transakce se nezdařila s {{dappName}}", - "notification.walletConnect.networkChanged.full": "Přepnuto na {{networkName}}", - "notification.walletConnect.networkChanged.short": "Přepínané sítě", - "notifications.scantastic.subtitle": "Pokračujte na Uniswap Extension", - "notifications.scantastic.title": "Úspěch!", - "onboarding.backup.manual.banner": "Doporučujeme to napsat na kus papíru a uložit na bezpečné místo, jako je trezor.", - "onboarding.backup.manual.displayWarning.description": "Než budete pokračovat, přečtěte si pozorně následující.", - "onboarding.backup.manual.displayWarning.note.access": "Tato obnovovací fráze vám dává plný přístup k vaší peněžence a finančním prostředkům", - "onboarding.backup.manual.displayWarning.note.secure": "Prohlížejte si to soukromě a s nikým to nesdílejte", - "onboarding.backup.manual.displayWarning.note.storage": "Zapište si to a uschovejte na bezpečném místě", - "onboarding.backup.manual.displayWarning.title": "Některé důležité věci, které byste měli vědět", - "onboarding.backup.manual.error": "Neplatné nebo chybně napsané slovo", - "onboarding.backup.manual.placeholder": "Skryté slovo", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} dokončeno", - "onboarding.backup.manual.selectedWordPlaceholder": "Vyberte slovo", - "onboarding.backup.manual.subtitle_one": "Jaké je první slovo {{count}}ve vaší frázi pro obnovení?", - "onboarding.backup.manual.subtitle_two": "Jaké je slovo {{count}}ve vaší frázi pro obnovení?", - "onboarding.backup.manual.subtitle_few": "Jaké je {{count}}slovo ve vaší frázi pro obnovení?", - "onboarding.backup.manual.subtitle_other": "Jaké je {{count}}slovo ve vaší frázi pro obnovení?", - "onboarding.backup.manual.title": "Ujistíme se, že jste to nahráli správně", - "onboarding.backup.option.badge.quick": "Rychlý", - "onboarding.backup.option.cloud.description": "Zálohujte svou peněženku přes {{cloudProviderName}}, chráněnou heslem pro obnovení.", - "onboarding.backup.option.cloud.title": "Nastavte heslo pro obnovení", - "onboarding.backup.option.manual.description": "Zaznamenejte si svých 12 tajných slov na kus papíru a uložte jej na bezpečném místě.", - "onboarding.backup.option.manual.title": "Zapište si frázi pro obnovení", - "onboarding.backup.reminder.description": "Zálohování vaší peněženky zajišťuje, že můžete kdykoli obnovit svá aktiva, pokud ztratíte telefon nebo získáte nové zařízení.", - "onboarding.backup.reminder.title": "Je čas zálohovat peněženku", - "onboarding.backup.reminder.warning.description": "Pokud nenastavíte metodu zálohování, nebudete mít možnost obnovit svou peněženku, pokud ztratíte telefon, smažete aplikaci nebo získáte nové zařízení.", - "onboarding.backup.reminder.warning.title": "Mohli byste přijít o své prostředky", - "onboarding.backup.speedBump.cloud.description": "Pokud ji někdy zapomenete, nemůžeme ji za vás resetovat. Zapište si jej na bezpečné místo nebo jej bezpečně uložte do správce hesel.", - "onboarding.backup.speedBump.cloud.disclaimer": "Chápu, že Uniswap Labs nemůže obnovit mé heslo pro obnovení.", - "onboarding.backup.speedBump.cloud.title": "Je důležité si toto heslo uložit", - "onboarding.backup.speedBump.manual.description": "Ujistěte se, že jste si frázi pro obnovení zapsali správně a mějte ji na bezpečném místě.", - "onboarding.backup.speedBump.manual.disclaimer": "Chápu, že Uniswap Labs nemůže obnovit moji peněženku, pokud ji ztratím.", - "onboarding.backup.speedBump.manual.title": "Než skončíte...", - "onboarding.backup.subtitle": "Tímto způsobem obnovíte svou peněženku, pokud smažete aplikaci nebo ztratíte své zařízení.", - "onboarding.backup.title.existing": "Zálohujte si peněženku", - "onboarding.backup.title.new": "Vyberte způsob zálohování", - "onboarding.backup.view.disclaimer": "Chápu, že pokud ztratím svou frázi pro obnovení, Uniswap Labs mi ji nemůže pomoci obnovit.", - "onboarding.backup.view.subtitle.message1": "Než budete pokračovat, přečtěte si pozorně následující", - "onboarding.backup.view.subtitle.message2": "Chcete-li obnovit svou peněženku, budete muset zadat všech 12 těchto tajných slov.", - "onboarding.backup.view.title": "Zapište si frázi pro zotavení", - "onboarding.backup.view.warning.message1": "Tato obnovovací fráze vám dává plný přístup k vaší peněžence a finančním prostředkům", - "onboarding.backup.view.warning.message2": "Zapište si to a uschovejte na bezpečném místě", - "onboarding.backup.view.warning.message3": "Zobrazit toto soukromě a to s nikým nesdílet", - "onboarding.cloud.confirm.description": "Toto budete muset zadat, abyste získali zpět své prostředky. Pokud ji někdy zapomenete, nemůžeme ji pro vás získat.", - "onboarding.cloud.confirm.title": "Potvrďte heslo pro obnovení", - "onboarding.cloud.createPassword.description": "Toto budete muset zadat, abyste získali zpět své prostředky. Pokud ji někdy zapomenete, nemůžeme ji pro vás získat.", - "onboarding.cloud.createPassword.title": "Vytvořte si heslo pro obnovení", - "onboarding.complete.button": "Otevřete rozšíření Uniswap", - "onboarding.complete.description": "Vaše peněženka je připravena odesílat a přijímat kryptoměny. Otevřete Uniswap Extension pomocí zástupce níže.", - "onboarding.complete.go_to_uniswap": "Přejděte na webovou aplikaci Uniswap", - "onboarding.complete.pin.description": "Kliknutím na ikonu špendlíku přidáte rozšíření Uniswap na svůj panel nástrojů.", - "onboarding.complete.pin.title": "Pin Uniswap rozšíření", - "onboarding.complete.title": "Vše je připraveno", - "onboarding.extension.password.subtitle": "Budete to potřebovat k odemknutí peněženky a přístupu k obnovovací frázi", - "onboarding.extension.password.title.default": "Vytvořit heslo", - "onboarding.extension.password.title.reset": "Obnovit heslo", - "onboarding.extension.unsupported.android.description": "Uniswap Extension je kompatibilní pouze s Chrome na počítači.", - "onboarding.extension.unsupported.android.title": "Chrome pro mobily není (zatím) podporován", - "onboarding.extension.unsupported.description": "Uniswap Extension je momentálně kompatibilní pouze s Chrome.", - "onboarding.extension.unsupported.title": "Tento prohlížeč není podporován (zatím)", - "onboarding.home.intro.backup.description": "Nastavte si plán obnovy, pokud někdy ztratíte telefon nebo získáte nový.", - "onboarding.home.intro.backup.title": "Zálohujte si peněženku", - "onboarding.home.intro.bridging.description_one": "Přesuňte ETH, USDC a další přes {{count}}+ sítě.", - "onboarding.home.intro.bridging.description_other": "Přesuňte ETH, USDC a další přes {{count}}+ sítě.", - "onboarding.home.intro.fund.description": "Financujte svou peněženku nákupem kryptoměn nebo převodem z jiného účtu.", - "onboarding.home.intro.fund.title": "Získejte svůj první token", - "onboarding.home.intro.label.required": "Požadovaný", - "onboarding.home.intro.label.swipe": "Výpad", - "onboarding.home.intro.unitag.description": "Vytvořte si personalizovaný web3 profil a snadno sdílejte svou adresu s přáteli.", - "onboarding.home.intro.unitag.title": "Získejte své uživatelské jméno {{unitagDomain}}", - "onboarding.home.intro.welcome.description": "Dokončete nastavení peněženky a začněte vyměňovat během několika sekund.", - "onboarding.home.intro.welcome.title": "Vítejte v Uniswapu", - "onboarding.import.error.invalidWords_one": "1 slovo je neplatné nebo špatně napsané", - "onboarding.import.error.invalidWords_other": "{{count}} slova jsou neplatná nebo nesprávně napsaná", - "onboarding.import.method.import.message": "Zadejte svou frázi pro obnovení z jiné kryptopeněženky", - "onboarding.import.method.import.title": "Importujte peněženku", - "onboarding.import.method.restore.message.android": "Přidejte peněženky, které jste si zálohovali, do svého účtu Disku Google", - "onboarding.import.method.restore.message.ios": "Přidejte peněženky, které jste si zazálohovali, do svého účtu iCloud", - "onboarding.import.method.restore.title": "Obnovit peněženku", - "onboarding.import.onDeviceRecovery.other_options": "Vytvořte nebo importujte jinou peněženku", - "onboarding.import.onDeviceRecovery.other_options.label": "Nechcete nic z výše uvedeného?", - "onboarding.import.onDeviceRecovery.subtitle": "Vyberte, do které peněženky se chcete znovu přihlásit.", - "onboarding.import.onDeviceRecovery.title": "Vítejte zpět v Uniswapu", - "onboarding.import.onDeviceRecovery.wallet.button": "Zobrazit frázi pro obnovení", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 další peněženka", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} další peněženky", - "onboarding.import.onDeviceRecovery.warning.caption": "Ujistěte se, že jste si zazálohovali všechny ostatní peněženky. Pokud je někdy budete chtít obnovit, budete potřebovat jejich obnovovací fráze nebo odpovídající {{cloudProvider}} zálohy.", - "onboarding.import.onDeviceRecovery.warning.title": "Jsi si jistá?", - "onboarding.import.title": "Vyberte, jak chcete přidat svou peněženku", - "onboarding.importMnemonic.button.default": "Moje obnovovací fráze je 12 slov", - "onboarding.importMnemonic.button.importing": "Import...", - "onboarding.importMnemonic.button.longPhrase": "Moje obnovovací fráze je delší", - "onboarding.importMnemonic.error.invalidPhrase": "Zadaná fráze je neplatná", - "onboarding.importMnemonic.subtitle": "Zadejte nebo vložte svou 12slovou frázi pro obnovení", - "onboarding.importMnemonic.title": "Zadejte frázi pro obnovení", - "onboarding.intro.button.alreadyHave": "Už mám peněženku", - "onboarding.intro.mobileScan.button": "Naskenujte QR kód pro import", - "onboarding.intro.mobileScan.title": "Máte aplikaci Uniswap?", - "onboarding.landing.button.add": "Přidejte existující peněženku", - "onboarding.landing.button.create": "Vytvořte si peněženku", - "onboarding.name.wallet.button.text": "Dokončit", - "onboarding.name.wallet.subtitle": "Tato přezdívka je viditelná pouze vám", - "onboarding.name.wallet.title": "Dejte své peněžence jméno", - "onboarding.notification.permission.message": "Chcete-li dostávat upozornění, zapněte v nastavení zařízení upozornění pro Uniswap Wallet.", - "onboarding.notification.permission.title": "Oprávnění k oznámením", - "onboarding.notification.subtitle": "Zůstaňte informováni o stavech transakcí a hlavních změnách cen oblíbených tokenů", - "onboarding.notification.title": "Zapněte oznámení", - "onboarding.passkey.account.protection": "Váš účet je chráněn vaším vlastním bezpečným úložištěm hesel.", - "onboarding.passkey.biometric.scan": "Telefon, tablet nebo prohlížeč – stačí naskenovat své biometrické údaje a budete přihlášeni.", - "onboarding.passkey.create": "Vytvořte si svůj přístupový klíč", - "onboarding.passkey.use.recovery.phrase": "Místo toho použijte frázi pro obnovení", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "Potvrďme, že jsi to pochopil správně. Pokud toto ztratíte nebo zapíšete nesprávně, nebudete moci získat zpět své prostředky.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "Pokud toto ztratíte nebo zapíšete nesprávně, nebudete moci získat zpět své prostředky.", - "onboarding.recoveryPhrase.confirm.title": "Potvrďme, že jsi to pochopil správně", - "onboarding.recoveryPhrase.view.subtitle": "Chcete-li obnovit svou peněženku, budete muset zadat všech 12 těchto tajných slov.", - "onboarding.recoveryPhrase.view.title": "Zapište si frázi pro zotavení", - "onboarding.recoveryPhrase.view.title.hasPassword": "Pokud někdy zapomenete heslo...", - "onboarding.recoveryPhrase.warning.final.button": "Jsem připraven", - "onboarding.recoveryPhrase.warning.final.message": "Vaše fráze pro obnovení je to, co vám (a komukoli, kdo ji má) poskytuje přístup k vašim prostředkům. Určitě si to nechte pro sebe.", - "onboarding.recoveryPhrase.warning.final.title": "Tento krok proveďte na soukromém místě", - "onboarding.recoveryPhrase.warning.screenshot.message": "Kdokoli, kdo získá přístup k vašim fotografiím, má přístup k vaší peněžence. Doporučujeme, abyste si svá slova zapsali.", - "onboarding.recoveryPhrase.warning.screenshot.title": "Snímky obrazovky nejsou zabezpečené", - "onboarding.resetPassword.complete.safety": "Zjistěte více o bezpečnosti peněženky", - "onboarding.resetPassword.complete.subtitle": "K odemknutí peněženky použijte své nové heslo.", - "onboarding.resetPassword.complete.title": "Resetovat heslo", - "onboarding.scan.button": "Skenujte pomocí aplikace Uniswap", - "onboarding.scan.error": "Je nám líto, ale QR kód momentálně nemůžeme načíst. Zkuste prosím jiný způsob registrace.", - "onboarding.scan.otp.error": "Zadaný kód je nesprávný nebo došlo k chybě při odesílání. Prosím zkuste to znovu.", - "onboarding.scan.otp.failed": "Neúspěšné pokusy: {{number}}", - "onboarding.scan.otp.subtitle": "Zkontrolujte svou mobilní aplikaci Uniswap pro 6místný kód", - "onboarding.scan.otp.title": "Zadejte jednorázový kód", - "onboarding.scan.subtitle": "Naskenujte QR kód pomocí mobilní aplikace Uniswap a začněte importovat svou peněženku.", - "onboarding.scan.title": "Importujte peněženku z aplikace", - "onboarding.scan.wifi": "Připojte telefon ke stejné síti WiFi jako počítač.", - "onboarding.security.alert.biometrics.message.android": "Chcete-li používat biometrii, nejprve ji nastavte v nastavení", - "onboarding.security.alert.biometrics.message.ios": "Chcete-li použít {{biometricsMethod}}, povolte přístup v nastavení systému", - "onboarding.security.alert.biometrics.title.android": "Biometrie je zakázána", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} je zakázáno", - "onboarding.security.button.confirm.android": "Povolit biometrii", - "onboarding.security.button.confirm.ios": "Povolit {{biometricsMethod}}", - "onboarding.security.button.setup": "Založit", - "onboarding.security.subtitle.android": "Přidejte další vrstvu zabezpečení tím, že budete vyžadovat biometrické údaje pro odesílání transakcí.", - "onboarding.security.subtitle.ios": "Přidejte další vrstvu zabezpečení tím, že požadujete {{biometricsMethod}} pro odesílání transakcí.", - "onboarding.security.title": "Chraňte svou peněženku", - "onboarding.selectWallets.error": "Adresy se nepodařilo načíst", - "onboarding.selectWallets.title.default": "Vyberte peněženky, které chcete importovat", - "onboarding.selectWallets.title.error": "Při importu peněženek došlo k chybě", - "onboarding.termsOfService": "Pokračováním souhlasím s Smluvními podmínkami a souhlasím se Zásadami ochrany osobních údajů", - "onboarding.tooltip.recoveryPhrase.trigger": "Co je to obnovovací fráze?", - "onboarding.wallet.continue": "Nechme to v bezpečí", - "onboarding.wallet.defaultName": "Peněženka {{number}}", - "onboarding.wallet.description.full": "Toto je váš osobní prostor pro tokeny, NFT a všechny vaše obchody. Dokončete nastavení, aby byly vaše prostředky v bezpečí.", - "onboarding.wallet.title": "Vítejte ve své nové peněžence", - "outageBanner.message": "{{chainName}} {{versionDescription}} data nejsou momentálně k dispozici, ale očekáváme, že bude problém brzy vyřešen.", - "outageBanner.message.sub": "Stále můžete swapovat a poskytovat likviditu na tomto řetězci bez problémů.", - "outageBanner.title": "{{versionName}} se brzy vrátí", - "permit.approval.fail": "Schválení povolení se nezdařilo", - "permit.approval.fail.message": "Permit2 umožňuje sdílení a správu tokenů napříč různými aplikacemi.", - "pool.activePositions.appear": "Zde se zobrazí vaše aktivní pozice likvidity V3.", - "pool.activeRange": "Aktivní rozsah klíšťat", - "pool.addAs": "Přidat jako {{nativeWrappedSymbol}}", - "pool.addLiquidity.seoTitle": "Přidejte likviditu na {{tokenPair}} ({{chain}}) na Uniswapu", - "pool.addMoreLiquidity": "Přidejte více likvidity", - "pool.apr": "APR", - "pool.apr.description": "Anualizováno na základě poplatků za 1 den", - "pool.areCreating": "Vytváříte bazén", - "pool.areFirst": "Jste prvním poskytovatelem likvidity.", - "pool.back": "Zpět k bazénu", - "pool.balances": "Bazénové zůstatky", - "pool.closedCTA.description": "Můžete je zobrazit pomocí filtru v horní části stránky.", - "pool.closedCTA.title": "Hledáte své uzavřené pozice?", - "pool.collectAs": "Sbírejte jako {{nativeWrappedSymbol}}", - "pool.collected": " Shromážděno", - "pool.collectFees": "Vybírat poplatky", - "pool.collecting": "Sbírání", - "pool.collectingFeesWithdraw": "Výběr poplatků za vás stáhne aktuálně dostupné poplatky.", - "pool.confirmSupply": "Potvrďte dodávku", - "pool.connection.networkUnsupported": "Vaše připojená síť není podporována.", - "pool.create": "Vytvoření nového bazénu", - "pool.create.info": "Vaše volby vytvoří nový fond likvidity, který může mít za následek nižší počáteční likviditu a zvýšenou volatilitu. Zvažte přidání do stávajícího fondu, abyste tato rizika minimalizovali.", - "pool.create.pair": "Vytvořte pár", - "pool.createAndSupply": "Vytvořte bazén a zásobu", - "pool.createdPosition": "Vytvořená pozice", - "pool.createdPosition.cancelled": "Vytvoření pozice zrušeno", - "pool.createdPosition.failed": "Vytvoření pozice se nezdařilo", - "pool.depositAmounts": "Částky vkladů", - "pool.earnFees": "Přidáním likvidity získáte 0,3 % ze všech obchodů na tomto páru úměrně vašemu podílu na poolu. Poplatky se přičítají do fondu, narůstají v reálném čase a lze je nárokovat stažením likvidity.", - "pool.estimatePercentToRevert": "Výkon se odhaduje. Pokud se cena změní o více než {{allowed}}% vaše transakce se vrátí zpět.", - "pool.explorers": "Průzkumníci", - "pool.exporeAnalytics": "Prozkoumejte Uniswap Analytics.", - "pool.hideClosed": "Skryjte uzavřené pozice", - "pool.import": "Import bazénu", - "pool.import.link.description": "Některé pozice v2 se nezobrazují automaticky.", - "pool.import.positions.v2": "Import pozic V2", - "pool.import.positions.v2.selectPair.description": "Některé pozice v2 se nezobrazují automaticky. Vyberte pár tokenů, který chcete importovat a zobrazit své pozice.", - "pool.import.success": "Bazén importován", - "pool.increaseLiquidity": "Zvyšte likviditu", - "pool.info": "Informace o bazénu", - "pool.initialShare": "Počáteční ceny a podíl v bazénu", - "pool.learn": "Učit se", - "pool.learnAbout": "Přečtěte si více o poskytování likvidity", - "pool.learnLiquidity": "Přečtěte si o poskytování likvidity", - "pool.learnv3LP": "Podívejte se na náš průvodce v3 LP a průvodce migrací.", - "pool.limitFluctuation.warning": "Mějte prosím na paměti, že plnění limitů se může lišit v závislosti na fluktuacích trhu v reálném čase a přetížení sítě Ethereum. Limity se nemusí splnit přesně, když tokeny dosáhnou zadané ceny.", - "pool.liquidity.connectToAdd": "Připojte se k peněžence a zobrazte svou likviditu.", - "pool.liquidity.data.error.message": "Při načítání dat požadovaných pro vaši transakci došlo k chybě.", - "pool.liquidity.earn.fee": "Poskytovatelé likvidity vydělávají 0,3% poplatek za všechny obchody úměrný jejich podílu na poolu. Poplatky se přičítají do fondu, narůstají v reálném čase a lze je nárokovat stažením likvidity.", - "pool.liquidity.outOfSync": "Nesoulad mezi poolem a tržní cenou", - "pool.liquidity.outOfSync.message": "Ceny v tomto fondu se liší podle tržních cen vybraných tokenů. Upravte odpovídajícím způsobem své cenové rozpětí nebo počkejte, až se fond vyrovná, abyste předešli ztrátám.", - "pool.liquidity.ownershipWarning.message": "Nejste vlastníkem této pozice LP. Nebudete moci vybrat likviditu z této pozice, pokud nevlastníte následující adresu: {{ownerAddress}}", - "pool.liquidity.rewards": "Odměny poskytovatele likvidity", - "pool.liquidity.taxWarning": "Tokenové daně", - "pool.liquidity.taxWarning.message": "Jeden nebo více těchto tokenů má daně z převodů. Přidání likvidity pomocí V3 může vést ke ztrátě finančních prostředků. Zkuste místo toho použít V2.", - "pool.liquidityPoolFeesNotice": "Když přidáte likviditu, obdržíte žetony fondu představující vaši pozici. Tyto tokeny automaticky získávají poplatky úměrné vašemu podílu na fondu a lze je kdykoli uplatnit.", - "pool.manageRewardsLiquidity": "Spravujte likviditu ve fondu odměn", - "pool.max.label": "Max:", - "pool.maxPrice": "Max cena", - "pool.migrateLiquidity": "Migrujte likviditu", - "pool.migrateLiquidityDisabledTooltip": "Tento řetězec nepodporuje fondy likvidity v4.", - "pool.migrateToV4": "Migrujte na v4", - "pool.min.label": "min:", - "pool.minPrice": "Cena min", - "pool.mustBeInitialized": "Tento fond musí být inicializován, než budete moci přidat likviditu. Pro inicializaci vyberte počáteční cenu fondu. Poté zadejte své cenové rozpětí likvidity a částku vkladu. Poplatky za plyn budou kvůli inicializační transakci vyšší než obvykle.", - "pool.newPosition.plus": "+ Nová pozice", - "pool.newPosition.title": "Nová pozice", - "pool.newSpecificPosition": "Nová pozice {{symbol}}", - "pool.noLiquidity": "Nebyla nalezena žádná likvidita.", - "pool.onceHappyReview": "Jakmile budete se sazbou spokojeni, klikněte na nabídku a zkontrolujte ji.", - "pool.openPosition": "Otevřete pozici bazénu", - "pool.openPosition.cta": "Přidejte likviditu do poolu a prohlédněte si své pozice zde", - "pool.openToStart": "Začněte otevřením nové pozice nebo vytvořením fondu.", - "pool.owner": "Majitel", - "pool.percent": "{{pct}}% fondu", - "pool.pooled": "Sdruženo {{sym}}:", - "pool.position": "Pozice", - "pool.position.100": "Vaše pozice bude za tuto cenu 100%.", - "pool.position.100.at": "Vaše pozice bude za tuto cenu 100 % {{symbol}} .", - "pool.position.networkConnect": "Chcete-li zobrazit pozici, musíte být připojeni k síti, do které patří.", - "pool.position.willBe100": "Vaše pozice bude za tuto cenu 100% složena z {{sym}}", - "pool.positions": "Pozice", - "pool.positions.title": "Vaše pozice", - "pool.positions.transaction.settings": "Nastavení transakcí", - "pool.positions.usdValueUnavailable": "Hodnota USD není k dispozici", - "pool.positions.usdValueUnavailable.tooltip": "Hodnota v USD je pro tuto pozici momentálně nedostupná. Pro vložené částky tokenů viz podrobnosti o pozici.", - "pool.priceRange": "Cenové rozpětí", - "pool.rangeBadge.tooltip.outsideRange": "Cena tohoto bazénu je mimo vámi vybraný rozsah. Vaše pozice aktuálně nevydělává poplatky.", - "pool.rangeBadge.tooltip.text": "Vaše pozice má nulovou likviditu a nevydělává poplatky.", - "pool.rangeBadge.tooltip.withinRange": "Cena tohoto bazénu je ve vámi zvoleném rozmezí. Vaše pozice aktuálně vydělává poplatky.", - "pool.rates": "Sazby", - "pool.ratioTokenToPrice": "Poměr žetonů, které přidáte, určí cenu tohoto fondu.", - "pool.refresh.prices": "Obnovit ceny", - "pool.removeLiquidity": "Odstraňte likviditu", - "pool.rewardsPool.label": "Žetony fondu ve fondu odměn:", - "pool.selectedRange": "Vybraný rozsah", - "pool.selectPair": "Vyberte pár", - "pool.share": "Ceny a podíl na bazénu", - "pool.share.label": "Váš podíl na bazénu:", - "pool.shareOf": "Podíl fondu:", - "pool.showClosed": "Zobrazit uzavřené pozice", - "pool.specificPosition": "{{symbol}} pozici", - "pool.startingPrice": "Od {{sym}} Cena:", - "pool.supply": "Zásobování", - "pool.supplyingMaths": "Dodáváme {{amtA}} {{symA}} a {{amtB}} {{symB}}", - "pool.tokenPair": "Tokenový pár", - "pool.top": "Špičkové bazény", - "pool.top.tvl": "Nejlepší bazény podle TVL", - "pool.totalTokens": "Vaše celkové žetony fondu:", - "pool.uncollectedFees": "Nevybrané poplatky", - "pool.v2": "v2 bazény", - "pool.v2.add": "Přidejte likviditu V2", - "pool.v2.migratev3": "Migrujte likviditu do V3", - "pool.v2liquidity": "Likvidita V2", - "pool.v3": "v3 bazény", - "pool.v4": "v4 bazény", - "pool.viewUncollectedFees": "Prohlédněte si nevybrané poplatky a analýzy", - "pool.volOverTvl": "1D obj./TVL", - "pool.volume.thirtyDay": "30denní objem", - "pool.volume.thirtyDay.short": "30D sv", - "pool.withdrawAs": "Odeberte jako {{nativeWrappedSymbol}}", - "pool.yourv2": "Vaše likvidita V2", - "poolFinder.availablePools": "K dispozici bazény", - "poolFinder.availablePools.found.description": "v2 bazény odpovídající vašemu výběru páru.", - "poolFinder.availablePools.notFound.description": "Nebyly nalezeny žádné odpovídající fondy v2. Znovu zkontrolujte výběr tokenu a ujistěte se, že jste připojeni ke správné peněžence.", - "pools.approving.amount": "Schvalování {{amount}}", - "pools.explore": "Prozkoumejte bazény", - "position.addHook": "Přidejte háček", - "position.addHook.tooltip": "Háky jsou pokročilou funkcí, která umožňuje fondům komunikovat s chytrými smlouvami a odemykat různé možnosti. Při přidávání háčků buďte opatrní, protože některé mohou být škodlivé nebo způsobit nezamýšlené následky.", - "position.addingHook": "Přidání háčku", - "position.addingHook.disclaimer": "Přidání háčků může mít nezamýšlené následky. Proveďte svůj výzkum a pokračujte na vlastní nebezpečí.", - "position.addingHook.hideProperties": "Skrýt vlastnosti", - "position.addingHook.invalidAddress": "Zadejte platnou adresu zavěšení", - "position.addingHook.viewProperties": "Zobrazit vlastnosti", - "position.appearHere": "Zde se zobrazí vaše pozice.", - "position.create.invalidPrice": "Neplatná cena", - "position.create.invalidRange": "Neplatný rozsah", - "position.create.modal.header": "Vytváření pozice", - "position.currentValue": "Hodnota aktuální pozice", - "position.deposit.description": "Uveďte symbolické částky pro váš příspěvek likvidity.", - "position.depositedCurrency": "Vloženo {{currencySymbol}}", - "position.hook.disclaimer": "Chápu potenciální rizika spojená s přidáním tohoto háčku.", - "position.hook.donateWarning": "Tento příznak může vést ke změnám získaných poplatků.", - "position.hook.liquidityWarning": "Tento příznak může způsobit, že fond zablokuje přidávání nové likvidity. Vaše transakce se může vrátit.", - "position.hook.removeWarning": "Může způsobit uzamčení vašich prostředků nebo blokování vybírání poplatků.", - "position.hook.swapWarning": "Tento příznak může poskytovatelům likvidity umožnit snadněji využívat likviditu Just-In-Time, což může vést k nižším získaným poplatkům.", - "position.hook.warningHeader": "Důležité: Zjištěna rizika háčků", - "position.hook.warningInfo": "Identifikovali jsme potenciální rizika s tímto hákem. Než se rozhodnete pokračovat, ujistěte se, že rozumíte tomu, jak tento háček funguje.", - "position.initialPrice": "Počáteční cena", - "position.initialPrice.info": "Nastavte počáteční směnný kurz mezi dvěma tokeny, které poskytujete.", - "position.migrate.liquidity": "Při migraci pozic nemůžete změnit svůj pár tokenů, ale můžete přidat háček pro vylepšení funkčnosti.", - "position.migrate.v4unsupportedChain": "Tento řetězec není podporován pro fondy v4.", - "position.new": "Nová pozice", - "position.new.protocol": "Nová pozice {{protocol}}", - "position.noLiquidity": "Údaje o likviditě nejsou k dispozici.", - "position.noLiquidityData": "Neexistují žádné údaje o likviditě.", - "position.notFound": "Pozice nenalezena", - "position.notFound.description": "Podrobnosti o této pozici nejsou k dispozici. Zkontrolujte, zda jste připojeni ke správné peněžence.", - "position.protocol": "{{protocol}} pozici", - "position.provide.liquidity": "Vyberte tokeny, pro které chcete poskytnout likviditu. Tokeny můžete vybrat ve všech podporovaných sítích.", - "position.provide.liquidityDescription": "Poskytování likvidity v plném rozsahu zajišťuje nepřetržitou účast na trhu napříč všemi možnými cenami, nabízí jednoduchost, ale s potenciálem vyšších nestálých ztrát.", - "position.provide.liquidityDescription.custom": "Vlastní rozsah vám umožňuje soustředit vaši likviditu v rámci konkrétních cenových hranic, čímž se zvyšuje kapitálová efektivita a výnosy z poplatků, ale vyžaduje se aktivnější správa.", - "position.removeHook": "Odstraňte háček", - "position.resetDescription": "Vaše výběry tokenů, ceny a rozsahu budou resetovány.", - "position.setRange": "Nastavit cenové rozpětí", - "position.setRange.inputsBelow": "Pomocí níže uvedených vstupů nastavte svůj rozsah.", - "position.step.deposit": "Zadejte částky vkladu", - "position.step.price": "Nastavte počáteční cenu", - "position.step.range": "Nastavit cenové rozpětí", - "position.step.select": "Vyberte pár tokenů a poplatky", - "position.value": "Hodnota pozice", - "position.valueUnavailable": "Hodnota v USD je pro tuto pozici momentálně nedostupná. Pro vložené částky tokenů viz podrobnosti o pozici.", - "position.your": "Tvoje pozice", - "positions.welcome": "Vítejte na svých pozicích", - "positions.welcome.connect": "Připojte svou peněženku, abyste viděli své aktuální pozice.", - "privacy.anonymizedLogs": "Aplikace zaznamenává anonymizované statistiky používání, aby se postupem času zlepšovala.", - "privacy.autoRouter": "Aplikace načte optimální obchodní cestu ze serveru Uniswap Labs.", - "privacy.infura": "Aplikace načítá data v řetězci a vytváří smluvní volání pomocí Infura API.", - "privacy.thirdPartyApis": "Tato aplikace používá následující rozhraní API třetích stran:", - "privacy.trm": "Aplikace bezpečně shromažďuje adresu vaší peněženky a sdílí ji s TRM Labs Inc. z důvodu rizika a dodržování předpisů.", - "privacy.uniswaptos": "Podmínky služby Uniswap Labs", - "qrScanner.button.connections_one": "1 připojená aplikace", - "qrScanner.button.connections_other": "{{count}} připojených aplikací", - "qrScanner.error.camera.message": "Chcete-li naskenovat kód, povolte v nastavení systému přístup k fotoaparátu", - "qrScanner.error.camera.title": "Kamera je deaktivována", - "qrScanner.error.none": "Nebyl nalezen žádný QR kód", - "qrScanner.recipient.action.scan": "Naskenujte QR kód", - "qrScanner.recipient.action.show": "Ukaž můj QR kód", - "qrScanner.recipient.error.message": "Než to zkusíte znovu, ujistěte se, že skenujete platný QR kód adresy Ethereum.", - "qrScanner.recipient.error.title": "Neplatný QR kód", - "qrScanner.request.message.unavailable": "Nebyla nalezena žádná zpráva.", - "qrScanner.request.method.default": "Žádost od {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "Žádost o podpis od {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "Žádost o transakci od {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "Povolit {{dappName}} použít až {{amount}} {{currencySymbol}}?", - "qrScanner.request.withoutAmount": "Povolit {{dappName}} používat vaše {{currencySymbol}}?", - "qrScanner.status.connecting": "Spojovací...", - "qrScanner.status.loading": "Načítání...", - "qrScanner.title": "Naskenujte QR kód", - "qrScanner.wallet.networks": "Podporované sítě", - "qrScanner.wallet.title": "Můžete odesílat a přijímat tokeny a NFT ve všech našich {{numOfNetworks}} podporovaných sítích.", - "range.outOfView": "Rozsah mimo dohled", - "removeLiquidity.collectFees": "Budete také vybírat poplatky získané z této pozice.", - "removeLiquidity.outputEstimated": "Výkon se odhaduje. Pokud se cena změní o více než {{allowed}}% vaše transakce se vrátí zpět.", - "removeLiquidity.pendingText": "Odebírání {{amtA}} {{symA}} a {{amtB}} {{symB}}", - "removeLiquidity.pooled": "Sdruženo {{symbol}}:", - "removeLiquidity.removing": "Odebírání {{amt1}} {{symbol1}} a {{amt2}} {{symbol2}}", - "removeLiquidity.removingTokensTip": "Tip: Odebráním tokenů fondu převedete vaši pozici zpět na podkladové tokeny aktuálním tempem, úměrným vašemu podílu na fondu. Nevybrané poplatky jsou zahrnuty v částkách, které obdržíte.", - "removeLiquidity.uniBurned": "UNI {{a}}/{{b}} Spáleno", - "revoke.failed.message": "To poskytuje přístup protokolu Uniswap k vašemu tokenu pro obchodování.", - "routing.aggregateLiquidity": "Jsou-li k dispozici, agreguje zdroje likvidity za lepší ceny a swapy bez plynu.", - "routing.cheapest": "Klient Uniswap vybere nejlevnější faktoringovou cenu obchodní opce a síťové náklady.", - "routing.cheapest.v4": "Klient Uniswap vybere optimální obchodní variantu s ohledem na cenu a síťové náklady.", - "scantastic.code.expired": "Platnost vypršela", - "scantastic.code.subtitle": "Zadejte tento kód do rozšíření Uniswap. Vaše fráze pro obnovení bude bezpečně zašifrována a přenesena.", - "scantastic.code.timeRemaining.shorthand.hours": "Nový kód za {{hours}}h {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.minutes": "Nový kód za {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.seconds": "Nový kód za {{seconds}}s", - "scantastic.code.title": "Uniswap jednorázový kód", - "scantastic.confirmation.button.continue": "Ano, pokračovat", - "scantastic.confirmation.label.browser": "Prohlížeč", - "scantastic.confirmation.label.device": "přístroj", - "scantastic.confirmation.subtitle": "Pokračujte pouze v případě, že skenujete QR kód z Uniswap Extension na důvěryhodném zařízení.", - "scantastic.confirmation.title": "Pokoušíte se importovat svou peněženku?", - "scantastic.confirmation.warning": "Dejte si pozor na weby a aplikace vydávající se za Uniswap. Jinak může být ohrožena vaše peněženka.", - "scantastic.error.encryption": "Nepodařilo se připravit počáteční frázi.", - "scantastic.error.noCode": "Nebylo přijato žádné OTP. Prosím zkuste to znovu.", - "scantastic.error.timeout.message": "Znovu naskenujte QR kód na Uniswap Extension a pokračujte v synchronizaci vaší peněženky.", - "scantastic.error.timeout.title": "Vypršel časový limit vašeho připojení", - "scantastic.modal.ipMismatch.description": "Pro naskenování tohoto QR kódu musí být váš telefon připojen ke stejné WiFi síti jako váš počítač a všechny VPN by měly být dočasně vypnuty.", - "scantastic.modal.ipMismatch.title": "Přepněte svou WiFi síť", - "search.chainComing": "Již brzy: hledejte a prozkoumávejte žetony v řetězci {{chainName}}", - "search.results.count_one": "1 položka", - "search.results.count_other": "{{count}} položek", - "search.ukDisclaimer": "Zřeknutí se odpovědnosti pro obyvatele Spojeného království", - "send.button.review": "Zkontrolujte přenos", - "send.gas.error.title": "N/A", - "send.gas.networkCost.title": "Náklady na síť", - "send.input.token.balance.title": "Zůstatek: {{balance}} {{symbol}}", - "send.recipient.header": "Vyberte příjemce", - "send.recipient.input.placeholder": "Vyhledejte ENS nebo adresu", - "send.recipient.previous_one": "1 předchozí převod", - "send.recipient.previous_other": "{{count}} předchozí převody", - "send.recipient.results.empty": "Nebyly nalezeny žádné výsledky", - "send.recipient.results.error": "Adresa, kterou jste zadali, buď neexistuje, nebo je napsána špatně.", - "send.recipient.section.favorite": "Oblíbené peněženky", - "send.recipient.section.recent": "Nedávné", - "send.recipient.section.search": "Výsledky vyhledávání", - "send.recipient.section.viewOnly": "Peněženky pouze pro prohlížení", - "send.recipient.section.yours": "Vaše peněženky", - "send.recipient.warning.viewOnly.message": "Do této peněženky posílejte prostředky pouze v případě, že máte frázi pro obnovení nebo znáte vlastníka peněženky.", - "send.recipient.warning.viewOnly.title": "Máte to jako peněženku pouze pro prohlížení", - "send.recipientSelect.search.empty.message": "Když odešlete tokeny na adresu peněženky, zobrazí se zde", - "send.recipientSelect.search.empty.title": "Nejsou uloženy žádné peněženky", - "send.review.modal.title": "Ty posíláš", - "send.review.summary.button.title": "Potvrďte odeslání", - "send.search.empty.subtitle": "Adresa, kterou jste zadali, buď neexistuje, nebo je napsána špatně.", - "send.search.empty.title": "Nebyly nalezeny žádné výsledky", - "send.search.placeholder": "Vyhledejte ENS nebo adresu", - "send.title": "Poslat", - "send.warning.blocked.default": "Tato peněženka je zablokovaná", - "send.warning.blocked.modal.message": "Tato adresa je na Uniswap Wallet blokována, protože je spojena s jednou nebo více zablokovanými aktivitami. Pokud se domníváte, že se jedná o chybu, zašlete e-mail na adresu compliance@uniswap.org.", - "send.warning.blocked.modal.title": "Blokovaná adresa", - "send.warning.blocked.recipient": "Peněženka příjemce je zablokována", - "send.warning.erc20.message": "Pokoušíte se poslat prostředky na tokenovou adresu. Odeslání kryptoměn na tento typ adresy může mít za následek trvalou ztrátu finančních prostředků.", - "send.warning.erc20.title": "Toto je tokenová adresa", - "send.warning.insufficientFunds.message": "Váš zůstatek {{currencySymbol}} se snížil, protože jste zadali částku, kterou chcete poslat", - "send.warning.insufficientFunds.title": "Nestačí {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "Nedostatek {{currencySymbol}} na {{networkName}} k odeslání", - "send.warning.insufficientGas.message.withoutNetwork": "Nedostatek {{currencySymbol}} k odeslání", - "send.warning.modal.button.cta.blocking": "OK", - "send.warning.modal.button.cta.cancel": "zrušení", - "send.warning.modal.button.cta.confirm": "Potvrdit", - "send.warning.newAddress.details.ENS": "ENS", - "send.warning.newAddress.details.username": "Uživatelské jméno", - "send.warning.newAddress.details.walletAddress": "Adresa peněženky", - "send.warning.newAddress.message": "S touto adresou jste dosud neprováděli žádné transakce. Než budete pokračovat, potvrďte, že je adresa správná.", - "send.warning.newAddress.title": "Nová adresa", - "send.warning.restore": "Obnovte svou peněženku k odeslání", - "send.warning.self.message": "Pokoušíte se poslat peníze do své aktuální peněženky. Odesláním kryptoměny na tuto adresu vzniknou zbytečné síťové náklady.", - "send.warning.self.title": "Toto je vaše aktuální peněženka", - "send.warning.smartContract.message": "Chystáte se odeslat tokeny na speciální typ adresy – inteligentní smlouvu. Znovu zkontrolujte, zda se jedná o adresu, na kterou chcete odeslat. Pokud je to špatně, vaše žetony mohou být navždy ztraceny.", - "send.warning.smartContract.title": "Je to adresa peněženky?", - "send.warning.viewOnly.message": "Chcete-li odeslat aktiva, musíte tuto peněženku importovat pomocí fráze pro obnovení.", - "send.warning.viewOnly.title": "Tato peněženka je pouze pro prohlížení", - "sendRecipientForm.recentAddresses.label": "Nedávné", - "sendReviewModal.title": "Odeslat recenzi", - "setting.recoveryPhrase.account.show": "Zobrazit frázi pro obnovení", - "setting.recoveryPhrase.action.hide": "Skrýt frázi pro obnovení", - "setting.recoveryPhrase.remove": "Odebrat frázi pro obnovení", - "setting.recoveryPhrase.remove.confirm.subtitle": "Chápu, že Uniswap Labs mi nemůže pomoci obnovit moji peněženku, pokud tak neučiním.", - "setting.recoveryPhrase.remove.confirm.title": "Uložil jsem si frázi pro obnovení", - "setting.recoveryPhrase.remove.initial.subtitle": "Ujistěte se, že jste si uložili frázi pro obnovení. Jinak ztratíte přístup ke svým peněženkám", - "setting.recoveryPhrase.remove.initial.title": "Než budete pokračovat", - "setting.recoveryPhrase.remove.password.error": "Špatné heslo. Zkus to znovu", - "setting.recoveryPhrase.remove.subtitle": "Pro potvrzení zadejte své heslo", - "setting.recoveryPhrase.remove.title": "Odstraňujete frázi pro obnovení ", - "setting.recoveryPhrase.title": "Vaše obnovovací fráze", - "setting.recoveryPhrase.view.warning.message1": "Kdokoli, kdo zná vaši frázi pro obnovení, má přístup k vaší peněžence a finančním prostředkům", - "setting.recoveryPhrase.view.warning.message2": "Zobrazit toto v soukromí", - "setting.recoveryPhrase.view.warning.message3": "S nikým nesdílejte", - "setting.recoveryPhrase.view.warning.message4": "Nikdy jej nezadávejte na žádné webové stránky nebo aplikace", - "setting.recoveryPhrase.view.warning.title": "Než budete pokračovat", - "setting.recoveryPhrase.warning.screenshot.message": "Kdokoli, kdo získá přístup k vašim fotografiím, má přístup k vaší peněžence. Doporučujeme, abyste si svá slova zapsali.", - "setting.recoveryPhrase.warning.screenshot.title": "Snímky obrazovky nejsou zabezpečené", - "setting.recoveryPhrase.warning.view.message": "Kdokoli, kdo zná vaši frázi pro obnovení, má přístup k vaší peněžence a finančním prostředkům.", - "setting.recoveryPhrase.warning.view.title": "Zobrazit na soukromém místě", - "settings.action.enableInSettings": "Povolit v Nastavení", - "settings.action.feedback": "Sdílejte zpětnou vazbu", - "settings.action.help": "Získejte pomoc", - "settings.action.lock": "Zamknout peněženku", - "settings.action.privacy": "Zásady ochrany osobních údajů", - "settings.action.terms": "Podmínky služby", - "settings.footer": "Vyrobeno s láskou, \nUniswap Team 🦄", - "settings.hideSmallBalances": "Skryjte malé zůstatky", - "settings.maxSlippage": "Max. uklouznutí", - "settings.screen.appearance.title": "Vzhled", - "settings.section.about": "O", - "settings.section.preferences": "Předvolby", - "settings.section.security": "Bezpečnostní", - "settings.section.support": "Podpěra, podpora", - "settings.section.wallet.button.viewAll": "Zobrazit vše", - "settings.section.wallet.button.viewLess": "Zobrazit méně", - "settings.section.wallet.label.viewOnly": "Pouze zobrazení", - "settings.section.wallet.title": "Nastavení peněženky", - "settings.setting.appearance.option.auto": "Auto", - "settings.setting.appearance.option.dark.subtitle": "Vždy používejte tmavý režim", - "settings.setting.appearance.option.dark.title": "Tmavý režim", - "settings.setting.appearance.option.device.subtitle": "Výchozí pro vzhled vašeho zařízení", - "settings.setting.appearance.option.device.title": "Nastavení zařízení", - "settings.setting.appearance.option.light.subtitle": "Vždy používejte světelný režim", - "settings.setting.appearance.option.light.title": "Světelný režim", - "settings.setting.appearance.title": "Vzhled", - "settings.setting.backup.create.description": "Nastavením hesla zašifrujete zálohu fráze pro obnovení a přidáte další úroveň ochrany, pokud bude váš účet {{cloudProviderName}} někdy kompromitován.", - "settings.setting.backup.create.title": "Zálohujte na {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "Protože tyto peněženky sdílejí frázi pro obnovení, odstraní také zálohy těchto peněženek níže", - "settings.setting.backup.delete.confirm.title": "Jsi si jistá?", - "settings.setting.backup.delete.warning": "Pokud smažete zálohu {{cloudProviderName}} , budete moci obnovit svou peněženku pouze pomocí ruční zálohy vaší fráze pro obnovení. Uniswap Labs nemůže obnovit vaše aktiva, pokud ztratíte frázi pro obnovení.", - "settings.setting.backup.error.message.full": "Nelze zálohovat frázi pro obnovení na {{cloudProviderName}}. Ujistěte se, že máte povoleno {{cloudProviderName}} s dostupným úložným prostorem, a zkuste to znovu.", - "settings.setting.backup.error.message.short": "Zálohu nelze smazat", - "settings.setting.backup.error.title": "{{cloudProviderName}} chyba", - "settings.setting.backup.modal.description": "Dosud jste nezálohovali svou frázi pro obnovení do {{cloudProviderName}} . Tímto způsobem můžete obnovit svou peněženku pouhým přihlášením do {{cloudProviderName}} na jakémkoli zařízení.", - "settings.setting.backup.modal.title": "Zálohovat frázi pro obnovení na {{cloudProviderName}}?", - "settings.setting.backup.password.error.mismatch": "Hesla se neshodují", - "settings.setting.backup.password.medium": "Toto je střední heslo", - "settings.setting.backup.password.placeholder.confirm": "Potvrďte heslo", - "settings.setting.backup.password.placeholder.create": "Vytvořit heslo", - "settings.setting.backup.password.strong": "Toto je silné heslo", - "settings.setting.backup.password.weak": "Toto je slabé heslo", - "settings.setting.backup.recoveryPhrase.label": "Fráze obnovy", - "settings.setting.backup.selected": "{{cloudProviderName}} záloha", - "settings.setting.backup.status.action.delete": "Smazat zálohu", - "settings.setting.backup.status.complete": "Zálohováno na {{cloudProviderName}}", - "settings.setting.backup.status.description": "Když si svou frázi pro obnovení zálohujete na {{cloudProviderName}}, můžete obnovit svou peněženku pouhým přihlášením ke svému účtu {{cloudProviderName}} na jakémkoli zařízení.", - "settings.setting.backup.status.inProgress": "Zálohování do {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "Zálohovaný", - "settings.setting.backup.status.title": "{{cloudProviderName}} záloha", - "settings.setting.beta.tooltip": "Již brzy", - "settings.setting.biometrics.appAccess.subtitle.android": "Vyžadovat biometrické údaje k otevření aplikace", - "settings.setting.biometrics.appAccess.subtitle.ios": "Vyžadovat {{biometricsMethod}} k otevření aplikace", - "settings.setting.biometrics.appAccess.title": "Přístup k aplikaci", - "settings.setting.biometrics.auth": "Prosím o ověření", - "settings.setting.biometrics.off.message.android": "Biometrie je momentálně pro Uniswap Wallet vypnutá – můžete ji zapnout v nastavení systému.", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} je aktuálně vypnuto pro Uniswap Wallet – můžete ji zapnout v nastavení systému.", - "settings.setting.biometrics.off.title.android": "Biometrie je vypnutá", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} je vypnuto", - "settings.setting.biometrics.title": "Biometrie", - "settings.setting.biometrics.transactions.subtitle.android": "K transakci vyžadovat biometrické údaje", - "settings.setting.biometrics.transactions.subtitle.ios": "K transakci vyžadovat {{biometricsMethod}}", - "settings.setting.biometrics.transactions.title": "Transakce", - "settings.setting.biometrics.unavailable.message.android": "Ve vašem zařízení není nastavena biometrie. Chcete-li používat biometrii, nejprve ji nastavte v Nastavení.", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} není ve vašem zařízení nastaveno. Chcete-li používat {{biometricsMethod}}, nejprve jej nastavte v Nastavení.", - "settings.setting.biometrics.unavailable.title.android": "Biometrie není nastavena", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} není nastaveno", - "settings.setting.biometrics.warning.message.android": "Pokud nezapnete biometrii, kdokoli, kdo získá přístup k vašemu zařízení, může otevřít Uniswap Wallet a provádět transakce.", - "settings.setting.biometrics.warning.message.ios": "Pokud nezapnete {{biometricsMethod}}, kdokoli, kdo získá přístup k vašemu zařízení, může otevřít Uniswap Wallet a provádět transakce.", - "settings.setting.biometrics.warning.title": "Jsi si jistá?", - "settings.setting.connections.disconnectAll": "Odpojit vše", - "settings.setting.connections.noConnectionsDescription": "Připojte se k aplikaci vyhledáním tlačítka „Připojit peněženku“ nebo „Přihlásit se“.", - "settings.setting.currency.title": "Místní měna", - "settings.setting.hapticTouch.title": "Haptický dotek", - "settings.setting.helpCenter.title": "Centrum nápovědy", - "settings.setting.language.button.navigate": "Jdi do nastavení", - "settings.setting.language.description.extension": "Uniswap výchozí nastavení jazyka vašeho systému. Chcete-li změnit preferovaný jazyk, přejděte do nastavení systému.", - "settings.setting.language.description.mobile": "Uniswap výchozí nastavení jazyka vašeho zařízení. Chcete-li změnit preferovaný jazyk, přejděte v nastavení zařízení na „Uniswap“ a klepněte na „Jazyk“.", - "settings.setting.language.title": "Jazyk", - "settings.setting.notifications.row.activity.description": "Převody, požadavky a další aktivity", - "settings.setting.notifications.row.activity.title": "Aktivita peněženky", - "settings.setting.notifications.row.priceAlerts.description": "Velké změny cen za oblíbené tokeny", - "settings.setting.notifications.row.priceAlerts.title": "Upozornění na cenu", - "settings.setting.notifications.row.updates.description": "Doporučení a nové funkce", - "settings.setting.notifications.row.updates.title": "Aktualizace z Uniswapu", - "settings.setting.notifications.title": "Oznámení", - "settings.setting.password.title": "Změnit heslo", - "settings.setting.privacy.analytics.description": "Anonymní údaje o používání používáme k vylepšení vašich zkušeností s produkty Uniswap Labs. Když je zakázáno, sledujeme pouze chyby a nezbytné použití.", - "settings.setting.privacy.analytics.title": "Povolit analýzu", - "settings.setting.privacy.title": "Soukromí", - "settings.setting.recoveryPhrase.password.title": "Zadejte heslo", - "settings.setting.recoveryPhrase.title": "Fráze obnovy", - "settings.setting.smallBalances.title": "Skryjte malé zůstatky", - "settings.setting.unknownTokens.title": "Skryjte neznámé tokeny", - "settings.setting.wallet.action.editLabel": "Upravit štítek", - "settings.setting.wallet.action.editProfile": "Upravit profil", - "settings.setting.wallet.action.remove": "Odstraňte peněženku", - "settings.setting.wallet.connections.title": "Spojení", - "settings.setting.wallet.editLabel.description": "Štítky nejsou veřejné. Jsou uloženy lokálně a jsou viditelné pouze pro vás.", - "settings.setting.wallet.editLabel.save": "Uložit změny", - "settings.setting.wallet.label": "Přezdívka", - "settings.setting.wallet.testnetMode.description": "To zapíná testovací sítě pro vývojáře, aby mohli vyzkoušet funkce a transakce bez použití skutečných aktiv. Tokeny na testovacích sítích nemají žádnou skutečnou hodnotu.", - "settings.setting.wallet.testnetMode.title": "Režim Testnet", - "settings.switchNetwork.warning": "Chcete-li používat Uniswap na {{label}}, přepněte síť v nastavení peněženky.", - "settings.title": "Nastavení", - "settings.version": "Verze {{appVersion}}", - "speedBump.newAddress.warning.description": "S touto adresou jste dosud neprováděli žádné transakce. Než budete pokračovat, ujistěte se, že se jedná o správnou adresu.", - "speedBump.newAddress.warning.title": "Nová adresa", - "speedBump.smartContractAddress.warning.description": "Chystáte se odeslat tokeny na speciální typ adresy – smart kontrakt. Znovu zkontrolujte, zda se jedná o adresu, na kterou chcete odeslat. Pokud je to špatně, vaše žetony mohou být navždy ztraceny.", - "speedBump.smartContractAddress.warning.title": "Je to adresa peněženky?", - "stats.24fees": "24h poplatky", - "stats.24volume": "Hlasitost 24h", - "stats.allTimeFees": "Všechny poplatky za LP", - "stats.allTimeSwappers": "Swapeři všech časů", - "stats.allTimeVolume": "Celoroční objem", - "stats.fdv": "FDV", - "stats.fdv.description": "Plně zředěné ocenění (FDV) vypočítá celkovou tržní hodnotu za předpokladu, že všechny tokeny jsou v oběhu.", - "stats.marketCap": "Tržní kapitalizace", - "stats.marketCap.description": "Tržní kapitalizace je celková tržní hodnota obíhající nabídky aktiva.", - "stats.tvl": "Celková hodnota uzamčena", - "stats.tvl.description": "Total value locked (TVL) je souhrnná částka aktiv dostupných ve všech fondech likvidity Uniswap v3.", - "stats.volume.1d": "1denní objem", - "stats.volume.1d.description": "Objem za 1 den je množství aktiv, které bylo zobchodováno na Uniswap v3 během posledních 24 hodin.", - "stats.volume.1d.short": "1D sv", - "stats.volume.description": "Objem je množství aktiva, které bylo obchodováno na Uniswap v3 během zvoleného časového rámce.", - "swap.allow.oneTime": "Povolit {{sym}} (jednou)", - "swap.approvalNeeded": "Použití tohoto tokenu vyžaduje schválení. ", - "swap.approvalPending": "Čeká se na schválení", - "swap.approveAndSubmit": "Schválit a odeslat", - "swap.approveAndSwap": "Schválit a vyměnit", - "swap.approveInWallet": "Schválit v peněžence", - "swap.balance.amount": "Zůstatek: {{amount}}", - "swap.bestRoute.cost": "Odhaduje se, že nejúčinnější trasa stojí ~{{gasPrice}} nákladů na síť. ", - "swap.details.estimatedTime": "Odhad. čas", - "swap.bridging.title": "Výměna napříč sítěmi", - "swap.bridging.warning.description": "Přepínáte z {{fromNetwork}} na {{toNetwork}}. Toto je také známé jako \"přemostění\", které přesune vaše tokeny z jedné sítě do druhé.", - "swap.button.max": "Max", - "swap.button.review": "Posouzení", - "swap.button.submitting": "Odesílání výměny...", - "swap.button.submitting.keep.open": "Mějte peněženku otevřenou...", - "swap.button.swap": "Vyměňte", - "swap.button.swapAnyways": "Každopádně vyměnit", - "swap.button.unwrap": "Rozbalit", - "swap.button.wrap": "Zabalit", - "swap.buy.countryModal.placeholder": "Vyhledávání podle země nebo regionu", - "swap.cancel.cannotExecute_one": "Váš swap se může provést před zpracováním zrušení. Vaše síťové náklady nelze vrátit. Přejete si pokračovat?", - "swap.cancel.cannotExecute_other": "Vaše swapy se mohou provést před zpracováním zrušení. Vaše síťové náklady nelze vrátit. Přejete si pokračovat?", - "swap.confirmLimit": "Potvrďte limit", - "swap.confirmSwap": "Potvrďte výměnu", - "swap.deadline.settings.title": "Termín transakce", - "swap.deadline.settings.title.short": "Tx. lhůta", - "swap.details.feeOnTransfer": "{{tokenSymbol}} poplatek", - "swap.details.feeOnTransfer.default": "Token poplatek", - "swap.details.newQuote.input": "Nový vstup", - "swap.details.newQuote.output": "Nový výstup", - "swap.details.orderRouting": "Směrování objednávky", - "swap.details.orderRoutingInfo": "Tento swap je směrován přes Across, decentralizovaný protokol, který přesouvá aktiva napříč sítěmi a přitom upřednostňuje bezpečnost, rychlé provedení a nízké ceny.", - "swap.details.poweredBy": "Provozováno na", - "swap.details.rate": "Hodnotit", - "swap.details.slippage": "Maximální prokluz", - "swap.details.uniswapFee": "Poplatek", - "swap.enterAmount": "Zadejte částku {{sym}}", - "swap.error.default": "Možná budete muset zvýšit toleranci prokluzu. Poznámka: Tokeny poplatků za převod a rebase nejsou kompatibilní s Uniswap V3.", - "swap.error.expectedToFail": "Očekává se, že váš swap selže.", - "swap.error.modifiedByWallet": "Váš swap byl upraven prostřednictvím vaší peněženky. Pokud to byla chyba, okamžitě ji zrušte, jinak riskujete ztrátu svých prostředků.", - "swap.error.rejected": "Transakce zamítnuta", - "swap.error.undefinedObject": "Při pokusu o provedení tohoto swapu došlo k chybě. Možná budete muset zvýšit toleranci prokluzu. Pokud to nefunguje, může dojít k nekompatibilitě s tokenem, který obchodujete. Poznámka: Tokeny poplatků za převod a rebase nejsou kompatibilní s Uniswap V3.", - "swap.error.unknown": "Neznámá chyba.", - "swap.error.v2.expired": "Tuto transakci nebylo možné odeslat, protože vypršel termín. Zkontrolujte prosím, zda váš termín transakce není příliš krátký.", - "swap.error.v2.k": "Uniswapový invariant x*y=k nebyl splněn swapem. To obvykle znamená, že jeden z tokenů, které vyměňujete, zahrnuje vlastní chování při přenosu.", - "swap.error.v2.slippage": "Tato transakce nebude úspěšná ani kvůli pohybu ceny, ani poplatku za převod. Zkuste zvýšit toleranci prokluzu", - "swap.error.v2.transferInput": "Vstupní token nelze přenést. Může být problém se vstupním tokenem.", - "swap.error.v2.transferOutput": "Výstupní token nelze přenést. Může být problém s výstupním tokenem.", - "swap.error.v3.slippage": "Tato transakce nebude úspěšná kvůli pohybu cen. Zkuste zvýšit toleranci prokluzu. Poznámka: Poplatky za převod a rebase tokeny nejsou kompatibilní s Uniswap V3.", - "swap.error.v3.transferOutput": "Výstupní token nelze přenést. Může být problém s výstupním tokenem. Poznámka: Poplatky za převod a rebase tokeny nejsou kompatibilní s Uniswap V3.", - "swap.estimatedDifference.label": "Mezi vašimi vstupními a výstupními hodnotami bude velký rozdíl kvůli aktuální likviditě.", - "swap.fail.message": "Zkuste upravit prokluz na vyšší hodnotu.", - "swap.fail.uniswapX": "Swap nebylo možné dokončit pomocí UniswapX. Zkuste svůj swap znovu a směrujte jej přes klasické Uniswap API.", - "swap.fees.experience": "Tento poplatek se vztahuje na některé páry tokenů, aby byla zajištěna nejlepší zkušenost s Uniswap. Je zaplacena ve výstupním tokenu a již byla započítána do cenové nabídky.", - "swap.fees.noFee": "Poplatky jsou účtovány na vybrané páry tokenů, aby byla zajištěna nejlepší zkušenost s Uniswap. S touto výměnou není spojen žádný poplatek.", - "swap.fetchingBestPrice": "Načítání nejlepší ceny...", - "swap.fetchingPrice": "Načítání ceny...", - "swap.finalizingQuote": "Dokončování cenové nabídky...", - "swap.form.header": "Vyměňte", - "swap.form.insufficientLiquidity": "Nedostatečná likvidita pro tento obchod.", - "swap.form.pocketUniverseExtension.warning": "Rozšíření Pocket Universe porušuje naše úpravou našeho produktu způsobem, který je zavádějící a může poškodit uživatele. Deaktivujte prosím rozšíření a znovu načtěte stránku.", - "swap.form.warning.output.fotFees": "Vzhledem k poplatku za token {{fotCurrencySymbol}}lze swapové částky zadat pouze pomocí vstupního pole", - "swap.form.warning.output.fotFees.fallback": "Kvůli poplatkům za tokeny lze swapové částky zadat pouze pomocí vstupního pole", - "swap.form.warning.restore": "Obnovte svou peněženku k výměně", - "swap.frontrun.warning": "Vaše transakce může být frontrun a výsledkem může být nevýhodný obchod.", - "swap.header.viewOnly": "Pouze zobrazení", - "swap.impactOfTrade": "Vliv vašeho obchodu na tržní cenu tohoto fondu.", - "swap.inputEstimated.atMost": "Vstup se odhaduje. Prodáte maximálně nebo se transakce vrátí zpět.", - "swap.limit": "Omezit", - "swap.limitedAssets.warning": "Některá aktiva nejsou prostřednictvím tohoto rozhraní dostupná, protože nemusí dobře fungovat s chytrými smlouvami nebo z právních důvodů nemůžeme povolit obchodování.", - "swap.limitFilled": "Limit naplněn!", - "swap.limitSubmitted": "Limit odeslán", - "swap.marketPrice.outsideRange.label": "Tržní cena je mimo vámi zadaný cenový rozsah. Pouze jednorázový vklad.", - "swap.maxPriceSlip.revert": "Maximální částka, kterou zaručeně utratíte. Pokud cena klesne ještě více, vaše transakce se vrátí zpět.", - "swap.minPriceSlip.revert": "Pokud se cena posune tak, že obdržíte méně než {{amount}}, vaše transakce se vrátí zpět.", - "swap.networkCost.paidIn": "Síťové náklady se platí v {{sym}} v síti {{chainName}} za účelem transakce.", - "swap.orderRouting": "Směrování objednávky", - "swap.outputEstimated.atLeast": "Výkon se odhaduje. Obdržíte alespoň , jinak se transakce vrátí zpět.", - "swap.payAnyway": "Každopádně zaplatit", - "swap.payAtMost": "Maximálně zaplatit", - "swap.payWith": "Platit", - "swap.placeOrder": "Objednejte si", - "swap.priceImpact": "Vliv ceny", - "swap.receive.atLeast": "Přijmout alespoň", - "swap.request.title.full": "Vyměňte {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "Vyměňte si tokeny", - "swap.review": "Výměna recenze", - "swap.review.summary": "Vyměňujete se", - "swap.reviewLimit": "Limit kontroly", - "swap.route.optimizedGasCost": "Tato trasa bere v úvahu rozdělené trasy, více skoků a síťové náklady každého kroku.", - "swap.settings.deadline.tooltip": "Vaše transakce bude vrácena, pokud bude nevyřízena déle než toto časové období. (Maximálně: 3 dny).", - "swap.settings.deadline.warning": "Vysoký termín", - "swap.settings.protection.description": "Se zapnutou ochranou swapu budou vaše transakce Ethereum chráněny před sendvičovými útoky se sníženou pravděpodobností selhání.", - "swap.settings.protection.subtitle.supported": "{{chainName}} Síť", - "swap.settings.protection.subtitle.unavailable": "Není k dispozici na {{chainName}}", - "swap.settings.protection.title": "Ochrana proti výměně", - "swap.settings.routingPreference.option.default.description": "Výběrem této možnosti identifikujete nejúčinnější trasu pro váš swap.", - "swap.settings.routingPreference.option.default.description.preV4": "Klient Uniswap vybere nejlevnější obchodní variantu s ohledem na cenu a síťové náklady.", - "swap.settings.routingPreference.option.default.tooltip": "Trasa je identifikována s ohledem na v2, v3 a určité fondy v4, přičemž se zohlední odhadovaný cenový dopad a síťové náklady.", - "swap.settings.routingPreference.option.v2.title": "v2 bazény", - "swap.settings.routingPreference.option.v3.title": "v3 bazény", - "swap.settings.routingPreference.option.v4.title": "v4 bazény", - "swap.settings.routingPreference.title": "Obchodní opce", - "swap.settings.slippage.alert": "Vysoký skluz", - "swap.settings.slippage.control.auto": "Auto", - "swap.settings.slippage.description": "Vaše transakce se vrátí, pokud se cena změní více než procento skluzu.", - "swap.settings.slippage.input.message": "Pokud cena klesne ještě více, vaše transakce se vrátí. Níže je uvedena minimální částka, kterou zaručeně obdržíte.", - "swap.settings.slippage.input.receive.title": "Přijmout alespoň", - "swap.settings.slippage.output.message": "Pokud cena klesne ještě více, vaše transakce se vrátí zpět. Níže je uvedena maximální částka, kterou budete muset utratit.", - "swap.settings.slippage.output.spend.title": "Maximálně utratit", - "swap.settings.slippage.warning": "Velmi vysoký skluz", - "swap.settings.slippage.warning.description": "Skluz nad 20 % pravděpodobně povede k nepříznivému obchodu. Chcete-li snížit riziko, že bude spuštěn zepředu, snižte nastavení.", - "swap.settings.slippage.warning.hover": "To může mít za následek nevýhodný obchod. Zkuste snížit nastavení prokluzu.", - "swap.settings.slippage.warning.max": "Zadejte hodnotu menší než {{maxSlippageTolerance}}", - "swap.settings.slippage.warning.message": "Prokluz může být vyšší, než je nutné", - "swap.settings.slippage.warning.min": "Zadejte hodnotu větší než 0", - "swap.settings.title": "Prohodit nastavení", - "swap.settings.transactionRevertPrice": "Vaše transakce se vrátí zpět, pokud se cena nepříznivě změní o více než toto procento.", - "swap.signAndSwap": "Podepište a vyměňte", - "swap.slippage.amt": "{{amt}} skluz", - "swap.slippage.bridging": "Žádné prokluzování při výměně mezi sítěmi", - "swap.slippage.settings.title": "Nastavení skluzu", - "swap.slippage.tooltip": "Maximální pohyb ceny před vaší transakcí se vrátí.", - "swap.slippageBelow.warning": "Skluz pod {{amt}} může vést k neúspěšné transakci", - "swap.submitted": "Výměna odeslána", - "swap.success": "Úspěch výměny!", - "swap.taxTooltip.label": "Pouze přesné zadání", - "swap.taxTooltip.noTokenSelected": "Poplatky za vybraný výstupní token neumožňují přesné přesné výstupy. Místo toho použijte pole „Prodat“.", - "swap.taxTooltip.tokenSelected": "{{tokenSymbol}} poplatky neumožňují přesné přesné výstupy. Místo toho použijte pole „Prodat“.", - "swap.tokenOwnFees": "Některé tokeny si při nákupu nebo prodeji účtují poplatek, který nastavuje vydavatel tokenu. Uniswap neobdrží žádný z těchto poplatků.", - "swap.total": "Celkový", - "swap.tradeRoutes": "Obchodní cesty", - "swap.transaction.deadline": "Termín transakce", - "swap.transaction.revertAfter": "Vaše transakce se vrátí zpět, pokud čeká na vyřízení déle než toto časové období.", - "swap.unsupportedAssets.readMore": "Přečtěte si další informace o nepodporovaných aktivech", - "swap.warning.enterLargerAmount.title": "Zadejte větší částku", - "swap.warning.expectedFailure.increaseSlippage": "Zkuste zvýšit svůj skluz.", - "swap.warning.expectedFailure.titleMay": "Tato výměna může selhat", - "swap.warning.insufficientBalance.title": "Nemáte dost {{currencySymbol}}", - "swap.warning.insufficientGas.button": "Nestačí {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "Vyměňte za {{ tokenSymbol }} na {{networkName}}", - "swap.warning.insufficientGas.button.buy": "Koupit {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "Koupit kartou", - "swap.warning.insufficientGas.message.withNetwork": "Nedostatek {{currencySymbol}} na {{networkName}} k výměně", - "swap.warning.insufficientGas.message.withoutNetwork": "Na výměnu nestačí {{currencySymbol}}", - "swap.warning.insufficientGas.title": "Nemáte dostatek {{currencySymbol}} na pokrytí nákladů na síť", - "swap.warning.networkFee.allow": "Povolit {{ inputTokenSymbol }} (jednou)", - "swap.warning.networkFee.highRelativeToValue": "Síťové náklady přesahují 10 % z celkové hodnoty transakce.", - "swap.warning.networkFee.highRelativeToValue.unichain": "Síťové náklady přesahují 10 % z celkové hodnoty transakce.", - "swap.warning.networkFee.message": "Jedná se o náklady na zpracování vaší transakce na blockchainu. Uniswap neobdrží žádný podíl z těchto poplatků.", - "swap.warning.networkFee.message.unichain": "Jedná se o náklady na zpracování vaší transakce na blockchainu.", - "swap.warning.networkFee.message.uniswapX": "Jedná se o náklady na zpracování vaší transakce na blockchainu. Uniswap nedostává žádný podíl z těchto poplatků. UniswapX agreguje zdroje likvidity za lepší ceny a swapy bez plynu.", - "swap.warning.networkFee.message.uniswapX.unichain": "Jedná se o náklady na zpracování vaší transakce na blockchainu. UniswapX agreguje zdroje likvidity za lepší ceny a swapy bez plynu.", - "swap.warning.networkFee.wrap": "Zabalte ETH", - "swap.warning.noQuotesFound.bridging.message": "Nebyly nalezeny žádné překlenovací citace. Zkuste v tuto chvíli použít oficiální most.", - "swap.warning.noQuotesFound.title": "Nebyly nalezeny žádné citace", - "swap.warning.noRoutesFound.message": "Pro vámi vybrané tokeny momentálně nejsou k dispozici žádné trasy. Zkuste prosím jiný pár nebo to zkuste znovu později.", - "swap.warning.noRoutesFound.title": "Nejsou k dispozici žádné trasy", - "swap.warning.offline.message": "Možná jste ztratili připojení k internetu nebo síť nefunguje. Zkontrolujte prosím připojení k internetu a zkuste to znovu.", - "swap.warning.offline.title": "Jste offline", - "swap.warning.priceImpact": "Tato transakce bude mít za následek cenový dopad na tržní cenu tohoto poolu. Přejete si pokračovat?", - "swap.warning.priceImpact.message": "Vzhledem k aktuálně dostupnému množství {{outputCurrencySymbol}} likvidity, čím více {{inputCurrencySymbol}} se pokusíte vyměnit, tím méně {{outputCurrencySymbol}} dostanete.", - "swap.warning.priceImpact.message.veryHigh": "Tato transakce bude mít za následek {{priceImpactValue}} cenový dopad na tržní cenu tohoto poolu a bude mít za následek ztrátu finančních prostředků.", - "swap.warning.priceImpact.title": "Vysoký dopad na cenu ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "Velmi vysoký dopad na cenu ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "Vaše transakce nebyla odeslána, protože jste aplikaci uzavřeli.", - "swap.warning.queuedOrder.approvalFailed": "Vaše transakce nebyla odeslána, protože schválení tokenu se nezdařilo.", - "swap.warning.queuedOrder.stale": "Vaše transakce nebyla odeslána, protože jste aplikaci zavřeli nebo schválení trvalo příliš dlouho.", - "swap.warning.queuedOrder.submissionFailed": "Při odesílání vaší transakce došlo k problému.", - "swap.warning.queuedOrder.title": "Výměna zrušena", - "swap.warning.queuedOrder.wrap.message": "Vaše ETH zůstane zabaleno jako WETH.", - "swap.warning.queuedOrder.wrapFailed": "Vaše transakce nebyla odeslána, protože transakce zalomení se nezdařila.", - "swap.warning.rateLimit.message": "Zkuste to znovu za několik minut.", - "swap.warning.rateLimit.title": "Překročen limit sazby", - "swap.warning.router.message": "Možná jste ztratili připojení nebo síť nefunguje. Pokud problém přetrvává, zkuste to znovu později.", - "swap.warning.router.title": "Tento obchod nelze nyní dokončit", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} je zablokováno", - "swap.warning.uniswapFee.message.default": "Aby byla zajištěna nejlepší zkušenost s Uniswap, jsou účtovány poplatky. S touto výměnou není spojen žádný poplatek.", - "swap.warning.uniswapFee.message.included": "Aby byla zajištěna nejlepší zkušenost s Uniswap, jsou účtovány poplatky, které již byly započítány do této nabídky.", - "swap.warning.uniswapFee.title": "Výměnný poplatek", - "swap.warning.viewOnly.message": "Chcete-li vyměnit tokeny, musíte tuto peněženku importovat pomocí fráze pro obnovení.", - "swap.wrap.token": "Zabalte {{sym}}", - "tdp.balanceSummary.otherNetworks": "Na jiných sítích", - "tdp.balanceSummary.otherNetworksBalance": "Zůstatek na jiných sítích", - "tdp.balanceSummary.title": "Tvůj zůstatek", - "tdp.invalidTokenPage.switchChainPrompt": "Přepněte na {{network}}", - "tdp.invalidTokenPage.title": "Tento token neexistuje", - "tdp.invalidTokenPage.titleWithChain": "Tento token na {{network}}neexistuje", - "tdp.loading.title.default": "data tokenu pro ", - "tdp.loading.title.withChain": "data tokenu pro na {{chainName}}", - "tdp.nameNotFound": "Jméno nenalezeno", - "tdp.noInfoAvailable": "Nejsou k dispozici žádné informace o tokenu", - "tdp.noTestnetSupportDescription": "Některé testovací sítě nepodporují výměnu, odesílání nebo nákup tokenů.", - "tdp.stats.unsupportedChainDescription": "Statistiky tokenů a grafy pro {{chain}} jsou k dispozici na {{infoLink}}", - "tdp.symbolNotFound": "Symbol nenalezen", - "testnet.modal.swapDeepLink.description.toProdMode": "Tato akce vyžaduje deaktivaci režimu testovací sítě. Režim Testnet lze kdykoli znovu povolit v rámci nastavení.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "Tato akce vyžaduje, aby byl povolen režim testovací sítě. Tokeny na testovacích sítích nemají žádnou skutečnou hodnotu. Režim Testnet lze kdykoli vypnout v rámci nastavení.", - "testnet.modal.swapDeepLink.title.toProdMode": "Zakázat režim testnet", - "testnet.modal.swapDeepLink.title.toTestnetMode": "Povolit režim testovací sítě", - "testnet.unsupported": "Tato funkce není podporována v režimu testovací sítě.", - "themeToggle.theme": "Téma", - "title.betterPricesMoreListings": "Lepší ceny. Další výpisy. Nakupujte, prodávejte a obchodujte s NFT na špičkových tržištích, jako je OpenSea. Prozkoumejte trendy kolekce.", - "title.buySellTradeEthereum": "Nakupujte, prodávejte a obchodujte s Ethereem a dalšími špičkovými tokeny na Uniswapu", - "title.createGovernanceOn": "Vytvořte nový návrh správy na Uniswap", - "title.createGovernanceTo": "Vytvořte nový návrh řízení, o kterém budou hlasovat držitelé UNI. UNI tokeny představují akcie s hlasovacím právem ve správě Uniswap.", - "title.earnFees": "Získejte poplatky, když jiní swapují na Uniswapu, přidáním tokenů do likviditních fondů.", - "title.easilyRemove": "Snadno odeberte svou likviditu z Uniswapu v2 a vložte do Uniswapu v3.", - "title.easilyRemoveV4": "Snadno odeberte svou likviditu z Uniswap v2 a v3 a vložte ji do Uniswap v4.", - "title.explore": "Prozkoumejte NFT na Uniswapu", - "title.exploreNFTs": "Prozkoumejte a nakupujte NFT na nejlepších tržištích na Uniswapu", - "title.manageNFT": "Spravujte svou sbírku NFT. Zobrazte vlastnosti, obchodní aktivitu, popisy a další podrobnosti o vašich NFT.", - "title.migratev2": "Migrujte likviditu fondu v2 na Uniswap v3", - "title.migratev3": "Migrujte likviditu fondu na Uniswap v4", - "title.placeLimit": "Zadávejte limitní příkazy na Uniswap", - "title.realTime": "Ceny v reálném čase, grafy, data transakcí a další.", - "title.removeLiquidityv2": "Odstraňte likviditu fondu (v2) na Uniswapu", - "title.removePoolLiquidity": "Odstraňte likviditu fondu na Uniswapu", - "title.removeTokensv2": "Odstraňte své tokeny z fondů likvidity v2.", - "title.removev3Liquidity": "Odstraňte své tokeny z fondu likvidity v3.", - "title.sendTokens": "Pošlete tokeny na Uniswap", - "title.swappingMadeSimple": "Výměna byla jednoduchá. Nakupujte a prodávejte kryptoměny na Ethereum, Base, Arbitrum, Polygon a dalších. Věří miliony.", - "title.tradeTokens": "Obchodujte s tokeny a poskytujte likviditu. Ceny v reálném čase, grafy, data transakcí a další.", - "title.uniswapTradeCrypto": "Uniswap | Obchodujte s krypto a NFT bezpečně na špičkové platformě DeFi", - "title.uniToken": "UNI tokeny představují akcie s hlasovacím právem ve správě Uniswap. O každém návrhu můžete hlasovat sami nebo své hlasy delegovat na třetí stranu.", - "title.voteOnGov": "Hlasujte o návrzích správy na Uniswap", - "token.balances.main": "Tvůj zůstatek", - "token.balances.other": "Zůstatky na jiných sítích", - "token.balances.viewOnly": "Zůstatek {{ownerAddress}}", - "token.bridge": "{{label}} token bridge", - "token.chart.tooltip": "Poplatky: {{amount}}", - "token.details.testnet.unsupported": "Podrobnosti o tokenu nejsou pro tokeny testnet k dispozici.", - "token.error.unknown": "Neznámý token", - "token.fee.buy.label": "koupit poplatek", - "token.fee.label": "poplatek", - "token.fee.sell.label": "prodejní poplatek", - "token.links.title": "Odkazy", - "token.links.twitter": "Cvrlikání", - "token.links.website": "webová stránka", - "token.priceExplorer.error.description": "Něco se pokazilo.", - "token.priceExplorer.error.title": "Cenový graf se nepodařilo načíst", - "token.priceExplorer.timeRangeLabel.all": "Pořád", - "token.priceExplorer.timeRangeLabel.day": "1D", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 den", - "token.priceExplorer.timeRangeLabel.hour": "1H", - "token.priceExplorer.timeRangeLabel.month": "1 mil", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 měsíc", - "token.priceExplorer.timeRangeLabel.week": "1W", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 týden", - "token.priceExplorer.timeRangeLabel.year": "1Y", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 rok", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} není k dispozici", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} a {{tokenSymbol1}} nejsou k dispozici", - "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs neobdrží žádný z těchto poplatků.", - "token.safety.warning.alwaysDoYourResearch": "Vždy si proveďte svůj výzkum", - "token.safety.warning.blocked.description.default_one": "S tímto tokenem nemůžete obchodovat pomocí aplikace Uniswap.", - "token.safety.warning.blocked.description.default_other": "S těmito tokeny nemůžete obchodovat pomocí aplikace Uniswap.", - "token.safety.warning.dontShowWarningAgain": "Už mi toto varování nezobrazovat", - "token.safety.warning.doYourOwnResearch": "Než budete pokračovat, vždy si proveďte svůj vlastní průzkum.", - "token.safety.warning.feeDescription": "Účtuje , když {{action}}", - "token.safety.warning.flaggedAsMalicious": "Označeno jako škodlivé", - "token.safety.warning.fotHigh.title": "Byl zjištěn vysoký poplatek", - "token.safety.warning.fotLow.title": "Poplatek zjištěn", - "token.safety.warning.fotVeryHigh.title": "Byl zjištěn velmi vysoký poplatek", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} bylo označeno jako neprodejné. Výměna tohoto tokenu může vést ke ztrátě vašich prostředků.", - "token.safety.warning.honeypot.title": "Zjištěn 100% prodejní poplatek", - "token.safety.warning.impersonator": "Zosobňuje jiný token", - "token.safety.warning.impersonator.title": "Byl zjištěn token imitátoru", - "token.safety.warning.malicious.general.message": "{{tokenSymbol}} byl aplikací Blockaid označen jako škodlivý.", - "token.safety.warning.malicious.impersonator.message": "{{tokenSymbol}} byl označen Blockaid za pokus o zkopírování jiného tokenu. Nemusí to být token, který chcete vyměnit.", - "token.safety.warning.malicious.impersonator.message.short": "{{tokenSymbol}} nemusí být token, který chcete vyměnit.", - "token.safety.warning.malicious.title": "Byl zjištěn škodlivý token", - "token.safety.warning.mayResultInLoss": "Jeho výměna může mít za následek ztrátu finančních prostředků.", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} se neobchoduje na předních amerických centralizovaných burzách.", - "token.safety.warning.notListedOnExchanges": "Není kotováno na předních amerických burzách", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} bylo označeno jako neprodejné.", - "token.safety.warning.sellFee100.title": "Zjištěn 100% prodejní poplatek", - "token.safety.warning.spam.message": "{{tokenSymbol}} byl označen jako spam službou Blockaid.", - "token.safety.warning.spam.title": "Byl zjištěn token spamu", - "token.safety.warning.spamsUsers": "Spamuje uživatele", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} účtuje poplatek {{buyFeePercent}} při nákupu a {{sellFeePercent}} při prodeji.", - "token.safety.warning.tokenChargesFee.buy.message": "{{tokenSymbol}} si při nákupu účtuje {{feePercent}} poplatek.", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} si při prodeji účtuje poplatek {{feePercent}} .", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} účtuje poplatek při nákupu nebo prodeji.", - "token.safetyLevel.blocked.message": "S tímto tokenem nemůžete obchodovat pomocí Uniswap Wallet.", - "token.safetyLevel.medium.message.plural": "Tyto tokeny nejsou obchodovány na předních amerických centralizovaných burzách. Než budete pokračovat, vždy si proveďte svůj vlastní průzkum.", - "token.selector.search.error": "Výsledky vyhledávání se nepodařilo načíst", - "token.stats.fullyDilutedValuation": "Zcela zředěné ocenění", - "token.stats.marketCap": "Tržní kapitalizace", - "token.stats.priceHighYear": "52W vysoký", - "token.stats.priceLowYear": "52W Nízký", - "token.stats.section.about": "Asi {{token}}", - "token.stats.title": "Statistiky", - "token.stats.translation.original": "Ukázat originál", - "token.stats.translation.translate": "Přeložit do {{language}}", - "token.stats.volume": "24h objem", - "token.symbol.input.fallback": "Vstupní token", - "token.symbol.output.fallback": "Výstupní token", - "token.wrap.fail.message": "Swapy na Uniswap protokolu mohou začínat a končit ETH. Během swapu je však ETH zabaleno do WETH.", - "token.zeroNativeBalance.description": "Chcete-li získat {{ tokenSymbol }}, musíte nejprve {{ nativeTokenSymbol }} zaplatit za síť. Začněte financováním své peněženky pomocí {{ nativeTokenSymbol }}.", - "token.zeroNativeBalance.title": "Potřebujete {{ nativeTokenName }} ", - "tokens.action.hide": "Skrýt token", - "tokens.action.unhide": "Odkrýt token", - "tokens.nfts.action.viewOnExplorer": "Zobrazit na {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "Kolekci NFT se nepodařilo načíst", - "tokens.nfts.collection.label.items": "Položky", - "tokens.nfts.collection.label.owners": "Vlastníci", - "tokens.nfts.collection.label.priceFloor": "Podlaha", - "tokens.nfts.collection.label.swapVolume": "Hlasitost", - "tokens.nfts.details.error.load.title": "Podrobnosti NFT se nepodařilo načíst", - "tokens.nfts.details.network": "Síť", - "tokens.nfts.details.owner": "Ve vlastnictví", - "tokens.nfts.details.price": "Aktuální cena", - "tokens.nfts.details.recentPrice": "Poslední prodejní cena", - "tokens.nfts.details.traits": "Vlastnosti", - "tokens.nfts.empty.description": "Nebyly nalezeny žádné NFT", - "tokens.nfts.error.unavailable": "Obsah není k dispozici", - "tokens.nfts.hidden.action.hide": "Skrýt NFT", - "tokens.nfts.hidden.action.unhide": "Odkrýt NFT", - "tokens.nfts.link.collection": "Webová stránka sbírky", - "tokens.nfts.list.error.load.title": "NFT se nepodařilo načíst", - "tokens.nfts.list.none.button": "Přijímat NFT", - "tokens.nfts.list.none.description.default": "Začněte převodem NFT z jiné peněženky.", - "tokens.nfts.list.none.description.external": "Když tato peněženka zakoupí nebo přijme NFT, zobrazí se zde.", - "tokens.nfts.list.none.title": "Zatím žádné NFT", - "tokens.noneFound": "Nebyly nalezeny žádné tokeny.", - "tokens.selector.button.choose": "Vyberte token", - "tokens.selector.button.clear": "Vymazat vše", - "tokens.selector.empty.buy.message": "Kupte si kryptoměnu kartou nebo bankou a posílejte tokeny.", - "tokens.selector.empty.buy.title": "Kupte si kryptoměnu", - "tokens.selector.empty.receive.title": "Přijímat tokeny", - "tokens.selector.empty.title": "Zatím žádné tokeny", - "tokens.selector.error.load": "Tokeny se nepodařilo načíst", - "tokens.selector.search.empty": "Pro dotaz {{searchText}}nebyly nalezeny žádné výsledky", - "tokens.selector.search.placeholder": "Hledat tokeny", - "tokens.selector.section.bridging": "Výměna napříč sítěmi", - "tokens.selector.section.favorite": "Oblíbené", - "tokens.selector.section.otherSearchResults": "Další tokeny na {{network}}", - "tokens.selector.section.recent": "Nedávná vyhledávání", - "tokens.selector.section.search": "Výsledky vyhledávání", - "tokens.selector.section.trending": "Tokeny podle objemu 24 hodin", - "tokens.selector.section.yours": "Vaše žetony", - "tokens.table.search.placeholder.pools": "Prohledejte bazény", - "tokens.table.search.placeholder.tokens": "Hledat tokeny", - "transaction.action.cancel.button": "Zrušit transakci", - "transaction.action.cancel.description": "Pokud tuto transakci zrušíte dříve, než ji síť zpracuje, budete místo původních nákladů platit novou síť.", - "transaction.action.cancel.title": "Zrušit tuto transakci?", - "transaction.action.copy": "Zkopírujte ID transakce", - "transaction.action.copyProvider": "Zkopírujte {{providerName}} ID transakce", - "transaction.amount.unlimited": "Neomezený", - "transaction.confirmation.completionTime_one": "Transakce dokončena za {{count}} za sekundu 🎉", - "transaction.confirmation.completionTime_other": "Transakce dokončena za {{count}} sekund 🎉", - "transaction.confirmation.pending.wallet": "Potvrďte transakci v peněžence", - "transaction.confirmation.submitted.currency.add": "Přidejte {{currency}}", - "transaction.confirmation.submitted.currency.added": "Přidáno {{currency}}", - "transaction.confirmation.waiting": "čekání na potvrzení", - "transaction.date": "Odesláno {{date}}", - "transaction.details.dappName": "Aplikace", - "transaction.details.from": "Z", - "transaction.details.networkFee": "Náklady na síť", - "transaction.details.providerFee": "Poplatek poskytovatele", - "transaction.details.swapRate": "Hodnotit", - "transaction.details.transaction": "Transakce", - "transaction.details.uniswapFee": "Poplatek ({{ feePercent }}%)", - "transaction.insufficientLiquidity": "Nedostatečná likvidita fondu k dokončení transakce", - "transaction.network.all": "Všechny sítě", - "transaction.networkCost.label": "Náklady na síť", - "transaction.networkCost.maxNativeBalance.description": "Malá částka zůstatku síťového tokenu je vyhrazena na pokrytí síťových nákladů této transakce.", - "transaction.networkCost.maxNativeBalance.title": "Proč nemohu použít svůj maximální zůstatek?", - "transaction.networkCost.veryHigh.label": "Velmi vysoké náklady na síť", - "transaction.notification.error.cancel": "Transakci nelze zrušit", - "transaction.notification.error.replace": "Transakci nelze nahradit", - "transaction.status.approve.canceled": "Zrušeno schválení", - "transaction.status.approve.canceling": "Zrušení schválit", - "transaction.status.approve.failed": "Schválení se nezdařilo", - "transaction.status.approve.pending": "Schvalování", - "transaction.status.approve.success": "Schválený", - "transaction.status.approve.successDapp": "Schváleno {{externalDappName}}", - "transaction.status.buy.canceled": "Zrušený nákup", - "transaction.status.buy.canceling": "Rušení nákupu", - "transaction.status.buy.failed": "Nákup se nezdařil", - "transaction.status.buy.pending": "Nákup", - "transaction.status.buy.success": "Koupeno", - "transaction.status.buy.successDapp": "Zakoupeno {{externalDappName}}", - "transaction.status.confirm.canceled": "Zrušeno potvrzení", - "transaction.status.confirm.canceling": "Čeká na zrušení", - "transaction.status.confirm.failed": "Nepodařilo se potvrdit", - "transaction.status.confirm.pending": "Probíhá transakce", - "transaction.status.confirm.success": "Transakce potvrzena", - "transaction.status.confirm.successDapp": "Transakce potvrzena {{externalDappName}}", - "transaction.status.mint.canceled": "Zrušená máta", - "transaction.status.mint.canceling": "Zrušení máty", - "transaction.status.mint.failed": "Nepodařilo se razit", - "transaction.status.mint.pending": "Ražba", - "transaction.status.mint.success": "Ražené", - "transaction.status.mint.successDapp": "Raženo dne {{externalDappName}}", - "transaction.status.purchase.canceled": "Zrušený nákup", - "transaction.status.purchase.canceling": "Zrušení nákupu", - "transaction.status.purchase.failedOn": "Nákup dne {{serviceProvider}}se nezdařil", - "transaction.status.purchase.pendingOn": "Nákup na {{serviceProvider}}", - "transaction.status.purchase.successOn": "Zakoupeno {{serviceProvider}}", - "transaction.status.receive.canceled": "Příjem byl zrušen", - "transaction.status.receive.canceling": "Rušení příjmu", - "transaction.status.receive.failedFrom": "Nepodařilo se přijmout od {{serviceProvider}}", - "transaction.status.receive.pendingFrom": "Příjem z {{serviceProvider}}", - "transaction.status.receive.success": "Přijato", - "transaction.status.receive.successDapp": "Přijato {{externalDappName}}", - "transaction.status.receive.successFrom": "Přijato z {{serviceProvider}}", - "transaction.status.revoke.canceled": "Zrušeno odvolání", - "transaction.status.revoke.canceling": "Rušení odvolání", - "transaction.status.revoke.failed": "Odvolání se nezdařilo", - "transaction.status.revoke.pending": "Odvolávání", - "transaction.status.revoke.success": "Odvoláno", - "transaction.status.revoke.successDapp": "Odvoláno dne {{externalDappName}}", - "transaction.status.sale.canceled": "Zrušený prodej", - "transaction.status.sale.canceling": "Zrušení prodeje", - "transaction.status.sale.failedOn": "Prodej se nezdařil přes {{serviceProvider}}", - "transaction.status.sale.pendingOn": "Prodej přes {{serviceProvider}}", - "transaction.status.sale.successOn": "Prodáváno přes {{serviceProvider}}", - "transaction.status.sell.canceled": "Prodej zrušen", - "transaction.status.sell.canceling": "Zrušení prodeje", - "transaction.status.sell.failed": "Nepodařilo se prodat", - "transaction.status.sell.pending": "Prodejní", - "transaction.status.sell.success": "Prodáno", - "transaction.status.sell.successDapp": "Prodáno {{externalDappName}}", - "transaction.status.send.canceled": "Odeslání bylo zrušeno", - "transaction.status.send.canceling": "Rušení odeslání", - "transaction.status.send.failed": "nepodařilo se odeslat", - "transaction.status.send.pending": "Odesílání", - "transaction.status.send.success": "Odesláno", - "transaction.status.send.successDapp": "Odesláno dne {{externalDappName}}", - "transaction.status.swap.canceled": "Zrušená výměna", - "transaction.status.swap.canceling": "Rušení swapu", - "transaction.status.swap.expired": "Platnost swapu vypršela", - "transaction.status.swap.failed": "Výměna se nezdařila", - "transaction.status.swap.insufficientFunds": "Nedostatečné finanční prostředky", - "transaction.status.swap.pending": "Výměna", - "transaction.status.swap.success": "Vyměněno", - "transaction.status.swap.successDapp": "Vyměněno {{externalDappName}}", - "transaction.status.unwrap.canceled": "Rozbalení zrušeno", - "transaction.status.unwrap.canceling": "Rušení rozbalení", - "transaction.status.unwrap.failed": "Rozbalení se nezdařilo", - "transaction.status.unwrap.pending": "Rozbalování", - "transaction.status.unwrap.success": "Rozbalené", - "transaction.status.unwrap.successDapp": "Rozbaleno na {{externalDappName}}", - "transaction.status.wrap.canceled": "Zrušený zábal", - "transaction.status.wrap.canceling": "Rušení zábalu", - "transaction.status.wrap.failed": "Zabalení se nezdařilo", - "transaction.status.wrap.pending": "Obal", - "transaction.status.wrap.success": "Zabalené", - "transaction.status.wrap.successDapp": "Zabalené na {{externalDappName}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} až {{recipientAddress}}", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} z {{senderAddress}}", - "transaction.warning.insufficientGas.modal.message": "K pokrytí síťových nákladů této transakce potřebujete ~{{tokenAmount}} {{tokenSymbol}} () na {{networkName}} .", - "transaction.warning.insufficientGas.modal.title.withNetwork": "Nedostatek {{tokenSymbol}} na {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Nestačí {{tokenSymbol}}", - "transaction.warning.maxNative.message": "Chystáte se utratit většinu svého zůstatku síťových tokenů. To může zanechat nedostatek finančních prostředků na pokrytí budoucích síťových nákladů.", - "transaction.warning.maxNative.title": "Nízký zůstatek síťových tokenů", - "transaction.watcher.error.cancel": "Transakci nelze zrušit", - "transaction.watcher.error.status": "Chyba při kontrole stavu transakce", - "unichain.promotion.bridging.description": "Vyměňte za Unichain", - "unichain.promotion.bridging.tooltip.description": "Propojte své ETH, abyste mohli začít na Unichainu.", - "unichain.promotion.cold.description": "Rychlejší výměny. Nižší poplatky. Unichain je domovem DeFi.", - "unichain.promotion.cold.title": "Představujeme Unichain", - "unichain.promotion.modal.description": "Rychlejší výměny. Nižší poplatky. Unichain je domovem cross-chain likvidity.", - "unichain.promotion.modal.detail.costs": "Nižší náklady na vytváření poolů a správu pozic.", - "unichain.promotion.modal.detail.fees": "Ušetřete 95 % na poplatcích ve srovnání s Ethereem.", - "unichain.promotion.modal.detail.instant": "Okamžitě vyměňte", - "unichain.promotion.tooltip.description": "Rychlejší výměny. Nižší poplatky. Unichain je domovem cross-chain likvidity.", - "unichain.promotion.tooltip.switch": "Přepněte na Unichain", - "unichain.promotion.tooltip.title": "Unichain je tady", - "unichain.promotion.warm.description": "Vyměňujte své oblíbené žetony rychleji a s nižšími náklady na plyn.", - "unichain.promotion.warm.title": "Začněte swapovat na Unichainu", - "uniswapX.aggregatesLiquidity": " agreguje zdroje likvidity za lepší ceny a swapy bez plynu.", - "uniswapx.description": "UniswapX agreguje zdroje likvidity za lepší ceny a swapy bez plynu.", - "uniswapx.included": "Zahrnuje UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "Zjistěte více o swapování pomocí UniswapX", - "uniswapx.v2QuoteFailed": "Pevná nabídka UniswapX v2 se nezdařila. Zkuste to znovu s klasickou výměnou.", - "unitags.banner.button.claim": "Nyní tvrdí", - "unitags.banner.subtitle": "Vytvořte si personalizovaný web3 profil a snadno sdílejte svou adresu s přáteli.", - "unitags.banner.title.compact": "Získejte své {{unitagDomain}} uživatelské jméno a vytvořte si svůj přizpůsobitelný profil.", - "unitags.banner.title.full": "Získejte své uživatelské jméno {{unitagDomain}}", - "unitags.choosePhoto.option.cameraRoll": "Vyberte si z fotoaparátu", - "unitags.choosePhoto.option.computer": "Nahrát z počítače", - "unitags.choosePhoto.option.nft": "Vyberte NFT", - "unitags.choosePhoto.option.remove": "Odebrat profilový obrázek", - "unitags.claim.confirmation.customize": "Přizpůsobte profil", - "unitags.claim.confirmation.description": "{{unitagAddress}} je připraveno odesílat a přijímat kryptoměny. Pokračujte v budování své peněženky přizpůsobením svého profilu web3.", - "unitags.claim.confirmation.success.long": "Máš to!", - "unitags.claim.confirmation.success.short": "mám to!", - "unitags.claim.error.addressLimit": "Pro tuto adresu jste již provedli maximální počet změn svého uživatelského jména", - "unitags.claim.error.appCheck": "Uživatelské jméno nelze nárokovat. Zkuste to prosím znovu zítra.", - "unitags.claim.error.avatar": "Avatara se nepodařilo nastavit. Zkuste to později znovu.", - "unitags.claim.error.default": "Uživatelské jméno nelze nárokovat. Zkuste to později znovu.", - "unitags.claim.error.deviceLimit": "Dosáhli jste maximálního počtu uživatelských jmen, která mohou být pro toto zařízení aktivní", - "unitags.claim.error.general": "Uživatelské jméno nelze nárokovat", - "unitags.claim.error.unavailable": "Toto uživatelské jméno není k dispozici", - "unitags.claim.error.unknown": "Neznámá chyba", - "unitags.claim.username.default": "tvé jméno", - "unitags.delete.confirm.subtitle": "Chystáte se smazat své uživatelské jméno a přizpůsobitelné podrobnosti profilu. Nebudete jej moci získat zpět.", - "unitags.delete.confirm.title": "Jsi si jistá?", - "unitags.editProfile.placeholder": "uživatelské jméno", - "unitags.editUsername.confirm.subtitle": "Chystáte se změnit své uživatelské jméno. Jakmile to jednou změníte, už si to nikdy nemůžete nárokovat.", - "unitags.editUsername.confirm.title": "Jsi si jistá?", - "unitags.editUsername.title": "Upravte své uživatelské jméno", - "unitags.editUsername.warning.default": "Jakmile své uživatelské jméno změníte, už si ho nikdy nebudete moci nárokovat. Můžete jej změnit pouze 2 krát.", - "unitags.editUsername.warning.max": "Dosáhli jste maximálního počtu 2 změn uživatelských jmen.", - "unitags.extension.intro.buttton": "Vyžádejte si uživatelské jméno", - "unitags.extension.intro.description": "Rozlučte se s 0x adresami. Uživatelská jména jsou čitelná jména, která usnadňují odesílání a přijímání kryptoměn.", - "unitags.extension.intro.title": "Představujeme uživatelská jména", - "unitags.extension.intro.upsell.customizable": "Přizpůsobitelné profily", - "unitags.extension.intro.upsell.ens": "Provozováno na subdoménách ENS", - "unitags.extension.intro.upsell.free": "Zdarma k reklamaci", - "unitags.intro.features.ens": "Provozováno na subdoménách ENS", - "unitags.intro.features.free": "Zdarma k reklamaci", - "unitags.intro.features.profile": "Přizpůsobitelné profily", - "unitags.intro.subtitle": "Rozlučte se s 0x adresami. Uživatelská jména jsou čitelná jména, která usnadňují odesílání a přijímání kryptoměn.", - "unitags.intro.title": "Představujeme uživatelská jména", - "unitags.notification.delete.error": "Uživatelské jméno se nepodařilo smazat. Zkuste to později znovu.", - "unitags.notification.delete.title": "Uživatelské jméno bylo smazáno", - "unitags.notification.profile.error": "Profil nelze aktualizovat. Zkuste to později znovu.", - "unitags.notification.profile.title": "profil aktualizován", - "unitags.notification.username.error": "Uživatelské jméno nelze změnit. Zkuste to později znovu.", - "unitags.notification.username.title": "Uživatelské jméno změněno", - "unitags.onboarding.claim.subtitle": "Toto je vaše personalizovaná adresa, na kterou mohou lidé posílat kryptoměny.", - "unitags.onboarding.claim.title.choose": "Vytvořte si uživatelské jméno", - "unitags.onboarding.claim.title.claim": "Získejte své uživatelské jméno", - "unitags.onboarding.info.description": "Uživatelská jména transformují složité adresy 0x na čitelné názvy. Nárokováním uživatelského jména {{unitagDomain}} můžete snadno odesílat a přijímat kryptoměny a vytvořit si veřejný web3 profil.", - "unitags.onboarding.info.title": "Zjednodušená adresa", - "unitags.onboarding.profile.subtitle": "Nahrajte svůj vlastní nebo se držte svého jedinečného Uniconu. Vždy to můžete později změnit.", - "unitags.onboarding.profile.title": "Vyberte profilovou fotku", - "unitags.profile.action.delete": "Smazat uživatelské jméno", - "unitags.profile.action.edit": "Upravit uživatelské jméno", - "unitags.profile.bio.label": "Bio", - "unitags.profile.bio.placeholder": "Zadejte životopis pro svůj profil", - "unitags.profile.links.twitter": "Cvrlikání", - "unitags.username.error.chars": "Uživatelská jména mohou obsahovat pouze písmena a číslice", - "unitags.username.error.max": "Uživatelská jména nemohou mít více než {{number}} znaků", - "unitags.username.error.min": "Uživatelská jména musí mít alespoň {{number}} znaků", - "unitags.username.error.uppercase": "Uživatelská jména mohou obsahovat pouze malá písmena a čísla", - "uwulink.error.insufficientTokens": "Nedostatek {{tokenSymbol}} na {{chain}}", - "v2.notAvailable": "Uniswap V2 není v této síti dostupný.", - "v2.switchTo": "Přepnout na v2", - "v3.blast.yield.usdbAndWeth": "Na Blast USDB a WETH mění základ tokenů, které automaticky získávají výnos. Kvůli nekompatibilitě s Uniswap v3 nebudou pozice LP s USDB nebo WETH získávat rebasingový výnos, ale v Uniswap v2 ano.", - "v3.continue": "Pokračovat na v3", - "v3.rebase.unavailable": "Rebasing není na v3 k dispozici", - "wallet.appSignIn": "Přihlaste se pomocí aplikace", - "wallet.connectingAgreement": "Připojením peněženky souhlasíte s Smluvními podmínkami společnosti Uniswap Labs a souhlasíte s jejími Zásadami ochrany osobních údajů.", - "wallet.connectionFailed.message": "Pokus o připojení se nezdařil. Klikněte prosím na zkusit znovu a postupujte podle pokynů pro připojení v peněžence.", - "wallet.other": "Ostatní peněženky", - "wallet.scanToConnect": "Pro připojení naskenujte QR kód", - "wallet.wrongNet": "Vaše peněženka je připojena k nesprávné síti.", - "walletConnect.dapps.connection": "Připojeno k {{dappNameOrUrl}}", - "walletConnect.dapps.empty.description": "Připojte se k aplikaci naskenováním kódu přes WalletConnect", - "walletConnect.dapps.manage.empty.title": "Nejsou připojeny žádné aplikace", - "walletConnect.dapps.manage.title": "Spojení", - "walletConnect.error.connection.message": "Uniswap Wallet aktuálně podporuje {{chainNames}}. Na těchto řetězech používejte pouze \"{{dappName}}\".", - "walletConnect.error.connection.title": "Chyba připojení", - "walletConnect.error.general.message": "Vyskytl se problém s WalletConnect. Prosím zkuste to znovu", - "walletConnect.error.general.title": "Chyba připojení WalletConnect", - "walletConnect.error.scantastic.message": "Vyskytl se problém s vaším QR kódem. Prosím zkuste to znovu", - "walletConnect.error.scantastic.title": "Neplatný QR kód", - "walletConnect.error.unsupported.message": "Než to zkusíte znovu, ujistěte se, že skenujete platný kód WalletConnect, Ethereum nebo Uniswap Extension QR kód.", - "walletConnect.error.unsupported.title": "Neplatný QR kód", - "walletConnect.error.unsupportedV1.message": "WalletConnect v1 již není podporován. Aplikace, ke které se pokoušíte připojit, potřebuje upgradovat na WalletConnect v2.", - "walletConnect.error.unsupportedV1.title": "Neplatný QR kód", - "walletConnect.error.uwu.scan": "Při skenování tohoto QR kódu došlo k problému.", - "walletConnect.error.uwu.title": "Chyba odkazu UwU", - "walletConnect.error.uwu.unsupported": "Tento QR kód není podporován.", - "walletConnect.pending.button.connect": "Připojit", - "walletConnect.pending.button.scrollDown": "Přejděte dolů a připojte se", - "walletConnect.pending.switchAccount": "Přepnout účet", - "walletConnect.pending.switchNetwork": "Přepnout síť", - "walletConnect.pending.title": "Připojte se k {{dappName}}", - "walletConnect.permissions.option.transferAssets": "Převeďte svá aktiva bez souhlasu", - "walletConnect.permissions.option.viewTokenBalances": "Prohlédněte si zůstatky tokenů", - "walletConnect.permissions.option.viewWalletAddress": "Zobrazit adresu peněženky", - "walletConnect.permissions.title": "Oprávnění webu", - "walletConnect.request.button.scrollDown": "Přejděte dolů a podepište", - "walletConnect.request.button.sign": "Podepsat", - "walletConnect.request.details.label.function": "Funkce", - "walletConnect.request.details.label.sending": "Odesílání", - "walletConnect.request.details.label.token": "Žeton", - "walletConnect.request.details.label.tokens": "Tokeny", - "walletConnect.request.error.insufficientFunds": "K dokončení této transakce nemáte dostatek {{currencySymbol}} .", - "walletConnect.request.error.network": "Chyba připojení k internetu nebo síti", - "walletConnect.request.warning.general.message": "Buďte opatrní: tato zpráva může převést aktiva", - "walletConnect.request.warning.message": "Abyste mohli podepisovat zprávy nebo transakce, budete muset importovat frázi pro obnovení peněženky.", - "walletConnect.request.warning.title": "Tato peněženka je v režimu pouze pro prohlížení", - "web.explore.description": "Objevujte a zkoumajte tokeny na {{network}}. Prozkoumejte nejlepší bazény. Zobrazte ceny v reálném čase, objem obchodů, TVL, grafy a data transakcí.", - "web.explore.title.pools": "Prozkoumejte nejlepší fondy na {{network}} na Uniswap", - "web.explore.title.tokens": "Prozkoumejte nejlepší tokeny na {{network}} na Uniswap", - "web.explore.title.transactions": "Prozkoumejte nejlepší transakce na {{network}} na Uniswapu" -} diff --git a/packages/uniswap/src/i18n/locales/translations/da-DK.json b/packages/uniswap/src/i18n/locales/translations/da-DK.json deleted file mode 100644 index f084b805e68..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/da-DK.json +++ /dev/null @@ -1,2563 +0,0 @@ -{ - "account.authHeader.claimReward": "Gør krav på {{amount}} belønning", - "account.cloud.backup.subtitle": "Der er flere gendannelsessætninger sikkerhedskopieret til din {{cloudProviderName}}.", - "account.cloud.backup.title": "Vælg en sikkerhedskopi for at gendanne", - "account.cloud.button.restore.android": "Gendan fra Google Drev", - "account.cloud.button.restore.ios": "Gendan fra iCloud", - "account.cloud.empty.description": "Det ser ud til, at du ikke har sikkerhedskopieret nogen af dine gendannelsessætninger til {{cloudProviderName}}.", - "account.cloud.empty.title": "0 sikkerhedskopier fundet", - "account.cloud.error.backup.message": "Kunne ikke importere sikkerhedskopier på grund af manglende tilladelser, afbrydelse af autorisation eller på grund af en skyfejl", - "account.cloud.error.backup.title": "Fejl under import af sikkerhedskopier", - "account.cloud.error.password.title": "Forkert kodeord. Prøv igen.", - "account.cloud.error.unavailable.button.cancel": "Ikke nu", - "account.cloud.error.unavailable.button.settings": "Gå til indstillinger", - "account.cloud.error.unavailable.message.android": "Bekræft venligst, at du er logget ind på en Google-konto med Google Drev aktiveret på denne enhed, og prøv igen.", - "account.cloud.error.unavailable.message.ios": "Bekræft venligst, at du er logget ind på et Apple ID med iCloud Drive aktiveret på denne enhed, og prøv igen.", - "account.cloud.error.unavailable.title.android": "Google Drev er ikke tilgængelig", - "account.cloud.error.unavailable.title.ios": "iCloud Drive er ikke tilgængeligt", - "account.cloud.loading.title": "Søger efter sikkerhedskopier...", - "account.cloud.lockout.time.hours_one": "For mange forsøg. Prøv igen om 1 time.", - "account.cloud.lockout.time.hours_other": "For mange forsøg. Prøv igen om {{count}} timer.", - "account.cloud.lockout.time.minutes_one": "For mange forsøg. Prøv igen om 1 minut.", - "account.cloud.lockout.time.minutes_other": "For mange forsøg. Prøv igen om {{count}} minutter.", - "account.cloud.password.input": "Indtast adgangskode", - "account.cloud.password.recoveryPhrase": "Indtast din gendannelsessætning i stedet", - "account.cloud.password.subtitle": "Denne adgangskode er påkrævet for at gendanne sikkerhedskopien af din gendannelsessætning fra {{cloudProviderName}}.", - "account.cloud.password.title": "Indtast backup-adgangskode", - "account.downloadWallet.subtitle": "Sikkerhedskopier din tegnebog, handl på farten, få live prisalarmer og meget mere.", - "account.drawer.gitHash": "Git-hash: ", - "account.drawer.gitVersion": "Version: ", - "account.drawer.modal.body": "Opbevar og skift sikkert tokens med Uniswap-appen. Tilgængelig på iOS og Android.", - "account.drawer.modal.dont": "Har du ikke en Uniswap-pung?", - "account.drawer.modal.scan": "Scan med Uniswap Wallet", - "account.drawer.spamToggle": "Skjul ukendte tokens og NFT'er", - "account.passkey.delete.acknowledge": "Jeg har sikkerhedskopieret min gendannelsessætning og forstår, at Uniswap Labs ikke kan hjælpe mig med at gendanne min pung, hvis jeg undlader at gøre det.", - "account.passkey.delete.description": "Sørg for, at du har sikkerhedskopieret din gendannelsessætning ved hjælp af Uniswap-mobilappen eller browserudvidelsen.", - "account.passkey.delete.descriptionEmphasized": "Uden din gendannelsessætning kan du muligvis ikke få adgang til din tegnebog.", - "account.passkey.delete.speedbump.description": "Før du fortsætter, skal du udføre følgende trin for at undgå at miste adgang til din tegnebog og alle midler.", - "account.passkey.delete.speedbump.step1": "Download Uniswap-mobilappen eller browserudvidelsen", - "account.passkey.delete.speedbump.step2": "Sikkerhedskopier din gendannelsessætning", - "account.passkey.delete.speedbump.title": "Er du sikker?", - "account.passkey.delete.title": "Vil du slette adgangsnøglen?", - "account.passkey.log.in.title": "Log ind med adgangskode", - "account.passkey.type.crossplatform": "Telefon, tablet eller sikkerhedsnøgle", - "account.passkey.type.platform": "Browser eller operativsystem", - "account.passkey.verify.button": "Bekræft med adgangsnøgle", - "account.passkey.verify.description": "Før du fortsætter, bedes du bruge din adgangsnøgle til at bekræfte din identitet. Dette hjælper med at holde din konto sikker.", - "account.passkey.verify.title": "Lad os først bekræfte, at det er dig", - "account.portfolio.activity.canceledBelow": "Denne ordre blev annulleret, fordi din saldo var under det indtastede beløb.", - "account.portfolio.activity.signLimit": "Denne ordre vil ikke blive udfyldt, fordi din saldo gik under det indtastede beløb. Forøg din saldo for at rette op.", - "account.recoveryPhrase.education.part1": "En gendannelsessætning (eller frøsætning) er et sæt ord , der kræves for at få adgang til din tegnebog, som en adgangskode.", - "account.recoveryPhrase.education.part2": "Du kan indtaste din gendannelsessætning på en ny enhed for at gendanne din tegnebog og dens indhold.", - "account.recoveryPhrase.education.part3": "Men hvis du mister din gendannelsessætning, vil du miste adgangen til din pung.", - "account.recoveryPhrase.education.part4": "I stedet for at huske din gendannelsessætning, kan du sikkerhedskopiere den til {{cloudProviderName}} og beskytte den med en adgangskode.", - "account.recoveryPhrase.education.part5": "Du kan også manuelt sikkerhedskopiere din gendannelsessætning ved at skrive den ned og gemme den et sikkert sted.", - "account.recoveryPhrase.education.part6": "Vi anbefaler at bruge begge typer sikkerhedskopier, for hvis du mister din gendannelsessætning, vil du ikke være i stand til at gendanne din tegnebog.", - "account.recoveryPhrase.error.invalid": "Ugyldig sætning", - "account.recoveryPhrase.error.invalidWord": "Ugyldigt ord: {{word}}", - "account.recoveryPhrase.error.phraseLength": "Gendannelsessætning skal være på 12-24 ord", - "account.recoveryPhrase.error.wordIsAddress": "Du har indtastet en adresse, ikke en gendannelsesfrase", - "account.recoveryPhrase.error.wrong": "Forkert gendannelsessætning", - "account.recoveryPhrase.helpText.import": "Hvordan finder jeg min gendannelsessætning?", - "account.recoveryPhrase.helpText.restoring": "Prøv at søge igen", - "account.recoveryPhrase.input": "Indtast din gendannelsessætning", - "account.recoveryPhrase.remove.final.description": "Sørg for, at du har skrevet din gendannelsessætning ned eller sikkerhedskopieret den på {{cloudProviderName}}. Du vil ikke kunne få adgang til dine penge ellers.", - "account.recoveryPhrase.remove.final.title": "Du fjerner din gendannelsessætning", - "account.recoveryPhrase.remove.import.description": "Du kan kun gemme én gendannelsessætning ad gangen. For at fortsætte med at importere en ny, skal du fjerne din nuværende gendannelsessætning og eventuelle tilknyttede tegnebøger fra denne enhed.", - "account.recoveryPhrase.remove.initial.description": "Dette fjerner din tegnebog fra denne enhed sammen med din gendannelsessætning.", - "account.recoveryPhrase.remove.initial.title": "Du fjerner {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "Din gendannelsessætning forbliver gemt, indtil du sletter alle resterende tegnebøger.", - "account.recoveryPhrase.subtitle.import": "Din gendannelsessætning vil kun blive gemt lokalt på din enhed.", - "account.recoveryPhrase.subtitle.restoring": "Indtast din gendannelsessætning nedenfor, eller prøv at søge efter sikkerhedskopier igen.", - "account.recoveryPhrase.title.import": "Indtast din gendannelsessætning", - "account.recoveryPhrase.title.restoring": "Ingen sikkerhedskopier fundet", - "account.wallet.action.copy": "Kopiér adresse", - "account.wallet.action.manageConnections": "Administrer forbindelser", - "account.wallet.action.report": "Rapportér profil", - "account.wallet.action.viewExplorer": "Se på {{blockExplorerName}}", - "account.wallet.button.add": "Tilføj tegnebog", - "account.wallet.button.addViewOnly": "Tilføj en tegnebog, der kun kan ses", - "account.wallet.button.create": "Opret en ny tegnebog", - "account.wallet.button.import": "Importer en ny tegnebog", - "account.wallet.button.manage": "Indstillinger for tegnebog", - "account.wallet.button.remove": "Fjern tegnebogen", - "account.wallet.button.watch": "Se en tegnebog", - "account.wallet.create.placeholder": "Tegnebog {{index}}", - "account.wallet.edit.label.input.placeholder": "Pung etiket", - "account.wallet.header.button.disabled.title": "Rediger profil", - "account.wallet.header.button.title": "Rediger etiket", - "account.wallet.header.viewOnly": "View-only tegnebøger", - "account.wallet.menu.claimUsername": "Gør krav på brugernavn", - "account.wallet.menu.copy.title": "Kopiér tegnebogens adresse", - "account.wallet.menu.edit.title": "Rediger etiket", - "account.wallet.menu.manageConnections": "Administrer forbindelser", - "account.wallet.menu.remove.title": "Fjern tegnebogen", - "account.wallet.remove.check": "Jeg sikkerhedskopierede min gendannelsessætning og forstår, at Uniswap Labs ikke kan hjælpe mig med at gendanne mine tegnebøger, hvis jeg undlader at gøre det.", - "account.wallet.remove.title": "Fjern {{name}}", - "account.wallet.remove.viewOnly": "Du kan altid tilføje tegnebøger, der kun kan ses bagfra, ved at indtaste tegnebogens adresse.", - "account.wallet.restore.new_device.description": "Da du bruger en ny enhed, skal du gendanne din gendannelsesfrase eller indtaste din adgangskode til cloudbackup for at fortsætte.", - "account.wallet.restore.new_device.title": "Gendan din tegnebog", - "account.wallet.restore.seed_phrase.description": "Din gendannelsesfrase mangler på din enhed. For at sikre, at du aldrig mister adgang til dine penge, skal du gendanne din tegnebog.", - "account.wallet.restore.seed_phrase.title": "Gendan din tegnebog", - "account.wallet.select.error": "Adresser kunne ikke indlæses", - "account.wallet.select.loading.subtitle": "Dine tegnebøger vises nedenfor.", - "account.wallet.select.loading.title": "Søger efter tegnebøger", - "account.wallet.select.smartWalletDisclaimer": "Som standard bruger alle berettigede tegnebøger smarte tegnebogsfunktioner, når de er importeret. Hvad er en smart tegnebog?", - "account.wallet.select.title_one_one": "En pung fundet", - "account.wallet.select.title_one_other": "Vælg tegnebøger til import", - "account.wallet.viewOnly.button": "Importer tegnebog", - "account.wallet.viewOnly.description": "For at bytte, købe, sende og modtage tokens skal du importere denne tegnebogs gendannelsessætning.", - "account.wallet.viewOnly.title": "Denne pung er kun til visning", - "account.wallet.watch.error.alreadyImported": "Denne adresse er allerede importeret", - "account.wallet.watch.error.notFound": "Adressen blev ikke fundet", - "account.wallet.watch.error.smartContract": "Adresse er en smart kontrakt", - "account.wallet.watch.message": "Tilføjelse af en tegnebog, der kun kan ses, giver dig mulighed for at prøve appen eller spore en tegnebog. Du vil ikke være i stand til at bytte eller sende penge.", - "account.wallet.watch.placeholder": "ENS eller adresse", - "account.wallet.watch.title": "Indtast en tegnebogsadresse", - "activity.pending": "{{pendingActivityCount}} Afventer", - "activity.transaction.lpRewards.descriptor": "{{symbol}} belønninger indsamlet", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} til {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} for {{amountWithSymbolB}}", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} og {{amountWithSymbolB}}", - "addLiquidity.shareOfPool": "Andel af pool", - "addressInput.recipient": "Modtager", - "analytics.allow": "Tillad analyser", - "analytics.allow.message": "Vi bruger anonymiserede data til at forbedre din oplevelse med Uniswap Labs-produkter.", - "appRating.button.notReally": "Ikke rigtig", - "appRating.description": "Fortæl os, hvis du har en god oplevelse med denne app", - "appRating.extension.review.description": "Vælg en stjernebedømmelse, og skriv en anmeldelse i Chrome Webshop.", - "appRating.extension.review.title": "Gennemgå Uniswap Extension?", - "appRating.extension.title": "Nyder du Uniswap Extension?", - "appRating.feedback.button.send": "Send feedback", - "appRating.feedback.description": "Fortæl os, hvordan vi kan forbedre din oplevelse", - "appRating.feedback.title": "Det er vi kede af at høre.", - "appRating.mobile.title": "Nyder du Uniswap Wallet?", - "bridgedAsset.modal.button": "Fortsæt med at bytte", - "bridgedAsset.modal.description": "Dette er en {{chainName}} version af {{currencySymbol}} , der er understøttet af og opretholder den samme pris som den native {{currencySymbol}}.", - "bridgedAsset.modal.feature.securelyBacked": "Sikkert bakket op", - "bridgedAsset.modal.feature.securelyBacked.description": "1:1 bakket op af native {{currencySymbol}}.", - "bridgedAsset.modal.feature.tradeSeamlessly": "Handel problemfrit", - "bridgedAsset.modal.feature.tradeSeamlessly.description": "Køb og sælg {{currencySymbol}} uden at forlade Uniswap.", - "bridgedAsset.modal.feature.withdrawToNativeChain": "Træk tilbage til {{nativeChainName}}", - "bridgedAsset.modal.feature.withdrawToNativeChain.description": "Tilbage til det oprindelige netværk når som helst.", - "bridgedAsset.modal.title": "Handel {{currencySymbol}} på {{chainName}}", - "bridgedAsset.send.warning.description": "Du sender en indpakket version af {{currencySymbol}} på {{chainName}}. Hvis du sender den til en centraliseret børs, vil det resultere i et permanent tab af penge.", - "bridgedAsset.send.warning.title": "Sørg for at du sender til en kompatibel adresse", - "bridgedAsset.tdp.description": "Dette er en brodannet version af {{currencySymbol}} , der er 1:1 bakket op af native {{currencySymbol}}.", - "bridgedAsset.wormhole.button": "Fortsæt til Ormehul", - "bridgedAsset.wormhole.description": "Fortsæt til Ormehulsportalen for at bygge bro over din {{currencySymbol}} fra {{chainName}} til {{nativeChainName}}.", - "bridgedAsset.wormhole.title": "Udtag {{currencySymbol}} til {{nativeChainName}}", - "bridgedAsset.wormhole.toNativeChain": "til {{nativeChainName}}", - "bridgedAsset.wormhole.withdrawToNativeChain": "Træk tilbage til {{nativeChainName}}", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}sek", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "chart.candlestick": "Lysestage", - "chart.error.pools": "Kan ikke vise historiske data for den aktuelle pulje.", - "chart.error.tokens": "Kan ikke vise historiske data for det aktuelle token.", - "chart.line": "Linjediagram", - "chart.missingData": "Manglende diagramdata", - "chart.price.label.close": "Tæt", - "chart.price.label.high": "Høj", - "chart.price.label.low": "Lav", - "chart.price.label.open": "Åben", - "chart.settings.unavailable.label": "Denne indstilling er ikke tilgængelig for det aktuelle diagram", - "claim.thanks": "Tak fordi du er en del af Uniswap-fællesskabet ", - "claim.uni.arrived": "UNI er ankommet", - "common.about": "Om", - "common.accept": "Acceptere", - "common.active": "Aktiv", - "common.activeNetworks": "Aktive netværk", - "common.activity": "Aktivitet", - "common.add.label": "Tilføje", - "common.add.liquidity.canceled": "Tilføjelse af likviditet annulleret", - "common.addLiquidity": "Tilføj likviditet", - "common.address": "Adresse", - "common.addressOrENS": "Tegnebogsadresse eller ENS-navn", - "common.advanced": "Fremskreden", - "common.all": "Alle", - "common.allTime": "Hele tiden", - "common.and": "og", - "common.app": "App", - "common.approved": "godkendt", - "common.approvePending": "Godkendelse afventer...", - "common.approvePermitTx": "Godkend anmodning {{indexText}}", - "common.approvePermitTx.active": "Godkend anmodning{{indexText}} i tegnebogen", - "common.approvePermitTx.explainer": "Hvad er Permit2-godkendelser?", - "common.approvePermitTx.pending": "Godkender anmodning {{indexText}}...", - "common.approveSpend": "Godkend {{symbol}} udgifter", - "common.approving": "Godkender", - "common.approximatelyValue": "~{{value}}", - "common.areYouSure": "Er du sikker?", - "common.automatic": "Auto", - "common.availableIn": "Uniswap tilgængelig i: ", - "common.availableOnIOSAndroidChrome": "Tilgængelig på iOS, Android og Chrome", - "common.backToPositions": "Tilbage til stillinger", - "common.bestRoute": "Rute", - "common.bestRoute.with": "Rute via {{provider}}", - "common.biometrics.generic": "Biometri", - "common.biometrics.touchId": "Touch ID", - "common.biometrics.windowsHello": "Windows Hello", - "common.blocked.ifError": "Hvis du mener, at dette er en fejl, bedes du sende en e-mail med din adresse til ", - "common.blocked.reason": "Denne adresse er blokeret på Uniswap Labs-grænsefladen, fordi den er forbundet med en eller flere blokerede aktiviteter.", - "common.blockedAddress": "Blokeret adresse", - "common.blog": "Blog", - "common.bought": "Købt", - "common.brandAssets": "Brand aktiver", - "common.button.accept": "Acceptere", - "common.button.back": "Tilbage", - "common.button.buy": "Købe", - "common.button.cancel": "Afbestille", - "common.button.checkin": "Tjek ind", - "common.button.close": "Tæt", - "common.button.confirm": "Bekræfte", - "common.button.connect": "Forbinde", - "common.button.continue": "Blive ved", - "common.button.copied": "Kopieret", - "common.button.copy": "Kopi", - "common.button.create": "skab", - "common.button.delete": "Slet", - "common.button.disable": "Deaktiver", - "common.button.disabling": "Deaktivering", - "common.button.disconnect": "Koble fra", - "common.button.dismiss": "Afskedige", - "common.button.done": "Færdig", - "common.button.edit": "Redigere", - "common.button.enable": "Aktiver", - "common.button.finish": "Slutte", - "common.button.goBack": "Gå tilbage", - "common.button.later": "Måske senere", - "common.button.learn": "Lær mere", - "common.button.next": "Næste", - "common.button.notNow": "Ikke nu", - "common.button.ok": "Okay", - "common.button.paste": "sæt ind", - "common.button.pay": "Betale", - "common.button.proceed": "Fortsæt", - "common.button.receive": "Modtage", - "common.button.remove": "Fjerne", - "common.button.reset": "Nulstil", - "common.button.retry": "Prøve igen", - "common.button.reveal": "Afsløre", - "common.button.review": "Anmeldelse", - "common.button.save": "Gemme", - "common.button.scrollDown": "Rul ned", - "common.button.sell": "Sælge", - "common.button.send": "Sende", - "common.button.setup": "Opsætning", - "common.button.share": "Del", - "common.button.showLess": "Vis mindre", - "common.button.showMore": "Vis mere", - "common.button.sign": "Skilt", - "common.button.skip": "Springe", - "common.button.swap": "Bytte rundt", - "common.button.tryAgain": "Prøv igen", - "common.button.understand": "jeg forstår", - "common.button.unlock": "Lås op", - "common.button.view": "Udsigt", - "common.button.viewDetails": "Se detaljer", - "common.button.yes": "Ja", - "common.buy.label": "Købe", - "common.buyAndSell": "Køb og sælg på Uniswap", - "common.cancellationSubmitted": "Annullering indsendt", - "common.cancellationSuccessful": "Annulleringen lykkedes", - "common.cancelOrder": "Aflys ordre", - "common.card.error.description": "Noget gik galt", - "common.card.error.title": "Ups! Noget gik galt.", - "common.careers": "Karrierer", - "common.chain.networkCost": "{{chain}} netværksomkostninger", - "common.chart": "Diagram", - "common.checkNetwork": "Tjek netværksstatus her.", - "common.chromeExtension": "Udvidelse", - "common.claim.failed": "Krav mislykkedes", - "common.claimed": "Påstået", - "common.claiming": "Hævde", - "common.claimUnis": "Gør krav på dine UNI-tokens", - "common.clear": "Klar", - "common.close": "Tæt", - "common.closed": "Lukket", - "common.collect.button": "Indsamle", - "common.company": "Selskab", - "common.confirm": "Bekræfte", - "common.confirmCancellation": "Bekræft annullering", - "common.confirmed": "Bekræftet", - "common.confirmSend.button": "Bekræft afsendelse", - "common.confirmSwap": "Bekræft swap i tegnebogen", - "common.confirmTimedOut": "Bekræftelsen fik timeout. Prøv venligst igen.", - "common.confirmTransfer": "Bekræft overførsel", - "common.confirmWallet": "Bekræft i tegnebogen", - "common.connect.button": "Forbinde", - "common.connectAWallet.button": "Tilslut en tegnebog", - "common.connectAWallet.button.evm": "Forbind Ethereum-tegnebogen", - "common.connectAWallet.button.evm.switch": "Skift Ethereum-tegnebog", - "common.connectAWallet.button.svm": "Tilslut Solana-pung", - "common.connectAWallet.button.svm.switch": "Skift Solana-pung", - "common.connectAWallet.button.switch": "Skift tegnebog", - "common.connectTo": "Forbind til {{platform}}", - "common.connectWallet.button": "Tilslut tegnebogen", - "common.contactUs.button": "Kontakt os", - "common.copied": "Kopieret", - "common.copy.address": "Kopiér adresse", - "common.copy.poolId": "Kopiér pool-ID", - "common.copyLink.button": "Kopier link", - "common.created.date": "Oprettet {{date}}", - "common.currency": "betalingsmiddel", - "common.currentPrice": "Nuværende pris", - "common.custom": "Brugerdefinerede", - "common.customRange": "Brugerdefineret rækkevidde", - "common.dataOutdated": "Data kan være forældede", - "common.day": "dag", - "common.default": "Standard", - "common.defaultTradeOptions": "Standard handelsoptioner", - "common.deposit.toNetwork": "Indbetal tokens til {{label}} netværket.", - "common.depositing": "Indbetaling", - "common.depositTokens": "Indbetalingspoletter", - "common.detected": "Opdaget", - "common.developers": "Udviklere", - "common.device": "Denne enhed", - "common.device.other": "Anden enhed", - "common.dismiss": "Afskedige", - "common.docs": "Dokumenter", - "common.donate": "Doner", - "common.done": "Færdig", - "common.dontShowAgain": "Vis ikke dette igen", - "common.download": "Hent", - "common.downloadAppStore": "Download i App Store", - "common.downloadPlayStore": "Download i Play Butik", - "common.downloadUniswapApp": "Download Uniswap-appen", - "common.downloadUniswapWallet": "Download Uniswap-tegnebogen", - "common.dynamic": "Dynamisk", - "common.edit.button": "Redigere", - "common.ended": "Afsluttet", - "common.error.details": "Fejldetaljer", - "common.error.general": "Noget gik galt", - "common.error.label": "Fejl", - "common.error.request": "Beklager, der opstod en fejl under behandlingen af din anmodning. Hvis du anmoder om support, skal du sørge for at kopiere oplysningerne om denne fejl.", - "common.error.somethingWrong": "Noget gik galt!", - "common.errorConnecting.error": "Forbindelsesfejl", - "common.errorLoadingData.error": "Fejl ved indlæsning af data", - "common.etherscan": "Etherscan", - "common.expiry": "Udløb", - "common.explore": "Udforske", - "common.explorer": "Explorer", - "common.exploreTokens": "Udforsk tokens", - "common.extension": "Uniswap-udvidelse", - "common.failedSwitchNetwork": "Kunne ikke skifte netværk", - "common.fee": "Betaling", - "common.fees": "Gebyrer", - "common.feesEarned": "Optjente gebyrer", - "common.feesEarnedPerBase": "{{symbolA}} pr. {{symbolB}}", - "common.for": "Til", - "common.free": "Gratis", - "common.fullRange": "Hele udvalget", - "common.getApp": "Hent app", - "common.getHelp.button": "Få hjælp", - "common.getStarted": "Kom i gang", - "common.getSupport.button": "Få hjælp", - "common.getTheApp": "Hent appen", - "common.getUniswapWallet": "Få Uniswap Wallet", - "common.getUniswapWallet.mobile": "Hent Uniswap-mobilappen", - "common.governance": "Governance", - "common.happyHolidays": "Glædelig ferie fra Uniswap-teamet!", - "common.help": "Hjælp", - "common.helpCenter": "Hjælpecenter", - "common.hidden": "Skjult", - "common.hide.button": "Skjule", - "common.highPrice": "Høj pris", - "common.includes": "Inkluderer", - "common.info.label": "Info", - "common.input.noRecipient.error": "Vælg modtager", - "common.input.password.confirm": "Bekræft kodeord", - "common.input.password.error.mismatch": "Adgangskoder stemmer ikke overens", - "common.input.password.error.weak": "Denne adgangskode er for svag", - "common.input.password.new": "Nyt kodeord", - "common.input.password.placeholder": "Adgangskode", - "common.input.password.strength.medium": "Medium", - "common.input.password.strength.strong": "Stærk", - "common.input.password.strength.weak": "Svag", - "common.input.search": "Søg", - "common.insufficient.funds": "Ikke nok penge", - "common.insufficientBalance.error": "Utilstrækkelig balance", - "common.insufficientFundsForNetworkFee.error": "Utilstrækkelige midler til at dække netværksomkostninger", - "common.insufficientTokenBalance.error": "Utilstrækkelig {{tokenSymbol}} balance", - "common.insufficientTokenBalance.error.simple": "Ikke nok {{tokenSymbol}}", - "common.invalidPair": "Ugyldigt par", - "common.invalidRecipient.error": "Ugyldig modtager", - "common.iOSAndroid": "iOS og Android", - "common.language": "Sprog", - "common.learnMoreSwap": "Lær mere om swaps", - "common.legalAndPrivacy": "Juridisk og privatliv", - "common.less": "Mindre", - "common.limit.cancel_one": "Annuller grænse", - "common.limit.cancel_other": "Annuller {{count}} grænser", - "common.limit.canceled": "Grænse annulleret", - "common.limit.executed": "Begrænsning udført", - "common.limit.expired": "Grænsen er udløbet", - "common.limit.failed": "Grænsen mislykkedes", - "common.limit.opened": "Grænse åbnet", - "common.limit.pending": "Afventende grænse", - "common.limits": "Grænser", - "common.limits.approachMax": "Nærmer sig 100-grænsen maksimum", - "common.limits.cancelProceed": "Annuller grænser for at fortsætte", - "common.limits.expires": "Udløber {{timestamp}}", - "common.limits.open": "Åbne grænser", - "common.limits.when": "når {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "Links", - "common.liquidity": "Likviditet", - "common.liquidity.provision": "Likviditetsbestemmelse", - "common.liquidity.removed": "Likviditet fjernet", - "common.loading": "Indlæser", - "common.longText.button.less": "Læs mindre", - "common.longText.button.more": "Læs mere", - "common.lowPrice": "Lav pris", - "common.manage": "Styre", - "common.market.label": "Marked", - "common.marketPrice": "Markedspris", - "common.marketPrice.fetching": "Henter markedspris...", - "common.marketPrice.label": "Markedspris:", - "common.marketPrice.unavailable": "Markedspris ikke fundet. Lav venligst din egen research for at undgå tab af midler.", - "common.max": "Maks", - "common.message": "Besked", - "common.migrate": "Migrere", - "common.migrate.liquidity.failed": "Migrering af likviditet mislykkedes", - "common.migrate.position": "Migrer stilling", - "common.migrated.liquidity": "Migreret likviditet", - "common.migrating.liquidity": "Migrering af likviditet", - "common.min": "Min", - "common.more": "Mere", - "common.moreDetails": "Flere detaljer", - "common.navigation.settings": "Indstillinger", - "common.navigation.systemSettings": "Indstillinger", - "common.navigationButton": "Navigationsknap", - "common.needHelp": "Brug for hjælp?", - "common.networkCost": "Netværksomkostninger", - "common.neverMind": "Glem det", - "common.new": "Ny", - "common.new.exclamation": "Ny!", - "common.nft": "NFT", - "common.nfts": "NFT'er", - "common.noAmount.error": "Indtast et beløb", - "common.noData": "Ingen data", - "common.none": "Ingen", - "common.noResults": "Ingen resultater fundet.", - "common.notAvailableInRegion.error": "Ikke tilgængelig i dit område", - "common.notCreated.label": "Ikke oprettet", - "common.notSupported": "Ikke understøttet", - "common.oneDay": "1 dag", - "common.oneDay.short": "1D", - "common.oneHour.short": "1H", - "common.oneMonth": "1 måned", - "common.oneWeek": "En uge", - "common.oneYear": "1 år", - "common.opensea.link": "Se på OpenSea", - "common.orderCanceled": "Ordre annulleret", - "common.orderExecuted": "Ordre udført", - "common.orderExpired": "Ordren udløb", - "common.orderPending": "Ordre afventer", - "common.outOfRange": "Uden for rækkevidde", - "common.pageNotFound": "Siden blev ikke fundet!", - "common.passkey.count": "Adgangsnøgle {{number}}", - "common.passkeys": "Adgangsnøgler", - "common.passkeys.add": "Tilføj en adgangsnøgle", - "common.passkeys.add.description": "Vælg, hvor du vil gemme din nye adgangsnøgle.", - "common.pastDay": "Sidste dag", - "common.pastFiveMinutes": "Sidste fem minutter", - "common.pastHour": "Sidste time", - "common.pastMonth": "Sidste måned", - "common.pastWeek": "Sidste uge", - "common.pastYear": "Sidste år", - "common.pending": "Verserende", - "common.pending.cancellation": "Afventer aflysning", - "common.pendingEllipsis": "Verserende...", - "common.permit": "Tilladelse", - "common.plusMore": "+{{number}} mere", - "common.pool": "Pool", - "common.pools": "Pools", - "common.portfolio": "Portefølje", - "common.poweredBy": "Drevet af ", - "common.price": "Pris", - "common.priceUpdated": "Pris opdateret", - "common.privacyChoices": "Dine privatlivsvalg", - "common.privacyChoices.checkbox.description": "Når det er markeret, deler vi ikke dine data med tredjepartspartnere til personlig annoncering. Du kan aktivere deling når som helst ved at fjerne markeringen i dette felt.", - "common.privacyChoices.checkbox.label": "Del ikke mine oplysninger", - "common.privacyChoices.description": "Vi deler muligvis enhedsidentifikatorer med vores annonceringspartnere for at promovere vores tjenester på andre websteder og platforme. Hvor dette kvalificeres som salg, deling eller målrettet annoncering i henhold til gældende lovgivning, kan du fravælge dette ved at markere feltet \"del ikke mine oplysninger\". For mere information om vores privatlivspraksis kan du læse vores Privatlivspolitik.", - "common.privacyChoices.disclaimer": "Bemærk venligst, at dit valg kun gælder for denne browser på denne enhed. Du kan også framelde dig ved at aktivere indstillingen Global Privacy Control i den browser, du bruger til at få adgang til vores tjenester. Gå til dine indstillinger for at se flere muligheder.", - "common.privacyPolicy": "Fortrolighedspolitik", - "common.proceed": "Fortsæt", - "common.proceedInWallet": "Fortsæt i din tegnebog", - "common.products": "Produkter", - "common.protocol": "Protokol", - "common.protocol.v2": "Uniswap v2", - "common.protocol.v3": "Uniswap v3", - "common.protocol.v4": "Uniswap v4", - "common.purchased": "Købt", - "common.rate": "Sats", - "common.readMore": "Læs mere", - "common.receive": "Modtage", - "common.received": "Modtaget", - "common.recent": "Nylig", - "common.refresh": "Opfriske", - "common.reload.label": "Genindlæs appen", - "common.remove.label": "Fjerne", - "common.remove.liquidity.canceled": "Fjernelse af likviditet annulleret", - "common.remove.liquidity.failed": "Fjernelse af likviditet mislykkedes", - "common.removing.liquidity": "Fjernelse af likviditet", - "common.resetLimit": "Nulstil {{symbol}} grænsen", - "common.resetLimitWallet": "Nulstil {{symbol}} grænsen i tegnebogen", - "common.resettingLimit": "Nulstiller {{symbol}} grænse...", - "common.revoke.approval.failed": "Tilbagekald godkendelse mislykkedes", - "common.revoked.approval": "Tilbagekaldt godkendelse", - "common.revoking.approval": "Tilbagekaldelse af godkendelse", - "common.scanQRDownload": "Scan QR-koden med din telefon for at downloade", - "common.selectRegion.label": "Vælg din region", - "common.selectToken.label": "Vælg et token", - "common.sell.label": "Sælge", - "common.send.button": "Sende", - "common.send.failed": "Send mislykkedes", - "common.sending": "Sender", - "common.sent": "Sendt", - "common.settings": "Indstillinger", - "common.share": "Del", - "common.share.shareToTwitter": "Del på Twitter", - "common.show.button": "At vise", - "common.showLess.button": "Vis mindre", - "common.showMore.button": "Vis mere", - "common.signatureExpired": "Din signatur er udløbet.", - "common.signMessage": "Underskriv besked", - "common.signMessageWallet": "Signer besked i tegnebogen", - "common.socials": "Sociale medier", - "common.sold": "Solgt", - "common.stats": "Statistik", - "common.status": "Status", - "common.step.number": "Trin {{number}}", - "common.step.number.of": "Trin {{current}} af {{total}}", - "common.swap": "Bytte rundt", - "common.swap.expired": "Swap udløb", - "common.swap.failed": "Swap mislykkedes", - "common.swapPending": "Swap afventer...", - "common.termsOfService": "Servicevilkår", - "common.text.connected": "Forbundet", - "common.text.contract": "Kontrakt", - "common.text.disconnected": "Afbrudt", - "common.text.error": "Fejl", - "common.text.notAvailable": "N/A", - "common.text.recipient": "Til", - "common.text.sender": "Fra", - "common.text.unknown": "Ukendt", - "common.thisAccount": "denne konto", - "common.thisMonth": "Denne måned", - "common.thisToken": "Dette token", - "common.thisWeek": "Denne uge", - "common.thisYear": "Dette år", - "common.time": "Tid", - "common.time.minute.amt": "{{time}}m", - "common.time.minutes": "minutter", - "common.time.past.days": "{{days}} dage", - "common.time.past.days.short": "{{days}}d", - "common.time.past.hours": "{{hours}} timer", - "common.time.past.hours.short": "{{hours}}h", - "common.time.past.minutes.short": "{{minutes}}m", - "common.time.past.months.short": "{{months}}mdr", - "common.time.past.seconds.short": "{{seconds}}s", - "common.to": "til", - "common.today": "I dag", - "common.tokenA": "Token A", - "common.tokenAmount": "Token beløb", - "common.tokenB": "Token B", - "common.tokenName": "Token navn", - "common.tokens": "Poletter", - "common.totalUniswapTVL": "Total Uniswap TVL", - "common.totalValueLocked": "TVL", - "common.trade": "Handle", - "common.trademarkPolicy": "Varemærkepolitik", - "common.transactionDetails": "Overførselsdetaljer", - "common.transactionId": "Transaktions ID", - "common.transactionPending": "Transaktion afventer", - "common.transactions": "Transaktioner", - "common.transactionSettings": "Transaktionsindstillinger", - "common.transfer_one": "overførsel", - "common.transfer_other": "overførsler", - "common.tryAgain.error": "Prøv igen", - "common.twitter": "Twitter", - "common.type.label": "Type", - "common.unavailable": "Ikke tilgængelig", - "common.unhide": "Vis frem", - "common.unichain": "Unichain", - "common.uniswapMobile": "Uniswap mobil", - "common.uniswapWallet": "Uniswap pung", - "common.uniswapX": "UniswapX", - "common.unknown": "Ukendt", - "common.unknownError.error": "Ukendt fejl", - "common.unwrap.button": "Pak ud", - "common.unwrap.failed": "Udpakningen mislykkedes", - "common.unwrapped": "Udpakket", - "common.unwrapping": "Udpakning", - "common.view.profile": "Se profil", - "common.viewOnExplorer": "Se på Explorer", - "common.volume": "Bind", - "common.vote": "Stemme", - "common.wallet.approve": "Godkend i tegnebogen", - "common.wallet.label": "Pung", - "common.warning": "Advarsel", - "common.webApp": "Web app", - "common.website": "Internet side", - "common.whyApprove": "Hvorfor skal jeg godkende et token?", - "common.whySign": "Hvorfor kræves underskrifter?", - "common.whyWrap": "Hvorfor skal jeg pakke min {{symbol}}ind?", - "common.withdraw": "Hæv", - "common.withdrawal.amount": "Udbetalingsbeløb", - "common.withinRange": "Inden for rækkevidde", - "common.wrap": "Indpak {{symbol}}", - "common.wrap.failed": "Ombrydning mislykkedes", - "common.wrapIn": "Pak {{symbol}} ind i pungen", - "common.wrapped": "Indpakket", - "common.wrapping": "Indpakning", - "common.wrappingToken": "Indpakning {{symbol}}...", - "common.yesterday": "I går", - "common.your.account.had.insufficient.funds": "Din konto havde ikke tilstrækkelige midler til at gennemføre dette bytte.", - "common.your.account.has.insufficient.funds": "Din konto har ikke tilstrækkelige midler til at gennemføre dette bytte.", - "common.your.connected.wallet": "Din forbundne tegnebog", - "common.your.limit.could.not.be.fulfilled": "Din grænse kunne ikke overholdes på nuværende tidspunkt. Prøv igen.", - "common.your.swap.could.not.be.fulfilled": "Dit bytte kunne ikke opfyldes på nuværende tidspunkt. Prøv igen.", - "common.youreBuying": "Du køber", - "common.youReceive": "Du modtager", - "common.youreSelling": "Du sælger", - "currency.ars": "Argentinsk peso", - "currency.aud": "australske dollar", - "currency.brl": "brasilianske real", - "currency.cad": "canadiske dollar", - "currency.cny": "kinesisk yuan", - "currency.cop": "Colombiansk peso", - "currency.eur": "Euro", - "currency.gbp": "britiske pund", - "currency.hkd": "Hong Kong Dollar", - "currency.idr": "indonesisk rupiah", - "currency.inr": "Indiske Rupee", - "currency.jpy": "japansk yen", - "currency.krw": "Sydkoreanske Won", - "currency.mxn": "Mexicansk peso", - "currency.ngn": "nigerianske Naira", - "currency.pkr": "Pakistanske Rupee", - "currency.rub": "russisk rubel", - "currency.sgd": "Singapore Dollar", - "currency.try": "tyrkiske lira", - "currency.uah": "Ukrainsk Hryvnia", - "currency.usd": "amerikanske dollar", - "currency.vnd": "vietnamesisk dong", - "dapp.request.actionCannotBeCompleted.description": "Nogle funktioner er ikke tilgængelige, fordi dine smarte tegnebogsindstillinger administreres af en anden tegnebogsapp.", - "dapp.request.actionCannotBeCompleted.header": "Signaturanmodning", - "dapp.request.actionCannotBeCompleted.title": "Handlingen kan ikke fuldføres", - "dapp.request.approve.action": "Godkende", - "dapp.request.approve.fallbackTitle": "Godkend dette websted for at få adgang til tokens", - "dapp.request.approve.helptext": "Tillad dette websted at få adgang til og bruge dette token til transaktioner. Sørg for, at du har tillid til dette websted.", - "dapp.request.approve.label": "Pung", - "dapp.request.approve.title": "Godkend adgang til {{tokenSymbol}}", - "dapp.request.base.title": "Transaktionsanmodning", - "dapp.request.bridge.description": "Flyt ETH, USDC og mere på tværs af {{numChains}}+ netværk.", - "dapp.request.bridge.title": "Forsøger du at bygge bro?", - "dapp.request.connect.helptext": "Tillad dette websted at se din tegnebogsadresse, saldo og anmode om godkendelse af transaktioner.", - "dapp.request.connect.title": "Opret forbindelse til webstedet", - "dapp.request.fallback.calldata.label": "Rådata", - "dapp.request.fallback.function.label": "Fungere", - "dapp.request.permit2.description": "Permit2 administrerer token-godkendelser på tværs af flere dapps.", - "dapp.request.permit2.header": "Underskriv tilladelse 2", - "dapp.request.permit2approve.action": "Godkende", - "dapp.request.permit2approve.helptext": "Permit2 administrerer token-godkendelser på tværs af flere dapps.", - "dapp.request.permit2approve.title": "Godkend tilladelse2", - "dapp.request.reject.action": "Afvis alle", - "dapp.request.reject.info": "Du har {{totalRequestCount}} transaktionsanmodninger", - "dapp.request.revoke.action": "Tilbagekald", - "dapp.request.revoke.helptext": "Tillad dette websted at tilbagekalde adgang til at bruge dette token til transaktioner. Sørg for, at du har tillid til dette websted.", - "dapp.request.revoke.title": "Tilbagekald adgang til {{tokenSymbol}}", - "dapp.request.signature.containsUnrenderableCharacters": "Denne meddelelse indeholder tegn, der ikke kan gengives. Sørg for, at du har tillid til dette websted.", - "dapp.request.signature.decodeError": "Kunne ikke afkode besked", - "dapp.request.signature.header": "Signaturanmodning", - "dapp.request.signature.irregular": "Uregelmæssig underskriftsanmodning", - "dapp.request.signature.irregular.description": "Sørg for, at du har tillid til dette websted, før du fortsætter", - "dapp.request.signature.irregular.understand": "Jeg forstår risiciene", - "dapp.request.signature.toggleDataView.raw": "Se rådata", - "dapp.request.signature.toggleDataView.readable": "Se originale data", - "dapp.request.warning.notActive.message": "Sørg for, at det er den rigtige", - "dapp.request.warning.notActive.title": "Dette er ikke din aktive tegnebog", - "delegation.upgradeModal.description": "Denne wallet-opdatering bruger smarte kontrakter til hurtigere og billigere transaktioner. Få mere at vide", - "delegation.upgradeModal.enableSmartWallet": "Aktivér smart tegnebog", - "delegation.upgradeModal.title": "Smartere bytter, lavere omkostninger", - "downloadApp.modal.connectExistingWallet": "Tilslut eksisterende tegnebog", - "downloadApp.modal.getStarted.description": "Få adgang til tusindvis af tokens øjeblikkeligt gennem verdens største onchain-markedsplads.", - "downloadApp.modal.getStarted.title": "Begynd at bytte på få sekunder", - "downloadApp.modal.getTheApp.title": "Kom godt i gang med Uniswap", - "downloadApp.modal.uniswapProducts.subtitle": "Uniswap-produkter arbejder problemfrit sammen for at skabe den bedste onchain-oplevelse.", - "empty.swap.button.text": "Tilføj penge for at bytte", - "error.dataUnavailable": "Data er ikke tilgængelig i øjeblikket; vi arbejder på en rettelse", - "error.id": "Fejl-id: {{eventId}}", - "error.jupiterApi.execute.default.title": "Noget gik galt med Jupiter API'en. Prøv igen.", - "error.jupiterApi.failedToLand": "(Kode {{code}}: Transaktionen kunne ikke lande på netværket)", - "error.jupiterApi.invalidBlockHeight": "(Kode -1004: Ugyldig blokhøjde)", - "error.jupiterApi.invalidMessageBytes": "(Kode -3: Ugyldige beskedbytes)", - "error.jupiterApi.invalidPayload": "(Kode -2002: Ugyldig nyttelast)", - "error.jupiterApi.invalidSignedTransaction": "(Kode -2: Ugyldig underskrevet transaktion)", - "error.jupiterApi.invalidTransaction": "(Kode -1002: Ugyldig transaktion)", - "error.jupiterApi.missingCachedOrder": "(Kode -1: Manglende cachelagret ordre)", - "error.jupiterApi.notFullySigned": "(Kode -1003: Transaktionen er ikke fuldt underskrevet)", - "error.jupiterApi.quoteExpired": "Dette tilbud udløb. Prøv igen. (Kode -2003)", - "error.jupiterApi.unknownErrorCode": "(Kode {{code}})", - "error.noData": "Ingen data fundet", - "error.request.provideId": "Beklager, der opstod en fejl under behandlingen af din anmodning. Hvis du anmoder om support, skal du sørge for at angive dit fejl-id.", - "error.tokenApproval": "Token-godkendelse mislykkedes", - "error.tokenApproval.message": "Et netværks- eller forbindelsesproblem forårsagede sandsynligvis, at din godkendelse mislykkedes. Tjek din forbindelse, og prøv igen.", - "error.tokenApprovalEdited": "Utilstrækkeligt godkendelsesbeløb", - "error.tokenApprovalEdited.message": "Godkendelsesbeløbet, der er angivet i din tegnebog, er for lavt til at gennemføre denne transaktion. Prøv venligst igen og øg beløbet.", - "errors.crash.message": "Noget styrtede ned.", - "errors.crash.restart": "Genstart app", - "errors.crash.title": "Åh åh!", - "explore.more.pools": "Udforsk flere pools", - "explore.more.unichain": "Udforsk Unichain-puljer", - "explore.search.label.ownedBy": "Ejes af {{ownerAddress}}", - "explore.search.placeholder": "Søg efter tokens og tegnebøger", - "explore.search.section.nft": "NFT samlinger", - "explore.search.section.popularNFT": "Populære NFT-samlinger", - "explore.search.section.wallets": "Tegnebøger", - "explore.tokens.error": "Kunne ikke indlæse tokens", - "explore.tokens.favorite.action.add": "Yndlingstoken", - "explore.tokens.favorite.action.edit": "Rediger favoritter", - "explore.tokens.favorite.action.remove": "Fjern favorit", - "explore.tokens.favorite.title.default": "Yndlingstegn", - "explore.tokens.favorite.title.edit": "Rediger foretrukne tokens", - "explore.tokens.metadata.marketCap": "{{number}} MCap", - "explore.tokens.metadata.totalValueLocked": "{{number}} TVL", - "explore.tokens.metadata.volume": "{{number}} Vol", - "explore.tokens.sort.label.marketCap": "Markedsværdi", - "explore.tokens.sort.label.priceDecrease": "Prisfald", - "explore.tokens.sort.label.priceIncrease": "Prisstigning", - "explore.tokens.sort.label.totalValueLocked": "TVL", - "explore.tokens.sort.label.volume": "Bind", - "explore.tokens.sort.option.marketCap": "Markedsværdi", - "explore.tokens.sort.option.priceDecrease": "Prisfald (24 timer)", - "explore.tokens.sort.option.priceIncrease": "Prisstigning (24 timer)", - "explore.tokens.sort.option.totalValueLocked": "Uniswap TVL", - "explore.tokens.sort.option.volume": "Uniswap volumen (24H)", - "explore.tokens.top.title": "Top tokens", - "explore.v2TVL": "v2 TVL", - "explore.v3TVL": "v3 TVL", - "explore.v4TVL": "v4 TVL", - "explore.wallets.favorite.action.add": "Yndlings pung", - "explore.wallets.favorite.action.edit": "Rediger favoritter", - "explore.wallets.favorite.action.remove": "Fjern favorit", - "explore.wallets.favorite.action.remove.short": "Fjern fra favoritter", - "explore.wallets.favorite.title.default": "Yndlingspunge", - "explore.wallets.favorite.title.edit": "Rediger foretrukne tegnebøger", - "extension.connection.network": "Netværk", - "extension.connection.networks": "Netværk", - "extension.connection.popup.trouble": "Problemer med at oprette forbindelse?", - "extension.connection.titleConnected": "Forbundet", - "extension.connection.titleNotConnected": "Ikke forbundet", - "extension.lock.button.forgot": "Glemt kodeord?", - "extension.lock.button.reset": "Nulstil tegnebogen", - "extension.lock.button.submit": "Lås op", - "extension.lock.password.error": "Forkert kodeord. Prøv igen", - "extension.lock.password.reset.initial.description": "Uniswap kan ikke hjælpe med at gendanne din adgangskode. Du skal nulstille din tegnebog ved at genindtaste din 12-ords gendannelsessætning.", - "extension.lock.password.reset.initial.help": "Hvor finder jeg min gendannelsessætning?", - "extension.lock.password.reset.initial.title": "glemt kodeord", - "extension.lock.password.reset.speedbump.description": "Sørg for, at du har din 12-ords gendannelsessætning, før du nulstiller din tegnebog. Ellers vil du ikke kunne få dine penge tilbage.", - "extension.lock.password.reset.speedbump.help": "Jeg mistede min bedringsfrase", - "extension.lock.password.reset.speedbump.title": "Før du fortsætter", - "extension.lock.subtitle": "Indtast din adgangskode for at låse op", - "extension.lock.title": "Velkommen tilbage", - "extension.network.notSupported": "Ikke-understøttet netværk", - "extension.open": "Åbn Uniswap-udvidelsen", - "extension.passwordPrompt.error.wrongPassword": "Forkert kodeord. Prøv igen", - "extension.passwordPrompt.title": "Skriv dit kodeord", - "extension.popup.chrome.button": "Åbn udvidelse", - "extension.popup.chrome.description": "Fuldfør denne handling ved at åbne Uniswap-udvidelsen.", - "extension.popup.chrome.title": "Fortsæt i Uniswap", - "extension.settings.defaultWallet.message": "Prioriter Uniswap Extension, når du opretter forbindelse til apps.", - "extension.settings.defaultWallet.title": "Gør til standard tegnebog", - "extension.uninstall.reason.missingFeatures": "Uniswap Wallet mangler visse funktioner", - "extension.uninstall.reason.notUsingCrypto": "Jeg vil ikke længere bruge krypto", - "extension.uninstall.reason.other": "Andre grunde", - "extension.uninstall.reason.switchingWallet": "Jeg skifter til en anden tegnebog", - "extension.uninstall.subtitle": "Hvis du har et øjeblik, vil vi meget gerne høre, hvorfor du afinstallerede Uniswap Wallet.", - "extension.uninstall.title": "Vi er kede af at se dig gå", - "extension.warning.storage.button": "Back up", - "extension.warning.storage.message": "Sørg for at sikkerhedskopiere din gendannelsessætning for at forhindre, at du mister adgang til din tegnebog og penge.", - "extension.warning.storage.title": "Din browser er ved at løbe tør for lagerplads", - "extensionPasskeyLogInPopUp.description": "Importer din Uniswap-konto ved at logge ind med en eksisterende adgangsnøgle.", - "extensionPasskeyLogInPopUp.invalidReferrer": "Luk venligst denne side og prøv igen.", - "fee.bestForCustomizability": "Bedst til tilpasningsmuligheder.", - "fee.bestForExotic": "Bedst til eksotiske par.", - "fee.bestForMost": "Bedst til de fleste par.", - "fee.bestForStablePairs": "Bedst til stabile par.", - "fee.bestForVeryStable": "Bedst til meget stabile par.", - "fee.dynamic": "Dynamisk gebyr", - "fee.percentEarned": "Den %, du vil tjene i gebyrer.", - "fee.selectPercent": "{{pct}}% vælg", - "fee.selectPercentDescription": "{{pct}}% af likviditeten valgt dette niveau", - "fee.tier": "Gebyrniveau", - "fee.tier.create": "Opret gebyrniveau", - "fee.tier.create.button": "Opret et nyt gebyrniveau", - "fee.tier.create.description": "Oprettelse af et nyt niveau vil initialiseres i en ny pulje og resultere i højere netværksomkostninger end normalt.", - "fee.tier.description": "Det tjente beløb giver likviditet. Vælg et beløb, der passer til din risikotolerance og strategi.", - "fee.tier.description.v2": "Det tjente beløb giver likviditet. Alle v2-puljer har faste gebyrer på 0,3 %. For flere muligheder, giv likviditet på v4.", - "fee.tier.dynamic": "Dynamisk gebyrniveau", - "fee.tier.dynamic.create": "Oprettelse af dynamisk gebyrniveau", - "fee.tier.dynamic.create.info": "Du er ved at oprette en pulje med et dynamisk gebyrniveau. Før du fortsætter, skal du sikre dig, at den valgte krog understøtter dynamiske gebyrer.", - "fee.tier.highestTvl": "Højeste TVL", - "fee.tier.label": "Den %, du vil tjene i gebyrer", - "fee.tier.missing.description": "Kan du ikke finde det niveau, du leder efter?", - "fee.tier.new": "Nyt niveau", - "fee.tier.percent.select": "{{percentage}} vælg", - "fee.tier.recommended.description": "Anbefalet baseret på at have den højeste andel af likviditet for det valgte token-par.", - "fee.tier.search": "Søg eller opret andre gebyrniveauer", - "fee.tier.search.short": "Søg i niveauer", - "fee.tier.select": "Vælg gebyrniveau", - "fee.tier.select.existing.button": "Vælg eksisterende gebyrniveau", - "fee.tierExact": "{{fee}} gebyrniveau", - "fee.unavailable": "Optjente gebyrer er ikke synlige for v2-positioner, før likviditeten er fjernet.", - "fee.uncollected": "Inkluderer uafhentede gebyrer:", - "fee.uniswap": "Gebyr ({{percent}})", - "fee.uniswap.description": "Der opkræves gebyrer for at sikre den bedste oplevelse med Uniswap.", - "fiatOffRamp.checkout.title": "Træk tilbage til", - "fiatOffRamp.connection.quote": "Sælger {{amount}} til en værdi af {{currencySymbol}}", - "fiatOffRamp.error.balance": "Overstiger balancen", - "fiatOffRamp.error.populateSend.description": "Vent et øjeblik og prøv igen.", - "fiatOffRamp.error.populateSend.title": "Kan ikke indlæse transaktionen", - "fiatOffRamp.summary.total": "{{cryptoAmount}} for {{fiatAmount}}", - "fiatOffRamp.unsupportedToken.back": "Gå tilbage", - "fiatOffRamp.unsupportedToken.divider": "Ikke-understøttede tokens", - "fiatOffRamp.unsupportedToken.message": "Dette token er ikke understøttet til at sælge. Skift dette aktiv til et af de understøttede tokens.", - "fiatOffRamp.unsupportedToken.swap": "Skift til et understøttet token", - "fiatOffRamp.unsupportedToken.title": "Ikke-understøttet token", - "fiatOffRamp.welcome.tooltip": "Sælg din krypto til din bankkonto eller betalingskort.", - "fiatOnRamp.button.chooseToken": "Vælg token", - "fiatOnRamp.buy.info.description": "Du skal bruge den til at betale netværksomkostninger, når du bytter.", - "fiatOnRamp.buy.info.title": "Start med ETH", - "fiatOnRamp.cexTransferModal.description": "Køb af krypto med et kort understøttes ikke i dit område. Overfør aktiver fra en centraliseret udvekslingskonto for at finansiere din tegnebog.", - "fiatOnRamp.cexTransferModal.title": "Overfør for at komme i gang", - "fiatOnRamp.checkout.title": "Betaling", - "fiatOnRamp.chooseMultiPlatformProvider.chooseNetwork": "Vælg netværk", - "fiatOnRamp.chooseMultiPlatformProvider.description": "Dette bestemmer den wallet-adresse, du vil modtage pengene på.", - "fiatOnRamp.chooseProvider.description": "Du fortsætter til udbyderens portal for at se de gebyrer, der er forbundet med din transaktion.", - "fiatOnRamp.completeTransactionHeader": "Gennemfør transaktionen med {{serviceProvider}}", - "fiatOnRamp.connection.error": "Forbindelsen mislykkedes", - "fiatOnRamp.connection.errorDescription": "Noget gik galt under forbindelse med {{serviceProvider}}.", - "fiatOnRamp.connection.message": "Forbinder dig til {{serviceProvider}}", - "fiatOnRamp.connection.quote": "Køber {{amount}} til en værdi af {{currencySymbol}}", - "fiatOnRamp.connection.terms": "Ved at fortsætte anerkender du, at du er underlagt Servicevilkårene og Privatlivspolitikken med {{serviceProvider}}, alt efter hvad der er relevant.", - "fiatOnRamp.continueInTab": "Gå til fanen {{serviceProvider}} for at fortsætte. Det er sikkert at lukke denne modal nu.", - "fiatOnRamp.disclaimer": "Ved at fortsætte anerkender du, at du er underlagt Servicevilkårene og Privatlivspolitikken med {{serviceProvider}}, alt efter hvad der er relevant.", - "fiatOnRamp.error.default": "Noget gik galt.", - "fiatOnRamp.error.load": "Kunne ikke indlæse tokens for at købe", - "fiatOnRamp.error.max": "Maksimalt {{amount}}", - "fiatOnRamp.error.min": "Minimum {{amount}}", - "fiatOnRamp.error.noQuotes": "Ingen tilbud fundet.", - "fiatOnRamp.error.unavailable": "Denne service er ikke tilgængelig i dit område", - "fiatOnRamp.error.unsupported": "Ikke understøttet i regionen", - "fiatOnRamp.error.usd": "Kun tilgængelig til køb i USD", - "fiatOnRamp.noQuotes.error": "Ingen tilbud fundet", - "fiatOnRamp.paymentMethods.applePay": "Apple Pay", - "fiatOnRamp.paymentMethods.bank": "Bank", - "fiatOnRamp.paymentMethods.debit": "Debet", - "fiatOnRamp.paymentMethods.googlePay": "Google Pay", - "fiatOnRamp.paymentMethods.paypal": "PayPal", - "fiatOnRamp.paymentMethods.venmo": "Venmo", - "fiatOnRamp.quote.advice": "Du fortsætter til udbyderens portal for at se de gebyrer, der er forbundet med din transaktion.", - "fiatOnRamp.quote.type.list": "{{optionsList}}og andre muligheder", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "Fra en konto", - "fiatOnRamp.receiveCrypto.title": "Modtag krypto", - "fiatOnRamp.receiveCrypto.transferFunds": "Finansier din tegnebog ved at overføre krypto fra en anden tegnebog eller konto", - "fiatOnRamp.receiveCrypto.useThisAddress": "Brug denne adresse til at modtage tokens på", - "fiatOnRamp.region.placeholder": "Søg efter land eller region", - "fiatOnRamp.region.title": "Vælg din region", - "fiatOnRamp.summary.total": "{{cryptoAmount}} for {{fiatAmount}}", - "forceUpgrade.action.backup": "Sikkerhedskopier din tegnebog", - "forceUpgrade.action.confirm": "Opdater nu", - "forceUpgrade.action.learn": "Lær, hvordan du opdaterer", - "forceUpgrade.description.extension": "En ny version af appen er tilgængelig. For at fortsætte med at bruge Uniswap-udvidelsen skal du opdatere den til den nyeste version.", - "forceUpgrade.description.wallet": "En ny version af appen er tilgængelig. For at fortsætte med at bruge Uniswap Wallet skal du opdatere den til den nyeste version.", - "forceUpgrade.label.recoveryPhrase": "Gendannelsessætning", - "forceUpgrade.title": "Opdater til den nyeste version", - "forceUpgrade.title.recommendedStatus": "En ny version er tilgængelig", - "globalPreferences.title": "Globale præferencer", - "hero.scroll": "Rul for at lære mere", - "hero.subtitle": "Køb og sælg krypto på {{amount}}+ netværk, herunder Ethereum, Unichain og Base.", - "hero.swap.title": "Skift når som helst,
hvor som helst.", - "hidden.nfts.info.banner.text": "Lær mere om skjulte NFT'er", - "hidden.nfts.info.text.button": "Skjulte NFT'er ({{numHidden}})", - "hidden.nfts.info.text.extension": "Disse er potentielle scams og NFT'er, du har skjult. Du kan højreklikke på en NFT for at vise den.", - "hidden.nfts.info.text.mobile": "Disse er potentielle scams og NFT'er, du har skjult. Du kan trykke længe på en NFT for at vise den.", - "hidden.nfts.info.text.title": "Skjulte NFT'er", - "hidden.tokens.info.banner.text": "Lær mere om skjulte tokens", - "hidden.tokens.info.text.button": "Skjulte tokens ({{numHidden}})", - "hidden.tokens.info.text.info": "Disse er potentielle svindelnumre, små saldi og tokens, du har gemt. Skjulte tokens er ikke inkluderet i din samlede wallet-saldo.", - "hidden.tokens.info.text.title": "Skjulte tokens", - "home.activity.empty.button": "Modtag tokens eller NFT'er", - "home.activity.empty.description.default": "Når du godkender, handler eller overfører tokens eller NFT'er, vises dine transaktioner her.", - "home.activity.empty.description.external": "Når denne tegnebog foretager transaktioner, vises de her.", - "home.activity.empty.title": "Ingen aktivitet endnu", - "home.activity.error.load": "Aktiviteten kunne ikke indlæses", - "home.activity.title": "Aktivitet", - "home.banner.offline": "Du er i offlinetilstand", - "home.banner.testnetMode": "Du er i testnet-tilstand", - "home.banner.testnetMode.nav": "Du er i testnet-tilstand. Slå dette fra i indstillingerne.", - "home.empty.cexTransfer": "Overførsel", - "home.empty.cexTransfer.description": "Flyt penge fra en handelsplatform.", - "home.empty.transfer": "Modtag krypto", - "home.empty.transfer.description": "Flyt penge fra en anden tegnebog.", - "home.explore.footer": "Tryk her for at udforske tusindvis af tokens, NFT'er og mere", - "home.explore.title": "Udforsk tokens", - "home.extension.error": "Fejl ved indlæsning af konti", - "home.label.buy": "Købe", - "home.label.for": "Køb/Sælg", - "home.label.receive": "Modtage", - "home.label.send": "Sende", - "home.label.swap": "Bytte rundt", - "home.nfts.title": "NFT'er", - "home.tokens.empty.action.buy.description": "Køb med betalingskort eller bankkonto.", - "home.tokens.empty.action.buy.title": "Køb krypto", - "home.tokens.empty.action.import.description": "Indtast denne tegnebogs gendannelsessætning for at begynde at bytte og sende.", - "home.tokens.empty.action.import.title": "Importer tegnebog", - "home.tokens.empty.action.receive.description": "Overfør fra en anden tegnebog eller konto.", - "home.tokens.empty.action.receive.title": "Modtag krypto", - "home.tokens.empty.description": "Når denne tegnebog køber eller modtager tokens, vises de her.", - "home.tokens.empty.title": "Ingen tokens endnu", - "home.tokens.empty.welcome.description": "Tilføj midler for at begynde at handle", - "home.tokens.error.fetch": "Kunne ikke hente token-saldi", - "home.tokens.error.load": "Kunne ikke indlæse token-saldi", - "home.tokens.title": "Poletter", - "home.upsell.receive.cta": "Fra en konto", - "home.upsell.receive.title": "Modtag krypto", - "home.warning.viewOnly": "Dette er en tegnebog, der kun kan ses", - "interface.metatags.description": "Bytt kryptovaluta på Ethereum, Base, Arbitrum, Polygon, Unichain og flere. DeFi-platformen, som millioner har tillid til.", - "interface.metatags.title": "Uniswap interface", - "landing.api": "API'en", - "landing.appsOverview": "Bygget til alle måder, du bytter på", - "landing.blog.description": "Hold dig opdateret om de seneste virksomhedsnyheder, produktfunktioner og meget mere", - "landing.docs.description": "Udforsk vores bibliotek med udviklerdokumenter for at komme i gang med at bygge med Uniswap", - "landing.exploreUniverse": "Udforsk universet", - "landing.getStarted": "Handl på verdens største DEX", - "landing.helpCenter.body": "Gennemse ofte stillede spørgsmål og få support fra vores supportteam i USA", - "landing.protocolDescription": "Uniswap Labs driver nogle af de mest anvendte produkter inden for krypto. Oplev tilladelsesfri adgang, dokumenteret sikkerhed og dedikeret support.", - "landing.protocolStats": "Uniswap-protokolstatistikker", - "landing.provideLiquidity.body": "Tilbyd likviditet og opkræv gebyrer ved hjælp af Uniswap-grænsefladen.", - "landing.provideLiquidity.subtitle": "Power onchain-markeder.", - "landing.socials": "Følg Uniswap Labs på X, Farcaster, LinkedIn, og TikTok", - "landing.swapBody": "Få adgang til dyb likviditet, udforsk tokens, sæt limitordrer og sørg for likviditet til tusindvis af tokens på tværs af {{amount}} kæder.", - "landing.swapSubtitle": "Tilladelseløs bytte.", - "landing.tradingApi": "Handels-API", - "landing.tradingApiBody": "Brug den samme API, der driver Uniswap Web App og Wallet, som førende teams verden over har tillid til.", - "landing.tradingApiButton": "Integrer Uniswap API'en", - "landing.tradingApiSubtitle": "DeFi, direkte til dine brugere.", - "landing.trusted": "Betroet af millioner", - "landing.unichain.body": "Bliv en del af fællesskabsskabet på det hurtige, decentraliserede Ethereum L2, der er bygget til at være hjemsted for DeFi.", - "landing.unichain.button": "Begynd at bygge", - "landing.unichain.subtitle": "DeFi-kæden.", - "landing.uniswapX.body": "Gasløse transaktioner og MEV-beskyttelse, med nul gebyrer for mislykkede swaps.", - "landing.uniswapX.button": "Oplev UniswapX", - "landing.uniswapX.subtitle": "Smartere udskiftninger, nul friktion.", - "landing.walletBody": "Den pålidelige, selvforvarende krypto-pung og -udvidelse med millioner af downloads, support fra rigtige mennesker og en 4,8 -vurdering.", - "landing.walletSubtitle": "Byt, opbevar, udforsk.", - "language.afrikaans": "Afrikaans", - "language.arabic": "arabisk", - "language.catalan": "catalansk", - "language.chineseSimplified": "Kinesisk forenklet", - "language.chineseTraditional": "kinesisk, traditionel", - "language.czech": "tjekkisk", - "language.danish": "dansk", - "language.dutch": "hollandsk", - "language.english": "engelsk", - "language.finnish": "finsk", - "language.french": "fransk", - "language.greek": "græsk", - "language.hebrew": "hebraisk", - "language.hindi": "hindi", - "language.hungarian": "ungarsk", - "language.indonesian": "indonesisk", - "language.italian": "italiensk", - "language.japanese": "japansk", - "language.korean": "koreansk", - "language.malay": "malaysisk", - "language.norwegian": "norsk", - "language.polish": "Polere", - "language.portuguese": "portugisisk", - "language.romanian": "rumænsk", - "language.russian": "Russisk", - "language.serbian": "serbisk", - "language.spanishArgentina": "Spansk (Argentina)", - "language.spanishBelize": "Spansk (Belize)", - "language.spanishBolivia": "Spansk (Bolivia)", - "language.spanishChile": "Spansk (Chile)", - "language.spanishColombia": "Spansk (Colombia)", - "language.spanishCostaRica": "Spansk (Costa Rica)", - "language.spanishCuba": "Spansk (Cuba)", - "language.spanishDominicanRepublic": "Spansk (Den Dominikanske Republik)", - "language.spanishEcuador": "Spansk (Ecuador)", - "language.spanishElSalvador": "Spansk (El Salvador)", - "language.spanishGuatemala": "Spansk (Guatemala)", - "language.spanishHonduras": "Spansk (Honduras)", - "language.spanishLatam": "Spansk (Latinamerika)", - "language.spanishMexico": "Spansk (Mexico)", - "language.spanishNicaragua": "Spansk (Nicaragua)", - "language.spanishPanama": "Spansk (Panama)", - "language.spanishParaguay": "Spansk (Paraguay)", - "language.spanishPeru": "Spansk (Peru)", - "language.spanishPuertoRico": "Spansk (Puerto Rico)", - "language.spanishSpain": "Spansk (Spanien)", - "language.spanishUruguay": "Spansk (Uruguay)", - "language.spanishUs": "spansk (USA)", - "language.spanishVenezuela": "Spansk (Venezuela)", - "language.swahili": "Swahili", - "language.swedish": "svensk", - "language.turkish": "tyrkisk", - "language.ukrainian": "ukrainsk", - "language.urdu": "Urdu", - "language.vietnamese": "vietnamesisk", - "large.price.difference": "Stor prisforskel", - "large.price.difference.tooltip": "Hvis du fortsætter med denne handel, vil det resultere i et tab af penge. Denne forskel kan skyldes store handler eller lav likviditet.", - "limit.open.count_one": "1 åben grænse", - "limit.open.count_other": "{{count}} åbne grænser", - "limitPrice.buyingAboveMarketPrice.error.description": "Din grænsepris er {{percentage}}% højere end markedet. Juster din grænsepris for at fortsætte.", - "limitPrice.buyingAboveMarketPrice.error.title": "Køber {{tokenSymbol}} over markedsprisen", - "limitPrice.marketPriceNotAvailable.error.description": "Vi er ikke i stand til at beregne den aktuelle markedspris. For at undgå at afgive en ordre under markedsprisen, skal du kontrollere din netværksforbindelse og prøve igen.", - "limitPrice.marketPriceNotAvailable.error.title": "Markedspris ikke tilgængelig", - "limitPrice.sellingBelowMarketPrice.error.description": "Din grænsepris er {{percentage}}% lavere end markedet. Juster din grænsepris for at fortsætte.", - "limitPrice.sellingBelowMarketPrice.error.title": "Sælger {{tokenSymbol}} under markedspris", - "limits.form.disclaimer.mainnet": "Kun Ethereum mainnet tokens er tilgængelige for grænser. ", - "limits.form.disclaimer.mainnet.short": "Kun Mainnet-tokens er tilgængelige for grænser.", - "limits.form.disclaimer.uniswapx": "Begrænsninger udføres muligvis ikke nøjagtigt, når tokens når den angivne pris. ", - "limits.learnMore": "Få mere at vide om grænser", - "limits.price.input.label": "Når 1 er værd", - "limits.price.label": "Begræns pris", - "limits.selectSupportedTokens": "Vælg understøttede tokens", - "liquidity.hooks": "Hook på v4", - "liquidity.hooks.address.input": "Indtast hook-adresse", - "liquidity.hooks.address.tooltip": "Hook-adresse: {{address}}", - "liquidity.learnMoreLabel": "Lær om likviditetstilførsel", - "liquidity.notEnough.label": "Ikke nok likviditet til at vise nøjagtig USD-værdi.", - "liquidity.provideOnProtocols": "Tilvejebringelse af likviditet på forskellige protokoller", - "liquidityPool.page.title": "Tilføj likviditet til puljer{{version}} på Uniswap", - "liquidityPool.positions.closed.title": "Lukkede stillinger", - "liquidityPool.positions.loadingMore": "Indlæser flere stillinger...", - "liquidityPool.positions.page.title": "Administrer {{quoteSymbol}}/{{baseSymbol}} pulje likviditet på Uniswap", - "liquidityPool.positions.page.version.description": "Se dine aktive {{version}} likviditetspositioner. Tilføj nye stillinger.", - "liquidityPool.positions.page.version.title": "Administrer puljelikviditet{{version}} på Uniswap", - "migrate.allowed": "Tilladt", - "migrate.allowLpMigration": "Tillad migrering af LP-token", - "migrate.connectAccount": "Du skal tilknytte en konto, der ejer denne position.", - "migrate.connectWallet": "Tilslut til en pung for at se din V2-likviditet.", - "migrate.contract": "Uniswap-migreringskontrakt", - "migrate.firstLP": "Du er den første likviditetsudbyder til denne Uniswap V3-pulje. Din likviditet vil migrere til den aktuelle {{source}} pris.", - "migrate.highGasCost": "Dine transaktionsomkostninger vil være meget højere, da de inkluderer gas til at skabe poolen.", - "migrate.invalidRange": "Ugyldigt område er valgt. Minimumsprisen skal være lavere end maxprisen.", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} LP-tokens", - "migrate.migrating": "Migrerer", - "migrate.missingV2Position": "Kan du ikke se en af dine v2-positioner? Importer det.", - "migrate.noV2Liquidity": "Ingen V2-likviditet fundet.", - "migrate.positionNoFees": "Din position vil ikke tjene gebyrer eller blive brugt i handler, før markedsprisen bevæger sig ind i dit interval.", - "migrate.priceDifference": "Prisforskel: ", - "migrate.priceWarning": "Du bør kun indskyde likviditet i Uniswap V3 til en pris, du mener er korrekt.
Hvis prisen virker forkert, kan du enten lave et bytte for at flytte prisen eller vente på, at en anden gør det.", - "migrate.refund": "Mindst {{amtA}} {{symA}} og {{amtB}} {{symB}} vil blive refunderet til din pung på grund af det valgte prisinterval.", - "migrate.selectFeeTier": "Vælg gebyrniveau", - "migrate.setRange": "Sæt prisinterval", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Pris:", - "migrate.v2Description": "Dette værktøj vil sikkert migrere din {{source}} likviditet til V3. Processen er fuldstændig tillidsløs takket være <0>Uniswap-migreringskontrakten ↗", - "migrate.v2Instruction": "For hver pulje vist nedenfor skal du klikke på migrer for at fjerne din likviditet fra Uniswap V2 og indsætte den i Uniswap V3.", - "migrate.v2Title": "Migrer V2-likviditet", - "migrate.v3Price": "V3 {{sym}} Pris:", - "mint.v3.input.invalidPrice.error": "Ugyldig prisinput", - "mobileAppPromo.banner.getTheApp.link": "Hent Uniswap Wallet-appen", - "mobileAppPromo.banner.title": "Uniswap: Crypto & NFT Wallet", - "moonpay.poweredBy": "Fiat onramp drevet af MoonPay USA LLC", - "nav.createAccount.button": "Opret konto", - "nav.logIn.button": "Log ind", - "nav.logInOrConnect.title": "Log ind eller opret forbindelse", - "nav.products.tradingApi": "Integrer protokollen", - "nav.products.unichain": "DeFi-kæden", - "nav.products.uniswapX": "Metaaggregatoren", - "nav.products.wallet": "Byt, opbevar, udforsk", - "nav.signUp.button": "Tilmeld dig", - "nav.tabs.createPosition": "Opret stilling", - "nav.tabs.viewPositions": "Se stillinger", - "network.lostConnection": "Du har muligvis mistet din netværksforbindelse.", - "network.mightBeDown": "{{network}} er muligvis nede lige nu, eller du kan have mistet din netværksforbindelse.", - "network.warning": "Netværksadvarsel", - "nft.noPools": "Ingen pools endnu", - "nft.reportSpam": "Rapportér som spam", - "notFound.oops": "Ups, tag mig tilbage til Swap", - "notice.uk": "Denne webapplikation leveres som et værktøj til, at brugere kan interagere med Uniswap-protokollen på eget initiativ uden godkendelse eller anbefaling af cryptocurrency-handelsaktiviteter. Ved at gøre dette anbefaler Uniswap ikke, at brugere eller potentielle brugere engagerer sig i handel med kryptoaktiver, og brugere eller potentielle brugere af webapplikationen bør ikke betragte denne webside eller dens indhold som indebærer nogen form for anbefaling, invitation eller tilskyndelse til at handle med kryptoaktiver .", - "notice.uk.label": "UK ansvarsfraskrivelse:", - "notification.assetVisibility.hidden": "{{assetName}} skjult", - "notification.assetVisibility.unhidden": "{{assetName}} skjult", - "notification.buy.network": "Køber på {{network}}", - "notification.copied.address": "Adressen er kopieret", - "notification.copied.calldata": "Opkaldsdata er kopieret", - "notification.copied.contractAddress": "Kontraktadresse kopieret", - "notification.copied.failed": "Kunne ikke kopiere til udklipsholder", - "notification.copied.image": "Billedet er kopieret", - "notification.copied.linkUrl": "Linket er kopieret", - "notification.copied.nftUrl": "NFT URL kopieret", - "notification.copied.poolId": "Pool-ID kopieret", - "notification.copied.tokenUrl": "Token URL kopieret", - "notification.copied.transactionId": "Transaktions-id kopieret", - "notification.copied.unitag": "Brugernavn kopieret", - "notification.countryChange": "Skiftet til {{countryName}}", - "notification.limit.network": "Opretter limitordre på {{network}}", - "notification.lp.network": "Tilvejebringelse af likviditet på {{network}}", - "notification.network.changed": "Skiftet til {{network}}", - "notification.passwordChanged": "Adgangskode ændret", - "notification.poolFinder.network": "Søg efter pool på {{network}}", - "notification.restore.success": "Pungen gendannet!", - "notification.sell.network": "Sælger på {{network}}", - "notification.send.network": "Sender den {{network}}", - "notification.smartWallet.disabled": "Deaktiveret på 1 netværk", - "notification.smartWallet.disabled.all": "Smart tegnebog deaktiveret", - "notification.smartWallet.disabled.plural": "Deaktiveret på {{amount}} netværk", - "notification.spam.NFT.failed": "Kunne ikke rapportere NFT. Prøv igen senere.", - "notification.spam.NFT.successful": "Rapporteret", - "notification.swap.network": "Bytter på {{network}}", - "notification.swap.pending.swap": "Udskiftning afventer", - "notification.swap.pending.unwrap": "Udpakning afventer", - "notification.swap.pending.wrap": "Indpakning afventer", - "notification.transaction.approve.canceled": "Annulleret {{currencySymbol}} godkend.", - "notification.transaction.approve.fail": "Kunne ikke godkende {{currencySymbol}} til brug med {{address}}.", - "notification.transaction.approve.success": "Godkendt {{currencySymbol}} til brug med {{address}}.", - "notification.transaction.pending": "Transaktion afventer", - "notification.transaction.swap.canceled": "Annulleret {{inputCurrencySymbol}}-{{outputCurrencySymbol}} bytte.", - "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} for {{outputCurrencyAmountWithSymbol}} swap udløb.", - "notification.transaction.swap.fail": "Kunne ikke bytte {{inputCurrencyAmountWithSymbol}} til {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.swap.success": "Skiftede {{inputCurrencyAmountWithSymbol}} til {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.transfer.canceled": "Annulleret {{tokenNameOrAddress}} afsendelse", - "notification.transaction.transfer.fail": "Kunne ikke sende {{tokenNameOrAddress}} til {{walletNameOrAddress}}", - "notification.transaction.transfer.received": "Modtog {{tokenNameOrAddress}} fra {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "Sendt {{tokenNameOrAddress}} til {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "Kunne ikke handle med {{addressOrEnsName}}", - "notification.transaction.unknown.fail.short": "Transaktionen mislykkedes", - "notification.transaction.unknown.success.full": "Forhandlet med {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "Transaktionen bekræftet", - "notification.transaction.unwrap.canceled": "Annulleret {{inputCurrencySymbol}} udpakning.", - "notification.transaction.unwrap.fail": "Kunne ikke pakke {{inputCurrencyAmountWithSymbol}}ud.", - "notification.transaction.unwrap.success": "Pakket {{inputCurrencyAmountWithSymbol}} ud og modtog {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.canceled": "Annulleret {{inputCurrencySymbol}} wrap.", - "notification.transaction.wrap.fail": "Kunne ikke ombryde {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.success": "Pakket {{inputCurrencyAmountWithSymbol}} og modtog {{outputCurrencyAmountWithSymbol}}.", - "notification.transfer.pending": "Send afventer", - "notification.walletConnect.confirmed": "Transaktionen bekræftet med {{dappName}}", - "notification.walletConnect.connected": "Forbundet", - "notification.walletConnect.disconnected": "Afbrudt", - "notification.walletConnect.failed": "Transaktionen mislykkedes med {{dappName}}", - "notification.walletConnect.networkChanged.full": "Skiftet til {{networkName}}", - "notification.walletConnect.networkChanged.short": "Skiftede netværk", - "notifications.scantastic.subtitle": "Fortsæt på Uniswap Extension", - "notifications.scantastic.title": "Succes!", - "onboarding.backup.manual.banner": "Vi foreslår, at du skriver dette på et stykke papir og opbevarer det et sikkert sted, f.eks. et pengeskab.", - "onboarding.backup.manual.displayWarning.description": "Læs følgende omhyggeligt, før du fortsætter.", - "onboarding.backup.manual.displayWarning.note.access": "Denne gendannelsessætning giver dig fuld adgang til din tegnebog og penge", - "onboarding.backup.manual.displayWarning.note.secure": "Se dette privat og del det ikke med nogen", - "onboarding.backup.manual.displayWarning.note.storage": "Skriv det ned og opbevar det et sikkert sted", - "onboarding.backup.manual.displayWarning.title": "Nogle vigtige ting at vide", - "onboarding.backup.manual.error": "Ugyldigt eller forkert stavet ord", - "onboarding.backup.manual.placeholder": "Hemmeligt ord", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} afsluttet", - "onboarding.backup.manual.selectedWordPlaceholder": "Vælg ord", - "onboarding.backup.manual.subtitle_one": "Hvad er det {{count}}første ord i din gendannelsessætning?", - "onboarding.backup.manual.subtitle_two": "Hvad er det {{count}}andet ord i din gendannelsessætning?", - "onboarding.backup.manual.subtitle_few": "Hvad er det {{count}}ord i din gendannelsessætning?", - "onboarding.backup.manual.subtitle_other": "Hvad er det {{count}}ord i din gendannelsessætning?", - "onboarding.backup.manual.title": "Lad os sikre dig, at du har optaget det korrekt", - "onboarding.backup.option.badge.quick": "Hurtigt", - "onboarding.backup.option.cloud.description": "Sikkerhedskopier din tegnebog via {{cloudProviderName}}, beskyttet af en gendannelsesadgangskode.", - "onboarding.backup.option.cloud.title": "Indstil en gendannelsesadgangskode", - "onboarding.backup.option.manual.description": "Optag dine 12 hemmelige ord på et stykke papir og gem det et sikkert sted.", - "onboarding.backup.option.manual.title": "Skriv gendannelsessætning ned", - "onboarding.backup.reminder.backupNowButton": "Sikkerhedskopier nu", - "onboarding.backup.reminder.remindMeLaterButton": "Påmind mig senere", - "onboarding.backup.reminder.title": "Sikkerhedskopier din tegnebog", - "onboarding.backup.reminder.warning.description": "Sikkerhedskopier din tegnebog, så du kan gendanne dine aktiver, hvis du nogensinde mister din telefon eller får en ny.", - "onboarding.backup.reminder.warning.fundsLabel": "Midler i fare", - "onboarding.backup.reminder.warning.title": "Du kan miste dine penge", - "onboarding.backup.speedBump.cloud.description": "Hvis du nogensinde glemmer det, kan vi ikke nulstille det for dig. Skriv det ned et sikkert sted, eller opbevar det sikkert i en adgangskodehåndtering.", - "onboarding.backup.speedBump.cloud.disclaimer": "Jeg forstår, at Uniswap Labs ikke kan nulstille min gendannelsesadgangskode.", - "onboarding.backup.speedBump.cloud.title": "Det er vigtigt at gemme denne adgangskode", - "onboarding.backup.speedBump.manual.description": "Sørg for, at du har skrevet din gendannelsessætning ned korrekt og har et sikkert sted at opbevare den.", - "onboarding.backup.speedBump.manual.disclaimer": "Jeg forstår, at Uniswap Labs ikke kan gendanne min tegnebog, hvis jeg mister denne.", - "onboarding.backup.speedBump.manual.title": "Før du er færdig...", - "onboarding.backup.subtitle": "Sådan genopretter du din tegnebog, hvis du sletter appen eller mister din enhed.", - "onboarding.backup.title.existing": "Sikkerhedskopier din tegnebog", - "onboarding.backup.title.new": "Vælg din sikkerhedskopieringsmetode", - "onboarding.backup.view.subtitle.message1": "Læs følgende omhyggeligt, før du fortsætter", - "onboarding.backup.view.subtitle.message2": "Du skal indtaste alle 12 af disse hemmelige ord for at gendanne din pung.", - "onboarding.backup.view.title": "Skriv din gendannelsessætning ned", - "onboarding.backup.view.warning.message1": "Denne gendannelsessætning giver dig fuld adgang til din tegnebog og penge", - "onboarding.backup.view.warning.message2": "Skriv det ned og opbevar det et sikkert sted", - "onboarding.backup.view.warning.message3": "Se dette privat og del det ikke med nogen", - "onboarding.cloud.confirm.description": "Du skal indtaste dette for at få dine penge tilbage. Hvis du nogensinde glemmer det, kan vi ikke hente det for dig.", - "onboarding.cloud.confirm.title": "Bekræft din gendannelsesadgangskode", - "onboarding.cloud.createPassword.description": "Du skal indtaste dette for at få dine penge tilbage. Hvis du nogensinde glemmer det, kan vi ikke hente det for dig.", - "onboarding.cloud.createPassword.title": "Opret din gendannelsesadgangskode", - "onboarding.complete.button": "Åbn Uniswap-udvidelsen", - "onboarding.complete.description": "Din tegnebog er klar til at sende og modtage krypto. Åbn Uniswap Extension med genvejen nedenfor.", - "onboarding.complete.go_to_uniswap": "Gå til Uniswap Web App", - "onboarding.complete.pin.description": "Klik på knappenålsikonet for at tilføje Uniswap Extension til din værktøjslinje.", - "onboarding.complete.pin.title": "Pin Uniswap-udvidelse", - "onboarding.complete.title": "Du er klar", - "onboarding.extension.biometrics.subtitle.fingerprint": "Få hurtig og sikker adgang til din pung med blot dit fingeraftryk.", - "onboarding.extension.biometrics.title": "Aktiver {{biometricsMethod}}", - "onboarding.extension.password.subtitle": "Du skal bruge dette for at låse din tegnebog op og få adgang til din gendannelsessætning", - "onboarding.extension.password.title.default": "Opret adgangskode", - "onboarding.extension.password.title.reset": "Nulstil din adgangskode", - "onboarding.extension.unsupported.android.description": "Uniswap Extension er kun kompatibel med Chrome på skrivebordet.", - "onboarding.extension.unsupported.android.title": "Chrome på mobilen er ikke understøttet (endnu)", - "onboarding.extension.unsupported.description": "Uniswap Extension er kun kompatibel med Chrome lige nu.", - "onboarding.extension.unsupported.title": "Denne browser er ikke understøttet (endnu)", - "onboarding.home.intro.backup.description.extension": "Gem din gendannelsesfrase for at sikre, at du aldrig mister adgangen til din tegnebog.", - "onboarding.home.intro.backup.description.mobile": "Lav en genopretningsplan, hvis du nogensinde mister din telefon eller får en ny.", - "onboarding.home.intro.backup.title": "Sikkerhedskopier din tegnebog", - "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK og JUP — nu tilgængelige på Unichain", - "onboarding.home.intro.bridgedAssets.title": "Handl nye tokens på Unichain", - "onboarding.home.intro.fund.description": "Finansier din tegnebog ved at købe krypto eller overføre fra en anden konto.", - "onboarding.home.intro.fund.title": "Få dit første token", - "onboarding.home.intro.label.required": "Påkrævet", - "onboarding.home.intro.label.swipe": "Swipe", - "onboarding.home.intro.pushNotifications.description": "Få prisadvarsler om dine foretrukne tokens, markedstendenser og mere.", - "onboarding.home.intro.pushNotifications.title": "Hold dig orienteret", - "onboarding.home.intro.unitag.description": "Byg en personlig web3-profil og del nemt din adresse med venner.", - "onboarding.home.intro.unitag.title": "Gør krav på dit {{unitagDomain}} brugernavn", - "onboarding.import.error.invalidWords_one": "1 ord er ugyldigt eller stavet forkert", - "onboarding.import.error.invalidWords_other": "{{count}} ord er ugyldige eller stavet forkert", - "onboarding.import.method.restore.message.android": "Tilføj tegnebøger, du har sikkerhedskopieret, til din Google Drev-konto.", - "onboarding.import.method.restore.message.ios": "Tilføj tegnebøger, du har sikkerhedskopieret, til din iCloud-konto.", - "onboarding.import.method.restore.title": "Gendan en tegnebog", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.android": "Indtast din gendannelsesadgangskode for at gendanne din tegnebog via Google Drive-sikkerhedskopi.", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.ios": "Indtast din gendannelsesadgangskode for at gendanne din tegnebog via iCloud-sikkerhedskopi.", - "onboarding.import.method.restoreSeedPhrase.cloud.title.android": "Gendan fra Google Drev", - "onboarding.import.method.restoreSeedPhrase.cloud.title.ios": "Gendan fra iCloud", - "onboarding.import.method.restoreSeedPhrase.title": "Vælg, hvordan du vil gendanne din tegnebog", - "onboarding.import.method.restoreSeedPhrase.wallet.desc": "Indtast dine 12 hemmelige ord, som du tidligere har gemt et sikkert sted.", - "onboarding.import.method.restoreSeedPhrase.wallet.title": "Indtast gendannelsessætning", - "onboarding.import.method.viewPrivateKeys.button.desc": "Se din private nøgle", - "onboarding.import.method.viewPrivateKeys.title": "Har du ikke noget af ovenstående? ", - "onboarding.import.onDeviceRecovery.other_options": "Opret eller importer en anden tegnebog", - "onboarding.import.onDeviceRecovery.other_options.label": "Vil du ikke have noget af ovenstående?", - "onboarding.import.onDeviceRecovery.subtitle": "Vælg hvilken tegnebog du vil logge ind på igen.", - "onboarding.import.onDeviceRecovery.title": "Velkommen tilbage til Uniswap", - "onboarding.import.onDeviceRecovery.wallet.button": "Se gendannelsessætning", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 anden tegnebog", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} andre tegnebøger", - "onboarding.import.onDeviceRecovery.warning.caption": "Sørg for, at du har sikkerhedskopieret alle de andre tegnebøger. Hvis du nogensinde vil gendanne dem, skal du bruge deres gendannelsessætninger eller tilsvarende {{cloudProvider}} sikkerhedskopier.", - "onboarding.import.onDeviceRecovery.warning.title": "Er du sikker?", - "onboarding.import.selectMethod.errorMessage": "Der opstod en uventet fejl. Prøv venligst igen.", - "onboarding.import.selectMethod.mobileApp.subtitle": "Importer en tegnebog fra mobilappen via QR-kode.", - "onboarding.import.selectMethod.mobileApp.title": "Brug Uniswap Mobile", - "onboarding.import.selectMethod.passkey.subtitle": "Synkroniser din Uniswap-pung med en eksisterende adgangsnøgle.", - "onboarding.import.selectMethod.passkey.title": "Log ind med adgangskode", - "onboarding.import.selectMethod.recoveryPhrase.subtitle": "Importer fra en anden krypto-pung.", - "onboarding.import.selectMethod.recoveryPhrase.title": "Indtast gendannelsessætning", - "onboarding.import.selectMethod.title": "Log ind eller importer en tegnebog", - "onboarding.import.title": "Vælg, hvordan du vil tilføje din tegnebog", - "onboarding.importMnemonic.button.default": "Min gendannelsessætning er på 12 ord", - "onboarding.importMnemonic.button.importing": "Importerer...", - "onboarding.importMnemonic.button.longPhrase": "Min restitutionsfrase er længere", - "onboarding.importMnemonic.error.invalidPhrase": "Den sætning, du indtastede, er ugyldig", - "onboarding.importMnemonic.subtitle": "Indtast eller indsæt din 12-ords gendannelsessætning", - "onboarding.importMnemonic.title": "Indtast din gendannelsessætning", - "onboarding.importPasskey.bringWindowToFront": "Bring vinduet foran", - "onboarding.importPasskey.continueInSecureWindow": "Fortsæt i det sikre login-vindue.", - "onboarding.intro.button.alreadyHave": "Jeg har allerede en pung", - "onboarding.intro.button.logInOrImport": "Log ind eller importér", - "onboarding.intro.mobileScan.button": "Scan QR-kode for at importere", - "onboarding.intro.mobileScan.title": "Har du Uniswap-appen?", - "onboarding.landing.button.add": "Tilføj en eksisterende tegnebog", - "onboarding.landing.button.create": "Opret en tegnebog", - "onboarding.landing.button.createAccount": "Opret en konto", - "onboarding.name.choose": "Vælg et brugernavn", - "onboarding.name.choose.subtitle": "Dette er et offentligt navn, som alle kan bruge til at sende dig krypto.", - "onboarding.notification.permission.message": "For at modtage notifikationer skal du aktivere notifikationer for Uniswap Wallet i din enheds indstillinger.", - "onboarding.notification.permission.title": "Tilladelse til notifikationer", - "onboarding.notification.subtitle": "Hold dig opdateret om transaktionsstatusser og større prisændringer for foretrukne tokens.", - "onboarding.notification.title": "Slå notifikationer til", - "onboarding.passkey.create": "Opret din adgangsnøgle", - "onboarding.passkey.loading.subtitle": "Dette skulle kun tage et sekund.", - "onboarding.passkey.loading.title": "Finder din tegnebog...", - "onboarding.passkey.secure": "Sikre din konto", - "onboarding.passkey.secure.description": "Adgangsnøgler giver dig mulighed for hurtigt og sikkert at få adgang til din konto kun ved hjælp af dit ansigt eller fingeraftryk.", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "Lad os bekræfte, at du fik ret. Hvis du mister eller skriver dette forkert ned, vil du ikke kunne få dine penge tilbage.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "Hvis du mister eller skriver dette forkert ned, vil du ikke kunne få dine penge tilbage.", - "onboarding.recoveryPhrase.confirm.title": "Lad os bekræfte, at du fik ret", - "onboarding.recoveryPhrase.view.subtitle": "Du skal indtaste alle 12 af disse hemmelige ord for at gendanne din pung.", - "onboarding.recoveryPhrase.view.title": "Skriv din gendannelsessætning ned", - "onboarding.recoveryPhrase.view.title.hasPassword": "Hvis du nogensinde glemmer din adgangskode...", - "onboarding.recoveryPhrase.warning.final.button": "jeg er klar", - "onboarding.recoveryPhrase.warning.final.message": "Din gendannelsessætning er det, der giver dig (og alle, der har det) adgang til dine midler. Sørg for at holde det for dig selv.", - "onboarding.recoveryPhrase.warning.final.title": "Gør dette trin på et privat sted", - "onboarding.recoveryPhrase.warning.screenshot.message": "Alle, der får adgang til dine billeder, kan få adgang til din tegnebog. Vi anbefaler, at du i stedet skriver dine ord ned.", - "onboarding.recoveryPhrase.warning.screenshot.title": "Skærmbilleder er ikke sikre", - "onboarding.resetPassword.complete.safety": "Lær mere om pungsikkerhed", - "onboarding.resetPassword.complete.subtitle": "Brug din nye adgangskode til at låse din tegnebog op.", - "onboarding.resetPassword.complete.title": "Nulstil kodeord", - "onboarding.scan.error": "Der opstod en fejl under indlæsning af QR-koden", - "onboarding.scan.otp.error": "Den kode, du har indsendt, er forkert, eller der opstod en fejl under indsendelsen. Prøv igen.", - "onboarding.scan.otp.failed": "Mislykkede forsøg: {{number}}", - "onboarding.scan.otp.subtitle": "Tjek din Uniswap-mobilapp for koden på 6 tegn", - "onboarding.scan.otp.title": "Indtast engangskode", - "onboarding.scan.subtitle": "Scan QR-koden med Uniswap-mobilappen for at begynde at importere din tegnebog.", - "onboarding.scan.title": "Importer tegnebog fra appen", - "onboarding.scan.troubleScanning.message": "Importer via gendannelsessætning", - "onboarding.scan.troubleScanning.title": "Problemer med at scanne?", - "onboarding.scan.wifi": "Tilslut din telefon til det samme WiFi-netværk som din computer.", - "onboarding.security.alert.biometrics.message.android": "For at bruge biometri skal du først konfigurere det i indstillingerne", - "onboarding.security.alert.biometrics.message.ios": "For at bruge {{biometricsMethod}}skal du tillade adgang i systemindstillinger", - "onboarding.security.alert.biometrics.title.android": "Biometri er deaktiveret", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} er deaktiveret", - "onboarding.security.button.confirm.android": "Aktiver biometri", - "onboarding.security.button.confirm.ios": "Aktiver {{biometricsMethod}}", - "onboarding.security.button.setup": "Opsætning", - "onboarding.security.subtitle.android": "Tilføj et ekstra lag af sikkerhed ved at kræve biometri for at sende transaktioner.", - "onboarding.security.subtitle.ios": "Tilføj et ekstra lag af sikkerhed ved at kræve {{biometricsMethod}} for at sende transaktioner.", - "onboarding.security.title": "Beskyt din pung", - "onboarding.selectWallets.error": "Adresser kunne ikke indlæses", - "onboarding.selectWallets.title.default": "Vælg tegnebøger til at importere", - "onboarding.selectWallets.title.error": "Fejl ved import af tegnebøger", - "onboarding.termsOfService": "Ved at fortsætte accepterer jeg Servicevilkårene og samtykker til Privatlivspolitikken", - "onboarding.tooltip.recoveryPhrase.trigger": "Hvad er en gendannelsessætning?", - "onboarding.wallet.continue": "Lad os holde det sikkert", - "onboarding.wallet.defaultName": "Tegnebog {{number}}", - "onboarding.wallet.description.full": "Dette er din personlige plads til tokens, NFT'er og alle dine handler. Fuldfør opsætningen for at holde dine penge sikre.", - "onboarding.wallet.title": "Velkommen til din nye pung", - "onboarding.welcome.subtitle": "Lad os færdiggøre opsætningen af din tegnebog.", - "onboarding.welcome.title": "Velkomst!", - "outageBanner.message": "{{chainName}}{{versionDescription}} data er ikke tilgængelige lige nu, men vi forventer, at problemet bliver løst inden længe.", - "outageBanner.message.sub": "Du kan stadig bytte og give likviditet i denne kæde uden problemer.", - "outageBanner.title": "{{versionName}} vender snart tilbage", - "passkeys.help.modal.subtitle": "Hvis du har problemer med adgangsnøgler, kan du besøge Uniswap Support for at få hjælp.", - "passkeys.help.modal.subtitle.invalidPasskey": "Din anmodning kunne ikke gennemføres. Prøv venligst igen med en adgangsnøgle tilknyttet ", - "passkeys.help.modal.subtitle.technicalError": "Din anmodning kunne ikke gennemføres på grund af en uventet teknisk fejl. Dine midler er sikre. Prøv venligst igen.", - "passkeys.help.modal.title": "Brug for hjælp?", - "passkeys.help.modal.title.invalidPasskey": "Ugyldig adgangsnøgle", - "passkeys.help.modal.title.technicalError": "Teknisk fejl", - "passkeys.manage.modal.subtitle": "For at tilføje eller fjerne adgangsnøgler skal du logge ind på {{passkeyManagementUrl}}.", - "passkeys.manage.modal.title": "Administrer adgangsnøgler", - "permit.approval.fail": "Tilladelsesgodkendelse mislykkedes", - "permit.approval.fail.message": "Permit2 tillader token-godkendelser at blive delt og administreret på tværs af forskellige applikationer.", - "pool.activeRange": "Aktivt krydsområde", - "pool.addAs": "Tilføj som {{nativeWrappedSymbol}}", - "pool.apr": "ÅOP", - "pool.apr.base": "Basis ÅOP", - "pool.apr.description": "Annualiseret baseret på 1 dags gebyrer", - "pool.apr.reward": "Belønning ÅOP", - "pool.aprText": "Pool ÅOP", - "pool.balances": "Pool saldi", - "pool.closedCTA.description": "Du kan se dem ved at bruge filteret øverst på siden.", - "pool.closedCTA.title": "Leder du efter dine lukkede stillinger?", - "pool.collectAs": "Saml som {{nativeWrappedSymbol}}", - "pool.collectFees": "Opkræve gebyrer", - "pool.connectEthereumToView": "Tilslut en Ethereum-wallet for at se dine pools", - "pool.create": "Oprettelse af ny pool", - "pool.create.info": "Dine valg vil skabe en ny likviditetspulje, som kan resultere i lavere initial likviditet og øget volatilitet. Overvej at tilføje til en eksisterende pulje for at minimere disse risici.", - "pool.createdPosition": "Oprettet stilling", - "pool.createdPosition.canceled": "Oprettelse af position annulleret", - "pool.createdPosition.failed": "Opret position mislykkedes", - "pool.dynamic": "Dynamisk pool", - "pool.earnings": "Indtjening", - "pool.earnings.empty": "Du har ingen indtjening endnu", - "pool.explorers": "opdagelsesrejsende", - "pool.import": "Import pool", - "pool.import.link.description": "Nogle v2-positioner vises ikke automatisk.", - "pool.import.positions.v2": "Importer V2-positioner", - "pool.import.positions.v2.selectPair.description": "Nogle v2-positioner vises ikke automatisk. Vælg et token-par for at importere og se dine positioner.", - "pool.import.success": "Pool importeret", - "pool.incentives.administeredRewards": "Belønninger uddeles af den autonome Merkl-distributørkontrakt.", - "pool.incentives.collect": "Indsamle", - "pool.incentives.collectedRewards": "Indsamlede belønninger", - "pool.incentives.collectFailed": "Indsamling mislykkedes. Prøv venligst igen.", - "pool.incentives.collectFailedNoRetry": "Indsamling af belønninger mislykkedes.", - "pool.incentives.collectingRewards": "Indsamling af belønninger", - "pool.incentives.collectRewards": "Saml belønninger", - "pool.incentives.collectRewardsCanceled": "Indsamling af belønninger annulleret", - "pool.incentives.daysLeft": "dage tilbage", - "pool.incentives.eligible": "Kvalificerede puljer har symbolske belønninger, så du kan tjene mere", - "pool.incentives.merklDocs": "Beregnet af Merkl ud fra emissionsbelønninger og pulje TVL.", - "pool.incentives.rewardsDistribution": "Belønningsfordeling", - "pool.incentives.rewardsEarned": "Belønninger optjent", - "pool.incentives.similarPoolHasRewards": "En lignende pulje har UNI-belønninger", - "pool.incentives.switchPools": "Skift pools", - "pool.incentives.timePeriod": "Tidsperiode", - "pool.incentives.uni.findMore": "Find puljer med UNI-belønninger", - "pool.incentives.yourRewards.error": "Dine belønninger er ikke tilgængelige lige nu", - "pool.incentives.yourRewards.error.description": "Belønninger kunne ikke hentes. Dette kan skyldes et netværksproblem. Prøv at genindlæse siden.", - "pool.info": "Pool info", - "pool.limitFluctuation.warning": "Vær opmærksom på, at udførelsen af grænser kan variere baseret på udsving på markedet i realtid og overbelastning af Ethereum-netværket. Begrænsninger udføres muligvis ikke nøjagtigt, når tokens når den angivne pris.", - "pool.liquidity.data.error.message": "Der opstod en fejl under hentning af de nødvendige data til din transaktion.", - "pool.liquidity.outOfSync": "Pool og markedspris uoverensstemmelse", - "pool.liquidity.outOfSync.message": "Priserne i denne pulje afviger med markedspriserne på de valgte tokens. Juster dit prisinterval i overensstemmelse hermed, eller vent på, at poolen balancerer igen for at undgå tab.", - "pool.maxPrice": "Max pris", - "pool.migrateLiquidity": "Migrer likviditet", - "pool.migrateLiquidityDisabledTooltip": "Denne kæde understøtter ikke v4 likviditetspuljer.", - "pool.migrateToV4": "Migrer til v4", - "pool.minPrice": "Min pris", - "pool.newPosition.plus": "+ Ny stilling", - "pool.newPosition.title": "Ny stilling", - "pool.newSpecificPosition": "Ny {{symbol}} stilling", - "pool.notAvailableOnSolana": "Der er ikke pools tilgængelige på Solana", - "pool.notFound.description": "Beklager, vi kan ikke finde nogen oplysninger om denne pulje. Tjek navn og adresse, og prøv igen.", - "pool.notFound.title": "Pool ikke fundet", - "pool.openToStart.evmAndSolanaConnected": "Åbn en ny position eller opret en pulje for at komme i gang. Puljer er ikke tilgængelige på Solana.", - "pool.openToStart.evmOnly": "Åbn en ny stilling, eller opret en pulje for at komme i gang.", - "pool.percent": "{{pct}}% pulje", - "pool.pooled": "Sammenlagt {{sym}}:", - "pool.position": "Position", - "pool.positions": "Stillinger", - "pool.positions.title": "Dine holdninger", - "pool.positions.transaction.settings": "Transaktionsindstillinger", - "pool.positions.usdValueUnavailable": "USD-værdi er ikke tilgængelig", - "pool.positions.usdValueUnavailable.tooltip": "USD-værdi er i øjeblikket ikke tilgængelig for denne stilling. Se positionsdetaljer for indsatte tokenbeløb.", - "pool.refresh.prices": "Opdater priserne", - "pool.removeLiquidity": "Fjern likviditet", - "pool.rewardAPR": "Belønning ÅOP (UNI)", - "pool.rewardAPR.percent": "{{pct}} belønning ÅOP", - "pool.rewards": "Belønninger", - "pool.rewardsPool.label": "Pool tokens i belønningspuljen:", - "pool.selectPair": "Vælg par", - "pool.share.label": "Din poolandel:", - "pool.specificPosition": "{{symbol}} position", - "pool.tokenPair": "Token-par", - "pool.top.rewards": "Puljer med belønninger", - "pool.top.tvl": "Top pools fra TVL", - "pool.top.volume": "Puljer efter 24-timers volumen", - "pool.totalAPR": "Samlet ÅOP", - "pool.totalTokens": "Dine samlede pulje-tokens:", - "pool.v2": "v2 puljer", - "pool.v3": "v3 puljer", - "pool.via": "{{tokenPair}} via {{dex}}", - "pool.volOverTvl": "1D vol/TVL", - "pool.volume.thirtyDay": "30 dages volumen", - "pool.volume.thirtyDay.short": "30D vol", - "pool.withdrawAs": "Træk tilbage som {{nativeWrappedSymbol}}", - "poolFinder.availablePools": "Tilgængelige pools", - "poolFinder.availablePools.found.description": "v2-puljer, der matcher dit parvalg.", - "poolFinder.availablePools.notFound.description": "Ingen matchende v2-puljer fundet. Dobbelttjek dit tokenvalg, og sørg for, at du er tilsluttet den korrekte tegnebog.", - "pools.explore": "Udforsk pools", - "portfolio.activity.filters.timePeriod.all": "Hele tiden", - "portfolio.activity.filters.transactionType.all": "Alle typer", - "portfolio.activity.filters.transactionType.deposits": "Indskud", - "portfolio.activity.filters.transactionType.staking": "Staking", - "portfolio.activity.filters.transactionType.swaps": "Bytter", - "portfolio.activity.title": "Aktivitet", - "portfolio.connectWallet.summary": "Spor tokens, puljer og mere på tværs af {{amount}}+ netværk", - "portfolio.defi.title": "DeFi", - "portfolio.description": "Spor din kryptoportefølje på tværs af alle kæder og protokoller", - "portfolio.nfts.title": "NFT'er", - "portfolio.overview.title": "Oversigt", - "portfolio.title": "Portefølje", - "portfolio.tokens.table.column.allocation": "Tildeling", - "portfolio.tokens.table.column.balance": "Balance", - "portfolio.tokens.table.column.change1d": "1D-ændring", - "portfolio.tokens.table.column.price": "Pris", - "portfolio.tokens.table.column.token": "Polet", - "portfolio.tokens.table.column.value": "Værdi", - "portfolio.tokens.title": "Poletter", - "position.addHook": "Tilføj en krog", - "position.addHook.tooltip": "Hooks er en avanceret funktion, der gør det muligt for pools at interagere med smarte kontrakter, der låser op for forskellige muligheder. Vær forsigtig, når du tilføjer kroge, da nogle kan være ondsindede eller forårsage utilsigtede konsekvenser.", - "position.addingHook": "Tilføjer krog", - "position.addingHook.disclaimer": "Tilføjelse af kroge kan have utilsigtede konsekvenser. Lav din research og fortsæt på eget ansvar.", - "position.addingHook.hideProperties": "Skjul egenskaber", - "position.addingHook.invalidAddress": "Indtast en gyldig hook-adresse", - "position.addingHook.viewProperties": "Se ejendomme", - "position.create.confirm": "Bekræft position", - "position.create.invalidPrice": "Ugyldig pris", - "position.create.invalidRange": "Ugyldigt interval", - "position.create.modal.header": "Oprettelse af position", - "position.create.unsupportedSolana": "Solana-pools understøttes ikke.", - "position.create.unsupportedSolana.description": "For at oprette en pulje skal du skifte til en understøttet EVM-kæde.", - "position.create.unsupportedToken.description": "Prøv at oprette med en anden protokolversion.", - "position.create.v2unsupportedChain": "Denne kæde understøttes ikke for v2-puljer.", - "position.currentValue": "Nuværende positionsværdi", - "position.default_price_strategies": "Prisstrategier", - "position.default_price_strategies.error": "Prisstrategien kunne ikke fastsættes", - "position.deposit.confirm.create.description.less": "Den indtastede startpris er {{value}}% mindre end markedsprisen og kan resultere i tab af midler. Ønsker du at fortsætte?", - "position.deposit.confirm.create.description.more": "Den indtastede startpris er {{value}}% mere end markedsprisen og kan resultere i tab af midler. Ønsker du at fortsætte?", - "position.deposit.confirm.create.title": "Stor prisforskel med markedet", - "position.deposit.description": "Angiv tokenbeløbene for dit likviditetsbidrag.", - "position.depositedCurrency": "Deponeret {{currencySymbol}}", - "position.fot.warning": "{{token}} og andre \"Gebyr ved overførsel\"-tokens understøttes kun af Uniswap v2.", - "position.fot.warning.cta": "Opret en v2-position", - "position.hook.disclaimer": "Jeg forstår de potentielle risici, der er forbundet med at tilføje denne krog.", - "position.hook.donateWarning": "Dette flag kan resultere i ændringer i optjente gebyrer.", - "position.hook.liquidityWarning": "Dette flag kan få puljen til at blokere for tilføjelsen af ny likviditet. Din transaktion kan vende tilbage.", - "position.hook.removeWarning": "Kan få dine penge til at blive låst eller blokere dig for at opkræve gebyrer.", - "position.hook.swapWarning": "Dette flag kan give likviditetsudbydere mulighed for lettere at udnytte Just-In-Time-likviditet, hvilket kan resultere i lavere optjente gebyrer.", - "position.hook.warningHeader": "Vigtigt: krogrisici identificeret", - "position.hook.warningInfo": "Vi har identificeret potentielle risici med denne krog. Sørg for, at du forstår, hvordan denne krog fungerer, før du beslutter dig for at fortsætte.", - "position.increase.fot": "Tilføjelse af likviditet for {{token}} og andre \"Gebyr ved overførsel\"-tokens understøttes ikke.", - "position.initialPrice": "Startpris", - "position.initialPrice.difference.negative": "{{ value }}% mindre end markedsprisen", - "position.initialPrice.difference.positive": "{{ value }}% mere end markedsprisen", - "position.initialPrice.info": "Når du opretter en ny pulje, skal du indstille startkursen for begge tokens. Denne sats vil afspejle den oprindelige markedspris.", - "position.initialPrice.set": "Indstil startpris", - "position.initialPrice.useMarketPrice": "Brug markedspris", - "position.migrate.liquidity": "Når du migrerer positioner, kan du ikke ændre dit token-par, men du kan tilføje en hook for at forbedre funktionaliteten.", - "position.migrate.v4unsupportedChain": "Denne kæde er ikke understøttet for v4-puljer.", - "position.new": "Ny stilling", - "position.new.protocol": "Ny {{protocol}} stilling", - "position.notFound": "Position ikke fundet", - "position.notFound.description": "Detaljer om denne stilling er ikke tilgængelige. Tjek venligst, at du er forbundet med den korrekte tegnebog.", - "position.one_sided_lower": "Ensidig nedre", - "position.one_sided_lower.description": "Tilfør likviditet, hvis prisen falder", - "position.one_sided_upper": "Ensidig overdel", - "position.one_sided_upper.description": "Tilfør likviditet, hvis prisen stiger", - "position.protocol": "{{protocol}} position", - "position.provide.liquidity": "Vælg de tokens, du vil give likviditet til. Du kan vælge tokens på alle understøttede netværk.", - "position.provide.liquidityDescription": "Tilvejebringelse af likviditet i hele rækken sikrer kontinuerlig markedsdeltagelse på tværs af alle mulige priser, hvilket tilbyder enkelhed, men med potentiale for højere permanente tab.", - "position.provide.liquidityDescription.creatingPool": "Indstilling af likviditet i hele rækken, når der oprettes en pulje, sikrer kontinuerlig markedsdeltagelse på tværs af alle mulige priser, hvilket tilbyder enkelhed, men med potentiale for højere permanente tab.", - "position.provide.liquidityDescription.custom": "Brugerdefineret sortiment giver dig mulighed for at koncentrere din likviditet inden for specifikke prisgrænser, hvilket øger kapitaleffektiviteten og gebyrindtjeningen, men kræver mere aktiv styring.", - "position.provide.outOfRange.closePosition": "Luk position", - "position.provide.outOfRange.description": "Denne positions rækkevidde kan ikke justeres under migrering. For at indstille et nyt område skal du lukke denne position og åbne en ny v4-position.", - "position.provide.outOfRange.title": "Du migrerer en position uden for rækkevidde", - "position.removeHook": "Fjern krogen", - "position.resetDescription": "Dine tokens, pris og områdevalg nulstilles.", - "position.setRange": "Sæt prisinterval", - "position.setRange.inputsBelow": "Brug nedenstående input til at indstille dit område.", - "position.stable": "Stabil", - "position.stable.description": "God til stablecoins eller par med lav volatilitet", - "position.step.deposit": "Indtast indbetalingsbeløb", - "position.step.price": "Indstil startpris og indbetalingsbeløb", - "position.step.range": "Indstil prisinterval og indbetalingsbeløb", - "position.step.select": "Vælg tokenpar og gebyrer", - "position.value": "Positionsværdi", - "position.valueUnavailable": "USD-værdi er i øjeblikket ikke tilgængelig for denne stilling. Se positionsdetaljer for indsatte tokenbeløb.", - "position.wide": "Bred", - "position.wide.description": "God til volatile par", - "position.wrapped.unwrap": "Pak {{wrappedToken}}ud", - "position.wrapped.warning": "{{nativeToken}} påkrævet for v4-puljer", - "position.wrapped.warning.info": "Pak din {{wrappedToken}} ud og indbetal {{nativeToken}} for at give mere omkostningseffektiv og effektiv likviditet.", - "positions.noPositions.description": "Du har ingen likviditetspositioner. Opret en ny position for at begynde at optjene gebyrer og belønninger på berettigede puljer.", - "positions.noPositions.title": "Ingen positioner", - "positions.welcome.connect.description": "For at se dine positioner og belønninger skal du forbinde din wallet.", - "positions.welcome.connect.wallet": "Tilslut din tegnebog", - "privacy.anonymizedLogs": "Appen logger anonymiseret brugsstatistik for at forbedre sig over tid.", - "privacy.autoRouter": "Appen henter den optimale handelsrute fra en Uniswap Labs-server.", - "privacy.infura": "Appen henter on-chain data og konstruerer kontraktopkald med en Infura API.", - "privacy.thirdPartyApis": "Denne app bruger følgende tredjeparts API'er:", - "privacy.trm": "Appen indsamler sikkert din tegnebogsadresse og deler den med TRM Labs Inc. af risiko- og overholdelsesårsager.", - "privacy.uniswaptos": "Uniswap Labs' servicevilkår", - "privateKeys.export.modal.speedbump.bullet1": "Se dette privat", - "privateKeys.export.modal.speedbump.bullet2": "Del ikke med nogen", - "privateKeys.export.modal.speedbump.bullet3": "Indtast det aldrig på nogen hjemmesider eller applikationer", - "privateKeys.export.modal.speedbump.subtitle": "Enhver, der kender din private nøgle, kan få adgang til din tegnebog og dine penge.", - "privateKeys.export.modal.speedbump.title": "Før du fortsætter", - "privateKeys.export.modal.subtitle": "Det ser ud til, at du ikke kan gendanne din tegnebog helt. For at sikre, at du aldrig mister adgang til dine penge, skal du kopiere din private nøgle.", - "privateKeys.export.modal.title": "Eksportér din private nøgle", - "privateKeys.export.modal.warning": "Hvis du mister din telefon eller sletter appen, skal du importere denne nøgle til en anden tegnebog.", - "privateKeys.view.button.continue": "Jeg kopierede dem alle.", - "privateKeys.view.button.continue.single": "Jeg kopierede det.", - "privateKeys.view.subtitle": "Din private nøgle giver adgang til en bestemt tegnebog. Hver tegnebog har en forskellig privat nøgle.", - "privateKeys.view.title": "Privat nøgle", - "qrScanner.button.connections_one": "1 app tilsluttet", - "qrScanner.button.connections_other": "{{count}} apps tilsluttet", - "qrScanner.error.camera.message": "For at scanne en kode skal du tillade kameraadgang i systemindstillingerne", - "qrScanner.error.camera.title": "Kameraet er deaktiveret", - "qrScanner.error.none": "Ingen QR-kode fundet", - "qrScanner.recipient.action.scan": "Scan en QR-kode", - "qrScanner.recipient.action.show": "Vis min QR-kode", - "qrScanner.recipient.error.message": "Sørg for, at du scanner en gyldig Ethereum-adresse QR-kode, før du prøver igen.", - "qrScanner.recipient.error.title": "Ugyldig QR-kode", - "qrScanner.request.message.unavailable": "Ingen besked fundet.", - "qrScanner.request.method.default": "Anmodning fra {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "Underskriftsanmodning fra {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "Transaktionsanmodning fra {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "Tillad {{dappName}} at bruge op til {{amount}} {{currencySymbol}}?", - "qrScanner.request.withoutAmount": "Tillad {{dappName}} at bruge din {{currencySymbol}}?", - "qrScanner.status.connecting": "Tilslutning...", - "qrScanner.status.loading": "Indlæser...", - "qrScanner.title": "Scan en QR-kode", - "qrScanner.wallet.networks": "Understøttede netværk", - "range.outOfView": "Rækkevidde ude af syne", - "removeLiquidity.pooled": "Sammenlagt {{symbol}}:", - "revoke.failed.message": "Et netværks- eller forbindelsesproblem forårsagede sandsynligvis, at din tilbagekaldelse mislykkedes. Tjek din forbindelse, og prøv igen.", - "routing.aggregateLiquidity": "Når det er tilgængeligt, samler likviditetskilder til bedre priser og gasfri swaps.", - "routing.aggregateLiquidity.uniswapx": "UniswapX samler likviditetskilder på og uden for kæden, hvilket giver dig de bedste tilgængelige priser og gasfri swaps.", - "routing.cheapest": "Uniswap-klienten vælger den billigste handelsoption med hensyn til pris og netværksomkostninger.", - "routing.cheapest.v4": "Uniswap-klienten vælger den optimale handelsmulighed med hensyn til pris og netværksomkostninger.", - "scantastic.code.expired": "Udløbet", - "scantastic.code.subtitle": "Indtast denne kode i Uniswap-udvidelsen. Din gendannelsessætning bliver sikkert krypteret og overført.", - "scantastic.code.timeRemaining.shorthand.hours": "Ny kode i {{hours}}h {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.minutes": "Ny kode i {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.seconds": "Ny kode i {{seconds}}s", - "scantastic.code.title": "Uniswap engangskode", - "scantastic.confirmation.button.continue": "Ja, fortsæt", - "scantastic.confirmation.label.browser": "Browser", - "scantastic.confirmation.label.device": "Enhed", - "scantastic.confirmation.subtitle": "Fortsæt kun, hvis du scanner en QR-kode fra Uniswap Extension på en betroet enhed.", - "scantastic.confirmation.title": "Forsøger du at importere din tegnebog?", - "scantastic.confirmation.warning": "Pas på websteder og apps, der efterligner Uniswap. Ellers kan din tegnebog blive kompromitteret.", - "scantastic.error.encryption": "Kunne ikke forberede frøsætning.", - "scantastic.error.noCode": "Ingen OTP modtaget. Prøv igen.", - "scantastic.error.timeout.message": "Scan QR-koden på Uniswap-udvidelsen igen for at fortsætte med at synkronisere din tegnebog.", - "scantastic.error.timeout.title": "Din forbindelse fik timeout", - "scantastic.modal.ipMismatch.description": "For at scanne denne QR-kode skal din telefon være forbundet til det samme WiFi-netværk som din computer, og eventuelle VPN'er skal være midlertidigt slukket.", - "scantastic.modal.ipMismatch.title": "Skift dit WiFi-netværk", - "search.input.placeholder": "Søg poletter og puljer", - "search.ukDisclaimer": "Ansvarsfraskrivelse for indbyggere i Storbritannien", - "send.button.review": "Gennemgå overførsel", - "send.gas.error.title": "N/A", - "send.gas.networkCost.title": "Netværksomkostninger", - "send.input.token.balance.title": "Saldo: {{balance}} {{symbol}}", - "send.recipient.header": "Vælg modtager", - "send.recipient.input.placeholder": "Søg på ENS eller adresse", - "send.recipient.previous_one": "1 tidligere overførsel", - "send.recipient.previous_other": "{{count}} tidligere overførsler", - "send.recipient.results.empty": "Ingen resultater fundet", - "send.recipient.results.error": "Den adresse, du indtastede, findes enten ikke eller er stavet forkert.", - "send.recipient.section.favorite": "Yndlingspunge", - "send.recipient.section.recent": "Nylig", - "send.recipient.section.search": "Søgeresultater", - "send.recipient.section.viewOnly": "View-only tegnebøger", - "send.recipient.section.yours": "Dine tegnebøger", - "send.recipient.warning.viewOnly.message": "Send kun penge til denne tegnebog, hvis du har gendannelsessætningen eller kender ejeren af tegnebogen.", - "send.recipient.warning.viewOnly.title": "Du har denne som en tegnebog, der kun kan ses", - "send.recipientSelect.search.empty.message": "Når du sender tokens til en wallet-adresse, vises de her", - "send.recipientSelect.search.empty.title": "Ingen tegnebøger gemt", - "send.review.modal.title": "Du sender", - "send.review.summary.button.title": "Bekræft afsendelse", - "send.search.empty.subtitle": "Den adresse, du indtastede, findes enten ikke eller er stavet forkert.", - "send.search.empty.title": "Ingen resultater fundet", - "send.search.placeholder": "Søg på ENS eller adresse", - "send.solanaSendNotSupported": "Send understøttes ikke på Solana", - "send.title": "Sende", - "send.unavailableOnSolana.message": "Afsendelse er ikke tilgængelig på Solana-tegnebøger", - "send.warning.blocked.default": "Denne pung er blokeret", - "send.warning.blocked.modal.message": "Denne adresse er blokeret på Uniswap Wallet, fordi den er knyttet til en eller flere blokerede aktiviteter. Hvis du mener, at dette er en fejl, bedes du sende en e-mail til compliance@uniswap.org.", - "send.warning.blocked.modal.title": "Blokeret adresse", - "send.warning.blocked.recipient": "Modtagerens tegnebog er blokeret", - "send.warning.erc20.checkbox.description": "Du forsøger at sende penge til en token-adresse. Dette kan resultere i et permanent tab af midler.", - "send.warning.erc20.checkbox.heading": "Tokenadresse blev fundet", - "send.warning.erc20.message": "Du forsøger at sende penge til en token-adresse. At sende krypto til denne type adresse kan resultere i et permanent tab af midler.", - "send.warning.erc20.title": "Dette er en symbolsk adresse", - "send.warning.insufficientFunds.message": "Din {{currencySymbol}} saldo er faldet, siden du indtastede det beløb, du gerne vil sende", - "send.warning.insufficientFunds.title": "Ikke nok {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "Ikke nok {{currencySymbol}} på {{networkName}} til at sende", - "send.warning.insufficientGas.message.withoutNetwork": "Ikke nok {{currencySymbol}} til at sende", - "send.warning.modal.button.cta.blocking": "Okay", - "send.warning.modal.button.cta.cancel": "Afbestille", - "send.warning.modal.button.cta.confirm": "Bekræfte", - "send.warning.newAddress.details.ENS": "ENS", - "send.warning.newAddress.details.username": "Brugernavn", - "send.warning.newAddress.details.walletAddress": "Tegnebogsadresse", - "send.warning.newAddress.message": "Du har ikke handlet med denne adresse før. Bekræft venligst, at adressen er korrekt, før du fortsætter.", - "send.warning.newAddress.title": "Ny adresse", - "send.warning.self.message": "Du forsøger at sende penge til din nuværende tegnebog. At sende krypto til denne adresse vil medføre unødvendige netværksomkostninger.", - "send.warning.self.title": "Dette er din nuværende tegnebog", - "send.warning.smartContract.message": "Du er ved at sende penge til en smart kontraktadresse. Sørg for, at dette er den korrekte adresse, og at den kan modtage tokens. Hvis ikke, kan dette resultere i et permanent tab af midler.", - "send.warning.smartContract.title": "Dette er en smart kontraktadresse", - "send.warning.viewOnly.message": "Du skal importere denne tegnebog via gendannelsessætning for at sende aktiver.", - "send.warning.viewOnly.title": "Denne pung er kun til visning", - "send.youAreSending": "Du sender", - "sendRecipientForm.recentAddresses.label": "Seneste", - "sendReviewModal.title": "Send anmeldelse", - "setting.recoveryPhrase.account.show": "Vis gendannelsessætning", - "setting.recoveryPhrase.action.hide": "Skjul gendannelsessætning", - "setting.recoveryPhrase.remove": "Fjern gendannelsessætning", - "setting.recoveryPhrase.remove.confirm.subtitle": "Jeg forstår, at Uniswap Labs ikke kan hjælpe mig med at gendanne min tegnebog, hvis jeg undlod at gøre det.", - "setting.recoveryPhrase.remove.confirm.title": "Jeg gemte min gendannelsessætning", - "setting.recoveryPhrase.remove.initial.subtitle": "Sørg for, at du har gemt din gendannelsessætning. Ellers mister du adgangen til dine tegnebøger", - "setting.recoveryPhrase.remove.initial.title": "Før du fortsætter", - "setting.recoveryPhrase.remove.subtitle": "Indtast din adgangskode for at bekræfte", - "setting.recoveryPhrase.remove.title": "Du fjerner din gendannelsessætning", - "setting.recoveryPhrase.view.warning.message1": "Enhver, der kender din gendannelsessætning, kan få adgang til din tegnebog og penge", - "setting.recoveryPhrase.view.warning.message2": "Se dette privat", - "setting.recoveryPhrase.view.warning.message3": "Del ikke med nogen", - "setting.recoveryPhrase.view.warning.message4": "Indtast det aldrig på nogen hjemmesider eller applikationer", - "setting.recoveryPhrase.view.warning.title": "Før du fortsætter", - "setting.recoveryPhrase.warning.view.message": "Enhver, der kender din gendannelsessætning, kan få adgang til din tegnebog og penge.", - "setting.recoveryPhrase.warning.view.title": "Se dette på et privat sted", - "settings.action.enableInSettings": "Aktiver i Indstillinger", - "settings.action.feedback": "Send feedback", - "settings.action.help": "Få hjælp", - "settings.action.lock": "Lås pung", - "settings.action.privacy": "Fortrolighedspolitik", - "settings.action.terms": "Servicevilkår", - "settings.connectWalletPlatform.warning": "For at bruge Uniswap på {{platform}}skal du oprette forbindelse til en tegnebog, der understøtter {{platform}}.", - "settings.footer": "Lavet med kærlighed, \nUniswap Team 🦄", - "settings.hideSmallBalances": "Skjul små saldi", - "settings.hideSmallBalances.subtitle": "Saldi under 1 USD vil blive skjult fra din portefølje.", - "settings.maxSlippage": "Maks. glidning", - "settings.maxSlippage.amount": "{{amount}} maks. glidning", - "settings.section.about": "Om", - "settings.section.preferences": "Præferencer", - "settings.section.privacyAndSecurity": "Privatliv og sikkerhed", - "settings.section.support": "Støtte", - "settings.section.wallet.hidden.row.title": "{{numHidden}} andre tegnebøger", - "settings.setting.advanced.title": "Fremskreden", - "settings.setting.advancedSettings": "Advanced settings", - "settings.setting.appearance.option.auto": "Auto", - "settings.setting.appearance.option.dark.subtitle": "Brug altid mørkt tema.", - "settings.setting.appearance.option.dark.title": "Mørk", - "settings.setting.appearance.option.device.subtitle": "Tilpasser sig din enheds indstillinger.", - "settings.setting.appearance.option.device.title": "Auto", - "settings.setting.appearance.option.light.subtitle": "Brug altid let tema.", - "settings.setting.appearance.option.light.title": "Lys", - "settings.setting.appearance.title": "Tema", - "settings.setting.backup.create.description": "Indstilling af en adgangskode vil kryptere din sikkerhedskopi af gendannelsessætninger, hvilket tilføjer et ekstra niveau af beskyttelse, hvis din {{cloudProviderName}} -konto nogensinde bliver kompromitteret.", - "settings.setting.backup.create.title": "Sikkerhedskopier til {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "Fordi disse tegnebøger deler en gendannelsessætning, vil den også slette sikkerhedskopierne for disse tegnebøger nedenfor", - "settings.setting.backup.delete.confirm.title": "Er du sikker?", - "settings.setting.backup.delete.warning": "Hvis du sletter din {{cloudProviderName}} backup, vil du kun være i stand til at gendanne din tegnebog med en manuel backup af din gendannelsessætning. Uniswap Labs kan ikke genvinde dine aktiver, hvis du mister din gendannelsessætning.", - "settings.setting.backup.error.message.full": "Kan ikke sikkerhedskopiere gendannelsessætning til {{cloudProviderName}}. Sørg for, at du har {{cloudProviderName}} aktiveret med tilgængelig lagerplads, og prøv igen.", - "settings.setting.backup.error.message.short": "Kan ikke slette backup", - "settings.setting.backup.error.title": "{{cloudProviderName}} fejl", - "settings.setting.backup.modal.description": "Du har endnu ikke sikkerhedskopieret din gendannelsessætning til {{cloudProviderName}} . Ved at gøre det kan du gendanne din tegnebog blot ved at være logget ind på {{cloudProviderName}} på en hvilken som helst enhed.", - "settings.setting.backup.modal.title": "Sikkerhedskopiere gendannelsessætning til {{cloudProviderName}}?", - "settings.setting.backup.password.error.mismatch": "Kodeordene er ikke ens", - "settings.setting.backup.password.medium": "Dette er en medium adgangskode", - "settings.setting.backup.password.placeholder.confirm": "Bekræft kodeord", - "settings.setting.backup.password.placeholder.create": "Opret adgangskode", - "settings.setting.backup.password.strong": "Dette er en stærk adgangskode", - "settings.setting.backup.password.weak": "Dette er en svag adgangskode", - "settings.setting.backup.recoveryPhrase.label": "Gendannelsessætning", - "settings.setting.backup.selected": "{{cloudProviderName}} backup", - "settings.setting.backup.status.action.delete": "Slet backup", - "settings.setting.backup.status.complete": "Sikkerhedskopieret til {{cloudProviderName}}", - "settings.setting.backup.status.description": "Ved at få din gendannelsessætning sikkerhedskopieret til {{cloudProviderName}}, kan du gendanne din tegnebog blot ved at være logget ind på din {{cloudProviderName}} -konto på en hvilken som helst enhed.", - "settings.setting.backup.status.inProgress": "Sikkerhedskopierer til {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "Sikkerhedskopieret", - "settings.setting.backup.status.title": "{{cloudProviderName}} backup", - "settings.setting.beta.tooltip": "Kommer snart", - "settings.setting.biometrics.appAccess.subtitle.android": "Kræv ansigt/fingeraftryk for at åbne appen.", - "settings.setting.biometrics.appAccess.subtitle.ios": "Kræv {{biometricsMethod}} for at åbne app.", - "settings.setting.biometrics.appAccess.title": "App adgang", - "settings.setting.biometrics.auth": "Godkend venligst", - "settings.setting.biometrics.extension.waitingForBiometricsModal.content": "Aktiver {{biometricsMethod}} i din browser eller systemindstillinger for at fortsætte.", - "settings.setting.biometrics.extension.waitingForBiometricsModal.title": "Venter på {{biometricsMethod}}", - "settings.setting.biometrics.off.message.android": "Biometri er i øjeblikket slået fra for Uniswap Wallet – du kan slå det til i dine systemindstillinger.", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} er i øjeblikket slået fra for Uniswap Wallet – du kan slå det til i dine systemindstillinger.", - "settings.setting.biometrics.off.title.android": "Biometri er slået fra", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} er slået fra", - "settings.setting.biometrics.title": "Lås op med ansigt/fingeraftryk", - "settings.setting.biometrics.transactions.subtitle.android": "Kræv ansigt/fingeraftryk for at handle.", - "settings.setting.biometrics.transactions.subtitle.ios": "Kræv {{biometricsMethod}} for at handle.", - "settings.setting.biometrics.transactions.title": "Transaktioner", - "settings.setting.biometrics.unavailable.message.android": "Biometri er ikke konfigureret på din enhed. For at bruge biometri skal du først konfigurere det i Indstillinger.", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} er ikke konfigureret på din enhed. For at bruge {{biometricsMethod}}skal du først konfigurere det i Indstillinger.", - "settings.setting.biometrics.unavailable.title.android": "Biometri er ikke opsat", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} er ikke konfigureret", - "settings.setting.biometrics.warning.message.android": "Hvis du ikke slår biometri til, kan alle, der får adgang til din enhed, åbne Uniswap Wallet og foretage transaktioner.", - "settings.setting.biometrics.warning.message.ios": "Hvis du ikke slår {{biometricsMethod}}til, kan alle, der får adgang til din enhed, åbne Uniswap Wallet og foretage transaktioner.", - "settings.setting.biometrics.warning.title": "Er du sikker?", - "settings.setting.connections.disconnectAll": "Afbryd alle", - "settings.setting.connections.noConnectionsDescription": "Opret forbindelse til en app ved at lede efter en \"Tilslut tegnebog\" eller \"Log ind\"-knap.", - "settings.setting.currency.title": "Lokal valuta", - "settings.setting.deviceAccess.reset.title": "Nulstil din {{biometricsMethod}}", - "settings.setting.deviceAccess.title": "Enhedsadgang", - "settings.setting.deviceAccessTimeout.1hour": "1 time", - "settings.setting.deviceAccessTimeout.24hours": "24 timer", - "settings.setting.deviceAccessTimeout.30minutes": "30 minutter", - "settings.setting.deviceAccessTimeout.5minutes": "5 minutter", - "settings.setting.deviceAccessTimeout.never": "Aldrig", - "settings.setting.deviceAccessTimeout.title": "Timeout for automatisk låsning", - "settings.setting.hapticTouch.title": "Haptisk berøring", - "settings.setting.helpCenter.title": "Hjælpecenter", - "settings.setting.language.button.navigate": "Gå til indstillinger", - "settings.setting.language.description.extension": "Uniswap standarder til dine systemsprogindstillinger. For at ændre dit foretrukne sprog, gå til dine systemindstillinger.", - "settings.setting.language.description.mobile": "Uniswap er standard til din enheds sprogindstillinger. For at ændre dit foretrukne sprog skal du gå til \"Uniswap\" i dine enhedsindstillinger og trykke på \"Sprog\".", - "settings.setting.language.title": "Sprog", - "settings.setting.notifications.row.activity.description": "Overførsler, anmodninger og anden aktivitet", - "settings.setting.notifications.row.activity.title": "Tegnebogsaktivitet", - "settings.setting.notifications.row.updates.description": "Anbefalinger og nye funktioner", - "settings.setting.notifications.row.updates.title": "Opdateringer fra Uniswap", - "settings.setting.notifications.title": "Meddelelser", - "settings.setting.password.change.title": "Opret en ny adgangskode", - "settings.setting.password.title": "Skift kodeord", - "settings.setting.permissions.title": "Tilladelser", - "settings.setting.privacy.analytics.description": "Vi bruger anonyme brugsdata til at forbedre din oplevelse på tværs af Uniswap Labs-produkter. Når deaktiveret, sporer vi kun fejl og væsentlig brug.", - "settings.setting.privacy.analytics.title": "App-analyse", - "settings.setting.privateKeys.title": "Private nøgler", - "settings.setting.recoveryPhrase.title": "Gendannelsessætning", - "settings.setting.smallBalances.title": "Porteføljebalance", - "settings.setting.smartWallet.action.enable": "Aktiver", - "settings.setting.smartWallet.action.smartWallet": "Smart wallet", - "settings.setting.smartWallet.notEligible": "Ikke berettiget", - "settings.setting.smartWallet.status.actionRequired": "Handling påkrævet", - "settings.setting.smartWallet.status.active": "Aktiv", - "settings.setting.smartWallet.status.inactive": "Inaktiv", - "settings.setting.smartWallet.status.unavailable": "Ikke tilgængelig", - "settings.setting.unknownTokens.subtitle": "Potentielle fidus-tokens vil blive skjult fra din portefølje.", - "settings.setting.unknownTokens.title": "Skjul ukendte tokens", - "settings.setting.wallet.action.editLabel": "Rediger etiket", - "settings.setting.wallet.action.editProfile": "Rediger profil", - "settings.setting.wallet.action.remove": "Fjern tegnebogen", - "settings.setting.wallet.connection.banner.description": "Administrer forbindelser via tegnebogsindstillinger ved at klikke på dit profilbillede.", - "settings.setting.wallet.connection.banner.title": "Forbindelserne er flyttet", - "settings.setting.wallet.connections.title": "Forbindelser", - "settings.setting.wallet.editLabel.description": "Etiketter er ikke offentlige. De opbevares lokalt og er kun synlige for dig.", - "settings.setting.wallet.editLabel.save": "Gem ændringer", - "settings.setting.wallet.label": "Kaldenavn", - "settings.setting.wallet.testnetMode.description": "Dette aktiverer testnet, så udviklere kan prøve funktioner og transaktioner uden at bruge rigtige aktiver. Tokens på testnet har ikke nogen reel værdi.", - "settings.setting.wallet.testnetMode.title": "Testnet-tilstand", - "settings.switchNetwork.warning": "For at bruge Uniswap på {{label}}skal du skifte netværk i din tegnebogs indstillinger.", - "settings.title": "Indstillinger", - "settings.version": "Version {{appVersion}}", - "smartWallet.actionRequired.cta": "Deaktiver på 1 netværk", - "smartWallet.actionRequired.cta.plural": "Deaktiver på {{amount}} netværk", - "smartWallet.actionRequired.description": "Deaktivering af smart wallet er en onchain-handling, der kræver en lille netværksomkostning.", - "smartWallet.actionRequired.insufficientFunds": "Ikke nok penge", - "smartWallet.actionRequired.reactivate": "Fortsæt med at bruge den smarte tegnebog", - "smartWallet.actionRequired.title": "Smart wallet er aktiv på 1 netværk", - "smartWallet.actionRequired.title.plural": "Smart wallet er aktiv på {{amount}} netværk", - "smartWallet.activeNetworks.title": "Smart wallet er aktiv på 1 netværk", - "smartWallet.activeNetworks.title.plural": "Smart wallet er aktiv på {{amount}} netværk", - "smartWallet.banner.networkCost": "Includes a one-time cost to activate your smart wallet on {{chainName}}.", - "smartWallet.banner.text": "Aktiver smart wallet for at spare op til 50 % på netværksomkostninger.", - "smartWallet.confirmDisableSmartWallet.description": "Du går glip af hurtigere bytte, nedsatte netværksomkostninger og andre kommende forbedringer.", - "smartWallet.confirmDisableSmartWallet.title": "Er du sikker?", - "smartWallet.insufficient.description": "Smart wallet kan ikke deaktiveres på disse netværk, før du har midler til at dække netværksomkostningerne.", - "smartWallet.insufficient.title": "Utilstrækkelige midler på 1 netværk", - "smartWallet.insufficient.title.plural": "Utilstrækkelige midler på {{amount}} netværk", - "smartWallet.InsufficientFunds.button.continue.text": "Fortsæt alligevel", - "smartWallet.insufficientFunds.network.banner.description": "Kan ikke deaktiveres på grund af utilstrækkelige midler.", - "smartWallet.insufficientFunds.network.banner.title_one": "{{count}} netværk ekskluderet", - "smartWallet.insufficientFunds.network.banner.title_other": "{{count}} netværk ekskluderet", - "smartWallet.insufficientFunds.network.disable.text": "Klar til at deaktivere", - "smartWallet.insufficientFunds.network.text": "Du har brug for {{nativeCurrency}}", - "smartWallet.insufficientFunds.single.network.banner.title": "{{chain}} udelukket", - "smartWallet.modal.description.block1": "Smarte tegnebøger bruger smarte kontrakter til hurtigere og billigere transaktioner.", - "smartWallet.modal.description.block2": "Tegnebøger, der allerede bruger smarte tegnebogsfunktioner fra en anden app, vil ikke blive påvirket.", - "smartWallet.modal.title": "Smart Wallet", - "smartWallets": "Smarte tegnebøger", - "smartWallets.activeNetworks.description": "Din smarte tegnebog aktiveres automatisk på tværs af hvert nyt netværk, du skifter til.", - "smartWallets.createdModal.description": "You’re getting faster transactions and lower network costs on every swap.", - "smartWallets.createdModal.title": "Smart tegnebog oprettet", - "smartWallets.delegation.limitedSupport": "Din tegnebog har begrænset understøttelse", - "smartWallets.delegationMismatchModal.description": "{{walletName}} understøtter ikke de nyeste Ethereum-standarder, der bruges af {{displayName}}, så nogle funktioner er ikke tilgængelige.", - "smartWallets.delegationMismatchModal.features.1ClickSwaps": "1-kliksbytter", - "smartWallets.delegationMismatchModal.features.gasFreeSwaps": "Gasfri bytter", - "smartWallets.delegationMismatchModal.features.limitOrders": "Limitordrer", - "smartWallets.delegationMismatchModal.limitOrders.unsupported": "Limitordrer understøttes ikke af din wallet.", - "smartWallets.delegationMismatchModal.title": "Begrænset tegnebogsunderstøttelse", - "smartWallets.disable.failed": "Der opstod en fejl. Smart Wallet er stadig aktiv på et eller flere netværk. Prøv igen.", - "smartWallets.disable.modal.description": "Denne onchain-handling kræver en netværksomkostning.", - "smartWallets.disable.modal.title": "Deaktiver smart tegnebog", - "smartWallets.educationalModal.description": "Smarte tegnebøger giver hurtigere og billigere transaktioner ved hjælp af smarte kontrakter.", - "smartWallets.educationalModal.info": "Tegnebøger, der allerede bruger smart wallet-funktioner fra en anden app, vil ikke blive påvirket.", - "smartWallets.enabledModal.description": "Opdateringer træder i kraft ved dit næste bytte.", - "smartWallets.enabledModal.description.dapp": "Opdateringer træder i kraft ved din næste transaktion.", - "smartWallets.enabledModal.description.dapp.line2": "Genopret forbindelse til din tegnebog for at begynde at bruge smarte tegnebogsfunktioner i apps med det samme.", - "smartWallets.enabledModal.title": "Smart wallet aktiveret", - "smartWallets.postSwapNudge.enable": "Aktiver smart wallet", - "smartWallets.postSwapNudge.title": "Spar på dit næste bytte", - "smartWallets.postSwapNudge.title.dapp": "Denne app understøtter smarte tegnebøger", - "smartWallets.unavailableModal.description": "En anden wallet-udbyder administrerer nu smart wallet-indstillinger for {{displayName}}. Du kan fortsætte med at bruge Uniswap som normalt.", - "smartWallets.unavailableModal.title": "Smart wallet-funktioner er ikke tilgængelige", - "solanaPromo.banner.description": "Handl Solana-tokens direkte på Uniswap.", - "solanaPromo.banner.title": "Solana er nu tilgængelig", - "solanaPromo.modal.connectWallet": "Tilslut din foretrukne Solana-pung", - "solanaPromo.modal.startSwapping.button": "Begynd at bytte på Solana", - "solanaPromo.modal.swapInstantly": "Byt tusindvis af trending tokens med det samme", - "solanaPromo.modal.viewTokenData": "Se tokendata og priser ét sted", - "speedBump.newAddress.warning.description": "Du har ikke handlet med denne adresse før. Sørg for, at det er den rigtige adresse, før du fortsætter.", - "speedBump.newAddress.warning.title": "Ny adresse", - "speedBump.smartContractAddress.warning.description": "Du er ved at sende tokens til en særlig type adresse - en smart kontrakt. Dobbelttjek, at det er den adresse, du havde til hensigt at sende til. Hvis det er forkert, kan dine tokens gå tabt for altid.", - "speedBump.smartContractAddress.warning.title": "Er dette en tegnebogsadresse?", - "stats.24fees": "24H gebyrer", - "stats.24swapVolume": "24-timers swapvolumen", - "stats.24volume": "24H volumen", - "stats.allTimeSwappers": "Alle tiders byttere", - "stats.allTimeVolume": "Hele tidens volumen", - "stats.fdv": "FDV", - "stats.fdv.description": "Fuldt fortyndet værdiansættelse (FDV) beregner den samlede markedsværdi, forudsat at alle tokens er i omløb.", - "stats.marketCap": "Markedsværdi", - "stats.marketCap.description": "Markedsværdi er den samlede markedsværdi af et aktivs cirkulerende forsyning.", - "stats.noStatsAvailable": "Ingen statistikker tilgængelige", - "stats.tvl": "Samlet værdi låst", - "stats.tvl.description": "Total value locked (TVL) er den samlede mængde af aktivet, der er tilgængeligt på tværs af alle Uniswap-likviditetspuljer.", - "stats.volume.1d": "1 dages volumen", - "stats.volume.1d.description": "1 dags volumen er mængden af aktivet, der er blevet handlet på Uniswap i løbet af de seneste 24 timer.", - "stats.volume.1d.long": "1D volumen", - "stats.volume.1d.short": "1D vol", - "stats.volume.description": "Volumen er mængden af aktivet, der er blevet handlet på Uniswap i den valgte tidsramme.", - "swap.allow.oneTime": "Tillad {{sym}} (én gang)", - "swap.approveAndSubmit": "Godkend og indsend", - "swap.approveAndSwap": "Godkend og skift", - "swap.balance.amount": "Saldo: {{amount}}", - "swap.bestPrice.through": "Rute via {{provider}}", - "swap.bestRoute.cost": "Den mest effektive rute anslås at koste ~{{gasPrice}} i netværksomkostninger. ", - "swap.bridging.title": "Udveksling på tværs af netværk", - "swap.bridging.warning.description": "Du skifter fra {{fromNetwork}} til {{toNetwork}}. Dette er også kendt som \"bridging\", som flytter dine tokens fra et netværk til et andet.", - "swap.button.confirmSignAndSwap": "Bekræft underskrift og ombytning", - "swap.button.confirmSwapAnyways": "Bekræft bytte alligevel", - "swap.button.confirmUnwrap": "Bekræft udpakning", - "swap.button.max": "Maks", - "swap.button.review": "Anmeldelse", - "swap.button.submitting": "Indsender bytte...", - "swap.button.submitting.keep.open": "Hold din tegnebog åben...", - "swap.button.submitting.passkey": "Bekræft med adgangskode", - "swap.button.swap": "Bytte rundt", - "swap.button.swapAnyways": "Byt alligevel", - "swap.button.unwrap": "Pak ud", - "swap.button.wrap": "Indpakning", - "swap.buy.countryModal.placeholder": "Søg efter land eller region", - "swap.cancel.cannotExecute_one": "Dit bytte kan udføres, før annulleringen er behandlet. Dine netværksomkostninger kan ikke refunderes. Ønsker du at fortsætte?", - "swap.cancel.cannotExecute_other": "Dine swaps kan udføres, før annulleringen er behandlet. Dine netværksomkostninger kan ikke refunderes. Ønsker du at fortsætte?", - "swap.confirmApproveAndSwap": "Bekræft godkendelse og byt", - "swap.confirmLimit": "Bekræft grænse", - "swap.confirmSwap": "Bekræft bytte", - "swap.confirmWrap": "Bekræft ombrydning", - "swap.deadline.settings.title": "Bytte frist", - "swap.deadline.settings.title.short": "Tx. deadline", - "swap.details.completed": "Bytte fuldført", - "swap.details.estimatedTime": "Anslået tid", - "swap.details.fasterUnichainSwaps": "Hurtigere swaps drevet af Unichain", - "swap.details.feeOnTransfer": "{{tokenSymbol}} gebyr", - "swap.details.feeOnTransfer.symbol": "{{tokenSymbol}} tokengebyr", - "swap.details.instant": "Øjeblikkelig", - "swap.details.newQuote.input": "Nyt input", - "swap.details.newQuote.output": "Nyt output", - "swap.details.orderRouting": "Ordredirigering", - "swap.details.orderRoutingInfo": "Denne swap rutes via Across, en decentral protokol, der flytter aktiver på tværs af netværk, mens sikkerhed, hurtig eksekvering og lave priser prioriteres.", - "swap.details.poweredBy": "Drevet af", - "swap.details.rate": "Sats", - "swap.details.slippage": "Max glidning", - "swap.details.slippage.uniswap": "Uniswap Beskyttet slippage", - "swap.details.swappedIn.unichain": "Færdiggjort på {{time}}s på Unichain", - "swap.details.uniswapFee": "Betaling", - "swap.error.default": "Det kan være nødvendigt at øge din glidningstolerance. Bemærk: gebyr-ved-overførsel og rebase-tokens er inkompatible med Uniswap V3.", - "swap.error.expectedToFail": "Din swap forventes at mislykkes.", - "swap.error.fiatInputUnavailable": "{{fiatCurrencyCode}} input ikke tilgængelig", - "swap.error.modifiedByWallet": "Din swap blev ændret gennem din tegnebog. Hvis dette var en fejl, bedes du annullere med det samme eller risikere at miste dine penge.", - "swap.error.rejected": "Transaktion afvist", - "swap.error.undefinedObject": "Der opstod en fejl under forsøget på at udføre denne swap. Det kan være nødvendigt at øge din glidningstolerance. Hvis det ikke virker, kan der være en inkompatibilitet med det token, du handler. Bemærk: gebyr-ved-overførsel og rebase-tokens er inkompatible med Uniswap V3.", - "swap.error.unknown": "Ukendt fejl.", - "swap.error.v2.expired": "Denne transaktion kunne ikke sendes, fordi fristen er udløbet. Tjek venligst, at din transaktionsfrist ikke er for lav.", - "swap.error.v2.k": "Uniswap-invarianten x*y=k blev ikke opfyldt af byttet. Dette betyder normalt, at et af de tokens, du bytter, inkorporerer tilpasset adfærd ved overførsel.", - "swap.error.v2.slippage": "Denne transaktion vil ikke lykkes enten på grund af prisbevægelse eller gebyr ved overførsel. Prøv at øge din glidningstolerance", - "swap.error.v2.transferInput": "Inputtokenet kan ikke overføres. Der kan være et problem med inputtokenet.", - "swap.error.v2.transferOutput": "Outputtokenet kan ikke overføres. Der kan være et problem med outputtokenet.", - "swap.error.v3.slippage": "Denne transaktion vil ikke lykkes på grund af prisbevægelser. Prøv at øge din glidningstolerance. Bemærk: gebyr ved overførsel og rebase-tokens er inkompatible med Uniswap V3.", - "swap.error.v3.transferOutput": "Outputtokenet kan ikke overføres. Der kan være et problem med outputtokenet. Bemærk: gebyr ved overførsel og rebase-tokens er inkompatible med Uniswap V3.", - "swap.estimatedDifference.label": "Der vil være stor forskel mellem dine input- og outputværdier på grund af den aktuelle likviditet.", - "swap.expected.price": "Forventet pris", - "swap.fail.batched": "Din forbundne tegnebog understøtter muligvis ikke 1-kliks-swaps. Prøv en standard-swap i stedet.", - "swap.fail.batched.retry": "Prøv standardbytte", - "swap.fail.batched.title": "1-kliksbytte mislykkedes", - "swap.fail.message": "Prøv at justere glidningen til en højere værdi.", - "swap.fail.uniswapX": "Swap kunne ikke gennemføres med UniswapX. Prøv din swap igen for at dirigere den gennem den klassiske Uniswap API.", - "swap.fees.experience": "Dette gebyr pålægges nogle token-par for at sikre den bedste oplevelse med Uniswap. Det betales i output-tokenet og er allerede indregnet i tilbuddet.", - "swap.fees.jupiter.label": "Jupiter-gebyr", - "swap.fees.jupiter.message": "Gebyrer på Solana opkræves af Jupiter API'en. Uniswap Labs modtager ikke disse gebyrer.", - "swap.fees.noFee": "Gebyrer pålægges på udvalgte token-par for at sikre den bedste oplevelse med Uniswap. Der er intet gebyr forbundet med denne swap.", - "swap.finalizingQuote": "Afslutter citat...", - "swap.form.header": "Bytte rundt", - "swap.form.warning.output.fotFees": "På grund af tokengebyret på {{fotCurrencySymbol}}kan swapbeløb kun indtastes ved hjælp af indtastningsfeltet", - "swap.form.warning.output.fotFees.fallback": "På grund af tokengebyrer kan swapbeløb kun indtastes ved hjælp af indtastningsfeltet", - "swap.form.warning.output.solana": "Præcis output understøttes ikke på Solana", - "swap.form.warning.restore": "Gendan din tegnebog for at bytte", - "swap.frontrun.warning": "Din transaktion kan være frontrun og resultere i en ugunstig handel.", - "swap.header.viewOnly": "Kun visning", - "swap.impactOfTrade": "Indvirkningen din handel har på markedsprisen for denne pulje.", - "swap.impactOfTrade.uniswapx": "Forskellen mellem markedspris og udførelsespris, medregnet UniswapX gasbesparelser.", - "swap.impactOfTrade.uniswapx.missing": "Prispåvirkningsberegninger kan være utilgængelige for par med lav likviditet.", - "swap.inputEstimated.atMost": "Input er estimeret. Du vil højst sælge , ellers vil transaktionen vende tilbage.", - "swap.limit": "Begrænse", - "swap.limitFilled": "Grænsen er opfyldt!", - "swap.limitSubmitted": "Indsendt grænse", - "swap.marketPrice.outsideRange.label": "Markedsprisen er uden for dit angivne prisinterval. Kun indskud på et enkelt aktiv.", - "swap.min.price": "Minimumspris", - "swap.networkCost.paidIn": "Netværksomkostninger betales i {{sym}} på {{chainName}} netværket for at handle.", - "swap.orderRouting": "Ordredirigering", - "swap.outputEstimated.atLeast": "Output er estimeret. Du modtager mindst , ellers vil transaktionen vende tilbage.", - "swap.placeOrder": "Angiv bestilling", - "swap.priceImpact": "Prispåvirkning", - "swap.request.title.full": "Skift {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "Byt tokens", - "swap.review": "Anmeldelsesbytte", - "swap.review.summary": "Du bytter", - "swap.reviewLimit": "Gennemgå grænse", - "swap.route.optimizedGasCost": "Denne rute tager hensyn til opdelte ruter, flere hop og netværksomkostninger for hvert trin.", - "swap.routing.jupiter.description": "Jupiter samler likviditet fra flere kilder for at give dig de bedste priser.", - "swap.routing.uniswapAutoRouter.description": "Uniswap Auto Router tager hensyn til optimale ruter og netværksomkostninger for at give dig de bedste priser.", - "swap.settings.deadline.tooltip": "Din transaktion vil vende tilbage, hvis den er afventende i mere end denne periode. (Maksimum: 3 dage).", - "swap.settings.deadline.warning": "Høj deadline", - "swap.settings.oneClickSwap.title": "1-kliksbytter", - "swap.settings.oneClickSwap.tooltip": "Samler standardhandelshandlinger for hurtigere og billigere swaps.", - "swap.settings.protection.description": "Med swap-beskyttelse aktiveret vil dine Ethereum-transaktioner være beskyttet mod sandwich-angreb med reducerede chancer for fiasko.", - "swap.settings.protection.subtitle.supported": "{{chainName}} Netværk", - "swap.settings.protection.subtitle.unavailable": "Ikke tilgængelig på {{chainName}}", - "swap.settings.protection.title": "Swap beskyttelse", - "swap.settings.routingPreference.option.default.description": "Valg af denne mulighed identificerer den mest effektive rute for dit bytte.", - "swap.settings.routingPreference.option.default.description.preV4": "Uniswap-klienten vælger den billigste handelsoption med hensyn til pris og netværksomkostninger.", - "swap.settings.routingPreference.option.default.description.uniswapXUnavailable": "UniswapX er ikke tilgængelig for din wallet", - "swap.settings.routingPreference.option.default.tooltip": "En rute er identificeret under hensyntagen til v2, v3 og visse v4-puljer, idet der tages højde for estimeret prispåvirkning og netværksomkostninger.", - "swap.settings.routingPreference.option.v2.title": "Aktivér v2-puljer", - "swap.settings.routingPreference.option.v3.title": "Aktivér v3-puljer", - "swap.settings.routingPreference.option.v4.hooks.title": "Aktivér v4-hook-puljer", - "swap.settings.routingPreference.option.v4.hooks.tooltip": "V4-hooks ruter swaps gennem et sæt forhåndsgodkendte hooks.", - "swap.settings.routingPreference.option.v4.title": "Aktivér v4-puljer", - "swap.settings.routingPreference.title": "Handelsmuligheder", - "swap.settings.slippage.alert": "Høj glidning", - "swap.settings.slippage.control.auto": "Auto", - "swap.settings.slippage.description": "Din transaktion går tilbage, hvis prisen ændrer sig mere end slipprocenten.", - "swap.settings.slippage.input.message": "Hvis prisen falder yderligere, vil din transaktion vende tilbage. Nedenfor er det minimumsbeløb, du er garanteret at modtage.", - "swap.settings.slippage.input.receive.title": "Modtag i det mindste", - "swap.settings.slippage.output.message": "Hvis prisen falder yderligere, vil din transaktion vende tilbage. Nedenfor er det maksimale beløb, du skal bruge.", - "swap.settings.slippage.output.spend.title": "Brug højst", - "swap.settings.slippage.warning": "Meget høj glidning", - "swap.settings.slippage.warning.description": "Skridning over 20% vil sandsynligvis resultere i en ugunstig handel. Sænk dine indstillinger for at reducere risikoen for at blive frontløbet.", - "swap.settings.slippage.warning.hover": "Dette kan resultere i en ugunstig handel. Prøv at sænke din slip-indstilling.", - "swap.settings.slippage.warning.max": "Indtast en værdi mindre end {{maxSlippageTolerance}}", - "swap.settings.slippage.warning.message": "Skridningen kan være højere end nødvendigt", - "swap.settings.slippage.warning.min": "Indtast en værdi større end 0", - "swap.settings.title": "Skift indstillinger", - "swap.settings.transactionRevertPrice": "Din transaktion vil vende tilbage, hvis prisen ændres ugunstigt med mere end denne procentdel.", - "swap.signAndSwap": "Signer og byt", - "swap.slippage.amt": "{{amt}} glidning", - "swap.slippage.bridging": "Ingen glidning ved udveksling på tværs af netværk", - "swap.slippage.description": "Forskel mellem forventet og udført pris på en swap. Forskelle kan opstå på grund af lav likviditet, markedsvolatilitet eller bots. \n\nUniswap Protection beskytter mod frontrunning bots og MEV.", - "swap.slippage.settings.title": "Indstillinger for glidning", - "swap.slippage.tooltip": "Den maksimale prisbevægelse før din transaktion vil vende tilbage.", - "swap.slippageBelow.warning": "Skridning under {{amt}} kan resultere i en mislykket transaktion", - "swap.submitted": "Bytte indsendt", - "swap.success": "Swap succes!", - "swap.tokenOwnFees": "Nogle tokens tager et gebyr, når de købes eller sælges, som fastsættes af tokenudstederen. Uniswap modtager ingen af disse gebyrer.", - "swap.tradeRoutes": "Handelsruter", - "swap.transaction.deadline": "Transaktionsfrist", - "swap.transaction.revertAfter": "Din transaktion vil vende tilbage, hvis den er afventende i mere end denne periode.", - "swap.warning.enterLargerAmount.title": "Indtast et større beløb", - "swap.warning.expectedFailure.increaseSlippage": "Prøv at øge din glidning.", - "swap.warning.expectedFailure.titleMay": "Dette bytte kan mislykkes", - "swap.warning.insufficientBalance.title": "Du har ikke nok {{currencySymbol}}", - "swap.warning.insufficientGas.button": "Ikke nok {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "Byt til {{ tokenSymbol }} på {{networkName}}", - "swap.warning.insufficientGas.button.buy": "Køb {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "Køb med kort", - "swap.warning.insufficientGas.message.withNetwork": "Ikke nok {{currencySymbol}} på {{networkName}} til at bytte", - "swap.warning.insufficientGas.message.withoutNetwork": "Ikke nok {{currencySymbol}} til at bytte", - "swap.warning.insufficientGas.title": "Du har ikke nok {{currencySymbol}} til at dække netværksomkostningerne", - "swap.warning.networkFee.allow": "Tillad {{ inputTokenSymbol }} (én gang)", - "swap.warning.networkFee.delegation.message": "Dette er omkostningerne ved at behandle din transaktion og aktivere din smarte tegnebog på Unichain. Uniswap Labs modtager ingen andel af disse gebyrer.", - "swap.warning.networkFee.highRelativeToValue": "Netværksomkostningerne overstiger 10 % af din samlede transaktionsværdi. Dette er omkostningerne ved at behandle din transaktion på blockchain. Uniswap modtager ingen andel af disse gebyrer.", - "swap.warning.networkFee.highRelativeToValue.unichain": "Netværksomkostningerne overstiger 10 % af din samlede transaktionsværdi. Dette er omkostningerne ved at behandle din transaktion på blockchain.", - "swap.warning.networkFee.includesDelegation": "Inkluderer aktivering af smart wallet", - "swap.warning.networkFee.message": "Dette er omkostningerne for at behandle din transaktion på blockchain. Uniswap modtager ingen andel af disse gebyrer.", - "swap.warning.networkFee.message.unichain": "Dette er omkostningerne for at behandle din transaktion på blockchain.", - "swap.warning.networkFee.message.uniswapX": "Dette er omkostningerne for at behandle din transaktion på blockchain. Uniswap modtager ingen andel af disse gebyrer. UniswapX samler likviditetskilder til bedre priser og gasfri swaps.", - "swap.warning.networkFee.message.uniswapX.title": "Ingen netværksomkostninger med UniswapX", - "swap.warning.networkFee.message.uniswapX.unichain": "Dette er omkostningerne for at behandle din transaktion på blockchain. UniswapX samler likviditetskilder til bedre priser og gasfri swaps.", - "swap.warning.noQuotesFound.bridging.message": "Der blev ikke fundet nogen overgangstilbud. Prøv at bruge den officielle bro på dette tidspunkt.", - "swap.warning.noQuotesFound.title": "Ingen tilbud fundet", - "swap.warning.noRoutesFound.message": "Der er i øjeblikket ingen tilgængelige ruter for dine valgte tokens. Prøv venligst et andet par, eller tjek igen senere.", - "swap.warning.noRoutesFound.title": "Ingen tilgængelige ruter", - "swap.warning.offline.message": "Du har muligvis mistet internetforbindelsen, eller netværket kan være nede. Tjek venligst din internetforbindelse, og prøv igen.", - "swap.warning.offline.title": "Du er offline", - "swap.warning.priceImpact.message": "På grund af mængden af {{outputCurrencySymbol}} likviditet, der i øjeblikket er tilgængelig, vil du modtage, jo mere {{inputCurrencySymbol}} du prøver at bytte, jo mindre {{outputCurrencySymbol}} vil du modtage.", - "swap.warning.priceImpact.message.veryHigh": "Denne transaktion vil resultere i en {{priceImpactValue}} prispåvirkning på markedsprisen for denne pulje og vil resultere i et tab af midler.", - "swap.warning.priceImpact.title": "Høj prispåvirkning ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "Meget høj prispåvirkning ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "Din transaktion blev ikke indsendt, fordi du lukkede appen.", - "swap.warning.queuedOrder.approvalFailed": "Din transaktion blev ikke indsendt, fordi token-godkendelse mislykkedes.", - "swap.warning.queuedOrder.stale": "Din transaktion blev ikke indsendt, fordi du lukkede appen, eller godkendelsen tog for lang tid.", - "swap.warning.queuedOrder.submissionFailed": "Der opstod et problem med at indsende din transaktion.", - "swap.warning.queuedOrder.title": "Bytte annulleret", - "swap.warning.rateLimit.message": "Prøv venligst igen om et par minutter.", - "swap.warning.rateLimit.title": "Satsgrænsen er overskredet", - "swap.warning.router.message": "Du har muligvis mistet forbindelsen, eller netværket kan være nede. Hvis problemet fortsætter, prøv venligst igen senere.", - "swap.warning.router.title": "Denne handel kan ikke gennemføres lige nu", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} er blokeret", - "swap.warning.tokenBlockedFallback.button": "Token er blokeret", - "swap.warning.uniswapFee.message": "Der opkræves gebyrer for at sikre den bedste oplevelse med Uniswap.", - "swap.warning.uniswapFee.message.default": "Gebyrer pålægges for at sikre den bedste oplevelse med Uniswap. Der er intet gebyr forbundet med denne swap.", - "swap.warning.uniswapFee.message.included": "Gebyrer pålægges for at sikre den bedste oplevelse med Uniswap og er allerede indregnet i dette tilbud.", - "swap.warning.uniswapFee.title": "Byttegebyr", - "swap.warning.viewOnly.message": "Du skal importere denne tegnebog via gendannelsessætning for at bytte tokens.", - "swap.wrap.token": "Indpak {{sym}}", - "tdp.balanceSummary.otherNetworks": "På andre netværk", - "tdp.balanceSummary.otherNetworksBalance": "Balance på andre netværk", - "tdp.balanceSummary.title": "Din balance", - "tdp.button.getToken": "Få {{ tokenSymbol }}", - "tdp.button.getTokenFallback": "Få token", - "tdp.loading.title.default": "tokendata for ", - "tdp.loading.title.withChain": "tokendata for på {{chainName}}", - "tdp.nameNotFound": "Navn blev ikke fundet", - "tdp.noInfoAvailable": "Ingen token-information tilgængelig", - "tdp.noTestnetSupportDescription": "Nogle testnet understøtter ikke bytte, afsendelse eller køb af tokens.", - "tdp.symbolNotFound": "Symbol ikke fundet", - "testnet.modal.swapDeepLink.description.toProdMode": "Denne handling kræver, at testnet-tilstand er deaktiveret. Testnet-tilstand kan genaktiveres når som helst i indstillingerne.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "Denne handling kræver, at testnet-tilstand er aktiveret. Tokens på testnet har ikke nogen reel værdi. Testnet-tilstand kan til enhver tid deaktiveres i indstillingerne.", - "testnet.modal.swapDeepLink.title.toProdMode": "Deaktiver testnet-tilstand", - "testnet.modal.swapDeepLink.title.toTestnetMode": "Aktiver testnet-tilstand", - "testnet.unsupported": "Denne funktionalitet understøttes ikke i testnet-tilstand.", - "themeToggle.theme": "Tema", - "title.buySellTradeEthereum": "Køb, sælg og byt Ethereum og andre top-tokens på Uniswap", - "title.createGovernanceOn": "Opret et nyt styringsforslag på Uniswap", - "title.createGovernanceTo": "Opret et nyt styringsforslag, der skal stemmes om af UNI-indehavere. UNI-tokens repræsenterer stemmeberettigede aktier i Uniswap-styring.", - "title.earnFees": "Tjen gebyrer, når andre bytter på Uniswap ved at tilføje tokens til likviditetspuljer.", - "title.easilyRemove": "Fjern nemt din likviditet fra Uniswap v2 og indbetal i Uniswap v3.", - "title.easilyRemoveV4": "Fjern nemt din likviditet fra Uniswap v2 og v3 for at indbetale til Uniswap v4.", - "title.extension.uninstall": "Udvidelse afinstalleret", - "title.extensionPasskeyLogIn": "Log ind med adgangsnøgle", - "title.managePasskeys": "Uniswap | Administrer dine adgangsnøgler", - "title.migratev2": "Migrer v2-puljelikviditet til Uniswap v3", - "title.migratev3": "Migrer puljelikviditet til Uniswap v4", - "title.placeLimit": "Afgiv limiterede ordrer på Uniswap", - "title.realTime": "Realtidspriser, diagrammer, transaktionsdata og mere.", - "title.removeLiquidityv2": "Fjern puljelikviditet (v2) på Uniswap", - "title.removePoolLiquidity": "Fjern poollikviditet på Uniswap", - "title.removeTokensv2": "Fjern dine tokens fra v2 likviditetspuljer.", - "title.removev3Liquidity": "Fjern dine tokens fra v3 likviditetspuljer.", - "title.sendCrypto": "Send krypto", - "title.sendTokens": "Send tokens på Uniswap", - "title.swappingMadeSimple": "Køb og sælg krypto med det samme på Ethereum, Base, Arbitrum, Polygon, Unichain og flere. DeFi-platformen, som millioner af mennesker har tillid til.", - "title.tradeTokens": "Handl tokens og giv likviditet. Realtidspriser, diagrammer, transaktionsdata og mere.", - "title.uniswapTradeCrypto": "Uniswap | Handl krypto på DeFis førende børs ", - "title.uniToken": "UNI-tokens repræsenterer stemmeberettigede aktier i Uniswap-styring. Du kan selv stemme om hvert forslag eller delegere dine stemmer til en tredjepart.", - "title.voteOnGov": "Afstemning om styringsforslag på Uniswap", - "token.balances.main": "Din balance", - "token.balances.other": "Saldi på andre netværk", - "token.balances.viewOnly": "{{ownerAddress}}'s saldo", - "token.bridge": "{{label}} symbolsk bro", - "token.chart.candlestick.unavailable": "Lysestagediagrammer er ikke tilgængelige for dette token", - "token.chart.tooltip": "Gebyrer: {{amount}}", - "token.details": "Token detaljer", - "token.error.unknown": "Ukendt token", - "token.fee.buy.label": "købe gebyr", - "token.fee.label": "betaling", - "token.fee.sell.label": "salgsgebyr", - "token.links.title": "Links", - "token.links.twitter": "Twitter", - "token.links.website": "Internet side", - "token.notFound.description": "Beklager, vi kan ikke finde nogen oplysninger om dette token. Tjek navn og adresse, og prøv igen.", - "token.notFound.title": "Token blev ikke fundet", - "token.priceExplorer.error.description": "Noget gik galt.", - "token.priceExplorer.error.title": "Prisdiagrammet kunne ikke indlæses", - "token.priceExplorer.timeRangeLabel.all": "Hele tiden", - "token.priceExplorer.timeRangeLabel.day": "1D", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 dag", - "token.priceExplorer.timeRangeLabel.hour": "1H", - "token.priceExplorer.timeRangeLabel.month": "1M", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 måned", - "token.priceExplorer.timeRangeLabel.week": "1W", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 uge", - "token.priceExplorer.timeRangeLabel.year": "1Y", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 år", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} er ikke tilgængelig", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} og {{tokenSymbol1}} er ikke tilgængelige", - "token.safety.fee.detected": "Tokengebyr registreret", - "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs modtager ikke nogen af disse gebyrer.", - "token.safety.warning.alwaysDoYourResearch": "Lav altid din research", - "token.safety.warning.blocked.description.default_one": "Du kan ikke bytte dette token ved hjælp af Uniswap-appen.", - "token.safety.warning.blocked.description.default_other": "Du kan ikke bytte disse tokens ved hjælp af Uniswap-appen.", - "token.safety.warning.copyContractAddress.message": "Dette er en kontraktadresse, der fungerer som en unik identifikator for tokens på blockchain. Enhver krypto, du sender til denne adresse, vil gå tabt.", - "token.safety.warning.copyContractAddress.title": "Send ikke krypto til denne adresse", - "token.safety.warning.dontShowWarningAgain": "Vis mig ikke denne advarsel igen", - "token.safety.warning.dontShowWarningAgainShort": "Vis ikke igen", - "token.safety.warning.doYourOwnResearch": "Lav altid din egen research, før du fortsætter.", - "token.safety.warning.feeDescription": "Oplader en når {{action}}", - "token.safety.warning.flaggedAsMalicious": "Markeret som ondsindet", - "token.safety.warning.flaggedAsSuspicious": "Markeret som mistænkeligt", - "token.safety.warning.fotHigh.title": "Højt gebyr registreret", - "token.safety.warning.fotLow.title": "Gebyr opdaget", - "token.safety.warning.fotVeryHigh.title": "Meget højt gebyr registreret", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} er blevet markeret som usælgelig. At bytte dette token kan resultere i et tab af dine midler.", - "token.safety.warning.honeypot.title": "100 % salgsgebyr registreret", - "token.safety.warning.impersonator": "Efterligner et andet token", - "token.safety.warning.impersonator.title": "Imitator-token fundet", - "token.safety.warning.malicious.general.message": "{{tokenSymbol}} er blevet markeret som ondsindet af Blockaid.", - "token.safety.warning.malicious.impersonator.message": "{{tokenSymbol}} er blevet markeret af Blockaid for at forsøge at kopiere et andet token. Det er muligvis ikke det token, du ønsker at bytte.", - "token.safety.warning.malicious.impersonator.message.short": "{{tokenSymbol}} er muligvis ikke det token, du ønsker at bytte.", - "token.safety.warning.malicious.title": "Ondsindet token fundet", - "token.safety.warning.mayResultInLoss": "At bytte det kan resultere i et tab af midler.", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} handles ikke på førende amerikanske centraliserede børser.", - "token.safety.warning.notListedOnExchanges": "Ikke noteret på førende amerikanske børser", - "token.safety.warning.potentialHoneypot.card.message": "{{tokenSymbol}} er blevet markeret som mistænkelig af Blockaid.", - "token.safety.warning.potentialHoneypot.modal.message": "{{tokenSymbol}} er blevet markeret som en potentiel honeypot af Blockaid. Lav altid din egen research, før du fortsætter.", - "token.safety.warning.potentialHoneypot.title": "Potentiel honningpotte fundet", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} er blevet markeret som usælgelig.", - "token.safety.warning.sellFee100.title": "100 % salgsgebyr registreret", - "token.safety.warning.spam.message": "{{tokenSymbol}} er blevet markeret som spam af Blockaid.", - "token.safety.warning.spam.title": "Spam-token fundet", - "token.safety.warning.spamsUsers": "Spams brugere", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} opkræver et {{buyFeePercent}} gebyr ved køb og {{sellFeePercent}} ved salg.", - "token.safety.warning.tokenChargesFee.buy.message": "{{tokenSymbol}} opkræver et {{feePercent}} gebyr ved køb.", - "token.safety.warning.tokenChargesFee.buy.message.descriptive": "{{tokenSymbol}} opkræver et gebyr på {{feePercent}} ved køb. Bytte kan resultere i tab af penge. Uniswap Labs modtager ingen af disse gebyrer.", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} opkræver et {{feePercent}} gebyr ved salg.", - "token.safety.warning.tokenChargesFee.sell.message.descriptive": "{{tokenSymbol}} opkræver et gebyr på {{feePercent}} ved salg. Bytte kan resultere i tab af penge. Uniswap Labs modtager ingen af disse gebyrer.", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} opkræver et gebyr ved køb eller salg.", - "token.safetyLevel.blocked.message": "Du kan ikke bytte dette token ved at bruge Uniswap Wallet.", - "token.safetyLevel.medium.message.plural": "Disse tokens handles ikke på førende amerikanske centraliserede børser. Lav altid din egen research, før du fortsætter.", - "token.selector.search.error": "Søgeresultaterne kunne ikke indlæses", - "token.stats.fullyDilutedValuation": "Fuldt udvandet værdiansættelse", - "token.stats.marketCap": "Markedsværdi", - "token.stats.priceHighYear": "52W høj", - "token.stats.priceLowYear": "52W lav", - "token.stats.section.about": "Om {{token}}", - "token.stats.title": "Statistik", - "token.stats.translation.original": "Vis originalen", - "token.stats.translation.translate": "Oversæt til {{language}}", - "token.stats.volume": "24 timers volumen", - "token.symbol.input.fallback": "Input token", - "token.symbol.output.fallback": "Output token", - "token.wrap.fail.message": "Swaps på Uniswap-protokollen kan starte og slutte med ETH. Men under byttet pakkes ETH ind i WETH.", - "token.zeroNativeBalance.description.mainnet": "Du bliver nødt til at bytte et token på Ethereum for at få {{ tokenSymbol }}. Bytning kræver ETH for netværksomkostninger.", - "token.zeroNativeBalance.description.otherChains": "Du skal bytte et token på {{ chainName }} for at få {{ tokenSymbol }}. Bytning kræver {{ chainName }} {{ nativeTokenSymbol }} til netværksomkostninger.", - "token.zeroNativeBalance.subtitle": "{{ tokenSymbol }} er ikke tilgængelig for direkte køb.", - "token.zeroNativeBalance.title.mainnet": "Du skal bruge {{ nativeTokenName }}", - "token.zeroNativeBalance.title.otherChains": "Du skal bruge {{ nativeTokenName }} på {{ chainName }}", - "tokens.action.hide": "Skjul token", - "tokens.action.unhide": "Vis token", - "tokens.nfts.action.viewOnExplorer": "Se på {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "NFT-samlingen kunne ikke indlæses", - "tokens.nfts.collection.label.items": "genstande", - "tokens.nfts.collection.label.owners": "Ejere", - "tokens.nfts.collection.label.priceFloor": "Etage", - "tokens.nfts.collection.label.swapVolume": "Bind", - "tokens.nfts.connectEthereumToView": "Tilslut en Ethereum-wallet for at se dine NFT'er", - "tokens.nfts.details.contract.address": "Kontrakt adresse", - "tokens.nfts.details.error.load.title": "Kunne ikke indlæse NFT-detaljer", - "tokens.nfts.details.network": "Netværk", - "tokens.nfts.details.owner": "Ejet af", - "tokens.nfts.details.price": "Nuværende pris", - "tokens.nfts.details.recentPrice": "Sidste salgspris", - "tokens.nfts.details.traits": "Træk", - "tokens.nfts.empty.description": "Ingen NFT'er fundet", - "tokens.nfts.error.unavailable": "Indhold ikke tilgængeligt", - "tokens.nfts.hidden.action.hide": "Skjul NFT", - "tokens.nfts.hidden.action.unhide": "Vis NFT", - "tokens.nfts.link.collection": "Samling hjemmeside", - "tokens.nfts.list.error.load.title": "Kunne ikke indlæse NFT'er", - "tokens.nfts.list.none.button": "Modtag NFT'er", - "tokens.nfts.list.none.description.default": "Overfør NFT'er fra en anden tegnebog for at komme i gang.", - "tokens.nfts.list.none.description.external": "Når denne tegnebog køber eller modtager NFT'er, vises de her.", - "tokens.nfts.list.none.title": "Ingen NFT'er endnu", - "tokens.nfts.notAvailableOnSolana": "NFT'er er ikke tilgængelige på Solana", - "tokens.selector.button.choose": "Vælg token", - "tokens.selector.empty.buy.message": "Køb krypto med et kort eller bank for at sende tokens.", - "tokens.selector.empty.buy.title": "Køb krypto", - "tokens.selector.empty.receive.title": "Modtag tokens", - "tokens.selector.empty.title": "Ingen tokens endnu", - "tokens.selector.error.load": "Kunne ikke indlæse tokens", - "tokens.selector.search.empty": "Ingen resultater fundet for {{searchText}}", - "tokens.selector.search.placeholder": "Søg tokens", - "tokens.selector.section.bridging": "Byt på tværs af netværk", - "tokens.selector.section.favorite": "Favoritter", - "tokens.selector.section.otherNetworksSearchResults": "Tokens fundet på andre netværk", - "tokens.selector.section.otherSearchResults": "Andre tokens på {{network}}", - "tokens.selector.section.recent": "Seneste søgninger", - "tokens.selector.section.search": "Søgeresultater", - "tokens.selector.section.trending": "Tokens med 24H volumen", - "tokens.selector.section.yours": "Dine tokens", - "tokens.table.search.placeholder.pools": "Søg puljer", - "tokens.table.search.placeholder.tokens": "Søg tokens", - "tokens.table.search.placeholder.transactions": "Søg transaktioner", - "toucan.auction.bidConcentration": "Tukankoncentration", - "toucan.auction.bidConcentration.tooltip.description": "Beskrivelse af værktøjstip til Toucan", - "toucan.auction.bidConcentration.tooltip.title": "Titel på værktøjstip til tukan", - "toucan.auctions": "Auktioner", - "toucan.bidForm.maxBudget": "Maks. budget", - "toucan.bidForm.placeBid": "Placer dit bud", - "toucan.displayMode.tokenPrice": "Tokenpris", - "toucan.displayMode.valuation": "Vurdering", - "transaction.action.cancel.button": "Annuller transaktionen", - "transaction.action.cancel.description": "Hvis du annullerer denne transaktion, før den er behandlet af netværket, betaler du en ny netværkspris i stedet for den oprindelige.", - "transaction.action.cancel.title": "Vil du annullere denne transaktion?", - "transaction.action.clear": "Ryd afventer", - "transaction.action.copy": "Kopiér transaktions-id", - "transaction.action.copyProvider": "Kopiér {{providerName}} transaktions-id", - "transaction.amount.unlimited": "Ubegrænset", - "transaction.callData": "Opkaldsdata", - "transaction.details.dappName": "App", - "transaction.details.from": "Fra", - "transaction.details.networkFee": "Netværksomkostninger", - "transaction.details.networkFee.swap": "Omkostninger til byttenetværk", - "transaction.details.providerFee": "Udbyder gebyr", - "transaction.details.swapRate": "Sats", - "transaction.details.transaction": "Transaktion", - "transaction.details.uniswapFee": "Gebyr ({{ feePercent }}%)", - "transaction.network.all": "Alle netværk", - "transaction.networkCost.description": "Omkostningerne ved at behandle din transaktion på blockchainen. Uniswap er optimeret til minimale netværksomkostninger.", - "transaction.networkCost.includesSmartWalletActivation": "Inkluderer aktivering af smart wallet", - "transaction.networkCost.label": "Netværksomkostninger", - "transaction.networkCost.maxNativeBalance.description": "Et lille beløb af netværkstoken-saldoen er reserveret til at dække netværksomkostningerne ved denne transaktion.", - "transaction.networkCost.maxNativeBalance.title": "Hvorfor kan jeg ikke bruge min maksimale saldo?", - "transaction.networkCost.veryHigh.label": "Meget høje netværksomkostninger", - "transaction.notification.error.cancel": "Transaktionen kunne ikke annulleres", - "transaction.notification.error.replace": "Kan ikke erstatte transaktionen", - "transaction.status.approval.canceled": "Godkendelse annulleret", - "transaction.status.approval.failed": "Godkendelse mislykkedes", - "transaction.status.approve.canceled": "Annulleret godkendelse", - "transaction.status.approve.canceling": "Annullerer godkendelse", - "transaction.status.approve.failed": "Kunne ikke godkendes", - "transaction.status.approve.pending": "Godkender", - "transaction.status.approve.success": "godkendt", - "transaction.status.approve.successDapp": "Godkendt den {{externalDappName}}", - "transaction.status.buy.canceled": "Annulleret køb", - "transaction.status.buy.canceling": "Annullerer køb", - "transaction.status.buy.failed": "Kunne ikke købe", - "transaction.status.buy.pending": "At købe", - "transaction.status.buy.success": "Købt", - "transaction.status.buy.successDapp": "Købt på {{externalDappName}}", - "transaction.status.claim.canceled": "Gebyropkrævning annulleret", - "transaction.status.claim.canceling": "Opkrævning af annulleringsgebyr", - "transaction.status.claim.failed": "Gebyropkrævning mislykkedes", - "transaction.status.claim.pending": "Opkrævning af gebyrer", - "transaction.status.claim.success": "Opkrævede gebyrer", - "transaction.status.collect.fees.canceled": "Opkrævningsgebyrer annulleret", - "transaction.status.collect.fees.failed": "Opkrævning af gebyrer mislykkedes", - "transaction.status.collected.fees": "Opkrævede gebyrer", - "transaction.status.collecting.fees": "Opkrævning af gebyrer", - "transaction.status.confirm.canceled": "Annulleret bekræft", - "transaction.status.confirm.canceling": "Afventer aflysning", - "transaction.status.confirm.failed": "Kunne ikke bekræfte", - "transaction.status.confirm.pending": "Transaktion i gang", - "transaction.status.confirm.success": "Transaktionen bekræftet", - "transaction.status.confirm.successDapp": "Transaktionen bekræftet den {{externalDappName}}", - "transaction.status.createPair.canceled": "Oprettelse af par annulleret", - "transaction.status.createPair.canceling": "Annullerer oprettelse af par", - "transaction.status.createPair.failed": "Kunne ikke oprette par", - "transaction.status.createPair.pending": "Opretter par", - "transaction.status.createPair.success": "Oprettet par", - "transaction.status.createPool.canceled": "Oprettelse af pulje annulleret", - "transaction.status.createPool.canceling": "Annullerer oprettelse af pulje", - "transaction.status.createPool.failed": "Kunne ikke oprette pulje", - "transaction.status.createPool.pending": "Oprettelse af pool", - "transaction.status.createPool.success": "Oprettet pool", - "transaction.status.liquidityDecrease.canceled": "Fjernelse af likviditet annulleret", - "transaction.status.liquidityDecrease.canceling": "Annullering af fjernelse af likviditet", - "transaction.status.liquidityDecrease.failed": "Fjernelse af likviditet mislykkedes", - "transaction.status.liquidityDecrease.pending": "Fjernelse af likviditet", - "transaction.status.liquidityDecrease.success": "Fjernet likviditet", - "transaction.status.liquidityIncrease.canceled": "Tilføjelse af likviditet annulleret", - "transaction.status.liquidityIncrease.canceling": "Annullering af tilføjelse af likviditet", - "transaction.status.liquidityIncrease.failed": "Tilføjelse af likviditet mislykkedes", - "transaction.status.liquidityIncrease.pending": "Tilføjelse af likviditet", - "transaction.status.liquidityIncrease.success": "Tilført likviditet", - "transaction.status.lpIncentivesClaim.canceled": "Annulleret LP-belønningskrav", - "transaction.status.lpIncentivesClaim.canceling": "Annullering af LP-belønningskrav", - "transaction.status.lpIncentivesClaim.failed": "Kunne ikke gøre krav på LP-belønninger", - "transaction.status.lpIncentivesClaim.pending": "Sådan gør du krav på LP-belønninger", - "transaction.status.lpIncentivesClaim.success": "Indhentede LP-belønninger", - "transaction.status.migrateLiquidity.canceled": "Migrering af likviditet annulleret", - "transaction.status.mint.canceled": "Annulleret mint", - "transaction.status.mint.canceling": "Annullering af mynte", - "transaction.status.mint.failed": "Kunne ikke præge", - "transaction.status.mint.pending": "Udmøntning", - "transaction.status.mint.success": "Udmøntet", - "transaction.status.mint.successDapp": "Præget den {{externalDappName}}", - "transaction.status.offramp.canceled": "Frakørsel annulleret", - "transaction.status.offramp.failed": "Aframpe mislykkedes", - "transaction.status.offramp.pending": "Offramping", - "transaction.status.offramp.success": "Udrampet", - "transaction.status.onramp.canceled": "Tilkørsel aflyst", - "transaction.status.onramp.failed": "Onramp mislykkedes", - "transaction.status.onramp.pending": "Onramping", - "transaction.status.onramp.success": "Pårampet", - "transaction.status.permit.approved": "Tilladelse godkendt", - "transaction.status.permit.canceled": "Tilladelse for transmission annulleret", - "transaction.status.permit.failed": "Tilladelsen mislykkedes", - "transaction.status.purchase.canceled": "Annulleret køb", - "transaction.status.purchase.canceling": "Annullerer køb", - "transaction.status.purchase.failed": "Køb mislykkedes", - "transaction.status.purchase.failedOn": "Kunne ikke købe på {{serviceProvider}}", - "transaction.status.purchase.pending": "Indkøb", - "transaction.status.purchase.pendingOn": "Køber på {{serviceProvider}}", - "transaction.status.purchase.successOn": "Købt den {{serviceProvider}}", - "transaction.status.receive.canceled": "Annulleret modtagelse", - "transaction.status.receive.canceling": "Annullerer modtagelse", - "transaction.status.receive.failed": "Modtagelse mislykkedes", - "transaction.status.receive.failedFrom": "Kunne ikke modtage fra {{serviceProvider}}", - "transaction.status.receive.pending": "Modtager", - "transaction.status.receive.pendingFrom": "Modtager fra {{serviceProvider}}", - "transaction.status.receive.success": "Modtaget", - "transaction.status.receive.successDapp": "Modtaget den {{externalDappName}}", - "transaction.status.receive.successFrom": "Modtaget fra {{serviceProvider}}", - "transaction.status.removeDelegation.canceled": "Fjernelse af delegering annulleret", - "transaction.status.removeDelegation.failed": "Fjernelse af delegering mislykkedes", - "transaction.status.removeDelegation.pending": "Fjernelse af delegering", - "transaction.status.removeDelegation.success": "Fjernet delegering", - "transaction.status.revoke.canceled": "Annulleret tilbagekald", - "transaction.status.revoke.canceling": "Annullerer tilbagekald", - "transaction.status.revoke.failed": "Kunne ikke tilbagekalde", - "transaction.status.revoke.pending": "Tilbagekaldelse", - "transaction.status.revoke.success": "Tilbagekaldt", - "transaction.status.revoke.successDapp": "Tilbagekaldt den {{externalDappName}}", - "transaction.status.sale.canceled": "Annulleret salg", - "transaction.status.sale.canceling": "Annullerer salg", - "transaction.status.sale.failedOn": "Salg mislykkedes via {{serviceProvider}}", - "transaction.status.sale.pendingCard.msg": "Lær mere om at sælge krypto.", - "transaction.status.sale.pendingCard.title": "Hvorfor er mit salg stadig afventende?", - "transaction.status.sale.pendingOn": "Sælges via {{serviceProvider}}", - "transaction.status.sale.successOn": "Sælges via {{serviceProvider}}", - "transaction.status.sell.canceled": "Annulleret salg", - "transaction.status.sell.canceling": "Annullerer salg", - "transaction.status.sell.failed": "Det lykkedes ikke at sælge", - "transaction.status.sell.pending": "Sælger", - "transaction.status.sell.success": "Solgt", - "transaction.status.sell.successDapp": "Sælges på {{externalDappName}}", - "transaction.status.send.canceled": "Annulleret afsendelse", - "transaction.status.send.canceling": "Annullerer afsendelse", - "transaction.status.send.failed": "afsendelse mislykkedes", - "transaction.status.send.pending": "Sender", - "transaction.status.send.success": "Sendt", - "transaction.status.send.successDapp": "Sendt den {{externalDappName}}", - "transaction.status.swap.canceled": "Bytte annulleret", - "transaction.status.swap.canceling": "Annullerer bytte", - "transaction.status.swap.expired": "Swap udløb", - "transaction.status.swap.failed": "Kunne ikke bytte", - "transaction.status.swap.insufficientFunds": "Ikke nok penge", - "transaction.status.swap.pending": "Bytte", - "transaction.status.swap.success": "Byttet rundt", - "transaction.status.swap.successDapp": "Byttet på {{externalDappName}}", - "transaction.status.unwrap.canceled": "Annulleret udpakning", - "transaction.status.unwrap.canceling": "Annullerer udpakning", - "transaction.status.unwrap.failed": "Kunne ikke pakke ud", - "transaction.status.unwrap.pending": "Udpakning", - "transaction.status.unwrap.success": "Udpakket", - "transaction.status.unwrap.successDapp": "Udpakket på {{externalDappName}}", - "transaction.status.wrap.canceled": "Annulleret indpakning", - "transaction.status.wrap.canceling": "Annullerer indpakning", - "transaction.status.wrap.failed": "Kunne ikke ombrydes", - "transaction.status.wrap.pending": "Indpakning", - "transaction.status.wrap.success": "Indpakket", - "transaction.status.wrap.successDapp": "Indpakket på {{externalDappName}}", - "transaction.submittedOn": "Indsendt den", - "transaction.summary.liquidity": "{{firstAmountWithSymbol}} og {{secondAmountWithSymbol}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} til {{recipientAddress}}", - "transaction.summary.received.noAmount": "Modtaget fra {{name}}", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} fra {{senderAddress}}", - "transaction.summary.sent.noAmount": "Sendt til {{name}}", - "transaction.warning.insufficientGas.modal.message": "Du skal bruge ~{{tokenAmount}} {{tokenSymbol}} () på {{networkName}} for at dække denne transaktions netværksomkostninger. Byt {{tokenSymbol}} fra en anden kæde, eller køb med dit kort for at fortsætte.", - "transaction.warning.insufficientGas.modal.message.noAction": "Du skal bruge ~{{tokenAmount}} {{tokenSymbol}} () på {{networkName}} for at dække denne transaktions netværksomkostninger.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount": "Du skal bruge ~{{tokenAmount}} {{tokenSymbol}} () på {{networkName}} for at dække denne transaktions netværksomkostninger.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount.noAction": "For at bytte med dette token skal du bruge mere {{tokenSymbol}} på {{networkName}}.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "Ikke nok {{tokenSymbol}} på {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Ikke nok {{tokenSymbol}}", - "transaction.warning.maxNative.message": "Du er ved at bruge det meste af din netværkstoken-saldo. Dette kan efterlade utilstrækkelige midler til at dække fremtidige netværksomkostninger.", - "transaction.warning.maxNative.title": "Lav netværkstokenbalance", - "transaction.watcher.error.cancel": "Transaktionen kunne ikke annulleres", - "transaction.watcher.error.status": "Fejl under kontrol af transaktionsstatus", - "uniswapX.aggregatesLiquidity": " samler likviditetskilder til bedre priser og gasfrie swaps.", - "uniswapX.cost": "UniswapX fjerner de typiske omkostninger ved at handle på blockchainen.", - "uniswapx.description": "UniswapX samler likviditetskilder for bedre priser og gasfri swaps.", - "uniswapx.description.unsupported": "UniswapX er i øjeblikket ikke tilgængelig, fordi dine smart wallet-indstillinger administreres af en anden wallet-app.", - "uniswapx.included": "Inkluderer UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "Lær mere om at bytte med UniswapX", - "uniswapx.unavailable.title": "UniswapX er ikke tilgængelig", - "uniswapx.v2QuoteFailed": "UniswapX v2 hårdt citat mislykkedes. Prøv igen med klassisk swap.", - "unitags.banner.button.claim": "Gør krav nu", - "unitags.banner.subtitle": "Byg en personlig web3-profil og del nemt din adresse med venner.", - "unitags.banner.title.compact": "Gør krav på dit {{unitagDomain}} brugernavn og opbyg din profil, der kan tilpasses.", - "unitags.banner.title.full": "Gør krav på dit {{unitagDomain}} brugernavn", - "unitags.choosePhoto.option.cameraRoll": "Vælg mellem kamerarulle", - "unitags.choosePhoto.option.computer": "Upload fra computer", - "unitags.choosePhoto.option.nft": "Vælg en NFT", - "unitags.choosePhoto.option.remove": "Fjern profilbillede", - "unitags.claim.available": "Tilgængelig", - "unitags.claim.confirmation.customize": "Tilpas profil", - "unitags.claim.confirmation.description": "{{unitagAddress}} er klar til at sende og modtage krypto. Fortsæt med at bygge din tegnebog ud ved at tilpasse din web3-profil.", - "unitags.claim.confirmation.success.long": "Du har det!", - "unitags.claim.confirmation.success.short": "Forstået!", - "unitags.claim.error.addressLimit": "Du har allerede foretaget det maksimale antal ændringer af dit brugernavn for denne adresse", - "unitags.claim.error.avatar": "Kunne ikke indstille avatar. Prøv igen senere.", - "unitags.claim.error.default": "Kunne ikke gøre krav på brugernavn. Prøv igen senere.", - "unitags.claim.error.deviceLimit": "Du har nået det maksimale antal brugernavne, der kan være aktive for denne enhed", - "unitags.claim.error.general": "Kan ikke gøre krav på brugernavn", - "unitags.claim.error.unavailable": "Dette brugernavn er ikke tilgængelig", - "unitags.claim.error.unknown": "Ukendt fejl", - "unitags.claim.username.default": "dit navn", - "unitags.delete.confirm.subtitle": "Du er ved at slette dit brugernavn og profiloplysninger, der kan tilpasses. Du vil ikke være i stand til at kræve det tilbage.", - "unitags.delete.confirm.title": "Er du sikker?", - "unitags.editProfile.placeholder": "brugernavn", - "unitags.editUsername.confirm.subtitle": "Du er ved at ændre dit brugernavn. Når først du har ændret det, kan du aldrig gøre krav på det igen.", - "unitags.editUsername.confirm.title": "Er du sikker?", - "unitags.editUsername.title": "Rediger dit brugernavn", - "unitags.editUsername.warning.default": "Når du først har ændret dit brugernavn, kan du aldrig gøre krav på det igen. Du kan kun ændre det 2 gange.", - "unitags.editUsername.warning.max": "Du har nået det maksimale antal af 2 brugernavneændringer.", - "unitags.extension.intro.buttton": "Gør krav på et brugernavn", - "unitags.extension.intro.description": "Sig farvel til 0x-adresser. Brugernavne er læsbare navne, der gør det nemmere at sende og modtage krypto.", - "unitags.extension.intro.title": "Introduktion af brugernavne", - "unitags.extension.intro.upsell.customizable": "Profiler, der kan tilpasses", - "unitags.extension.intro.upsell.ens": "Drevet af ENS underdomæner", - "unitags.extension.intro.upsell.free": "Gratis at kræve", - "unitags.intro.features.ens": "Drevet af ENS underdomæner", - "unitags.intro.features.free": "Gratis at kræve", - "unitags.intro.features.profile": "Profiler, der kan tilpasses", - "unitags.intro.subtitle": "Sig farvel til 0x-adresser. Brugernavne er læsbare navne, der gør det nemmere at sende og modtage krypto.", - "unitags.intro.title": "Introduktion af brugernavne", - "unitags.notification.delete.error": "Brugernavnet kunne ikke slettes. Prøv igen senere.", - "unitags.notification.delete.title": "Brugernavn slettet", - "unitags.notification.profile.error": "Profilen kunne ikke opdateres. Prøv igen senere.", - "unitags.notification.profile.title": "Profil opdateret", - "unitags.notification.username.error": "Kunne ikke ændre brugernavn. Prøv igen senere.", - "unitags.notification.username.title": "Brugernavn ændret", - "unitags.onboarding.claim.subtitle": "Dette er din personlige adresse, som folk kan sende krypto til.", - "unitags.onboarding.claim.title.choose": "Opret dit brugernavn", - "unitags.onboarding.claim.title.claim": "Gør krav på dit brugernavn", - "unitags.onboarding.info.description": "Brugernavne omdanner komplekse 0x-adresser til læsbare navne. Ved at gøre krav på et {{unitagDomain}} brugernavn kan du nemt sende og modtage krypto og opbygge en offentlig web3-profil.", - "unitags.onboarding.info.title": "En forenklet adresse", - "unitags.onboarding.profile.subtitle": "Upload din egen eller hold dig til din unikke Unicon. Du kan altid ændre dette senere.", - "unitags.onboarding.profile.title": "Vælg et profilbillede", - "unitags.profile.action.delete": "Slet brugernavn", - "unitags.profile.action.edit": "Rediger brugernavn", - "unitags.profile.bio.label": "Bio", - "unitags.profile.bio.placeholder": "Indtast en bio til din profil", - "unitags.profile.links.twitter": "Twitter", - "unitags.username.error.chars": "Brugernavne må kun indeholde bogstaver og tal", - "unitags.username.error.max": "Brugernavne må ikke være mere end {{number}} tegn", - "unitags.username.error.min": "Brugernavne skal være mindst {{number}} tegn", - "unitags.username.error.uppercase": "Brugernavne må kun indeholde små bogstaver og tal", - "uwulink.error.insufficientTokens": "Ikke nok {{tokenSymbol}} på {{chain}}", - "v2.notAvailable": "Uniswap V2 er ikke tilgængelig på dette netværk.", - "wallet.appSignIn": "Log ind med appen", - "wallet.connectingAgreement": "Ved at tilslutte en tegnebog accepterer du Uniswap Labs' Servicevilkår og samtykker til dets Privatlivspolitik.", - "wallet.connectionFailed.message": "Forbindelsesforsøget mislykkedes. Prøv igen, og følg trinnene for at oprette forbindelse i din tegnebog.", - "wallet.mismatch.popup.description": "Nogle funktioner understøttes ikke af din forbundne tegnebog.", - "wallet.mismatch.popup.title": "Begrænset tegnebogsunderstøttelse", - "wallet.other": "Andre tegnebøger", - "wallet.scanToConnect": "Scan QR-koden for at oprette forbindelse", - "wallet.wrongNet": "Din tegnebog er forbundet til det forkerte netværk.", - "walletConnect.dapps.empty.description": "Opret forbindelse til en app ved at scanne en kode via WalletConnect", - "walletConnect.dapps.manage.empty.title": "Ingen apps tilsluttet", - "walletConnect.dapps.manage.title": "Forbindelser", - "walletConnect.error.connection.message": "Uniswap Wallet understøtter i øjeblikket {{chainNames}}. Brug venligst kun \"{{dappName}}\" på disse kæder", - "walletConnect.error.connection.title": "Forbindelsesfejl", - "walletConnect.error.general.message": "Der var et problem med WalletConnect. Prøv igen", - "walletConnect.error.general.title": "WalletConnect-fejl", - "walletConnect.error.scantastic.message": "Der var et problem med din QR-kode. Prøv igen", - "walletConnect.error.scantastic.title": "Ugyldig QR-kode", - "walletConnect.error.unsupported.message": "Sørg for, at du scanner en gyldig WalletConnect, Ethereum-adresse eller Uniswap Extension QR-kode, før du prøver igen.", - "walletConnect.error.unsupported.title": "Ugyldig QR-kode", - "walletConnect.error.unsupportedV1.message": "WalletConnect v1 understøttes ikke længere. Den applikation, du forsøger at oprette forbindelse til, skal opgraderes til WalletConnect v2.", - "walletConnect.error.unsupportedV1.title": "Ugyldig QR-kode", - "walletConnect.error.uwu.scan": "Der opstod et problem med at scanne denne QR-kode.", - "walletConnect.error.uwu.title": "UwU Link fejl", - "walletConnect.error.uwu.unsupported": "Denne QR-kode understøttes ikke.", - "walletConnect.pending.button.connect": "Forbinde", - "walletConnect.pending.button.reject": "Afvise", - "walletConnect.pending.button.scrollDown": "Rul ned for at oprette forbindelse", - "walletConnect.pending.threat.confirmationText": "Jeg forstår risiciene", - "walletConnect.pending.threat.description": "Underskrivelse af beskeder eller transaktioner fra denne app kan resultere i tab af penge.", - "walletConnect.pending.threat.title": "Der er registreret en skadelig app", - "walletConnect.pending.title": "Opret forbindelse til {{dappName}}", - "walletConnect.pending.unverified.description": "Sørg for at du har tillid til dette websted, før du fortsætter. ", - "walletConnect.pending.unverified.title": "Ubekræftet app", - "walletConnect.permissions.option.requestApprovals": "Anmod om godkendelse af transaktioner", - "walletConnect.permissions.option.transferAssets": "Move funds without permission", - "walletConnect.permissions.option.viewTokenBalances": "View your balance and activity", - "walletConnect.permissions.title": "App permissions", - "walletConnect.request.bundledTransactions.label_one": "Enkelt bundtet transaktion", - "walletConnect.request.bundledTransactions.label_other": "{{count}} bundtede transaktioner", - "walletConnect.request.button.scrollDown": "Rul ned for at underskrive", - "walletConnect.request.button.sign": "Skilt", - "walletConnect.request.details.label.function": "Fungere", - "walletConnect.request.details.label.sending": "Sender", - "walletConnect.request.details.label.token": "Polet", - "walletConnect.request.details.label.tokens": "Poletter", - "walletConnect.request.error.insufficientFunds": "Du har ikke nok {{currencySymbol}} til at gennemføre denne transaktion.", - "walletConnect.request.error.network": "Internet- eller netværksforbindelsesfejl", - "walletConnect.request.warning.batch.message": "Vær forsigtig: denne anmodning indeholder flere transaktioner og kan overføre aktiver", - "walletConnect.request.warning.general.message": "Vær forsigtig: denne meddelelse kan overføre aktiver", - "walletConnect.request.warning.message": "For at signere meddelelser eller transaktioner skal du importere tegnebogens gendannelsessætning.", - "walletConnect.request.warning.title": "Denne pung er i visningstilstand", - "web.explore.description": "Opdag og undersøg tokens på {{network}}. Udforsk de bedste pools. Se priser i realtid, handelsvolumen, TVL, diagrammer og transaktionsdata.", - "web.explore.title.pools": "Udforsk de bedste puljer på {{network}} på Uniswap", - "web.explore.title.tokens": "Udforsk de bedste tokens på {{network}} på Uniswap", - "web.explore.title.transactions": "Udforsk de mest populære transaktioner på {{network}} på Uniswap" -} diff --git a/packages/uniswap/src/i18n/locales/translations/de-DE.json b/packages/uniswap/src/i18n/locales/translations/de-DE.json deleted file mode 100644 index a08d7af67ff..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/de-DE.json +++ /dev/null @@ -1,2384 +0,0 @@ -{ - "account.authHeader.claimReward": "Fordern Sie eine Belohnung von {{amount}} an", - "account.cloud.backup.subtitle": "Auf Ihrem {{cloudProviderName}}sind mehrere Wiederherstellungsphrasen gesichert.", - "account.cloud.backup.title": "Wählen Sie ein Backup zum Wiederherstellen aus", - "account.cloud.button.restore.android": "Von Google Drive wiederherstellen", - "account.cloud.button.restore.ios": "Wiederherstellen aus iCloud", - "account.cloud.empty.description": "Es sieht so aus, als hätten Sie keine Ihrer Wiederherstellungsphrasen unter {{cloudProviderName}}gesichert.", - "account.cloud.empty.title": "0 Backups gefunden", - "account.cloud.error.backup.message": "Das Importieren von Backups ist aufgrund fehlender Berechtigungen, unterbrochener Autorisierung oder eines Cloud-Fehlers fehlgeschlagen", - "account.cloud.error.backup.title": "Fehler beim Importieren der Backups", - "account.cloud.error.password.title": "Falsche Kennwort. Bitte versuchen Sie es erneut.", - "account.cloud.error.unavailable.button.cancel": "Nicht jetzt", - "account.cloud.error.unavailable.button.settings": "Gehe zu den Einstellungen", - "account.cloud.error.unavailable.message.android": "Bitte überprüfen Sie, ob Sie bei einem Google-Konto angemeldet sind und Google Drive auf diesem Gerät aktiviert ist, und versuchen Sie es erneut.", - "account.cloud.error.unavailable.message.ios": "Bitte überprüfen Sie, ob Sie mit einer Apple-ID angemeldet sind und iCloud Drive auf diesem Gerät aktiviert ist, und versuchen Sie es erneut.", - "account.cloud.error.unavailable.title.android": "Google Drive nicht verfügbar", - "account.cloud.error.unavailable.title.ios": "iCloud Drive nicht verfügbar", - "account.cloud.loading.title": "Suche nach Backups...", - "account.cloud.lockout.time.hours_one": "Zu viele Versuche. Versuchen Sie es in 1 Stunde erneut.", - "account.cloud.lockout.time.hours_other": "Zu viele Versuche. Versuchen Sie es in {{count}} Stunden erneut.", - "account.cloud.lockout.time.minutes_one": "Zu viele Versuche. Versuchen Sie es in 1 Minute erneut.", - "account.cloud.lockout.time.minutes_other": "Zu viele Versuche. Versuchen Sie es in {{count}} Minuten erneut.", - "account.cloud.password.input": "Passwort eingeben", - "account.cloud.password.recoveryPhrase": "Geben Sie stattdessen Ihre Wiederherstellungsphrase ein", - "account.cloud.password.subtitle": "Dieses Kennwort wird benötigt, um Ihr Recovery-Phrase-Backup von {{cloudProviderName}}wiederherzustellen.", - "account.cloud.password.title": "Backup-Passwort eingeben", - "account.drawer.gitVersion": "Ausführung: ", - "account.drawer.modal.body": "Mit der Uniswap-App können Sie Token sicher speichern und tauschen. Verfügbar für iOS und Android.", - "account.drawer.modal.dont": "Sie haben kein Uniswap-Wallet?", - "account.drawer.modal.scan": "Scannen mit Uniswap Wallet", - "account.drawer.spamToggle": "Unbekannte Token und NFTs verbergen", - "account.porfolio.activity.cancelledBelow": "Diese Bestellung wurde storniert, da Ihr Guthaben unter den eingegebenen Betrag gefallen ist.", - "account.portfolio.activity.signLimit": "Diese Bestellung kann nicht ausgeführt werden, da Ihr Guthaben unter den eingegebenen Betrag gefallen ist. Erhöhen Sie Ihr Guthaben, um das Problem zu beheben.", - "account.recoveryPhrase.education.part1": "Eine Wiederherstellungsphrase (oder Seed-Phrase) ist eine Reihe von Wörtern , die für den Zugriff auf Ihr Wallet erforderlich sind, wie ein Passwort.", - "account.recoveryPhrase.education.part2": "Sie können Ihre Wiederherstellungsphrase auf einem neuen Gerät eingeben, um Ihre Brieftasche und deren Inhalt wiederherzustellen.", - "account.recoveryPhrase.education.part3": "Wenn Sie jedoch Ihre Wiederherstellungsphraseverlieren, verlieren Sie den Zugriff auf Ihr Wallet.", - "account.recoveryPhrase.education.part4": "Anstatt Ihre Wiederherstellungsphrase zu merken, können Sie sie in {{cloudProviderName}} sichern und mit einem Passwort schützen.", - "account.recoveryPhrase.education.part5": "Sie können Ihre Wiederherstellungsphrase auch manuell sichern, indem Sie sie aufschreiben und an einem sicheren Ort aufbewahren.", - "account.recoveryPhrase.education.part6": "Wir empfehlen, beide Sicherungstypen undzu verwenden, da Sie Ihr Wallet nicht wiederherstellen können, wenn Sie Ihre Wiederherstellungsphrase verlieren.", - "account.recoveryPhrase.error.invalid": "Ungültige Phrase", - "account.recoveryPhrase.error.invalidWord": "Ungültiges Wort: {{word}}", - "account.recoveryPhrase.error.phraseLength": "Die Wiederherstellungsphrase muss 12–24 Wörter lang sein", - "account.recoveryPhrase.error.wrong": "Falsche Wiederherstellungsphrase", - "account.recoveryPhrase.helpText.import": "Wie finde ich meine Wiederherstellungsphrase?", - "account.recoveryPhrase.helpText.restoring": "Versuchen Sie es erneut mit der Suche", - "account.recoveryPhrase.input": "Geben Sie Ihre Wiederherstellungsphrase ein", - "account.recoveryPhrase.remove.final.description": "Stellen Sie sicher, dass Sie Ihre Wiederherstellungsphrase aufgeschrieben oder auf {{cloudProviderName}}gesichert haben. Andernfalls können Sie nicht auf Ihr Geld zugreifen.", - "account.recoveryPhrase.remove.final.title": "Sie entfernen Ihre Wiederherstellungsphrase", - "account.recoveryPhrase.remove.import.description": "Sie können jeweils nur eine Wiederherstellungsphrase speichern. Um mit dem Importieren einer neuen fortzufahren, müssen Sie Ihre aktuelle Wiederherstellungsphrase und alle zugehörigen Wallets von diesem Gerät entfernen.", - "account.recoveryPhrase.remove.initial.description": "Dadurch werden Ihr Wallet und Ihre Wiederherstellungsphrase von diesem Gerät entfernt.", - "account.recoveryPhrase.remove.initial.title": "Sie entfernen {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "Es verwendet dieselbe Wiederherstellungsphrase wie {{walletNames, list}}. Ihre Wiederherstellungsphrase bleibt gespeichert, bis Sie alle verbleibenden Wallets löschen.", - "account.recoveryPhrase.subtitle.import": "Ihre Wiederherstellungsphrase wird nur lokal auf Ihrem Gerät gespeichert.", - "account.recoveryPhrase.subtitle.restoring": "Geben Sie unten Ihre Wiederherstellungsphrase ein oder versuchen Sie erneut, nach Backups zu suchen.", - "account.recoveryPhrase.title.import": "Geben Sie Ihre Wiederherstellungsphrase ein", - "account.recoveryPhrase.title.restoring": "Keine Backups gefunden", - "account.transactionSummary.addLiquidity": "Fügen Sie {{baseSymbol}}/{{quoteSymbol}} V3-Liquidität hinzu", - "account.transactionSummary.addLiquidityv2": "Fügen Sie und zu Uniswap V2 hinzu", - "account.transactionSummary.approve": "Genehmigen {{tokenSymbol}}", - "account.transactionSummary.claimFor": "Anspruch auf für {{username}}", - "account.transactionSummary.claimReward": "Fordern Sie eine UNI-Belohnung für {{username}}an", - "account.transactionSummary.collectFees": "Erheben Sie {{symbol0}}/{{symbol1}} Gebühren", - "account.transactionSummary.createAddLiquidity": "Pool erstellen und {{baseSymbol}}/{{quoteSymbol}} V3-Liquidität hinzufügen", - "account.transactionSummary.createPool": "Erstellen Sie einen {{baseSymbol}}/{{quoteSymbol}} V3-Pool", - "account.transactionSummary.decision.abstain": "Enthaltung bei Vorschlag {{proposalKey}} mit Begründung "{{reason}}"", - "account.transactionSummary.decision.against": "Gegen den Vorschlag {{proposalKey}} stimmen mit Begründung "{{reason}}"", - "account.transactionSummary.decision.for": "Für Vorschlag {{proposalKey}} stimmen mit Begründung "{{reason: info.reason}}"", - "account.transactionSummary.delegateSummary": "Stimmrecht an {{username}}delegieren", - "account.transactionSummary.depositLiquidity": "Einlagenliquidität", - "account.transactionSummary.executeProposal": "Führen Sie den Vorschlag {{proposalKey}}aus.", - "account.transactionSummary.migrateLiquidity": "Migrieren Sie {{baseSymbol}}/{{quoteSymbol}} Liquidität nach V3", - "account.transactionSummary.queueProposal": "Warteschlangenvorschlag {{proposalKey}}.", - "account.transactionSummary.removeLiquiditySummary": "Entfernen Sie und ", - "account.transactionSummary.revoke": "Widerrufen {{tokenSymbol}}", - "account.transactionSummary.sendSummary": "Gesendet an {{recipient}}", - "account.transactionSummary.submitProposal": "Neuen Vorschlag einreichen", - "account.transactionSummary.swapExactIn": "Tausche genau gegen ", - "account.transactionSummary.swapExactOut": "Tausche gegen genau ", - "account.transactionSummary.unwrapTo": "Entpacken Sie bis {{symbol}}", - "account.transactionSummary.vote.abstain": "Enthaltung bei Vorschlag {{proposalKey}}", - "account.transactionSummary.vote.against": "Gegen den Vorschlag stimmen {{proposalKey}}", - "account.transactionSummary.vote.for": "Für Vorschlag stimmen {{proposalKey}}", - "account.transactionSummary.withdrawLiquidity": "Eingezahlte Liquidität abheben", - "account.transactionSummary.wrapTo": "Umbruch von zu {{symbol}}", - "account.wallet.action.copy": "Wallet-Adresse kopieren", - "account.wallet.action.report": "Profil melden", - "account.wallet.action.settings": "Wallet-Einstellungen", - "account.wallet.action.viewExplorer": "Ansicht auf {{blockExplorerName}}", - "account.wallet.button.add": "Geldbörse hinzufügen", - "account.wallet.button.addViewOnly": "Fügen Sie eine schreibgeschützte Brieftasche hinzu", - "account.wallet.button.create": "Erstellen Sie eine neue Brieftasche", - "account.wallet.button.import": "Importieren Sie eine neue Brieftasche", - "account.wallet.button.manage": "Geldbörse verwalten", - "account.wallet.button.remove": "Brieftasche entfernen", - "account.wallet.button.restore": "Wallet wiederherstellen", - "account.wallet.button.watch": "Beobachten Sie eine Brieftasche", - "account.wallet.create.placeholder": "Brieftasche {{index}}", - "account.wallet.edit.label.input.placeholder": "Etikett für Geldbörse", - "account.wallet.header.button.disabled.title": "Profil bearbeiten", - "account.wallet.header.button.title": "Beschriftung bearbeiten", - "account.wallet.header.other": "Ihre anderen Geldbörsen", - "account.wallet.header.viewOnly": "Nur-Ansicht-Wallets", - "account.wallet.menu.copy.title": "Wallet-Adresse kopieren", - "account.wallet.menu.edit.title": "Beschriftung bearbeiten", - "account.wallet.menu.remove.title": "Brieftasche entfernen", - "account.wallet.remove.check": "Ich habe meine Wiederherstellungsphrase gesichert und verstehe, dass Uniswap Labs mir nicht helfen kann, meine Wallets wiederherzustellen, wenn ich dies nicht tue.", - "account.wallet.remove.title": "Entfernen Sie {{name}}", - "account.wallet.remove.viewOnly": "Sie können schreibgeschützte Wallets jederzeit wieder hinzufügen, indem Sie die Adresse des Wallets eingeben.", - "account.wallet.restore.description": "Da Sie ein neues Gerät verwenden, müssen Sie Ihre Wiederherstellungsphrase wiederherstellen. Dadurch können Sie Token austauschen und senden.", - "account.wallet.select.error": "Adressen konnten nicht geladen werden", - "account.wallet.select.loading.subtitle": "Ihre Geldbörsen werden unten angezeigt.", - "account.wallet.select.loading.title": "Suche nach Geldbörsen", - "account.wallet.select.title_one_one": "Eine Brieftasche gefunden", - "account.wallet.select.title_one_other": "Wählen Sie die zu importierenden Wallets aus", - "account.wallet.viewOnly.button": "Brieftasche importieren", - "account.wallet.viewOnly.description": "Um Token zu tauschen, zu kaufen, zu senden und zu empfangen, müssen Sie die Wiederherstellungsphrase dieser Brieftasche importieren.", - "account.wallet.viewOnly.title": "Diese Brieftasche ist schreibgeschützt", - "account.wallet.watch.error.alreadyImported": "Diese Adresse wurde bereits importiert", - "account.wallet.watch.error.notFound": "Adresse nicht gefunden", - "account.wallet.watch.error.smartContract": "Adresse ist ein Smart Contract", - "account.wallet.watch.message": "Durch das Hinzufügen einer schreibgeschützten Wallet können Sie die App ausprobieren oder eine Wallet verfolgen. Sie können kein Guthaben tauschen oder senden.", - "account.wallet.watch.placeholder": "ENS oder Adresse", - "account.wallet.watch.title": "Geben Sie eine Wallet-Adresse ein", - "activity.pending": "{{pendingActivityCount}} Ausstehend", - "activity.transaction.receive.descriptor": "{{amountWithSymbol}} von {{walletAddress}}", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} bis {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} für {{amountWithSymbolB}}", - "activity.transaction.swap.descriptor.formatted": " für ", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} und {{amountWithSymbolB}}", - "activity.transaction.tokens.descriptor.formatted": " und ", - "addLiquidity.shareOfPool": "Anteil am Pool", - "addressInput.recipient": "Empfänger", - "analytics.allow": "Analysen zulassen", - "analytics.allow.message": "Wir verwenden anonymisierte Daten, um Ihre Erfahrung mit Uniswap Labs-Produkten zu verbessern.", - "appRating.button.notReally": "Nicht wirklich", - "appRating.description": "Teilen Sie uns mit, ob Sie mit dieser App gute Erfahrungen gemacht haben", - "appRating.extension.review.description": "Wählen Sie eine Sternebewertung und hinterlassen Sie eine Rezension im Chrome Web Store.", - "appRating.extension.review.title": "Uniswap-Erweiterung überprüfen?", - "appRating.extension.title": "Gefällt Ihnen die Uniswap-Erweiterung?", - "appRating.feedback.button.send": "Feedback abschicken", - "appRating.feedback.description": "Lassen Sie uns wissen, wie wir Ihr Erlebnis verbessern können", - "appRating.feedback.title": "Das tut uns leid.", - "appRating.mobile.title": "Gefällt Ihnen das Uniswap Wallet?", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "burn.input.enterAPercent.error": "Geben Sie einen Prozentsatz ein", - "chart.candlestick": "Leuchter", - "chart.error.pools": "Historische Daten für den aktuellen Pool können nicht angezeigt werden.", - "chart.error.tokens": "Historische Daten für das aktuelle Token können nicht angezeigt werden.", - "chart.line": "Liniendiagramm", - "chart.missingData": "Fehlende Diagrammdaten", - "chart.price.label.close": "Schließen", - "chart.price.label.high": "Hoch", - "chart.price.label.low": "Niedrig", - "chart.price.label.open": "Offen", - "chart.settings.unavailable.label": "Diese Einstellung ist für das aktuelle Diagramm nicht verfügbar", - "claim.thanks": "Danke, dass du Teil der Uniswap-Community bist ", - "claim.uni.arrived": "Die UNI ist da", - "common.accept": "Akzeptieren", - "common.activity": "Aktivität", - "common.add.label": "Hinzufügen", - "common.add.liquidity.cancelled": "Liquidität hinzufügen abgebrochen", - "common.add.liquidity.failed": "Hinzufügen von Liquidität fehlgeschlagen", - "common.add.v2.liquidity.cancelled": "Hinzufügen von V2-Liquidität abgebrochen", - "common.add.v2.liquidity.failed": "Hinzufügen von V2-Liquidität fehlgeschlagen", - "common.added.liquidity": "Zusätzliche Liquidität", - "common.added.v2.liquidity": "V2-Liquidität hinzugefügt", - "common.addedLiquidity": "Zusätzliche Liquidität", - "common.adding.liquidity": "Mehr Liquidität", - "common.adding.v2.liquidity": "Hinzufügen von V2-Liquidität", - "common.addLiquidity": "Liquidität hinzufügen", - "common.addressOrENS": "Wallet-Adresse oder ENS-Name", - "common.advanced": "Fortschrittlich", - "common.all": "Alle", - "common.allTime": "Alle Zeit", - "common.amount.label": "Menge", - "common.amountDeposited.label": "{{amount}} Eingezahlt", - "common.and": "Und", - "common.app": "App", - "common.approval.cancelled": "Genehmigung abgebrochen", - "common.approval.failed": "Genehmigung fehlgeschlagen", - "common.approve": "Genehmigen", - "common.approved": "Genehmigt", - "common.approvePending": "Bestätigung ausstehend...", - "common.approveSpend": "Genehmigen Sie {{symbol}} Ausgaben", - "common.approving": "Genehmigen", - "common.areYouSure": "Bist du sicher?", - "common.automatic": "Auto", - "common.availableIn": "Uniswap verfügbar in: ", - "common.availableOnIOSAndroid": "Verfügbar für iOS und Android", - "common.availableOnIOSAndroidChrome": "Verfügbar für iOS, Android und Chrome", - "common.backToPositions": "Zurück zu den Positionen", - "common.blocked.ifError": "Wenn Sie glauben, dass es sich um einen Fehler handelt, senden Sie bitte eine E-Mail mit Ihrer Adresse an ", - "common.blocked.reason": "Diese Adresse ist auf der Uniswap Labs-Schnittstelle blockiert, da sie mit einer oder mehreren blockierten Aktivitätenverknüpft ist.", - "common.blockedAddress": "Blockierte Adresse", - "common.blog": "Der Blog", - "common.borrow.cancelled": "Ausleihe abgebrochen", - "common.borrow.failed": "Ausleihen fehlgeschlagen", - "common.borrowed": "Geliehen", - "common.borrowing": "Ausleihen", - "common.bought": "Gekauft", - "common.brandAssets": "Markenwerte", - "common.burn.cancelled": "Brennen abgebrochen", - "common.burn.failed": "Brennen fehlgeschlagen", - "common.burned": "Verbrannt", - "common.burning": "Verbrennung", - "common.button.accept": "Akzeptieren", - "common.button.back": "Zurück", - "common.button.buy": "Kaufen", - "common.button.cancel": "Stornieren", - "common.button.checkin": "Einchecken", - "common.button.close": "Schließen", - "common.button.confirm": "Bestätigen", - "common.button.connect": "Verbinden", - "common.button.continue": "Weitermachen", - "common.button.copied": "Kopiert", - "common.button.copy": "Kopieren", - "common.button.create": "Erstellen", - "common.button.delete": "Löschen", - "common.button.disconnect": "Trennen", - "common.button.dismiss": "Zurückweisen", - "common.button.done": "Erledigt", - "common.button.edit": "Bearbeiten", - "common.button.enable": "Aktivieren", - "common.button.finish": "Beenden", - "common.button.goBack": "Geh zurück", - "common.button.later": "Vielleicht später", - "common.button.learn": "Erfahren Sie mehr", - "common.button.next": "Nächste", - "common.button.notNow": "Nicht jetzt", - "common.button.ok": "OK", - "common.button.paste": "Paste", - "common.button.pay": "Zahlen", - "common.button.receive": "Erhalten", - "common.button.remove": "Entfernen", - "common.button.reset": "Zurücksetzen", - "common.button.restore": "Wiederherstellen", - "common.button.retry": "Wiederholen", - "common.button.reveal": "Aufdecken", - "common.button.review": "Rezension", - "common.button.save": "Speichern", - "common.button.scrollDown": "Runterscrollen", - "common.button.sell": "Verkaufen", - "common.button.send": "Schicken", - "common.button.setup": "Aufstellen", - "common.button.share": "Aktie", - "common.button.showLess": "Zeige weniger", - "common.button.showMore": "Zeig mehr", - "common.button.sign": "Zeichen", - "common.button.skip": "Überspringen", - "common.button.swap": "Tauschen", - "common.button.tryAgain": "Versuchen Sie es erneut", - "common.button.understand": "Ich verstehe", - "common.button.view": "Sicht", - "common.button.viewDetails": "Details anzeigen", - "common.button.yes": "Ja", - "common.buy.cancelled": "Kauf storniert", - "common.buy.failed": "Kauf fehlgeschlagen", - "common.buy.label": "Kaufen", - "common.buyAndSell": "Kaufen und verkaufen auf Uniswap", - "common.buying": "Kauf", - "common.by": "Von", - "common.cancel.failed": "Abbrechen fehlgeschlagen", - "common.cancellation.cancelled": "Stornierung storniert", - "common.cancellationSubmitted": "Stornierung übermittelt", - "common.cancellationSuccessful": "Stornierung erfolgreich", - "common.cancelled": "Abgesagt", - "common.cancelling": "Abbrechen", - "common.cancelOrder": "Bestellung stornieren", - "common.card.error.description": "Etwas ist schief gelaufen", - "common.card.error.title": "Hoppla! Etwas ist schiefgelaufen.", - "common.careers": "Karriere", - "common.chartType": "Diagramm Typ", - "common.checkNetwork": "Überprüfen Sie hier den Netzwerkstatus .", - "common.chromeExtension": "Verlängerung", - "common.claim.cancelled": "Anspruch storniert", - "common.claim.failed": "Anspruch fehlgeschlagen", - "common.claimed": "Behauptet", - "common.claiming": "Anspruch", - "common.claimUnis": "Fordern Sie Ihre UNI-Token an", - "common.clear": "Klar", - "common.close": "Schließen", - "common.closed": "Geschlossen", - "common.collect.button": "Sammeln", - "common.collect.fees.cancelled": "Gebühren einziehen storniert", - "common.collect.fees.failed": "Gebühreneinzug fehlgeschlagen", - "common.collected.fees": "Eingezogene Gebühren", - "common.collecting.fees": "Gebühren einziehen", - "common.company": "Unternehmen", - "common.confirm": "Bestätigen", - "common.confirmCancellation": "Stornierung bestätigen", - "common.confirmSend.button": "Senden bestätigen", - "common.confirmSwap": "Tausch im Wallet bestätigen", - "common.confirmTimedOut": "Bei der Bestätigung ist ein Timeout aufgetreten. Bitte versuchen Sie es erneut.", - "common.confirmTransaction.button": "Bestätigen Sie diese Transaktion in Ihrem Wallet", - "common.confirmWallet": "Im Wallet bestätigen", - "common.connect.button": "Verbinden", - "common.connectAWallet.button": "Verbinden Sie eine Brieftasche", - "common.connectingWallet": "Geldbörse wird verbunden...", - "common.connectWallet.button": "Geldbörse verbinden", - "common.contactUs.button": "Kontaktiere uns", - "common.contractInteraction": "Vertragsinteraktion", - "common.copied": "Kopiert", - "common.copy.address": "Adresse kopieren", - "common.copyLink.button": "Link kopieren", - "common.create": "Erstellen", - "common.create.pool.cancelled": "Pool-Erstellung abgebrochen", - "common.create.pool.failed": "Erstellen des Pools fehlgeschlagen", - "common.created.pool": "Pool erstellt", - "common.creating.pool": "Pool erstellen", - "common.currency": "Währung", - "common.currentPrice": "Derzeitiger Preis", - "common.currentPrice.label": "Derzeitiger Preis:", - "common.currentPrice.unavailable": "Aktueller Preis nicht verfügbar", - "common.custom": "Brauch", - "common.customRange": "Benutzerdefiniertes Sortiment", - "common.dataOutdated": "Daten können veraltet sein", - "common.default": "Standard", - "common.defaultTradeOptions": "Standard-Handelsoptionen", - "common.delegate.cancelled": "Delegierter abgesagt", - "common.delegate.failed": "Delegieren fehlgeschlagen", - "common.delegated": "Delegiert", - "common.delegating": "Delegieren", - "common.deploy.cancelled": "Bereitstellung abgebrochen", - "common.deploy.failed": "Bereitstellung fehlgeschlagen", - "common.deployed": "Bereitgestellt", - "common.deploying": "Bereitstellen", - "common.deposit.cancelled": "Anzahlung storniert", - "common.deposit.failed": "Einzahlung fehlgeschlagen", - "common.deposit.toNetwork": "Zahlen Sie Token im {{label}} -Netzwerk ein.", - "common.deposited": "Hinterlegt", - "common.depositing": "Einzahlung", - "common.depositTokens": "Einzahlungstoken", - "common.detailed.label": "Detaillierte", - "common.detected": "Erkannt", - "common.developers": "Entwickler", - "common.dismiss": "Zurückweisen", - "common.displaySettings": "Bildschirmeinstellungen", - "common.dnsRegistrar": "DNS-Registrar", - "common.donate": "Spenden", - "common.dontShowAgain": "Nicht mehr anzeigen", - "common.download": "Herunterladen", - "common.downloadAppStore": "Download im App Store", - "common.downloadPlayStore": "Download im Play Store", - "common.downloadUniswap": "Uniswap herunterladen", - "common.downloadUniswapApp": "Laden Sie die Uniswap-App herunter", - "common.dynamic": "Dynamisch", - "common.edit.button": "Bearbeiten", - "common.error.general": "Etwas ist schief gelaufen", - "common.error.label": "Fehler", - "common.error.request": "Leider ist bei der Bearbeitung Ihrer Anfrage ein Fehler aufgetreten. Wenn Sie Support anfordern, kopieren Sie bitte die Details dieses Fehlers.", - "common.error.somethingWrong": "Etwas ist schief gelaufen!", - "common.error.wrong.tryAgain": "Etwas ist schief gelaufen. Bitte versuche es erneut.", - "common.errorConnecting.error": "Fehler beim Verbinden", - "common.errorLoadingData.error": "Fehler beim Laden der Daten", - "common.ethereumNameService": "Ethereum-Namensdienst", - "common.etherscan": "Etherscan", - "common.etherscan.link": "Auf Etherscan anzeigen", - "common.ethRegistrarController": "ETH Registrar Controller", - "common.execute.cancelled": "Ausführen abgebrochen", - "common.execute.failed": "Ausführung fehlgeschlagen", - "common.executed": "Hingerichtet", - "common.executing": "Ausführen", - "common.expired": "Abgelaufen", - "common.expiry": "Ablauf", - "common.explore": "Erkunden", - "common.explorer": "Forscher", - "common.exploreTokens": "Token erkunden", - "common.extension": "Uniswap-Erweiterung", - "common.failed.error": "Fehlgeschlagen", - "common.failedSwitchNetwork": "Netzwerkwechsel fehlgeschlagen", - "common.fee": "Gebühr", - "common.fees": "Gebühren", - "common.feesEarned.label": "{{symbol}} Verdiente Gebühren:", - "common.feesEarnedPerBase": "{{symbolA}} pro {{symbolB}}", - "common.fetchingRoute": "Route wird abgerufen", - "common.floor": "Boden", - "common.floorPrice": "Mindestpreis", - "common.for": "Für", - "common.fullRange": "Vollständige Palette", - "common.getApp": "Die App holen", - "common.getHelp.button": "Hilfe bekommen", - "common.getStarted": "Erste Schritte", - "common.getSupport.button": "Hole dir Unterstützung", - "common.getTheApp": "Hol dir die App", - "common.getUniswapWallet": "Holen Sie sich das Uniswap Wallet", - "common.governance": "Führung", - "common.happyHolidays": "Schöne Feiertage wünscht das Uniswap-Team!", - "common.helpCenter": "Hilfezentrum", - "common.hidden": "Versteckt", - "common.hide.button": "Verstecken", - "common.highPrice": "Hoher Preis", - "common.includes": "Enthält", - "common.info.label": "Die Info", - "common.input.noRecipient.error": "Empfänger auswählen", - "common.input.password.confirm": "Bestätige das Passwort", - "common.input.password.error.mismatch": "Passwörter stimmen nicht überein", - "common.input.password.error.weak": "Dieses Passwort ist zu schwach", - "common.input.password.new": "Neues Kennwort", - "common.input.password.placeholder": "Passwort", - "common.input.password.strength.medium": "Mittel", - "common.input.password.strength.strong": "Stark", - "common.input.password.strength.weak": "Schwach", - "common.input.search": "Suchen", - "common.insufficient.funds": "Unzureichende Mittel", - "common.insufficientBalance.error": "Mangelhaftes Gleichgewicht", - "common.insufficientFundsForNetworkFee.error": "Unzureichende Mittel zur Deckung der Netzwerkkosten", - "common.insufficientLiquidity": "Unzureichende Liquidität", - "common.insufficientTokenBalance.error": "Unzureichendes {{tokenSymbol}} Guthaben", - "common.insufficientTokenBalance.error.simple": "Unzureichend {{tokenSymbol}}", - "common.invalidPair": "Ungültiges Paar", - "common.invalidRecipient.error": "Ungültiger Empfänger", - "common.iOSAndroid": "iOS und Android", - "common.language": "Sprache", - "common.lastPrice": "Letzter Preis", - "common.learnMoreSwap": "Erfahren Sie mehr über Swaps", - "common.legalAndPrivacy": "Rechtliches & Datenschutz", - "common.less": "Weniger", - "common.limit.cancel_one": "Limit abbrechen", - "common.limit.cancel_other": "{{count}} -Grenzen aufheben", - "common.limit.cancelled": "Limit aufgehoben", - "common.limit.executed": "Limit ausgeführt", - "common.limit.expired": "Limit abgelaufen", - "common.limit.failed": "Begrenzung fehlgeschlagen", - "common.limit.opened": "Limit geöffnet", - "common.limit.pending": "Limit ausstehend", - "common.limits": "Grenzen", - "common.limits.approachMax": "Nähert sich dem Höchstlimit von 100", - "common.limits.cancelProceed": "Brechen Sie die Limits ab, um fortzufahren", - "common.limits.expires": "Läuft ab {{timestamp}}", - "common.limits.open": "Offene Grenzen", - "common.limits.when": "wenn {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "Links", - "common.liquidity": "Liquidität", - "common.liquidity.removed": "Liquidität entfernt", - "common.loading": "Wird geladen", - "common.loadingAllowance": "Zuladung", - "common.loadMore": "Mehr laden", - "common.longText.button.less": "Lese weniger", - "common.longText.button.more": "Mehr lesen", - "common.lowPrice": "Niedriger Preis", - "common.manage": "Verwalten", - "common.market.label": "Markt", - "common.max": "Max", - "common.migrate": "Wandern", - "common.migrate.liquidity.cancelled": "Liquiditätsmigration abgebrochen", - "common.migrate.liquidity.failed": "Liquiditätsmigration fehlgeschlagen", - "common.migrate.position": "Position migrieren", - "common.migrate.v3": "Migrieren zu V3", - "common.migrated.liquidity": "Migrierte Liquidität", - "common.migrating.liquidity": "Liquiditätsmigration", - "common.min": "Mindest", - "common.mint.cancelled": "Postfrisch gestempelt", - "common.mint.failed": "Mint ist fehlgeschlagen", - "common.minted": "Geprägt", - "common.minting": "Prägung", - "common.mobile": "Mobile", - "common.more": "Mehr", - "common.multiDevice": "Mehrere Geräte", - "common.navigation.settings": "Einstellungen", - "common.navigation.systemSettings": "Einstellungen", - "common.navigationButton": "Navigationsschaltfläche", - "common.needHelp": "Brauchen Sie Hilfe?", - "common.networkCost": "Netzwerkkosten", - "common.neverMind": "Egal", - "common.new": "Neu", - "common.new.exclamation": "Neu!", - "common.nfts": "NFTs", - "common.noActivity": "Noch keine Aktivität", - "common.noAmount.error": "Geben Sie einen Betrag ein", - "common.noData": "Keine Daten", - "common.noResults": "keine Ergebnisse gefunden.", - "common.notAvailableInRegion.error": "In Ihrer Region nicht verfügbar", - "common.notCreated.label": "Nicht erstellt", - "common.notSupported": "Nicht unterstützt", - "common.oneDay": "1 Tag", - "common.oneHour": "1 Stunde", - "common.oneMonth": "1 Monat", - "common.oneWeek": "1 Woche", - "common.oneYear": "1 Jahr", - "common.orderCancelled": "Bestellung storniert", - "common.orderExecuted": "Auftrag ausgeführt", - "common.orderExpired": "Bestellung abgelaufen", - "common.orderPending": "Bestellung anstehend", - "common.outOfRange": "Außer Reichweite", - "common.pageNotFound": "Seite nicht gefunden!", - "common.passkey": "Hauptschlüssel", - "common.pastDay": "Vergangener Tag", - "common.pastFiveMinutes": "Nach fünf Minuten", - "common.pastHour": "Letzte Stunde", - "common.pastMonth": "Letzten Monat", - "common.pastWeek": "Letzte Woche", - "common.pastYear": "Vergangenes Jahr", - "common.pay.button": "Zahlen", - "common.pending": "Ausstehend", - "common.pending.cancellation": "Ausstehende Stornierung", - "common.pendingEllipsis": "Ausstehend...", - "common.permit2": "Genehmigung2", - "common.pool": "Schwimmbad", - "common.pools": "Schwimmbecken", - "common.positionUnavailable": "Position nicht verfügbar", - "common.poweredBy": "Unterstützt von ", - "common.preview": "Vorschau", - "common.price": "Preis", - "common.priceImpact": "Preisauswirkungswarnung", - "common.priceUpdated": "Preis aktualisiert", - "common.privacyChoices": "Ihre Datenschutz-Einstellungen", - "common.privacyChoices.checkbox.description": "Wenn diese Option aktiviert ist, geben wir Ihre Daten nicht für personalisierte Werbung an Drittanbieterpartner weiter. Sie können die Weitergabe jederzeit aktivieren, indem Sie dieses Kontrollkästchen deaktivieren.", - "common.privacyChoices.checkbox.label": "Meine Daten nicht weitergeben", - "common.privacyChoices.description": "Wir können Gerätekennungen an unsere Werbepartner weitergeben, um unsere Dienste auf anderen Websites und Plattformen zu bewerben. Wenn dies nach geltendem Recht als Verkauf, Weitergabe oder gezielte Werbung gilt, können Sie sich davon abmelden, indem Sie das Kontrollkästchen „Meine Daten nicht weitergeben“ aktivieren. Weitere Informationen zu unseren Datenschutzpraktiken finden Sie in unserer Datenschutzrichtlinie.", - "common.privacyChoices.disclaimer": "Bitte beachten Sie, dass Ihre Auswahl nur für diesen Browser auf diesem Gerät gilt. Sie können sich auch abmelden, indem Sie die Einstellung Globale Datenschutzkontrolle in dem Browser aktivieren, mit dem Sie auf unsere Dienste zugreifen. Weitere Optionen finden Sie in Ihren Einstellungen.", - "common.privacyPolicy": "Datenschutzrichtlinie", - "common.proceed": "Fortfahren", - "common.proceedInWallet": "Weiter in Ihrem Portemonnaie", - "common.proceedInWallet.short": "Weiter im Portemonnaie", - "common.protocol": "Protokoll", - "common.publicResolver": "Öffentlicher Resolver", - "common.purchased": "Gekauft", - "common.queue.cancelled": "Warteschlange abgebrochen", - "common.queue.failed": "Warteschlange fehlgeschlagen", - "common.queued": "In Warteschlange", - "common.queuing": "Warteschlange", - "common.rate": "Rate", - "common.readMore": "Mehr lesen", - "common.receive": "Erhalten", - "common.receive.cancelled": "Empfangen abgebrochen", - "common.receive.failed": "Empfang fehlgeschlagen", - "common.received": "Erhalten", - "common.receiving": "Empfang", - "common.recent": "Jüngste", - "common.rejected": "Abgelehnt", - "common.reload.label": "Laden Sie die App neu", - "common.remove.label": "Entfernen", - "common.remove.liquidity.cancelled": "Liquidität entfernen abgebrochen", - "common.remove.liquidity.failed": "Liquidität entfernen fehlgeschlagen", - "common.removeAmount": "Betrag entfernen", - "common.removedLiquidity": "Entfernte Liquidität", - "common.removeItem": "Gegenstand entfernen", - "common.removing.liquidity": "Liquidität entfernen", - "common.repaid": "Zurückgezahlt", - "common.repay.cancelled": "Rückzahlung storniert", - "common.repay.failed": "Rückzahlung fehlgeschlagen", - "common.repaying": "Rückzahlung", - "common.resetLimit": "Limit {{symbol}} zurücksetzen", - "common.resetLimitWallet": "Limit von {{symbol}} im Portemonnaie zurücksetzen", - "common.resettingLimit": "Limit {{symbol}} wird zurückgesetzt …", - "common.resolveIssues_one": "Problem beheben", - "common.resolveIssues_other": "{{count}} Probleme lösen", - "common.restricted.region": "Eingeschränkter Bereich", - "common.return.label": "Zurückkehren", - "common.returnToTop": "Zurück nach oben", - "common.reverseRegistrar": "Reverse-Registrar", - "common.revoke.approval.failed": "Widerruf der Genehmigung fehlgeschlagen", - "common.revoked.approval": "Widerruf der Genehmigung", - "common.revokedApproval": "Widerrufene Genehmigung", - "common.revoking.approval": "Genehmigung widerrufen", - "common.samePrice": "Gleicher Preis", - "common.scanQRDownload": "Scannen Sie den QR-Code mit Ihrem Telefon, um ihn herunterzuladen", - "common.selectRegion.label": "Wählen Sie Ihre Region", - "common.selectToken.label": "Wählen Sie ein Token aus", - "common.selfCustodial": "Selbstverwahrung", - "common.sell.label": "Verkaufen", - "common.send.button": "Schicken", - "common.send.cancelled": "Senden abgebrochen", - "common.send.failed": "Senden fehlgeschlagen", - "common.sending": "Versendung", - "common.sent": "Gesendet", - "common.settings": "Einstellungen", - "common.share": "Aktie", - "common.share.shareToTwitter": "Auf Twitter teilen", - "common.share.twitter": "Auf Twitter teilen", - "common.show.button": "Zeigen", - "common.showLess.button": "Zeige weniger", - "common.showMore.button": "Zeig mehr", - "common.signatureExpired": "Ihre Signatur ist abgelaufen.", - "common.signMessage": "Nachricht signieren", - "common.signMessageWallet": "Nachricht im Wallet unterschreiben", - "common.simple.label": "Einfach", - "common.sold": "Verkauft", - "common.stats": "Statistiken", - "common.status": "Status", - "common.stayConnected": "In Verbindung bleiben", - "common.step.number": "Schritt {{number}}", - "common.submit.proposal.cancelled": "Vorschlag einreichen abgebrochen", - "common.submit.proposal.failed": "Senden des Vorschlags fehlgeschlagen", - "common.submitted.proposal": "Eingereichter Vorschlag", - "common.submitting.proposal": "Vorschlag einreichen", - "common.success": "Erfolg", - "common.swap": "Tauschen", - "common.swap.cancelled": "Tausch abgebrochen", - "common.swap.expired": "Swap abgelaufen", - "common.swap.failed": "Austausch fehlgeschlagen", - "common.swapped": "Ausgetauscht", - "common.swapPending": "Swap ausstehend...", - "common.swapping": "Austauschen", - "common.switchNetworks": "Netzwerke wechseln", - "common.termsOfService": "Nutzungsbedingungen", - "common.text.connected": "In Verbindung gebracht", - "common.text.contract": "Vertrag", - "common.text.disconnected": "Getrennt", - "common.text.error": "Fehler", - "common.text.notAvailable": "N / A", - "common.text.recipient": "Zu", - "common.text.sender": "Aus", - "common.text.unknown": "Unbekannt", - "common.thisMonth": "Diesen Monat", - "common.thisWeek": "Diese Woche", - "common.thisYear": "Dieses Jahr", - "common.time": "Zeit", - "common.time.days": "Tage", - "common.time.days_one": "Tag", - "common.time.days_other": "Tage", - "common.time.hours": "Std.", - "common.time.hours_one": "Stunde", - "common.time.hours_other": "Std.", - "common.time.minute.amt": "{{time}}m", - "common.time.minutes": "Protokoll", - "common.time.months": "Monate", - "common.time.months_one": "Monat", - "common.time.months_other": "Monate", - "common.time.past.days": "vor {{days}}Tagen", - "common.time.past.hours": "vor {{hours}}Stunden", - "common.time.past.minutes": "vor {{minutes}} Monaten", - "common.time.past.months": "vor {{months}}Monaten", - "common.time.past.seconds": "vor {{seconds}}Sek.", - "common.time.weeks": "Wochen", - "common.time.weeks_one": "Woche", - "common.time.weeks_other": "Wochen", - "common.tip.label": "Tipp:", - "common.to": "zu", - "common.today": "Heute", - "common.tokenA": "Token A", - "common.tokenAmount": "Token-Betrag", - "common.tokenB": "Token B", - "common.tokenName": "Tokenname", - "common.tokens": "Token", - "common.totalValueLocked": "TVL", - "common.trade": "Handel", - "common.trademarkPolicy": "Markenrichtlinie", - "common.transactionDetails": "Details der Transaktion", - "common.transactionId": "Transaktions-ID", - "common.transactionPending": "Transaktion ausstehend", - "common.transactions": "Transaktionen", - "common.transactionSettings": "Transaktionseinstellungen", - "common.transactionSubmitted": "Transaktion übermittelt", - "common.transfer_one": "überweisen", - "common.transfer_other": "Überweisungen", - "common.tryAgain.error": "Versuchen Sie es erneut", - "common.twitter": "Þjórsárdalur", - "common.type.label": "Typ", - "common.unavailable": "Nicht verfügbar", - "common.uniGovernance": "UNI-Verwaltung", - "common.uniswapMobile": "Uniswap Mobile", - "common.uniswapProtocol": "Uniswap-Protokoll", - "common.uniswapTVL": "Uniswap TVL", - "common.uniswapWallet": "Uniswap-Geldbörse", - "common.uniswapX": "UniswapX", - "common.unknown": "Unbekannt", - "common.unknownApproval": "Unbekannte Genehmigung", - "common.unknownBridge": "Unbekannte Brücke", - "common.unknownError.error": "Unbekannter Fehler", - "common.unknownLend": "Unbekannte Leihgabe", - "common.unknownMint": "Unbekannte Münzstätte", - "common.unknownSend": "Unbekannt Senden", - "common.unknownSwap": "Unbekannter Tausch", - "common.unsupportedAsset_one": "Nicht unterstütztes Asset", - "common.unsupportedAsset_other": "Nicht unterstützte Assets", - "common.unwrap.button": "Auspacken", - "common.unwrap.failed": "Entpacken fehlgeschlagen", - "common.unwrapped": "Ausgepackt", - "common.unwrapping": "Auspacken", - "common.view.profile": "Profil ansehen", - "common.viewOnBlockExplorer": "Im Block Explorer anzeigen", - "common.viewOnExplorer": "Im Explorer anzeigen", - "common.volume": "Volumen", - "common.vote": "Abstimmung", - "common.vote.cancelled": "Abstimmung abgebrochen", - "common.vote.failed": "Abstimmung fehlgeschlagen", - "common.voted": "Abgestimmt", - "common.voting": "Wählen", - "common.wallet.approve": "Im Wallet genehmigen", - "common.wallet.label": "Geldbörse", - "common.walletForSwapping": "Die Wallet zum Tauschen. Verfügbar für iOS und Android.", - "common.warning": "Warnung", - "common.webApp": "Web-App", - "common.website": "Webseite", - "common.whyApprove": "Warum muss ich ein Token genehmigen?", - "common.whySign": "Warum sind Unterschriften erforderlich?", - "common.whyWrap": "Warum muss ich mein {{symbol}}umbrechen?", - "common.withdraw.failed": "Auszahlung fehlgeschlagen", - "common.withdrawal.amount": "Auszahlungsbetrag", - "common.withdrawal.cancelled": "Auszahlung storniert", - "common.withdrawing": "Abheben", - "common.withdrew": "Zurückgezogen", - "common.withinRange": "Im Bereich", - "common.wrap": "Umbruch {{symbol}}", - "common.wrap.button": "Wickeln", - "common.wrap.cancelled": "Wrap abgebrochen", - "common.wrap.failed": "Umbruch fehlgeschlagen", - "common.wrapIn": "Wickeln Sie {{symbol}} in eine Brieftasche", - "common.wrapped": "Eingewickelt", - "common.wrapping": "Verpackung", - "common.wrappingToken": "Umbruch von {{symbol}}...", - "common.wrongNetwork": "Falsches Netzwerk", - "common.your.account.had.insufficient.funds": "Ihr Konto verfügte nicht über ausreichende Mittel, um diesen Tausch abzuschließen.", - "common.your.account.has.insufficient.funds": "Ihr Konto verfügt nicht über ausreichende Mittel, um diesen Tausch abzuschließen.", - "common.your.limit.could.not.be.fulfilled": "Ihr Limit konnte zu diesem Zeitpunkt nicht erreicht werden. Bitte versuchen Sie es erneut.", - "common.your.swap.could.not.be.fulfilled": "Ihr Tausch konnte derzeit nicht durchgeführt werden. Bitte versuchen Sie es erneut.", - "common.youreBuying": "Sie kaufen", - "common.youReceive": "Du erhältst", - "common.youreSending": "Sie senden", - "common.youWillReceive": "Du wirst erhalten", - "currency.aud": "Australischer Dollar", - "currency.brl": "brasilianischer Real", - "currency.cad": "Kanadischer Dollar", - "currency.cny": "Chinesische Yuan", - "currency.eur": "Euro", - "currency.gbp": "Britisches Pfund", - "currency.hkd": "Hongkong Dollar", - "currency.idr": "Indonesische Rupiah", - "currency.inr": "Indische Rupie", - "currency.jpy": "Japanische YEN", - "currency.krw": "Südkoreanischer Won", - "currency.ngn": "Nigerianischer Naira", - "currency.pkr": "Pakistanische Rupie", - "currency.rub": "russischer Rubel", - "currency.sgd": "Singapur-Dollar", - "currency.thb": "Thailändischer Baht", - "currency.try": "Türkische Lire", - "currency.uah": "Ukrainische Griwna", - "currency.usd": "US-Dollar", - "currency.vnd": "Vietnamesischer Dong", - "dapp.request.approve.action": "Genehmigen", - "dapp.request.approve.fallbackTitle": "Genehmigen Sie dieser Site den Zugriff auf Token", - "dapp.request.approve.helptext": "Erlauben Sie dieser Site den Zugriff und geben Sie dieses Token für Transaktionen aus. Stellen Sie sicher, dass Sie dieser Site vertrauen.", - "dapp.request.approve.label": "Geldbörse", - "dapp.request.approve.title": "Zugriff auf {{tokenSymbol}}genehmigen", - "dapp.request.base.title": "Transaktionsanfrage", - "dapp.request.bridge.description": "Verschieben Sie ETH, USDC und mehr über {{numChains}}+ Netzwerke.", - "dapp.request.bridge.title": "Versuchen Sie eine Brücke zu bauen?", - "dapp.request.connect.helptext": "Erlauben Sie dieser Site, Ihre Wallet-Adresse und Ihren Kontostand anzuzeigen und Genehmigungen für Transaktionen anzufordern.", - "dapp.request.connect.title": "Mit Site verbinden", - "dapp.request.fallback.calldata.label": "Rohdaten", - "dapp.request.fallback.function.label": "Funktion", - "dapp.request.permit2.description": "Permit2 verwaltet Token-Genehmigungen über mehrere Dapps hinweg.", - "dapp.request.permit2.header": "Unterschreiben Genehmigung2", - "dapp.request.reject.action": "Alles ablehnen", - "dapp.request.reject.info": "Sie haben {{totalRequestCount}} Transaktionsanfragen", - "dapp.request.revoke.action": "Widerrufen", - "dapp.request.revoke.helptext": "Erlauben Sie dieser Site, den Zugriff zu widerrufen, um dieses Token für Transaktionen auszugeben. Stellen Sie sicher, dass Sie dieser Site vertrauen.", - "dapp.request.revoke.title": "Zugriff auf {{tokenSymbol}}widerrufen", - "dapp.request.signature.containsUnrenderableCharacters": "Diese Nachricht enthält nicht darstellbare Zeichen. Stellen Sie sicher, dass Sie dieser Site vertrauen.", - "dapp.request.signature.error.712-spec-compliance": "SignTypedDataRequestContent hat Daten zum Signieren empfangen, die nicht der EIP-712-Spezifikation entsprechen.", - "dapp.request.signature.header": "Unterschriftenanfrage", - "dapp.request.signature.toggleDataView.raw": "Rohdaten anzeigen", - "dapp.request.signature.toggleDataView.readable": "Originaldaten anzeigen", - "dapp.request.warning.notActive.message": "Stellen Sie sicher, dass es das Richtige ist", - "dapp.request.warning.notActive.title": "Dies ist nicht Ihr aktives Wallet", - "downloadApp.modal.alreadyHaveWallet": "Haben Sie bereits eine Brieftasche? ", - "downloadApp.modal.alreadyHaveWallet.signInLink": "Hier anmelden", - "downloadApp.modal.getStarted.description": "Laden Sie zunächst das Uniswap Wallet herunter, das auf Ihrem Telefon oder Browser verfügbar ist.", - "downloadApp.modal.getStarted.title": "Erste Schritte mit Uniswap", - "downloadApp.modal.signUp.description": "Laden Sie zunächst das Uniswap Wallet herunter, das auf Ihrem Telefon oder Browser verfügbar ist.", - "downloadApp.modal.signUp.description.embeddedWallet": "Legen Sie in Sekundenschnelle los, indem Sie sich unten anmelden oder unser Wallet herunterladen, das auf Ihrem Telefon oder in Ihrem Browser verfügbar ist.", - "downloadApp.modal.signUp.title": "Melden Sie sich bei Uniswap an", - "downloadApp.modal.uniswapProducts.subtitle": "Uniswap-Produkte arbeiten nahtlos zusammen, um das beste Onchain-Erlebnis zu schaffen.", - "error.access.expiry": "Dies ermöglicht dem Uniswap-Protokoll den Zugriff auf Ihr Token für den Handel. Aus Sicherheitsgründen läuft es nach 30 Tagen ab.", - "error.dataUnavailable": "Daten sind momentan nicht verfügbar. Wir arbeiten an einer Lösung.", - "error.id": "Fehler-ID: {{eventId}}", - "error.noData": "Keine Daten gefunden", - "error.request.provideId": "Leider ist bei der Bearbeitung Ihrer Anfrage ein Fehler aufgetreten. Geben Sie bei der Supportanfrage unbedingt Ihre Fehler-ID an.", - "error.tokenApproval": "Token-Genehmigung fehlgeschlagen", - "error.tokenApprovalEdited": "Unzureichender Genehmigungsbetrag", - "error.tokenApprovalEdited.message": "Der in Ihrem Wallet festgelegte Genehmigungsbetrag ist zu niedrig, um diese Transaktion abzuschließen. Bitte versuchen Sie es erneut und erhöhen Sie den Betrag.", - "errors.crash.message": "Etwas ist abgestürzt.", - "errors.crash.restart": "App neu starten", - "errors.crash.title": "Oh oh!", - "explore.more.pools": "Weitere Pools entdecken", - "explore.search.action.clear": "Klar", - "explore.search.action.viewEtherscan": "Ansicht auf {{blockExplorerName}}", - "explore.search.empty.full": "Keine Ergebnisse gefunden für \"{{searchQuery}}\"", - "explore.search.error": "Suchergebnisse konnten nicht geladen werden", - "explore.search.label.ownedBy": "Im Besitz von {{ownerAddress}}", - "explore.search.placeholder": "Suche nach Token und Wallets", - "explore.search.section.nft": "NFT-Sammlungen", - "explore.search.section.popularNFT": "Beliebte NFT-Sammlungen", - "explore.search.section.popularTokenInfo": "Beliebte Token werden anhand ihres Handelsvolumens auf Uniswap in den letzten 24 Stunden identifiziert.", - "explore.search.section.popularTokens": "Beliebte Token", - "explore.search.section.recent": "Letzte Suchanfragen", - "explore.search.section.tokens": "Token", - "explore.search.section.wallets": "Geldbörsen", - "explore.tokens.error": "Token konnten nicht geladen werden", - "explore.tokens.favorite.action.add": "Lieblingstoken", - "explore.tokens.favorite.action.edit": "Favoriten bearbeiten", - "explore.tokens.favorite.action.remove": "Favorit entfernen", - "explore.tokens.favorite.title.default": "Lieblingstoken", - "explore.tokens.favorite.title.edit": "Favoriten-Token bearbeiten", - "explore.tokens.metadata.marketCap": "{{number}} MCap", - "explore.tokens.metadata.totalValueLocked": "{{number}} TVL", - "explore.tokens.metadata.volume": "{{number}} Lautstärke", - "explore.tokens.sort.label.marketCap": "Marktkapitalisierung", - "explore.tokens.sort.label.priceDecrease": "Preissenkung", - "explore.tokens.sort.label.priceIncrease": "Preisanstieg", - "explore.tokens.sort.label.totalValueLocked": "TVL", - "explore.tokens.sort.label.volume": "Volumen", - "explore.tokens.sort.option.marketCap": "Marktkapitalisierung", - "explore.tokens.sort.option.priceDecrease": "Preissenkung (24H)", - "explore.tokens.sort.option.priceIncrease": "Preiserhöhung (24H)", - "explore.tokens.sort.option.totalValueLocked": "Uniswap TVL", - "explore.tokens.sort.option.volume": "Uniswap-Volumen (24 Std.)", - "explore.tokens.top.title": "Top-Token", - "explore.unableToDisplayHistorical": "Historische Volumendaten für die aktuelle Kette können nicht angezeigt werden.", - "explore.unableToDisplayHistoricalTVL": "Historische TVL-Daten für die aktuelle Kette können nicht angezeigt werden.", - "explore.uniVolume": "Uniswap-Volumen", - "explore.wallets.favorite.action.add": "Lieblings-Geldbörse", - "explore.wallets.favorite.action.edit": "Favoriten bearbeiten", - "explore.wallets.favorite.action.remove": "Favorit entfernen", - "explore.wallets.favorite.title.default": "Lieblings-Geldbörsen", - "explore.wallets.favorite.title.edit": "Favoriten-Wallets bearbeiten", - "extension.connection.networks": "Netzwerke", - "extension.connection.popup": "Ihr Wallet ist nicht mit dieser Site verbunden. Suchen Sie nach der Schaltfläche „Wallet verbinden“ oder „Anmelden“.", - "extension.connection.popup.trouble": "Probleme beim Verbinden?", - "extension.connection.popupWithButton": "Ihr Wallet ist nicht mit dieser Site verbunden.", - "extension.connection.titleConnected": "In Verbindung gebracht", - "extension.connection.titleNotConnected": "Nicht verbunden", - "extension.lock.button.forgot": "Passwort vergessen?", - "extension.lock.button.reset": "Brieftasche zurücksetzen", - "extension.lock.button.submit": "Freischalten", - "extension.lock.password.error": "Falsches Passwort. Versuchen Sie es erneut.", - "extension.lock.password.reset.initial.description": "Uniswap kann Ihnen bei der Wiederherstellung Ihres Passworts nicht helfen. Sie müssen Ihr Wallet zurücksetzen, indem Sie Ihre 12 Wörter umfassende Wiederherstellungsphrase erneut eingeben.", - "extension.lock.password.reset.initial.help": "Wo finde ich meine Wiederherstellungsphrase?", - "extension.lock.password.reset.initial.title": "Passwort vergessen", - "extension.lock.password.reset.speedbump.description": "Stellen Sie sicher, dass Sie Ihre 12 Wörter umfassende Wiederherstellungsphrase haben, bevor Sie Ihr Wallet zurücksetzen. Andernfalls können Sie Ihr Guthaben nicht wiederherstellen.", - "extension.lock.password.reset.speedbump.help": "Ich habe meine Wiederherstellungsphrase verloren", - "extension.lock.password.reset.speedbump.title": "Bevor Sie fortfahren", - "extension.lock.subtitle": "Geben Sie zum Entsperren Ihr Passwort ein", - "extension.lock.title": "Willkommen zurück", - "extension.network.notSupported": "Nicht unterstütztes Netzwerk", - "extension.open": "Öffnen Sie die Uniswap-Erweiterung", - "extension.popup.chrome.button": "Erweiterung öffnen", - "extension.popup.chrome.description": "Schließen Sie diese Aktion ab, indem Sie die Uniswap-Erweiterung öffnen.", - "extension.popup.chrome.title": "Weiter in Uniswap", - "extension.settings.password.enter.title": "Gib dein aktuelles Passwort ein", - "extension.settings.password.error.wrong": "Falsches Passwort", - "extension.settings.password.placeholder": "Aktuelles Passwort", - "extension.warning.storage.button": "Sichern", - "extension.warning.storage.message": "Denken Sie unbedingt daran, Ihre Wiederherstellungsphrase zu sichern, damit Sie den Zugriff auf Ihr Wallet und Ihre Guthaben nicht verlieren.", - "extension.warning.storage.title": "Ihr Browser hat nicht genügend Speicherplatz", - "fee.bestForExotic": "Am besten für exotische Paare.", - "fee.bestForMost": "Am besten für die meisten Paare.", - "fee.bestForStablePairs": "Am besten für stabile Paare.", - "fee.bestForVeryStable": "Am besten für sehr stabile Paare.", - "fee.dynamic": "Dynamische Gebühr", - "fee.percentEarned": "Der Prozentsatz, den Sie an Gebühren verdienen.", - "fee.selectPercent": "{{pct}}% auswählen", - "fee.selectPercentDescription": "{{pct}}% der Liquidität haben diese Stufe ausgewählt", - "fee.tier": "Gebührenstufe", - "fee.tier.create": "Gebührenstufe erstellen", - "fee.tier.create.button": "Neue Gebührenstufe erstellen", - "fee.tier.create.description": "Durch das Erstellen einer neuen Ebene wird ein neuer Pool initialisiert, was zu höheren Netzwerkkosten als üblich führt.", - "fee.tier.description": "Der durch die Bereitstellung von Liquidität verdiente Betrag. Wählen Sie einen Betrag, der Ihrer Risikobereitschaft und Strategie entspricht.", - "fee.tier.description.v2": "Der durch die Bereitstellung von Liquidität verdiente Betrag. Alle v2-Pools haben feste Gebühren von 0,3 %. Für weitere Optionen bieten Sie Liquidität auf v4 an.", - "fee.tier.dynamic": "Dynamische Gebührenstufe", - "fee.tier.dynamic.create": "Dynamische Gebührenstufe erstellen", - "fee.tier.dynamic.create.info": "Sie sind dabei, einen Pool mit einer dynamischen Gebührenstufe zu erstellen. Stellen Sie vor dem Fortfahren sicher, dass der ausgewählte Hook dynamische Gebühren unterstützt.", - "fee.tier.highestTvl": "Höchster TVL", - "fee.tier.label": "Der Prozentsatz, den Sie an Gebühren verdienen", - "fee.tier.missing.description": "Sie können die gewünschte Stufe nicht finden?", - "fee.tier.new": "Neue Stufe", - "fee.tier.percent.select": "{{percentage}} auswählen", - "fee.tier.recommended.description": "Empfohlen basierend auf dem höchsten Liquiditätsanteil für das ausgewählte Token-Paar.", - "fee.tier.search": "Suchen oder erstellen Sie andere Gebührenstufen", - "fee.tier.search.short": "Suchebenen", - "fee.tier.select": "Gebührenstufe auswählen", - "fee.tier.select.existing.button": "Vorhandene Gebührenstufe auswählen", - "fee.tierExact": "{{fee}} Gebührenstufe", - "fee.unavailable": "Verdiente Gebühren sind für v2-Positionen nicht sichtbar, bis die Liquidität entfernt wird.", - "fee.uncollected": "Beinhaltet nicht eingezogene Gebühren:", - "fiatOffRamp.checkout.title": "Verkaufen mit", - "fiatOffRamp.connection.quote": "Verkaufe {{currencySymbol}}im Wert von {{amount}}", - "fiatOffRamp.error.balance": "Überschreitet das Guthaben", - "fiatOffRamp.summary.total": "{{cryptoAmount}} für {{fiatAmount}}", - "fiatOffRamp.unsupportedToken.back": "Geh zurück", - "fiatOffRamp.unsupportedToken.divider": "Nicht unterstützte Token", - "fiatOffRamp.unsupportedToken.message": "Der Verkauf dieses Tokens wird nicht unterstützt. Tauschen Sie diesen Vermögenswert gegen einen der unterstützten Token aus.", - "fiatOffRamp.unsupportedToken.swap": "Wechsel zu einem unterstützten Token", - "fiatOffRamp.unsupportedToken.title": "Nicht unterstütztes Token", - "fiatOffRamp.welcome.tooltip": "Verkaufen Sie Ihre Kryptowährung über Ihr Bankkonto oder Ihre Debitkarte.", - "fiatOnRamp.button.chooseToken": "Token auswählen", - "fiatOnRamp.cexTransferModal.description": "Der Kauf von Kryptowährungen mit einer Karte wird in Ihrer Region nicht unterstützt. Übertragen Sie Vermögenswerte von einem zentralisierten Börsenkonto, um Ihr Wallet aufzufüllen.", - "fiatOnRamp.cexTransferModal.title": "Überweisen, um loszulegen", - "fiatOnRamp.checkout.title": "Bezahlen mit", - "fiatOnRamp.checkoutWith": "Bezahlen mit", - "fiatOnRamp.chooseProvider.description": "Sie werden zum Portal des Anbieters weitergeleitet, um die mit Ihrer Transaktion verbundenen Gebühren anzuzeigen.", - "fiatOnRamp.completeTransactionHeader": "Transaktion mit {{serviceProvider}}abschließen", - "fiatOnRamp.connection.error": "Verbindung fehlgeschlagen", - "fiatOnRamp.connection.errorDescription": "Beim Verbinden mit {{serviceProvider}}ist ein Fehler aufgetreten.", - "fiatOnRamp.connection.message": "Verbinde Sie mit {{serviceProvider}}", - "fiatOnRamp.connection.quote": "Kauf von {{currencySymbol}}im Wert von {{amount}}", - "fiatOnRamp.connection.terms": "Indem Sie fortfahren, erkennen Sie an, dass für Sie die Servicebedingungen und die Datenschutzrichtlinie bzw. {{serviceProvider}}gelten, soweit zutreffend.", - "fiatOnRamp.continueInTab": "Gehen Sie zur Registerkarte {{serviceProvider}} , um fortzufahren. Sie können dieses Modalfenster jetzt sicher schließen.", - "fiatOnRamp.disclaimer": "Indem Sie fortfahren, erkennen Sie an, dass für Sie die Servicebedingungen und die Datenschutzrichtlinie bzw. {{serviceProvider}}gelten, soweit zutreffend.", - "fiatOnRamp.error.default": "Etwas ist schief gelaufen.", - "fiatOnRamp.error.load": "Token zum Kauf konnten nicht geladen werden", - "fiatOnRamp.error.max": "Maximal {{amount}}", - "fiatOnRamp.error.min": "Mindestens {{amount}}", - "fiatOnRamp.error.noQuotes": "Keine Zitate gefunden.", - "fiatOnRamp.error.unavailable": "Dieser Dienst ist in Ihrer Region nicht verfügbar", - "fiatOnRamp.error.unsupported": "In dieser Region wird es nicht unterstützt", - "fiatOnRamp.error.usd": "Nur in USD erhältlich", - "fiatOnRamp.exchangeRate": "{{outputAmount}} {{outputSymbol}} für {{inputAmount}} {{inputSymbol}}", - "fiatOnRamp.noQuotes.error": "Keine Zitate gefunden", - "fiatOnRamp.purchasedOn": "Gekauft am {{serviceProvider}}", - "fiatOnRamp.quote.advice": "Sie werden zum Portal des Anbieters weitergeleitet, um die mit Ihrer Transaktion verbundenen Gebühren anzuzeigen.", - "fiatOnRamp.quote.type.list": "{{optionsList}}und andere Optionen", - "fiatOnRamp.quote.type.other": "Andere Optionen", - "fiatOnRamp.quote.type.recent": "Kürzlich benutzt", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "Von einem Konto", - "fiatOnRamp.receiveCrypto.title": "Krypto empfangen", - "fiatOnRamp.receiveCrypto.transferFunds": "Finanzieren Sie Ihr Wallet, indem Sie Kryptowährungen von einem anderen Wallet oder Konto übertragen", - "fiatOnRamp.region.placeholder": "Suche nach Land oder Region", - "fiatOnRamp.region.title": "Wählen Sie Ihre Region", - "fiatOnRamp.summary.total": "{{cryptoAmount}} für {{fiatAmount}}", - "forceUpgrade.action.confirm": "Jetzt aktualisieren", - "forceUpgrade.action.learn": "Erfahren Sie, wie Sie aktualisieren", - "forceUpgrade.action.recoveryPhrase": "Wiederherstellungsphrase anzeigen", - "forceUpgrade.description.extension": "Eine neue Version der App ist verfügbar. Um die Uniswap-Erweiterung weiterhin verwenden zu können, aktualisieren Sie sie bitte auf die neueste Version.", - "forceUpgrade.description.wallet": "Eine neue Version der App ist verfügbar. Um das Uniswap Wallet weiterhin nutzen zu können, aktualisieren Sie es bitte auf die neueste Version.", - "forceUpgrade.label.recoveryPhrase": "Wiederherstellungsphrase", - "forceUpgrade.title": "Update auf die neueste Version", - "globalPreferences.title": "Globale Einstellungen", - "hero.scroll": "Scrollen Sie, um mehr zu erfahren", - "hero.subtitle": "Der größte Onchain-Marktplatz. Kaufen und verkaufen Sie Kryptowährungen auf Ethereum und über 11 anderen Chains.", - "hero.swap.title": "Jederzeit und überall
tauschen.", - "hidden.nfts.info.banner.text": "Erfahren Sie mehr über versteckte NFTs", - "hidden.nfts.info.text.button": "Versteckte NFTs ({{numHidden}})", - "hidden.nfts.info.text.extension": "Dies sind potenzielle Betrügereien und NFTs, die Sie ausgeblendet haben. Sie können mit der rechten Maustaste auf ein NFT klicken, um es sichtbar zu machen.", - "hidden.nfts.info.text.mobile": "Dies sind potenzielle Betrügereien und NFTs, die Sie ausgeblendet haben. Sie können lange auf ein NFT drücken, um es sichtbar zu machen.", - "hidden.nfts.info.text.title": "Versteckte NFTs", - "hidden.tokens.info.banner.text": "Erfahren Sie mehr über versteckte Token", - "hidden.tokens.info.text.button": "Versteckte Token ({{numHidden}})", - "hidden.tokens.info.text.info": "Dabei handelt es sich um potenzielle Betrügereien, kleine Guthaben und Token, die Sie versteckt haben. Versteckte Token sind nicht in Ihrem gesamten Wallet-Guthaben enthalten.", - "hidden.tokens.info.text.title": "Versteckte Token", - "home.activity.empty.button": "Erhalten Sie Token oder NFTs", - "home.activity.empty.description.default": "Wenn Sie Token oder NFTs genehmigen, handeln oder übertragen, werden Ihre Transaktionen hier angezeigt.", - "home.activity.empty.description.external": "Wenn diese Brieftasche Transaktionen durchführt, werden sie hier angezeigt.", - "home.activity.empty.title": "Noch keine Aktivität", - "home.activity.error.load": "Aktivität konnte nicht geladen werden", - "home.activity.title": "Aktivität", - "home.banner.offline": "Sie befinden sich im Offlinemodus", - "home.banner.testnetMode": "Sie befinden sich im Testnet-Modus", - "home.banner.testnetMode.nav": "Sie befinden sich im Testnetzmodus. Deaktivieren Sie dies in den Einstellungen.", - "home.explore.footer": "Tippen Sie hier, um Tausende von Token, NFTs und mehr zu entdecken", - "home.explore.title": "Token erkunden", - "home.extension.error": "Fehler beim Laden der Konten", - "home.label.buy": "Kaufen", - "home.label.for": "Kaufen/Verkaufen", - "home.label.receive": "Erhalten", - "home.label.send": "Schicken", - "home.label.swap": "Tauschen", - "home.nfts.title": "NFTs", - "home.tokens.empty.action.buy.description": "Kauf mit Debitkarte oder Bankkonto.", - "home.tokens.empty.action.buy.title": "Krypto kaufen", - "home.tokens.empty.action.import.description": "Geben Sie die Wiederherstellungsphrase dieser Brieftasche ein, um mit dem Tauschen und Senden zu beginnen.", - "home.tokens.empty.action.import.title": "Brieftasche importieren", - "home.tokens.empty.action.receive.description": "Überweisung von einem anderen Wallet oder Konto.", - "home.tokens.empty.action.receive.title": "Krypto empfangen", - "home.tokens.empty.description": "Wenn diese Brieftasche Token kauft oder empfängt, werden sie hier angezeigt.", - "home.tokens.empty.title": "Noch keine Token", - "home.tokens.empty.welcome": "Willkommen in Ihrem Portemonnaie!", - "home.tokens.empty.welcome.description": "Sieht aus, als hätten Sie eine neue Brieftasche. Lassen Sie uns sie aufladen, bevor Sie Ihren ersten Tausch vornehmen.", - "home.tokens.error.fetch": "Token-Guthaben konnten nicht abgerufen werden", - "home.tokens.error.load": "Token-Guthaben konnten nicht geladen werden", - "home.tokens.title": "Token", - "home.upsell.receive.cta": "Von einem Konto", - "home.upsell.receive.description": "Finanzieren Sie Ihr Wallet, indem Sie Kryptowährungen von einem anderen Wallet oder Konto übertragen", - "home.upsell.receive.title": "Krypto empfangen", - "home.warning.viewOnly": "Dies ist eine Nur-Ansicht-Wallet", - "interface.metatags.description": "Tauschen oder bieten Sie Liquidität auf dem Uniswap-Protokoll", - "interface.metatags.title": "Uniswap-Schnittstelle", - "landing.buildNextGen": "Erstellen Sie die nächste Generation offener Anwendungen und Tools.", - "landing.connectWithUs": "verbinde dich mit uns", - "landing.devDocs": "Entwicklerdokumente", - "landing.directToDeFi": "Gehen Sie direkt zu DeFi", - "landing.followOnX": "Folgen Sie @Uniswap auf X für die neuesten Updates", - "landing.protocolDescription": "Uniswap-Produkte basieren auf dem Uniswap-Protokoll. Das Protokoll ist der größte Onchain-Marktplatz mit einem wöchentlichen Volumen von mehreren Milliarden Dollar über Tausende von Token auf Ethereum und über 7 weiteren Chains.", - "landing.provideLiquidity.message": "Stellen Sie Pools im Uniswap-Protokoll Liquidität zur Verfügung und verdienen Sie Gebühren auf Swaps.", - "landing.swapSimple": "Tauschen leicht gemacht. Zugriff auf Tausende von Token auf über 11 Ketten.", - "landing.teamInsights": "Einblicke und Neuigkeiten aus dem Team", - "landing.trusted": "Millionen vertrauen uns", - "language.afrikaans": "Afrikaans", - "language.arabic": "Arabisch", - "language.catalan": "katalanisch", - "language.chineseSimplified": "Vereinfachtes Chinesisch", - "language.chineseTraditional": "Chinesische Tradition", - "language.czech": "tschechisch", - "language.danish": "dänisch", - "language.dutch": "Niederländisch", - "language.english": "Englisch", - "language.finnish": "finnisch", - "language.french": "Französisch", - "language.greek": "griechisch", - "language.hebrew": "hebräisch", - "language.hindi": "Hindi", - "language.hungarian": "ungarisch", - "language.indonesian": "Indonesisch", - "language.italian": "Italienisch", - "language.japanese": "japanisch", - "language.korean": "Koreanisch", - "language.malay": "malaiisch", - "language.norwegian": "norwegisch", - "language.polish": "Polieren", - "language.portuguese": "Portugiesisch", - "language.romanian": "rumänisch", - "language.russian": "Russisch", - "language.serbian": "serbisch", - "language.spanishLatam": "Spanisch (Lateinamerika)", - "language.spanishSpain": "Spanisch (Spanien)", - "language.spanishUs": "Spanisch (USA)", - "language.swahili": "Suaheli", - "language.swedish": "Schwedisch", - "language.turkish": "Türkisch", - "language.ukrainian": "ukrainisch", - "language.urdu": "Urdu", - "language.vietnamese": "Vietnamesisch", - "limit.open.count_one": "1 offenes Limit", - "limit.open.count_other": "{{count}} offene Grenzen", - "limitPrice.buyingAboveMarketPrice.error.description": "Ihr Limitpreis liegt bei {{percentage}}% über dem Marktpreis. Passen Sie Ihren Limitpreis an, um fortzufahren.", - "limitPrice.buyingAboveMarketPrice.error.title": "Kauf {{tokenSymbol}} über dem Marktpreis", - "limitPrice.marketPriceNotAvailable.error.description": "Wir können den aktuellen Marktpreis nicht berechnen. Um zu vermeiden, dass Sie eine Bestellung unter dem Marktpreis aufgeben, überprüfen Sie bitte Ihre Netzwerkverbindung und versuchen Sie es erneut.", - "limitPrice.marketPriceNotAvailable.error.title": "Marktpreis nicht verfügbar", - "limitPrice.sellingBelowMarketPrice.error.description": "Ihr Limitpreis liegt {{percentage}}% unter dem Marktpreis. Passen Sie Ihren Limitpreis an, um fortzufahren.", - "limitPrice.sellingBelowMarketPrice.error.title": "Verkaufe {{tokenSymbol}} unter Marktpreis", - "limits.form.disclaimer.mainnet": "Für Limits sind nur Ethereum-Mainnet-Token verfügbar. ", - "limits.form.disclaimer.mainnet.short": "Für Limits sind nur Mainnet-Token verfügbar.", - "limits.form.disclaimer.uniswapx": "Limits werden möglicherweise nicht genau dann ausgeführt, wenn die Token den angegebenen Preis erreichen. ", - "limits.learnMore": "Mehr über Grenzwerte erfahren", - "limits.price.input.label": "Wenn 1 wert ist", - "limits.price.label": "Limitpreis", - "limits.selectSupportedTokens": "Unterstützte Token auswählen", - "liquidity.hooks": "Hooks auf v4", - "liquidity.hooks.address.input": "Hook-Adresse eingeben", - "liquidity.learnMoreLabel": "Erfahren Sie mehr über die Liquiditätsbereitstellung", - "liquidity.notEnough.label": "Nicht genügend Liquidität, um den genauen USD-Wert anzuzeigen.", - "liquidity.provideOnProtocols": "Bereitstellung von Liquidität auf verschiedenen Protokollen", - "liquidityPool.chart.tooltip.amount": "{{token}} Liquidität: {{amount}}", - "liquidityPool.page.title": "Fügen Sie den Pools{{version}} auf Uniswap Liquidität hinzu", - "liquidityPool.positions.closed.title": "Geschlossene Positionen", - "liquidityPool.positions.page.title": "Verwalten Sie {{quoteSymbol}}/{{baseSymbol}} Poolliquidität auf Uniswap", - "liquidityPool.positions.page.version.description": "Zeigen Sie Ihre aktiven {{version}} Liquiditätspositionen an. Fügen Sie neue Positionen hinzu.", - "liquidityPool.positions.page.version.title": "Verwalten Sie die Poolliquidität{{version}} auf Uniswap", - "liquidityPool.positions.price.formatted": " pro ", - "migrate.allowed": "Erlaubt", - "migrate.allowLpMigration": "LP-Token-Migration zulassen", - "migrate.connectAccount": "Sie müssen ein Konto verbinden.", - "migrate.connectWallet": "Stellen Sie eine Verbindung zu einem Wallet her, um Ihre V2-Liquidität anzuzeigen.", - "migrate.contract": "Uniswap-Migrationsvertrag", - "migrate.firstLP": "Sie sind der erste Liquiditätsanbieter für diesen Uniswap V3-Pool. Ihre Liquidität wird zum aktuellen Preis von {{source}} migriert.", - "migrate.highGasCost": "Ihre Transaktionskosten werden wesentlich höher sein, da sie das Gas zur Erstellung des Pools beinhalten.", - "migrate.invalidRange": "Ungültiger Bereich ausgewählt. Der Mindestpreis muss niedriger sein als der Höchstpreis.", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} LP-Token", - "migrate.migrating": "Migrieren", - "migrate.missingV2Position": "Sie sehen eine Ihrer v2-Positionen nicht? Importieren Sie sie.", - "migrate.noV2Liquidity": "Keine V2-Liquidität gefunden.", - "migrate.positionNoFees": "Für Ihre Position werden keine Gebühren erhoben und sie wird auch nicht für den Handel verwendet, bis der Marktpreis in Ihren Bereich fällt.", - "migrate.priceDifference": "Preisunterschied: ", - "migrate.priceWarning": "Sie sollten Liquidität in Uniswap V3 nur zu einem Preis einzahlen, von dem Sie glauben, dass er richtig ist.
Wenn der Preis falsch erscheint, können Sie entweder einen Tausch durchführen, um den Preis zu ändern, oder warten, bis jemand anderes dies tut.", - "migrate.refund": "Je nach ausgewählter Preisspanne werden mindestens {{amtA}} {{symA}} und {{amtB}} {{symB}} auf Ihr Guthaben zurückerstattet.", - "migrate.selectFeeTier": "Gebührenstufe auswählen", - "migrate.setRange": "Preisspanne festlegen", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Preis:", - "migrate.v2Description": "Dieses Tool migriert Ihre {{source}} Liquidität sicher auf V3. Der Prozess ist dank des <0>Uniswap-Migrationsvertrags völlig vertrauenslos ↗", - "migrate.v2Instruction": "Klicken Sie für jeden unten angezeigten Pool auf „Migrieren“, um Ihre Liquidität aus Uniswap V2 zu entfernen und in Uniswap V3 einzuzahlen.", - "migrate.v2Title": "V2-Liquidität migrieren", - "migrate.v3Price": "V3 {{sym}} Preis:", - "mint.v3.input.invalidPrice.error": "Ungültige Preiseingabe", - "mobileAppPromo.banner.getTheApp.link": "Holen Sie sich die Uniswap Wallet-App", - "mobileAppPromo.banner.title": "Uniswap: Krypto- und NFT-Wallet", - "moonpay.poweredBy": "Fiat-Onramp betrieben durch MoonPay USA LLC", - "moonpay.restricted.region": "Moonpay ist in einigen Regionen nicht verfügbar. Klicken Sie hier, um mehr zu erfahren.", - "nav.createAccount.button": "Benutzerkonto erstellen", - "nav.logIn.button": "Einloggen", - "nav.signIn.button": "anmelden", - "nav.signUp.button": "Melden Sie sich an", - "nav.tabs.createPosition": "Position anlegen", - "nav.tabs.viewPositions": "Stellenangebote ansehen", - "network.lostConnection": "Möglicherweise haben Sie Ihre Netzwerkverbindung verloren.", - "network.mightBeDown": "{{network}} ist möglicherweise gerade ausgefallen oder Ihre Netzwerkverbindung ist verloren gegangen.", - "network.warning": "Netzwerkwarnung", - "nft.addToBag": "Der Tasche hinzufügen", - "nft.authorsCollectionOnUni": "{{name}}'s NFT-Sammlung auf Uniswap", - "nft.bag": "Tasche", - "nft.blockedCollection": "Diese Sammlung ist blockiert", - "nft.blockedOpenSea": "Auf OpenSea blockiert", - "nft.buyTransferNFTToStart": "Kaufen oder übertragen Sie NFTs auf dieses Wallet, um loszulegen.", - "nft.buyTransferTokensToStart": "Kaufen oder übertragen Sie Token in dieses Wallet, um loszulegen.", - "nft.card.notAvailable": "Inhalt noch nicht
verfügbar", - "nft.chainSupportComingSoon": "{{chainName}} -Unterstützung in Kürze verfügbar", - "nft.collection.title": "Entdecken und kaufen Sie auf Uniswap", - "nft.collectionOnUni": "NFT-Sammlung auf Uniswap", - "nft.collectonOnAddress": "NFT-Sammlung auf Uniswap – {{address}}", - "nft.complete": "Vollständig!", - "nft.editListings": "Einträge bearbeiten", - "nft.event": "Ereignis", - "nft.explore": "Entdecken Sie NFTs", - "nft.learnWhy": "Lerne warum", - "nft.list.header.lastPrice": "Zuletzt", - "nft.list.title": "NFTs auflisten", - "nft.listedSignificantly_one": "Ein NFT ist {{percentage}} unter dem Mindestpreis der Sammlung gelistet. Möchten Sie wirklich fortfahren?", - "nft.listedSignificantly_other": "{{count}} NFTs werden deutlich unter dem Mindestpreis der Sammlung gelistet. Möchten Sie wirklich fortfahren?", - "nft.listForSale": "Liste zum Verkauf", - "nft.lowPrice": "Niedriger Listenpreis", - "nft.marketplace.royalty.header": "{{marketName}} Gebühren", - "nft.maxFees": "Maximale Gebühren", - "nft.maxRoyalties": "Maximale Urhebertantiemen", - "nft.noItems": "Keine Elemente zum Anzeigen", - "nft.noneAtAddress": "Unter dieser Adresse sind keine Sammlungswerte vorhanden", - "nft.noPools": "Noch keine Pools", - "nft.notListed": "Nicht aufgeführt", - "nft.proceedsIfSold": "Erlös bei Verkauf", - "nft.profile.priceInput.warning.alreadyListed": "Bereits gelistet bei {{tokenAmountWithSymbol}}", - "nft.profile.priceInput.warning.belowFloor": "{{percentage}} unter dem Mindestpreis.", - "nft.refundsInEth": "Rückerstattungen für nicht verfügbare Artikel erfolgen in ETH", - "nft.removeFromBag": "Aus dem Beutel nehmen", - "nft.reportSpam": "Als Spam melden", - "nft.returnToExplore": "Zurück zu NFT Explore", - "nft.returnToMy": "Zurück zu „Meine NFTs“", - "nft.setPrices": "Legen Sie die Preise fest, um fortzufahren", - "nft.startListing": "Eintrag starten", - "nft.successListed": "Erfolgreich gelistet", - "nft.sweep": "Fegen", - "nft.unavailableToList": "Nicht zur Auflistung verfügbar", - "nft.whyTransaction": "Warum ist eine Transaktion erforderlich?", - "nft.whyTransaction.reason": "Für die Auflistung eines NFT ist für jede NFT-Sammlung eine einmalige Marktplatzgenehmigung erforderlich.", - "nft.willAppearHere": "Ihre Onchain-Transaktionen und Krypto-Käufe werden hier angezeigt.", - "nft.wishGranted": "Uniswap hat Ihren Wunsch erfüllt!", - "nfts.collection.action.approve_one": "Sammlung genehmigen", - "nfts.collection.action.approve_other": "Sammlungen genehmigen", - "nfts.collection.action.sign_one": "Auflistung unterzeichnen", - "nfts.collection.action.sign_other": "Schilderlisten", - "nfts.marketplace.fees.deltaMax": "{{percentChanged}} max", - "nfts.my": "Meine NFTs", - "nfts.noneYet": "Noch keine NFTs", - "nfts.sell": "NFTs verkaufen", - "nfts.viewAndSell": "NFTs ansehen und verkaufen", - "notFound.oops": "Hoppla, bring mich zurück zu Swap", - "notice.uk": "Diese Webanwendung wird als Tool bereitgestellt, mit dem Benutzer auf eigene Initiative mit dem Uniswap-Protokoll interagieren können. Sie stellt keine Billigung oder Empfehlung von Kryptowährungshandelsaktivitäten dar. Uniswap empfiehlt Benutzern oder potenziellen Benutzern nicht, sich an Kryptoasset-Handelsaktivitäten zu beteiligen, und Benutzer oder potenzielle Benutzer der Webanwendung sollten diese Webseite oder ihren Inhalt nicht als Empfehlung, Einladung oder Anreiz zum Handel mit Kryptoassets betrachten.", - "notice.uk.label": "Haftungsausschluss für Großbritannien:", - "notification.assetVisibility.hidden": "{{assetName}} versteckt", - "notification.assetVisibility.unhidden": "{{assetName}} nicht versteckt", - "notification.copied.address": "Adresse kopiert", - "notification.copied.calldata": "Anrufdaten kopiert", - "notification.copied.contractAddress": "Vertragsadresse kopiert", - "notification.copied.failed": "Kopieren in die Zwischenablage fehlgeschlagen", - "notification.copied.image": "Bild kopiert", - "notification.copied.nftUrl": "NFT-URL kopiert", - "notification.copied.tokenUrl": "Token-URL kopiert", - "notification.copied.transactionId": "Transaktions-ID kopiert", - "notification.copied.unitag": "Benutzername kopiert", - "notification.countryChange": "Umgeschaltet auf {{countryName}}", - "notification.network.changed": "Umgeschaltet auf {{network}}", - "notification.passwordChanged": "Passwort geändert", - "notification.restore.success": "Brieftasche wiederhergestellt!", - "notification.send.network": "Senden am {{network}}", - "notification.spam.NFT.successful": "Berichtet", - "notification.swap.network": "Tauschen auf {{network}}", - "notification.swap.pending.swap": "Tausch steht aus", - "notification.swap.pending.unwrap": "Auspacken ausstehend", - "notification.swap.pending.wrap": "Wrap ausstehend", - "notification.transaction.approve.canceled": "Abgebrochen {{currencySymbol}} genehmigen.", - "notification.transaction.approve.fail": "Die Genehmigung von {{currencySymbol}} zur Verwendung mit {{address}}ist fehlgeschlagen.", - "notification.transaction.approve.success": "Zugelassen für {{currencySymbol}} zur Verwendung mit {{address}}.", - "notification.transaction.pending": "Transaktion ausstehend", - "notification.transaction.swap.canceled": "Abgebrochener {{inputCurrencySymbol}}-{{outputCurrencySymbol}} -Tausch.", - "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} für {{outputCurrencyAmountWithSymbol}} Tausch abgelaufen.", - "notification.transaction.swap.fail": "Das Austauschen von {{inputCurrencyAmountWithSymbol}} gegen {{outputCurrencyAmountWithSymbol}}ist fehlgeschlagen.", - "notification.transaction.swap.success": "{{inputCurrencyAmountWithSymbol}} gegen {{outputCurrencyAmountWithSymbol}}ausgetauscht.", - "notification.transaction.transfer.canceled": "Abgebrochen {{tokenNameOrAddress}} senden", - "notification.transaction.transfer.fail": "Senden von {{tokenNameOrAddress}} an {{walletNameOrAddress}}fehlgeschlagen", - "notification.transaction.transfer.received": "Erhalten {{tokenNameOrAddress}} von {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "Gesendet {{tokenNameOrAddress}} an {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "Transaktion mit {{addressOrEnsName}}fehlgeschlagen", - "notification.transaction.unknown.fail.short": "Transaktion fehlgeschlagen", - "notification.transaction.unknown.success.full": "Transaktion durchgeführt mit {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "Transaktion bestätigt", - "notification.transaction.unwrap.canceled": "Abgebrochenes {{inputCurrencySymbol}} -Auspacken.", - "notification.transaction.unwrap.fail": "Das Auspacken von {{inputCurrencyAmountWithSymbol}}ist fehlgeschlagen.", - "notification.transaction.unwrap.success": "{{inputCurrencyAmountWithSymbol}} ausgepackt und {{outputCurrencyAmountWithSymbol}}erhalten.", - "notification.transaction.wrap.canceled": "{{inputCurrencySymbol}} -Wrap abgebrochen.", - "notification.transaction.wrap.fail": "Das Umbrechen von {{inputCurrencyAmountWithSymbol}}ist fehlgeschlagen.", - "notification.transaction.wrap.success": "{{inputCurrencyAmountWithSymbol}} verpackt und {{outputCurrencyAmountWithSymbol}}erhalten.", - "notification.transfer.pending": "Senden ausstehend", - "notification.walletConnect.confirmed": "Transaktion bestätigt mit {{dappName}}", - "notification.walletConnect.connected": "In Verbindung gebracht", - "notification.walletConnect.disconnected": "Getrennt", - "notification.walletConnect.failed": "Die Transaktion ist mit {{dappName}}fehlgeschlagen.", - "notification.walletConnect.networkChanged.full": "Umgeschaltet auf {{networkName}}", - "notification.walletConnect.networkChanged.short": "Geswitchte Netzwerke", - "notifications.scantastic.subtitle": "Weiter zur Uniswap-Erweiterung", - "notifications.scantastic.title": "Erfolg!", - "onboarding.backup.manual.banner": "Wir empfehlen, dies auf ein Blatt Papier zu schreiben und an einem sicheren Ort, beispielsweise einem Safe, aufzubewahren.", - "onboarding.backup.manual.displayWarning.description": "Lesen Sie das Folgende sorgfältig durch, bevor Sie fortfahren.", - "onboarding.backup.manual.displayWarning.note.access": "Mit dieser Wiederherstellungsphrase haben Sie vollen Zugriff auf Ihr Wallet und Ihr Guthaben", - "onboarding.backup.manual.displayWarning.note.secure": "Sehen Sie sich dies privat an und geben Sie es nicht an Dritte weiter.", - "onboarding.backup.manual.displayWarning.note.storage": "Schreiben Sie es auf und bewahren Sie es an einem sicheren Ort auf", - "onboarding.backup.manual.displayWarning.title": "Einige wichtige Dinge, die Sie wissen sollten", - "onboarding.backup.manual.error": "Ungültiges oder falsch geschriebenes Wort", - "onboarding.backup.manual.placeholder": "Geheimwort", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} abgeschlossen", - "onboarding.backup.manual.selectedWordPlaceholder": "Wort auswählen", - "onboarding.backup.manual.subtitle_one": "Was ist das {{count}}erste Wort in Ihrer Wiederherstellungsphrase?", - "onboarding.backup.manual.subtitle_two": "Was ist das {{count}}zweite Wort in Ihrer Wiederherstellungsphrase?", - "onboarding.backup.manual.subtitle_few": "Was ist das {{count}}. Wort in Ihrer Wiederherstellungsphrase?", - "onboarding.backup.manual.subtitle_other": "Was ist das {{count}}. Wort in Ihrer Wiederherstellungsphrase?", - "onboarding.backup.manual.title": "Stellen wir sicher, dass Sie es richtig aufgezeichnet haben", - "onboarding.backup.option.badge.quick": "Schnell", - "onboarding.backup.option.cloud.description": "Sichern Sie Ihr Wallet über {{cloudProviderName}}, geschützt durch ein Wiederherstellungspasswort.", - "onboarding.backup.option.cloud.title": "Legen Sie ein Wiederherstellungskennwort fest", - "onboarding.backup.option.manual.description": "Notieren Sie Ihre 12 geheimen Wörter auf einem Blatt Papier und bewahren Sie es an einem sicheren Ort auf.", - "onboarding.backup.option.manual.title": "Notieren Sie die Wiederherstellungsphrase", - "onboarding.backup.reminder.description": "Durch die Sicherung Ihres Wallets können Sie sicherstellen, dass Sie Ihr Vermögen jederzeit wiederherstellen können, falls Sie Ihr Telefon verlieren oder ein neues Gerät bekommen.", - "onboarding.backup.reminder.title": "Es ist Zeit, Ihr Portemonnaie zu sichern", - "onboarding.backup.reminder.warning.description": "Wenn Sie keine Sicherungsmethode einrichten, können Sie Ihr Wallet nicht wiederherstellen, wenn Sie Ihr Telefon verlieren, die App löschen oder ein neues Gerät kaufen.", - "onboarding.backup.reminder.warning.title": "Sie könnten Ihr Geld verlieren", - "onboarding.backup.speedBump.cloud.description": "Wenn Sie es jemals vergessen, können wir es nicht für Sie zurücksetzen. Notieren Sie es an einem sicheren Ort oder bewahren Sie es sicher in einem Passwort-Manager auf.", - "onboarding.backup.speedBump.cloud.disclaimer": "Ich verstehe, dass Uniswap Labs mein Wiederherstellungskennwort nicht zurücksetzen kann.", - "onboarding.backup.speedBump.cloud.title": "Es ist wichtig, dieses Passwort zu speichern", - "onboarding.backup.speedBump.manual.description": "Stellen Sie sicher, dass Sie Ihre Wiederherstellungsphrase richtig aufgeschrieben haben und dass Sie sie an einem sicheren Ort aufbewahren können.", - "onboarding.backup.speedBump.manual.disclaimer": "Mir ist bewusst, dass Uniswap Labs mein Wallet nicht wiederherstellen kann, wenn ich es verliere.", - "onboarding.backup.speedBump.manual.title": "Bevor Sie fertig sind...", - "onboarding.backup.subtitle": "So können Sie Ihr Wallet wiederherstellen, wenn Sie die App löschen oder Ihr Gerät verlieren.", - "onboarding.backup.title.existing": "Sichern Sie Ihr Wallet", - "onboarding.backup.title.new": "Wählen Sie Ihre Sicherungsmethode", - "onboarding.backup.view.disclaimer": "Mir ist bewusst, dass Uniswap Labs mir nicht bei der Wiederherstellung meiner Wiederherstellungsphrase helfen kann, wenn ich sie verliere.", - "onboarding.backup.view.subtitle.message1": "Lesen Sie Folgendes sorgfältig durch, bevor Sie fortfahren", - "onboarding.backup.view.subtitle.message2": "Sie müssen alle 12 dieser geheimen Wörter eingeben, um Ihr Portemonnaie wiederherzustellen.", - "onboarding.backup.view.title": "Notieren Sie Ihre Wiederherstellungsphrase", - "onboarding.backup.view.warning.message1": "Mit dieser Wiederherstellungsphrase haben Sie vollen Zugriff auf Ihr Wallet und Ihr Guthaben", - "onboarding.backup.view.warning.message2": "Schreiben Sie es auf und bewahren Sie es an einem sicheren Ort auf", - "onboarding.backup.view.warning.message3": "Sehen Sie sich dies privat an und geben Sie es an niemanden weiter", - "onboarding.cloud.confirm.description": "Sie müssen diese Nummer eingeben, um Ihr Geld zurückzuerhalten. Wenn Sie diese Nummer vergessen, können wir sie nicht für Sie abrufen.", - "onboarding.cloud.confirm.title": "Bestätigen Sie Ihr Wiederherstellungskennwort", - "onboarding.cloud.createPassword.description": "Sie müssen diese Nummer eingeben, um Ihr Geld zurückzuerhalten. Wenn Sie diese Nummer vergessen, können wir sie nicht für Sie abrufen.", - "onboarding.cloud.createPassword.title": "Erstellen Sie Ihr Wiederherstellungskennwort", - "onboarding.complete.button": "Öffnen Sie die Uniswap-Erweiterung", - "onboarding.complete.description": "Ihr Wallet ist bereit zum Senden und Empfangen von Kryptowährungen. Öffnen Sie die Uniswap-Erweiterung mit der folgenden Verknüpfung.", - "onboarding.complete.go_to_uniswap": "Zur Uniswap Web App", - "onboarding.complete.pin.description": "Klicken Sie auf das Stecknadelsymbol, um die Uniswap-Erweiterung zu Ihrer Symbolleiste hinzuzufügen.", - "onboarding.complete.pin.title": "Pin Uniswap-Erweiterung", - "onboarding.complete.title": "Sie sind startklar", - "onboarding.extension.password.subtitle": "Sie benötigen dies, um Ihr Wallet zu entsperren und auf Ihre Wiederherstellungsphrase zuzugreifen", - "onboarding.extension.password.title.default": "Passwort erstellen", - "onboarding.extension.password.title.reset": "Setze dein Passwort zurück", - "onboarding.extension.unsupported.android.description": "Die Uniswap-Erweiterung ist nur mit Chrome auf dem Desktop kompatibel.", - "onboarding.extension.unsupported.android.title": "Chrome auf Mobilgeräten wird (noch) nicht unterstützt", - "onboarding.extension.unsupported.description": "Die Uniswap-Erweiterung ist derzeit nur mit Chrome kompatibel.", - "onboarding.extension.unsupported.title": "Dieser Browser wird (noch) nicht unterstützt", - "onboarding.home.intro.backup.description": "Richten Sie einen Wiederherstellungsplan ein, falls Sie Ihr Telefon jemals verlieren oder ein neues bekommen.", - "onboarding.home.intro.backup.title": "Sichern Sie Ihr Wallet", - "onboarding.home.intro.bridging.description_one": "Verschieben Sie ETH, USDC und mehr über {{count}}+ Netzwerke.", - "onboarding.home.intro.bridging.description_other": "Verschieben Sie ETH, USDC und mehr über {{count}}+ Netzwerke.", - "onboarding.home.intro.fund.description": "Finanzieren Sie Ihr Wallet, indem Sie Kryptowährungen kaufen oder von einem anderen Konto überweisen.", - "onboarding.home.intro.fund.title": "Holen Sie sich Ihren ersten Token", - "onboarding.home.intro.label.required": "Erforderlich", - "onboarding.home.intro.label.swipe": "Streichen", - "onboarding.home.intro.unitag.description": "Erstellen Sie ein personalisiertes Web3-Profil und teilen Sie Ihre Adresse ganz einfach mit Freunden.", - "onboarding.home.intro.unitag.title": "Fordern Sie Ihren {{unitagDomain}} -Benutzernamen an", - "onboarding.home.intro.welcome.description": "Schließen Sie die Einrichtung Ihres Wallets ab, um innerhalb von Sekunden mit dem Tauschen zu beginnen.", - "onboarding.home.intro.welcome.title": "Willkommen bei Uniswap", - "onboarding.import.error.invalidWords_one": "1 Wort ist ungültig oder falsch geschrieben", - "onboarding.import.error.invalidWords_other": "{{count}} Wörter sind ungültig oder falsch geschrieben", - "onboarding.import.method.import.message": "Geben Sie Ihre Wiederherstellungsphrase aus einer anderen Krypto-Wallet ein", - "onboarding.import.method.import.title": "Importieren einer Brieftasche", - "onboarding.import.method.restore.message.android": "Fügen Sie Wallets, die Sie gesichert haben, zu Ihrem Google Drive-Konto hinzu", - "onboarding.import.method.restore.message.ios": "Fügen Sie gesicherte Wallets zu Ihrem iCloud-Konto hinzu", - "onboarding.import.method.restore.title": "Wiederherstellen einer Brieftasche", - "onboarding.import.onDeviceRecovery.other_options": "Erstellen oder importieren Sie ein anderes Wallet", - "onboarding.import.onDeviceRecovery.other_options.label": "Sie möchten nichts davon?", - "onboarding.import.onDeviceRecovery.subtitle": "Wählen Sie aus, bei welcher Brieftasche Sie sich erneut anmelden möchten.", - "onboarding.import.onDeviceRecovery.title": "Willkommen zurück bei Uniswap", - "onboarding.import.onDeviceRecovery.wallet.button": "Wiederherstellungsphrase anzeigen", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 andere Geldbörse", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} andere Geldbörsen", - "onboarding.import.onDeviceRecovery.warning.caption": "Bitte stellen Sie sicher, dass Sie alle anderen Wallets gesichert haben. Wenn Sie sie jemals wiederherstellen möchten, benötigen Sie ihre Wiederherstellungsphrasen oder entsprechende {{cloudProvider}} -Backups.", - "onboarding.import.onDeviceRecovery.warning.title": "Bist du sicher?", - "onboarding.import.title": "Wählen Sie, wie Sie Ihr Wallet hinzufügen möchten", - "onboarding.importMnemonic.button.default": "Meine Wiederherstellungsphrase besteht aus 12 Wörtern", - "onboarding.importMnemonic.button.importing": "Importieren...", - "onboarding.importMnemonic.button.longPhrase": "Meine Wiederherstellungsphrase ist länger", - "onboarding.importMnemonic.error.invalidPhrase": "Die von Ihnen eingegebene Phrase ist ungültig", - "onboarding.importMnemonic.subtitle": "Geben Sie Ihre 12 Wörter umfassende Wiederherstellungsphrase ein oder fügen Sie sie ein", - "onboarding.importMnemonic.title": "Geben Sie Ihre Wiederherstellungsphrase ein", - "onboarding.intro.button.alreadyHave": "Ich habe bereits eine Brieftasche", - "onboarding.intro.mobileScan.button": "Zum Importieren QR-Code scannen", - "onboarding.intro.mobileScan.title": "Haben Sie die Uniswap-App?", - "onboarding.landing.button.add": "Vorhandene Wallet hinzufügen", - "onboarding.landing.button.create": "Erstellen Sie eine Brieftasche", - "onboarding.name.wallet.button.text": "Beenden", - "onboarding.name.wallet.subtitle": "Dieser Spitzname ist nur für Sie sichtbar", - "onboarding.name.wallet.title": "Geben Sie Ihrer Brieftasche einen Namen", - "onboarding.notification.permission.message": "Um Benachrichtigungen zu erhalten, aktivieren Sie Benachrichtigungen für Uniswap Wallet in den Einstellungen Ihres Geräts.", - "onboarding.notification.permission.title": "Benachrichtigungsberechtigung", - "onboarding.notification.subtitle": "Bleiben Sie über den Transaktionsstatus und wichtige Preisänderungen für beliebte Token auf dem Laufenden", - "onboarding.notification.title": "Benachrichtigungen aktivieren", - "onboarding.passkey.account.protection": "Ihr Konto ist durch Ihren eigenen sicheren Passwortspeicher geschützt.", - "onboarding.passkey.biometric.scan": "Telefon, Tablet oder Browser – scannen Sie einfach Ihre biometrischen Daten und Sie werden angemeldet.", - "onboarding.passkey.create": "Erstellen Sie Ihren Passkey", - "onboarding.passkey.use.recovery.phrase": "Verwenden Sie stattdessen eine Wiederherstellungsphrase", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "Lassen Sie uns bestätigen, dass Sie es richtig gemacht haben. Wenn Sie es verlieren oder falsch aufschreiben, können Sie Ihr Geld nicht zurückerhalten.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "Bei Verlust oder falscher Angabe ist eine Rückerstattung des Geldes nicht möglich.", - "onboarding.recoveryPhrase.confirm.title": "Lassen Sie uns bestätigen, dass Sie es richtig gemacht haben", - "onboarding.recoveryPhrase.view.subtitle": "Sie müssen alle 12 dieser geheimen Wörter eingeben, um Ihr Portemonnaie wiederherzustellen.", - "onboarding.recoveryPhrase.view.title": "Notieren Sie Ihre Wiederherstellungsphrase", - "onboarding.recoveryPhrase.view.title.hasPassword": "Falls Sie Ihr Passwort jemals vergessen sollten...", - "onboarding.recoveryPhrase.warning.final.button": "Ich bin bereit", - "onboarding.recoveryPhrase.warning.final.message": "Ihre Wiederherstellungsphrase gewährt Ihnen (und jedem, der sie hat) Zugriff auf Ihr Geld. Behalten Sie sie unbedingt für sich.", - "onboarding.recoveryPhrase.warning.final.title": "Führen Sie diesen Schritt an einem privaten Ort durch", - "onboarding.recoveryPhrase.warning.screenshot.message": "Jeder, der Zugriff auf Ihre Fotos erhält, kann auf Ihr Wallet zugreifen. Wir empfehlen Ihnen, Ihre Worte stattdessen aufzuschreiben.", - "onboarding.recoveryPhrase.warning.screenshot.title": "Screenshots sind nicht sicher", - "onboarding.resetPassword.complete.safety": "Erfahren Sie mehr über die Sicherheit Ihrer Geldbörse", - "onboarding.resetPassword.complete.subtitle": "Verwenden Sie Ihr neues Passwort, um Ihr Wallet zu entsperren.", - "onboarding.resetPassword.complete.title": "Passwort zurücksetzen", - "onboarding.scan.button": "Scannen Sie mit der Uniswap-App", - "onboarding.scan.error": "Leider können wir den QR-Code momentan nicht laden. Bitte versuchen Sie es mit einer anderen Onboarding-Methode.", - "onboarding.scan.otp.error": "Der von Ihnen übermittelte Code ist falsch oder bei der Übermittlung ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", - "onboarding.scan.otp.failed": "Fehlgeschlagene Versuche: {{number}}", - "onboarding.scan.otp.subtitle": "Suchen Sie in Ihrer Uniswap-App nach dem 6-stelligen Code", - "onboarding.scan.otp.title": "Einmalcode eingeben", - "onboarding.scan.subtitle": "Scannen Sie den QR-Code mit der mobilen Uniswap-App, um mit dem Importieren Ihres Wallets zu beginnen.", - "onboarding.scan.title": "Wallet aus der App importieren", - "onboarding.scan.wifi": "Verbinden Sie Ihr Telefon mit demselben WLAN-Netzwerk wie Ihren Computer.", - "onboarding.security.alert.biometrics.message.android": "Um Biometrie zu nutzen, richten Sie diese zunächst in den Einstellungen ein", - "onboarding.security.alert.biometrics.message.ios": "Um {{biometricsMethod}}zu verwenden, erlauben Sie den Zugriff in den Systemeinstellungen", - "onboarding.security.alert.biometrics.title.android": "Biometrie ist deaktiviert", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} ist deaktiviert", - "onboarding.security.button.confirm.android": "Biometrie aktivieren", - "onboarding.security.button.confirm.ios": "Aktivieren Sie {{biometricsMethod}}", - "onboarding.security.button.setup": "Aufstellen", - "onboarding.security.subtitle.android": "Fügen Sie eine zusätzliche Sicherheitsebene hinzu, indem Sie zum Senden von Transaktionen biometrische Daten verlangen.", - "onboarding.security.subtitle.ios": "Fügen Sie eine zusätzliche Sicherheitsebene hinzu, indem Sie zum Senden von Transaktionen {{biometricsMethod}} verlangen.", - "onboarding.security.title": "Schützen Sie Ihren Geldbeutel", - "onboarding.selectWallets.error": "Adressen konnten nicht geladen werden", - "onboarding.selectWallets.title.default": "Wählen Sie die zu importierenden Wallets aus", - "onboarding.selectWallets.title.error": "Fehler beim Importieren von Wallets", - "onboarding.termsOfService": "Indem ich fortfahre, stimme ich den Servicebedingungen zu und stimme der Datenschutzrichtliniezu.", - "onboarding.tooltip.recoveryPhrase.trigger": "Was ist eine Wiederherstellungsphrase?", - "onboarding.wallet.continue": "Sorgen wir für Sicherheit", - "onboarding.wallet.defaultName": "Brieftasche {{number}}", - "onboarding.wallet.description.full": "Dies ist Ihr persönlicher Bereich für Token, NFTs und alle Ihre Trades. Schließen Sie die Einrichtung ab, um Ihre Gelder sicher aufzubewahren.", - "onboarding.wallet.title": "Willkommen bei Ihrer neuen Brieftasche", - "outageBanner.message": "{{chainName}} {{versionDescription}} -Daten sind derzeit nicht verfügbar, aber wir erwarten, dass das Problem in Kürze behoben sein wird.", - "outageBanner.message.sub": "Sie können in dieser Kette weiterhin problemlos Liquidität tauschen und bereitstellen.", - "outageBanner.title": "{{versionName}} wird bald zurück sein", - "permit.approval.fail": "Genehmigung fehlgeschlagen", - "permit.approval.fail.message": "Permit2 ermöglicht die gemeinsame Nutzung und Verwaltung von Token-Genehmigungen über verschiedene Anwendungen hinweg.", - "pool.activePositions.appear": "Ihre aktiven V3-Liquiditätspositionen werden hier angezeigt.", - "pool.activeRange": "Aktiver Tickbereich", - "pool.addAs": "Hinzufügen als {{nativeWrappedSymbol}}", - "pool.addLiquidity.seoTitle": "Fügen Sie Liquidität zu {{tokenPair}} ({{chain}}) auf Uniswap hinzu", - "pool.addMoreLiquidity": "Mehr Liquidität schaffen", - "pool.apr": "APR", - "pool.apr.description": "Jährlich basierend auf 1-Tages-Gebühren", - "pool.areCreating": "Sie erstellen einen Pool", - "pool.areFirst": "Sie sind der erste Liquiditätsanbieter.", - "pool.back": "Zurück zum Pool", - "pool.balances": "Poolguthaben", - "pool.closedCTA.description": "Sie können sie anzeigen, indem Sie den Filter oben auf der Seite verwenden.", - "pool.closedCTA.title": "Suchen Sie nach Ihren geschlossenen Positionen?", - "pool.collectAs": "Sammeln als {{nativeWrappedSymbol}}", - "pool.collected": " Gesammelt", - "pool.collectFees": "Gebühren einziehen", - "pool.collecting": "Sammeln", - "pool.collectingFeesWithdraw": "Durch die Gebühreneinziehung werden Ihnen aktuell verfügbare Gebühren eingezogen.", - "pool.confirmSupply": "Lieferung bestätigen", - "pool.connection.networkUnsupported": "Ihr verbundenes Netzwerk wird nicht unterstützt.", - "pool.create": "Neuen Pool erstellen", - "pool.create.info": "Ihre Auswahl erstellt einen neuen Liquiditätspool, der zu geringerer anfänglicher Liquidität und erhöhter Volatilität führen kann. Erwägen Sie die Erweiterung eines bestehenden Pools, um diese Risiken zu minimieren.", - "pool.create.pair": "Erstellen Sie ein Paar", - "pool.createAndSupply": "Pool anlegen & versorgen", - "pool.createdPosition": "Erstellte Position", - "pool.createdPosition.cancelled": "Position anlegen abgebrochen", - "pool.createdPosition.failed": "Erstellen der Position fehlgeschlagen", - "pool.depositAmounts": "Einzahlungsbeträge", - "pool.earnFees": "Durch das Hinzufügen von Liquidität verdienen Sie 0,3 % aller Trades für dieses Paar, proportional zu Ihrem Anteil am Pool. Gebühren werden dem Pool hinzugefügt, fallen in Echtzeit an und können durch Abheben Ihrer Liquidität eingefordert werden.", - "pool.estimatePercentToRevert": "Die Ausgabe ist geschätzt. Wenn sich der Preis um mehr als {{allowed}}% ändert, wird Ihre Transaktion rückgängig gemacht.", - "pool.explorers": "Entdecker", - "pool.exporeAnalytics": "Entdecken Sie Uniswap Analytics.", - "pool.hideClosed": "Geschlossene Positionen ausblenden", - "pool.import": "Pool importieren", - "pool.import.link.description": "Einige v2-Positionen werden nicht automatisch angezeigt.", - "pool.import.positions.v2": "V2-Positionen importieren", - "pool.import.positions.v2.selectPair.description": "Einige v2-Positionen werden nicht automatisch angezeigt. Wählen Sie ein Token-Paar zum Importieren und Anzeigen Ihrer Positionen aus.", - "pool.import.success": "Pool importiert", - "pool.increaseLiquidity": "Liquidität erhöhen", - "pool.info": "Informationen zum Pool", - "pool.initialShare": "Anfangspreise und Poolanteil", - "pool.learn": "Lernen", - "pool.learnAbout": "Lesen Sie mehr über die Bereitstellung von Liquidität", - "pool.learnLiquidity": "Erfahren Sie mehr über die Bereitstellung von Liquidität", - "pool.learnv3LP": "Schauen Sie sich unsere v3 LP-Komplettlösungen und Migrationsleitfäden an.", - "pool.limitFluctuation.warning": "Bitte beachten Sie, dass die Ausführung von Limits je nach Marktschwankungen in Echtzeit und Überlastung des Ethereum-Netzwerks variieren kann. Limits werden möglicherweise nicht genau dann ausgeführt, wenn die Token den angegebenen Preis erreichen.", - "pool.liquidity.connectToAdd": "Stellen Sie eine Verbindung zu einem Wallet her, um Ihre Liquidität anzuzeigen.", - "pool.liquidity.data.error.message": "Beim Abrufen der für Ihre Transaktion erforderlichen Daten ist ein Fehler aufgetreten.", - "pool.liquidity.earn.fee": "Liquiditätsanbieter verdienen eine Gebühr von 0,3 % auf alle Trades, proportional zu ihrem Anteil am Pool. Gebühren werden dem Pool hinzugefügt, fallen in Echtzeit an und können durch Abheben Ihrer Liquidität eingefordert werden.", - "pool.liquidity.outOfSync": "Diskrepanz zwischen Pool- und Marktpreisen", - "pool.liquidity.outOfSync.message": "Die Preise in diesem Pool unterscheiden sich von den Marktpreisen der ausgewählten Token. Passen Sie Ihre Preisspanne entsprechend an oder warten Sie, bis der Pool neu ausbalanciert ist, um Verluste zu vermeiden.", - "pool.liquidity.ownershipWarning.message": "Sie sind nicht der Eigentümer dieser LP-Position. Sie können die Liquidität aus dieser Position nicht abheben, es sei denn, Sie besitzen die folgende Adresse: {{ownerAddress}}", - "pool.liquidity.rewards": "Belohnungen für Liquiditätsanbieter", - "pool.liquidity.taxWarning": "Token-Steuern", - "pool.liquidity.taxWarning.message": "Für einen oder mehrere dieser Token fallen Transfersteuern an. Das Hinzufügen von Liquidität mit V3 kann zu einem Verlust von Mitteln führen. Versuchen Sie stattdessen, V2 zu verwenden.", - "pool.liquidityPoolFeesNotice": "Wenn Sie Liquidität hinzufügen, erhalten Sie Pool-Token, die Ihre Position repräsentieren. Diese Token verdienen automatisch Gebühren proportional zu Ihrem Anteil am Pool und können jederzeit eingelöst werden.", - "pool.manageRewardsLiquidity": "Verwalten Sie die Liquidität im Belohnungspool", - "pool.max.label": "Max:", - "pool.maxPrice": "Max Preis", - "pool.migrateLiquidity": "Liquidität migrieren", - "pool.migrateLiquidityDisabledTooltip": "Diese Kette unterstützt keine v4-Liquiditätspools.", - "pool.migrateToV4": "Migration auf Version 4", - "pool.min.label": "Mindest:", - "pool.minPrice": "Mindestpreis", - "pool.mustBeInitialized": "Dieser Pool muss initialisiert werden, bevor Sie Liquidität hinzufügen können. Wählen Sie zum Initialisieren einen Startpreis für den Pool aus. Geben Sie dann Ihren Liquiditätspreisbereich und den Einzahlungsbetrag ein. Aufgrund der Initialisierungstransaktion sind die Gasgebühren höher als üblich.", - "pool.newPosition.plus": "+ Neue Position", - "pool.newPosition.title": "Neue Position", - "pool.newSpecificPosition": "Neue {{symbol}} Position", - "pool.noLiquidity": "Keine Liquidität gefunden.", - "pool.onceHappyReview": "Wenn Sie mit dem Preis zufrieden sind, klicken Sie auf „Angebot prüfen“.", - "pool.openPosition": "Eröffnen Sie eine Poolposition", - "pool.openPosition.cta": "Fügen Sie einem Pool Liquidität hinzu und sehen Sie sich hier Ihre Positionen an", - "pool.openToStart": "Öffnen Sie eine neue Position oder erstellen Sie einen Pool, um loszulegen.", - "pool.owner": "Eigentümer", - "pool.percent": "{{pct}}% Pool", - "pool.pooled": "Zusammengefasst {{sym}}:", - "pool.position": "Position", - "pool.position.100": "Ihre Position wird zu 100 % diesem Preis entsprechen.", - "pool.position.100.at": "Ihre Position beträgt zu diesem Preis 100 % {{symbol}} .", - "pool.position.networkConnect": "Um eine Position anzuzeigen, müssen Sie mit dem zugehörigen Netzwerk verbunden sein.", - "pool.position.willBe100": "Ihre Position besteht zu 100 % aus {{sym}} zu diesem Preis", - "pool.positions": "Positionen", - "pool.positions.title": "Ihre Positionen", - "pool.positions.transaction.settings": "Transaktionseinstellungen", - "pool.positions.usdValueUnavailable": "USD-Wert nicht verfügbar", - "pool.positions.usdValueUnavailable.tooltip": "Für diese Position ist derzeit kein USD-Wert verfügbar. Die eingezahlten Token-Beträge finden Sie in den Positionsdetails.", - "pool.priceRange": "Preisklasse", - "pool.rangeBadge.tooltip.outsideRange": "Der Preis dieses Pools liegt außerhalb Ihres ausgewählten Bereichs. Ihre Position bringt derzeit keine Gebühren ein.", - "pool.rangeBadge.tooltip.text": "Ihre Position hat 0 Liquidität und bringt keine Gebühren ein.", - "pool.rangeBadge.tooltip.withinRange": "Der Preis dieses Pools liegt innerhalb Ihres ausgewählten Bereichs. Ihre Position bringt derzeit Gebühren ein.", - "pool.rates": "Preise", - "pool.ratioTokenToPrice": "Das Verhältnis der von Ihnen hinzugefügten Token legt den Preis dieses Pools fest.", - "pool.refresh.prices": "Preise aktualisieren", - "pool.removeLiquidity": "Liquidität entfernen", - "pool.rewardsPool.label": "Pool-Token im Belohnungspool:", - "pool.selectedRange": "Ausgewähltes Sortiment", - "pool.selectPair": "Paar auswählen", - "pool.share": "Preise und Poolanteil", - "pool.share.label": "Ihr Poolanteil:", - "pool.shareOf": "Anteil am Pool:", - "pool.showClosed": "Geschlossene Positionen anzeigen", - "pool.specificPosition": "{{symbol}} Position", - "pool.startingPrice": "Ab {{sym}} Preis:", - "pool.supply": "Liefern", - "pool.supplyingMaths": "Bereitstellung von {{amtA}} {{symA}} und {{amtB}} {{symB}}", - "pool.tokenPair": "Token-Paar", - "pool.top": "Top-Pools", - "pool.top.tvl": "Top-Pools von TVL", - "pool.totalTokens": "Ihre gesamten Pool-Tokens:", - "pool.uncollectedFees": "Nicht eingezogene Gebühren", - "pool.v2": "V2-Pools", - "pool.v2.add": "V2-Liquidität hinzufügen", - "pool.v2.migratev3": "Liquidität auf V3 migrieren", - "pool.v2liquidity": "V2-Liquidität", - "pool.v3": "V3-Pools", - "pool.v4": "v4-Pools", - "pool.viewUncollectedFees": "Nicht eingezogene Gebühren und Analysen anzeigen", - "pool.volOverTvl": "1D-Volt/TVL", - "pool.volume.thirtyDay": "30 Tage Volumen", - "pool.volume.thirtyDay.short": "30D Volumen", - "pool.withdrawAs": "Abheben als {{nativeWrappedSymbol}}", - "pool.yourv2": "Ihre V2-Liquidität", - "poolFinder.availablePools": "Verfügbare Pools", - "poolFinder.availablePools.found.description": "v2-Pools, die zu Ihrer Paarauswahl passen.", - "poolFinder.availablePools.notFound.description": "Keine passenden v2-Pools gefunden. Überprüfen Sie Ihre Token-Auswahl noch einmal und stellen Sie sicher, dass Sie mit der richtigen Wallet verbunden sind.", - "pools.approving.amount": "Genehmigen {{amount}}", - "pools.explore": "Pools erkunden", - "position.addHook": "Einen Haken hinzufügen", - "position.addHook.tooltip": "Hooks sind eine erweiterte Funktion, die es Pools ermöglicht, mit Smart Contracts zu interagieren und so verschiedene Funktionen freizuschalten. Gehen Sie beim Hinzufügen von Hooks vorsichtig vor, da einige davon bösartig sein oder unbeabsichtigte Folgen haben können.", - "position.addingHook": "Haken hinzufügen", - "position.addingHook.disclaimer": "Das Hinzufügen von Hooks kann unbeabsichtigte Folgen haben. Informieren Sie sich gründlich und gehen Sie auf eigenes Risiko vor.", - "position.addingHook.hideProperties": "Eigenschaften ausblenden", - "position.addingHook.invalidAddress": "Geben Sie eine gültige Hook-Adresse ein", - "position.addingHook.viewProperties": "Eigenschaften anzeigen", - "position.appearHere": "Ihre Position wird hier angezeigt.", - "position.create.invalidPrice": "Ungültiger Preis", - "position.create.invalidRange": "Ungültiger Bereich", - "position.create.modal.header": "Position erstellen", - "position.currentValue": "Aktueller Positionswert", - "position.deposit.description": "Geben Sie die Token-Beträge für Ihren Liquiditätsbeitrag an.", - "position.depositedCurrency": "Eingezahlt {{currencySymbol}}", - "position.hook.disclaimer": "Ich bin mir der potenziellen Risiken bewusst, die mit dem Hinzufügen dieses Hooks verbunden sind.", - "position.hook.donateWarning": "Diese Markierung kann zu Änderungen der verdienten Gebühren führen.", - "position.hook.liquidityWarning": "Dieses Flag kann dazu führen, dass der Pool die Hinzufügung neuer Liquidität blockiert. Ihre Transaktion kann rückgängig gemacht werden.", - "position.hook.removeWarning": "Kann dazu führen, dass Ihr Guthaben gesperrt wird oder Sie daran gehindert werden, Gebühren einzuziehen.", - "position.hook.swapWarning": "Dieses Flag kann es Liquiditätsanbietern ermöglichen, leichter Just-In-Time-Liquidität zu nutzen, was zu niedrigeren Gebühren führen kann.", - "position.hook.warningHeader": "Wichtig: Hakenrisiken erkannt", - "position.hook.warningInfo": "Wir haben bei diesem Hook potenzielle Risiken festgestellt. Bitte stellen Sie sicher, dass Sie die Funktionsweise dieses Hooks verstehen, bevor Sie fortfahren.", - "position.initialPrice": "Ursprünglicher Preis", - "position.initialPrice.info": "Legen Sie den Startwechselkurs zwischen den beiden von Ihnen bereitgestellten Token fest.", - "position.migrate.liquidity": "Beim Migrieren von Positionen können Sie Ihr Token-Paar nicht ändern, aber Sie können einen Hook hinzufügen, um die Funktionalität zu verbessern.", - "position.migrate.v4unsupportedChain": "Diese Kette wird für v4-Pools nicht unterstützt.", - "position.new": "Neue Position", - "position.new.protocol": "Neue {{protocol}} Position", - "position.noLiquidity": "Liquiditätsdaten nicht verfügbar.", - "position.noLiquidityData": "Es liegen keine Liquiditätsdaten vor.", - "position.notFound": "Position nicht gefunden", - "position.notFound.description": "Details zu dieser Position sind nicht verfügbar. Bitte überprüfen Sie, ob Sie mit der richtigen Brieftasche verbunden sind.", - "position.protocol": "{{protocol}} Position", - "position.provide.liquidity": "Wählen Sie die Token aus, für die Sie Liquidität bereitstellen möchten. Sie können Token in allen unterstützten Netzwerken auswählen.", - "position.provide.liquidityDescription": "Durch die Bereitstellung einer umfassenden Liquidität wird eine kontinuierliche Marktteilnahme bei allen möglichen Preisen gewährleistet. Dies bietet Einfachheit, birgt jedoch das Potenzial für höhere vorübergehende Verluste.", - "position.provide.liquidityDescription.custom": "Mit benutzerdefinierten Bereichen können Sie Ihre Liquidität innerhalb bestimmter Preisgrenzen konzentrieren. Dadurch verbessern Sie die Kapitaleffizienz und die Gebührenerträge, benötigen aber ein aktiveres Management.", - "position.removeHook": "Haken entfernen", - "position.resetDescription": "Ihre Token-, Preis- und Bereichsauswahl wird zurückgesetzt.", - "position.setRange": "Preisspanne festlegen", - "position.setRange.inputsBelow": "Verwenden Sie die folgenden Eingaben, um Ihren Bereich festzulegen.", - "position.step.deposit": "Einzahlungsbeträge eingeben", - "position.step.price": "Anfangspreis festlegen", - "position.step.range": "Preisspanne festlegen", - "position.step.select": "Token-Paar und Gebühren auswählen", - "position.value": "Positionswert", - "position.valueUnavailable": "Für diese Position ist derzeit kein USD-Wert verfügbar. Die eingezahlten Token-Beträge finden Sie in den Positionsdetails.", - "position.your": "Dein Standpunkt", - "positions.welcome": "Willkommen in Ihren Positionen", - "positions.welcome.connect": "Verbinden Sie Ihr Wallet, um Ihre aktuellen Positionen anzuzeigen.", - "privacy.anonymizedLogs": "Die App protokolliert anonymisierte Nutzungsstatistiken, um sich im Laufe der Zeit zu verbessern.", - "privacy.autoRouter": "Die App ruft die optimale Handelsroute von einem Uniswap Labs-Server ab.", - "privacy.infura": "Die App ruft On-Chain-Daten ab und erstellt Vertragsaufrufe mit einer Infura-API.", - "privacy.thirdPartyApis": "Diese App verwendet die folgenden APIs von Drittanbietern:", - "privacy.trm": "Die App sammelt Ihre Wallet-Adresse auf sichere Weise und gibt sie aus Risiko- und Compliance-Gründen an TRM Labs Inc. weiter.", - "privacy.uniswaptos": "Servicebedingungen von Uniswap Labs", - "qrScanner.button.connections_one": "1 App verbunden", - "qrScanner.button.connections_other": "{{count}} Apps verbunden", - "qrScanner.error.camera.message": "Um einen Code zu scannen, erlauben Sie den Kamerazugriff in den Systemeinstellungen", - "qrScanner.error.camera.title": "Kamera ist deaktiviert", - "qrScanner.error.none": "Kein QR-Code gefunden", - "qrScanner.recipient.action.scan": "Scannen Sie einen QR-Code", - "qrScanner.recipient.action.show": "Meinen QR-Code anzeigen", - "qrScanner.recipient.error.message": "Stellen Sie sicher, dass Sie einen gültigen QR-Code einer Ethereum-Adresse scannen, bevor Sie es erneut versuchen.", - "qrScanner.recipient.error.title": "Ungültiger QR-Code", - "qrScanner.request.message.unavailable": "Keine Nachricht gefunden.", - "qrScanner.request.method.default": "Anfrage von {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "Signaturanfrage von {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "Transaktionsanfrage von {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "Erlauben Sie die Verwendung von {{dappName}} bis zu {{amount}} {{currencySymbol}}?", - "qrScanner.request.withoutAmount": "Erlauben Sie {{dappName}} , Ihr {{currencySymbol}}zu verwenden?", - "qrScanner.status.connecting": "Verbinden...", - "qrScanner.status.loading": "Wird geladen...", - "qrScanner.title": "Scannen Sie einen QR-Code", - "qrScanner.wallet.networks": "Unterstützte Netzwerke", - "qrScanner.wallet.title": "Sie können Token und NFTs in allen unseren {{numOfNetworks}} unterstützten Netzwerken senden und empfangen.", - "range.outOfView": "Reichweite außerhalb des Sichtfelds", - "removeLiquidity.collectFees": "Sie erhalten außerdem das Honorar, das Sie in dieser Position verdienen.", - "removeLiquidity.outputEstimated": "Die Ausgabe ist geschätzt. Wenn sich der Preis um mehr als {{allowed}}% ändert, wird Ihre Transaktion rückgängig gemacht.", - "removeLiquidity.pendingText": "Entfernen von {{amtA}} {{symA}} und {{amtB}} {{symB}}", - "removeLiquidity.pooled": "Zusammengefasst {{symbol}}:", - "removeLiquidity.removing": "Entfernen von {{amt1}} {{symbol1}} und {{amt2}} {{symbol2}}", - "removeLiquidity.removingTokensTip": "Tipp: Durch das Entfernen von Pool-Token wird Ihre Position zum aktuellen Kurs, proportional zu Ihrem Anteil am Pool, wieder in zugrunde liegende Token umgewandelt. Nicht eingezogene Gebühren sind in den Beträgen enthalten, die Sie erhalten.", - "removeLiquidity.uniBurned": "UNI {{a}}/{{b}} Verbrannt", - "revoke.failed.message": "Dadurch erhält das Uniswap-Protokoll Zugriff auf Ihr Token für den Handel.", - "routing.aggregateLiquidity": "Sofern verfügbar, werden Liquiditätsquellen für bessere Preise und gasfreie Swaps aggregiert.", - "routing.cheapest": "Der Uniswap-Kunde wählt unter Berücksichtigung von Preis und Netzwerkkosten die günstigste Handelsoption aus.", - "routing.cheapest.v4": "Der Uniswap-Client wählt die optimale Handelsoption unter Berücksichtigung von Preis und Netzwerkkosten.", - "scantastic.code.expired": "Abgelaufen", - "scantastic.code.subtitle": "Geben Sie diesen Code in die Uniswap-Erweiterung ein. Ihre Wiederherstellungsphrase wird sicher verschlüsselt und übertragen.", - "scantastic.code.timeRemaining.shorthand.hours": "Neuer Code in {{hours}}h {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.minutes": "Neuer Code in {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.seconds": "Neuer Code in {{seconds}}s", - "scantastic.code.title": "Uniswap Einmalcode", - "scantastic.confirmation.button.continue": "Ja, weiter", - "scantastic.confirmation.label.browser": "Browser", - "scantastic.confirmation.label.device": "Gerät", - "scantastic.confirmation.subtitle": "Fahren Sie nur fort, wenn Sie einen QR-Code von der Uniswap-Erweiterung auf einem vertrauenswürdigen Gerät scannen.", - "scantastic.confirmation.title": "Versuchen Sie, Ihre Brieftasche zu importieren?", - "scantastic.confirmation.warning": "Hüten Sie sich vor Websites und Apps, die sich als Uniswap ausgeben. Andernfalls könnte Ihr Wallet gefährdet sein.", - "scantastic.error.encryption": "Die Vorbereitung der Seed-Phrase ist fehlgeschlagen.", - "scantastic.error.noCode": "Kein OTP empfangen. Bitte versuchen Sie es erneut.", - "scantastic.error.timeout.message": "Scannen Sie den QR-Code der Uniswap-Erweiterung erneut, um mit der Synchronisierung Ihres Wallets fortzufahren.", - "scantastic.error.timeout.title": "Ihre Verbindung ist abgelaufen", - "scantastic.modal.ipMismatch.description": "Um diesen QR-Code zu scannen, muss Ihr Telefon mit demselben WLAN-Netzwerk wie Ihr Computer verbunden sein und alle VPNs sollten vorübergehend ausgeschaltet sein.", - "scantastic.modal.ipMismatch.title": "Wechseln Sie Ihr WLAN-Netzwerk", - "search.chainComing": "Demnächst verfügbar: Suchen und erkunden Sie Token auf der {{chainName}} -Kette", - "search.results.count_one": "1 Artikel", - "search.results.count_other": "{{count}} Artikel", - "search.ukDisclaimer": "Haftungsausschluss für Einwohner des Vereinigten Königreichs", - "send.button.review": "Übertragung überprüfen", - "send.gas.error.title": "N / A", - "send.gas.networkCost.title": "Netzwerkkosten", - "send.input.token.balance.title": "Guthaben: {{balance}} {{symbol}}", - "send.recipient.header": "Empfänger auswählen", - "send.recipient.input.placeholder": "Suche ENS oder Adresse", - "send.recipient.previous_one": "1 vorheriger Transfer", - "send.recipient.previous_other": "{{count}} vorherige Überweisungen", - "send.recipient.results.empty": "keine Ergebnisse gefunden", - "send.recipient.results.error": "Die von Ihnen eingegebene Adresse existiert entweder nicht oder ist falsch geschrieben.", - "send.recipient.section.favorite": "Lieblings-Geldbörsen", - "send.recipient.section.recent": "Jüngste", - "send.recipient.section.search": "Suchergebnisse", - "send.recipient.section.viewOnly": "Nur-Ansicht-Wallets", - "send.recipient.section.yours": "Ihre Geldbörsen", - "send.recipient.warning.viewOnly.message": "Senden Sie nur dann Geld an dieses Wallet, wenn Sie über die Wiederherstellungsphrase verfügen oder den Besitzer des Wallets kennen.", - "send.recipient.warning.viewOnly.title": "Sie haben dies als Nur-Ansicht-Wallet", - "send.recipientSelect.search.empty.message": "Wenn Sie Token an eine Wallet-Adresse senden, werden sie hier angezeigt", - "send.recipientSelect.search.empty.title": "Keine Wallets gespeichert", - "send.review.modal.title": "Sie senden", - "send.review.summary.button.title": "Senden bestätigen", - "send.search.empty.subtitle": "Die von Ihnen eingegebene Adresse existiert entweder nicht oder ist falsch geschrieben.", - "send.search.empty.title": "keine Ergebnisse gefunden", - "send.search.placeholder": "Suche ENS oder Adresse", - "send.title": "Schicken", - "send.warning.blocked.default": "Dieses Wallet ist gesperrt", - "send.warning.blocked.modal.message": "Diese Adresse ist auf Uniswap Wallet gesperrt, da sie mit einer oder mehreren gesperrten Aktivitäten verknüpft ist. Wenn Sie glauben, dass dies ein Fehler ist, senden Sie bitte eine E-Mail an compliance@uniswap.org.", - "send.warning.blocked.modal.title": "Blockierte Adresse", - "send.warning.blocked.recipient": "Die Wallet des Empfängers ist gesperrt", - "send.warning.erc20.message": "Sie versuchen, Geld an eine Token-Adresse zu senden. Das Senden von Kryptowährungen an diese Art von Adresse kann zu einem dauerhaften Verlust der Mittel führen.", - "send.warning.erc20.title": "Dies ist eine Token-Adresse", - "send.warning.insufficientFunds.message": "Ihr Guthaben von {{currencySymbol}} hat sich verringert, seit Sie den Betrag eingegeben haben, den Sie senden möchten", - "send.warning.insufficientFunds.title": "Nicht genug {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "Nicht genug {{currencySymbol}} auf {{networkName}} zum Senden", - "send.warning.insufficientGas.message.withoutNetwork": "Nicht genug {{currencySymbol}} zum Senden", - "send.warning.modal.button.cta.blocking": "OK", - "send.warning.modal.button.cta.cancel": "Stornieren", - "send.warning.modal.button.cta.confirm": "Bestätigen", - "send.warning.newAddress.details.ENS": "ENS", - "send.warning.newAddress.details.username": "Nutzername", - "send.warning.newAddress.details.walletAddress": "Wallet-Adresse", - "send.warning.newAddress.message": "Sie haben mit dieser Adresse noch keine Transaktion durchgeführt. Bitte bestätigen Sie, dass die Adresse korrekt ist, bevor Sie fortfahren.", - "send.warning.newAddress.title": "Neue Adresse", - "send.warning.restore": "Stellen Sie Ihr Wallet wieder her, um zu senden", - "send.warning.self.message": "Sie versuchen, Geld an Ihr aktuelles Wallet zu senden. Das Senden von Kryptowährungen an diese Adresse verursacht unnötige Netzwerkkosten.", - "send.warning.self.title": "Dies ist Ihr aktuelles Portemonnaie", - "send.warning.smartContract.message": "Sie sind dabei, Token an einen speziellen Adresstyp zu senden – einen Smart Contract. Überprüfen Sie noch einmal, ob es die Adresse ist, an die Sie senden wollten. Wenn sie falsch ist, könnten Ihre Token für immer verloren gehen.", - "send.warning.smartContract.title": "Ist dies eine Wallet-Adresse?", - "send.warning.viewOnly.message": "Sie müssen diese Brieftasche über die Wiederherstellungsphrase importieren, um Assets zu senden.", - "send.warning.viewOnly.title": "Diese Brieftasche ist schreibgeschützt", - "sendRecipientForm.recentAddresses.label": "Aktuelles", - "sendReviewModal.title": "Bewertung senden", - "setting.recoveryPhrase.account.show": "Wiederherstellungsphrase anzeigen", - "setting.recoveryPhrase.action.hide": "Wiederherstellungsphrase verbergen", - "setting.recoveryPhrase.remove": "Wiederherstellungsphrase entfernen", - "setting.recoveryPhrase.remove.confirm.subtitle": "Mir ist bewusst, dass Uniswap Labs mir nicht dabei helfen kann, mein Wallet wiederherzustellen, wenn mir dies nicht gelingt.", - "setting.recoveryPhrase.remove.confirm.title": "Ich habe meine Wiederherstellungsphrase gespeichert", - "setting.recoveryPhrase.remove.initial.subtitle": "Stellen Sie sicher, dass Sie Ihre Wiederherstellungsphrase gespeichert haben. Andernfalls verlieren Sie den Zugriff auf Ihre Wallets", - "setting.recoveryPhrase.remove.initial.title": "Bevor Sie fortfahren", - "setting.recoveryPhrase.remove.password.error": "Falsches Passwort. Versuchen Sie es erneut.", - "setting.recoveryPhrase.remove.subtitle": "Geben Sie zur Bestätigung Ihr Passwort ein", - "setting.recoveryPhrase.remove.title": "Sie entfernen Ihre Wiederherstellungsphrase", - "setting.recoveryPhrase.title": "Ihre Wiederherstellungsphrase", - "setting.recoveryPhrase.view.warning.message1": "Jeder, der Ihre Wiederherstellungsphrase kennt, kann auf Ihr Wallet und Ihre Guthaben zugreifen", - "setting.recoveryPhrase.view.warning.message2": "Dies privat ansehen", - "setting.recoveryPhrase.view.warning.message3": "Teilen Sie es mit niemandem", - "setting.recoveryPhrase.view.warning.message4": "Geben Sie diese niemals auf Websites oder in Anwendungen ein.", - "setting.recoveryPhrase.view.warning.title": "Bevor Sie fortfahren", - "setting.recoveryPhrase.warning.screenshot.message": "Jeder, der Zugriff auf Ihre Fotos erhält, kann auf Ihr Wallet zugreifen. Wir empfehlen Ihnen, Ihre Worte stattdessen aufzuschreiben.", - "setting.recoveryPhrase.warning.screenshot.title": "Screenshots sind nicht sicher", - "setting.recoveryPhrase.warning.view.message": "Jeder, der Ihre Wiederherstellungsphrase kennt, kann auf Ihr Wallet und Ihre Guthaben zugreifen.", - "setting.recoveryPhrase.warning.view.title": "Sehen Sie sich dies an einem privaten Ort an", - "settings.action.enableInSettings": "In den Einstellungen aktivieren", - "settings.action.feedback": "Feedback teilen", - "settings.action.help": "Hilfe bekommen", - "settings.action.lock": "Geldbörse sperren", - "settings.action.privacy": "Datenschutzrichtlinie", - "settings.action.terms": "Nutzungsbedingungen", - "settings.footer": "Mit Liebe gemacht, \nUniswap-Team 🦄", - "settings.hideSmallBalances": "Kleine Guthaben verbergen", - "settings.maxSlippage": "Max. Schlupf", - "settings.screen.appearance.title": "Aussehen", - "settings.section.about": "Um", - "settings.section.preferences": "Einstellungen", - "settings.section.security": "Sicherheit", - "settings.section.support": "Unterstützung", - "settings.section.wallet.button.viewAll": "Alle ansehen", - "settings.section.wallet.button.viewLess": "Weniger ansehen", - "settings.section.wallet.label.viewOnly": "Nur anschauen", - "settings.section.wallet.title": "Wallet-Einstellungen", - "settings.setting.appearance.option.auto": "Auto", - "settings.setting.appearance.option.dark.subtitle": "Immer den Dunkelmodus verwenden", - "settings.setting.appearance.option.dark.title": "Dunkler Modus", - "settings.setting.appearance.option.device.subtitle": "Standardmäßig das Erscheinungsbild Ihres Geräts verwenden", - "settings.setting.appearance.option.device.title": "Geräteeinstellungen", - "settings.setting.appearance.option.light.subtitle": "Immer den Hellmodus verwenden", - "settings.setting.appearance.option.light.title": "Lichtmodus", - "settings.setting.appearance.title": "Aussehen", - "settings.setting.backup.create.description": "Durch das Festlegen eines Kennworts wird die Sicherung Ihrer Wiederherstellungsphrase verschlüsselt. Dies bietet eine zusätzliche Schutzebene für den Fall, dass Ihr {{cloudProviderName}} -Konto jemals kompromittiert wird.", - "settings.setting.backup.create.title": "Zurück zu {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "Da diese Wallets eine gemeinsame Wiederherstellungsphrase haben, werden auch die Backups für diese Wallets unten gelöscht.", - "settings.setting.backup.delete.confirm.title": "Bist du sicher?", - "settings.setting.backup.delete.warning": "Wenn Sie Ihr {{cloudProviderName}} -Backup löschen, können Sie Ihr Wallet nur mit einem manuellen Backup Ihrer Wiederherstellungsphrase wiederherstellen. Uniswap Labs kann Ihre Vermögenswerte nicht wiederherstellen, wenn Sie Ihre Wiederherstellungsphrase verlieren.", - "settings.setting.backup.error.message.full": "Die Wiederherstellungsphrase kann nicht auf {{cloudProviderName}}gesichert werden. Bitte stellen Sie sicher, dass Sie {{cloudProviderName}} mit verfügbarem Speicherplatz aktiviert haben, und versuchen Sie es erneut.", - "settings.setting.backup.error.message.short": "Sicherung kann nicht gelöscht werden", - "settings.setting.backup.error.title": "{{cloudProviderName}} Fehler", - "settings.setting.backup.modal.description": "Sie haben Ihre Wiederherstellungsphrase noch nicht auf {{cloudProviderName}} gesichert. Wenn Sie dies tun, können Sie Ihr Wallet wiederherstellen, indem Sie sich auf einem beliebigen Gerät einfach bei {{cloudProviderName}} anmelden.", - "settings.setting.backup.modal.title": "Wiederherstellungsphrase auf {{cloudProviderName}}sichern?", - "settings.setting.backup.password.error.mismatch": "Passwörter stimmen nicht überein", - "settings.setting.backup.password.medium": "Dies ist ein mittleres Passwort", - "settings.setting.backup.password.placeholder.confirm": "Bestätige das Passwort", - "settings.setting.backup.password.placeholder.create": "Passwort erstellen", - "settings.setting.backup.password.strong": "Dies ist ein sicheres Passwort", - "settings.setting.backup.password.weak": "Dies ist ein schwaches Passwort", - "settings.setting.backup.recoveryPhrase.label": "Wiederherstellungsphrase", - "settings.setting.backup.selected": "{{cloudProviderName}} Sicherung", - "settings.setting.backup.status.action.delete": "Backup löschen", - "settings.setting.backup.status.complete": "Gesichert auf {{cloudProviderName}}", - "settings.setting.backup.status.description": "Indem Sie Ihre Wiederherstellungsphrase auf {{cloudProviderName}}sichern, können Sie Ihr Wallet wiederherstellen, indem Sie sich einfach auf einem beliebigen Gerät bei Ihrem {{cloudProviderName}} -Konto anmelden.", - "settings.setting.backup.status.inProgress": "Sichern auf {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "Gesichert", - "settings.setting.backup.status.title": "{{cloudProviderName}} Sicherung", - "settings.setting.beta.tooltip": "Demnächst", - "settings.setting.biometrics.appAccess.subtitle.android": "Biometrie zum Öffnen der App erforderlich", - "settings.setting.biometrics.appAccess.subtitle.ios": "Zum Öffnen der App ist {{biometricsMethod}} erforderlich", - "settings.setting.biometrics.appAccess.title": "App-Zugriff", - "settings.setting.biometrics.auth": "Bitte authentifizieren", - "settings.setting.biometrics.off.message.android": "Die Biometrie ist derzeit für Uniswap Wallet deaktiviert – Sie können sie in Ihren Systemeinstellungen aktivieren.", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} ist derzeit für Uniswap Wallet deaktiviert – Sie können es in Ihren Systemeinstellungen aktivieren.", - "settings.setting.biometrics.off.title.android": "Biometrie ist deaktiviert", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} ist ausgeschaltet", - "settings.setting.biometrics.title": "Biometrie", - "settings.setting.biometrics.transactions.subtitle.android": "Biometrische Daten für Transaktionen erforderlich", - "settings.setting.biometrics.transactions.subtitle.ios": "Für die Transaktion ist {{biometricsMethod}} erforderlich", - "settings.setting.biometrics.transactions.title": "Transaktionen", - "settings.setting.biometrics.unavailable.message.android": "Auf Ihrem Gerät ist die Biometrie nicht eingerichtet. Um Biometrie zu verwenden, richten Sie sie zunächst in den Einstellungen ein.", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} ist auf Ihrem Gerät nicht eingerichtet. Um {{biometricsMethod}}zu verwenden, richten Sie es zuerst in den Einstellungen ein.", - "settings.setting.biometrics.unavailable.title.android": "Biometrie ist nicht eingerichtet", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} ist nicht eingerichtet", - "settings.setting.biometrics.warning.message.android": "Wenn Sie die Biometrie nicht aktivieren, kann jeder, der Zugriff auf Ihr Gerät erhält, Uniswap Wallet öffnen und Transaktionen durchführen.", - "settings.setting.biometrics.warning.message.ios": "Wenn Sie {{biometricsMethod}}nicht aktivieren, kann jeder, der Zugriff auf Ihr Gerät erhält, Uniswap Wallet öffnen und Transaktionen durchführen.", - "settings.setting.biometrics.warning.title": "Bist du sicher?", - "settings.setting.connections.disconnectAll": "Trennen Sie alle", - "settings.setting.connections.noConnectionsDescription": "Stellen Sie eine Verbindung zu einer App her, indem Sie nach der Schaltfläche „Wallet verbinden“ oder „Anmelden“ suchen.", - "settings.setting.currency.title": "Landeswährung", - "settings.setting.hapticTouch.title": "Haptische Berührung", - "settings.setting.helpCenter.title": "Hilfezentrum", - "settings.setting.language.button.navigate": "Gehe zu den Einstellungen", - "settings.setting.language.description.extension": "Uniswap verwendet standardmäßig Ihre Systemspracheneinstellungen. Um Ihre bevorzugte Sprache zu ändern, gehen Sie zu Ihren Systemeinstellungen.", - "settings.setting.language.description.mobile": "Uniswap verwendet standardmäßig die Spracheinstellungen Ihres Geräts. Um Ihre bevorzugte Sprache zu ändern, gehen Sie in Ihren Geräteeinstellungen zu „Uniswap“ und tippen Sie auf „Sprache“.", - "settings.setting.language.title": "Sprache", - "settings.setting.notifications.row.activity.description": "Übertragungen, Anfragen und andere Aktivitäten", - "settings.setting.notifications.row.activity.title": "Wallet-Aktivität", - "settings.setting.notifications.row.priceAlerts.description": "Große Preisänderungen für favorisierte Token", - "settings.setting.notifications.row.priceAlerts.title": "Preisalarme", - "settings.setting.notifications.row.updates.description": "Empfehlungen und neue Funktionen", - "settings.setting.notifications.row.updates.title": "Updates von Uniswap", - "settings.setting.notifications.title": "Benachrichtigungen", - "settings.setting.password.title": "Kennwort ändern", - "settings.setting.privacy.analytics.description": "Wir verwenden anonyme Nutzungsdaten, um Ihr Erlebnis mit Uniswap Labs-Produkten zu verbessern. Wenn diese Option deaktiviert ist, erfassen wir nur Fehler und die notwendige Nutzung.", - "settings.setting.privacy.analytics.title": "Analysen zulassen", - "settings.setting.privacy.title": "Privatsphäre", - "settings.setting.recoveryPhrase.password.title": "Geben Sie Ihr Passwort ein", - "settings.setting.recoveryPhrase.title": "Wiederherstellungsphrase", - "settings.setting.smallBalances.title": "Kleine Guthaben verbergen", - "settings.setting.unknownTokens.title": "Unbekannte Token ausblenden", - "settings.setting.wallet.action.editLabel": "Beschriftung bearbeiten", - "settings.setting.wallet.action.editProfile": "Profil bearbeiten", - "settings.setting.wallet.action.remove": "Brieftasche entfernen", - "settings.setting.wallet.connections.title": "Anschlüsse", - "settings.setting.wallet.editLabel.description": "Labels sind nicht öffentlich. Sie werden lokal gespeichert und sind nur für Sie sichtbar.", - "settings.setting.wallet.editLabel.save": "Änderungen speichern", - "settings.setting.wallet.label": "Spitzname", - "settings.setting.wallet.testnetMode.description": "Dadurch werden Testnetze aktiviert, damit Entwickler Funktionen und Transaktionen ausprobieren können, ohne echte Vermögenswerte zu verwenden. Token in Testnetzen haben keinen echten Wert.", - "settings.setting.wallet.testnetMode.title": "Testnet-Modus", - "settings.switchNetwork.warning": "Um Uniswap auf {{label}}zu verwenden, wechseln Sie das Netzwerk in den Einstellungen Ihres Wallets.", - "settings.title": "Einstellungen", - "settings.version": "Version {{appVersion}}", - "speedBump.newAddress.warning.description": "Sie haben mit dieser Adresse noch keine Transaktion durchgeführt. Stellen Sie sicher, dass es die richtige Adresse ist, bevor Sie fortfahren.", - "speedBump.newAddress.warning.title": "Neue Adresse", - "speedBump.smartContractAddress.warning.description": "Sie sind dabei, Token an eine spezielle Art von Adresse zu senden – einen Smart Contract. Überprüfen Sie noch einmal, ob es die Adresse ist, an die Sie senden wollten. Wenn sie falsch ist, könnten Ihre Token für immer verloren gehen.", - "speedBump.smartContractAddress.warning.title": "Ist dies eine Wallet-Adresse?", - "stats.24fees": "24-Stunden-Gebühren", - "stats.24volume": "24-Stunden-Lautstärke", - "stats.allTimeFees": "Alle LP-Gebühren", - "stats.allTimeSwappers": "Alle Zeitwechsler", - "stats.allTimeVolume": "Gesamtvolumen", - "stats.fdv": "FDV", - "stats.fdv.description": "Die vollständig verwässerte Bewertung (FDV) berechnet den Gesamtmarktwert unter der Annahme, dass alle Token im Umlauf sind.", - "stats.marketCap": "Marktkapitalisierung", - "stats.marketCap.description": "Die Marktkapitalisierung ist der gesamte Marktwert des im Umlauf befindlichen Angebots eines Vermögenswerts.", - "stats.tvl": "Gesperrter Gesamtwert", - "stats.tvl.description": "Der Total Value Locked (TVL) ist die Gesamtmenge des Vermögenswerts, die in allen Liquiditätspools von Uniswap v3 verfügbar ist.", - "stats.volume.1d": "1-Tage-Volumen", - "stats.volume.1d.description": "Das 1-Tages-Volumen ist die Menge des Vermögenswerts, die während der letzten 24 Stunden auf Uniswap v3 gehandelt wurde.", - "stats.volume.1d.short": "1D Band", - "stats.volume.description": "Das Volumen ist die Menge des Vermögenswerts, die während des ausgewählten Zeitraums auf Uniswap v3 gehandelt wurde.", - "swap.allow.oneTime": "Erlaube {{sym}} (einmal)", - "swap.approvalNeeded": "Für die Verwendung dieses Tokens ist eine Genehmigung erforderlich. ", - "swap.approvalPending": "Bestätigung ausstehend", - "swap.approveAndSubmit": "Genehmigen und absenden", - "swap.approveAndSwap": "Genehmigen und austauschen", - "swap.approveInWallet": "Genehmigen Sie in Ihrer Brieftasche", - "swap.balance.amount": "Guthaben: {{amount}}", - "swap.bestRoute.cost": "Die Netzwerkkosten für die effizienteste Route betragen schätzungsweise{{gasPrice}} . ", - "swap.details.estimatedTime": "Geschätzte Zeit", - "swap.bridging.title": "Netzwerkübergreifendes Swapping", - "swap.bridging.warning.description": "Sie wechseln von {{fromNetwork}} zu {{toNetwork}}. Dies wird auch als „Bridging“ bezeichnet und verschiebt Ihre Token von einem Netzwerk in ein anderes.", - "swap.button.max": "Max", - "swap.button.review": "Rezension", - "swap.button.submitting": "Tausch wird übermittelt...", - "swap.button.submitting.keep.open": "Halten Sie Ihr Portemonnaie offen...", - "swap.button.swap": "Tauschen", - "swap.button.swapAnyways": "Tauschen Sie trotzdem", - "swap.button.unwrap": "Auspacken", - "swap.button.wrap": "Wickeln", - "swap.buy.countryModal.placeholder": "Suche nach Land oder Region", - "swap.cancel.cannotExecute_one": "Ihr Tausch könnte ausgeführt werden, bevor die Stornierung bearbeitet wird. Ihre Netzwerkkosten können nicht erstattet werden. Möchten Sie fortfahren?", - "swap.cancel.cannotExecute_other": "Ihre Swaps könnten ausgeführt werden, bevor die Stornierung bearbeitet wird. Ihre Netzwerkkosten können nicht erstattet werden. Möchten Sie fortfahren?", - "swap.confirmLimit": "Limit bestätigen", - "swap.confirmSwap": "Tausch bestätigen", - "swap.deadline.settings.title": "Transaktionsfrist", - "swap.deadline.settings.title.short": "Sendefrist", - "swap.details.feeOnTransfer": "{{tokenSymbol}} Gebühr", - "swap.details.feeOnTransfer.default": "Token-Gebühr", - "swap.details.newQuote.input": "Neuer Input", - "swap.details.newQuote.output": "Neue Ausgabe", - "swap.details.orderRouting": "Auftragsrouting", - "swap.details.orderRoutingInfo": "Dieser Austausch wird über Across geleitet, ein dezentrales Protokoll, das Vermögenswerte über Netzwerke hinweg verschiebt und dabei Sicherheit, schnelle Ausführung und niedrige Preise priorisiert.", - "swap.details.poweredBy": "Angetrieben von", - "swap.details.rate": "Rate", - "swap.details.slippage": "Maximaler Schlupf", - "swap.details.uniswapFee": "Gebühr", - "swap.enterAmount": "Geben Sie den Betrag {{sym}} ein", - "swap.error.default": "Möglicherweise müssen Sie Ihre Slippage-Toleranz erhöhen. Hinweis: Fee-on-Transfer- und Rebase-Token sind mit Uniswap V3 nicht kompatibel.", - "swap.error.expectedToFail": "Ihr Austausch wird voraussichtlich fehlschlagen.", - "swap.error.modifiedByWallet": "Ihr Tausch wurde über Ihr Wallet geändert. Wenn dies ein Fehler war, brechen Sie ihn bitte sofort ab, da Sie sonst Ihr Geld verlieren könnten.", - "swap.error.rejected": "Transaktion abgelehnt", - "swap.error.undefinedObject": "Beim Versuch, diesen Tausch auszuführen, ist ein Fehler aufgetreten. Möglicherweise müssen Sie Ihre Slippage-Toleranz erhöhen. Wenn das nicht funktioniert, liegt möglicherweise eine Inkompatibilität mit dem Token vor, mit dem Sie handeln. Hinweis: Fee-on-Transfer- und Rebase-Token sind mit Uniswap V3 nicht kompatibel.", - "swap.error.unknown": "Unbekannter Fehler.", - "swap.error.v2.expired": "Diese Transaktion konnte nicht gesendet werden, da die Frist abgelaufen ist. Bitte überprüfen Sie, ob Ihre Transaktionsfrist nicht zu niedrig ist.", - "swap.error.v2.k": "Die Uniswap-Invariante x*y=k wurde durch den Tausch nicht erfüllt. Das bedeutet normalerweise, dass eines der Token, die Sie tauschen, beim Übertragen ein benutzerdefiniertes Verhalten aufweist.", - "swap.error.v2.slippage": "Diese Transaktion wird entweder aufgrund von Preisschwankungen oder Gebühren bei der Überweisung nicht erfolgreich sein. Versuchen Sie, Ihre Slippage-Toleranz zu erhöhen.", - "swap.error.v2.transferInput": "Der Eingabetoken kann nicht übertragen werden. Möglicherweise liegt ein Problem mit dem Eingabetoken vor.", - "swap.error.v2.transferOutput": "Das Ausgabetoken kann nicht übertragen werden. Möglicherweise liegt ein Problem mit dem Ausgabetoken vor.", - "swap.error.v3.slippage": "Diese Transaktion wird aufgrund der Preisbewegung nicht erfolgreich sein. Versuchen Sie, Ihre Slippage-Toleranz zu erhöhen. Hinweis: Gebühren für Transfer- und Rebase-Token sind mit Uniswap V3 nicht kompatibel.", - "swap.error.v3.transferOutput": "Das Ausgabetoken kann nicht übertragen werden. Möglicherweise liegt ein Problem mit dem Ausgabetoken vor. Hinweis: Gebühren für Übertragungen und Rebase-Token sind mit Uniswap V3 nicht kompatibel.", - "swap.estimatedDifference.label": "Aufgrund der aktuellen Liquidität besteht zwischen Ihren Eingabe- und Ausgabewerten eine große Differenz.", - "swap.fail.message": "Versuchen Sie, den Schlupf auf einen höheren Wert einzustellen.", - "swap.fail.uniswapX": "Der Tausch konnte mit UniswapX nicht abgeschlossen werden. Versuchen Sie Ihren Tausch erneut, um ihn über die klassische Uniswap-API zu leiten.", - "swap.fees.experience": "Diese Gebühr wird auf einige Token-Paare angewendet, um das beste Erlebnis mit Uniswap zu gewährleisten. Sie wird im Ausgabe-Token bezahlt und ist bereits im Angebot berücksichtigt.", - "swap.fees.noFee": "Um das beste Erlebnis mit Uniswap zu gewährleisten, werden auf ausgewählte Token-Paare Gebühren erhoben. Für diesen Tausch fallen keine Gebühren an.", - "swap.fetchingBestPrice": "Bester Preis wird abgerufen …", - "swap.fetchingPrice": "Preis wird abgerufen...", - "swap.finalizingQuote": "Angebot wird finalisiert...", - "swap.form.header": "Tauschen", - "swap.form.insufficientLiquidity": "Nicht ausreichende Liquidität für diesen Handel.", - "swap.form.pocketUniverseExtension.warning": "Die Pocket Universe-Erweiterung verstößt gegen unsere , indem sie unser Produkt auf eine Weise ändert, die irreführend ist und Benutzern schaden könnte. Bitte deaktivieren Sie die Erweiterung und laden Sie die Seite neu.", - "swap.form.warning.output.fotFees": "Aufgrund der Token-Gebühr von {{fotCurrencySymbol}}können Swap-Beträge nur über das Eingabefeld eingegeben werden", - "swap.form.warning.output.fotFees.fallback": "Aufgrund von Token-Gebühren können Swap-Beträge nur über das Eingabefeld eingegeben werden", - "swap.form.warning.restore": "Stellen Sie Ihr Wallet zum Tauschen wieder her", - "swap.frontrun.warning": "Ihre Transaktion kann vorzeitig abgeschlossen werden und zu einem ungünstigen Handel führen.", - "swap.header.viewOnly": "Nur anschauen", - "swap.impactOfTrade": "Die Auswirkungen Ihres Handels auf den Marktpreis dieses Pools.", - "swap.inputEstimated.atMost": "Die Eingabe ist geschätzt. Sie werden höchstens verkaufen, sonst wird die Transaktion rückgängig gemacht.", - "swap.limit": "Grenze", - "swap.limitedAssets.warning": "Einige Assets sind über diese Schnittstelle nicht verfügbar, da sie möglicherweise nicht gut mit den Smart Contracts funktionieren oder wir den Handel aus rechtlichen Gründen nicht zulassen können.", - "swap.limitFilled": "Limit erreicht!", - "swap.limitSubmitted": "Limit übermittelt", - "swap.marketPrice.outsideRange.label": "Der Marktpreis liegt außerhalb Ihrer angegebenen Preisspanne. Nur Einzelvermögenseinzahlung.", - "swap.maxPriceSlip.revert": "Der maximale Betrag, den Sie garantiert ausgeben können. Wenn der Preis weiter sinkt, wird Ihre Transaktion rückgängig gemacht.", - "swap.minPriceSlip.revert": "Wenn sich der Preis so bewegt, dass Sie weniger als {{amount}}erhalten, wird Ihre Transaktion rückgängig gemacht.", - "swap.networkCost.paidIn": "Um eine Transaktion durchführen zu können, werden die Netzwerkkosten in {{sym}} im {{chainName}} Netzwerk bezahlt.", - "swap.orderRouting": "Auftragsrouting", - "swap.outputEstimated.atLeast": "Die Ausgabe wird geschätzt. Sie erhalten mindestens , sonst wird die Transaktion rückgängig gemacht.", - "swap.payAnyway": "Trotzdem bezahlen", - "swap.payAtMost": "Bezahlen Sie höchstens", - "swap.payWith": "Bezahlen mit", - "swap.placeOrder": "Bestellung aufgeben", - "swap.priceImpact": "Preisauswirkungen", - "swap.receive.atLeast": "Erhalten Sie mindestens", - "swap.request.title.full": "Tausche {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "Token tauschen", - "swap.review": "Rezensionstausch", - "swap.review.summary": "Du tauschst", - "swap.reviewLimit": "Überprüfungslimit", - "swap.route.optimizedGasCost": "Diese Route berücksichtigt geteilte Routen, mehrere Hops und die Netzwerkkosten jedes Schritts.", - "swap.settings.deadline.tooltip": "Ihre Transaktion wird rückgängig gemacht, wenn sie länger als diesen Zeitraum aussteht. (Maximal: 3 Tage).", - "swap.settings.deadline.warning": "Hohe Frist", - "swap.settings.protection.description": "Wenn der Swap-Schutz aktiviert ist, sind Ihre Ethereum-Transaktionen vor Sandwich-Angriffen geschützt und die Wahrscheinlichkeit eines Fehlers ist geringer.", - "swap.settings.protection.subtitle.supported": "{{chainName}} Netzwerk", - "swap.settings.protection.subtitle.unavailable": "Nicht verfügbar am {{chainName}}", - "swap.settings.protection.title": "Swap-Schutz", - "swap.settings.routingPreference.option.default.description": "Wenn Sie diese Option auswählen, wird die effizienteste Route für Ihren Tausch ermittelt.", - "swap.settings.routingPreference.option.default.description.preV4": "Der Uniswap-Kunde wählt unter Berücksichtigung von Preis und Netzwerkkosten die günstigste Handelsoption aus.", - "swap.settings.routingPreference.option.default.tooltip": "Eine Route wird unter Berücksichtigung von v2-, v3- und bestimmten v4-Pools identifiziert, wobei die geschätzten Auswirkungen auf den Preis und die Netzwerkkosten miteinbezogen werden.", - "swap.settings.routingPreference.option.v2.title": "V2-Pools", - "swap.settings.routingPreference.option.v3.title": "V3-Pools", - "swap.settings.routingPreference.option.v4.title": "v4-Pools", - "swap.settings.routingPreference.title": "Handelsoptionen", - "swap.settings.slippage.alert": "Hoher Schlupf", - "swap.settings.slippage.control.auto": "Auto", - "swap.settings.slippage.description": "Ihre Transaktion wird rückgängig gemacht, wenn sich der Preis um mehr als den Slippage-Prozentsatz ändert.", - "swap.settings.slippage.input.message": "Wenn der Preis weiter sinkt, wird Ihre Transaktion rückgängig gemacht. Unten sehen Sie den Mindestbetrag, den Sie garantiert erhalten.", - "swap.settings.slippage.input.receive.title": "Erhalten Sie mindestens", - "swap.settings.slippage.output.message": "Wenn der Preis weiter sinkt, wird Ihre Transaktion rückgängig gemacht. Unten sehen Sie den Höchstbetrag, den Sie ausgeben müssen.", - "swap.settings.slippage.output.spend.title": "Geben Sie höchstens", - "swap.settings.slippage.warning": "Sehr hoher Schlupf", - "swap.settings.slippage.warning.description": "Ein Slippage von über 20 % führt wahrscheinlich zu einem ungünstigen Handel. Um das Risiko eines Frontruns zu verringern, verringern Sie Ihre Einstellungen.", - "swap.settings.slippage.warning.hover": "Dies kann zu einem ungünstigen Handel führen. Versuchen Sie, Ihre Slippage-Einstellung zu verringern.", - "swap.settings.slippage.warning.max": "Geben Sie einen Wert kleiner als {{maxSlippageTolerance}}ein", - "swap.settings.slippage.warning.message": "Der Schlupf kann höher sein als nötig", - "swap.settings.slippage.warning.min": "Geben Sie einen Wert größer als 0 ein", - "swap.settings.title": "Einstellungen vertauschen", - "swap.settings.transactionRevertPrice": "Bei einer ungünstigen Preisänderung um mehr als diesen Prozentsatz wird Ihre Transaktion rückgängig gemacht.", - "swap.signAndSwap": "Unterschreiben und tauschen", - "swap.slippage.amt": "{{amt}} Schlupf", - "swap.slippage.bridging": "Kein Schlupf beim Wechsel zwischen Netzwerken", - "swap.slippage.settings.title": "Slippage-Einstellungen", - "swap.slippage.tooltip": "Die maximale Preisbewegung vor Ihrer Transaktion wird wiederhergestellt.", - "swap.slippageBelow.warning": "Ein Slippage unter {{amt}} kann zu einer fehlgeschlagenen Transaktion führen", - "swap.submitted": "Tausch eingereicht", - "swap.success": "Tauscherfolg!", - "swap.taxTooltip.label": "Nur exakte Eingabe", - "swap.taxTooltip.noTokenSelected": "Die Gebühren für das ausgewählte Ausgabetoken ermöglichen keine genauen Ausgaben. Verwenden Sie stattdessen das Feld „Verkaufen“.", - "swap.taxTooltip.tokenSelected": "{{tokenSymbol}} Gebühren ermöglichen keine genauen Ergebnisse. Verwenden Sie stattdessen das Feld „Verkaufen“.", - "swap.tokenOwnFees": "Für einige Token wird beim Kauf oder Verkauf eine Gebühr erhoben, die vom Token-Emittenten festgelegt wird. Uniswap erhält keine dieser Gebühren.", - "swap.total": "Gesamt", - "swap.tradeRoutes": "Handelsrouten", - "swap.transaction.deadline": "Transaktionsfrist", - "swap.transaction.revertAfter": "Ihre Transaktion wird rückgängig gemacht, wenn sie länger als diesen Zeitraum aussteht.", - "swap.unsupportedAssets.readMore": "Mehr zu nicht unterstützten Assets", - "swap.warning.enterLargerAmount.title": "Geben Sie einen größeren Betrag ein", - "swap.warning.expectedFailure.increaseSlippage": "Versuchen Sie, Ihren Schlupf zu erhöhen.", - "swap.warning.expectedFailure.titleMay": "Dieser Austausch kann fehlschlagen", - "swap.warning.insufficientBalance.title": "Du hast nicht genug {{currencySymbol}}", - "swap.warning.insufficientGas.button": "Nicht genug {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "Tausche {{ tokenSymbol }} gegen {{networkName}}aus", - "swap.warning.insufficientGas.button.buy": "Kaufen {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "Mit Karte kaufen", - "swap.warning.insufficientGas.message.withNetwork": "Nicht genug {{currencySymbol}} auf {{networkName}} zum Tauschen", - "swap.warning.insufficientGas.message.withoutNetwork": "Nicht genug {{currencySymbol}} zum Tauschen", - "swap.warning.insufficientGas.title": "Sie haben nicht genug {{currencySymbol}} , um die Netzwerkkosten zu decken", - "swap.warning.networkFee.allow": "Erlaube {{ inputTokenSymbol }} (einmal)", - "swap.warning.networkFee.highRelativeToValue": "Die Netzwerkkosten übersteigen 10 % Ihres gesamten Transaktionswerts.", - "swap.warning.networkFee.highRelativeToValue.unichain": "Die Netzwerkkosten übersteigen 10 % Ihres gesamten Transaktionswerts.", - "swap.warning.networkFee.message": "Dies sind die Kosten für die Verarbeitung Ihrer Transaktion auf der Blockchain. Uniswap erhält keinen Anteil an diesen Gebühren.", - "swap.warning.networkFee.message.unichain": "Dies sind die Kosten für die Verarbeitung Ihrer Transaktion auf der Blockchain.", - "swap.warning.networkFee.message.uniswapX": "Dies sind die Kosten für die Verarbeitung Ihrer Transaktion auf der Blockchain. Uniswap erhält keinen Anteil dieser Gebühren. UniswapX aggregiert Liquiditätsquellen für bessere Preise und gasfreie Swaps.", - "swap.warning.networkFee.message.uniswapX.unichain": "Dies sind die Kosten für die Verarbeitung Ihrer Transaktion auf der Blockchain. UniswapX aggregiert Liquiditätsquellen für bessere Preise und gasfreie Swaps.", - "swap.warning.networkFee.wrap": "ETH verpacken", - "swap.warning.noQuotesFound.bridging.message": "Keine Überbrückungszitate gefunden. Versuchen Sie es jetzt mit der offiziellen Brücke.", - "swap.warning.noQuotesFound.title": "Keine Zitate gefunden", - "swap.warning.noRoutesFound.message": "Für die von Ihnen ausgewählten Token sind derzeit keine Routen verfügbar. Bitte versuchen Sie es mit einem anderen Paar oder schauen Sie später noch einmal vorbei.", - "swap.warning.noRoutesFound.title": "Keine Routen verfügbar", - "swap.warning.offline.message": "Möglicherweise ist Ihre Internetverbindung verloren gegangen oder das Netzwerk ausgefallen. Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.", - "swap.warning.offline.title": "Du bist offline", - "swap.warning.priceImpact": "Diese Transaktion hat einen Preiseffekt von auf den Marktpreis dieses Pools. Möchten Sie fortfahren?", - "swap.warning.priceImpact.message": "Aufgrund der derzeit verfügbaren Liquidität von {{outputCurrencySymbol}} gilt: Je mehr {{inputCurrencySymbol}} Sie zu tauschen versuchen, desto weniger {{outputCurrencySymbol}} erhalten Sie.", - "swap.warning.priceImpact.message.veryHigh": "Diese Transaktion hat einen Preiseinfluss von {{priceImpactValue}} auf den Marktpreis dieses Pools und führt zu einem Verlust von Geldern.", - "swap.warning.priceImpact.title": "Hoher Preiseinfluss ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "Sehr hoher Preiseinfluss ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "Ihre Transaktion wurde nicht übermittelt, da Sie die App geschlossen haben.", - "swap.warning.queuedOrder.approvalFailed": "Ihre Transaktion wurde nicht übermittelt, da die Token-Genehmigung fehlgeschlagen ist.", - "swap.warning.queuedOrder.stale": "Ihre Transaktion wurde nicht übermittelt, weil Sie die App geschlossen haben oder die Genehmigung zu lange gedauert hat.", - "swap.warning.queuedOrder.submissionFailed": "Beim Senden Ihrer Transaktion ist ein Problem aufgetreten.", - "swap.warning.queuedOrder.title": "Tausch abgebrochen", - "swap.warning.queuedOrder.wrap.message": "Ihr ETH bleibt als WETH verpackt.", - "swap.warning.queuedOrder.wrapFailed": "Ihre Transaktion wurde nicht übermittelt, da die Wrap-Transaktion fehlgeschlagen ist.", - "swap.warning.rateLimit.message": "Bitte versuchen Sie es in ein paar Minuten noch einmal.", - "swap.warning.rateLimit.title": "Frequenzgrenze überschritten", - "swap.warning.router.message": "Möglicherweise ist die Verbindung verloren gegangen oder das Netzwerk ist ausgefallen. Wenn das Problem weiterhin besteht, versuchen Sie es später erneut.", - "swap.warning.router.title": "Dieser Handel kann momentan nicht abgeschlossen werden", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} ist blockiert", - "swap.warning.uniswapFee.message.default": "Um das beste Erlebnis mit Uniswap zu gewährleisten, fallen Gebühren an. Für diesen Swap fallen keine Gebühren an.", - "swap.warning.uniswapFee.message.included": "Um das beste Erlebnis mit Uniswap zu gewährleisten, fallen Gebühren an, die in diesem Angebot bereits berücksichtigt sind.", - "swap.warning.uniswapFee.title": "Swap-Gebühr", - "swap.warning.viewOnly.message": "Sie müssen diese Brieftasche über die Wiederherstellungsphrase importieren, um Token auszutauschen.", - "swap.wrap.token": "Umbruch {{sym}}", - "tdp.balanceSummary.otherNetworks": "In anderen Netzwerken", - "tdp.balanceSummary.otherNetworksBalance": "Guthaben in anderen Netzwerken", - "tdp.balanceSummary.title": "Dein Kontostand", - "tdp.invalidTokenPage.switchChainPrompt": "Wechseln zu {{network}}", - "tdp.invalidTokenPage.title": "Dieses Token existiert nicht", - "tdp.invalidTokenPage.titleWithChain": "Dieses Token existiert nicht auf {{network}}", - "tdp.loading.title.default": "Token-Daten für ", - "tdp.loading.title.withChain": "Token-Daten für am {{chainName}}", - "tdp.nameNotFound": "Name nicht gefunden", - "tdp.noInfoAvailable": "Keine Token-Informationen verfügbar", - "tdp.noTestnetSupportDescription": "Einige Testnetze unterstützen das Tauschen, Senden oder Kaufen von Token nicht.", - "tdp.stats.unsupportedChainDescription": "Token-Statistiken und Diagramme für {{chain}} sind verfügbar auf {{infoLink}}", - "tdp.symbolNotFound": "Symbol nicht gefunden", - "testnet.modal.swapDeepLink.description.toProdMode": "Für diese Aktion muss der Testnet-Modus deaktiviert sein. Der Testnet-Modus kann jederzeit in den Einstellungen wieder aktiviert werden.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "Für diese Aktion muss der Testnet-Modus aktiviert sein. Token in Testnetzen haben keinen realen Wert. Der Testnet-Modus kann jederzeit in den Einstellungen deaktiviert werden.", - "testnet.modal.swapDeepLink.title.toProdMode": "Testnet-Modus deaktivieren", - "testnet.modal.swapDeepLink.title.toTestnetMode": "Testnet-Modus aktivieren", - "testnet.unsupported": "Diese Funktionalität wird im Testnet-Modus nicht unterstützt.", - "themeToggle.theme": "Thema", - "title.betterPricesMoreListings": "Bessere Preise. Mehr Angebote. Kaufen, verkaufen und handeln Sie NFTs auf Top-Marktplätzen wie OpenSea. Entdecken Sie trendige Sammlungen.", - "title.buySellTradeEthereum": "Kaufen, verkaufen und handeln Sie Ethereum und andere Top-Token auf Uniswap", - "title.createGovernanceOn": "Erstellen Sie einen neuen Governance-Vorschlag für Uniswap", - "title.createGovernanceTo": "Erstellen Sie einen neuen Governance-Vorschlag, über den UNI-Inhaber abstimmen können. UNI-Token repräsentieren Stimmrechte in der Uniswap-Governance.", - "title.earnFees": "Verdienen Sie Gebühren, wenn andere auf Uniswap tauschen, indem Sie Token zu Liquiditätspools hinzufügen.", - "title.easilyRemove": "Entfernen Sie Ihre Liquidität einfach von Uniswap v2 und zahlen Sie sie in Uniswap v3 ein.", - "title.easilyRemoveV4": "Entfernen Sie Ihre Liquidität einfach von Uniswap v2 und v3, um sie in Uniswap v4 einzuzahlen.", - "title.explore": "Entdecken Sie NFTs auf Uniswap", - "title.exploreNFTs": "Entdecken und kaufen Sie NFTs auf den Top-Marktplätzen von Uniswap", - "title.manageNFT": "Verwalten Sie Ihre NFT-Sammlung. Zeigen Sie Merkmale, Handelsaktivitäten, Beschreibungen und andere Details zu Ihren NFTs an.", - "title.migratev2": "Migrieren Sie die Liquidität des v2-Pools zu Uniswap v3", - "title.migratev3": "Migrieren Sie die Poolliquidität zu Uniswap v4", - "title.placeLimit": "Platzieren Sie Limit-Orders auf Uniswap", - "title.realTime": "Echtzeitpreise, Diagramme, Transaktionsdaten und mehr.", - "title.removeLiquidityv2": "Poolliquidität (v2) auf Uniswap entfernen", - "title.removePoolLiquidity": "Poolliquidität auf Uniswap entfernen", - "title.removeTokensv2": "Entfernen Sie Ihre Token aus den Liquiditätspools v2.", - "title.removev3Liquidity": "Entfernen Sie Ihre Token aus v3-Liquiditätspools.", - "title.sendTokens": "Senden Sie Token auf Uniswap", - "title.swappingMadeSimple": "Tauschen leicht gemacht. Kaufen und verkaufen Sie Kryptowährungen auf Ethereum, Base, Arbitrum, Polygon und mehr. Millionen vertrauen uns.", - "title.tradeTokens": "Handeln Sie mit Token und sorgen Sie für Liquidität. Echtzeitpreise, Diagramme, Transaktionsdaten und mehr.", - "title.uniswapTradeCrypto": "Uniswap | Handeln Sie Krypto und NFTs sicher auf der Top-DeFi-Plattform", - "title.uniToken": "UNI-Token repräsentieren Stimmrechte in der Uniswap-Verwaltung. Sie können über jeden Vorschlag selbst abstimmen oder Ihre Stimmen an Dritte delegieren.", - "title.voteOnGov": "Abstimmung über Governance-Vorschläge zu Uniswap", - "token.balances.main": "Dein Kontostand", - "token.balances.other": "Guthaben in anderen Netzwerken", - "token.balances.viewOnly": "{{ownerAddress}}Guthaben", - "token.bridge": "{{label}} Token-Brücke", - "token.chart.tooltip": "Gebühren: {{amount}}", - "token.details.testnet.unsupported": "Für Testnet-Token sind keine Tokendetails verfügbar.", - "token.error.unknown": "Unbekanntes Token", - "token.fee.buy.label": "Kaufgebühr", - "token.fee.label": "Gebühr", - "token.fee.sell.label": "Verkaufsgebühr", - "token.links.title": "Links", - "token.links.twitter": "Þjórsárdalur", - "token.links.website": "Webseite", - "token.priceExplorer.error.description": "Etwas ist schief gelaufen.", - "token.priceExplorer.error.title": "Preisdiagramm konnte nicht geladen werden", - "token.priceExplorer.timeRangeLabel.all": "Alle Zeit", - "token.priceExplorer.timeRangeLabel.day": "1D", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 Tag", - "token.priceExplorer.timeRangeLabel.hour": "1 Stunde", - "token.priceExplorer.timeRangeLabel.month": "1 Mio.", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 Monat", - "token.priceExplorer.timeRangeLabel.week": "1W", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 Woche", - "token.priceExplorer.timeRangeLabel.year": "1 Jahr", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 Jahr", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} ist nicht verfügbar", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} und {{tokenSymbol1}} sind nicht verfügbar", - "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs erhält keine dieser Gebühren.", - "token.safety.warning.alwaysDoYourResearch": "Informieren Sie sich immer", - "token.safety.warning.blocked.description.default_one": "Sie können diesen Token nicht mit der Uniswap-App handeln.", - "token.safety.warning.blocked.description.default_other": "Sie können diese Token nicht mit der Uniswap-App handeln.", - "token.safety.warning.dontShowWarningAgain": "Diese Warnung nicht mehr anzeigen", - "token.safety.warning.doYourOwnResearch": "Führen Sie immer Ihre eigenen Recherchen durch, bevor Sie fortfahren.", - "token.safety.warning.feeDescription": "Lädt auf, wenn {{action}}", - "token.safety.warning.flaggedAsMalicious": "Als bösartig gekennzeichnet", - "token.safety.warning.fotHigh.title": "Hohe Gebühr festgestellt", - "token.safety.warning.fotLow.title": "Gebühr festgestellt", - "token.safety.warning.fotVeryHigh.title": "Sehr hohe Gebühr festgestellt", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} wurde als unverkäuflich gekennzeichnet. Der Tausch dieses Tokens kann zu einem Verlust Ihrer Mittel führen.", - "token.safety.warning.honeypot.title": "100 % Verkaufsgebühr festgestellt", - "token.safety.warning.impersonator": "Imitiert ein anderes Token", - "token.safety.warning.impersonator.title": "Impersonator-Token erkannt", - "token.safety.warning.malicious.general.message": "{{tokenSymbol}} wurde von Blockaid als bösartig gekennzeichnet.", - "token.safety.warning.malicious.impersonator.message": "{{tokenSymbol}} wurde von Blockaid markiert, weil es versucht hat, ein anderes Token zu kopieren. Es ist möglicherweise nicht das Token, das Sie austauschen möchten.", - "token.safety.warning.malicious.impersonator.message.short": "{{tokenSymbol}} ist möglicherweise nicht das Token, das Sie austauschen möchten.", - "token.safety.warning.malicious.title": "Bösartiges Token erkannt", - "token.safety.warning.mayResultInLoss": "Ein Umtausch kann zu einem Verlust von Geldmitteln führen.", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} wird nicht an führenden zentralisierten US-Börsen gehandelt.", - "token.safety.warning.notListedOnExchanges": "Nicht an führenden US-Börsen notiert", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} wurde als unverkäuflich gekennzeichnet.", - "token.safety.warning.sellFee100.title": "100 % Verkaufsgebühr festgestellt", - "token.safety.warning.spam.message": "{{tokenSymbol}} wurde von Blockaid als Spam markiert.", - "token.safety.warning.spam.title": "Spam-Token erkannt", - "token.safety.warning.spamsUsers": "Spams an Benutzer", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} erhebt eine Gebühr von {{buyFeePercent}} beim Kauf und {{sellFeePercent}} beim Verkauf.", - "token.safety.warning.tokenChargesFee.buy.message": "{{tokenSymbol}} erhebt beim Kauf eine Gebühr von {{feePercent}} .", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} erhebt beim Verkauf eine Gebühr von {{feePercent}} .", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} erhebt beim Kauf oder Verkauf eine Gebühr.", - "token.safetyLevel.blocked.message": "Sie können diesen Token nicht mit dem Uniswap-Wallet handeln.", - "token.safetyLevel.medium.message.plural": "Diese Token werden nicht an führenden zentralisierten US-Börsen gehandelt. Informieren Sie sich immer selbst, bevor Sie fortfahren.", - "token.selector.search.error": "Suchergebnisse konnten nicht geladen werden", - "token.stats.fullyDilutedValuation": "Vollständig verwässerte Bewertung", - "token.stats.marketCap": "Marktkapitalisierung", - "token.stats.priceHighYear": "52W Hoch", - "token.stats.priceLowYear": "52W Niedrig", - "token.stats.section.about": "Über {{token}}", - "token.stats.title": "Statistiken", - "token.stats.translation.original": "Original zeigen", - "token.stats.translation.translate": "Übersetzen in {{language}}", - "token.stats.volume": "24h Volumen", - "token.symbol.input.fallback": "Eingabetoken", - "token.symbol.output.fallback": "Ausgabetoken", - "token.wrap.fail.message": "Swaps im Uniswap-Protokoll können mit ETH beginnen und enden. Während des Swaps wird ETH jedoch in WETH umgewandelt.", - "token.zeroNativeBalance.description": "Um {{ tokenSymbol }}zu erhalten, benötigen Sie zunächst {{ nativeTokenSymbol }} , um die Netzwerkkosten zu bezahlen. Beginnen Sie, indem Sie Ihr Wallet mit {{ nativeTokenSymbol }}aufladen.", - "token.zeroNativeBalance.title": "Du brauchst {{ nativeTokenName }} ", - "tokens.action.hide": "Token ausblenden", - "tokens.action.unhide": "Token einblenden", - "tokens.nfts.action.viewOnExplorer": "Ansicht auf {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "NFT-Sammlung konnte nicht geladen werden", - "tokens.nfts.collection.label.items": "Artikel", - "tokens.nfts.collection.label.owners": "Eigentümer", - "tokens.nfts.collection.label.priceFloor": "Boden", - "tokens.nfts.collection.label.swapVolume": "Volumen", - "tokens.nfts.details.error.load.title": "NFT-Details konnten nicht geladen werden", - "tokens.nfts.details.network": "Netzwerk", - "tokens.nfts.details.owner": "Gehört", - "tokens.nfts.details.price": "Derzeitiger Preis", - "tokens.nfts.details.recentPrice": "Letzter Verkaufspreis", - "tokens.nfts.details.traits": "Züge", - "tokens.nfts.empty.description": "Keine NFTs gefunden", - "tokens.nfts.error.unavailable": "Inhalt nicht verfügbar", - "tokens.nfts.hidden.action.hide": "NFT ausblenden", - "tokens.nfts.hidden.action.unhide": "NFT einblenden", - "tokens.nfts.link.collection": "Website der Sammlung", - "tokens.nfts.list.error.load.title": "NFTs konnten nicht geladen werden", - "tokens.nfts.list.none.button": "NFTs erhalten", - "tokens.nfts.list.none.description.default": "Übertragen Sie NFTs von einem anderen Wallet, um loszulegen.", - "tokens.nfts.list.none.description.external": "Wenn diese Wallet NFTs kauft oder empfängt, werden sie hier angezeigt.", - "tokens.nfts.list.none.title": "Noch keine NFTs", - "tokens.noneFound": "Keine Token gefunden.", - "tokens.selector.button.choose": "Token auswählen", - "tokens.selector.button.clear": "Alles löschen", - "tokens.selector.empty.buy.message": "Kaufen Sie Kryptowährungen mit einer Karte oder Bank, um Token zu senden.", - "tokens.selector.empty.buy.title": "Krypto kaufen", - "tokens.selector.empty.receive.title": "Token erhalten", - "tokens.selector.empty.title": "Noch keine Token", - "tokens.selector.error.load": "Token konnten nicht geladen werden", - "tokens.selector.search.empty": "Keine Ergebnisse gefunden für {{searchText}}", - "tokens.selector.search.placeholder": "Suchtoken", - "tokens.selector.section.bridging": "Netzwerkübergreifender Austausch", - "tokens.selector.section.favorite": "Favoriten", - "tokens.selector.section.otherSearchResults": "Andere Token auf {{network}}", - "tokens.selector.section.recent": "Letzte Suchanfragen", - "tokens.selector.section.search": "Suchergebnisse", - "tokens.selector.section.trending": "Token nach 24-Stunden-Volumen", - "tokens.selector.section.yours": "Ihre Token", - "tokens.table.search.placeholder.pools": "Suchpools", - "tokens.table.search.placeholder.tokens": "Suchtoken", - "transaction.action.cancel.button": "Transaktion abbrechen", - "transaction.action.cancel.description": "Wenn Sie diese Transaktion abbrechen, bevor sie vom Netzwerk verarbeitet wird, zahlen Sie anstelle der ursprünglichen Kosten neue Netzwerkkosten.", - "transaction.action.cancel.title": "Diese Transaktion abbrechen?", - "transaction.action.copy": "Transaktions-ID kopieren", - "transaction.action.copyProvider": "Kopieren Sie die Transaktions-ID {{providerName}}", - "transaction.amount.unlimited": "Unbegrenzt", - "transaction.confirmation.completionTime_one": "Transaktion abgeschlossen in {{count}} Sekunde 🎉", - "transaction.confirmation.completionTime_other": "Transaktion abgeschlossen in {{count}} Sekunden 🎉", - "transaction.confirmation.pending.wallet": "Transaktion im Wallet bestätigen", - "transaction.confirmation.submitted.currency.add": "Fügen Sie {{currency}}hinzu", - "transaction.confirmation.submitted.currency.added": "Hinzugefügt {{currency}}", - "transaction.confirmation.waiting": "Auf Bestätigung warten", - "transaction.date": "Eingereicht am {{date}}", - "transaction.details.dappName": "App", - "transaction.details.from": "Aus", - "transaction.details.networkFee": "Netzwerkkosten", - "transaction.details.providerFee": "Anbietergebühr", - "transaction.details.swapRate": "Rate", - "transaction.details.transaction": "Transaktion", - "transaction.details.uniswapFee": "Gebühr ({{ feePercent }}%)", - "transaction.insufficientLiquidity": "Unzureichende Poolliquidität, um die Transaktion abzuschließen", - "transaction.network.all": "Alle Netzwerke", - "transaction.networkCost.label": "Netzwerkkosten", - "transaction.networkCost.maxNativeBalance.description": "Ein kleiner Betrag des Netzwerk-Token-Guthabens wird reserviert, um die Netzwerkkosten dieser Transaktion zu decken.", - "transaction.networkCost.maxNativeBalance.title": "Warum kann ich mein maximales Guthaben nicht nutzen?", - "transaction.networkCost.veryHigh.label": "Sehr hohe Netzwerkkosten", - "transaction.notification.error.cancel": "Die Transaktion kann nicht abgebrochen werden", - "transaction.notification.error.replace": "Die Transaktion kann nicht ersetzt werden.", - "transaction.status.approve.canceled": "Genehmigt abgebrochen", - "transaction.status.approve.canceling": "Genehmigung abbrechen", - "transaction.status.approve.failed": "Genehmigung fehlgeschlagen", - "transaction.status.approve.pending": "Genehmigen", - "transaction.status.approve.success": "Genehmigt", - "transaction.status.approve.successDapp": "Genehmigt am {{externalDappName}}", - "transaction.status.buy.canceled": "Kauf abgebrochen", - "transaction.status.buy.canceling": "Kauf stornieren", - "transaction.status.buy.failed": "Kauf fehlgeschlagen", - "transaction.status.buy.pending": "Kauf", - "transaction.status.buy.success": "Gekauft", - "transaction.status.buy.successDapp": "Gekauft am {{externalDappName}}", - "transaction.status.confirm.canceled": "Abgebrochen bestätigen", - "transaction.status.confirm.canceling": "Ausstehende Stornierung", - "transaction.status.confirm.failed": "Bestätigung fehlgeschlagen", - "transaction.status.confirm.pending": "Transaktion wird ausgeführt", - "transaction.status.confirm.success": "Transaktion bestätigt", - "transaction.status.confirm.successDapp": "Transaktion bestätigt am {{externalDappName}}", - "transaction.status.mint.canceled": "Abgebrochene Münze", - "transaction.status.mint.canceling": "Minze stornieren", - "transaction.status.mint.failed": "Prägung fehlgeschlagen", - "transaction.status.mint.pending": "Prägung", - "transaction.status.mint.success": "Geprägt", - "transaction.status.mint.successDapp": "Geprägt am {{externalDappName}}", - "transaction.status.purchase.canceled": "Kauf storniert", - "transaction.status.purchase.canceling": "Kauf stornieren", - "transaction.status.purchase.failedOn": "Kauf am {{serviceProvider}}fehlgeschlagen", - "transaction.status.purchase.pendingOn": "Einkauf am {{serviceProvider}}", - "transaction.status.purchase.successOn": "Gekauft am {{serviceProvider}}", - "transaction.status.receive.canceled": "Empfang abgebrochen", - "transaction.status.receive.canceling": "Empfang abbrechen", - "transaction.status.receive.failedFrom": "Empfang von {{serviceProvider}}fehlgeschlagen", - "transaction.status.receive.pendingFrom": "Empfang von {{serviceProvider}}", - "transaction.status.receive.success": "Erhalten", - "transaction.status.receive.successDapp": "Empfangen am {{externalDappName}}", - "transaction.status.receive.successFrom": "Empfangen von {{serviceProvider}}", - "transaction.status.revoke.canceled": "Abgebrochener Widerruf", - "transaction.status.revoke.canceling": "Widerruf aufheben", - "transaction.status.revoke.failed": "Widerruf fehlgeschlagen", - "transaction.status.revoke.pending": "Widerruf", - "transaction.status.revoke.success": "Widerrufen", - "transaction.status.revoke.successDapp": "Widerrufen am {{externalDappName}}", - "transaction.status.sale.canceled": "Abgebrochener Verkauf", - "transaction.status.sale.canceling": "Verkauf abbrechen", - "transaction.status.sale.failedOn": "Verkauf fehlgeschlagen über {{serviceProvider}}", - "transaction.status.sale.pendingOn": "Verkauf über {{serviceProvider}}", - "transaction.status.sale.successOn": "Verkauft über {{serviceProvider}}", - "transaction.status.sell.canceled": "Verkauf abgebrochen", - "transaction.status.sell.canceling": "Verkauf abbrechen", - "transaction.status.sell.failed": "Verkauf fehlgeschlagen", - "transaction.status.sell.pending": "Verkauf", - "transaction.status.sell.success": "Verkauft", - "transaction.status.sell.successDapp": "Verkauft am {{externalDappName}}", - "transaction.status.send.canceled": "Senden abgebrochen", - "transaction.status.send.canceling": "Senden abbrechen", - "transaction.status.send.failed": "Senden fehlgeschlagen", - "transaction.status.send.pending": "Versendung", - "transaction.status.send.success": "Gesendet", - "transaction.status.send.successDapp": "Gesendet am {{externalDappName}}", - "transaction.status.swap.canceled": "Abgebrochener Tausch", - "transaction.status.swap.canceling": "Tausch abbrechen", - "transaction.status.swap.expired": "Swap abgelaufen", - "transaction.status.swap.failed": "Austausch fehlgeschlagen", - "transaction.status.swap.insufficientFunds": "Unzureichende Mittel", - "transaction.status.swap.pending": "Austauschen", - "transaction.status.swap.success": "Ausgetauscht", - "transaction.status.swap.successDapp": "Getauscht am {{externalDappName}}", - "transaction.status.unwrap.canceled": "Abgebrochenes Auspacken", - "transaction.status.unwrap.canceling": "Abbrechen des Unwrappings", - "transaction.status.unwrap.failed": "Entpacken fehlgeschlagen", - "transaction.status.unwrap.pending": "Auspacken", - "transaction.status.unwrap.success": "Ausgepackt", - "transaction.status.unwrap.successDapp": "Ausgepackt am {{externalDappName}}", - "transaction.status.wrap.canceled": "Abgebrochener Wrap", - "transaction.status.wrap.canceling": "Wrap abbrechen", - "transaction.status.wrap.failed": "Wrap fehlgeschlagen", - "transaction.status.wrap.pending": "Verpackung", - "transaction.status.wrap.success": "Eingewickelt", - "transaction.status.wrap.successDapp": "Eingewickelt am {{externalDappName}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} bis {{recipientAddress}}", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} von {{senderAddress}}", - "transaction.warning.insufficientGas.modal.message": "Sie benötigen ~{{tokenAmount}} {{tokenSymbol}} () auf {{networkName}} , um die Netzwerkkosten dieser Transaktion zu decken.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "Nicht genug {{tokenSymbol}} auf {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Nicht genug {{tokenSymbol}}", - "transaction.warning.maxNative.message": "Sie sind dabei, den größten Teil Ihres Netzwerk-Token-Guthabens auszugeben. Dadurch bleiben möglicherweise nicht genügend Mittel übrig, um zukünftige Netzwerkkosten zu decken.", - "transaction.warning.maxNative.title": "Niedriges Netzwerk-Token-Guthaben", - "transaction.watcher.error.cancel": "Die Transaktion kann nicht abgebrochen werden", - "transaction.watcher.error.status": "Fehler beim Überprüfen des Transaktionsstatus", - "unichain.promotion.bridging.description": "Wechsel zu Unichain", - "unichain.promotion.bridging.tooltip.description": "Überbrücken Sie Ihr ETH, um mit Unichain zu beginnen.", - "unichain.promotion.cold.description": "Schnellere Swaps. Niedrigere Gebühren. Unichain ist die Heimat von DeFi.", - "unichain.promotion.cold.title": "Einführung von Unichain", - "unichain.promotion.modal.description": "Schnellere Swaps. Niedrigere Gebühren. Unichain ist die Heimat für kettenübergreifende Liquidität.", - "unichain.promotion.modal.detail.costs": "Geringere Kosten für die Erstellung von Pools und die Verwaltung von Positionen.", - "unichain.promotion.modal.detail.fees": "Sparen Sie 95 % an Gebühren im Vergleich zu Ethereum.", - "unichain.promotion.modal.detail.instant": "Sofortiger Tausch", - "unichain.promotion.tooltip.description": "Schnellere Swaps. Niedrigere Gebühren. Unichain ist die Heimat für kettenübergreifende Liquidität.", - "unichain.promotion.tooltip.switch": "Wechseln Sie zu Unichain", - "unichain.promotion.tooltip.title": "Unichain ist da", - "unichain.promotion.warm.description": "Tauschen Sie Ihre Lieblings-Token schneller und mit geringeren Gaskosten.", - "unichain.promotion.warm.title": "Beginnen Sie mit dem Tauschen auf Unichain", - "uniswapX.aggregatesLiquidity": " aggregiert Liquiditätsquellen für bessere Preise und gasfreie Swaps.", - "uniswapx.description": "UniswapX aggregiert Liquiditätsquellen für bessere Preise und gasfreie Swaps.", - "uniswapx.included": "Enthält UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "Erfahren Sie mehr über das Tauschen mit UniswapX", - "uniswapx.v2QuoteFailed": "UniswapX v2 Hard Quote ist fehlgeschlagen. Mit klassischem Swap erneut versuchen.", - "unitags.banner.button.claim": "Beanspruche jetzt", - "unitags.banner.subtitle": "Erstellen Sie ein personalisiertes Web3-Profil und teilen Sie Ihre Adresse ganz einfach mit Freunden.", - "unitags.banner.title.compact": "Fordern Sie Ihren {{unitagDomain}} Benutzernamen an und erstellen Sie Ihr anpassbares Profil.", - "unitags.banner.title.full": "Fordern Sie Ihren {{unitagDomain}} -Benutzernamen an", - "unitags.choosePhoto.option.cameraRoll": "Aus der Kamerarolle auswählen", - "unitags.choosePhoto.option.computer": "Vom Computer hochladen", - "unitags.choosePhoto.option.nft": "Wählen Sie ein NFT", - "unitags.choosePhoto.option.remove": "Profilbild entfernen", - "unitags.claim.confirmation.customize": "Profil anpassen", - "unitags.claim.confirmation.description": "{{unitagAddress}} ist bereit, Kryptowährungen zu senden und zu empfangen. Bauen Sie Ihr Wallet weiter aus, indem Sie Ihr Web3-Profil anpassen.", - "unitags.claim.confirmation.success.long": "Du hast es!", - "unitags.claim.confirmation.success.short": "habe es!", - "unitags.claim.error.addressLimit": "Sie haben bereits die maximale Anzahl an Änderungen an Ihrem Benutzernamen für diese Adresse vorgenommen", - "unitags.claim.error.appCheck": "Benutzername konnte nicht beansprucht werden. Bitte versuchen Sie es morgen noch einmal.", - "unitags.claim.error.avatar": "Avatar konnte nicht festgelegt werden. Versuchen Sie es später erneut.", - "unitags.claim.error.default": "Benutzername konnte nicht beansprucht werden. Versuchen Sie es später erneut.", - "unitags.claim.error.deviceLimit": "Sie haben die maximale Anzahl an Benutzernamen erreicht, die für dieses Gerät aktiv sein können", - "unitags.claim.error.general": "Benutzername kann nicht beansprucht werden", - "unitags.claim.error.unavailable": "dieser Benutzername ist nicht verfügbar", - "unitags.claim.error.unknown": "Unbekannter Fehler", - "unitags.claim.username.default": "Ihr Name", - "unitags.delete.confirm.subtitle": "Sie sind dabei, Ihren Benutzernamen und Ihre anpassbaren Profildetails zu löschen. Sie können diese nicht wiederherstellen.", - "unitags.delete.confirm.title": "Bist du sicher?", - "unitags.editProfile.placeholder": "nutzername", - "unitags.editUsername.confirm.subtitle": "Sie sind dabei, Ihren Benutzernamen zu ändern. Sobald Sie ihn geändert haben, können Sie ihn nicht mehr beanspruchen.", - "unitags.editUsername.confirm.title": "Bist du sicher?", - "unitags.editUsername.title": "Benutzernamen bearbeiten", - "unitags.editUsername.warning.default": "Sobald Sie Ihren Benutzernamen geändert haben, können Sie ihn nie wieder beanspruchen. Sie können ihn nur 2 Mal ändern.", - "unitags.editUsername.warning.max": "Sie haben die maximale Anzahl von 2 Benutzernamenänderungen erreicht.", - "unitags.extension.intro.buttton": "Einen Benutzernamen beanspruchen", - "unitags.extension.intro.description": "Verabschieden Sie sich von 0x-Adressen. Benutzernamen sind lesbare Namen, die das Senden und Empfangen von Kryptowährungen erleichtern.", - "unitags.extension.intro.title": "Einführung von Benutzernamen", - "unitags.extension.intro.upsell.customizable": "Anpassbare Profile", - "unitags.extension.intro.upsell.ens": "Unterstützt durch ENS-Subdomains", - "unitags.extension.intro.upsell.free": "Kostenlose Inanspruchnahme", - "unitags.intro.features.ens": "Unterstützt durch ENS-Subdomains", - "unitags.intro.features.free": "Kostenlose Inanspruchnahme", - "unitags.intro.features.profile": "Anpassbare Profile", - "unitags.intro.subtitle": "Verabschieden Sie sich von 0x-Adressen. Benutzernamen sind lesbare Namen, die das Senden und Empfangen von Kryptowährungen erleichtern.", - "unitags.intro.title": "Einführung von Benutzernamen", - "unitags.notification.delete.error": "Benutzername konnte nicht gelöscht werden. Versuchen Sie es später erneut.", - "unitags.notification.delete.title": "Benutzername gelöscht", - "unitags.notification.profile.error": "Profil konnte nicht aktualisiert werden. Versuchen Sie es später erneut.", - "unitags.notification.profile.title": "Profil aktualisiert", - "unitags.notification.username.error": "Benutzername konnte nicht geändert werden. Versuchen Sie es später erneut.", - "unitags.notification.username.title": "Benutzername geändert", - "unitags.onboarding.claim.subtitle": "Dies ist Ihre personalisierte Adresse, an die Leute Kryptowährungen senden können.", - "unitags.onboarding.claim.title.choose": "Erstellen Sie Ihren Benutzernamen", - "unitags.onboarding.claim.title.claim": "Beanspruchen Sie Ihren Benutzernamen", - "unitags.onboarding.info.description": "Benutzernamen wandeln komplexe 0x-Adressen in lesbare Namen um. Indem Sie einen {{unitagDomain}} -Benutzernamen beanspruchen, können Sie problemlos Kryptowährungen senden und empfangen und ein öffentliches Web3-Profil erstellen.", - "unitags.onboarding.info.title": "Eine vereinfachte Adresse", - "unitags.onboarding.profile.subtitle": "Laden Sie Ihr eigenes hoch oder bleiben Sie bei Ihrem einzigartigen Unicon. Sie können es später jederzeit ändern.", - "unitags.onboarding.profile.title": "Wählen Sie ein Profilfoto", - "unitags.profile.action.delete": "Benutzernamen löschen", - "unitags.profile.action.edit": "Benutzernamen bearbeiten", - "unitags.profile.bio.label": "Biografie", - "unitags.profile.bio.placeholder": "Geben Sie eine Biografie für Ihr Profil ein", - "unitags.profile.links.twitter": "Þjórsárdalur", - "unitags.username.error.chars": "Benutzernamen dürfen nur Buchstaben und Zahlen enthalten", - "unitags.username.error.max": "Benutzernamen dürfen nicht mehr als {{number}} Zeichen lang sein", - "unitags.username.error.min": "Benutzernamen müssen mindestens {{number}} Zeichen lang sein", - "unitags.username.error.uppercase": "Benutzernamen dürfen nur Kleinbuchstaben und Zahlen enthalten", - "uwulink.error.insufficientTokens": "Nicht genug {{tokenSymbol}} auf {{chain}}", - "v2.notAvailable": "Uniswap V2 ist in diesem Netzwerk nicht verfügbar.", - "v2.switchTo": "Wechseln Sie zu v2", - "v3.blast.yield.usdbAndWeth": "Auf Blast sind USDB und WETH Rebasing-Token, die automatisch Rendite abwerfen. Aufgrund der Inkompatibilität mit Uniswap v3 werden LP-Positionen mit USDB oder WETH keine Rebasing-Rendite abwerfen, in Uniswap v2 jedoch schon.", - "v3.continue": "Weiter mit v3", - "v3.rebase.unavailable": "Rebasing ist in Version 3 nicht verfügbar", - "wallet.appSignIn": "Mit der App anmelden", - "wallet.connectingAgreement": "Indem Sie ein Wallet verbinden, stimmen Sie den Servicebedingungen von Uniswap Labs zu und erklären sich mit deren Datenschutzrichtlinieeinverstanden.", - "wallet.connectionFailed.message": "Der Verbindungsversuch ist fehlgeschlagen. Klicken Sie bitte auf „Erneut versuchen“ und folgen Sie den Schritten zum Herstellen einer Verbindung in Ihrem Wallet.", - "wallet.other": "Andere Geldbörsen", - "wallet.scanToConnect": "Zum Verbinden QR-Code scannen", - "wallet.wrongNet": "Ihr Wallet ist mit dem falschen Netzwerk verbunden.", - "walletConnect.dapps.connection": "Verbunden mit {{dappNameOrUrl}}", - "walletConnect.dapps.empty.description": "Stellen Sie eine Verbindung zu einer App her, indem Sie über WalletConnect einen Code scannen", - "walletConnect.dapps.manage.empty.title": "Keine Apps verbunden", - "walletConnect.dapps.manage.title": "Anschlüsse", - "walletConnect.error.connection.message": "Uniswap Wallet unterstützt derzeit {{chainNames}}. Bitte verwenden Sie auf diesen Ketten nur „{{dappName}}“.", - "walletConnect.error.connection.title": "Verbindungsfehler", - "walletConnect.error.general.message": "Es gab ein Problem mit WalletConnect. Bitte versuchen Sie es erneut", - "walletConnect.error.general.title": "WalletConnect-Fehler", - "walletConnect.error.scantastic.message": "Es gab ein Problem mit Ihrem QR-Code. Bitte versuchen Sie es erneut", - "walletConnect.error.scantastic.title": "Ungültiger QR-Code", - "walletConnect.error.unsupported.message": "Stellen Sie sicher, dass Sie einen gültigen WalletConnect-, Ethereum-Adresse- oder Uniswap-Extension-QR-Code scannen, bevor Sie es erneut versuchen.", - "walletConnect.error.unsupported.title": "Ungültiger QR-Code", - "walletConnect.error.unsupportedV1.message": "WalletConnect v1 wird nicht mehr unterstützt. Die Anwendung, mit der Sie eine Verbindung herstellen möchten, muss auf WalletConnect v2 aktualisiert werden.", - "walletConnect.error.unsupportedV1.title": "Ungültiger QR-Code", - "walletConnect.error.uwu.scan": "Beim Scannen dieses QR-Codes ist ein Problem aufgetreten.", - "walletConnect.error.uwu.title": "UwU-Link-Fehler", - "walletConnect.error.uwu.unsupported": "Dieser QR-Code wird nicht unterstützt.", - "walletConnect.pending.button.connect": "Verbinden", - "walletConnect.pending.button.scrollDown": "Scrollen Sie nach unten, um eine Verbindung herzustellen", - "walletConnect.pending.switchAccount": "Benutzer wechseln", - "walletConnect.pending.switchNetwork": "Netzwerk wechseln", - "walletConnect.pending.title": "Verbinden mit {{dappName}}", - "walletConnect.permissions.option.transferAssets": "Übertragen Sie Ihr Vermögen ohne Zustimmung", - "walletConnect.permissions.option.viewTokenBalances": "Zeigen Sie Ihr Token-Guthaben an", - "walletConnect.permissions.option.viewWalletAddress": "Zeigen Sie Ihre Wallet-Adresse an", - "walletConnect.permissions.title": "Site-Berechtigungen", - "walletConnect.request.button.scrollDown": "Zum Anmelden nach unten scrollen", - "walletConnect.request.button.sign": "Zeichen", - "walletConnect.request.details.label.function": "Funktion", - "walletConnect.request.details.label.sending": "Versendung", - "walletConnect.request.details.label.token": "Zeichen", - "walletConnect.request.details.label.tokens": "Token", - "walletConnect.request.error.insufficientFunds": "Sie haben nicht genug {{currencySymbol}} , um diese Transaktion abzuschließen.", - "walletConnect.request.error.network": "Internet- oder Netzwerkverbindungsfehler", - "walletConnect.request.warning.general.message": "Seien Sie vorsichtig: Diese Nachricht kann Vermögenswerte übertragen", - "walletConnect.request.warning.message": "Um Nachrichten oder Transaktionen zu signieren, müssen Sie die Wiederherstellungsphrase des Wallets importieren.", - "walletConnect.request.warning.title": "Diese Brieftasche ist im Nur-Ansicht-Modus", - "web.explore.description": "Entdecken und erforschen Sie Token auf {{network}}. Erkunden Sie die Top-Pools. Sehen Sie sich Preise, Handelsvolumen, TVL, Diagramme und Transaktionsdaten in Echtzeit an.", - "web.explore.title.pools": "Entdecken Sie die Top-Pools auf {{network}} auf Uniswap", - "web.explore.title.tokens": "Entdecken Sie die Top-Tokens auf {{network}} auf Uniswap", - "web.explore.title.transactions": "Entdecken Sie die Top-Transaktionen bei {{network}} auf Uniswap" -} diff --git a/packages/uniswap/src/i18n/locales/translations/el-GR.json b/packages/uniswap/src/i18n/locales/translations/el-GR.json deleted file mode 100644 index 2bae3774d7b..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/el-GR.json +++ /dev/null @@ -1,2563 +0,0 @@ -{ - "account.authHeader.claimReward": "Διεκδικήστε ανταμοιβή {{amount}}", - "account.cloud.backup.subtitle": "Υπάρχουν πολλές φράσεις ανάκτησης που έχουν δημιουργηθεί αντίγραφα ασφαλείας στο {{cloudProviderName}}σας.", - "account.cloud.backup.title": "Επιλέξτε ένα αντίγραφο ασφαλείας για επαναφορά", - "account.cloud.button.restore.android": "Επαναφορά από το Google Drive", - "account.cloud.button.restore.ios": "Επαναφορά από το iCloud", - "account.cloud.empty.description": "Φαίνεται ότι δεν έχετε δημιουργήσει αντίγραφα ασφαλείας για καμία από τις φράσεις ανάκτησης στο {{cloudProviderName}}.", - "account.cloud.empty.title": "Βρέθηκαν 0 αντίγραφα ασφαλείας", - "account.cloud.error.backup.message": "Αποτυχία εισαγωγής αντιγράφων ασφαλείας λόγω έλλειψης αδειών, διακοπής της εξουσιοδότησης ή λόγω σφάλματος στο cloud", - "account.cloud.error.backup.title": "Σφάλμα κατά την εισαγωγή αντιγράφων ασφαλείας", - "account.cloud.error.password.title": "Λανθασμένος κωδικός. ΠΑΡΑΚΑΛΩ προσπαθησε ξανα.", - "account.cloud.error.unavailable.button.cancel": "Οχι τώρα", - "account.cloud.error.unavailable.button.settings": "Μεταβείτε στις ρυθμίσεις", - "account.cloud.error.unavailable.message.android": "Επαληθεύστε ότι είστε συνδεδεμένοι σε έναν λογαριασμό Google με ενεργοποιημένο το Google Drive σε αυτήν τη συσκευή και δοκιμάστε ξανά.", - "account.cloud.error.unavailable.message.ios": "Επαληθεύστε ότι είστε συνδεδεμένοι σε ένα Apple ID με το iCloud Drive ενεργοποιημένο σε αυτήν τη συσκευή και δοκιμάστε ξανά.", - "account.cloud.error.unavailable.title.android": "Το Google Drive δεν είναι διαθέσιμο", - "account.cloud.error.unavailable.title.ios": "Το iCloud Drive δεν είναι διαθέσιμο", - "account.cloud.loading.title": "Αναζήτηση για αντίγραφα ασφαλείας...", - "account.cloud.lockout.time.hours_one": "Πάρα πολλές προσπάθειες. Δοκιμάστε ξανά σε 1 ώρα.", - "account.cloud.lockout.time.hours_other": "Πάρα πολλές προσπάθειες. Δοκιμάστε ξανά σε {{count}} ώρες.", - "account.cloud.lockout.time.minutes_one": "Πάρα πολλές προσπάθειες. Δοκιμάστε ξανά σε 1 λεπτό.", - "account.cloud.lockout.time.minutes_other": "Πάρα πολλές προσπάθειες. Δοκιμάστε ξανά σε {{count}} λεπτά.", - "account.cloud.password.input": "Εισάγετε τον κωδικό πρόσβασης", - "account.cloud.password.recoveryPhrase": "Εισαγάγετε τη φράση ανάκτησής σας", - "account.cloud.password.subtitle": "Αυτός ο κωδικός πρόσβασης απαιτείται για την ανάκτηση του αντιγράφου ασφαλείας φράσης ανάκτησης από το {{cloudProviderName}}.", - "account.cloud.password.title": "Εισαγάγετε τον εφεδρικό κωδικό πρόσβασης", - "account.downloadWallet.subtitle": "Δημιουργήστε αντίγραφα ασφαλείας του πορτοφολιού σας, πραγματοποιήστε συναλλαγές εν κινήσει, λάβετε ειδοποιήσεις τιμών σε πραγματικό χρόνο και πολλά άλλα.", - "account.drawer.gitHash": "Git hash: ", - "account.drawer.gitVersion": "Εκδοχή: ", - "account.drawer.modal.body": "Αποθηκεύστε και ανταλλάξτε κουπόνια με ασφάλεια με την εφαρμογή Uniswap. Διαθέσιμο σε iOS και Android.", - "account.drawer.modal.dont": "Δεν έχετε πορτοφόλι Uniswap;", - "account.drawer.modal.scan": "Σάρωση με Uniswap Wallet", - "account.drawer.spamToggle": "Απόκρυψη άγνωστων διακριτικών και NFT", - "account.passkey.delete.acknowledge": "Έχω δημιουργήσει αντίγραφα ασφαλείας της φράσης ανάκτησης και κατανοώ ότι η Uniswap Labs δεν μπορεί να με βοηθήσει να ανακτήσω το πορτοφόλι μου, εάν δεν το κάνω.", - "account.passkey.delete.description": "Βεβαιωθείτε ότι έχετε δημιουργήσει αντίγραφα ασφαλείας της φράσης ανάκτησης χρησιμοποιώντας την εφαρμογή Uniswap για κινητά ή την επέκταση προγράμματος περιήγησης.", - "account.passkey.delete.descriptionEmphasized": "Χωρίς τη φράση ανάκτησης, ενδέχεται να μην μπορείτε να αποκτήσετε πρόσβαση στο πορτοφόλι σας.", - "account.passkey.delete.speedbump.description": "Πριν συνεχίσετε, ολοκληρώστε τα παρακάτω βήματα για να αποφύγετε να χάσετε την πρόσβαση στο πορτοφόλι σας και σε όλα τα χρήματα.", - "account.passkey.delete.speedbump.step1": "Κατεβάστε την εφαρμογή Uniswap για κινητά ή την επέκταση προγράμματος περιήγησης", - "account.passkey.delete.speedbump.step2": "Δημιουργήστε αντίγραφα ασφαλείας της φράσης ανάκτησης", - "account.passkey.delete.speedbump.title": "Είσαι σίγουρος;", - "account.passkey.delete.title": "Διαγραφή κλειδιού πρόσβασης;", - "account.passkey.log.in.title": "Συνδεθείτε με κωδικό πρόσβασης", - "account.passkey.type.crossplatform": "Τηλέφωνο, tablet ή κλειδί ασφαλείας", - "account.passkey.type.platform": "Πρόγραμμα περιήγησης ή λειτουργικό σύστημα", - "account.passkey.verify.button": "Επαλήθευση με κλειδί πρόσβασης", - "account.passkey.verify.description": "Πριν συνεχίσετε, χρησιμοποιήστε το κλειδί πρόσβασής σας για να επαληθεύσετε την ταυτότητά σας. Αυτό βοηθά στη διατήρηση της ασφάλειας του λογαριασμού σας.", - "account.passkey.verify.title": "Αρχικά, ας επαληθεύσουμε ότι είστε εσείς", - "account.portfolio.activity.canceledBelow": "Αυτή η παραγγελία ακυρώθηκε επειδή το υπόλοιπό σας ήταν κάτω από το ποσό εισόδου.", - "account.portfolio.activity.signLimit": "Αυτή η παραγγελία δεν θα εκπληρωθεί επειδή το υπόλοιπό σας ήταν κάτω από το ποσό εισόδου. Αυξήστε το υπόλοιπό σας για να διορθώσετε.", - "account.recoveryPhrase.education.part1": "Μια φράση ανάκτησης (ή φράση εκκίνησης) είναι ένα σύνολο λέξεων που απαιτούνται για πρόσβαση στο πορτοφόλι σας, σαν κωδικός πρόσβασης.", - "account.recoveryPhrase.education.part2": "Μπορείτε να εισαγάγετε τη φράση ανάκτησής σας σε μια νέα συσκευή για να επαναφέρετε το πορτοφόλι σας και τα περιεχόμενά του.", - "account.recoveryPhrase.education.part3": "Ωστόσο, εάν χάσετε τη φράση ανάκτησης, θα χάσετε την πρόσβαση στο πορτοφόλι σας.", - "account.recoveryPhrase.education.part4": "Αντί να απομνημονεύσετε τη φράση ανάκτησης, μπορείτε να να δημιουργήσετε αντίγραφα ασφαλείας σε {{cloudProviderName}} και να την προστατέψετε με κωδικό πρόσβασης.", - "account.recoveryPhrase.education.part5": "Μπορείτε επίσης να δημιουργήσετε μη αυτόματα αντίγραφα ασφαλείας της φράσης ανάκτησης σημειώνοντας την και αποθηκεύοντάς την σε ασφαλές μέρος.", - "account.recoveryPhrase.education.part6": "Συνιστούμε να χρησιμοποιήσετε και τους δύο τύπους αντιγράφων ασφαλείας, γιατί αν χάσετε τη φράση ανάκτησης, δεν θα μπορείτε να επαναφέρετε το πορτοφόλι σας.", - "account.recoveryPhrase.error.invalid": "Μη έγκυρη φράση", - "account.recoveryPhrase.error.invalidWord": "Μη έγκυρη λέξη: {{word}}", - "account.recoveryPhrase.error.phraseLength": "Η φράση ανάκτησης πρέπει να αποτελείται από 12-24 λέξεις", - "account.recoveryPhrase.error.wordIsAddress": "Έχετε εισαγάγει μια διεύθυνση, όχι μια φράση ανάκτησης", - "account.recoveryPhrase.error.wrong": "Λάθος φράση ανάκτησης", - "account.recoveryPhrase.helpText.import": "Πώς μπορώ να βρω τη φράση ανάκτησης;", - "account.recoveryPhrase.helpText.restoring": "Δοκιμάστε ξανά την αναζήτηση", - "account.recoveryPhrase.input": "Πληκτρολογήστε τη φράση ανάκτησής σας", - "account.recoveryPhrase.remove.final.description": "Βεβαιωθείτε ότι έχετε σημειώσει τη φράση ανάκτησής σας ή έχετε δημιουργήσει αντίγραφα ασφαλείας στο {{cloudProviderName}}. Δεν θα μπορείτε να έχετε πρόσβαση στα χρήματά σας διαφορετικά.", - "account.recoveryPhrase.remove.final.title": "Καταργείτε τη φράση ανάκτησης ", - "account.recoveryPhrase.remove.import.description": "Μπορείτε να αποθηκεύσετε μόνο μία φράση ανάκτησης κάθε φορά. Για να συνεχίσετε την εισαγωγή ενός νέου, θα πρέπει να καταργήσετε την τρέχουσα φράση ανάκτησης και τυχόν συσχετισμένα πορτοφόλια από αυτήν τη συσκευή.", - "account.recoveryPhrase.remove.initial.description": "Αυτό θα αφαιρέσει το πορτοφόλι σας από αυτήν τη συσκευή μαζί με τη φράση ανάκτησης.", - "account.recoveryPhrase.remove.initial.title": "Αφαιρείτε {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "Η φράση ανάκτησής σας θα παραμείνει αποθηκευμένη μέχρι να διαγράψετε όλα τα εναπομείναντα πορτοφόλια.", - "account.recoveryPhrase.subtitle.import": "Η φράση ανάκτησης θα αποθηκευτεί μόνο τοπικά στη συσκευή σας.", - "account.recoveryPhrase.subtitle.restoring": "Εισαγάγετε τη φράση ανάκτησης παρακάτω ή δοκιμάστε να αναζητήσετε ξανά αντίγραφα ασφαλείας.", - "account.recoveryPhrase.title.import": "Εισαγάγετε τη φράση ανάκτησης", - "account.recoveryPhrase.title.restoring": "Δεν βρέθηκαν αντίγραφα ασφαλείας", - "account.wallet.action.copy": "Αντιγραφή διεύθυνσης", - "account.wallet.action.manageConnections": "Διαχείριση συνδέσεων", - "account.wallet.action.report": "Αναφορά προφίλ", - "account.wallet.action.viewExplorer": "Προβολή στο {{blockExplorerName}}", - "account.wallet.button.add": "Προσθήκη πορτοφολιού", - "account.wallet.button.addViewOnly": "Προσθέστε ένα πορτοφόλι μόνο για προβολή", - "account.wallet.button.create": "Δημιουργήστε ένα νέο πορτοφόλι", - "account.wallet.button.import": "Εισαγάγετε ένα νέο πορτοφόλι", - "account.wallet.button.manage": "Ρυθμίσεις πορτοφολιού", - "account.wallet.button.remove": "Αφαιρέστε το πορτοφόλι", - "account.wallet.button.watch": "Παρακολουθήστε ένα πορτοφόλι", - "account.wallet.create.placeholder": "Πορτοφόλι {{index}}", - "account.wallet.edit.label.input.placeholder": "Ετικέτα πορτοφολιού", - "account.wallet.header.button.disabled.title": "Επεξεργασία προφίλ", - "account.wallet.header.button.title": "Επεξεργασία ετικέτας", - "account.wallet.header.viewOnly": "Πορτοφόλια μόνο για προβολή", - "account.wallet.menu.claimUsername": "Αξίωση ονόματος χρήστη", - "account.wallet.menu.copy.title": "Αντιγραφή διεύθυνσης πορτοφολιού", - "account.wallet.menu.edit.title": "Επεξεργασία ετικέτας", - "account.wallet.menu.manageConnections": "Διαχειριστείτε τις συνδέσεις", - "account.wallet.menu.remove.title": "Αφαιρέστε το πορτοφόλι", - "account.wallet.remove.check": "Δημιούργησα αντίγραφα ασφαλείας της φράσης ανάκτησής μου και καταλαβαίνω ότι η Uniswap Labs δεν μπορεί να με βοηθήσει να ανακτήσω τα πορτοφόλια μου, εάν δεν το έκανα.", - "account.wallet.remove.title": "Αφαιρέστε το {{name}}", - "account.wallet.remove.viewOnly": "Μπορείτε πάντα να προσθέσετε πορτοφόλια μόνο για προβολή πίσω, εισάγοντας τη διεύθυνση του πορτοφολιού.", - "account.wallet.restore.new_device.description": "Επειδή χρησιμοποιείτε μια νέα συσκευή, θα χρειαστεί να επαναφέρετε τη φράση ανάκτησης ή να εισαγάγετε τον κωδικό πρόσβασης για το αντίγραφο ασφαλείας στο cloud για να συνεχίσετε.", - "account.wallet.restore.new_device.title": "Ανακτήστε το πορτοφόλι σας", - "account.wallet.restore.seed_phrase.description": "Η φράση ανάκτησης λείπει από τη συσκευή σας. Για να διασφαλίσουμε ότι δεν θα χάσετε ποτέ την πρόσβαση στα χρήματά σας, θα πρέπει να επαναφέρετε το πορτοφόλι σας.", - "account.wallet.restore.seed_phrase.title": "Επαναφέρετε το πορτοφόλι σας", - "account.wallet.select.error": "Δεν ήταν δυνατή η φόρτωση των διευθύνσεων", - "account.wallet.select.loading.subtitle": "Τα πορτοφόλια σας θα εμφανιστούν παρακάτω.", - "account.wallet.select.loading.title": "Αναζήτηση πορτοφολιών", - "account.wallet.select.smartWalletDisclaimer": "Από προεπιλογή, όλα τα κατάλληλα πορτοφόλια θα χρησιμοποιούν λειτουργίες έξυπνου πορτοφολιού μόλις εισαχθούν. Τι είναι ένα έξυπνο πορτοφόλι;", - "account.wallet.select.title_one_one": "Βρέθηκε ένα πορτοφόλι", - "account.wallet.select.title_one_other": "Επιλέξτε πορτοφόλια για εισαγωγή", - "account.wallet.viewOnly.button": "Εισαγωγή πορτοφολιού", - "account.wallet.viewOnly.description": "Για να ανταλλάξετε, να αγοράσετε, να στείλετε και να λάβετε διακριτικά, πρέπει να εισαγάγετε τη φράση ανάκτησης αυτού του πορτοφολιού.", - "account.wallet.viewOnly.title": "Αυτό το πορτοφόλι είναι μόνο για προβολή", - "account.wallet.watch.error.alreadyImported": "Αυτή η διεύθυνση έχει ήδη εισαχθεί", - "account.wallet.watch.error.notFound": "Η διεύθυνση δεν βρέθηκε", - "account.wallet.watch.error.smartContract": "Η διεύθυνση είναι ένα έξυπνο συμβόλαιο", - "account.wallet.watch.message": "Η προσθήκη ενός πορτοφολιού μόνο για προβολή σάς επιτρέπει να δοκιμάσετε την εφαρμογή ή να παρακολουθήσετε ένα πορτοφόλι. Δεν θα μπορείτε να ανταλλάξετε ή να στείλετε χρήματα.", - "account.wallet.watch.placeholder": "ENS ή διεύθυνση", - "account.wallet.watch.title": "Εισαγάγετε μια διεύθυνση πορτοφολιού", - "activity.pending": "{{pendingActivityCount}} Σε εκκρεμότητα", - "activity.transaction.lpRewards.descriptor": "{{symbol}} συλλεγμένες ανταμοιβές", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} έως {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} για {{amountWithSymbolB}}", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} και {{amountWithSymbolB}}", - "addLiquidity.shareOfPool": "Μερίδιο πισίνας", - "addressInput.recipient": "Παραλήπτης", - "analytics.allow": "Να επιτρέπεται η ανάλυση", - "analytics.allow.message": "Χρησιμοποιούμε ανώνυμα δεδομένα για να βελτιώσουμε την εμπειρία σας με τα προϊόντα Uniswap Labs.", - "appRating.button.notReally": "Όχι πραγματικά", - "appRating.description": "Ενημερώστε μας εάν έχετε καλή εμπειρία με αυτήν την εφαρμογή", - "appRating.extension.review.description": "Επιλέξτε μια βαθμολογία με αστέρια και αφήστε μια κριτική στο Chrome Web Store.", - "appRating.extension.review.title": "Έλεγχος της επέκτασης Uniswap;", - "appRating.extension.title": "Απολαμβάνετε την επέκταση Uniswap;", - "appRating.feedback.button.send": "Στείλετε τα σχόλιά σας", - "appRating.feedback.description": "Ενημερώστε μας πώς μπορούμε να βελτιώσουμε την εμπειρία σας", - "appRating.feedback.title": "Λυπούμαστε που το ακούμε.", - "appRating.mobile.title": "Απολαμβάνετε Uniswap Wallet;", - "bridgedAsset.modal.button": "Συνέχεια ανταλλαγής", - "bridgedAsset.modal.description": "Αυτή είναι μια έκδοση {{chainName}} του {{currencySymbol}} που υποστηρίζεται από και διατηρεί την ίδια τιμή με την εγγενή έκδοση {{currencySymbol}}.", - "bridgedAsset.modal.feature.securelyBacked": "Ασφαλώς υποστηριγμένο", - "bridgedAsset.modal.feature.securelyBacked.description": "1:1 υποστηριζόμενο από εγγενές {{currencySymbol}}.", - "bridgedAsset.modal.feature.tradeSeamlessly": "Απρόσκοπτες συναλλαγές", - "bridgedAsset.modal.feature.tradeSeamlessly.description": "Αγοράστε και πουλήστε {{currencySymbol}} χωρίς να φύγετε από το Uniswap.", - "bridgedAsset.modal.feature.withdrawToNativeChain": "Ανάληψη σε {{nativeChainName}}", - "bridgedAsset.modal.feature.withdrawToNativeChain.description": "Γεφυρώστε πίσω στο εγγενές δίκτυο οποιαδήποτε στιγμή.", - "bridgedAsset.modal.title": "Ανταλλαγή {{currencySymbol}} σε {{chainName}}", - "bridgedAsset.send.warning.description": "Στέλνετε μια ολοκληρωμένη έκδοση του {{currencySymbol}} στο {{chainName}}. Η αποστολή της σε ένα κεντρικό χρηματιστήριο θα οδηγήσει σε μόνιμη απώλεια χρημάτων.", - "bridgedAsset.send.warning.title": "Βεβαιωθείτε ότι στέλνετε σε μια συμβατή διεύθυνση", - "bridgedAsset.tdp.description": "Αυτή είναι μια γεφυρωμένη έκδοση του {{currencySymbol}} που υποστηρίζεται 1:1 από το εγγενές {{currencySymbol}}.", - "bridgedAsset.wormhole.button": "Συνέχεια προς Σκουληκότρυπα", - "bridgedAsset.wormhole.description": "Συνεχίστε προς την πύλη Wormhole για να γεφυρώσετε το {{currencySymbol}} σας από {{chainName}} σε {{nativeChainName}}.", - "bridgedAsset.wormhole.title": "Ανάληψη {{currencySymbol}} σε {{nativeChainName}}", - "bridgedAsset.wormhole.toNativeChain": "σε {{nativeChainName}}", - "bridgedAsset.wormhole.withdrawToNativeChain": "Ανάληψη σε {{nativeChainName}}", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}ελάχ", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "chart.candlestick": "Κηροπήγιο", - "chart.error.pools": "Δεν είναι δυνατή η εμφάνιση ιστορικών δεδομένων για την τρέχουσα ομάδα.", - "chart.error.tokens": "Δεν είναι δυνατή η εμφάνιση ιστορικών δεδομένων για το τρέχον διακριτικό.", - "chart.line": "Γράφημα γραμμής", - "chart.missingData": "Λείπουν δεδομένα γραφήματος", - "chart.price.label.close": "Κλείσε", - "chart.price.label.high": "Υψηλός", - "chart.price.label.low": "Χαμηλός", - "chart.price.label.open": "Ανοιξε", - "chart.settings.unavailable.label": "Αυτή η ρύθμιση δεν είναι διαθέσιμη για το τρέχον γράφημα", - "claim.thanks": "Σας ευχαριστούμε που είστε μέλος της κοινότητας Uniswap ", - "claim.uni.arrived": "Το UNI έφτασε", - "common.about": "Σχετικά με", - "common.accept": "Αποδέχομαι", - "common.active": "Ενεργός", - "common.activeNetworks": "Ενεργά δίκτυα", - "common.activity": "Δραστηριότητα", - "common.add.label": "Προσθήκη", - "common.add.liquidity.canceled": "Η προσθήκη ρευστότητας ακυρώθηκε.", - "common.addLiquidity": "Προσθέστε ρευστότητα", - "common.address": "Διεύθυνση", - "common.addressOrENS": "Διεύθυνση πορτοφολιού ή όνομα ENS", - "common.advanced": "Προχωρημένος", - "common.all": "Ολοι", - "common.allTime": "Συνεχώς", - "common.and": "και", - "common.app": "App", - "common.approved": "Εγκρίθηκε", - "common.approvePending": "Η έγκριση εκκρεμεί...", - "common.approvePermitTx": "Έγκριση αιτήματος {{indexText}}", - "common.approvePermitTx.active": "Έγκριση αιτήματος{{indexText}} στο πορτοφόλι", - "common.approvePermitTx.explainer": "Τι είναι οι εγκρίσεις Άδειας 2;", - "common.approvePermitTx.pending": "Έγκριση αιτήματος {{indexText}}...", - "common.approveSpend": "Έγκριση {{symbol}} δαπανών", - "common.approving": "Έγκριση", - "common.approximatelyValue": "~{{value}}", - "common.areYouSure": "Είσαι σίγουρος;", - "common.automatic": "Αυτο", - "common.availableIn": "Unswap διαθέσιμη σε: ", - "common.availableOnIOSAndroidChrome": "Διατίθεται σε iOS, Android και Chrome", - "common.backToPositions": "Επιστροφή στις θέσεις", - "common.bestRoute": "Διαδρομή", - "common.bestRoute.with": "Διαδρομή μέσω {{provider}}", - "common.biometrics.generic": "Βιομετρία", - "common.biometrics.touchId": "Αναγνώριση αφής", - "common.biometrics.windowsHello": "Windows Hello", - "common.blocked.ifError": "Εάν πιστεύετε ότι πρόκειται για σφάλμα, στείλτε ένα email με τη διεύθυνσή σας στο ", - "common.blocked.reason": "Αυτή η διεύθυνση είναι αποκλεισμένη στη διεπαφή Uniswap Labs επειδή σχετίζεται με μία ή περισσότερες αποκλεισμένες δραστηριότητες.", - "common.blockedAddress": "Αποκλεισμένη διεύθυνση", - "common.blog": "Ιστολόγιο", - "common.bought": "Αγορασμένος", - "common.brandAssets": "Περιουσιακά στοιχεία επωνυμίας", - "common.button.accept": "Αποδέχομαι", - "common.button.back": "Πίσω", - "common.button.buy": "Αγορά", - "common.button.cancel": "Ματαίωση", - "common.button.checkin": "Ελεγχος εισιτηρίου", - "common.button.close": "Κλείσε", - "common.button.confirm": "Επιβεβαιώνω", - "common.button.connect": "Συνδέω-συωδεομαι", - "common.button.continue": "Να συνεχίσει", - "common.button.copied": "Αντιγράφηκε", - "common.button.copy": "αντίγραφο", - "common.button.create": "Δημιουργώ", - "common.button.delete": "Διαγράφω", - "common.button.disable": "Καθιστώ ανίκανο", - "common.button.disabling": "Απενεργοποίηση", - "common.button.disconnect": "Αποσυνδέω", - "common.button.dismiss": "Απολύω", - "common.button.done": "Εγινε", - "common.button.edit": "Επεξεργασία", - "common.button.enable": "επιτρέπω", - "common.button.finish": "Φινίρισμα", - "common.button.goBack": "Πήγαινε πίσω", - "common.button.later": "Ισως αργότερα", - "common.button.learn": "Μάθε περισσότερα", - "common.button.next": "Επόμενο", - "common.button.notNow": "Οχι τώρα", - "common.button.ok": "Εντάξει", - "common.button.paste": "Επικόλληση", - "common.button.pay": "Πληρωμή", - "common.button.proceed": "Προχωρώ", - "common.button.receive": "Λαμβάνω", - "common.button.remove": "Αφαιρώ", - "common.button.reset": "Επαναφορά", - "common.button.retry": "Ξαναδοκιμάσετε", - "common.button.reveal": "Αποκαλύπτω", - "common.button.review": "Ανασκόπηση", - "common.button.save": "Αποθηκεύσετε", - "common.button.scrollDown": "Μετακινηθείτε προς τα κάτω", - "common.button.sell": "Πουλώ", - "common.button.send": "Στείλετε", - "common.button.setup": "Στήνω", - "common.button.share": "Μερίδιο", - "common.button.showLess": "Δείξε λιγότερο", - "common.button.showMore": "Δείτε περισσότερα", - "common.button.sign": "Σημάδι", - "common.button.skip": "Παραλείπω", - "common.button.swap": "Ανταλαγή", - "common.button.tryAgain": "Προσπάθησε ξανά", - "common.button.understand": "καταλαβαίνω", - "common.button.unlock": "Ξεκλείδωμα", - "common.button.view": "Θέα", - "common.button.viewDetails": "Δείτε λεπτομέρειες", - "common.button.yes": "Ναί", - "common.buy.label": "Αγορά", - "common.buyAndSell": "Αγορά και πώληση στο Uniswap", - "common.cancellationSubmitted": "Η ακύρωση υποβλήθηκε", - "common.cancellationSuccessful": "Επιτυχής ακύρωση", - "common.cancelOrder": "Ακύρωση παραγγελίας", - "common.card.error.description": "Κάτι πήγε στραβά", - "common.card.error.title": "Ωχ! Κάτι πήγε στραβά.", - "common.careers": "Καριέρες", - "common.chain.networkCost": "{{chain}} κόστος δικτύου", - "common.chart": "Διάγραμμα", - "common.checkNetwork": "Ελέγξτε την κατάσταση δικτύου εδώ.", - "common.chromeExtension": "Επέκταση", - "common.claim.failed": "Η αξίωση απέτυχε", - "common.claimed": "Διεκδικήθηκε", - "common.claiming": "Διεκδίκηση", - "common.claimUnis": "Διεκδικήστε τα διακριτικά UNI σας", - "common.clear": "Σαφής", - "common.close": "Κλείσε", - "common.closed": "Κλειστό", - "common.collect.button": "Συλλέγω", - "common.company": "Εταιρία", - "common.confirm": "Επιβεβαιώνω", - "common.confirmCancellation": "Επιβεβαιώστε την ακύρωση", - "common.confirmed": "Επιβεβαιωμένος", - "common.confirmSend.button": "Επιβεβαιώστε την αποστολή", - "common.confirmSwap": "Επιβεβαιώστε την ανταλλαγή στο πορτοφόλι", - "common.confirmTimedOut": "Λήξη χρόνου επιβεβαίωσης. Παρακαλώ δοκιμάστε ξανά.", - "common.confirmTransfer": "Επιβεβαίωση μεταφοράς", - "common.confirmWallet": "Επιβεβαίωση στο πορτοφόλι", - "common.connect.button": "Συνδέω-συωδεομαι", - "common.connectAWallet.button": "Συνδέστε ένα πορτοφόλι", - "common.connectAWallet.button.evm": "Σύνδεση πορτοφολιού Ethereum", - "common.connectAWallet.button.evm.switch": "Αλλαγή πορτοφολιού Ethereum", - "common.connectAWallet.button.svm": "Συνδέστε το πορτοφόλι Solana", - "common.connectAWallet.button.svm.switch": "Αλλαγή πορτοφολιού Solana", - "common.connectAWallet.button.switch": "Αλλαγή πορτοφολιού", - "common.connectTo": "Σύνδεση με {{platform}}", - "common.connectWallet.button": "Συνδέστε το πορτοφόλι", - "common.contactUs.button": "Επικοινωνήστε μαζί μας", - "common.copied": "Αντιγράφηκε", - "common.copy.address": "Αντιγραφή διεύθυνσης", - "common.copy.poolId": "Αντιγραφή αναγνωριστικού ομάδας", - "common.copyLink.button": "Αντιγραφή συνδέσμου", - "common.created.date": "Δημιουργήθηκε {{date}}", - "common.currency": "Νόμισμα", - "common.currentPrice": "Τρέχουσα τιμή", - "common.custom": "Εθιμο", - "common.customRange": "Προσαρμοσμένο εύρος", - "common.dataOutdated": "Τα δεδομένα μπορεί να είναι παλιά", - "common.day": "ημέρα", - "common.default": "Προκαθορισμένο", - "common.defaultTradeOptions": "Προεπιλεγμένες επιλογές συναλλαγών", - "common.deposit.toNetwork": "Καταθέστε διακριτικά στο δίκτυο {{label}} .", - "common.depositing": "Κατάθεση", - "common.depositTokens": "μάρκες κατάθεσης", - "common.detected": "Εντοπίστηκε", - "common.developers": "προγραμματιστές", - "common.device": "Αυτή η συσκευή", - "common.device.other": "Άλλη συσκευή", - "common.dismiss": "Απολύω", - "common.docs": "Έγγραφα", - "common.donate": "Προσφέρω", - "common.done": "Εγινε", - "common.dontShowAgain": "Μην το ξαναδείξετε αυτό", - "common.download": "Κατεβάστε", - "common.downloadAppStore": "Λήψη στο App Store", - "common.downloadPlayStore": "Λήψη στο Play Store", - "common.downloadUniswapApp": "Κατεβάστε την εφαρμογή Uniswap", - "common.downloadUniswapWallet": "Λήψη Πορτοφολιού Uniswap", - "common.dynamic": "Δυναμικός", - "common.edit.button": "Επεξεργασία", - "common.ended": "Τελείωσε", - "common.error.details": "Λεπτομέρειες σφάλματος", - "common.error.general": "Κάτι πήγε στραβά", - "common.error.label": "Λάθος", - "common.error.request": "Λυπούμαστε, παρουσιάστηκε σφάλμα κατά την επεξεργασία του αιτήματός σας. Εάν ζητάτε υποστήριξη, φροντίστε να αντιγράψετε τις λεπτομέρειες αυτού του σφάλματος.", - "common.error.somethingWrong": "Κάτι πήγε στραβά!", - "common.errorConnecting.error": "Σφάλμα σύνδεσης", - "common.errorLoadingData.error": "Σφάλμα κατά τη φόρτωση δεδομένων", - "common.etherscan": "Etherscan", - "common.expiry": "Λήξη", - "common.explore": "Εξερευνώ", - "common.explorer": "Εξερευνητής", - "common.exploreTokens": "Εξερευνήστε τα διακριτικά", - "common.extension": "Uniswap επέκταση", - "common.failedSwitchNetwork": "Αποτυχία εναλλαγής δικτύων", - "common.fee": "Τέλη", - "common.fees": "Αμοιβές", - "common.feesEarned": "Κερδισμένες αμοιβές", - "common.feesEarnedPerBase": "{{symbolA}} ανά {{symbolB}}", - "common.for": "Για", - "common.free": "Δωρεάν", - "common.fullRange": "Πλήρης γκάμα", - "common.getApp": "Λάβε την εφαρμογή", - "common.getHelp.button": "Ζήτα βοήθεια", - "common.getStarted": "Ξεκινήστε", - "common.getSupport.button": "Λάβετε υποστήριξη", - "common.getTheApp": "Κατέβασε την εφαρμογή", - "common.getUniswapWallet": "Αποκτήστε Uniswap Wallet", - "common.getUniswapWallet.mobile": "Αποκτήστε την εφαρμογή Uniswap για κινητά", - "common.governance": "Διακυβέρνηση", - "common.happyHolidays": "Καλές γιορτές από την ομάδα Uniswap!", - "common.help": "Βοήθεια", - "common.helpCenter": "Κέντρο βοηθείας", - "common.hidden": "Κρυμμένος", - "common.hide.button": "Κρύβω", - "common.highPrice": "Υψηλή τιμή", - "common.includes": "Περιλαμβάνει", - "common.info.label": "Πληροφορίες", - "common.input.noRecipient.error": "Επιλέξτε παραλήπτη", - "common.input.password.confirm": "Επιβεβαίωση Κωδικού", - "common.input.password.error.mismatch": "Οι κωδικοί πρόσβασης δεν ταιριάζουν", - "common.input.password.error.weak": "Αυτός ο κωδικός πρόσβασης είναι πολύ αδύναμος", - "common.input.password.new": "Νέος Κωδικός", - "common.input.password.placeholder": "Κωδικός πρόσβασης", - "common.input.password.strength.medium": "Μεσαίο", - "common.input.password.strength.strong": "Ισχυρός", - "common.input.password.strength.weak": "Αδύναμος", - "common.input.search": "Αναζήτηση", - "common.insufficient.funds": "Ανεπαρκείς πόροι", - "common.insufficientBalance.error": "Ανεπαρκής ισορροπία", - "common.insufficientFundsForNetworkFee.error": "Ανεπαρκή κεφάλαια για την κάλυψη του κόστους του δικτύου", - "common.insufficientTokenBalance.error": "Ανεπαρκές υπόλοιπο {{tokenSymbol}}", - "common.insufficientTokenBalance.error.simple": "Δεν αρκεί {{tokenSymbol}}", - "common.invalidPair": "Μη έγκυρο ζεύγος", - "common.invalidRecipient.error": "Μη έγκυρος παραλήπτης", - "common.iOSAndroid": "iOS και Android", - "common.language": "Γλώσσα", - "common.learnMoreSwap": "Μάθετε περισσότερα για τις ανταλλαγές", - "common.legalAndPrivacy": "Νομική και Απόρρητο", - "common.less": "Μείον", - "common.limit.cancel_one": "Όριο ακύρωσης", - "common.limit.cancel_other": "Ακύρωση ορίων {{count}}", - "common.limit.canceled": "Το όριο ακυρώθηκε", - "common.limit.executed": "Το όριο εκτελείται", - "common.limit.expired": "Το όριο έληξε", - "common.limit.failed": "Το όριο απέτυχε", - "common.limit.opened": "Άνοιξε το όριο", - "common.limit.pending": "Όριο σε εκκρεμότητα", - "common.limits": "Όρια", - "common.limits.approachMax": "Πλησιάζει το μέγιστο όριο 100", - "common.limits.cancelProceed": "Ακυρώστε τα όρια για να συνεχίσετε", - "common.limits.expires": "Λήγει {{timestamp}}", - "common.limits.open": "Ανοιχτά όρια", - "common.limits.when": "όταν {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "Συνδέσεις", - "common.liquidity": "Ρευστότητα", - "common.liquidity.provision": "Παροχή Ρευστότητας", - "common.liquidity.removed": "Η ρευστότητα αφαιρέθηκε", - "common.loading": "Φόρτωση", - "common.longText.button.less": "Διαβάστε λιγότερο", - "common.longText.button.more": "Διαβάστε περισσότερα", - "common.lowPrice": "Χαμηλή τιμή", - "common.manage": "Διαχειρίζονται", - "common.market.label": "Αγορά", - "common.marketPrice": "Τιμή αγοράς", - "common.marketPrice.fetching": "Ανάκτηση τιμής αγοράς...", - "common.marketPrice.label": "Τιμή αγοράς:", - "common.marketPrice.unavailable": "Η τιμή αγοράς δεν βρέθηκε. Κάντε τη δική σας έρευνα για να αποφύγετε την απώλεια κεφαλαίων.", - "common.max": "Μέγιστη", - "common.message": "Μήνυμα", - "common.migrate": "Αποδημώ", - "common.migrate.liquidity.failed": "Η μετεγκατάσταση ρευστότητας απέτυχε", - "common.migrate.position": "Θέση μετεγκατάστασης", - "common.migrated.liquidity": "Μεταναστευτική ρευστότητα", - "common.migrating.liquidity": "Μεταναστευτική ρευστότητα", - "common.min": "Ελάχ", - "common.more": "Περισσότερο", - "common.moreDetails": "Περισσότερες λεπτομέρειες", - "common.navigation.settings": "Ρυθμίσεις", - "common.navigation.systemSettings": "Ρυθμίσεις", - "common.navigationButton": "Κουμπί πλοήγησης", - "common.needHelp": "Χρειάζεστε βοήθεια;", - "common.networkCost": "Κόστος δικτύου", - "common.neverMind": "Δεν πειράζει", - "common.new": "Νέος", - "common.new.exclamation": "Νέος!", - "common.nft": "NFT", - "common.nfts": "NFTs", - "common.noAmount.error": "Εισαγάγετε ένα ποσό", - "common.noData": "Χωρίς δεδομένα", - "common.none": "Κανένας", - "common.noResults": "Δεν βρέθηκαν αποτελέσματα.", - "common.notAvailableInRegion.error": "Δεν είναι διαθέσιμο στην περιοχή σας", - "common.notCreated.label": "Δεν δημιουργήθηκε", - "common.notSupported": "Δεν υποστηρίζεται", - "common.oneDay": "1 ημέρα", - "common.oneDay.short": "1Δ", - "common.oneHour.short": "1Η", - "common.oneMonth": "1 μήνα", - "common.oneWeek": "1 εβδομάδα", - "common.oneYear": "1 χρόνος", - "common.opensea.link": "Προβολή στο OpenSea", - "common.orderCanceled": "Η παραγγελία ακυρώθηκε", - "common.orderExecuted": "Η παραγγελία εκτελέστηκε", - "common.orderExpired": "Η παραγγελία έληξε", - "common.orderPending": "Η παραγγελία εκκρεμεί", - "common.outOfRange": "Εκτός εμβέλειας", - "common.pageNotFound": "Η σελίδα δεν βρέθηκε!", - "common.passkey.count": "Κλειδί πρόσβασης {{number}}", - "common.passkeys": "Κλειδιά πρόσβασης", - "common.passkeys.add": "Προσθέστε έναν κωδικό πρόσβασης", - "common.passkeys.add.description": "Επιλέξτε πού θα αποθηκεύσετε το νέο κλειδί πρόσβασης.", - "common.pastDay": "Περασμένη μέρα", - "common.pastFiveMinutes": "Τα τελευταία πέντε λεπτά", - "common.pastHour": "Τελευταία ώρα", - "common.pastMonth": "Τον περασμένο μήνα", - "common.pastWeek": "Περασμένη εβδομάδα", - "common.pastYear": "Το ΠΡΟΗΓΟΥΜΕΝΟ ΕΤΟΣ", - "common.pending": "εκκρεμής", - "common.pending.cancellation": "Εκκρεμεί ακύρωση", - "common.pendingEllipsis": "Εκκρεμής...", - "common.permit": "Αδεια", - "common.plusMore": "+{{number}} περισσότερα", - "common.pool": "Πισίνα", - "common.pools": "Πισίνες", - "common.portfolio": "Χαρτοφυλάκιο", - "common.poweredBy": "Με την υποστήριξη ", - "common.price": "Τιμή", - "common.priceUpdated": "Η τιμή ενημερώθηκε", - "common.privacyChoices": "Οι επιλογές απορρήτου σας", - "common.privacyChoices.checkbox.description": "Όταν επιλεγεί, δεν θα κοινοποιήσουμε τα δεδομένα σας σε τρίτους συνεργάτες για εξατομικευμένη διαφήμιση. Μπορείτε να ενεργοποιήσετε την κοινή χρήση ανά πάσα στιγμή, καταργώντας την επιλογή αυτού του πλαισίου.", - "common.privacyChoices.checkbox.label": "Μην κοινοποιείτε τις πληροφορίες μου", - "common.privacyChoices.description": "Ενδέχεται να μοιραστούμε αναγνωριστικά συσκευής με τους διαφημιστικούς μας συνεργάτες για την προώθηση των υπηρεσιών μας σε άλλους ιστότοπους και πλατφόρμες. Όπου αυτό πληροί τις προϋποθέσεις ως πώληση, κοινή χρήση ή στοχευμένη διαφήμιση σύμφωνα με την ισχύουσα νομοθεσία, μπορείτε να εξαιρεθείτε επιλέγοντας το πλαίσιο \"μην κοινοποιώ τις πληροφορίες μου\". Για περισσότερες πληροφορίες σχετικά με τις πρακτικές απορρήτου μας, ανατρέξτε στην Πολιτική Απορρήτου.", - "common.privacyChoices.disclaimer": "Λάβετε υπόψη ότι η επιλογή σας θα ισχύει μόνο για αυτό το πρόγραμμα περιήγησης σε αυτήν τη συσκευή. Μπορείτε επίσης να εξαιρεθείτε ενεργοποιώντας τη ρύθμιση Παγκόσμιου ελέγχου απορρήτου στο πρόγραμμα περιήγησης που χρησιμοποιείτε για πρόσβαση στις υπηρεσίες μας. Για να δείτε περισσότερες επιλογές, μεταβείτε στις ρυθμίσεις σας.", - "common.privacyPolicy": "Πολιτική Απορρήτου", - "common.proceed": "Προχωρώ", - "common.proceedInWallet": "Συνεχίστε στο πορτοφόλι σας", - "common.products": "Προϊόντα", - "common.protocol": "Πρωτόκολλο", - "common.protocol.v2": "Uniswap v2", - "common.protocol.v3": "Uniswap v3", - "common.protocol.v4": "Unswap v4", - "common.purchased": "Αγορασμένο", - "common.rate": "Τιμή", - "common.readMore": "Διαβάστε περισσότερα", - "common.receive": "Λαμβάνω", - "common.received": "Ελήφθη", - "common.recent": "Πρόσφατος", - "common.refresh": "Φρεσκάρω", - "common.reload.label": "Επαναφόρτωση της εφαρμογής", - "common.remove.label": "Αφαιρώ", - "common.remove.liquidity.canceled": "Η κατάργηση της ρευστότητας ακυρώθηκε", - "common.remove.liquidity.failed": "Η αφαίρεση ρευστότητας απέτυχε", - "common.removing.liquidity": "Αφαίρεση ρευστότητας", - "common.resetLimit": "Επαναφορά ορίου {{symbol}}", - "common.resetLimitWallet": "Επαναφέρετε το όριο {{symbol}} στο πορτοφόλι", - "common.resettingLimit": "Επαναφορά ορίου {{symbol}} ...", - "common.revoke.approval.failed": "Η ανάκληση της έγκρισης απέτυχε", - "common.revoked.approval": "Ανάκληση έγκρισης", - "common.revoking.approval": "Ανάκληση έγκρισης", - "common.scanQRDownload": "Σαρώστε τον κωδικό QR με το τηλέφωνό σας για λήψη", - "common.selectRegion.label": "Επιλέξτε την περιοχή σας", - "common.selectToken.label": "Επιλέξτε ένα διακριτικό", - "common.sell.label": "Πουλώ", - "common.send.button": "Στείλετε", - "common.send.failed": "Η αποστολή απέτυχε", - "common.sending": "Αποστολή", - "common.sent": "Απεσταλμένα", - "common.settings": "Ρυθμίσεις", - "common.share": "Μερίδιο", - "common.share.shareToTwitter": "Μοιραστείτε το στο Twitter", - "common.show.button": "προβολή", - "common.showLess.button": "Δείξε λιγότερο", - "common.showMore.button": "Δείτε περισσότερα", - "common.signatureExpired": "Η υπογραφή σας έχει λήξει.", - "common.signMessage": "Υπογράψτε μήνυμα", - "common.signMessageWallet": "Υπογραφή μηνύματος στο πορτοφόλι", - "common.socials": "Κοινωνικά δίκτυα", - "common.sold": "Πωληθεί", - "common.stats": "Στατιστικά στοιχεία", - "common.status": "Κατάσταση", - "common.step.number": "Βήμα {{number}}", - "common.step.number.of": "Βήμα {{current}} από {{total}}", - "common.swap": "Ανταλαγή", - "common.swap.expired": "Η ανταλλαγή έληξε", - "common.swap.failed": "Η ανταλλαγή απέτυχε", - "common.swapPending": "Ανταλλαγή σε εκκρεμότητα...", - "common.termsOfService": "Όροι χρήσης", - "common.text.connected": "Συνδεδεμένος", - "common.text.contract": "Σύμβαση", - "common.text.disconnected": "Ασύνδετος", - "common.text.error": "Λάθος", - "common.text.notAvailable": "N/A", - "common.text.recipient": "Προς την", - "common.text.sender": "Από", - "common.text.unknown": "Αγνωστος", - "common.thisAccount": "αυτός ο λογαριασμός", - "common.thisMonth": "Αυτο το μηνα", - "common.thisToken": "Αυτό το διακριτικό", - "common.thisWeek": "Αυτή την εβδομάδα", - "common.thisYear": "Αυτή την χρονιά", - "common.time": "χρόνος", - "common.time.minute.amt": "{{time}}μ", - "common.time.minutes": "λεπτά", - "common.time.past.days": "{{days}} ημέρες", - "common.time.past.days.short": "{{days}}d", - "common.time.past.hours": "{{hours}} ώρες", - "common.time.past.hours.short": "{{hours}}ω", - "common.time.past.minutes.short": "{{minutes}}μ", - "common.time.past.months.short": "{{months}}μην", - "common.time.past.seconds.short": "{{seconds}}s", - "common.to": "προς την", - "common.today": "Σήμερα", - "common.tokenA": "Token Α", - "common.tokenAmount": "Συμβολικό ποσό", - "common.tokenB": "Token B", - "common.tokenName": "Συμβολικό όνομα", - "common.tokens": "Μαρτυρίες", - "common.totalUniswapTVL": "Σύνολο Unswap TVL", - "common.totalValueLocked": "TVL", - "common.trade": "Εμπορικές συναλλαγές", - "common.trademarkPolicy": "Πολιτική εμπορικών σημάτων", - "common.transactionDetails": "Λεπτομέρειες Συναλλαγής", - "common.transactionId": "Ταυτότητα συναλλαγής", - "common.transactionPending": "Συναλλαγή σε εκκρεμότητα", - "common.transactions": "Συναλλαγές", - "common.transactionSettings": "Ρυθμίσεις συναλλαγών", - "common.transfer_one": "ΜΕΤΑΦΟΡΑ", - "common.transfer_other": "μεταγραφές", - "common.tryAgain.error": "Προσπάθησε ξανά", - "common.twitter": "Κελάδημα", - "common.type.label": "Τύπος", - "common.unavailable": "Μη διαθέσιμο", - "common.unhide": "Απόκρυψη", - "common.unichain": "Unichain", - "common.uniswapMobile": "Unswap Κινητό", - "common.uniswapWallet": "Unswap πορτοφόλι", - "common.uniswapX": "UniswapX", - "common.unknown": "Αγνωστος", - "common.unknownError.error": "Αγνωστο σφάλμα", - "common.unwrap.button": "Ξεδιπλώνω", - "common.unwrap.failed": "Το ξετύλιγμα απέτυχε", - "common.unwrapped": "Ξετυλιγμένο", - "common.unwrapping": "Ξετύλιγμα", - "common.view.profile": "Προβολή προφίλ", - "common.viewOnExplorer": "Προβολή στον Explorer", - "common.volume": "Ενταση ΗΧΟΥ", - "common.vote": "Ψήφος", - "common.wallet.approve": "Έγκριση στο πορτοφόλι", - "common.wallet.label": "Πορτοφόλι", - "common.warning": "Προειδοποίηση", - "common.webApp": "Εφαρμογή Ιστού", - "common.website": "Δικτυακός τόπος", - "common.whyApprove": "Γιατί πρέπει να εγκρίνω ένα διακριτικό;", - "common.whySign": "Γιατί απαιτούνται υπογραφές;", - "common.whyWrap": "Γιατί πρέπει να τυλίξω το {{symbol}}μου;", - "common.withdraw": "Αποσύρω", - "common.withdrawal.amount": "Ποσό ανάληψης", - "common.withinRange": "Στην εμβέλεια", - "common.wrap": "Τυλίξτε {{symbol}}", - "common.wrap.failed": "Η αναδίπλωση απέτυχε", - "common.wrapIn": "Τυλίξτε {{symbol}} σε πορτοφόλι", - "common.wrapped": "Τυλιγμένο", - "common.wrapping": "Τύλιγμα", - "common.wrappingToken": "Περιτύλιγμα {{symbol}}...", - "common.yesterday": "Εχθές", - "common.your.account.had.insufficient.funds": "Ο λογαριασμός σας δεν είχε επαρκή χρήματα για την ολοκλήρωση αυτής της ανταλλαγής.", - "common.your.account.has.insufficient.funds": "Ο λογαριασμός σας δεν έχει επαρκή χρήματα για την ολοκλήρωση αυτής της ανταλλαγής.", - "common.your.connected.wallet": "Το συνδεδεμένο πορτοφόλι σας", - "common.your.limit.could.not.be.fulfilled": "Δεν ήταν δυνατή η εκπλήρωση του ορίου σας αυτήν τη στιγμή. ΠΑΡΑΚΑΛΩ προσπαθησε ξανα.", - "common.your.swap.could.not.be.fulfilled": "Δεν ήταν δυνατή η πραγματοποίηση της ανταλλαγής σας αυτήν τη στιγμή. ΠΑΡΑΚΑΛΩ προσπαθησε ξανα.", - "common.youreBuying": "αγοράζεις", - "common.youReceive": "Λαμβάνεις", - "common.youreSelling": "πουλάς", - "currency.ars": "Πέσο Αργεντινής", - "currency.aud": "Δολάριο αυστραλίας", - "currency.brl": "Ρεάλ Βραζιλίας", - "currency.cad": "Δολάριο Καναδά", - "currency.cny": "κινεζικό γιουάν", - "currency.cop": "Κολομβιανό πέσο", - "currency.eur": "Ευρώ", - "currency.gbp": "Βρετανική λίρα", - "currency.hkd": "Δολάριο Χονγκ Κονγκ", - "currency.idr": "Ρουπία Ινδονησίας", - "currency.inr": "Ρουπία Ινδίας", - "currency.jpy": "Γιεν Ιαπωνίας", - "currency.krw": "Γουόν Νότιας Κορέας", - "currency.mxn": "Μεξικάνικο πέσο", - "currency.ngn": "Νιγηριανή Νάιρα", - "currency.pkr": "Ρουπία Πακιστάν", - "currency.rub": "Ρωσικό Ρούβλι", - "currency.sgd": "Δολάριο Σιγκαπούρης", - "currency.try": "Τουρκική Λίρα", - "currency.uah": "Ουκρανικό Γρίβνια", - "currency.usd": "Δολάριο των Ηνωμένων Πολιτειων", - "currency.vnd": "Βιετναμέζικο Ντονγκ", - "dapp.request.actionCannotBeCompleted.description": "Ορισμένες λειτουργίες δεν είναι διαθέσιμες επειδή οι ρυθμίσεις του έξυπνου πορτοφολιού σας διαχειρίζονται από διαφορετική εφαρμογή πορτοφολιού.", - "dapp.request.actionCannotBeCompleted.header": "Αίτημα υπογραφής", - "dapp.request.actionCannotBeCompleted.title": "Η ενέργεια δεν μπορεί να ολοκληρωθεί", - "dapp.request.approve.action": "Εγκρίνω", - "dapp.request.approve.fallbackTitle": "Εγκρίνετε αυτόν τον ιστότοπο για πρόσβαση σε διακριτικά", - "dapp.request.approve.helptext": "Επιτρέψτε σε αυτόν τον ιστότοπο να έχει πρόσβαση και να δαπανά αυτό το διακριτικό για συναλλαγές. Βεβαιωθείτε ότι εμπιστεύεστε αυτόν τον ιστότοπο.", - "dapp.request.approve.label": "Πορτοφόλι", - "dapp.request.approve.title": "Εγκρίνετε την πρόσβαση στο {{tokenSymbol}}", - "dapp.request.base.title": "Αίτημα συναλλαγής", - "dapp.request.bridge.description": "Μετακινήστε ETH, USDC και άλλα σε δίκτυα {{numChains}}+.", - "dapp.request.bridge.title": "Προσπαθείτε να γεφυρώσετε;", - "dapp.request.connect.helptext": "Επιτρέψτε σε αυτόν τον ιστότοπο να προβάλλει τη διεύθυνση του πορτοφολιού σας, το υπόλοιπο και να ζητά εγκρίσεις για συναλλαγές.", - "dapp.request.connect.title": "Σύνδεση στον ιστότοπο", - "dapp.request.fallback.calldata.label": "Ακατέργαστα δεδομένα", - "dapp.request.fallback.function.label": "Λειτουργία", - "dapp.request.permit2.description": "Το Permit2 διαχειρίζεται τις εγκρίσεις διακριτικών σε πολλαπλές εφαρμογές.", - "dapp.request.permit2.header": "Υπογραφή Άδειας2", - "dapp.request.permit2approve.action": "Εγκρίνω", - "dapp.request.permit2approve.helptext": "Το Permit2 διαχειρίζεται τις εγκρίσεις διακριτικών σε πολλαπλές εφαρμογές.", - "dapp.request.permit2approve.title": "Έγκριση Άδειας2", - "dapp.request.reject.action": "Απόρριψη όλων", - "dapp.request.reject.info": "Έχετε {{totalRequestCount}} αιτήματα συναλλαγής", - "dapp.request.revoke.action": "Ανακαλώ", - "dapp.request.revoke.helptext": "Επιτρέψτε σε αυτόν τον ιστότοπο να ανακαλέσει την πρόσβαση για να δαπανήσει αυτό το διακριτικό για συναλλαγές. Βεβαιωθείτε ότι εμπιστεύεστε αυτόν τον ιστότοπο.", - "dapp.request.revoke.title": "Ανάκληση πρόσβασης στο {{tokenSymbol}}", - "dapp.request.signature.containsUnrenderableCharacters": "Αυτό το μήνυμα περιέχει χαρακτήρες που δεν μπορούν να αποδοθούν. Βεβαιωθείτε ότι εμπιστεύεστε αυτόν τον ιστότοπο.", - "dapp.request.signature.decodeError": "Απέτυχε η αποκωδικοποίηση του μηνύματος", - "dapp.request.signature.header": "Αίτημα υπογραφής", - "dapp.request.signature.irregular": "Παράτυπο αίτημα υπογραφής", - "dapp.request.signature.irregular.description": "Βεβαιωθείτε ότι εμπιστεύεστε αυτόν τον ιστότοπο πριν συνεχίσετε", - "dapp.request.signature.irregular.understand": "Καταλαβαίνω τους κινδύνους", - "dapp.request.signature.toggleDataView.raw": "Προβολή πρωτογενών δεδομένων", - "dapp.request.signature.toggleDataView.readable": "Προβολή αρχικών δεδομένων", - "dapp.request.warning.notActive.message": "Βεβαιωθείτε ότι είναι το σωστό", - "dapp.request.warning.notActive.title": "Αυτό δεν είναι το ενεργό πορτοφόλι σας", - "delegation.upgradeModal.description": "Αυτή η ενημέρωση πορτοφολιού χρησιμοποιεί έξυπνα συμβόλαια για ταχύτερες και χαμηλότερου κόστους συναλλαγές. Μάθετε περισσότερα", - "delegation.upgradeModal.enableSmartWallet": "Ενεργοποίηση έξυπνου πορτοφολιού", - "delegation.upgradeModal.title": "Έξυπνες ανταλλαγές, χαμηλότερο κόστος", - "downloadApp.modal.connectExistingWallet": "Συνδέστε το υπάρχον πορτοφόλι", - "downloadApp.modal.getStarted.description": "Αποκτήστε πρόσβαση σε χιλιάδες μάρκες άμεσα μέσω της μεγαλύτερης αγοράς onchain στον κόσμο.", - "downloadApp.modal.getStarted.title": "Ξεκινήστε την εναλλαγή σε δευτερόλεπτα", - "downloadApp.modal.getTheApp.title": "Ξεκινήστε με το Uniswap", - "downloadApp.modal.uniswapProducts.subtitle": "Τα προϊόντα Uniswap συνεργάζονται άψογα για να δημιουργήσουν την καλύτερη εμπειρία onchain.", - "empty.swap.button.text": "Προσθήκη χρημάτων για ανταλλαγή", - "error.dataUnavailable": "Τα δεδομένα δεν είναι διαθέσιμα αυτήν τη στιγμή. εργαζόμαστε για μια διόρθωση", - "error.id": "Αναγνωριστικό σφάλματος: {{eventId}}", - "error.jupiterApi.execute.default.title": "Κάτι πήγε στραβά με το Jupiter API. Δοκιμάστε ξανά.", - "error.jupiterApi.failedToLand": "(Κωδικός {{code}}: Η συναλλαγή απέτυχε να προσγειωθεί στο δίκτυο)", - "error.jupiterApi.invalidBlockHeight": "(Κωδικός -1004: Μη έγκυρο ύψος μπλοκ)", - "error.jupiterApi.invalidMessageBytes": "(Κωδικός -3: Μη έγκυρα byte μηνύματος)", - "error.jupiterApi.invalidPayload": "(Κωδικός -2002: Μη έγκυρο ωφέλιμο φορτίο)", - "error.jupiterApi.invalidSignedTransaction": "(Κωδικός -2: Μη έγκυρη υπογεγραμμένη συναλλαγή)", - "error.jupiterApi.invalidTransaction": "(Κωδικός -1002: Μη έγκυρη συναλλαγή)", - "error.jupiterApi.missingCachedOrder": "(Κωδικός -1: Λείπει η προσωρινά αποθηκευμένη παραγγελία)", - "error.jupiterApi.notFullySigned": "(Κωδικός -1003: Η συναλλαγή δεν έχει υπογραφεί πλήρως)", - "error.jupiterApi.quoteExpired": "Αυτή η προσφορά έληξε, δοκιμάστε ξανά. (Κωδικός -2003)", - "error.jupiterApi.unknownErrorCode": "(Κωδικός {{code}})", - "error.noData": "Δε βρέθηκαν δεδομένα", - "error.request.provideId": "Λυπούμαστε, παρουσιάστηκε σφάλμα κατά την επεξεργασία του αιτήματός σας. Εάν ζητήσετε υποστήριξη, φροντίστε να δώσετε το αναγνωριστικό σφάλματος.", - "error.tokenApproval": "Η έγκριση διακριτικού απέτυχε", - "error.tokenApproval.message": "Ένα πρόβλημα δικτύου ή σύνδεσης πιθανότατα προκάλεσε την αποτυχία της έγκρισής σας. Ελέγξτε τη σύνδεσή σας και δοκιμάστε ξανά.", - "error.tokenApprovalEdited": "Ανεπαρκές ποσό έγκρισης", - "error.tokenApprovalEdited.message": "Το ποσό έγκρισης που έχει οριστεί στο πορτοφόλι σας είναι πολύ χαμηλό για να ολοκληρωθεί αυτή η συναλλαγή. Δοκιμάστε ξανά και αυξήστε το ποσό.", - "errors.crash.message": "Κάτι συνετρίβη.", - "errors.crash.restart": "Επανεκκινήστε την εφαρμογή", - "errors.crash.title": "Ωχ!", - "explore.more.pools": "Εξερευνήστε περισσότερες πισίνες", - "explore.more.unichain": "Εξερευνήστε τις πισίνες Unichain", - "explore.search.label.ownedBy": "Ανήκει στον {{ownerAddress}}", - "explore.search.placeholder": "Αναζήτηση διακριτικών και πορτοφολιών", - "explore.search.section.nft": "Συλλογές NFT", - "explore.search.section.popularNFT": "Δημοφιλείς συλλογές NFT", - "explore.search.section.wallets": "Πορτοφόλια", - "explore.tokens.error": "Δεν ήταν δυνατή η φόρτωση των διακριτικών", - "explore.tokens.favorite.action.add": "Αγαπημένο κουπόνι", - "explore.tokens.favorite.action.edit": "Επεξεργασία αγαπημένων", - "explore.tokens.favorite.action.remove": "Αφαιρέστε το αγαπημένο", - "explore.tokens.favorite.title.default": "Αγαπημένα μάρκες", - "explore.tokens.favorite.title.edit": "Επεξεργασία αγαπημένων κουπονιών", - "explore.tokens.metadata.marketCap": "{{number}} MCap", - "explore.tokens.metadata.totalValueLocked": "{{number}} TVL", - "explore.tokens.metadata.volume": "{{number}} Τόμ", - "explore.tokens.sort.label.marketCap": "Κεφάλαιο αγοράς", - "explore.tokens.sort.label.priceDecrease": "Μείωση τιμής", - "explore.tokens.sort.label.priceIncrease": "ΑΥΞΗΣΗ ΤΙΜΗΣ", - "explore.tokens.sort.label.totalValueLocked": "TVL", - "explore.tokens.sort.label.volume": "Ενταση ΗΧΟΥ", - "explore.tokens.sort.option.marketCap": "Κεφάλαιο αγοράς", - "explore.tokens.sort.option.priceDecrease": "Μείωση τιμής (24 ώρες)", - "explore.tokens.sort.option.priceIncrease": "Αύξηση τιμής (24 ώρες)", - "explore.tokens.sort.option.totalValueLocked": "Unswap TVL", - "explore.tokens.sort.option.volume": "Unswap τόμος (24 ώρες)", - "explore.tokens.top.title": "Κορυφαία μάρκες", - "explore.v2TVL": "v2 TVL", - "explore.v3TVL": "v3 TVL", - "explore.v4TVL": "v4 TVL", - "explore.wallets.favorite.action.add": "Αγαπημένο πορτοφόλι", - "explore.wallets.favorite.action.edit": "Επεξεργασία αγαπημένων", - "explore.wallets.favorite.action.remove": "Αφαιρέστε το αγαπημένο", - "explore.wallets.favorite.action.remove.short": "Διαγραφή από τα αγαπημένα", - "explore.wallets.favorite.title.default": "Αγαπημένα πορτοφόλια", - "explore.wallets.favorite.title.edit": "Επεξεργαστείτε τα αγαπημένα πορτοφόλια", - "extension.connection.network": "Δίκτυο", - "extension.connection.networks": "Δίκτυα", - "extension.connection.popup.trouble": "Πρόβλημα σύνδεσης;", - "extension.connection.titleConnected": "Συνδεδεμένος", - "extension.connection.titleNotConnected": "Μη συνδεδεμένο", - "extension.lock.button.forgot": "Ξεχάσατε τον κωδικό?", - "extension.lock.button.reset": "Επαναφορά πορτοφολιού", - "extension.lock.button.submit": "Ξεκλείδωμα", - "extension.lock.password.error": "Λάθος κωδικός. Προσπάθησε ξανά", - "extension.lock.password.reset.initial.description": "Το Uniswap δεν μπορεί να βοηθήσει στην ανάκτηση του κωδικού πρόσβασής σας. Πρέπει να επαναφέρετε το πορτοφόλι σας εισάγοντας ξανά τη φράση ανάκτησης 12 λέξεων.", - "extension.lock.password.reset.initial.help": "Πού μπορώ να βρω τη φράση ανάκτησης;", - "extension.lock.password.reset.initial.title": "Ξεχάσατε τον κωδικό", - "extension.lock.password.reset.speedbump.description": "Βεβαιωθείτε ότι έχετε τη φράση ανάκτησης 12 λέξεων προτού επαναφέρετε το πορτοφόλι σας. Διαφορετικά δεν θα μπορείτε να ανακτήσετε τα χρήματά σας.", - "extension.lock.password.reset.speedbump.help": "Έχασα τη φράση ανάκαμψης", - "extension.lock.password.reset.speedbump.title": "Πριν συνεχίσεις", - "extension.lock.subtitle": "Εισαγάγετε τον κωδικό πρόσβασής σας για ξεκλείδωμα", - "extension.lock.title": "Καλως ορισες πισω", - "extension.network.notSupported": "Μη υποστηριζόμενο δίκτυο", - "extension.open": "Ανοίξτε την επέκταση Uniswap", - "extension.passwordPrompt.error.wrongPassword": "Λάθος κωδικός. Προσπάθησε ξανά", - "extension.passwordPrompt.title": "Εισάγετε τον κωδικό σας", - "extension.popup.chrome.button": "Ανοίξτε την επέκταση", - "extension.popup.chrome.description": "Ολοκληρώστε αυτήν την ενέργεια ανοίγοντας την επέκταση Uniswap.", - "extension.popup.chrome.title": "Συνέχεια στο Uniswap", - "extension.settings.defaultWallet.message": "Δώστε προτεραιότητα στην επέκταση Uniswap κατά τη σύνδεση σε εφαρμογές.", - "extension.settings.defaultWallet.title": "Ορίστε το προεπιλεγμένο πορτοφόλι", - "extension.uninstall.reason.missingFeatures": "Το Uniswap Wallet δεν διαθέτει ορισμένα χαρακτηριστικά", - "extension.uninstall.reason.notUsingCrypto": "Δεν θέλω πλέον να χρησιμοποιώ κρυπτονομίσματα", - "extension.uninstall.reason.other": "Άλλοι λόγοι", - "extension.uninstall.reason.switchingWallet": "Αλλάζω σε διαφορετικό πορτοφόλι", - "extension.uninstall.subtitle": "Αν έχετε λίγο χρόνο, θα θέλαμε πολύ να μάθουμε γιατί απεγκαταστήσατε το Uniswap Wallet", - "extension.uninstall.title": "Λυπούμαστε που σε βλέπουμε να φεύγεις", - "extension.warning.storage.button": "Αντιγράφων ασφαλείας", - "extension.warning.storage.message": "Φροντίστε να δημιουργήσετε αντίγραφα ασφαλείας της φράσης ανάκτησης για να αποτρέψετε την απώλεια πρόσβασης στο πορτοφόλι και τα χρήματά σας.", - "extension.warning.storage.title": "Ο αποθηκευτικός χώρος του προγράμματος περιήγησής σας εξαντλείται", - "extensionPasskeyLogInPopUp.description": "Εισαγάγετε τον λογαριασμό σας Uniswap συνδεόμενοι με έναν υπάρχοντα κωδικό πρόσβασης.", - "extensionPasskeyLogInPopUp.invalidReferrer": "Κλείστε αυτήν τη σελίδα και προσπαθήστε ξανά.", - "fee.bestForCustomizability": "Ιδανικό για δυνατότητα προσαρμογής.", - "fee.bestForExotic": "Καλύτερο για εξωτικά ζευγάρια.", - "fee.bestForMost": "Το καλύτερο για τα περισσότερα ζευγάρια.", - "fee.bestForStablePairs": "Το καλύτερο για σταθερά ζευγάρια.", - "fee.bestForVeryStable": "Καλύτερο για πολύ σταθερά ζευγάρια.", - "fee.dynamic": "Δυναμική αμοιβή", - "fee.percentEarned": "Το % που θα κερδίσετε σε χρεώσεις.", - "fee.selectPercent": "{{pct}}% επιλογή", - "fee.selectPercentDescription": "Το {{pct}}% της ρευστότητας επέλεξε αυτό το επίπεδο", - "fee.tier": "Επίπεδο αμοιβής", - "fee.tier.create": "Δημιουργία βαθμίδας αμοιβής", - "fee.tier.create.button": "Δημιουργία νέου επιπέδου χρέωσης", - "fee.tier.create.description": "Η δημιουργία μιας νέας βαθμίδας θα αρχικοποιηθεί σε μια νέα ομάδα και θα έχει ως αποτέλεσμα υψηλότερο από το συνηθισμένο κόστος δικτύου.", - "fee.tier.description": "Το κερδισμένο ποσό παρέχοντας ρευστότητα. Επιλέξτε ένα ποσό που ταιριάζει στην ανοχή κινδύνου και τη στρατηγική σας.", - "fee.tier.description.v2": "Το κερδισμένο ποσό παρέχοντας ρευστότητα. Όλες οι ομάδες v2 έχουν σταθερές χρεώσεις 0,3%. Για περισσότερες επιλογές, παρέχετε ρευστότητα στο v4.", - "fee.tier.dynamic": "Δυναμική βαθμίδα αμοιβών", - "fee.tier.dynamic.create": "Δημιουργία δυναμικής βαθμίδας αμοιβής", - "fee.tier.dynamic.create.info": "Πρόκειται να δημιουργήσετε μια πισίνα με δυναμικό επίπεδο χρέωσης. Πριν συνεχίσετε, βεβαιωθείτε ότι το επιλεγμένο άγκιστρο υποστηρίζει δυναμικές χρεώσεις.", - "fee.tier.highestTvl": "Το υψηλότερο TVL", - "fee.tier.label": "Το % που θα κερδίσετε σε χρεώσεις", - "fee.tier.missing.description": "Δεν μπορείτε να βρείτε τη βαθμίδα που ψάχνετε;", - "fee.tier.new": "Νέα βαθμίδα", - "fee.tier.percent.select": "{{percentage}} επιλέξτε", - "fee.tier.recommended.description": "Συνιστάται με βάση το ότι έχετε το υψηλότερο μερίδιο ρευστότητας για το επιλεγμένο ζεύγος διακριτικών.", - "fee.tier.search": "Αναζητήστε ή δημιουργήστε άλλα επίπεδα χρέωσης", - "fee.tier.search.short": "Επίπεδα αναζήτησης", - "fee.tier.select": "Επιλέξτε επίπεδο χρέωσης", - "fee.tier.select.existing.button": "Επιλέξτε υπάρχον επίπεδο χρέωσης", - "fee.tierExact": "{{fee}} επίπεδο αμοιβής", - "fee.unavailable": "Οι κερδισμένες προμήθειες δεν είναι ορατές για θέσεις v2 έως ότου αφαιρεθεί η ρευστότητα.", - "fee.uncollected": "Περιλαμβάνει ανείσπρακτα τέλη:", - "fee.uniswap": "Χρέωση ({{percent}})", - "fee.uniswap.description": "Εφαρμόζονται χρεώσεις για να διασφαλιστεί η καλύτερη δυνατή εμπειρία με το Uniswap.", - "fiatOffRamp.checkout.title": "Αποσύρομαι σε", - "fiatOffRamp.connection.quote": "Πωλείται {{amount}} αξίας {{currencySymbol}}", - "fiatOffRamp.error.balance": "Υπερβαίνει το υπόλοιπο", - "fiatOffRamp.error.populateSend.description": "Παρακαλώ περιμένετε λίγο και προσπαθήστε ξανά.", - "fiatOffRamp.error.populateSend.title": "Δεν είναι δυνατή η φόρτωση της συναλλαγής", - "fiatOffRamp.summary.total": "{{cryptoAmount}} για {{fiatAmount}}", - "fiatOffRamp.unsupportedToken.back": "Πήγαινε πίσω", - "fiatOffRamp.unsupportedToken.divider": "Μη υποστηριζόμενα διακριτικά", - "fiatOffRamp.unsupportedToken.message": "Αυτό το διακριτικό δεν υποστηρίζεται για πώληση. Αλλάξτε αυτό το στοιχείο σε ένα από τα υποστηριζόμενα διακριτικά.", - "fiatOffRamp.unsupportedToken.swap": "Εναλλαγή σε ένα υποστηριζόμενο διακριτικό", - "fiatOffRamp.unsupportedToken.title": "Μη υποστηριζόμενο διακριτικό", - "fiatOffRamp.welcome.tooltip": "Πουλήστε το κρυπτό σας στον τραπεζικό λογαριασμό ή τη χρεωστική σας κάρτα.", - "fiatOnRamp.button.chooseToken": "Επιλέξτε διακριτικό", - "fiatOnRamp.buy.info.description": "Θα το χρειαστείτε για να πληρώσετε για το κόστος δικτύου κατά την ανταλλαγή.", - "fiatOnRamp.buy.info.title": "Ξεκινήστε με ETH", - "fiatOnRamp.cexTransferModal.description": "Η αγορά κρυπτογράφησης με κάρτα δεν υποστηρίζεται στην περιοχή σας. Μεταφέρετε περιουσιακά στοιχεία από έναν κεντρικό λογαριασμό ανταλλαγής για να χρηματοδοτήσετε το πορτοφόλι σας.", - "fiatOnRamp.cexTransferModal.title": "Μεταφορά για να ξεκινήσετε", - "fiatOnRamp.checkout.title": "Αποχώρηση", - "fiatOnRamp.chooseMultiPlatformProvider.chooseNetwork": "Επιλογή δικτύου", - "fiatOnRamp.chooseMultiPlatformProvider.description": "Αυτό θα καθορίσει τη διεύθυνση του πορτοφολιού στην οποία θα λαμβάνετε τα χρήματα.", - "fiatOnRamp.chooseProvider.description": "Θα συνεχίσετε στην πύλη του παρόχου για να δείτε τις χρεώσεις που σχετίζονται με τη συναλλαγή σας.", - "fiatOnRamp.completeTransactionHeader": "Ολοκληρώστε τη συναλλαγή με {{serviceProvider}}", - "fiatOnRamp.connection.error": "Αποτυχημένη σύνδεση", - "fiatOnRamp.connection.errorDescription": "Κάτι πήγε στραβά στη σύνδεση με το {{serviceProvider}}.", - "fiatOnRamp.connection.message": "Σας συνδέει στο {{serviceProvider}}", - "fiatOnRamp.connection.quote": "Αγορά {{amount}} αξίας {{currencySymbol}}", - "fiatOnRamp.connection.terms": "Συνεχίζοντας, αναγνωρίζετε ότι θα υπόκειστε στους Όρους Παροχής Υπηρεσιών και Πολιτική Απορρήτου με {{serviceProvider}}, όπως ισχύει.", - "fiatOnRamp.continueInTab": "Μεταβείτε στην καρτέλα {{serviceProvider}} για να συνεχίσετε. Είναι ασφαλές να κλείσετε αυτό το modal τώρα.", - "fiatOnRamp.disclaimer": "Συνεχίζοντας, αναγνωρίζετε ότι θα υπόκειστε στους Όρους Παροχής Υπηρεσιών και Πολιτική Απορρήτου με {{serviceProvider}}, όπως ισχύει.", - "fiatOnRamp.error.default": "Κάτι πήγε στραβά.", - "fiatOnRamp.error.load": "Δεν ήταν δυνατή η φόρτωση κουπονιών για αγορά", - "fiatOnRamp.error.max": "Μέγιστο {{amount}}", - "fiatOnRamp.error.min": "Ελάχιστο {{amount}}", - "fiatOnRamp.error.noQuotes": "Δεν βρέθηκαν εισαγωγικά.", - "fiatOnRamp.error.unavailable": "Αυτή η υπηρεσία δεν είναι διαθέσιμη στην περιοχή σας", - "fiatOnRamp.error.unsupported": "Δεν υποστηρίζεται στην περιοχή", - "fiatOnRamp.error.usd": "Διατίθεται μόνο για αγορά σε USD", - "fiatOnRamp.noQuotes.error": "Δεν βρέθηκαν εισαγωγικά", - "fiatOnRamp.paymentMethods.applePay": "Apple Pay", - "fiatOnRamp.paymentMethods.bank": "Τράπεζα", - "fiatOnRamp.paymentMethods.debit": "Χρέωση", - "fiatOnRamp.paymentMethods.googlePay": "Google Pay", - "fiatOnRamp.paymentMethods.paypal": "PayPal", - "fiatOnRamp.paymentMethods.venmo": "Βένμο", - "fiatOnRamp.quote.advice": "Θα συνεχίσετε στην πύλη του παρόχου για να δείτε τις χρεώσεις που σχετίζονται με τη συναλλαγή σας.", - "fiatOnRamp.quote.type.list": "{{optionsList}}και άλλες επιλογές", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "Από λογαριασμό", - "fiatOnRamp.receiveCrypto.title": "Λήψη κρυπτογράφησης", - "fiatOnRamp.receiveCrypto.transferFunds": "Χρηματοδοτήστε το πορτοφόλι σας μεταφέροντας κρυπτογράφηση από άλλο πορτοφόλι ή λογαριασμό", - "fiatOnRamp.receiveCrypto.useThisAddress": "Χρησιμοποιήστε αυτήν τη διεύθυνση για να λαμβάνετε διακριτικά στο", - "fiatOnRamp.region.placeholder": "Αναζήτηση ανά χώρα ή περιοχή", - "fiatOnRamp.region.title": "Επιλέξτε την περιοχή σας", - "fiatOnRamp.summary.total": "{{cryptoAmount}} για {{fiatAmount}}", - "forceUpgrade.action.backup": "Δημιουργήστε αντίγραφα ασφαλείας του πορτοφολιού σας", - "forceUpgrade.action.confirm": "Ενημέρωση τώρα", - "forceUpgrade.action.learn": "Μάθετε πώς να ενημερώνετε", - "forceUpgrade.description.extension": "Μια νέα έκδοση της εφαρμογής είναι διαθέσιμη. Για να συνεχίσετε να χρησιμοποιείτε την επέκταση Uniswap, ενημερώστε την στην πιο πρόσφατη έκδοση.", - "forceUpgrade.description.wallet": "Μια νέα έκδοση της εφαρμογής είναι διαθέσιμη. Για να συνεχίσετε να χρησιμοποιείτε το Πορτοφόλι Uniswap, ενημερώστε το στην πιο πρόσφατη έκδοση.", - "forceUpgrade.label.recoveryPhrase": "Φράση ανάκτησης", - "forceUpgrade.title": "Ενημέρωση στην πιο πρόσφατη έκδοση", - "forceUpgrade.title.recommendedStatus": "Μια νέα έκδοση είναι διαθέσιμη", - "globalPreferences.title": "Παγκόσμιες προτιμήσεις", - "hero.scroll": "Κάντε κύλιση για να μάθετε περισσότερα", - "hero.subtitle": "Αγοράστε και πουλήστε κρυπτονομίσματα σε δίκτυα {{amount}}+, συμπεριλαμβανομένων των Ethereum, Unichain και Base.", - "hero.swap.title": "Ανταλλάξτε οποιαδήποτε στιγμή,
οπουδήποτε.", - "hidden.nfts.info.banner.text": "Μάθετε περισσότερα για τα κρυφά NFT", - "hidden.nfts.info.text.button": "Κρυφά NFT ({{numHidden}})", - "hidden.nfts.info.text.extension": "Αυτές είναι πιθανές απάτες και NFT που έχετε κρύψει. Μπορείτε να κάνετε δεξί κλικ σε ένα NFT για να το αποκρύψετε.", - "hidden.nfts.info.text.mobile": "Αυτές είναι πιθανές απάτες και NFT που έχετε κρύψει. Μπορείτε να πατήσετε παρατεταμένα ένα NFT για να το αποκρύψετε.", - "hidden.nfts.info.text.title": "Κρυφά NFT", - "hidden.tokens.info.banner.text": "Μάθετε περισσότερα για τα κρυφά διακριτικά", - "hidden.tokens.info.text.button": "Κρυφά διακριτικά ({{numHidden}})", - "hidden.tokens.info.text.info": "Αυτά είναι πιθανές απάτες, μικρά υπόλοιπα και μάρκες που έχετε κρύψει. Τα κρυφά διακριτικά δεν περιλαμβάνονται στο συνολικό υπόλοιπο του πορτοφολιού σας.", - "hidden.tokens.info.text.title": "Κρυφές μάρκες", - "home.activity.empty.button": "Λάβετε διακριτικά ή NFT", - "home.activity.empty.description.default": "Όταν εγκρίνετε, ανταλλάσσετε ή μεταφέρετε διακριτικά ή NFT, οι συναλλαγές σας θα εμφανίζονται εδώ.", - "home.activity.empty.description.external": "Όταν αυτό το πορτοφόλι πραγματοποιεί συναλλαγές, αυτές θα εμφανίζονται εδώ.", - "home.activity.empty.title": "Καμία δραστηριότητα ακόμα", - "home.activity.error.load": "Δεν ήταν δυνατή η φόρτωση της δραστηριότητας", - "home.activity.title": "Δραστηριότητα", - "home.banner.offline": "Είστε σε λειτουργία εκτός σύνδεσης", - "home.banner.testnetMode": "Είστε σε λειτουργία testnet", - "home.banner.testnetMode.nav": "Είστε σε λειτουργία testnet. Απενεργοποιήστε αυτό στις ρυθμίσεις.", - "home.empty.cexTransfer": "Μεταφορά", - "home.empty.cexTransfer.description": "Μετακινήστε κεφάλαια από μια πλατφόρμα συναλλαγών.", - "home.empty.transfer": "Λήψη κρυπτογράφησης", - "home.empty.transfer.description": "Μετακινήστε χρήματα από άλλο πορτοφόλι.", - "home.explore.footer": "Πατήστε εδώ για να εξερευνήσετε χιλιάδες διακριτικά, NFT και άλλα", - "home.explore.title": "Εξερευνήστε τα διακριτικά", - "home.extension.error": "Σφάλμα φόρτωσης λογαριασμών", - "home.label.buy": "Αγορά", - "home.label.for": "Αγορά/Πώληση", - "home.label.receive": "Λαμβάνω", - "home.label.send": "Στείλετε", - "home.label.swap": "Ανταλαγή", - "home.nfts.title": "NFTs", - "home.tokens.empty.action.buy.description": "Αγορά με χρεωστική κάρτα ή τραπεζικό λογαριασμό.", - "home.tokens.empty.action.buy.title": "Αγοράστε κρυπτογράφηση", - "home.tokens.empty.action.import.description": "Εισαγάγετε τη φράση ανάκτησης αυτού του πορτοφολιού για να ξεκινήσετε την ανταλλαγή και την αποστολή.", - "home.tokens.empty.action.import.title": "Εισαγωγή πορτοφολιού", - "home.tokens.empty.action.receive.description": "Μεταφορά από άλλο πορτοφόλι ή λογαριασμό.", - "home.tokens.empty.action.receive.title": "Λήψη κρυπτογράφησης", - "home.tokens.empty.description": "Όταν αυτό το πορτοφόλι αγοράσει ή λάβει διακριτικά, θα εμφανίζονται εδώ.", - "home.tokens.empty.title": "Δεν υπάρχουν ακόμη μάρκες", - "home.tokens.empty.welcome.description": "Προσθέστε κεφάλαια για να ξεκινήσετε τις συναλλαγές", - "home.tokens.error.fetch": "Αποτυχία ανάκτησης υπολοίπων διακριτικών", - "home.tokens.error.load": "Δεν ήταν δυνατή η φόρτωση υπολοίπων διακριτικών", - "home.tokens.title": "Μαρτυρίες", - "home.upsell.receive.cta": "Από λογαριασμό", - "home.upsell.receive.title": "Λήψη κρυπτογράφησης", - "home.warning.viewOnly": "Αυτό είναι ένα πορτοφόλι μόνο για προβολή", - "interface.metatags.description": "Ανταλλάξτε κρυπτονομίσματα σε Ethereum, Base, Arbitrum, Polygon, Unichain και άλλα. Η πλατφόρμα DeFi που εμπιστεύονται εκατομμύρια.", - "interface.metatags.title": "Διασύνδεση Uniswap", - "landing.api": "API", - "landing.appsOverview": "Κατασκευασμένο για όλους τους τρόπους με τους οποίους αλλάζετε", - "landing.blog.description": "Ενημερωθείτε για τα τελευταία νέα της εταιρείας, τα χαρακτηριστικά των προϊόντων και πολλά άλλα", - "landing.docs.description": "Εξερευνήστε τη βιβλιοθήκη μας με έγγραφα προγραμματιστών για να ξεκινήσετε να δημιουργείτε με το Uniswap", - "landing.exploreUniverse": "Εξερευνήστε το Σύμπαν", - "landing.getStarted": "Συναλλαγές στο μεγαλύτερο DEX στον κόσμο", - "landing.helpCenter.body": "Περιηγηθείτε στις Συχνές Ερωτήσεις και λάβετε υποστήριξη από την ομάδα υποστήριξής μας με έδρα τις ΗΠΑ", - "landing.protocolDescription": "Η Uniswap Labs τροφοδοτεί μερικά από τα πιο χρησιμοποιούμενα προϊόντα κρυπτογράφησης. Απολαύστε πρόσβαση χωρίς άδεια, αποδεδειγμένη ασφάλεια και εξειδικευμένη υποστήριξη.", - "landing.protocolStats": "Στατιστικά στοιχεία πρωτοκόλλου Uniswap", - "landing.provideLiquidity.body": "Παροχή ρευστότητας και είσπραξη χρεώσεων χρησιμοποιώντας τη διεπαφή Uniswap.", - "landing.provideLiquidity.subtitle": "Αγορές ηλεκτρικής ενέργειας onchain.", - "landing.socials": "Ακολουθήστε το Uniswap Labs στο X, Farcaster, LinkedIn, και TikTok", - "landing.swapBody": "Αποκτήστε πρόσβαση σε βαθιά ρευστότητα, εξερευνήστε tokens, ορίστε όρια παραγγελιών και παρέχετε ρευστότητα για χιλιάδες tokens σε αλυσίδες {{amount}} .", - "landing.swapSubtitle": "Ανταλλαγή χωρίς άδεια.", - "landing.tradingApi": "API συναλλαγών", - "landing.tradingApiBody": "Χρησιμοποιήστε το ίδιο API που τροφοδοτεί την εφαρμογή Uniswap Web App και το Πορτοφόλι, το οποίο εμπιστεύονται κορυφαίες ομάδες σε όλο τον κόσμο.", - "landing.tradingApiButton": "Ενσωματώστε το Uniswap API", - "landing.tradingApiSubtitle": "DeFi, απευθείας στους χρήστες σας.", - "landing.trusted": "Εμπιστεύονται εκατομμύρια", - "landing.unichain.body": "Γίνετε μέλος της κοινότητας που χτίζει το γρήγορο, αποκεντρωμένο Ethereum L2 που κατασκευάστηκε για να αποτελέσει το σπίτι του DeFi.", - "landing.unichain.button": "Έναρξη κατασκευής", - "landing.unichain.subtitle": "Η αλυσίδα DeFi.", - "landing.uniswapX.body": "Συναλλαγές χωρίς αέριο και προστασία MEV, με μηδενικές χρεώσεις για αποτυχημένες ανταλλαγές.", - "landing.uniswapX.button": "Ζήστε την εμπειρία του UniswapX", - "landing.uniswapX.subtitle": "Πιο έξυπνες ανταλλαγές, μηδενική τριβή.", - "landing.walletBody": "Το αξιόπιστο κρυπτογραφικό πορτοφόλι αυτοεπιτήρησης και η επέκταση με εκατομμύρια λήψεις, υποστήριξη από πραγματικούς ανθρώπους και βαθμολογία 4,8 .", - "landing.walletSubtitle": "Ανταλλαγή, αποθήκευση, εξερεύνηση.", - "language.afrikaans": "Αφρικάανς", - "language.arabic": "αραβικός", - "language.catalan": "καταλανικά", - "language.chineseSimplified": "Απλοποιημένα Κινέζικα", - "language.chineseTraditional": "Παραδοσιακά κινέζικα", - "language.czech": "Τσέχος", - "language.danish": "δανικός", - "language.dutch": "Ολλανδός", - "language.english": "Αγγλικά", - "language.finnish": "φινλανδικός", - "language.french": "γαλλική γλώσσα", - "language.greek": "ελληνικά", - "language.hebrew": "Εβραϊκά", - "language.hindi": "Χίντι", - "language.hungarian": "ουγγρικός", - "language.indonesian": "Ινδονησιακά", - "language.italian": "ιταλικά", - "language.japanese": "Ιαπωνικά", - "language.korean": "κορεάτης", - "language.malay": "Μαλαισίας", - "language.norwegian": "Νορβηγός", - "language.polish": "Στίλβωση", - "language.portuguese": "Πορτογαλικά", - "language.romanian": "ρουμανικός", - "language.russian": "Ρωσική", - "language.serbian": "Σέρβος", - "language.spanishArgentina": "Ισπανικά (Αργεντινή)", - "language.spanishBelize": "Ισπανικά (Μπελίζ)", - "language.spanishBolivia": "Ισπανικά (Βολιβία)", - "language.spanishChile": "Ισπανικά (Χιλή)", - "language.spanishColombia": "Ισπανικά (Κολομβία)", - "language.spanishCostaRica": "Ισπανικά (Κόστα Ρίκα)", - "language.spanishCuba": "Ισπανικά (Κούβα)", - "language.spanishDominicanRepublic": "Ισπανικά (Δομινικανή Δημοκρατία)", - "language.spanishEcuador": "Ισπανικά (Ισημερινός)", - "language.spanishElSalvador": "Ισπανικά (Ελ Σαλβαδόρ)", - "language.spanishGuatemala": "Ισπανικά (Γουατεμάλα)", - "language.spanishHonduras": "Ισπανικά (Ονδούρα)", - "language.spanishLatam": "Ισπανικά (Λατινική Αμερική)", - "language.spanishMexico": "Ισπανικά (Μεξικό)", - "language.spanishNicaragua": "Ισπανικά (Νικαράγουα)", - "language.spanishPanama": "Ισπανικά (Παναμάς)", - "language.spanishParaguay": "Ισπανικά (Παραγουάη)", - "language.spanishPeru": "Ισπανικά (Περού)", - "language.spanishPuertoRico": "Ισπανικά (Πουέρτο Ρίκο)", - "language.spanishSpain": "Ισπανικά (Ισπανία)", - "language.spanishUruguay": "Ισπανικά (Ουρουγουάη)", - "language.spanishUs": "Ισπανικά (ΗΠΑ)", - "language.spanishVenezuela": "Ισπανικά (Βενεζουέλα)", - "language.swahili": "Σουαχίλι", - "language.swedish": "σουηδικά", - "language.turkish": "τούρκικος", - "language.ukrainian": "Ουκρανός", - "language.urdu": "Ουρντού", - "language.vietnamese": "Βιετναμέζικο", - "large.price.difference": "Μεγάλη διαφορά τιμής", - "large.price.difference.tooltip": "Η συνέχιση αυτής της συναλλαγής θα οδηγήσει σε απώλεια κεφαλαίων. Αυτή η διαφορά μπορεί να οφείλεται σε μεγάλες συναλλαγές ή χαμηλή ρευστότητα.", - "limit.open.count_one": "1 ανοιχτό όριο", - "limit.open.count_other": "{{count}} ανοιχτά όρια", - "limitPrice.buyingAboveMarketPrice.error.description": "Η τιμή ορίου σας είναι {{percentage}}% υψηλότερη από την αγορά. Προσαρμόστε την τιμή ορίου σας για να συνεχίσετε.", - "limitPrice.buyingAboveMarketPrice.error.title": "Αγορά {{tokenSymbol}} πάνω από την τιμή της αγοράς", - "limitPrice.marketPriceNotAvailable.error.description": "Δεν μπορούμε να υπολογίσουμε την τρέχουσα τιμή αγοράς. Για να αποφύγετε την υποβολή παραγγελίας κάτω από την τιμή της αγοράς, ελέγξτε τη σύνδεσή σας στο δίκτυο και δοκιμάστε ξανά.", - "limitPrice.marketPriceNotAvailable.error.title": "Η τιμή αγοράς δεν είναι διαθέσιμη", - "limitPrice.sellingBelowMarketPrice.error.description": "Η τιμή ορίου σας είναι {{percentage}}% χαμηλότερη από την αγορά. Προσαρμόστε την τιμή ορίου σας για να συνεχίσετε.", - "limitPrice.sellingBelowMarketPrice.error.title": "Πωλείται {{tokenSymbol}} κάτω από την τιμή της αγοράς", - "limits.form.disclaimer.mainnet": "Μόνο τα διακριτικά mainnet Ethereum είναι διαθέσιμα για όρια. ", - "limits.form.disclaimer.mainnet.short": "Μόνο τα διακριτικά Mainnet είναι διαθέσιμα για όρια.", - "limits.form.disclaimer.uniswapx": "Τα όρια ενδέχεται να μην εκτελούνται ακριβώς όταν τα διακριτικά φτάνουν την καθορισμένη τιμή. ", - "limits.learnMore": "Μάθετε περισσότερα για τα όρια", - "limits.price.input.label": "Όταν αξίζει 1 ", - "limits.price.label": "Όριο τιμής", - "limits.selectSupportedTokens": "Επιλέξτε υποστηριζόμενα διακριτικά", - "liquidity.hooks": "Άγκιστρα στο v4", - "liquidity.hooks.address.input": "Εισαγάγετε τη διεύθυνση του γάντζου", - "liquidity.hooks.address.tooltip": "Διεύθυνση αγκίστρου: {{address}}", - "liquidity.learnMoreLabel": "Μάθετε για την παροχή ρευστότητας", - "liquidity.notEnough.label": "Δεν υπάρχει αρκετή ρευστότητα για να εμφανιστεί η ακριβής αξία του USD.", - "liquidity.provideOnProtocols": "Παροχή ρευστότητας σε διαφορετικά πρωτόκολλα", - "liquidityPool.page.title": "Προσθέστε ρευστότητα σε ομάδες{{version}} στο Uniswap", - "liquidityPool.positions.closed.title": "Κλειστές θέσεις", - "liquidityPool.positions.loadingMore": "Φόρτωση περισσότερων θέσεων...", - "liquidityPool.positions.page.title": "Διαχείριση {{quoteSymbol}}/{{baseSymbol}} ρευστότητας στο Uniswap", - "liquidityPool.positions.page.version.description": "Δείτε τις ενεργές {{version}} θέσεις ρευστότητάς σας. Προσθήκη νέων θέσεων.", - "liquidityPool.positions.page.version.title": "Διαχειριστείτε τη ρευστότητα της ομάδας{{version}} στο Uniswap", - "migrate.allowed": "Επιτρέπεται", - "migrate.allowLpMigration": "Να επιτρέπεται η μετεγκατάσταση διακριτικού LP", - "migrate.connectAccount": "Πρέπει να συνδέσετε έναν λογαριασμό στον οποίο ανήκει αυτή η θέση.", - "migrate.connectWallet": "Συνδεθείτε σε ένα πορτοφόλι για να δείτε τη ρευστότητά σας στο V2.", - "migrate.contract": "Συμβόλαιο μετανάστευσης Unswap", - "migrate.firstLP": "Είστε ο πρώτος πάροχος ρευστότητας για αυτό το Uniswap V3 pool. Η ρευστότητά σας θα μεταφερθεί στην τρέχουσα τιμή {{source}} .", - "migrate.highGasCost": "Το κόστος της συναλλαγής σας θα είναι πολύ υψηλότερο καθώς περιλαμβάνει το αέριο για τη δημιουργία της πισίνας.", - "migrate.invalidRange": "Επιλέχθηκε μη έγκυρο εύρος. Η ελάχιστη τιμή πρέπει να είναι χαμηλότερη από τη μέγιστη τιμή.", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} κουπόνια LP", - "migrate.migrating": "Μετανάστευση", - "migrate.missingV2Position": "Δεν βλέπετε μια από τις θέσεις σας v2; Εισαγάγετε το.", - "migrate.noV2Liquidity": "Δεν βρέθηκε ρευστότητα V2.", - "migrate.positionNoFees": "Η θέση σας δεν θα κερδίσει αμοιβές ούτε θα χρησιμοποιηθεί σε συναλλαγές έως ότου η τιμή της αγοράς μετακινηθεί στο εύρος σας.", - "migrate.priceDifference": "Διαφορά τιμής: ", - "migrate.priceWarning": "Θα πρέπει να καταθέτετε ρευστότητα στο Uniswap V3 μόνο σε τιμή που πιστεύετε ότι είναι σωστή.
Εάν η τιμή φαίνεται λανθασμένη, μπορείτε είτε να κάνετε μια ανταλλαγή για να μετακινήσετε την τιμή είτε να περιμένετε να το κάνει κάποιος άλλος.", - "migrate.refund": "Τουλάχιστον {{amtA}} {{symA}} και {{amtB}} {{symB}} θα επιστραφούν στο πορτοφόλι σας λόγω του επιλεγμένου εύρους τιμών.", - "migrate.selectFeeTier": "Επιλέξτε επίπεδο χρέωσης", - "migrate.setRange": "Ορίστε το εύρος τιμών", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Τιμή:", - "migrate.v2Description": "Αυτό το εργαλείο θα μεταφέρει με ασφάλεια τη ρευστότητά σας {{source}} στο V3. Η διαδικασία είναι εντελώς αναξιόπιστη χάρη στο συμβόλαιο μετεγκατάστασης <0>Uniswap ↗", - "migrate.v2Instruction": "Για κάθε ομάδα που εμφανίζεται παρακάτω, κάντε κλικ στην επιλογή μετεγκατάσταση για να αφαιρέσετε τη ρευστότητά σας από το Uniswap V2 και να την καταθέσετε στο Uniswap V3.", - "migrate.v2Title": "Μεταφορά ρευστότητας V2", - "migrate.v3Price": "V3 {{sym}} Τιμή:", - "mint.v3.input.invalidPrice.error": "Μη έγκυρη εισαγωγή τιμής", - "mobileAppPromo.banner.getTheApp.link": "Αποκτήστε την εφαρμογή Uniswap Wallet", - "mobileAppPromo.banner.title": "Unswap: Πορτοφόλι Crypto & NFT", - "moonpay.poweredBy": "Fiat onramp powered by MoonPay USA LLC", - "nav.createAccount.button": "Δημιουργία λογαριασμού", - "nav.logIn.button": "Συνδεθείτε", - "nav.logInOrConnect.title": "Συνδεθείτε ή συνδεθείτε", - "nav.products.tradingApi": "Ενσωματώστε το πρωτόκολλο", - "nav.products.unichain": "Η αλυσίδα DeFi", - "nav.products.uniswapX": "Ο μετα-συσσωρευτής", - "nav.products.wallet": "Ανταλλαγή, αποθήκευση, εξερεύνηση", - "nav.signUp.button": "Εγγραφείτε", - "nav.tabs.createPosition": "Δημιουργία θέσης", - "nav.tabs.viewPositions": "Προβολή θέσεων", - "network.lostConnection": "Μπορεί να έχετε χάσει τη σύνδεση δικτύου σας.", - "network.mightBeDown": "Το {{network}} μπορεί να είναι απενεργοποιημένο αυτήν τη στιγμή ή μπορεί να έχετε χάσει τη σύνδεσή σας στο δίκτυο.", - "network.warning": "Προειδοποίηση δικτύου", - "nft.noPools": "Δεν υπάρχουν ακόμα πισίνες", - "nft.reportSpam": "Αναφορά ως ανεπιθύμητη", - "notFound.oops": "Ωχ, πάρε με πίσω στο Swap", - "notice.uk": "Αυτή η διαδικτυακή εφαρμογή παρέχεται ως εργαλείο για τους χρήστες να αλληλεπιδρούν με το Πρωτόκολλο Uniswap με δική τους πρωτοβουλία, χωρίς έγκριση ή σύσταση δραστηριοτήτων συναλλαγών κρυπτονομισμάτων. Με αυτόν τον τρόπο, η Uniswap δεν συνιστά στους χρήστες ή δυνητικούς χρήστες να συμμετέχουν σε δραστηριότητα συναλλαγών κρυπτονομισμάτων και οι χρήστες ή οι δυνητικοί χρήστες της εφαρμογής Ιστού δεν θα πρέπει να θεωρούν ότι αυτή η ιστοσελίδα ή το περιεχόμενό της περιλαμβάνει οποιαδήποτε μορφή σύστασης, πρόσκλησης ή παρότρυνσης για συναλλαγή με κρυπτογραφικά στοιχεία .", - "notice.uk.label": "Αποποίηση ευθύνης ΗΒ:", - "notification.assetVisibility.hidden": "{{assetName}} κρυφό", - "notification.assetVisibility.unhidden": "{{assetName}} μη κρυφό", - "notification.buy.network": "Αγορά από {{network}}", - "notification.copied.address": "Η διεύθυνση αντιγράφηκε", - "notification.copied.calldata": "Τα Calldata αντιγράφηκαν", - "notification.copied.contractAddress": "Η διεύθυνση της σύμβασης αντιγράφηκε", - "notification.copied.failed": "Αποτυχία αντιγραφής στο πρόχειρο", - "notification.copied.image": "Η εικόνα αντιγράφηκε", - "notification.copied.linkUrl": "Ο σύνδεσμος αντιγράφηκε", - "notification.copied.nftUrl": "Η διεύθυνση URL NFT αντιγράφηκε", - "notification.copied.poolId": "Το αναγνωριστικό ομάδας αντιγράφηκε", - "notification.copied.tokenUrl": "Το διακριτικό URL αντιγράφηκε", - "notification.copied.transactionId": "Το αναγνωριστικό συναλλαγής αντιγράφηκε", - "notification.copied.unitag": "Το όνομα χρήστη αντιγράφηκε", - "notification.countryChange": "Έγινε εναλλαγή σε {{countryName}}", - "notification.limit.network": "Δημιουργία εντολής ορίου στο {{network}}", - "notification.lp.network": "Παροχή ρευστότητας σε {{network}}", - "notification.network.changed": "Έγινε εναλλαγή σε {{network}}", - "notification.passwordChanged": "Ο κωδικός άλλαξε", - "notification.poolFinder.network": "Αναζήτηση για πισίνα στο {{network}}", - "notification.restore.success": "Το πορτοφόλι αποκαταστάθηκε!", - "notification.sell.network": "Πωλείται στις {{network}}", - "notification.send.network": "Αποστολή στις {{network}}", - "notification.smartWallet.disabled": "Απενεργοποιημένο σε 1 δίκτυο", - "notification.smartWallet.disabled.all": "Το έξυπνο πορτοφόλι απενεργοποιήθηκε", - "notification.smartWallet.disabled.plural": "Απενεργοποιημένο σε δίκτυα {{amount}}", - "notification.spam.NFT.failed": "Δεν ήταν δυνατή η αναφορά NFT. Δοκιμάστε ξανά αργότερα.", - "notification.spam.NFT.successful": "Αναφέρθηκε", - "notification.swap.network": "Ανταλλαγή σε {{network}}", - "notification.swap.pending.swap": "Ανταλλαγή σε εκκρεμότητα", - "notification.swap.pending.unwrap": "Εκκρεμεί το ξετύλιγμα", - "notification.swap.pending.wrap": "Ανακύκλωση σε εκκρεμότητα", - "notification.transaction.approve.canceled": "Ακυρώθηκε {{currencySymbol}} έγκριση.", - "notification.transaction.approve.fail": "Απέτυχε η έγκριση {{currencySymbol}} για χρήση με {{address}}.", - "notification.transaction.approve.success": "Εγκρίθηκε {{currencySymbol}} για χρήση με {{address}}.", - "notification.transaction.pending": "Συναλλαγή σε εκκρεμότητα", - "notification.transaction.swap.canceled": "Ακυρώθηκε {{inputCurrencySymbol}}-{{outputCurrencySymbol}} ανταλλαγή.", - "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} για ανταλλαγή {{outputCurrencyAmountWithSymbol}} έληξε.", - "notification.transaction.swap.fail": "Αποτυχία αντικατάστασης {{inputCurrencyAmountWithSymbol}} με {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.swap.success": "Ανταλλαγή {{inputCurrencyAmountWithSymbol}} με {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.transfer.canceled": "Ακυρώθηκε {{tokenNameOrAddress}} αποστολή", - "notification.transaction.transfer.fail": "Απέτυχε η αποστολή {{tokenNameOrAddress}} στο {{walletNameOrAddress}}", - "notification.transaction.transfer.received": "Λήφθηκε {{tokenNameOrAddress}} από {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "Στάλθηκε {{tokenNameOrAddress}} στο {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "Απέτυχε η συναλλαγή με {{addressOrEnsName}}", - "notification.transaction.unknown.fail.short": "η συναλλαγή απέτυχε", - "notification.transaction.unknown.success.full": "Έγινε συναλλαγή με {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "Η συναλλαγή επιβεβαιώθηκε", - "notification.transaction.unwrap.canceled": "Ακυρώθηκε {{inputCurrencySymbol}} ξετύλιγμα.", - "notification.transaction.unwrap.fail": "Αποτυχία ξετυλίγματος {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.unwrap.success": "Ξετυλίχθηκε {{inputCurrencyAmountWithSymbol}} και έλαβε {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.canceled": "Ακυρώθηκε {{inputCurrencySymbol}} περιτύλιγμα.", - "notification.transaction.wrap.fail": "Αποτυχία αναδίπλωσης {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.success": "Τύλιξε {{inputCurrencyAmountWithSymbol}} και έλαβε {{outputCurrencyAmountWithSymbol}}.", - "notification.transfer.pending": "Αποστολή σε εκκρεμότητα", - "notification.walletConnect.confirmed": "Η συναλλαγή επιβεβαιώθηκε με {{dappName}}", - "notification.walletConnect.connected": "Συνδεδεμένος", - "notification.walletConnect.disconnected": "Ασύνδετος", - "notification.walletConnect.failed": "Η συναλλαγή απέτυχε με {{dappName}}", - "notification.walletConnect.networkChanged.full": "Έγινε εναλλαγή σε {{networkName}}", - "notification.walletConnect.networkChanged.short": "Δίκτυα μεταγωγής", - "notifications.scantastic.subtitle": "Συνέχεια στην επέκταση Uniswap", - "notifications.scantastic.title": "Επιτυχία!", - "onboarding.backup.manual.banner": "Σας προτείνουμε να το γράψετε σε ένα κομμάτι χαρτί και να το αποθηκεύσετε σε ασφαλές μέρος, σαν χρηματοκιβώτιο.", - "onboarding.backup.manual.displayWarning.description": "Διαβάστε προσεκτικά τα παρακάτω πριν συνεχίσετε.", - "onboarding.backup.manual.displayWarning.note.access": "Αυτή η φράση ανάκτησης σάς δίνει πλήρη πρόσβαση στο πορτοφόλι και τα χρήματά σας", - "onboarding.backup.manual.displayWarning.note.secure": "Δείτε αυτό ιδιωτικά και μην το μοιραστείτε με κανέναν", - "onboarding.backup.manual.displayWarning.note.storage": "Γράψτε το και κρατήστε το σε ασφαλές μέρος", - "onboarding.backup.manual.displayWarning.title": "Μερικά σημαντικά πράγματα που πρέπει να γνωρίζετε", - "onboarding.backup.manual.error": "Μη έγκυρη ή ανορθόγραφη λέξη", - "onboarding.backup.manual.placeholder": "Μυστική λέξη", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} ολοκληρώθηκε", - "onboarding.backup.manual.selectedWordPlaceholder": "Επιλέξτε λέξη", - "onboarding.backup.manual.subtitle_one": "Ποια είναι η {{count}}η λέξη στη φράση ανάκτησης;", - "onboarding.backup.manual.subtitle_two": "Ποια είναι η {{count}}η λέξη στη φράση ανάκτησής σας;", - "onboarding.backup.manual.subtitle_few": "Ποια είναι η {{count}}η λέξη στη φράση ανάκτησής σας;", - "onboarding.backup.manual.subtitle_other": "Ποια είναι η {{count}}η λέξη στη φράση ανάκτησής σας;", - "onboarding.backup.manual.title": "Ας βεβαιωθούμε ότι το έχετε καταγράψει σωστά", - "onboarding.backup.option.badge.quick": "Γρήγορα", - "onboarding.backup.option.cloud.description": "Δημιουργήστε αντίγραφα ασφαλείας του πορτοφολιού σας μέσω {{cloudProviderName}}, που προστατεύεται από κωδικό πρόσβασης ανάκτησης.", - "onboarding.backup.option.cloud.title": "Ορίστε έναν κωδικό πρόσβασης ανάκτησης", - "onboarding.backup.option.manual.description": "Καταγράψτε τις 12 μυστικές σας λέξεις σε ένα χαρτί και αποθηκεύστε το σε ασφαλές μέρος.", - "onboarding.backup.option.manual.title": "Γράψτε τη φράση ανάκτησης", - "onboarding.backup.reminder.backupNowButton": "Δημιουργία αντιγράφων ασφαλείας τώρα", - "onboarding.backup.reminder.remindMeLaterButton": "Υπενθύμισέ μου αργότερα", - "onboarding.backup.reminder.title": "Δημιουργήστε αντίγραφα ασφαλείας του πορτοφολιού σας", - "onboarding.backup.reminder.warning.description": "Δημιουργήστε αντίγραφα ασφαλείας του πορτοφολιού σας, ώστε να μπορείτε να ανακτήσετε τα περιουσιακά σας στοιχεία σε περίπτωση που χάσετε το τηλέφωνό σας ή αγοράσετε ένα καινούργιο.", - "onboarding.backup.reminder.warning.fundsLabel": "Κεφάλαια σε κίνδυνο", - "onboarding.backup.reminder.warning.title": "Μπορεί να χάσετε τα χρήματά σας", - "onboarding.backup.speedBump.cloud.description": "Εάν το ξεχάσετε ποτέ, δεν μπορούμε να το επαναφέρουμε για εσάς. Καταγράψτε το σε ασφαλές μέρος ή αποθηκεύστε το με ασφάλεια σε έναν διαχειριστή κωδικών πρόσβασης.", - "onboarding.backup.speedBump.cloud.disclaimer": "Κατανοώ ότι το Uniswap Labs δεν μπορεί να επαναφέρει τον κωδικό πρόσβασης ανάκτησης.", - "onboarding.backup.speedBump.cloud.title": "Είναι σημαντικό να αποθηκεύσετε αυτόν τον κωδικό πρόσβασης", - "onboarding.backup.speedBump.manual.description": "Βεβαιωθείτε ότι έχετε γράψει σωστά τη φράση ανάκτησης και έχετε ένα ασφαλές μέρος για να την αποθηκεύσετε.", - "onboarding.backup.speedBump.manual.disclaimer": "Κατανοώ ότι η Uniswap Labs δεν μπορεί να ανακτήσει το πορτοφόλι μου εάν το χάσω.", - "onboarding.backup.speedBump.manual.title": "Πριν τελειώσεις...", - "onboarding.backup.subtitle": "Έτσι θα ανακτήσετε το πορτοφόλι σας εάν διαγράψετε την εφαρμογή ή χάσετε τη συσκευή σας.", - "onboarding.backup.title.existing": "Δημιουργήστε αντίγραφα ασφαλείας του πορτοφολιού σας", - "onboarding.backup.title.new": "Επιλέξτε τη μέθοδο δημιουργίας αντιγράφων ασφαλείας", - "onboarding.backup.view.subtitle.message1": "Διαβάστε προσεκτικά τα παρακάτω πριν συνεχίσετε", - "onboarding.backup.view.subtitle.message2": "Θα χρειαστεί να εισαγάγετε και τις 12 από αυτές τις μυστικές λέξεις για να ανακτήσετε το πορτοφόλι σας.", - "onboarding.backup.view.title": "Γράψτε τη φράση ανάκαμψης", - "onboarding.backup.view.warning.message1": "Αυτή η φράση ανάκτησης σάς δίνει πλήρη πρόσβαση στο πορτοφόλι και τα χρήματά σας", - "onboarding.backup.view.warning.message2": "Γράψτε το και κρατήστε το σε ασφαλές μέρος", - "onboarding.backup.view.warning.message3": "Δείτε αυτό ιδιωτικά και μην το μοιραστείτε με κανέναν", - "onboarding.cloud.confirm.description": "Θα χρειαστεί να το εισαγάγετε για να ανακτήσετε τα χρήματά σας. Εάν το ξεχάσετε ποτέ, δεν μπορούμε να το ανακτήσουμε για εσάς.", - "onboarding.cloud.confirm.title": "Επιβεβαιώστε τον κωδικό πρόσβασης ανάκτησης", - "onboarding.cloud.createPassword.description": "Θα χρειαστεί να το εισαγάγετε για να ανακτήσετε τα χρήματά σας. Εάν το ξεχάσετε ποτέ, δεν μπορούμε να το ανακτήσουμε για εσάς.", - "onboarding.cloud.createPassword.title": "Δημιουργήστε τον κωδικό πρόσβασης ανάκτησης", - "onboarding.complete.button": "Ανοίξτε την επέκταση Uniswap", - "onboarding.complete.description": "Το πορτοφόλι σας είναι έτοιμο για αποστολή και λήψη κρυπτογράφησης. Ανοίξτε την επέκταση Uniswap με την παρακάτω συντόμευση.", - "onboarding.complete.go_to_uniswap": "Μεταβείτε στην εφαρμογή Web Uniswap", - "onboarding.complete.pin.description": "Κάντε κλικ στο εικονίδιο καρφίτσας για να προσθέσετε την επέκταση Uniswap στη γραμμή εργαλείων σας.", - "onboarding.complete.pin.title": "Καρφιτσώστε την επέκταση Uniswap", - "onboarding.complete.title": "Είσαι έτοιμος", - "onboarding.extension.biometrics.subtitle.fingerprint": "Αποκτήστε πρόσβαση στο πορτοφόλι σας γρήγορα και με ασφάλεια χρησιμοποιώντας μόνο το δακτυλικό σας αποτύπωμα.", - "onboarding.extension.biometrics.title": "Ενεργοποίηση {{biometricsMethod}}", - "onboarding.extension.password.subtitle": "Θα χρειαστείτε αυτό για να ξεκλειδώσετε το πορτοφόλι σας και να αποκτήσετε πρόσβαση στη φράση ανάκτησης", - "onboarding.extension.password.title.default": "Δημιούργησε κωδικό", - "onboarding.extension.password.title.reset": "Επαναφορά του κωδικού πρόσβασής σας", - "onboarding.extension.unsupported.android.description": "Η επέκταση Uniswap είναι συμβατή μόνο με το Chrome σε επιτραπέζιους υπολογιστές.", - "onboarding.extension.unsupported.android.title": "Το Chrome σε κινητά δεν υποστηρίζεται (ακόμα)", - "onboarding.extension.unsupported.description": "Η επέκταση Uniswap είναι συμβατή μόνο με το Chrome αυτήν τη στιγμή.", - "onboarding.extension.unsupported.title": "Αυτό το πρόγραμμα περιήγησης δεν υποστηρίζεται (ακόμα)", - "onboarding.home.intro.backup.description.extension": "Αποθηκεύστε τη φράση ανάκτησης για να βεβαιωθείτε ότι δεν θα χάσετε ποτέ την πρόσβαση στο πορτοφόλι σας.", - "onboarding.home.intro.backup.description.mobile": "Δημιουργήστε ένα σχέδιο αποκατάστασης σε περίπτωση που χάσετε ποτέ το τηλέφωνό σας ή αγοράσετε ένα καινούργιο.", - "onboarding.home.intro.backup.title": "Δημιουργήστε αντίγραφα ασφαλείας του πορτοφολιού σας", - "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK και JUP — τώρα διαθέσιμα στο Unichain", - "onboarding.home.intro.bridgedAssets.title": "Ανταλλαγή νέων tokens στο Unichain", - "onboarding.home.intro.fund.description": "Χρηματοδοτήστε το πορτοφόλι σας αγοράζοντας κρυπτογράφηση ή μεταφέροντας από άλλο λογαριασμό.", - "onboarding.home.intro.fund.title": "Αποκτήστε το πρώτο σας διακριτικό", - "onboarding.home.intro.label.required": "Υποχρεούμαι", - "onboarding.home.intro.label.swipe": "Σουφρώνω", - "onboarding.home.intro.pushNotifications.description": "Λάβετε ειδοποιήσεις τιμών για τα αγαπημένα σας διακριτικά, τις τάσεις της αγοράς και πολλά άλλα.", - "onboarding.home.intro.pushNotifications.title": "Μείνετε ενήμεροι", - "onboarding.home.intro.unitag.description": "Δημιουργήστε ένα εξατομικευμένο προφίλ web3 και μοιραστείτε εύκολα τη διεύθυνσή σας με φίλους.", - "onboarding.home.intro.unitag.title": "Διεκδικήστε το όνομα χρήστη σας {{unitagDomain}}", - "onboarding.import.error.invalidWords_one": "1 λέξη δεν είναι έγκυρη ή γράφεται λάθος", - "onboarding.import.error.invalidWords_other": "Οι λέξεις {{count}} είναι άκυρες ή ανορθόγραφες", - "onboarding.import.method.restore.message.android": "Προσθέστε πορτοφόλια για τα οποία έχετε δημιουργήσει αντίγραφα ασφαλείας στον λογαριασμό σας στο Google Drive.", - "onboarding.import.method.restore.message.ios": "Προσθέστε πορτοφόλια για τα οποία έχετε δημιουργήσει αντίγραφα ασφαλείας στον λογαριασμό σας iCloud.", - "onboarding.import.method.restore.title": "Επαναφέρετε ένα πορτοφόλι", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.android": "Εισαγάγετε τον κωδικό πρόσβασης ανάκτησης για να επαναφέρετε το πορτοφόλι σας μέσω αντιγράφων ασφαλείας στο Google Drive.", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.ios": "Εισαγάγετε τον κωδικό πρόσβασης ανάκτησης για να επαναφέρετε το πορτοφόλι σας μέσω αντιγράφου ασφαλείας iCloud.", - "onboarding.import.method.restoreSeedPhrase.cloud.title.android": "Επαναφορά από το Google Drive", - "onboarding.import.method.restoreSeedPhrase.cloud.title.ios": "Επαναφορά από το iCloud", - "onboarding.import.method.restoreSeedPhrase.title": "Επιλέξτε πώς να επαναφέρετε το πορτοφόλι σας", - "onboarding.import.method.restoreSeedPhrase.wallet.desc": "Εισαγάγετε τις 12 μυστικές λέξεις που έχετε αποθηκεύσει προηγουμένως σε ασφαλές μέρος.", - "onboarding.import.method.restoreSeedPhrase.wallet.title": "Εισαγάγετε τη φράση ανάκτησης", - "onboarding.import.method.viewPrivateKeys.button.desc": "Δείτε το ιδιωτικό σας κλειδί", - "onboarding.import.method.viewPrivateKeys.title": "Δεν έχετε τίποτα από τα παραπάνω; ", - "onboarding.import.onDeviceRecovery.other_options": "Δημιουργήστε ή εισαγάγετε ένα διαφορετικό πορτοφόλι", - "onboarding.import.onDeviceRecovery.other_options.label": "Δεν θέλετε τίποτα από τα παραπάνω;", - "onboarding.import.onDeviceRecovery.subtitle": "Επιλέξτε σε ποιο πορτοφόλι θέλετε να συνδεθείτε ξανά.", - "onboarding.import.onDeviceRecovery.title": "Καλώς ήρθατε πίσω στο Uniswap", - "onboarding.import.onDeviceRecovery.wallet.button": "Προβολή φράσης ανάκτησης", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 άλλο πορτοφόλι", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} άλλα πορτοφόλια", - "onboarding.import.onDeviceRecovery.warning.caption": "Βεβαιωθείτε ότι έχετε δημιουργήσει αντίγραφα ασφαλείας όλων των άλλων πορτοφολιών. Εάν θέλετε να τα επαναφέρετε ποτέ, θα χρειαστείτε τις φράσεις ανάκτησης ή τα αντίστοιχα {{cloudProvider}} αντίγραφα ασφαλείας.", - "onboarding.import.onDeviceRecovery.warning.title": "Είσαι σίγουρος;", - "onboarding.import.selectMethod.errorMessage": "Παρουσιάστηκε απροσδόκητο σφάλμα. Δοκιμάστε ξανά.", - "onboarding.import.selectMethod.mobileApp.subtitle": "Εισαγάγετε ένα πορτοφόλι από την εφαρμογή για κινητά μέσω κωδικού QR.", - "onboarding.import.selectMethod.mobileApp.title": "Χρησιμοποιήστε το Uniswap Mobile", - "onboarding.import.selectMethod.passkey.subtitle": "Συγχρονίστε το πορτοφόλι Uniswap χρησιμοποιώντας έναν υπάρχοντα κωδικό πρόσβασης.", - "onboarding.import.selectMethod.passkey.title": "Συνδεθείτε με κωδικό πρόσβασης", - "onboarding.import.selectMethod.recoveryPhrase.subtitle": "Εισαγωγή από άλλο πορτοφόλι κρυπτογράφησης.", - "onboarding.import.selectMethod.recoveryPhrase.title": "Εισαγάγετε τη φράση ανάκτησης", - "onboarding.import.selectMethod.title": "Συνδεθείτε ή εισαγάγετε ένα πορτοφόλι", - "onboarding.import.title": "Επιλέξτε πώς θέλετε να προσθέσετε το πορτοφόλι σας", - "onboarding.importMnemonic.button.default": "Η φράση αποθεραπείας μου είναι 12 λέξεις", - "onboarding.importMnemonic.button.importing": "Εισαγωγή...", - "onboarding.importMnemonic.button.longPhrase": "Η φράση αποκατάστασης μου είναι μεγαλύτερη", - "onboarding.importMnemonic.error.invalidPhrase": "Η φράση που εισαγάγατε δεν είναι έγκυρη", - "onboarding.importMnemonic.subtitle": "Πληκτρολογήστε ή επικολλήστε τη φράση ανάκτησης 12 λέξεων", - "onboarding.importMnemonic.title": "Εισαγάγετε τη φράση ανάκτησης", - "onboarding.importPasskey.bringWindowToFront": "Φέρτε το παράθυρο μπροστά", - "onboarding.importPasskey.continueInSecureWindow": "Συνεχίστε στο παράθυρο ασφαλούς σύνδεσης.", - "onboarding.intro.button.alreadyHave": "Έχω ήδη ένα πορτοφόλι", - "onboarding.intro.button.logInOrImport": "Σύνδεση ή εισαγωγή", - "onboarding.intro.mobileScan.button": "Σάρωση κωδικού QR για εισαγωγή", - "onboarding.intro.mobileScan.title": "Έχετε την εφαρμογή Uniswap;", - "onboarding.landing.button.add": "Προσθέστε ένα υπάρχον πορτοφόλι", - "onboarding.landing.button.create": "Δημιουργήστε ένα πορτοφόλι", - "onboarding.landing.button.createAccount": "Δημιουργία λογαριασμού", - "onboarding.name.choose": "Επιλέξτε ένα όνομα χρήστη", - "onboarding.name.choose.subtitle": "Αυτό είναι ένα δημόσιο όνομα που μπορεί να χρησιμοποιήσει οποιοσδήποτε για να σας στείλει κρυπτογράφηση.", - "onboarding.notification.permission.message": "Για να λαμβάνετε ειδοποιήσεις, ενεργοποιήστε τις ειδοποιήσεις για το Uniswap Wallet στις ρυθμίσεις της συσκευής σας.", - "onboarding.notification.permission.title": "Άδεια ειδοποιήσεων", - "onboarding.notification.subtitle": "Μείνετε ενημερωμένοι για τις καταστάσεις συναλλαγών και τις σημαντικές αλλαγές τιμών για τα αγαπημένα μάρκες.", - "onboarding.notification.title": "Ενεργοποιήστε τις ειδοποιήσεις", - "onboarding.passkey.create": "Δημιουργήστε τον κωδικό πρόσβασής σας", - "onboarding.passkey.loading.subtitle": "Αυτό θα πρέπει να διαρκέσει μόνο ένα δευτερόλεπτο.", - "onboarding.passkey.loading.title": "Βρίσκοντας το πορτοφόλι σας...", - "onboarding.passkey.secure": "Ασφαλίστε τον λογαριασμό σας", - "onboarding.passkey.secure.description": "Τα κλειδιά πρόσβασης σάς επιτρέπουν να έχετε γρήγορη και ασφαλή πρόσβαση στον λογαριασμό σας χρησιμοποιώντας μόνο το πρόσωπό σας ή το δακτυλικό σας αποτύπωμα.", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "Ας επιβεβαιώσουμε ότι το καταλάβατε σωστά. Εάν χάσετε ή το γράψετε λανθασμένα, δεν θα μπορείτε να ανακτήσετε τα χρήματά σας.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "Εάν χάσετε ή το γράψετε λανθασμένα, δεν θα μπορείτε να ανακτήσετε τα χρήματά σας.", - "onboarding.recoveryPhrase.confirm.title": "Ας επιβεβαιώσουμε ότι το καταλάβατε σωστά", - "onboarding.recoveryPhrase.view.subtitle": "Θα χρειαστεί να εισαγάγετε και τις 12 από αυτές τις μυστικές λέξεις για να ανακτήσετε το πορτοφόλι σας.", - "onboarding.recoveryPhrase.view.title": "Γράψτε τη φράση ανάκαμψης", - "onboarding.recoveryPhrase.view.title.hasPassword": "Εάν ξεχάσετε ποτέ τον κωδικό πρόσβασής σας...", - "onboarding.recoveryPhrase.warning.final.button": "είμαι έτοιμος", - "onboarding.recoveryPhrase.warning.final.message": "Η φράση ανάκτησής σας είναι αυτή που σας παρέχει (και οποιονδήποτε την έχει) πρόσβαση στα χρήματά σας. Φροντίστε να το κρατήσετε για τον εαυτό σας.", - "onboarding.recoveryPhrase.warning.final.title": "Κάντε αυτό το βήμα σε ιδιωτικό μέρος", - "onboarding.recoveryPhrase.warning.screenshot.message": "Όποιος αποκτήσει πρόσβαση στις φωτογραφίες σας μπορεί να έχει πρόσβαση στο πορτοφόλι σας. Συνιστούμε να γράψετε τα λόγια σας.", - "onboarding.recoveryPhrase.warning.screenshot.title": "Τα στιγμιότυπα οθόνης δεν είναι ασφαλή", - "onboarding.resetPassword.complete.safety": "Μάθετε περισσότερα σχετικά με την ασφάλεια του πορτοφολιού", - "onboarding.resetPassword.complete.subtitle": "Χρησιμοποιήστε τον νέο κωδικό πρόσβασης για να ξεκλειδώσετε το πορτοφόλι σας.", - "onboarding.resetPassword.complete.title": "ΕΠΑΝΑΦΟΡΑ ΚΩΔΙΚΟΥ", - "onboarding.scan.error": "Παρουσιάστηκε σφάλμα κατά τη φόρτωση του κωδικού QR", - "onboarding.scan.otp.error": "Ο κωδικός που υποβάλατε είναι λανθασμένος ή παρουσιάστηκε σφάλμα κατά την υποβολή. ΠΑΡΑΚΑΛΩ προσπαθησε ξανα.", - "onboarding.scan.otp.failed": "Αποτυχημένες προσπάθειες: {{number}}", - "onboarding.scan.otp.subtitle": "Ελέγξτε την εφαρμογή Uniswap για κινητά για τον κωδικό 6 χαρακτήρων", - "onboarding.scan.otp.title": "Εισαγάγετε τον κωδικό μιας χρήσης", - "onboarding.scan.subtitle": "Σαρώστε τον κωδικό QR με την εφαρμογή Uniswap για κινητά για να ξεκινήσετε την εισαγωγή του πορτοφολιού σας.", - "onboarding.scan.title": "Εισαγωγή πορτοφολιού από την εφαρμογή", - "onboarding.scan.troubleScanning.message": "Εισαγωγή μέσω φράσης ανάκτησης", - "onboarding.scan.troubleScanning.title": "Πρόβλημα με τη σάρωση;", - "onboarding.scan.wifi": "Συνδέστε το τηλέφωνό σας στο ίδιο δίκτυο WiFi με τον υπολογιστή σας.", - "onboarding.security.alert.biometrics.message.android": "Για να χρησιμοποιήσετε βιομετρικά στοιχεία, ρυθμίστε τα πρώτα στις ρυθμίσεις", - "onboarding.security.alert.biometrics.message.ios": "Για να χρησιμοποιήσετε το {{biometricsMethod}}, επιτρέψτε την πρόσβαση στις ρυθμίσεις συστήματος", - "onboarding.security.alert.biometrics.title.android": "Τα βιομετρικά είναι απενεργοποιημένα", - "onboarding.security.alert.biometrics.title.ios": "Το {{biometricsMethod}} είναι απενεργοποιημένο", - "onboarding.security.button.confirm.android": "Ενεργοποίηση βιομετρικών στοιχείων", - "onboarding.security.button.confirm.ios": "Ενεργοποίηση {{biometricsMethod}}", - "onboarding.security.button.setup": "Στήνω", - "onboarding.security.subtitle.android": "Προσθέστε ένα επιπλέον επίπεδο ασφάλειας απαιτώντας βιομετρικά στοιχεία για την αποστολή συναλλαγών.", - "onboarding.security.subtitle.ios": "Προσθέστε ένα επιπλέον επίπεδο ασφάλειας απαιτώντας {{biometricsMethod}} για την αποστολή συναλλαγών.", - "onboarding.security.title": "Προστατέψτε το πορτοφόλι σας", - "onboarding.selectWallets.error": "Δεν ήταν δυνατή η φόρτωση των διευθύνσεων", - "onboarding.selectWallets.title.default": "Επιλέξτε πορτοφόλια για εισαγωγή", - "onboarding.selectWallets.title.error": "Σφάλμα κατά την εισαγωγή πορτοφολιών", - "onboarding.termsOfService": "Συνεχίζοντας, αποδέχομαι τους Όρους Παροχής Υπηρεσιών και συναινώ στην Πολιτική Απορρήτου", - "onboarding.tooltip.recoveryPhrase.trigger": "Τι είναι η φράση ανάκτησης;", - "onboarding.wallet.continue": "Ας το κρατήσουμε ασφαλές", - "onboarding.wallet.defaultName": "Πορτοφόλι {{number}}", - "onboarding.wallet.description.full": "Αυτός είναι ο προσωπικός σας χώρος για μάρκες, NFT και όλες τις συναλλαγές σας. Ολοκληρώστε τη ρύθμιση για να διατηρήσετε τα χρήματά σας ασφαλή.", - "onboarding.wallet.title": "Καλώς ήρθατε στο νέο σας πορτοφόλι", - "onboarding.welcome.subtitle": "Ας ολοκληρώσουμε τη ρύθμιση του πορτοφολιού σας.", - "onboarding.welcome.title": "Καλωσόρισμα!", - "outageBanner.message": "Τα δεδομένα {{chainName}}{{versionDescription}} δεν είναι διαθέσιμα αυτήν τη στιγμή, αλλά αναμένουμε ότι το ζήτημα θα επιλυθεί σύντομα.", - "outageBanner.message.sub": "Μπορείτε ακόμα να ανταλλάξετε και να παρέχετε ρευστότητα σε αυτήν την αλυσίδα χωρίς προβλήματα.", - "outageBanner.title": "{{versionName}} θα επιστρέψει σύντομα", - "passkeys.help.modal.subtitle": "Εάν αντιμετωπίζετε προβλήματα με τους κωδικούς πρόσβασης, επισκεφτείτε την Υποστήριξη Uniswap για βοήθεια.", - "passkeys.help.modal.subtitle.invalidPasskey": "Δεν ήταν δυνατή η ολοκλήρωση του αιτήματός σας. Δοκιμάστε ξανά χρησιμοποιώντας έναν κωδικό πρόσβασης που σχετίζεται με ", - "passkeys.help.modal.subtitle.technicalError": "Δεν ήταν δυνατή η ολοκλήρωση του αιτήματός σας λόγω απροσδόκητου τεχνικού σφάλματος. Τα χρήματά σας είναι ασφαλή. Δοκιμάστε ξανά.", - "passkeys.help.modal.title": "Χρειάζεστε βοήθεια;", - "passkeys.help.modal.title.invalidPasskey": "Μη έγκυρο κλειδί πρόσβασης", - "passkeys.help.modal.title.technicalError": "Τεχνικό σφάλμα", - "passkeys.manage.modal.subtitle": "Για να προσθέσετε ή να αφαιρέσετε κωδικούς πρόσβασης, συνδεθείτε στο {{passkeyManagementUrl}}.", - "passkeys.manage.modal.title": "Διαχείριση κλειδιών πρόσβασης", - "permit.approval.fail": "Η έγκριση άδειας απέτυχε", - "permit.approval.fail.message": "Το Permit2 επιτρέπει την κοινή χρήση και τη διαχείριση των εγκρίσεων διακριτικών σε διαφορετικές εφαρμογές.", - "pool.activeRange": "Εύρος ενεργού κρότωνα", - "pool.addAs": "Προσθήκη ως {{nativeWrappedSymbol}}", - "pool.apr": "ΑΠΡ", - "pool.apr.base": "Βάση ΑΠΡ", - "pool.apr.description": "Ετήσιο με βάση χρεώσεις 1 ημέρας", - "pool.apr.reward": "Ανταμοιβή ΑΠΡ", - "pool.aprText": "Πισίνα ΑΠΡ", - "pool.balances": "Υπόλοιπα πισίνας", - "pool.closedCTA.description": "Μπορείτε να τα δείτε χρησιμοποιώντας το φίλτρο στο επάνω μέρος της σελίδας.", - "pool.closedCTA.title": "Αναζητάτε τις κλειστές σας θέσεις;", - "pool.collectAs": "Συλλέξτε ως {{nativeWrappedSymbol}}", - "pool.collectFees": "Είσπραξη αμοιβών", - "pool.connectEthereumToView": "Συνδέστε ένα πορτοφόλι Ethereum για να δείτε τις δεξαμενές σας", - "pool.create": "Δημιουργία νέας πισίνας", - "pool.create.info": "Οι επιλογές σας θα δημιουργήσουν μια νέα ομάδα ρευστότητας που μπορεί να οδηγήσει σε χαμηλότερη αρχική ρευστότητα και αυξημένη αστάθεια. Εξετάστε το ενδεχόμενο προσθήκης σε μια υπάρχουσα δεξαμενή για να ελαχιστοποιήσετε αυτούς τους κινδύνους.", - "pool.createdPosition": "Δημιουργήθηκε θέση", - "pool.createdPosition.canceled": "Η δημιουργία θέσης ακυρώθηκε.", - "pool.createdPosition.failed": "Η δημιουργία θέσης απέτυχε", - "pool.dynamic": "Δυναμική πισίνα", - "pool.earnings": "Κέρδη", - "pool.earnings.empty": "Δεν έχετε ακόμη κέρδη", - "pool.explorers": "εξερευνητές", - "pool.import": "Πισίνα εισαγωγής", - "pool.import.link.description": "Ορισμένες θέσεις v2 δεν εμφανίζονται αυτόματα.", - "pool.import.positions.v2": "Εισαγωγή θέσεων V2", - "pool.import.positions.v2.selectPair.description": "Ορισμένες θέσεις v2 δεν εμφανίζονται αυτόματα. Επιλέξτε ένα ζεύγος διακριτικών για εισαγωγή και προβολή των θέσεων σας.", - "pool.import.success": "Εισαγωγή πισίνας", - "pool.incentives.administeredRewards": "Οι ανταμοιβές διανέμονται από το αυτόνομο συμβόλαιο διανομέα Merkl.", - "pool.incentives.collect": "Συλλέγω", - "pool.incentives.collectedRewards": "Συλλογή ανταμοιβών", - "pool.incentives.collectFailed": "Η συλλογή απέτυχε, δοκιμάστε ξανά.", - "pool.incentives.collectFailedNoRetry": "Η συλλογή ανταμοιβών απέτυχε.", - "pool.incentives.collectingRewards": "Συλλογή ανταμοιβών", - "pool.incentives.collectRewards": "Συλλέξτε ανταμοιβές", - "pool.incentives.collectRewardsCanceled": "Η συλλογή ανταμοιβών ακυρώθηκε.", - "pool.incentives.daysLeft": "απομένουν μέρες", - "pool.incentives.eligible": "Οι επιλέξιμες ομάδες διαθέτουν συμβολικές ανταμοιβές, ώστε να μπορείτε να κερδίσετε περισσότερα", - "pool.incentives.merklDocs": "Υπολογίστηκε από τη Merkl από τις ανταμοιβές εκπομπής και τη συγκέντρωση TVL.", - "pool.incentives.rewardsDistribution": "Διανομή ανταμοιβών", - "pool.incentives.rewardsEarned": "Κερδισμένες ανταμοιβές", - "pool.incentives.similarPoolHasRewards": "Μια παρόμοια ομάδα έχει ανταμοιβές UNI", - "pool.incentives.switchPools": "Εναλλαγή πισινών", - "pool.incentives.timePeriod": "Χρονική περίοδος", - "pool.incentives.uni.findMore": "Βρείτε πισίνες με ανταμοιβές UNI", - "pool.incentives.yourRewards.error": "Οι ανταμοιβές σας δεν είναι διαθέσιμες αυτήν τη στιγμή", - "pool.incentives.yourRewards.error.description": "Δεν ήταν δυνατή η ανάκτηση των ανταμοιβών. Αυτό μπορεί να οφείλεται σε πρόβλημα δικτύου. Δοκιμάστε να φορτώσετε ξανά τη σελίδα.", - "pool.info": "Πληροφορίες για την πισίνα", - "pool.limitFluctuation.warning": "Λάβετε υπόψη ότι η εκτέλεση για τα όρια ενδέχεται να διαφέρει ανάλογα με τις διακυμάνσεις της αγοράς σε πραγματικό χρόνο και τη συμφόρηση του δικτύου Ethereum. Τα όρια ενδέχεται να μην εκτελούνται ακριβώς όταν τα διακριτικά φτάνουν την καθορισμένη τιμή.", - "pool.liquidity.data.error.message": "Παρουσιάστηκε σφάλμα κατά την ανάκτηση των δεδομένων που απαιτούνται για τη συναλλαγή σας.", - "pool.liquidity.outOfSync": "Αναντιστοιχία τιμής πισίνας και αγοράς", - "pool.liquidity.outOfSync.message": "Οι τιμές σε αυτό το pool διαφέρουν ανάλογα με τις τιμές αγοράς των επιλεγμένων κουπονιών. Προσαρμόστε ανάλογα το εύρος τιμών σας ή περιμένετε να εξισορροπηθεί εκ νέου η πισίνα για να αποφύγετε απώλειες.", - "pool.maxPrice": "Μέγιστη τιμή", - "pool.migrateLiquidity": "Μετανάστευση ρευστότητας", - "pool.migrateLiquidityDisabledTooltip": "Αυτή η αλυσίδα δεν υποστηρίζει ομάδες ρευστότητας v4.", - "pool.migrateToV4": "Μεταφορά στο v4", - "pool.minPrice": "Ελάχιστη τιμή", - "pool.newPosition.plus": "+ Νέα θέση", - "pool.newPosition.title": "Νέα θέση", - "pool.newSpecificPosition": "Νέα θέση {{symbol}}", - "pool.notAvailableOnSolana": "Δεν υπάρχουν διαθέσιμες πισίνες στο Solana", - "pool.notFound.description": "Λυπούμαστε, δεν μπορούμε να βρούμε πληροφορίες για αυτήν την πισίνα. Ελέγξτε το όνομα και τη διεύθυνση και δοκιμάστε ξανά.", - "pool.notFound.title": "Η πισίνα δεν βρέθηκε", - "pool.openToStart.evmAndSolanaConnected": "Ανοίξτε μια νέα θέση ή δημιουργήστε μια ομάδα για να ξεκινήσετε. Οι ομάδες δεν είναι διαθέσιμες στο Solana.", - "pool.openToStart.evmOnly": "Ανοίξτε μια νέα θέση ή δημιουργήστε μια πισίνα για να ξεκινήσετε.", - "pool.percent": "{{pct}}% πισίνα", - "pool.pooled": "Συγκεντρωμένο {{sym}}:", - "pool.position": "Θέση", - "pool.positions": "Θέσεις", - "pool.positions.title": "Οι θέσεις σας", - "pool.positions.transaction.settings": "Ρυθμίσεις συναλλαγών", - "pool.positions.usdValueUnavailable": "Η αξία USD δεν είναι διαθέσιμη", - "pool.positions.usdValueUnavailable.tooltip": "Η αξία του USD δεν είναι προς το παρόν διαθέσιμη για αυτήν τη θέση. Δείτε λεπτομέρειες θέσης για κατατεθειμένα ποσά συμβολικών.", - "pool.refresh.prices": "Τιμές ανανέωσης", - "pool.removeLiquidity": "Κατάργηση ρευστότητας", - "pool.rewardAPR": "Επιβράβευση APR (UNI)", - "pool.rewardAPR.percent": "{{pct}} επιβράβευση ΑΠΡ", - "pool.rewards": "Ανταμοιβές", - "pool.rewardsPool.label": "Πισίνα μάρκες σε ομάδα ανταμοιβών:", - "pool.selectPair": "Επιλέξτε ζεύγος", - "pool.share.label": "Το μερίδιο της πισίνας σας:", - "pool.specificPosition": "{{symbol}} θέση", - "pool.tokenPair": "Ζεύγος κουπονιών", - "pool.top.rewards": "Πισίνες με ανταμοιβές", - "pool.top.tvl": "Κορυφαίες πισίνες από την TVL", - "pool.top.volume": "Πισίνες ανά 24ωρο όγκο", - "pool.totalAPR": "Σύνολο ΑΠΡ", - "pool.totalTokens": "Τα συνολικά κουπόνια της πισίνας σας:", - "pool.v2": "v2 πισίνες", - "pool.v3": "v3 πισίνες", - "pool.via": "{{tokenPair}} μέσω {{dex}}", - "pool.volOverTvl": "1D vol/TVL", - "pool.volume.thirtyDay": "Τόμος 30 ημερών", - "pool.volume.thirtyDay.short": "30D τόμ", - "pool.withdrawAs": "Απόσυρση ως {{nativeWrappedSymbol}}", - "poolFinder.availablePools": "Διαθέσιμες πισίνες", - "poolFinder.availablePools.found.description": "v2 πισίνες που ταιριάζουν με την επιλογή του ζευγαριού σας.", - "poolFinder.availablePools.notFound.description": "Δεν βρέθηκαν αντίστοιχες ομάδες v2. Ελέγξτε ξανά την επιλογή του διακριτικού σας και βεβαιωθείτε ότι είστε συνδεδεμένοι στο σωστό πορτοφόλι.", - "pools.explore": "Εξερευνήστε πισίνες", - "portfolio.activity.filters.timePeriod.all": "Συνεχώς", - "portfolio.activity.filters.transactionType.all": "Όλοι οι τύποι", - "portfolio.activity.filters.transactionType.deposits": "Καταθέσεις", - "portfolio.activity.filters.transactionType.staking": "Ποντάρισμα", - "portfolio.activity.filters.transactionType.swaps": "Ανταλλαγές", - "portfolio.activity.title": "Δραστηριότητα", - "portfolio.connectWallet.summary": "Παρακολούθηση διακριτικών, ομάδων και άλλων σε {{amount}}+ δίκτυα", - "portfolio.defi.title": "DeFi", - "portfolio.description": "Παρακολουθήστε το χαρτοφυλάκιο κρυπτονομισμάτων σας σε όλες τις αλυσίδες και τα πρωτόκολλα", - "portfolio.nfts.title": "NFTs", - "portfolio.overview.title": "Επισκόπηση", - "portfolio.title": "Χαρτοφυλάκιο", - "portfolio.tokens.table.column.allocation": "Κατανομή", - "portfolio.tokens.table.column.balance": "Ισορροπία", - "portfolio.tokens.table.column.change1d": "Αλλαγή 1D", - "portfolio.tokens.table.column.price": "Τιμή", - "portfolio.tokens.table.column.token": "Ενδειξη", - "portfolio.tokens.table.column.value": "Αξία", - "portfolio.tokens.title": "Μαρτυρίες", - "position.addHook": "Προσθέστε ένα άγκιστρο", - "position.addHook.tooltip": "Τα Hooks είναι μια προηγμένη λειτουργία που επιτρέπει στις πισίνες να αλληλεπιδρούν με έξυπνα συμβόλαια, ξεκλειδώνοντας διάφορες δυνατότητες. Να είστε προσεκτικοί όταν προσθέτετε άγκιστρα, καθώς ορισμένα μπορεί να είναι κακόβουλα ή να προκαλέσουν ανεπιθύμητες συνέπειες.", - "position.addingHook": "Προσθήκη γάντζου", - "position.addingHook.disclaimer": "Η προσθήκη αγκίστρων μπορεί να έχει ανεπιθύμητες συνέπειες. Κάντε την έρευνά σας και προχωρήστε με δική σας ευθύνη.", - "position.addingHook.hideProperties": "Απόκρυψη ιδιοτήτων", - "position.addingHook.invalidAddress": "Εισαγάγετε μια έγκυρη διεύθυνση άγκιστρου", - "position.addingHook.viewProperties": "Προβολή ακινήτων", - "position.create.confirm": "Επιβεβαίωση θέσης", - "position.create.invalidPrice": "Μη έγκυρη τιμή", - "position.create.invalidRange": "Μη έγκυρο εύρος", - "position.create.modal.header": "Δημιουργία θέσης", - "position.create.unsupportedSolana": "Οι ομάδες Solana δεν υποστηρίζονται.", - "position.create.unsupportedSolana.description": "Για να δημιουργήσετε μια ομάδα, μεταβείτε σε μια υποστηριζόμενη αλυσίδα EVM.", - "position.create.unsupportedToken.description": "Δοκιμάστε να δημιουργήσετε με διαφορετική έκδοση πρωτοκόλλου.", - "position.create.v2unsupportedChain": "Αυτή η αλυσίδα δεν υποστηρίζεται για ομάδες v2.", - "position.currentValue": "Τιμή τρέχουσας θέσης", - "position.default_price_strategies": "Στρατηγικές τιμών", - "position.default_price_strategies.error": "Δεν είναι δυνατός ο ορισμός στρατηγικής τιμών", - "position.deposit.confirm.create.description.less": "Η αρχική τιμή που καταχωρίστηκε είναι {{value}}% μικρότερη από την τιμή της αγοράς και μπορεί να οδηγήσει σε απώλεια κεφαλαίων. Θέλετε να προχωρήσετε;", - "position.deposit.confirm.create.description.more": "Η αρχική τιμή που καταχωρίστηκε είναι {{value}}% μεγαλύτερη από την τιμή της αγοράς και μπορεί να οδηγήσει σε απώλεια κεφαλαίων. Θέλετε να προχωρήσετε;", - "position.deposit.confirm.create.title": "Μεγάλη διαφορά τιμής με την αγορά", - "position.deposit.description": "Καθορίστε τα συμβολικά ποσά για τη συνεισφορά ρευστότητάς σας.", - "position.depositedCurrency": "Κατατέθηκε {{currencySymbol}}", - "position.fot.warning": "Το {{token}} και άλλα διακριτικά \"Χρέωση κατά τη μεταφορά\" υποστηρίζονται μόνο από το Uniswap v2.", - "position.fot.warning.cta": "Δημιουργήστε μια θέση v2", - "position.hook.disclaimer": "Κατανοώ τους πιθανούς κινδύνους που ενέχει η προσθήκη αυτού του γάντζου.", - "position.hook.donateWarning": "Αυτή η σημαία μπορεί να έχει ως αποτέλεσμα αλλαγές στις χρεώσεις που έχετε κερδίσει.", - "position.hook.liquidityWarning": "Αυτή η σημαία μπορεί να αναγκάσει τη συγκέντρωση να εμποδίσει την προσθήκη νέας ρευστότητας. Η συναλλαγή σας ενδέχεται να επανέλθει.", - "position.hook.removeWarning": "Μπορεί να προκαλέσει κλείδωμα των κεφαλαίων σας ή να σας εμποδίσει να εισπράξετε τέλη.", - "position.hook.swapWarning": "Αυτή η σημαία μπορεί να επιτρέψει στους παρόχους ρευστότητας να αξιοποιήσουν πιο εύκολα τη ρευστότητα που ίσχυε στην ώρα, γεγονός που μπορεί να οδηγήσει σε χαμηλότερες προμήθειες που κερδίζονται.", - "position.hook.warningHeader": "Σημαντικό: εντοπίστηκαν κίνδυνοι αγκίστρου", - "position.hook.warningInfo": "Έχουμε εντοπίσει πιθανούς κινδύνους με αυτό το άγκιστρο. Βεβαιωθείτε ότι καταλαβαίνετε πώς λειτουργεί αυτό το άγκιστρο πριν αποφασίσετε να συνεχίσετε.", - "position.increase.fot": "Η προσθήκη ρευστότητας για {{token}} και άλλα διακριτικά \"Fee on Transfer\" δεν υποστηρίζεται.", - "position.initialPrice": "Αρχική τιμή", - "position.initialPrice.difference.negative": "{{ value }}% λιγότερο από την τιμή της αγοράς", - "position.initialPrice.difference.positive": "{{ value }}% περισσότερο από την τιμή της αγοράς", - "position.initialPrice.info": "Όταν δημιουργείτε ένα νέο pool, πρέπει να ορίσετε την αρχική συναλλαγματική ισοτιμία και για τα δύο διακριτικά. Αυτό το επιτόκιο θα αντικατοπτρίζει την αρχική τιμή αγοράς.", - "position.initialPrice.set": "Ορισμός αρχικής τιμής", - "position.initialPrice.useMarketPrice": "Χρησιμοποιήστε την τιμή αγοράς", - "position.migrate.liquidity": "Κατά τη μετεγκατάσταση θέσεων, δεν μπορείτε να αλλάξετε το ζεύγος διακριτικών, αλλά μπορείτε να προσθέσετε ένα άγκιστρο για να βελτιώσετε τη λειτουργικότητα.", - "position.migrate.v4unsupportedChain": "Αυτή η αλυσίδα δεν υποστηρίζεται για πισίνες v4.", - "position.new": "Νέα θέση", - "position.new.protocol": "Νέα θέση {{protocol}}", - "position.notFound": "Η θέση δεν βρέθηκε", - "position.notFound.description": "Λεπτομέρειες για αυτήν τη θέση δεν είναι διαθέσιμες. Ελέγξτε ότι είστε συνδεδεμένοι με το σωστό πορτοφόλι.", - "position.one_sided_lower": "Μονόπλευρο κάτω μέρος", - "position.one_sided_lower.description": "Ρευστότητα προσφοράς εάν η τιμή μειωθεί", - "position.one_sided_upper": "Μονόπλευρο άνω μέρος", - "position.one_sided_upper.description": "Ρευστότητα προσφοράς εάν η τιμή αυξηθεί", - "position.protocol": "{{protocol}} θέση", - "position.provide.liquidity": "Επιλέξτε τα διακριτικά για τα οποία θέλετε να παρέχετε ρευστότητα. Μπορείτε να επιλέξετε διακριτικά σε όλα τα υποστηριζόμενα δίκτυα.", - "position.provide.liquidityDescription": "Η παροχή ρευστότητας πλήρους εύρους εξασφαλίζει συνεχή συμμετοχή στην αγορά σε όλες τις πιθανές τιμές, προσφέροντας απλότητα αλλά με πιθανότητα υψηλότερης μόνιμης ζημίας.", - "position.provide.liquidityDescription.creatingPool": "Ο καθορισμός ρευστότητας πλήρους εύρους κατά τη δημιουργία μιας ομάδας συγκέντρωσης διασφαλίζει τη συνεχή συμμετοχή στην αγορά σε όλες τις πιθανές τιμές, προσφέροντας απλότητα αλλά με πιθανότητα μεγαλύτερης μόνιμης απώλειας.", - "position.provide.liquidityDescription.custom": "Το προσαρμοσμένο εύρος σάς επιτρέπει να συγκεντρώνετε τη ρευστότητά σας εντός συγκεκριμένων ορίων τιμών, βελτιώνοντας την αποδοτικότητα του κεφαλαίου και τα κέρδη από προμήθεια, αλλά απαιτώντας πιο ενεργή διαχείριση.", - "position.provide.outOfRange.closePosition": "Κλείσιμο θέσης", - "position.provide.outOfRange.description": "Το εύρος αυτής της θέσης δεν μπορεί να προσαρμοστεί κατά τη μετεγκατάσταση. Για να ορίσετε ένα νέο εύρος, κλείστε αυτή τη θέση και ανοίξτε μια νέα θέση v4.", - "position.provide.outOfRange.title": "Μετακινείτε μια θέση εκτός εύρους", - "position.removeHook": "Αφαιρέστε το άγκιστρο", - "position.resetDescription": "Τα διακριτικά σας, οι επιλογές τιμών και εύρους θα επαναφερθούν.", - "position.setRange": "Ορίστε το εύρος τιμών", - "position.setRange.inputsBelow": "Χρησιμοποιήστε τις παρακάτω εισόδους για να ορίσετε το εύρος σας.", - "position.stable": "Σταθερός", - "position.stable.description": "Καλό για stablecoins ή ζεύγη χαμηλής μεταβλητότητας", - "position.step.deposit": "Εισαγάγετε τα ποσά κατάθεσης", - "position.step.price": "Ορίστε την αρχική τιμή και τα ποσά κατάθεσης", - "position.step.range": "Ορίστε το εύρος τιμών και τα ποσά κατάθεσης", - "position.step.select": "Επιλέξτε ζεύγος διακριτικών και χρεώσεις", - "position.value": "Τιμή θέσης", - "position.valueUnavailable": "Η αξία του USD δεν είναι προς το παρόν διαθέσιμη για αυτήν τη θέση. Δείτε λεπτομέρειες θέσης για κατατεθειμένα ποσά συμβολικών.", - "position.wide": "Ευρύς", - "position.wide.description": "Καλό για πτητικά ζεύγη", - "position.wrapped.unwrap": "Ξετυλίξτε {{wrappedToken}}", - "position.wrapped.warning": "Απαιτείται {{nativeToken}} για πισίνες v4", - "position.wrapped.warning.info": "Ξετυλίξτε το {{wrappedToken}} και καταθέστε το {{nativeToken}} για να παρέχετε πιο αποδοτική και αποδοτική ρευστότητα.", - "positions.noPositions.description": "Δεν έχετε θέσεις ρευστότητας. Δημιουργήστε μια νέα θέση για να αρχίσετε να κερδίζετε τέλη και ανταμοιβές σε επιλέξιμες ομάδες.", - "positions.noPositions.title": "Δεν υπάρχουν θέσεις", - "positions.welcome.connect.description": "Για να δείτε τις θέσεις και τις ανταμοιβές σας, πρέπει να συνδέσετε το πορτοφόλι σας.", - "positions.welcome.connect.wallet": "Συνδέστε το πορτοφόλι σας", - "privacy.anonymizedLogs": "Η εφαρμογή καταγράφει ανώνυμα στατιστικά στοιχεία χρήσης για να βελτιώνεται με την πάροδο του χρόνου.", - "privacy.autoRouter": "Η εφαρμογή ανακτά τη βέλτιστη εμπορική διαδρομή από έναν διακομιστή Uniswap Labs.", - "privacy.infura": "Η εφαρμογή ανακτά δεδομένα στην αλυσίδα και δημιουργεί κλήσεις συμβολαίου με ένα Infura API.", - "privacy.thirdPartyApis": "Αυτή η εφαρμογή χρησιμοποιεί τα ακόλουθα API τρίτων:", - "privacy.trm": "Η εφαρμογή συλλέγει με ασφάλεια τη διεύθυνση του πορτοφολιού σας και τη μοιράζεται με την TRM Labs Inc. για λόγους κινδύνου και συμμόρφωσης.", - "privacy.uniswaptos": "Όροι Παροχής Υπηρεσιών της Uniswap Labs", - "privateKeys.export.modal.speedbump.bullet1": "Δείτε αυτό ιδιωτικά", - "privateKeys.export.modal.speedbump.bullet2": "Μη μοιράζεσαι με κανέναν", - "privateKeys.export.modal.speedbump.bullet3": "Ποτέ μην το εισάγετε σε ιστότοπους ή εφαρμογές", - "privateKeys.export.modal.speedbump.subtitle": "Όποιος γνωρίζει το ιδιωτικό σας κλειδί μπορεί να έχει πρόσβαση στο πορτοφόλι και τα χρήματά σας.", - "privateKeys.export.modal.speedbump.title": "Πριν συνεχίσεις", - "privateKeys.export.modal.subtitle": "Φαίνεται ότι δεν μπορείτε να επαναφέρετε πλήρως το πορτοφόλι σας. Για να βεβαιωθείτε ότι δεν θα χάσετε ποτέ την πρόσβαση στα χρήματά σας, αντιγράψτε το ιδιωτικό σας κλειδί.", - "privateKeys.export.modal.title": "Εξαγωγή του ιδιωτικού σας κλειδιού", - "privateKeys.export.modal.warning": "Εάν χάσετε το τηλέφωνό σας ή διαγράψετε την εφαρμογή, θα πρέπει να εισαγάγετε αυτό το κλειδί σε διαφορετικό πορτοφόλι.", - "privateKeys.view.button.continue": "Τα αντέγραψα όλα.", - "privateKeys.view.button.continue.single": "Το αντέγραψα.", - "privateKeys.view.subtitle": "Το ιδιωτικό σας κλειδί παρέχει πρόσβαση σε ένα συγκεκριμένο πορτοφόλι. Κάθε πορτοφόλι έχει διαφορετικό ιδιωτικό κλειδί.", - "privateKeys.view.title": "Ιδιωτικό Κλειδί", - "qrScanner.button.connections_one": "Συνδέθηκε 1 εφαρμογή", - "qrScanner.button.connections_other": "{{count}} εφαρμογές συνδεδεμένες", - "qrScanner.error.camera.message": "Για να σαρώσετε έναν κωδικό, επιτρέψτε την πρόσβαση στην κάμερα στις ρυθμίσεις συστήματος", - "qrScanner.error.camera.title": "Η κάμερα είναι απενεργοποιημένη", - "qrScanner.error.none": "Δεν βρέθηκε κωδικός QR", - "qrScanner.recipient.action.scan": "Σαρώστε έναν κωδικό QR", - "qrScanner.recipient.action.show": "Εμφάνιση του κωδικού QR μου", - "qrScanner.recipient.error.message": "Βεβαιωθείτε ότι σαρώνετε έναν έγκυρο κωδικό QR διεύθυνσης Ethereum προτού προσπαθήσετε ξανά.", - "qrScanner.recipient.error.title": "Μη έγκυρος κωδικός QR", - "qrScanner.request.message.unavailable": "Δεν βρέθηκε μήνυμα.", - "qrScanner.request.method.default": "Αίτημα από {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "Αίτημα υπογραφής από {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "Αίτημα συναλλαγής από {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "Να επιτρέπεται στο {{dappName}} να χρησιμοποιεί έως και {{amount}} {{currencySymbol}}?", - "qrScanner.request.withoutAmount": "Να επιτρέπεται στο {{dappName}} να χρησιμοποιεί το {{currencySymbol}}σας;", - "qrScanner.status.connecting": "Συνδετικός...", - "qrScanner.status.loading": "Φόρτωση...", - "qrScanner.title": "Σαρώστε έναν κωδικό QR", - "qrScanner.wallet.networks": "Υποστηριζόμενα δίκτυα", - "range.outOfView": "Εμβέλεια εκτός προβολής", - "removeLiquidity.pooled": "Συγκεντρωμένο {{symbol}}:", - "revoke.failed.message": "Ένα πρόβλημα δικτύου ή σύνδεσης πιθανότατα προκάλεσε την αποτυχία της ανάκλησής σας. Ελέγξτε τη σύνδεσή σας και δοκιμάστε ξανά.", - "routing.aggregateLiquidity": "Όταν είναι διαθέσιμο, συγκεντρώνει πηγές ρευστότητας για καλύτερες τιμές και ανταλλαγές χωρίς φυσικό αέριο.", - "routing.aggregateLiquidity.uniswapx": "Η UniswapX συγκεντρώνει πηγές ρευστότητας εντός και εκτός αλυσίδας, προσφέροντάς σας τις καλύτερες διαθέσιμες τιμές και swaps χωρίς αέριο.", - "routing.cheapest": "Ο πελάτης Uniswap επιλέγει τη φθηνότερη επιλογή συναλλαγών με παραγοντοποίηση τιμής και κόστους δικτύου.", - "routing.cheapest.v4": "Ο πελάτης Uniswap επιλέγει τη βέλτιστη επιλογή συναλλαγών λαμβάνοντας υπόψη την τιμή και το κόστος δικτύου.", - "scantastic.code.expired": "έχει λήξει", - "scantastic.code.subtitle": "Εισαγάγετε αυτόν τον κωδικό στην επέκταση Uniswap. Η φράση ανάκτησής σας θα κρυπτογραφηθεί και θα μεταφερθεί με ασφάλεια.", - "scantastic.code.timeRemaining.shorthand.hours": "Νέος κωδικός σε {{hours}}h {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.minutes": "Νέος κωδικός σε {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.seconds": "Νέος κωδικός σε {{seconds}}s", - "scantastic.code.title": "Unswap κωδικός μίας χρήσης", - "scantastic.confirmation.button.continue": "Ναι, συνεχίστε", - "scantastic.confirmation.label.browser": "Πρόγραμμα περιήγησης", - "scantastic.confirmation.label.device": "Συσκευή", - "scantastic.confirmation.subtitle": "Συνεχίστε μόνο εάν σαρώνετε έναν κωδικό QR από την επέκταση Uniswap σε μια αξιόπιστη συσκευή.", - "scantastic.confirmation.title": "Προσπαθείτε να εισάγετε το πορτοφόλι σας;", - "scantastic.confirmation.warning": "Προσοχή σε ιστότοπους και εφαρμογές που πλαστοπροσωπούν το Uniswap. Διαφορετικά, το πορτοφόλι σας μπορεί να τεθεί σε κίνδυνο.", - "scantastic.error.encryption": "Αποτυχία προετοιμασίας φράσης σποράς.", - "scantastic.error.noCode": "Δεν ελήφθη OTP. ΠΑΡΑΚΑΛΩ προσπαθησε ξανα.", - "scantastic.error.timeout.message": "Σαρώστε ξανά τον κωδικό QR στην επέκταση Uniswap για να συνεχίσετε να συγχρονίζετε το πορτοφόλι σας.", - "scantastic.error.timeout.title": "Το χρονικό όριο της σύνδεσής σας έληξε", - "scantastic.modal.ipMismatch.description": "Για να σαρώσετε αυτόν τον κωδικό QR, το τηλέφωνό σας πρέπει να είναι συνδεδεμένο στο ίδιο δίκτυο WiFi με τον υπολογιστή σας και τυχόν VPN θα πρέπει να είναι προσωρινά απενεργοποιημένα.", - "scantastic.modal.ipMismatch.title": "Αλλάξτε το δίκτυο WiFi σας", - "search.input.placeholder": "Αναζήτηση διακριτικών και πισινών", - "search.ukDisclaimer": "Αποποίηση ευθύνης για κατοίκους ΗΒ", - "send.button.review": "Έλεγχος μεταφοράς", - "send.gas.error.title": "N/A", - "send.gas.networkCost.title": "Κόστος δικτύου", - "send.input.token.balance.title": "Υπόλοιπο: {{balance}} {{symbol}}", - "send.recipient.header": "Επιλέξτε παραλήπτη", - "send.recipient.input.placeholder": "Αναζήτηση ENS ή διεύθυνση", - "send.recipient.previous_one": "1 προηγούμενη μεταγραφή", - "send.recipient.previous_other": "{{count}} προηγούμενες μεταγραφές", - "send.recipient.results.empty": "Δεν βρέθηκαν αποτελέσματα", - "send.recipient.results.error": "Η διεύθυνση που πληκτρολογήσατε είτε δεν υπάρχει είτε είναι γραμμένη λάθος.", - "send.recipient.section.favorite": "Αγαπημένα πορτοφόλια", - "send.recipient.section.recent": "Πρόσφατος", - "send.recipient.section.search": "Αποτελέσματα αναζήτησης", - "send.recipient.section.viewOnly": "Πορτοφόλια μόνο για προβολή", - "send.recipient.section.yours": "Τα πορτοφόλια σας", - "send.recipient.warning.viewOnly.message": "Στείλτε χρήματα σε αυτό το πορτοφόλι μόνο εάν έχετε τη φράση ανάκτησης ή εάν γνωρίζετε τον κάτοχο του πορτοφολιού.", - "send.recipient.warning.viewOnly.title": "Το έχετε ως πορτοφόλι μόνο για προβολή", - "send.recipientSelect.search.empty.message": "Όταν στέλνετε διακριτικά σε μια διεύθυνση πορτοφολιού, θα εμφανίζονται εδώ", - "send.recipientSelect.search.empty.title": "Δεν αποθηκεύτηκαν πορτοφόλια", - "send.review.modal.title": "Στέλνεις", - "send.review.summary.button.title": "Επιβεβαιώστε την αποστολή", - "send.search.empty.subtitle": "Η διεύθυνση που πληκτρολογήσατε είτε δεν υπάρχει είτε είναι γραμμένη λάθος.", - "send.search.empty.title": "Δεν βρέθηκαν αποτελέσματα", - "send.search.placeholder": "Αναζήτηση ENS ή διεύθυνση", - "send.solanaSendNotSupported": "Η αποστολή δεν υποστηρίζεται στο Solana", - "send.title": "Στείλετε", - "send.unavailableOnSolana.message": "Η αποστολή δεν είναι διαθέσιμη σε πορτοφόλια Solana", - "send.warning.blocked.default": "Αυτό το πορτοφόλι είναι μπλοκαρισμένο", - "send.warning.blocked.modal.message": "Αυτή η διεύθυνση είναι αποκλεισμένη στο Πορτοφόλι Uniswap επειδή σχετίζεται με μία ή περισσότερες αποκλεισμένες δραστηριότητες. Εάν πιστεύετε ότι πρόκειται για σφάλμα, στείλτε email στο compliance@uniswap.org.", - "send.warning.blocked.modal.title": "Αποκλεισμένη διεύθυνση", - "send.warning.blocked.recipient": "Το πορτοφόλι του παραλήπτη είναι μπλοκαρισμένο", - "send.warning.erc20.checkbox.description": "Προσπαθείτε να στείλετε χρήματα σε μια συμβολική διεύθυνση. Αυτό μπορεί να οδηγήσει σε μόνιμη απώλεια κεφαλαίων.", - "send.warning.erc20.checkbox.heading": "Εντοπίστηκε διεύθυνση διακριτικού", - "send.warning.erc20.message": "Προσπαθείτε να στείλετε χρήματα σε μια συμβολική διεύθυνση. Η αποστολή κρυπτογράφησης σε αυτόν τον τύπο διεύθυνσης μπορεί να οδηγήσει σε μόνιμη απώλεια κεφαλαίων.", - "send.warning.erc20.title": "Αυτή είναι μια συμβολική διεύθυνση", - "send.warning.insufficientFunds.message": "Το υπόλοιπό σας {{currencySymbol}} μειώθηκε από τότε που καταχωρίσατε το ποσό που θέλετε να στείλετε", - "send.warning.insufficientFunds.title": "Δεν αρκεί {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "Δεν είναι αρκετό {{currencySymbol}} στο {{networkName}} για αποστολή", - "send.warning.insufficientGas.message.withoutNetwork": "Δεν αρκεί {{currencySymbol}} για αποστολή", - "send.warning.modal.button.cta.blocking": "Εντάξει", - "send.warning.modal.button.cta.cancel": "Ματαίωση", - "send.warning.modal.button.cta.confirm": "Επιβεβαιώνω", - "send.warning.newAddress.details.ENS": "ΕΝΣ", - "send.warning.newAddress.details.username": "Όνομα χρήστη", - "send.warning.newAddress.details.walletAddress": "Διεύθυνση Πορτοφολιού", - "send.warning.newAddress.message": "Δεν έχετε πραγματοποιήσει συναλλαγές με αυτήν τη διεύθυνση στο παρελθόν. Επιβεβαιώστε ότι η διεύθυνση είναι σωστή πριν συνεχίσετε.", - "send.warning.newAddress.title": "Νέα διεύθυνση", - "send.warning.self.message": "Προσπαθείτε να στείλετε χρήματα στο τρέχον πορτοφόλι σας. Η αποστολή κρυπτογράφησης σε αυτήν τη διεύθυνση θα συνεπάγεται περιττό κόστος δικτύου.", - "send.warning.self.title": "Αυτό είναι το τρέχον πορτοφόλι σας", - "send.warning.smartContract.message": "Πρόκειται να στείλετε χρήματα σε μια έξυπνη διεύθυνση συμβολαίου. Βεβαιωθείτε ότι αυτή είναι η σωστή διεύθυνση και ότι μπορεί να λάβει διακριτικά. Εάν όχι, αυτό μπορεί να οδηγήσει σε μόνιμη απώλεια κεφαλαίων.", - "send.warning.smartContract.title": "Αυτή είναι μια έξυπνη διεύθυνση συμβολαίου", - "send.warning.viewOnly.message": "Πρέπει να εισαγάγετε αυτό το πορτοφόλι μέσω φράσης ανάκτησης για να στείλετε στοιχεία.", - "send.warning.viewOnly.title": "Αυτό το πορτοφόλι είναι μόνο για προβολή", - "send.youAreSending": "Στέλνεις", - "sendRecipientForm.recentAddresses.label": "Πρόσφατα", - "sendReviewModal.title": "Αποστολή κριτικής", - "setting.recoveryPhrase.account.show": "Εμφάνιση φράσης ανάκτησης", - "setting.recoveryPhrase.action.hide": "Απόκρυψη φράσης ανάκτησης", - "setting.recoveryPhrase.remove": "Κατάργηση φράσης ανάκτησης", - "setting.recoveryPhrase.remove.confirm.subtitle": "Κατανοώ ότι η Uniswap Labs δεν μπορεί να με βοηθήσει να ανακτήσω το πορτοφόλι μου εάν δεν το κάνω.", - "setting.recoveryPhrase.remove.confirm.title": "Αποθήκευσα τη φράση ανάκτησης", - "setting.recoveryPhrase.remove.initial.subtitle": "Βεβαιωθείτε ότι έχετε αποθηκεύσει τη φράση ανάκτησης. Διαφορετικά, θα χάσετε την πρόσβαση στα πορτοφόλια σας", - "setting.recoveryPhrase.remove.initial.title": "Πριν συνεχίσεις", - "setting.recoveryPhrase.remove.subtitle": "Εισαγάγετε τον κωδικό πρόσβασής σας για επιβεβαίωση", - "setting.recoveryPhrase.remove.title": "Καταργείτε τη φράση ανάκτησης ", - "setting.recoveryPhrase.view.warning.message1": "Όποιος γνωρίζει τη φράση ανάκτησής σας μπορεί να έχει πρόσβαση στο πορτοφόλι και τα χρήματά σας", - "setting.recoveryPhrase.view.warning.message2": "Δείτε αυτό ιδιωτικά", - "setting.recoveryPhrase.view.warning.message3": "Μη μοιράζεσαι με κανέναν", - "setting.recoveryPhrase.view.warning.message4": "Ποτέ μην το εισάγετε σε ιστότοπους ή εφαρμογές", - "setting.recoveryPhrase.view.warning.title": "Πριν συνεχίσεις", - "setting.recoveryPhrase.warning.view.message": "Όποιος γνωρίζει τη φράση ανάκτησής σας μπορεί να έχει πρόσβαση στο πορτοφόλι και τα χρήματά σας.", - "setting.recoveryPhrase.warning.view.title": "Δείτε το σε ιδιωτικό μέρος", - "settings.action.enableInSettings": "Ενεργοποίηση στις Ρυθμίσεις", - "settings.action.feedback": "Στείλετε τα σχόλιά σας", - "settings.action.help": "Ζήτα βοήθεια", - "settings.action.lock": "Κλείδωμα πορτοφολιού", - "settings.action.privacy": "Πολιτική απορρήτου", - "settings.action.terms": "Οροι χρήσης", - "settings.connectWalletPlatform.warning": "Για να χρησιμοποιήσετε το Uniswap στο {{platform}}, συνδεθείτε σε ένα πορτοφόλι που υποστηρίζει το {{platform}}.", - "settings.footer": "Φτιαγμένο με αγάπη, \nUniswap Team 🦄", - "settings.hideSmallBalances": "Απόκρυψη μικρών υπολοίπων", - "settings.hideSmallBalances.subtitle": "Υπόλοιπα κάτω του 1 USD θα κρυφτούν από το χαρτοφυλάκιό σας.", - "settings.maxSlippage": "Μέγιστη. ολίσθηση", - "settings.maxSlippage.amount": "{{amount}} μέγιστη ολίσθηση", - "settings.section.about": "Σχετικά με", - "settings.section.preferences": "Προτιμήσεις", - "settings.section.privacyAndSecurity": "Απόρρητο και ασφάλεια", - "settings.section.support": "Υποστήριξη", - "settings.section.wallet.hidden.row.title": "{{numHidden}} άλλα πορτοφόλια", - "settings.setting.advanced.title": "Προχωρημένος", - "settings.setting.advancedSettings": "Advanced settings", - "settings.setting.appearance.option.auto": "Αυτο", - "settings.setting.appearance.option.dark.subtitle": "Να χρησιμοποιείτε πάντα σκούρο θέμα.", - "settings.setting.appearance.option.dark.title": "Σκοτάδι", - "settings.setting.appearance.option.device.subtitle": "Προσαρμόζεται στις ρυθμίσεις της συσκευής σας.", - "settings.setting.appearance.option.device.title": "Αυτο", - "settings.setting.appearance.option.light.subtitle": "Να χρησιμοποιείτε πάντα ανοιχτό θέμα.", - "settings.setting.appearance.option.light.title": "Φως", - "settings.setting.appearance.title": "Θέμα", - "settings.setting.backup.create.description": "Ο ορισμός ενός κωδικού πρόσβασης θα κρυπτογραφήσει το αντίγραφο ασφαλείας φράσης ανάκτησης, προσθέτοντας ένα επιπλέον επίπεδο προστασίας εάν ο λογαριασμός σας {{cloudProviderName}} παραβιαστεί ποτέ.", - "settings.setting.backup.create.title": "Δημιουργία αντιγράφων ασφαλείας στο {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "Επειδή αυτά τα πορτοφόλια μοιράζονται μια φράση ανάκτησης, θα διαγράψει επίσης τα αντίγραφα ασφαλείας για αυτά τα πορτοφόλια παρακάτω", - "settings.setting.backup.delete.confirm.title": "Είσαι σίγουρος;", - "settings.setting.backup.delete.warning": "Εάν διαγράψετε το αντίγραφο ασφαλείας {{cloudProviderName}} , θα μπορείτε να ανακτήσετε το πορτοφόλι σας μόνο με ένα μη αυτόματο αντίγραφο ασφαλείας της φράσης ανάκτησης. Το Uniswap Labs δεν μπορεί να ανακτήσει τα περιουσιακά σας στοιχεία εάν χάσετε τη φράση ανάκτησής σας.", - "settings.setting.backup.error.message.full": "Δεν είναι δυνατή η δημιουργία αντιγράφων ασφαλείας της φράσης ανάκτησης σε {{cloudProviderName}}. Βεβαιωθείτε ότι έχετε ενεργοποιήσει το {{cloudProviderName}} με διαθέσιμο χώρο αποθήκευσης και δοκιμάστε ξανά.", - "settings.setting.backup.error.message.short": "Δεν είναι δυνατή η διαγραφή του αντιγράφου ασφαλείας", - "settings.setting.backup.error.title": "Σφάλμα {{cloudProviderName}}", - "settings.setting.backup.modal.description": "Δεν έχετε δημιουργήσει ακόμα αντίγραφα ασφαλείας της φράσης ανάκτησής σας σε {{cloudProviderName}} . Με αυτόν τον τρόπο, μπορείτε να ανακτήσετε το πορτοφόλι σας απλώς με το να συνδεθείτε στο {{cloudProviderName}} σε οποιαδήποτε συσκευή.", - "settings.setting.backup.modal.title": "Δημιουργία αντιγράφων ασφαλείας φράσης ανάκτησης σε {{cloudProviderName}};", - "settings.setting.backup.password.error.mismatch": "Οι κωδικοί πρόσβασης δεν ταιριάζουν", - "settings.setting.backup.password.medium": "Αυτός είναι ένας μεσαίος κωδικός πρόσβασης", - "settings.setting.backup.password.placeholder.confirm": "Επιβεβαίωση Κωδικού", - "settings.setting.backup.password.placeholder.create": "Δημιούργησε κωδικό", - "settings.setting.backup.password.strong": "Αυτός είναι ένας ισχυρός κωδικός πρόσβασης", - "settings.setting.backup.password.weak": "Αυτός είναι ένας αδύναμος κωδικός πρόσβασης", - "settings.setting.backup.recoveryPhrase.label": "Φράση ανάκτησης", - "settings.setting.backup.selected": "{{cloudProviderName}} αντίγραφο ασφαλείας", - "settings.setting.backup.status.action.delete": "Διαγραφή αντιγράφου ασφαλείας", - "settings.setting.backup.status.complete": "Δημιουργήθηκε αντίγραφο ασφαλείας σε {{cloudProviderName}}", - "settings.setting.backup.status.description": "Με τη δημιουργία αντιγράφων ασφαλείας της φράσης ανάκτησής σας σε {{cloudProviderName}}, μπορείτε να ανακτήσετε το πορτοφόλι σας απλώς συνδέοντας τον λογαριασμό σας {{cloudProviderName}} σε οποιαδήποτε συσκευή.", - "settings.setting.backup.status.inProgress": "Δημιουργία αντιγράφων ασφαλείας σε {{cloudProviderName}}…", - "settings.setting.backup.status.recoveryPhrase.backed": "Υποστηρίζεται", - "settings.setting.backup.status.title": "{{cloudProviderName}} αντίγραφο ασφαλείας", - "settings.setting.beta.tooltip": "Ερχομαι συντομα", - "settings.setting.biometrics.appAccess.subtitle.android": "Απαιτείται πρόσωπο/δαχτυλικό αποτύπωμα για να ανοίξετε την εφαρμογή.", - "settings.setting.biometrics.appAccess.subtitle.ios": "Απαιτείται {{biometricsMethod}} για να ανοίξετε την εφαρμογή.", - "settings.setting.biometrics.appAccess.title": "Πρόσβαση στην εφαρμογή", - "settings.setting.biometrics.auth": "Παρακαλώ ελέγξτε την ταυτότητα", - "settings.setting.biometrics.extension.waitingForBiometricsModal.content": "Ενεργοποιήστε την επιλογή {{biometricsMethod}} στις ρυθμίσεις του προγράμματος περιήγησης ή του συστήματός σας για να συνεχίσετε.", - "settings.setting.biometrics.extension.waitingForBiometricsModal.title": "Αναμονή για {{biometricsMethod}}", - "settings.setting.biometrics.off.message.android": "Το Biometrics είναι προς το παρόν απενεργοποιημένο για το Uniswap Wallet—μπορείτε να το ενεργοποιήσετε στις ρυθμίσεις του συστήματός σας.", - "settings.setting.biometrics.off.message.ios": "Το {{biometricsMethod}} είναι προς το παρόν απενεργοποιημένο για το Uniswap Wallet—μπορείτε να το ενεργοποιήσετε στις ρυθμίσεις του συστήματός σας.", - "settings.setting.biometrics.off.title.android": "Τα βιομετρικά στοιχεία είναι απενεργοποιημένα", - "settings.setting.biometrics.off.title.ios": "Το {{biometricsMethod}} είναι απενεργοποιημένο", - "settings.setting.biometrics.title": "Ξεκλείδωμα προσώπου/δαχτυλικού αποτυπώματος", - "settings.setting.biometrics.transactions.subtitle.android": "Απαιτείται πρόσωπο/δαχτυλικό αποτύπωμα για συναλλαγή.", - "settings.setting.biometrics.transactions.subtitle.ios": "Απαιτείται {{biometricsMethod}} για συναλλαγή.", - "settings.setting.biometrics.transactions.title": "Συναλλαγές", - "settings.setting.biometrics.unavailable.message.android": "Το Biometrics δεν έχει ρυθμιστεί στη συσκευή σας. Για να χρησιμοποιήσετε βιομετρικά στοιχεία, ρυθμίστε τα πρώτα στις Ρυθμίσεις.", - "settings.setting.biometrics.unavailable.message.ios": "Το {{biometricsMethod}} δεν έχει ρυθμιστεί στη συσκευή σας. Για να χρησιμοποιήσετε το {{biometricsMethod}}, ρυθμίστε το πρώτα στις Ρυθμίσεις.", - "settings.setting.biometrics.unavailable.title.android": "Τα βιομετρικά στοιχεία δεν έχουν ρυθμιστεί", - "settings.setting.biometrics.unavailable.title.ios": "Το {{biometricsMethod}} δεν έχει ρυθμιστεί", - "settings.setting.biometrics.warning.message.android": "Εάν δεν ενεργοποιήσετε τα βιομετρικά στοιχεία, οποιοσδήποτε αποκτήσει πρόσβαση στη συσκευή σας μπορεί να ανοίξει το Πορτοφόλι Uniswap και να πραγματοποιήσει συναλλαγές.", - "settings.setting.biometrics.warning.message.ios": "Εάν δεν ενεργοποιήσετε το {{biometricsMethod}}, οποιοσδήποτε αποκτήσει πρόσβαση στη συσκευή σας μπορεί να ανοίξει το Πορτοφόλι Uniswap και να πραγματοποιήσει συναλλαγές.", - "settings.setting.biometrics.warning.title": "Είσαι σίγουρος;", - "settings.setting.connections.disconnectAll": "Αποσυνδέστε όλα", - "settings.setting.connections.noConnectionsDescription": "Συνδεθείτε σε μια εφαρμογή αναζητώντας ένα κουμπί \"Σύνδεση Πορτοφολιού\" ή \"Σύνδεση\".", - "settings.setting.currency.title": "Τοπικό νόμισμα", - "settings.setting.deviceAccess.reset.title": "Επαναφέρετε το {{biometricsMethod}}σας", - "settings.setting.deviceAccess.title": "Πρόσβαση στη συσκευή", - "settings.setting.deviceAccessTimeout.1hour": "1 ώρα", - "settings.setting.deviceAccessTimeout.24hours": "24 ώρες", - "settings.setting.deviceAccessTimeout.30minutes": "30 λεπτά", - "settings.setting.deviceAccessTimeout.5minutes": "5 λεπτά", - "settings.setting.deviceAccessTimeout.never": "Ποτέ", - "settings.setting.deviceAccessTimeout.title": "Χρονικό όριο αυτόματου κλειδώματος", - "settings.setting.hapticTouch.title": "Απτική αφή", - "settings.setting.helpCenter.title": "Κέντρο βοηθείας", - "settings.setting.language.button.navigate": "Μεταβείτε στις ρυθμίσεις", - "settings.setting.language.description.extension": "Το Uniswap είναι προεπιλεγμένο στις ρυθμίσεις γλώσσας του συστήματός σας. Για να αλλάξετε τη γλώσσα που προτιμάτε, μεταβείτε στις ρυθμίσεις του συστήματός σας.", - "settings.setting.language.description.mobile": "Το Unswap είναι προεπιλογή στις ρυθμίσεις γλώσσας της συσκευής σας. Για να αλλάξετε τη γλώσσα που προτιμάτε, μεταβείτε στο \"Uniswap\" στις ρυθμίσεις της συσκευής σας και πατήστε \"Γλώσσα\".", - "settings.setting.language.title": "Γλώσσα", - "settings.setting.notifications.row.activity.description": "Μεταφορές, αιτήματα και άλλες δραστηριότητες", - "settings.setting.notifications.row.activity.title": "Δραστηριότητα πορτοφολιού", - "settings.setting.notifications.row.updates.description": "Συστάσεις και νέες δυνατότητες", - "settings.setting.notifications.row.updates.title": "Ενημερώσεις από το Uniswap", - "settings.setting.notifications.title": "Ειδοποιήσεις", - "settings.setting.password.change.title": "Δημιουργήστε έναν νέο κωδικό πρόσβασης", - "settings.setting.password.title": "Αλλαξε κωδικό", - "settings.setting.permissions.title": "Άδειες", - "settings.setting.privacy.analytics.description": "Χρησιμοποιούμε ανώνυμα δεδομένα χρήσης για να βελτιώσουμε την εμπειρία σας στα προϊόντα Uniswap Labs. Όταν είναι απενεργοποιημένο, παρακολουθούμε μόνο σφάλματα και βασική χρήση.", - "settings.setting.privacy.analytics.title": "Αναλυτικά στοιχεία εφαρμογών", - "settings.setting.privateKeys.title": "Ιδιωτικά κλειδιά", - "settings.setting.recoveryPhrase.title": "Φράση ανάκτησης", - "settings.setting.smallBalances.title": "Υπόλοιπο χαρτοφυλακίου", - "settings.setting.smartWallet.action.enable": "επιτρέπω", - "settings.setting.smartWallet.action.smartWallet": "Smart wallet", - "settings.setting.smartWallet.notEligible": "Δεν είναι επιλέξιμο", - "settings.setting.smartWallet.status.actionRequired": "Απαιτούμενη ενέργεια", - "settings.setting.smartWallet.status.active": "Ενεργός", - "settings.setting.smartWallet.status.inactive": "Αδρανής", - "settings.setting.smartWallet.status.unavailable": "Μη διαθέσιμο", - "settings.setting.unknownTokens.subtitle": "Τα πιθανά διακριτικά απάτης θα κρυφτούν από το χαρτοφυλάκιό σας.", - "settings.setting.unknownTokens.title": "Απόκρυψη άγνωστων διακριτικών", - "settings.setting.wallet.action.editLabel": "Επεξεργασία ετικέτας", - "settings.setting.wallet.action.editProfile": "Επεξεργασία προφίλ", - "settings.setting.wallet.action.remove": "Αφαιρέστε το πορτοφόλι", - "settings.setting.wallet.connection.banner.description": "Διαχειριστείτε τις συνδέσεις μέσω των ρυθμίσεων πορτοφολιού, κάνοντας κλικ στην εικόνα του προφίλ σας.", - "settings.setting.wallet.connection.banner.title": "Οι συνδέσεις έχουν μετακινηθεί", - "settings.setting.wallet.connections.title": "Συνδέσεις", - "settings.setting.wallet.editLabel.description": "Οι ετικέτες δεν είναι δημόσιες. Αποθηκεύονται τοπικά και είναι ορατά μόνο σε εσάς.", - "settings.setting.wallet.editLabel.save": "Αποθήκευσε τις αλλαγές", - "settings.setting.wallet.label": "Παρατσούκλι", - "settings.setting.wallet.testnetMode.description": "Αυτό ενεργοποιεί τα δοκιμαστικά δίκτυα ώστε οι προγραμματιστές να δοκιμάσουν λειτουργίες και συναλλαγές χωρίς να χρησιμοποιούν πραγματικά στοιχεία. Τα διακριτικά στα δοκιμαστικά δίκτυα δεν έχουν καμία πραγματική αξία.", - "settings.setting.wallet.testnetMode.title": "Λειτουργία δοκιμαστικού δικτύου", - "settings.switchNetwork.warning": "Για να χρησιμοποιήσετε το Uniswap στο {{label}}, αλλάξτε το δίκτυο στις ρυθμίσεις του πορτοφολιού σας.", - "settings.title": "Ρυθμίσεις", - "settings.version": "Έκδοση {{appVersion}}", - "smartWallet.actionRequired.cta": "Απενεργοποίηση σε 1 δίκτυο", - "smartWallet.actionRequired.cta.plural": "Απενεργοποίηση σε δίκτυα {{amount}}", - "smartWallet.actionRequired.description": "Η απενεργοποίηση του έξυπνου πορτοφολιού είναι μια ενέργεια onchain που απαιτεί ένα μικρό κόστος δικτύου.", - "smartWallet.actionRequired.insufficientFunds": "Ανεπαρκείς πόροι", - "smartWallet.actionRequired.reactivate": "Συνεχίστε να χρησιμοποιείτε το έξυπνο πορτοφόλι", - "smartWallet.actionRequired.title": "Το έξυπνο πορτοφόλι είναι ενεργό σε 1 δίκτυο", - "smartWallet.actionRequired.title.plural": "Το έξυπνο πορτοφόλι είναι ενεργό σε δίκτυα {{amount}}", - "smartWallet.activeNetworks.title": "Το έξυπνο πορτοφόλι είναι ενεργό σε 1 δίκτυο", - "smartWallet.activeNetworks.title.plural": "Το έξυπνο πορτοφόλι είναι ενεργό σε δίκτυα {{amount}}", - "smartWallet.banner.networkCost": "Includes a one-time cost to activate your smart wallet on {{chainName}}.", - "smartWallet.banner.text": "Ενεργοποιήστε το έξυπνο πορτοφόλι για εξοικονόμηση έως και 50% στο κόστος δικτύου.", - "smartWallet.confirmDisableSmartWallet.description": "Θα χάσετε ταχύτερες ανταλλαγές, μειωμένο κόστος δικτύου και άλλες επερχόμενες βελτιώσεις.", - "smartWallet.confirmDisableSmartWallet.title": "Είσαι σίγουρος;", - "smartWallet.insufficient.description": "Το έξυπνο πορτοφόλι δεν μπορεί να απενεργοποιηθεί σε αυτά τα δίκτυα μέχρι να έχετε χρήματα για να καλύψετε το κόστος δικτύου.", - "smartWallet.insufficient.title": "Ανεπαρκή κεφάλαια σε 1 δίκτυο", - "smartWallet.insufficient.title.plural": "Ανεπαρκή κεφάλαια σε δίκτυα {{amount}}", - "smartWallet.InsufficientFunds.button.continue.text": "Συνέχεια ούτως ή άλλως", - "smartWallet.insufficientFunds.network.banner.description": "Δεν είναι δυνατή η απενεργοποίηση λόγω ανεπαρκών κεφαλαίων.", - "smartWallet.insufficientFunds.network.banner.title_one": "{{count}} δίκτυο εξαιρείται", - "smartWallet.insufficientFunds.network.banner.title_other": "{{count}} δίκτυο εξαιρείται", - "smartWallet.insufficientFunds.network.disable.text": "Έτοιμο για απενεργοποίηση", - "smartWallet.insufficientFunds.network.text": "Χρειάζεστε {{nativeCurrency}}", - "smartWallet.insufficientFunds.single.network.banner.title": "{{chain}} εξαιρούνται", - "smartWallet.modal.description.block1": "Τα έξυπνα πορτοφόλια χρησιμοποιούν έξυπνα συμβόλαια για ταχύτερες και χαμηλότερου κόστους συναλλαγές.", - "smartWallet.modal.description.block2": "Τα πορτοφόλια που χρησιμοποιούν ήδη λειτουργίες έξυπνου πορτοφολιού από άλλη εφαρμογή δεν θα επηρεαστούν.", - "smartWallet.modal.title": "Έξυπνο πορτοφόλι", - "smartWallets": "Έξυπνα πορτοφόλια", - "smartWallets.activeNetworks.description": "Το έξυπνο πορτοφόλι σας ενεργοποιείται αυτόματα σε κάθε νέο δίκτυο στο οποίο αλλάζετε.", - "smartWallets.createdModal.description": "You’re getting faster transactions and lower network costs on every swap.", - "smartWallets.createdModal.title": "Δημιουργήθηκε έξυπνο πορτοφόλι", - "smartWallets.delegation.limitedSupport": "Το πορτοφόλι σας έχει περιορισμένη υποστήριξη", - "smartWallets.delegationMismatchModal.description": "Το {{walletName}} δεν υποστηρίζει τα πιο πρόσφατα πρότυπα Ethereum που χρησιμοποιούνται από το {{displayName}}, επομένως ορισμένες λειτουργίες δεν είναι διαθέσιμες.", - "smartWallets.delegationMismatchModal.features.1ClickSwaps": "Ανταλλαγές με 1 κλικ", - "smartWallets.delegationMismatchModal.features.gasFreeSwaps": "Ανταλλαγές χωρίς βενζίνη", - "smartWallets.delegationMismatchModal.features.limitOrders": "Οριακές παραγγελίες", - "smartWallets.delegationMismatchModal.limitOrders.unsupported": "Οι εντολές με όριο δεν υποστηρίζονται από το πορτοφόλι σας.", - "smartWallets.delegationMismatchModal.title": "Περιορισμένη υποστήριξη πορτοφολιού", - "smartWallets.disable.failed": "Παρουσιάστηκε σφάλμα. Το έξυπνο πορτοφόλι εξακολουθεί να είναι ενεργό σε 1 ή περισσότερα δίκτυα. Δοκιμάστε ξανά.", - "smartWallets.disable.modal.description": "Αυτή η ενέργεια onchain απαιτεί κόστος δικτύου.", - "smartWallets.disable.modal.title": "Απενεργοποίηση έξυπνου πορτοφολιού", - "smartWallets.educationalModal.description": "Τα έξυπνα πορτοφόλια παρέχουν ταχύτερες και χαμηλότερες συναλλαγές χρησιμοποιώντας έξυπνα συμβόλαια.", - "smartWallets.educationalModal.info": "Τα πορτοφόλια που χρησιμοποιούν ήδη λειτουργίες έξυπνου πορτοφολιού από άλλη εφαρμογή δεν θα επηρεαστούν.", - "smartWallets.enabledModal.description": "Οι ενημερώσεις θα τεθούν σε ισχύ στην επόμενη ανταλλαγή σας.", - "smartWallets.enabledModal.description.dapp": "Οι ενημερώσεις θα τεθούν σε ισχύ από την επόμενη συναλλαγή σας.", - "smartWallets.enabledModal.description.dapp.line2": "Επανασυνδέστε το πορτοφόλι σας για να ξεκινήσετε να χρησιμοποιείτε αμέσως τις λειτουργίες έξυπνου πορτοφολιού στις εφαρμογές.", - "smartWallets.enabledModal.title": "Το έξυπνο πορτοφόλι ενεργοποιήθηκε", - "smartWallets.postSwapNudge.enable": "Ενεργοποίηση έξυπνου πορτοφολιού", - "smartWallets.postSwapNudge.title": "Εξοικονομήστε χρήματα στην επόμενη ανταλλαγή σας", - "smartWallets.postSwapNudge.title.dapp": "Αυτή η εφαρμογή υποστηρίζει έξυπνα πορτοφόλια", - "smartWallets.unavailableModal.description": "Ένας διαφορετικός πάροχος πορτοφολιού διαχειρίζεται πλέον τις ρυθμίσεις έξυπνου πορτοφολιού για το {{displayName}}. Μπορείτε να συνεχίσετε να χρησιμοποιείτε το Uniswap κανονικά.", - "smartWallets.unavailableModal.title": "Οι λειτουργίες έξυπνου πορτοφολιού δεν είναι διαθέσιμες", - "solanaPromo.banner.description": "Ανταλλάξτε μάρκες Solana απευθείας στο Uniswap.", - "solanaPromo.banner.title": "Η Σολάνα είναι τώρα διαθέσιμη", - "solanaPromo.modal.connectWallet": "Συνδέστε το αγαπημένο σας πορτοφόλι Solana", - "solanaPromo.modal.startSwapping.button": "Ξεκινήστε την ανταλλαγή στο Solana", - "solanaPromo.modal.swapInstantly": "Ανταλλάξτε χιλιάδες δημοφιλή tokens άμεσα", - "solanaPromo.modal.viewTokenData": "Δείτε δεδομένα και τιμές token σε ένα μέρος", - "speedBump.newAddress.warning.description": "Δεν έχετε πραγματοποιήσει συναλλαγές με αυτήν τη διεύθυνση στο παρελθόν. Βεβαιωθείτε ότι είναι η σωστή διεύθυνση πριν συνεχίσετε.", - "speedBump.newAddress.warning.title": "Νέα διεύθυνση", - "speedBump.smartContractAddress.warning.description": "Πρόκειται να στείλετε διακριτικά σε έναν ειδικό τύπο διεύθυνσης - ένα έξυπνο συμβόλαιο. Ελέγξτε ξανά ότι είναι η διεύθυνση στην οποία σκοπεύατε να στείλετε. Εάν είναι λάθος, οι μάρκες σας μπορεί να χαθούν για πάντα.", - "speedBump.smartContractAddress.warning.title": "Αυτή είναι μια διεύθυνση πορτοφολιού;", - "stats.24fees": "Τέλη 24 ώρες", - "stats.24swapVolume": "24ωρος όγκος ανταλλαγής", - "stats.24volume": "Ένταση 24 ωρών", - "stats.allTimeSwappers": "Όλα τα χρονικά swappers", - "stats.allTimeVolume": "Όλο τον χρόνο", - "stats.fdv": "FDV", - "stats.fdv.description": "Η πλήρως αραιωμένη αποτίμηση (FDV) υπολογίζει τη συνολική αγοραία αξία υποθέτοντας ότι όλα τα διακριτικά βρίσκονται σε κυκλοφορία.", - "stats.marketCap": "Κεφάλαιο αγοράς", - "stats.marketCap.description": "Η κεφαλαιοποίηση αγοράς είναι η συνολική αγοραία αξία της κυκλοφορούσας προσφοράς ενός περιουσιακού στοιχείου.", - "stats.noStatsAvailable": "Δεν υπάρχουν διαθέσιμα στατιστικά στοιχεία", - "stats.tvl": "Η συνολική τιμή κλειδώθηκε", - "stats.tvl.description": "Η συνολική κλειδωμένη αξία (TVL) είναι το συνολικό ποσό του περιουσιακού στοιχείου που είναι διαθέσιμο σε όλες τις ομάδες ρευστότητας Uniswap.", - "stats.volume.1d": "Όγκος 1 ημερών", - "stats.volume.1d.description": "Ο όγκος 1 ημέρας είναι το ποσό του περιουσιακού στοιχείου που έχει διαπραγματευτεί στο Uniswap τις τελευταίες 24 ώρες.", - "stats.volume.1d.long": "1D τόμος", - "stats.volume.1d.short": "1D τόμ", - "stats.volume.description": "Όγκος είναι το ποσό του περιουσιακού στοιχείου που έχει διαπραγματευτεί στο Uniswap κατά τη διάρκεια του επιλεγμένου χρονικού πλαισίου.", - "swap.allow.oneTime": "Να επιτρέπεται {{sym}} (μία φορά)", - "swap.approveAndSubmit": "Έγκριση και υποβολή", - "swap.approveAndSwap": "Έγκριση και ανταλλαγή", - "swap.balance.amount": "Υπόλοιπο: {{amount}}", - "swap.bestPrice.through": "Διαδρομή μέσω {{provider}}", - "swap.bestRoute.cost": "Η πιο αποτελεσματική διαδρομή εκτιμάται ότι κοστίζει ~{{gasPrice}} σε κόστος δικτύου. ", - "swap.bridging.title": "Ανταλλαγή μεταξύ δικτύων", - "swap.bridging.warning.description": "Αλλάζετε από {{fromNetwork}} σε {{toNetwork}}. Αυτό είναι επίσης γνωστό ως \"γέφυρα\", το οποίο μετακινεί τα διακριτικά σας από το ένα δίκτυο στο άλλο.", - "swap.button.confirmSignAndSwap": "Επιβεβαίωση υπογραφής και ανταλλαγής", - "swap.button.confirmSwapAnyways": "Επιβεβαίωση ανταλλαγής ούτως ή άλλως", - "swap.button.confirmUnwrap": "Επιβεβαίωση αποσυσκευασίας", - "swap.button.max": "Μέγιστη", - "swap.button.review": "Ανασκόπηση", - "swap.button.submitting": "Υποβολή ανταλλαγής...", - "swap.button.submitting.keep.open": "Κράτα το πορτοφόλι σου ανοιχτό...", - "swap.button.submitting.passkey": "Επιβεβαίωση με κλειδί πρόσβασης", - "swap.button.swap": "Ανταλαγή", - "swap.button.swapAnyways": "Ανταλλάξτε πάντως", - "swap.button.unwrap": "Ξεδιπλώνω", - "swap.button.wrap": "Κάλυμμα", - "swap.buy.countryModal.placeholder": "Αναζήτηση ανά χώρα ή περιοχή", - "swap.cancel.cannotExecute_one": "Η ανταλλαγή σας θα μπορούσε να εκτελεστεί πριν από την επεξεργασία της ακύρωσης. Το κόστος του δικτύου σας δεν μπορεί να επιστραφεί. Θέλετε να προχωρήσετε;", - "swap.cancel.cannotExecute_other": "Οι ανταλλαγές σας θα μπορούσαν να εκτελεστούν πριν από την επεξεργασία της ακύρωσης. Το κόστος του δικτύου σας δεν μπορεί να επιστραφεί. Θέλετε να προχωρήσετε;", - "swap.confirmApproveAndSwap": "Επιβεβαίωση έγκρισης και ανταλλαγής", - "swap.confirmLimit": "Επιβεβαίωση ορίου", - "swap.confirmSwap": "Επιβεβαίωση ανταλλαγής", - "swap.confirmWrap": "Επιβεβαίωση αναδίπλωσης", - "swap.deadline.settings.title": "Προθεσμία ανταλλαγής", - "swap.deadline.settings.title.short": "Tx. διορία", - "swap.details.completed": "Η ανταλλαγή ολοκληρώθηκε", - "swap.details.estimatedTime": "Εκτιμώμενη ώρα", - "swap.details.fasterUnichainSwaps": "Ταχύτερες ανταλλαγές με την υποστήριξη της Unichain", - "swap.details.feeOnTransfer": "{{tokenSymbol}} αμοιβή", - "swap.details.feeOnTransfer.symbol": "{{tokenSymbol}} συμβολική χρέωση", - "swap.details.instant": "Στιγμή", - "swap.details.newQuote.input": "Νέα εισαγωγή", - "swap.details.newQuote.output": "Νέα έξοδος", - "swap.details.orderRouting": "Δρομολόγηση παραγγελίας", - "swap.details.orderRoutingInfo": "Αυτή η ανταλλαγή δρομολογείται μέσω του Across, ενός αποκεντρωμένου πρωτοκόλλου που μετακινεί στοιχεία στα δίκτυα, ενώ δίνει προτεραιότητα στην ασφάλεια, τη γρήγορη εκτέλεση και τις χαμηλές τιμές.", - "swap.details.poweredBy": "Τροφοδοτείται από", - "swap.details.rate": "Τιμή", - "swap.details.slippage": "Μέγιστη ολίσθηση", - "swap.details.slippage.uniswap": "Προστατευμένη ολίσθηση Uniswap", - "swap.details.swappedIn.unichain": "Ολοκληρώθηκε σε {{time}}s στο Unichain", - "swap.details.uniswapFee": "Τέλη", - "swap.error.default": "Ίσως χρειαστεί να αυξήσετε την ανοχή ολίσθησης. Σημείωση: Τα διακριτικά χρέωσης κατά τη μεταφορά και επαναφοράς δεν είναι συμβατά με το Uniswap V3.", - "swap.error.expectedToFail": "Η ανταλλαγή σας αναμένεται να αποτύχει.", - "swap.error.fiatInputUnavailable": "Η είσοδος {{fiatCurrencyCode}} δεν είναι διαθέσιμη", - "swap.error.modifiedByWallet": "Η ανταλλαγή σας τροποποιήθηκε μέσω του πορτοφολιού σας. Εάν αυτό ήταν λάθος, ακυρώστε αμέσως ή κινδυνεύετε να χάσετε τα χρήματά σας.", - "swap.error.rejected": "Η συναλλαγή απορρίφθηκε", - "swap.error.undefinedObject": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια εκτέλεσης αυτής της ανταλλαγής. Ίσως χρειαστεί να αυξήσετε την ανοχή ολίσθησης. Εάν αυτό δεν λειτουργήσει, ενδέχεται να υπάρχει ασυμβατότητα με το διακριτικό που διαπραγματεύεστε. Σημείωση: Τα διακριτικά χρέωσης κατά τη μεταφορά και επαναφοράς δεν είναι συμβατά με το Uniswap V3.", - "swap.error.unknown": "Αγνωστο σφάλμα.", - "swap.error.v2.expired": "Δεν ήταν δυνατή η αποστολή αυτής της συναλλαγής επειδή έχει παρέλθει η προθεσμία. Ελέγξτε ότι η προθεσμία συναλλαγής σας δεν είναι πολύ χαμηλή.", - "swap.error.v2.k": "Η αναλλοίωτη Uniswap x*y=k δεν ικανοποιήθηκε από την ανταλλαγή. Αυτό συνήθως σημαίνει ότι ένα από τα διακριτικά που ανταλλάσσετε ενσωματώνει προσαρμοσμένη συμπεριφορά κατά τη μεταφορά.", - "swap.error.v2.slippage": "Αυτή η συναλλαγή δεν θα πετύχει είτε λόγω μεταβολής της τιμής είτε λόγω χρέωσης κατά τη μεταφορά. Προσπαθήστε να αυξήσετε την ανοχή ολίσθησης", - "swap.error.v2.transferInput": "Το διακριτικό εισόδου δεν μπορεί να μεταφερθεί. Μπορεί να υπάρχει πρόβλημα με το διακριτικό εισόδου.", - "swap.error.v2.transferOutput": "Το διακριτικό εξόδου δεν μπορεί να μεταφερθεί. Μπορεί να υπάρχει πρόβλημα με το διακριτικό εξόδου.", - "swap.error.v3.slippage": "Αυτή η συναλλαγή δεν θα πετύχει λόγω μεταβολής των τιμών. Προσπαθήστε να αυξήσετε την ανοχή ολίσθησης. Σημείωση: Τα κουπόνια χρέωσης μεταφοράς και επαναφοράς δεν είναι συμβατά με το Uniswap V3.", - "swap.error.v3.transferOutput": "Το διακριτικό εξόδου δεν μπορεί να μεταφερθεί. Μπορεί να υπάρχει πρόβλημα με το διακριτικό εξόδου. Σημείωση: Τα κουπόνια χρέωσης μεταφοράς και επαναφοράς δεν είναι συμβατά με το Uniswap V3.", - "swap.estimatedDifference.label": "Θα υπάρχει μεγάλη διαφορά μεταξύ των τιμών εισροών και εκροών σας λόγω της τρέχουσας ρευστότητας.", - "swap.expected.price": "Αναμενόμενη τιμή", - "swap.fail.batched": "Το συνδεδεμένο πορτοφόλι σας ενδέχεται να μην υποστηρίζει ανταλλαγές με 1 κλικ. Δοκιμάστε μια τυπική ανταλλαγή.", - "swap.fail.batched.retry": "Δοκιμάστε την τυπική εναλλαγή", - "swap.fail.batched.title": "Η εναλλαγή με 1 κλικ απέτυχε", - "swap.fail.message": "Δοκιμάστε να προσαρμόσετε την ολίσθηση σε υψηλότερη τιμή.", - "swap.fail.uniswapX": "Δεν ήταν δυνατή η ολοκλήρωση της ανταλλαγής με το UniswapX. Δοκιμάστε ξανά την ανταλλαγή σας για να τη δρομολογήσετε μέσω του κλασικού Uniswap API.", - "swap.fees.experience": "Αυτή η χρέωση εφαρμόζεται σε ορισμένα ζεύγη διακριτικών για να διασφαλιστεί η καλύτερη εμπειρία με το Uniswap. Καταβάλλεται στο διακριτικό εξόδου και έχει ήδη συμπεριληφθεί στην προσφορά.", - "swap.fees.jupiter.label": "Τέλος του Δία", - "swap.fees.jupiter.message": "Οι χρεώσεις στο Solana χρεώνονται από το Jupiter API. Η Uniswap Labs δεν λαμβάνει αυτές τις χρεώσεις.", - "swap.fees.noFee": "Εφαρμόζονται χρεώσεις σε επιλεγμένα ζεύγη διακριτικών για να διασφαλιστεί η καλύτερη εμπειρία με το Uniswap. Δεν υπάρχει χρέωση που να σχετίζεται με αυτήν την ανταλλαγή.", - "swap.finalizingQuote": "Ολοκλήρωση προσφοράς...", - "swap.form.header": "Ανταλαγή", - "swap.form.warning.output.fotFees": "Λόγω της συμβολικής προμήθειας των {{fotCurrencySymbol}}, τα ποσά ανταλλαγής μπορούν να εισαχθούν μόνο χρησιμοποιώντας το πεδίο εισαγωγής", - "swap.form.warning.output.fotFees.fallback": "Λόγω των χρεώσεων συμβολικών, τα ποσά ανταλλαγής μπορούν να εισαχθούν μόνο χρησιμοποιώντας το πεδίο εισαγωγής", - "swap.form.warning.output.solana": "Η ακριβής έξοδος δεν υποστηρίζεται στο Solana", - "swap.form.warning.restore": "Επαναφέρετε το πορτοφόλι σας για ανταλλαγή", - "swap.frontrun.warning": "Η συναλλαγή σας μπορεί να είναι προκαταρκτική και να οδηγήσει σε δυσμενή συναλλαγή.", - "swap.header.viewOnly": "Μόνο προβολή", - "swap.impactOfTrade": "Ο αντίκτυπος που έχει η συναλλαγή σας στην τιμή αγοράς αυτής της ομάδας.", - "swap.impactOfTrade.uniswapx": "Η διαφορά μεταξύ της τιμής αγοράς και της τιμής εκτέλεσης, συνυπολογίζοντας την εξοικονόμηση αερίου UniswapX.", - "swap.impactOfTrade.uniswapx.missing": "Οι υπολογισμοί του αντίκτυπου των τιμών ενδέχεται να μην είναι διαθέσιμοι για ζεύγη με χαμηλή ρευστότητα.", - "swap.inputEstimated.atMost": "Η είσοδος εκτιμάται. Θα πουλήσετε το πολύ ή η συναλλαγή θα επανέλθει.", - "swap.limit": "Οριο", - "swap.limitFilled": "Συμπληρώθηκε το όριο!", - "swap.limitSubmitted": "Υποβλήθηκε όριο", - "swap.marketPrice.outsideRange.label": "Η τιμή αγοράς είναι εκτός του καθορισμένου εύρους τιμών. Μόνο κατάθεση ενός περιουσιακού στοιχείου.", - "swap.min.price": "Κατώτατη τιμή", - "swap.networkCost.paidIn": "Το κόστος δικτύου καταβάλλεται σε {{sym}} στο δίκτυο {{chainName}} για τη συναλλαγή.", - "swap.orderRouting": "Δρομολόγηση παραγγελίας", - "swap.outputEstimated.atLeast": "Εκτιμάται η παραγωγή. Θα λάβετε τουλάχιστον ή η συναλλαγή θα επανέλθει.", - "swap.placeOrder": "Παραγγέλνω", - "swap.priceImpact": "Επίπτωση στην τιμή", - "swap.request.title.full": "Ανταλλαγή {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "Swap Tokens", - "swap.review": "Ανταλλαγή κριτικής", - "swap.review.summary": "Ανταλλάσσετε", - "swap.reviewLimit": "Όριο ελέγχου", - "swap.route.optimizedGasCost": "Αυτή η διαδρομή λαμβάνει υπόψη τις διαιρούμενες διαδρομές, τα πολλαπλά άλματα και το κόστος δικτύου για κάθε βήμα.", - "swap.routing.jupiter.description": "Η Jupiter συγκεντρώνει ρευστότητα από πολλαπλές πηγές για να σας παρέχει τις καλύτερες τιμές.", - "swap.routing.uniswapAutoRouter.description": "Το Uniswap Auto Router λαμβάνει υπόψη τις βέλτιστες διαδρομές και το κόστος δικτύου για να σας παρέχει τις καλύτερες τιμές.", - "swap.settings.deadline.tooltip": "Η συναλλαγή σας θα επανέλθει εάν είναι σε εκκρεμότητα για περισσότερο από αυτό το χρονικό διάστημα. (Μέγιστο: 3 ημέρες).", - "swap.settings.deadline.warning": "Υψηλή προθεσμία", - "swap.settings.oneClickSwap.title": "Ανταλλαγές με 1 κλικ", - "swap.settings.oneClickSwap.tooltip": "Συνδυάζει τυπικές συναλλαγές για ταχύτερες και χαμηλότερου κόστους ανταλλαγές.", - "swap.settings.protection.description": "Με ενεργοποιημένη την προστασία ανταλλαγής, οι συναλλαγές σας στο Ethereum θα προστατεύονται από επιθέσεις σάντουιτς, με μειωμένες πιθανότητες αποτυχίας.", - "swap.settings.protection.subtitle.supported": "{{chainName}} Δίκτυο", - "swap.settings.protection.subtitle.unavailable": "Μη διαθέσιμο στις {{chainName}}", - "swap.settings.protection.title": "Swap Protection", - "swap.settings.routingPreference.option.default.description": "Η ενεργοποίηση αυτής της επιλογής προσδιορίζει την πιο αποτελεσματική διαδρομή για την εναλλαγή σας.", - "swap.settings.routingPreference.option.default.description.preV4": "Ο πελάτης Uniswap επιλέγει τη φθηνότερη επιλογή συναλλαγών λαμβάνοντας υπόψη την τιμή και το κόστος δικτύου.", - "swap.settings.routingPreference.option.default.description.uniswapXUnavailable": "Το UniswapX δεν είναι διαθέσιμο για το πορτοφόλι σας", - "swap.settings.routingPreference.option.default.tooltip": "Εντοπίζεται μια διαδρομή λαμβάνοντας υπόψη τις ομάδες v2, v3 και v4, λαμβάνοντας υπόψη τον εκτιμώμενο αντίκτυπο στην τιμή και το κόστος δικτύου.", - "swap.settings.routingPreference.option.v2.title": "Ενεργοποίηση ομάδων v2", - "swap.settings.routingPreference.option.v3.title": "Ενεργοποίηση ομάδων v3", - "swap.settings.routingPreference.option.v4.hooks.title": "Ενεργοποίηση ομάδων αγκίστρων v4", - "swap.settings.routingPreference.option.v4.hooks.tooltip": "Τα αγκίστρια V4 δρομολογούν τις ανταλλαγές μέσω ενός συνόλου προεγκεκριμένων αγκιστριών.", - "swap.settings.routingPreference.option.v4.title": "Ενεργοποίηση ομάδων v4", - "swap.settings.routingPreference.title": "Εμπορικές επιλογές", - "swap.settings.slippage.alert": "Υψηλή ολίσθηση", - "swap.settings.slippage.control.auto": "Αυτο", - "swap.settings.slippage.description": "Η συναλλαγή σας θα επανέλθει εάν η τιμή αλλάξει περισσότερο από το ποσοστό ολίσθησης.", - "swap.settings.slippage.input.message": "Εάν η τιμή πέσει περαιτέρω, η συναλλαγή σας θα επανέλθει. Παρακάτω είναι το ελάχιστο ποσό που είναι εγγυημένο ότι θα λάβετε.", - "swap.settings.slippage.input.receive.title": "Λάβετε τουλάχιστον", - "swap.settings.slippage.output.message": "Εάν η τιμή πέσει περαιτέρω, η συναλλαγή σας θα επανέλθει. Παρακάτω είναι το μέγιστο ποσό που θα χρειαστεί να δαπανήσετε.", - "swap.settings.slippage.output.spend.title": "Ξοδέψτε το πολύ", - "swap.settings.slippage.warning": "Πολύ υψηλή ολίσθηση", - "swap.settings.slippage.warning.description": "Η διολίσθηση άνω του 20% είναι πιθανό να οδηγήσει σε δυσμενή συναλλαγή. Για να μειώσετε τον κίνδυνο εκ των προτέρων, χαμηλώστε τις ρυθμίσεις σας.", - "swap.settings.slippage.warning.hover": "Αυτό μπορεί να οδηγήσει σε ένα δυσμενές εμπόριο. Δοκιμάστε να μειώσετε τη ρύθμιση ολίσθησης.", - "swap.settings.slippage.warning.max": "Εισαγάγετε μια τιμή μικρότερη από {{maxSlippageTolerance}}", - "swap.settings.slippage.warning.message": "Η ολίσθηση μπορεί να είναι μεγαλύτερη από όσο χρειάζεται", - "swap.settings.slippage.warning.min": "Εισαγάγετε μια τιμή μεγαλύτερη από 0", - "swap.settings.title": "Εναλλαγή ρυθμίσεων", - "swap.settings.transactionRevertPrice": "Η συναλλαγή σας θα επανέλθει εάν η τιμή αλλάξει δυσμενώς περισσότερο από αυτό το ποσοστό.", - "swap.signAndSwap": "Υπογράψτε και ανταλλάξτε", - "swap.slippage.amt": "{{amt}} ολίσθηση", - "swap.slippage.bridging": "Χωρίς ολίσθηση κατά την εναλλαγή μεταξύ δικτύων", - "swap.slippage.description": "Διαφορά μεταξύ της αναμενόμενης και της εκτελεσμένης τιμής σε ένα swap. Οι διαφορές μπορεί να προκύψουν λόγω χαμηλής ρευστότητας, αστάθειας της αγοράς ή ρομπότ (bots). \n\nΗ προστασία Uniswap προστατεύει από ρομπότ που εισβάλλουν μπροστά και MEV.", - "swap.slippage.settings.title": "Ρυθμίσεις ολίσθησης", - "swap.slippage.tooltip": "Η μέγιστη κίνηση της τιμής πριν από τη συναλλαγή σας θα επανέλθει.", - "swap.slippageBelow.warning": "Η ολίσθηση κάτω από το {{amt}} μπορεί να οδηγήσει σε αποτυχημένη συναλλαγή", - "swap.submitted": "Υποβλήθηκε ανταλλαγή", - "swap.success": "Ανταλλαγή επιτυχία!", - "swap.tokenOwnFees": "Ορισμένα μάρκες λαμβάνουν ένα τέλος όταν αγοράζονται ή πωλούνται, το οποίο ορίζεται από τον εκδότη του κουπόνι. Η Uniswap δεν λαμβάνει καμία από αυτές τις χρεώσεις.", - "swap.tradeRoutes": "Εμπορικές διαδρομές", - "swap.transaction.deadline": "Προθεσμία συναλλαγής", - "swap.transaction.revertAfter": "Η συναλλαγή σας θα επανέλθει εάν είναι σε εκκρεμότητα για περισσότερο από αυτό το χρονικό διάστημα.", - "swap.warning.enterLargerAmount.title": "Εισαγάγετε μεγαλύτερο ποσό", - "swap.warning.expectedFailure.increaseSlippage": "Προσπαθήστε να αυξήσετε την ολίσθησή σας.", - "swap.warning.expectedFailure.titleMay": "Αυτή η ανταλλαγή μπορεί να αποτύχει", - "swap.warning.insufficientBalance.title": "Δεν σου φτάνουν {{currencySymbol}}", - "swap.warning.insufficientGas.button": "Δεν αρκεί {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "Ανταλλάξτε για {{ tokenSymbol }} στο {{networkName}}", - "swap.warning.insufficientGas.button.buy": "Αγοράστε {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "Αγορά με κάρτα", - "swap.warning.insufficientGas.message.withNetwork": "Δεν αρκεί {{currencySymbol}} στο {{networkName}} για εναλλαγή", - "swap.warning.insufficientGas.message.withoutNetwork": "Δεν αρκεί {{currencySymbol}} για εναλλαγή", - "swap.warning.insufficientGas.title": "Δεν έχετε αρκετό {{currencySymbol}} για να καλύψετε το κόστος του δικτύου", - "swap.warning.networkFee.allow": "Να επιτρέπεται {{ inputTokenSymbol }} (μία φορά)", - "swap.warning.networkFee.delegation.message": "Αυτό είναι το κόστος για την επεξεργασία της συναλλαγής σας και την ενεργοποίηση του έξυπνου πορτοφολιού σας στο Unichain. Η Uniswap Labs δεν λαμβάνει κανένα μερίδιο από αυτές τις χρεώσεις.", - "swap.warning.networkFee.highRelativeToValue": "Το κόστος δικτύου υπερβαίνει το 10% της συνολικής αξίας συναλλαγής σας. Αυτό είναι το κόστος για την επεξεργασία της συναλλαγής σας στο blockchain. Η Uniswap δεν λαμβάνει κανένα μερίδιο από αυτές τις χρεώσεις.", - "swap.warning.networkFee.highRelativeToValue.unichain": "Το κόστος δικτύου υπερβαίνει το 10% της συνολικής αξίας συναλλαγής σας. Αυτό είναι το κόστος για την επεξεργασία της συναλλαγής σας στο blockchain.", - "swap.warning.networkFee.includesDelegation": "Περιλαμβάνει ενεργοποίηση έξυπνου πορτοφολιού", - "swap.warning.networkFee.message": "Αυτό είναι το κόστος για την επεξεργασία της συναλλαγής σας στο blockchain. Η Uniswap δεν λαμβάνει κανένα μερίδιο από αυτές τις χρεώσεις.", - "swap.warning.networkFee.message.unichain": "Αυτό είναι το κόστος για την επεξεργασία της συναλλαγής σας στο blockchain.", - "swap.warning.networkFee.message.uniswapX": "Αυτό είναι το κόστος για την επεξεργασία της συναλλαγής σας στο blockchain. Η Uniswap δεν λαμβάνει κανένα μερίδιο από αυτές τις χρεώσεις. Το UniswapX συγκεντρώνει πηγές ρευστότητας για καλύτερες τιμές και ανταλλαγές χωρίς φυσικό αέριο.", - "swap.warning.networkFee.message.uniswapX.title": "Χωρίς κόστος δικτύου με το UniswapX", - "swap.warning.networkFee.message.uniswapX.unichain": "Αυτό είναι το κόστος για την επεξεργασία της συναλλαγής σας στο blockchain. Το UniswapX συγκεντρώνει πηγές ρευστότητας για καλύτερες τιμές και ανταλλαγές χωρίς φυσικό αέριο.", - "swap.warning.noQuotesFound.bridging.message": "Δεν βρέθηκαν εισαγωγικά γεφύρωσης. Δοκιμάστε να χρησιμοποιήσετε την επίσημη γέφυρα αυτή τη στιγμή.", - "swap.warning.noQuotesFound.title": "Δεν βρέθηκαν εισαγωγικά", - "swap.warning.noRoutesFound.message": "Αυτήν τη στιγμή δεν υπάρχουν διαθέσιμες διαδρομές για τα επιλεγμένα διακριτικά σας. Δοκιμάστε ένα διαφορετικό ζεύγος ή ελέγξτε ξανά αργότερα.", - "swap.warning.noRoutesFound.title": "Δεν υπάρχουν διαθέσιμα δρομολόγια", - "swap.warning.offline.message": "Μπορεί να έχετε χάσει τη σύνδεση στο Διαδίκτυο ή το δίκτυο μπορεί να είναι εκτός λειτουργίας. Ελέγξτε τη σύνδεσή σας στο Διαδίκτυο και δοκιμάστε ξανά.", - "swap.warning.offline.title": "Είστε εκτός σύνδεσης", - "swap.warning.priceImpact.message": "Λόγω του ποσού της {{outputCurrencySymbol}} ρευστότητας που είναι διαθέσιμη αυτήν τη στιγμή, όσο περισσότερα {{inputCurrencySymbol}} προσπαθήσετε να ανταλλάξετε, τόσο λιγότερα {{outputCurrencySymbol}} θα λάβετε.", - "swap.warning.priceImpact.message.veryHigh": "Αυτή η συναλλαγή θα έχει ως αποτέλεσμα {{priceImpactValue}} αντίκτυπο της τιμής στην τιμή αγοράς αυτής της ομάδας και θα οδηγήσει σε απώλεια κεφαλαίων.", - "swap.warning.priceImpact.title": "Υψηλός αντίκτυπος στην τιμή ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "Πολύ υψηλός αντίκτυπος στην τιμή ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "Η συναλλαγή σας δεν υποβλήθηκε επειδή κλείσατε την εφαρμογή.", - "swap.warning.queuedOrder.approvalFailed": "Η συναλλαγή σας δεν υποβλήθηκε επειδή απέτυχε η έγκριση του διακριτικού.", - "swap.warning.queuedOrder.stale": "Η συναλλαγή σας δεν υποβλήθηκε επειδή κλείσατε την εφαρμογή ή η έγκριση άργησε πολύ.", - "swap.warning.queuedOrder.submissionFailed": "Παρουσιάστηκε πρόβλημα κατά την υποβολή της συναλλαγής σας.", - "swap.warning.queuedOrder.title": "Η ανταλλαγή ακυρώθηκε", - "swap.warning.rateLimit.message": "Παρακαλώ δοκιμάστε ξανά σε λίγα λεπτά.", - "swap.warning.rateLimit.title": "Υπέρβαση του ορίου τιμής", - "swap.warning.router.message": "Μπορεί να χάσατε τη σύνδεση ή το δίκτυο μπορεί να είναι εκτός λειτουργίας. Εάν το πρόβλημα παραμένει, δοκιμάστε ξανά αργότερα.", - "swap.warning.router.title": "Αυτή η συναλλαγή δεν μπορεί να ολοκληρωθεί αυτήν τη στιγμή", - "swap.warning.tokenBlocked.button": "Το {{tokenSymbol}} είναι αποκλεισμένο", - "swap.warning.tokenBlockedFallback.button": "Το διακριτικό είναι αποκλεισμένο", - "swap.warning.uniswapFee.message": "Εφαρμόζονται χρεώσεις για να διασφαλιστεί η καλύτερη δυνατή εμπειρία με το Uniswap.", - "swap.warning.uniswapFee.message.default": "Εφαρμόζονται χρεώσεις για να διασφαλιστεί η καλύτερη εμπειρία με το Uniswap. Δεν υπάρχει χρέωση που να σχετίζεται με αυτήν την ανταλλαγή.", - "swap.warning.uniswapFee.message.included": "Εφαρμόζονται χρεώσεις για να διασφαλιστεί η καλύτερη εμπειρία με το Uniswap και έχουν ήδη ληφθεί υπόψη σε αυτήν την προσφορά.", - "swap.warning.uniswapFee.title": "Προμήθεια ανταλλαγής", - "swap.warning.viewOnly.message": "Πρέπει να εισαγάγετε αυτό το πορτοφόλι μέσω φράσης ανάκτησης για να ανταλλάξετε διακριτικά.", - "swap.wrap.token": "Τυλίξτε {{sym}}", - "tdp.balanceSummary.otherNetworks": "Σε άλλα δίκτυα", - "tdp.balanceSummary.otherNetworksBalance": "Υπόλοιπο σε άλλα δίκτυα", - "tdp.balanceSummary.title": "Η ισορροπία σου", - "tdp.button.getToken": "Λάβετε {{ tokenSymbol }}", - "tdp.button.getTokenFallback": "Λήψη Token", - "tdp.loading.title.default": "δεδομένα διακριτικού για ", - "tdp.loading.title.withChain": "δεδομένα διακριτικού για στο {{chainName}}", - "tdp.nameNotFound": "Το όνομα δεν βρέθηκε", - "tdp.noInfoAvailable": "Δεν υπάρχουν διαθέσιμες πληροφορίες συμβολικών", - "tdp.noTestnetSupportDescription": "Ορισμένα δοκιμαστικά δίκτυα δεν υποστηρίζουν την ανταλλαγή, την αποστολή ή την αγορά κουπονιών.", - "tdp.symbolNotFound": "Το σύμβολο δεν βρέθηκε", - "testnet.modal.swapDeepLink.description.toProdMode": "Αυτή η ενέργεια απαιτεί την απενεργοποίηση της λειτουργίας δοκιμαστικού δικτύου. Η λειτουργία Testnet μπορεί να ενεργοποιηθεί ξανά ανά πάσα στιγμή εντός των ρυθμίσεων.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "Αυτή η ενέργεια απαιτεί την ενεργοποίηση της λειτουργίας δοκιμαστικού δικτύου. Τα διακριτικά στα δοκιμαστικά δίκτυα δεν έχουν καμία πραγματική αξία. Η λειτουργία Testnet μπορεί να απενεργοποιηθεί ανά πάσα στιγμή εντός των ρυθμίσεων.", - "testnet.modal.swapDeepLink.title.toProdMode": "Απενεργοποιήστε τη λειτουργία δοκιμαστικού δικτύου", - "testnet.modal.swapDeepLink.title.toTestnetMode": "Ενεργοποίηση λειτουργίας δοκιμαστικού δικτύου", - "testnet.unsupported": "Αυτή η λειτουργία δεν υποστηρίζεται σε λειτουργία δοκιμαστικού δικτύου.", - "themeToggle.theme": "Θέμα", - "title.buySellTradeEthereum": "Αγοράστε, πουλήστε και ανταλλάξτε Ethereum και άλλα κορυφαία διακριτικά στο Uniswap", - "title.createGovernanceOn": "Δημιουργήστε μια νέα πρόταση διακυβέρνησης στο Uniswap", - "title.createGovernanceTo": "Δημιουργήστε μια νέα πρόταση διακυβέρνησης που θα ψηφιστεί από τους κατόχους UNI. Τα διακριτικά UNI αντιπροσωπεύουν μετοχές με δικαίωμα ψήφου στη διακυβέρνηση Uniswap.", - "title.earnFees": "Κερδίστε προμήθειες όταν άλλοι ανταλλάσσουν στο Uniswap προσθέτοντας διακριτικά σε ομάδες ρευστότητας.", - "title.easilyRemove": "Αφαιρέστε εύκολα τη ρευστότητά σας από το Uniswap v2 και καταθέστε στο Uniswap v3.", - "title.easilyRemoveV4": "Αφαιρέστε εύκολα τη ρευστότητά σας από το Uniswap v2 και v3 για να καταθέσετε στο Uniswap v4.", - "title.extension.uninstall": "Η επέκταση απεγκαταστάθηκε", - "title.extensionPasskeyLogIn": "Σύνδεση με κωδικό πρόσβασης", - "title.managePasskeys": "Unswap | Διαχειριστείτε τους κωδικούς πρόσβασης", - "title.migratev2": "Μεταφέρετε τη ρευστότητα της ομάδας v2 στο Uniswap v3", - "title.migratev3": "Μεταφέρετε τη ρευστότητα της ομάδας στο Uniswap v4", - "title.placeLimit": "Τοποθετήστε οριακές παραγγελίες στο Uniswap", - "title.realTime": "Τιμές σε πραγματικό χρόνο, γραφήματα, δεδομένα συναλλαγών και πολλά άλλα.", - "title.removeLiquidityv2": "Καταργήστε τη ρευστότητα της ομάδας (v2) στο Uniswap", - "title.removePoolLiquidity": "Καταργήστε τη ρευστότητα της ομάδας στο Uniswap", - "title.removeTokensv2": "Αφαιρέστε τα διακριτικά σας από τις ομάδες ρευστότητας v2.", - "title.removev3Liquidity": "Αφαιρέστε τα διακριτικά σας από τις ομάδες ρευστότητας v3.", - "title.sendCrypto": "Αποστολή κρυπτογράφησης", - "title.sendTokens": "Στείλτε μάρκες στο Uniswap", - "title.swappingMadeSimple": "Αγοράστε και πουλήστε άμεσα κρυπτονομίσματα σε Ethereum, Base, Arbitrum, Polygon, Unichain και άλλα. Η πλατφόρμα DeFi που εμπιστεύονται εκατομμύρια.", - "title.tradeTokens": "Εμπορεύστε μάρκες και παρέχετε ρευστότητα. Τιμές σε πραγματικό χρόνο, γραφήματα, δεδομένα συναλλαγών και πολλά άλλα.", - "title.uniswapTradeCrypto": "Uniswap | Συναλλαγές Κρυπτονομισμάτων στο Κορυφαίο Χρηματιστήριο του DeFi ", - "title.uniToken": "Τα διακριτικά UNI αντιπροσωπεύουν μετοχές με δικαίωμα ψήφου στη διακυβέρνηση Uniswap. Μπορείτε να ψηφίσετε μόνοι σας για κάθε πρόταση ή να αναθέσετε τις ψήφους σας σε τρίτο μέρος.", - "title.voteOnGov": "Ψηφοφορία επί προτάσεων διακυβέρνησης για το Uniswap", - "token.balances.main": "Η ισορροπία σου", - "token.balances.other": "Υπόλοιπα σε άλλα δίκτυα", - "token.balances.viewOnly": "ισορροπία {{ownerAddress}}", - "token.bridge": "{{label}} συμβολική γέφυρα", - "token.chart.candlestick.unavailable": "Τα γραφήματα κεριών δεν είναι διαθέσιμα για αυτό το διακριτικό", - "token.chart.tooltip": "Τέλη: {{amount}}", - "token.details": "Λεπτομέρειες συμβολικού", - "token.error.unknown": "Άγνωστο διακριτικό", - "token.fee.buy.label": "προμήθεια αγοράς", - "token.fee.label": "αμοιβή", - "token.fee.sell.label": "αμοιβή πώλησης", - "token.links.title": "Συνδέσεις", - "token.links.twitter": "Κελάδημα", - "token.links.website": "Δικτυακός τόπος", - "token.notFound.description": "Λυπούμαστε, δεν μπορούμε να βρούμε πληροφορίες για αυτό το διακριτικό. Ελέγξτε το όνομα και τη διεύθυνση και δοκιμάστε ξανά.", - "token.notFound.title": "Το διακριτικό δεν βρέθηκε", - "token.priceExplorer.error.description": "Κάτι πήγε στραβά.", - "token.priceExplorer.error.title": "Δεν ήταν δυνατή η φόρτωση του γραφήματος τιμών", - "token.priceExplorer.timeRangeLabel.all": "Συνεχώς", - "token.priceExplorer.timeRangeLabel.day": "1Δ", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 Ημέρα", - "token.priceExplorer.timeRangeLabel.hour": "1Η", - "token.priceExplorer.timeRangeLabel.month": "1 Μ", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 Μήνας", - "token.priceExplorer.timeRangeLabel.week": "1W", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 Εβδομάδα", - "token.priceExplorer.timeRangeLabel.year": "1Y", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 Έτος", - "token.safety.blocked.title.tokenNotAvailable": "Το {{tokenSymbol}} δεν είναι διαθέσιμο", - "token.safety.blocked.title.tokensNotAvailable": "Τα {{tokenSymbol0}} και {{tokenSymbol1}} δεν είναι διαθέσιμα", - "token.safety.fee.detected": "Εντοπίστηκε χρέωση συμβολαίου", - "token.safety.fees.uniswapLabsDoesNotReceive": "Η Uniswap Labs δεν λαμβάνει καμία από αυτές τις χρεώσεις.", - "token.safety.warning.alwaysDoYourResearch": "Πάντα να κάνετε την έρευνά σας", - "token.safety.warning.blocked.description.default_one": "Δεν μπορείτε να ανταλλάξετε αυτό το διακριτικό χρησιμοποιώντας την εφαρμογή Uniswap.", - "token.safety.warning.blocked.description.default_other": "Δεν μπορείτε να ανταλλάξετε αυτά τα διακριτικά χρησιμοποιώντας την εφαρμογή Uniswap.", - "token.safety.warning.copyContractAddress.message": "Αυτή είναι μια διεύθυνση σύμβασης, η οποία λειτουργεί ως μοναδικό αναγνωριστικό για διακριτικά στο blockchain. Οποιαδήποτε κρυπτογράφηση στέλνετε σε αυτήν τη διεύθυνση θα χαθεί.", - "token.safety.warning.copyContractAddress.title": "Μην στέλνετε κρυπτογράφηση σε αυτή τη διεύθυνση", - "token.safety.warning.dontShowWarningAgain": "Μην μου ξαναδείξετε αυτήν την προειδοποίηση", - "token.safety.warning.dontShowWarningAgainShort": "Να μην εμφανιστεί ξανά", - "token.safety.warning.doYourOwnResearch": "Πάντα να κάνετε τη δική σας έρευνα πριν προχωρήσετε.", - "token.safety.warning.feeDescription": "Φορτίζει ένα όταν {{action}}", - "token.safety.warning.flaggedAsMalicious": "Επισημάνθηκε ως κακόβουλο", - "token.safety.warning.flaggedAsSuspicious": "Επισημάνθηκε ως ύποπτο", - "token.safety.warning.fotHigh.title": "Εντοπίστηκε υψηλή χρέωση", - "token.safety.warning.fotLow.title": "Εντοπίστηκε χρέωση", - "token.safety.warning.fotVeryHigh.title": "Εντοπίστηκε πολύ υψηλή χρέωση", - "token.safety.warning.honeypot.message": "Το {{tokenSymbol}} έχει επισημανθεί ως μη πωλήσιμο. Η ανταλλαγή αυτού του διακριτικού μπορεί να οδηγήσει σε απώλεια των χρημάτων σας.", - "token.safety.warning.honeypot.title": "Εντοπίστηκε προμήθεια 100% πώλησης", - "token.safety.warning.impersonator": "Υποδύεται ένα άλλο διακριτικό", - "token.safety.warning.impersonator.title": "Εντοπίστηκε διακριτικό μιμητή", - "token.safety.warning.malicious.general.message": "Το {{tokenSymbol}} έχει επισημανθεί ως κακόβουλο από το Blockaid.", - "token.safety.warning.malicious.impersonator.message": "Το {{tokenSymbol}} έχει επισημανθεί από το Blockaid για προσπάθεια αντιγραφής διαφορετικού διακριτικού. Μπορεί να μην είναι το διακριτικό που θέλετε να ανταλλάξετε.", - "token.safety.warning.malicious.impersonator.message.short": "Το {{tokenSymbol}} μπορεί να μην είναι το διακριτικό που θέλετε να ανταλλάξετε.", - "token.safety.warning.malicious.title": "Εντοπίστηκε κακόβουλο διακριτικό", - "token.safety.warning.mayResultInLoss": "Η αντικατάστασή του μπορεί να οδηγήσει σε απώλεια κεφαλαίων.", - "token.safety.warning.medium.heading.named": "Το {{tokenSymbol}} δεν διαπραγματεύεται σε κορυφαία κεντρικά χρηματιστήρια των ΗΠΑ.", - "token.safety.warning.notListedOnExchanges": "Δεν είναι εισηγμένη σε κορυφαία χρηματιστήρια των ΗΠΑ", - "token.safety.warning.potentialHoneypot.card.message": "Το {{tokenSymbol}} έχει επισημανθεί ως ύποπτο από το Blockaid.", - "token.safety.warning.potentialHoneypot.modal.message": "Το {{tokenSymbol}} έχει επισημανθεί ως πιθανό honeypot από το Blockaid. Πάντα να κάνετε τη δική σας έρευνα πριν προχωρήσετε.", - "token.safety.warning.potentialHoneypot.title": "Εντοπίστηκε δυνητικό honeypot", - "token.safety.warning.sellFee100.message": "Το {{ tokenSymbol }} έχει επισημανθεί ως μη πωλήσιμο.", - "token.safety.warning.sellFee100.title": "Εντοπίστηκε προμήθεια 100% πώλησης", - "token.safety.warning.spam.message": "Το {{tokenSymbol}} έχει επισημανθεί ως ανεπιθύμητο από το Blockaid.", - "token.safety.warning.spam.title": "Εντοπίστηκε διακριτικό ανεπιθύμητης αλληλογραφίας", - "token.safety.warning.spamsUsers": "Χρήστες ανεπιθύμητων μηνυμάτων", - "token.safety.warning.tokenChargesFee.both.message": "Το {{tokenSymbol}} χρεώνει μια χρέωση {{buyFeePercent}} κατά την αγορά και {{sellFeePercent}} κατά την πώληση.", - "token.safety.warning.tokenChargesFee.buy.message": "Το {{tokenSymbol}} χρεώνει μια χρέωση {{feePercent}} κατά την αγορά.", - "token.safety.warning.tokenChargesFee.buy.message.descriptive": "Το {{tokenSymbol}} χρεώνει μια χρέωση {{feePercent}} κατά την αγορά. Η ανταλλαγή του μπορεί να οδηγήσει σε απώλεια χρημάτων. Η Uniswap Labs δεν λαμβάνει καμία από αυτές τις χρεώσεις.", - "token.safety.warning.tokenChargesFee.sell.message": "Το {{tokenSymbol}} χρεώνει {{feePercent}} χρέωση όταν πωλείται.", - "token.safety.warning.tokenChargesFee.sell.message.descriptive": "Το {{tokenSymbol}} χρεώνει μια χρέωση {{feePercent}} κατά την πώληση. Η ανταλλαγή του ενδέχεται να οδηγήσει σε απώλεια χρημάτων. Η Uniswap Labs δεν λαμβάνει καμία από αυτές τις χρεώσεις.", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} χρεώνει μια χρέωση όταν αγοράζεται ή πωλείται.", - "token.safetyLevel.blocked.message": "Δεν μπορείτε να ανταλλάξετε αυτό το διακριτικό χρησιμοποιώντας το Πορτοφόλι Uniswap.", - "token.safetyLevel.medium.message.plural": "Αυτά τα διακριτικά δεν διαπραγματεύονται σε κορυφαία κεντρικά χρηματιστήρια των ΗΠΑ. Πάντα να κάνετε τη δική σας έρευνα πριν προχωρήσετε.", - "token.selector.search.error": "Δεν ήταν δυνατή η φόρτωση των αποτελεσμάτων αναζήτησης", - "token.stats.fullyDilutedValuation": "Πλήρως αραιωμένη αποτίμηση", - "token.stats.marketCap": "Κεφάλαιο αγοράς", - "token.stats.priceHighYear": "Υψηλό 52 W", - "token.stats.priceLowYear": "52W Χαμηλό", - "token.stats.section.about": "Περίπου {{token}}", - "token.stats.title": "Στατιστικά στοιχεία", - "token.stats.translation.original": "Εμφάνιση πρωτότυπου", - "token.stats.translation.translate": "Μετάφραση σε {{language}}", - "token.stats.volume": "Ένταση 24 ωρών", - "token.symbol.input.fallback": "Διακριτικό εισαγωγής", - "token.symbol.output.fallback": "Διακριτικό εξόδου", - "token.wrap.fail.message": "Οι ανταλλαγές στο Πρωτόκολλο Uniswap μπορούν να ξεκινούν και να τελειώνουν με ETH. Ωστόσο, κατά τη διάρκεια της ανταλλαγής, το ETH τυλίγεται σε WETH.", - "token.zeroNativeBalance.description.mainnet": "Θα χρειαστεί να ανταλλάξετε ένα διακριτικό στο Ethereum για να λάβετε {{ tokenSymbol }}. Η ανταλλαγή απαιτεί ETH για το κόστος δικτύου.", - "token.zeroNativeBalance.description.otherChains": "Θα χρειαστεί να ανταλλάξετε ένα διακριτικό στο {{ chainName }} για να λάβετε {{ tokenSymbol }}. Η εναλλαγή απαιτεί {{ chainName }} {{ nativeTokenSymbol }} για το κόστος δικτύου.", - "token.zeroNativeBalance.subtitle": "Το {{ tokenSymbol }} δεν είναι διαθέσιμο για άμεση αγορά.", - "token.zeroNativeBalance.title.mainnet": "Χρειάζεστε {{ nativeTokenName }}", - "token.zeroNativeBalance.title.otherChains": "Χρειάζεστε {{ nativeTokenName }} στο {{ chainName }}", - "tokens.action.hide": "Απόκρυψη διακριτικού", - "tokens.action.unhide": "Κατάργηση απόκρυψης διακριτικού", - "tokens.nfts.action.viewOnExplorer": "Προβολή στο {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "Δεν ήταν δυνατή η φόρτωση της συλλογής NFT", - "tokens.nfts.collection.label.items": "Είδη", - "tokens.nfts.collection.label.owners": "Ιδιοκτήτες", - "tokens.nfts.collection.label.priceFloor": "Πάτωμα", - "tokens.nfts.collection.label.swapVolume": "Ενταση ΗΧΟΥ", - "tokens.nfts.connectEthereumToView": "Συνδέστε ένα πορτοφόλι Ethereum για να δείτε τα NFT σας", - "tokens.nfts.details.contract.address": "Διεύθυνση συμβολαίου", - "tokens.nfts.details.error.load.title": "Δεν ήταν δυνατή η φόρτωση των στοιχείων NFT", - "tokens.nfts.details.network": "Δίκτυο", - "tokens.nfts.details.owner": "Ανήκει", - "tokens.nfts.details.price": "Τρέχουσα τιμή", - "tokens.nfts.details.recentPrice": "Τελευταία τιμή πώλησης", - "tokens.nfts.details.traits": "Χαρακτηριστικά", - "tokens.nfts.empty.description": "Δεν βρέθηκαν NFT", - "tokens.nfts.error.unavailable": "Το περιεχόμενο δεν είναι διαθέσιμο", - "tokens.nfts.hidden.action.hide": "Απόκρυψη NFT", - "tokens.nfts.hidden.action.unhide": "Εμφάνιση απόκρυψης NFT", - "tokens.nfts.link.collection": "Ιστοσελίδα συλλογής", - "tokens.nfts.list.error.load.title": "Δεν ήταν δυνατή η φόρτωση των NFT", - "tokens.nfts.list.none.button": "Λάβετε NFT", - "tokens.nfts.list.none.description.default": "Μεταφέρετε NFT από άλλο πορτοφόλι για να ξεκινήσετε.", - "tokens.nfts.list.none.description.external": "Όταν αυτό το πορτοφόλι αγοράζει ή λαμβάνει NFT, θα εμφανίζονται εδώ.", - "tokens.nfts.list.none.title": "Δεν υπάρχουν NFT ακόμα", - "tokens.nfts.notAvailableOnSolana": "Τα NFT δεν είναι διαθέσιμα στο Solana", - "tokens.selector.button.choose": "Επιλέξτε διακριτικό", - "tokens.selector.empty.buy.message": "Αγοράστε κρυπτογράφηση με κάρτα ή τράπεζα για να στείλετε μάρκες.", - "tokens.selector.empty.buy.title": "Αγοράστε κρυπτογράφηση", - "tokens.selector.empty.receive.title": "Λάβετε μάρκες", - "tokens.selector.empty.title": "Δεν υπάρχουν ακόμη μάρκες", - "tokens.selector.error.load": "Δεν ήταν δυνατή η φόρτωση των διακριτικών", - "tokens.selector.search.empty": "Δεν βρέθηκαν αποτελέσματα για {{searchText}}", - "tokens.selector.search.placeholder": "Αναζήτηση διακριτικών", - "tokens.selector.section.bridging": "Ανταλλαγή μεταξύ δικτύων", - "tokens.selector.section.favorite": "Αγαπημένα", - "tokens.selector.section.otherNetworksSearchResults": "Tokens που βρέθηκαν σε άλλα δίκτυα", - "tokens.selector.section.otherSearchResults": "Άλλα διακριτικά στο {{network}}", - "tokens.selector.section.recent": "Πρόσφατες αναζητήσεις", - "tokens.selector.section.search": "Αποτελέσματα αναζήτησης", - "tokens.selector.section.trending": "Tokens κατά όγκο 24 ωρών", - "tokens.selector.section.yours": "Οι μάρκες σας", - "tokens.table.search.placeholder.pools": "Αναζήτηση πισινών", - "tokens.table.search.placeholder.tokens": "Αναζήτηση διακριτικών", - "tokens.table.search.placeholder.transactions": "Αναζήτηση συναλλαγών", - "toucan.auction.bidConcentration": "Συγκέντρωση Toucan", - "toucan.auction.bidConcentration.tooltip.description": "Περιγραφή εργαλείου Toucan", - "toucan.auction.bidConcentration.tooltip.title": "Τίτλος εργαλείου συμβουλής Toucan", - "toucan.auctions": "Δημοπρασίες", - "toucan.bidForm.maxBudget": "Μέγιστος προϋπολογισμός", - "toucan.bidForm.placeBid": "Υποβάλετε την προσφορά σας", - "toucan.displayMode.tokenPrice": "Τιμή Token", - "toucan.displayMode.valuation": "Αξιολόγηση", - "transaction.action.cancel.button": "Ακύρωση συναλλαγής", - "transaction.action.cancel.description": "Εάν ακυρώσετε αυτήν τη συναλλαγή πριν υποβληθεί σε επεξεργασία από το δίκτυο, θα πληρώσετε ένα νέο κόστος δικτύου αντί για το αρχικό.", - "transaction.action.cancel.title": "Ακύρωση αυτής της συναλλαγής;", - "transaction.action.clear": "Εκκαθάριση σε εκκρεμότητα", - "transaction.action.copy": "Αντιγράψτε το αναγνωριστικό συναλλαγής", - "transaction.action.copyProvider": "Αντιγράψτε το αναγνωριστικό συναλλαγής {{providerName}}", - "transaction.amount.unlimited": "Απεριόριστος", - "transaction.callData": "Δεδομένα κλήσεων", - "transaction.details.dappName": "App", - "transaction.details.from": "Από", - "transaction.details.networkFee": "Κόστος δικτύου", - "transaction.details.networkFee.swap": "Κόστος ανταλλαγής δικτύου", - "transaction.details.providerFee": "Αμοιβή παρόχου", - "transaction.details.swapRate": "Τιμή", - "transaction.details.transaction": "Συναλλαγή", - "transaction.details.uniswapFee": "Χρέωση ({{ feePercent }}%)", - "transaction.network.all": "Όλα τα δίκτυα", - "transaction.networkCost.description": "Το κόστος επεξεργασίας της συναλλαγής σας στο blockchain. Το Uniswap έχει βελτιστοποιηθεί για ελάχιστο κόστος δικτύου.", - "transaction.networkCost.includesSmartWalletActivation": "Περιλαμβάνει ενεργοποίηση έξυπνου πορτοφολιού", - "transaction.networkCost.label": "Κόστος δικτύου", - "transaction.networkCost.maxNativeBalance.description": "Ένα μικρό ποσό του υπολοίπου του διακριτικού δικτύου δεσμεύεται για την κάλυψη του κόστους δικτύου αυτής της συναλλαγής.", - "transaction.networkCost.maxNativeBalance.title": "Γιατί δεν μπορώ να χρησιμοποιήσω το μέγιστο υπόλοιπό μου;", - "transaction.networkCost.veryHigh.label": "Πολύ υψηλό κόστος δικτύου", - "transaction.notification.error.cancel": "Δεν είναι δυνατή η ακύρωση της συναλλαγής", - "transaction.notification.error.replace": "Δεν είναι δυνατή η αντικατάσταση της συναλλαγής", - "transaction.status.approval.canceled": "Η έγκριση ακυρώθηκε", - "transaction.status.approval.failed": "Η έγκριση απέτυχε", - "transaction.status.approve.canceled": "Ακυρώθηκε η έγκριση", - "transaction.status.approve.canceling": "Ακύρωση έγκρισης", - "transaction.status.approve.failed": "Αποτυχία έγκρισης", - "transaction.status.approve.pending": "Έγκριση", - "transaction.status.approve.success": "Εγκρίθηκε", - "transaction.status.approve.successDapp": "Εγκρίθηκε στις {{externalDappName}}", - "transaction.status.buy.canceled": "Ακυρώθηκε η αγορά", - "transaction.status.buy.canceling": "Ακύρωση αγοράς", - "transaction.status.buy.failed": "Αποτυχία αγοράς", - "transaction.status.buy.pending": "Εξαγορά", - "transaction.status.buy.success": "Αγορασμένος", - "transaction.status.buy.successDapp": "Αγοράστηκε στις {{externalDappName}}", - "transaction.status.claim.canceled": "Η είσπραξη τελών ακυρώθηκε.", - "transaction.status.claim.canceling": "Ακύρωση είσπραξης τελών", - "transaction.status.claim.failed": "Η είσπραξη τελών απέτυχε.", - "transaction.status.claim.pending": "Είσπραξη τελών", - "transaction.status.claim.success": "Εισπραχθέντα τέλη", - "transaction.status.collect.fees.canceled": "Η είσπραξη τελών ακυρώθηκε.", - "transaction.status.collect.fees.failed": "Η συλλογή τελών απέτυχε", - "transaction.status.collected.fees": "Εισπραχθέντα τέλη", - "transaction.status.collecting.fees": "Είσπραξη τελών", - "transaction.status.confirm.canceled": "Ακυρώθηκε η επιβεβαίωση", - "transaction.status.confirm.canceling": "Εκκρεμεί ακύρωση", - "transaction.status.confirm.failed": "Η επιβεβαίωση απέτυχε", - "transaction.status.confirm.pending": "Συναλλαγή σε εξέλιξη", - "transaction.status.confirm.success": "Η συναλλαγή επιβεβαιώθηκε", - "transaction.status.confirm.successDapp": "Η συναλλαγή επιβεβαιώθηκε στις {{externalDappName}}", - "transaction.status.createPair.canceled": "Ακυρώθηκε η δημιουργία ζεύγους", - "transaction.status.createPair.canceling": "Ακύρωση δημιουργίας ζεύγους", - "transaction.status.createPair.failed": "Η δημιουργία ζεύγους απέτυχε", - "transaction.status.createPair.pending": "Δημιουργία ζεύγους", - "transaction.status.createPair.success": "Δημιουργήθηκε ζεύγος", - "transaction.status.createPool.canceled": "Ακυρώθηκε η δημιουργία πισίνας", - "transaction.status.createPool.canceling": "Ακύρωση δημιουργίας πισίνας", - "transaction.status.createPool.failed": "Η δημιουργία ομάδας απέτυχε", - "transaction.status.createPool.pending": "Δημιουργία πισίνας", - "transaction.status.createPool.success": "Δημιουργήθηκε πισίνα", - "transaction.status.liquidityDecrease.canceled": "Η κατάργηση της ρευστότητας ακυρώθηκε", - "transaction.status.liquidityDecrease.canceling": "Ακύρωση αφαίρεσης ρευστότητας", - "transaction.status.liquidityDecrease.failed": "Η αφαίρεση ρευστότητας απέτυχε", - "transaction.status.liquidityDecrease.pending": "Αφαίρεση ρευστότητας", - "transaction.status.liquidityDecrease.success": "Καταργήθηκε η ρευστότητα", - "transaction.status.liquidityIncrease.canceled": "Η προσθήκη ρευστότητας ακυρώθηκε.", - "transaction.status.liquidityIncrease.canceling": "Ακύρωση της πρόσθετης ρευστότητας", - "transaction.status.liquidityIncrease.failed": "Η προσθήκη ρευστότητας απέτυχε", - "transaction.status.liquidityIncrease.pending": "Προσθήκη ρευστότητας", - "transaction.status.liquidityIncrease.success": "Προστέθηκε ρευστότητα", - "transaction.status.lpIncentivesClaim.canceled": "Ακυρωμένη αξίωση ανταμοιβών LP", - "transaction.status.lpIncentivesClaim.canceling": "Ακύρωση αξίωσης ανταμοιβών LP", - "transaction.status.lpIncentivesClaim.failed": "Αποτυχία διεκδίκησης ανταμοιβών LP", - "transaction.status.lpIncentivesClaim.pending": "Διεκδίκηση ανταμοιβών LP", - "transaction.status.lpIncentivesClaim.success": "Διεκδικημένες ανταμοιβές LP", - "transaction.status.migrateLiquidity.canceled": "Η μετεγκατάσταση ρευστότητας ακυρώθηκε", - "transaction.status.mint.canceled": "Ακυρωμένη μέντα", - "transaction.status.mint.canceling": "Ακύρωση μέντας", - "transaction.status.mint.failed": "Αποτυχία κοπής", - "transaction.status.mint.pending": "Νομισματοκοπείο", - "transaction.status.mint.success": "Κοπή", - "transaction.status.mint.successDapp": "Κόπηκε στις {{externalDappName}}", - "transaction.status.offramp.canceled": "Η έξοδος από την ράμπα ακυρώθηκε", - "transaction.status.offramp.failed": "Η έξοδος από την ράμπα απέτυχε", - "transaction.status.offramp.pending": "Απόκλιση", - "transaction.status.offramp.success": "Εκτός ράμπας", - "transaction.status.onramp.canceled": "Το Onramp ακυρώθηκε", - "transaction.status.onramp.failed": "Η Onramp απέτυχε", - "transaction.status.onramp.pending": "Ενίσχυση", - "transaction.status.onramp.success": "Εντός ράμπας", - "transaction.status.permit.approved": "Η άδεια εγκρίθηκε", - "transaction.status.permit.canceled": "Η άδεια του Τέξας ακυρώθηκε", - "transaction.status.permit.failed": "Η άδεια απέτυχε", - "transaction.status.purchase.canceled": "Ακυρώθηκε η αγορά", - "transaction.status.purchase.canceling": "Ακύρωση αγοράς", - "transaction.status.purchase.failed": "Η αγορά απέτυχε", - "transaction.status.purchase.failedOn": "Η αγορά απέτυχε στις {{serviceProvider}}", - "transaction.status.purchase.pending": "Αγοραστικός", - "transaction.status.purchase.pendingOn": "Αγορά στις {{serviceProvider}}", - "transaction.status.purchase.successOn": "Αγορασμένο στις {{serviceProvider}}", - "transaction.status.receive.canceled": "Ακυρώθηκε η λήψη", - "transaction.status.receive.canceling": "Ακύρωση λήψης", - "transaction.status.receive.failed": "Η λήψη απέτυχε", - "transaction.status.receive.failedFrom": "Αποτυχία λήψης από {{serviceProvider}}", - "transaction.status.receive.pending": "Παραλαβή", - "transaction.status.receive.pendingFrom": "Παραλαβή από {{serviceProvider}}", - "transaction.status.receive.success": "Ελήφθη", - "transaction.status.receive.successDapp": "Παραλήφθηκε στις {{externalDappName}}", - "transaction.status.receive.successFrom": "Λήψη από {{serviceProvider}}", - "transaction.status.removeDelegation.canceled": "Η κατάργηση της ανάθεσης εργασίας ακυρώθηκε.", - "transaction.status.removeDelegation.failed": "Η κατάργηση της ανάθεσης εργασίας απέτυχε.", - "transaction.status.removeDelegation.pending": "Κατάργηση ανάθεσης", - "transaction.status.removeDelegation.success": "Καταργήθηκε η ανάθεση", - "transaction.status.revoke.canceled": "Ακυρώθηκε η ανάκληση", - "transaction.status.revoke.canceling": "Ακύρωση ανάκλησης", - "transaction.status.revoke.failed": "Η ανάκληση απέτυχε", - "transaction.status.revoke.pending": "Ανάκληση", - "transaction.status.revoke.success": "Ανακλήθηκε", - "transaction.status.revoke.successDapp": "Ανακλήθηκε στις {{externalDappName}}", - "transaction.status.sale.canceled": "Ακυρώθηκε η πώληση", - "transaction.status.sale.canceling": "Ακύρωση πώλησης", - "transaction.status.sale.failedOn": "Η πώληση απέτυχε μέσω {{serviceProvider}}", - "transaction.status.sale.pendingCard.msg": "Μάθετε περισσότερα σχετικά με την πώληση κρυπτογράφησης.", - "transaction.status.sale.pendingCard.title": "Γιατί εκκρεμεί ακόμη η πώλησή μου;", - "transaction.status.sale.pendingOn": "Πώληση μέσω {{serviceProvider}}", - "transaction.status.sale.successOn": "Πωλείται μέσω {{serviceProvider}}", - "transaction.status.sell.canceled": "Ακυρώθηκε η πώληση", - "transaction.status.sell.canceling": "Ακύρωση πώλησης", - "transaction.status.sell.failed": "Αποτυχία πώλησης", - "transaction.status.sell.pending": "Πώληση", - "transaction.status.sell.success": "Πωληθεί", - "transaction.status.sell.successDapp": "Πωλήθηκε στις {{externalDappName}}", - "transaction.status.send.canceled": "Ακυρώθηκε η αποστολή", - "transaction.status.send.canceling": "Ακύρωση αποστολής", - "transaction.status.send.failed": "Αποτυχία αποστολής", - "transaction.status.send.pending": "Αποστολή", - "transaction.status.send.success": "Απεσταλμένα", - "transaction.status.send.successDapp": "Στάλθηκε στις {{externalDappName}}", - "transaction.status.swap.canceled": "Η ανταλλαγή ακυρώθηκε", - "transaction.status.swap.canceling": "Ακύρωση ανταλλαγής", - "transaction.status.swap.expired": "Η ανταλλαγή έληξε", - "transaction.status.swap.failed": "Η εναλλαγή απέτυχε", - "transaction.status.swap.insufficientFunds": "Ανεπαρκείς πόροι", - "transaction.status.swap.pending": "Ανταλλαγή", - "transaction.status.swap.success": "Ανταλλάχθηκε", - "transaction.status.swap.successDapp": "Ανταλλάχθηκε στις {{externalDappName}}", - "transaction.status.unwrap.canceled": "Ακυρώθηκε το ξετύλιγμα", - "transaction.status.unwrap.canceling": "Ακύρωση ξετυλίγματος", - "transaction.status.unwrap.failed": "Αποτυχία ξετυλίγματος", - "transaction.status.unwrap.pending": "Ξετύλιγμα", - "transaction.status.unwrap.success": "Ξετυλιγμένο", - "transaction.status.unwrap.successDapp": "Ξετυλιγμένο σε {{externalDappName}}", - "transaction.status.wrap.canceled": "Ακυρώθηκε το περιτύλιγμα", - "transaction.status.wrap.canceling": "Ακύρωση περιτύλιξης", - "transaction.status.wrap.failed": "Αποτυχία αναδίπλωσης", - "transaction.status.wrap.pending": "Τύλιγμα", - "transaction.status.wrap.success": "Τυλιγμένο", - "transaction.status.wrap.successDapp": "Τυλιγμένο σε {{externalDappName}}", - "transaction.submittedOn": "Υποβλήθηκε στις", - "transaction.summary.liquidity": "{{firstAmountWithSymbol}} και {{secondAmountWithSymbol}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} έως {{recipientAddress}}", - "transaction.summary.received.noAmount": "Λήφθηκε από {{name}}", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} από {{senderAddress}}", - "transaction.summary.sent.noAmount": "Απεστάλη σε {{name}}", - "transaction.warning.insufficientGas.modal.message": "Χρειάζεστε ~{{tokenAmount}} {{tokenSymbol}} () στις {{networkName}} για να καλύψετε το κόστος δικτύου αυτής της συναλλαγής. Αλλάξτε {{tokenSymbol}} από άλλη αλυσίδα ή αγοράστε με την κάρτα σας για να συνεχίσετε.", - "transaction.warning.insufficientGas.modal.message.noAction": "Χρειάζεστε ~{{tokenAmount}} {{tokenSymbol}} () στις {{networkName}} για να καλύψετε το κόστος δικτύου αυτής της συναλλαγής.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount": "Χρειάζεστε ~{{tokenAmount}} {{tokenSymbol}} () στις {{networkName}} για να καλύψετε το κόστος δικτύου αυτής της συναλλαγής.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount.noAction": "Για να αλλάξετε με αυτό το διακριτικό, χρειάζεστε περισσότερα {{tokenSymbol}} στο {{networkName}}.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "Δεν είναι αρκετό {{tokenSymbol}} στο {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Δεν αρκεί {{tokenSymbol}}", - "transaction.warning.maxNative.message": "Πρόκειται να ξοδέψετε το μεγαλύτερο μέρος του υπολοίπου διακριτικού δικτύου σας. Αυτό μπορεί να αφήσει ανεπαρκή κεφάλαια για την κάλυψη μελλοντικών δαπανών δικτύου.", - "transaction.warning.maxNative.title": "Χαμηλό υπόλοιπο διακριτικών δικτύου", - "transaction.watcher.error.cancel": "Δεν είναι δυνατή η ακύρωση της συναλλαγής", - "transaction.watcher.error.status": "Σφάλμα κατά τον έλεγχο της κατάστασης συναλλαγής", - "uniswapX.aggregatesLiquidity": " συγκεντρώνει πηγές ρευστότητας για καλύτερες τιμές και ανταλλαγές χωρίς φυσικό αέριο.", - "uniswapX.cost": "Το UniswapX καταργεί το τυπικό κόστος για συναλλαγές στο blockchain.", - "uniswapx.description": "Το UniswapX συγκεντρώνει πηγές ρευστότητας για καλύτερες τιμές και ανταλλαγές χωρίς φυσικό αέριο.", - "uniswapx.description.unsupported": "Το UniswapX δεν είναι διαθέσιμο αυτήν τη στιγμή, επειδή οι ρυθμίσεις του έξυπνου πορτοφολιού σας διαχειρίζονται από διαφορετική εφαρμογή πορτοφολιού.", - "uniswapx.included": "Περιλαμβάνει UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "Μάθετε περισσότερα σχετικά με την ανταλλαγή με το UniswapX", - "uniswapx.unavailable.title": "Το UniswapX δεν είναι διαθέσιμο", - "uniswapx.v2QuoteFailed": "Η σκληρή προσφορά UniswapX v2 απέτυχε. Δοκιμάστε ξανά με την κλασική εναλλαγή.", - "unitags.banner.button.claim": "Διεκδικήστε τώρα", - "unitags.banner.subtitle": "Δημιουργήστε ένα εξατομικευμένο προφίλ web3 και μοιραστείτε εύκολα τη διεύθυνσή σας με φίλους.", - "unitags.banner.title.compact": "Διεκδικήστε το όνομα χρήστη σας {{unitagDomain}} και δημιουργήστε το προσαρμόσιμο προφίλ σας.", - "unitags.banner.title.full": "Διεκδικήστε το όνομα χρήστη σας {{unitagDomain}}", - "unitags.choosePhoto.option.cameraRoll": "Επιλέξτε από το ρολό της κάμερας", - "unitags.choosePhoto.option.computer": "Μεταφόρτωση από υπολογιστή", - "unitags.choosePhoto.option.nft": "Επιλέξτε ένα NFT", - "unitags.choosePhoto.option.remove": "Αφαίρεση εικόνας προφίλ", - "unitags.claim.available": "Διαθέσιμος", - "unitags.claim.confirmation.customize": "Προσαρμογή προφίλ", - "unitags.claim.confirmation.description": "Το {{unitagAddress}} είναι έτοιμο για αποστολή και λήψη κρυπτογράφησης. Συνεχίστε να δημιουργείτε το πορτοφόλι σας προσαρμόζοντας το προφίλ σας στο web3.", - "unitags.claim.confirmation.success.long": "Το έχεις!", - "unitags.claim.confirmation.success.short": "Το έπιασα!", - "unitags.claim.error.addressLimit": "Έχετε ήδη πραγματοποιήσει τον μέγιστο αριθμό αλλαγών στο όνομα χρήστη σας για αυτήν τη διεύθυνση", - "unitags.claim.error.avatar": "Δεν ήταν δυνατός ο ορισμός του avatar. Δοκιμάστε ξανά αργότερα.", - "unitags.claim.error.default": "Δεν ήταν δυνατή η αξίωση ονόματος χρήστη. Δοκιμάστε ξανά αργότερα.", - "unitags.claim.error.deviceLimit": "Έχετε φτάσει στον μέγιστο αριθμό ονομάτων χρήστη που μπορούν να είναι ενεργά για αυτήν τη συσκευή", - "unitags.claim.error.general": "Δεν είναι δυνατή η αξίωση ονόματος χρήστη", - "unitags.claim.error.unavailable": "Αυτό το όνομα χρήστη δεν είναι διαθέσιμο", - "unitags.claim.error.unknown": "Αγνωστο σφάλμα", - "unitags.claim.username.default": "το όνομα σου", - "unitags.delete.confirm.subtitle": "Πρόκειται να διαγράψετε το όνομα χρήστη και τα προσαρμόσιμα στοιχεία του προφίλ σας. Δεν θα μπορέσετε να το διεκδικήσετε ξανά.", - "unitags.delete.confirm.title": "Είσαι σίγουρος;", - "unitags.editProfile.placeholder": "όνομα χρήστη", - "unitags.editUsername.confirm.subtitle": "Πρόκειται να αλλάξετε το όνομα χρήστη σας. Μόλις το αλλάξετε, δεν μπορείτε ποτέ να το διεκδικήσετε ξανά.", - "unitags.editUsername.confirm.title": "Είσαι σίγουρος;", - "unitags.editUsername.title": "Επεξεργαστείτε το όνομα χρήστη σας", - "unitags.editUsername.warning.default": "Μόλις αλλάξετε το όνομα χρήστη σας, δεν μπορείτε ποτέ να το διεκδικήσετε ξανά. Μπορείτε να το αλλάξετε μόνο 2 φορές.", - "unitags.editUsername.warning.max": "Έχετε συμπληρώσει τον μέγιστο αριθμό 2 αλλαγών ονομάτων χρήστη.", - "unitags.extension.intro.buttton": "Διεκδικήστε ένα όνομα χρήστη", - "unitags.extension.intro.description": "Πείτε αντίο σε διευθύνσεις 0x. Τα ονόματα χρήστη είναι ευανάγνωστα ονόματα που διευκολύνουν την αποστολή και λήψη κρυπτογράφησης.", - "unitags.extension.intro.title": "Παρουσίαση ονομάτων χρήστη", - "unitags.extension.intro.upsell.customizable": "Προσαρμόσιμα προφίλ", - "unitags.extension.intro.upsell.ens": "Τροφοδοτείται από υποτομείς ENS", - "unitags.extension.intro.upsell.free": "Δωρεάν διεκδίκηση", - "unitags.intro.features.ens": "Τροφοδοτείται από υποτομείς ENS", - "unitags.intro.features.free": "Δωρεάν διεκδίκηση", - "unitags.intro.features.profile": "Προσαρμόσιμα προφίλ", - "unitags.intro.subtitle": "Πείτε αντίο σε διευθύνσεις 0x. Τα ονόματα χρήστη είναι ευανάγνωστα ονόματα που διευκολύνουν την αποστολή και λήψη κρυπτογράφησης.", - "unitags.intro.title": "Παρουσίαση ονομάτων χρήστη", - "unitags.notification.delete.error": "Δεν ήταν δυνατή η διαγραφή του ονόματος χρήστη. Δοκιμάστε ξανά αργότερα.", - "unitags.notification.delete.title": "Το όνομα χρήστη διαγράφηκε", - "unitags.notification.profile.error": "Δεν ήταν δυνατή η ενημέρωση του προφίλ. Δοκιμάστε ξανά αργότερα.", - "unitags.notification.profile.title": "Το προφιλ ενημερωθηκε", - "unitags.notification.username.error": "Δεν ήταν δυνατή η αλλαγή του ονόματος χρήστη. Δοκιμάστε ξανά αργότερα.", - "unitags.notification.username.title": "Το όνομα χρήστη άλλαξε", - "unitags.onboarding.claim.subtitle": "Αυτή είναι η εξατομικευμένη διεύθυνσή σας στην οποία οι άνθρωποι μπορούν να στείλουν κρυπτογράφηση.", - "unitags.onboarding.claim.title.choose": "Δημιουργήστε το όνομα χρήστη σας", - "unitags.onboarding.claim.title.claim": "Διεκδικήστε το όνομα χρήστη σας", - "unitags.onboarding.info.description": "Τα ονόματα χρήστη μετατρέπουν σύνθετες διευθύνσεις 0x σε ευανάγνωστα ονόματα. Με την αξίωση ενός ονόματος χρήστη {{unitagDomain}} , μπορείτε εύκολα να στείλετε και να λάβετε κρυπτογράφηση και να δημιουργήσετε ένα δημόσιο προφίλ web3.", - "unitags.onboarding.info.title": "Μια απλοποιημένη διεύθυνση", - "unitags.onboarding.profile.subtitle": "Ανεβάστε το δικό σας ή κολλήστε με το μοναδικό σας Unicon. Μπορείτε πάντα να το αλλάξετε αργότερα.", - "unitags.onboarding.profile.title": "Επιλέξτε μια φωτογραφία προφίλ", - "unitags.profile.action.delete": "Διαγραφή ονόματος χρήστη", - "unitags.profile.action.edit": "Επεξεργασία ονόματος χρήστη", - "unitags.profile.bio.label": "Bio", - "unitags.profile.bio.placeholder": "Πληκτρολογήστε ένα βιογραφικό για το προφίλ σας", - "unitags.profile.links.twitter": "Κελάδημα", - "unitags.username.error.chars": "Τα ονόματα χρήστη μπορούν να περιέχουν μόνο γράμματα και αριθμούς", - "unitags.username.error.max": "Τα ονόματα χρήστη δεν μπορούν να υπερβαίνουν τους {{number}} χαρακτήρες", - "unitags.username.error.min": "Τα ονόματα χρήστη πρέπει να είναι τουλάχιστον {{number}} χαρακτήρες", - "unitags.username.error.uppercase": "Τα ονόματα χρήστη μπορούν να περιέχουν μόνο πεζά γράμματα και αριθμούς", - "uwulink.error.insufficientTokens": "Δεν είναι αρκετό {{tokenSymbol}} στο {{chain}}", - "v2.notAvailable": "Το Uniswap V2 δεν είναι διαθέσιμο σε αυτό το δίκτυο.", - "wallet.appSignIn": "Συνδεθείτε με την εφαρμογή", - "wallet.connectingAgreement": "Με τη σύνδεση ενός πορτοφολιού, συμφωνείτε με τους Όρους Παροχής Υπηρεσιών της Uniswap Labs και συναινείτε στην Πολιτική Απορρήτου.", - "wallet.connectionFailed.message": "Η προσπάθεια σύνδεσης απέτυχε. Δοκιμάστε ξανά, ακολουθώντας τα βήματα για να συνδεθείτε στο πορτοφόλι σας.", - "wallet.mismatch.popup.description": "Ορισμένες λειτουργίες δεν υποστηρίζονται από το συνδεδεμένο πορτοφόλι σας.", - "wallet.mismatch.popup.title": "Περιορισμένη υποστήριξη πορτοφολιού", - "wallet.other": "Άλλα πορτοφόλια", - "wallet.scanToConnect": "Σαρώστε τον κωδικό QR για να συνδεθείτε", - "wallet.wrongNet": "Το πορτοφόλι σας είναι συνδεδεμένο σε λάθος δίκτυο.", - "walletConnect.dapps.empty.description": "Συνδεθείτε σε μια εφαρμογή σαρώνοντας έναν κωδικό μέσω του WalletConnect", - "walletConnect.dapps.manage.empty.title": "Δεν υπάρχουν συνδεδεμένες εφαρμογές", - "walletConnect.dapps.manage.title": "Συνδέσεις", - "walletConnect.error.connection.message": "Το Uniswap Wallet υποστηρίζει αυτήν τη στιγμή {{chainNames}}. Χρησιμοποιήστε μόνο \"{{dappName}}\" σε αυτές τις αλυσίδες", - "walletConnect.error.connection.title": "Σφάλμα σύνδεσης", - "walletConnect.error.general.message": "Παρουσιάστηκε πρόβλημα με το WalletConnect. ΠΑΡΑΚΑΛΩ προσπαθησε ξανα", - "walletConnect.error.general.title": "Σφάλμα WalletConnect", - "walletConnect.error.scantastic.message": "Παρουσιάστηκε πρόβλημα με τον κωδικό QR σας. ΠΑΡΑΚΑΛΩ προσπαθησε ξανα", - "walletConnect.error.scantastic.title": "Μη έγκυρος κωδικός QR", - "walletConnect.error.unsupported.message": "Βεβαιωθείτε ότι σαρώνετε έναν έγκυρο κωδικό QR WalletConnect, διεύθυνση Ethereum ή Uniswap επέκτασης προτού προσπαθήσετε ξανά.", - "walletConnect.error.unsupported.title": "Μη έγκυρος κωδικός QR", - "walletConnect.error.unsupportedV1.message": "Το WalletConnect v1 δεν υποστηρίζεται πλέον. Η εφαρμογή στην οποία προσπαθείτε να συνδεθείτε πρέπει να αναβαθμιστεί στο WalletConnect v2.", - "walletConnect.error.unsupportedV1.title": "Μη έγκυρος κωδικός QR", - "walletConnect.error.uwu.scan": "Παρουσιάστηκε πρόβλημα με τη σάρωση αυτού του κωδικού QR.", - "walletConnect.error.uwu.title": "Σφάλμα σύνδεσης UwU", - "walletConnect.error.uwu.unsupported": "Αυτός ο κωδικός QR δεν υποστηρίζεται.", - "walletConnect.pending.button.connect": "Συνδέω-συωδεομαι", - "walletConnect.pending.button.reject": "Απορρίπτω", - "walletConnect.pending.button.scrollDown": "Κάντε κύλιση προς τα κάτω για να συνδεθείτε", - "walletConnect.pending.threat.confirmationText": "Κατανοώ τους κινδύνους", - "walletConnect.pending.threat.description": "Η υπογραφή μηνυμάτων ή συναλλαγών από αυτήν την εφαρμογή θα μπορούσε να οδηγήσει σε απώλεια χρημάτων.", - "walletConnect.pending.threat.title": "Εντοπίστηκε κακόβουλη εφαρμογή", - "walletConnect.pending.title": "Συνδεθείτε στο {{dappName}}", - "walletConnect.pending.unverified.description": "Βεβαιωθείτε ότι εμπιστεύεστε αυτόν τον ιστότοπο πριν προχωρήσετε. ", - "walletConnect.pending.unverified.title": "Μη επαληθευμένη εφαρμογή", - "walletConnect.permissions.option.requestApprovals": "Αίτημα εγκρίσεων συναλλαγών", - "walletConnect.permissions.option.transferAssets": "Move funds without permission", - "walletConnect.permissions.option.viewTokenBalances": "View your balance and activity", - "walletConnect.permissions.title": "App permissions", - "walletConnect.request.bundledTransactions.label_one": "Μοναδική συναλλαγή", - "walletConnect.request.bundledTransactions.label_other": "{{count}} ομαδοποιημένες συναλλαγές", - "walletConnect.request.button.scrollDown": "Κάντε κύλιση προς τα κάτω για να υπογράψετε", - "walletConnect.request.button.sign": "Σημάδι", - "walletConnect.request.details.label.function": "Λειτουργία", - "walletConnect.request.details.label.sending": "Αποστολή", - "walletConnect.request.details.label.token": "Ενδειξη", - "walletConnect.request.details.label.tokens": "Μαρτυρίες", - "walletConnect.request.error.insufficientFunds": "Δεν έχετε αρκετό {{currencySymbol}} για να ολοκληρώσετε αυτήν τη συναλλαγή.", - "walletConnect.request.error.network": "Σφάλμα σύνδεσης στο Διαδίκτυο ή στο δίκτυο", - "walletConnect.request.warning.batch.message": "Προσοχή: αυτό το αίτημα περιέχει πολλαπλές συναλλαγές και μπορεί να μεταφέρει περιουσιακά στοιχεία", - "walletConnect.request.warning.general.message": "Προσοχή: αυτό το μήνυμα ενδέχεται να μεταφέρει στοιχεία", - "walletConnect.request.warning.message": "Για να υπογράψετε μηνύματα ή συναλλαγές, θα πρέπει να εισαγάγετε τη φράση ανάκτησης του πορτοφολιού.", - "walletConnect.request.warning.title": "Αυτό το πορτοφόλι βρίσκεται σε λειτουργία μόνο προβολής", - "web.explore.description": "Ανακαλύψτε και ερευνήστε διακριτικά στο {{network}}. Εξερευνήστε κορυφαίες πισίνες. Δείτε τιμές σε πραγματικό χρόνο, όγκο συναλλαγών, TVL, γραφήματα και δεδομένα συναλλαγών.", - "web.explore.title.pools": "Εξερευνήστε κορυφαίες πισίνες στο {{network}} στο Uniswap", - "web.explore.title.tokens": "Εξερευνήστε κορυφαία διακριτικά στο {{network}} στο Uniswap", - "web.explore.title.transactions": "Εξερευνήστε κορυφαίες συναλλαγές στο {{network}} στο Uniswap" -} diff --git a/packages/uniswap/src/i18n/locales/translations/es-ES.json b/packages/uniswap/src/i18n/locales/translations/es-ES.json index d7c2473c9d3..238881e0a4e 100644 --- a/packages/uniswap/src/i18n/locales/translations/es-ES.json +++ b/packages/uniswap/src/i18n/locales/translations/es-ES.json @@ -30,7 +30,6 @@ "account.drawer.modal.body": "Almacena e intercambia tokens de forma segura con la app de Uniswap. Disponible en iOS y Android.", "account.drawer.modal.dont": "¿No tienes una Uniswap Wallet?", "account.drawer.modal.scan": "Escanear con Uniswap Wallet", - "account.drawer.spamToggle": "Ocultar tokens desconocidos y NFT", "account.passkey.delete.acknowledge": "Hice una copia de seguridad de mi frase de recuperación y entiendo que Uniswap Labs no puede ayudarme a recuperar mi billetera si yo no pude hacerlo.", "account.passkey.delete.description": "Asegúrate de haber hecho una copia de seguridad de tu frase de recuperación mediante la app de Uniswap para dispositivos móviles o la extensión del navegador.", "account.passkey.delete.descriptionEmphasized": "Sin tu frase de recuperación, es posible que no puedas acceder a tu billetera.", @@ -115,6 +114,7 @@ "account.wallet.watch.placeholder": "ENS o dirección", "account.wallet.watch.title": "Ingresa una dirección de billetera", "activity.pending": "{{pendingActivityCount}} pendiente", + "activity.recentActivity": "Recent activity", "activity.transaction.lpRewards.descriptor": "Se cobraron {{symbol}} recompensas", "activity.transaction.send.descriptor": "{{amountWithSymbol}} a {{walletAddress}}", "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} para {{amountWithSymbolB}}", @@ -144,15 +144,15 @@ "bridgedAsset.send.warning.description": "Estás enviando una versión envuelta de {{currencySymbol}} en {{chainName}}. Enviarla a un exchange centralizado provocará una pérdida permanente de fondos.", "bridgedAsset.send.warning.title": "Asegúrate de que estés haciendo el envío a una dirección compatible", "bridgedAsset.tdp.description": "Esta es una versión con puente de {{currencySymbol}} que está respaldada 1:1 por {{currencySymbol}} nativo.", - "bridgedAsset.wormhole.button": "Continuar a Wormhole", - "bridgedAsset.wormhole.description": "Continúa hacia el portal de Wormhole para transferir con puente tus {{currencySymbol}} desde {{chainName}} a {{nativeChainName}}.", + "bridgedAsset.wormhole.button": "Continue to {{provider}}", + "bridgedAsset.wormhole.description": "Continue to the {{provider}} portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", "bridgedAsset.wormhole.title": "Retirar {{currencySymbol}} a {{nativeChainName}}", "bridgedAsset.wormhole.toNativeChain": "a {{nativeChainName}}", "bridgedAsset.wormhole.withdrawToNativeChain": "Retirar a {{nativeChainName}}", "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} min {{seconds}} s", "bridging.estimatedTime.minutesOnly": "~{{minutes}} min", "bridging.estimatedTime.secondsOnly": "~{{seconds}} s", - "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XPL, ZEC — now available on Unichain.", "chart.candlestick": "Gráfico de velas", "chart.error.pools": "No se pueden mostrar los datos históricos del fondo actual.", "chart.error.tokens": "No se pueden mostrar los datos históricos del token actual.", @@ -257,6 +257,7 @@ "common.button.unlock": "Desbloquear", "common.button.view": "Ver", "common.button.viewDetails": "Ver detalles", + "common.button.viewMore": "View more", "common.button.yes": "Sí", "common.buy.label": "Comprar", "common.buyAndSell": "Compra y vende en Uniswap", @@ -370,6 +371,7 @@ "common.input.noRecipient.error": "Seleccionar destinatario", "common.input.password.confirm": "Confirmar contraseña", "common.input.password.error.mismatch": "Las contraseñas no coinciden", + "common.input.password.error.same": "New password must be different from current password", "common.input.password.error.weak": "Esta contraseña es demasiado débil", "common.input.password.new": "Nueva contraseña", "common.input.password.placeholder": "Contraseña", @@ -503,6 +505,7 @@ "common.remove.liquidity.canceled": "Se canceló la eliminación de la liquidez", "common.remove.liquidity.failed": "Falló la eliminación de la liquidez", "common.removing.liquidity": "Eliminando liquidez", + "common.reported": "Reported", "common.resetLimit": "Restablecer el límite de {{symbol}}", "common.resetLimitWallet": "Restablecer el límite de {{symbol}} en la billetera", "common.resettingLimit": "Restableciendo el límite de {{symbol}}…", @@ -532,6 +535,7 @@ "common.status": "Estado", "common.step.number": "Paso {{number}}", "common.step.number.of": "Paso {{current}} de {{total}}", + "common.submit": "Submit", "common.swap": "Intercambiar", "common.swap.expired": "Venció el intercambio", "common.swap.failed": "Falló el intercambio", @@ -797,6 +801,7 @@ "fee.tier.create": "Crear nivel de comisión", "fee.tier.create.button": "Crear nuevo nivel de comisión", "fee.tier.create.description": "Si creas un nuevo nivel, se iniciará en un fondo nuevo y tendrá costos de la red más altos de lo habitual.", + "fee.tier.default": "-- fee tier", "fee.tier.description": "El monto ganado por proveer liquidez. Elige un monto que se adapte a tu tolerancia al riesgo y a tu estrategia.", "fee.tier.description.v2": "El monto ganado por proveer liquidez. Todos los fondos v2 tienen una comisión fija del 0.3 %. Para conocer más opciones, brinda liquidez en v4.", "fee.tier.dynamic": "Nivel de comisión dinámica", @@ -884,9 +889,9 @@ "hero.swap.title": "Haz intercambios en cualquier momento
y en cualquier lugar.", "hidden.nfts.info.banner.text": "Obtén más información sobre los NFT ocultos", "hidden.nfts.info.text.button": "NFT ocultos ({{numHidden}})", - "hidden.nfts.info.text.extension": "Son posibles estafas y NFT que ocultaste. Puedes hacer clic con el botón derecho sobre un NFT para mostrarlo.", "hidden.nfts.info.text.mobile": "Son posibles estafas y NFT que ocultaste. Puedes mantener presionado un NFT para mostrarlo.", "hidden.nfts.info.text.title": "NFT ocultos", + "hidden.nfts.info.text.web": "These are potential scams and NFTs you’ve hidden. You can click on an NFT to unhide it.", "hidden.tokens.info.banner.text": "Obtén más información sobre los tokens ocultos", "hidden.tokens.info.text.button": "Tokens ocultos ({{numHidden}})", "hidden.tokens.info.text.info": "Son posibles estafas, saldos pequeños y tokens que ocultaste. Los tokens ocultos no están incluidos en el saldo total de la billetera.", @@ -957,32 +962,16 @@ "landing.uniswapX.subtitle": "Intercambios más inteligentes, sin fricciones.", "landing.walletBody": "La billetera y extensión de criptomonedas de autocustodia de confianza con millones de descargas, asistencia de humanos reales y una calificación de 4.8 .", "landing.walletSubtitle": "Intercambia, almacena, explora.", - "language.afrikaans": "Afrikáans", - "language.arabic": "Árabe", - "language.catalan": "Catalán", "language.chineseSimplified": "Chino simplificado", "language.chineseTraditional": "Chino tradicional", - "language.czech": "Checo", - "language.danish": "Danés", "language.dutch": "Neerlandés", "language.english": "Inglés", - "language.finnish": "Finlandés", "language.french": "Francés", - "language.greek": "Griego", - "language.hebrew": "Hebreo", - "language.hindi": "Hindi", - "language.hungarian": "Húngaro", "language.indonesian": "Indonesio", - "language.italian": "Italiano", "language.japanese": "Japonés", "language.korean": "Coreano", - "language.malay": "Malayo", - "language.norwegian": "Noruego", - "language.polish": "Polaco", "language.portuguese": "Portugués", - "language.romanian": "Rumano", "language.russian": "Ruso", - "language.serbian": "Serbio", "language.spanishArgentina": "Español (Argentina)", "language.spanishBelize": "Español (Belice)", "language.spanishBolivia": "Español (Bolivia)", @@ -1006,11 +995,7 @@ "language.spanishUruguay": "Español (Uruguay)", "language.spanishUs": "Español (Estados Unidos)", "language.spanishVenezuela": "Español (Venezuela)", - "language.swahili": "Suajili", - "language.swedish": "Sueco", "language.turkish": "Turco", - "language.ukrainian": "Ucraniano", - "language.urdu": "Urdu", "language.vietnamese": "Vietnamita", "large.price.difference": "Gran diferencia de precio", "large.price.difference.tooltip": "Continuar con esta operación supondrá una pérdida de fondos. Esta diferencia puede deberse a operaciones grandes o a poca liquidez.", @@ -1114,7 +1099,6 @@ "notification.smartWallet.disabled.all": "Se deshabilitó la billetera inteligente", "notification.smartWallet.disabled.plural": "Deshabilitada en {{amount}} redes", "notification.spam.NFT.failed": "No se pudo reportar el NFT. Inténtalo de nuevo más tarde.", - "notification.spam.NFT.successful": "Reportado", "notification.swap.network": "Intercambiando en {{network}}", "notification.swap.pending.swap": "Intercambio pendiente", "notification.swap.pending.unwrap": "Desenvoltura pendiente", @@ -1214,6 +1198,7 @@ "onboarding.home.intro.backup.description.mobile": "Establece un plan de recuperación por si alguna vez pierdes el teléfono o adquieres uno nuevo.", "onboarding.home.intro.backup.title": "Haz una copia de seguridad de la billetera", "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK y JUP: ahora disponibles en Unichain", + "onboarding.home.intro.bridgedAssets.description.v2": "DOGE, XRP, XPL, ZEC — now available on Unichain", "onboarding.home.intro.bridgedAssets.title": "Opera nuevos tokens en Unichain", "onboarding.home.intro.fund.description": "Financia la billetera comprando criptomonedas o transfiriéndolas desde otra cuenta.", "onboarding.home.intro.fund.title": "Obtén tu primer token", @@ -1438,15 +1423,18 @@ "poolFinder.availablePools.notFound.description": "No se encontraron fondos v2 que coincidan. Vuelve a verificar la selección de tokens y asegúrate de estar conectado a la billetera correcta.", "pools.explore": "Explorar los fondos", "portfolio.activity.filters.timePeriod.all": "Historial", - "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", + "portfolio.activity.filters.transactionType.addLiquidity": "Added liquidity", "portfolio.activity.filters.transactionType.all": "Todos los tipos", "portfolio.activity.filters.transactionType.approvals": "Approvals", - "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", - "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.claimFees": "Claimed fees", + "portfolio.activity.filters.transactionType.createPool": "Pools created", "portfolio.activity.filters.transactionType.mints": "Mints", - "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", + "portfolio.activity.filters.transactionType.receives": "Receives", + "portfolio.activity.filters.transactionType.removeLiquidity": "Removed liquidity", + "portfolio.activity.filters.transactionType.sends": "Sends", "portfolio.activity.filters.transactionType.swaps": "Intercambios", "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.search.placeholder": "Search activity", "portfolio.activity.table.column.address": "Address", "portfolio.activity.table.column.amount": "Amount", "portfolio.activity.table.column.time": "Time", @@ -1459,7 +1447,12 @@ "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", "portfolio.disconnected.demoWallet.title": "Demo wallet", "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", + "portfolio.nfts.search.placeholder": "Search your NFTs", "portfolio.nfts.title": "NFT", + "portfolio.overview.stats.averageSwapSize": "Average swap size", + "portfolio.overview.stats.swappedThisWeek": "Swapped this week", + "portfolio.overview.stats.swapsThisWeek": "Swaps this week", + "portfolio.overview.stats.totalSwapVolume": "Total swap volume", "portfolio.overview.title": "Resumen", "portfolio.title": "Cartera", "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", @@ -1471,6 +1464,7 @@ "portfolio.tokens.table.column.token": "Token", "portfolio.tokens.table.column.value": "Valor", "portfolio.tokens.title": "Tokens", + "portfolio.view": "View portfolio", "position.addHook": "Agregar un hook", "position.addHook.tooltip": "Los hooks son una función avanzada que permite que los fondos interactúen con contratos inteligentes y desbloqueen diferentes capacidades. Ten cuidado al agregar hooks, ya que algunos pueden ser maliciosos o tener consecuencias no deseadas.", "position.addingHook": "Agregando hook", @@ -1588,6 +1582,33 @@ "qrScanner.wallet.networks": "Redes compatibles", "range.outOfView": "Rango fuera de vista", "removeLiquidity.pooled": "{{symbol}} en el fondo:", + "reporting.activity.unhide.action": "Unhide activity", + "reporting.pool.details.title": "Don’t recognize this position?", + "reporting.token.data.options.price.subtitle": "Token price is wrong or unavailable", + "reporting.token.data.options.price.title": "Price", + "reporting.token.data.options.priceChart.subtitle": "Data is wrong or incomplete", + "reporting.token.data.options.priceChart.title": "Price chart", + "reporting.token.data.options.tokenDetails.subtitle": "Token image, description, or link issue", + "reporting.token.data.options.tokenDetails.title": "Token details", + "reporting.token.data.options.volume.subtitle": "Token volume is wrong or unavailable", + "reporting.token.data.options.volume.title": "Volume", + "reporting.token.data.title": "Data issue", + "reporting.token.options.hiddenFees.subtitle": "Token has undisclosed fees when bought/sold", + "reporting.token.options.hiddenFees.title": "Hidden fees", + "reporting.token.options.imposter.subtitle": "Token seems fraudulent or misleading", + "reporting.token.options.imposter.title": "Imposter token", + "reporting.token.options.other.title": "Something else", + "reporting.token.options.spam.subtitle": "Token appeared in wallet unexpectedly", + "reporting.token.options.spam.title": "Spam token", + "reporting.token.report.button.disabled": "Select an issue", + "reporting.token.report.other.placeholder": "Describe the issue", + "reporting.token.report.title": "Report token", + "reporting.token.report.title.withSymbol": "Report {{symbol}}", + "reporting.token.warning.button": "This warning is incorrect", + "reporting.token.warning.report.placeholder": "Add details (optional)", + "reporting.token.warning.report.submit": "Report issue", + "reporting.token.warning.report.subtitle": "Report an issue if the warning below seems wrong. We’ll take a closer look.", + "reporting.token.warning.report.title": "Report an inaccurate warning", "revoke.failed.message": "Es probable que un problema de red o de conexión haya provocado el fallo de la revocación. Comprueba tu conexión e inténtalo de nuevo.", "routing.aggregateLiquidity": "Cuando es posible, combina fuentes de liquidez para obtener mejores precios e intercambios sin gas.", "routing.aggregateLiquidity.uniswapx": "UniswapX combina fuentes de liquidez dentro y fuera de la cadena, por lo que te ofrece los mejores precios disponibles e intercambios sin gas.", @@ -1735,6 +1756,7 @@ "settings.setting.backup.status.inProgress": "Haciendo copia de seguridad en {{cloudProviderName}}…", "settings.setting.backup.status.recoveryPhrase.backed": "Respaldada", "settings.setting.backup.status.title": "Copia de seguridad de {{cloudProviderName}}", + "settings.setting.balancesActivity.title": "Balances and activity", "settings.setting.beta.tooltip": "Muy pronto", "settings.setting.biometrics.appAccess.subtitle.android": "Solicitar identificación facial/dactilar para abrir la app.", "settings.setting.biometrics.appAccess.subtitle.ios": "Solicitar {{biometricsMethod}} para abrir la app.", @@ -1786,7 +1808,8 @@ "settings.setting.privacy.analytics.title": "Análisis de app", "settings.setting.privateKeys.title": "Claves privadas", "settings.setting.recoveryPhrase.title": "Frase de recuperación", - "settings.setting.smallBalances.title": "Saldo de la cartera", + "settings.setting.reportedActivity.subtitle": "Transactions you’ve reported as spam will be hidden from your activity feed.", + "settings.setting.reportedActivity.title": "Hide reported activity", "settings.setting.smartWallet.action.enable": "Habilitar", "settings.setting.smartWallet.action.smartWallet": "Billetera inteligente", "settings.setting.smartWallet.notEligible": "No es elegible", @@ -2007,7 +2030,7 @@ "swap.settings.routingPreference.option.v4.title": "Habilita fondos v4", "swap.settings.routingPreference.title": "Opciones de trading", "swap.settings.slippage.alert": "Deslizamiento alto", - "swap.settings.slippage.control.auto": "Automático", + "swap.settings.slippage.control.auto": "Auto", "swap.settings.slippage.description": "La transacción se revertirá si el precio cambia más que el porcentaje de deslizamiento.", "swap.settings.slippage.input.message": "Si el precio baja más, la transacción se revertirá. A continuación, se muestra la cantidad mínima que tienes garantizado recibir.", "swap.settings.slippage.input.receive.title": "Recibir al menos", @@ -2290,6 +2313,8 @@ "transaction.networkCost.label": "Costo de la red", "transaction.networkCost.maxNativeBalance.description": "Se reserva una cantidad pequeña del saldo de token de la red para cubrir los costo de la red de esta transacción.", "transaction.networkCost.maxNativeBalance.title": "¿Por qué no puedo usar mi saldo máximo?", + "transaction.networkCost.presetNativeBalance.description": "You don’t have enough balance to cover both this amount and the network cost of the transaction.", + "transaction.networkCost.presetNativeBalance.title": "Why can’t I use this amount?", "transaction.networkCost.veryHigh.label": "El costo de la red es muy elevado", "transaction.notification.error.cancel": "No se pudo cancelar la transacción", "transaction.notification.error.replace": "No se pudo reemplazar la transacción", diff --git a/packages/uniswap/src/i18n/locales/translations/fi-FI.json b/packages/uniswap/src/i18n/locales/translations/fi-FI.json deleted file mode 100644 index 9dd03a9a09d..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/fi-FI.json +++ /dev/null @@ -1,2563 +0,0 @@ -{ - "account.authHeader.claimReward": "Lunasta {{amount}} palkinto", - "account.cloud.backup.subtitle": "{{cloudProviderName}}-laitteeseen on varmuuskopioitu useita palautuslausekkeita.", - "account.cloud.backup.title": "Valitse palautettava varmuuskopio", - "account.cloud.button.restore.android": "Palauta Google Drivesta", - "account.cloud.button.restore.ios": "Palauta iCloudista", - "account.cloud.empty.description": "Näyttää siltä, että et ole varmuuskopioinut palautuslausekkeitasi numeroon {{cloudProviderName}}.", - "account.cloud.empty.title": "0 varmuuskopiota löydetty", - "account.cloud.error.backup.message": "Varmuuskopioiden tuonti epäonnistui käyttöoikeuksien puutteen, valtuutuksen keskeytymisen tai pilvivirheen vuoksi", - "account.cloud.error.backup.title": "Virhe varmuuskopioiden tuonnissa", - "account.cloud.error.password.title": "Väärä salasana. Yritä uudelleen.", - "account.cloud.error.unavailable.button.cancel": "Ei nyt", - "account.cloud.error.unavailable.button.settings": "Mene asetuksiin", - "account.cloud.error.unavailable.message.android": "Varmista, että olet kirjautunut sisään Google-tiliin, jossa Google Drive on käytössä tällä laitteella, ja yritä uudelleen.", - "account.cloud.error.unavailable.message.ios": "Varmista, että olet kirjautunut sisään Apple ID:llä siten, että iCloud Drive on käytössä tässä laitteessa, ja yritä uudelleen.", - "account.cloud.error.unavailable.title.android": "Google Drive ei ole saatavilla", - "account.cloud.error.unavailable.title.ios": "iCloud Drive ei ole käytettävissä", - "account.cloud.loading.title": "Haetaan varmuuskopioita...", - "account.cloud.lockout.time.hours_one": "Liian monta yritystä. Yritä uudelleen 1 tunnin kuluttua.", - "account.cloud.lockout.time.hours_other": "Liian monta yritystä. Yritä uudelleen {{count}} tunnin kuluttua.", - "account.cloud.lockout.time.minutes_one": "Liian monta yritystä. Yritä uudelleen 1 minuutin kuluttua.", - "account.cloud.lockout.time.minutes_other": "Liian monta yritystä. Yritä uudelleen {{count}} minuutin kuluttua.", - "account.cloud.password.input": "Kirjoita salasana", - "account.cloud.password.recoveryPhrase": "Kirjoita sen sijaan palautuslauseesi", - "account.cloud.password.subtitle": "Tämä salasana tarvitaan palautuslauseen varmuuskopion palauttamiseen {{cloudProviderName}}.", - "account.cloud.password.title": "Anna varmuuskopion salasana", - "account.downloadWallet.subtitle": "Varmuuskopioi lompakkosi, käy kauppaa liikkeellä ollessasi, vastaanota reaaliaikaisia hintahälytyksiä ja paljon muuta.", - "account.drawer.gitHash": "Git-hajautus: ", - "account.drawer.gitVersion": "Versio: ", - "account.drawer.modal.body": "Säilytä ja vaihda tunnuksia turvallisesti Uniswap-sovelluksella. Saatavilla iOS:lle ja Androidille.", - "account.drawer.modal.dont": "Eikö sinulla ole Uniswap-lompakkoa?", - "account.drawer.modal.scan": "Skannaa Uniswap-lompakolla", - "account.drawer.spamToggle": "Piilota tuntemattomat tunnukset ja NFT:t", - "account.passkey.delete.acknowledge": "Olen varmuuskopioinut palautuslauseeni ja ymmärrän, että Uniswap Labs ei voi auttaa minua palauttamaan lompakkoani, jos en onnistu.", - "account.passkey.delete.description": "Varmista, että olet varmuuskopioinut palautuslauseesi Uniswap-mobiilisovelluksella tai selainlaajennuksella.", - "account.passkey.delete.descriptionEmphasized": "Ilman palautuslauseketta et ehkä voi käyttää lompakkoosi.", - "account.passkey.delete.speedbump.description": "Ennen kuin jatkat, suorita seuraavat vaiheet, jotta et menetä pääsyä lompakkoosi ja kaikkiin varoihin.", - "account.passkey.delete.speedbump.step1": "Lataa Uniswap-mobiilisovellus tai selainlaajennus", - "account.passkey.delete.speedbump.step2": "Varmuuskopioi palautuslauseesi", - "account.passkey.delete.speedbump.title": "Oletko varma?", - "account.passkey.delete.title": "Poistetaanko salasana?", - "account.passkey.log.in.title": "Kirjaudu sisään salasanalla", - "account.passkey.type.crossplatform": "Puhelin, tabletti tai suojausavain", - "account.passkey.type.platform": "Selain tai käyttöjärjestelmä", - "account.passkey.verify.button": "Vahvista salasanalla", - "account.passkey.verify.description": "Ennen kuin jatkat, vahvista henkilöllisyytesi salasanallasi. Tämä auttaa pitämään tilisi turvassa.", - "account.passkey.verify.title": "Varmistetaan ensin, että olet sinä", - "account.portfolio.activity.canceledBelow": "Tämä tilaus peruutettiin, koska saldosi alitti syötetyn summan.", - "account.portfolio.activity.signLimit": "Tämä tilaus ei täyty, koska saldosi alittaa syötetyn summan. Korjaa tasapainoa lisäämällä.", - "account.recoveryPhrase.education.part1": "Palautuslauseke (tai siemenlause) on sanajoukko , jota tarvitaan lompakkosi käyttämiseen, kuten salasana.", - "account.recoveryPhrase.education.part2": "Voit syöttää palautuslauseesi uudessa laitteessa palauttaaksesi lompakkosi ja sen sisällön.", - "account.recoveryPhrase.education.part3": "Mutta jos menetät palautuslauseesi, menetät pääsyn lompakkoosi .", - "account.recoveryPhrase.education.part4": "Sen sijaan, että opettelisit palautuslauseesi ulkoa, voit varmuuskopioida sen arvoon {{cloudProviderName}} ja suojata sen salasanalla.", - "account.recoveryPhrase.education.part5": "Voit myös varmuuskopioida palautuslausekkeesi käsin kirjoittamalla sen ylös ja säilyttämällä sen turvallisessa paikassa.", - "account.recoveryPhrase.education.part6": "Suosittelemme käyttämään molempia varmuuskopiotyyppejä, koska jos kadotat palautuslauseen, et voi palauttaa lompakkoasi.", - "account.recoveryPhrase.error.invalid": "Virheellinen lause", - "account.recoveryPhrase.error.invalidWord": "Virheellinen sana: {{word}}", - "account.recoveryPhrase.error.phraseLength": "Palautuslauseen tulee olla 12-24 sanaa", - "account.recoveryPhrase.error.wordIsAddress": "Olet antanut osoitteen, et palautuslauseketta", - "account.recoveryPhrase.error.wrong": "Väärä palautuslause", - "account.recoveryPhrase.helpText.import": "Miten löydän palautuslauseeni?", - "account.recoveryPhrase.helpText.restoring": "Yritä etsiä uudelleen", - "account.recoveryPhrase.input": "Kirjoita palautuslauseesi", - "account.recoveryPhrase.remove.final.description": "Varmista, että olet kirjoittanut palautuslauseesi muistiin tai varmuuskopioinut sen {{cloudProviderName}}. Et voi muuten käyttää varojasi.", - "account.recoveryPhrase.remove.final.title": "Olet poistamassa palautuslauseesi", - "account.recoveryPhrase.remove.import.description": "Voit tallentaa vain yhden palautuslauseen kerrallaan. Jos haluat jatkaa uuden tuomista, sinun on poistettava nykyinen palautuslauseesi ja kaikki siihen liittyvät lompakot tältä laitteelta.", - "account.recoveryPhrase.remove.initial.description": "Tämä poistaa lompakkosi ja palautuslauseesi tästä laitteesta.", - "account.recoveryPhrase.remove.initial.title": "Olet poistamassa {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "Palautuslauseesi säilyy, kunnes poistat kaikki jäljellä olevat lompakot.", - "account.recoveryPhrase.subtitle.import": "Palautuslauseesi tallennetaan vain paikallisesti laitteellesi.", - "account.recoveryPhrase.subtitle.restoring": "Kirjoita palautuslauseesi alle tai yritä etsiä varmuuskopioita uudelleen.", - "account.recoveryPhrase.title.import": "Kirjoita palautuslauseesi", - "account.recoveryPhrase.title.restoring": "Varmuuskopioita ei löytynyt", - "account.wallet.action.copy": "Kopioi osoite", - "account.wallet.action.manageConnections": "Hallitse yhteyksiä", - "account.wallet.action.report": "Ilmoita profiilista", - "account.wallet.action.viewExplorer": "Katso {{blockExplorerName}}", - "account.wallet.button.add": "Lisää lompakko", - "account.wallet.button.addViewOnly": "Lisää lompakko, jossa on vain katseluoikeus", - "account.wallet.button.create": "Luo uusi lompakko", - "account.wallet.button.import": "Tuo uusi lompakko", - "account.wallet.button.manage": "Lompakon asetukset", - "account.wallet.button.remove": "Poista lompakko", - "account.wallet.button.watch": "Varo lompakkoa", - "account.wallet.create.placeholder": "Lompakko {{index}}", - "account.wallet.edit.label.input.placeholder": "Lompakon etiketti", - "account.wallet.header.button.disabled.title": "Muokkaa profiilia", - "account.wallet.header.button.title": "Muokkaa tunnistetta", - "account.wallet.header.viewOnly": "Vain katselunäkymät lompakot", - "account.wallet.menu.claimUsername": "Lunasta käyttäjänimi", - "account.wallet.menu.copy.title": "Kopioi lompakon osoite", - "account.wallet.menu.edit.title": "Muokkaa tunnistetta", - "account.wallet.menu.manageConnections": "Hallitse yhteyksiä", - "account.wallet.menu.remove.title": "Poista lompakko", - "account.wallet.remove.check": "Varmuuskelin palautuslauseeni ja ymmärrän, että Uniswap Labs ei voi auttaa minua palauttamaan lompakkoani, jos en ole tehnyt niin.", - "account.wallet.remove.title": "Poista {{name}}", - "account.wallet.remove.viewOnly": "Voit aina lisätä takaisin vain näkyviä lompakoita syöttämällä lompakon osoitteen.", - "account.wallet.restore.new_device.description": "Koska käytät uutta laitetta, sinun on palautettava palautuslausekkeesi tai annettava pilvivarmuuskopiointisalasanasi jatkaaksesi.", - "account.wallet.restore.new_device.title": "Palauta lompakkosi", - "account.wallet.restore.seed_phrase.description": "Palautuslausekkeesi puuttuu laitteeltasi. Jotta et koskaan menetä pääsyä varoihisi, sinun on palautettava lompakkosi tiedot.", - "account.wallet.restore.seed_phrase.title": "Palauta lompakkosi", - "account.wallet.select.error": "Osoitteita ei voitu ladata", - "account.wallet.select.loading.subtitle": "Lompakot näkyvät alla.", - "account.wallet.select.loading.title": "Lompakot etsimässä", - "account.wallet.select.smartWalletDisclaimer": "Oletusarvoisesti kaikki kelvolliset lompakot käyttävät älylompakon ominaisuuksia tuonnin jälkeen. Mikä on älylompakko?", - "account.wallet.select.title_one_one": "Yksi lompakko löytyi", - "account.wallet.select.title_one_other": "Valitse tuotavat lompakot", - "account.wallet.viewOnly.button": "Tuo lompakko", - "account.wallet.viewOnly.description": "Jotta voit vaihtaa, ostaa, lähettää ja vastaanottaa tunnuksia, sinun on tuotava tämän lompakon palautuslauseke.", - "account.wallet.viewOnly.title": "Tämä lompakko on vain katselu", - "account.wallet.watch.error.alreadyImported": "Tämä osoite on jo tuotu", - "account.wallet.watch.error.notFound": "Osoitetta ei löydy", - "account.wallet.watch.error.smartContract": "Osoite on älykäs sopimus", - "account.wallet.watch.message": "Lisäämällä vain näyttöön tarkoitetun lompakon voit kokeilla sovellusta tai seurata lompakkoa. Et voi vaihtaa tai lähettää varoja.", - "account.wallet.watch.placeholder": "ENS tai osoite", - "account.wallet.watch.title": "Anna lompakon osoite", - "activity.pending": "{{pendingActivityCount}} Odottaa", - "activity.transaction.lpRewards.descriptor": "{{symbol}} kerätyt palkinnot", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} - {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} {{amountWithSymbolB}}:lle", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} ja {{amountWithSymbolB}}", - "addLiquidity.shareOfPool": "Altaan osuus", - "addressInput.recipient": "Vastaanottaja", - "analytics.allow": "Salli analytiikka", - "analytics.allow.message": "Käytämme anonymisoituja tietoja parantaaksemme Uniswap Labs -tuotteiden käyttökokemustasi.", - "appRating.button.notReally": "Ei oikeastaan", - "appRating.description": "Kerro meille, jos sinulla on hyvä kokemus tästä sovelluksesta", - "appRating.extension.review.description": "Valitse tähtiluokitus ja kirjoita arvostelu Chrome Web Storessa.", - "appRating.extension.review.title": "Tarkistatko Uniswap-laajennuksen?", - "appRating.extension.title": "Pidätkö Uniswap-laajennuksesta?", - "appRating.feedback.button.send": "Lähetä palautetta", - "appRating.feedback.description": "Kerro meille, kuinka voimme parantaa kokemustasi", - "appRating.feedback.title": "Ikävä kuulla.", - "appRating.mobile.title": "Pidätkö Uniswap Walletista?", - "bridgedAsset.modal.button": "Jatka vaihtamista", - "bridgedAsset.modal.description": "Tämä on {{chainName}} versio {{currencySymbol}} :stä, jota tukee ja jonka hinta pysyy samana kuin alkuperäisen {{currencySymbol}}:n.", - "bridgedAsset.modal.feature.securelyBacked": "Turvallisesti tuettu", - "bridgedAsset.modal.feature.securelyBacked.description": "1:1 natiivin {{currencySymbol}}tukema.", - "bridgedAsset.modal.feature.tradeSeamlessly": "Saumatonta kauppaa", - "bridgedAsset.modal.feature.tradeSeamlessly.description": "Osta ja myy {{currencySymbol}} poistumatta Uniswapista.", - "bridgedAsset.modal.feature.withdrawToNativeChain": "Nosta summaan {{nativeChainName}}", - "bridgedAsset.modal.feature.withdrawToNativeChain.description": "Yhdistä takaisin alkuperäiseen verkkoon milloin tahansa.", - "bridgedAsset.modal.title": "Kauppa {{currencySymbol}} kohden {{chainName}}", - "bridgedAsset.send.warning.description": "Lähetät paketoitua versiota kohteesta {{currencySymbol}} kohteena {{chainName}}. Sen lähettäminen keskitettyyn pörssiin johtaa pysyvään varojen menetykseen.", - "bridgedAsset.send.warning.title": "Varmista, että lähetät yhteensopivaan osoitteeseen", - "bridgedAsset.tdp.description": "Tämä on silloitettu versio {{currencySymbol}} :sta, jota tukee 1:1 natiivi {{currencySymbol}}.", - "bridgedAsset.wormhole.button": "Jatka madonreikään", - "bridgedAsset.wormhole.description": "Jatka madonreiän portaaliin muodostaaksesi sillan {{currencySymbol}} :stä {{chainName}} :ään {{nativeChainName}}:ään.", - "bridgedAsset.wormhole.title": "Nosta {{currencySymbol}} - {{nativeChainName}}", - "bridgedAsset.wormhole.toNativeChain": "arvoon {{nativeChainName}}", - "bridgedAsset.wormhole.withdrawToNativeChain": "Nosta summaan {{nativeChainName}}", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "chart.candlestick": "Kynttilänjalka", - "chart.error.pools": "Nykyisen poolin historiallisia tietoja ei voida näyttää.", - "chart.error.tokens": "Nykyisen tunnuksen historiallisia tietoja ei voida näyttää.", - "chart.line": "Viivakaavio", - "chart.missingData": "Karttatiedot puuttuvat", - "chart.price.label.close": "kiinni", - "chart.price.label.high": "Korkea", - "chart.price.label.low": "Matala", - "chart.price.label.open": "Avata", - "chart.settings.unavailable.label": "Tämä asetus ei ole käytettävissä nykyiselle kaaviolle", - "claim.thanks": "Kiitos, että olet osa Uniswap-yhteisöä ", - "claim.uni.arrived": "UNI on saapunut", - "common.about": "Noin", - "common.accept": "Hyväksyä", - "common.active": "Aktiivinen", - "common.activeNetworks": "Aktiiviset verkot", - "common.activity": "Toiminta", - "common.add.label": "Lisätä", - "common.add.liquidity.canceled": "Likviditeetin lisäys peruttu", - "common.addLiquidity": "Lisää likviditeettiä", - "common.address": "Osoite", - "common.addressOrENS": "Lompakon osoite tai ENS-nimi", - "common.advanced": "Edistynyt", - "common.all": "Kaikki", - "common.allTime": "Koko ajan", - "common.and": "ja", - "common.app": "Sovellus", - "common.approved": "Hyväksytty", - "common.approvePending": "Hyväksyntä odottaa...", - "common.approvePermitTx": "Hyväksy pyyntö {{indexText}}", - "common.approvePermitTx.active": "Hyväksy pyyntö{{indexText}} lompakossa", - "common.approvePermitTx.explainer": "Mitä ovat Permit2-hyväksynnät?", - "common.approvePermitTx.pending": "Hyväksytään pyyntö {{indexText}}...", - "common.approveSpend": "Hyväksy {{symbol}} kulutus", - "common.approving": "Hyväksytään", - "common.approximatelyValue": "~{{value}}", - "common.areYouSure": "Oletko varma?", - "common.automatic": "Auto", - "common.availableIn": "Uniswap saatavilla: ", - "common.availableOnIOSAndroidChrome": "Saatavilla iOS:lle, Androidille ja Chromelle", - "common.backToPositions": "Takaisin asentoihin", - "common.bestRoute": "Reitti", - "common.bestRoute.with": "Reitti {{provider}}:n kautta", - "common.biometrics.generic": "Biometriset tiedot", - "common.biometrics.touchId": "Kosketustunnus", - "common.biometrics.windowsHello": "Windows Hello", - "common.blocked.ifError": "Jos uskot tämän olevan virhe, lähetä osoitteesi sisältävä sähköposti osoitteeseen ", - "common.blocked.reason": "Tämä osoite on estetty Uniswap Labs -käyttöliittymässä, koska se liittyy yhteen tai useampaan estettyyn toimintaan.", - "common.blockedAddress": "Estetty osoite", - "common.blog": "Blogi", - "common.bought": "Ostettu", - "common.brandAssets": "Brändivarat", - "common.button.accept": "Hyväksyä", - "common.button.back": "Takaisin", - "common.button.buy": "Ostaa", - "common.button.cancel": "Peruuttaa", - "common.button.checkin": "Ilmoittautua", - "common.button.close": "kiinni", - "common.button.confirm": "Vahvistaa", - "common.button.connect": "Kytkeä", - "common.button.continue": "Jatkaa", - "common.button.copied": "Kopioitu", - "common.button.copy": "Kopio", - "common.button.create": "Luoda", - "common.button.delete": "Poistaa", - "common.button.disable": "Poista käytöstä", - "common.button.disabling": "Poistaminen käytöstä", - "common.button.disconnect": "Katkaista", - "common.button.dismiss": "Hylkää", - "common.button.done": "Tehty", - "common.button.edit": "Muokata", - "common.button.enable": "ota käyttöön", - "common.button.finish": "Valmis", - "common.button.goBack": "Mene takaisin", - "common.button.later": "Ehkä myöhemmin", - "common.button.learn": "Lue lisää", - "common.button.next": "Seuraava", - "common.button.notNow": "Ei nyt", - "common.button.ok": "OK", - "common.button.paste": "Liitä", - "common.button.pay": "Maksaa", - "common.button.proceed": "Edetä", - "common.button.receive": "Vastaanottaa", - "common.button.remove": "Poista", - "common.button.reset": "Nollaa", - "common.button.retry": "Yritä uudelleen", - "common.button.reveal": "Paljastaa", - "common.button.review": "Arvostelu", - "common.button.save": "Tallentaa", - "common.button.scrollDown": "Rullaa alas", - "common.button.sell": "Myydä", - "common.button.send": "Lähettää", - "common.button.setup": "Perustaa", - "common.button.share": "Jaa", - "common.button.showLess": "Näytä vähemmän", - "common.button.showMore": "Näytä lisää", - "common.button.sign": "Merkki", - "common.button.skip": "Ohita", - "common.button.swap": "Vaihtaa", - "common.button.tryAgain": "Yritä uudelleen", - "common.button.understand": "Ymmärrän", - "common.button.unlock": "Avata", - "common.button.view": "Näytä", - "common.button.viewDetails": "Näytä tiedot", - "common.button.yes": "Joo", - "common.buy.label": "Ostaa", - "common.buyAndSell": "Osta ja myy Uniswapilla", - "common.cancellationSubmitted": "Peruutus lähetetty", - "common.cancellationSuccessful": "Peruutus onnistui", - "common.cancelOrder": "Peruuta tilaus", - "common.card.error.description": "Jotain meni pieleen", - "common.card.error.title": "Oho! Jotain meni pieleen.", - "common.careers": "Ura", - "common.chain.networkCost": "{{chain}} verkon hinta", - "common.chart": "Kartoittaa", - "common.checkNetwork": "Tarkista verkon tila tästä.", - "common.chromeExtension": "Laajennus", - "common.claim.failed": "Vaatimus epäonnistui", - "common.claimed": "Väitetty", - "common.claiming": "Väitetään", - "common.claimUnis": "Lunasta UNI-tunnuksesi", - "common.clear": "Selkeä", - "common.close": "kiinni", - "common.closed": "Suljettu", - "common.collect.button": "Kerätä", - "common.company": "Yhtiö", - "common.confirm": "Vahvistaa", - "common.confirmCancellation": "Vahvista peruutus", - "common.confirmed": "Vahvistettu", - "common.confirmSend.button": "Vahvista lähetys", - "common.confirmSwap": "Vahvista vaihto lompakossa", - "common.confirmTimedOut": "Vahvistus aikakatkaistiin. Yritä uudelleen.", - "common.confirmTransfer": "Vahvista siirto", - "common.confirmWallet": "Vahvista lompakossa", - "common.connect.button": "Kytkeä", - "common.connectAWallet.button": "Yhdistä lompakko", - "common.connectAWallet.button.evm": "Yhdistä Ethereum-lompakko", - "common.connectAWallet.button.evm.switch": "Vaihda Ethereum-lompakkoa", - "common.connectAWallet.button.svm": "Yhdistä Solana-lompakko", - "common.connectAWallet.button.svm.switch": "Switch Solana -lompakko", - "common.connectAWallet.button.switch": "Vaihda lompakkoa", - "common.connectTo": "Yhdistä kohteeseen {{platform}}", - "common.connectWallet.button": "Yhdistä lompakko", - "common.contactUs.button": "Ota meihin yhteyttä", - "common.copied": "Kopioitu", - "common.copy.address": "Kopioi osoite", - "common.copy.poolId": "Kopioi poolin tunnus", - "common.copyLink.button": "Kopioi linkki", - "common.created.date": "Luotu {{date}}", - "common.currency": "Valuutta", - "common.currentPrice": "Nykyinen hinta", - "common.custom": "Mukautettu", - "common.customRange": "Mukautettu valikoima", - "common.dataOutdated": "Tiedot voivat olla vanhentuneita", - "common.day": "päivä", - "common.default": "Oletus", - "common.defaultTradeOptions": "Kaupan oletusvaihtoehdot", - "common.deposit.toNetwork": "Talletustunnukset {{label}} verkkoon.", - "common.depositing": "Tallettaminen", - "common.depositTokens": "Talletustunnukset", - "common.detected": "Havaittu", - "common.developers": "Kehittäjät", - "common.device": "Tämä laite", - "common.device.other": "Muu laite", - "common.dismiss": "Hylkää", - "common.docs": "Dokumentit", - "common.donate": "Lahjoittaa", - "common.done": "Tehty", - "common.dontShowAgain": "Älä näytä tätä uudelleen", - "common.download": "ladata", - "common.downloadAppStore": "Lataa App Storesta", - "common.downloadPlayStore": "Lataa Play Kaupasta", - "common.downloadUniswapApp": "Lataa Uniswap-sovellus", - "common.downloadUniswapWallet": "Lataa Uniswap-lompakko", - "common.dynamic": "Dynaaminen", - "common.edit.button": "Muokata", - "common.ended": "Päättyi", - "common.error.details": "Virhetiedot", - "common.error.general": "Jotain meni pieleen", - "common.error.label": "Virhe", - "common.error.request": "Pyyntöäsi käsiteltäessä tapahtui virhe. Jos pyydät tukea, muista kopioida tämän virheen tiedot.", - "common.error.somethingWrong": "Jotain meni pieleen!", - "common.errorConnecting.error": "Yhteysvirhe", - "common.errorLoadingData.error": "Virhe ladattaessa tietoja", - "common.etherscan": "Etherscan", - "common.expiry": "Vanheneminen", - "common.explore": "Tutkia", - "common.explorer": "tutkimusmatkailija", - "common.exploreTokens": "Tutustu tokeneihin", - "common.extension": "Uniswap-laajennus", - "common.failedSwitchNetwork": "Verkon vaihtaminen epäonnistui", - "common.fee": "Maksu", - "common.fees": "Maksut", - "common.feesEarned": "Palkkiot ansaittu", - "common.feesEarnedPerBase": "{{symbolA}} per {{symbolB}}", - "common.for": "varten", - "common.free": "Ilmainen", - "common.fullRange": "Täysi valikoima", - "common.getApp": "Hanki sovellus", - "common.getHelp.button": "Hae apua", - "common.getStarted": "Aloita", - "common.getSupport.button": "Saada tukea", - "common.getTheApp": "Hanki sovellus", - "common.getUniswapWallet": "Hanki Uniswap-lompakko", - "common.getUniswapWallet.mobile": "Hanki Uniswap-mobiilisovellus", - "common.governance": "Hallinto", - "common.happyHolidays": "Hyvää lomaa Uniswap-tiimiltä!", - "common.help": "Auttaa", - "common.helpCenter": "Ohjekeskus", - "common.hidden": "Piilotettu", - "common.hide.button": "Piilottaa", - "common.highPrice": "Korkea hinta", - "common.includes": "Sisältää", - "common.info.label": "Tiedot", - "common.input.noRecipient.error": "Valitse vastaanottaja", - "common.input.password.confirm": "Vahvista salasana", - "common.input.password.error.mismatch": "Salasanat eivät täsmää", - "common.input.password.error.weak": "Tämä salasana on liian heikko", - "common.input.password.new": "Uusi salasana", - "common.input.password.placeholder": "Salasana", - "common.input.password.strength.medium": "Keskikokoinen", - "common.input.password.strength.strong": "Vahva", - "common.input.password.strength.weak": "Heikko", - "common.input.search": "Hae", - "common.insufficient.funds": "Riittämättömät varat", - "common.insufficientBalance.error": "Riittämätön tasapaino", - "common.insufficientFundsForNetworkFee.error": "Rahat eivät riitä verkkokustannusten kattamiseen", - "common.insufficientTokenBalance.error": "Riittämätön {{tokenSymbol}} saldo", - "common.insufficientTokenBalance.error.simple": "Ei tarpeeksi {{tokenSymbol}}", - "common.invalidPair": "Virheellinen pari", - "common.invalidRecipient.error": "Virheellinen vastaanottaja", - "common.iOSAndroid": "iOS ja Android", - "common.language": "Kieli", - "common.learnMoreSwap": "Lue lisää swapeista", - "common.legalAndPrivacy": "Laki ja yksityisyys", - "common.less": "Vähemmän", - "common.limit.cancel_one": "Peruuta raja", - "common.limit.cancel_other": "Peru {{count}} -rajat", - "common.limit.canceled": "Rajoitus peruttu", - "common.limit.executed": "Rajoitus suoritettu", - "common.limit.expired": "Raja umpeutunut", - "common.limit.failed": "Rajoitus epäonnistui", - "common.limit.opened": "Raja avattu", - "common.limit.pending": "Rajoitus odottaa", - "common.limits": "Rajoitukset", - "common.limits.approachMax": "Lähestyy 100 enimmäisrajaa", - "common.limits.cancelProceed": "Peruuta rajoitukset jatkaaksesi", - "common.limits.expires": "Vanhenee {{timestamp}}", - "common.limits.open": "Avoimet rajat", - "common.limits.when": "kun {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "Linkit", - "common.liquidity": "Likviditeetti", - "common.liquidity.provision": "Likviditeetin tarjoaminen", - "common.liquidity.removed": "Likviditeetti poistettu", - "common.loading": "Ladataan", - "common.longText.button.less": "Lue vähemmän", - "common.longText.button.more": "Lue lisää", - "common.lowPrice": "Alhainen hinta", - "common.manage": "Hallitse", - "common.market.label": "Markkinoida", - "common.marketPrice": "Markkinahinta", - "common.marketPrice.fetching": "Haetaan markkinahintaa...", - "common.marketPrice.label": "Markkinahinta:", - "common.marketPrice.unavailable": "Markkinahintaa ei löytynyt. Ole hyvä ja tee omat tutkimuksesi välttääksesi varojen menetyksen.", - "common.max": "Max", - "common.message": "Viesti", - "common.migrate": "Siirrä", - "common.migrate.liquidity.failed": "Likviditeetin siirto epäonnistui", - "common.migrate.position": "Siirrä sijainti", - "common.migrated.liquidity": "Siirretty likviditeetti", - "common.migrating.liquidity": "Likviditeetin siirto", - "common.min": "Min", - "common.more": "Lisää", - "common.moreDetails": "Lisätietoja", - "common.navigation.settings": "asetukset", - "common.navigation.systemSettings": "asetukset", - "common.navigationButton": "Navigointipainike", - "common.needHelp": "Tarvitsetko apua?", - "common.networkCost": "Verkon hinta", - "common.neverMind": "Unohda koko juttu", - "common.new": "Uusi", - "common.new.exclamation": "Uusi!", - "common.nft": "NFT", - "common.nfts": "NFT:t", - "common.noAmount.error": "Syötä summa", - "common.noData": "Ei dataa", - "common.none": "Ei mitään", - "common.noResults": "Ei tuloksia.", - "common.notAvailableInRegion.error": "Ei saatavilla alueellasi", - "common.notCreated.label": "Ei luotu", - "common.notSupported": "Ei tuettu", - "common.oneDay": "1 päivä", - "common.oneDay.short": "1D", - "common.oneHour.short": "1H", - "common.oneMonth": "1 kuukausi", - "common.oneWeek": "1 viikko", - "common.oneYear": "1 vuosi", - "common.opensea.link": "Katso OpenSeasta", - "common.orderCanceled": "Tilaus peruttu", - "common.orderExecuted": "Tilaus suoritettu", - "common.orderExpired": "Tilaus vanhentunut", - "common.orderPending": "Tilaus vireillä", - "common.outOfRange": "Kantaman ulkopuolella", - "common.pageNotFound": "Sivua ei löydetty!", - "common.passkey.count": "Salasana {{number}}", - "common.passkeys": "Salasanat", - "common.passkeys.add": "Lisää salasana", - "common.passkeys.add.description": "Valitse, minne haluat tallentaa uuden salasanasi.", - "common.pastDay": "Mennyt päivä", - "common.pastFiveMinutes": "Viimeiset viisi minuuttia", - "common.pastHour": "Viimeinen tunti", - "common.pastMonth": "Viime kuukausi", - "common.pastWeek": "Mennyt viikko", - "common.pastYear": "Viime vuosi", - "common.pending": "Odottaa", - "common.pending.cancellation": "Odottaa peruutusta", - "common.pendingEllipsis": "Odottaa...", - "common.permit": "Lupa", - "common.plusMore": "+{{number}} lisää", - "common.pool": "Allas", - "common.pools": "Altaat", - "common.portfolio": "Portfolio", - "common.poweredBy": "Voimanlähteenä ", - "common.price": "Hinta", - "common.priceUpdated": "Hinta päivitetty", - "common.privacyChoices": "Tietosuojavalintasi", - "common.privacyChoices.checkbox.description": "Kun tämä on valittuna, emme jaa tietojasi kolmansien osapuolien kanssa personoitua mainontaa varten. Voit ottaa jakamisen käyttöön milloin tahansa poistamalla valinnan tästä ruudusta.", - "common.privacyChoices.checkbox.label": "Älä jaa tietojani", - "common.privacyChoices.description": "Saatamme jakaa laitetunnisteita mainoskumppaneidemme kanssa mainostaaksemme palveluitamme muilla verkkosivustoilla ja alustoilla. Jos tämä sovellettavien lakien mukaan katsotaan myyntiin, jakamiseen tai kohdistetuksi mainoksiksi, voit kieltäytyä käytöstä valitsemalla \"älä jaa tietojani\" -ruudun. Lisätietoja tietosuojakäytännöistämme saat tutustumalla Tietosuojakäytäntöön.", - "common.privacyChoices.disclaimer": "Huomaa, että valintasi koskee vain tämän laitteen tätä selainta. Voit myös kieltäytyä käytöstä ottamalla käyttöön Global Privacy Control -asetuksen selaimessa, jolla käytät palveluitamme. Näet lisää vaihtoehtoja siirtymällä asetuksiin.", - "common.privacyPolicy": "Tietosuojakäytäntö", - "common.proceed": "Edetä", - "common.proceedInWallet": "Jatka lompakossasi", - "common.products": "Tuotteet", - "common.protocol": "pöytäkirja", - "common.protocol.v2": "Uniswap v2", - "common.protocol.v3": "Uniswap v3", - "common.protocol.v4": "Uniswap v4", - "common.purchased": "Osti", - "common.rate": "Rate", - "common.readMore": "Lue lisää", - "common.receive": "Vastaanottaa", - "common.received": "Otettu vastaan", - "common.recent": "Viimeaikaiset", - "common.refresh": "Päivitä", - "common.reload.label": "Lataa sovellus uudelleen", - "common.remove.label": "Poista", - "common.remove.liquidity.canceled": "Poista peruutettu likviditeetti", - "common.remove.liquidity.failed": "Likviditeetin poistaminen epäonnistui", - "common.removing.liquidity": "Likviditeetin poistaminen", - "common.resetLimit": "Nollaa {{symbol}} -raja", - "common.resetLimitWallet": "Nollaa {{symbol}} -raja lompakossa", - "common.resettingLimit": "Nollataan {{symbol}} -rajaa...", - "common.revoke.approval.failed": "Hyväksynnän peruuttaminen epäonnistui", - "common.revoked.approval": "Peruutettu hyväksyntä", - "common.revoking.approval": "Hyväksynnän peruuttaminen", - "common.scanQRDownload": "Lataa QR-koodi puhelimellasi", - "common.selectRegion.label": "Valitse alueesi", - "common.selectToken.label": "Valitse tunnus", - "common.sell.label": "Myydä", - "common.send.button": "Lähettää", - "common.send.failed": "Lähetys epäonnistui", - "common.sending": "Lähetetään", - "common.sent": "Lähetetty", - "common.settings": "asetukset", - "common.share": "Jaa", - "common.share.shareToTwitter": "Jaa Twitterissä", - "common.show.button": "Näytä", - "common.showLess.button": "Näytä vähemmän", - "common.showMore.button": "Näytä lisää", - "common.signatureExpired": "Allekirjoituksesi on vanhentunut.", - "common.signMessage": "Allekirjoita viesti", - "common.signMessageWallet": "Allekirjoita viesti lompakkoon", - "common.socials": "Sosiaaliset mediat", - "common.sold": "myyty", - "common.stats": "Tilastot", - "common.status": "Status", - "common.step.number": "Vaihe {{number}}", - "common.step.number.of": "Vaihe {{current}} / {{total}}", - "common.swap": "Vaihtaa", - "common.swap.expired": "Swap vanhentunut", - "common.swap.failed": "Vaihto epäonnistui", - "common.swapPending": "Vaihto vireillä...", - "common.termsOfService": "Käyttöehdot", - "common.text.connected": "Yhdistetty", - "common.text.contract": "Sopimus", - "common.text.disconnected": "Yhteys katkaistu", - "common.text.error": "Virhe", - "common.text.notAvailable": "Ei käytössä", - "common.text.recipient": "Vastaanottaja", - "common.text.sender": "From", - "common.text.unknown": "Tuntematon", - "common.thisAccount": "tämä tili", - "common.thisMonth": "Tässä kuussa", - "common.thisToken": "Tämä merkki", - "common.thisWeek": "Tämä viikko", - "common.thisYear": "Tämä vuosi", - "common.time": "Aika", - "common.time.minute.amt": "{{time}}m", - "common.time.minutes": "pöytäkirja", - "common.time.past.days": "{{days}} päivää", - "common.time.past.days.short": "{{days}}d", - "common.time.past.hours": "{{hours}} tuntia", - "common.time.past.hours.short": "{{hours}}h", - "common.time.past.minutes.short": "{{minutes}}m", - "common.time.past.months.short": "{{months}}kk", - "common.time.past.seconds.short": "{{seconds}}s", - "common.to": "vastaanottaja", - "common.today": "Tänään", - "common.tokenA": "Tunnus A", - "common.tokenAmount": "Token summa", - "common.tokenB": "Token B", - "common.tokenName": "Tokenin nimi", - "common.tokens": "Tokenit", - "common.totalUniswapTVL": "Yhteensä Uniswap TVL", - "common.totalValueLocked": "TVL", - "common.trade": "Käydä kauppaa", - "common.trademarkPolicy": "Tavaramerkkikäytäntö", - "common.transactionDetails": "Maksutapahtuman tiedot", - "common.transactionId": "Tapahtumatunnus", - "common.transactionPending": "Tapahtuma vireillä", - "common.transactions": "Tapahtumat", - "common.transactionSettings": "Tapahtumaasetukset", - "common.transfer_one": "siirtää", - "common.transfer_other": "siirrot", - "common.tryAgain.error": "Yritä uudelleen", - "common.twitter": "Viserrys", - "common.type.label": "Tyyppi", - "common.unavailable": "Ei saatavilla", - "common.unhide": "Näytä", - "common.unichain": "Unichain", - "common.uniswapMobile": "Uniswap Mobile", - "common.uniswapWallet": "Unswap lompakko", - "common.uniswapX": "UniswapX", - "common.unknown": "Tuntematon", - "common.unknownError.error": "Tuntematon virhe", - "common.unwrap.button": "Avaa pakkaus", - "common.unwrap.failed": "Purkaminen epäonnistui", - "common.unwrapped": "Avattu", - "common.unwrapping": "Purkaminen", - "common.view.profile": "Näytä profiili", - "common.viewOnExplorer": "Näytä Explorerissa", - "common.volume": "Äänenvoimakkuus", - "common.vote": "Äänestää", - "common.wallet.approve": "Hyväksy lompakossa", - "common.wallet.label": "Lompakko", - "common.warning": "Varoitus", - "common.webApp": "Verkkosovellus", - "common.website": "Verkkosivusto", - "common.whyApprove": "Miksi minun täytyy hyväksyä tunnus?", - "common.whySign": "Miksi allekirjoituksia tarvitaan?", - "common.whyWrap": "Miksi minun täytyy kääriä {{symbol}}?", - "common.withdraw": "Peruuttaa", - "common.withdrawal.amount": "Nostosumma", - "common.withinRange": "Alueella", - "common.wrap": "Kääri {{symbol}}", - "common.wrap.failed": "Kääriminen epäonnistui", - "common.wrapIn": "Kääri {{symbol}} lompakkoon", - "common.wrapped": "Kääritty", - "common.wrapping": "Kääriminen", - "common.wrappingToken": "Kääritään {{symbol}}...", - "common.yesterday": "Eilen", - "common.your.account.had.insufficient.funds": "Tililläsi ei ollut riittävästi varoja tämän vaihdon suorittamiseen.", - "common.your.account.has.insufficient.funds": "Tililläsi ei ole riittävästi varoja tämän vaihdon suorittamiseen.", - "common.your.connected.wallet": "Yhdistetty lompakkosi", - "common.your.limit.could.not.be.fulfilled": "Rajaasi ei voitu täyttää tällä hetkellä. Yritä uudelleen.", - "common.your.swap.could.not.be.fulfilled": "Vaihtoehtoasi ei voitu suorittaa tällä hetkellä. Yritä uudelleen.", - "common.youreBuying": "Olet ostamassa", - "common.youReceive": "Saat", - "common.youreSelling": "Myyt", - "currency.ars": "Argentiinan peso", - "currency.aud": "Australian dollari", - "currency.brl": "Brasilian real", - "currency.cad": "Kanadan dollari", - "currency.cny": "Kiinan yuania", - "currency.cop": "Kolumbian peso", - "currency.eur": "euroa", - "currency.gbp": "Britannian punta", - "currency.hkd": "Hongkongin dollari", - "currency.idr": "Indonesian rupia", - "currency.inr": "Intian rupia", - "currency.jpy": "Japanin jeniä", - "currency.krw": "Etelä-Korean wonia", - "currency.mxn": "Meksikon peso", - "currency.ngn": "Nigerialainen Naira", - "currency.pkr": "Pakistanin rupia", - "currency.rub": "Venäjän rupla", - "currency.sgd": "Singaporen dollari", - "currency.try": "Turkin liira", - "currency.uah": "Ukrainan hryvnia", - "currency.usd": "Yhdysvaltain dollari", - "currency.vnd": "Vietnamin dong", - "dapp.request.actionCannotBeCompleted.description": "Jotkin toiminnot eivät ole käytettävissä, koska älylompakkosi asetuksia hallinnoi toinen lompakkosovellus.", - "dapp.request.actionCannotBeCompleted.header": "Allekirjoituspyyntö", - "dapp.request.actionCannotBeCompleted.title": "Toimintoa ei voida suorittaa loppuun", - "dapp.request.approve.action": "Hyväksyä", - "dapp.request.approve.fallbackTitle": "Hyväksy tämä sivusto käyttääksesi tunnuksia", - "dapp.request.approve.helptext": "Salli tämän sivuston käyttöoikeus ja kuluttaa tämä tunnus tapahtumia varten. Varmista, että luotat tähän sivustoon.", - "dapp.request.approve.label": "Lompakko", - "dapp.request.approve.title": "Hyväksy käyttöoikeus kohteeseen {{tokenSymbol}}", - "dapp.request.base.title": "Tapahtumapyyntö", - "dapp.request.bridge.description": "Siirrä ETH, USDC ja paljon muuta {{numChains}}+ -verkoissa.", - "dapp.request.bridge.title": "Yritetäänkö siltaa?", - "dapp.request.connect.helptext": "Salli tämän sivuston tarkastella lompakkosi osoitetta, saldoa ja pyytää hyväksyntää tapahtumille.", - "dapp.request.connect.title": "Yhdistä sivustoon", - "dapp.request.fallback.calldata.label": "Raakadata", - "dapp.request.fallback.function.label": "Toiminto", - "dapp.request.permit2.description": "Permit2 hallinnoi tunnuksen hyväksyntöjä useissa dappeissa.", - "dapp.request.permit2.header": "Allekirjoita lupa 2", - "dapp.request.permit2approve.action": "Hyväksyä", - "dapp.request.permit2approve.helptext": "Permit2 hallinnoi tunnuksen hyväksyntöjä useissa dappeissa.", - "dapp.request.permit2approve.title": "Hyväksy lupa2", - "dapp.request.reject.action": "Hylkää kaikki", - "dapp.request.reject.info": "Sinulla on {{totalRequestCount}} tapahtumapyyntöä", - "dapp.request.revoke.action": "Peruuttaa", - "dapp.request.revoke.helptext": "Salli tämän sivuston peruuttaa tämän tunnuksen käyttäminen tapahtumiin. Varmista, että luotat tähän sivustoon.", - "dapp.request.revoke.title": "Peruuta käyttöoikeus kohteeseen {{tokenSymbol}}", - "dapp.request.signature.containsUnrenderableCharacters": "Tämä viesti sisältää merkkejä, joita ei voi toistaa. Varmista, että luotat tähän sivustoon.", - "dapp.request.signature.decodeError": "Viestin purkaminen epäonnistui", - "dapp.request.signature.header": "Allekirjoituspyyntö", - "dapp.request.signature.irregular": "Epäsäännöllinen allekirjoituspyyntö", - "dapp.request.signature.irregular.description": "Varmista, että luotat tähän sivustoon ennen kuin jatkat", - "dapp.request.signature.irregular.understand": "Ymmärrän riskit", - "dapp.request.signature.toggleDataView.raw": "Näytä raakatiedot", - "dapp.request.signature.toggleDataView.readable": "Näytä alkuperäiset tiedot", - "dapp.request.warning.notActive.message": "Varmista, että se on oikea", - "dapp.request.warning.notActive.title": "Tämä ei ole aktiivinen lompakkosi", - "delegation.upgradeModal.description": "Tämä lompakkopäivitys käyttää älysopimuksia nopeampia ja edullisempia maksutapahtumia varten. Lue lisää", - "delegation.upgradeModal.enableSmartWallet": "Ota käyttöön älykäs lompakko", - "delegation.upgradeModal.title": "Älykkäämpiä vaihtoja, alhaisemmat kustannukset", - "downloadApp.modal.connectExistingWallet": "Yhdistä olemassa oleva lompakko", - "downloadApp.modal.getStarted.description": "Saat käyttöösi tuhansia tokeneita välittömästi maailman suurimman onchain-markkinapaikan kautta.", - "downloadApp.modal.getStarted.title": "Aloita vaihtaminen sekunneissa", - "downloadApp.modal.getTheApp.title": "Aloita Uniswapin käyttö", - "downloadApp.modal.uniswapProducts.subtitle": "Uniswap-tuotteet toimivat saumattomasti yhdessä luodakseen parhaan onchain-kokemuksen.", - "empty.swap.button.text": "Lisää varoja vaihtoa varten", - "error.dataUnavailable": "Tiedot eivät ole tällä hetkellä saatavilla; työskentelemme korjauksen parissa", - "error.id": "Virhetunnus: {{eventId}}", - "error.jupiterApi.execute.default.title": "Jupiter API:ssa meni jotain pieleen. Yritä uudelleen.", - "error.jupiterApi.failedToLand": "(Koodi {{code}}: Tapahtuman saapuminen verkkoon epäonnistui)", - "error.jupiterApi.invalidBlockHeight": "(Koodi -1004: Virheellinen lohkon korkeus)", - "error.jupiterApi.invalidMessageBytes": "(Koodi -3: Virheelliset viestitavut)", - "error.jupiterApi.invalidPayload": "(Koodi -2002: Virheellinen hyötykuorma)", - "error.jupiterApi.invalidSignedTransaction": "(Koodi -2: Virheellinen allekirjoitettu tapahtuma)", - "error.jupiterApi.invalidTransaction": "(Koodi -1002: Virheellinen tapahtuma)", - "error.jupiterApi.missingCachedOrder": "(Koodi -1: Puuttuva välimuistissa oleva tilaus)", - "error.jupiterApi.notFullySigned": "(Koodi -1003: Tapahtumaa ei ole täysin allekirjoitettu)", - "error.jupiterApi.quoteExpired": "Tämä lainaus aikakatkaistiin, yritä uudelleen. (Koodi -2003)", - "error.jupiterApi.unknownErrorCode": "(Koodi {{code}})", - "error.noData": "Dataa ei löytynyt", - "error.request.provideId": "Pyyntöäsi käsiteltäessä tapahtui virhe. Jos pyydät tukea, muista antaa virhetunnuksesi.", - "error.tokenApproval": "Tokenin hyväksyntä epäonnistui", - "error.tokenApproval.message": "Hyväksyntäsi epäonnistui todennäköisesti verkko- tai yhteysongelman vuoksi. Tarkista yhteytesi ja yritä uudelleen.", - "error.tokenApprovalEdited": "Riittämätön hyväksyntämäärä", - "error.tokenApprovalEdited.message": "Lompakollesi asetettu hyväksyntäsumma on liian pieni tämän tapahtuman suorittamiseen. Yritä uudelleen ja lisää määrää.", - "errors.crash.message": "Jotain kaatui.", - "errors.crash.restart": "Käynnistä sovellus uudelleen", - "errors.crash.title": "Voi ei!", - "explore.more.pools": "Tutustu muihin uima-altaisiin", - "explore.more.unichain": "Tutustu Unichain-altaisiin", - "explore.search.label.ownedBy": "Omistaja {{ownerAddress}}", - "explore.search.placeholder": "Etsi rahakkeita ja lompakoita", - "explore.search.section.nft": "NFT-kokoelmat", - "explore.search.section.popularNFT": "Suositut NFT-kokoelmat", - "explore.search.section.wallets": "Lompakot", - "explore.tokens.error": "Tunnuksia ei voitu ladata", - "explore.tokens.favorite.action.add": "Suosikkimerkki", - "explore.tokens.favorite.action.edit": "Muokkaa suosikkeja", - "explore.tokens.favorite.action.remove": "Poista suosikki", - "explore.tokens.favorite.title.default": "Suosikkimerkit", - "explore.tokens.favorite.title.edit": "Muokkaa suosikkitunnuksia", - "explore.tokens.metadata.marketCap": "{{number}} MCap", - "explore.tokens.metadata.totalValueLocked": "{{number}} TVL", - "explore.tokens.metadata.volume": "{{number}} Vol", - "explore.tokens.sort.label.marketCap": "Markkina-arvo", - "explore.tokens.sort.label.priceDecrease": "Hinnan lasku", - "explore.tokens.sort.label.priceIncrease": "Hinnankorotus", - "explore.tokens.sort.label.totalValueLocked": "TVL", - "explore.tokens.sort.label.volume": "Äänenvoimakkuus", - "explore.tokens.sort.option.marketCap": "Markkina-arvo", - "explore.tokens.sort.option.priceDecrease": "Hinnan lasku (24H)", - "explore.tokens.sort.option.priceIncrease": "Hinnankorotus (24H)", - "explore.tokens.sort.option.totalValueLocked": "Poista TVL:n vaihto", - "explore.tokens.sort.option.volume": "Uniswap äänenvoimakkuus (24H)", - "explore.tokens.top.title": "Huippumerkit", - "explore.v2TVL": "v2 TVL", - "explore.v3TVL": "v3 TVL", - "explore.v4TVL": "v4 TVL", - "explore.wallets.favorite.action.add": "Suosikki lompakko", - "explore.wallets.favorite.action.edit": "Muokkaa suosikkeja", - "explore.wallets.favorite.action.remove": "Poista suosikki", - "explore.wallets.favorite.action.remove.short": "Poista suosikeista", - "explore.wallets.favorite.title.default": "Suosikki lompakot", - "explore.wallets.favorite.title.edit": "Muokkaa suosikkilompakoita", - "extension.connection.network": "Verkko", - "extension.connection.networks": "Verkot", - "extension.connection.popup.trouble": "Onko yhteyden muodostamisessa ongelmia?", - "extension.connection.titleConnected": "Yhdistetty", - "extension.connection.titleNotConnected": "Ei yhteyttä", - "extension.lock.button.forgot": "Unohtuiko salasana?", - "extension.lock.button.reset": "Nollaa lompakko", - "extension.lock.button.submit": "Avata", - "extension.lock.password.error": "Väärä salasana. Yritä uudelleen", - "extension.lock.password.reset.initial.description": "Uniswap ei voi auttaa palauttamaan salasanaasi. Sinun on nollattava lompakkosi syöttämällä 12-sanainen palautuslauseesi uudelleen.", - "extension.lock.password.reset.initial.help": "Mistä löydän palautuslauseeni?", - "extension.lock.password.reset.initial.title": "Unohtuiko salasana", - "extension.lock.password.reset.speedbump.description": "Varmista, että sinulla on 12-sanainen palautuslause, ennen kuin nollaat lompakkosi. Muuten et voi saada takaisin varojasi.", - "extension.lock.password.reset.speedbump.help": "Menetin palautuslauseeni", - "extension.lock.password.reset.speedbump.title": "Ennen kuin jatkat", - "extension.lock.subtitle": "Avaa lukitus antamalla salasanasi", - "extension.lock.title": "Tervetuloa takaisin", - "extension.network.notSupported": "Verkkoa ei tueta", - "extension.open": "Avaa Uniswap-laajennus", - "extension.passwordPrompt.error.wrongPassword": "Väärä salasana. Yritä uudelleen", - "extension.passwordPrompt.title": "Syötä salasanasi", - "extension.popup.chrome.button": "Avaa laajennus", - "extension.popup.chrome.description": "Suorita tämä toiminto avaamalla Uniswap-laajennus.", - "extension.popup.chrome.title": "Jatka Uniswapissa", - "extension.settings.defaultWallet.message": "Priorisoi Uniswap-laajennus, kun muodostat yhteyden sovelluksiin.", - "extension.settings.defaultWallet.title": "Tee oletuslompakko", - "extension.uninstall.reason.missingFeatures": "Uniswap-lompakosta puuttuu tiettyjä ominaisuuksia", - "extension.uninstall.reason.notUsingCrypto": "En halua enää käyttää kryptovaluuttoja", - "extension.uninstall.reason.other": "Muita syitä", - "extension.uninstall.reason.switchingWallet": "Vaihdan toiseen lompakkoon", - "extension.uninstall.subtitle": "Jos sinulla on hetki aikaa, haluaisimme kuulla, miksi poistit Uniswap Walletin.", - "extension.uninstall.title": "Olemme surullisia nähdessämme sinun lähtevän", - "extension.warning.storage.button": "Varmuuskopioida", - "extension.warning.storage.message": "Muista varmuuskopioida palautuslauseesi, jotta et menetä pääsyä lompakkoosi ja varoihin.", - "extension.warning.storage.title": "Selaimesi tallennustila on loppumassa", - "extensionPasskeyLogInPopUp.description": "Tuo Uniswap-tilisi kirjautumalla sisään olemassa olevalla salasanalla.", - "extensionPasskeyLogInPopUp.invalidReferrer": "Sulje tämä sivu ja yritä uudelleen.", - "fee.bestForCustomizability": "Paras muokattavuus.", - "fee.bestForExotic": "Paras eksoottisille pareille.", - "fee.bestForMost": "Paras useimmille pareille.", - "fee.bestForStablePairs": "Paras vakaille pareille.", - "fee.bestForVeryStable": "Paras erittäin vakaille pareille.", - "fee.dynamic": "Dynaaminen maksu", - "fee.percentEarned": "%, jonka ansaitset maksuina.", - "fee.selectPercent": "{{pct}}% valitse", - "fee.selectPercentDescription": "{{pct}}% likviditeetistä valitsi tämän tason", - "fee.tier": "Maksutaso", - "fee.tier.create": "Luo maksutaso", - "fee.tier.create.button": "Luo uusi maksutaso", - "fee.tier.create.description": "Uuden tason luominen alustetaan uudessa poolissa ja johtaa tavallista korkeampiin verkkokustannuksiin.", - "fee.tier.description": "Ansaittu summa tarjoaa likviditeettiä. Valitse riskinsietokykyäsi ja strategiaasi vastaava summa.", - "fee.tier.description.v2": "Ansaittu summa tarjoaa likviditeettiä. Kaikissa v2-pooleissa on kiinteät 0,3 %:n maksut. Saat lisää vaihtoehtoja tarjoamalla likviditeettiä v4:ssä.", - "fee.tier.dynamic": "Dynaaminen maksutaso", - "fee.tier.dynamic.create": "Dynaamisen maksutason luominen", - "fee.tier.dynamic.create.info": "Olet luomassa poolia, jossa on dynaaminen maksutaso. Ennen kuin jatkat, varmista, että valittu koukku tukee dynaamisia maksuja.", - "fee.tier.highestTvl": "Korkein TVL", - "fee.tier.label": "%, jonka ansaitset maksuina", - "fee.tier.missing.description": "Etkö löydä etsimääsi tasoa?", - "fee.tier.new": "Uusi taso", - "fee.tier.percent.select": "{{percentage}} valitse", - "fee.tier.recommended.description": "Suositus perustuu valitun rahakeparin korkeimpaan likviditeettiosuuteen.", - "fee.tier.search": "Hae tai luo muita maksutasoja", - "fee.tier.search.short": "Hakutasot", - "fee.tier.select": "Valitse maksutaso", - "fee.tier.select.existing.button": "Valitse nykyinen maksutaso", - "fee.tierExact": "{{fee}} maksutaso", - "fee.unavailable": "Ansaitut palkkiot eivät näy v2-positioissa ennen kuin likviditeetti on poistettu.", - "fee.uncollected": "Sisältää perimättömät maksut:", - "fee.uniswap": "Maksu ({{percent}})", - "fee.uniswap.description": "Maksut lisätään parhaan mahdollisen käyttökokemuksen varmistamiseksi Uniswapin kanssa.", - "fiatOffRamp.checkout.title": "Nosta kohteeseen", - "fiatOffRamp.connection.quote": "Myydään {{amount}} arvosta {{currencySymbol}}", - "fiatOffRamp.error.balance": "Ylittää tasapainon", - "fiatOffRamp.error.populateSend.description": "Odota hetki ja yritä uudelleen.", - "fiatOffRamp.error.populateSend.title": "Tapahtumaa ei voida ladata", - "fiatOffRamp.summary.total": "{{cryptoAmount}} {{fiatAmount}}:lle", - "fiatOffRamp.unsupportedToken.back": "Mene takaisin", - "fiatOffRamp.unsupportedToken.divider": "Tunnuksia ei tueta", - "fiatOffRamp.unsupportedToken.message": "Tämän tunnuksen myyntiä ei tueta. Vaihda tämä omaisuus johonkin tuetuista tunnuksista.", - "fiatOffRamp.unsupportedToken.swap": "Vaihda tuettuun tunnukseen", - "fiatOffRamp.unsupportedToken.title": "Tunnusta ei tueta", - "fiatOffRamp.welcome.tooltip": "Myy kryptosi pankkitilillesi tai pankkikortillesi.", - "fiatOnRamp.button.chooseToken": "Valitse tunnus", - "fiatOnRamp.buy.info.description": "Tarvitset sitä verkkokulujen maksamiseen vaihdon yhteydessä.", - "fiatOnRamp.buy.info.title": "Aloita ETH:lla", - "fiatOnRamp.cexTransferModal.description": "Krypton ostamista kortilla ei tueta alueellasi. Siirrä varoja keskitetyltä vaihtotililtä rahoittaaksesi lompakkosi.", - "fiatOnRamp.cexTransferModal.title": "Aloita siirto", - "fiatOnRamp.checkout.title": "Kassalle", - "fiatOnRamp.chooseMultiPlatformProvider.chooseNetwork": "Valitse verkko", - "fiatOnRamp.chooseMultiPlatformProvider.description": "Tämä määrittää lompakon osoitteen, johon saat rahat.", - "fiatOnRamp.chooseProvider.description": "Siirryt palveluntarjoajan portaaliin nähdäksesi tapahtumaasi liittyvät maksut.", - "fiatOnRamp.completeTransactionHeader": "Suorita tapahtuma loppuun {{serviceProvider}}", - "fiatOnRamp.connection.error": "Yhteys epäonnistui", - "fiatOnRamp.connection.errorDescription": "Jotain meni pieleen yhdistettäessä kohteeseen {{serviceProvider}}.", - "fiatOnRamp.connection.message": "Yhdistetään kohteeseen {{serviceProvider}}", - "fiatOnRamp.connection.quote": "Ostat {{amount}} arvosta {{currencySymbol}}", - "fiatOnRamp.connection.terms": "Jatkamalla hyväksyt, että sinua koskevat Palveluehdot ja Tietosuojakäytäntö ja {{serviceProvider}}soveltuvin osin.", - "fiatOnRamp.continueInTab": "Jatka siirtymällä välilehdelle {{serviceProvider}} . Tämä modaali on turvallista sulkea nyt.", - "fiatOnRamp.disclaimer": "Jatkamalla hyväksyt, että sinua koskevat Palveluehdot ja Tietosuojakäytäntö ja {{serviceProvider}}soveltuvin osin.", - "fiatOnRamp.error.default": "Jotain meni pieleen.", - "fiatOnRamp.error.load": "Ei voitu ladata tunnuksia ostettaviksi", - "fiatOnRamp.error.max": "Enintään {{amount}}", - "fiatOnRamp.error.min": "Minimi {{amount}}", - "fiatOnRamp.error.noQuotes": "Lainauksia ei löytynyt.", - "fiatOnRamp.error.unavailable": "Tämä palvelu ei ole saatavilla alueellasi", - "fiatOnRamp.error.unsupported": "Ei tuettu alueella", - "fiatOnRamp.error.usd": "Saatavilla vain USD:ssä", - "fiatOnRamp.noQuotes.error": "Lainauksia ei löytynyt", - "fiatOnRamp.paymentMethods.applePay": "Apple Pay", - "fiatOnRamp.paymentMethods.bank": "Pankki", - "fiatOnRamp.paymentMethods.debit": "Veloittaa", - "fiatOnRamp.paymentMethods.googlePay": "Google Pay", - "fiatOnRamp.paymentMethods.paypal": "PayPal", - "fiatOnRamp.paymentMethods.venmo": "Venmo", - "fiatOnRamp.quote.advice": "Siirryt palveluntarjoajan portaaliin nähdäksesi tapahtumaasi liittyvät maksut.", - "fiatOnRamp.quote.type.list": "{{optionsList}}ja muita vaihtoehtoja", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "Tililtä", - "fiatOnRamp.receiveCrypto.title": "Vastaanota krypto", - "fiatOnRamp.receiveCrypto.transferFunds": "Rahoita lompakkoosi siirtämällä kryptoa toisesta lompakosta tai tililtä", - "fiatOnRamp.receiveCrypto.useThisAddress": "Käytä tätä osoitetta vastaanottaaksesi tokeneita", - "fiatOnRamp.region.placeholder": "Hae maan tai alueen mukaan", - "fiatOnRamp.region.title": "Valitse alueesi", - "fiatOnRamp.summary.total": "{{cryptoAmount}} {{fiatAmount}}:lle", - "forceUpgrade.action.backup": "Varmuuskopioi lompakkosi", - "forceUpgrade.action.confirm": "Päivitä nyt", - "forceUpgrade.action.learn": "Opi päivittämään", - "forceUpgrade.description.extension": "Sovelluksesta on saatavilla uusi versio. Jos haluat jatkaa Uniswap-laajennuksen käyttöä, päivitä se uusimpaan versioon.", - "forceUpgrade.description.wallet": "Sovelluksesta on saatavilla uusi versio. Jos haluat jatkaa Uniswap Walletin käyttöä, päivitä se uusimpaan versioon.", - "forceUpgrade.label.recoveryPhrase": "Palautuslause", - "forceUpgrade.title": "Päivitä uusimpaan versioon", - "forceUpgrade.title.recommendedStatus": "Uusi versio on saatavilla", - "globalPreferences.title": "Globaalit mieltymykset", - "hero.scroll": "Vieritä saadaksesi lisätietoja", - "hero.subtitle": "Buy and sell crypto on {{amount}}+ networks including Ethereum, Unichain, and Base.", - "hero.swap.title": "Vaihda milloin tahansa,
missä tahansa.", - "hidden.nfts.info.banner.text": "Lisätietoja piilotetuista NFT:istä", - "hidden.nfts.info.text.button": "Piilotetut NFT:t ({{numHidden}})", - "hidden.nfts.info.text.extension": "Nämä ovat mahdollisia huijauksia ja NFT:itä, joita olet piilottanut. Voit näyttää NFT:n napsauttamalla hiiren kakkospainikkeella sitä.", - "hidden.nfts.info.text.mobile": "Nämä ovat mahdollisia huijauksia ja NFT:itä, joita olet piilottanut. Voit tuoda sen näkyviin painamalla pitkään NFT:tä.", - "hidden.nfts.info.text.title": "Piilotetut NFT:t", - "hidden.tokens.info.banner.text": "Lisätietoja piilotetuista tunnuksista", - "hidden.tokens.info.text.button": "Piilotetut merkit ({{numHidden}})", - "hidden.tokens.info.text.info": "Nämä ovat mahdollisia huijauksia, pieniä saldoja ja piilotettuja tunnuksia. Piilotetut rahakkeet eivät sisälly lompakkosi kokonaissaldoon.", - "hidden.tokens.info.text.title": "Piilotetut merkit", - "home.activity.empty.button": "Vastaanota tunnuksia tai NFT:itä", - "home.activity.empty.description.default": "Kun hyväksyt, vaihdat tai siirrät rahakkeita tai NFT:itä, tapahtumasi näkyvät täällä.", - "home.activity.empty.description.external": "Kun tämä lompakko suorittaa tapahtumia, ne näkyvät täällä.", - "home.activity.empty.title": "Ei toimintaa vielä", - "home.activity.error.load": "Toimintoa ei voitu ladata", - "home.activity.title": "Toiminta", - "home.banner.offline": "Olet offline-tilassa", - "home.banner.testnetMode": "Olet testiverkkotilassa", - "home.banner.testnetMode.nav": "Olet testiverkkotilassa. Kytke tämä pois päältä asetuksista.", - "home.empty.cexTransfer": "Siirtää", - "home.empty.cexTransfer.description": "Siirrä varoja kaupankäyntialustalta.", - "home.empty.transfer": "Vastaanota krypto", - "home.empty.transfer.description": "Siirrä varoja toisesta lompakosta.", - "home.explore.footer": "Napauta tätä tutkiaksesi tuhansia tokeneita, NFT:itä ja paljon muuta", - "home.explore.title": "Tutustu tokeneihin", - "home.extension.error": "Virhe ladattaessa tilejä", - "home.label.buy": "Ostaa", - "home.label.for": "Osta/Myy", - "home.label.receive": "Vastaanottaa", - "home.label.send": "Lähettää", - "home.label.swap": "Vaihtaa", - "home.nfts.title": "NFT:t", - "home.tokens.empty.action.buy.description": "Osta debit-kortilla tai pankkitilillä.", - "home.tokens.empty.action.buy.title": "Osta krypto", - "home.tokens.empty.action.import.description": "Syötä tämän lompakon palautuslause aloittaaksesi vaihtamisen ja lähettämisen.", - "home.tokens.empty.action.import.title": "Tuo lompakko", - "home.tokens.empty.action.receive.description": "Siirto toiselta lompakolta tai tililtä.", - "home.tokens.empty.action.receive.title": "Vastaanota krypto", - "home.tokens.empty.description": "Kun tämä lompakko ostaa tai vastaanottaa rahakkeita, ne näkyvät täällä.", - "home.tokens.empty.title": "Ei vielä tunnuksia", - "home.tokens.empty.welcome.description": "Lisää varoja kaupankäynnin aloittamiseksi", - "home.tokens.error.fetch": "Token-saldojen nouto epäonnistui", - "home.tokens.error.load": "Tunnussaldoa ei voitu ladata", - "home.tokens.title": "Tokenit", - "home.upsell.receive.cta": "Tililtä", - "home.upsell.receive.title": "Vastaanota krypto", - "home.warning.viewOnly": "Tämä lompakko on vain näkyvissä", - "interface.metatags.description": "Vaihda kryptovaluuttaa Ethereumissa, Basessa, Arbitrumissa, Polygonissa, Unichainissa ja muissa. DeFi-alusta, johon miljoonat ihmiset luottavat.", - "interface.metatags.title": "Uniswap-käyttöliittymä", - "landing.api": "API", - "landing.appsOverview": "Rakennettu kaikkia vaihtotapojasi varten", - "landing.blog.description": "Pysy ajan tasalla yrityksen uusimmista uutisista, tuoteominaisuuksista ja muusta", - "landing.docs.description": "Tutustu kehittäjädokumentaatiokirjastoomme ja aloita rakentaminen Uniswapilla", - "landing.exploreUniverse": "Tutki maailmankaikkeutta", - "landing.getStarted": "Käy kauppaa maailman suurimmalla DEX-pörssillä", - "landing.helpCenter.body": "Selaa usein kysyttyjä kysymyksiä ja pyydä tukea yhdysvaltalaiselta tukitiimiltämme", - "landing.protocolDescription": "Uniswap Labs ylläpitää joitakin kryptoalan käytetyimmistä tuotteista. Koe luvaton käyttö, todistettu turvallisuus ja omistautunut tuki.", - "landing.protocolStats": "Uniswap-protokollan tilastot", - "landing.provideLiquidity.body": "Tarjoa likviditeettiä ja kerää maksuja Uniswap-rajapinnan kautta.", - "landing.provideLiquidity.subtitle": "Power-onchain-markkinat.", - "landing.socials": "Seuraa Uniswap Labsia X, Farcasterissa, LinkedInissäja TikTokissa", - "landing.swapBody": "Käytä syvää likviditeettiä, tutki tokeneita, aseta rajahintatoimeksiantoja ja tarjoa likviditeettiä tuhansille tokeneille {{amount}} ketjuissa.", - "landing.swapSubtitle": "Luvaton vaihtaminen.", - "landing.tradingApi": "Kaupankäynti-API", - "landing.tradingApiBody": "Käytä samaa API:a, joka tukee Uniswap-verkkosovellusta ja -lompakkoa, joihin johtavat tiimit ympäri maailmaa luottavat.", - "landing.tradingApiButton": "Integroi Uniswap-rajapinta", - "landing.tradingApiSubtitle": "DeFi, suoraan käyttäjillesi.", - "landing.trusted": "Miljoonien luottamiin", - "landing.unichain.body": "Liity yhteisöön, joka rakentaa nopeaa ja hajautettua Ethereum L2:ta, joka on rakennettu DeFi:n kodiksi.", - "landing.unichain.button": "Aloita rakentaminen", - "landing.unichain.subtitle": "DeFi-ketju.", - "landing.uniswapX.body": "Kaasuttomat tapahtumat ja MEV-suojaus, ilman kuluja epäonnistuneista swapeista.", - "landing.uniswapX.button": "Koe UniswapX", - "landing.uniswapX.subtitle": "Älykkäämpiä vaihtoja, ei kitkaa.", - "landing.walletBody": "Luotettu itsesäilytyskelpoinen kryptolompakko ja -laajennus, jolla on miljoonia latauksia, oikeiden ihmisten tuki ja 4,8 -arvosana.", - "landing.walletSubtitle": "Vaihda, säilytä, tutki.", - "language.afrikaans": "afrikaans", - "language.arabic": "arabia", - "language.catalan": "katalaani", - "language.chineseSimplified": "Yksinkertaistettu kiina", - "language.chineseTraditional": "Kiinalainen perinteinen", - "language.czech": "Tšekki", - "language.danish": "tanskalainen", - "language.dutch": "Hollannin kieli", - "language.english": "Englanti", - "language.finnish": "suomalainen", - "language.french": "Ranskan kieli", - "language.greek": "kreikkalainen", - "language.hebrew": "heprealainen", - "language.hindi": "hindi", - "language.hungarian": "Unkari", - "language.indonesian": "Indonesialainen", - "language.italian": "italialainen", - "language.japanese": "japanilainen", - "language.korean": "korealainen", - "language.malay": "malaiji", - "language.norwegian": "norjalainen", - "language.polish": "Kiillottaa", - "language.portuguese": "Portugalin kieli", - "language.romanian": "romanialainen", - "language.russian": "Venäjän kieli", - "language.serbian": "serbia", - "language.spanishArgentina": "Espanja (Argentiina)", - "language.spanishBelize": "espanja (Belize)", - "language.spanishBolivia": "Espanja (Bolivia)", - "language.spanishChile": "espanja (Chile)", - "language.spanishColombia": "Espanja (Kolumbia)", - "language.spanishCostaRica": "Espanja (Costa Rica)", - "language.spanishCuba": "Espanja (Kuuba)", - "language.spanishDominicanRepublic": "Espanja (Dominikaaninen tasavalta)", - "language.spanishEcuador": "Espanja (Ecuador)", - "language.spanishElSalvador": "Espanja (El Salvador)", - "language.spanishGuatemala": "Espanja (Guatemala)", - "language.spanishHonduras": "espanja (Honduras)", - "language.spanishLatam": "espanja (Latinalainen Amerikka)", - "language.spanishMexico": "Espanja (Meksiko)", - "language.spanishNicaragua": "espanja (Nicaragua)", - "language.spanishPanama": "Espanja (Panama)", - "language.spanishParaguay": "espanja (Paraguay)", - "language.spanishPeru": "espanja (Peru)", - "language.spanishPuertoRico": "Espanja (Puerto Rico)", - "language.spanishSpain": "espanja (Espanja)", - "language.spanishUruguay": "espanja (Uruguay)", - "language.spanishUs": "espanja (USA)", - "language.spanishVenezuela": "Espanja (Venezuela)", - "language.swahili": "swahili", - "language.swedish": "ruotsinkielinen", - "language.turkish": "turkkilainen", - "language.ukrainian": "ukrainalainen", - "language.urdu": "urdu", - "language.vietnamese": "vietnam", - "large.price.difference": "Suuri hintaero", - "large.price.difference.tooltip": "Tämän kaupan jatkaminen johtaa varojen menetykseen. Tämä ero voi johtua suurista kaupoista tai alhaisesta likviditeetistä.", - "limit.open.count_one": "1 avoin raja", - "limit.open.count_other": "{{count}} avoimet rajat", - "limitPrice.buyingAboveMarketPrice.error.description": "Rajahintasi on {{percentage}}% korkeampi kuin markkinahinta. Jatka säätämällä rajahintaasi.", - "limitPrice.buyingAboveMarketPrice.error.title": "Ostaminen {{tokenSymbol}} markkinahinnan yläpuolella", - "limitPrice.marketPriceNotAvailable.error.description": "Emme pysty laskemaan nykyistä markkinahintaa. Vältä markkinahinnan alemman tilauksen lähettäminen tarkistamalla verkkoyhteytesi ja yrittämällä uudelleen.", - "limitPrice.marketPriceNotAvailable.error.title": "Markkinahinta ei saatavilla", - "limitPrice.sellingBelowMarketPrice.error.description": "Rajahintasi on {{percentage}}% alhaisempi kuin markkinahinta. Säädä rajahintaasi jatkaaksesi.", - "limitPrice.sellingBelowMarketPrice.error.title": "Myydään {{tokenSymbol}} alle markkinahinnan", - "limits.form.disclaimer.mainnet": "Vain Ethereumin verkkotunnukset ovat saatavilla rajoituksille. ", - "limits.form.disclaimer.mainnet.short": "Vain Mainnet-tunnukset ovat saatavilla rajoituksille.", - "limits.form.disclaimer.uniswapx": "Limiitit eivät välttämättä toimi tarkasti, kun rahakkeet saavuttavat määritetyn hinnan. ", - "limits.learnMore": "Lue lisää rajoituksista", - "limits.price.input.label": "Kun 1 on arvoinen", - "limits.price.label": "Rajahinta", - "limits.selectSupportedTokens": "Valitse tuetut tunnukset", - "liquidity.hooks": "Koukut v4:ssä", - "liquidity.hooks.address.input": "Syötä koukun osoite", - "liquidity.hooks.address.tooltip": "Koukkuosoite: {{address}}", - "liquidity.learnMoreLabel": "Tutustu likviditeetin tarjoamiseen", - "liquidity.notEnough.label": "Likviditeetti ei riitä tarkan USD-arvon näyttämiseen.", - "liquidity.provideOnProtocols": "Likviditeetin tarjoaminen eri protokollilla", - "liquidityPool.page.title": "Lisää likviditeettiä pooleihin{{version}} Uniswapissa", - "liquidityPool.positions.closed.title": "Suljetut paikat", - "liquidityPool.positions.loadingMore": "Ladataan lisää työpaikkoja...", - "liquidityPool.positions.page.title": "Hallitse {{quoteSymbol}}/{{baseSymbol}} poolin likviditeettiä Uniswapissa", - "liquidityPool.positions.page.version.description": "Tarkastele aktiivisia {{version}} likviditeettipositioitasi. Lisää uusia paikkoja.", - "liquidityPool.positions.page.version.title": "Hallitse poolin likviditeettiä{{version}} Uniswapissa", - "migrate.allowed": "Sallittu", - "migrate.allowLpMigration": "Salli LP-tunnuksen siirto", - "migrate.connectAccount": "Sinun on yhdistettävä tili, joka omistaa tämän aseman.", - "migrate.connectWallet": "Yhdistä lompakkoon nähdäksesi V2-likviditeettisi.", - "migrate.contract": "Uniswap-siirtosopimus", - "migrate.firstLP": "Olet ensimmäinen likviditeetin tarjoaja tälle Uniswap V3 -poolille. Likviditeettisi siirtyy nykyiseen {{source}} hintaan.", - "migrate.highGasCost": "Transaktiokustannukset ovat paljon korkeammat, koska ne sisältävät poolin luomiseen tarvittavan kaasun.", - "migrate.invalidRange": "Valittu alue on virheellinen. Vähimmäishinnan on oltava alempi kuin enimmäishinta.", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} LP-tunnukset", - "migrate.migrating": "Muutto", - "migrate.missingV2Position": "Etkö näe yhtä v2-paikoistasi? Tuo se.", - "migrate.noV2Liquidity": "V2-likviditeettiä ei löytynyt.", - "migrate.positionNoFees": "Positiosi ei ansaitse maksuja eikä sitä käytetä kaupoissa ennen kuin markkinahinta siirtyy vaihteluvälillesi.", - "migrate.priceDifference": "Hintaero: ", - "migrate.priceWarning": "Sinun tulee tallettaa vain likviditeettiä Uniswap V3:een hintaan, jonka uskot oikeaksi.
Jos hinta vaikuttaa väärältä, voit joko vaihtaa hintaa tai odottaa, että joku muu tekee niin.", - "migrate.refund": "Vähintään {{amtA}} {{symA}} ja {{amtB}} {{symB}} hyvitetään lompakkoosi valitun hintaluokan vuoksi.", - "migrate.selectFeeTier": "Valitse maksutaso", - "migrate.setRange": "Aseta hintaluokka", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Hinta:", - "migrate.v2Description": "Tämä työkalu siirtää {{source}} likviditeettisi turvallisesti V3:een. Prosessi on täysin luotettava <0>Uniswap-siirtosopimuksen ansiosta ↗", - "migrate.v2Instruction": "Napsauta kunkin alla näytetyn poolin kohdalla Siirrä poistaaksesi likviditeettisi Uniswap V2:sta ja talleta se Uniswap V3:een.", - "migrate.v2Title": "Siirrä V2-likviditeetti", - "migrate.v3Price": "V3 {{sym}} Hinta:", - "mint.v3.input.invalidPrice.error": "Virheellinen hintasyöttö", - "mobileAppPromo.banner.getTheApp.link": "Hanki Uniswap Wallet -sovellus", - "mobileAppPromo.banner.title": "Uniswap: Crypto & NFT Wallet", - "moonpay.poweredBy": "MoonPay USA LLC:n tuottama Fiat onramp", - "nav.createAccount.button": "Luo tili", - "nav.logIn.button": "Kirjaudu sisään", - "nav.logInOrConnect.title": "Kirjaudu sisään tai muodosta yhteys", - "nav.products.tradingApi": "Integroi protokolla", - "nav.products.unichain": "DeFi-ketju", - "nav.products.uniswapX": "Meta-aggregaattori", - "nav.products.wallet": "Vaihda, säilytä, tutki", - "nav.signUp.button": "Rekisteröidy", - "nav.tabs.createPosition": "Luo asema", - "nav.tabs.viewPositions": "Näytä paikat", - "network.lostConnection": "Olet ehkä menettänyt verkkoyhteytesi.", - "network.mightBeDown": "{{network}} saattaa olla poissa juuri nyt tai olet ehkä menettänyt verkkoyhteytesi.", - "network.warning": "Verkkovaroitus", - "nft.noPools": "Ei vielä uima-altaita", - "nft.reportSpam": "Ilmoita roskapostiksi", - "notFound.oops": "Oho, vie minut takaisin Swapiin", - "notice.uk": "Tämä verkkosovellus on työkalu, jonka avulla käyttäjät voivat olla vuorovaikutuksessa Uniswap-protokollan kanssa omasta aloitteestaan ilman kryptovaluuttakaupan tukemista tai suosituksia. Näin tehdessään Uniswap ei suosittele käyttäjille tai potentiaalisille käyttäjille kryptoomaisuuskaupan toimintaa, ja käyttäjien tai verkkosovelluksen potentiaalisten käyttäjien ei tulisi pitää tätä verkkosivua tai sen sisältöä sisältävänä minkäänlaista suositusta, kutsua tai kannustamista salausomaisuuskauppaan. .", - "notice.uk.label": "Iso-Britannian vastuuvapauslauseke:", - "notification.assetVisibility.hidden": "{{assetName}} piilotettu", - "notification.assetVisibility.unhidden": "{{assetName}} piilotettu", - "notification.buy.network": "Ostaminen {{network}}-palvelusta", - "notification.copied.address": "Osoite kopioitu", - "notification.copied.calldata": "Puhelutiedot kopioitu", - "notification.copied.contractAddress": "Sopimuksen osoite kopioitu", - "notification.copied.failed": "Kopioiminen leikepöydälle epäonnistui", - "notification.copied.image": "Kuva kopioitu", - "notification.copied.linkUrl": "Linkki kopioitu", - "notification.copied.nftUrl": "NFT-URL kopioitu", - "notification.copied.poolId": "Poolin tunnus kopioitu", - "notification.copied.tokenUrl": "Tokenin URL-osoite kopioitu", - "notification.copied.transactionId": "Tapahtumatunnus kopioitu", - "notification.copied.unitag": "Käyttäjätunnus kopioitu", - "notification.countryChange": "Vaihdettu arvoon {{countryName}}", - "notification.limit.network": "Rajatoimeksiannon luominen {{network}}", - "notification.lp.network": "Tarjoaa likviditeettiä {{network}}:lle", - "notification.network.changed": "Vaihdettu arvoon {{network}}", - "notification.passwordChanged": "Salasana vaihdettu", - "notification.poolFinder.network": "Hae allasta {{network}}:sta", - "notification.restore.success": "Lompakko kunnostettu!", - "notification.sell.network": "Myydään {{network}}hintaan", - "notification.send.network": "Lähetetään {{network}}", - "notification.smartWallet.disabled": "Pois käytöstä yhdessä verkossa", - "notification.smartWallet.disabled.all": "Älylompakko poistettu käytöstä", - "notification.smartWallet.disabled.plural": "Pois käytöstä {{amount}} verkoissa", - "notification.spam.NFT.failed": "NFT:tä ei voitu ilmoittaa. Yritä myöhemmin uudelleen.", - "notification.spam.NFT.successful": "Ilmoitettu", - "notification.swap.network": "Vaihto {{network}}", - "notification.swap.pending.swap": "Vaihto odottaa", - "notification.swap.pending.unwrap": "Purkaminen odottaa", - "notification.swap.pending.wrap": "Wrap odottaa", - "notification.transaction.approve.canceled": "Peruutettu {{currencySymbol}} hyväksy.", - "notification.transaction.approve.fail": "{{currencySymbol}} :n hyväksyminen käytettäväksi kanssa {{address}}epäonnistui.", - "notification.transaction.approve.success": "Hyväksytty {{currencySymbol}} käytettäväksi {{address}}kanssa.", - "notification.transaction.pending": "Tapahtuma vireillä", - "notification.transaction.swap.canceled": "{{inputCurrencySymbol}}-{{outputCurrencySymbol}} vaihto peruutettu.", - "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} {{outputCurrencyAmountWithSymbol}} -vaihtosopimukselle vanhentunut.", - "notification.transaction.swap.fail": "{{inputCurrencyAmountWithSymbol}} vaihtaminen {{outputCurrencyAmountWithSymbol}}:ksi epäonnistui.", - "notification.transaction.swap.success": "Vaihdettu {{inputCurrencyAmountWithSymbol}} kohteeksi {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.transfer.canceled": "Peruutettu {{tokenNameOrAddress}} lähetys", - "notification.transaction.transfer.fail": "{{tokenNameOrAddress}} lähettäminen numeroon {{walletNameOrAddress}}epäonnistui", - "notification.transaction.transfer.received": "Vastaanotettu {{tokenNameOrAddress}} kohteesta {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "Lähetettiin {{tokenNameOrAddress}} numeroon {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "Tapahtuman suorittaminen kohteen {{addressOrEnsName}}kanssa epäonnistui", - "notification.transaction.unknown.fail.short": "Tapahtuma epäonnistui", - "notification.transaction.unknown.success.full": "Kauppa käytiin {{addressOrEnsName}}:n kanssa", - "notification.transaction.unknown.success.short": "Kauppa vahvistettu", - "notification.transaction.unwrap.canceled": "Peruutettu {{inputCurrencySymbol}} purkaminen.", - "notification.transaction.unwrap.fail": "{{inputCurrencyAmountWithSymbol}}purkaminen epäonnistui.", - "notification.transaction.unwrap.success": "Purettu {{inputCurrencyAmountWithSymbol}} ja vastaanotettu {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.canceled": "Peruutettu {{inputCurrencySymbol}} wrap.", - "notification.transaction.wrap.fail": "Kääriminen {{inputCurrencyAmountWithSymbol}}epäonnistui.", - "notification.transaction.wrap.success": "Kääritty {{inputCurrencyAmountWithSymbol}} ja vastaanotettu {{outputCurrencyAmountWithSymbol}}.", - "notification.transfer.pending": "Lähetys odottaa", - "notification.walletConnect.confirmed": "Tapahtuma vahvistettiin {{dappName}}", - "notification.walletConnect.connected": "Yhdistetty", - "notification.walletConnect.disconnected": "Yhteys katkaistu", - "notification.walletConnect.failed": "Tapahtuma epäonnistui kanssa {{dappName}}", - "notification.walletConnect.networkChanged.full": "Vaihdettu arvoon {{networkName}}", - "notification.walletConnect.networkChanged.short": "Kytketyt verkot", - "notifications.scantastic.subtitle": "Jatka Uniswap-laajennuksesta", - "notifications.scantastic.title": "Menestys!", - "onboarding.backup.manual.banner": "Suosittelemme, että kirjoitat tämän paperille ja säilytät sen turvallisessa paikassa, kuten tallelokerossa.", - "onboarding.backup.manual.displayWarning.description": "Lue seuraava huolellisesti ennen kuin jatkat.", - "onboarding.backup.manual.displayWarning.note.access": "Tämä palautuslause antaa sinulle täyden pääsyn lompakkoosi ja varoihin", - "onboarding.backup.manual.displayWarning.note.secure": "Katso tämä yksityisesti äläkä jaa sitä kenenkään kanssa", - "onboarding.backup.manual.displayWarning.note.storage": "Kirjoita se muistiin ja säilytä se turvallisessa paikassa", - "onboarding.backup.manual.displayWarning.title": "Joitakin tärkeitä asioita tietää", - "onboarding.backup.manual.error": "Virheellinen tai väärin kirjoitettu sana", - "onboarding.backup.manual.placeholder": "Salasana", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} valmis", - "onboarding.backup.manual.selectedWordPlaceholder": "Valitse sana", - "onboarding.backup.manual.subtitle_one": "Mikä on palautuslauseesi {{count}}st sana?", - "onboarding.backup.manual.subtitle_two": "Mikä on {{count}}:n sana palautuslauseessasi?", - "onboarding.backup.manual.subtitle_few": "Mikä on {{count}}kolmas sana palautuslausekkeessasi?", - "onboarding.backup.manual.subtitle_other": "Mikä on palautuslauseesi {{count}}:s sana?", - "onboarding.backup.manual.title": "Varmistetaan, että olet tallentanut sen oikein", - "onboarding.backup.option.badge.quick": "Nopea", - "onboarding.backup.option.cloud.description": "Varmuuskopioi lompakkosi kautta {{cloudProviderName}}, suojattu palautussalasanalla.", - "onboarding.backup.option.cloud.title": "Aseta palautussalasana", - "onboarding.backup.option.manual.description": "Kirjoita 12 salaista sanaasi paperille ja säilytä ne turvallisessa paikassa.", - "onboarding.backup.option.manual.title": "Kirjoita palautuslause muistiin", - "onboarding.backup.reminder.backupNowButton": "Varmuuskopioi nyt", - "onboarding.backup.reminder.remindMeLaterButton": "Muistuta minua myöhemmin", - "onboarding.backup.reminder.title": "Varmuuskopioi lompakkosi", - "onboarding.backup.reminder.warning.description": "Varmuuskopioi lompakkosi, jotta voit saada omaisuutesi takaisin, jos kadotat puhelimesi tai hankit uuden.", - "onboarding.backup.reminder.warning.fundsLabel": "Vaarassa olevat varat", - "onboarding.backup.reminder.warning.title": "Saatat menettää rahasi", - "onboarding.backup.speedBump.cloud.description": "Jos unohdat sen, emme voi nollata sitä puolestasi. Kirjoita se muistiin turvalliseen paikkaan tai säilytä se turvallisesti salasanan hallinnassa.", - "onboarding.backup.speedBump.cloud.disclaimer": "Ymmärrän, että Uniswap Labs ei voi nollata palautussalasanaani.", - "onboarding.backup.speedBump.cloud.title": "On tärkeää tallentaa tämä salasana", - "onboarding.backup.speedBump.manual.description": "Varmista, että kirjoitit palautuslauseen oikein ja että sinulla on turvallinen paikka säilyttää se.", - "onboarding.backup.speedBump.manual.disclaimer": "Ymmärrän, että Uniswap Labs ei voi palauttaa lompakkoani, jos kadotan tämän.", - "onboarding.backup.speedBump.manual.title": "Ennen kuin lopetat...", - "onboarding.backup.subtitle": "Näin saat takaisin lompakkosi, jos poistat sovelluksen tai kadotat laitteesi.", - "onboarding.backup.title.existing": "Varmuuskopioi lompakkosi", - "onboarding.backup.title.new": "Valitse varmuuskopiointitapa", - "onboarding.backup.view.subtitle.message1": "Lue seuraava huolellisesti ennen kuin jatkat", - "onboarding.backup.view.subtitle.message2": "Sinun on syötettävä kaikki nämä 12 salaista sanaa palauttaaksesi lompakkosi.", - "onboarding.backup.view.title": "Kirjoita palautuslauseesi muistiin", - "onboarding.backup.view.warning.message1": "Tämä palautuslause antaa sinulle täyden pääsyn lompakkoosi ja varoihin", - "onboarding.backup.view.warning.message2": "Kirjoita se muistiin ja säilytä se turvallisessa paikassa", - "onboarding.backup.view.warning.message3": "Katso tämä yksityisesti ja älä jaa sitä kenenkään kanssa", - "onboarding.cloud.confirm.description": "Sinun on syötettävä tämä palauttaaksesi varat. Jos unohdat sen, emme voi palauttaa sitä puolestasi.", - "onboarding.cloud.confirm.title": "Vahvista palautussalasanasi", - "onboarding.cloud.createPassword.description": "Sinun on syötettävä tämä palauttaaksesi varat. Jos unohdat sen, emme voi palauttaa sitä puolestasi.", - "onboarding.cloud.createPassword.title": "Luo palautussalasanasi", - "onboarding.complete.button": "Avaa Uniswap-laajennus", - "onboarding.complete.description": "Lompakkosi on valmis lähettämään ja vastaanottamaan kryptomaksuja. Avaa Uniswap-laajennus alla olevalla pikakuvakkeella.", - "onboarding.complete.go_to_uniswap": "Siirry Uniswap-verkkosovellukseen", - "onboarding.complete.pin.description": "Napsauta kiinnityskuvaketta lisätäksesi Uniswap-laajennuksen työkalupalkkiisi.", - "onboarding.complete.pin.title": "Pin Uniswap-laajennus", - "onboarding.complete.title": "Olet valmis", - "onboarding.extension.biometrics.subtitle.fingerprint": "Käytä lompakkoasi nopeasti ja turvallisesti pelkällä sormenjäljellä.", - "onboarding.extension.biometrics.title": "Ota {{biometricsMethod}}käyttöön", - "onboarding.extension.password.subtitle": "Tarvitset tätä lompakkosi lukituksen avaamiseen ja palautuslausekkeen käyttämiseen", - "onboarding.extension.password.title.default": "Luo salasana", - "onboarding.extension.password.title.reset": "Nollaa salasana", - "onboarding.extension.unsupported.android.description": "Uniswap-laajennus on yhteensopiva vain pöytätietokoneen Chromen kanssa.", - "onboarding.extension.unsupported.android.title": "Chromea mobiililaitteella ei tueta (vielä)", - "onboarding.extension.unsupported.description": "Uniswap-laajennus on tällä hetkellä yhteensopiva vain Chromen kanssa.", - "onboarding.extension.unsupported.title": "Tätä selainta ei tueta (vielä)", - "onboarding.home.intro.backup.description.extension": "Tallenna palautuslausekkeesi varmistaaksesi, ettet koskaan menetä pääsyä lompakkoosi.", - "onboarding.home.intro.backup.description.mobile": "Laadi palautussuunnitelma siltä varalta, että kadotat puhelimesi tai saat uuden.", - "onboarding.home.intro.backup.title": "Varmuuskopioi lompakkosi", - "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK ja JUP — nyt saatavilla Unichainissa", - "onboarding.home.intro.bridgedAssets.title": "Vaihda uusia tokeneita Unichainissa", - "onboarding.home.intro.fund.description": "Rahoita lompakkosi ostamalla kryptoa tai siirtämällä toiselta tililtä.", - "onboarding.home.intro.fund.title": "Hanki ensimmäinen tunnus", - "onboarding.home.intro.label.required": "Pakollinen", - "onboarding.home.intro.label.swipe": "Pyyhkäise", - "onboarding.home.intro.pushNotifications.description": "Hanki hintahälytyksiä suosikkitunnuksistasi, markkinatrendeistäsi ja muusta.", - "onboarding.home.intro.pushNotifications.title": "Pysy ajan tasalla", - "onboarding.home.intro.unitag.description": "Luo henkilökohtainen web3-profiili ja jaa osoitteesi helposti ystävien kanssa.", - "onboarding.home.intro.unitag.title": "Lunasta käyttäjänimesi {{unitagDomain}}", - "onboarding.import.error.invalidWords_one": "1 sana on virheellinen tai kirjoitettu väärin", - "onboarding.import.error.invalidWords_other": "{{count}} sanat ovat virheellisiä tai kirjoitettu väärin", - "onboarding.import.method.restore.message.android": "Lisää varmuuskopioidut lompakot Google Drive -tiliisi.", - "onboarding.import.method.restore.message.ios": "Lisää varmuuskopioidut lompakot iCloud-tiliisi.", - "onboarding.import.method.restore.title": "Palauta lompakko", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.android": "Syötä palautussalasanasi palauttaaksesi lompakkosi Google Driven varmuuskopion kautta.", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.ios": "Syötä palautussalasanasi palauttaaksesi lompakkosi iCloud-varmuuskopion kautta.", - "onboarding.import.method.restoreSeedPhrase.cloud.title.android": "Palauta Google Drivesta", - "onboarding.import.method.restoreSeedPhrase.cloud.title.ios": "Palauta iCloudista", - "onboarding.import.method.restoreSeedPhrase.title": "Valitse lompakon palauttamistapa", - "onboarding.import.method.restoreSeedPhrase.wallet.desc": "Syötä 12 salaista sanaa, jotka olet aiemmin tallentanut turvalliseen paikkaan.", - "onboarding.import.method.restoreSeedPhrase.wallet.title": "Anna palautuslauseke", - "onboarding.import.method.viewPrivateKeys.button.desc": "Näytä yksityinen avaimesi", - "onboarding.import.method.viewPrivateKeys.title": "Eikö sinulla ole mitään yllä mainituista? ", - "onboarding.import.onDeviceRecovery.other_options": "Luo tai tuo toinen lompakko", - "onboarding.import.onDeviceRecovery.other_options.label": "Etkö halua mitään yllä olevista?", - "onboarding.import.onDeviceRecovery.subtitle": "Valitse, mihin lompakkoon haluat kirjautua takaisin.", - "onboarding.import.onDeviceRecovery.title": "Tervetuloa takaisin Uniswapiin", - "onboarding.import.onDeviceRecovery.wallet.button": "Näytä palautuslauseke", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 muu lompakko", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} muut lompakot", - "onboarding.import.onDeviceRecovery.warning.caption": "Varmista, että olet varmuuskopioinut kaikki muut lompakot. Jos haluat joskus palauttaa ne, tarvitset niiden palautuslausekkeet tai vastaavat {{cloudProvider}} -varmuuskopiot.", - "onboarding.import.onDeviceRecovery.warning.title": "Oletko varma?", - "onboarding.import.selectMethod.errorMessage": "Tapahtui odottamaton virhe. Yritä uudelleen.", - "onboarding.import.selectMethod.mobileApp.subtitle": "Tuo lompakko mobiilisovelluksesta QR-koodin avulla.", - "onboarding.import.selectMethod.mobileApp.title": "Käytä Uniswap Mobilea", - "onboarding.import.selectMethod.passkey.subtitle": "Synkronoi Uniswap-lompakkosi käyttämällä olemassa olevaa salasanaa.", - "onboarding.import.selectMethod.passkey.title": "Kirjaudu sisään salasanalla", - "onboarding.import.selectMethod.recoveryPhrase.subtitle": "Tuo toisesta kryptolompakosta.", - "onboarding.import.selectMethod.recoveryPhrase.title": "Anna palautuslauseke", - "onboarding.import.selectMethod.title": "Kirjaudu sisään tai tuo lompakko", - "onboarding.import.title": "Valitse, kuinka haluat lisätä lompakkosi", - "onboarding.importMnemonic.button.default": "Palautuslauseeni on 12 sanaa", - "onboarding.importMnemonic.button.importing": "Tuodaan...", - "onboarding.importMnemonic.button.longPhrase": "Palautuslauseeni on pidempi", - "onboarding.importMnemonic.error.invalidPhrase": "Antamasi lause on virheellinen", - "onboarding.importMnemonic.subtitle": "Kirjoita tai liitä 12-sanainen palautuslause", - "onboarding.importMnemonic.title": "Kirjoita palautuslauseesi", - "onboarding.importPasskey.bringWindowToFront": "Tuo ikkuna eteen", - "onboarding.importPasskey.continueInSecureWindow": "Jatka suojatussa kirjautumisikkunassa.", - "onboarding.intro.button.alreadyHave": "Minulla on jo lompakko", - "onboarding.intro.button.logInOrImport": "Kirjaudu sisään tai tuo", - "onboarding.intro.mobileScan.button": "Skannaa QR-koodi tuontia varten", - "onboarding.intro.mobileScan.title": "Onko sinulla Uniswap-sovellus?", - "onboarding.landing.button.add": "Lisää olemassa oleva lompakko", - "onboarding.landing.button.create": "Luo lompakko", - "onboarding.landing.button.createAccount": "Luo tili", - "onboarding.name.choose": "Valitse käyttäjätunnus", - "onboarding.name.choose.subtitle": "Tämä on julkinen nimi, jolla kuka tahansa voi lähettää sinulle krypton.", - "onboarding.notification.permission.message": "Jos haluat saada ilmoituksia, ota Uniswap Walletin ilmoitukset käyttöön laitteesi asetuksista.", - "onboarding.notification.permission.title": "Ilmoitusten lupa", - "onboarding.notification.subtitle": "Pysy ajan tasalla suosikkimerkkien tapahtumatiloista ja merkittävistä hintamuutoksista.", - "onboarding.notification.title": "Ota ilmoitukset käyttöön", - "onboarding.passkey.create": "Luo salasanasi", - "onboarding.passkey.loading.subtitle": "Tämän pitäisi kestää vain sekunti.", - "onboarding.passkey.loading.title": "Lompakon etsiminen...", - "onboarding.passkey.secure": "Suojaa tilisi", - "onboarding.passkey.secure.description": "Tunnuslukujen avulla pääset nopeasti ja turvallisesti tilillesi käyttämällä vain kasvojasi tai sormenjälkeäsi.", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "Varmistetaan, että ymmärsit oikein. Jos kadotat tai kirjoitat sen väärin, et voi palauttaa varojasi.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "Jos kadotat tai kirjoitat sen väärin, et voi palauttaa varojasi.", - "onboarding.recoveryPhrase.confirm.title": "Varmistetaan, että ymmärsit oikein", - "onboarding.recoveryPhrase.view.subtitle": "Sinun on syötettävä kaikki nämä 12 salaista sanaa palauttaaksesi lompakkosi.", - "onboarding.recoveryPhrase.view.title": "Kirjoita palautuslauseesi muistiin", - "onboarding.recoveryPhrase.view.title.hasPassword": "Jos unohdat salasanasi...", - "onboarding.recoveryPhrase.warning.final.button": "olen valmis", - "onboarding.recoveryPhrase.warning.final.message": "Palautuslauseesi antaa sinulle (ja kaikille, joilla se on) pääsyn varoihin. Muista pitää se omana tietonasi.", - "onboarding.recoveryPhrase.warning.final.title": "Tee tämä vaihe yksityisessä paikassa", - "onboarding.recoveryPhrase.warning.screenshot.message": "Jokainen, joka pääsee käsiksi kuviisi, voi käyttää lompakkoasi. Suosittelemme, että kirjoitat sanasi sen sijaan ylös.", - "onboarding.recoveryPhrase.warning.screenshot.title": "Kuvakaappaukset eivät ole turvallisia", - "onboarding.resetPassword.complete.safety": "Lue lisää lompakon turvallisuudesta", - "onboarding.resetPassword.complete.subtitle": "Käytä uutta salasanaasi lompakkosi lukituksen avaamiseen.", - "onboarding.resetPassword.complete.title": "Salasanan nollaus", - "onboarding.scan.error": "QR-koodin lataamisessa tapahtui virhe", - "onboarding.scan.otp.error": "Lähettämäsi koodi on virheellinen tai lähettämisessä tapahtui virhe. Yritä uudelleen.", - "onboarding.scan.otp.failed": "Epäonnistuneet yritykset: {{number}}", - "onboarding.scan.otp.subtitle": "Tarkista 6-merkkinen koodi Uniswap-mobiilisovelluksestasi", - "onboarding.scan.otp.title": "Syötä kertakoodi", - "onboarding.scan.subtitle": "Skannaa QR-koodi Uniswap-mobiilisovelluksella aloittaaksesi lompakkosi tuomisen.", - "onboarding.scan.title": "Tuo lompakko sovelluksesta", - "onboarding.scan.troubleScanning.message": "Tuo palautuslausekkeen kautta", - "onboarding.scan.troubleScanning.title": "Onko skannauksessa ongelmia?", - "onboarding.scan.wifi": "Yhdistä puhelimesi samaan WiFi-verkkoon kuin tietokoneesi.", - "onboarding.security.alert.biometrics.message.android": "Jos haluat käyttää biometriaa, määritä se ensin asetuksista.", - "onboarding.security.alert.biometrics.message.ios": "Jos haluat käyttää {{biometricsMethod}}-toimintoa, salli pääsy järjestelmäasetuksissa", - "onboarding.security.alert.biometrics.title.android": "Biometriset tiedot on poistettu käytöstä", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} ei ole käytössä", - "onboarding.security.button.confirm.android": "Ota biometriikka käyttöön", - "onboarding.security.button.confirm.ios": "Ota {{biometricsMethod}}käyttöön", - "onboarding.security.button.setup": "Perustaa", - "onboarding.security.subtitle.android": "Lisää ylimääräinen suojakerros vaatimalla biometrisiä tietoja tapahtumien lähettämiseen.", - "onboarding.security.subtitle.ios": "Lisää ylimääräinen suojaustaso vaatimalla {{biometricsMethod}} tapahtumien lähettämiseen.", - "onboarding.security.title": "Suojaa lompakkosi", - "onboarding.selectWallets.error": "Osoitteita ei voitu ladata", - "onboarding.selectWallets.title.default": "Valitse tuotavat lompakot", - "onboarding.selectWallets.title.error": "Virhe lompakoiden tuonnissa", - "onboarding.termsOfService": "Jatkamalla hyväksyn käyttöehdot ja tietosuojakäytännön", - "onboarding.tooltip.recoveryPhrase.trigger": "Mikä on palautuslause?", - "onboarding.wallet.continue": "Pidetään se turvassa", - "onboarding.wallet.defaultName": "Lompakko {{number}}", - "onboarding.wallet.description.full": "Tämä on henkilökohtainen tilasi tokeneille, NFT:lle ja kaikille kaupoillesi. Viimeistele sen määrittäminen pitääksesi rahasi turvassa.", - "onboarding.wallet.title": "Tervetuloa uuteen lompakkoosi", - "onboarding.welcome.subtitle": "Viimeistetään lompakon asettaminen.", - "onboarding.welcome.title": "Tervetuloa!", - "outageBanner.message": "{{chainName}}{{versionDescription}} tiedot eivät ole tällä hetkellä saatavilla, mutta odotamme ongelman ratkeavan pian.", - "outageBanner.message.sub": "Voit silti vaihtaa ja tarjota likviditeettiä tässä ketjussa ilman ongelmia.", - "outageBanner.title": "{{versionName}} palaa pian", - "passkeys.help.modal.subtitle": "Jos sinulla on ongelmia salasanojen kanssa, käy Uniswap-tuessa saadaksesi apua.", - "passkeys.help.modal.subtitle.invalidPasskey": "Pyyntöäsi ei voitu suorittaa loppuun. Yritä uudelleen käyttämällä salasanaa, joka liittyy kohteeseen ", - "passkeys.help.modal.subtitle.technicalError": "Pyyntöäsi ei voitu suorittaa odottamattoman teknisen virheen vuoksi. Rahasi ovat turvassa. Yritä uudelleen.", - "passkeys.help.modal.title": "Tarvitsetko apua?", - "passkeys.help.modal.title.invalidPasskey": "Virheellinen salasana", - "passkeys.help.modal.title.technicalError": "Tekninen virhe", - "passkeys.manage.modal.subtitle": "Voit lisätä tai poistaa salasanat kirjautumalla sisään osoitteeseen {{passkeyManagementUrl}}.", - "passkeys.manage.modal.title": "Hallinnoi salasanoja", - "permit.approval.fail": "Luvan hyväksyminen epäonnistui", - "permit.approval.fail.message": "Permit2 mahdollistaa tunnuksen hyväksyntöjen jakamisen ja hallinnan eri sovelluksissa.", - "pool.activeRange": "Aktiivinen punkkialue", - "pool.addAs": "Lisää muodossa {{nativeWrappedSymbol}}", - "pool.apr": "HUHT", - "pool.apr.base": "Perustodellinen vuosikorko", - "pool.apr.description": "Vuosittainen 1 päivän maksun perusteella", - "pool.apr.reward": "Palkinto APR", - "pool.aprText": "Pool APR", - "pool.balances": "Allas saldot", - "pool.closedCTA.description": "Näet ne käyttämällä sivun yläreunassa olevaa suodatinta.", - "pool.closedCTA.title": "Etsitkö suljettuja työpaikkojasi?", - "pool.collectAs": "Kerää muodossa {{nativeWrappedSymbol}}", - "pool.collectFees": "Kerää maksuja", - "pool.connectEthereumToView": "Yhdistä Ethereum-lompakko nähdäksesi poolisi", - "pool.create": "Uuden uima-altaan luominen", - "pool.create.info": "Valintasi luo uuden likviditeettipoolin, joka voi heikentää alkuperäistä likviditeettiä ja lisätä volatiliteettia. Harkitse lisäämistä olemassa olevaan pooliin näiden riskien minimoimiseksi.", - "pool.createdPosition": "Luotu sijainti", - "pool.createdPosition.canceled": "Työpaikan luominen peruttu", - "pool.createdPosition.failed": "Aseman luominen epäonnistui", - "pool.dynamic": "Dynaaminen allas", - "pool.earnings": "Tulot", - "pool.earnings.empty": "Sinulla ei ole vielä tuloja", - "pool.explorers": "Tutkijat", - "pool.import": "Tuo allas", - "pool.import.link.description": "Joitakin v2-paikkoja ei näytetä automaattisesti.", - "pool.import.positions.v2": "Tuo V2-paikat", - "pool.import.positions.v2.selectPair.description": "Joitakin v2-paikkoja ei näytetä automaattisesti. Valitse merkkipari tuodaksesi ja tarkastellaksesi sijaintiasi.", - "pool.import.success": "Allas tuotu", - "pool.incentives.administeredRewards": "Palkinnot jaetaan autonomisella Merkl Distributor -sopimuksella.", - "pool.incentives.collect": "Kerätä", - "pool.incentives.collectedRewards": "Kerätyt palkinnot", - "pool.incentives.collectFailed": "Keräys epäonnistui, yritä uudelleen.", - "pool.incentives.collectFailedNoRetry": "Palkintojen kerääminen epäonnistui.", - "pool.incentives.collectingRewards": "Palkintojen kerääminen", - "pool.incentives.collectRewards": "Kerää palkintoja", - "pool.incentives.collectRewardsCanceled": "Palkintojen kerääminen peruttu", - "pool.incentives.daysLeft": "päivää jäljellä", - "pool.incentives.eligible": "Tukikelpoisilla poolilla on merkkipalkintoja, jotta voit ansaita enemmän", - "pool.incentives.merklDocs": "Merklin laskema päästöpalkkioista ja pooli-TVL:stä.", - "pool.incentives.rewardsDistribution": "Palkintojen jako", - "pool.incentives.rewardsEarned": "Palkinnot ansaittu", - "pool.incentives.similarPoolHasRewards": "Vastaavalla poolilla on UNI-palkintoja", - "pool.incentives.switchPools": "Vaihda uima-altaita", - "pool.incentives.timePeriod": "Aikajakso", - "pool.incentives.uni.findMore": "Löydä altaat UNI-palkinnoilla", - "pool.incentives.yourRewards.error": "Palkintosi eivät ole käytettävissä juuri nyt", - "pool.incentives.yourRewards.error.description": "Palkintoja ei voitu noutaa. Tämä saattaa johtua verkko-ongelmasta. Yritä ladata sivu uudelleen.", - "pool.info": "Allas tiedot", - "pool.limitFluctuation.warning": "Huomaa, että rajoitusten toteutus voi vaihdella reaaliaikaisten markkinoiden vaihteluiden ja Ethereum-verkon ruuhkautumisen mukaan. Limiitit eivät välttämättä toimi tarkasti, kun merkit saavuttavat määritetyn hinnan.", - "pool.liquidity.data.error.message": "Tapahtumaasi vaadittavien tietojen noutamisessa tapahtui virhe.", - "pool.liquidity.outOfSync": "Uima-allas ja markkinahinta eivät vastaa toisiaan", - "pool.liquidity.outOfSync.message": "Tämän poolin hinnat vaihtelevat valittujen rahakkeiden markkinahintojen mukaan. Säädä hintaluokkaasi vastaavasti tai odota, että pooli tasapainottuu tappioiden välttämiseksi.", - "pool.maxPrice": "Max hinta", - "pool.migrateLiquidity": "Siirrä likviditeettiä", - "pool.migrateLiquidityDisabledTooltip": "Tämä ketju ei tue v4-likviditeettipooleja.", - "pool.migrateToV4": "Siirrä versioon 4", - "pool.minPrice": "Min hinta", - "pool.newPosition.plus": "+ Uusi asema", - "pool.newPosition.title": "Uusi asema", - "pool.newSpecificPosition": "Uusi {{symbol}} paikka", - "pool.notAvailableOnSolana": "Uima-altaita ei ole saatavilla Solanalla", - "pool.notFound.description": "Valitettavasti emme löydä tietoja tästä poolista. Tarkista nimi ja osoite ja yritä uudelleen.", - "pool.notFound.title": "Allasta ei löydy", - "pool.openToStart.evmAndSolanaConnected": "Avaa uusi työpaikka tai luo pooli aloittaaksesi. Poolit eivät ole saatavilla Solanassa.", - "pool.openToStart.evmOnly": "Aloita avaamalla uusi työpaikka tai luomalla pooli.", - "pool.percent": "{{pct}}% poolista", - "pool.pooled": "Yhdistetty {{sym}}:", - "pool.position": "asema", - "pool.positions": "Asemat", - "pool.positions.title": "Sinun asemasi", - "pool.positions.transaction.settings": "Tapahtuma-asetukset", - "pool.positions.usdValueUnavailable": "USD-arvo ei ole saatavilla", - "pool.positions.usdValueUnavailable.tooltip": "USD-arvo ei ole tällä hetkellä saatavilla tälle positiolle. Katso talletettujen token-summien sijaintitiedot.", - "pool.refresh.prices": "Päivitä hinnat", - "pool.removeLiquidity": "Poista likviditeetti", - "pool.rewardAPR": "Palkkio APR (UNI)", - "pool.rewardAPR.percent": "{{pct}} palkinto huhtikuu", - "pool.rewards": "Palkinnot", - "pool.rewardsPool.label": "Pool-merkit palkintopoolissa:", - "pool.selectPair": "Valitse pari", - "pool.share.label": "Oma uima-allasosuutesi:", - "pool.specificPosition": "{{symbol}} sijainti", - "pool.tokenPair": "Token-pari", - "pool.top.rewards": "Poolit palkintoineen", - "pool.top.tvl": "TVL:n parhaat uima-altaat", - "pool.top.volume": "Altaat 24 tunnin volyymin mukaan", - "pool.totalAPR": "Todellinen vuosikorko yhteensä", - "pool.totalTokens": "Poolitunnuksesi yhteensä:", - "pool.v2": "v2 poolit", - "pool.v3": "v3 poolit", - "pool.via": "{{tokenPair}} kautta {{dex}}", - "pool.volOverTvl": "1D vol/TVL", - "pool.volume.thirtyDay": "30 päivän volyymi", - "pool.volume.thirtyDay.short": "30D vol", - "pool.withdrawAs": "Nosta kuin {{nativeWrappedSymbol}}", - "poolFinder.availablePools": "Käytettävissä olevat uima-altaat", - "poolFinder.availablePools.found.description": "v2 poolit, jotka vastaavat parivalintaasi.", - "poolFinder.availablePools.notFound.description": "Vastaavia v2-poolia ei löytynyt. Tarkista token-valintasi ja varmista, että olet yhteydessä oikeaan lompakkoon.", - "pools.explore": "Tutustu uima-altaisiin", - "portfolio.activity.filters.timePeriod.all": "Koko ajan", - "portfolio.activity.filters.transactionType.all": "Kaikki tyypit", - "portfolio.activity.filters.transactionType.deposits": "Talletukset", - "portfolio.activity.filters.transactionType.staking": "Panostaminen", - "portfolio.activity.filters.transactionType.swaps": "Vaihtosopimukset", - "portfolio.activity.title": "Toiminta", - "portfolio.connectWallet.summary": "Seuraa tokeneita, pooleja ja muuta {{amount}}+ verkostoissa", - "portfolio.defi.title": "DeFi", - "portfolio.description": "Seuraa kryptovaluuttasalkkuasi kaikissa ketjuissa ja protokollissa", - "portfolio.nfts.title": "NFT:t", - "portfolio.overview.title": "Yleiskatsaus", - "portfolio.title": "Portfolio", - "portfolio.tokens.table.column.allocation": "Kohdistus", - "portfolio.tokens.table.column.balance": "Saldo", - "portfolio.tokens.table.column.change1d": "1D-muutos", - "portfolio.tokens.table.column.price": "Hinta", - "portfolio.tokens.table.column.token": "Tunnus", - "portfolio.tokens.table.column.value": "Arvo", - "portfolio.tokens.title": "Tokenit", - "position.addHook": "Lisää koukku", - "position.addHook.tooltip": "Koukut ovat edistyksellinen ominaisuus, jonka avulla poolit voivat olla vuorovaikutuksessa älykkäiden sopimusten kanssa, mikä vapauttaa erilaisia ominaisuuksia. Ole varovainen lisääessäsi koukkuja, koska jotkut niistä voivat olla haitallisia tai aiheuttaa ei-toivottuja seurauksia.", - "position.addingHook": "Koukun lisääminen", - "position.addingHook.disclaimer": "Koukkujen lisäämisellä voi olla tahattomia seurauksia. Tee tutkimus ja jatka omalla vastuullasi.", - "position.addingHook.hideProperties": "Piilota ominaisuudet", - "position.addingHook.invalidAddress": "Anna kelvollinen koukun osoite", - "position.addingHook.viewProperties": "Näytä ominaisuudet", - "position.create.confirm": "Vahvista sijainti", - "position.create.invalidPrice": "Virheellinen hinta", - "position.create.invalidRange": "Virheellinen alue", - "position.create.modal.header": "Aseman luominen", - "position.create.unsupportedSolana": "Solana-altaita ei tueta.", - "position.create.unsupportedSolana.description": "Luodaksesi poolin, vaihda tuettuun EVM-ketjuun.", - "position.create.unsupportedToken.description": "Kokeile luoda eri protokollaversiolla.", - "position.create.v2unsupportedChain": "Tätä ketjua ei tueta v2-pooleissa.", - "position.currentValue": "Nykyisen sijainnin arvo", - "position.default_price_strategies": "Hintastrategiat", - "position.default_price_strategies.error": "Hinnoittelustrategian asettaminen epäonnistui", - "position.deposit.confirm.create.description.less": "Syötetty alkuhinta on {{value}}% pienempi kuin markkinahinta ja voi johtaa varojen menetykseen. Haluatko jatkaa?", - "position.deposit.confirm.create.description.more": "Syötetty alkuhinta on {{value}}% korkeampi kuin markkinahinta ja voi johtaa varojen menetykseen. Haluatko jatkaa?", - "position.deposit.confirm.create.title": "Suuri hintaero markkinoiden kanssa", - "position.deposit.description": "Määritä maksuvalmiusosuutesi tunnusmäärät.", - "position.depositedCurrency": "Talletettu {{currencySymbol}}", - "position.fot.warning": "{{token}} ja muita \"Fee on transfer\" -tunnuksia tukee vain Uniswap v2.", - "position.fot.warning.cta": "Luo v2-sijainti", - "position.hook.disclaimer": "Ymmärrän tämän koukun lisäämiseen liittyvät mahdolliset riskit.", - "position.hook.donateWarning": "Tämä lippu saattaa aiheuttaa muutoksia ansaittuihin maksuihin.", - "position.hook.liquidityWarning": "Tämä lippu voi saada poolin estämään uuden likviditeetin lisäämisen. Tapahtumasi voi peruuttaa.", - "position.hook.removeWarning": "Saattaa saada varojasi lukittumaan tai estää sinua keräämästä maksuja.", - "position.hook.swapWarning": "Tämän lipun avulla likviditeetin tarjoajat voivat helpommin hyödyntää Just-In-Time-likviditeettiä, mikä voi johtaa alhaisempiin palkkioihin.", - "position.hook.warningHeader": "Tärkeää: koukkuriskit tunnistettu", - "position.hook.warningInfo": "Olemme tunnistaneet tämän koukun mahdolliset riskit. Varmista, että ymmärrät, kuinka tämä koukku toimii, ennen kuin päätät jatkaa.", - "position.increase.fot": "Likviditeetin lisäämistä {{token}} ja muille \"siirtomaksu\" -tunnuksille ei tueta.", - "position.initialPrice": "Alkuhinta", - "position.initialPrice.difference.negative": "{{ value }}% vähemmän kuin markkinahinta", - "position.initialPrice.difference.positive": "{{ value }}% enemmän kuin markkinahinta", - "position.initialPrice.info": "Kun luot uutta poolia, sinun on asetettava molempien tokenien aloituskurssi. Tämä kurssi heijastaa alkuperäistä markkinahintaa.", - "position.initialPrice.set": "Aseta alkuhinta", - "position.initialPrice.useMarketPrice": "Käytä markkinahintaa", - "position.migrate.liquidity": "Kun siirrät paikkoja, et voi vaihtaa merkkiparia, mutta voit lisätä koukun toiminnallisuuden parantamiseksi.", - "position.migrate.v4unsupportedChain": "Tätä ketjua ei tueta v4-poolissa.", - "position.new": "Uusi asema", - "position.new.protocol": "Uusi {{protocol}} paikka", - "position.notFound": "Sijaintia ei löydy", - "position.notFound.description": "Tämän paikan tiedot eivät ole saatavilla. Tarkista, että olet yhteydessä oikeaan lompakkoon.", - "position.one_sided_lower": "Yksipuolinen alempi", - "position.one_sided_lower.description": "Tarjoa likviditeettiä, jos hinta laskee", - "position.one_sided_upper": "Yksipuolinen yläosa", - "position.one_sided_upper.description": "Tarjoa likviditeettiä, jos hinta nousee", - "position.protocol": "{{protocol}} sijainti", - "position.provide.liquidity": "Valitse rahakkeet, joille haluat tarjota likviditeettiä. Voit valita tunnuksia kaikista tuetuista verkoista.", - "position.provide.liquidityDescription": "Täyden likviditeetin tarjoaminen varmistaa jatkuvan markkinaosuuden kaikilla mahdollisilla hinnoilla, mikä tarjoaa yksinkertaisuutta, mutta mahdollistaa suuremman pysyvän tappion.", - "position.provide.liquidityDescription.creatingPool": "Täyden likviditeetin asettaminen poolia luotaessa varmistaa jatkuvan markkinaosuuden kaikilla mahdollisilla hinnoilla, mikä tarjoaa yksinkertaisuuden, mutta mahdollistaa suuremman pysyvän tappion.", - "position.provide.liquidityDescription.custom": "Mukautetun valikoiman avulla voit keskittää likviditeettisi tiettyihin hintarajoihin, mikä parantaa pääoman tehokkuutta ja palkkiotuottoja, mutta vaatii aktiivisempaa hallintaa.", - "position.provide.outOfRange.closePosition": "Sulje asento", - "position.provide.outOfRange.description": "Tämän sijainnin aluetta ei voi säätää siirron aikana. Aseta uusi alue sulkemalla tämä sijainti ja avaamalla uusi v4-sijainti.", - "position.provide.outOfRange.title": "Olet siirtämässä kantaman ulkopuolista sijaintia", - "position.removeHook": "Irrota koukku", - "position.resetDescription": "Tokenisi, hinta- ja valikoimavalinnasi nollataan.", - "position.setRange": "Aseta hintaluokka", - "position.setRange.inputsBelow": "Käytä alla olevia syötteitä asettaaksesi alueesi.", - "position.stable": "Vakaa", - "position.stable.description": "Hyvä stablecoineille tai matalan volatiliteetin omaaville pareille", - "position.step.deposit": "Syötä talletussummat", - "position.step.price": "Aseta alkuhinta ja talletussummat", - "position.step.range": "Aseta hintaluokka ja talletussummat", - "position.step.select": "Valitse tunnuspari ja maksut", - "position.value": "Aseman arvo", - "position.valueUnavailable": "USD-arvo ei ole tällä hetkellä saatavilla tälle positiolle. Katso talletettujen token-summien sijaintitiedot.", - "position.wide": "Leveä", - "position.wide.description": "Hyvä volatiileille pareille", - "position.wrapped.unwrap": "Avaa paketti {{wrappedToken}}", - "position.wrapped.warning": "{{nativeToken}} vaaditaan v4-poolille", - "position.wrapped.warning.info": "Avaa {{wrappedToken}} ja talleta {{nativeToken}} tarjotaksesi kustannustehokkaampaa ja tehokkaampaa likviditeettiä.", - "positions.noPositions.description": "Sinulla ei ole likviditeettipositioita. Luo uusi positio aloittaaksesi palkkioiden ja palkkioiden ansaitsemisen kelvollisista pooleista.", - "positions.noPositions.title": "Ei positioita", - "positions.welcome.connect.description": "Nähdäksesi positiosi ja palkkiosi sinun on yhdistettävä lompakkosi.", - "positions.welcome.connect.wallet": "Yhdistä lompakkosi", - "privacy.anonymizedLogs": "Sovellus kirjaa anonymisoituja käyttötilastoja parantaakseen ajan myötä.", - "privacy.autoRouter": "Sovellus hakee optimaalisen kauppareitin Uniswap Labs -palvelimelta.", - "privacy.infura": "Sovellus hakee ketjun tietoja ja muodostaa sopimuskutsuja Infura API:lla.", - "privacy.thirdPartyApis": "Tämä sovellus käyttää seuraavia kolmannen osapuolen sovellusliittymiä:", - "privacy.trm": "Sovellus kerää turvallisesti lompakkosi osoitteesi ja jakaa sen TRM Labs Inc:n kanssa riskien ja vaatimustenmukaisuuden vuoksi.", - "privacy.uniswaptos": "Uniswap Labsin käyttöehdot", - "privateKeys.export.modal.speedbump.bullet1": "Katso tämä yksityisesti", - "privateKeys.export.modal.speedbump.bullet2": "Älä jaa kenenkään kanssa", - "privateKeys.export.modal.speedbump.bullet3": "Älä koskaan syötä sitä verkkosivustoille tai sovelluksiin", - "privateKeys.export.modal.speedbump.subtitle": "Kuka tahansa, joka tietää yksityisen avaimesi, voi käyttää lompakkoasi ja varojasi.", - "privateKeys.export.modal.speedbump.title": "Ennen kuin jatkat", - "privateKeys.export.modal.subtitle": "Näyttää siltä, ettet pysty palauttamaan lompakkoasi kokonaan. Varmistaaksesi, ettet koskaan menetä pääsyä varoihisi, kopioi yksityinen avaimesi.", - "privateKeys.export.modal.title": "Vie yksityinen avaimesi", - "privateKeys.export.modal.warning": "Jos kadotat puhelimesi tai poistat sovelluksen, sinun on tuotava tämä avain toiseen lompakkoon.", - "privateKeys.view.button.continue": "Kopioin ne kaikki.", - "privateKeys.view.button.continue.single": "Kopioin sen.", - "privateKeys.view.subtitle": "Yksityinen avaimesi myöntää pääsyn tiettyyn lompakkoon. Jokaisella lompakolla on eri yksityinen avain.", - "privateKeys.view.title": "Yksityinen avain", - "qrScanner.button.connections_one": "1 sovellus yhdistetty", - "qrScanner.button.connections_other": "{{count}} sovelluksia yhdistetty", - "qrScanner.error.camera.message": "Jos haluat skannata koodin, salli kameran käyttöoikeus järjestelmäasetuksissa", - "qrScanner.error.camera.title": "Kamera on poissa käytöstä", - "qrScanner.error.none": "QR-koodia ei löytynyt", - "qrScanner.recipient.action.scan": "Skannaa QR-koodi", - "qrScanner.recipient.action.show": "Näytä QR-koodini", - "qrScanner.recipient.error.message": "Varmista, että skannaat kelvollisen Ethereum-osoitteen QR-koodin, ennen kuin yrität uudelleen.", - "qrScanner.recipient.error.title": "Virheellinen QR-koodi", - "qrScanner.request.message.unavailable": "Viestiä ei löytynyt.", - "qrScanner.request.method.default": "Pyyntö osoitteesta {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "Allekirjoituspyyntö {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "Tapahtumapyyntö {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "Saako {{dappName}} käyttää enintään {{amount}} {{currencySymbol}}?", - "qrScanner.request.withoutAmount": "Saako {{dappName}} käyttää {{currencySymbol}}-tunnusta?", - "qrScanner.status.connecting": "Yhdistetään...", - "qrScanner.status.loading": "Ladataan...", - "qrScanner.title": "Skannaa QR-koodi", - "qrScanner.wallet.networks": "Tuetut verkot", - "range.outOfView": "Alue poissa näkyvistä", - "removeLiquidity.pooled": "Yhdistetty {{symbol}}:", - "revoke.failed.message": "Verkko- tai yhteysongelma todennäköisesti aiheutti peruutuksesi epäonnistumisen. Tarkista yhteytesi ja yritä uudelleen.", - "routing.aggregateLiquidity": "Jos saatavilla, kokoaa likviditeettilähteitä parempiin hintoihin ja kaasuvapaisiin vaihtosopimuksiin.", - "routing.aggregateLiquidity.uniswapx": "UniswapX kokoaa yhteen ketjun sisäiset ja ulkopuoliset likviditeettilähteet, tarjoten sinulle parhaat saatavilla olevat hinnat ja kaasuttomat swapit.", - "routing.cheapest": "Uniswap-asiakas valitsee edullisimman kauppavaihtoehdon, joka laskee huomioon hinnan ja verkkokustannukset.", - "routing.cheapest.v4": "Uniswap-asiakas valitsee optimaalisen kauppavaihtoehdon hinnan ja verkkokustannusten perusteella.", - "scantastic.code.expired": "Vanhentunut", - "scantastic.code.subtitle": "Kirjoita tämä koodi Uniswap-laajennukseen. Palautuslauseesi salataan ja siirretään turvallisesti.", - "scantastic.code.timeRemaining.shorthand.hours": "Uusi koodi {{hours}}h {{minutes}}m {{seconds}}s kuluttua", - "scantastic.code.timeRemaining.shorthand.minutes": "Uusi koodi {{minutes}}m {{seconds}}s:ssä", - "scantastic.code.timeRemaining.shorthand.seconds": "Uusi koodi {{seconds}}s kuluttua", - "scantastic.code.title": "Kumoa kertakoodin vaihto", - "scantastic.confirmation.button.continue": "Kyllä, jatka", - "scantastic.confirmation.label.browser": "Selain", - "scantastic.confirmation.label.device": "Laite", - "scantastic.confirmation.subtitle": "Jatka vain, jos skannaat QR-koodin Uniswap-laajennuksesta luotetulla laitteella.", - "scantastic.confirmation.title": "Yritätkö tuoda lompakkosi?", - "scantastic.confirmation.warning": "Varo sivustoja ja sovelluksia, jotka esiintyvät Uniswapina. Muuten lompakkosi voi vaarantua.", - "scantastic.error.encryption": "Siemenlauseen valmistelu epäonnistui.", - "scantastic.error.noCode": "OTP:tä ei vastaanotettu. Yritä uudelleen.", - "scantastic.error.timeout.message": "Skannaa Uniswap-laajennuksen QR-koodi uudelleen jatkaaksesi lompakkosi synkronointia.", - "scantastic.error.timeout.title": "Yhteytesi aikakatkaistiin", - "scantastic.modal.ipMismatch.description": "Jotta voit skannata tämän QR-koodin, puhelimesi on oltava yhdistettynä samaan WiFi-verkkoon kuin tietokoneesi ja kaikki VPN:t on poistettava väliaikaisesti käytöstä.", - "scantastic.modal.ipMismatch.title": "Vaihda WiFi-verkkoasi", - "search.input.placeholder": "Etsi rahakkeita ja pooleja", - "search.ukDisclaimer": "Vastuuvapauslauseke Yhdistyneen kuningaskunnan asukkaille", - "send.button.review": "Tarkista siirto", - "send.gas.error.title": "Ei käytössä", - "send.gas.networkCost.title": "Verkon hinta", - "send.input.token.balance.title": "Saldo: {{balance}} {{symbol}}", - "send.recipient.header": "Valitse vastaanottaja", - "send.recipient.input.placeholder": "Hae ENS:stä tai osoitteesta", - "send.recipient.previous_one": "1 edellinen siirto", - "send.recipient.previous_other": "{{count}} aiemmat siirrot", - "send.recipient.results.empty": "Ei tuloksia", - "send.recipient.results.error": "Kirjoittamasi osoitetta ei ole olemassa tai se on kirjoitettu väärin.", - "send.recipient.section.favorite": "Suosikki lompakot", - "send.recipient.section.recent": "Viimeaikaiset", - "send.recipient.section.search": "Hakutulokset", - "send.recipient.section.viewOnly": "Vain katselunäkymät lompakot", - "send.recipient.section.yours": "Sinun lompakot", - "send.recipient.warning.viewOnly.message": "Lähetä varoja tähän lompakkoon vain, jos sinulla on palautuslauseke tai tiedät lompakon omistajan.", - "send.recipient.warning.viewOnly.title": "Sinulla on tämä lompakko, josta voi vain katsella", - "send.recipientSelect.search.empty.message": "Kun lähetät rahakkeita lompakon osoitteeseen, ne näkyvät täällä", - "send.recipientSelect.search.empty.title": "Lompakoita ei ole tallennettu", - "send.review.modal.title": "Sinä lähetät", - "send.review.summary.button.title": "Vahvista lähetys", - "send.search.empty.subtitle": "Kirjoittamasi osoitetta ei ole olemassa tai se on kirjoitettu väärin.", - "send.search.empty.title": "Ei tuloksia", - "send.search.placeholder": "Hae ENS:stä tai osoitteesta", - "send.solanaSendNotSupported": "Lähetystä ei tueta Solanassa", - "send.title": "Lähettää", - "send.unavailableOnSolana.message": "Lähetys ei ole käytettävissä Solana-lompakoissa", - "send.warning.blocked.default": "Tämä lompakko on tukossa", - "send.warning.blocked.modal.message": "Tämä osoite on estetty Uniswap Walletissa, koska se liittyy yhteen tai useampaan estettyyn toimintaan. Jos uskot tämän olevan virhe, lähetä sähköpostia compliance@uniswap.org.", - "send.warning.blocked.modal.title": "Estetty osoite", - "send.warning.blocked.recipient": "Vastaanottajan lompakko on estetty", - "send.warning.erc20.checkbox.description": "Yrität lähettää varoja token-osoitteeseen. Tämä voi johtaa pysyvään varojen menetykseen.", - "send.warning.erc20.checkbox.heading": "Tunnusosoite havaittu", - "send.warning.erc20.message": "Yrität lähettää varoja token-osoitteeseen. Salauksen lähettäminen tämäntyyppiseen osoitteeseen voi johtaa pysyvään varojen menetykseen.", - "send.warning.erc20.title": "Tämä on token-osoite", - "send.warning.insufficientFunds.message": "{{currencySymbol}} -saldosi on pienentynyt sen jälkeen, kun annoit lähetettävän summan", - "send.warning.insufficientFunds.title": "Ei tarpeeksi {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "Ei tarpeeksi {{currencySymbol}} {{networkName}} lähettämiseen", - "send.warning.insufficientGas.message.withoutNetwork": "Ei tarpeeksi {{currencySymbol}} lähettämiseen", - "send.warning.modal.button.cta.blocking": "OK", - "send.warning.modal.button.cta.cancel": "Peruuttaa", - "send.warning.modal.button.cta.confirm": "Vahvistaa", - "send.warning.newAddress.details.ENS": "ENS", - "send.warning.newAddress.details.username": "Käyttäjätunnus", - "send.warning.newAddress.details.walletAddress": "Lompakon osoite", - "send.warning.newAddress.message": "Et ole aiemmin käynyt kauppaa tällä osoitteella. Varmista, että osoite on oikein ennen kuin jatkat.", - "send.warning.newAddress.title": "Uusi osoite", - "send.warning.self.message": "Yrität lähettää varoja nykyiseen lompakkoosi. Salauksen lähettäminen tähän osoitteeseen aiheuttaa tarpeettomia verkkokustannuksia.", - "send.warning.self.title": "Tämä on nykyinen lompakkosi", - "send.warning.smartContract.message": "Olet lähettämässä varoja älykkään sopimusosoitteeseen. Varmista, että tämä on oikea osoite ja että se voi vastaanottaa tunnuksia. Jos ei, tämä voi johtaa pysyvään varojen menetykseen.", - "send.warning.smartContract.title": "Tämä on älykäs sopimusosoite", - "send.warning.viewOnly.message": "Sinun on tuotava tämä lompakko palautuslausekkeen kautta, jotta voit lähettää resursseja.", - "send.warning.viewOnly.title": "Tämä lompakko on vain katselu", - "send.youAreSending": "Sinä lähetät", - "sendRecipientForm.recentAddresses.label": "Viimeaikaiset", - "sendReviewModal.title": "Arvostelun lähetys", - "setting.recoveryPhrase.account.show": "Näytä palautuslause", - "setting.recoveryPhrase.action.hide": "Piilota palautuslause", - "setting.recoveryPhrase.remove": "Poista palautuslauseke", - "setting.recoveryPhrase.remove.confirm.subtitle": "Ymmärrän, että Uniswap Labs ei voi auttaa minua palauttamaan lompakkoani, jos en onnistu.", - "setting.recoveryPhrase.remove.confirm.title": "Tallensin palautuslauseeni", - "setting.recoveryPhrase.remove.initial.subtitle": "Varmista, että olet tallentanut palautuslauseesi. Muutoin menetät pääsyn lompakoihisi", - "setting.recoveryPhrase.remove.initial.title": "Ennen kuin jatkat", - "setting.recoveryPhrase.remove.subtitle": "Vahvista antamalla salasanasi", - "setting.recoveryPhrase.remove.title": "Olet poistamassa palautuslauseesi", - "setting.recoveryPhrase.view.warning.message1": "Jokainen, joka tietää palautuslauseesi, voi käyttää lompakkoasi ja varojasi", - "setting.recoveryPhrase.view.warning.message2": "Katso tämä yksityisesti", - "setting.recoveryPhrase.view.warning.message3": "Älä jaa kenenkään kanssa", - "setting.recoveryPhrase.view.warning.message4": "Älä koskaan syötä sitä verkkosivustoille tai sovelluksiin", - "setting.recoveryPhrase.view.warning.title": "Ennen kuin jatkat", - "setting.recoveryPhrase.warning.view.message": "Jokainen, joka tietää palautuslauseesi, voi käyttää lompakkoasi ja varojasi.", - "setting.recoveryPhrase.warning.view.title": "Katso tämä yksityisessä paikassa", - "settings.action.enableInSettings": "Ota käyttöön asetuksista", - "settings.action.feedback": "Lähetä palautetta", - "settings.action.help": "Hae apua", - "settings.action.lock": "Lukittava lompakko", - "settings.action.privacy": "Tietosuojakäytäntö", - "settings.action.terms": "Käyttöehdot", - "settings.connectWalletPlatform.warning": "Käyttääksesi Uniswapia {{platform}}:ssä, muodosta yhteys lompakkoon, joka tukee {{platform}}:ää.", - "settings.footer": "Tehty rakkaudella, \nUniswap Team 🦄", - "settings.hideSmallBalances": "Piilota pienet saldot", - "settings.hideSmallBalances.subtitle": "Alle 1 USD:n saldot piilotetaan salkustasi.", - "settings.maxSlippage": "Max. lipsahdus", - "settings.maxSlippage.amount": "{{amount}} maks. luisto", - "settings.section.about": "Noin", - "settings.section.preferences": "Asetukset", - "settings.section.privacyAndSecurity": "Yksityisyys ja turvallisuus", - "settings.section.support": "Tuki", - "settings.section.wallet.hidden.row.title": "{{numHidden}} muut lompakot", - "settings.setting.advanced.title": "Edistynyt", - "settings.setting.advancedSettings": "Advanced settings", - "settings.setting.appearance.option.auto": "Auto", - "settings.setting.appearance.option.dark.subtitle": "Käytä aina tummaa teemaa.", - "settings.setting.appearance.option.dark.title": "Tumma", - "settings.setting.appearance.option.device.subtitle": "Mukautuu laitteesi asetuksiin.", - "settings.setting.appearance.option.device.title": "Auto", - "settings.setting.appearance.option.light.subtitle": "Käytä aina vaaleaa teemaa.", - "settings.setting.appearance.option.light.title": "Kevyt", - "settings.setting.appearance.title": "Teema", - "settings.setting.backup.create.description": "Salasanan asettaminen salaa palautuslauseen varmuuskopion, mikä lisää ylimääräistä suojaustasoa, jos {{cloudProviderName}} -tilisi vaarantuu.", - "settings.setting.backup.create.title": "Takaisin ylös {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "Koska näillä lompakoilla on yhteinen palautuslauseke, se poistaa myös näiden lompakoiden varmuuskopiot alla", - "settings.setting.backup.delete.confirm.title": "Oletko varma?", - "settings.setting.backup.delete.warning": "Jos poistat {{cloudProviderName}} -varmuuskopiosi, voit palauttaa lompakkosi vain palauttamalla palautuslausekkeen manuaalisesti. Uniswap Labs ei voi palauttaa omaisuuttasi, jos kadotat palautuslauseen.", - "settings.setting.backup.error.message.full": "Palautuslausetta ei voi varmuuskopioida numeroon {{cloudProviderName}}. Varmista, että {{cloudProviderName}} on käytössä vapaalla tallennustilalla ja yritä uudelleen.", - "settings.setting.backup.error.message.short": "Varmuuskopiota ei voi poistaa", - "settings.setting.backup.error.title": "{{cloudProviderName}} virhe", - "settings.setting.backup.modal.description": "Et ole vielä varmuuskopioinut palautuslausekettasi numeroon {{cloudProviderName}} . Näin voit palauttaa lompakkosi kirjautumalla sisään {{cloudProviderName}} millä tahansa laitteella.", - "settings.setting.backup.modal.title": "Varmuuskopioi palautuslause numeroon {{cloudProviderName}}?", - "settings.setting.backup.password.error.mismatch": "Salasanat eivät täsmää", - "settings.setting.backup.password.medium": "Tämä on keskikokoinen salasana", - "settings.setting.backup.password.placeholder.confirm": "Vahvista salasana", - "settings.setting.backup.password.placeholder.create": "Luo salasana", - "settings.setting.backup.password.strong": "Tämä on vahva salasana", - "settings.setting.backup.password.weak": "Tämä on heikko salasana", - "settings.setting.backup.recoveryPhrase.label": "Palautuslause", - "settings.setting.backup.selected": "{{cloudProviderName}} varmuuskopio", - "settings.setting.backup.status.action.delete": "Poista varmuuskopio", - "settings.setting.backup.status.complete": "Varmuuskopioitu {{cloudProviderName}}", - "settings.setting.backup.status.description": "Kun palautuslauseesi on varmuuskopioitu arvoon {{cloudProviderName}}, voit palauttaa lompakkosi vain kirjautumalla sisään {{cloudProviderName}} -tilillesi millä tahansa laitteella.", - "settings.setting.backup.status.inProgress": "Varmuuskopioidaan {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "Varmuuskopioitu", - "settings.setting.backup.status.title": "{{cloudProviderName}} varmuuskopio", - "settings.setting.beta.tooltip": "Tulossa pian", - "settings.setting.biometrics.appAccess.subtitle.android": "Vaadi kasvot/sormenjälki sovelluksen avaamiseen.", - "settings.setting.biometrics.appAccess.subtitle.ios": "Sovelluksen avaaminen edellyttää {{biometricsMethod}} .", - "settings.setting.biometrics.appAccess.title": "Sovelluksen käyttöoikeus", - "settings.setting.biometrics.auth": "Ole hyvä ja vahvista", - "settings.setting.biometrics.extension.waitingForBiometricsModal.content": "Ota {{biometricsMethod}} käyttöön selaimesi tai järjestelmäasetuksissa jatkaaksesi.", - "settings.setting.biometrics.extension.waitingForBiometricsModal.title": "Odotetaan {{biometricsMethod}}", - "settings.setting.biometrics.off.message.android": "Biometriikka on tällä hetkellä pois päältä Uniswap Walletissa – voit ottaa sen käyttöön järjestelmäasetuksissa.", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} on tällä hetkellä pois päältä Uniswap Walletissa – voit ottaa sen käyttöön järjestelmäasetuksissa.", - "settings.setting.biometrics.off.title.android": "Biometriset tiedot on poistettu käytöstä", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} on pois päältä", - "settings.setting.biometrics.title": "Kasvo-/sormenjälkilukitus", - "settings.setting.biometrics.transactions.subtitle.android": "Vaadi kasvot/sormenjälki asiointiin.", - "settings.setting.biometrics.transactions.subtitle.ios": "Vaadi {{biometricsMethod}} tapahtumaan.", - "settings.setting.biometrics.transactions.title": "Tapahtumat", - "settings.setting.biometrics.unavailable.message.android": "Biometriaa ei ole määritetty laitteellesi. Jos haluat käyttää biometrisiä tietoja, määritä se ensin Asetuksissa.", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} ei ole asetettu laitteellesi. Jos haluat käyttää {{biometricsMethod}}-toimintoa, määritä se ensin Asetuksissa.", - "settings.setting.biometrics.unavailable.title.android": "Biometrisiä tietoja ei ole määritetty", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} ei ole asetettu", - "settings.setting.biometrics.warning.message.android": "Jos et ota biometriikkaa käyttöön, kuka tahansa laitteellesi pääsyn saanut voi avata Uniswap Walletin ja suorittaa tapahtumia.", - "settings.setting.biometrics.warning.message.ios": "Jos et käynnistä {{biometricsMethod}}, kuka tahansa laitteellesi pääsyn saanut voi avata Uniswap Walletin ja suorittaa tapahtumia.", - "settings.setting.biometrics.warning.title": "Oletko varma?", - "settings.setting.connections.disconnectAll": "Irrota kaikki", - "settings.setting.connections.noConnectionsDescription": "Yhdistä sovellukseen etsimällä \"Yhdistä lompakko\"- tai \"Kirjaudu sisään\" -painiketta.", - "settings.setting.currency.title": "Paikallinen valuutta", - "settings.setting.deviceAccess.reset.title": "Nollaa {{biometricsMethod}}", - "settings.setting.deviceAccess.title": "Laitteen käyttöoikeus", - "settings.setting.deviceAccessTimeout.1hour": "1 tunti", - "settings.setting.deviceAccessTimeout.24hours": "24 tuntia", - "settings.setting.deviceAccessTimeout.30minutes": "30 minuuttia", - "settings.setting.deviceAccessTimeout.5minutes": "5 minuuttia", - "settings.setting.deviceAccessTimeout.never": "Ei koskaan", - "settings.setting.deviceAccessTimeout.title": "Automaattisen lukituksen aikakatkaisu", - "settings.setting.hapticTouch.title": "Haptinen kosketus", - "settings.setting.helpCenter.title": "Ohjekeskus", - "settings.setting.language.button.navigate": "Mene asetuksiin", - "settings.setting.language.description.extension": "Uniswap-oletusasetukset ovat järjestelmän kieliasetukset. Jos haluat vaihtaa haluamasi kielen, siirry järjestelmäasetuksiin.", - "settings.setting.language.description.mobile": "Uniswap-oletusasetukset ovat laitteesi kieliasetukset. Jos haluat vaihtaa haluamasi kielen, siirry laitteen asetusten kohtaan \"Uniswap\" ja napauta \"Kieli\".", - "settings.setting.language.title": "Kieli", - "settings.setting.notifications.row.activity.description": "Siirrot, pyynnöt ja muu toiminta", - "settings.setting.notifications.row.activity.title": "Lompakon toiminta", - "settings.setting.notifications.row.updates.description": "Suosituksia ja uusia ominaisuuksia", - "settings.setting.notifications.row.updates.title": "Päivityksiä Uniswapista", - "settings.setting.notifications.title": "Ilmoitukset", - "settings.setting.password.change.title": "Luo uusi salasana", - "settings.setting.password.title": "Vaihda salasana", - "settings.setting.permissions.title": "Käyttöoikeudet", - "settings.setting.privacy.analytics.description": "Käytämme anonyymejä käyttötietoja parantaaksemme käyttökokemustasi Uniswap Labs -tuotteissa. Kun se on poistettu käytöstä, seuraamme vain virheitä ja olennaista käyttöä.", - "settings.setting.privacy.analytics.title": "Sovellusanalytiikka", - "settings.setting.privateKeys.title": "Yksityiset avaimet", - "settings.setting.recoveryPhrase.title": "Palautuslause", - "settings.setting.smallBalances.title": "Salkun saldo", - "settings.setting.smartWallet.action.enable": "ota käyttöön", - "settings.setting.smartWallet.action.smartWallet": "Smart wallet", - "settings.setting.smartWallet.notEligible": "Ei kelvollinen", - "settings.setting.smartWallet.status.actionRequired": "Toimenpide vaaditaan", - "settings.setting.smartWallet.status.active": "Aktiivinen", - "settings.setting.smartWallet.status.inactive": "Passiivinen", - "settings.setting.smartWallet.status.unavailable": "Ei saatavilla", - "settings.setting.unknownTokens.subtitle": "Mahdolliset huijausmerkit piilotetaan portfoliostasi.", - "settings.setting.unknownTokens.title": "Piilota tuntemattomat merkit", - "settings.setting.wallet.action.editLabel": "Muokkaa tunnistetta", - "settings.setting.wallet.action.editProfile": "Muokkaa profiilia", - "settings.setting.wallet.action.remove": "Poista lompakko", - "settings.setting.wallet.connection.banner.description": "Hallitse yhteyksiä lompakkoasetusten kautta klikkaamalla profiilikuvaasi.", - "settings.setting.wallet.connection.banner.title": "Yhteydet ovat siirtyneet", - "settings.setting.wallet.connections.title": "Liitännät", - "settings.setting.wallet.editLabel.description": "Etiketit eivät ole julkisia. Ne tallennetaan paikallisesti ja näkyvät vain sinulle.", - "settings.setting.wallet.editLabel.save": "Tallenna muutokset", - "settings.setting.wallet.label": "Nimimerkki", - "settings.setting.wallet.testnetMode.description": "Tämä ottaa testiverkot käyttöön, jotta kehittäjät voivat kokeilla ominaisuuksia ja tapahtumia ilman todellista omaisuutta. Testiverkkojen tokeneilla ei ole todellista arvoa.", - "settings.setting.wallet.testnetMode.title": "Testnet-tila", - "settings.switchNetwork.warning": "Jos haluat käyttää Uniswap-toimintoa {{label}}, vaihda verkkoa lompakkosi asetuksista.", - "settings.title": "asetukset", - "settings.version": "Versio {{appVersion}}", - "smartWallet.actionRequired.cta": "Poista käytöstä yhdessä verkossa", - "smartWallet.actionRequired.cta.plural": "Poista käytöstä {{amount}} verkoissa", - "smartWallet.actionRequired.description": "Älylompakon poistaminen käytöstä on ketjussa tehtävä toiminto, joka vaatii pieniä verkkokustannuksia.", - "smartWallet.actionRequired.insufficientFunds": "Riittämättömät varat", - "smartWallet.actionRequired.reactivate": "Jatka älylompakon käyttöä", - "smartWallet.actionRequired.title": "Älylompakko on aktiivinen yhdessä verkossa", - "smartWallet.actionRequired.title.plural": "Älylompakko on aktiivinen {{amount}} verkossa", - "smartWallet.activeNetworks.title": "Älylompakko on aktiivinen yhdessä verkossa", - "smartWallet.activeNetworks.title.plural": "Älylompakko on aktiivinen {{amount}} verkossa", - "smartWallet.banner.networkCost": "Includes a one-time cost to activate your smart wallet on {{chainName}}.", - "smartWallet.banner.text": "Ota käyttöön älykäs lompakko säästääksesi jopa 50 % verkkokuluissa.", - "smartWallet.confirmDisableSmartWallet.description": "Jätät paitsi nopeammista vaihdoista, alennetuista verkkomaksuista ja muista tulevista parannuksista.", - "smartWallet.confirmDisableSmartWallet.title": "Oletko varma?", - "smartWallet.insufficient.description": "Älylompakkoa ei voida poistaa käytöstä näissä verkoissa, ennen kuin sinulla on varoja verkkokulujen kattamiseen.", - "smartWallet.insufficient.title": "Riittämättömät varat yhdessä verkossa", - "smartWallet.insufficient.title.plural": "Riittämättömät varat {{amount}} verkossa", - "smartWallet.InsufficientFunds.button.continue.text": "Jatka joka tapauksessa", - "smartWallet.insufficientFunds.network.banner.description": "Ei voida poistaa käytöstä riittämättömien varojen vuoksi.", - "smartWallet.insufficientFunds.network.banner.title_one": "{{count}} verkko pois suljettu", - "smartWallet.insufficientFunds.network.banner.title_other": "{{count}} verkko pois suljettu", - "smartWallet.insufficientFunds.network.disable.text": "Valmis poistamaan käytöstä", - "smartWallet.insufficientFunds.network.text": "Tarvitset {{nativeCurrency}}", - "smartWallet.insufficientFunds.single.network.banner.title": "{{chain}} pois suljettu", - "smartWallet.modal.description.block1": "Älykkäät lompakot käyttävät älysopimuksia nopeampiin ja edullisempiin tapahtumiin.", - "smartWallet.modal.description.block2": "Lompakot, jotka jo käyttävät älylompakko-ominaisuuksia toisesta sovelluksesta, eivät muutu.", - "smartWallet.modal.title": "Älykäs lompakko", - "smartWallets": "Älykkäät lompakot", - "smartWallets.activeNetworks.description": "Älylompakkosi aktivoidaan automaattisesti jokaisessa uudessa verkossa, johon vaihdat.", - "smartWallets.createdModal.description": "You’re getting faster transactions and lower network costs on every swap.", - "smartWallets.createdModal.title": "Älykäs lompakko luotu", - "smartWallets.delegation.limitedSupport": "Lompakollasi on rajoitettu tuki", - "smartWallets.delegationMismatchModal.description": "{{walletName}} ei tue {{displayName}}:n käyttämiä uusimpia Ethereum-standardeja, joten jotkin ominaisuudet eivät ole käytettävissä.", - "smartWallets.delegationMismatchModal.features.1ClickSwaps": "Yhden napsautuksen vaihdot", - "smartWallets.delegationMismatchModal.features.gasFreeSwaps": "Kaasuttomat vaihtosopimukset", - "smartWallets.delegationMismatchModal.features.limitOrders": "Rajoitetut toimeksiannot", - "smartWallets.delegationMismatchModal.limitOrders.unsupported": "Lompakkosi ei tue rajahintatoimeksiantoja.", - "smartWallets.delegationMismatchModal.title": "Rajoitettu lompakkotuki", - "smartWallets.disable.failed": "Tapahtui virhe. Smart Wallet on edelleen aktiivinen vähintään yhdessä verkossa. Yritä uudelleen.", - "smartWallets.disable.modal.description": "Tämä ketjussa tapahtuva toiminto vaatii verkkokustannuksia.", - "smartWallets.disable.modal.title": "Poista käytöstä älylompakko", - "smartWallets.educationalModal.description": "Älykkäät lompakot tarjoavat nopeampia ja edullisempia maksutapahtumia älysopimusten avulla.", - "smartWallets.educationalModal.info": "Tämä ei vaikuta lompakoihin, jotka käyttävät jo toisen sovelluksen älylompakkoominaisuuksia.", - "smartWallets.enabledModal.description": "Päivitykset tulevat voimaan seuraavan vaihdon yhteydessä.", - "smartWallets.enabledModal.description.dapp": "Päivitykset tulevat voimaan seuraavasta maksutapahtumastasi.", - "smartWallets.enabledModal.description.dapp.line2": "Yhdistä lompakkosi uudelleen aloittaaksesi älylompakon ominaisuuksien käytön sovelluksissa välittömästi.", - "smartWallets.enabledModal.title": "Älykäs lompakko käytössä", - "smartWallets.postSwapNudge.enable": "Ota älykäs lompakko käyttöön", - "smartWallets.postSwapNudge.title": "Säästä seuraavasta vaihdostasi", - "smartWallets.postSwapNudge.title.dapp": "Tämä sovellus tukee älykkäitä lompakoita", - "smartWallets.unavailableModal.description": "Eri lompakkopalveluntarjoaja hallinnoi nyt {{displayName}}:n älylompakkoasetuksia. Voit jatkaa Uniswapin käyttöä normaalisti.", - "smartWallets.unavailableModal.title": "Älykäs lompakon ominaisuudet eivät ole käytettävissä", - "solanaPromo.banner.description": "Vaihda Solana-tokeneita suoraan Uniswapissa.", - "solanaPromo.banner.title": "Solana on nyt saatavilla", - "solanaPromo.modal.connectWallet": "Yhdistä suosikki Solana-lompakkosi", - "solanaPromo.modal.startSwapping.button": "Aloita vaihtaminen Solanan kanssa", - "solanaPromo.modal.swapInstantly": "Vaihda tuhansia trendaavia tokeneita välittömästi", - "solanaPromo.modal.viewTokenData": "Näytä token-tiedot ja hinnat yhdessä paikassa", - "speedBump.newAddress.warning.description": "Et ole aiemmin käynyt kauppaa tällä osoitteella. Varmista, että se on oikea osoite ennen kuin jatkat.", - "speedBump.newAddress.warning.title": "Uusi osoite", - "speedBump.smartContractAddress.warning.description": "Olet lähettämässä rahakkeita erityiseen osoitteeseen - älykkääseen sopimukseen. Tarkista, että se on osoite, johon aiot lähettää. Jos se on väärin, rahakkeet voivat kadota ikuisesti.", - "speedBump.smartContractAddress.warning.title": "Onko tämä lompakon osoite?", - "stats.24fees": "24h maksut", - "stats.24swapVolume": "24 tunnin swap-volyymi", - "stats.24volume": "24 tunnin tilavuus", - "stats.allTimeSwappers": "Kaikkien aikojen vaihtajia", - "stats.allTimeVolume": "Koko ajan äänenvoimakkuus", - "stats.fdv": "FDV", - "stats.fdv.description": "Fully diluted valuation (FDV) laskee kokonaismarkkina-arvon olettaen, että kaikki rahakkeet ovat liikkeessä.", - "stats.marketCap": "Markkina-arvo", - "stats.marketCap.description": "Markkina-arvo on omaisuuserän kiertävän tarjonnan kokonaismarkkina-arvo.", - "stats.noStatsAvailable": "Ei tilastoja saatavilla", - "stats.tvl": "Kokonaisarvo lukittu", - "stats.tvl.description": "Lukittu kokonaisarvo (TVL) on kaikkien Uniswap-likviditeettipoolien käytettävissä olevien omaisuuserien kokonaismäärä.", - "stats.volume.1d": "1 päivän volyymi", - "stats.volume.1d.description": "1 päivän määrä on omaisuuden määrä, jolla on vaihdettu Uniswapissa viimeisen 24 tunnin aikana.", - "stats.volume.1d.long": "1D-tilavuus", - "stats.volume.1d.short": "1D vol", - "stats.volume.description": "Volyymi on omaisuuden määrä, jolla on vaihdettu Uniswapissa valitun ajanjakson aikana.", - "swap.allow.oneTime": "Salli {{sym}} (kerran)", - "swap.approveAndSubmit": "Hyväksy ja lähetä", - "swap.approveAndSwap": "Hyväksy ja vaihda", - "swap.balance.amount": "Saldo: {{amount}}", - "swap.bestPrice.through": "Reitti {{provider}}:n kautta", - "swap.bestRoute.cost": "Tehokkaimman reitin arvioidaan maksavan ~{{gasPrice}} verkkokustannuksissa. ", - "swap.bridging.title": "Vaihtaminen verkkojen välillä", - "swap.bridging.warning.description": "Olet vaihtamassa arvosta {{fromNetwork}} arvoon {{toNetwork}}. Tätä kutsutaan myös \"sillaksi\", joka siirtää tunnuksesi verkosta toiseen.", - "swap.button.confirmSignAndSwap": "Vahvista allekirjoitus ja vaihda", - "swap.button.confirmSwapAnyways": "Vahvista vaihto joka tapauksessa", - "swap.button.confirmUnwrap": "Vahvista purkaminen", - "swap.button.max": "Max", - "swap.button.review": "Arvostelu", - "swap.button.submitting": "Lähetetään vaihtoa...", - "swap.button.submitting.keep.open": "Pidä lompakkosi auki...", - "swap.button.submitting.passkey": "Vahvista salasanalla", - "swap.button.swap": "Vaihtaa", - "swap.button.swapAnyways": "Vaihda joka tapauksessa", - "swap.button.unwrap": "Avaa pakkaus", - "swap.button.wrap": "Kääri", - "swap.buy.countryModal.placeholder": "Hae maan tai alueen mukaan", - "swap.cancel.cannotExecute_one": "Vaihtosi voidaan suorittaa ennen kuin peruutus on käsitelty. Verkkokulujasi ei voida hyvittää. Haluatko jatkaa?", - "swap.cancel.cannotExecute_other": "Vaihtosopimukset voidaan suorittaa ennen kuin peruutus on käsitelty. Verkkokulujasi ei voida hyvittää. Haluatko jatkaa?", - "swap.confirmApproveAndSwap": "Vahvista hyväksyntä ja vaihda", - "swap.confirmLimit": "Vahvista raja", - "swap.confirmSwap": "Vahvista vaihto", - "swap.confirmWrap": "Vahvista kääriminen", - "swap.deadline.settings.title": "Vaihtoaika", - "swap.deadline.settings.title.short": "Tx. määräaika", - "swap.details.completed": "Vaihto valmis", - "swap.details.estimatedTime": "Arvioitu aika", - "swap.details.fasterUnichainSwaps": "Nopeammat swapit Unichainin avulla", - "swap.details.feeOnTransfer": "{{tokenSymbol}} maksu", - "swap.details.feeOnTransfer.symbol": "{{tokenSymbol}} token-maksu", - "swap.details.instant": "Välitön", - "swap.details.newQuote.input": "Uusi tulo", - "swap.details.newQuote.output": "Uusi lähtö", - "swap.details.orderRouting": "Tilauksen reititys", - "swap.details.orderRoutingInfo": "Tämä vaihto reititetään Across-protokollan kautta, joka on hajautettu protokolla, joka siirtää omaisuutta verkkojen välillä ja asettaa etusijalle turvallisuuden, nopean suorituskyvyn ja alhaiset hinnat.", - "swap.details.poweredBy": "Voimanlähteenä", - "swap.details.rate": "Rate", - "swap.details.slippage": "Max liukuminen", - "swap.details.slippage.uniswap": "Uniswap-suojattu liukuminen", - "swap.details.swappedIn.unichain": "Valmistunut {{time}}sekunnissa Unichainissa", - "swap.details.uniswapFee": "Maksu", - "swap.error.default": "Saatat joutua lisäämään liukastumistoleranssiasi. Huomautus: siirtomaksu- ja rebase-tunnukset eivät ole yhteensopivia Uniswap V3:n kanssa.", - "swap.error.expectedToFail": "Vaihdon odotetaan epäonnistuvan.", - "swap.error.fiatInputUnavailable": "{{fiatCurrencyCode}} tulo ei ole käytettävissä", - "swap.error.modifiedByWallet": "Vaihtoasi on muokattu lompakkosi kautta. Jos tämä oli virhe, peruuta heti tai vaaranna varojen menettäminen.", - "swap.error.rejected": "Kauppa hylätty", - "swap.error.undefinedObject": "Virhe yritettäessä suorittaa tätä vaihtoa. Saatat joutua lisäämään liukastumistoleranssiasi. Jos tämä ei auta, kaupankäynnin kohteena olevan tunnuksen kanssa saattaa olla yhteensopimattomuus. Huomautus: siirtomaksu- ja rebase-tunnukset eivät ole yhteensopivia Uniswap V3:n kanssa.", - "swap.error.unknown": "Tuntematon virhe.", - "swap.error.v2.expired": "Tätä tapahtumaa ei voitu lähettää, koska määräaika on umpeutunut. Tarkista, että tapahtumasi määräaika ei ole liian lyhyt.", - "swap.error.v2.k": "Vaihto ei tyydyttänyt Uniswap-invarianttia x*y=k. Tämä tarkoittaa yleensä sitä, että yksi vaihdettavista tokeneista sisältää mukautetun toiminnan siirron aikana.", - "swap.error.v2.slippage": "Tämä tapahtuma ei onnistu hinnanmuutoksen tai siirtomaksun vuoksi. Yritä lisätä liukastumistoleranssiasi", - "swap.error.v2.transferInput": "Syöttötunnusta ei voi siirtää. Syöttötunnuksessa voi olla ongelma.", - "swap.error.v2.transferOutput": "Tulostustunnusta ei voi siirtää. Tulostustunnuksessa voi olla ongelma.", - "swap.error.v3.slippage": "Tämä kauppa ei onnistu hintaliikkeen vuoksi. Yritä lisätä liukastumistoleranssiasi. Huomautus: siirtomaksu ja uudelleenperustamistunnukset eivät ole yhteensopivia Uniswap V3:n kanssa.", - "swap.error.v3.transferOutput": "Tulostustunnusta ei voi siirtää. Tulostustunnuksessa saattaa olla ongelma. Huomautus: siirtomaksu ja uudelleenperustamistunnukset eivät ole yhteensopivia Uniswap V3:n kanssa.", - "swap.estimatedDifference.label": "Syöte- ja lähtöarvojen välillä on suuri ero nykyisen likviditeetin vuoksi.", - "swap.expected.price": "Odotettu hinta", - "swap.fail.batched": "Yhdistetty lompakkosi ei ehkä tue yhden napsautuksen swap-toimintoja. Kokeile sen sijaan tavallista swap-toimintoa.", - "swap.fail.batched.retry": "Kokeile vakiovaihtoa", - "swap.fail.batched.title": "Yhden napsautuksen vaihto epäonnistui", - "swap.fail.message": "Yritä säätää liukumista suurempaan arvoon.", - "swap.fail.uniswapX": "Vaihtoa ei voitu suorittaa UniswapX:n kanssa. Kokeile vaihtoa uudelleen reitittääksesi sen perinteisen Uniswap-sovellusliittymän kautta.", - "swap.fees.experience": "Tätä maksua sovelletaan joihinkin merkkipareihin parhaan mahdollisen Uniswap-kokemuksen varmistamiseksi. Se maksetaan tulostettaessa ja se on jo otettu huomioon tarjouksessa.", - "swap.fees.jupiter.label": "Jupiter-maksu", - "swap.fees.jupiter.message": "Jupiter API veloittaa Solanan maksut. Uniswap Labs ei vastaanota näitä maksuja.", - "swap.fees.noFee": "Valituista merkkipareista peritään maksuja parhaan mahdollisen Uniswap-kokemuksen varmistamiseksi. Tähän vaihtoon ei liity maksua.", - "swap.finalizingQuote": "Viimeistellään tarjousta...", - "swap.form.header": "Vaihtaa", - "swap.form.warning.output.fotFees": "{{fotCurrencySymbol}}merkkipalkkion vuoksi swap-summat voidaan syöttää vain syöttökenttään", - "swap.form.warning.output.fotFees.fallback": "Token-maksujen vuoksi swap-summat voidaan syöttää vain syöttökenttään", - "swap.form.warning.output.solana": "Tarkkaa tulostusta ei tueta Solanalla", - "swap.form.warning.restore": "Palauta lompakkosi vaihtaaksesi", - "swap.frontrun.warning": "Tapahtumasi voi tapahtua etuajassa ja johtaa epäsuotuisaan kauppaan.", - "swap.header.viewOnly": "Vain katselu", - "swap.impactOfTrade": "Kaupan vaikutus tämän poolin markkinahintaan.", - "swap.impactOfTrade.uniswapx": "Markkinahinnan ja toteutushinnan ero, kun otetaan huomioon UniswapX-kaasusäästöt.", - "swap.impactOfTrade.uniswapx.missing": "Hintavaikutuslaskelmia ei ehkä ole saatavilla pareille, joiden likviditeetti on alhainen.", - "swap.inputEstimated.atMost": "Syöttö on arvioitu. Myyt enintään tai kauppa palautuu.", - "swap.limit": "Raja", - "swap.limitFilled": "Raja täytetty!", - "swap.limitSubmitted": "Raja lähetetty", - "swap.marketPrice.outsideRange.label": "Markkinahinta on määrittämäsi hintaalueen ulkopuolella. Vain yhden omaisuuden talletus.", - "swap.min.price": "Minimihinta", - "swap.networkCost.paidIn": "Verkkomaksut maksetaan {{sym}} {{chainName}} -verkossa asioinnin suorittamiseksi.", - "swap.orderRouting": "Tilauksen reititys", - "swap.outputEstimated.atLeast": "Tuotos on arvioitu. Saat vähintään tai tapahtuma palautuu.", - "swap.placeOrder": "Tee tilaus", - "swap.priceImpact": "Hinta vaikutus", - "swap.request.title.full": "Vaihda {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "Vaihda tokeneita", - "swap.review": "Arvostelun vaihto", - "swap.review.summary": "Olet vaihtamassa", - "swap.reviewLimit": "Tarkistamisraja", - "swap.route.optimizedGasCost": "Tämä reitti ottaa huomioon jaetut reitit, useita hyppyjä ja kunkin vaiheen verkkokustannukset.", - "swap.routing.jupiter.description": "Jupiter kokoaa likviditeettiä useista lähteistä tarjotakseen sinulle parhaat hinnat.", - "swap.routing.uniswapAutoRouter.description": "Uniswap Auto Router ottaa huomioon optimaaliset reitit ja verkkokustannukset tarjotakseen sinulle parhaat hinnat.", - "swap.settings.deadline.tooltip": "Tapahtumasi palautetaan, jos se on vireillä yli tämän ajanjakson. (Enintään: 3 päivää).", - "swap.settings.deadline.warning": "Korkea määräaika", - "swap.settings.oneClickSwap.title": "Yhden napsautuksen vaihdot", - "swap.settings.oneClickSwap.tooltip": "Yhdistää vakiomuotoiset vaihtotoiminnot nopeampia ja edullisempia vaihtoja varten.", - "swap.settings.protection.description": "Kun swap-suojaus on käytössä, Ethereum-tapahtumasi suojataan sandwich-hyökkäyksiltä, mikä vähentää epäonnistumisen mahdollisuuksia.", - "swap.settings.protection.subtitle.supported": "{{chainName}} Verkko", - "swap.settings.protection.subtitle.unavailable": "Ei saatavilla {{chainName}}", - "swap.settings.protection.title": "Vaihda suojaus", - "swap.settings.routingPreference.option.default.description": "Tämän vaihtoehdon valitseminen tunnistaa vaihdollesi tehokkaimman reitin.", - "swap.settings.routingPreference.option.default.description.preV4": "Uniswap-asiakas valitsee halvimman kauppavaihtoehdon hinnan ja verkkokustannusten perusteella.", - "swap.settings.routingPreference.option.default.description.uniswapXUnavailable": "UniswapX ei ole saatavilla lompakollesi", - "swap.settings.routingPreference.option.default.tooltip": "Reitti tunnistetaan v2-, v3- ja tietyt v4-poolit huomioon ottaen arvioitu hintavaikutus ja verkkokustannukset.", - "swap.settings.routingPreference.option.v2.title": "Ota käyttöön v2-poolit", - "swap.settings.routingPreference.option.v3.title": "Ota käyttöön v3-poolit", - "swap.settings.routingPreference.option.v4.hooks.title": "Ota käyttöön v4-koukkupoolet", - "swap.settings.routingPreference.option.v4.hooks.tooltip": "V4-koukut reittejä vaihtuu ennalta hyväksyttyjen koukkujen avulla.", - "swap.settings.routingPreference.option.v4.title": "Ota käyttöön v4-pooleja", - "swap.settings.routingPreference.title": "Kaupan vaihtoehdot", - "swap.settings.slippage.alert": "Korkea luisto", - "swap.settings.slippage.control.auto": "Auto", - "swap.settings.slippage.description": "Tapahtumasi palautuu, jos hinta muuttuu enemmän kuin lipsumaprosentti.", - "swap.settings.slippage.input.message": "Jos hinta putoaa entisestään, kauppasi palautuu. Alla on vähimmäissumma, jonka saat taatusti.", - "swap.settings.slippage.input.receive.title": "Vastaanota ainakin", - "swap.settings.slippage.output.message": "Jos hinta putoaa entisestään, kauppasi palautuu. Alla on enimmäissumma, jonka sinun on käytettävä.", - "swap.settings.slippage.output.spend.title": "Kuluta korkeintaan", - "swap.settings.slippage.warning": "Erittäin korkea luisto", - "swap.settings.slippage.warning.description": "Yli 20 %:n lipsahdus johtaa todennäköisesti epäsuotuisaan kauppaan. Pienennä asetuksiasi vähentääksesi etukäteistyön riskiä.", - "swap.settings.slippage.warning.hover": "Tämä voi johtaa epäsuotuisaan kauppaan. Kokeile alentaa liukuma-asetusta.", - "swap.settings.slippage.warning.max": "Anna arvo, joka on pienempi kuin {{maxSlippageTolerance}}", - "swap.settings.slippage.warning.message": "Luisuma voi olla suurempi kuin on tarpeen", - "swap.settings.slippage.warning.min": "Anna arvo, joka on suurempi kuin 0", - "swap.settings.title": "Vaihda asetukset", - "swap.settings.transactionRevertPrice": "Tapahtumasi palautuu, jos hinta muuttuu epäsuotuisasti enemmän kuin tämä prosenttiosuus.", - "swap.signAndSwap": "Allekirjoita ja vaihda", - "swap.slippage.amt": "{{amt}} lipsahdus", - "swap.slippage.bridging": "Ei liukumista vaihdettaessa verkkojen välillä", - "swap.slippage.description": "Odotetun ja toteutuneen hinnan välinen ero swap-sopimuksessa. Eroja voi johtua alhaisesta likviditeetistä, markkinoiden volatiliteetista tai boteista. \n\nUniswap-suojaus suojaa frontrunning-botteja ja MEV:iä vastaan.", - "swap.slippage.settings.title": "Liukastumisen asetukset", - "swap.slippage.tooltip": "Maksutapahtumaa edeltänyt enimmäishinnan muutos palautuu.", - "swap.slippageBelow.warning": "Liukuminen alle {{amt}} voi johtaa epäonnistuneeseen tapahtumaan", - "swap.submitted": "Vaihto lähetetty", - "swap.success": "Menestys vaihtoon!", - "swap.tokenOwnFees": "Jotkin rahakkeet veloittavat osto- tai myyntimaksun, jonka tunnuksen myöntäjä määrittää. Uniswap ei saa mitään näistä maksuista.", - "swap.tradeRoutes": "Kauppareitit", - "swap.transaction.deadline": "Kaupan määräaika", - "swap.transaction.revertAfter": "Tapahtumasi palautetaan, jos se on vireillä yli tämän ajanjakson.", - "swap.warning.enterLargerAmount.title": "Syötä suurempi summa", - "swap.warning.expectedFailure.increaseSlippage": "Yritä lisätä liukumistasi.", - "swap.warning.expectedFailure.titleMay": "Tämä vaihto saattaa epäonnistua", - "swap.warning.insufficientBalance.title": "Sinulla ei ole tarpeeksi {{currencySymbol}}", - "swap.warning.insufficientGas.button": "Ei tarpeeksi {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "Vaihda arvoon {{ tokenSymbol }} , {{networkName}}", - "swap.warning.insufficientGas.button.buy": "Osta {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "Osta kortilla", - "swap.warning.insufficientGas.message.withNetwork": "Ei tarpeeksi {{currencySymbol}} {{networkName}} vaihtamiseen", - "swap.warning.insufficientGas.message.withoutNetwork": "Ei tarpeeksi {{currencySymbol}} vaihtamiseen", - "swap.warning.insufficientGas.title": "Sinulla ei ole tarpeeksi {{currencySymbol}} kattamaan verkkokustannuksia", - "swap.warning.networkFee.allow": "Salli {{ inputTokenSymbol }} (kerran)", - "swap.warning.networkFee.delegation.message": "Tämä on maksutapahtumasi käsittelystä ja älylompakkosi aktivoinnista Unichainissa aiheutuva kustannus. Uniswap Labs ei saa osuutta näistä maksuista.", - "swap.warning.networkFee.highRelativeToValue": "Verkon hinta ylittää 10 % tapahtuman kokonaisarvosta. Tämä on maksutapahtumasi käsittelystä lohkoketjussa. Uniswap ei saa osuutta näistä maksuista.", - "swap.warning.networkFee.highRelativeToValue.unichain": "Verkon hinta ylittää 10 % tapahtuman kokonaisarvosta. Tämä on maksutapahtumasi käsittelystä lohkoketjussa.", - "swap.warning.networkFee.includesDelegation": "Sisältää älylompakon aktivoinnin", - "swap.warning.networkFee.message": "Tämä on maksutapahtumasi käsittelystä lohkoketjussa. Uniswap ei saa osuutta näistä maksuista.", - "swap.warning.networkFee.message.unichain": "Tämä on maksutapahtumasi käsittelystä lohkoketjussa.", - "swap.warning.networkFee.message.uniswapX": "Tämä on maksutapahtumasi käsittelystä lohkoketjussa. Uniswap ei saa osuutta näistä maksuista. UniswapX kokoaa likviditeettilähteitä parempiin hintoihin ja kaasuvapaisiin vaihtosopimuksiin.", - "swap.warning.networkFee.message.uniswapX.title": "Ei verkkokuluja UniswapX:n kanssa", - "swap.warning.networkFee.message.uniswapX.unichain": "Tämä on maksutapahtumasi käsittelystä lohkoketjussa. UniswapX kokoaa likviditeettilähteitä parempiin hintoihin ja kaasuvapaisiin vaihtosopimuksiin.", - "swap.warning.noQuotesFound.bridging.message": "Yhtään yhdistävää lainausta ei löytynyt. Kokeile virallista siltaa tällä hetkellä.", - "swap.warning.noQuotesFound.title": "Lainauksia ei löytynyt", - "swap.warning.noRoutesFound.message": "Valituille tokeneille ei ole tällä hetkellä saatavilla reittejä. Kokeile toista paria tai tarkista myöhemmin uudelleen.", - "swap.warning.noRoutesFound.title": "Ei reittejä saatavilla", - "swap.warning.offline.message": "Olet ehkä menettänyt Internet-yhteyden tai verkko saattaa olla poikki. Tarkista internetyhteytesi ja yritä uudelleen.", - "swap.warning.offline.title": "Olet offline-tilassa", - "swap.warning.priceImpact.message": "Tällä hetkellä saatavilla olevan {{outputCurrencySymbol}} likviditeetin määrän vuoksi mitä enemmän {{inputCurrencySymbol}} yrität vaihtaa, sitä vähemmän {{outputCurrencySymbol}} saat.", - "swap.warning.priceImpact.message.veryHigh": "Tämä liiketoimi aiheuttaa {{priceImpactValue}} hintavaikutuksen tämän poolin markkinahintaan ja johtaa varojen menetykseen.", - "swap.warning.priceImpact.title": "Suuri hintavaikutus ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "Erittäin suuri hintavaikutus ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "Tapahtumaasi ei lähetetty, koska suljit sovelluksen.", - "swap.warning.queuedOrder.approvalFailed": "Tapahtumaasi ei lähetetty, koska tunnuksen hyväksyminen epäonnistui.", - "swap.warning.queuedOrder.stale": "Tapahtumaasi ei lähetetty, koska suljit sovelluksen tai hyväksyminen kesti liian kauan.", - "swap.warning.queuedOrder.submissionFailed": "Tapahtumasi lähettämisessä oli ongelma.", - "swap.warning.queuedOrder.title": "Vaihto peruttu", - "swap.warning.rateLimit.message": "Yritä uudelleen muutaman minuutin kuluttua.", - "swap.warning.rateLimit.title": "Hintaraja ylitetty", - "swap.warning.router.message": "Yhteys voi olla katkennut tai verkko saattaa olla poikki. Jos ongelma jatkuu, yritä myöhemmin uudelleen.", - "swap.warning.router.title": "Tätä kauppaa ei voida suorittaa juuri nyt", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} on estetty", - "swap.warning.tokenBlockedFallback.button": "Token on estetty", - "swap.warning.uniswapFee.message": "Maksut lisätään parhaan mahdollisen käyttökokemuksen varmistamiseksi Uniswapin kanssa.", - "swap.warning.uniswapFee.message.default": "Maksuja peritään parhaan mahdollisen Uniswap-kokemuksen varmistamiseksi. Tähän vaihtoon ei liity maksua.", - "swap.warning.uniswapFee.message.included": "Maksuja sovelletaan parhaan mahdollisen Uniswap-kokemuksen varmistamiseksi, ja ne on jo otettu huomioon tässä tarjouksessa.", - "swap.warning.uniswapFee.title": "Vaihtomaksu", - "swap.warning.viewOnly.message": "Sinun on tuotava tämä lompakko palautuslausekkeen kautta vaihtaaksesi tunnuksia.", - "swap.wrap.token": "Kääri {{sym}}", - "tdp.balanceSummary.otherNetworks": "Muissa verkoissa", - "tdp.balanceSummary.otherNetworksBalance": "Saldo muissa verkoissa", - "tdp.balanceSummary.title": "Tasapainosi", - "tdp.button.getToken": "Hanki {{ tokenSymbol }}", - "tdp.button.getTokenFallback": "Hanki Token", - "tdp.loading.title.default": "tunnustiedot kohteelle ", - "tdp.loading.title.withChain": "merkkidata osoitteessa {{chainName}}", - "tdp.nameNotFound": "Nimeä ei löydy", - "tdp.noInfoAvailable": "Tunnustietoja ei ole saatavilla", - "tdp.noTestnetSupportDescription": "Jotkut testiverkot eivät tue tunnuksien vaihtamista, lähettämistä tai ostamista.", - "tdp.symbolNotFound": "Symbolia ei löydy", - "testnet.modal.swapDeepLink.description.toProdMode": "Tämä toiminto edellyttää testnet-tilan poistamista käytöstä. Testnet-tila voidaan ottaa uudelleen käyttöön milloin tahansa asetuksista.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "Tämä toiminto edellyttää, että testiverkkotila on käytössä. Testiverkkojen tokeneilla ei ole todellista arvoa. Testnet-tila voidaan poistaa käytöstä milloin tahansa asetuksista.", - "testnet.modal.swapDeepLink.title.toProdMode": "Poista testnet-tila käytöstä", - "testnet.modal.swapDeepLink.title.toTestnetMode": "Ota testiverkkotila käyttöön", - "testnet.unsupported": "Tätä toimintoa ei tueta testnet-tilassa.", - "themeToggle.theme": "Teema", - "title.buySellTradeEthereum": "Osta, myy ja vaihda Ethereumia ja muita huipputokeneita Uniswapissa", - "title.createGovernanceOn": "Luo uusi hallintoehdotus Uniswapissa", - "title.createGovernanceTo": "Luo uusi hallintoehdotus, josta UNI-haltijat äänestävät. UNI-tunnukset edustavat Uniswap-hallinnon ääniosuuksia.", - "title.earnFees": "Ansaitse maksuja, kun muut vaihtavat Uniswapilla lisäämällä tokeneita likviditeettipooliin.", - "title.easilyRemove": "Poista helposti likviditeettisi Uniswap v2:sta ja talleta Uniswap v3:een.", - "title.easilyRemoveV4": "Poista likviditeettisi helposti Uniswap v2:sta ja v3:sta tallettaaksesi Uniswap v4:ään.", - "title.extension.uninstall": "Laajennus poistettu", - "title.extensionPasskeyLogIn": "Kirjaudu sisään salasanalla", - "title.managePasskeys": "Uniswap | Hallinnoi salasanojasi", - "title.migratev2": "Siirrä v2 poolin likviditeetti Uniswap v3:een", - "title.migratev3": "Siirrä poolin likviditeetti Uniswap v4:ään", - "title.placeLimit": "Tee rajatilauksia Uniswapissa", - "title.realTime": "Reaaliaikaiset hinnat, kaaviot, tapahtumatiedot ja paljon muuta.", - "title.removeLiquidityv2": "Poista poolin likviditeetti (v2) Uniswapissa", - "title.removePoolLiquidity": "Poista poolin likviditeetti Uniswapissa", - "title.removeTokensv2": "Poista tokenisi v2-likviditeettipoolista.", - "title.removev3Liquidity": "Poista tunnuksesi v3:n likviditeettipoolista.", - "title.sendCrypto": "Lähetä kryptovaluuttaa", - "title.sendTokens": "Lähetä rahakkeita Uniswapissa", - "title.swappingMadeSimple": "Osta ja myy kryptovaluuttoja välittömästi Ethereumissa, Basessa, Arbitrumissa, Polygonissa, Unichainissa ja muissa. DeFi-alusta, johon miljoonat ihmiset luottavat.", - "title.tradeTokens": "Vaihda tokeneita ja tarjoa likviditeettiä. Reaaliaikaiset hinnat, kaaviot, tapahtumatiedot ja paljon muuta.", - "title.uniswapTradeCrypto": "Uniswap | Käy kryptokauppaa DeFi:n johtavassa pörssissä ", - "title.uniToken": "UNI-tunnukset edustavat ääniosuuksia Uniswap-hallinnossa. Voit äänestää jokaisesta ehdotuksesta itse tai delegoida äänesi kolmannelle osapuolelle.", - "title.voteOnGov": "Äänestys Uniswapin hallintoehdotuksista", - "token.balances.main": "Tasapainosi", - "token.balances.other": "Saldot muissa verkoissa", - "token.balances.viewOnly": "{{ownerAddress}}:n saldo", - "token.bridge": "{{label}} merkkisilta", - "token.chart.candlestick.unavailable": "Kynttilänjalkakaavioita ei ole saatavilla tälle tunnukselle", - "token.chart.tooltip": "Maksut: {{amount}}", - "token.details": "Token tiedot", - "token.error.unknown": "Tuntematon tunnus", - "token.fee.buy.label": "ostaa maksu", - "token.fee.label": "maksu", - "token.fee.sell.label": "myyntipalkkio", - "token.links.title": "Linkit", - "token.links.twitter": "Viserrys", - "token.links.website": "Verkkosivusto", - "token.notFound.description": "Valitettavasti emme löydä tietoja tälle tunnukselle. Tarkista nimi ja osoite ja yritä uudelleen.", - "token.notFound.title": "Tunnusta ei löydy", - "token.priceExplorer.error.description": "Jotain meni pieleen.", - "token.priceExplorer.error.title": "Hintakaaviota ei voitu ladata", - "token.priceExplorer.timeRangeLabel.all": "Koko ajan", - "token.priceExplorer.timeRangeLabel.day": "1D", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 päivä", - "token.priceExplorer.timeRangeLabel.hour": "1H", - "token.priceExplorer.timeRangeLabel.month": "1 milj", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 kuukausi", - "token.priceExplorer.timeRangeLabel.week": "1W", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 viikko", - "token.priceExplorer.timeRangeLabel.year": "1V", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 vuosi", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} ei ole saatavilla", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} ja {{tokenSymbol1}} eivät ole saatavilla", - "token.safety.fee.detected": "Token-maksu havaittu", - "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs ei saa mitään näistä maksuista.", - "token.safety.warning.alwaysDoYourResearch": "Tee aina tutkimustietosi", - "token.safety.warning.blocked.description.default_one": "Et voi vaihtaa tätä merkkiä Uniswap-sovelluksella.", - "token.safety.warning.blocked.description.default_other": "Et voi vaihtaa näitä tokeneita Uniswap-sovelluksella.", - "token.safety.warning.copyContractAddress.message": "Tämä on sopimusosoite, joka toimii lohkoketjun merkkien yksilöllisenä tunnisteena. Kaikki tähän osoitteeseen lähettämäsi kryptotiedostot menetetään.", - "token.safety.warning.copyContractAddress.title": "Älä lähetä kryptoa tähän osoitteeseen", - "token.safety.warning.dontShowWarningAgain": "Älä näytä minulle tätä varoitusta uudelleen", - "token.safety.warning.dontShowWarningAgainShort": "Älä näytä uudelleen", - "token.safety.warning.doYourOwnResearch": "Tee aina oma tutkimus ennen kuin jatkat.", - "token.safety.warning.feeDescription": "Veloittaa kun {{action}}", - "token.safety.warning.flaggedAsMalicious": "Ilmoitettu haitalliseksi", - "token.safety.warning.flaggedAsSuspicious": "Ilmoitettu epäilyttäväksi", - "token.safety.warning.fotHigh.title": "Korkea maksu havaittu", - "token.safety.warning.fotLow.title": "Maksu havaittu", - "token.safety.warning.fotVeryHigh.title": "Erittäin korkea maksu havaittu", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} on merkitty myymättömäksi. Tämän tunnuksen vaihtaminen voi johtaa varojen menettämiseen.", - "token.safety.warning.honeypot.title": "100 % myyntipalkkio havaittu", - "token.safety.warning.impersonator": "Esiintyy toisena tunnuksena", - "token.safety.warning.impersonator.title": "jäljittelijätunnus havaittu", - "token.safety.warning.malicious.general.message": "Blockaid on merkinnyt {{tokenSymbol}} haitalliseksi.", - "token.safety.warning.malicious.impersonator.message": "Blockaid on ilmoittanut {{tokenSymbol}} , koska se on yrittänyt kopioida eri merkkiä. Se ei ehkä ole se merkki, jota aiot vaihtaa.", - "token.safety.warning.malicious.impersonator.message.short": "{{tokenSymbol}} ei välttämättä ole se merkki, jota aiot vaihtaa.", - "token.safety.warning.malicious.title": "Haitallinen tunnus havaittu", - "token.safety.warning.mayResultInLoss": "Sen vaihtaminen voi johtaa varojen menetykseen.", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} ei käydä kauppaa Yhdysvaltojen johtavissa keskitetyissä pörsseissä.", - "token.safety.warning.notListedOnExchanges": "Ei listattu johtavissa Yhdysvaltain pörsseissä", - "token.safety.warning.potentialHoneypot.card.message": "Blockaid on merkinnyt {{tokenSymbol}} epäilyttäväksi.", - "token.safety.warning.potentialHoneypot.modal.message": "Blockaid on merkinnyt {{tokenSymbol}} mahdolliseksi hunajapotiksi. Tee aina oma tutkimus ennen kuin jatkat.", - "token.safety.warning.potentialHoneypot.title": "Mahdollinen hunajaruukku havaittu", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} on merkitty myymättömäksi.", - "token.safety.warning.sellFee100.title": "100 % myyntipalkkio havaittu", - "token.safety.warning.spam.message": "Blockaid on merkinnyt {{tokenSymbol}} roskapostiksi.", - "token.safety.warning.spam.title": "Roskapostitunnus havaittu", - "token.safety.warning.spamsUsers": "Roskapostin käyttäjät", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} veloittaa {{buyFeePercent}} maksun ostettaessa ja {{sellFeePercent}} myytäessä.", - "token.safety.warning.tokenChargesFee.buy.message": "{{tokenSymbol}} veloittaa {{feePercent}} maksun ostettaessa.", - "token.safety.warning.tokenChargesFee.buy.message.descriptive": "{{tokenSymbol}} veloittaa {{feePercent}} maksun ostettaessa. Vaihtaminen voi johtaa varojen menetykseen. Uniswap Labs ei vastaanota mitään näistä maksuista.", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} veloittaa {{feePercent}} maksun myydessään.", - "token.safety.warning.tokenChargesFee.sell.message.descriptive": "{{tokenSymbol}} veloittaa {{feePercent}} maksun myydessä. Vaihtaminen voi johtaa varojen menetykseen. Uniswap Labs ei vastaanota mitään näistä maksuista.", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} veloittaa ostosta tai myymisestä maksun.", - "token.safetyLevel.blocked.message": "Et voi vaihtaa tätä merkkiä Uniswap-lompakolla.", - "token.safetyLevel.medium.message.plural": "Näillä rahakkeilla ei käydä kauppaa Yhdysvaltojen johtavissa keskitetyissä pörsseissä. Tee aina oma tutkimus ennen kuin jatkat.", - "token.selector.search.error": "Hakutuloksia ei voitu ladata", - "token.stats.fullyDilutedValuation": "Täysin laimennettu arvostus", - "token.stats.marketCap": "Markkina-arvo", - "token.stats.priceHighYear": "52W korkea", - "token.stats.priceLowYear": "52W alhainen", - "token.stats.section.about": "Noin {{token}}", - "token.stats.title": "Tilastot", - "token.stats.translation.original": "Näytä alkuperäinen", - "token.stats.translation.translate": "Käännä kielelle {{language}}", - "token.stats.volume": "24h Volume", - "token.symbol.input.fallback": "Syöttötunnus", - "token.symbol.output.fallback": "Tulostustunnus", - "token.wrap.fail.message": "Uniswap-protokollan vaihdot voivat alkaa ja päättyä ETH:lla. Vaihdon aikana ETH kuitenkin kääritään WETH:ksi.", - "token.zeroNativeBalance.description.mainnet": "Sinun on vaihdettava merkki Ethereumissa saadaksesi {{ tokenSymbol }}. Vaihto vaatii ETH:n verkkokustannuksia varten.", - "token.zeroNativeBalance.description.otherChains": "Sinun on vaihdettava merkki kohdassa {{ chainName }} saadaksesi {{ tokenSymbol }}. Vaihto vaatii {{ chainName }} {{ nativeTokenSymbol }} verkkokustannuksia varten.", - "token.zeroNativeBalance.subtitle": "{{ tokenSymbol }} ei ole ostettavissa suoraan.", - "token.zeroNativeBalance.title.mainnet": "Tarvitset {{ nativeTokenName }}", - "token.zeroNativeBalance.title.otherChains": "Tarvitset {{ nativeTokenName }} osoitteessa {{ chainName }}", - "tokens.action.hide": "Piilota tunnus", - "tokens.action.unhide": "Näytä tunnus", - "tokens.nfts.action.viewOnExplorer": "Katso {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "NFT-kokoelmaa ei voitu ladata", - "tokens.nfts.collection.label.items": "Tuotteet", - "tokens.nfts.collection.label.owners": "Omistajat", - "tokens.nfts.collection.label.priceFloor": "Lattia", - "tokens.nfts.collection.label.swapVolume": "Äänenvoimakkuus", - "tokens.nfts.connectEthereumToView": "Yhdistä Ethereum-lompakko nähdäksesi NFT:si", - "tokens.nfts.details.contract.address": "Sopimusosoite", - "tokens.nfts.details.error.load.title": "NFT-tietoja ei voitu ladata", - "tokens.nfts.details.network": "Verkko", - "tokens.nfts.details.owner": "Omistuksessa", - "tokens.nfts.details.price": "Nykyinen hinta", - "tokens.nfts.details.recentPrice": "Viimeinen myyntihinta", - "tokens.nfts.details.traits": "Ominaisuudet", - "tokens.nfts.empty.description": "NFT:tä ei löytynyt", - "tokens.nfts.error.unavailable": "Sisältöä ei ole saatavilla", - "tokens.nfts.hidden.action.hide": "Piilota NFT", - "tokens.nfts.hidden.action.unhide": "Näytä NFT", - "tokens.nfts.link.collection": "Kokoelman verkkosivusto", - "tokens.nfts.list.error.load.title": "NFT:tä ei voitu ladata", - "tokens.nfts.list.none.button": "Vastaanota NFT:t", - "tokens.nfts.list.none.description.default": "Aloita siirtämällä NFT:t toisesta lompakosta.", - "tokens.nfts.list.none.description.external": "Kun tämä lompakko ostaa tai vastaanottaa NFT:itä, ne näkyvät täällä.", - "tokens.nfts.list.none.title": "Ei vielä NFT:tä", - "tokens.nfts.notAvailableOnSolana": "NFT:t eivät ole saatavilla Solanassa", - "tokens.selector.button.choose": "Valitse tunnus", - "tokens.selector.empty.buy.message": "Osta krypto kortilla tai pankilla lähettääksesi rahakkeita.", - "tokens.selector.empty.buy.title": "Osta krypto", - "tokens.selector.empty.receive.title": "Vastaanota tokeneja", - "tokens.selector.empty.title": "Ei vielä tunnuksia", - "tokens.selector.error.load": "Tunnuksia ei voitu ladata", - "tokens.selector.search.empty": "Ei tuloksia haulle {{searchText}}", - "tokens.selector.search.placeholder": "Etsi tokeneja", - "tokens.selector.section.bridging": "Vaihda verkkojen välillä", - "tokens.selector.section.favorite": "Suosikit", - "tokens.selector.section.otherNetworksSearchResults": "Tokeneja löytyi muista verkoista", - "tokens.selector.section.otherSearchResults": "Muut merkit paikassa {{network}}", - "tokens.selector.section.recent": "Viimeaikaiset haut", - "tokens.selector.section.search": "Hakutulokset", - "tokens.selector.section.trending": "Tokeneita 24 tunnin tilavuudella", - "tokens.selector.section.yours": "Sinun tokenisi", - "tokens.table.search.placeholder.pools": "Etsi poolit", - "tokens.table.search.placeholder.tokens": "Etsi tokeneja", - "tokens.table.search.placeholder.transactions": "Hae tapahtumia", - "toucan.auction.bidConcentration": "Tukaanien keskittyminen", - "toucan.auction.bidConcentration.tooltip.description": "Toucan-työkaluvihjeen kuvaus", - "toucan.auction.bidConcentration.tooltip.title": "Tukaanin työkaluvihjeen otsikko", - "toucan.auctions": "Huutokaupat", - "toucan.bidForm.maxBudget": "Maksimibudjetti", - "toucan.bidForm.placeBid": "Tee tarjouksesi", - "toucan.displayMode.tokenPrice": "Tokenin hinta", - "toucan.displayMode.valuation": "Arvostus", - "transaction.action.cancel.button": "Peruuta tapahtuma", - "transaction.action.cancel.description": "Jos peruutat tämän tapahtuman ennen kuin verkko on käsitellyt sen, maksat uuden verkkomaksun alkuperäisen sijaan.", - "transaction.action.cancel.title": "Perutaanko tämä tapahtuma?", - "transaction.action.clear": "Tyhjennä odottaa", - "transaction.action.copy": "Kopioi tapahtumatunnus", - "transaction.action.copyProvider": "Kopioi {{providerName}} tapahtumatunnus", - "transaction.amount.unlimited": "Rajoittamaton", - "transaction.callData": "Puhelutiedot", - "transaction.details.dappName": "Sovellus", - "transaction.details.from": "From", - "transaction.details.networkFee": "Verkon hinta", - "transaction.details.networkFee.swap": "Vaihtoverkon hinta", - "transaction.details.providerFee": "Palveluntarjoajan maksu", - "transaction.details.swapRate": "Rate", - "transaction.details.transaction": "Tapahtuma", - "transaction.details.uniswapFee": "Maksu ({{ feePercent }}%)", - "transaction.network.all": "Kaikki verkot", - "transaction.networkCost.description": "Lohkoketjussa tapahtuvan tapahtuman käsittelyn kustannukset. Uniswap on optimoitu minimoimaan verkkokustannukset.", - "transaction.networkCost.includesSmartWalletActivation": "Sisältää älylompakon aktivoinnin", - "transaction.networkCost.label": "Verkon hinta", - "transaction.networkCost.maxNativeBalance.description": "Pieni määrä verkkotunnuksen saldosta on varattu kattamaan tämän tapahtuman verkkokustannukset.", - "transaction.networkCost.maxNativeBalance.title": "Miksi en voi käyttää enimmäissaldoani?", - "transaction.networkCost.veryHigh.label": "Erittäin korkeat verkkokustannukset", - "transaction.notification.error.cancel": "Tapahtumaa ei voi peruuttaa", - "transaction.notification.error.replace": "Tapahtumaa ei voi korvata", - "transaction.status.approval.canceled": "Hyväksyntä peruttu", - "transaction.status.approval.failed": "Hyväksyminen epäonnistui", - "transaction.status.approve.canceled": "Peruutettu hyväksyntä", - "transaction.status.approve.canceling": "Peruutetaan hyväksyntää", - "transaction.status.approve.failed": "Hyväksyminen epäonnistui", - "transaction.status.approve.pending": "Hyväksytään", - "transaction.status.approve.success": "Hyväksytty", - "transaction.status.approve.successDapp": "Hyväksytty {{externalDappName}}", - "transaction.status.buy.canceled": "Peruutettu ostos", - "transaction.status.buy.canceling": "Ostoksen peruuttaminen", - "transaction.status.buy.failed": "Ostaminen epäonnistui", - "transaction.status.buy.pending": "Ostaminen", - "transaction.status.buy.success": "Ostettu", - "transaction.status.buy.successDapp": "Ostettu {{externalDappName}}", - "transaction.status.claim.canceled": "Maksun kerääminen peruttu", - "transaction.status.claim.canceling": "Maksun perimisen peruuttaminen", - "transaction.status.claim.failed": "Maksun kerääminen epäonnistui", - "transaction.status.claim.pending": "Maksujen kerääminen", - "transaction.status.claim.success": "Kerätyt maksut", - "transaction.status.collect.fees.canceled": "Keräysmaksut peruttu", - "transaction.status.collect.fees.failed": "Maksujen kerääminen epäonnistui", - "transaction.status.collected.fees": "Kerätyt maksut", - "transaction.status.collecting.fees": "Maksujen kerääminen", - "transaction.status.confirm.canceled": "Peruutettu vahvista", - "transaction.status.confirm.canceling": "Odottaa peruutusta", - "transaction.status.confirm.failed": "Vahvistus epäonnistui", - "transaction.status.confirm.pending": "Kauppa käynnissä", - "transaction.status.confirm.success": "Kauppa vahvistettu", - "transaction.status.confirm.successDapp": "Tapahtuma vahvistettu {{externalDappName}}", - "transaction.status.createPair.canceled": "Parin luonti peruutettu", - "transaction.status.createPair.canceling": "Parin luonti peruutetaan", - "transaction.status.createPair.failed": "Parin luominen epäonnistui", - "transaction.status.createPair.pending": "Parin luominen", - "transaction.status.createPair.success": "Luotu pari", - "transaction.status.createPool.canceled": "Poolin luonti peruttu", - "transaction.status.createPool.canceling": "Poolin luonti peruutetaan", - "transaction.status.createPool.failed": "Poolin luominen epäonnistui", - "transaction.status.createPool.pending": "Uima-altaan luominen", - "transaction.status.createPool.success": "Luotu allas", - "transaction.status.liquidityDecrease.canceled": "Poista peruutettu likviditeetti", - "transaction.status.liquidityDecrease.canceling": "Likviditeetin poistamisen peruuttaminen", - "transaction.status.liquidityDecrease.failed": "Likviditeetin poistaminen epäonnistui", - "transaction.status.liquidityDecrease.pending": "Likviditeetin poistaminen", - "transaction.status.liquidityDecrease.success": "Likviditeetti poistettu", - "transaction.status.liquidityIncrease.canceled": "Likviditeetin lisäys peruttu", - "transaction.status.liquidityIncrease.canceling": "Likviditeetin lisäämisen peruuttaminen", - "transaction.status.liquidityIncrease.failed": "Likviditeetin lisääminen epäonnistui", - "transaction.status.liquidityIncrease.pending": "Likviditeetin lisääminen", - "transaction.status.liquidityIncrease.success": "Lisätty likviditeettiä", - "transaction.status.lpIncentivesClaim.canceled": "Peruutettu LP-palkintojen hakemus", - "transaction.status.lpIncentivesClaim.canceling": "LP-palkintojen lunastamisen peruuttaminen", - "transaction.status.lpIncentivesClaim.failed": "LP-palkintojen lunastus epäonnistui", - "transaction.status.lpIncentivesClaim.pending": "LP-palkintojen lunastus", - "transaction.status.lpIncentivesClaim.success": "Lunastetut LP-palkinnot", - "transaction.status.migrateLiquidity.canceled": "Likviditeetin siirto peruttu", - "transaction.status.mint.canceled": "Peruutettu minttu", - "transaction.status.mint.canceling": "Perutaan minttu", - "transaction.status.mint.failed": "Lyönti epäonnistui", - "transaction.status.mint.pending": "Lyönti", - "transaction.status.mint.success": "Mintettu", - "transaction.status.mint.successDapp": "Leimattu {{externalDappName}}", - "transaction.status.offramp.canceled": "Poistumisrampilta peruttu", - "transaction.status.offramp.failed": "Poistumisrampilla epäonnistui", - "transaction.status.offramp.pending": "Rajanylitys", - "transaction.status.offramp.success": "Offramped", - "transaction.status.onramp.canceled": "Kiipeilyrata peruttu", - "transaction.status.onramp.failed": "Onramppi epäonnistui", - "transaction.status.onramp.pending": "Rattaaminen", - "transaction.status.onramp.success": "Onramped", - "transaction.status.permit.approved": "Lupa hyväksytty", - "transaction.status.permit.canceled": "Lupalähetys peruttu", - "transaction.status.permit.failed": "Lupa epäonnistui", - "transaction.status.purchase.canceled": "Ostos peruutettu", - "transaction.status.purchase.canceling": "Ostosta peruutetaan", - "transaction.status.purchase.failed": "Ostos epäonnistui", - "transaction.status.purchase.failedOn": "Ostaminen epäonnistui {{serviceProvider}}", - "transaction.status.purchase.pending": "Ostaminen", - "transaction.status.purchase.pendingOn": "Ostaminen {{serviceProvider}}", - "transaction.status.purchase.successOn": "Ostettu {{serviceProvider}}", - "transaction.status.receive.canceled": "Vastaanotto peruutettu", - "transaction.status.receive.canceling": "Peruutetaan vastaanotto", - "transaction.status.receive.failed": "Vastaanotto epäonnistui", - "transaction.status.receive.failedFrom": "Vastaanotto epäonnistui lähettäjältä {{serviceProvider}}", - "transaction.status.receive.pending": "Vastaanottaminen", - "transaction.status.receive.pendingFrom": "Vastaanotto {{serviceProvider}}", - "transaction.status.receive.success": "Otettu vastaan", - "transaction.status.receive.successDapp": "Vastaanotettu {{externalDappName}}", - "transaction.status.receive.successFrom": "Vastaanotettu {{serviceProvider}}", - "transaction.status.removeDelegation.canceled": "Poista delegointi peruttu", - "transaction.status.removeDelegation.failed": "Delegoinnin poistaminen epäonnistui", - "transaction.status.removeDelegation.pending": "Delegoinnin poistaminen", - "transaction.status.removeDelegation.success": "Valtuutus poistettu", - "transaction.status.revoke.canceled": "Peruutettu peruutus", - "transaction.status.revoke.canceling": "Perutaan peruutus", - "transaction.status.revoke.failed": "Peruminen epäonnistui", - "transaction.status.revoke.pending": "Peruuttaminen", - "transaction.status.revoke.success": "Peruutettu", - "transaction.status.revoke.successDapp": "Peruutettu {{externalDappName}}", - "transaction.status.sale.canceled": "Peruutettu myynti", - "transaction.status.sale.canceling": "Myynnin peruuttaminen", - "transaction.status.sale.failedOn": "Myynti epäonnistui {{serviceProvider}}kautta", - "transaction.status.sale.pendingCard.msg": "Lue lisää krypton myynnistä.", - "transaction.status.sale.pendingCard.title": "Miksi myyntini on edelleen kesken?", - "transaction.status.sale.pendingOn": "Myydään {{serviceProvider}}kautta", - "transaction.status.sale.successOn": "Myydään {{serviceProvider}}kautta", - "transaction.status.sell.canceled": "Myynti peruttu", - "transaction.status.sell.canceling": "Myynnin peruuttaminen", - "transaction.status.sell.failed": "Myynti epäonnistui", - "transaction.status.sell.pending": "Myydään", - "transaction.status.sell.success": "myyty", - "transaction.status.sell.successDapp": "Myydään {{externalDappName}}", - "transaction.status.send.canceled": "Lähetys peruutettu", - "transaction.status.send.canceling": "Peruutetaan lähetystä", - "transaction.status.send.failed": "Lähetys epäonnistui", - "transaction.status.send.pending": "Lähetetään", - "transaction.status.send.success": "Lähetetty", - "transaction.status.send.successDapp": "Lähetetty {{externalDappName}}", - "transaction.status.swap.canceled": "Vaihto peruttu", - "transaction.status.swap.canceling": "Vaihtoa peruutetaan", - "transaction.status.swap.expired": "Swap vanhentunut", - "transaction.status.swap.failed": "Vaihto epäonnistui", - "transaction.status.swap.insufficientFunds": "Riittämättömät varat", - "transaction.status.swap.pending": "Vaihto", - "transaction.status.swap.success": "Vaihdettu", - "transaction.status.swap.successDapp": "Vaihdettu {{externalDappName}}", - "transaction.status.unwrap.canceled": "Purkaminen peruutettu", - "transaction.status.unwrap.canceling": "Perutaan purkaminen", - "transaction.status.unwrap.failed": "Purkaminen epäonnistui", - "transaction.status.unwrap.pending": "Purkaminen", - "transaction.status.unwrap.success": "Avattu", - "transaction.status.unwrap.successDapp": "Purettu {{externalDappName}}", - "transaction.status.wrap.canceled": "Peruutettu kääre", - "transaction.status.wrap.canceling": "Peruutetaan wrap", - "transaction.status.wrap.failed": "Kääriminen epäonnistui", - "transaction.status.wrap.pending": "Kääriminen", - "transaction.status.wrap.success": "Kääritty", - "transaction.status.wrap.successDapp": "Kääritty {{externalDappName}}", - "transaction.submittedOn": "Lähetetty", - "transaction.summary.liquidity": "{{firstAmountWithSymbol}} ja {{secondAmountWithSymbol}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} - {{recipientAddress}}", - "transaction.summary.received.noAmount": "Vastaanotettu {{name}}:lta", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} kohteesta {{senderAddress}}", - "transaction.summary.sent.noAmount": "Lähetetty käyttäjälle {{name}}", - "transaction.warning.insufficientGas.modal.message": "Tarvitset ~{{tokenAmount}} {{tokenSymbol}} () {{networkName}} kattaaksesi tämän tapahtuman verkkokustannukset. Vaihda {{tokenSymbol}} toisesta ketjusta tai osta kortillasi jatkaaksesi.", - "transaction.warning.insufficientGas.modal.message.noAction": "Tarvitset ~{{tokenAmount}} {{tokenSymbol}} () {{networkName}} kattaaksesi tämän tapahtuman verkkokustannukset.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount": "Tarvitset ~{{tokenAmount}} {{tokenSymbol}} () {{networkName}} kattaaksesi tämän tapahtuman verkkokustannukset.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount.noAction": "Jos haluat vaihtaa tähän tunnukseen, tarvitset lisää {{tokenSymbol}} kohdassa {{networkName}}.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "Ei tarpeeksi {{tokenSymbol}} kohdassa {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Ei tarpeeksi {{tokenSymbol}}", - "transaction.warning.maxNative.message": "Olet kuluttamassa suurimman osan verkkotunnuksen saldosta. Tämä ei ehkä riitä kattamaan tulevia verkkokustannuksia.", - "transaction.warning.maxNative.title": "Alhainen verkkotunnuksen saldo", - "transaction.watcher.error.cancel": "Tapahtumaa ei voi peruuttaa", - "transaction.watcher.error.status": "Virhe tarkistettaessa tapahtuman tilaa", - "uniswapX.aggregatesLiquidity": " kokoaa likviditeettilähteitä parempia hintoja ja kaasuvapaita vaihtosopimuksia varten.", - "uniswapX.cost": "UniswapX poistaa lohkoketjussa tapahtuvien transaktioiden tyypilliset kulut.", - "uniswapx.description": "UniswapX kokoaa likviditeettilähteitä parempiin hintoihin ja kaasuvapaisiin vaihtosopimuksiin.", - "uniswapx.description.unsupported": "UniswapX ei ole tällä hetkellä käytettävissä, koska älylompakkosi asetuksia hallinnoi toinen lompakkosovellus.", - "uniswapx.included": "Sisältää UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "Lue lisää vaihtamisesta UniswapX:n kanssa", - "uniswapx.unavailable.title": "UniswapX ei ole käytettävissä", - "uniswapx.v2QuoteFailed": "UniswapX v2 kova tarjous epäonnistui. Yritä uudelleen perinteisellä vaihdolla.", - "unitags.banner.button.claim": "Lunasta nyt", - "unitags.banner.subtitle": "Luo henkilökohtainen web3-profiili ja jaa osoitteesi helposti ystävien kanssa.", - "unitags.banner.title.compact": "Lunasta {{unitagDomain}} -käyttäjänimesi ja rakenna muokattava profiilisi.", - "unitags.banner.title.full": "Lunasta käyttäjänimesi {{unitagDomain}}", - "unitags.choosePhoto.option.cameraRoll": "Valitse kameran rullasta", - "unitags.choosePhoto.option.computer": "Lataa tietokoneelta", - "unitags.choosePhoto.option.nft": "Valitse NFT", - "unitags.choosePhoto.option.remove": "Poista profiilikuva", - "unitags.claim.available": "Saatavilla", - "unitags.claim.confirmation.customize": "Mukauta profiilia", - "unitags.claim.confirmation.description": "{{unitagAddress}} on valmis lähettämään ja vastaanottamaan kryptotiedostoja. Jatka lompakkosi rakentamista mukauttamalla web3-profiiliasi.", - "unitags.claim.confirmation.success.long": "Tajusit sen!", - "unitags.claim.confirmation.success.short": "sain sen!", - "unitags.claim.error.addressLimit": "Olet jo tehnyt enimmäismäärän muutoksia tämän osoitteen käyttäjänimeen", - "unitags.claim.error.avatar": "Avataria ei voitu asettaa. Yritä myöhemmin uudelleen.", - "unitags.claim.error.default": "Käyttäjätunnusta ei voitu vaatia. Yritä myöhemmin uudelleen.", - "unitags.claim.error.deviceLimit": "Olet saavuttanut enimmäismäärän käyttäjänimiä, jotka voivat olla aktiivisia tälle laitteelle", - "unitags.claim.error.general": "Käyttäjätunnusta ei voi lunastaa", - "unitags.claim.error.unavailable": "Tämä käyttäjätunnus ei ole käytettävissä", - "unitags.claim.error.unknown": "Tuntematon virhe", - "unitags.claim.username.default": "sinun nimesi", - "unitags.delete.confirm.subtitle": "Olet poistamassa käyttäjätunnuksesi ja muokattavat profiilitietosi. Et voi saada sitä takaisin.", - "unitags.delete.confirm.title": "Oletko varma?", - "unitags.editProfile.placeholder": "käyttäjätunnus", - "unitags.editUsername.confirm.subtitle": "Olet vaihtamassa käyttäjätunnustasi. Kun muutat sen, et voi enää koskaan vaatia sitä.", - "unitags.editUsername.confirm.title": "Oletko varma?", - "unitags.editUsername.title": "Muokkaa käyttäjänimeäsi", - "unitags.editUsername.warning.default": "Kun vaihdat käyttäjätunnuksesi, et voi enää koskaan lunastaa sitä. Voit muuttaa sitä vain 2 kertaa.", - "unitags.editUsername.warning.max": "Olet saavuttanut 2 käyttäjänimen muutosten enimmäismäärän.", - "unitags.extension.intro.buttton": "Lunasta käyttäjätunnus", - "unitags.extension.intro.description": "Sano hyvästit 0x-osoitteille. Käyttäjätunnukset ovat luettavia nimiä, jotka helpottavat krypton lähettämistä ja vastaanottamista.", - "unitags.extension.intro.title": "Esittelyssä käyttäjätunnukset", - "unitags.extension.intro.upsell.customizable": "Muokattavat profiilit", - "unitags.extension.intro.upsell.ens": "ENS-aliverkkotunnuksia tuottavat", - "unitags.extension.intro.upsell.free": "Ilmainen vaatia", - "unitags.intro.features.ens": "ENS-aliverkkotunnuksia tuottavat", - "unitags.intro.features.free": "Ilmainen vaatia", - "unitags.intro.features.profile": "Muokattavat profiilit", - "unitags.intro.subtitle": "Sano hyvästit 0x-osoitteille. Käyttäjätunnukset ovat luettavia nimiä, jotka helpottavat krypton lähettämistä ja vastaanottamista.", - "unitags.intro.title": "Esittelyssä käyttäjätunnukset", - "unitags.notification.delete.error": "Käyttäjätunnusta ei voitu poistaa. Yritä myöhemmin uudelleen.", - "unitags.notification.delete.title": "Käyttäjätunnus poistettu", - "unitags.notification.profile.error": "Profiilia ei voitu päivittää. Yritä myöhemmin uudelleen.", - "unitags.notification.profile.title": "profiili päivitetty", - "unitags.notification.username.error": "Käyttäjätunnusta ei voitu muuttaa. Yritä myöhemmin uudelleen.", - "unitags.notification.username.title": "Käyttäjätunnus muutettu", - "unitags.onboarding.claim.subtitle": "Tämä on henkilökohtainen osoitteesi, johon ihmiset voivat lähettää kryptotiedostoja.", - "unitags.onboarding.claim.title.choose": "Luo käyttäjätunnuksesi", - "unitags.onboarding.claim.title.claim": "Lunasta käyttäjätunnuksesi", - "unitags.onboarding.info.description": "Käyttäjänimet muuttavat monimutkaiset 0x-osoitteet luettavissa oleviksi nimiksi. Lunastamalla {{unitagDomain}} -käyttäjätunnuksen voit helposti lähettää ja vastaanottaa kryptotiedostoja sekä rakentaa julkisen web3-profiilin.", - "unitags.onboarding.info.title": "Yksinkertaistettu osoite", - "unitags.onboarding.profile.subtitle": "Lataa omasi tai pidä kiinni ainutlaatuisesta Uniconistasi. Voit aina muuttaa tätä myöhemmin.", - "unitags.onboarding.profile.title": "Valitse profiilikuva", - "unitags.profile.action.delete": "Poista käyttäjänimi", - "unitags.profile.action.edit": "Muokkaa käyttäjänimeä", - "unitags.profile.bio.label": "Bio", - "unitags.profile.bio.placeholder": "Kirjoita profiiliisi bio", - "unitags.profile.links.twitter": "Viserrys", - "unitags.username.error.chars": "Käyttäjätunnukset voivat sisältää vain kirjaimia ja numeroita", - "unitags.username.error.max": "Käyttäjänimissä voi olla enintään {{number}} merkkiä", - "unitags.username.error.min": "Käyttäjänimissä on oltava vähintään {{number}} merkkiä", - "unitags.username.error.uppercase": "Käyttäjänimet voivat sisältää vain pieniä kirjaimia ja numeroita", - "uwulink.error.insufficientTokens": "Ei tarpeeksi {{tokenSymbol}} kohdassa {{chain}}", - "v2.notAvailable": "Uniswap V2 ei ole saatavilla tässä verkossa.", - "wallet.appSignIn": "Kirjaudu sisään sovelluksella", - "wallet.connectingAgreement": "Yhdistämällä lompakon hyväksyt Uniswap Labsin käyttöehdot ja sen tietosuojakäytännön.", - "wallet.connectionFailed.message": "Yhteyden muodostaminen epäonnistui. Yritä uudelleen noudattamalla lompakkosi ohjeita.", - "wallet.mismatch.popup.description": "Yhdistetty lompakkosi ei tue joitakin ominaisuuksia.", - "wallet.mismatch.popup.title": "Rajoitettu lompakkotuki", - "wallet.other": "Muut lompakot", - "wallet.scanToConnect": "Skannaa QR-koodi muodostaaksesi yhteyden", - "wallet.wrongNet": "Lompakkosi on yhdistetty väärään verkkoon.", - "walletConnect.dapps.empty.description": "Yhdistä sovellukseen skannaamalla koodi WalletConnectin kautta", - "walletConnect.dapps.manage.empty.title": "Ei yhdistettyjä sovelluksia", - "walletConnect.dapps.manage.title": "Liitännät", - "walletConnect.error.connection.message": "Uniswap Wallet tukee tällä hetkellä {{chainNames}}. Käytä vain \"{{dappName}}\" näissä ketjuissa", - "walletConnect.error.connection.title": "Yhteysvirhe", - "walletConnect.error.general.message": "WalletConnectissa oli ongelma. Yritä uudelleen", - "walletConnect.error.general.title": "WalletConnect-virhe", - "walletConnect.error.scantastic.message": "QR-koodissasi oli ongelma. Yritä uudelleen", - "walletConnect.error.scantastic.title": "Virheellinen QR-koodi", - "walletConnect.error.unsupported.message": "Varmista, että skannaat kelvollista WalletConnect-, Ethereum-osoitetta tai Uniswap-laajennuksen QR-koodia, ennen kuin yrität uudelleen.", - "walletConnect.error.unsupported.title": "Virheellinen QR-koodi", - "walletConnect.error.unsupportedV1.message": "WalletConnect v1:tä ei enää tueta. Sovellus, johon yrität muodostaa yhteyden, on päivitettävä WalletConnect v2:een.", - "walletConnect.error.unsupportedV1.title": "Virheellinen QR-koodi", - "walletConnect.error.uwu.scan": "Tämän QR-koodin skannauksessa oli ongelma.", - "walletConnect.error.uwu.title": "UwU Link -virhe", - "walletConnect.error.uwu.unsupported": "Tätä QR-koodia ei tueta.", - "walletConnect.pending.button.connect": "Kytkeä", - "walletConnect.pending.button.reject": "Hylätä", - "walletConnect.pending.button.scrollDown": "Vieritä alas muodostaaksesi yhteys", - "walletConnect.pending.threat.confirmationText": "Ymmärrän riskit", - "walletConnect.pending.threat.description": "Viestien tai tapahtumien allekirjoittaminen tällä sovelluksella voi johtaa varojen menetykseen.", - "walletConnect.pending.threat.title": "Haittasovellus havaittu", - "walletConnect.pending.title": "Yhdistä {{dappName}}", - "walletConnect.pending.unverified.description": "Varmista, että luotat tähän sivustoon ennen kuin jatkat. ", - "walletConnect.pending.unverified.title": "Vahvistamaton sovellus", - "walletConnect.permissions.option.requestApprovals": "Pyydä transaktioiden hyväksyntöjä", - "walletConnect.permissions.option.transferAssets": "Move funds without permission", - "walletConnect.permissions.option.viewTokenBalances": "View your balance and activity", - "walletConnect.permissions.title": "App permissions", - "walletConnect.request.bundledTransactions.label_one": "Yksittäinen pakettitapahtuma", - "walletConnect.request.bundledTransactions.label_other": "{{count}} niputettuja tapahtumia", - "walletConnect.request.button.scrollDown": "Vieritä alas allekirjoittaaksesi", - "walletConnect.request.button.sign": "Merkki", - "walletConnect.request.details.label.function": "Toiminto", - "walletConnect.request.details.label.sending": "Lähetetään", - "walletConnect.request.details.label.token": "Token", - "walletConnect.request.details.label.tokens": "Tokenit", - "walletConnect.request.error.insufficientFunds": "Sinulla ei ole tarpeeksi {{currencySymbol}} tämän tapahtuman suorittamiseen.", - "walletConnect.request.error.network": "Internet- tai verkkoyhteysvirhe", - "walletConnect.request.warning.batch.message": "Ole varovainen: tämä pyyntö sisältää useita tapahtumia ja voi siirtää varoja", - "walletConnect.request.warning.general.message": "Ole varovainen: tämä viesti saattaa siirtää omaisuutta", - "walletConnect.request.warning.message": "Viestien tai tapahtumien allekirjoittamista varten sinun on tuotava lompakon palautuslauseke.", - "walletConnect.request.warning.title": "Tämä lompakko on vain katselutilassa", - "web.explore.description": "Löydä ja tutki tunnuksia {{network}}. Tutustu suosituimpiin uima-altaisiin. Tarkastele reaaliaikaisia hintoja, kaupankäyntimääriä, TVL:ää, kaavioita ja tapahtumatietoja.", - "web.explore.title.pools": "Tutustu Uniswapin {{network}} suosituimpiin uima-altaisiin", - "web.explore.title.tokens": "Tutustu Uniswapin {{network}} suosituimpiin tokeneihin", - "web.explore.title.transactions": "Tutustu Uniswapin {{network}} suosituimpiin tapahtumiin" -} diff --git a/packages/uniswap/src/i18n/locales/translations/fil-PH.json b/packages/uniswap/src/i18n/locales/translations/fil-PH.json index 047dae48f21..22a05145c9d 100644 --- a/packages/uniswap/src/i18n/locales/translations/fil-PH.json +++ b/packages/uniswap/src/i18n/locales/translations/fil-PH.json @@ -30,7 +30,6 @@ "account.drawer.modal.body": "Ligtas na mag-store at mag-swap ng mga token sa Uniswap app. Available sa iOS at Android.", "account.drawer.modal.dont": "Walang Uniswap wallet?", "account.drawer.modal.scan": "Mag-scan gamit ang Uniswap Wallet", - "account.drawer.spamToggle": "I-hide ang mga hindi kilalang token at NFT", "account.passkey.delete.acknowledge": "Nag-back up ako ng recovery phrase ko at nauunawaan ko na hindi ako matutulungan ng Uniswap Labs na ma-recover ang wallet ko kung hindi ko gagawin iyon.", "account.passkey.delete.description": "Tiyaking na-back up mo ang iyong recovery phrase gamit ang mobile app o browser extension ng Uniswap.", "account.passkey.delete.descriptionEmphasized": "Kung wala ang iyong recovery phrase, baka hindi mo ma-access ang wallet mo.", @@ -115,6 +114,7 @@ "account.wallet.watch.placeholder": "ENS o address", "account.wallet.watch.title": "Maglagay ng address ng wallet", "activity.pending": "{{pendingActivityCount}} ang Nakabinbin", + "activity.recentActivity": "Recent activity", "activity.transaction.lpRewards.descriptor": "Nakolekta ang mga reward ng {{symbol}}", "activity.transaction.send.descriptor": "{{amountWithSymbol}} papunta sa {{walletAddress}}", "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} para sa {{amountWithSymbolB}}", @@ -144,15 +144,15 @@ "bridgedAsset.send.warning.description": "Nagpapadala ka ng naka-wrap na bersyon ng {{currencySymbol}} sa {{chainName}}. Kapag ipinadala ito sa sentralisadong palitan, magreresulta ito sa permanenteng pagkawala ng mga pondo.", "bridgedAsset.send.warning.title": "Tiyaking nagpapadala ka sa compatible na address", "bridgedAsset.tdp.description": "Ang naka-bridge na bersyong ito ng {{currencySymbol}} na 1:1 na sinusuportahan ng native na {{currencySymbol}}.", - "bridgedAsset.wormhole.button": "Magpatuloy sa Wormhole", - "bridgedAsset.wormhole.description": "Magpatuloy sa Wormhole portal para i-bridge ang iyong {{currencySymbol}} mula sa {{chainName}} sa {{nativeChainName}}.", + "bridgedAsset.wormhole.button": "Continue to {{provider}}", + "bridgedAsset.wormhole.description": "Continue to the {{provider}} portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", "bridgedAsset.wormhole.title": "Mag-withdraw sa {{currencySymbol}} sa {{nativeChainName}}", "bridgedAsset.wormhole.toNativeChain": "sa {{nativeChainName}}", "bridgedAsset.wormhole.withdrawToNativeChain": "Mag-withdraw sa {{nativeChainName}}", "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XPL, ZEC — now available on Unichain.", "chart.candlestick": "Candlestick", "chart.error.pools": "Hindi maipakita ang dating data para sa kasalukuyang pool.", "chart.error.tokens": "Hindi maipakita ang dating data para sa kasalukuyang token.", @@ -257,6 +257,7 @@ "common.button.unlock": "I-unlock", "common.button.view": "Tingnan", "common.button.viewDetails": "Tingnan ang mga detalye", + "common.button.viewMore": "View more", "common.button.yes": "Oo", "common.buy.label": "Bumili", "common.buyAndSell": "Bumili at magbenta sa Uniswap", @@ -370,6 +371,7 @@ "common.input.noRecipient.error": "Pumili ng recipient", "common.input.password.confirm": "Kumpirmahin ang password", "common.input.password.error.mismatch": "Hindi tugma ang mga password", + "common.input.password.error.same": "New password must be different from current password", "common.input.password.error.weak": "Masyadong mahina ang password na ito", "common.input.password.new": "Bagong password", "common.input.password.placeholder": "Password", @@ -503,6 +505,7 @@ "common.remove.liquidity.canceled": "Nakansela ang pag-alis sa liquidity", "common.remove.liquidity.failed": "Hindi naalis ang liquidity", "common.removing.liquidity": "Inaalis ang liquidity", + "common.reported": "Reported", "common.resetLimit": "I-reset ang limit sa {{symbol}}", "common.resetLimitWallet": "I-reset ang limit sa {{symbol}} sa wallet", "common.resettingLimit": "Nire-reset ang limit sa {{symbol}}...", @@ -532,6 +535,7 @@ "common.status": "Status", "common.step.number": "Hakbang {{number}}", "common.step.number.of": "Hakbang {{current}} ng {{total}}", + "common.submit": "Submit", "common.swap": "Mag-swap", "common.swap.expired": "Nag-expire ang pag-swap", "common.swap.failed": "Hindi na-swap", @@ -797,6 +801,7 @@ "fee.tier.create": "Gumawa ng tier ng fee", "fee.tier.create.button": "Gumawa ng bagong tier ng fee", "fee.tier.create.description": "Sisimulan ang paggawa ng bagong tier sa isang bagong pool at magreresulta ito sa mga mas mataas kaysa sa karaniwang bayad sa network.", + "fee.tier.default": "-- fee tier", "fee.tier.description": "Ang halagang kinita sa pagbibigay ng liquidity. Pumili ng halagang naaakma sa iyong risk tolerance at diskarte.", "fee.tier.description.v2": "Ang halagang kinita sa pagbibigay ng liquidity. Ang lahat ng v2 pool ay may naka-fix na 0.3% fee. Para sa higit pang opsyon, magbigay ng liquidity sa v4.", "fee.tier.dynamic": "Dynamic na tier ng fee", @@ -884,9 +889,9 @@ "hero.swap.title": "Mag-swap anumang oras,
kahit saan.", "hidden.nfts.info.banner.text": "Matuto pa tungkol sa mga naka-hide na NFT", "hidden.nfts.info.text.button": "Mga naka-hide na NFT ({{numHidden}})", - "hidden.nfts.info.text.extension": "Ang mga ito ay mga potensyal na scam at NFT na na-hide mo. Puwede mong i-right click ang isang NFT para i-unhide ito.", "hidden.nfts.info.text.mobile": "Ang mga ito ay mga potensyal na scam at NFT na na-hide mo. Puwede mong pindutin nang matagal ang isang NFT para i-unhide ito.", "hidden.nfts.info.text.title": "Mga naka-hide na NFT", + "hidden.nfts.info.text.web": "These are potential scams and NFTs you’ve hidden. You can click on an NFT to unhide it.", "hidden.tokens.info.banner.text": "Matuto pa tungkol sa mga naka-hide na token", "hidden.tokens.info.text.button": "Mga naka-hide na token ({{numHidden}})", "hidden.tokens.info.text.info": "Ang mga ito ay mga potensyal na scam, maliit na balanse, at token na na-hide mo. Hindi kasama sa iyong kabuuang balanse sa wallet ang mga naka-hide na token.", @@ -957,32 +962,16 @@ "landing.uniswapX.subtitle": "Mas matatalinong pag-swap, nang walang problema.", "landing.walletBody": "Ang pinagkakatiwalaang self-custody na crypto wallet at extension na may milyon-milyong pag-download, suporta mula sa mga totoong tao, at isang 4.8 na rating.", "landing.walletSubtitle": "Mag-swap, mag-store, at mag-explore.", - "language.afrikaans": "Afrikaans", - "language.arabic": "Arabic", - "language.catalan": "Catalan", "language.chineseSimplified": "Chinese, Simplified", "language.chineseTraditional": "Chinese, Traditional", - "language.czech": "Czech", - "language.danish": "Danish", "language.dutch": "Dutch", "language.english": "English", - "language.finnish": "Finnish", "language.french": "French", - "language.greek": "Greek", - "language.hebrew": "Hebrew", - "language.hindi": "Hindi", - "language.hungarian": "Hungarian", "language.indonesian": "Indonesian", - "language.italian": "Italian", "language.japanese": "Japanese", "language.korean": "Korean", - "language.malay": "Malay", - "language.norwegian": "Norwegian", - "language.polish": "Polish", "language.portuguese": "Portuguese", - "language.romanian": "Romanian", "language.russian": "Russian", - "language.serbian": "Serbian", "language.spanishArgentina": "Spanish (Argentina)", "language.spanishBelize": "Spanish (Belize)", "language.spanishBolivia": "Spanish (Bolivia)", @@ -1006,11 +995,7 @@ "language.spanishUruguay": "Spanish (Uruguay)", "language.spanishUs": "Spanish (US)", "language.spanishVenezuela": "Spanish (Venezuela)", - "language.swahili": "Swahili", - "language.swedish": "Swedish", "language.turkish": "Turkish", - "language.ukrainian": "Ukrainian", - "language.urdu": "Urdu", "language.vietnamese": "Vietnamese", "large.price.difference": "Malaking pagkakaiba ng presyo", "large.price.difference.tooltip": "Magreresulta ang pagpapatuloy sa trade na ito sa pagkawala ng mga pondo. Ang pagkakaibang ito ay posibleng dahil sa malalaking trade o mababang liquidity.", @@ -1114,7 +1099,6 @@ "notification.smartWallet.disabled.all": "Naka-disable ang smart wallet", "notification.smartWallet.disabled.plural": "Naka-disable sa {{amount}} (na) network", "notification.spam.NFT.failed": "Hindi maiulat ang NFT. Subukan ulit sa ibang pagkakataon.", - "notification.spam.NFT.successful": "Iniulat", "notification.swap.network": "Nagsa-swap sa {{network}}", "notification.swap.pending.swap": "Nakabinbin ang swap", "notification.swap.pending.unwrap": "Nakabinbin ang pag-unwrap", @@ -1214,6 +1198,7 @@ "onboarding.home.intro.backup.description.mobile": "Mag-set up ng recovery plan sakaling mawala mo ang iyong telepono o kumuha ka ng bago.", "onboarding.home.intro.backup.title": "I-back up ang iyong wallet", "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK, at JUP — available na sa Unichain", + "onboarding.home.intro.bridgedAssets.description.v2": "DOGE, XRP, XPL, ZEC — now available on Unichain", "onboarding.home.intro.bridgedAssets.title": "Mag-trade ng mga bagong token sa Unichain", "onboarding.home.intro.fund.description": "Pondohan ang wallet mo sa pamamagitan ng pagbili ng crypto o pag-transfer mula sa ibang account.", "onboarding.home.intro.fund.title": "Kunin ang una mong token", @@ -1438,15 +1423,18 @@ "poolFinder.availablePools.notFound.description": "Walang nakitang v2 pool na tumutugma. I-double check ang iyong napiling token at tiyaking nakakonekta ka sa tamang wallet.", "pools.explore": "I-explore ang mga pool", "portfolio.activity.filters.timePeriod.all": "Lahat ng oras", - "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", + "portfolio.activity.filters.transactionType.addLiquidity": "Added liquidity", "portfolio.activity.filters.transactionType.all": "Lahat ng uri", "portfolio.activity.filters.transactionType.approvals": "Approvals", - "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", - "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.claimFees": "Claimed fees", + "portfolio.activity.filters.transactionType.createPool": "Pools created", "portfolio.activity.filters.transactionType.mints": "Mints", - "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", + "portfolio.activity.filters.transactionType.receives": "Receives", + "portfolio.activity.filters.transactionType.removeLiquidity": "Removed liquidity", + "portfolio.activity.filters.transactionType.sends": "Sends", "portfolio.activity.filters.transactionType.swaps": "Mga Swap", "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.search.placeholder": "Search activity", "portfolio.activity.table.column.address": "Address", "portfolio.activity.table.column.amount": "Amount", "portfolio.activity.table.column.time": "Time", @@ -1459,7 +1447,12 @@ "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", "portfolio.disconnected.demoWallet.title": "Demo wallet", "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", + "portfolio.nfts.search.placeholder": "Search your NFTs", "portfolio.nfts.title": "Mga NFT", + "portfolio.overview.stats.averageSwapSize": "Average swap size", + "portfolio.overview.stats.swappedThisWeek": "Swapped this week", + "portfolio.overview.stats.swapsThisWeek": "Swaps this week", + "portfolio.overview.stats.totalSwapVolume": "Total swap volume", "portfolio.overview.title": "Pangkalahatang-ideya", "portfolio.title": "Portfolio", "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", @@ -1471,6 +1464,7 @@ "portfolio.tokens.table.column.token": "Token", "portfolio.tokens.table.column.value": "Halaga", "portfolio.tokens.title": "Mga Token", + "portfolio.view": "View portfolio", "position.addHook": "Magdagdag ng Hook", "position.addHook.tooltip": "Ang Hooks ay isang advanced na feature na nagbibigay-daan sa mga pool na makipag-interact sa mga smart contract, na nag-a-unlock ng iba't ibang kakayahan. Mag-ingat kapag nagdaragdag ng mga hook, dahil posibleng mapaminsala o magdulot ng mga hindi sinasadyang kahihinatnan ang ilan sa mga ito.", "position.addingHook": "Pagdaragdag ng hook", @@ -1588,6 +1582,33 @@ "qrScanner.wallet.networks": "Mga sinusuportahang network", "range.outOfView": "Hindi makita ang range", "removeLiquidity.pooled": "Na-pool na {{symbol}}:", + "reporting.activity.unhide.action": "Unhide activity", + "reporting.pool.details.title": "Don’t recognize this position?", + "reporting.token.data.options.price.subtitle": "Token price is wrong or unavailable", + "reporting.token.data.options.price.title": "Price", + "reporting.token.data.options.priceChart.subtitle": "Data is wrong or incomplete", + "reporting.token.data.options.priceChart.title": "Price chart", + "reporting.token.data.options.tokenDetails.subtitle": "Token image, description, or link issue", + "reporting.token.data.options.tokenDetails.title": "Token details", + "reporting.token.data.options.volume.subtitle": "Token volume is wrong or unavailable", + "reporting.token.data.options.volume.title": "Volume", + "reporting.token.data.title": "Data issue", + "reporting.token.options.hiddenFees.subtitle": "Token has undisclosed fees when bought/sold", + "reporting.token.options.hiddenFees.title": "Hidden fees", + "reporting.token.options.imposter.subtitle": "Token seems fraudulent or misleading", + "reporting.token.options.imposter.title": "Imposter token", + "reporting.token.options.other.title": "Something else", + "reporting.token.options.spam.subtitle": "Token appeared in wallet unexpectedly", + "reporting.token.options.spam.title": "Spam token", + "reporting.token.report.button.disabled": "Select an issue", + "reporting.token.report.other.placeholder": "Describe the issue", + "reporting.token.report.title": "Report token", + "reporting.token.report.title.withSymbol": "Report {{symbol}}", + "reporting.token.warning.button": "This warning is incorrect", + "reporting.token.warning.report.placeholder": "Add details (optional)", + "reporting.token.warning.report.submit": "Report issue", + "reporting.token.warning.report.subtitle": "Report an issue if the warning below seems wrong. We’ll take a closer look.", + "reporting.token.warning.report.title": "Report an inaccurate warning", "revoke.failed.message": "Malamang na isang problema sa network o koneksyon ang dahilan kung bakit hindi nagawa ang iyong pagbawi. Tingnan ang iyong koneksyon at subukan ulit.", "routing.aggregateLiquidity": "Kapag available, pinagsasama-sama ang mga source ng liquidity para sa mas magagandang presyo at libreng pag-swap ng gas.", "routing.aggregateLiquidity.uniswapx": "Pinagsasama-sama ng UniswapX ang mga liquidity source sa loob at labas ng chain, na naghahatid sa iyo ng mga pinakamagandang available na presyo at mga pag-swap na libre sa gas.", @@ -1735,6 +1756,7 @@ "settings.setting.backup.status.inProgress": "Bina-back up sa {{cloudProviderName}}...", "settings.setting.backup.status.recoveryPhrase.backed": "Naka-back up", "settings.setting.backup.status.title": "Backup sa {{cloudProviderName}}", + "settings.setting.balancesActivity.title": "Balances and activity", "settings.setting.beta.tooltip": "Malapit na", "settings.setting.biometrics.appAccess.subtitle.android": "Mag-require ng mukha/fingerprint para buksan ang app.", "settings.setting.biometrics.appAccess.subtitle.ios": "Mag-require ng {{biometricsMethod}} para buksan ang app.", @@ -1786,7 +1808,8 @@ "settings.setting.privacy.analytics.title": "Analytics ng app", "settings.setting.privateKeys.title": "Mga pribadong key", "settings.setting.recoveryPhrase.title": "Recovery phrase", - "settings.setting.smallBalances.title": "Balanse sa portfolio", + "settings.setting.reportedActivity.subtitle": "Transactions you’ve reported as spam will be hidden from your activity feed.", + "settings.setting.reportedActivity.title": "Hide reported activity", "settings.setting.smartWallet.action.enable": "I-enable", "settings.setting.smartWallet.action.smartWallet": "Smart Wallet", "settings.setting.smartWallet.notEligible": "Hindi kwalipikado", @@ -2290,6 +2313,8 @@ "transaction.networkCost.label": "Bayad sa network", "transaction.networkCost.maxNativeBalance.description": "Inirereserba ang maliit na halaga ng balanse ng token sa network para sa bayad sa network ng transaksyong ito.", "transaction.networkCost.maxNativeBalance.title": "Bakit hindi ko magamit ang aking max na balanse?", + "transaction.networkCost.presetNativeBalance.description": "You don’t have enough balance to cover both this amount and the network cost of the transaction.", + "transaction.networkCost.presetNativeBalance.title": "Why can’t I use this amount?", "transaction.networkCost.veryHigh.label": "Napakataas na bayad sa network", "transaction.notification.error.cancel": "Hindi makansela ang transaksyon", "transaction.notification.error.replace": "Hindi mapalitan ang transaksyon", diff --git a/packages/uniswap/src/i18n/locales/translations/fr-FR.json b/packages/uniswap/src/i18n/locales/translations/fr-FR.json index 87a016d4648..3b8625baed3 100644 --- a/packages/uniswap/src/i18n/locales/translations/fr-FR.json +++ b/packages/uniswap/src/i18n/locales/translations/fr-FR.json @@ -30,7 +30,6 @@ "account.drawer.modal.body": "Stockez et échangez des tokens en toute sécurité avec l'app Uniswap. Disponible sur iOS et Android.", "account.drawer.modal.dont": "Vous n'avez pas de wallet Uniswap ?", "account.drawer.modal.scan": "Scanner avec Uniswap Wallet", - "account.drawer.spamToggle": "Masquer les tokens et les NFT inconnus", "account.passkey.delete.acknowledge": "J’ai sauvegardé ma phrase de récupération et je comprends qu’Uniswap Labs ne peut pas m’aider à récupérer mon wallet si je n’ai pas effectué cette sauvegarde.", "account.passkey.delete.description": "Assurez-vous d’avoir sauvegardé votre phrase de récupération à l’aide de l’application mobile ou de l’extension de navigateur Uniswap.", "account.passkey.delete.descriptionEmphasized": "Sans phrase de récupération, vos ne serez pas en mesure d’accéder à votre wallet.", @@ -115,6 +114,7 @@ "account.wallet.watch.placeholder": "ENS ou adresse", "account.wallet.watch.title": "Saisir une adresse de wallet", "activity.pending": "{{pendingActivityCount}} en attente", + "activity.recentActivity": "Recent activity", "activity.transaction.lpRewards.descriptor": "Récompenses en {{symbol}} collectées", "activity.transaction.send.descriptor": "{{amountWithSymbol}} à {{walletAddress}}", "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} pour {{amountWithSymbolB}}", @@ -144,15 +144,15 @@ "bridgedAsset.send.warning.description": "Vous envoyez une version enveloppée du {{currencySymbol}} sur {{chainName}}. L’envoi vers une plateforme d’échange centralisée entraînera la perte définitive des fonds.", "bridgedAsset.send.warning.title": "Assurez-vous d’envoyer les actifs vers une adresse compatible", "bridgedAsset.tdp.description": "Il s’agit d’une version transférée du {{currencySymbol}}, indexé à un ratio de 1:1 sur le {{currencySymbol}} natif.", - "bridgedAsset.wormhole.button": "Continuer vers Wormhole", - "bridgedAsset.wormhole.description": "Continuez vers le portail Wormhole pour transférer vos {{currencySymbol}} de {{chainName}} vers {{nativeChainName}}.", + "bridgedAsset.wormhole.button": "Continue to {{provider}}", + "bridgedAsset.wormhole.description": "Continue to the {{provider}} portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", "bridgedAsset.wormhole.title": "Retirer {{currencySymbol}} vers {{nativeChainName}}", "bridgedAsset.wormhole.toNativeChain": "vers {{nativeChainName}}", "bridgedAsset.wormhole.withdrawToNativeChain": "Retirer vers {{nativeChainName}}", "bridging.estimatedTime.minutesAndSeconds": "Env. {{minutes}} min {{seconds}} s", "bridging.estimatedTime.minutesOnly": "Env. {{minutes}} min", "bridging.estimatedTime.secondsOnly": "Env. {{seconds}} s", - "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XPL, ZEC — now available on Unichain.", "chart.candlestick": "Chandelier", "chart.error.pools": "Impossible d'afficher les données historiques du pool actuel.", "chart.error.tokens": "Impossible d'afficher les données historiques du token actuel.", @@ -257,6 +257,7 @@ "common.button.unlock": "Déverrouiller", "common.button.view": "Voir", "common.button.viewDetails": "Afficher les détails", + "common.button.viewMore": "View more", "common.button.yes": "Oui", "common.buy.label": "Acheter", "common.buyAndSell": "Acheter et vendre sur Uniswap", @@ -370,6 +371,7 @@ "common.input.noRecipient.error": "Sélectionner un destinataire", "common.input.password.confirm": "Confirmer le mot de passe", "common.input.password.error.mismatch": "Les mots de passe ne correspondent pas.", + "common.input.password.error.same": "New password must be different from current password", "common.input.password.error.weak": "Ce mot de passe est trop faible", "common.input.password.new": "Nouveau mot de passe", "common.input.password.placeholder": "Mot de passe", @@ -503,6 +505,7 @@ "common.remove.liquidity.canceled": "Retrait de liquidité annulé", "common.remove.liquidity.failed": "Échec de la suppression de liquidité", "common.removing.liquidity": "Suppression de liquidité en cours", + "common.reported": "Reported", "common.resetLimit": "Réinitialiser la limite en {{symbol}}", "common.resetLimitWallet": "Réinitialiser la limite en {{symbol}} dans le wallet", "common.resettingLimit": "Réinitialisation de la limite en {{symbol}} en cours…", @@ -532,6 +535,7 @@ "common.status": "Statut", "common.step.number": "Étape n° {{number}}", "common.step.number.of": "Étape {{current}} sur {{total}}", + "common.submit": "Submit", "common.swap": "Échanger", "common.swap.expired": "Échange expiré", "common.swap.failed": "Échec de l'échange", @@ -797,6 +801,7 @@ "fee.tier.create": "Créer un niveau de frais", "fee.tier.create.button": "Créer un nouveau niveau de frais", "fee.tier.create.description": "Tout nouveau niveau créé sera initialisé dans un nouveau pool et entraînera des coûts du réseau plus élevés que d'habitude.", + "fee.tier.default": "-- fee tier", "fee.tier.description": "Le montant gagné en fournissant de la liquidité. Choisissez un montant adapté à votre tolérance au risque et à votre stratégie.", "fee.tier.description.v2": "Le montant gagné en fournissant de la liquidité. Tous les pools v2 ont des frais fixes de 0,3 %. Approvisionnez la v4 en liquidité pour bénéficier de plus d’options.", "fee.tier.dynamic": "Niveau de frais dynamiques", @@ -884,9 +889,9 @@ "hero.swap.title": "Échangez à tout moment,
n'importe où.", "hidden.nfts.info.banner.text": "En savoir plus sur les NFT masqués", "hidden.nfts.info.text.button": "NFT masqués ({{numHidden}})", - "hidden.nfts.info.text.extension": "Il s'agit des escroqueries potentielles et des NFT que vous avez masqués. Faites un clic droit sur un NFT pour le rendre visible.", "hidden.nfts.info.text.mobile": "Il s'agit des escroqueries potentielles et des NFT que vous avez masqués. Appuyez longuement sur un NFT pour le rendre visible.", "hidden.nfts.info.text.title": "NFT masqués", + "hidden.nfts.info.text.web": "These are potential scams and NFTs you’ve hidden. You can click on an NFT to unhide it.", "hidden.tokens.info.banner.text": "En savoir plus sur les tokens masqués", "hidden.tokens.info.text.button": "Tokens masqués ({{numHidden}})", "hidden.tokens.info.text.info": "Il s'agit des escroqueries potentielles, des soldes faibles et des tokens que vous avez masqués. Les tokens masqués ne sont pas inclus dans le solde total de votre wallet.", @@ -957,32 +962,16 @@ "landing.uniswapX.subtitle": "Des échanges plus intelligents sans accroc.", "landing.walletBody": "Le wallet et l’extension crypto de garde autonome auxquels font confiance des millions d’utilisateurs, une équipe d’assistance entièrement humaine et une notation de 4,8 .", "landing.walletSubtitle": "Échangez, stockez et explorez.", - "language.afrikaans": "Afrikaans", - "language.arabic": "Arabe", - "language.catalan": "Catalan", "language.chineseSimplified": "Chinois simplifié", "language.chineseTraditional": "Chinois traditionnel", - "language.czech": "Tchèque", - "language.danish": "Danois", "language.dutch": "Néerlandais", "language.english": "Anglais", - "language.finnish": "Finlandais", "language.french": "Français", - "language.greek": "Grec", - "language.hebrew": "Hébreu", - "language.hindi": "Hindi", - "language.hungarian": "Hongrois", "language.indonesian": "Indonésien", - "language.italian": "Italien", "language.japanese": "Japonais", "language.korean": "Coréen", - "language.malay": "Malais", - "language.norwegian": "Norvégien", - "language.polish": "Polonais", "language.portuguese": "Portugais", - "language.romanian": "Roumain", "language.russian": "Russe", - "language.serbian": "Serbe", "language.spanishArgentina": "Espagnol (Argentine)", "language.spanishBelize": "Espagnol (Belize)", "language.spanishBolivia": "Espagnol (Bolivie)", @@ -1006,11 +995,7 @@ "language.spanishUruguay": "Espagnol (Uruguay)", "language.spanishUs": "Espagnol (États-Unis)", "language.spanishVenezuela": "Espagnol (Venezuela)", - "language.swahili": "Swahili", - "language.swedish": "Suédois", "language.turkish": "Turc", - "language.ukrainian": "Ukrainien", - "language.urdu": "Ourdou", "language.vietnamese": "Vietnamien", "large.price.difference": "Grande différence de prix", "large.price.difference.tooltip": "Si vous poursuivez l’exécution de cette transaction, vous pourriez perdre vos fonds. La différence peut être causée par des transactions volumineuses ou une faible liquidité.", @@ -1114,7 +1099,6 @@ "notification.smartWallet.disabled.all": "Wallet intelligent désactivé", "notification.smartWallet.disabled.plural": "Désactivé sur {{amount}} réseaux", "notification.spam.NFT.failed": "Impossible de signaler le NFT. Réessayez plus tard.", - "notification.spam.NFT.successful": "Signalé", "notification.swap.network": "Échange sur {{network}} en cours", "notification.swap.pending.swap": "Échange en attente", "notification.swap.pending.unwrap": "Annulation de l'enveloppement en attente", @@ -1214,6 +1198,7 @@ "onboarding.home.intro.backup.description.mobile": "Préparez une stratégie de récupération si vous perdez votre téléphone ou en changez.", "onboarding.home.intro.backup.title": "Sauvegarder votre wallet", "onboarding.home.intro.bridgedAssets.description": "Le SOL, le WIF, le BONK et le JUP arrivent sur Unichain", + "onboarding.home.intro.bridgedAssets.description.v2": "DOGE, XRP, XPL, ZEC — now available on Unichain", "onboarding.home.intro.bridgedAssets.title": "Tradez de nouveaux tokens sur Unichain", "onboarding.home.intro.fund.description": "Approvisionnez votre wallet en achetant des cryptos ou en les transférant depuis un autre compte.", "onboarding.home.intro.fund.title": "Obtenir votre premier token", @@ -1438,15 +1423,18 @@ "poolFinder.availablePools.notFound.description": "Aucun pool V2 ne correspond à votre sélection. Vérifiez le(s) token(s) sélectionné(s) et assurez-vous d’être connecté au bon wallet.", "pools.explore": "Découvrir les pools", "portfolio.activity.filters.timePeriod.all": "Toujours", - "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", + "portfolio.activity.filters.transactionType.addLiquidity": "Added liquidity", "portfolio.activity.filters.transactionType.all": "Tous les types", "portfolio.activity.filters.transactionType.approvals": "Approvals", - "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", - "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.claimFees": "Claimed fees", + "portfolio.activity.filters.transactionType.createPool": "Pools created", "portfolio.activity.filters.transactionType.mints": "Mints", - "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", + "portfolio.activity.filters.transactionType.receives": "Receives", + "portfolio.activity.filters.transactionType.removeLiquidity": "Removed liquidity", + "portfolio.activity.filters.transactionType.sends": "Sends", "portfolio.activity.filters.transactionType.swaps": "Échanges", "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.search.placeholder": "Search activity", "portfolio.activity.table.column.address": "Address", "portfolio.activity.table.column.amount": "Amount", "portfolio.activity.table.column.time": "Time", @@ -1459,7 +1447,12 @@ "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", "portfolio.disconnected.demoWallet.title": "Demo wallet", "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", + "portfolio.nfts.search.placeholder": "Search your NFTs", "portfolio.nfts.title": "NFT", + "portfolio.overview.stats.averageSwapSize": "Average swap size", + "portfolio.overview.stats.swappedThisWeek": "Swapped this week", + "portfolio.overview.stats.swapsThisWeek": "Swaps this week", + "portfolio.overview.stats.totalSwapVolume": "Total swap volume", "portfolio.overview.title": "Aperçu", "portfolio.title": "Portefeuille", "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", @@ -1471,6 +1464,7 @@ "portfolio.tokens.table.column.token": "Token", "portfolio.tokens.table.column.value": "Valeur", "portfolio.tokens.title": "Jetons", + "portfolio.view": "View portfolio", "position.addHook": "Ajouter un hook", "position.addHook.tooltip": "Les hooks sont une fonctionnalité avancée qui permet aux pools d'interagir avec des contrats intelligents, débloquant ainsi diverses capacités. Soyez prudent lorsque vous ajoutez des hooks, car certains peuvent être malveillants ou avoir des effets imprévus.", "position.addingHook": "Ajout du hook en cours", @@ -1588,6 +1582,33 @@ "qrScanner.wallet.networks": "Réseaux pris en charge", "range.outOfView": "Canal hors de l’affichage", "removeLiquidity.pooled": "{{symbol}} regroupé :", + "reporting.activity.unhide.action": "Unhide activity", + "reporting.pool.details.title": "Don’t recognize this position?", + "reporting.token.data.options.price.subtitle": "Token price is wrong or unavailable", + "reporting.token.data.options.price.title": "Price", + "reporting.token.data.options.priceChart.subtitle": "Data is wrong or incomplete", + "reporting.token.data.options.priceChart.title": "Price chart", + "reporting.token.data.options.tokenDetails.subtitle": "Token image, description, or link issue", + "reporting.token.data.options.tokenDetails.title": "Token details", + "reporting.token.data.options.volume.subtitle": "Token volume is wrong or unavailable", + "reporting.token.data.options.volume.title": "Volume", + "reporting.token.data.title": "Data issue", + "reporting.token.options.hiddenFees.subtitle": "Token has undisclosed fees when bought/sold", + "reporting.token.options.hiddenFees.title": "Hidden fees", + "reporting.token.options.imposter.subtitle": "Token seems fraudulent or misleading", + "reporting.token.options.imposter.title": "Imposter token", + "reporting.token.options.other.title": "Something else", + "reporting.token.options.spam.subtitle": "Token appeared in wallet unexpectedly", + "reporting.token.options.spam.title": "Spam token", + "reporting.token.report.button.disabled": "Select an issue", + "reporting.token.report.other.placeholder": "Describe the issue", + "reporting.token.report.title": "Report token", + "reporting.token.report.title.withSymbol": "Report {{symbol}}", + "reporting.token.warning.button": "This warning is incorrect", + "reporting.token.warning.report.placeholder": "Add details (optional)", + "reporting.token.warning.report.submit": "Report issue", + "reporting.token.warning.report.subtitle": "Report an issue if the warning below seems wrong. We’ll take a closer look.", + "reporting.token.warning.report.title": "Report an inaccurate warning", "revoke.failed.message": "Un problème de réseau ou de connexion a probablement causé l’échec de votre révocation. Vérifiez votre connexion et réessayez.", "routing.aggregateLiquidity": "Le cas échéant, regroupe les sources de liquidité pour obtenir de meilleurs prix et effectuer des échanges sans gaz.", "routing.aggregateLiquidity.uniswapx": "UniswapX regroupe des sources de liquidité sur et hors de la blockchain pour vous offrir les meilleurs cours disponibles et vous aider à profiter d’échanges sans frais de gaz.", @@ -1735,6 +1756,7 @@ "settings.setting.backup.status.inProgress": "Sauvegarde dans {{cloudProviderName}} en cours…", "settings.setting.backup.status.recoveryPhrase.backed": "Sauvegardé", "settings.setting.backup.status.title": "Sauvegarde dans {{cloudProviderName}}", + "settings.setting.balancesActivity.title": "Balances and activity", "settings.setting.beta.tooltip": "À venir", "settings.setting.biometrics.appAccess.subtitle.android": "Demander l’identification par visage/empreinte digitale pour ouvrir l’app.", "settings.setting.biometrics.appAccess.subtitle.ios": "Demander l’identification par {{biometricsMethod}} pour ouvrir l’app.", @@ -1786,7 +1808,8 @@ "settings.setting.privacy.analytics.title": "Analyses de l’app", "settings.setting.privateKeys.title": "Clés privées", "settings.setting.recoveryPhrase.title": "Phrase de récupération", - "settings.setting.smallBalances.title": "Solde du portefeuille", + "settings.setting.reportedActivity.subtitle": "Transactions you’ve reported as spam will be hidden from your activity feed.", + "settings.setting.reportedActivity.title": "Hide reported activity", "settings.setting.smartWallet.action.enable": "Activer", "settings.setting.smartWallet.action.smartWallet": "Wallet intelligent", "settings.setting.smartWallet.notEligible": "Non éligible", @@ -2007,7 +2030,7 @@ "swap.settings.routingPreference.option.v4.title": "Activer les pools v4", "swap.settings.routingPreference.title": "Options de trading", "swap.settings.slippage.alert": "Effet de glissement important", - "swap.settings.slippage.control.auto": "Automatique", + "swap.settings.slippage.control.auto": "Auto", "swap.settings.slippage.description": "Votre transaction sera annulée si le prix change plus que le pourcentage de l'effet de glissement.", "swap.settings.slippage.input.message": "Si le prix glisse encore, votre transaction sera annulée. Vous trouverez ci-dessous le montant minimal que vous êtes assuré de recevoir.", "swap.settings.slippage.input.receive.title": "Recevoir au moins", @@ -2290,6 +2313,8 @@ "transaction.networkCost.label": "Coût du réseau", "transaction.networkCost.maxNativeBalance.description": "Une petite partie du solde de tokens du réseau est réservée à la couverture des coûts de réseau de cette transaction.", "transaction.networkCost.maxNativeBalance.title": "Pourquoi ne puis-je pas utiliser mon solde max. ?", + "transaction.networkCost.presetNativeBalance.description": "You don’t have enough balance to cover both this amount and the network cost of the transaction.", + "transaction.networkCost.presetNativeBalance.title": "Why can’t I use this amount?", "transaction.networkCost.veryHigh.label": "Coûts de réseau très élevés", "transaction.notification.error.cancel": "Impossible d'annuler la transaction", "transaction.notification.error.replace": "Impossible de remplacer la transaction", diff --git a/packages/uniswap/src/i18n/locales/translations/he-IL.json b/packages/uniswap/src/i18n/locales/translations/he-IL.json deleted file mode 100644 index ece09b33c76..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/he-IL.json +++ /dev/null @@ -1,2563 +0,0 @@ -{ - "account.authHeader.claimReward": "תבע פרס {{amount}}", - "account.cloud.backup.subtitle": "ישנם ביטויי שחזור מרובים המגובים ל- {{cloudProviderName}}שלך.", - "account.cloud.backup.title": "בחר גיבוי לשחזור", - "account.cloud.button.restore.android": "שחזר מ-Google Drive", - "account.cloud.button.restore.ios": "שחזר מ-iCloud", - "account.cloud.empty.description": "נראה שלא גיבית אף אחד מביטויי השחזור שלך ל- {{cloudProviderName}}.", - "account.cloud.empty.title": "נמצאו 0 גיבויים", - "account.cloud.error.backup.message": "ייבוא גיבויים נכשל עקב חוסר הרשאות, הפרעה בהרשאה או עקב שגיאת ענן", - "account.cloud.error.backup.title": "שגיאה בעת ייבוא גיבויים", - "account.cloud.error.password.title": "סיסמה שגויה. בבקשה נסה שוב.", - "account.cloud.error.unavailable.button.cancel": "לא עכשיו", - "account.cloud.error.unavailable.button.settings": "לך להגדרות", - "account.cloud.error.unavailable.message.android": "אנא ודא שאתה מחובר לחשבון Google עם Google Drive מופעל במכשיר זה ונסה שוב.", - "account.cloud.error.unavailable.message.ios": "אנא ודא שאתה מחובר ל-Apple ID עם iCloud Drive מופעל במכשיר זה ונסה שוב.", - "account.cloud.error.unavailable.title.android": "Google Drive לא זמין", - "account.cloud.error.unavailable.title.ios": "כונן iCloud אינו זמין", - "account.cloud.loading.title": "מחפש גיבויים...", - "account.cloud.lockout.time.hours_one": "יותר מדי ניסיונות. נסה שוב בעוד שעה.", - "account.cloud.lockout.time.hours_other": "יותר מדי ניסיונות. נסה שוב בעוד {{count}} שעות.", - "account.cloud.lockout.time.minutes_one": "יותר מדי ניסיונות. נסה שוב בעוד דקה.", - "account.cloud.lockout.time.minutes_other": "יותר מדי ניסיונות. נסה שוב בעוד {{count}} דקות.", - "account.cloud.password.input": "הזן את הסיסמה", - "account.cloud.password.recoveryPhrase": "הזן את ביטוי השחזור שלך במקום זאת", - "account.cloud.password.subtitle": "סיסמה זו נדרשת כדי לשחזר את גיבוי ביטוי השחזור שלך מ- {{cloudProviderName}}.", - "account.cloud.password.title": "הזן סיסמת גיבוי", - "account.downloadWallet.subtitle": "גבה את הארנק שלך, סחור בדרכים, קבל התראות מחירים בזמן אמת ועוד.", - "account.drawer.gitHash": "גיט הַשֶׁפָּט: ", - "account.drawer.gitVersion": "גִרְסָה: ", - "account.drawer.modal.body": "אחסן והחלף בבטחה אסימונים עם אפליקציית Uniswap. זמין ב-iOS וב-Android.", - "account.drawer.modal.dont": "אין לך ארנק Uniswap?", - "account.drawer.modal.scan": "סרוק עם ארנק Uniswap", - "account.drawer.spamToggle": "הסתר אסימונים ו-NFT לא ידועים", - "account.passkey.delete.acknowledge": "גיביתי את משפט השחזור שלי ואני מבין ש-Uniswap Labs לא יכולה לעזור לי לשחזר את הארנק שלי אם לא הצלחתי לעשות זאת.", - "account.passkey.delete.description": "ודא שגיבית את ביטוי השחזור שלך באמצעות אפליקציית Uniswap לנייד או תוסף הדפדפן.", - "account.passkey.delete.descriptionEmphasized": "ללא ביטוי השחזור שלך, ייתכן שלא תוכל לגשת לארנק שלך.", - "account.passkey.delete.speedbump.description": "לפני שתמשיך, השלם את השלבים הבאים כדי למנוע אובדן גישה לארנק שלך ולכל הכספים.", - "account.passkey.delete.speedbump.step1": "הורד את האפליקציה לנייד או תוסף הדפדפן של Uniswap", - "account.passkey.delete.speedbump.step2": "גבה את ביטוי השחזור שלך", - "account.passkey.delete.speedbump.title": "האם אתה בטוח?", - "account.passkey.delete.title": "למחוק את המפתח?", - "account.passkey.log.in.title": "התחברות עם סיסמה", - "account.passkey.type.crossplatform": "טלפון, טאבלט או מפתח אבטחה", - "account.passkey.type.platform": "דפדפן או מערכת הפעלה", - "account.passkey.verify.button": "אימות באמצעות סיסמה", - "account.passkey.verify.description": "לפני שתמשיך, אנא השתמש בסיסמה שלך כדי לאמת את זהותך. זה עוזר לשמור על אבטחת החשבון שלך.", - "account.passkey.verify.title": "ראשית, בוא נוודא שזה אתה", - "account.portfolio.activity.canceledBelow": "הזמנה זו בוטלה מכיוון שהיתרה שלך ירדה מתחת לסכום הקלט.", - "account.portfolio.activity.signLimit": "הזמנה זו לא תתמלא מכיוון שהיתרה שלך ירדה מתחת לסכום הקלט. הגדל את היתרה שלך כדי לתקן.", - "account.recoveryPhrase.education.part1": "ביטוי התאוששות (או ביטוי ראשוני) הוא קבוצת מילים הנדרשת כדי לגשת לארנק שלך, כמו סיסמה.", - "account.recoveryPhrase.education.part2": "אתה יכול להזין את משפט השחזור שלך במכשיר חדש כדי לשחזר את הארנק ואת תוכנו.", - "account.recoveryPhrase.education.part3": "אבל, אם תאבד את ביטוי השחזור שלך, תאבד גישה לארנק שלך.", - "account.recoveryPhrase.education.part4": "במקום לשנן את משפט השחזור שלך, אתה יכול לגבות אותו ל- {{cloudProviderName}} ולהגן עליו באמצעות סיסמה.", - "account.recoveryPhrase.education.part5": "אתה יכול גם לגבות באופן ידני את ביטוי השחזור שלך על ידי כתיבתו ואחסונו במקום בטוח.", - "account.recoveryPhrase.education.part6": "אנו ממליצים להשתמש ב בשני סוגי הגיבויים, מכיוון שאם תאבד את ביטוי השחזור שלך, לא תוכל לשחזר את הארנק שלך.", - "account.recoveryPhrase.error.invalid": "ביטוי לא חוקי", - "account.recoveryPhrase.error.invalidWord": "מילה לא חוקית: {{word}}", - "account.recoveryPhrase.error.phraseLength": "ביטוי שחזור חייב להיות 12-24 מילים", - "account.recoveryPhrase.error.wordIsAddress": "הזנת כתובת, לא ביטוי שחזור", - "account.recoveryPhrase.error.wrong": "ביטוי שגוי שגוי", - "account.recoveryPhrase.helpText.import": "איך אני מוצא את ביטוי ההחלמה שלי?", - "account.recoveryPhrase.helpText.restoring": "נסה לחפש שוב", - "account.recoveryPhrase.input": "הקלד את משפט השחזור שלך", - "account.recoveryPhrase.remove.final.description": "ודא שרשמת את ביטוי השחזור שלך או גיבית אותו ב- {{cloudProviderName}}. לא תוכל לגשת לכספים שלך אחרת.", - "account.recoveryPhrase.remove.final.title": "אתה מסיר את ביטוי השחזור שלך", - "account.recoveryPhrase.remove.import.description": "אתה יכול לאחסן רק ביטוי שחזור אחד בכל פעם. כדי להמשיך לייבא חדש, תצטרך להסיר את ביטוי השחזור הנוכחי שלך ואת כל הארנקים המשויכים מהמכשיר הזה.", - "account.recoveryPhrase.remove.initial.description": "פעולה זו תסיר את הארנק שלך מהמכשיר הזה יחד עם ביטוי השחזור שלך.", - "account.recoveryPhrase.remove.initial.title": "אתה מסיר את {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "ביטוי השחזור שלך יישאר מאוחסן עד שתמחק את כל הארנקים שנותרו.", - "account.recoveryPhrase.subtitle.import": "ביטוי השחזור שלך יאוחסן רק באופן מקומי במכשיר שלך.", - "account.recoveryPhrase.subtitle.restoring": "הזן את ביטוי השחזור שלך למטה, או נסה לחפש שוב גיבויים.", - "account.recoveryPhrase.title.import": "הזן את ביטוי השחזור שלך", - "account.recoveryPhrase.title.restoring": "לא נמצאו גיבויים", - "account.wallet.action.copy": "העתק כתובת", - "account.wallet.action.manageConnections": "נהל חיבורים", - "account.wallet.action.report": "דווח על פרופיל", - "account.wallet.action.viewExplorer": "הצג ב- {{blockExplorerName}}", - "account.wallet.button.add": "הוסף ארנק", - "account.wallet.button.addViewOnly": "הוסף ארנק לצפייה בלבד", - "account.wallet.button.create": "צור ארנק חדש", - "account.wallet.button.import": "ייבא ארנק חדש", - "account.wallet.button.manage": "הגדרות ארנק", - "account.wallet.button.remove": "הסר את הארנק", - "account.wallet.button.watch": "צפו בארנק", - "account.wallet.create.placeholder": "ארנק {{index}}", - "account.wallet.edit.label.input.placeholder": "תווית ארנק", - "account.wallet.header.button.disabled.title": "ערוך פרופיל", - "account.wallet.header.button.title": "ערוך תווית", - "account.wallet.header.viewOnly": "ארנקים לצפייה בלבד", - "account.wallet.menu.claimUsername": "תבע את שם המשתמש", - "account.wallet.menu.copy.title": "העתק את כתובת הארנק", - "account.wallet.menu.edit.title": "ערוך תווית", - "account.wallet.menu.manageConnections": "נהל חיבורים", - "account.wallet.menu.remove.title": "הסר את הארנק", - "account.wallet.remove.check": "גיביתי את משפט השחזור שלי והבנתי ש-Uniswap Labs לא יכולה לעזור לי לשחזר את הארנקים שלי אם לא הצלחתי לעשות זאת.", - "account.wallet.remove.title": "הסר {{name}}", - "account.wallet.remove.viewOnly": "אתה תמיד יכול להוסיף ארנקים לצפייה אחורית על ידי הזנת כתובת הארנק.", - "account.wallet.restore.new_device.description": "מכיוון שאתה משתמש במכשיר חדש, תצטרך לשחזר את משפט השחזור שלך או להזין את סיסמת גיבוי הענן שלך כדי להמשיך.", - "account.wallet.restore.new_device.title": "שחזור הארנק שלך", - "account.wallet.restore.seed_phrase.description": "משפט השחזור שלך חסר במכשיר שלך. כדי להבטיח שלעולם לא תאבד גישה לכספים שלך, נצטרך שתשחזר את הארנק שלך.", - "account.wallet.restore.seed_phrase.title": "שחזור הארנק שלך", - "account.wallet.select.error": "לא ניתן לטעון כתובות", - "account.wallet.select.loading.subtitle": "הארנקים שלך יופיעו למטה.", - "account.wallet.select.loading.title": "מחפש ארנקים", - "account.wallet.select.smartWalletDisclaimer": "כברירת מחדל, כל הארנקים הזכאים ישתמשו בתכונות של ארנק חכם לאחר ייבואם. מהו ארנק חכם?", - "account.wallet.select.title_one_one": "נמצא ארנק אחד", - "account.wallet.select.title_one_other": "בחר ארנקים לייבוא", - "account.wallet.viewOnly.button": "ייבוא ארנק", - "account.wallet.viewOnly.description": "כדי להחליף, לקנות, לשלוח ולקבל אסימונים, עליך לייבא את ביטוי השחזור של הארנק הזה.", - "account.wallet.viewOnly.title": "הארנק הזה הוא לצפייה בלבד", - "account.wallet.watch.error.alreadyImported": "כתובת זו כבר מיובאת", - "account.wallet.watch.error.notFound": "כתובת לא נמצאה", - "account.wallet.watch.error.smartContract": "כתובת היא חוזה חכם", - "account.wallet.watch.message": "הוספת ארנק לצפייה בלבד מאפשרת לך לנסות את האפליקציה או לעקוב אחר ארנק. לא תוכל להחליף או לשלוח כספים.", - "account.wallet.watch.placeholder": "ENS או כתובת", - "account.wallet.watch.title": "הזן כתובת לארנק", - "activity.pending": "{{pendingActivityCount}} בהמתנה", - "activity.transaction.lpRewards.descriptor": "{{symbol}} פרסים שנאספו", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} עד {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} עבור {{amountWithSymbolB}}", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} ו {{amountWithSymbolB}}", - "addLiquidity.shareOfPool": "חלק מהבריכה", - "addressInput.recipient": "מקבל", - "analytics.allow": "אפשר ניתוח", - "analytics.allow.message": "אנו משתמשים בנתונים אנונימיים כדי לשפר את החוויה שלך עם מוצרי Uniswap Labs.", - "appRating.button.notReally": "לא באמת", - "appRating.description": "ספר לנו אם יש לך ניסיון טוב עם האפליקציה הזו", - "appRating.extension.review.description": "בחר דירוג כוכבים והשאיר ביקורת בחנות האינטרנט של Chrome.", - "appRating.extension.review.title": "לסקור את הרחבת Uniswap?", - "appRating.extension.title": "נהנה מהרחבת Uniswap?", - "appRating.feedback.button.send": "שלח משוב", - "appRating.feedback.description": "ספר לנו כיצד נוכל לשפר את החוויה שלך", - "appRating.feedback.title": "אנחנו מצטערים לשמוע את זה.", - "appRating.mobile.title": "נהנה מ-Uniswap Wallet?", - "bridgedAsset.modal.button": "המשך להחליף", - "bridgedAsset.modal.description": "זוהי גרסה {{chainName}} של {{currencySymbol}} שמגובה ושומרת על אותו מחיר כמו {{currencySymbol}}המקורי.", - "bridgedAsset.modal.feature.securelyBacked": "מגובה בצורה מאובטחת", - "bridgedAsset.modal.feature.securelyBacked.description": "1:1 מגובה על ידי {{currencySymbol}}מקורי.", - "bridgedAsset.modal.feature.tradeSeamlessly": "סחר בצורה חלקה", - "bridgedAsset.modal.feature.tradeSeamlessly.description": "קנייה ומכירה {{currencySymbol}} בלי לצאת מ-Uniswap.", - "bridgedAsset.modal.feature.withdrawToNativeChain": "משיכה ל- {{nativeChainName}}", - "bridgedAsset.modal.feature.withdrawToNativeChain.description": "התחבר חזרה לרשת המקורית בכל עת.", - "bridgedAsset.modal.title": "סחר {{currencySymbol}} ב- {{chainName}}", - "bridgedAsset.send.warning.description": "אתה שולח גרסה עטופה של {{currencySymbol}} ב- {{chainName}}. שליחתה לבורסה מרכזית תגרום לאובדן כספים קבוע.", - "bridgedAsset.send.warning.title": "ודא שאתה שולח לכתובת תואמת", - "bridgedAsset.tdp.description": "זוהי גרסה מגושרת של {{currencySymbol}} המגובה ביחס של 1:1 על ידי {{currencySymbol}}המקורי.", - "bridgedAsset.wormhole.button": "המשך לחור תולעת", - "bridgedAsset.wormhole.description": "המשך לפורטל חור התולעת כדי לגשר על {{currencySymbol}} שלך מ- {{chainName}} ל- {{nativeChainName}}.", - "bridgedAsset.wormhole.title": "משיכה {{currencySymbol}} עד {{nativeChainName}}", - "bridgedAsset.wormhole.toNativeChain": "ל {{nativeChainName}}", - "bridgedAsset.wormhole.withdrawToNativeChain": "משיכה ל- {{nativeChainName}}", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}דקות {{seconds}}שניות", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}דקות", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "chart.candlestick": "פָּמוֹט", - "chart.error.pools": "לא ניתן להציג נתונים היסטוריים עבור המאגר הנוכחי.", - "chart.error.tokens": "לא ניתן להציג נתונים היסטוריים עבור האסימון הנוכחי.", - "chart.line": "תרשים קווים", - "chart.missingData": "חסרים נתוני תרשים", - "chart.price.label.close": "סגור", - "chart.price.label.high": "גָבוֹהַ", - "chart.price.label.low": "נָמוּך", - "chart.price.label.open": "לִפְתוֹחַ", - "chart.settings.unavailable.label": "הגדרה זו אינה זמינה עבור התרשים הנוכחי", - "claim.thanks": "תודה שהיית חלק מקהילת Uniswap ", - "claim.uni.arrived": "UNI הגיע", - "common.about": "על אודות", - "common.accept": "לְקַבֵּל", - "common.active": "פָּעִיל", - "common.activeNetworks": "רשתות פעילות", - "common.activity": "פעילות", - "common.add.label": "לְהוֹסִיף", - "common.add.liquidity.canceled": "הוספת נזילות בוטלה", - "common.addLiquidity": "הוסף נזילות", - "common.address": "כְּתוֹבֶת", - "common.addressOrENS": "כתובת ארנק או שם ENS", - "common.advanced": "מִתקַדֵם", - "common.all": "כֹּל", - "common.allTime": "כל הזמן", - "common.and": "ו", - "common.app": "אפליקציה", - "common.approved": "אושר", - "common.approvePending": "מחכה לאישור...", - "common.approvePermitTx": "אשר בקשה {{indexText}}", - "common.approvePermitTx.active": "אשר את הבקשה{{indexText}} בארנק", - "common.approvePermitTx.explainer": "מהם אישורי Permit2?", - "common.approvePermitTx.pending": "מאשר את הבקשה {{indexText}}...", - "common.approveSpend": "אשר הוצאה של {{symbol}}", - "common.approving": "מאשר", - "common.approximatelyValue": "~{{value}}", - "common.areYouSure": "האם אתה בטוח?", - "common.automatic": "אוטומטי", - "common.availableIn": "החלפה חד פעמית זמינה ב: ", - "common.availableOnIOSAndroidChrome": "זמין ב-iOS, אנדרואיד וכרום", - "common.backToPositions": "חזרה לתפקידים", - "common.bestRoute": "מַסלוּל", - "common.bestRoute.with": "מסלול דרך {{provider}}", - "common.biometrics.generic": "ביומטריה", - "common.biometrics.touchId": "מזהה מגע", - "common.biometrics.windowsHello": "Windows Hello", - "common.blocked.ifError": "אם אתה סבור שזו שגיאה, אנא שלח דוא\"ל כולל כתובתך אל ", - "common.blocked.reason": "כתובת זו חסומה בממשק Uniswap Labs מכיוון שהיא משויכת לפעילות אחת או יותר של אחת או יותר.", - "common.blockedAddress": "כתובת חסומה", - "common.blog": "בלוג", - "common.bought": "קנה", - "common.brandAssets": "נכסי מותג", - "common.button.accept": "לְקַבֵּל", - "common.button.back": "חזור", - "common.button.buy": "לִקְנוֹת", - "common.button.cancel": "לְבַטֵל", - "common.button.checkin": "קבלה", - "common.button.close": "סגור", - "common.button.confirm": "לְאַשֵׁר", - "common.button.connect": "לְחַבֵּר", - "common.button.continue": "לְהַמשִׁיך", - "common.button.copied": "מוּעֲתָק", - "common.button.copy": "עותק", - "common.button.create": "לִיצוֹר", - "common.button.delete": "לִמְחוֹק", - "common.button.disable": "השבת", - "common.button.disabling": "השבתה", - "common.button.disconnect": "לְנַתֵק", - "common.button.dismiss": "לשחרר", - "common.button.done": "בוצע", - "common.button.edit": "לַעֲרוֹך", - "common.button.enable": "לְאַפשֵׁר", - "common.button.finish": "סִיוּם", - "common.button.goBack": "תחזור", - "common.button.later": "אולי אחר כך", - "common.button.learn": "למד עוד", - "common.button.next": "הַבָּא", - "common.button.notNow": "לא עכשיו", - "common.button.ok": "בסדר", - "common.button.paste": "לְהַדבִּיק", - "common.button.pay": "לְשַׁלֵם", - "common.button.proceed": "להמשיך", - "common.button.receive": "לְקַבֵּל", - "common.button.remove": "לְהַסִיר", - "common.button.reset": "אִתחוּל", - "common.button.retry": "נסה שוב", - "common.button.reveal": "לְגַלוֹת", - "common.button.review": "סקירה", - "common.button.save": "להציל", - "common.button.scrollDown": "גלול מטה", - "common.button.sell": "מכירה", - "common.button.send": "לִשְׁלוֹחַ", - "common.button.setup": "להכין", - "common.button.share": "לַחֲלוֹק", - "common.button.showLess": "הראי פחות", - "common.button.showMore": "להראות יותר", - "common.button.sign": "סִימָן", - "common.button.skip": "לדלג", - "common.button.swap": "לְהַחלִיף", - "common.button.tryAgain": "נסה שוב", - "common.button.understand": "אני מבין", - "common.button.unlock": "לבטל נעילה", - "common.button.view": "נוף", - "common.button.viewDetails": "הצג פרטים", - "common.button.yes": "כן", - "common.buy.label": "לִקְנוֹת", - "common.buyAndSell": "קנה ומכיר ב-Uniswap", - "common.cancellationSubmitted": "הביטול נשלח", - "common.cancellationSuccessful": "הביטול הצליח", - "common.cancelOrder": "בטל הזמנה", - "common.card.error.description": "משהו השתבש", - "common.card.error.title": "אופס! משהו השתבש.", - "common.careers": "קריירה", - "common.chain.networkCost": "עלות רשת {{chain}}", - "common.chart": "תַרשִׁים", - "common.checkNetwork": "בדוק את מצב הרשת כאן.", - "common.chromeExtension": "סיומת", - "common.claim.failed": "התביעה נכשלה", - "common.claimed": "נִתבָּע", - "common.claiming": "בטענה", - "common.claimUnis": "תבע את אסימוני ה-UNI שלך", - "common.clear": "בָּרוּר", - "common.close": "סגור", - "common.closed": "סָגוּר", - "common.collect.button": "לאסוף", - "common.company": "חֶברָה", - "common.confirm": "לְאַשֵׁר", - "common.confirmCancellation": "אשר את הביטול", - "common.confirmed": "מְאוּשָׁר", - "common.confirmSend.button": "אשר את השליחה", - "common.confirmSwap": "אשר את ההחלפה בארנק", - "common.confirmTimedOut": "תם הזמן הקצוב לאישור. נא לנסות שוב.", - "common.confirmTransfer": "אישור העברה", - "common.confirmWallet": "אשר בארנק", - "common.connect.button": "לְחַבֵּר", - "common.connectAWallet.button": "חבר ארנק", - "common.connectAWallet.button.evm": "חיבור ארנק את'ריום", - "common.connectAWallet.button.evm.switch": "החלפת ארנק את'ריום", - "common.connectAWallet.button.svm": "חבר את ארנק סולאנה", - "common.connectAWallet.button.svm.switch": "החלפת ארנק סולאנה", - "common.connectAWallet.button.switch": "החלפת ארנק", - "common.connectTo": "התחבר אל {{platform}}", - "common.connectWallet.button": "חבר ארנק", - "common.contactUs.button": "צור קשר", - "common.copied": "מוּעֲתָק", - "common.copy.address": "העתק כתובת", - "common.copy.poolId": "העתקת מזהה מאגר", - "common.copyLink.button": "העתק קישור", - "common.created.date": "נוצר {{date}}", - "common.currency": "מַטְבֵּעַ", - "common.currentPrice": "מחיר נוכחי", - "common.custom": "המותאם אישית", - "common.customRange": "טווח מותאם אישית", - "common.dataOutdated": "הנתונים עשויים להיות מיושנים", - "common.day": "יְוֹם", - "common.default": "בְּרִירַת מֶחדָל", - "common.defaultTradeOptions": "ברירת מחדל לאפשרויות סחר", - "common.deposit.toNetwork": "הפקד אסימונים לרשת {{label}} .", - "common.depositing": "הפקדה", - "common.depositTokens": "אסימוני הפקדה", - "common.detected": "זוהה", - "common.developers": "מפתחים", - "common.device": "המכשיר הזה", - "common.device.other": "מכשיר אחר", - "common.dismiss": "לשחרר", - "common.docs": "מסמכים", - "common.donate": "לִתְרוֹם", - "common.done": "בוצע", - "common.dontShowAgain": "אל תראה את זה שוב", - "common.download": "הורד", - "common.downloadAppStore": "הורד ב-App Store", - "common.downloadPlayStore": "הורד בחנות Play", - "common.downloadUniswapApp": "הורד את אפליקציית Uniswap", - "common.downloadUniswapWallet": "הורד את ארנק Uniswap", - "common.dynamic": "דִינָמִי", - "common.edit.button": "לַעֲרוֹך", - "common.ended": "הסתיים", - "common.error.details": "פרטי שגיאה", - "common.error.general": "משהו השתבש", - "common.error.label": "שְׁגִיאָה", - "common.error.request": "מצטערים, אירעה שגיאה במהלך עיבוד הבקשה שלך. אם אתה מבקש תמיכה, הקפד להעתיק את הפרטים של שגיאה זו.", - "common.error.somethingWrong": "משהו השתבש!", - "common.errorConnecting.error": "בעיית חיבור", - "common.errorLoadingData.error": "שגיאה בטעינת נתונים", - "common.etherscan": "Etherscan", - "common.expiry": "תְפוּגָה", - "common.explore": "לַחקוֹר", - "common.explorer": "מגלה ארצות", - "common.exploreTokens": "חקור אסימונים", - "common.extension": "הרחבת Uniswap", - "common.failedSwitchNetwork": "החלפת רשת נכשלה", - "common.fee": "תַשְׁלוּם", - "common.fees": "עמלות", - "common.feesEarned": "עמלות שנצברו", - "common.feesEarnedPerBase": "{{symbolA}} לכל {{symbolB}}", - "common.for": "ל", - "common.free": "לְשַׁחְרֵר", - "common.fullRange": "טווח מלא", - "common.getApp": "קבל אפליקציה", - "common.getHelp.button": "תקבל עזרה", - "common.getStarted": "התחל", - "common.getSupport.button": "קבל תמיכה", - "common.getTheApp": "הורד את האפליקציה", - "common.getUniswapWallet": "קבל Uniswap Wallet", - "common.getUniswapWallet.mobile": "קבל את אפליקציית Uniswap לנייד", - "common.governance": "ממשל", - "common.happyHolidays": "חג שמח מצוות Uniswap!", - "common.help": "עֶזרָה", - "common.helpCenter": "מרכז עזרה", - "common.hidden": "מוּסתָר", - "common.hide.button": "להתחבא", - "common.highPrice": "מחיר גבוה", - "common.includes": "כולל", - "common.info.label": "מידע", - "common.input.noRecipient.error": "בחר נמען", - "common.input.password.confirm": "אשר סיסמה", - "common.input.password.error.mismatch": "הסיסמאות אינן תואמות", - "common.input.password.error.weak": "הסיסמה הזו חלשה מדי", - "common.input.password.new": "סיסמה חדשה", - "common.input.password.placeholder": "סיסמה", - "common.input.password.strength.medium": "בינוני", - "common.input.password.strength.strong": "חָזָק", - "common.input.password.strength.weak": "חלש", - "common.input.search": "לחפש", - "common.insufficient.funds": "אין מספיק כספים", - "common.insufficientBalance.error": "איזון לא מספיק", - "common.insufficientFundsForNetworkFee.error": "אין מספיק כספים לכיסוי עלות הרשת", - "common.insufficientTokenBalance.error": "איזון לא מספיק {{tokenSymbol}}", - "common.insufficientTokenBalance.error.simple": "לא מספיק {{tokenSymbol}}", - "common.invalidPair": "זוג לא חוקי", - "common.invalidRecipient.error": "נמען לא חוקי", - "common.iOSAndroid": "iOS ואנדרואיד", - "common.language": "שפה", - "common.learnMoreSwap": "למידע נוסף על החלפות", - "common.legalAndPrivacy": "משפטי ופרטיות", - "common.less": "פָּחוֹת", - "common.limit.cancel_one": "ביטול מגבלה", - "common.limit.cancel_other": "בטל מגבלות {{count}}", - "common.limit.canceled": "המגבלה בוטלה", - "common.limit.executed": "הגבלה הוצאה להורג", - "common.limit.expired": "פג תוקף המגבלה", - "common.limit.failed": "הגבלה נכשלה", - "common.limit.opened": "הגבלה נפתחה", - "common.limit.pending": "הגבלה בהמתנה", - "common.limits": "גבולות", - "common.limits.approachMax": "מתקרב למגבלת 100 מקסימום", - "common.limits.cancelProceed": "בטל מגבלות כדי להמשיך", - "common.limits.expires": "יפוג {{timestamp}}", - "common.limits.open": "גבולות פתוחים", - "common.limits.when": "כאשר {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "קישורים", - "common.liquidity": "נְזִילוּת", - "common.liquidity.provision": "הפרשת נזילות", - "common.liquidity.removed": "הנזילות הוסרה", - "common.loading": "טוען", - "common.longText.button.less": "תקרא פחות", - "common.longText.button.more": "קרא עוד", - "common.lowPrice": "מחיר נמוך", - "common.manage": "לנהל", - "common.market.label": "שׁוּק", - "common.marketPrice": "מחיר שוק", - "common.marketPrice.fetching": "משיג מחיר שוק...", - "common.marketPrice.label": "מחיר שוק:", - "common.marketPrice.unavailable": "מחיר שוק לא נמצא. אנא ערכו מחקר משלכם כדי למנוע אובדן כספים.", - "common.max": "מקסימום", - "common.message": "הוֹדָעָה", - "common.migrate": "להגר", - "common.migrate.liquidity.failed": "העברת הנזילות נכשלה", - "common.migrate.position": "העבר עמדה", - "common.migrated.liquidity": "נזילות עברה", - "common.migrating.liquidity": "העברת נזילות", - "common.min": "מינימום", - "common.more": "יותר", - "common.moreDetails": "פרטים נוספים", - "common.navigation.settings": "הגדרות", - "common.navigation.systemSettings": "הגדרות", - "common.navigationButton": "כפתור ניווט", - "common.needHelp": "זקוק לעזרה?", - "common.networkCost": "עלות רשת", - "common.neverMind": "לא משנה", - "common.new": "חָדָשׁ", - "common.new.exclamation": "חָדָשׁ!", - "common.nft": "NFT", - "common.nfts": "NFTs", - "common.noAmount.error": "הזן סכום", - "common.noData": "אין מידע", - "common.none": "אַף לֹא אֶחָד", - "common.noResults": "לא נמצאו תוצאות.", - "common.notAvailableInRegion.error": "לא זמין באזור שלך", - "common.notCreated.label": "לא נוצר", - "common.notSupported": "לא נתמך", - "common.oneDay": "יום 1", - "common.oneDay.short": "1D", - "common.oneHour.short": "1H", - "common.oneMonth": "1 חודש", - "common.oneWeek": "שבוע 1", - "common.oneYear": "1 שנה", - "common.opensea.link": "הצג ב-OpenSea", - "common.orderCanceled": "ההזמנה בוטלה", - "common.orderExecuted": "הזמנה בוצעה", - "common.orderExpired": "פג תוקף ההזמנה", - "common.orderPending": "הזמנה בהמתנה", - "common.outOfRange": "מחוץ לטווח", - "common.pageNotFound": "הדף לא נמצא!", - "common.passkey.count": "מפתח סיסמה {{number}}", - "common.passkeys": "מפתחות סיסמה", - "common.passkeys.add": "הוסף מפתח סיסמה", - "common.passkeys.add.description": "בחר היכן לשמור את המפתח החדש שלך.", - "common.pastDay": "היום שעבר", - "common.pastFiveMinutes": "חמש הדקות האחרונות", - "common.pastHour": "השעה האחרונה", - "common.pastMonth": "חודש שעבר", - "common.pastWeek": "שבוע שעבר", - "common.pastYear": "שנה שעברה", - "common.pending": "ממתין ל", - "common.pending.cancellation": "ממתין לביטול", - "common.pendingEllipsis": "ממתין ל...", - "common.permit": "לְהַתִיר", - "common.plusMore": "+{{number}} עוד", - "common.pool": "בריכה", - "common.pools": "בריכות", - "common.portfolio": "תִיק", - "common.poweredBy": "מופעל על ידי ", - "common.price": "מחיר", - "common.priceUpdated": "המחיר עודכן", - "common.privacyChoices": "אפשרויות הפרטיות שלך", - "common.privacyChoices.checkbox.description": "כאשר מסומן, לא נשתף את הנתונים שלך עם שותפים של צד שלישי לצורך פרסום מותאם אישית. אתה יכול לאפשר שיתוף בכל עת על ידי ביטול הסימון בתיבה זו.", - "common.privacyChoices.checkbox.label": "אל תשתף את המידע שלי", - "common.privacyChoices.description": "אנו עשויים לשתף מזהי מכשירים עם שותפי הפרסום שלנו כדי לקדם את השירותים שלנו באתרים ובפלטפורמות אחרות. אם זה כשיר כמכירה, שיתוף או פרסום ממוקד לפי החוקים החלים, תוכל לבטל את הסכמתך על ידי סימון התיבה \"אל תשתף את המידע שלי\". למידע נוסף על נוהלי הפרטיות שלנו, קרא את מדיניות הפרטיותשלנו.", - "common.privacyChoices.disclaimer": "שים לב שהבחירה שלך תחול רק על דפדפן זה במכשיר זה. תוכל גם לבטל את הסכמתך על ידי הפעלת הגדרת בקרת הפרטיות הגלובלית בדפדפן שבו אתה משתמש כדי לגשת לשירותים שלנו. כדי לראות אפשרויות נוספות, עבור להגדרות שלך.", - "common.privacyPolicy": "מדיניות הפרטיות", - "common.proceed": "להמשיך", - "common.proceedInWallet": "המשך בארנק שלך", - "common.products": "מוצרים", - "common.protocol": "נוהל", - "common.protocol.v2": "Uniswap v2", - "common.protocol.v3": "Uniswap v3", - "common.protocol.v4": "Uniswap v4", - "common.purchased": "נרכש", - "common.rate": "ציון", - "common.readMore": "קרא עוד", - "common.receive": "לְקַבֵּל", - "common.received": "קיבלו", - "common.recent": "לאחרונה", - "common.refresh": "לְרַעֲנֵן", - "common.reload.label": "טען מחדש את האפליקציה", - "common.remove.label": "לְהַסִיר", - "common.remove.liquidity.canceled": "הסרת הנזילות בוטלה", - "common.remove.liquidity.failed": "הסרת הנזילות נכשלה", - "common.removing.liquidity": "הסרת נזילות", - "common.resetLimit": "אפס את המגבלה של {{symbol}}", - "common.resetLimitWallet": "אפס את המגבלה של {{symbol}} בארנק", - "common.resettingLimit": "מאפס את המגבלה של {{symbol}} ...", - "common.revoke.approval.failed": "אישור ביטול נכשל", - "common.revoked.approval": "בוטל האישור", - "common.revoking.approval": "ביטול אישור", - "common.scanQRDownload": "סרוק את קוד ה-QR עם הטלפון כדי להוריד", - "common.selectRegion.label": "בחר את האיזור שלך", - "common.selectToken.label": "בחר אסימון", - "common.sell.label": "מכירה", - "common.send.button": "לִשְׁלוֹחַ", - "common.send.failed": "שליחה נכשלה", - "common.sending": "שְׁלִיחָה", - "common.sent": "נשלח", - "common.settings": "הגדרות", - "common.share": "לַחֲלוֹק", - "common.share.shareToTwitter": "שתף לטוויטר", - "common.show.button": "הופעה", - "common.showLess.button": "הראי פחות", - "common.showMore.button": "להראות יותר", - "common.signatureExpired": "פג תוקף החתימה שלך.", - "common.signMessage": "חתום על הודעה", - "common.signMessageWallet": "חתום על הודעה בארנק", - "common.socials": "מדיה חברתית", - "common.sold": "נמכר", - "common.stats": "סטטיסטיקות", - "common.status": "סטָטוּס", - "common.step.number": "שלב {{number}}", - "common.step.number.of": "שלב {{current}} מתוך {{total}}", - "common.swap": "לְהַחלִיף", - "common.swap.expired": "פג תוקף ההחלפה", - "common.swap.failed": "ההחלפה נכשלה", - "common.swapPending": "ההחלפה בהמתנה...", - "common.termsOfService": "תנאי השירות", - "common.text.connected": "מְחוּבָּר", - "common.text.contract": "חוֹזֶה", - "common.text.disconnected": "מְנוּתָק", - "common.text.error": "שְׁגִיאָה", - "common.text.notAvailable": "לא", - "common.text.recipient": "ל", - "common.text.sender": "מ", - "common.text.unknown": "לא ידוע", - "common.thisAccount": "החשבון הזה", - "common.thisMonth": "החודש", - "common.thisToken": "האסימון הזה", - "common.thisWeek": "השבוע", - "common.thisYear": "השנה", - "common.time": "זְמַן", - "common.time.minute.amt": "{{time}}מ", - "common.time.minutes": "דקות", - "common.time.past.days": "{{days}} ימים", - "common.time.past.days.short": "{{days}}ד", - "common.time.past.hours": "{{hours}} שעות", - "common.time.past.hours.short": "{{hours}}ח", - "common.time.past.minutes.short": "{{minutes}}מ", - "common.time.past.months.short": "{{months}}מו", - "common.time.past.seconds.short": "{{seconds}}s", - "common.to": "ל", - "common.today": "היום", - "common.tokenA": "אסימון א", - "common.tokenAmount": "סכום סמלי", - "common.tokenB": "אסימון ב", - "common.tokenName": "שם אסימון", - "common.tokens": "אסימונים", - "common.totalUniswapTVL": "Total Uniswap TVL", - "common.totalValueLocked": "TVL", - "common.trade": "סַחַר", - "common.trademarkPolicy": "מדיניות סימנים מסחריים", - "common.transactionDetails": "פרטי העברה", - "common.transactionId": "מזהה עסקה", - "common.transactionPending": "העסקה בהמתנה", - "common.transactions": "עסקאות", - "common.transactionSettings": "הגדרות עסקה", - "common.transfer_one": "לְהַעֲבִיר", - "common.transfer_other": "העברות", - "common.tryAgain.error": "נסה שוב", - "common.twitter": "טוויטר", - "common.type.label": "סוּג", - "common.unavailable": "אינו זמין", - "common.unhide": "הצג", - "common.unichain": "יוניצ'יין", - "common.uniswapMobile": "Uniswap נייד", - "common.uniswapWallet": "ארנק ללא החלפה", - "common.uniswapX": "UniswapX", - "common.unknown": "לא ידוע", - "common.unknownError.error": "שגיאה לא ידועה", - "common.unwrap.button": "לְגוֹלֵל", - "common.unwrap.failed": "ביטול הגלישה נכשל", - "common.unwrapped": "לא עטוף", - "common.unwrapping": "פורקים את העטיפה", - "common.view.profile": "צפה בפרופיל", - "common.viewOnExplorer": "הצג באקספלורר", - "common.volume": "כרך", - "common.vote": "הַצבָּעָה", - "common.wallet.approve": "אישור בארנק", - "common.wallet.label": "ארנק", - "common.warning": "אַזהָרָה", - "common.webApp": "אפליקציית אינטרנט", - "common.website": "אתר אינטרנט", - "common.whyApprove": "למה אני צריך לאשר אסימון?", - "common.whySign": "מדוע נדרשות חתימות?", - "common.whyWrap": "למה אני צריך לעטוף את {{symbol}}שלי?", - "common.withdraw": "לָסֶגֶת", - "common.withdrawal.amount": "סכום המשיכה", - "common.withinRange": "בטווח", - "common.wrap": "לעטוף {{symbol}}", - "common.wrap.failed": "גלישה נכשלה", - "common.wrapIn": "עטפו {{symbol}} בארנק", - "common.wrapped": "עָטוּף", - "common.wrapping": "לְפָפָה", - "common.wrappingToken": "עוטף {{symbol}}...", - "common.yesterday": "אֶתמוֹל", - "common.your.account.had.insufficient.funds": "לחשבון שלך לא היו מספיק כספים כדי להשלים את ההחלפה הזו.", - "common.your.account.has.insufficient.funds": "בחשבונך אין מספיק כספים כדי להשלים את ההחלפה הזו.", - "common.your.connected.wallet": "הארנק המחובר שלך", - "common.your.limit.could.not.be.fulfilled": "לא ניתן היה לממש את המגבלה שלך בשלב זה. בבקשה נסה שוב.", - "common.your.swap.could.not.be.fulfilled": "לא ניתן היה למלא את ההחלפה שלך בשלב זה. בבקשה נסה שוב.", - "common.youreBuying": "אתה קונה", - "common.youReceive": "אתה מקבל", - "common.youreSelling": "אתה מוכר", - "currency.ars": "פזו ארגנטינאי", - "currency.aud": "דולר אוסטרלי", - "currency.brl": "ריאל ברזילאי", - "currency.cad": "דולר קנדי", - "currency.cny": "יואן סיני", - "currency.cop": "פזו קולומביאני", - "currency.eur": "יוֹרוֹ", - "currency.gbp": "פאונד בריטי", - "currency.hkd": "דולר הונג קונגי", - "currency.idr": "רופיה אינדונזית", - "currency.inr": "רופי הודי", - "currency.jpy": "ין יפני", - "currency.krw": "וון דרום קוריאני", - "currency.mxn": "פזו מקסיקני", - "currency.ngn": "נאירה הניגרית", - "currency.pkr": "רופי פקיסטני", - "currency.rub": "רובל רוסי", - "currency.sgd": "דולר סינגפורי", - "currency.try": "לירה טורקית", - "currency.uah": "Hryvnia אוקראינית", - "currency.usd": "דולר אמריקאי", - "currency.vnd": "דונג וייטנאמי", - "dapp.request.actionCannotBeCompleted.description": "חלק מהפונקציונליות אינה זמינה מכיוון שהגדרות הארנק החכם שלך מנוהלות על ידי אפליקציית ארנק אחרת.", - "dapp.request.actionCannotBeCompleted.header": "בקשת חתימה", - "dapp.request.actionCannotBeCompleted.title": "לא ניתן להשלים את הפעולה", - "dapp.request.approve.action": "לְאַשֵׁר", - "dapp.request.approve.fallbackTitle": "אשר את האתר הזה כדי לגשת לאסימונים", - "dapp.request.approve.helptext": "אפשר לאתר זה לגשת ולבזבז את האסימון הזה עבור עסקאות. ודא שאתה סומך על האתר הזה.", - "dapp.request.approve.label": "ארנק", - "dapp.request.approve.title": "אשר גישה אל {{tokenSymbol}}", - "dapp.request.base.title": "בקשת עסקה", - "dapp.request.bridge.description": "העבר את ETH, USDC ועוד על פני {{numChains}}+ רשתות.", - "dapp.request.bridge.title": "מנסה לגשר?", - "dapp.request.connect.helptext": "אפשר לאתר זה להציג את כתובת הארנק, היתרה שלך ולבקש אישורים לעסקאות.", - "dapp.request.connect.title": "התחבר לאתר", - "dapp.request.fallback.calldata.label": "נתונים גולמיים", - "dapp.request.fallback.function.label": "פוּנקצִיָה", - "dapp.request.permit2.description": "Permit2 מנהל אישורי אסימונים על פני מספר Dapps.", - "dapp.request.permit2.header": "חתום על היתר2", - "dapp.request.permit2approve.action": "לְאַשֵׁר", - "dapp.request.permit2approve.helptext": "Permit2 מנהל אישורי אסימונים על פני מספר Dapps.", - "dapp.request.permit2approve.title": "אישור היתר 2", - "dapp.request.reject.action": "לדחות הכל", - "dapp.request.reject.info": "יש לך {{totalRequestCount}} בקשות לעסקה", - "dapp.request.revoke.action": "לְבַטֵל", - "dapp.request.revoke.helptext": "אפשר לאתר זה לשלול גישה להוצאת האסימון הזה עבור עסקאות. ודא שאתה סומך על האתר הזה.", - "dapp.request.revoke.title": "בטל את הגישה אל {{tokenSymbol}}", - "dapp.request.signature.containsUnrenderableCharacters": "הודעה זו מכילה תווים בלתי ניתנים לעיבוד. ודא שאתה סומך על האתר הזה.", - "dapp.request.signature.decodeError": "פענוח ההודעה נכשל", - "dapp.request.signature.header": "בקשת חתימה", - "dapp.request.signature.irregular": "בקשת חתימה לא סדירה", - "dapp.request.signature.irregular.description": "ודא שאתה סומך על האתר הזה לפני שתמשיך", - "dapp.request.signature.irregular.understand": "אני מבין את הסיכונים", - "dapp.request.signature.toggleDataView.raw": "הצג נתונים גולמיים", - "dapp.request.signature.toggleDataView.readable": "הצג נתונים מקוריים", - "dapp.request.warning.notActive.message": "ודא שזהו הנכון", - "dapp.request.warning.notActive.title": "זה לא הארנק הפעיל שלך", - "delegation.upgradeModal.description": "עדכון ארנק זה משתמש בחוזים חכמים לעסקאות מהירות ובעלות נמוכה יותר. למידע נוסף", - "delegation.upgradeModal.enableSmartWallet": "הפעלת ארנק חכם", - "delegation.upgradeModal.title": "החלפות חכמות יותר, עלויות נמוכות יותר", - "downloadApp.modal.connectExistingWallet": "חבר את הארנק הקיים", - "downloadApp.modal.getStarted.description": "קבל גישה לאלפי אסימונים באופן מיידי דרך שוק ה-onchain הגדול בעולם.", - "downloadApp.modal.getStarted.title": "התחל להחליף תוך שניות", - "downloadApp.modal.getTheApp.title": "התחל עם Uniswap", - "downloadApp.modal.uniswapProducts.subtitle": "מוצרי Uniswap עובדים יחד בצורה חלקה כדי ליצור את חוויית ה-onchain הטובה ביותר.", - "empty.swap.button.text": "הוסף כספים להחלפה", - "error.dataUnavailable": "הנתונים אינם זמינים כרגע; אנחנו עובדים על תיקון", - "error.id": "מזהה שגיאה: {{eventId}}", - "error.jupiterApi.execute.default.title": "משהו השתבש בממשק ה-API של ג'ופיטר. אנא נסה שוב.", - "error.jupiterApi.failedToLand": "(קוד {{code}}: העסקה נכשלה בנחיתה ברשת)", - "error.jupiterApi.invalidBlockHeight": "(קוד -1004: גובה בלוק לא חוקי)", - "error.jupiterApi.invalidMessageBytes": "(קוד -3: בתים לא חוקיים של הודעה)", - "error.jupiterApi.invalidPayload": "(קוד -2002: מטען לא חוקי)", - "error.jupiterApi.invalidSignedTransaction": "(קוד -2: עסקה חתומה לא חוקית)", - "error.jupiterApi.invalidTransaction": "(קוד -1002: עסקה לא חוקית)", - "error.jupiterApi.missingCachedOrder": "(קוד -1: הזמנה חסרה במטמון)", - "error.jupiterApi.notFullySigned": "(קוד -1003: עסקה לא חתומה במלואה)", - "error.jupiterApi.quoteExpired": "זמן ההצעה הזה פג, אנא נסה שוב. (קוד -2003)", - "error.jupiterApi.unknownErrorCode": "(קוד {{code}})", - "error.noData": "לא נמצאו נתונים", - "error.request.provideId": "מצטערים, אירעה שגיאה במהלך עיבוד הבקשה שלך. אם אתה מבקש תמיכה, הקפד לספק את מזהה השגיאה שלך.", - "error.tokenApproval": "אישור האסימון נכשל", - "error.tokenApproval.message": "סביר להניח שבעיית רשת או חיבור גרמה לכישלון האישור שלך. בדוק את החיבור ונסה שוב.", - "error.tokenApprovalEdited": "כמות אישור לא מספקת", - "error.tokenApprovalEdited.message": "סכום האישור שהוגדר בארנק שלך נמוך מכדי להשלים עסקה זו. אנא נסה שוב והגדל את הסכום.", - "errors.crash.message": "משהו התרסק.", - "errors.crash.restart": "הפעל מחדש את האפליקציה", - "errors.crash.title": "או - או!", - "explore.more.pools": "חקור עוד בריכות", - "explore.more.unichain": "חקור בריכות Unichain", - "explore.search.label.ownedBy": "בבעלות {{ownerAddress}}", - "explore.search.placeholder": "חפש אסימונים וארנקים", - "explore.search.section.nft": "אוספי NFT", - "explore.search.section.popularNFT": "אוספי NFT פופולריים", - "explore.search.section.wallets": "ארנקים", - "explore.tokens.error": "לא ניתן היה לטעון אסימונים", - "explore.tokens.favorite.action.add": "אסימון אהוב", - "explore.tokens.favorite.action.edit": "ערוך מועדפים", - "explore.tokens.favorite.action.remove": "הסר מועדף", - "explore.tokens.favorite.title.default": "אסימונים אהובים", - "explore.tokens.favorite.title.edit": "ערוך אסימונים מועדפים", - "explore.tokens.metadata.marketCap": "{{number}} MCap", - "explore.tokens.metadata.totalValueLocked": "{{number}} TVL", - "explore.tokens.metadata.volume": "{{number}} כרך", - "explore.tokens.sort.label.marketCap": "שווי שוק", - "explore.tokens.sort.label.priceDecrease": "ירידת מחיר", - "explore.tokens.sort.label.priceIncrease": "עליית מחירים", - "explore.tokens.sort.label.totalValueLocked": "TVL", - "explore.tokens.sort.label.volume": "כרך", - "explore.tokens.sort.option.marketCap": "שווי שוק", - "explore.tokens.sort.option.priceDecrease": "ירידת מחיר (24 שעות)", - "explore.tokens.sort.option.priceIncrease": "עליית מחיר (24 שעות)", - "explore.tokens.sort.option.totalValueLocked": "בטל החלפה של TVL", - "explore.tokens.sort.option.volume": "נפח חד-החלפה (24 שעות)", - "explore.tokens.top.title": "אסימונים מובילים", - "explore.v2TVL": "v2 TVL", - "explore.v3TVL": "v3 TVL", - "explore.v4TVL": "v4 TVL", - "explore.wallets.favorite.action.add": "ארנק אהוב", - "explore.wallets.favorite.action.edit": "ערוך מועדפים", - "explore.wallets.favorite.action.remove": "הסר מועדף", - "explore.wallets.favorite.action.remove.short": "הסר את המועדפים", - "explore.wallets.favorite.title.default": "ארנקים אהובים", - "explore.wallets.favorite.title.edit": "ערוך ארנקים מועדפים", - "extension.connection.network": "רֶשֶׁת", - "extension.connection.networks": "רשתות", - "extension.connection.popup.trouble": "בעיה בחיבור?", - "extension.connection.titleConnected": "מְחוּבָּר", - "extension.connection.titleNotConnected": "לא מחובר", - "extension.lock.button.forgot": "שכחת את הסיסמא?", - "extension.lock.button.reset": "אפס את הארנק", - "extension.lock.button.submit": "לבטל נעילה", - "extension.lock.password.error": "סיסמה שגויה. נסה שוב", - "extension.lock.password.reset.initial.description": "Uniswap לא יכול לעזור לשחזר את הסיסמה שלך. עליך לאפס את הארנק שלך על ידי הזנה מחדש של ביטוי השחזור בן 12 המילים.", - "extension.lock.password.reset.initial.help": "איפה אני מוצא את ביטוי ההחלמה שלי?", - "extension.lock.password.reset.initial.title": "שכחת את הסיסמא", - "extension.lock.password.reset.speedbump.description": "ודא שיש לך את ביטוי השחזור בן 12 מילים לפני שאתה מאפס את הארנק. אחרת לא תוכל לשחזר את הכספים שלך.", - "extension.lock.password.reset.speedbump.help": "איבדתי את משפט ההחלמה שלי", - "extension.lock.password.reset.speedbump.title": "לפני שתמשיך", - "extension.lock.subtitle": "הזן את הסיסמה שלך כדי לבטל את הנעילה", - "extension.lock.title": "ברוך שובך", - "extension.network.notSupported": "רשת לא נתמכת", - "extension.open": "פתח את הרחבת Uniswap", - "extension.passwordPrompt.error.wrongPassword": "סיסמה שגויה. נסה שוב", - "extension.passwordPrompt.title": "הכנס את הסיסמה שלך", - "extension.popup.chrome.button": "פתח את הרחבה", - "extension.popup.chrome.description": "השלם פעולה זו על ידי פתיחת התוסף Uniswap.", - "extension.popup.chrome.title": "המשך ב-Uniswap", - "extension.settings.defaultWallet.message": "תן עדיפות ל-Uniswap Extension בעת התחברות לאפליקציות.", - "extension.settings.defaultWallet.title": "הפוך לארנק ברירת מחדל", - "extension.uninstall.reason.missingFeatures": "לארנק Uniswap חסרות תכונות מסוימות", - "extension.uninstall.reason.notUsingCrypto": "אני כבר לא רוצה להשתמש בקריפטו", - "extension.uninstall.reason.other": "סיבות אחרות", - "extension.uninstall.reason.switchingWallet": "אני עובר לארנק אחר", - "extension.uninstall.subtitle": "אם יש לך רגע, נשמח לשמוע מדוע הסרת את ארנק Uniswap", - "extension.uninstall.title": "אנחנו עצובים לראות אותך הולך", - "extension.warning.storage.button": "לְגַבּוֹת", - "extension.warning.storage.message": "הקפד לגבות את ביטוי השחזור שלך כדי למנוע איבוד גישה לארנק ולכספים שלך.", - "extension.warning.storage.title": "האחסון בדפדפן שלך אוזל", - "extensionPasskeyLogInPopUp.description": "ייבא את חשבון Uniswap שלך על ידי כניסה באמצעות סיסמה קיימת.", - "extensionPasskeyLogInPopUp.invalidReferrer": "אנא סגור דף זה ונסה שוב.", - "fee.bestForCustomizability": "הכי טוב מבחינת התאמה אישית.", - "fee.bestForExotic": "הכי מתאים לזוגות אקזוטיים.", - "fee.bestForMost": "הטוב ביותר עבור רוב הזוגות.", - "fee.bestForStablePairs": "הטוב ביותר עבור זוגות יציבים.", - "fee.bestForVeryStable": "הטוב ביותר עבור זוגות יציבים מאוד.", - "fee.dynamic": "עמלה דינמית", - "fee.percentEarned": "האחוז שתרוויח בעמלות.", - "fee.selectPercent": "{{pct}}% בחר", - "fee.selectPercentDescription": "{{pct}}% מהנזילות נבחרה בשכבה זו", - "fee.tier": "דרגת עמלות", - "fee.tier.create": "צור דרגת עמלות", - "fee.tier.create.button": "צור שכבת עמלות חדשה", - "fee.tier.create.description": "יצירת שכבה חדשה תתחיל במאגר חדש ותגרום לעלויות רשת גבוהות מהרגיל.", - "fee.tier.description": "הסכום שהרווח מספק נזילות. בחר סכום המתאים לסובלנות הסיכון והאסטרטגיה שלך.", - "fee.tier.description.v2": "הסכום שהרווח מספק נזילות. לכל מאגר ה-v2 יש עמלות קבועות של 0.3%. לאפשרויות נוספות, ספק נזילות ב-v4.", - "fee.tier.dynamic": "דרגת עמלות דינמית", - "fee.tier.dynamic.create": "יצירת דרגת עמלות דינמית", - "fee.tier.dynamic.create.info": "אתה עומד ליצור מאגר עם דרגת עמלות דינמית. לפני שתמשיך, אנא ודא שהקרס שנבחר תומך בעמלות דינמיות.", - "fee.tier.highestTvl": "TVL הגבוה ביותר", - "fee.tier.label": "האחוז שתרוויח בעמלות", - "fee.tier.missing.description": "אינך מוצא את הרמה שאתה מחפש?", - "fee.tier.new": "נדבך חדש", - "fee.tier.percent.select": "{{percentage}} בחר", - "fee.tier.recommended.description": "מומלץ על בסיס נתח הנזילות הגבוה ביותר עבור צמד האסימונים שנבחר.", - "fee.tier.search": "חפש או צור שכבות עמלות אחרות", - "fee.tier.search.short": "חיפוש שכבות", - "fee.tier.select": "בחר דרגת עמלות", - "fee.tier.select.existing.button": "בחר דרגת עמלות קיימת", - "fee.tierExact": "{{fee}} שכבת עמלות", - "fee.unavailable": "עמלות שהושגו אינן גלויות עבור עמדות v2 עד להסרת הנזילות.", - "fee.uncollected": "כולל עמלות שלא נגבו:", - "fee.uniswap": "עמלה ({{percent}})", - "fee.uniswap.description": "עמלות נגבות כדי להבטיח את החוויה הטובה ביותר עם Uniswap.", - "fiatOffRamp.checkout.title": "משיכה אל", - "fiatOffRamp.connection.quote": "מוכר בשווי {{amount}} של {{currencySymbol}}", - "fiatOffRamp.error.balance": "עולה על איזון", - "fiatOffRamp.error.populateSend.description": "אנא המתן רגע ונסה שוב.", - "fiatOffRamp.error.populateSend.title": "לא ניתן לטעון את העסקה", - "fiatOffRamp.summary.total": "{{cryptoAmount}} עבור {{fiatAmount}}", - "fiatOffRamp.unsupportedToken.back": "תחזור", - "fiatOffRamp.unsupportedToken.divider": "אסימונים לא נתמכים", - "fiatOffRamp.unsupportedToken.message": "אסימון זה אינו נתמך למכירה. החלף את הנכס הזה לאחד מהאסימונים הנתמכים.", - "fiatOffRamp.unsupportedToken.swap": "החלף לאסימון נתמך", - "fiatOffRamp.unsupportedToken.title": "אסימון לא נתמך", - "fiatOffRamp.welcome.tooltip": "מכור את הקריפטו שלך לחשבון הבנק או לכרטיס החיוב שלך.", - "fiatOnRamp.button.chooseToken": "בחר אסימון", - "fiatOnRamp.buy.info.description": "תצטרך אותו כדי לשלם עבור עלויות רשת בעת ההחלפה.", - "fiatOnRamp.buy.info.title": "התחל עם ETH", - "fiatOnRamp.cexTransferModal.description": "קניית קריפטו באמצעות כרטיס אינה נתמכת באזור שלך. העבר נכסים מחשבון חליפין מרכזי כדי לממן את הארנק שלך.", - "fiatOnRamp.cexTransferModal.title": "העבר כדי להתחיל", - "fiatOnRamp.checkout.title": "תשלום", - "fiatOnRamp.chooseMultiPlatformProvider.chooseNetwork": "בחר רשת", - "fiatOnRamp.chooseMultiPlatformProvider.description": "פעולה זו תקבע את כתובת הארנק אליה תקבלו את הכספים.", - "fiatOnRamp.chooseProvider.description": "תמשיך לפורטל של הספק כדי לראות את העמלות הקשורות לעסקה שלך.", - "fiatOnRamp.completeTransactionHeader": "השלם עסקה עם {{serviceProvider}}", - "fiatOnRamp.connection.error": "חיבור נכשל", - "fiatOnRamp.connection.errorDescription": "משהו השתבש בחיבור עם {{serviceProvider}}.", - "fiatOnRamp.connection.message": "מחבר אותך אל {{serviceProvider}}", - "fiatOnRamp.connection.quote": "קניית {{amount}} בשווי {{currencySymbol}}", - "fiatOnRamp.connection.terms": "על ידי המשך, אתה מאשר שאתה תהיה כפוף לתנאי השירות ו מדיניות הפרטיות עם {{serviceProvider}}, לפי העניין.", - "fiatOnRamp.continueInTab": "עבור ללשונית {{serviceProvider}} כדי להמשיך. זה בטוח לסגור את המודל הזה עכשיו.", - "fiatOnRamp.disclaimer": "על ידי המשך, אתה מאשר שאתה תהיה כפוף לתנאי השירות ו מדיניות הפרטיות עם {{serviceProvider}}, לפי העניין.", - "fiatOnRamp.error.default": "משהו השתבש.", - "fiatOnRamp.error.load": "לא ניתן היה לטעון אסימונים לקנייה", - "fiatOnRamp.error.max": "מקסימום {{amount}}", - "fiatOnRamp.error.min": "מינימום {{amount}}", - "fiatOnRamp.error.noQuotes": "לא נמצאו ציטוטים.", - "fiatOnRamp.error.unavailable": "שירות זה אינו זמין באזור שלך", - "fiatOnRamp.error.unsupported": "לא נתמך באזור", - "fiatOnRamp.error.usd": "זמין לרכישה רק בדולר ארה\"ב", - "fiatOnRamp.noQuotes.error": "לא נמצאו ציטוטים", - "fiatOnRamp.paymentMethods.applePay": "אפל פיי", - "fiatOnRamp.paymentMethods.bank": "בַּנק", - "fiatOnRamp.paymentMethods.debit": "חוֹבָה", - "fiatOnRamp.paymentMethods.googlePay": "גוגל פיי", - "fiatOnRamp.paymentMethods.paypal": "פייפאל", - "fiatOnRamp.paymentMethods.venmo": "ונמו", - "fiatOnRamp.quote.advice": "תמשיך לפורטל של הספק כדי לראות את העמלות הקשורות לעסקה שלך.", - "fiatOnRamp.quote.type.list": "{{optionsList}}ואפשרויות אחרות", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "מתוך חשבון", - "fiatOnRamp.receiveCrypto.title": "קבל קריפטו", - "fiatOnRamp.receiveCrypto.transferFunds": "ממן את הארנק שלך על ידי העברת קריפטו מארנק או חשבון אחר", - "fiatOnRamp.receiveCrypto.useThisAddress": "השתמש בכתובת זו כדי לקבל אסימונים ב", - "fiatOnRamp.region.placeholder": "חפש לפי מדינה או אזור", - "fiatOnRamp.region.title": "בחר את האיזור שלך", - "fiatOnRamp.summary.total": "{{cryptoAmount}} עבור {{fiatAmount}}", - "forceUpgrade.action.backup": "גבה את הארנק שלך", - "forceUpgrade.action.confirm": "עדכן עכשיו", - "forceUpgrade.action.learn": "למד כיצד לעדכן", - "forceUpgrade.description.extension": "גרסה חדשה של האפליקציה זמינה. כדי להמשיך להשתמש בתוסף Uniswap, אנא עדכן אותה לגרסה העדכנית ביותר.", - "forceUpgrade.description.wallet": "גרסה חדשה של האפליקציה זמינה. כדי להמשיך להשתמש בארנק Uniswap, אנא עדכן אותו לגרסה העדכנית ביותר.", - "forceUpgrade.label.recoveryPhrase": "ביטוי התאוששות", - "forceUpgrade.title": "עדכן לגרסה האחרונה", - "forceUpgrade.title.recommendedStatus": "גרסה חדשה זמינה", - "globalPreferences.title": "העדפות גלובליות", - "hero.scroll": "גלול למידע נוסף", - "hero.subtitle": "Buy and sell crypto on {{amount}}+ networks including Ethereum, Unichain, and Base.", - "hero.swap.title": "החלפה בכל זמן,
בכל מקום.", - "hidden.nfts.info.banner.text": "למידע נוסף על NFTs מוסתרים", - "hidden.nfts.info.text.button": "NFTs מוסתרים ({{numHidden}})", - "hidden.nfts.info.text.extension": "אלו הן הונאות פוטנציאליות ו-NFTs שהסתרת. אתה יכול ללחוץ לחיצה ימנית על NFT כדי לבטל את הסתרתו.", - "hidden.nfts.info.text.mobile": "אלו הן הונאות פוטנציאליות ו-NFTs שהסתרת. אתה יכול ללחוץ לחיצה ארוכה על NFT כדי להסתיר אותו.", - "hidden.nfts.info.text.title": "NFTs נסתרים", - "hidden.tokens.info.banner.text": "למידע נוסף על אסימונים נסתרים", - "hidden.tokens.info.text.button": "אסימונים נסתרים ({{numHidden}})", - "hidden.tokens.info.text.info": "אלו הן הונאות פוטנציאליות, יתרות קטנות ואסימונים שהחבאת. אסימונים נסתרים אינם כלולים ביתרת הארנק הכוללת שלך.", - "hidden.tokens.info.text.title": "אסימונים נסתרים", - "home.activity.empty.button": "קבל אסימונים או NFTs", - "home.activity.empty.description.default": "כאשר אתה מאשר, סוחר או מעביר אסימונים או NFTs, העסקאות שלך יופיעו כאן.", - "home.activity.empty.description.external": "כאשר הארנק הזה מבצע עסקאות, הן יופיעו כאן.", - "home.activity.empty.title": "עדיין אין פעילות", - "home.activity.error.load": "לא ניתן היה לטעון את הפעילות", - "home.activity.title": "פעילות", - "home.banner.offline": "אתה במצב לא מקוון", - "home.banner.testnetMode": "אתה במצב testnet", - "home.banner.testnetMode.nav": "אתה במצב testnet. כבה את זה בהגדרות.", - "home.empty.cexTransfer": "לְהַעֲבִיר", - "home.empty.cexTransfer.description": "העבר כספים מפלטפורמת מסחר.", - "home.empty.transfer": "קבל קריפטו", - "home.empty.transfer.description": "העבר כספים מארנק אחר.", - "home.explore.footer": "הקש כאן כדי לחקור אלפי אסימונים, NFTs ועוד", - "home.explore.title": "חקור אסימונים", - "home.extension.error": "שגיאה בטעינת חשבונות", - "home.label.buy": "לִקְנוֹת", - "home.label.for": "קנה/מכירה", - "home.label.receive": "לְקַבֵּל", - "home.label.send": "לִשְׁלוֹחַ", - "home.label.swap": "לְהַחלִיף", - "home.nfts.title": "NFTs", - "home.tokens.empty.action.buy.description": "רכישה באמצעות כרטיס חיוב או חשבון בנק.", - "home.tokens.empty.action.buy.title": "קנה קריפטו", - "home.tokens.empty.action.import.description": "הזן את ביטוי השחזור של הארנק הזה כדי להתחיל בהחלפה ושליחה.", - "home.tokens.empty.action.import.title": "ייבוא ארנק", - "home.tokens.empty.action.receive.description": "העברה מארנק או חשבון אחר.", - "home.tokens.empty.action.receive.title": "קבל קריפטו", - "home.tokens.empty.description": "כאשר הארנק הזה קונה או מקבל אסימונים, הם יופיעו כאן.", - "home.tokens.empty.title": "עדיין אין אסימונים", - "home.tokens.empty.welcome.description": "הוסף כספים כדי להתחיל לסחור", - "home.tokens.error.fetch": "לא הצלחנו להביא יתרות אסימונים", - "home.tokens.error.load": "לא ניתן היה לטעון יתרות אסימונים", - "home.tokens.title": "אסימונים", - "home.upsell.receive.cta": "מתוך חשבון", - "home.upsell.receive.title": "קבל קריפטו", - "home.warning.viewOnly": "זהו ארנק לצפייה בלבד", - "interface.metatags.description": "החלפת מטבעות קריפטו על את'ריום, בייס, ארביטרום, פוליגון, יוניצ'יין ועוד. פלטפורמת DeFi שמיליונים סומכים עליה.", - "interface.metatags.title": "ממשק חד-החלפה", - "landing.api": "ממשק API", - "landing.appsOverview": "בנוי לכל הדרכים שבהן אתם מחליפים", - "landing.blog.description": "התעדכנו בחדשות החברה, תכונות המוצר ועוד", - "landing.docs.description": "עיינו בספריית מסמכי המפתחים שלנו כדי להתחיל לבנות עם Uniswap", - "landing.exploreUniverse": "חקור את היקום", - "landing.getStarted": "סחור ב-DEX הגדול בעולם", - "landing.helpCenter.body": "עיינו בשאלות הנפוצות וקבלו תמיכה מצוות התמיכה שלנו שבסיסו בארה\"ב", - "landing.protocolDescription": "מעבדות Uniswap מפעילות כמה מהמוצרים הנפוצים ביותר בתחום הקריפטו. חוו גישה ללא הרשאה, אבטחה מוכחת ותמיכה ייעודית.", - "landing.protocolStats": "סטטיסטיקות פרוטוקול Uniswap", - "landing.provideLiquidity.body": "ספק נזילות וגביית עמלות באמצעות ממשק Uniswap.", - "landing.provideLiquidity.subtitle": "שווקי חשמל ברשת.", - "landing.socials": "עקבו אחר Uniswap Labs ב- X, Farcaster, LinkedIn, ו- TikTok", - "landing.swapBody": "גישה לנזילות עמוקה, חקור טוקנים, קבע הוראות גבול וספק נזילות לאלפי טוקנים ברשתות {{amount}} .", - "landing.swapSubtitle": "החלפה ללא הרשאה.", - "landing.tradingApi": "API למסחר", - "landing.tradingApiBody": "השתמשו באותו ממשק API שמפעיל את אפליקציית האינטרנט והארנק של Uniswap, עליו סומכים צוותים מובילים ברחבי העולם.", - "landing.tradingApiButton": "שלב את ממשק ה-API של Uniswap", - "landing.tradingApiSubtitle": "DeFi, ישירות למשתמשים שלך.", - "landing.trusted": "מהימנים על ידי מיליונים", - "landing.unichain.body": "הצטרפו לבניית קהילה על גבי את'ריום L2 המהיר והמבוזר שנבנה להיות הבית ל-DeFi.", - "landing.unichain.button": "התחל לבנות", - "landing.unichain.subtitle": "שרשרת ה-DeFi.", - "landing.uniswapX.body": "עסקאות ללא גז והגנה מפני MEV, ללא עמלות עבור החלפות שנכשלו.", - "landing.uniswapX.button": "חוו את UniswapX", - "landing.uniswapX.subtitle": "החלפות חכמות יותר, אפס חיכוך.", - "landing.walletBody": "ארנק ותוסף קריפטו לשמירה עצמית מהימן עם מיליוני הורדות, תמיכה מאנשים אמיתיים ודירוג של 4.8 .", - "landing.walletSubtitle": "להחליף, לאחסן, לחקור.", - "language.afrikaans": "אפריקאנס", - "language.arabic": "עֲרָבִית", - "language.catalan": "קטלאנית", - "language.chineseSimplified": "סינית מופשטת", - "language.chineseTraditional": "מסורת סינית", - "language.czech": "צ'כית", - "language.danish": "דַנִי", - "language.dutch": "הוֹלַנדִי", - "language.english": "אנגלית", - "language.finnish": "פִינִית", - "language.french": "צָרְפָתִית", - "language.greek": "יוונית", - "language.hebrew": "עִברִית", - "language.hindi": "הינדי", - "language.hungarian": "הוּנגָרִי", - "language.indonesian": "אינדונזית", - "language.italian": "אִיטַלְקִית", - "language.japanese": "יַפָּנִית", - "language.korean": "קוריאנית", - "language.malay": "מלאית", - "language.norwegian": "נורבגית", - "language.polish": "פּוֹלָנִית", - "language.portuguese": "פורטוגזית", - "language.romanian": "רומנית", - "language.russian": "רוּסִי", - "language.serbian": "סרבית", - "language.spanishArgentina": "ספרדית (ארגנטינה)", - "language.spanishBelize": "ספרדית (בליז)", - "language.spanishBolivia": "ספרדית (בוליביה)", - "language.spanishChile": "ספרדית (צ'ילה)", - "language.spanishColombia": "ספרדית (קולומביה)", - "language.spanishCostaRica": "ספרדית (קוסטה ריקה)", - "language.spanishCuba": "ספרדית (קובה)", - "language.spanishDominicanRepublic": "ספרדית (הרפובליקה הדומיניקנית)", - "language.spanishEcuador": "ספרדית (אקוודור)", - "language.spanishElSalvador": "ספרדית (אל סלבדור)", - "language.spanishGuatemala": "ספרדית (גואטמלה)", - "language.spanishHonduras": "ספרדית (הונדורס)", - "language.spanishLatam": "ספרדית (אמריקה הלטינית)", - "language.spanishMexico": "ספרדית (מקסיקו)", - "language.spanishNicaragua": "ספרדית (ניקרגואה)", - "language.spanishPanama": "ספרדית (פנמה)", - "language.spanishParaguay": "ספרדית (פרגוואי)", - "language.spanishPeru": "ספרדית (פרו)", - "language.spanishPuertoRico": "ספרדית (פורטו ריקו)", - "language.spanishSpain": "ספרדית (ספרד)", - "language.spanishUruguay": "ספרדית (אורוגוואי)", - "language.spanishUs": "ספרדית (ארה\"ב)", - "language.spanishVenezuela": "ספרדית (ונצואלה)", - "language.swahili": "סוואהילית", - "language.swedish": "שוודית", - "language.turkish": "טורקי", - "language.ukrainian": "אוקראינית", - "language.urdu": "אורדו", - "language.vietnamese": "וייטנאמית", - "large.price.difference": "הפרש מחירים גדול", - "large.price.difference.tooltip": "המשך עסקה זו יגרום לאובדן כספים. הפרש זה יכול לנבוע מעסקאות גדולות או נזילות נמוכה.", - "limit.open.count_one": "מגבלה פתוחה אחת", - "limit.open.count_other": "{{count}} מגבלות פתוחות", - "limitPrice.buyingAboveMarketPrice.error.description": "המחיר המקסימלי שלך גבוה ב-{{percentage}}% מהשוק. התאם את המחיר המקסימלי שלך כדי להמשיך.", - "limitPrice.buyingAboveMarketPrice.error.title": "קנייה של {{tokenSymbol}} מעל מחיר השוק", - "limitPrice.marketPriceNotAvailable.error.description": "אין באפשרותנו לחשב את מחיר השוק הנוכחי. כדי להימנע מהגשת הזמנה מתחת למחיר השוק, אנא בדוק את חיבור הרשת שלך ונסה שוב.", - "limitPrice.marketPriceNotAvailable.error.title": "מחיר שוק אינו זמין", - "limitPrice.sellingBelowMarketPrice.error.description": "מחיר המגבלה שלך נמוך ב- {{percentage}}% מהשוק. התאם את מחיר המגבלה שלך כדי להמשיך.", - "limitPrice.sellingBelowMarketPrice.error.title": "מוכר {{tokenSymbol}} מתחת למחיר השוק", - "limits.form.disclaimer.mainnet": "רק אסימוני mainnet של Ethereum זמינים עבור מגבלות. ", - "limits.form.disclaimer.mainnet.short": "רק אסימוני Mainnet זמינים עבור מגבלות.", - "limits.form.disclaimer.uniswapx": "ייתכן שהמגבלות לא יפעלו בדיוק כאשר האסימונים מגיעים למחיר שצוין. ", - "limits.learnMore": "למידע נוסף על מגבלות", - "limits.price.input.label": "כאשר 1 שווה", - "limits.price.label": "מחיר הגבלה", - "limits.selectSupportedTokens": "בחר אסימונים נתמכים", - "liquidity.hooks": "מתחבר ל-v4", - "liquidity.hooks.address.input": "הזן כתובת הוק", - "liquidity.hooks.address.tooltip": "כתובת וו: {{address}}", - "liquidity.learnMoreLabel": "למד על מתן נזילות", - "liquidity.notEnough.label": "אין מספיק נזילות כדי להציג ערך מדויק של דולר ארה\"ב.", - "liquidity.provideOnProtocols": "מתן נזילות על פרוטוקולים שונים", - "liquidityPool.page.title": "הוסף נזילות למאגרים{{version}} ב-Uniswap", - "liquidityPool.positions.closed.title": "עמדות סגורות", - "liquidityPool.positions.loadingMore": "טוען עוד משרות...", - "liquidityPool.positions.page.title": "נהל נזילות של {{quoteSymbol}}/{{baseSymbol}} ב-Uniswap", - "liquidityPool.positions.page.version.description": "הצג את עמדות הנזילות הפעילות של {{version}} שלך. הוסף עמדות חדשות.", - "liquidityPool.positions.page.version.title": "נהל את נזילות המאגר{{version}} ב-Uniswap", - "migrate.allowed": "מוּתָר", - "migrate.allowLpMigration": "אפשר העברת אסימון LP", - "migrate.connectAccount": "עליך לחבר חשבון המחזיק בעמדה זו.", - "migrate.connectWallet": "התחבר לארנק כדי לראות את הנזילות שלך ב-V2.", - "migrate.contract": "חוזה הגירה ללא החלפה", - "migrate.firstLP": "אתה ספק הנזילות הראשון עבור מאגר Uniswap V3 זה. הנזילות שלך תעבור במחיר הנוכחי של {{source}} .", - "migrate.highGasCost": "עלות העסקה שלך תהיה הרבה יותר גבוהה מכיוון שהיא כוללת את הגז ליצירת הבריכה.", - "migrate.invalidRange": "נבחר טווח לא חוקי. המחיר המינימלי חייב להיות נמוך מהמחיר המקסימלי.", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} אסימוני LP", - "migrate.migrating": "נודד", - "migrate.missingV2Position": "אינך רואה את אחת מעמדות v2 שלך? ייבא אותו.", - "migrate.noV2Liquidity": "לא נמצאה נזילות V2.", - "migrate.positionNoFees": "העמדה שלך לא תרוויח עמלות או תשמש בעסקאות עד שמחיר השוק יעבור לטווח שלך.", - "migrate.priceDifference": "הבדל במחיר: ", - "migrate.priceWarning": "עליך להפקיד נזילות ל- Uniswap V3 רק במחיר שאתה מאמין שהוא נכון.
אם המחיר נראה שגוי, אתה יכול לבצע החלפה כדי להזיז את המחיר או לחכות שמישהו אחר יעשה זאת.", - "migrate.refund": "לפחות {{amtA}} {{symA}} ו {{amtB}} {{symB}} יוחזרו לארנק שלך עקב טווח מחירים נבחר.", - "migrate.selectFeeTier": "בחר דרגת עמלות", - "migrate.setRange": "קבע טווח מחירים", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} מחיר:", - "migrate.v2Description": "כלי זה יעביר בבטחה את הנזילות שלך {{source}} ל-V3. התהליך חסר אמון לחלוטין הודות לחוזה ההעברה של <0>Uniswap ↗", - "migrate.v2Instruction": "עבור כל מאגר המוצג להלן, לחץ על העבר כדי להסיר את הנזילות שלך מ-Uniswap V2 ולהפקיד אותה ב-Uniswap V3.", - "migrate.v2Title": "העבר נזילות V2", - "migrate.v3Price": "V3 {{sym}} מחיר:", - "mint.v3.input.invalidPrice.error": "קלט מחיר לא חוקי", - "mobileAppPromo.banner.getTheApp.link": "קבל את אפליקציית ארנק Uniswap", - "mobileAppPromo.banner.title": "יחידת החלפה: ארנק קריפטו ו-NFT", - "moonpay.poweredBy": "פיאט onramp מופעל על ידי MoonPay USA LLC", - "nav.createAccount.button": "צור חשבון", - "nav.logIn.button": "התחבר", - "nav.logInOrConnect.title": "התחבר או התחבר", - "nav.products.tradingApi": "שלב את הפרוטוקול", - "nav.products.unichain": "שרשרת ה-DeFi", - "nav.products.uniswapX": "המטא-אגרגרטור", - "nav.products.wallet": "החלפה, אחסון, גילוי", - "nav.signUp.button": "הירשם", - "nav.tabs.createPosition": "צור עמדה", - "nav.tabs.viewPositions": "הצג עמדות", - "network.lostConnection": "ייתכן שאיבדת את החיבור לרשת.", - "network.mightBeDown": "ייתכן ש-{{network}} מושבת כרגע, או שאיבדת את החיבור לרשת.", - "network.warning": "אזהרת רשת", - "nft.noPools": "עדיין אין בריכות", - "nft.reportSpam": "דווח כדואר זבל", - "notFound.oops": "אופס, קח אותי בחזרה ל-Swap", - "notice.uk": "אפליקציית אינטרנט זו מסופקת ככלי למשתמשים לקיים אינטראקציה עם פרוטוקול Uniswap מיוזמתם, ללא אישור או המלצה לפעילויות מסחר במטבעות קריפטוגרפיים. בכך, Uniswap אינה ממליצה למשתמשים או למשתמשים פוטנציאליים לעסוק בפעילות מסחר בנכסי קריפטו, ומשתמשים או משתמשים פוטנציאליים באפליקציית האינטרנט אינם צריכים לראות בדף אינטרנט זה או בתוכנו ככרוכים בכל צורה של המלצה, הזמנה או תמריץ לסחור בנכסי קריפטו. .", - "notice.uk.label": "כתב ויתור בבריטניה:", - "notification.assetVisibility.hidden": "{{assetName}} מוסתר", - "notification.assetVisibility.unhidden": "{{assetName}} לא מוסתר", - "notification.buy.network": "קונה ב- {{network}}", - "notification.copied.address": "הכתובת הועתקה", - "notification.copied.calldata": "נתוני השיחה הועתקו", - "notification.copied.contractAddress": "כתובת החוזה הועתקה", - "notification.copied.failed": "ההעתקה ללוח נכשלה", - "notification.copied.image": "התמונה הועתקה", - "notification.copied.linkUrl": "הקישור הועתק", - "notification.copied.nftUrl": "כתובת ה-NFT הועתקה", - "notification.copied.poolId": "מזהה הבריכה הועתק", - "notification.copied.tokenUrl": "כתובת האתר של אסימון הועתקה", - "notification.copied.transactionId": "מזהה העסקה הועתק", - "notification.copied.unitag": "שם המשתמש הועתק", - "notification.countryChange": "עבר ל- {{countryName}}", - "notification.limit.network": "יצירת הוראת לימיט ב- {{network}}", - "notification.lp.network": "מתן נזילות ב- {{network}}", - "notification.network.changed": "עבר ל- {{network}}", - "notification.passwordChanged": "סיסמא שונתה", - "notification.poolFinder.network": "חפש בריכה ב- {{network}}", - "notification.restore.success": "הארנק שוחזר!", - "notification.sell.network": "מוכר ב- {{network}}", - "notification.send.network": "שולח ב- {{network}}", - "notification.smartWallet.disabled": "מושבת ברשת אחת", - "notification.smartWallet.disabled.all": "ארנק חכם מושבת", - "notification.smartWallet.disabled.plural": "מושבת ברשתות {{amount}}", - "notification.spam.NFT.failed": "לא ניתן היה לדווח על NFT. נסה שוב מאוחר יותר.", - "notification.spam.NFT.successful": "דווח", - "notification.swap.network": "החלפה על {{network}}", - "notification.swap.pending.swap": "ההחלפה בהמתנה", - "notification.swap.pending.unwrap": "ביטול הגלישה בהמתנה", - "notification.swap.pending.wrap": "גלישה בהמתנה", - "notification.transaction.approve.canceled": "בוטלה {{currencySymbol}} לאשר.", - "notification.transaction.approve.fail": "נכשל אישור {{currencySymbol}} לשימוש עם {{address}}.", - "notification.transaction.approve.success": "אושר {{currencySymbol}} לשימוש עם {{address}}.", - "notification.transaction.pending": "העסקה בהמתנה", - "notification.transaction.swap.canceled": "ההחלפה של {{inputCurrencySymbol}}-{{outputCurrencySymbol}} בוטלה.", - "notification.transaction.swap.expired": "פג תוקף ההחלפה של {{inputCurrencyAmountWithSymbol}} עבור {{outputCurrencyAmountWithSymbol}} .", - "notification.transaction.swap.fail": "החלפת {{inputCurrencyAmountWithSymbol}} נכשלה ב- {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.swap.success": "החליף {{inputCurrencyAmountWithSymbol}} ל {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.transfer.canceled": "השליחה {{tokenNameOrAddress}} בוטלה", - "notification.transaction.transfer.fail": "שליחת {{tokenNameOrAddress}} אל {{walletNameOrAddress}}נכשלה", - "notification.transaction.transfer.received": "התקבל {{tokenNameOrAddress}} מ- {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "נשלח {{tokenNameOrAddress}} אל {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "ביצוע העסקה עם {{addressOrEnsName}}נכשל", - "notification.transaction.unknown.fail.short": "העסקה נכשלה", - "notification.transaction.unknown.success.full": "בוצעה עם {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "העסקה אושרה", - "notification.transaction.unwrap.canceled": "ביטול העטיפה של {{inputCurrencySymbol}} .", - "notification.transaction.unwrap.fail": "ביטול הגלימה של {{inputCurrencyAmountWithSymbol}}נכשל.", - "notification.transaction.unwrap.success": "פרש {{inputCurrencyAmountWithSymbol}} וקיבל {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.canceled": "עטיפת {{inputCurrencySymbol}} בוטלה.", - "notification.transaction.wrap.fail": "לעטוף {{inputCurrencyAmountWithSymbol}}נכשל.", - "notification.transaction.wrap.success": "עטפו {{inputCurrencyAmountWithSymbol}} וקיבלו {{outputCurrencyAmountWithSymbol}}.", - "notification.transfer.pending": "שלח בהמתנה", - "notification.walletConnect.confirmed": "העסקה אושרה עם {{dappName}}", - "notification.walletConnect.connected": "מְחוּבָּר", - "notification.walletConnect.disconnected": "מְנוּתָק", - "notification.walletConnect.failed": "העסקה נכשלה עם {{dappName}}", - "notification.walletConnect.networkChanged.full": "עבר ל- {{networkName}}", - "notification.walletConnect.networkChanged.short": "החליפו רשתות", - "notifications.scantastic.subtitle": "המשך ב-Uniswap Extension", - "notifications.scantastic.title": "הַצלָחָה!", - "onboarding.backup.manual.banner": "אנו מציעים לכתוב זאת על פיסת נייר ולאחסן אותו במקום מאובטח, כמו כספת.", - "onboarding.backup.manual.displayWarning.description": "קרא בעיון את הדברים הבאים לפני שתמשיך.", - "onboarding.backup.manual.displayWarning.note.access": "ביטוי שחזור זה נותן לך גישה מלאה לארנק ולכספים שלך", - "onboarding.backup.manual.displayWarning.note.secure": "הצג את זה בפרטי ואל תשתף את זה עם אף אחד", - "onboarding.backup.manual.displayWarning.note.storage": "רשום אותו ושמור אותו במקום בטוח", - "onboarding.backup.manual.displayWarning.title": "כמה דברים שחשוב לדעת", - "onboarding.backup.manual.error": "מילה לא חוקית או שגויה באיות", - "onboarding.backup.manual.placeholder": "מילה סודית", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} הושלם", - "onboarding.backup.manual.selectedWordPlaceholder": "בחר מילה", - "onboarding.backup.manual.subtitle_one": "מהי המילה {{count}}הראשונה במשפט ההתאוששות שלך?", - "onboarding.backup.manual.subtitle_two": "מהי המילה {{count}}בביטוי ההתאוששות שלך?", - "onboarding.backup.manual.subtitle_few": "מהי המילה {{count}}השנייה בביטוי ההתאוששות שלך?", - "onboarding.backup.manual.subtitle_other": "מהי המילה {{count}}בביטוי ההתאוששות שלך?", - "onboarding.backup.manual.title": "בוא נוודא שהקלטת את זה נכון", - "onboarding.backup.option.badge.quick": "מָהִיר", - "onboarding.backup.option.cloud.description": "גבה את הארנק שלך באמצעות {{cloudProviderName}}, מוגן באמצעות סיסמת שחזור.", - "onboarding.backup.option.cloud.title": "הגדר סיסמת שחזור", - "onboarding.backup.option.manual.description": "רשמו את 12 המילים הסודיות שלכם על פיסת נייר ואחסנו אותה במקום בטוח.", - "onboarding.backup.option.manual.title": "רשום את ביטוי ההתאוששות", - "onboarding.backup.reminder.backupNowButton": "גיבוי עכשיו", - "onboarding.backup.reminder.remindMeLaterButton": "תזכיר לי אחר כך", - "onboarding.backup.reminder.title": "גבה את הארנק שלך", - "onboarding.backup.reminder.warning.description": "גבה את הארנק שלך כדי שתוכל לשחזר את הנכסים שלך אם אי פעם תאבד את הטלפון שלך או תקבל אחד חדש.", - "onboarding.backup.reminder.warning.fundsLabel": "קרנות בסיכון", - "onboarding.backup.reminder.warning.title": "אתה עלול לאבד את הכספים שלך", - "onboarding.backup.speedBump.cloud.description": "אם אי פעם תשכח אותו, לא נוכל לאפס אותו עבורך. רשום אותו במקום בטוח או אחסן אותו בצורה מאובטחת במנהל סיסמאות.", - "onboarding.backup.speedBump.cloud.disclaimer": "אני מבין ש-Uniswap Labs לא יכולה לאפס את סיסמת השחזור שלי.", - "onboarding.backup.speedBump.cloud.title": "חשוב לשמור את הסיסמה הזו", - "onboarding.backup.speedBump.manual.description": "ודא שכתבת את משפט השחזור שלך כהלכה ושיש לך מקום בטוח לאחסון אותו.", - "onboarding.backup.speedBump.manual.disclaimer": "אני מבין ש-Uniswap Labs לא יכול לשחזר את הארנק שלי אם אני מאבד את זה.", - "onboarding.backup.speedBump.manual.title": "לפני שתסיים...", - "onboarding.backup.subtitle": "כך תשחזרו את הארנק אם תמחק את האפליקציה או תאבד את המכשיר.", - "onboarding.backup.title.existing": "גבה את הארנק שלך", - "onboarding.backup.title.new": "בחר את שיטת הגיבוי שלך", - "onboarding.backup.view.subtitle.message1": "קרא בעיון את הדברים הבאים לפני שתמשיך", - "onboarding.backup.view.subtitle.message2": "תצטרך להזין את כל 12 המילים הסודיות האלה כדי לשחזר את הארנק שלך.", - "onboarding.backup.view.title": "רשום את משפט ההתאוששות שלך", - "onboarding.backup.view.warning.message1": "ביטוי שחזור זה נותן לך גישה מלאה לארנק ולכספים שלך", - "onboarding.backup.view.warning.message2": "רשום אותו ושמור אותו במקום בטוח", - "onboarding.backup.view.warning.message3": "הצג את זה בפרטי ו אל תשתף את זה עם אף אחד", - "onboarding.cloud.confirm.description": "תצטרך להזין את זה כדי לשחזר את הכספים שלך. אם אי פעם תשכח אותו, לא נוכל לאחזר אותו עבורך.", - "onboarding.cloud.confirm.title": "אשר את סיסמת השחזור שלך", - "onboarding.cloud.createPassword.description": "תצטרך להזין את זה כדי לשחזר את הכספים שלך. אם אי פעם תשכח אותו, לא נוכל לאחזר אותו עבורך.", - "onboarding.cloud.createPassword.title": "צור את סיסמת השחזור שלך", - "onboarding.complete.button": "פתח את הרחבת Uniswap", - "onboarding.complete.description": "הארנק שלך מוכן לשלוח ולקבל קריפטו. פתח את הרחבת Uniswap עם קיצור הדרך למטה.", - "onboarding.complete.go_to_uniswap": "עבור אל Uniswap Web App", - "onboarding.complete.pin.description": "לחץ על סמל הסיכה כדי להוסיף את הרחבת Uniswap לסרגל הכלים שלך.", - "onboarding.complete.pin.title": "Pin Uniswap Extension", - "onboarding.complete.title": "אתה מוכן", - "onboarding.extension.biometrics.subtitle.fingerprint": "גישה מהירה ומאובטחת לארנק שלך באמצעות טביעת אצבע בלבד.", - "onboarding.extension.biometrics.title": "אפשר {{biometricsMethod}}", - "onboarding.extension.password.subtitle": "תצטרך את זה כדי לפתוח את הארנק שלך ולגשת לביטוי השחזור שלך", - "onboarding.extension.password.title.default": "צור סיסמה", - "onboarding.extension.password.title.reset": "לאפס את הסיסמה שלך", - "onboarding.extension.unsupported.android.description": "הרחבת Uniswap תואמת רק ל-Chrome במחשב שולחני.", - "onboarding.extension.unsupported.android.title": "Chrome בנייד אינו נתמך (עדיין)", - "onboarding.extension.unsupported.description": "הרחבת Uniswap תואמת רק ל-Chrome כרגע.", - "onboarding.extension.unsupported.title": "דפדפן זה אינו נתמך (עדיין)", - "onboarding.home.intro.backup.description.extension": "שמור את משפט השחזור שלך כדי להבטיח שלעולם לא תאבד גישה לארנק שלך.", - "onboarding.home.intro.backup.description.mobile": "הגדר תוכנית שחזור אם אי פעם תאבד את הטלפון שלך או תקבל אחד חדש.", - "onboarding.home.intro.backup.title": "גבה את הארנק שלך", - "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK ו-JUP - זמינים כעת ב-Unichain", - "onboarding.home.intro.bridgedAssets.title": "סחרו באסימונים חדשים ב-Unichain", - "onboarding.home.intro.fund.description": "ממן את הארנק שלך על ידי רכישת קריפטו או העברה מחשבון אחר.", - "onboarding.home.intro.fund.title": "קבל את האסימון הראשון שלך", - "onboarding.home.intro.label.required": "דָרוּשׁ", - "onboarding.home.intro.label.swipe": "לִגנוֹב", - "onboarding.home.intro.pushNotifications.description": "קבל התראות על מחירים על האסימונים המועדפים עליך, מגמות שוק ועוד.", - "onboarding.home.intro.pushNotifications.title": "הישאר בידע", - "onboarding.home.intro.unitag.description": "בנה פרופיל web3 מותאם אישית ושתף בקלות את הכתובת שלך עם חברים.", - "onboarding.home.intro.unitag.title": "תבע את שם המשתמש שלך {{unitagDomain}}", - "onboarding.import.error.invalidWords_one": "מילה אחת אינה חוקית או מאויתת שגויה", - "onboarding.import.error.invalidWords_other": "{{count}} מילים לא חוקיות או מאויתות שגוי", - "onboarding.import.method.restore.message.android": "הוסף ארנקים שגיבית לחשבון Google Drive שלך.", - "onboarding.import.method.restore.message.ios": "הוסף ארנקים שגיבית לחשבון iCloud שלך.", - "onboarding.import.method.restore.title": "שחזר ארנק", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.android": "הזן את סיסמת השחזור שלך כדי לשחזר את הארנק שלך באמצעות גיבוי Google Drive.", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.ios": "הזינו את סיסמת השחזור שלכם כדי לשחזר את הארנק שלכם באמצעות גיבוי iCloud.", - "onboarding.import.method.restoreSeedPhrase.cloud.title.android": "שחזר מ-Google Drive", - "onboarding.import.method.restoreSeedPhrase.cloud.title.ios": "שחזר מ-iCloud", - "onboarding.import.method.restoreSeedPhrase.title": "בחר כיצד לשחזר את הארנק שלך", - "onboarding.import.method.restoreSeedPhrase.wallet.desc": "הזינו את 12 המילים הסודיות שלכם שאחסנתם בעבר במקום בטוח.", - "onboarding.import.method.restoreSeedPhrase.wallet.title": "הזן ביטוי שחזור", - "onboarding.import.method.viewPrivateKeys.button.desc": "צפה במפתח הפרטי שלך", - "onboarding.import.method.viewPrivateKeys.title": "אין לך אף אחד מהאמור לעיל? ", - "onboarding.import.onDeviceRecovery.other_options": "צור או ייבא ארנק אחר", - "onboarding.import.onDeviceRecovery.other_options.label": "לא רוצה את כל האמור לעיל?", - "onboarding.import.onDeviceRecovery.subtitle": "בחר לאיזה ארנק אתה רוצה להיכנס חזרה.", - "onboarding.import.onDeviceRecovery.title": "ברוך הבא חזרה ל-Uniswap", - "onboarding.import.onDeviceRecovery.wallet.button": "הצג את ביטוי השחזור", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 ארנק נוסף", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} ארנקים אחרים", - "onboarding.import.onDeviceRecovery.warning.caption": "אנא ודא שגיבית את כל הארנקים האחרים. אם אי פעם תרצה לשחזר אותם, תזדקק לביטויי השחזור שלהם או לגיבויים תואמים של {{cloudProvider}} .", - "onboarding.import.onDeviceRecovery.warning.title": "האם אתה בטוח?", - "onboarding.import.selectMethod.errorMessage": "אירעה שגיאה בלתי צפויה. אנא נסה שוב.", - "onboarding.import.selectMethod.mobileApp.subtitle": "ייבא ארנק מהאפליקציה לנייד באמצעות קוד QR.", - "onboarding.import.selectMethod.mobileApp.title": "השתמש ב-Uniswap Mobile", - "onboarding.import.selectMethod.passkey.subtitle": "סנכרן את ארנק ה-Uniswap שלך באמצעות מפתח סיסמה קיים.", - "onboarding.import.selectMethod.passkey.title": "התחברות עם סיסמה", - "onboarding.import.selectMethod.recoveryPhrase.subtitle": "יבוא מארנק קריפטו אחר.", - "onboarding.import.selectMethod.recoveryPhrase.title": "הזן ביטוי שחזור", - "onboarding.import.selectMethod.title": "התחברות או ייבוא ארנק", - "onboarding.import.title": "בחר כיצד ברצונך להוסיף את הארנק שלך", - "onboarding.importMnemonic.button.default": "משפט ההחלמה שלי הוא 12 מילים", - "onboarding.importMnemonic.button.importing": "מייבא...", - "onboarding.importMnemonic.button.longPhrase": "ביטוי ההחלמה שלי ארוך יותר", - "onboarding.importMnemonic.error.invalidPhrase": "הביטוי שהזנת אינו חוקי", - "onboarding.importMnemonic.subtitle": "הקלד או הדבק את ביטוי השחזור שלך בן 12 מילים", - "onboarding.importMnemonic.title": "הזן את ביטוי השחזור שלך", - "onboarding.importPasskey.bringWindowToFront": "הביאו חלון לחזית", - "onboarding.importPasskey.continueInSecureWindow": "המשך בחלון הכניסה המאובטח.", - "onboarding.intro.button.alreadyHave": "יש לי כבר ארנק", - "onboarding.intro.button.logInOrImport": "התחברות או ייבוא", - "onboarding.intro.mobileScan.button": "סרוק קוד QR כדי לייבא", - "onboarding.intro.mobileScan.title": "יש לך את אפליקציית Uniswap?", - "onboarding.landing.button.add": "הוסף ארנק קיים", - "onboarding.landing.button.create": "צור ארנק", - "onboarding.landing.button.createAccount": "צור חשבון", - "onboarding.name.choose": "בחר שם משתמש", - "onboarding.name.choose.subtitle": "זהו שם ציבורי שכל אחד יכול להשתמש בו כדי לשלוח לך קריפטו.", - "onboarding.notification.permission.message": "כדי לקבל הודעות, הפעל הודעות עבור ארנק Uniswap בהגדרות המכשיר שלך.", - "onboarding.notification.permission.title": "הרשאת הודעות", - "onboarding.notification.subtitle": "הישאר מעודכן לגבי סטטוסים של עסקאות ושינויים גדולים במחירים עבור אסימונים מועדפים.", - "onboarding.notification.title": "הפעל התראות", - "onboarding.passkey.create": "צור את המפתח שלך", - "onboarding.passkey.loading.subtitle": "זה אמור לקחת רק שניה.", - "onboarding.passkey.loading.title": "מוצא את הארנק שלך...", - "onboarding.passkey.secure": "אבטח את חשבונך", - "onboarding.passkey.secure.description": "מפתחות סיסמה מאפשרים לך גישה מהירה ומאובטחת לחשבון שלך רק באמצעות הפנים או טביעת האצבע שלך.", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "בואו נאשר שהבנתם נכון. אם תאבד או תכתוב את זה בצורה שגויה, לא תוכל לשחזר את הכספים שלך.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "אם תאבד או תכתוב את זה בצורה שגויה, לא תוכל לשחזר את הכספים שלך.", - "onboarding.recoveryPhrase.confirm.title": "בואו נאשר שהבנתם נכון", - "onboarding.recoveryPhrase.view.subtitle": "תצטרך להזין את כל 12 המילים הסודיות האלה כדי לשחזר את הארנק שלך.", - "onboarding.recoveryPhrase.view.title": "רשום את משפט ההתאוששות שלך", - "onboarding.recoveryPhrase.view.title.hasPassword": "אם אי פעם תשכח את הסיסמה שלך...", - "onboarding.recoveryPhrase.warning.final.button": "אני מוכן", - "onboarding.recoveryPhrase.warning.final.message": "ביטוי ההחלמה שלך הוא מה שמעניק לך (ולכל מי שיש לו) גישה לכספים שלך. הקפד לשמור את זה לעצמך.", - "onboarding.recoveryPhrase.warning.final.title": "בצע את השלב הזה במקום פרטי", - "onboarding.recoveryPhrase.warning.screenshot.message": "כל מי שישיג גישה לתמונות שלך יכול לגשת לארנק שלך. אנו ממליצים לך לרשום את דבריך במקום זאת.", - "onboarding.recoveryPhrase.warning.screenshot.title": "צילומי מסך אינם מאובטחים", - "onboarding.resetPassword.complete.safety": "למידע נוסף על בטיחות בארנק", - "onboarding.resetPassword.complete.subtitle": "השתמש בסיסמה החדשה שלך כדי לפתוח את הארנק שלך.", - "onboarding.resetPassword.complete.title": "איפוס סיסמא", - "onboarding.scan.error": "אירעה שגיאה בטעינת קוד ה-QR", - "onboarding.scan.otp.error": "הקוד ששלחת שגוי, או שהייתה שגיאה בהגשה. בבקשה נסה שוב.", - "onboarding.scan.otp.failed": "ניסיונות כושלים: {{number}}", - "onboarding.scan.otp.subtitle": "בדוק באפליקציית Uniswap לנייד שלך את הקוד בן 6 התווים", - "onboarding.scan.otp.title": "הזן קוד חד פעמי", - "onboarding.scan.subtitle": "סרוק את קוד ה-QR עם אפליקציית Uniswap לנייד כדי להתחיל לייבא את הארנק שלך.", - "onboarding.scan.title": "ייבוא ארנק מהאפליקציה", - "onboarding.scan.troubleScanning.message": "ייבוא באמצעות ביטוי שחזור", - "onboarding.scan.troubleScanning.title": "בעיה בסריקה?", - "onboarding.scan.wifi": "חבר את הטלפון שלך לאותה רשת WiFi כמו המחשב שלך.", - "onboarding.security.alert.biometrics.message.android": "כדי להשתמש במידע ביומטרי, יש להגדיר אותו תחילה בהגדרות", - "onboarding.security.alert.biometrics.message.ios": "כדי להשתמש ב- {{biometricsMethod}}, אפשר גישה בהגדרות המערכת", - "onboarding.security.alert.biometrics.title.android": "ביומטריה מושבתת", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} מושבת", - "onboarding.security.button.confirm.android": "אפשר ביומטריה", - "onboarding.security.button.confirm.ios": "אפשר {{biometricsMethod}}", - "onboarding.security.button.setup": "להכין", - "onboarding.security.subtitle.android": "הוסף שכבת אבטחה נוספת על ידי דרישת ביומטריה לשליחת עסקאות.", - "onboarding.security.subtitle.ios": "הוסף שכבת אבטחה נוספת על ידי דרישת {{biometricsMethod}} לשלוח עסקאות.", - "onboarding.security.title": "הגן על הארנק שלך", - "onboarding.selectWallets.error": "לא ניתן לטעון כתובות", - "onboarding.selectWallets.title.default": "בחר ארנקים לייבא", - "onboarding.selectWallets.title.error": "שגיאה בייבוא ארנקים", - "onboarding.termsOfService": "על ידי המשך, אני מסכים ל תנאי השירות ומסכים ל מדיניות הפרטיות", - "onboarding.tooltip.recoveryPhrase.trigger": "מהו ביטוי התאוששות?", - "onboarding.wallet.continue": "בואו נשמור על זה בטוח", - "onboarding.wallet.defaultName": "ארנק {{number}}", - "onboarding.wallet.description.full": "זהו המרחב האישי שלך לאסימונים, NFTs וכל העסקאות שלך. סיים להגדיר אותו כדי לשמור על הכספים שלך בטוחים.", - "onboarding.wallet.title": "ברוכים הבאים לארנק החדש שלך", - "onboarding.welcome.subtitle": "בוא נסיים להגדיר את הארנק שלך.", - "onboarding.welcome.title": "קַבָּלַת פָּנִים!", - "outageBanner.message": "הנתונים של {{chainName}}{{versionDescription}} אינם זמינים כעת, אך אנו מצפים שהבעיה תיפתר בקרוב.", - "outageBanner.message.sub": "אתה עדיין יכול להחליף ולספק נזילות בשרשרת זו ללא בעיה.", - "outageBanner.title": "{{versionName}} יחזור בקרוב", - "passkeys.help.modal.subtitle": "אם אתה נתקל בבעיות עם מפתחות סיסמה, בקר בתמיכה של Uniswap לקבלת עזרה.", - "passkeys.help.modal.subtitle.invalidPasskey": "לא ניתן היה להשלים את בקשתך. אנא נסה שוב באמצעות מפתח סיסמה המשויך ל ", - "passkeys.help.modal.subtitle.technicalError": "לא ניתן היה להשלים את בקשתך עקב שגיאה טכנית בלתי צפויה. הכספים שלך בטוחים. אנא נסה שוב.", - "passkeys.help.modal.title": "זקוק לעזרה?", - "passkeys.help.modal.title.invalidPasskey": "מפתח סיסמה לא חוקי", - "passkeys.help.modal.title.technicalError": "טעות טכנית", - "passkeys.manage.modal.subtitle": "כדי להוסיף או להסיר מפתחות סיסמה, היכנס אל {{passkeyManagementUrl}}.", - "passkeys.manage.modal.title": "נהל סיסמאות", - "permit.approval.fail": "אישור ההיתר נכשל", - "permit.approval.fail.message": "Permit2 מאפשר שיתוף וניהול של אישורי אסימונים בין יישומים שונים.", - "pool.activeRange": "טווח קרציות פעיל", - "pool.addAs": "הוסף בתור {{nativeWrappedSymbol}}", - "pool.apr": "אפריל", - "pool.apr.base": "אפריל בסיס", - "pool.apr.description": "שנתי על בסיס עמלות של יום אחד", - "pool.apr.reward": "אפר תגמול", - "pool.aprText": "אפריל בריכה", - "pool.balances": "יתרות בריכה", - "pool.closedCTA.description": "אתה יכול לראות אותם באמצעות המסנן בראש העמוד.", - "pool.closedCTA.title": "מחפש את התפקידים הסגורים שלך?", - "pool.collectAs": "איסוף בתור {{nativeWrappedSymbol}}", - "pool.collectFees": "גביית עמלות", - "pool.connectEthereumToView": "חבר ארנק Ethereum כדי לצפות במאגרי המידע שלך", - "pool.create": "יצירת בריכה חדשה", - "pool.create.info": "הבחירות שלך ייצרו מאגר נזילות חדש שעלול לגרום לנזילות ראשונית נמוכה יותר ולתנודתיות מוגברת. שקול להוסיף למאגר קיים כדי למזער סיכונים אלו.", - "pool.createdPosition": "עמדה נוצרה", - "pool.createdPosition.canceled": "יצירת המיקום בוטלה", - "pool.createdPosition.failed": "יצירת המיקום נכשלה", - "pool.dynamic": "בריכה דינמית", - "pool.earnings": "רווחים", - "pool.earnings.empty": "אין לך עדיין רווחים", - "pool.explorers": "חוקרים", - "pool.import": "בריכת ייבוא", - "pool.import.link.description": "מיקומי v2 מסוימים אינם מוצגים באופן אוטומטי.", - "pool.import.positions.v2": "ייבוא עמדות V2", - "pool.import.positions.v2.selectPair.description": "מיקומי v2 מסוימים אינם מוצגים באופן אוטומטי. בחר זוג אסימונים כדי לייבא ולהציג את המיקומים שלך.", - "pool.import.success": "בריכה מיובאת", - "pool.incentives.administeredRewards": "התגמולים מחולקים על ידי החוזה האוטונומי של Merkl Distributor.", - "pool.incentives.collect": "לאסוף", - "pool.incentives.collectedRewards": "אספו פרסים", - "pool.incentives.collectFailed": "האיסוף נכשל, אנא נסה שוב.", - "pool.incentives.collectFailedNoRetry": "איסוף הפרסים נכשל.", - "pool.incentives.collectingRewards": "איסוף פרסים", - "pool.incentives.collectRewards": "אסוף פרסים", - "pool.incentives.collectRewardsCanceled": "איסוף תגמולים בוטל", - "pool.incentives.daysLeft": "ימים שנותרו", - "pool.incentives.eligible": "למאגרים הכשירים יש תגמולים סמליים כדי שתוכל להרוויח יותר", - "pool.incentives.merklDocs": "מחושב על ידי Merkl מתגמולי פליטה ומאגר TVL.", - "pool.incentives.rewardsDistribution": "חלוקת תגמולים", - "pool.incentives.rewardsEarned": "פרסים שנצברו", - "pool.incentives.similarPoolHasRewards": "למאגר דומה יש תגמולים של UNI", - "pool.incentives.switchPools": "להחליף בריכות", - "pool.incentives.timePeriod": "פרק זמן", - "pool.incentives.uni.findMore": "מצא בריכות עם תגמולים של UNI", - "pool.incentives.yourRewards.error": "התגמולים שלך אינם זמינים כעת", - "pool.incentives.yourRewards.error.description": "לא ניתן היה לאחזר את הפרסים. ייתכן שזה נובע מבעיית רשת. נסה לטעון מחדש את העמוד.", - "pool.info": "מידע על הבריכה", - "pool.limitFluctuation.warning": "אנא שים לב שהביצוע עבור מגבלות עשוי להשתנות בהתאם לתנודות השוק בזמן אמת וגודש ברשת Ethereum. ייתכן שהמגבלות לא יפעלו בדיוק כאשר האסימונים מגיעים למחיר שצוין.", - "pool.liquidity.data.error.message": "אירעה שגיאה באחזור הנתונים הנדרשים עבור העסקה שלך.", - "pool.liquidity.outOfSync": "אי התאמה של מחירי הבריכה והשוק", - "pool.liquidity.outOfSync.message": "המחירים במאגר זה שונים ממחירי השוק של האסימונים הנבחרים. התאם את טווח המחירים שלך בהתאם או המתן עד שהבריכה תתאזן מחדש כדי למנוע הפסדים.", - "pool.maxPrice": "מחיר מקסימלי", - "pool.migrateLiquidity": "העברת נזילות", - "pool.migrateLiquidityDisabledTooltip": "שרשרת זו אינה תומכת במאגרי נזילות v4.", - "pool.migrateToV4": "העבר ל-v4", - "pool.minPrice": "מחיר מינימלי", - "pool.newPosition.plus": "+ תפקיד חדש", - "pool.newPosition.title": "תפקיד חדש", - "pool.newSpecificPosition": "עמדה חדשה של {{symbol}}", - "pool.notAvailableOnSolana": "בריכות אינן זמינות בסולאנה", - "pool.notFound.description": "מצטערים, איננו יכולים למצוא מידע על הבריכה הזו. בדוק את השם והכתובת ונסה שוב.", - "pool.notFound.title": "בריכה לא נמצאה", - "pool.openToStart.evmAndSolanaConnected": "פתח משרה חדשה או צור מאגר כדי להתחיל. מאגרים אינם זמינים בסולנה.", - "pool.openToStart.evmOnly": "פתח עמדה חדשה או צור מאגר כדי להתחיל.", - "pool.percent": "{{pct}}% מאגר", - "pool.pooled": "מאוחד {{sym}}:", - "pool.position": "מַצָב", - "pool.positions": "עמדות", - "pool.positions.title": "העמדות שלך", - "pool.positions.transaction.settings": "הגדרות עסקה", - "pool.positions.usdValueUnavailable": "ערך דולר ארה\"ב אינו זמין", - "pool.positions.usdValueUnavailable.tooltip": "ערך דולר ארה\"ב אינו זמין כעת עבור עמדה זו. ראה פרטי עמדה עבור סכומי אסימון שהופקדו.", - "pool.refresh.prices": "רענון מחירים", - "pool.removeLiquidity": "להסיר נזילות", - "pool.rewardAPR": "תגמול אפריל (UNI)", - "pool.rewardAPR.percent": "{{pct}} אפריל פרס", - "pool.rewards": "תגמולים", - "pool.rewardsPool.label": "אסימוני בריכה במאגר התגמולים:", - "pool.selectPair": "בחר זוג", - "pool.share.label": "נתח הבריכה שלך:", - "pool.specificPosition": "מיקום {{symbol}}", - "pool.tokenPair": "זוג אסימונים", - "pool.top.rewards": "בריכות עם פרסים", - "pool.top.tvl": "בריכות מובילות של TVL", - "pool.top.volume": "בריכות לפי נפח של 24 שעות", - "pool.totalAPR": "סה\"כ אפריל", - "pool.totalTokens": "סך כל אסימוני הבריכה שלך:", - "pool.v2": "v2 בריכות", - "pool.v3": "v3 בריכות", - "pool.via": "{{tokenPair}} דרך {{dex}}", - "pool.volOverTvl": "1D vol/TVL", - "pool.volume.thirtyDay": "נפח 30 יום", - "pool.volume.thirtyDay.short": "כרך 30D", - "pool.withdrawAs": "משיכה בתור {{nativeWrappedSymbol}}", - "poolFinder.availablePools": "בריכות זמינות", - "poolFinder.availablePools.found.description": "בריכות v2 התואמות את בחירת הזוגות שלך.", - "poolFinder.availablePools.notFound.description": "לא נמצאו בריכות תואמות של v2. בדוק שוב את בחירת האסימון שלך וודא שאתה מחובר לארנק הנכון.", - "pools.explore": "חקור בריכות", - "portfolio.activity.filters.timePeriod.all": "כל הזמן", - "portfolio.activity.filters.transactionType.all": "כל הסוגים", - "portfolio.activity.filters.transactionType.deposits": "פיקדונות", - "portfolio.activity.filters.transactionType.staking": "הימור", - "portfolio.activity.filters.transactionType.swaps": "החלפות", - "portfolio.activity.title": "פעילות", - "portfolio.connectWallet.summary": "מעקב אחר אסימונים, מאגרי מידע ועוד ברשתות {{amount}}+", - "portfolio.defi.title": "DeFi", - "portfolio.description": "עקוב אחר תיק הקריפטו שלך בכל הרשתות והפרוטוקולים", - "portfolio.nfts.title": "NFTs", - "portfolio.overview.title": "סקירה כללית", - "portfolio.title": "תִיק", - "portfolio.tokens.table.column.allocation": "הַקצָאָה", - "portfolio.tokens.table.column.balance": "איזון", - "portfolio.tokens.table.column.change1d": "שינוי חד-ממדי", - "portfolio.tokens.table.column.price": "מחיר", - "portfolio.tokens.table.column.token": "אֲסִימוֹן", - "portfolio.tokens.table.column.value": "עֵרֶך", - "portfolio.tokens.title": "אסימונים", - "position.addHook": "הוסף הוק", - "position.addHook.tooltip": "הוקס הם תכונה מתקדמת המאפשרת לבריכות לקיים אינטראקציה עם חוזים חכמים, ולפתוח יכולות שונות. היזהר בעת הוספת ווים, מכיוון שחלקם עלולים להיות זדוניים או לגרום לתוצאות לא רצויות.", - "position.addingHook": "הוספת וו", - "position.addingHook.disclaimer": "להוספת ווים עלולה להיות השלכות לא מכוונות. עשה את המחקר שלך והמשיך באחריותך בלבד.", - "position.addingHook.hideProperties": "הסתר מאפיינים", - "position.addingHook.invalidAddress": "הזן כתובת הוק חוקית", - "position.addingHook.viewProperties": "הצג נכסים", - "position.create.confirm": "אשר מיקום", - "position.create.invalidPrice": "מחיר לא חוקי", - "position.create.invalidRange": "טווח לא חוקי", - "position.create.modal.header": "יצירת עמדה", - "position.create.unsupportedSolana": "בריכות סולאנה אינן נתמכות.", - "position.create.unsupportedSolana.description": "כדי ליצור מאגר, עבור לשרשרת EVM נתמכת.", - "position.create.unsupportedToken.description": "נסה ליצור עם גרסת פרוטוקול שונה.", - "position.create.v2unsupportedChain": "שרשרת זו אינה נתמכת עבור מאגרי v2.", - "position.currentValue": "ערך המיקום הנוכחי", - "position.default_price_strategies": "אסטרטגיות מחיר", - "position.default_price_strategies.error": "לא ניתן לקבוע אסטרטגיית תמחור", - "position.deposit.confirm.create.description.less": "המחיר הראשוני שהוזן הוא {{value}}% פחות ממחיר השוק ועלול לגרום לאובדן כספים. האם ברצונך להמשיך?", - "position.deposit.confirm.create.description.more": "המחיר הראשוני שהוזן הוא {{value}}% יותר ממחיר השוק ועלול לגרום לאובדן כספים. האם ברצונך להמשיך?", - "position.deposit.confirm.create.title": "פער מחירים גדול עם השוק", - "position.deposit.description": "ציין את הסכומים הסמליים עבור תרומת הנזילות שלך.", - "position.depositedCurrency": "הופקד {{currencySymbol}}", - "position.fot.warning": "{{token}} ואסימוני \"עמלה על העברה\" אחרים נתמכים רק על ידי Uniswap v2.", - "position.fot.warning.cta": "צור מיקום v2", - "position.hook.disclaimer": "אני מבין את הסיכונים הפוטנציאליים הכרוכים בהוספת הקרס הזה.", - "position.hook.donateWarning": "דגל זה עשוי לגרום לשינויים בעמלות שנצברו.", - "position.hook.liquidityWarning": "דגל זה יכול לגרום למאגר לחסום הוספת נזילות חדשה. העסקה שלך עשויה לחזור.", - "position.hook.removeWarning": "עלול לגרום לנעילה של הכספים שלך או לחסום אותך מגביית עמלות.", - "position.hook.swapWarning": "דגל זה עשוי לאפשר לספקי נזילות למנף ביתר קלות את נזילות Just-In-Time, מה שעלול לגרום לעמלות נמוכות יותר.", - "position.hook.warningHeader": "חשוב: זוהו סיכוני קרס", - "position.hook.warningInfo": "זיהינו סיכונים פוטנציאליים עם הקרס הזה. אנא ודא שאתה מבין כיצד הוו הזה עובד לפני שתחליט להמשיך.", - "position.increase.fot": "הוספת נזילות עבור {{token}} ואסימוני \"עמלה על העברה\" אחרים אינה נתמכת.", - "position.initialPrice": "מחיר התחלתי", - "position.initialPrice.difference.negative": "{{ value }}% פחות ממחיר השוק", - "position.initialPrice.difference.positive": "{{ value }}% יותר ממחיר השוק", - "position.initialPrice.info": "בעת יצירת מאגר חדש, עליך להגדיר את שער החליפין ההתחלתי עבור שני האסימונים. שיעור זה ישקף את מחיר השוק הראשוני.", - "position.initialPrice.set": "קבע מחיר התחלתי", - "position.initialPrice.useMarketPrice": "השתמש במחיר השוק", - "position.migrate.liquidity": "בעת העברת עמדות, אינך יכול לשנות את צמד האסימונים שלך, אך אתה יכול להוסיף וו כדי לשפר את הפונקציונליות.", - "position.migrate.v4unsupportedChain": "שרשרת זו אינה נתמכת עבור בריכות v4.", - "position.new": "תפקיד חדש", - "position.new.protocol": "עמדה חדשה של {{protocol}}", - "position.notFound": "המיקום לא נמצא", - "position.notFound.description": "פרטים על תפקיד זה אינם זמינים. אנא בדוק שאתה מחובר עם הארנק הנכון.", - "position.one_sided_lower": "תחתון חד צדדי", - "position.one_sided_lower.description": "אספקת נזילות אם המחיר יורד", - "position.one_sided_upper": "חלק עליון חד צדדי", - "position.one_sided_upper.description": "אספקת נזילות אם המחיר יעלה", - "position.protocol": "מיקום {{protocol}}", - "position.provide.liquidity": "בחר את האסימונים שברצונך לספק עבורם נזילות. אתה יכול לבחור אסימונים בכל הרשתות הנתמכות.", - "position.provide.liquidityDescription": "אספקת נזילות בטווח מלא מבטיחה השתתפות מתמשכת בשוק בכל המחירים האפשריים, ומציעה פשטות אך עם פוטנציאל להפסד בלתי קבוע גבוה יותר.", - "position.provide.liquidityDescription.creatingPool": "הגדרת נזילות בטווח מלא בעת יצירת מאגר מבטיחה השתתפות מתמשכת בשוק בכל המחירים האפשריים, ומציעה פשטות אך עם פוטנציאל להפסד בלתי-נצחי גבוה יותר.", - "position.provide.liquidityDescription.custom": "טווח מותאם אישית מאפשר לך לרכז את הנזילות שלך בגבולות מחיר ספציפיים, תוך שיפור יעילות ההון ורווחי עמלות אך דורש ניהול אקטיבי יותר.", - "position.provide.outOfRange.closePosition": "עמדה סגורה", - "position.provide.outOfRange.description": "לא ניתן לכוונן את הטווח של מיקום זה במהלך ההעברה. כדי להגדיר טווח חדש, סגור מיקום זה ופתח מיקום v4 חדש.", - "position.provide.outOfRange.title": "אתה מעביר עמדה מחוץ לטווח", - "position.removeHook": "הסר וו", - "position.resetDescription": "בחירת האסימונים, המחיר והטווח שלך יאופסו.", - "position.setRange": "קבע טווח מחירים", - "position.setRange.inputsBelow": "השתמש בכניסות למטה כדי להגדיר את הטווח שלך.", - "position.stable": "יַצִיב", - "position.stable.description": "טוב למטבעות יציבים או זוגות של מטבעות בעלי תנודתיות נמוכה", - "position.step.deposit": "הזן סכומי הפקדה", - "position.step.price": "קבע מחיר ראשוני וסכומי הפקדה", - "position.step.range": "הגדר טווח מחירים וסכומי הפקדה", - "position.step.select": "בחר זוג אסימונים ועמלות", - "position.value": "ערך מיקום", - "position.valueUnavailable": "ערך דולר ארה\"ב אינו זמין כעת עבור עמדה זו. ראה פרטי עמדה עבור סכומי אסימון שהופקדו.", - "position.wide": "רָחָב", - "position.wide.description": "טוב לזוגות תנודתיים", - "position.wrapped.unwrap": "פתח את ה- {{wrappedToken}}", - "position.wrapped.warning": "{{nativeToken}} נדרש עבור בריכות v4", - "position.wrapped.warning.info": "פתח את ה- {{wrappedToken}} שלך והפקד {{nativeToken}} כדי לספק נזילות חסכונית ויעילה יותר.", - "positions.noPositions.description": "אין לך פוזיציות נזילות. צור פוזיציה חדשה כדי להתחיל להרוויח עמלות ותגמולים על מאגרי הון זכאים.", - "positions.noPositions.title": "אין עמדות", - "positions.welcome.connect.description": "כדי לצפות בעמדות ובתגמולים שלך, עליך לחבר את הארנק שלך.", - "positions.welcome.connect.wallet": "חבר את הארנק שלך", - "privacy.anonymizedLogs": "האפליקציה רושם סטטיסטיקות שימוש אנונימיות על מנת להשתפר עם הזמן.", - "privacy.autoRouter": "האפליקציה שואבת את נתיב הסחר האופטימלי משרת Uniswap Labs.", - "privacy.infura": "האפליקציה שואבת נתונים על השרשרת ובונה שיחות חוזה עם Infura API.", - "privacy.thirdPartyApis": "אפליקציה זו משתמשת בממשקי ה-API של צד שלישי הבאים:", - "privacy.trm": "האפליקציה אוספת בצורה מאובטחת את כתובת הארנק שלך ומשתפת אותה עם TRM Labs Inc. מסיבות סיכון ותאימות.", - "privacy.uniswaptos": "התנאים וההגבלות של Uniswap Labs", - "privateKeys.export.modal.speedbump.bullet1": "הצג את זה בפרטי", - "privateKeys.export.modal.speedbump.bullet2": "אל תשתף עם אף אחד", - "privateKeys.export.modal.speedbump.bullet3": "לעולם אל תזין אותו לאתרים או אפליקציות כלשהן", - "privateKeys.export.modal.speedbump.subtitle": "כל מי שיודע את המפתח הפרטי שלך יכול לגשת לארנק ולכספים שלך.", - "privateKeys.export.modal.speedbump.title": "לפני שתמשיך", - "privateKeys.export.modal.subtitle": "נראה שאינך מצליח לשחזר את הארנק שלך במלואו. כדי לוודא שלעולם לא תאבד גישה לכספים שלך, העתק את המפתח הפרטי שלך.", - "privateKeys.export.modal.title": "ייצוא המפתח הפרטי שלך", - "privateKeys.export.modal.warning": "אם תאבד את הטלפון שלך או תמחק את האפליקציה, תצטרך לייבא את המפתח הזה לארנק אחר.", - "privateKeys.view.button.continue": "העתקתי את כולם.", - "privateKeys.view.button.continue.single": "העתקתי את זה.", - "privateKeys.view.subtitle": "המפתח הפרטי שלך מעניק גישה לארנק ספציפי. לכל ארנק יש מפתח פרטי שונה.", - "privateKeys.view.title": "מפתח פרטי", - "qrScanner.button.connections_one": "אפליקציה אחת מחוברת", - "qrScanner.button.connections_other": "{{count}} אפליקציות מחוברות", - "qrScanner.error.camera.message": "כדי לסרוק קוד, אפשר גישה למצלמה בהגדרות המערכת", - "qrScanner.error.camera.title": "המצלמה מושבתת", - "qrScanner.error.none": "לא נמצא קוד QR", - "qrScanner.recipient.action.scan": "סרוק קוד QR", - "qrScanner.recipient.action.show": "הצג את קוד ה-QR שלי", - "qrScanner.recipient.error.message": "ודא שאתה סורק קוד QR חוקי של כתובת Ethereum לפני שתנסה שוב.", - "qrScanner.recipient.error.title": "קוד QR לא חוקי", - "qrScanner.request.message.unavailable": "לא נמצאה הודעה.", - "qrScanner.request.method.default": "בקשה מאת {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "בקשת חתימה מאת {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "בקשת עסקה מ- {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "לאפשר ל {{dappName}} להשתמש עד {{amount}} {{currencySymbol}}?", - "qrScanner.request.withoutAmount": "לאפשר ל-{{dappName}} להשתמש ב-{{currencySymbol}} שלך?", - "qrScanner.status.connecting": "מְקַשֵׁר...", - "qrScanner.status.loading": "טוען...", - "qrScanner.title": "סרוק קוד QR", - "qrScanner.wallet.networks": "רשתות נתמכות", - "range.outOfView": "טווח מחוץ לטווח הראייה", - "removeLiquidity.pooled": "מאוחד {{symbol}}:", - "revoke.failed.message": "סביר להניח שבעיית רשת או חיבור גרמה לכשל בביטול. בדוק את החיבור ונסה שוב.", - "routing.aggregateLiquidity": "כאשר זמין, צובר מקורות נזילות למחירים טובים יותר והחלפות ללא גז.", - "routing.aggregateLiquidity.uniswapx": "UniswapX אוגדת מקורות נזילות בתוך ומחוץ לשרשרת, ומביאה לכם את המחירים הטובים ביותר הזמינים ואת עסקאות ה-Swap ללא גז.", - "routing.cheapest": "לקוח Uniswap בוחר את אפשרות הסחר הזולה ביותר תוך התחשבות במחיר ועלויות רשת.", - "routing.cheapest.v4": "לקוח Uniswap בוחר את אפשרות הסחר האופטימלית תוך התחשבות במחיר ועלויות הרשת.", - "scantastic.code.expired": "לא בתוקף", - "scantastic.code.subtitle": "הזן קוד זה בתוסף Uniswap. ביטוי השחזור שלך יוצפן ויועבר בבטחה.", - "scantastic.code.timeRemaining.shorthand.hours": "קוד חדש ב- {{hours}}h {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.minutes": "קוד חדש ב- {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.seconds": "קוד חדש ב- {{seconds}}ש'", - "scantastic.code.title": "ביטול החלפה של קוד חד פעמי", - "scantastic.confirmation.button.continue": "כן, המשך", - "scantastic.confirmation.label.browser": "דפדפן", - "scantastic.confirmation.label.device": "התקן", - "scantastic.confirmation.subtitle": "המשך רק אם אתה סורק קוד QR מ-Uniswap Extension במכשיר מהימן.", - "scantastic.confirmation.title": "האם אתה מנסה לייבא את הארנק שלך?", - "scantastic.confirmation.warning": "היזהרו מאתרים ואפליקציות המתחזות ל-Uniswap. אחרת הארנק שלך עלול להיפגע.", - "scantastic.error.encryption": "הכנת ביטוי הזרע נכשל.", - "scantastic.error.noCode": "לא התקבל OTP. בבקשה נסה שוב.", - "scantastic.error.timeout.message": "סרוק שוב את קוד ה-QR בתוסף Uniswap כדי להמשיך לסנכרן את הארנק שלך.", - "scantastic.error.timeout.title": "תם הזמן הקצוב לחיבור שלך", - "scantastic.modal.ipMismatch.description": "כדי לסרוק את קוד ה-QR הזה, הטלפון שלך חייב להיות מחובר לאותה רשת WiFi כמו המחשב שלך וכל VPN צריך להיות כבוי זמנית.", - "scantastic.modal.ipMismatch.title": "החלף את רשת ה-WiFi שלך", - "search.input.placeholder": "חפש אסימונים ובריכות", - "search.ukDisclaimer": "כתב ויתור לתושבי בריטניה", - "send.button.review": "סקור העברה", - "send.gas.error.title": "לא", - "send.gas.networkCost.title": "עלות רשת", - "send.input.token.balance.title": "יתרה: {{balance}} {{symbol}}", - "send.recipient.header": "בחר נמען", - "send.recipient.input.placeholder": "חפש ENS או כתובת", - "send.recipient.previous_one": "העברה קודמת אחת", - "send.recipient.previous_other": "{{count}} העברות קודמות", - "send.recipient.results.empty": "לא נמצאו תוצאות", - "send.recipient.results.error": "הכתובת שהקלדת לא קיימת או מאויתת בצורה שגויה.", - "send.recipient.section.favorite": "ארנקים אהובים", - "send.recipient.section.recent": "לאחרונה", - "send.recipient.section.search": "תוצאות חיפוש", - "send.recipient.section.viewOnly": "ארנקים לצפייה בלבד", - "send.recipient.section.yours": "הארנקים שלך", - "send.recipient.warning.viewOnly.message": "שלח כספים לארנק זה רק אם יש לך את משפט השחזור או שאתה מכיר את הבעלים של הארנק.", - "send.recipient.warning.viewOnly.title": "יש לך את זה בתור ארנק לצפייה בלבד", - "send.recipientSelect.search.empty.message": "כאשר אתה שולח אסימונים לכתובת ארנק, הם יופיעו כאן", - "send.recipientSelect.search.empty.title": "לא נשמרו ארנקים", - "send.review.modal.title": "אתה שולח", - "send.review.summary.button.title": "אשר את השליחה", - "send.search.empty.subtitle": "הכתובת שהקלדת לא קיימת או מאויתת בצורה שגויה.", - "send.search.empty.title": "לא נמצאו תוצאות", - "send.search.placeholder": "חפש ENS או כתובת", - "send.solanaSendNotSupported": "שליחה אינה נתמכת בסולנה", - "send.title": "לִשְׁלוֹחַ", - "send.unavailableOnSolana.message": "שליחה אינה זמינה בארנקי סולאנה", - "send.warning.blocked.default": "הארנק הזה חסום", - "send.warning.blocked.modal.message": "כתובת זו חסומה בארנק Uniswap מכיוון שהיא משויכת לפעילות חסומה אחת או יותר. אם אתה סבור שזו שגיאה, אנא שלח דוא\"ל ל compliance@uniswap.org.", - "send.warning.blocked.modal.title": "כתובת חסומה", - "send.warning.blocked.recipient": "ארנק הנמען חסום", - "send.warning.erc20.checkbox.description": "אתה מנסה לשלוח כספים לכתובת סמלית. זה עלול לגרום לאובדן קבוע של כספים.", - "send.warning.erc20.checkbox.heading": "זוהתה כתובת אסימון", - "send.warning.erc20.message": "אתה מנסה לשלוח כספים לכתובת סמלית. שליחת קריפטו לכתובת מסוג זה עלולה לגרום לאובדן כסף קבוע.", - "send.warning.erc20.title": "זוהי כתובת סמלית", - "send.warning.insufficientFunds.message": "יתרת ה- {{currencySymbol}} שלך ירדה מאז שהזנת את הסכום שברצונך לשלוח", - "send.warning.insufficientFunds.title": "לא מספיק {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "לא מספיק {{currencySymbol}} ב- {{networkName}} כדי לשלוח", - "send.warning.insufficientGas.message.withoutNetwork": "לא מספיק {{currencySymbol}} כדי לשלוח", - "send.warning.modal.button.cta.blocking": "בסדר", - "send.warning.modal.button.cta.cancel": "לְבַטֵל", - "send.warning.modal.button.cta.confirm": "לְאַשֵׁר", - "send.warning.newAddress.details.ENS": "ENS", - "send.warning.newAddress.details.username": "שם משתמש", - "send.warning.newAddress.details.walletAddress": "כתובת ארנק", - "send.warning.newAddress.message": "לא ביצעת עסקה עם כתובת זו בעבר. אנא אשר שהכתובת נכונה לפני שתמשיך.", - "send.warning.newAddress.title": "כתובת חדשה", - "send.warning.self.message": "אתה מנסה לשלוח כספים לארנק הנוכחי שלך. שליחת קריפטו לכתובת זו תגרור עלויות רשת מיותרות.", - "send.warning.self.title": "זה הארנק הנוכחי שלך", - "send.warning.smartContract.message": "אתה עומד לשלוח כספים לכתובת חוזה חכמה. ודא שזו הכתובת הנכונה ושהיא יכולה לקבל אסימונים. אם לא, זה עלול לגרום לאובדן קבוע של כספים.", - "send.warning.smartContract.title": "זוהי כתובת חוזה חכמה", - "send.warning.viewOnly.message": "עליך לייבא את הארנק הזה באמצעות ביטוי שחזור כדי לשלוח נכסים.", - "send.warning.viewOnly.title": "הארנק הזה הוא לצפייה בלבד", - "send.youAreSending": "אתה שולח", - "sendRecipientForm.recentAddresses.label": "אחרונים", - "sendReviewModal.title": "שלח ביקורת", - "setting.recoveryPhrase.account.show": "הצג ביטוי שחזור", - "setting.recoveryPhrase.action.hide": "הסתר ביטוי שחזור", - "setting.recoveryPhrase.remove": "הסר את ביטוי השחזור", - "setting.recoveryPhrase.remove.confirm.subtitle": "אני מבין ש-Uniswap Labs לא יכולה לעזור לי לשחזר את הארנק שלי אם לא הצלחתי לעשות זאת.", - "setting.recoveryPhrase.remove.confirm.title": "שמרתי את משפט ההתאוששות שלי", - "setting.recoveryPhrase.remove.initial.subtitle": "ודא ששמרת את ביטוי השחזור שלך. אחרת תאבד גישה לארנקים שלך", - "setting.recoveryPhrase.remove.initial.title": "לפני שתמשיך", - "setting.recoveryPhrase.remove.subtitle": "הזן את הסיסמה שלך כדי לאשר", - "setting.recoveryPhrase.remove.title": "אתה מסיר את ביטוי השחזור שלך", - "setting.recoveryPhrase.view.warning.message1": "כל מי שמכיר את ביטוי השחזור שלך יכול לגשת לארנק ולכספים שלך", - "setting.recoveryPhrase.view.warning.message2": "הצג את זה בפרטי", - "setting.recoveryPhrase.view.warning.message3": "אל תשתף עם אף אחד", - "setting.recoveryPhrase.view.warning.message4": "לעולם אל תזין אותו לאתרים או אפליקציות כלשהן", - "setting.recoveryPhrase.view.warning.title": "לפני שתמשיך", - "setting.recoveryPhrase.warning.view.message": "כל מי שמכיר את ביטוי השחזור שלך יכול לגשת לארנק ולכספים שלך.", - "setting.recoveryPhrase.warning.view.title": "הצג את זה במקום פרטי", - "settings.action.enableInSettings": "הפעל בהגדרות", - "settings.action.feedback": "שלח משוב", - "settings.action.help": "תקבל עזרה", - "settings.action.lock": "מנעול ארנק", - "settings.action.privacy": "מדיניות הפרטיות", - "settings.action.terms": "תנאי השירות", - "settings.connectWalletPlatform.warning": "כדי להשתמש ב-Uniswap ב- {{platform}}, התחבר לארנק שתומך ב- {{platform}}.", - "settings.footer": "מיוצר באהבה, \nצוות Uniswap 🦄", - "settings.hideSmallBalances": "הסתר יתרות קטנות", - "settings.hideSmallBalances.subtitle": "יתרות מתחת ל-1 USD יוסתרו מהתיק שלך.", - "settings.maxSlippage": "מקסימום החלקה", - "settings.maxSlippage.amount": "{{amount}} החלקה מקסימלית", - "settings.section.about": "על אודות", - "settings.section.preferences": "העדפות", - "settings.section.privacyAndSecurity": "פרטיות ואבטחה", - "settings.section.support": "תמיכה", - "settings.section.wallet.hidden.row.title": "{{numHidden}} ארנקים אחרים", - "settings.setting.advanced.title": "מִתקַדֵם", - "settings.setting.advancedSettings": "Advanced settings", - "settings.setting.appearance.option.auto": "אוטומטי", - "settings.setting.appearance.option.dark.subtitle": "השתמש תמיד בערכת נושא כהה.", - "settings.setting.appearance.option.dark.title": "כֵּהֶה", - "settings.setting.appearance.option.device.subtitle": "מתאים להגדרות המכשיר שלך.", - "settings.setting.appearance.option.device.title": "אוטומטי", - "settings.setting.appearance.option.light.subtitle": "השתמש תמיד בערכת נושא קלה.", - "settings.setting.appearance.option.light.title": "אוֹר", - "settings.setting.appearance.title": "נושא", - "settings.setting.backup.create.description": "הגדרת סיסמה תצפין את גיבוי ביטוי השחזור שלך, ותוסיף רמת הגנה נוספת אם חשבון {{cloudProviderName}} שלך ייפגע אי פעם.", - "settings.setting.backup.create.title": "גבה עד {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "מכיוון שהארנקים האלה חולקים ביטוי שחזור, הוא גם ימחק את הגיבויים של הארנקים האלה למטה", - "settings.setting.backup.delete.confirm.title": "האם אתה בטוח?", - "settings.setting.backup.delete.warning": "אם תמחק את הגיבוי {{cloudProviderName}} שלך, תוכל לשחזר את הארנק רק עם גיבוי ידני של ביטוי השחזור שלך. Uniswap Labs לא יכולה לשחזר את הנכסים שלך אם תאבד את ביטוי השחזור שלך.", - "settings.setting.backup.error.message.full": "לא ניתן לגבות את ביטוי השחזור ל- {{cloudProviderName}}. ודא שהפעלת את {{cloudProviderName}} עם שטח אחסון פנוי ונסה שוב.", - "settings.setting.backup.error.message.short": "לא ניתן למחוק את הגיבוי", - "settings.setting.backup.error.title": "שגיאה {{cloudProviderName}}", - "settings.setting.backup.modal.description": "עדיין לא גיבית את ביטוי השחזור שלך ל- {{cloudProviderName}} . על ידי כך, אתה יכול לשחזר את הארנק שלך רק על ידי כניסה אל {{cloudProviderName}} בכל מכשיר.", - "settings.setting.backup.modal.title": "לגבות את ביטוי השחזור ל- {{cloudProviderName}}?", - "settings.setting.backup.password.error.mismatch": "סיסמאות לא תואמות", - "settings.setting.backup.password.medium": "זוהי סיסמה בינונית", - "settings.setting.backup.password.placeholder.confirm": "אשר סיסמה", - "settings.setting.backup.password.placeholder.create": "צור סיסמה", - "settings.setting.backup.password.strong": "זוהי סיסמה חזקה", - "settings.setting.backup.password.weak": "זו סיסמה חלשה", - "settings.setting.backup.recoveryPhrase.label": "ביטוי התאוששות", - "settings.setting.backup.selected": "{{cloudProviderName}} גיבוי", - "settings.setting.backup.status.action.delete": "מחק גיבוי", - "settings.setting.backup.status.complete": "מגובה עד {{cloudProviderName}}", - "settings.setting.backup.status.description": "על ידי גיבוי של ביטוי השחזור שלך ל- {{cloudProviderName}}, אתה יכול לשחזר את הארנק שלך רק על ידי כניסה לחשבון {{cloudProviderName}} שלך בכל מכשיר.", - "settings.setting.backup.status.inProgress": "מגבה עד {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "מגובה", - "settings.setting.backup.status.title": "{{cloudProviderName}} גיבוי", - "settings.setting.beta.tooltip": "בקרוב", - "settings.setting.biometrics.appAccess.subtitle.android": "דרוש פנים/טביעת אצבע כדי לפתוח את האפליקציה.", - "settings.setting.biometrics.appAccess.subtitle.ios": "דרוש {{biometricsMethod}} כדי לפתוח אפליקציה.", - "settings.setting.biometrics.appAccess.title": "גישה לאפליקציה", - "settings.setting.biometrics.auth": "נא לאמת", - "settings.setting.biometrics.extension.waitingForBiometricsModal.content": "הפעל את {{biometricsMethod}} בדפדפן או בהגדרות המערכת שלך כדי להמשיך.", - "settings.setting.biometrics.extension.waitingForBiometricsModal.title": "מחכה ל- {{biometricsMethod}}", - "settings.setting.biometrics.off.message.android": "ביומטריה כבויה כרגע עבור ארנק Uniswap - אתה יכול להפעיל אותו בהגדרות המערכת שלך.", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} כבוי כרגע עבור ארנק Uniswap - אתה יכול להפעיל אותו בהגדרות המערכת שלך.", - "settings.setting.biometrics.off.title.android": "ביומטריה כבויה", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} כבוי", - "settings.setting.biometrics.title": "ביטול נעילת פנים/טביעת אצבע", - "settings.setting.biometrics.transactions.subtitle.android": "דרוש פנים/טביעת אצבע כדי לבצע עסקה.", - "settings.setting.biometrics.transactions.subtitle.ios": "דרוש {{biometricsMethod}} כדי לבצע עסקה.", - "settings.setting.biometrics.transactions.title": "עסקאות", - "settings.setting.biometrics.unavailable.message.android": "ביומטריה אינה מוגדרת במכשיר שלך. כדי להשתמש ביומטריה, הגדר אותו תחילה בהגדרות.", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} אינו מוגדר במכשיר שלך. כדי להשתמש ב- {{biometricsMethod}}, הגדר אותו תחילה בהגדרות.", - "settings.setting.biometrics.unavailable.title.android": "ביומטריה לא מוגדרת", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} אינו מוגדר", - "settings.setting.biometrics.warning.message.android": "אם לא תפעיל ביומטריה, כל מי שיקבל גישה למכשיר שלך יכול לפתוח את ארנק Uniswap ולבצע עסקאות.", - "settings.setting.biometrics.warning.message.ios": "אם לא תפעיל את {{biometricsMethod}}, כל מי שיקבל גישה למכשיר שלך יכול לפתוח את ארנק Uniswap ולבצע עסקאות.", - "settings.setting.biometrics.warning.title": "האם אתה בטוח?", - "settings.setting.connections.disconnectAll": "נתק הכל", - "settings.setting.connections.noConnectionsDescription": "התחבר לאפליקציה על ידי חיפוש כפתור \"התחבר לארנק\" או \"התחבר\".", - "settings.setting.currency.title": "מטבע מקומי", - "settings.setting.deviceAccess.reset.title": "אפס את ה- {{biometricsMethod}}שלך", - "settings.setting.deviceAccess.title": "גישה למכשיר", - "settings.setting.deviceAccessTimeout.1hour": "שעה אחת", - "settings.setting.deviceAccessTimeout.24hours": "24 שעות", - "settings.setting.deviceAccessTimeout.30minutes": "30 דקות", - "settings.setting.deviceAccessTimeout.5minutes": "5 דקות", - "settings.setting.deviceAccessTimeout.never": "לְעוֹלָם לֹא", - "settings.setting.deviceAccessTimeout.title": "פסק זמן לנעילה אוטומטית", - "settings.setting.hapticTouch.title": "מגע הפטי", - "settings.setting.helpCenter.title": "מרכז עזרה", - "settings.setting.language.button.navigate": "לך להגדרות", - "settings.setting.language.description.extension": "בטל החלפה של ברירת המחדל להגדרות שפת המערכת שלך. כדי לשנות את השפה המועדפת עליך, עבור להגדרות המערכת שלך.", - "settings.setting.language.description.mobile": "ביטול החלפה של ברירת המחדל להגדרות השפה של המכשיר שלך. כדי לשנות את השפה המועדפת עליך, עבור אל \"Uniswap\" בהגדרות המכשיר שלך והקש על \"שפה\".", - "settings.setting.language.title": "שפה", - "settings.setting.notifications.row.activity.description": "העברות, בקשות ופעילויות אחרות", - "settings.setting.notifications.row.activity.title": "פעילות בארנק", - "settings.setting.notifications.row.updates.description": "המלצות ותכונות חדשות", - "settings.setting.notifications.row.updates.title": "עדכונים מ-Uniswap", - "settings.setting.notifications.title": "התראות", - "settings.setting.password.change.title": "צור סיסמה חדשה", - "settings.setting.password.title": "שנה סיסמא", - "settings.setting.permissions.title": "הרשאות", - "settings.setting.privacy.analytics.description": "אנו משתמשים בנתוני שימוש אנונימיים כדי לשפר את החוויה שלך במוצרי Uniswap Labs. כאשר מושבת, אנו עוקבים רק אחר שגיאות ושימוש חיוני.", - "settings.setting.privacy.analytics.title": "ניתוח אפליקציות", - "settings.setting.privateKeys.title": "מפתחות פרטיים", - "settings.setting.recoveryPhrase.title": "ביטוי התאוששות", - "settings.setting.smallBalances.title": "יתרת תיק", - "settings.setting.smartWallet.action.enable": "לְאַפשֵׁר", - "settings.setting.smartWallet.action.smartWallet": "Smart wallet", - "settings.setting.smartWallet.notEligible": "לא זכאי", - "settings.setting.smartWallet.status.actionRequired": "נדרשת פעולה", - "settings.setting.smartWallet.status.active": "פָּעִיל", - "settings.setting.smartWallet.status.inactive": "לֹא פָּעִיל", - "settings.setting.smartWallet.status.unavailable": "אינו זמין", - "settings.setting.unknownTokens.subtitle": "אסימוני הונאה פוטנציאליים יוסתרו מהתיק שלך.", - "settings.setting.unknownTokens.title": "הסתר אסימונים לא ידועים", - "settings.setting.wallet.action.editLabel": "ערוך תווית", - "settings.setting.wallet.action.editProfile": "ערוך פרופיל", - "settings.setting.wallet.action.remove": "הסר את הארנק", - "settings.setting.wallet.connection.banner.description": "נהל חיבורים באמצעות הגדרות הארנק, על ידי לחיצה על תמונת הפרופיל שלך.", - "settings.setting.wallet.connection.banner.title": "החיבורים עברו", - "settings.setting.wallet.connections.title": "חיבורים", - "settings.setting.wallet.editLabel.description": "התוויות אינן ציבוריות. הם מאוחסנים באופן מקומי וגלוי רק לך.", - "settings.setting.wallet.editLabel.save": "שמור שינויים", - "settings.setting.wallet.label": "כינוי", - "settings.setting.wallet.testnetMode.description": "זה מפעיל רשתות בדיקה למפתחים כדי לנסות תכונות ועסקאות מבלי להשתמש בנכסים אמיתיים. לאסימונים ברשתות בדיקות אין ערך אמיתי.", - "settings.setting.wallet.testnetMode.title": "מצב Testnet", - "settings.switchNetwork.warning": "כדי להשתמש ב-Uniswap ב- {{label}}, החלף את הרשת בהגדרות הארנק שלך.", - "settings.title": "הגדרות", - "settings.version": "גרסה {{appVersion}}", - "smartWallet.actionRequired.cta": "השבתה ברשת אחת", - "smartWallet.actionRequired.cta.plural": "השבתה ברשתות {{amount}}", - "smartWallet.actionRequired.description": "השבתת הארנק החכם היא פעולה ברשת הצריכה עלות רשת קטנה.", - "smartWallet.actionRequired.insufficientFunds": "אין מספיק כספים", - "smartWallet.actionRequired.reactivate": "המשך להשתמש בארנק חכם", - "smartWallet.actionRequired.title": "הארנק החכם פעיל ברשת אחת", - "smartWallet.actionRequired.title.plural": "הארנק החכם פעיל ברשתות {{amount}}", - "smartWallet.activeNetworks.title": "הארנק החכם פעיל ברשת אחת", - "smartWallet.activeNetworks.title.plural": "הארנק החכם פעיל ברשתות {{amount}}", - "smartWallet.banner.networkCost": "Includes a one-time cost to activate your smart wallet on {{chainName}}.", - "smartWallet.banner.text": "אפשר את הארנק החכם כדי לחסוך עד 50% בעלויות הרשת.", - "smartWallet.confirmDisableSmartWallet.description": "תחמיצו החלפות מהירות יותר, עלויות רשת מוזלות ושיפורים עתידיים נוספים.", - "smartWallet.confirmDisableSmartWallet.title": "האם אתה בטוח?", - "smartWallet.insufficient.description": "לא ניתן להשבית את הארנק החכם ברשתות אלה עד שיהיו לך כספים לכיסוי עלויות הרשת.", - "smartWallet.insufficient.title": "אין מספיק כספים ברשת אחת", - "smartWallet.insufficient.title.plural": "אין מספיק כספים ברשתות {{amount}}", - "smartWallet.InsufficientFunds.button.continue.text": "המשך בכל מקרה", - "smartWallet.insufficientFunds.network.banner.description": "לא ניתן להשבית עקב חוסר כספים.", - "smartWallet.insufficientFunds.network.banner.title_one": "{{count}} network excluded", - "smartWallet.insufficientFunds.network.banner.title_other": "{{count}} network excluded", - "smartWallet.insufficientFunds.network.disable.text": "מוכן להשבית", - "smartWallet.insufficientFunds.network.text": "אתה צריך {{nativeCurrency}}", - "smartWallet.insufficientFunds.single.network.banner.title": "{{chain}} לא נכלל", - "smartWallet.modal.description.block1": "ארנקים חכמים משתמשים בחוזים חכמים לעסקאות מהירות ובעלות נמוכה יותר.", - "smartWallet.modal.description.block2": "ארנקים שכבר משתמשים בתכונות ארנק חכם מאפליקציה אחרת לא יושפעו.", - "smartWallet.modal.title": "ארנק חכם", - "smartWallets": "ארנקים חכמים", - "smartWallets.activeNetworks.description": "הארנק החכם שלך מופעל אוטומטית בכל רשת חדשה שאתה עובר אליה.", - "smartWallets.createdModal.description": "You’re getting faster transactions and lower network costs on every swap.", - "smartWallets.createdModal.title": "ארנק חכם נוצר", - "smartWallets.delegation.limitedSupport": "לארנק שלך יש תמיכה מוגבלת", - "smartWallets.delegationMismatchModal.description": "{{walletName}} אינו תומך בתקני Ethereum העדכניים ביותר בהם משתמש {{displayName}}, לכן חלק מהתכונות אינן זמינות.", - "smartWallets.delegationMismatchModal.features.1ClickSwaps": "החלפות בלחיצה אחת", - "smartWallets.delegationMismatchModal.features.gasFreeSwaps": "החלפות ללא דלק", - "smartWallets.delegationMismatchModal.features.limitOrders": "הוראות גבול", - "smartWallets.delegationMismatchModal.limitOrders.unsupported": "הוראות גבול אינן נתמכות על ידי הארנק שלך.", - "smartWallets.delegationMismatchModal.title": "תמיכה מוגבלת בארנק", - "smartWallets.disable.failed": "אירעה שגיאה. הארנק החכם עדיין פעיל ברשת אחת או יותר. אנא נסה שוב.", - "smartWallets.disable.modal.description": "פעולת onchain זו דורשת עלות רשת.", - "smartWallets.disable.modal.title": "השבתת הארנק החכם", - "smartWallets.educationalModal.description": "ארנקים חכמים מספקים עסקאות מהירות ובעלות נמוכה באמצעות חוזים חכמים.", - "smartWallets.educationalModal.info": "ארנקים שכבר משתמשים בתכונות ארנק חכם מאפליקציה אחרת לא יושפעו.", - "smartWallets.enabledModal.description": "העדכונים ייכנסו לתוקף בהחלפה הבאה שלך.", - "smartWallets.enabledModal.description.dapp": "העדכונים ייכנסו לתוקף בעסקה הבאה שלך.", - "smartWallets.enabledModal.description.dapp.line2": "חבר מחדש את הארנק שלך כדי להתחיל להשתמש בתכונות הארנק החכם באפליקציות באופן מיידי.", - "smartWallets.enabledModal.title": "ארנק חכם מופעל", - "smartWallets.postSwapNudge.enable": "הפעל ארנק חכם", - "smartWallets.postSwapNudge.title": "חסוך בהחלפה הבאה שלך", - "smartWallets.postSwapNudge.title.dapp": "אפליקציה זו תומכת בארנקים חכמים", - "smartWallets.unavailableModal.description": "ספק ארנק אחר מנהל כעת את הגדרות הארנק החכם עבור {{displayName}}. ניתן להמשיך להשתמש ב-Uniswap כרגיל.", - "smartWallets.unavailableModal.title": "תכונות הארנק החכם אינן זמינות", - "solanaPromo.banner.description": "סחרו באסימוני סולאנה ישירות ב-Uniswap.", - "solanaPromo.banner.title": "סולאנה זמינה כעת", - "solanaPromo.modal.connectWallet": "חבר את ארנק סולאנה המועדף עליך", - "solanaPromo.modal.startSwapping.button": "התחל להחליף על סולאנה", - "solanaPromo.modal.swapInstantly": "החלף אלפי אסימונים פופולריים באופן מיידי", - "solanaPromo.modal.viewTokenData": "צפה בנתוני ומחירי אסימונים במקום אחד", - "speedBump.newAddress.warning.description": "לא ביצעת עסקה עם כתובת זו בעבר. ודא שזו הכתובת הנכונה לפני שתמשיך.", - "speedBump.newAddress.warning.title": "כתובת חדשה", - "speedBump.smartContractAddress.warning.description": "אתה עומד לשלוח אסימונים לסוג מיוחד של כתובת - חוזה חכם. בדוק שוב שזו הכתובת שאליה התכוונת לשלוח. אם זה שגוי, האסימונים שלך עלולים ללכת לאיבוד לנצח.", - "speedBump.smartContractAddress.warning.title": "האם זו כתובת ארנק?", - "stats.24fees": "עמלות 24 שעות", - "stats.24swapVolume": "נפח החלפה של 24 שעות", - "stats.24volume": "נפח 24 שעות", - "stats.allTimeSwappers": "מחליפי כל הזמנים", - "stats.allTimeVolume": "נפח כל הזמן", - "stats.fdv": "FDV", - "stats.fdv.description": "הערכה בדילול מלא (FDV) מחשבת את שווי השוק הכולל בהנחה שכל האסימונים נמצאים במחזור.", - "stats.marketCap": "שווי שוק", - "stats.marketCap.description": "שווי שוק הוא שווי השוק הכולל של ההיצע במחזור של נכס.", - "stats.noStatsAvailable": "אין סטטיסטיקות זמינות", - "stats.tvl": "הערך הכולל ננעל", - "stats.tvl.description": "ערך כולל נעול (TVL) הוא הסכום המצטבר של הנכס הזמין בכל מאגרי הנזילות של Uniswap.", - "stats.volume.1d": "נפח 1 ימים", - "stats.volume.1d.description": "נפח יום אחד הוא סכום הנכס שנסחר ב-Uniswap במהלך 24 השעות האחרונות.", - "stats.volume.1d.long": "נפח 1D", - "stats.volume.1d.short": "כרך 1D", - "stats.volume.description": "נפח הוא סכום הנכס שנסחר ב-Uniswap במהלך מסגרת הזמן שנבחרה.", - "swap.allow.oneTime": "אפשר {{sym}} (פעם אחת)", - "swap.approveAndSubmit": "לאשר ולהגיש", - "swap.approveAndSwap": "לאשר ולהחליף", - "swap.balance.amount": "יתרה: {{amount}}", - "swap.bestPrice.through": "מסלול דרך {{provider}}", - "swap.bestRoute.cost": "המסלול היעיל ביותר מוערך בעלות של ~{{gasPrice}} בעלויות הרשת. ", - "swap.bridging.title": "החלפה בין רשתות", - "swap.bridging.warning.description": "אתה מחליף מ- {{fromNetwork}} ל- {{toNetwork}}. זה ידוע גם בשם \"גישור\", אשר מעביר את האסימונים שלך מרשת אחת לאחרת.", - "swap.button.confirmSignAndSwap": "אשר חתימה והחלפה", - "swap.button.confirmSwapAnyways": "אשר את ההחלפה בכל מקרה", - "swap.button.confirmUnwrap": "אשר את הפתיחה", - "swap.button.max": "מקסימום", - "swap.button.review": "סקירה", - "swap.button.submitting": "שולח החלפה...", - "swap.button.submitting.keep.open": "שמור את הארנק פתוח...", - "swap.button.submitting.passkey": "אישור באמצעות סיסמה", - "swap.button.swap": "לְהַחלִיף", - "swap.button.swapAnyways": "להחליף בכל מקרה", - "swap.button.unwrap": "לְגוֹלֵל", - "swap.button.wrap": "לַעֲטוֹף", - "swap.buy.countryModal.placeholder": "חפש לפי מדינה או אזור", - "swap.cancel.cannotExecute_one": "ההחלפה שלך עשויה להתבצע לפני עיבוד הביטול. לא ניתן להחזיר את עלויות הרשת שלך. האם אתה מעוניין להמשיך?", - "swap.cancel.cannotExecute_other": "ההחלפות שלך עשויות להתבצע לפני עיבוד הביטול. לא ניתן להחזיר את עלויות הרשת שלך. האם אתה מעוניין להמשיך?", - "swap.confirmApproveAndSwap": "אישור והחלפה", - "swap.confirmLimit": "אשר מגבלה", - "swap.confirmSwap": "אשר את ההחלפה", - "swap.confirmWrap": "אישור גלישה", - "swap.deadline.settings.title": "מועד החלפה", - "swap.deadline.settings.title.short": "Tx. מוֹעֵד אַחֲרוֹן", - "swap.details.completed": "ההחלפה הושלמה", - "swap.details.estimatedTime": "זמן משוער", - "swap.details.fasterUnichainSwaps": "החלפות מהירות יותר המופעלות על ידי יוניצ'יין", - "swap.details.feeOnTransfer": "{{tokenSymbol}} עמלה", - "swap.details.feeOnTransfer.symbol": "עמלת אסימון {{tokenSymbol}}", - "swap.details.instant": "רֶגַע", - "swap.details.newQuote.input": "קלט חדש", - "swap.details.newQuote.output": "פלט חדש", - "swap.details.orderRouting": "ניתוב הזמנה", - "swap.details.orderRoutingInfo": "ההחלפה הזו מנותבת דרך Across, פרוטוקול מבוזר שמעביר נכסים בין רשתות תוך מתן עדיפות לבטיחות, ביצוע מהיר ומחירים נמוכים.", - "swap.details.poweredBy": "מופעל על ידי", - "swap.details.rate": "ציון", - "swap.details.slippage": "החלקה מקסימלית", - "swap.details.slippage.uniswap": "החלקה מוגנת של Uniswap", - "swap.details.swappedIn.unichain": "הושלם תוך {{time}}שניות ב-Unichain", - "swap.details.uniswapFee": "תַשְׁלוּם", - "swap.error.default": "ייתכן שתצטרך להגביר את סובלנות ההחלקה שלך. הערה: אסימוני עמלה על העברה ואסימוני בסיס מחדש אינם תואמים ל-Uniswap V3.", - "swap.error.expectedToFail": "ההחלפה שלך צפויה להיכשל.", - "swap.error.fiatInputUnavailable": "קלט {{fiatCurrencyCode}} לא זמין", - "swap.error.modifiedByWallet": "ההחלפה שלך השתנתה דרך הארנק שלך. אם זו הייתה טעות, אנא בטל מיד או הסתכן בהפסד הכספים שלך.", - "swap.error.rejected": "העסקה נדחתה", - "swap.error.undefinedObject": "אירעה שגיאה בעת ניסיון לבצע החלפה זו. ייתכן שתצטרך להגביר את סובלנות ההחלקה שלך. אם זה לא עובד, ייתכן שיש אי תאימות עם האסימון שאתה סוחר בו. הערה: אסימוני עמלה על העברה ואסימוני בסיס מחדש אינם תואמים ל-Uniswap V3.", - "swap.error.unknown": "שגיאה לא ידועה.", - "swap.error.v2.expired": "לא ניתן לשלוח את העסקה הזו מכיוון שהמועד האחרון חלף. אנא בדוק שהמועד האחרון לעסקה שלך אינו נמוך מדי.", - "swap.error.v2.k": "ה-Uniswap אינווריאנט x*y=k לא היה מרוצה מההחלפה. זה בדרך כלל אומר שאחד האסימונים שאתה מחליף משלב התנהגות מותאמת אישית בהעברה.", - "swap.error.v2.slippage": "עסקה זו לא תצליח גם עקב תנועת מחיר או עמלה בהעברה. נסה להגדיל את סובלנות ההחלקה שלך", - "swap.error.v2.transferInput": "לא ניתן להעביר את אסימון הקלט. ייתכן שיש בעיה עם אסימון הקלט.", - "swap.error.v2.transferOutput": "לא ניתן להעביר את אסימון הפלט. ייתכן שיש בעיה עם אסימון הפלט.", - "swap.error.v3.slippage": "עסקה זו לא תצליח עקב תנועת מחיר. נסה להגדיל את סובלנות ההחלקה שלך. הערה: עמלה על העברה ואסימוני בסיס מחדש אינם תואמים ל-Uniswap V3.", - "swap.error.v3.transferOutput": "לא ניתן להעביר את אסימון הפלט. ייתכן שיש בעיה עם אסימון הפלט. הערה: עמלה על העברה ואסימוני בסיס מחדש אינם תואמים ל-Uniswap V3.", - "swap.estimatedDifference.label": "יהיה הבדל גדול בין ערכי הקלט והפלט שלך בגלל הנזילות הנוכחית.", - "swap.expected.price": "מחיר צפוי", - "swap.fail.batched": "ייתכן שהארנק המחובר שלך אינו תומך בהחלפות בלחיצה אחת. נסה החלפה רגילה במקום זאת.", - "swap.fail.batched.retry": "נסה החלפה רגילה", - "swap.fail.batched.title": "החלפה בלחיצה אחת נכשלה", - "swap.fail.message": "נסה להתאים את ההחלקה לערך גבוה יותר.", - "swap.fail.uniswapX": "לא ניתן היה להשלים את ההחלפה עם UniswapX. נסה להחליף שוב כדי לנתב אותו דרך ה-API הקלאסי של Uniswap.", - "swap.fees.experience": "עמלה זו חלה על כמה צמדי אסימונים כדי להבטיח את החוויה הטובה ביותר עם Uniswap. הוא משולם באסימון הפלט וכבר נכלל בהצעת המחיר.", - "swap.fees.jupiter.label": "דמי יופיטר", - "swap.fees.jupiter.message": "העמלות ב-Solana נגבות על ידי ממשק ה-API של Jupiter. Uniswap Labs אינה מקבלת עמלות אלה.", - "swap.fees.noFee": "עמלות חלות על צמדי אסימונים נבחרים כדי להבטיח את החוויה הטובה ביותר עם Uniswap. אין עמלה הקשורה להחלפה זו.", - "swap.finalizingQuote": "מסיים הצעת מחיר...", - "swap.form.header": "לְהַחלִיף", - "swap.form.warning.output.fotFees": "בשל העמלה הסמלית של {{fotCurrencySymbol}}, ניתן להזין סכומי החלפה רק באמצעות שדה הקלט", - "swap.form.warning.output.fotFees.fallback": "עקב עמלות סמליות, ניתן להזין סכומי החלפה רק באמצעות שדה הקלט", - "swap.form.warning.output.solana": "פלט מדויק אינו נתמך בסולנה", - "swap.form.warning.restore": "שחזר את הארנק שלך כדי להחליף", - "swap.frontrun.warning": "העסקה שלך עשויה להיות חזיתית ולהביא לסחר לא חיובי.", - "swap.header.viewOnly": "לצפייה בלבד", - "swap.impactOfTrade": "ההשפעה שיש לסחר שלך על מחיר השוק של מאגר זה.", - "swap.impactOfTrade.uniswapx": "ההבדל בין מחיר השוק למחיר הביצוע, תוך התחשבות בחיסכון בגז UniswapX.", - "swap.impactOfTrade.uniswapx.missing": "חישובי השפעת המחיר עשויים להיות לא זמינים עבור זוגות עם נזילות נמוכה.", - "swap.inputEstimated.atMost": "הקלט מוערך. אתה תמכור לכל היותר או שהעסקה תחזור.", - "swap.limit": "לְהַגבִּיל", - "swap.limitFilled": "הגבלה התמלאה!", - "swap.limitSubmitted": "הגבלה הוגשה", - "swap.marketPrice.outsideRange.label": "מחיר השוק הוא מחוץ לטווח המחירים שצוין. הפקדה לנכס בודד בלבד.", - "swap.min.price": "מחיר מינימום", - "swap.networkCost.paidIn": "עלות הרשת משולמת ב {{sym}} ברשת {{chainName}} על מנת לבצע עסקה.", - "swap.orderRouting": "ניתוב הזמנה", - "swap.outputEstimated.atLeast": "התפוקה מוערכת. תקבל לפחות או שהעסקה תחזור.", - "swap.placeOrder": "בצע הזמנה", - "swap.priceImpact": "השפעה על המחיר", - "swap.request.title.full": "החלף {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "החלפת אסימונים", - "swap.review": "סקירה החלפה", - "swap.review.summary": "אתה מחליף", - "swap.reviewLimit": "מגבלת ביקורת", - "swap.route.optimizedGasCost": "מסלול זה מתייחס למסלולים מפוצלים, ריבוי דילוגים ועלויות רשת של כל שלב.", - "swap.routing.jupiter.description": "ג'ופיטר אוספת נזילות ממקורות מרובים כדי לספק לך את המחירים הטובים ביותר.", - "swap.routing.uniswapAutoRouter.description": "הנתב האוטומטי של Uniswap מתחשב בנתיבים ובעלויות רשת אופטימליים כדי לספק לכם את המחירים הטובים ביותר.", - "swap.settings.deadline.tooltip": "העסקה שלך תחזור אם היא בהמתנה במשך יותר מתקופת זמן זו. (מקסימום: 3 ימים).", - "swap.settings.deadline.warning": "דדליין גבוה", - "swap.settings.oneClickSwap.title": "החלפות בלחיצה אחת", - "swap.settings.oneClickSwap.tooltip": "מקבץ פעולות מסחר סטנדרטיות יחד עבור החלפות מהירות ובעלות נמוכה יותר.", - "swap.settings.protection.description": "עם הגנת החלפה מופעלת, עסקאות ה-Ethereum שלך יהיו מוגנות מפני התקפות סנדוויץ', עם סיכויים מופחתים לכישלון.", - "swap.settings.protection.subtitle.supported": "{{chainName}} רשת", - "swap.settings.protection.subtitle.unavailable": "לא זמין ב- {{chainName}}", - "swap.settings.protection.title": "הגנת החלפה", - "swap.settings.routingPreference.option.default.description": "בחירה באפשרות זו מזהה את המסלול היעיל ביותר עבור ההחלפה שלך.", - "swap.settings.routingPreference.option.default.description.preV4": "לקוח Uniswap בוחר את אפשרות הסחר הזולה ביותר תוך התחשבות במחיר ועלויות רשת.", - "swap.settings.routingPreference.option.default.description.uniswapXUnavailable": "UniswapX אינו זמין עבור הארנק שלך", - "swap.settings.routingPreference.option.default.tooltip": "מסלול מזוהה בהתחשב ב-v2, v3 ומאגרי v4 מסוימים, תוך התחשבות בהשפעת המחיר המשוערת ועלויות הרשת.", - "swap.settings.routingPreference.option.v2.title": "הפעלת מאגרי v2", - "swap.settings.routingPreference.option.v3.title": "הפעלת מאגרי v3", - "swap.settings.routingPreference.option.v4.hooks.title": "הפעלת מאגרי וו של v4", - "swap.settings.routingPreference.option.v4.hooks.tooltip": "V4 hooks מנתב swaps דרך קבוצה של hooks שאושרו מראש.", - "swap.settings.routingPreference.option.v4.title": "הפעלת מאגרי v4", - "swap.settings.routingPreference.title": "אפשרויות סחר", - "swap.settings.slippage.alert": "החלקה גבוהה", - "swap.settings.slippage.control.auto": "אוטומטי", - "swap.settings.slippage.description": "העסקה שלך תחזור אם המחיר ישתנה יותר מאחוז ההחלקה.", - "swap.settings.slippage.input.message": "אם המחיר יורד עוד יותר, העסקה שלך תחזור. להלן הסכום המינימלי שמובטח לך שתקבל.", - "swap.settings.slippage.input.receive.title": "קבלו לפחות", - "swap.settings.slippage.output.message": "אם המחיר יורד עוד יותר, העסקה שלך תחזור. להלן הסכום המקסימלי שתצטרך להוציא.", - "swap.settings.slippage.output.spend.title": "להוציא לכל היותר", - "swap.settings.slippage.warning": "החלקה גבוהה מאוד", - "swap.settings.slippage.warning.description": "החלקה מעל 20% עשויה לגרום למסחר לא חיובי. כדי להפחית את הסיכון להיות חזיתית, הורד את ההגדרות שלך.", - "swap.settings.slippage.warning.hover": "זה עלול לגרום לסחר לא חיובי. נסה להנמיך את הגדרת ההחלקה שלך.", - "swap.settings.slippage.warning.max": "הזן ערך קטן מ- {{maxSlippageTolerance}}", - "swap.settings.slippage.warning.message": "החלקה עשויה להיות גבוהה מהנדרש", - "swap.settings.slippage.warning.min": "הזן ערך גדול מ-0", - "swap.settings.title": "החלפת הגדרות", - "swap.settings.transactionRevertPrice": "העסקה שלך תחזור אם המחיר ישתנה לרעה ביותר מאחוז זה.", - "swap.signAndSwap": "חתמו והחליפו", - "swap.slippage.amt": "{{amt}} החלקה", - "swap.slippage.bridging": "אין החלקה בעת החלפה בין רשתות", - "swap.slippage.description": "הפרש בין המחיר הצפוי למחיר שבוצע בעסקת סוואפ. הבדלים יכולים להתרחש עקב נזילות נמוכה, תנודתיות בשוק או בוטים. \n\nהגנת Uniswap מגינה מפני בוטים קודמים ו-MEV.", - "swap.slippage.settings.title": "הגדרות החלקה", - "swap.slippage.tooltip": "תנועת המחיר המקסימלית לפני העסקה שלך תחזור.", - "swap.slippageBelow.warning": "סטייה מתחת ל-{{amt}} עלולה לגרום לכישלון בעסקה", - "swap.submitted": "החלפה הוגשה", - "swap.success": "הצלחה החלפה!", - "swap.tokenOwnFees": "חלק מהאסימונים לוקחים עמלה כאשר הם נרכשים או נמכרים, אשר נקבעת על ידי מנפיק האסימונים. Uniswap לא מקבל אף אחת מהעמלות הללו.", - "swap.tradeRoutes": "נתיבי מסחר", - "swap.transaction.deadline": "מועד אחרון לעסקה", - "swap.transaction.revertAfter": "העסקה שלך תחזור אם היא בהמתנה במשך יותר מתקופת זמן זו.", - "swap.warning.enterLargerAmount.title": "הזן כמות גדולה יותר", - "swap.warning.expectedFailure.increaseSlippage": "נסה להגדיל את ההחלקה שלך.", - "swap.warning.expectedFailure.titleMay": "ההחלפה הזו עלולה להיכשל", - "swap.warning.insufficientBalance.title": "אין לך מספיק {{currencySymbol}}", - "swap.warning.insufficientGas.button": "לא מספיק {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "החלף עבור {{ tokenSymbol }} ב- {{networkName}}", - "swap.warning.insufficientGas.button.buy": "קנה {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "קנה עם כרטיס", - "swap.warning.insufficientGas.message.withNetwork": "לא מספיק {{currencySymbol}} על {{networkName}} כדי להחליף", - "swap.warning.insufficientGas.message.withoutNetwork": "לא מספיק {{currencySymbol}} כדי להחליף", - "swap.warning.insufficientGas.title": "אין לך מספיק {{currencySymbol}} כדי לכסות את עלות הרשת", - "swap.warning.networkFee.allow": "אפשר {{ inputTokenSymbol }} (פעם אחת)", - "swap.warning.networkFee.delegation.message": "זוהי העלות לעיבוד העסקה שלך ולהפעלת הארנק החכם שלך ב-Unichain. Uniswap Labs אינה מקבלת חלק מהעמלות הללו.", - "swap.warning.networkFee.highRelativeToValue": "עלות הרשת עולה על 10% מערך העסקה הכולל שלך. זו העלות לעיבוד העסקה שלך בבלוקצ'יין. Uniswap אינה מקבלת כל חלק בעמלות אלו.", - "swap.warning.networkFee.highRelativeToValue.unichain": "עלות הרשת עולה על 10% מערך העסקה הכולל שלך. זו העלות לעיבוד העסקה שלך בבלוקצ'יין.", - "swap.warning.networkFee.includesDelegation": "כולל הפעלת ארנק חכם", - "swap.warning.networkFee.message": "זו העלות לעיבוד העסקה שלך בבלוקצ'יין. Uniswap אינה מקבלת כל חלק בעמלות אלו.", - "swap.warning.networkFee.message.unichain": "זו העלות לעיבוד העסקה שלך בבלוקצ'יין.", - "swap.warning.networkFee.message.uniswapX": "זו העלות לעיבוד העסקה שלך בבלוקצ'יין. Uniswap אינה מקבלת כל חלק בעמלות אלו. UniswapX צוברת מקורות נזילות למחירים טובים יותר והחלפות ללא גז.", - "swap.warning.networkFee.message.uniswapX.title": "אין עלויות רשת עם UniswapX", - "swap.warning.networkFee.message.uniswapX.unichain": "זו העלות לעיבוד העסקה שלך בבלוקצ'יין. UniswapX צוברת מקורות נזילות למחירים טובים יותר והחלפות ללא גז.", - "swap.warning.noQuotesFound.bridging.message": "לא נמצאו ציטוטים מגשרים. נסה להשתמש בגשר הרשמי בשלב זה.", - "swap.warning.noQuotesFound.title": "לא נמצאו ציטוטים", - "swap.warning.noRoutesFound.message": "כרגע אין מסלולים זמינים עבור האסימונים שבחרת. אנא נסה זוג אחר או בדוק שוב מאוחר יותר.", - "swap.warning.noRoutesFound.title": "אין מסלולים זמינים", - "swap.warning.offline.message": "ייתכן שאיבדת את החיבור לאינטרנט או שהרשת מושבתת. אנא בדוק את חיבור האינטרנט שלך ונסה שוב.", - "swap.warning.offline.title": "אתה במצב לא מקוון", - "swap.warning.priceImpact.message": "בשל כמות הנזילות של {{outputCurrencySymbol}} הזמינה כעת, ככל שתנסה להחליף יותר {{inputCurrencySymbol}} תקבל פחות {{outputCurrencySymbol}} .", - "swap.warning.priceImpact.message.veryHigh": "עסקה זו תגרום להשפעת מחיר של {{priceImpactValue}} על מחיר השוק של מאגר זה ותגרום לאובדן כספים.", - "swap.warning.priceImpact.title": "השפעה גבוהה על המחיר ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "השפעה גבוהה מאוד על המחיר ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "העסקה שלך לא נשלחה כי סגרת את האפליקציה.", - "swap.warning.queuedOrder.approvalFailed": "העסקה שלך לא נשלחה כי אישור האסימון נכשל.", - "swap.warning.queuedOrder.stale": "העסקה שלך לא נשלחה כי סגרת את האפליקציה או שהאישור נמשך זמן רב מדי.", - "swap.warning.queuedOrder.submissionFailed": "הייתה בעיה בהגשת העסקה שלך.", - "swap.warning.queuedOrder.title": "ההחלפה בוטלה", - "swap.warning.rateLimit.message": "אנא נסה שוב בעוד מספר דקות.", - "swap.warning.rateLimit.title": "חרגת ממגבלת התעריף", - "swap.warning.router.message": "ייתכן שאיבדת את החיבור או שהרשת מושבתת. אם הבעיה נמשכת, אנא נסה שוב מאוחר יותר.", - "swap.warning.router.title": "אי אפשר להשלים את המסחר הזה כרגע", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} חסום", - "swap.warning.tokenBlockedFallback.button": "האסימון חסום", - "swap.warning.uniswapFee.message": "עמלות נגבות כדי להבטיח את החוויה הטובה ביותר עם Uniswap.", - "swap.warning.uniswapFee.message.default": "עמלות חלות כדי להבטיח את החוויה הטובה ביותר עם Uniswap. אין עמלה הקשורה להחלפה זו.", - "swap.warning.uniswapFee.message.included": "עמלות חלות כדי להבטיח את החוויה הטובה ביותר עם Uniswap, וכבר נכללו בהצעת המחיר הזו.", - "swap.warning.uniswapFee.title": "עמלת החלפה", - "swap.warning.viewOnly.message": "עליך לייבא את הארנק הזה באמצעות ביטוי שחזור כדי להחליף אסימונים.", - "swap.wrap.token": "לעטוף {{sym}}", - "tdp.balanceSummary.otherNetworks": "ברשתות אחרות", - "tdp.balanceSummary.otherNetworksBalance": "איזון ברשתות אחרות", - "tdp.balanceSummary.title": "האיזון שלך", - "tdp.button.getToken": "קבל {{ tokenSymbol }}", - "tdp.button.getTokenFallback": "קבל אסימון", - "tdp.loading.title.default": "נתוני אסימון עבור ", - "tdp.loading.title.withChain": "נתוני אסימון עבור ב- {{chainName}}", - "tdp.nameNotFound": "השם לא נמצא", - "tdp.noInfoAvailable": "אין מידע אסימון זמין", - "tdp.noTestnetSupportDescription": "רשתות בדיקה מסוימות אינן תומכות בהחלפה, שליחה או קנייה של אסימונים.", - "tdp.symbolNotFound": "הסמל לא נמצא", - "testnet.modal.swapDeepLink.description.toProdMode": "פעולה זו מחייבת את השבתת מצב testnet. ניתן להפעיל מחדש את מצב Testnet בכל עת בהגדרות.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "פעולה זו דורשת הפעלה של מצב testnet. לאסימונים ברשתות בדיקות אין ערך אמיתי. ניתן להשבית את מצב Testnet בכל עת בהגדרות.", - "testnet.modal.swapDeepLink.title.toProdMode": "השבת את מצב testnet", - "testnet.modal.swapDeepLink.title.toTestnetMode": "הפעל מצב testnet", - "testnet.unsupported": "פונקציונליות זו אינה נתמכת במצב testnet.", - "themeToggle.theme": "נושא", - "title.buySellTradeEthereum": "קנה, מכור וסחר ב-Ethereum ואסימונים מובילים אחרים ב-Uniswap", - "title.createGovernanceOn": "צור הצעת ממשל חדשה ב-Uniswap", - "title.createGovernanceTo": "צור הצעת ממשל חדשה להצבעה על ידי בעלי UNI. אסימוני UNI מייצגים את מניות ההצבעה בממשל של Uniswap.", - "title.earnFees": "הרווח עמלות כאשר אחרים מחליפים ב-Uniswap על ידי הוספת אסימונים למאגרי נזילות.", - "title.easilyRemove": "הסר בקלות את הנזילות שלך מ-Uniswap v2 והפקד ב-Uniswap v3.", - "title.easilyRemoveV4": "הסר בקלות את הנזילות שלך מ-Uniswap v2 ו-v3 כדי להפקיד ב-Uniswap v4.", - "title.extension.uninstall": "התוסף הוסרה", - "title.extensionPasskeyLogIn": "התחברות באמצעות סיסמה", - "title.managePasskeys": "חד-החלפה | נהל את המפתחות שלך", - "title.migratev2": "העבר נזילות מאגר v2 ל-Uniswap v3", - "title.migratev3": "העבר את נזילות המאגר ל-Uniswap v4", - "title.placeLimit": "בצע הזמנות מוגבלות ב-Uniswap", - "title.realTime": "מחירים בזמן אמת, תרשימים, נתוני עסקאות ועוד.", - "title.removeLiquidityv2": "הסר את נזילות המאגר (v2) ב-Uniswap", - "title.removePoolLiquidity": "הסר נזילות מאגר ב-Uniswap", - "title.removeTokensv2": "הסר את האסימונים שלך ממאגרי נזילות v2.", - "title.removev3Liquidity": "הסר את האסימונים שלך ממאגר הנזילות של v3.", - "title.sendCrypto": "שלח קריפטו", - "title.sendTokens": "שלח אסימונים ב-Uniswap", - "title.swappingMadeSimple": "קנייה ומכירה מיידית של קריפטו ב-Ethereum, Base, Arbitrum, Polygon, Unichain ועוד. פלטפורמת DeFi שמיליונים סומכים עליה.", - "title.tradeTokens": "סחר באסימונים וספק נזילות. מחירים בזמן אמת, תרשימים, נתוני עסקאות ועוד.", - "title.uniswapTradeCrypto": "יוניסוואפ | סחור בקריפטו בבורסה המובילה של DeFi ", - "title.uniToken": "אסימוני UNI מייצגים את מניות ההצבעה בממשל של Uniswap. אתה יכול להצביע על כל הצעה בעצמך או להאציל את הקולות שלך לצד שלישי.", - "title.voteOnGov": "הצבע על הצעות ממשל ב-Uniswap", - "token.balances.main": "האיזון שלך", - "token.balances.other": "יתרות ברשתות אחרות", - "token.balances.viewOnly": "המאזן של {{ownerAddress}}", - "token.bridge": "{{label}} גשר אסימונים", - "token.chart.candlestick.unavailable": "תרשימי פמוט אינם זמינים עבור אסימון זה", - "token.chart.tooltip": "עמלות: {{amount}}", - "token.details": "פרטים אסימונים", - "token.error.unknown": "אסימון לא ידוע", - "token.fee.buy.label": "עמלת קנייה", - "token.fee.label": "תַשְׁלוּם", - "token.fee.sell.label": "עמלת מכירה", - "token.links.title": "קישורים", - "token.links.twitter": "טוויטר", - "token.links.website": "אתר אינטרנט", - "token.notFound.description": "מצטערים, איננו יכולים למצוא מידע עבור האסימון הזה. בדוק את השם והכתובת ונסה שוב.", - "token.notFound.title": "האסימון לא נמצא", - "token.priceExplorer.error.description": "משהו השתבש.", - "token.priceExplorer.error.title": "לא ניתן היה לטעון את תרשים המחירים", - "token.priceExplorer.timeRangeLabel.all": "כל הזמן", - "token.priceExplorer.timeRangeLabel.day": "1D", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 יום", - "token.priceExplorer.timeRangeLabel.hour": "1H", - "token.priceExplorer.timeRangeLabel.month": "1M", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 חודש", - "token.priceExplorer.timeRangeLabel.week": "1W", - "token.priceExplorer.timeRangeLabel.week.verbose": "שבוע אחד", - "token.priceExplorer.timeRangeLabel.year": "1Y", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 שנה", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} אינו זמין", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} ו {{tokenSymbol1}} אינם זמינים", - "token.safety.fee.detected": "זוהתה עמלת אסימון", - "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs אינה מקבלת אף אחת מהעמלות הללו.", - "token.safety.warning.alwaysDoYourResearch": "תעשה תמיד את המחקר שלך", - "token.safety.warning.blocked.description.default_one": "אינך יכול לסחור באסימון זה באמצעות אפליקציית Uniswap.", - "token.safety.warning.blocked.description.default_other": "אתה לא יכול לסחור באסימונים האלה באמצעות אפליקציית Uniswap.", - "token.safety.warning.copyContractAddress.message": "זוהי כתובת חוזה, הפועלת כמזהה ייחודי לאסימונים בבלוקצ'יין. כל קריפטו שתשלח לכתובת זו יאבד.", - "token.safety.warning.copyContractAddress.title": "אל תשלח קריפטו לכתובת זו", - "token.safety.warning.dontShowWarningAgain": "אל תראה לי את האזהרה הזו שוב", - "token.safety.warning.dontShowWarningAgainShort": "אל תציג שוב", - "token.safety.warning.doYourOwnResearch": "בצע תמיד מחקר משלך לפני שתמשיך.", - "token.safety.warning.feeDescription": "גובה כאשר {{action}}", - "token.safety.warning.flaggedAsMalicious": "מסומן כזדוני", - "token.safety.warning.flaggedAsSuspicious": "סומן כחשוד", - "token.safety.warning.fotHigh.title": "זוהתה עמלה גבוהה", - "token.safety.warning.fotLow.title": "זוהתה עמלה", - "token.safety.warning.fotVeryHigh.title": "זוהתה עמלה גבוהה מאוד", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} סומן כבלתי ניתן למכירה. החלפת אסימון זה עלולה לגרום לאובדן הכספים שלך.", - "token.safety.warning.honeypot.title": "זוהתה 100% עמלת מכירה", - "token.safety.warning.impersonator": "מתחזה לאסימון אחר", - "token.safety.warning.impersonator.title": "זוהה אסימון מתחזה", - "token.safety.warning.malicious.general.message": "{{tokenSymbol}} סומן כזדוני על ידי Blockaid.", - "token.safety.warning.malicious.impersonator.message": "{{tokenSymbol}} סומן על ידי Blockaid בשל ניסיון להעתיק אסימון אחר. ייתכן שזה לא האסימון שאתה מחפש להחליף.", - "token.safety.warning.malicious.impersonator.message.short": "ייתכן ש{{tokenSymbol}} אינו האסימון שאתה מחפש להחליף.", - "token.safety.warning.malicious.title": "זוהה אסימון זדוני", - "token.safety.warning.mayResultInLoss": "החלפתו עלולה לגרום לאובדן כספים.", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} לא נסחר בבורסות מובילות בארה\"ב.", - "token.safety.warning.notListedOnExchanges": "לא רשום בבורסות המובילות בארה\"ב", - "token.safety.warning.potentialHoneypot.card.message": "{{tokenSymbol}} סומן כחשוד על ידי Blockaid.", - "token.safety.warning.potentialHoneypot.modal.message": "{{tokenSymbol}} סומן כסיר דבש פוטנציאלי על ידי Blockaid. בצע תמיד מחקר משלך לפני שתמשיך.", - "token.safety.warning.potentialHoneypot.title": "זוהה עציץ דבש פוטנציאלי", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} סומן כבלתי ניתן למכירה.", - "token.safety.warning.sellFee100.title": "זוהתה 100% עמלת מכירה", - "token.safety.warning.spam.message": "{{tokenSymbol}} סומן כדואר זבל על ידי Blockaid.", - "token.safety.warning.spam.title": "זוהה אסימון ספאם", - "token.safety.warning.spamsUsers": "משתמשי ספאם", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} גובה עמלה של {{buyFeePercent}} בקנייה ו {{sellFeePercent}} בעת מכירה.", - "token.safety.warning.tokenChargesFee.buy.message": "{{tokenSymbol}} גובה עמלה של {{feePercent}} בקנייה.", - "token.safety.warning.tokenChargesFee.buy.message.descriptive": "{{tokenSymbol}} גובה עמלה של {{feePercent}} בעת הרכישה. החלפה עלולה לגרום לאובדן כספים. Uniswap Labs אינה מקבלת אף אחת מעמלות אלה.", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} גובה עמלה של {{feePercent}} בעת מכירה.", - "token.safety.warning.tokenChargesFee.sell.message.descriptive": "{{tokenSymbol}} גובה עמלה של {{feePercent}} בעת המכירה. החלפה עלולה לגרום לאובדן כספים. Uniswap Labs אינה מקבלת אף אחת מעמלות אלה.", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} גובה עמלה בעת קנייה או מכירה.", - "token.safetyLevel.blocked.message": "אינך יכול לסחור באסימון זה באמצעות ארנק Uniswap.", - "token.safetyLevel.medium.message.plural": "האסימונים הללו אינם נסחרים בבורסות מובילות בארה\"ב. בצע תמיד מחקר משלך לפני שתמשיך.", - "token.selector.search.error": "לא ניתן היה לטעון את תוצאות החיפוש", - "token.stats.fullyDilutedValuation": "הערכת שווי בדילול מלא", - "token.stats.marketCap": "שווי שוק", - "token.stats.priceHighYear": "52W גבוה", - "token.stats.priceLowYear": "52W נמוך", - "token.stats.section.about": "בערך {{token}}", - "token.stats.title": "סטטיסטיקות", - "token.stats.translation.original": "הראה מקור", - "token.stats.translation.translate": "תרגם ל {{language}}", - "token.stats.volume": "נפח 24 שעות", - "token.symbol.input.fallback": "אסימון קלט", - "token.symbol.output.fallback": "אסימון פלט", - "token.wrap.fail.message": "החלפות בפרוטוקול Uniswap יכולות להתחיל ולהסתיים ב-ETH. עם זאת, במהלך ההחלפה, ETH עטוף ב-WETH.", - "token.zeroNativeBalance.description.mainnet": "תצטרך להחליף אסימון ב-Ethereum כדי לקבל {{ tokenSymbol }}. החלפה דורשת ETH עבור עלויות רשת.", - "token.zeroNativeBalance.description.otherChains": "תצטרך להחליף אסימון ב- {{ chainName }} כדי לקבל {{ tokenSymbol }}. החלפה דורשת {{ chainName }} {{ nativeTokenSymbol }} עבור עלויות רשת.", - "token.zeroNativeBalance.subtitle": "{{ tokenSymbol }} אינו זמין לרכישה ישירה.", - "token.zeroNativeBalance.title.mainnet": "אתה צריך {{ nativeTokenName }}", - "token.zeroNativeBalance.title.otherChains": "אתה צריך {{ nativeTokenName }} ב- {{ chainName }}", - "tokens.action.hide": "הסתר אסימון", - "tokens.action.unhide": "בטל הסתר אסימון", - "tokens.nfts.action.viewOnExplorer": "הצג ב- {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "לא ניתן היה לטעון את אוסף NFT", - "tokens.nfts.collection.label.items": "פריטים", - "tokens.nfts.collection.label.owners": "בעלים", - "tokens.nfts.collection.label.priceFloor": "קוֹמָה", - "tokens.nfts.collection.label.swapVolume": "כרך", - "tokens.nfts.connectEthereumToView": "חבר ארנק Ethereum כדי לצפות ב-NFTs שלך", - "tokens.nfts.details.contract.address": "כתובת החוזה", - "tokens.nfts.details.error.load.title": "לא ניתן היה לטעון פרטי NFT", - "tokens.nfts.details.network": "רֶשֶׁת", - "tokens.nfts.details.owner": "בבעלות", - "tokens.nfts.details.price": "מחיר נוכחי", - "tokens.nfts.details.recentPrice": "מחיר מבצע אחרון", - "tokens.nfts.details.traits": "תכונות", - "tokens.nfts.empty.description": "לא נמצאו NFTs", - "tokens.nfts.error.unavailable": "התוכן אינו זמין", - "tokens.nfts.hidden.action.hide": "הסתר NFT", - "tokens.nfts.hidden.action.unhide": "בטל הסתר NFT", - "tokens.nfts.link.collection": "אתר אוסף", - "tokens.nfts.list.error.load.title": "לא ניתן היה לטעון NFTs", - "tokens.nfts.list.none.button": "קבל NFTs", - "tokens.nfts.list.none.description.default": "העבר NFTs מארנק אחר כדי להתחיל.", - "tokens.nfts.list.none.description.external": "כאשר הארנק הזה קונה או מקבל NFTs, הם יופיעו כאן.", - "tokens.nfts.list.none.title": "עדיין אין NFTs", - "tokens.nfts.notAvailableOnSolana": "NFTs אינם זמינים בסולאנה", - "tokens.selector.button.choose": "בחר אסימון", - "tokens.selector.empty.buy.message": "קנה קריפטו עם כרטיס או בנק כדי לשלוח אסימונים.", - "tokens.selector.empty.buy.title": "קנה קריפטו", - "tokens.selector.empty.receive.title": "קבל אסימונים", - "tokens.selector.empty.title": "עדיין אין אסימונים", - "tokens.selector.error.load": "לא ניתן היה לטעון אסימונים", - "tokens.selector.search.empty": "לא נמצאו תוצאות עבור {{searchText}}", - "tokens.selector.search.placeholder": "חפש אסימונים", - "tokens.selector.section.bridging": "החלפה בין רשתות", - "tokens.selector.section.favorite": "מועדפים", - "tokens.selector.section.otherNetworksSearchResults": "אסימונים שנמצאו ברשתות אחרות", - "tokens.selector.section.otherSearchResults": "אסימונים אחרים ב- {{network}}", - "tokens.selector.section.recent": "חיפושים אחרונים", - "tokens.selector.section.search": "תוצאות חיפוש", - "tokens.selector.section.trending": "אסימונים בנפח 24 שעות", - "tokens.selector.section.yours": "האסימונים שלך", - "tokens.table.search.placeholder.pools": "חפש בבריכות", - "tokens.table.search.placeholder.tokens": "חפש אסימונים", - "tokens.table.search.placeholder.transactions": "חיפוש עסקאות", - "toucan.auction.bidConcentration": "ריכוז טוקאנים", - "toucan.auction.bidConcentration.tooltip.description": "תיאור הטיפ הכלי של טוקאן", - "toucan.auction.bidConcentration.tooltip.title": "כותרת תיאור כלי של טוקאן", - "toucan.auctions": "מכירות פומביות", - "toucan.bidForm.maxBudget": "תקציב מקסימלי", - "toucan.bidForm.placeBid": "הגש את הצעת המחיר שלך", - "toucan.displayMode.tokenPrice": "מחיר אסימון", - "toucan.displayMode.valuation": "הַעֲרָכָה", - "transaction.action.cancel.button": "ביטול עסקה", - "transaction.action.cancel.description": "אם תבטל עסקה זו לפני שהיא מעובדת על ידי הרשת, תשלם עלות רשת חדשה במקום העלות המקורית.", - "transaction.action.cancel.title": "לבטל את העסקה הזו?", - "transaction.action.clear": "נקה בהמתנה", - "transaction.action.copy": "העתק את מזהה העסקה", - "transaction.action.copyProvider": "העתק את מזהה העסקה {{providerName}}", - "transaction.amount.unlimited": "ללא הגבלה", - "transaction.callData": "נתוני שיחות", - "transaction.details.dappName": "אפליקציה", - "transaction.details.from": "מ", - "transaction.details.networkFee": "עלות רשת", - "transaction.details.networkFee.swap": "עלות רשת החלפה", - "transaction.details.providerFee": "עמלת ספק", - "transaction.details.swapRate": "ציון", - "transaction.details.transaction": "עִסקָה", - "transaction.details.uniswapFee": "עמלה ({{ feePercent }}%)", - "transaction.network.all": "כל הרשתות", - "transaction.networkCost.description": "עלות עיבוד העסקה שלך בבלוקצ'יין. Uniswap מותאם לעלויות רשת מינימליות.", - "transaction.networkCost.includesSmartWalletActivation": "כולל הפעלת ארנק חכם", - "transaction.networkCost.label": "עלות רשת", - "transaction.networkCost.maxNativeBalance.description": "סכום קטן מיתרת אסימון הרשת נשמר לכיסוי עלות הרשת של עסקה זו.", - "transaction.networkCost.maxNativeBalance.title": "למה אני לא יכול להשתמש ביתרה המקסימלית שלי?", - "transaction.networkCost.veryHigh.label": "עלות רשת גבוהה מאוד", - "transaction.notification.error.cancel": "לא ניתן לבטל את העסקה", - "transaction.notification.error.replace": "לא ניתן להחליף עסקה", - "transaction.status.approval.canceled": "האישור בוטל", - "transaction.status.approval.failed": "האישור נכשל", - "transaction.status.approve.canceled": "ביטול אישור", - "transaction.status.approve.canceling": "מבטל את האישור", - "transaction.status.approve.failed": "לא הצליחו לאשר", - "transaction.status.approve.pending": "מאשר", - "transaction.status.approve.success": "אושר", - "transaction.status.approve.successDapp": "אושר בתאריך {{externalDappName}}", - "transaction.status.buy.canceled": "קנייה בוטלה", - "transaction.status.buy.canceling": "ביטול קנייה", - "transaction.status.buy.failed": "הקנייה נכשלה", - "transaction.status.buy.pending": "קְנִיָה", - "transaction.status.buy.success": "קנה", - "transaction.status.buy.successDapp": "נקנה ב- {{externalDappName}}", - "transaction.status.claim.canceled": "גביית האגרה בוטלה", - "transaction.status.claim.canceling": "גביית דמי ביטול", - "transaction.status.claim.failed": "גביית העמלות נכשלה", - "transaction.status.claim.pending": "גביית עמלות", - "transaction.status.claim.success": "עמלות שנגבו", - "transaction.status.collect.fees.canceled": "גביית עמלות בוטלה", - "transaction.status.collect.fees.failed": "איסוף עמלות נכשל", - "transaction.status.collected.fees": "עמלות שנגבו", - "transaction.status.collecting.fees": "גביית עמלות", - "transaction.status.confirm.canceled": "אישור בוטל", - "transaction.status.confirm.canceling": "ממתין לביטול", - "transaction.status.confirm.failed": "האישור נכשל", - "transaction.status.confirm.pending": "עסקה בעיצומה", - "transaction.status.confirm.success": "העסקה אושרה", - "transaction.status.confirm.successDapp": "העסקה אושרה בתאריך {{externalDappName}}", - "transaction.status.createPair.canceled": "ביטול יצירת זוג", - "transaction.status.createPair.canceling": "ביטול יצירת זוג", - "transaction.status.createPair.failed": "יצירת הזוג נכשלה", - "transaction.status.createPair.pending": "יוצר זוג", - "transaction.status.createPair.success": "נוצר זוג", - "transaction.status.createPool.canceled": "יצירת מאגר בוטל", - "transaction.status.createPool.canceling": "ביטול יצירת מאגר", - "transaction.status.createPool.failed": "נכשלה יצירת המאגר", - "transaction.status.createPool.pending": "יצירת בריכה", - "transaction.status.createPool.success": "נוצר בריכה", - "transaction.status.liquidityDecrease.canceled": "הסרת הנזילות בוטלה", - "transaction.status.liquidityDecrease.canceling": "ביטול הסרת נזילות", - "transaction.status.liquidityDecrease.failed": "הסרת הנזילות נכשלה", - "transaction.status.liquidityDecrease.pending": "הסרת נזילות", - "transaction.status.liquidityDecrease.success": "הוסרה נזילות", - "transaction.status.liquidityIncrease.canceled": "הוספת נזילות בוטלה", - "transaction.status.liquidityIncrease.canceling": "ביטול הוספת נזילות", - "transaction.status.liquidityIncrease.failed": "הוספת נזילות נכשלה", - "transaction.status.liquidityIncrease.pending": "הוספת נזילות", - "transaction.status.liquidityIncrease.success": "תוספת נזילות", - "transaction.status.lpIncentivesClaim.canceled": "תביעת תגמולי LP שבוטלה", - "transaction.status.lpIncentivesClaim.canceling": "ביטול תביעת תגמולי LP", - "transaction.status.lpIncentivesClaim.failed": "נכשל בקשת תגמולי LP", - "transaction.status.lpIncentivesClaim.pending": "תביעת תגמולי LP", - "transaction.status.lpIncentivesClaim.success": "תבעו תגמולי LP", - "transaction.status.migrateLiquidity.canceled": "העברת נזילות בוטלה", - "transaction.status.mint.canceled": "מנטה בוטלה", - "transaction.status.mint.canceling": "ביטול מנטה", - "transaction.status.mint.failed": "ההטבעה נכשלה", - "transaction.status.mint.pending": "טְבִיעָה", - "transaction.status.mint.success": "טָבוּעַ", - "transaction.status.mint.successDapp": "הוטבע ב- {{externalDappName}}", - "transaction.status.offramp.canceled": "היציאה בוטלה", - "transaction.status.offramp.failed": "היציאה נכשלה", - "transaction.status.offramp.pending": "יציאה מהרמפינג", - "transaction.status.offramp.success": "מחוץ לרמפה", - "transaction.status.onramp.canceled": "רמפת העלייה בוטלה", - "transaction.status.onramp.failed": "העלייה למסלול נכשלה", - "transaction.status.onramp.pending": "רמפינג", - "transaction.status.onramp.success": "רמפה", - "transaction.status.permit.approved": "אושר ההיתר", - "transaction.status.permit.canceled": "אישור העברה בוטל", - "transaction.status.permit.failed": "ההיתר נכשל", - "transaction.status.purchase.canceled": "רכישה בוטלה", - "transaction.status.purchase.canceling": "ביטול רכישה", - "transaction.status.purchase.failed": "הרכישה נכשלה", - "transaction.status.purchase.failedOn": "הרכישה ב- {{serviceProvider}}נכשלה", - "transaction.status.purchase.pending": "רכישה", - "transaction.status.purchase.pendingOn": "רכישה ב- {{serviceProvider}}", - "transaction.status.purchase.successOn": "נרכש ב- {{serviceProvider}}", - "transaction.status.receive.canceled": "קבלה בוטלה", - "transaction.status.receive.canceling": "ביטול קבלה", - "transaction.status.receive.failed": "הקבלה נכשלה", - "transaction.status.receive.failedFrom": "קבלת מ- {{serviceProvider}}נכשלה", - "transaction.status.receive.pending": "קבלה", - "transaction.status.receive.pendingFrom": "מקבל מ- {{serviceProvider}}", - "transaction.status.receive.success": "קיבלו", - "transaction.status.receive.successDapp": "התקבל ב- {{externalDappName}}", - "transaction.status.receive.successFrom": "התקבל מ- {{serviceProvider}}", - "transaction.status.removeDelegation.canceled": "הסרת האצלה בוטלה", - "transaction.status.removeDelegation.failed": "הסרת האצלה נכשלה", - "transaction.status.removeDelegation.pending": "הסרת האצלה", - "transaction.status.removeDelegation.success": "הוסרה האצלה", - "transaction.status.revoke.canceled": "ביטול ביטול", - "transaction.status.revoke.canceling": "ביטול ביטול", - "transaction.status.revoke.failed": "הביטול נכשל", - "transaction.status.revoke.pending": "מבטל", - "transaction.status.revoke.success": "בוטל", - "transaction.status.revoke.successDapp": "בוטל בתאריך {{externalDappName}}", - "transaction.status.sale.canceled": "מכירה בוטלה", - "transaction.status.sale.canceling": "ביטול מכירה", - "transaction.status.sale.failedOn": "המכירה נכשלה דרך {{serviceProvider}}", - "transaction.status.sale.pendingCard.msg": "למידע נוסף על מכירת קריפטו.", - "transaction.status.sale.pendingCard.title": "מדוע המכירה שלי עדיין בהמתנה?", - "transaction.status.sale.pendingOn": "מוכר דרך {{serviceProvider}}", - "transaction.status.sale.successOn": "נמכר דרך {{serviceProvider}}", - "transaction.status.sell.canceled": "מכירה בוטלה", - "transaction.status.sell.canceling": "ביטול מכירה", - "transaction.status.sell.failed": "לא הצליח למכור", - "transaction.status.sell.pending": "מוכר", - "transaction.status.sell.success": "נמכר", - "transaction.status.sell.successDapp": "נמכר ב- {{externalDappName}}", - "transaction.status.send.canceled": "השליחה בוטלה", - "transaction.status.send.canceling": "מבטל את השליחה", - "transaction.status.send.failed": "שליחה נכשלה", - "transaction.status.send.pending": "שְׁלִיחָה", - "transaction.status.send.success": "נשלח", - "transaction.status.send.successDapp": "נשלח ב- {{externalDappName}}", - "transaction.status.swap.canceled": "ההחלפה בוטלה", - "transaction.status.swap.canceling": "מבטל את ההחלפה", - "transaction.status.swap.expired": "פג תוקף ההחלפה", - "transaction.status.swap.failed": "ההחלפה נכשלה", - "transaction.status.swap.insufficientFunds": "אין מספיק כספים", - "transaction.status.swap.pending": "החלפה", - "transaction.status.swap.success": "הוחלף", - "transaction.status.swap.successDapp": "הוחלף ב- {{externalDappName}}", - "transaction.status.unwrap.canceled": "ביטול הגלישה", - "transaction.status.unwrap.canceling": "מבטל את הפתיחה", - "transaction.status.unwrap.failed": "לא הצליחו לפרק", - "transaction.status.unwrap.pending": "פורקים את העטיפה", - "transaction.status.unwrap.success": "לא עטוף", - "transaction.status.unwrap.successDapp": "לא עטוף ב- {{externalDappName}}", - "transaction.status.wrap.canceled": "עטיפה בוטלה", - "transaction.status.wrap.canceling": "ביטול גלישה", - "transaction.status.wrap.failed": "לעטוף נכשל", - "transaction.status.wrap.pending": "לְפָפָה", - "transaction.status.wrap.success": "עָטוּף", - "transaction.status.wrap.successDapp": "עטוף על {{externalDappName}}", - "transaction.submittedOn": "הוגש בתאריך", - "transaction.summary.liquidity": "{{firstAmountWithSymbol}} ו- {{secondAmountWithSymbol}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} עד {{recipientAddress}}", - "transaction.summary.received.noAmount": "התקבל מ- {{name}}", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} מ- {{senderAddress}}", - "transaction.summary.sent.noAmount": "נשלח אל {{name}}", - "transaction.warning.insufficientGas.modal.message": "אתה צריך ~{{tokenAmount}} {{tokenSymbol}} () ב- {{networkName}} כדי לכסות את עלות הרשת של העסקה הזו. החלף {{tokenSymbol}} מרשת אחרת או קנה עם הכרטיס שלך כדי להמשיך.", - "transaction.warning.insufficientGas.modal.message.noAction": "אתה צריך ~{{tokenAmount}} {{tokenSymbol}} () ב- {{networkName}} כדי לכסות את עלות הרשת של העסקה הזו.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount": "אתה צריך ~{{tokenAmount}} {{tokenSymbol}} () ב- {{networkName}} כדי לכסות את עלות הרשת של העסקה הזו.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount.noAction": "כדי להחליף עבור אסימון זה, אתה צריך עוד {{tokenSymbol}} על {{networkName}}.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "לא מספיק {{tokenSymbol}} על {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "לא מספיק {{tokenSymbol}}", - "transaction.warning.maxNative.message": "אתה עומד להוציא את רוב יתרת האסימון ברשת שלך. זה עלול להשאיר לא מספיק כספים לכיסוי עלויות רשת עתידיות.", - "transaction.warning.maxNative.title": "יתרת אסימון רשת נמוכה", - "transaction.watcher.error.cancel": "לא ניתן לבטל את העסקה", - "transaction.watcher.error.status": "שגיאה בעת בדיקת סטטוס העסקה", - "uniswapX.aggregatesLiquidity": " אוסף מקורות נזילות למחירים טובים יותר והחלפות ללא גז.", - "uniswapX.cost": "UniswapX מסיר את העלויות האופייניות לביצוע עסקאות בבלוקצ'יין.", - "uniswapx.description": "UniswapX צוברת מקורות נזילות למחירים טובים יותר והחלפות ללא גז.", - "uniswapx.description.unsupported": "UniswapX אינו זמין כעת מכיוון שהגדרות הארנק החכם שלך מנוהלות על ידי אפליקציית ארנק אחרת.", - "uniswapx.included": "כולל UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "למידע נוסף על החלפה עם UniswapX", - "uniswapx.unavailable.title": "UniswapX אינו זמין", - "uniswapx.v2QuoteFailed": "הצעת המחיר הקשה של UniswapX v2 נכשלה. נסה שוב עם החלפה קלאסית.", - "unitags.banner.button.claim": "תבע עכשיו", - "unitags.banner.subtitle": "בנה פרופיל web3 מותאם אישית ושתף בקלות את הכתובת שלך עם חברים.", - "unitags.banner.title.compact": "תבע את שם המשתמש שלך {{unitagDomain}} ובנה את הפרופיל הניתן להתאמה אישית שלך.", - "unitags.banner.title.full": "תבע את שם המשתמש שלך {{unitagDomain}}", - "unitags.choosePhoto.option.cameraRoll": "בחר מתוך גליל מצלמה", - "unitags.choosePhoto.option.computer": "העלה מהמחשב", - "unitags.choosePhoto.option.nft": "בחר NFT", - "unitags.choosePhoto.option.remove": "הסר תמונת פרופיל", - "unitags.claim.available": "זָמִין", - "unitags.claim.confirmation.customize": "התאם אישית את הפרופיל", - "unitags.claim.confirmation.description": "{{unitagAddress}} מוכן לשלוח ולקבל קריפטו. המשך לבנות את הארנק שלך על ידי התאמה אישית של פרופיל web3 שלך.", - "unitags.claim.confirmation.success.long": "הבנת!", - "unitags.claim.confirmation.success.short": "הבנת!", - "unitags.claim.error.addressLimit": "כבר ביצעת את המספר המרבי של שינויים בשם המשתמש שלך עבור כתובת זו", - "unitags.claim.error.avatar": "לא ניתן להגדיר דמות. נסה שוב מאוחר יותר.", - "unitags.claim.error.default": "לא ניתן לתבוע את שם המשתמש. נסה שוב מאוחר יותר.", - "unitags.claim.error.deviceLimit": "הגעת למספר המרבי של שמות משתמש שיכולים להיות פעילים עבור מכשיר זה", - "unitags.claim.error.general": "לא ניתן לתבוע את שם המשתמש", - "unitags.claim.error.unavailable": "שם משתמש זה אינו זמין", - "unitags.claim.error.unknown": "שגיאה לא ידועה", - "unitags.claim.username.default": "השם שלך", - "unitags.delete.confirm.subtitle": "אתה עומד למחוק את שם המשתמש שלך ופרטי הפרופיל הניתנים להתאמה אישית. לא תוכל להחזיר אותו.", - "unitags.delete.confirm.title": "האם אתה בטוח?", - "unitags.editProfile.placeholder": "שם משתמש", - "unitags.editUsername.confirm.subtitle": "אתה עומד לשנות את שם המשתמש שלך. ברגע שתשנה אותו, לעולם לא תוכל לתבוע אותו שוב.", - "unitags.editUsername.confirm.title": "האם אתה בטוח?", - "unitags.editUsername.title": "ערוך את שם המשתמש שלך", - "unitags.editUsername.warning.default": "לאחר שתשנה את שם המשתמש שלך, לעולם לא תוכל לתבוע אותו שוב. אתה יכול לשנות אותו רק 2 פעמים.", - "unitags.editUsername.warning.max": "הגעת למספר המרבי של 2 שינויים בשמות משתמש.", - "unitags.extension.intro.buttton": "תבע שם משתמש", - "unitags.extension.intro.description": "היפרד מכתובות 0x. שמות משתמש הם שמות קריאים המקלים על שליחה וקבלה של קריפטו.", - "unitags.extension.intro.title": "הצגת שמות משתמש", - "unitags.extension.intro.upsell.customizable": "פרופילים הניתנים להתאמה אישית", - "unitags.extension.intro.upsell.ens": "מופעל על ידי תת-דומיינים של ENS", - "unitags.extension.intro.upsell.free": "חופשי לתבוע", - "unitags.intro.features.ens": "מופעל על ידי תת-דומיינים של ENS", - "unitags.intro.features.free": "חופשי לתבוע", - "unitags.intro.features.profile": "פרופילים הניתנים להתאמה אישית", - "unitags.intro.subtitle": "היפרד מכתובות 0x. שמות משתמש הם שמות קריאים המקלים על שליחה וקבלה של קריפטו.", - "unitags.intro.title": "הצגת שמות משתמש", - "unitags.notification.delete.error": "לא ניתן למחוק את שם המשתמש. נסה שוב מאוחר יותר.", - "unitags.notification.delete.title": "שם המשתמש נמחק", - "unitags.notification.profile.error": "לא ניתן היה לעדכן את הפרופיל. נסה שוב מאוחר יותר.", - "unitags.notification.profile.title": "הפרופיל עודכן", - "unitags.notification.username.error": "לא ניתן לשנות את שם המשתמש. נסה שוב מאוחר יותר.", - "unitags.notification.username.title": "שם המשתמש השתנה", - "unitags.onboarding.claim.subtitle": "זוהי הכתובת המותאמת אישית שלך שאנשים יכולים לשלוח אליה קריפטו.", - "unitags.onboarding.claim.title.choose": "צור את שם המשתמש שלך", - "unitags.onboarding.claim.title.claim": "תבע את שם המשתמש שלך", - "unitags.onboarding.info.description": "שמות משתמש הופכים כתובות 0x מורכבות לשמות קריאים. על ידי דרישת שם משתמש {{unitagDomain}} , אתה יכול לשלוח ולקבל קריפטו בקלות ולבנות פרופיל web3 ציבורי.", - "unitags.onboarding.info.title": "כתובת פשוטה", - "unitags.onboarding.profile.subtitle": "העלה משלך או הישאר עם Unicon הייחודי שלך. תמיד תוכל לשנות זאת מאוחר יותר.", - "unitags.onboarding.profile.title": "בחר תמונת פרופיל", - "unitags.profile.action.delete": "מחק את שם המשתמש", - "unitags.profile.action.edit": "ערוך שם משתמש", - "unitags.profile.bio.label": "ביו", - "unitags.profile.bio.placeholder": "הקלד ביוגרפיה עבור הפרופיל שלך", - "unitags.profile.links.twitter": "טוויטר", - "unitags.username.error.chars": "שמות משתמש יכולים להכיל רק אותיות ומספרים", - "unitags.username.error.max": "שמות משתמש אינם יכולים להיות יותר מ- {{number}} תווים", - "unitags.username.error.min": "שמות משתמש חייבים להיות לפחות {{number}} תווים", - "unitags.username.error.uppercase": "שמות משתמש יכולים להכיל רק אותיות קטנות ומספרים", - "uwulink.error.insufficientTokens": "לא מספיק {{tokenSymbol}} על {{chain}}", - "v2.notAvailable": "Uniswap V2 אינו זמין ברשת זו.", - "wallet.appSignIn": "היכנס באמצעות האפליקציה", - "wallet.connectingAgreement": "על ידי חיבור ארנק, אתה מסכים לתנאי השירות של Uniswap Labs ולהסכים למדיניות הפרטיות שלה.", - "wallet.connectionFailed.message": "ניסיון החיבור נכשל. אנא נסה שוב, תוך ביצוע השלבים לחיבור בארנק שלך.", - "wallet.mismatch.popup.description": "חלק מהתכונות אינן נתמכות על ידי הארנק המחובר שלך.", - "wallet.mismatch.popup.title": "תמיכה מוגבלת בארנק", - "wallet.other": "ארנקים אחרים", - "wallet.scanToConnect": "סרוק קוד QR כדי להתחבר", - "wallet.wrongNet": "הארנק שלך מחובר לרשת הלא נכונה.", - "walletConnect.dapps.empty.description": "התחבר לאפליקציה על ידי סריקת קוד דרך WalletConnect", - "walletConnect.dapps.manage.empty.title": "אין אפליקציות מחוברות", - "walletConnect.dapps.manage.title": "חיבורים", - "walletConnect.error.connection.message": "ארנק Uniswap תומך כרגע ב {{chainNames}}. אנא השתמש רק ב- \"{{dappName}}\" בשרשראות אלה", - "walletConnect.error.connection.title": "בעיית חיבור", - "walletConnect.error.general.message": "הייתה בעיה עם WalletConnect. בבקשה נסה שוב", - "walletConnect.error.general.title": "שגיאת WalletConnect", - "walletConnect.error.scantastic.message": "הייתה בעיה בקוד ה-QR שלך. בבקשה נסה שוב", - "walletConnect.error.scantastic.title": "קוד QR לא חוקי", - "walletConnect.error.unsupported.message": "ודא שאתה סורק קוד תקף של WalletConnect, כתובת Ethereum או קוד QR של תוסף Uniswap לפני שתנסה שוב.", - "walletConnect.error.unsupported.title": "קוד QR לא חוקי", - "walletConnect.error.unsupportedV1.message": "WalletConnect v1 אינו נתמך עוד. היישום שאליו אתה מנסה להתחבר צריך לשדרג ל-WalletConnect v2.", - "walletConnect.error.unsupportedV1.title": "קוד QR לא חוקי", - "walletConnect.error.uwu.scan": "הייתה בעיה בסריקת קוד QR זה.", - "walletConnect.error.uwu.title": "שגיאת קישור UwU", - "walletConnect.error.uwu.unsupported": "קוד QR זה אינו נתמך.", - "walletConnect.pending.button.connect": "לְחַבֵּר", - "walletConnect.pending.button.reject": "לִדחוֹת", - "walletConnect.pending.button.scrollDown": "גלול למטה כדי להתחבר", - "walletConnect.pending.threat.confirmationText": "אני מבין את הסיכונים", - "walletConnect.pending.threat.description": "חתימה על הודעות או עסקאות מאפליקציה זו עלולה לגרום לאובדן כספים.", - "walletConnect.pending.threat.title": "זוהתה אפליקציה זדונית", - "walletConnect.pending.title": "התחבר אל {{dappName}}", - "walletConnect.pending.unverified.description": "ודא שאתה סומך על אתר זה לפני שתמשיך. ", - "walletConnect.pending.unverified.title": "אפליקציה לא מאומתת", - "walletConnect.permissions.option.requestApprovals": "בקשת אישורי עסקאות", - "walletConnect.permissions.option.transferAssets": "Move funds without permission", - "walletConnect.permissions.option.viewTokenBalances": "View your balance and activity", - "walletConnect.permissions.title": "App permissions", - "walletConnect.request.bundledTransactions.label_one": "עסקה צרורה בודדת", - "walletConnect.request.bundledTransactions.label_other": "{{count}} עסקאות משולבות", - "walletConnect.request.button.scrollDown": "גלול למטה כדי לחתום", - "walletConnect.request.button.sign": "סִימָן", - "walletConnect.request.details.label.function": "פוּנקצִיָה", - "walletConnect.request.details.label.sending": "שְׁלִיחָה", - "walletConnect.request.details.label.token": "אֲסִימוֹן", - "walletConnect.request.details.label.tokens": "אסימונים", - "walletConnect.request.error.insufficientFunds": "אין לך מספיק {{currencySymbol}} כדי להשלים את העסקה הזו.", - "walletConnect.request.error.network": "שגיאת חיבור לאינטרנט או לרשת", - "walletConnect.request.warning.batch.message": "זהירות: בקשה זו מכילה מספר עסקאות ועלולה להעביר נכסים", - "walletConnect.request.warning.general.message": "היזהר: הודעה זו עשויה להעביר נכסים", - "walletConnect.request.warning.message": "כדי לחתום על הודעות או עסקאות, יהיה עליך לייבא את ביטוי השחזור של הארנק.", - "walletConnect.request.warning.title": "הארנק הזה נמצא במצב צפייה בלבד", - "web.explore.description": "גלה וחקר אסימונים ב- {{network}}. חקור בריכות מובילות. הצג מחירים בזמן אמת, נפח מסחר, TVL, גרפים ונתוני עסקאות.", - "web.explore.title.pools": "חקור את הבריכות המובילות ב- {{network}} ב-Uniswap", - "web.explore.title.tokens": "חקור את האסימונים המובילים ב- {{network}} ב-Uniswap", - "web.explore.title.transactions": "חקור את העסקאות המובילות ב- {{network}} ב-Uniswap" -} diff --git a/packages/uniswap/src/i18n/locales/translations/hi-IN.json b/packages/uniswap/src/i18n/locales/translations/hi-IN.json deleted file mode 100644 index 8ceab52826a..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/hi-IN.json +++ /dev/null @@ -1,2563 +0,0 @@ -{ - "account.authHeader.claimReward": "{{amount}} पुरस्कार का दावा करें", - "account.cloud.backup.subtitle": "आपके {{cloudProviderName}}में कई पुनर्प्राप्ति वाक्यांशों का बैकअप लिया गया है।", - "account.cloud.backup.title": "पुनर्स्थापित करने के लिए बैकअप का चयन करें", - "account.cloud.button.restore.android": "Google Drive से पुनर्स्थापित करें", - "account.cloud.button.restore.ios": "iCloud से पुनर्स्थापित करें", - "account.cloud.empty.description": "ऐसा लगता है कि आपने अपने किसी भी पुनर्प्राप्ति वाक्यांश का {{cloudProviderName}}में बैकअप नहीं लिया है।", - "account.cloud.empty.title": "0 बैकअप मिले", - "account.cloud.error.backup.message": "अनुमतियों की कमी, प्राधिकरण में रुकावट या क्लाउड त्रुटि के कारण बैकअप आयात करने में विफल", - "account.cloud.error.backup.title": "बैकअप आयात करते समय त्रुटि", - "account.cloud.error.password.title": "अवैध पासवर्ड। कृपया पुन: प्रयास करें।", - "account.cloud.error.unavailable.button.cancel": "अभी नहीं", - "account.cloud.error.unavailable.button.settings": "सेटिंग्स में जाओ", - "account.cloud.error.unavailable.message.android": "कृपया सत्यापित करें कि आप इस डिवाइस पर Google ड्राइव सक्षम वाले Google खाते में लॉग इन हैं और पुनः प्रयास करें।", - "account.cloud.error.unavailable.message.ios": "कृपया सत्यापित करें कि आप इस डिवाइस पर सक्षम iCloud Drive वाली Apple ID में लॉग इन हैं और पुनः प्रयास करें।", - "account.cloud.error.unavailable.title.android": "गूगल ड्राइव उपलब्ध नहीं है", - "account.cloud.error.unavailable.title.ios": "iCloud ड्राइव उपलब्ध नहीं है", - "account.cloud.loading.title": "बैकअप खोज रहे हैं...", - "account.cloud.lockout.time.hours_one": "बहुत ज़्यादा प्रयास हो चुके हैं. 1 घंटे बाद फिर से प्रयास करें.", - "account.cloud.lockout.time.hours_other": "बहुत ज़्यादा प्रयास हो चुके हैं। {{count}} घंटे बाद फिर से प्रयास करें।", - "account.cloud.lockout.time.minutes_one": "बहुत ज़्यादा प्रयास हो चुके हैं. 1 मिनट में फिर से प्रयास करें.", - "account.cloud.lockout.time.minutes_other": "बहुत ज़्यादा प्रयास हो चुके हैं। {{count}} मिनट में फिर से प्रयास करें।", - "account.cloud.password.input": "पास वर्ड दर्ज करें", - "account.cloud.password.recoveryPhrase": "इसके बजाय अपना पुनर्प्राप्ति वाक्यांश दर्ज करें", - "account.cloud.password.subtitle": "यह पासवर्ड {{cloudProviderName}}से आपके पुनर्प्राप्ति वाक्यांश बैकअप को पुनर्प्राप्त करने के लिए आवश्यक है।", - "account.cloud.password.title": "बैकअप पासवर्ड दर्ज करें", - "account.downloadWallet.subtitle": "अपने बटुए का बैकअप लें, चलते-फिरते व्यापार करें, लाइव मूल्य अलर्ट प्राप्त करें, और भी बहुत कुछ।", - "account.drawer.gitHash": "गिट हैश: ", - "account.drawer.gitVersion": "संस्करण: ", - "account.drawer.modal.body": "Uniswap ऐप के साथ टोकन को सुरक्षित रूप से स्टोर और स्वैप करें। iOS और Android पर उपलब्ध है।", - "account.drawer.modal.dont": "क्या आपके पास Uniswap वॉलेट नहीं है?", - "account.drawer.modal.scan": "Uniswap वॉलेट से स्कैन करें", - "account.drawer.spamToggle": "अज्ञात टोकन और NFT छिपाएँ", - "account.passkey.delete.acknowledge": "मैंने अपने पुनर्प्राप्ति वाक्यांश का बैकअप ले लिया है और समझता हूं कि यदि मैं ऐसा करने में विफल रहा तो यूनिस्वैप लैब्स मेरे वॉलेट को पुनर्प्राप्त करने में मेरी मदद नहीं कर सकता।", - "account.passkey.delete.description": "सुनिश्चित करें कि आपने Uniswap मोबाइल ऐप या ब्राउज़र एक्सटेंशन का उपयोग करके अपने पुनर्प्राप्ति वाक्यांश का बैकअप लिया है।", - "account.passkey.delete.descriptionEmphasized": "आपके पुनर्प्राप्ति वाक्यांश के बिना, आप अपने वॉलेट तक पहुंचने में असमर्थ हो सकते हैं।", - "account.passkey.delete.speedbump.description": "आगे बढ़ने से पहले, अपने वॉलेट और सभी फंड तक पहुंच खोने से बचने के लिए निम्नलिखित चरणों को पूरा करें।", - "account.passkey.delete.speedbump.step1": "Uniswap मोबाइल ऐप या ब्राउज़र एक्सटेंशन डाउनलोड करें", - "account.passkey.delete.speedbump.step2": "अपने पुनर्प्राप्ति वाक्यांश का बैकअप लें", - "account.passkey.delete.speedbump.title": "क्या आपको यकीन है?", - "account.passkey.delete.title": "पासकी मिटाएँ?", - "account.passkey.log.in.title": "पासकी से लॉग इन करें", - "account.passkey.type.crossplatform": "फ़ोन, टैबलेट या सुरक्षा कुंजी", - "account.passkey.type.platform": "ब्राउज़र या ऑपरेटिंग सिस्टम", - "account.passkey.verify.button": "पासकी से सत्यापित करें", - "account.passkey.verify.description": "आगे बढ़ने से पहले, कृपया अपनी पहचान सत्यापित करने के लिए अपनी पासकी का उपयोग करें। इससे आपका खाता सुरक्षित रखने में मदद मिलती है।", - "account.passkey.verify.title": "सबसे पहले, आइए पुष्टि करें कि यह आप ही हैं", - "account.portfolio.activity.canceledBelow": "यह ऑर्डर रद्द कर दिया गया क्योंकि आपकी शेष राशि इनपुट राशि से कम हो गई थी।", - "account.portfolio.activity.signLimit": "यह ऑर्डर पूरा नहीं होगा क्योंकि आपका बैलेंस इनपुट राशि से कम हो गया है। इसे ठीक करने के लिए अपना बैलेंस बढ़ाएँ।", - "account.recoveryPhrase.education.part1": "पुनर्प्राप्ति वाक्यांश (या बीज वाक्यांश) शब्दों का एक सेट है जो आपके वॉलेट तक पहुंचने के लिए आवश्यक है, पासवर्ड की तरह।", - "account.recoveryPhrase.education.part2": "आप अपने वॉलेट और उसकी सामग्री को पुनर्स्थापित करने के लिए किसी नए डिवाइस पर अपना पुनर्प्राप्ति वाक्यांश दर्ज कर सकते हैं।", - "account.recoveryPhrase.education.part3": "लेकिन, यदि आप अपना पुनर्प्राप्ति वाक्यांशखो देते हैं, तो आप अपने वॉलेट तक पहुंच खो देंगे।", - "account.recoveryPhrase.education.part4": "अपने पुनर्प्राप्ति वाक्यांश को याद करने के बजाय, आप को {{cloudProviderName}} में बैकअप कर सकते हैं और इसे पासवर्ड से सुरक्षित कर सकते हैं।", - "account.recoveryPhrase.education.part5": "आप अपने पुनर्प्राप्ति वाक्यांश का मैन्युअल रूप से बैकअप भी ले सकते हैं, इसे लिखकर और इसे सुरक्षित स्थान पर संग्रहीत कर सकते हैं।", - "account.recoveryPhrase.education.part6": "हम दोनों प्रकार के बैकअपका उपयोग करने की सलाह देते हैं, क्योंकि यदि आप अपना पुनर्प्राप्ति वाक्यांश खो देते हैं, तो आप अपने वॉलेट को पुनर्स्थापित नहीं कर पाएंगे।", - "account.recoveryPhrase.error.invalid": "अमान्य वाक्यांश", - "account.recoveryPhrase.error.invalidWord": "अमान्य शब्द: {{word}}", - "account.recoveryPhrase.error.phraseLength": "पुनर्प्राप्ति वाक्यांश 12-24 शब्दों का होना चाहिए", - "account.recoveryPhrase.error.wordIsAddress": "आपने एक पता दर्ज किया है, पुनर्प्राप्ति वाक्यांश नहीं", - "account.recoveryPhrase.error.wrong": "ग़लत पुनर्प्राप्ति वाक्यांश", - "account.recoveryPhrase.helpText.import": "मैं अपना पुनर्प्राप्ति वाक्यांश कैसे ढूंढूं?", - "account.recoveryPhrase.helpText.restoring": "पुनः खोजने का प्रयास करें", - "account.recoveryPhrase.input": "अपना पुनर्प्राप्ति वाक्यांश टाइप करें", - "account.recoveryPhrase.remove.final.description": "सुनिश्चित करें कि आपने अपना पुनर्प्राप्ति वाक्यांश लिख लिया है या उसका बैकअप ले लिया है {{cloudProviderName}}. अन्यथा आप अपने फंड तक नहीं पहुंच पाएंगे।", - "account.recoveryPhrase.remove.final.title": "आप अपना पुनर्प्राप्ति वाक्यांशहटा रहे हैं", - "account.recoveryPhrase.remove.import.description": "आप एक समय में केवल एक पुनर्प्राप्ति वाक्यांश संग्रहीत कर सकते हैं। नया आयात जारी रखने के लिए, आपको इस डिवाइस से अपने वर्तमान पुनर्प्राप्ति वाक्यांश और किसी भी संबद्ध वॉलेट को हटाना होगा।", - "account.recoveryPhrase.remove.initial.description": "यह आपके पुनर्प्राप्ति वाक्यांश के साथ आपके वॉलेट को इस डिवाइस से हटा देगा।", - "account.recoveryPhrase.remove.initial.title": "आप {{walletName}}हटा रहे हैं", - "account.recoveryPhrase.remove.mnemonic.description": "आपका पुनर्प्राप्ति वाक्यांश तब तक संग्रहीत रहेगा जब तक आप शेष सभी वॉलेट्स को हटा नहीं देते।", - "account.recoveryPhrase.subtitle.import": "आपका पुनर्प्राप्ति वाक्यांश केवल आपके डिवाइस पर स्थानीय रूप से संग्रहीत किया जाएगा।", - "account.recoveryPhrase.subtitle.restoring": "नीचे अपना पुनर्प्राप्ति वाक्यांश दर्ज करें, या फिर से बैकअप खोजने का प्रयास करें।", - "account.recoveryPhrase.title.import": "अपना पुनर्प्राप्ति वाक्यांश दर्ज करें", - "account.recoveryPhrase.title.restoring": "कोई बैकअप नहीं मिला", - "account.wallet.action.copy": "पता कॉपी करें", - "account.wallet.action.manageConnections": "संबंधों का प्रबंधन", - "account.wallet.action.report": "प्रोफाइल रिपोर्ट करें", - "account.wallet.action.viewExplorer": "{{blockExplorerName}}पर देखें", - "account.wallet.button.add": "बटुआ जोड़ें", - "account.wallet.button.addViewOnly": "केवल-दृश्य बटुआ जोड़ें", - "account.wallet.button.create": "एक नया वॉलेट बनाएं", - "account.wallet.button.import": "एक नया बटुआ आयात करें", - "account.wallet.button.manage": "वॉलेट सेटिंग्स", - "account.wallet.button.remove": "बटुआ हटाओ", - "account.wallet.button.watch": "एक बटुआ देखो", - "account.wallet.create.placeholder": "वॉलेट {{index}}", - "account.wallet.edit.label.input.placeholder": "वॉलेट लेबल", - "account.wallet.header.button.disabled.title": "प्रोफ़ाइल संपादित करें", - "account.wallet.header.button.title": "लेबल संपादित करें", - "account.wallet.header.viewOnly": "केवल देखने योग्य वॉलेट", - "account.wallet.menu.claimUsername": "उपयोगकर्ता नाम का दावा करें", - "account.wallet.menu.copy.title": "वॉलेट पता कॉपी करें", - "account.wallet.menu.edit.title": "लेबल संपादित करें", - "account.wallet.menu.manageConnections": "संबंधों का प्रबंधन", - "account.wallet.menu.remove.title": "बटुआ हटाओ", - "account.wallet.remove.check": "मैंने अपने पुनर्प्राप्ति वाक्यांश का समर्थन किया है और समझता हूं कि यदि मैं ऐसा करने में विफल रहता हूं तो Uniswap Labs मेरे बटुए को पुनर्प्राप्त करने में मेरी सहायता नहीं कर सकती है।", - "account.wallet.remove.title": "{{name}}हटाएँ", - "account.wallet.remove.viewOnly": "आप वॉलेट का पता दर्ज करके हमेशा केवल-बैक-व्यू वॉलेट जोड़ सकते हैं।", - "account.wallet.restore.new_device.description": "चूंकि आप नए डिवाइस पर हैं, इसलिए आपको जारी रखने के लिए अपना पुनर्प्राप्ति वाक्यांश पुनर्स्थापित करना होगा या अपना क्लाउड बैकअप पासवर्ड दर्ज करना होगा.", - "account.wallet.restore.new_device.title": "अपना बटुआ पुनः प्राप्त करें", - "account.wallet.restore.seed_phrase.description": "आपका पुनर्प्राप्ति वाक्यांश आपके डिवाइस से गायब है। यह सुनिश्चित करने के लिए कि आप अपने फंड तक कभी भी पहुँच न खोएँ, हमें आपसे अपने वॉलेट को पुनर्स्थापित करने की आवश्यकता होगी।", - "account.wallet.restore.seed_phrase.title": "अपना वॉलेट पुनर्स्थापित करें", - "account.wallet.select.error": "पते लोड नहीं किये जा सके", - "account.wallet.select.loading.subtitle": "आपके बटुए नीचे दिखाई देंगे.", - "account.wallet.select.loading.title": "बटुए खोज रहे हैं", - "account.wallet.select.smartWalletDisclaimer": "डिफ़ॉल्ट रूप से, सभी पात्र वॉलेट आयात किए जाने के बाद स्मार्ट वॉलेट सुविधाओं का उपयोग करेंगे। स्मार्ट वॉलेट क्या है?", - "account.wallet.select.title_one_one": "एक बटुआ मिला", - "account.wallet.select.title_one_other": "आयात करने के लिए वॉलेट चुनें", - "account.wallet.viewOnly.button": "बटुआ आयात करें", - "account.wallet.viewOnly.description": "टोकन स्वैप करने, खरीदने, भेजने और प्राप्त करने के लिए, आपको इस वॉलेट के पुनर्प्राप्ति वाक्यांश को आयात करना होगा।", - "account.wallet.viewOnly.title": "यह वॉलेट केवल देखने के लिए है", - "account.wallet.watch.error.alreadyImported": "यह पता पहले ही आयात किया जा चुका है", - "account.wallet.watch.error.notFound": "पता नहीं पाया गया", - "account.wallet.watch.error.smartContract": "पता एक स्मार्ट अनुबंध है", - "account.wallet.watch.message": "केवल-दृश्य वॉलेट जोड़ने से आप ऐप को आज़मा सकते हैं या वॉलेट को ट्रैक कर सकते हैं। आप धनराशि की अदला-बदली या भेजने में सक्षम नहीं होंगे।", - "account.wallet.watch.placeholder": "ईएनएस या पता", - "account.wallet.watch.title": "वॉलेट पता दर्ज करें", - "activity.pending": "{{pendingActivityCount}} लंबित", - "activity.transaction.lpRewards.descriptor": "{{symbol}} पुरस्कार एकत्रित", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} से {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolB}}के बदले {{amountWithSymbolA}}", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} और {{amountWithSymbolB}}", - "addLiquidity.shareOfPool": "पूल का हिस्सा", - "addressInput.recipient": "प्राप्तकर्ता", - "analytics.allow": "विश्लेषण की अनुमति दें", - "analytics.allow.message": "हम यूनिस्वैप लैब्स उत्पादों के साथ आपके अनुभव को बढ़ाने के लिए अनाम डेटा का उपयोग करते हैं।", - "appRating.button.notReally": "ज़रूरी नहीं", - "appRating.description": "हमें बताएं कि क्या आपको इस ऐप के साथ अच्छा अनुभव हो रहा है", - "appRating.extension.review.description": "एक स्टार रेटिंग चुनें और Chrome वेब स्टोर पर समीक्षा छोड़ें.", - "appRating.extension.review.title": "Uniswap एक्सटेंशन की समीक्षा करें?", - "appRating.extension.title": "क्या आप Uniswap एक्सटेंशन का आनंद ले रहे हैं?", - "appRating.feedback.button.send": "प्रतिक्रिया भेजें", - "appRating.feedback.description": "हमें बताएं कि हम आपके अनुभव को कैसे बेहतर बना सकते हैं", - "appRating.feedback.title": "हमें यह सुनकर खेद है।", - "appRating.mobile.title": "क्या आप यूनिस्वैप वॉलेट का आनंद ले रहे हैं?", - "bridgedAsset.modal.button": "अदला-बदली जारी रखें", - "bridgedAsset.modal.description": "यह {{currencySymbol}} का {{chainName}} संस्करण है जो मूल {{currencySymbol}}के समान मूल्य द्वारा समर्थित है और बनाए रखता है।", - "bridgedAsset.modal.feature.securelyBacked": "सुरक्षित रूप से समर्थित", - "bridgedAsset.modal.feature.securelyBacked.description": "1:1 मूल {{currencySymbol}}द्वारा समर्थित।", - "bridgedAsset.modal.feature.tradeSeamlessly": "निर्बाध रूप से व्यापार करें", - "bridgedAsset.modal.feature.tradeSeamlessly.description": "Uniswap छोड़े बिना {{currencySymbol}} खरीदें और बेचें।", - "bridgedAsset.modal.feature.withdrawToNativeChain": "{{nativeChainName}}तक वापस ले जाएँ", - "bridgedAsset.modal.feature.withdrawToNativeChain.description": "किसी भी समय मूल नेटवर्क पर वापस ब्रिज करें।", - "bridgedAsset.modal.title": "{{currencySymbol}} को {{chainName}}पर ट्रेड करें", - "bridgedAsset.send.warning.description": "आप {{currencySymbol}} का एक रैप्ड संस्करण {{chainName}}पर भेज रहे हैं। इसे किसी केंद्रीकृत एक्सचेंज में भेजने से धन की स्थायी हानि होगी।", - "bridgedAsset.send.warning.title": "सुनिश्चित करें कि आप संगत पते पर भेज रहे हैं", - "bridgedAsset.tdp.description": "यह {{currencySymbol}} का एक ब्रिज्ड संस्करण है जो 1:1 है और मूल {{currencySymbol}}द्वारा समर्थित है।", - "bridgedAsset.wormhole.button": "वर्महोल तक जारी रखें", - "bridgedAsset.wormhole.description": "अपने {{currencySymbol}} को {{chainName}} से {{nativeChainName}}तक पुल करने के लिए वर्महोल पोर्टल पर जारी रखें।", - "bridgedAsset.wormhole.title": "{{currencySymbol}} को {{nativeChainName}}तक वापस ले जाएँ", - "bridgedAsset.wormhole.toNativeChain": "{{nativeChainName}}तक", - "bridgedAsset.wormhole.withdrawToNativeChain": "{{nativeChainName}}तक वापस ले जाएँ", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "chart.candlestick": "मोमबत्ती", - "chart.error.pools": "वर्तमान पूल के लिए ऐतिहासिक डेटा प्रदर्शित करने में असमर्थ.", - "chart.error.tokens": "वर्तमान टोकन के लिए ऐतिहासिक डेटा प्रदर्शित करने में असमर्थ.", - "chart.line": "पंक्ति चार्ट", - "chart.missingData": "चार्ट डेटा गुम है", - "chart.price.label.close": "बंद करना", - "chart.price.label.high": "उच्च", - "chart.price.label.low": "कम", - "chart.price.label.open": "खुला", - "chart.settings.unavailable.label": "यह सेटिंग वर्तमान चार्ट के लिए उपलब्ध नहीं है", - "claim.thanks": "Uniswap समुदाय का हिस्सा बनने के लिए धन्यवाद ", - "claim.uni.arrived": "यूएनआई आ गया है", - "common.about": "के बारे में", - "common.accept": "स्वीकार करना", - "common.active": "सक्रिय", - "common.activeNetworks": "सक्रिय नेटवर्क", - "common.activity": "गतिविधि", - "common.add.label": "जोड़ना", - "common.add.liquidity.canceled": "तरलता जोड़ना रद्द कर दिया गया", - "common.addLiquidity": "तरलता जोड़ें", - "common.address": "पता", - "common.addressOrENS": "वॉलेट पता या ENS नाम", - "common.advanced": "विकसित", - "common.all": "सभी", - "common.allTime": "पूरे समय", - "common.and": "और", - "common.app": "अनुप्रयोग", - "common.approved": "अनुमत", - "common.approvePending": "स्वीकृति लंबित...", - "common.approvePermitTx": "अनुरोध स्वीकृत करें {{indexText}}", - "common.approvePermitTx.active": "वॉलेट में अनुरोध{{indexText}} स्वीकृत करें", - "common.approvePermitTx.explainer": "परमिट2 अनुमोदन क्या हैं?", - "common.approvePermitTx.pending": "अनुरोध स्वीकृत किया जा रहा है {{indexText}}...", - "common.approveSpend": "{{symbol}} व्यय स्वीकृत करें", - "common.approving": "का अनुमोदन", - "common.approximatelyValue": "~{{value}}", - "common.areYouSure": "क्या आपको यकीन है?", - "common.automatic": "ऑटो", - "common.availableIn": "यूनिस्वैप उपलब्ध है: ", - "common.availableOnIOSAndroidChrome": "iOS, Android और Chrome पर उपलब्ध", - "common.backToPositions": "पदों पर वापस जाएं", - "common.bestRoute": "मार्ग", - "common.bestRoute.with": "मार्ग {{provider}}से होकर", - "common.biometrics.generic": "बॉयोमेट्रिक्स", - "common.biometrics.touchId": "टच आईडी", - "common.biometrics.windowsHello": "विंडोज़ हैलो", - "common.blocked.ifError": "यदि आपको लगता है कि यह एक त्रुटि है, तो कृपया अपना पता सहित एक ईमेल पर भेजें", - "common.blocked.reason": "यह पता Uniswap Labs इंटरफ़ेस पर अवरुद्ध है क्योंकि यह एक या अधिक अवरुद्ध गतिविधियोंसे संबद्ध है।", - "common.blockedAddress": "अवरुद्ध पता", - "common.blog": "ब्लॉग", - "common.bought": "खरीदा", - "common.brandAssets": "ब्रांड परिसंपत्तियां", - "common.button.accept": "स्वीकार करना", - "common.button.back": "पीछे", - "common.button.buy": "खरीदना", - "common.button.cancel": "रद्द करना", - "common.button.checkin": "चेक इन", - "common.button.close": "बंद करना", - "common.button.confirm": "पुष्टि करना", - "common.button.connect": "जोड़ना", - "common.button.continue": "जारी रखना", - "common.button.copied": "कॉपी किया गया", - "common.button.copy": "प्रतिलिपि", - "common.button.create": "बनाएं", - "common.button.delete": "मिटाना", - "common.button.disable": "अक्षम करना", - "common.button.disabling": "अक्षम करने", - "common.button.disconnect": "डिस्कनेक्ट", - "common.button.dismiss": "नकार देना", - "common.button.done": "हो गया", - "common.button.edit": "संपादन करना", - "common.button.enable": "सक्षम", - "common.button.finish": "खत्म करना", - "common.button.goBack": "वापस जाओ", - "common.button.later": "शायद बाद में", - "common.button.learn": "और अधिक जानें", - "common.button.next": "अगला", - "common.button.notNow": "अभी नहीं", - "common.button.ok": "ठीक है", - "common.button.paste": "पेस्ट करें", - "common.button.pay": "वेतन", - "common.button.proceed": "आगे बढ़ना", - "common.button.receive": "प्राप्त करें", - "common.button.remove": "निकालना", - "common.button.reset": "रीसेट करें", - "common.button.retry": "पुन: प्रयास करें", - "common.button.reveal": "प्रकट करना", - "common.button.review": "समीक्षा", - "common.button.save": "बचाना", - "common.button.scrollDown": "नीचे स्क्रॉल करें", - "common.button.sell": "बेचना", - "common.button.send": "भेजना", - "common.button.setup": "स्थापित करना", - "common.button.share": "शेयर करना", - "common.button.showLess": "कम दिखाएं", - "common.button.showMore": "और दिखाओ", - "common.button.sign": "संकेत", - "common.button.skip": "छोडना", - "common.button.swap": "बदलना", - "common.button.tryAgain": "पुनः प्रयास करें", - "common.button.understand": "मैं समझता हूँ", - "common.button.unlock": "अनलॉक", - "common.button.view": "देखना", - "common.button.viewDetails": "विवरण देखें", - "common.button.yes": "हाँ", - "common.buy.label": "खरीदना", - "common.buyAndSell": "यूनिस्वैप पर खरीदें और बेचें", - "common.cancellationSubmitted": "निरस्तीकरण प्रस्तुत किया गया", - "common.cancellationSuccessful": "रद्दीकरण सफल", - "common.cancelOrder": "आदेश रद्द", - "common.card.error.description": "कुछ गलत हो गया", - "common.card.error.title": "उफ़! कुछ गलत हो गया।", - "common.careers": "करियर", - "common.chain.networkCost": "{{chain}} नेटवर्क लागत", - "common.chart": "चार्ट", - "common.checkNetwork": "नेटवर्क स्थिति यहां जांचें।", - "common.chromeExtension": "विस्तार", - "common.claim.failed": "दावा विफल", - "common.claimed": "दावा किया", - "common.claiming": "का दावा", - "common.claimUnis": "अपने UNI टोकन का दावा करें", - "common.clear": "स्पष्ट", - "common.close": "बंद करना", - "common.closed": "बंद किया हुआ", - "common.collect.button": "इकट्ठा करना", - "common.company": "कंपनी", - "common.confirm": "पुष्टि करना", - "common.confirmCancellation": "रद्दीकरण की पुष्टि करें", - "common.confirmed": "की पुष्टि", - "common.confirmSend.button": "भेजने की पुष्टि करें", - "common.confirmSwap": "वॉलेट में स्वैप की पुष्टि करें", - "common.confirmTimedOut": "पुष्टिकरण समय समाप्त हो गया है। कृपया पुनः प्रयास करें।", - "common.confirmTransfer": "स्थानांतरण की पुष्टि करें", - "common.confirmWallet": "वॉलेट में पुष्टि करें", - "common.connect.button": "जोड़ना", - "common.connectAWallet.button": "वॉलेट कनेक्ट करें", - "common.connectAWallet.button.evm": "एथेरियम वॉलेट कनेक्ट करें", - "common.connectAWallet.button.evm.switch": "एथेरियम वॉलेट स्विच करें", - "common.connectAWallet.button.svm": "सोलाना वॉलेट कनेक्ट करें", - "common.connectAWallet.button.svm.switch": "सोलाना वॉलेट स्विच करें", - "common.connectAWallet.button.switch": "वॉलेट स्विच करें", - "common.connectTo": "{{platform}}से कनेक्ट करें", - "common.connectWallet.button": "वॉलेट कनेक्ट करें", - "common.contactUs.button": "संपर्क करें", - "common.copied": "कॉपी किया गया", - "common.copy.address": "पता कॉपी करें", - "common.copy.poolId": "पूल आईडी कॉपी करें", - "common.copyLink.button": "लिंक की प्रतिलिपि करें", - "common.created.date": "बनाया गया {{date}}", - "common.currency": "मुद्रा", - "common.currentPrice": "मौजूदा कीमत", - "common.custom": "रिवाज़", - "common.customRange": "कस्टम रेंज", - "common.dataOutdated": "डेटा पुराना हो सकता है", - "common.day": "दिन", - "common.default": "गलती करना", - "common.defaultTradeOptions": "डिफ़ॉल्ट व्यापार विकल्प", - "common.deposit.toNetwork": "{{label}} नेटवर्क पर टोकन जमा करें।", - "common.depositing": "जमा", - "common.depositTokens": "टोकन जमा करें", - "common.detected": "का पता चला", - "common.developers": "डेवलपर्स", - "common.device": "यह डिवाइस", - "common.device.other": "अन्य डिवाइस", - "common.dismiss": "नकार देना", - "common.docs": "डॉक्स", - "common.donate": "दान करें", - "common.done": "हो गया", - "common.dontShowAgain": "इसे दोबारा न दिखाएं", - "common.download": "डाउनलोड करना", - "common.downloadAppStore": "ऐप स्टोर से डाउनलोड करें", - "common.downloadPlayStore": "प्ले स्टोर से डाउनलोड करें", - "common.downloadUniswapApp": "यूनिस्वैप ऐप डाउनलोड करें", - "common.downloadUniswapWallet": "Uniswap वॉलेट डाउनलोड करें", - "common.dynamic": "गतिशील", - "common.edit.button": "संपादन करना", - "common.ended": "समाप्त", - "common.error.details": "त्रुटि विवरण", - "common.error.general": "कुछ गलत हो गया", - "common.error.label": "गलती", - "common.error.request": "क्षमा करें, आपके अनुरोध को संसाधित करते समय एक त्रुटि हुई। यदि आप सहायता का अनुरोध करते हैं, तो इस त्रुटि का विवरण कॉपी करना सुनिश्चित करें।", - "common.error.somethingWrong": "कुछ गलत हो गया!", - "common.errorConnecting.error": "संपर्क त्रुटि", - "common.errorLoadingData.error": "डेटा लोड करते समय त्रुटि", - "common.etherscan": "इथरस्कैन", - "common.expiry": "समाप्ति", - "common.explore": "अन्वेषण करना", - "common.explorer": "एक्सप्लोरर", - "common.exploreTokens": "टोकन एक्सप्लोर करें", - "common.extension": "यूनिस्वैप एक्सटेंशन", - "common.failedSwitchNetwork": "नेटवर्क स्विच करने में विफल", - "common.fee": "शुल्क", - "common.fees": "फीस", - "common.feesEarned": "अर्जित शुल्क", - "common.feesEarnedPerBase": "{{symbolA}} प्रति {{symbolB}}", - "common.for": "के लिए", - "common.free": "मुक्त", - "common.fullRange": "पूरी श्रृंखला", - "common.getApp": "एप पाओ", - "common.getHelp.button": "मदद लें", - "common.getStarted": "शुरू हो जाओ", - "common.getSupport.button": "समर्थन प्राप्त करें", - "common.getTheApp": "अबेदन पत्र लो", - "common.getUniswapWallet": "Uniswap वॉलेट प्राप्त करें", - "common.getUniswapWallet.mobile": "Uniswap मोबाइल ऐप प्राप्त करें", - "common.governance": "शासन", - "common.happyHolidays": "यूनिस्वैप टीम की ओर से छुट्टियों की शुभकामनाएँ!", - "common.help": "मदद", - "common.helpCenter": "सहायता केंद्र", - "common.hidden": "छिपा हुआ", - "common.hide.button": "छिपाना", - "common.highPrice": "उच्च कीमत", - "common.includes": "शामिल", - "common.info.label": "जानकारी", - "common.input.noRecipient.error": "प्राप्तकर्ता चुनें", - "common.input.password.confirm": "पासवर्ड की पुष्टि कीजिये", - "common.input.password.error.mismatch": "पासवर्ड मेल नहीं खाते", - "common.input.password.error.weak": "यह पासवर्ड बहुत कमज़ोर है", - "common.input.password.new": "नया पासवर्ड", - "common.input.password.placeholder": "पासवर्ड", - "common.input.password.strength.medium": "मध्यम", - "common.input.password.strength.strong": "मज़बूत", - "common.input.password.strength.weak": "कमज़ोर", - "common.input.search": "खोज", - "common.insufficient.funds": "अपर्याप्त कोष", - "common.insufficientBalance.error": "अपर्याप्त शेषराशि", - "common.insufficientFundsForNetworkFee.error": "नेटवर्क लागत को कवर करने के लिए अपर्याप्त धन", - "common.insufficientTokenBalance.error": "अपर्याप्त {{tokenSymbol}} संतुलन", - "common.insufficientTokenBalance.error.simple": "पर्याप्त नहीं {{tokenSymbol}}", - "common.invalidPair": "अमान्य जोड़ी", - "common.invalidRecipient.error": "अवैध प्राप्तकर्ता", - "common.iOSAndroid": "आईओएस और एंड्रॉइड", - "common.language": "भाषा", - "common.learnMoreSwap": "स्वैप के बारे में अधिक जानें", - "common.legalAndPrivacy": "कानूनी और गोपनीयता", - "common.less": "कम", - "common.limit.cancel_one": "सीमा रद्द करें", - "common.limit.cancel_other": "{{count}} सीमाएँ रद्द करें", - "common.limit.canceled": "सीमा रद्द", - "common.limit.executed": "सीमा निष्पादित", - "common.limit.expired": "सीमा समाप्त हो गई", - "common.limit.failed": "सीमा विफल", - "common.limit.opened": "सीमा खोली गई", - "common.limit.pending": "सीमा लंबित", - "common.limits": "सीमाएं", - "common.limits.approachMax": "अधिकतम सीमा 100 के करीब", - "common.limits.cancelProceed": "आगे बढ़ने के लिए सीमाएँ रद्द करें", - "common.limits.expires": "समाप्त {{timestamp}}", - "common.limits.open": "खुली सीमाएँ", - "common.limits.when": "जब {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "लिंक", - "common.liquidity": "लिक्विडिटी", - "common.liquidity.provision": "तरलता प्रावधान", - "common.liquidity.removed": "तरलता हटा दी गई", - "common.loading": "लोड हो रहा है", - "common.longText.button.less": "कम पढ़ें", - "common.longText.button.more": "और पढ़ें", - "common.lowPrice": "कम कीमत", - "common.manage": "प्रबंधित करना", - "common.market.label": "बाज़ार", - "common.marketPrice": "बाजार कीमत", - "common.marketPrice.fetching": "बाजार मूल्य प्राप्त किया जा रहा है...", - "common.marketPrice.label": "बाजार कीमत:", - "common.marketPrice.unavailable": "बाजार मूल्य नहीं मिला। कृपया धन की हानि से बचने के लिए स्वयं शोध करें।", - "common.max": "अधिकतम", - "common.message": "संदेश", - "common.migrate": "माइग्रेट", - "common.migrate.liquidity.failed": "तरलता स्थानांतरण विफल", - "common.migrate.position": "स्थान परिवर्तन", - "common.migrated.liquidity": "माइग्रेटेड लिक्विडिटी", - "common.migrating.liquidity": "तरलता का स्थानांतरण", - "common.min": "मिन", - "common.more": "अधिक", - "common.moreDetails": "अधिक जानकारी", - "common.navigation.settings": "समायोजन", - "common.navigation.systemSettings": "समायोजन", - "common.navigationButton": "नेविगेशन बटन", - "common.needHelp": "मदद की ज़रूरत है?", - "common.networkCost": "नेटवर्क लागत", - "common.neverMind": "कोई बात नहीं", - "common.new": "नया", - "common.new.exclamation": "नया!", - "common.nft": "एनएफटी", - "common.nfts": "एनएफटी", - "common.noAmount.error": "राशि दर्ज करें", - "common.noData": "कोई डेटा नहीं", - "common.none": "कोई नहीं", - "common.noResults": "कोई परिणाम नहीं मिला।", - "common.notAvailableInRegion.error": "आपके क्षेत्र में उपलब्ध नहीं है", - "common.notCreated.label": "नहीं बनाया गया", - "common.notSupported": "समर्थित नहीं", - "common.oneDay": "1 दिन", - "common.oneDay.short": "-1 डी", - "common.oneHour.short": "1 घंटे", - "common.oneMonth": "1 महीना", - "common.oneWeek": "1 सप्ताह", - "common.oneYear": "1 वर्ष", - "common.opensea.link": "ओपनसी पर देखें", - "common.orderCanceled": "आदेश रद्द कर दिया गया", - "common.orderExecuted": "आदेश निष्पादित", - "common.orderExpired": "ऑर्डर समाप्त हो गया", - "common.orderPending": "आदेश लम्बित", - "common.outOfRange": "सीमा से बाहर", - "common.pageNotFound": "पृष्ठ नहीं मिला!", - "common.passkey.count": "पासकी {{number}}", - "common.passkeys": "पासकीज़", - "common.passkeys.add": "पासकी जोड़ें", - "common.passkeys.add.description": "अपनी नई पासकी को कहाँ सहेजना है, यह चुनें.", - "common.pastDay": "बीते दिन", - "common.pastFiveMinutes": "पिछले पांच मिनट", - "common.pastHour": "पिछले घंटे", - "common.pastMonth": "बीते हुए महीने में", - "common.pastWeek": "पिछले सप्ताह", - "common.pastYear": "पिछले एक साल", - "common.pending": "लंबित", - "common.pending.cancellation": "लंबित निरस्तीकरण", - "common.pendingEllipsis": "लंबित...", - "common.permit": "आज्ञा देना", - "common.plusMore": "+{{number}} अधिक", - "common.pool": "पूल", - "common.pools": "ताल", - "common.portfolio": "पोर्टफोलियो", - "common.poweredBy": "द्वारा संचालित", - "common.price": "कीमत", - "common.priceUpdated": "मूल्य अद्यतन", - "common.privacyChoices": "आपकी गोपनीयता विकल्प", - "common.privacyChoices.checkbox.description": "जब चेक किया जाता है, तो हम आपके डेटा को व्यक्तिगत विज्ञापन के लिए तीसरे पक्ष के भागीदारों के साथ साझा नहीं करेंगे। आप इस बॉक्स को अनचेक करके किसी भी समय साझाकरण सक्षम कर सकते हैं।", - "common.privacyChoices.checkbox.label": "मेरी जानकारी साझा न करें", - "common.privacyChoices.description": "हम अन्य वेबसाइटों और प्लेटफ़ॉर्म पर अपनी सेवाओं को बढ़ावा देने के लिए अपने विज्ञापन भागीदारों के साथ डिवाइस पहचानकर्ता साझा कर सकते हैं। जहां यह लागू कानूनों के तहत बिक्री, साझाकरण या लक्षित विज्ञापन के रूप में योग्य है, आप \"मेरी जानकारी साझा न करें\" बॉक्स को चेक करके ऑप्ट आउट कर सकते हैं। हमारी गोपनीयता प्रथाओं के बारे में अधिक जानकारी के लिए कृपया हमारी गोपनीयता नीतिकी समीक्षा करें।", - "common.privacyChoices.disclaimer": "कृपया ध्यान दें कि आपका चयन इस डिवाइस पर केवल इसी ब्राउज़र पर लागू होगा। आप हमारी सेवाओं तक पहुँचने के लिए जिस ब्राउज़र का उपयोग करते हैं, उसमें ग्लोबल प्राइवेसी कंट्रोल सेटिंग को सक्षम करके भी ऑप्ट आउट कर सकते हैं। अधिक विकल्प देखने के लिए, अपनी सेटिंग पर जाएँ।", - "common.privacyPolicy": "गोपनीयता नीति", - "common.proceed": "आगे बढ़ना", - "common.proceedInWallet": "अपने बटुए में आगे बढ़ें", - "common.products": "उत्पादों", - "common.protocol": "शिष्टाचार", - "common.protocol.v2": "यूनिस्वैप v2", - "common.protocol.v3": "यूनिस्वैप v3", - "common.protocol.v4": "यूनिस्वैप v4", - "common.purchased": "खरीदी", - "common.rate": "दर", - "common.readMore": "और पढ़ें", - "common.receive": "प्राप्त करें", - "common.received": "प्राप्त", - "common.recent": "हाल ही का", - "common.refresh": "ताज़ा करना", - "common.reload.label": "ऐप को पुनः लोड करें", - "common.remove.label": "निकालना", - "common.remove.liquidity.canceled": "तरलता हटाना रद्द", - "common.remove.liquidity.failed": "तरलता हटाना विफल", - "common.removing.liquidity": "तरलता हटाना", - "common.resetLimit": "{{symbol}} सीमा रीसेट करें", - "common.resetLimitWallet": "वॉलेट में {{symbol}} सीमा रीसेट करें", - "common.resettingLimit": "{{symbol}} सीमा रीसेट की जा रही है...", - "common.revoke.approval.failed": "अनुमोदन रद्द करना विफल", - "common.revoked.approval": "अनुमोदन निरस्त", - "common.revoking.approval": "अनुमोदन रद्द करना", - "common.scanQRDownload": "डाउनलोड करने के लिए अपने फ़ोन से QR कोड स्कैन करें", - "common.selectRegion.label": "अपना क्षेत्र चुनें", - "common.selectToken.label": "एक टोकन चुनें", - "common.sell.label": "बेचना", - "common.send.button": "भेजना", - "common.send.failed": "भेजना विफल", - "common.sending": "भेजना", - "common.sent": "भेजा", - "common.settings": "समायोजन", - "common.share": "शेयर करना", - "common.share.shareToTwitter": "ट्विटर पर साझा करें", - "common.show.button": "दिखाओ", - "common.showLess.button": "कम दिखाएं", - "common.showMore.button": "और दिखाओ", - "common.signatureExpired": "आपके हस्ताक्षर की समय सीमा समाप्त हो गई है।", - "common.signMessage": "संदेश पर हस्ताक्षर करें", - "common.signMessageWallet": "वॉलेट में संदेश पर हस्ताक्षर करें", - "common.socials": "सामाजिक", - "common.sold": "बिका हुआ", - "common.stats": "आँकड़े", - "common.status": "स्थिति", - "common.step.number": "Step {{number}}", - "common.step.number.of": "चरण {{current}} का {{total}}", - "common.swap": "बदलना", - "common.swap.expired": "स्वैप की अवधि समाप्त हो गई", - "common.swap.failed": "स्वैप विफल", - "common.swapPending": "स्वैप लंबित...", - "common.termsOfService": "सेवा की शर्तें", - "common.text.connected": "जुड़े हुए", - "common.text.contract": "अनुबंध", - "common.text.disconnected": "डिस्कनेक्ट किया गया", - "common.text.error": "गलती", - "common.text.notAvailable": "एन/ए", - "common.text.recipient": "को", - "common.text.sender": "से", - "common.text.unknown": "अज्ञात", - "common.thisAccount": "इस खाते", - "common.thisMonth": "इस महीने", - "common.thisToken": "यह टोकन", - "common.thisWeek": "इस सप्ताह", - "common.thisYear": "इस साल", - "common.time": "समय", - "common.time.minute.amt": "{{time}}मिनट", - "common.time.minutes": "मिनट", - "common.time.past.days": "{{days}} दिन", - "common.time.past.days.short": "{{days}}घ", - "common.time.past.hours": "{{hours}} घंटे", - "common.time.past.hours.short": "{{hours}}एच", - "common.time.past.minutes.short": "{{minutes}}मी", - "common.time.past.months.short": "{{months}}मो", - "common.time.past.seconds.short": "{{seconds}}एस", - "common.to": "को", - "common.today": "आज", - "common.tokenA": "टोकन ए", - "common.tokenAmount": "टोकन राशि", - "common.tokenB": "टोकन बी", - "common.tokenName": "टोकन नाम", - "common.tokens": "टोकन", - "common.totalUniswapTVL": "कुल यूनिस्वैप टीवीएल", - "common.totalValueLocked": "टी वी लाइनों", - "common.trade": "व्यापार", - "common.trademarkPolicy": "ट्रेडमार्क नीति", - "common.transactionDetails": "लेनदेन का विवरण", - "common.transactionId": "लेन-देन आईडी", - "common.transactionPending": "लेन-देन लंबित", - "common.transactions": "लेनदेन", - "common.transactionSettings": "लेनदेन सेटिंग्स", - "common.transfer_one": "स्थानांतरण", - "common.transfer_other": "तबादलों", - "common.tryAgain.error": "पुनः प्रयास करें", - "common.twitter": "ट्विटर", - "common.type.label": "प्रकार", - "common.unavailable": "अनुपलब्ध", - "common.unhide": "सामने लाएँ", - "common.unichain": "यूनिचेन", - "common.uniswapMobile": "यूनिस्वैप मोबाइल", - "common.uniswapWallet": "यूनिस्वैप वॉलेट", - "common.uniswapX": "यूनिस्वैपएक्स", - "common.unknown": "अज्ञात", - "common.unknownError.error": "अज्ञात त्रुटि", - "common.unwrap.button": "खोलना", - "common.unwrap.failed": "खोलना विफल", - "common.unwrapped": "लपेटा न", - "common.unwrapping": "खोलना", - "common.view.profile": "प्रोफ़ाइल देखें", - "common.viewOnExplorer": "एक्सप्लोरर पर देखें", - "common.volume": "आयतन", - "common.vote": "वोट", - "common.wallet.approve": "वॉलेट में स्वीकृति दें", - "common.wallet.label": "बटुआ", - "common.warning": "चेतावनी", - "common.webApp": "वेब अप्प", - "common.website": "वेबसाइट", - "common.whyApprove": "मुझे टोकन स्वीकृत क्यों करना होगा?", - "common.whySign": "हस्ताक्षर क्यों आवश्यक हैं?", - "common.whyWrap": "मुझे अपना {{symbol}}क्यों लपेटना है?", - "common.withdraw": "निकालना", - "common.withdrawal.amount": "निकासी राशि", - "common.withinRange": "सीमा में", - "common.wrap": "लपेटें {{symbol}}", - "common.wrap.failed": "लपेटना विफल", - "common.wrapIn": "{{symbol}} को बटुए में लपेटें", - "common.wrapped": "लपेटा हुआ", - "common.wrapping": "रैपिंग", - "common.wrappingToken": "लपेटना {{symbol}}...", - "common.yesterday": "कल", - "common.your.account.had.insufficient.funds": "इस स्वैप को पूरा करने के लिए आपके खाते में अपर्याप्त धनराशि थी।", - "common.your.account.has.insufficient.funds": "इस स्वैप को पूरा करने के लिए आपके खाते में अपर्याप्त धनराशि है।", - "common.your.connected.wallet": "आपका कनेक्टेड वॉलेट", - "common.your.limit.could.not.be.fulfilled": "इस समय आपकी सीमा पूरी नहीं हो सकी। कृपया पुनः प्रयास करें।", - "common.your.swap.could.not.be.fulfilled": "इस समय आपका स्वैप पूरा नहीं हो सका। कृपया पुनः प्रयास करें।", - "common.youreBuying": "आप खरीद रहे हैं", - "common.youReceive": "आपको प्राप्त हुया", - "common.youreSelling": "आप बेच रहे हैं", - "currency.ars": "अर्जेंटीनी पेसो", - "currency.aud": "ऑस्ट्रलियन डॉलर", - "currency.brl": "ब्राजीली रियल", - "currency.cad": "कैनेडियन डॉलर", - "currency.cny": "चीनी युवान", - "currency.cop": "कोलम्बियाई पेसो", - "currency.eur": "यूरो", - "currency.gbp": "ब्रिटिश पाउंड", - "currency.hkd": "हांगकांग का डॉलर", - "currency.idr": "इंडोनेशियाई रुपिया", - "currency.inr": "भारतीय रुपया", - "currency.jpy": "जापानी येन", - "currency.krw": "दक्षिण कोरियाई वोन", - "currency.mxn": "मैक्सिकन पेसो", - "currency.ngn": "नाइजीरियाई नायरा", - "currency.pkr": "पाकिस्तानी रुपया", - "currency.rub": "रूसी रूबल", - "currency.sgd": "सिंगापुर का डॉलर", - "currency.try": "तुर्की लीरा", - "currency.uah": "यूक्रेनी रिव्निया", - "currency.usd": "यूनाइटेड स्टेट का डॉलर", - "currency.vnd": "वियतनामी डोंग", - "dapp.request.actionCannotBeCompleted.description": "कुछ कार्यक्षमता उपलब्ध नहीं है क्योंकि आपकी स्मार्ट वॉलेट सेटिंग किसी अन्य वॉलेट ऐप द्वारा प्रबंधित की जा रही है।", - "dapp.request.actionCannotBeCompleted.header": "हस्ताक्षर अनुरोध", - "dapp.request.actionCannotBeCompleted.title": "कार्रवाई पूरी नहीं की जा सकती", - "dapp.request.approve.action": "मंज़ूरी देना", - "dapp.request.approve.fallbackTitle": "टोकन खर्च करने की स्वीकृति दें", - "dapp.request.approve.helptext": "इस साइट को अपने वॉलेट से इस टोकन तक पहुंचने और खर्च करने की अनुमति दें।", - "dapp.request.approve.label": "बटुआ", - "dapp.request.approve.title": "व्यय स्वीकृत करें {{tokenSymbol}}", - "dapp.request.base.title": "लेन-देन अनुरोध", - "dapp.request.bridge.description": "ETH, USDC, और अधिक को {{numChains}}+ नेटवर्क पर ले जाएं।", - "dapp.request.bridge.title": "पुल बनाने की कोशिश कर रहे हैं?", - "dapp.request.connect.helptext": "इस साइट को अपना वॉलेट पता, शेष राशि देखने और लेनदेन के लिए अनुमोदन का अनुरोध करने की अनुमति दें।", - "dapp.request.connect.title": "साइट से कनेक्ट करें", - "dapp.request.fallback.calldata.label": "कच्चा डेटा", - "dapp.request.fallback.function.label": "समारोह", - "dapp.request.permit2.description": "परमिट2 कई dapps में टोकन अनुमोदन का प्रबंधन करता है।", - "dapp.request.permit2.header": "साइन परमिट2", - "dapp.request.permit2approve.action": "मंज़ूरी देना", - "dapp.request.permit2approve.helptext": "परमिट2 कई dapps में टोकन अनुमोदन का प्रबंधन करता है।", - "dapp.request.permit2approve.title": "परमिट स्वीकृत करें2", - "dapp.request.reject.action": "सभी अस्वीकार करें", - "dapp.request.reject.info": "आपके पास {{totalRequestCount}} लेनदेन अनुरोध हैं", - "dapp.request.revoke.action": "रद्द करना", - "dapp.request.revoke.helptext": "इस साइट को लेनदेन के लिए इस टोकन को खर्च करने की पहुँच रद्द करने की अनुमति दें। सुनिश्चित करें कि आप इस साइट पर भरोसा करते हैं।", - "dapp.request.revoke.title": "{{tokenSymbol}}तक पहुंच रद्द करें", - "dapp.request.signature.containsUnrenderableCharacters": "इस संदेश में अप्रतिपादनीय वर्ण हैं। सुनिश्चित करें कि आप इस साइट पर भरोसा करते हैं।", - "dapp.request.signature.decodeError": "संदेश डिकोड करने में विफल", - "dapp.request.signature.header": "हस्ताक्षर अनुरोध", - "dapp.request.signature.irregular": "अनियमित हस्ताक्षर अनुरोध", - "dapp.request.signature.irregular.description": "आगे बढ़ने से पहले सुनिश्चित करें कि आप इस साइट पर भरोसा करते हैं", - "dapp.request.signature.irregular.understand": "मैं जोखिम समझता हूं", - "dapp.request.signature.toggleDataView.raw": "कच्चा डेटा देखें", - "dapp.request.signature.toggleDataView.readable": "मूल डेटा देखें", - "dapp.request.warning.notActive.message": "सुनिश्चित करें कि यह सही है", - "dapp.request.warning.notActive.title": "यह आपका सक्रिय वॉलेट नहीं है", - "delegation.upgradeModal.description": "यह वॉलेट अपडेट तेज़, कम लागत वाले लेनदेन के लिए स्मार्ट कॉन्ट्रैक्ट का उपयोग करता है। अधिक जानें", - "delegation.upgradeModal.enableSmartWallet": "स्मार्ट वॉलेट सक्षम करें", - "delegation.upgradeModal.title": "बेहतर अदला-बदली, कम लागत", - "downloadApp.modal.connectExistingWallet": "मौजूदा वॉलेट को कनेक्ट करें", - "downloadApp.modal.getStarted.description": "दुनिया के सबसे बड़े ऑनचेन बाज़ार के माध्यम से तुरंत हजारों टोकन तक पहुंच प्राप्त करें।", - "downloadApp.modal.getStarted.title": "कुछ ही सेकंड में स्वैपिंग शुरू करें", - "downloadApp.modal.getTheApp.title": "Uniswap के साथ शुरुआत करें", - "downloadApp.modal.uniswapProducts.subtitle": "यूनिस्वैप उत्पाद सर्वोत्तम ऑनचेन अनुभव बनाने के लिए एक साथ मिलकर काम करते हैं।", - "empty.swap.button.text": "स्वैप में धनराशि जोड़ें", - "error.dataUnavailable": "फिलहाल डेटा उपलब्ध नहीं है; हम इसे ठीक करने पर काम कर रहे हैं", - "error.id": "त्रुटि ID: {{eventId}}", - "error.jupiterApi.execute.default.title": "Jupiter API में कुछ गड़बड़ी हुई है। कृपया पुनः प्रयास करें।", - "error.jupiterApi.failedToLand": "(कोड {{code}}: नेटवर्क पर लेन-देन विफल हुआ)", - "error.jupiterApi.invalidBlockHeight": "(कोड -1004: अमान्य ब्लॉक ऊंचाई)", - "error.jupiterApi.invalidMessageBytes": "(कोड -3: अमान्य संदेश बाइट्स)", - "error.jupiterApi.invalidPayload": "(कोड -2002: अमान्य पेलोड)", - "error.jupiterApi.invalidSignedTransaction": "(कोड -2: अमान्य हस्ताक्षरित लेनदेन)", - "error.jupiterApi.invalidTransaction": "(कोड -1002: अमान्य लेनदेन)", - "error.jupiterApi.missingCachedOrder": "(कोड -1: कैश्ड ऑर्डर गुम है)", - "error.jupiterApi.notFullySigned": "(कोड -1003: लेनदेन पूर्णतः हस्ताक्षरित नहीं है)", - "error.jupiterApi.quoteExpired": "इस उद्धरण का समय समाप्त हो गया है, कृपया पुनः प्रयास करें। (कोड -2003)", - "error.jupiterApi.unknownErrorCode": "(कोड {{code}})", - "error.noData": "डाटा प्राप्त नहीं हुआ", - "error.request.provideId": "क्षमा करें, आपके अनुरोध को संसाधित करते समय एक त्रुटि हुई। यदि आप सहायता का अनुरोध करते हैं, तो अपनी त्रुटि आईडी प्रदान करना सुनिश्चित करें।", - "error.tokenApproval": "टोकन अनुमोदन विफल", - "error.tokenApproval.message": "नेटवर्क या कनेक्शन संबंधी समस्या के कारण आपका अनुमोदन विफल हो सकता है। अपना कनेक्शन जांचें और पुनः प्रयास करें।", - "error.tokenApprovalEdited": "स्वीकृति राशि अपर्याप्त", - "error.tokenApprovalEdited.message": "आपके वॉलेट में सेट की गई स्वीकृति राशि इस लेनदेन को पूरा करने के लिए बहुत कम है। कृपया पुनः प्रयास करें और राशि बढ़ाएँ।", - "errors.crash.message": "कुछ दुर्घटनाग्रस्त हो गया.", - "errors.crash.restart": "ऐप पुनः प्रारंभ करें", - "errors.crash.title": "उह ओह!", - "explore.more.pools": "और अधिक पूल खोजें", - "explore.more.unichain": "यूनिचेन पूल का अन्वेषण करें", - "explore.search.label.ownedBy": "{{ownerAddress}}के स्वामित्व में है", - "explore.search.placeholder": "टोकन और वॉलेट खोजें", - "explore.search.section.nft": "एनएफटी संग्रह", - "explore.search.section.popularNFT": "लोकप्रिय एनएफटी संग्रह", - "explore.search.section.wallets": "पर्स", - "explore.tokens.error": "टोकन लोड नहीं किये जा सके", - "explore.tokens.favorite.action.add": "पसंदीदा टोकन", - "explore.tokens.favorite.action.edit": "पसंदीदा संपादित करें", - "explore.tokens.favorite.action.remove": "पसंदीदा हटाएँ", - "explore.tokens.favorite.title.default": "पसंदीदा टोकन", - "explore.tokens.favorite.title.edit": "पसंदीदा टोकन संपादित करें", - "explore.tokens.metadata.marketCap": "{{number}} एमकैप", - "explore.tokens.metadata.totalValueLocked": "{{number}} टीवीएल", - "explore.tokens.metadata.volume": "{{number}} वॉल्यूम", - "explore.tokens.sort.label.marketCap": "बाज़ार आकार", - "explore.tokens.sort.label.priceDecrease": "कीमत में कमी", - "explore.tokens.sort.label.priceIncrease": "मूल्य वृद्धि", - "explore.tokens.sort.label.totalValueLocked": "टी वी लाइनों", - "explore.tokens.sort.label.volume": "आयतन", - "explore.tokens.sort.option.marketCap": "बाज़ार आकार", - "explore.tokens.sort.option.priceDecrease": "कीमत में कमी (24 घंटे)", - "explore.tokens.sort.option.priceIncrease": "मूल्य वृद्धि (24 घंटे)", - "explore.tokens.sort.option.totalValueLocked": "यूनिस्वैप टीवीएल", - "explore.tokens.sort.option.volume": "यूनिस्वैप वॉल्यूम (24H)", - "explore.tokens.top.title": "शीर्ष टोकन", - "explore.v2TVL": "v2 टीवीएल", - "explore.v3TVL": "v3 टीवीएल", - "explore.v4TVL": "v4 टीवीएल", - "explore.wallets.favorite.action.add": "पसंदीदा बटुआ", - "explore.wallets.favorite.action.edit": "पसंदीदा संपादित करें", - "explore.wallets.favorite.action.remove": "पसंदीदा हटाएँ", - "explore.wallets.favorite.action.remove.short": "नापसंद करें", - "explore.wallets.favorite.title.default": "पसंदीदा बटुए", - "explore.wallets.favorite.title.edit": "पसंदीदा वॉलेट संपादित करें", - "extension.connection.network": "नेटवर्क", - "extension.connection.networks": "नेटवर्क", - "extension.connection.popup.trouble": "कनेक्ट करने में परेशानी?", - "extension.connection.titleConnected": "जुड़े हुए", - "extension.connection.titleNotConnected": "जुड़े नहीं हैं", - "extension.lock.button.forgot": "पासवर्ड भूल गए?", - "extension.lock.button.reset": "वॉलेट रीसेट करें", - "extension.lock.button.submit": "अनलॉक", - "extension.lock.password.error": "गलत पासवर्ड। पुनः प्रयास करें", - "extension.lock.password.reset.initial.description": "Uniswap आपका पासवर्ड रिकवर करने में मदद नहीं कर सकता। आपको अपना 12-शब्द रिकवरी वाक्यांश फिर से दर्ज करके अपना वॉलेट रीसेट करना होगा।", - "extension.lock.password.reset.initial.help": "मैं अपना पुनर्प्राप्ति वाक्यांश कहां पा सकता हूं?", - "extension.lock.password.reset.initial.title": "पासवर्ड भूल गए", - "extension.lock.password.reset.speedbump.description": "अपना वॉलेट रीसेट करने से पहले सुनिश्चित करें कि आपके पास 12-शब्दों वाला रिकवरी वाक्यांश है। अन्यथा आप अपने फंड को वापस नहीं पा सकेंगे।", - "extension.lock.password.reset.speedbump.help": "मैंने अपना पुनर्प्राप्ति वाक्यांश खो दिया", - "extension.lock.password.reset.speedbump.title": "इससे पहले कि आप जारी रखें", - "extension.lock.subtitle": "अनलॉक करने के लिए अपना पासवर्ड दर्ज करें", - "extension.lock.title": "वापसी पर स्वागत है", - "extension.network.notSupported": "असमर्थित नेटवर्क", - "extension.open": "Uniswap एक्सटेंशन खोलें", - "extension.passwordPrompt.error.wrongPassword": "गलत पासवर्ड। पुनः प्रयास करें", - "extension.passwordPrompt.title": "अपना कूटशब्द भरें", - "extension.popup.chrome.button": "एक्सटेंशन खोलें", - "extension.popup.chrome.description": "Uniswap एक्सटेंशन खोलकर यह क्रिया पूरी करें।", - "extension.popup.chrome.title": "Uniswap में जारी रखें", - "extension.settings.defaultWallet.message": "ऐप्स से कनेक्ट करते समय Uniswap एक्सटेंशन को प्राथमिकता दें।", - "extension.settings.defaultWallet.title": "डिफ़ॉल्ट वॉलेट बनाएं", - "extension.uninstall.reason.missingFeatures": "यूनिस्वैप वॉलेट में कुछ विशेषताओं का अभाव है", - "extension.uninstall.reason.notUsingCrypto": "मैं अब क्रिप्टो का उपयोग नहीं करना चाहता", - "extension.uninstall.reason.other": "अन्य कारण", - "extension.uninstall.reason.switchingWallet": "मैं एक अलग वॉलेट पर स्विच कर रहा हूँ", - "extension.uninstall.subtitle": "यदि आपके पास थोड़ा समय है, तो हम यह जानना चाहेंगे कि आपने Uniswap Wallet को अनइंस्टॉल क्यों किया", - "extension.uninstall.title": "हमें आपके जाने का दुख है", - "extension.warning.storage.button": "बैक अप", - "extension.warning.storage.message": "अपने वॉलेट और धन तक पहुंच खोने से बचने के लिए अपने रिकवरी वाक्यांश का बैकअप अवश्य लें।", - "extension.warning.storage.title": "आपके ब्राउज़र का स्टोरेज खत्म हो रहा है", - "extensionPasskeyLogInPopUp.description": "किसी मौजूदा पासकी से लॉग इन करके अपना यूनिस्वैप खाता आयात करें।", - "extensionPasskeyLogInPopUp.invalidReferrer": "कृपया यह पृष्ठ बंद करें और पुनः प्रयास करें।", - "fee.bestForCustomizability": "अनुकूलनशीलता के लिए सर्वश्रेष्ठ.", - "fee.bestForExotic": "विदेशी जोड़ों के लिए सर्वोत्तम।", - "fee.bestForMost": "अधिकांश जोड़ों के लिए सर्वोत्तम।", - "fee.bestForStablePairs": "स्थिर जोड़ों के लिए सर्वोत्तम।", - "fee.bestForVeryStable": "बहुत स्थिर जोड़ों के लिए सर्वोत्तम।", - "fee.dynamic": "गतिशील शुल्क", - "fee.percentEarned": "वह % जो आप फीस के रूप में अर्जित करेंगे।", - "fee.selectPercent": "{{pct}}% चयन करें", - "fee.selectPercentDescription": "{{pct}}% तरलता ने इस स्तर का चयन किया", - "fee.tier": "शुल्क स्तर", - "fee.tier.create": "शुल्क स्तर बनाएं", - "fee.tier.create.button": "नया शुल्क स्तर बनाएं", - "fee.tier.create.description": "नया टियर बनाने से नया पूल शुरू हो जाएगा और इसके परिणामस्वरूप सामान्य नेटवर्क लागत अधिक हो जाएगी।", - "fee.tier.description": "तरलता प्रदान करने वाली अर्जित राशि। ऐसी राशि चुनें जो आपकी जोखिम सहनशीलता और रणनीति के अनुकूल हो।", - "fee.tier.description.v2": "तरलता प्रदान करने से अर्जित राशि। सभी v2 पूल में 0.3% शुल्क तय है। अधिक विकल्पों के लिए, v4 पर तरलता प्रदान करें।", - "fee.tier.dynamic": "गतिशील शुल्क स्तर", - "fee.tier.dynamic.create": "गतिशील शुल्क स्तर बनाना", - "fee.tier.dynamic.create.info": "आप एक गतिशील शुल्क स्तर वाला पूल बनाने जा रहे हैं। आगे बढ़ने से पहले, कृपया सुनिश्चित करें कि चयनित हुक गतिशील शुल्क का समर्थन करता है।", - "fee.tier.highestTvl": "उच्चतम टीवीएल", - "fee.tier.label": "फीस के रूप में आपको मिलने वाला %", - "fee.tier.missing.description": "क्या आपको वह स्तर नहीं मिल रहा है जिसकी आपको तलाश है?", - "fee.tier.new": "नया स्तर", - "fee.tier.percent.select": "{{percentage}} चयन करें", - "fee.tier.recommended.description": "चयनित टोकन जोड़ी के लिए तरलता का उच्चतम हिस्सा होने के आधार पर अनुशंसित।", - "fee.tier.search": "अन्य शुल्क स्तर खोजें या बनाएं", - "fee.tier.search.short": "खोज स्तर", - "fee.tier.select": "शुल्क स्तर चुनें", - "fee.tier.select.existing.button": "मौजूदा शुल्क स्तर चुनें", - "fee.tierExact": "{{fee}} शुल्क स्तर", - "fee.unavailable": "जब तक तरलता हटा नहीं दी जाती, तब तक v2 पोजीशन के लिए अर्जित शुल्क दिखाई नहीं देते।", - "fee.uncollected": "इसमें अप्राप्त शुल्क शामिल है:", - "fee.uniswap": "शुल्क ({{percent}})", - "fee.uniswap.description": "यूनिस्वैप के साथ सर्वोत्तम अनुभव सुनिश्चित करने के लिए शुल्क लगाया जाता है।", - "fiatOffRamp.checkout.title": "वापस लेना", - "fiatOffRamp.connection.quote": "{{amount}} मूल्य का {{currencySymbol}}बेचना", - "fiatOffRamp.error.balance": "शेष राशि से अधिक", - "fiatOffRamp.error.populateSend.description": "कृपया कुछ क्षण प्रतीक्षा करें और पुनः प्रयास करें।", - "fiatOffRamp.error.populateSend.title": "लेनदेन लोड नहीं किया जा सकता", - "fiatOffRamp.summary.total": "{{fiatAmount}}के बदले {{cryptoAmount}}", - "fiatOffRamp.unsupportedToken.back": "वापस जाओ", - "fiatOffRamp.unsupportedToken.divider": "असमर्थित टोकन", - "fiatOffRamp.unsupportedToken.message": "यह टोकन बेचने के लिए समर्थित नहीं है। इस परिसंपत्ति को समर्थित टोकन में से किसी एक में स्वैप करें।", - "fiatOffRamp.unsupportedToken.swap": "समर्थित टोकन पर स्वैप करें", - "fiatOffRamp.unsupportedToken.title": "असमर्थित टोकन", - "fiatOffRamp.welcome.tooltip": "अपने क्रिप्टो को अपने बैंक खाते या डेबिट कार्ड से बेचें।", - "fiatOnRamp.button.chooseToken": "टोकन चुनें", - "fiatOnRamp.buy.info.description": "स्वैपिंग के समय आपको नेटवर्क लागत का भुगतान करने के लिए इसकी आवश्यकता होगी।", - "fiatOnRamp.buy.info.title": "ETH से शुरुआत करें", - "fiatOnRamp.cexTransferModal.description": "आपके क्षेत्र में कार्ड से क्रिप्टो खरीदना समर्थित नहीं है। अपने वॉलेट में पैसे डालने के लिए किसी केंद्रीकृत एक्सचेंज खाते से संपत्ति स्थानांतरित करें।", - "fiatOnRamp.cexTransferModal.title": "आरंभ करने के लिए स्थानांतरण करें", - "fiatOnRamp.checkout.title": "चेक आउट", - "fiatOnRamp.chooseMultiPlatformProvider.chooseNetwork": "नेटवर्क चुनें", - "fiatOnRamp.chooseMultiPlatformProvider.description": "इससे यह निर्धारित होगा कि आपको धनराशि किस वॉलेट पते पर प्राप्त होगी।", - "fiatOnRamp.chooseProvider.description": "आप अपने लेनदेन से जुड़े शुल्क देखने के लिए प्रदाता के पोर्टल पर जाएंगे।", - "fiatOnRamp.completeTransactionHeader": "{{serviceProvider}}के साथ लेनदेन पूरा करें", - "fiatOnRamp.connection.error": "कनेक्शन विफल", - "fiatOnRamp.connection.errorDescription": "{{serviceProvider}}से कनेक्ट करते समय कुछ गड़बड़ी हुई।", - "fiatOnRamp.connection.message": "आपको {{serviceProvider}}से जोड़ रहा हूँ", - "fiatOnRamp.connection.quote": "{{currencySymbol}}के मूल्य का {{amount}} खरीदना", - "fiatOnRamp.connection.terms": "जारी रखकर, आप स्वीकार करते हैं कि आप लागू होने वाली {{serviceProvider}}के साथ सेवा की शर्तों और गोपनीयता नीति के अधीन होंगे।", - "fiatOnRamp.continueInTab": "जारी रखने के लिए {{serviceProvider}} टैब पर जाएँ। अब इस मोडल को बंद करना सुरक्षित है।", - "fiatOnRamp.disclaimer": "जारी रखकर, आप स्वीकार करते हैं कि आप सेवा की शर्तों और गोपनीयता नीति के साथ {{serviceProvider}}के अधीन होंगे, जैसा लागू हो।", - "fiatOnRamp.error.default": "कुछ गलत हो गया।", - "fiatOnRamp.error.load": "खरीदने के लिए टोकन लोड नहीं किए जा सके", - "fiatOnRamp.error.max": "अधिकतम {{amount}}", - "fiatOnRamp.error.min": "न्यूनतम {{amount}}", - "fiatOnRamp.error.noQuotes": "कोई उद्धरण नहीं मिला.", - "fiatOnRamp.error.unavailable": "यह सेवा आपके क्षेत्र में उपलब्ध नहीं है", - "fiatOnRamp.error.unsupported": "क्षेत्र में समर्थित नहीं है", - "fiatOnRamp.error.usd": "केवल USD में खरीदने के लिए उपलब्ध है", - "fiatOnRamp.noQuotes.error": "कोई उद्धरण नहीं मिला", - "fiatOnRamp.paymentMethods.applePay": "एप्पल पे", - "fiatOnRamp.paymentMethods.bank": "किनारा", - "fiatOnRamp.paymentMethods.debit": "खर्चे में लिखना", - "fiatOnRamp.paymentMethods.googlePay": "गूगल पे", - "fiatOnRamp.paymentMethods.paypal": "पेपैल", - "fiatOnRamp.paymentMethods.venmo": "Venmo", - "fiatOnRamp.quote.advice": "आप अपने लेनदेन से जुड़े शुल्क देखने के लिए प्रदाता के पोर्टल पर जाएंगे।", - "fiatOnRamp.quote.type.list": "{{optionsList}}, और अन्य विकल्प", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "किसी खाते से", - "fiatOnRamp.receiveCrypto.title": "क्रिप्टो प्राप्त करें", - "fiatOnRamp.receiveCrypto.transferFunds": "किसी अन्य वॉलेट या खाते से क्रिप्टो ट्रांसफर करके अपने वॉलेट को फंड करें", - "fiatOnRamp.receiveCrypto.useThisAddress": "टोकन प्राप्त करने के लिए इस पते का उपयोग करें", - "fiatOnRamp.region.placeholder": "देश या क्षेत्र के अनुसार खोजें", - "fiatOnRamp.region.title": "अपना क्षेत्र चुनें", - "fiatOnRamp.summary.total": "{{fiatAmount}}के बदले {{cryptoAmount}}", - "forceUpgrade.action.backup": "अपने बटुए का बैकअप लें", - "forceUpgrade.action.confirm": "अभी अद्यतन करें", - "forceUpgrade.action.learn": "अपडेट करने का तरीका जानें", - "forceUpgrade.description.extension": "ऐप का नया संस्करण उपलब्ध है। Uniswap एक्सटेंशन का उपयोग जारी रखने के लिए, कृपया इसे नवीनतम संस्करण में अपडेट करें।", - "forceUpgrade.description.wallet": "ऐप का नया संस्करण उपलब्ध है। Uniswap वॉलेट का उपयोग जारी रखने के लिए, कृपया इसे नवीनतम संस्करण में अपडेट करें।", - "forceUpgrade.label.recoveryPhrase": "पुनर्प्राप्ति वाक्यांश", - "forceUpgrade.title": "नवीनतम संस्करण में अपडेट करें", - "forceUpgrade.title.recommendedStatus": "एक नया संस्करण उपलब्ध है", - "globalPreferences.title": "वैश्विक प्राथमिकताएं", - "hero.scroll": "अधिक जानने के लिए स्क्रॉल करें", - "hero.subtitle": "Ethereum, Unichain, और Base सहित {{amount}}+ नेटवर्क पर क्रिप्टो खरीदें और बेचें।", - "hero.swap.title": "किसी भी समय,
कहीं भी स्वैप करें।", - "hidden.nfts.info.banner.text": "छिपे हुए NFT के बारे में अधिक जानें", - "hidden.nfts.info.text.button": "छिपे हुए NFTs ({{numHidden}})", - "hidden.nfts.info.text.extension": "ये संभावित घोटाले और NFT हैं जिन्हें आपने छिपाया है। आप किसी NFT पर राइट क्लिक करके उसे छिपा सकते हैं।", - "hidden.nfts.info.text.mobile": "ये संभावित घोटाले और NFT हैं जिन्हें आपने छिपाया है। आप किसी NFT को अनहाइड करने के लिए उस पर लंबे समय तक प्रेस कर सकते हैं।", - "hidden.nfts.info.text.title": "छिपे हुए NFTs", - "hidden.tokens.info.banner.text": "छिपे हुए टोकन के बारे में अधिक जानें", - "hidden.tokens.info.text.button": "छिपे हुए टोकन ({{numHidden}})", - "hidden.tokens.info.text.info": "ये संभावित घोटाले, छोटी शेष राशि और आपके द्वारा छिपाए गए टोकन हैं। छिपे हुए टोकन आपके कुल वॉलेट बैलेंस में शामिल नहीं हैं।", - "hidden.tokens.info.text.title": "छिपे हुए टोकन", - "home.activity.empty.button": "टोकन या एनएफटी प्राप्त करें", - "home.activity.empty.description.default": "जब आप टोकन या एनएफटी को मंजूरी देते हैं, व्यापार करते हैं या स्थानांतरित करते हैं, तो आपके लेनदेन यहां दिखाई देंगे।", - "home.activity.empty.description.external": "जब यह वॉलेट लेनदेन करेगा, तो वे यहां दिखाई देंगे।", - "home.activity.empty.title": "अभी तक कोई गतिविधि नहीं", - "home.activity.error.load": "गतिविधि लोड नहीं हो सकी", - "home.activity.title": "गतिविधि", - "home.banner.offline": "आप ऑफ़लाइन मोड में हैं", - "home.banner.testnetMode": "आप टेस्टनेट मोड में हैं", - "home.banner.testnetMode.nav": "आप टेस्टनेट मोड में हैं। सेटिंग्स में जाकर इसे बंद करें।", - "home.empty.cexTransfer": "स्थानांतरण", - "home.empty.cexTransfer.description": "ट्रेडिंग प्लेटफॉर्म से धन स्थानांतरित करें।", - "home.empty.transfer": "क्रिप्टो प्राप्त करें", - "home.empty.transfer.description": "किसी अन्य वॉलेट से धनराशि स्थानांतरित करें।", - "home.explore.footer": "हज़ारों टोकन, NFT और बहुत कुछ देखने के लिए यहां टैप करें", - "home.explore.title": "टोकन एक्सप्लोर करें", - "home.extension.error": "खाते लोड करने में त्रुटि", - "home.label.buy": "खरीदना", - "home.label.for": "खरीद बिक्री", - "home.label.receive": "प्राप्त करें", - "home.label.send": "भेजना", - "home.label.swap": "बदलना", - "home.nfts.title": "एनएफटी", - "home.tokens.empty.action.buy.description": "डेबिट कार्ड या बैंक खाते से खरीदारी करें।", - "home.tokens.empty.action.buy.title": "क्रिप्टो खरीदें", - "home.tokens.empty.action.import.description": "स्वैपिंग और भेजना शुरू करने के लिए इस वॉलेट का पुनर्प्राप्ति वाक्यांश दर्ज करें।", - "home.tokens.empty.action.import.title": "बटुआ आयात करें", - "home.tokens.empty.action.receive.description": "किसी अन्य वॉलेट या खाते से स्थानांतरण करें।", - "home.tokens.empty.action.receive.title": "क्रिप्टो प्राप्त करें", - "home.tokens.empty.description": "जब यह वॉलेट टोकन खरीदता है या प्राप्त करता है, तो वे यहां दिखाई देंगे।", - "home.tokens.empty.title": "अभी तक कोई टोकन नहीं", - "home.tokens.empty.welcome.description": "ट्रेडिंग शुरू करने के लिए धन जोड़ें", - "home.tokens.error.fetch": "टोकन शेष प्राप्त करने में विफल", - "home.tokens.error.load": "टोकन शेष लोड नहीं किया जा सका", - "home.tokens.title": "टोकन", - "home.upsell.receive.cta": "किसी खाते से", - "home.upsell.receive.title": "क्रिप्टो प्राप्त करें", - "home.warning.viewOnly": "यह केवल देखने के लिए वॉलेट है", - "interface.metatags.description": "एथेरियम, बेस, आर्बिट्रम, पॉलीगॉन, यूनिचेन और अन्य पर क्रिप्टो स्वैप करें। लाखों लोगों द्वारा विश्वसनीय DeFi प्लेटफ़ॉर्म।", - "interface.metatags.title": "यूनिस्वैप इंटरफ़ेस", - "landing.api": "एपीआई", - "landing.appsOverview": "आपके द्वारा अदला-बदली के सभी तरीकों के लिए बनाया गया", - "landing.blog.description": "कंपनी की नवीनतम खबरें, उत्पाद विशेषताएँ और अन्य जानकारी प्राप्त करें", - "landing.docs.description": "Uniswap के साथ निर्माण शुरू करने के लिए डेवलपर दस्तावेज़ों की हमारी लाइब्रेरी देखें", - "landing.exploreUniverse": "ब्रह्मांड का अन्वेषण करें", - "landing.getStarted": "दुनिया के सबसे बड़े DEX पर व्यापार करें", - "landing.helpCenter.body": "FAQ ब्राउज़ करें और हमारी यूएस-आधारित सहायता टीम से सहायता प्राप्त करें", - "landing.protocolDescription": "यूनिस्वैप लैब्स क्रिप्टो जगत के कुछ सबसे ज़्यादा इस्तेमाल किए जाने वाले उत्पादों को संचालित करता है। बिना अनुमति के एक्सेस, प्रमाणित सुरक्षा और समर्पित सहायता का अनुभव करें।", - "landing.protocolStats": "यूनिस्वैप प्रोटोकॉल आँकड़े", - "landing.provideLiquidity.body": "यूनिस्वैप इंटरफ़ेस का उपयोग करके तरलता प्रदान करें और शुल्क एकत्र करें।", - "landing.provideLiquidity.subtitle": "ऑनचेन बाज़ारों को सशक्त बनाना।", - "landing.socials": "Uniswap Labs को X, Farcaster, LinkedIn, और TikTokपर फ़ॉलो करें", - "landing.swapBody": "गहन तरलता तक पहुंचें, टोकन का अन्वेषण करें, सीमा आदेश निर्धारित करें, और {{amount}} श्रृंखलाओं में हजारों टोकन के लिए तरलता प्रदान करें।", - "landing.swapSubtitle": "अनुमति रहित अदला-बदली.", - "landing.tradingApi": "ट्रेडिंग एपीआई", - "landing.tradingApiBody": "उसी API का उपयोग करें जो Uniswap वेब ऐप और वॉलेट को शक्ति प्रदान करता है, जिस पर दुनिया भर की अग्रणी टीमों द्वारा भरोसा किया जाता है।", - "landing.tradingApiButton": "Uniswap API को एकीकृत करें", - "landing.tradingApiSubtitle": "DeFi, सीधे आपके उपयोगकर्ताओं के लिए।", - "landing.trusted": "लाखों लोगों द्वारा विश्वसनीय", - "landing.unichain.body": "DeFi का घर बनने के लिए बनाए गए तेज, विकेन्द्रीकृत Ethereum L2 पर समुदाय निर्माण में शामिल हों।", - "landing.unichain.button": "निर्माण शुरू करें", - "landing.unichain.subtitle": "डीफाई श्रृंखला.", - "landing.uniswapX.body": "गैस रहित लेनदेन और एमईवी संरक्षण, असफल स्वैप के लिए शून्य शुल्क के साथ।", - "landing.uniswapX.button": "UniswapX का अनुभव करें", - "landing.uniswapX.subtitle": "बेहतर अदला-बदली, शून्य घर्षण।", - "landing.walletBody": "लाखों डाउनलोड, वास्तविक मनुष्यों से समर्थन और 4.8 रेटिंग के साथ विश्वसनीय स्व-संरक्षण क्रिप्टो वॉलेट और एक्सटेंशन।", - "landing.walletSubtitle": "अदला-बदली करें, संग्रह करें, अन्वेषण करें।", - "language.afrikaans": "अफ्रीकी", - "language.arabic": "अरबी", - "language.catalan": "कातालान", - "language.chineseSimplified": "सरलीकृत चीनी", - "language.chineseTraditional": "चीनी पारंपरिक", - "language.czech": "चेक", - "language.danish": "डेनिश", - "language.dutch": "डच", - "language.english": "अंग्रेज़ी", - "language.finnish": "फिनिश", - "language.french": "फ़्रेंच", - "language.greek": "यूनानी", - "language.hebrew": "यहूदी", - "language.hindi": "हिंदी", - "language.hungarian": "हंगेरी", - "language.indonesian": "इन्डोनेशियाई", - "language.italian": "इतालवी", - "language.japanese": "जापानी", - "language.korean": "कोरियाई", - "language.malay": "मलायी", - "language.norwegian": "नार्वेजियन", - "language.polish": "पोलिश", - "language.portuguese": "पुर्तगाली", - "language.romanian": "रोमानियाई", - "language.russian": "रूसी", - "language.serbian": "सर्बियाई", - "language.spanishArgentina": "स्पैनिश (अर्जेंटीना)", - "language.spanishBelize": "स्पैनिश (बेलीज़)", - "language.spanishBolivia": "स्पेनिश (बोलीविया)", - "language.spanishChile": "स्पैनिश (चिली)", - "language.spanishColombia": "स्पेनिश (कोलंबिया)", - "language.spanishCostaRica": "स्पेनिश (कोस्टा रिका)", - "language.spanishCuba": "स्पेनिश (क्यूबा)", - "language.spanishDominicanRepublic": "स्पेनिश (डोमिनिकन गणराज्य)", - "language.spanishEcuador": "स्पेनिश (इक्वाडोर)", - "language.spanishElSalvador": "स्पेनिश (अल साल्वाडोर)", - "language.spanishGuatemala": "स्पेनिश (ग्वाटेमाला)", - "language.spanishHonduras": "स्पेनिश (होंडुरास)", - "language.spanishLatam": "स्पैनिश (लैटिन अमेरिका)", - "language.spanishMexico": "स्पेनिश (मेक्सिको)", - "language.spanishNicaragua": "स्पेनिश (निकारागुआ)", - "language.spanishPanama": "स्पेनिश (पनामा)", - "language.spanishParaguay": "स्पेनिश (पराग्वे)", - "language.spanishPeru": "स्पेनिश (पेरू)", - "language.spanishPuertoRico": "स्पैनिश (प्यूर्टो रिको)", - "language.spanishSpain": "स्पैनिश (स्पेन)", - "language.spanishUruguay": "स्पेनिश (उरुग्वे)", - "language.spanishUs": "स्पैनिश (यूएस)", - "language.spanishVenezuela": "स्पेनिश (वेनेजुएला)", - "language.swahili": "swahili", - "language.swedish": "स्वीडिश", - "language.turkish": "तुर्की", - "language.ukrainian": "यूक्रेनी", - "language.urdu": "उर्दू", - "language.vietnamese": "वियतनामी", - "large.price.difference": "बड़ा मूल्य अंतर", - "large.price.difference.tooltip": "इस ट्रेड को आगे बढ़ाने से फंड का नुकसान होगा। यह अंतर बड़े ट्रेड या कम लिक्विडिटी के कारण हो सकता है।", - "limit.open.count_one": "1 खुली सीमा", - "limit.open.count_other": "{{count}} खुली सीमाएँ", - "limitPrice.buyingAboveMarketPrice.error.description": "आपकी सीमा कीमत बाजार से {{percentage}}% अधिक है। आगे बढ़ने के लिए अपनी सीमा कीमत समायोजित करें।", - "limitPrice.buyingAboveMarketPrice.error.title": "बाजार मूल्य से {{tokenSymbol}} ऊपर खरीदना", - "limitPrice.marketPriceNotAvailable.error.description": "हम वर्तमान बाजार मूल्य की गणना करने में असमर्थ हैं। बाजार मूल्य से कम पर ऑर्डर सबमिट करने से बचने के लिए, कृपया अपना नेटवर्क कनेक्शन जांचें और पुनः प्रयास करें।", - "limitPrice.marketPriceNotAvailable.error.title": "बाजार मूल्य उपलब्ध नहीं", - "limitPrice.sellingBelowMarketPrice.error.description": "आपकी सीमा कीमत बाजार से {{percentage}}% कम है। आगे बढ़ने के लिए अपनी सीमा कीमत समायोजित करें।", - "limitPrice.sellingBelowMarketPrice.error.title": "बाजार मूल्य से {{tokenSymbol}} नीचे बेचना", - "limits.form.disclaimer.mainnet": "केवल एथेरियम मेननेट टोकन ही सीमाओं के लिए उपलब्ध हैं। ", - "limits.form.disclaimer.mainnet.short": "सीमाओं के लिए केवल मेननेट टोकन ही उपलब्ध हैं।", - "limits.form.disclaimer.uniswapx": "जब टोकन निर्दिष्ट मूल्य तक पहुँचते हैं तो सीमाएँ ठीक से निष्पादित नहीं हो सकती हैं। ", - "limits.learnMore": "सीमाओं के बारे में अधिक जानें", - "limits.price.input.label": "जब 1 का मूल्य है", - "limits.price.label": "सीमा मूल्य", - "limits.selectSupportedTokens": "समर्थित टोकन चुनें", - "liquidity.hooks": "हुक्स ऑन v4", - "liquidity.hooks.address.input": "हुक पता दर्ज करें", - "liquidity.hooks.address.tooltip": "हुक पता: {{address}}", - "liquidity.learnMoreLabel": "तरलता प्रावधान के बारे में जानें", - "liquidity.notEnough.label": "सटीक USD मूल्य दिखाने के लिए पर्याप्त तरलता नहीं है।", - "liquidity.provideOnProtocols": "विभिन्न प्रोटोकॉल पर तरलता प्रदान करना", - "liquidityPool.page.title": "Uniswap पर पूल{{version}} में तरलता जोड़ें", - "liquidityPool.positions.closed.title": "बंद स्थितियाँ", - "liquidityPool.positions.loadingMore": "अधिक पद लोड हो रहे हैं...", - "liquidityPool.positions.page.title": "Uniswap पर {{quoteSymbol}}/{{baseSymbol}} पूल लिक्विडिटी प्रबंधित करें", - "liquidityPool.positions.page.version.description": "अपनी सक्रिय {{version}} लिक्विडिटी पोजीशन देखें। नई पोजीशन जोड़ें।", - "liquidityPool.positions.page.version.title": "Uniswap पर पूल लिक्विडिटी{{version}} प्रबंधित करें", - "migrate.allowed": "अनुमत", - "migrate.allowLpMigration": "एलपी टोकन माइग्रेशन की अनुमति दें", - "migrate.connectAccount": "आपको उस खाते से जुड़ना होगा जो इस स्थिति का स्वामी है।", - "migrate.connectWallet": "अपनी V2 लिक्विडिटी देखने के लिए वॉलेट से कनेक्ट करें।", - "migrate.contract": "यूनिस्वैप माइग्रेशन अनुबंध", - "migrate.firstLP": "आप इस Uniswap V3 पूल के लिए पहले लिक्विडिटी प्रदाता हैं। आपकी लिक्विडिटी वर्तमान {{source}} कीमत पर माइग्रेट होगी।", - "migrate.highGasCost": "आपकी लेन-देन लागत बहुत अधिक होगी क्योंकि इसमें पूल बनाने के लिए गैस भी शामिल है।", - "migrate.invalidRange": "अमान्य श्रेणी चुनी गई। न्यूनतम मूल्य अधिकतम मूल्य से कम होना चाहिए।", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} एल.पी. टोकन", - "migrate.migrating": "ओर पलायन", - "migrate.missingV2Position": "क्या आपको अपना कोई v2 स्थान दिखाई नहीं दे रहा है? इसे आयात करें।", - "migrate.noV2Liquidity": "कोई V2 तरलता नहीं मिली.", - "migrate.positionNoFees": "जब तक बाजार मूल्य आपकी सीमा में नहीं आ जाता, तब तक आपकी स्थिति पर शुल्क नहीं लगेगा या उसका उपयोग ट्रेडों में नहीं किया जाएगा।", - "migrate.priceDifference": "मूल्य भेद: ", - "migrate.priceWarning": "आपको Uniswap V3 में केवल उस कीमत पर तरलता जमा करनी चाहिए जो आपको सही लगे।
यदि कीमत गलत लगती है, तो आप या तो कीमत को स्थानांतरित करने के लिए स्वैप कर सकते हैं या किसी और के ऐसा करने की प्रतीक्षा कर सकते हैं।", - "migrate.refund": "चयनित मूल्य सीमा के कारण कम से कम {{amtA}} {{symA}} और {{amtB}} {{symB}} आपके वॉलेट में वापस कर दिए जाएंगे।", - "migrate.selectFeeTier": "शुल्क स्तर चुनें", - "migrate.setRange": "मूल्य सीमा निर्धारित करें", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} मूल्य:", - "migrate.v2Description": "यह टूल आपकी {{source}} लिक्विडिटी को सुरक्षित तरीके से V3 में माइग्रेट कर देगा। <0>यूनिस्वैप माइग्रेशन कॉन्ट्रैक्ट की बदौलत यह प्रक्रिया पूरी तरह से भरोसेमंद है ↗", - "migrate.v2Instruction": "नीचे दिखाए गए प्रत्येक पूल के लिए, Uniswap V2 से अपनी तरलता निकालने और उसे Uniswap V3 में जमा करने के लिए माइग्रेट पर क्लिक करें।", - "migrate.v2Title": "V2 लिक्विडिटी माइग्रेट करें", - "migrate.v3Price": "V3 {{sym}} मूल्य:", - "mint.v3.input.invalidPrice.error": "अमान्य मूल्य इनपुट", - "mobileAppPromo.banner.getTheApp.link": "Uniswap वॉलेट ऐप प्राप्त करें", - "mobileAppPromo.banner.title": "यूनिस्वैप: क्रिप्टो और एनएफटी वॉलेट", - "moonpay.poweredBy": "मूनपे यूएसए एलएलसी द्वारा संचालित फिएट ऑनरैम्प", - "nav.createAccount.button": "खाता बनाएं", - "nav.logIn.button": "लॉग इन करें", - "nav.logInOrConnect.title": "लॉग इन करें या कनेक्ट करें", - "nav.products.tradingApi": "प्रोटोकॉल को एकीकृत करें", - "nav.products.unichain": "DeFi श्रृंखला", - "nav.products.uniswapX": "मेटा-एग्रीगेटर", - "nav.products.wallet": "अदला-बदली करें, संग्रहित करें, अन्वेषण करें", - "nav.signUp.button": "साइन अप करें", - "nav.tabs.createPosition": "स्थिति बनाएं", - "nav.tabs.viewPositions": "स्थितियां देखें", - "network.lostConnection": "हो सकता है कि आपका नेटवर्क कनेक्शन टूट गया हो।", - "network.mightBeDown": "{{network}} शायद अभी डाउन है, या हो सकता है कि आपने अपना नेटवर्क कनेक्शन खो दिया हो।", - "network.warning": "नेटवर्क चेतावनी", - "nft.noPools": "अभी तक कोई पूल नहीं", - "nft.reportSpam": "स्पैम के रूप में रिपोर्ट करें", - "notFound.oops": "ओह, मुझे वापस स्वैप पर ले चलो", - "notice.uk": "यह वेब एप्लिकेशन उपयोगकर्ताओं को अपनी पहल पर यूनिस्वैप प्रोटोकॉल के साथ बातचीत करने के लिए एक उपकरण के रूप में प्रदान किया गया है, जिसमें क्रिप्टोकरेंसी ट्रेडिंग गतिविधियों का कोई समर्थन या अनुशंसा नहीं है। ऐसा करने में, यूनिस्वैप यह अनुशंसा नहीं कर रहा है कि उपयोगकर्ता या संभावित उपयोगकर्ता क्रिप्टोएसेट ट्रेडिंग गतिविधि में संलग्न हों, और वेब एप्लिकेशन के उपयोगकर्ता या संभावित उपयोगकर्ताओं को इस वेबपेज या इसकी सामग्री को क्रिप्टोएसेट में सौदा करने के लिए किसी भी प्रकार की अनुशंसा, निमंत्रण या प्रलोभन के रूप में नहीं मानना चाहिए।", - "notice.uk.label": "यूके अस्वीकरण:", - "notification.assetVisibility.hidden": "{{assetName}} छिपा हुआ", - "notification.assetVisibility.unhidden": "{{assetName}} छिपा हुआ", - "notification.buy.network": "{{network}}पर ख़रीददारी", - "notification.copied.address": "पता कॉपी किया गया", - "notification.copied.calldata": "कॉलडेटा कॉपी किया गया", - "notification.copied.contractAddress": "अनुबंध का पता कॉपी किया गया", - "notification.copied.failed": "क्लिपबोर्ड पर कॉपी करने में विफल", - "notification.copied.image": "छवि कॉपी की गई", - "notification.copied.linkUrl": "लिंक कॉपी किया गया", - "notification.copied.nftUrl": "NFT URL कॉपी किया गया", - "notification.copied.poolId": "पूल आईडी कॉपी की गई", - "notification.copied.tokenUrl": "टोकन URL कॉपी किया गया", - "notification.copied.transactionId": "लेन-देन आईडी की प्रतिलिपि बनाई गई", - "notification.copied.unitag": "उपयोगकर्ता नाम कॉपी किया गया", - "notification.countryChange": "{{countryName}}पर स्विच किया गया", - "notification.limit.network": "{{network}}पर सीमा आदेश बनाना", - "notification.lp.network": "{{network}}पर तरलता प्रदान करना", - "notification.network.changed": "{{network}}पर स्विच किया गया", - "notification.passwordChanged": "पासवर्ड बदला गया", - "notification.poolFinder.network": "{{network}}पर पूल खोजें", - "notification.restore.success": "बटुआ बहाल!", - "notification.sell.network": "{{network}}पर बेचना", - "notification.send.network": "{{network}}पर भेजा जा रहा है", - "notification.smartWallet.disabled": "1 नेटवर्क पर अक्षम", - "notification.smartWallet.disabled.all": "स्मार्ट वॉलेट अक्षम किया गया", - "notification.smartWallet.disabled.plural": "{{amount}} नेटवर्क पर अक्षम", - "notification.spam.NFT.failed": "NFT की रिपोर्ट नहीं की जा सकी। बाद में पुनः प्रयास करें।", - "notification.spam.NFT.successful": "रिपोर्ट", - "notification.swap.network": "{{network}}पर स्वैपिंग", - "notification.swap.pending.swap": "स्वैप लंबित है", - "notification.swap.pending.unwrap": "खोलना लंबित है", - "notification.swap.pending.wrap": "लपेटना लंबित है", - "notification.transaction.approve.canceled": "रद्द {{currencySymbol}} अनुमोदन.", - "notification.transaction.approve.fail": "{{address}}के साथ उपयोग के लिए {{currencySymbol}} मंजूरी देने में विफल।", - "notification.transaction.approve.success": "{{address}}के साथ उपयोग के लिए {{currencySymbol}} स्वीकृत।", - "notification.transaction.pending": "लेन-देन लंबित", - "notification.transaction.swap.canceled": "{{inputCurrencySymbol}}-{{outputCurrencySymbol}} स्वैप रद्द किया गया।", - "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} के लिए {{outputCurrencyAmountWithSymbol}} स्वैप समाप्त हो गया।", - "notification.transaction.swap.fail": "{{inputCurrencyAmountWithSymbol}} को {{outputCurrencyAmountWithSymbol}}से बदलने में विफल।", - "notification.transaction.swap.success": "{{inputCurrencyAmountWithSymbol}} {{outputCurrencyAmountWithSymbol}}से बदला गया।", - "notification.transaction.transfer.canceled": "रद्द {{tokenNameOrAddress}} भेजें", - "notification.transaction.transfer.fail": "{{tokenNameOrAddress}} को {{walletNameOrAddress}}पर भेजने में विफल", - "notification.transaction.transfer.received": "{{walletNameOrAddress}}से {{tokenNameOrAddress}} प्राप्त हुआ", - "notification.transaction.transfer.success": "{{tokenNameOrAddress}} को {{walletNameOrAddress}}पर भेजा गया", - "notification.transaction.unknown.fail.full": "{{addressOrEnsName}}के साथ लेन-देन करने में विफल", - "notification.transaction.unknown.fail.short": "लेन - देन विफल", - "notification.transaction.unknown.success.full": "{{addressOrEnsName}}के साथ लेन-देन किया गया", - "notification.transaction.unknown.success.short": "लेन-देन की पुष्टि हो गई", - "notification.transaction.unwrap.canceled": "रद्द {{inputCurrencySymbol}} खोलना।", - "notification.transaction.unwrap.fail": "{{inputCurrencyAmountWithSymbol}}को खोलने में विफल।", - "notification.transaction.unwrap.success": "{{inputCurrencyAmountWithSymbol}} खोला और {{outputCurrencyAmountWithSymbol}}प्राप्त किया।", - "notification.transaction.wrap.canceled": "{{inputCurrencySymbol}} रैप रद्द किया गया।", - "notification.transaction.wrap.fail": "{{inputCurrencyAmountWithSymbol}}लपेटने में विफल।", - "notification.transaction.wrap.success": "{{inputCurrencyAmountWithSymbol}} लपेटा और {{outputCurrencyAmountWithSymbol}}प्राप्त किया।", - "notification.transfer.pending": "लंबित भेजें", - "notification.walletConnect.confirmed": "{{dappName}}के साथ लेनदेन की पुष्टि की गई", - "notification.walletConnect.connected": "जुड़े हुए", - "notification.walletConnect.disconnected": "डिस्कनेक्ट किया गया", - "notification.walletConnect.failed": "{{dappName}}के साथ लेनदेन विफल रहा", - "notification.walletConnect.networkChanged.full": "{{networkName}}पर स्विच किया गया", - "notification.walletConnect.networkChanged.short": "स्विच किए गए नेटवर्क", - "notifications.scantastic.subtitle": "Uniswap एक्सटेंशन पर जारी रखें", - "notifications.scantastic.title": "सफलता!", - "onboarding.backup.manual.banner": "हमारा सुझाव है कि इसे एक कागज पर लिखकर किसी सुरक्षित स्थान, जैसे तिजोरी, में रख दें।", - "onboarding.backup.manual.displayWarning.description": "आगे बढ़ने से पहले निम्नलिखित को ध्यानपूर्वक पढ़ें।", - "onboarding.backup.manual.displayWarning.note.access": "यह पुनर्प्राप्ति वाक्यांश आपको अपने वॉलेट और फंड तक पूर्ण पहुंच प्रदान करता है", - "onboarding.backup.manual.displayWarning.note.secure": "इसे निजी तौर पर देखें और किसी के साथ साझा न करें", - "onboarding.backup.manual.displayWarning.note.storage": "इसे लिख लें और किसी सुरक्षित स्थान पर रख लें", - "onboarding.backup.manual.displayWarning.title": "जानने योग्य कुछ महत्वपूर्ण बातें", - "onboarding.backup.manual.error": "अमान्य या ग़लत वर्तनी वाला शब्द", - "onboarding.backup.manual.placeholder": "गुप्त शब्द", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} पूरा हुआ", - "onboarding.backup.manual.selectedWordPlaceholder": "शब्द चुनें", - "onboarding.backup.manual.subtitle_one": "आपके पुनर्प्राप्ति वाक्यांश में {{count}}st शब्द क्या है?", - "onboarding.backup.manual.subtitle_two": "आपके पुनर्प्राप्ति वाक्यांश में {{count}}और शब्द क्या है?", - "onboarding.backup.manual.subtitle_few": "आपके पुनर्प्राप्ति वाक्यांश में {{count}}तीसरा शब्द क्या है?", - "onboarding.backup.manual.subtitle_other": "आपके पुनर्प्राप्ति वाक्यांश में {{count}}वां शब्द क्या है?", - "onboarding.backup.manual.title": "आइए सुनिश्चित करें कि आपने इसे सही तरीके से रिकॉर्ड किया है", - "onboarding.backup.option.badge.quick": "जल्दी", - "onboarding.backup.option.cloud.description": "अपने वॉलेट का बैकअप {{cloudProviderName}}के माध्यम से लें, जो रिकवरी पासवर्ड द्वारा सुरक्षित है।", - "onboarding.backup.option.cloud.title": "पुनर्प्राप्ति पासवर्ड सेट करें", - "onboarding.backup.option.manual.description": "अपने 12 गुप्त शब्दों को एक कागज़ पर लिख लें और उसे सुरक्षित स्थान पर रख लें।", - "onboarding.backup.option.manual.title": "पुनर्प्राप्ति वाक्यांश लिखें", - "onboarding.backup.reminder.backupNowButton": "अब समर्थन देना", - "onboarding.backup.reminder.remindMeLaterButton": "मुझे बाद में याद दिलाना", - "onboarding.backup.reminder.title": "अपने बटुए का बैकअप लें", - "onboarding.backup.reminder.warning.description": "अपने वॉलेट का बैकअप रखें ताकि यदि कभी आपका फोन खो जाए या आप नया फोन लें तो आप अपनी संपत्ति वापस पा सकें।", - "onboarding.backup.reminder.warning.fundsLabel": "जोखिम में निधियाँ", - "onboarding.backup.reminder.warning.title": "आप अपना धन खो सकते हैं", - "onboarding.backup.speedBump.cloud.description": "अगर आप इसे कभी भूल जाते हैं, तो हम इसे आपके लिए रीसेट नहीं कर सकते। इसे किसी सुरक्षित जगह पर लिख लें या पासवर्ड मैनेजर में सुरक्षित रूप से स्टोर कर लें।", - "onboarding.backup.speedBump.cloud.disclaimer": "मैं समझता हूं कि यूनिस्वैप लैब्स मेरा रिकवरी पासवर्ड रीसेट नहीं कर सकता।", - "onboarding.backup.speedBump.cloud.title": "यह पासवर्ड सहेजना महत्वपूर्ण है", - "onboarding.backup.speedBump.manual.description": "सुनिश्चित करें कि आपने अपना पुनर्प्राप्ति वाक्यांश सही ढंग से लिखा है तथा उसे सुरक्षित स्थान पर संग्रहीत किया है।", - "onboarding.backup.speedBump.manual.disclaimer": "मैं समझता हूं कि यदि मैं इसे खो देता हूं तो यूनिस्वैप लैब्स मेरे वॉलेट को पुनः प्राप्त नहीं कर सकता।", - "onboarding.backup.speedBump.manual.title": "इससे पहले कि आप ख़त्म करें...", - "onboarding.backup.subtitle": "यदि आप ऐप हटा देते हैं या अपना डिवाइस खो देते हैं तो इस प्रकार आप अपना वॉलेट पुनः प्राप्त कर सकते हैं।", - "onboarding.backup.title.existing": "अपने बटुए का बैकअप लें", - "onboarding.backup.title.new": "अपनी बैकअप विधि चुनें", - "onboarding.backup.view.subtitle.message1": "जारी रखने से पहले निम्नलिखित को ध्यान से पढ़ें", - "onboarding.backup.view.subtitle.message2": "आपको अपना बटुआ पुनः प्राप्त करने के लिए इन सभी 12 गुप्त शब्दों को दर्ज करना होगा।", - "onboarding.backup.view.title": "अपना पुनर्प्राप्ति वाक्यांश लिखें", - "onboarding.backup.view.warning.message1": "यह पुनर्प्राप्ति वाक्यांश आपको अपने वॉलेट और फंड तक पूर्ण पहुंच प्रदान करता है", - "onboarding.backup.view.warning.message2": "इसे लिख लें और किसी सुरक्षित स्थान पर रख लें", - "onboarding.backup.view.warning.message3": "इसे निजी तौर पर देखें और इसे किसी के साथ साझा न करें", - "onboarding.cloud.confirm.description": "आपको अपनी धनराशि वापस पाने के लिए इसे दर्ज करना होगा। यदि आप इसे कभी भूल जाते हैं, तो हम इसे आपके लिए वापस नहीं पा सकेंगे।", - "onboarding.cloud.confirm.title": "अपना पुनर्प्राप्ति पासवर्ड पुष्टि करें", - "onboarding.cloud.createPassword.description": "आपको अपनी धनराशि वापस पाने के लिए इसे दर्ज करना होगा। यदि आप इसे कभी भूल जाते हैं, तो हम इसे आपके लिए वापस नहीं पा सकेंगे।", - "onboarding.cloud.createPassword.title": "अपना पुनर्प्राप्ति पासवर्ड बनाएं", - "onboarding.complete.button": "Uniswap एक्सटेंशन खोलें", - "onboarding.complete.description": "आपका वॉलेट क्रिप्टो भेजने और प्राप्त करने के लिए तैयार है। नीचे दिए गए शॉर्टकट से Uniswap एक्सटेंशन खोलें।", - "onboarding.complete.go_to_uniswap": "Uniswap वेब ऐप पर जाएं", - "onboarding.complete.pin.description": "अपने टूलबार में Uniswap एक्सटेंशन जोड़ने के लिए पिन आइकन पर क्लिक करें।", - "onboarding.complete.pin.title": "पिन यूनिस्वैप एक्सटेंशन", - "onboarding.complete.title": "तुम सब सेट हो", - "onboarding.extension.biometrics.subtitle.fingerprint": "केवल अपने फिंगरप्रिंट का उपयोग करके अपने वॉलेट तक शीघ्रतापूर्वक और सुरक्षित रूप से पहुंचें।", - "onboarding.extension.biometrics.title": "{{biometricsMethod}}सक्षम करें", - "onboarding.extension.password.subtitle": "आपको अपने वॉलेट को अनलॉक करने और अपने पुनर्प्राप्ति वाक्यांश तक पहुंचने के लिए इसकी आवश्यकता होगी", - "onboarding.extension.password.title.default": "पासवर्ड बनाएं", - "onboarding.extension.password.title.reset": "अपना पासवर्ड रीसेट करें", - "onboarding.extension.unsupported.android.description": "यूनिस्वैप एक्सटेंशन केवल डेस्कटॉप पर क्रोम के साथ संगत है।", - "onboarding.extension.unsupported.android.title": "मोबाइल पर Chrome समर्थित नहीं है (अभी तक)", - "onboarding.extension.unsupported.description": "यूनिस्वैप एक्सटेंशन अभी केवल क्रोम के साथ संगत है।", - "onboarding.extension.unsupported.title": "यह ब्राउज़र समर्थित नहीं है (अभी तक)", - "onboarding.home.intro.backup.description.extension": "यह सुनिश्चित करने के लिए कि आप अपने वॉलेट तक पहुंच कभी न खोएं, अपना पुनर्प्राप्ति वाक्यांश सहेजें।", - "onboarding.home.intro.backup.description.mobile": "यदि कभी आपका फोन खो जाए या आप नया फोन लें तो उसके लिए पुनर्प्राप्ति योजना बना लें।", - "onboarding.home.intro.backup.title": "अपने बटुए का बैकअप लें", - "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK, और JUP — अब Unichain पर उपलब्ध हैं", - "onboarding.home.intro.bridgedAssets.title": "यूनिचेन पर नए टोकन का व्यापार करें", - "onboarding.home.intro.fund.description": "क्रिप्टो खरीदकर या किसी अन्य खाते से स्थानांतरित करके अपने वॉलेट को निधि दें।", - "onboarding.home.intro.fund.title": "अपना पहला टोकन प्राप्त करें", - "onboarding.home.intro.label.required": "आवश्यक", - "onboarding.home.intro.label.swipe": "कड़ी चोट", - "onboarding.home.intro.pushNotifications.description": "अपने पसंदीदा टोकन, बाजार के रुझान और अन्य पर मूल्य अलर्ट प्राप्त करें।", - "onboarding.home.intro.pushNotifications.title": "जानकारी रखें", - "onboarding.home.intro.unitag.description": "एक वैयक्तिकृत वेब3 प्रोफ़ाइल बनाएं और अपना पता आसानी से दोस्तों के साथ साझा करें।", - "onboarding.home.intro.unitag.title": "अपने {{unitagDomain}} उपयोगकर्ता नाम का दावा करें", - "onboarding.import.error.invalidWords_one": "1 शब्द अमान्य या ग़लत वर्तनी वाला है", - "onboarding.import.error.invalidWords_other": "{{count}} शब्द अमान्य या ग़लत वर्तनी वाले हैं", - "onboarding.import.method.restore.message.android": "अपने द्वारा बैकअप किए गए वॉलेट को अपने Google Drive खाते में जोड़ें.", - "onboarding.import.method.restore.message.ios": "अपने iCloud खाते में बैकअप किए गए वॉलेट जोड़ें.", - "onboarding.import.method.restore.title": "बटुआ पुनर्स्थापित करें", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.android": "गूगल ड्राइव बैकअप के माध्यम से अपने वॉलेट को पुनर्स्थापित करने के लिए अपना पुनर्प्राप्ति पासवर्ड दर्ज करें।", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.ios": "iCloud बैकअप के माध्यम से अपने वॉलेट को पुनर्स्थापित करने के लिए अपना पुनर्प्राप्ति पासवर्ड दर्ज करें।", - "onboarding.import.method.restoreSeedPhrase.cloud.title.android": "Google Drive से पुनर्स्थापित करें", - "onboarding.import.method.restoreSeedPhrase.cloud.title.ios": "iCloud से पुनर्स्थापित करें", - "onboarding.import.method.restoreSeedPhrase.title": "अपने वॉलेट को पुनर्स्थापित करने का तरीका चुनें", - "onboarding.import.method.restoreSeedPhrase.wallet.desc": "अपने 12 गुप्त शब्द दर्ज करें जिन्हें आपने पहले सुरक्षित स्थान पर संग्रहीत किया था।", - "onboarding.import.method.restoreSeedPhrase.wallet.title": "पुनर्प्राप्ति वाक्यांश दर्ज करें", - "onboarding.import.method.viewPrivateKeys.button.desc": "अपनी निजी कुंजी देखें", - "onboarding.import.method.viewPrivateKeys.title": "क्या आपके पास उपरोक्त में से कुछ भी नहीं है? ", - "onboarding.import.onDeviceRecovery.other_options": "एक अलग वॉलेट बनाएं या आयात करें", - "onboarding.import.onDeviceRecovery.other_options.label": "क्या आप उपरोक्त में से कुछ भी नहीं चाहते?", - "onboarding.import.onDeviceRecovery.subtitle": "वह वॉलेट चुनें जिसमें आप पुनः लॉग इन करना चाहते हैं।", - "onboarding.import.onDeviceRecovery.title": "Uniswap में आपका स्वागत है", - "onboarding.import.onDeviceRecovery.wallet.button": "पुनर्प्राप्ति वाक्यांश देखें", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 अन्य वॉलेट", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} अन्य वॉलेट", - "onboarding.import.onDeviceRecovery.warning.caption": "कृपया सुनिश्चित करें कि आपने अन्य सभी वॉलेट का बैकअप ले लिया है। यदि आप कभी उन्हें पुनर्स्थापित करना चाहते हैं, तो आपको उनके पुनर्प्राप्ति वाक्यांशों या संबंधित {{cloudProvider}} बैकअप की आवश्यकता होगी।", - "onboarding.import.onDeviceRecovery.warning.title": "क्या आपको यकीन है?", - "onboarding.import.selectMethod.errorMessage": "एक अप्रत्याशित त्रुटि हुई. कृपया पुनः प्रयास करें.", - "onboarding.import.selectMethod.mobileApp.subtitle": "क्यूआर कोड के माध्यम से मोबाइल ऐप से वॉलेट आयात करें।", - "onboarding.import.selectMethod.mobileApp.title": "यूनिस्वैप मोबाइल का उपयोग करें", - "onboarding.import.selectMethod.passkey.subtitle": "मौजूदा पासकी का उपयोग करके अपने यूनिस्वैप वॉलेट को सिंक करें।", - "onboarding.import.selectMethod.passkey.title": "पासकी से लॉग इन करें", - "onboarding.import.selectMethod.recoveryPhrase.subtitle": "किसी अन्य क्रिप्टो वॉलेट से आयात करें.", - "onboarding.import.selectMethod.recoveryPhrase.title": "पुनर्प्राप्ति वाक्यांश दर्ज करें", - "onboarding.import.selectMethod.title": "लॉग इन करें या वॉलेट आयात करें", - "onboarding.import.title": "चुनें कि आप अपना बटुआ कैसे जोड़ना चाहते हैं", - "onboarding.importMnemonic.button.default": "मेरा पुनर्प्राप्ति वाक्यांश 12 शब्दों का है", - "onboarding.importMnemonic.button.importing": "आयात किया जा रहा है...", - "onboarding.importMnemonic.button.longPhrase": "मेरा पुनर्प्राप्ति वाक्यांश लंबा है", - "onboarding.importMnemonic.error.invalidPhrase": "आपके द्वारा दर्ज किया गया वाक्यांश अमान्य है", - "onboarding.importMnemonic.subtitle": "अपना 12-शब्द पुनर्प्राप्ति वाक्यांश टाइप करें या पेस्ट करें", - "onboarding.importMnemonic.title": "अपना पुनर्प्राप्ति वाक्यांश दर्ज करें", - "onboarding.importPasskey.bringWindowToFront": "खिड़की को सामने लाएँ", - "onboarding.importPasskey.continueInSecureWindow": "सुरक्षित साइन-इन विंडो में जारी रखें.", - "onboarding.intro.button.alreadyHave": "मेरे पास पहले से ही एक बटुआ है", - "onboarding.intro.button.logInOrImport": "लॉग इन करें या आयात करें", - "onboarding.intro.mobileScan.button": "आयात करने के लिए QR कोड स्कैन करें", - "onboarding.intro.mobileScan.title": "क्या आपके पास Uniswap ऐप है?", - "onboarding.landing.button.add": "एक मौजूदा वॉलेट जोड़ें", - "onboarding.landing.button.create": "एक नया वॉलेट बनाएं", - "onboarding.landing.button.createAccount": "खाता बनाएं", - "onboarding.name.choose": "एक उपयोगकर्ता नाम चुनें", - "onboarding.name.choose.subtitle": "यह एक सार्वजनिक नाम है जिसका उपयोग कोई भी आपको क्रिप्टो भेजने के लिए कर सकता है।", - "onboarding.notification.permission.message": "सूचनाएं प्राप्त करने के लिए, अपने डिवाइस की सेटिंग में Uniswap वॉलेट के लिए सूचनाएं चालू करें।", - "onboarding.notification.permission.title": "अधिसूचना अनुमति", - "onboarding.notification.subtitle": "पसंदीदा टोकन के लिए लेनदेन की स्थिति और प्रमुख मूल्य परिवर्तनों पर अपडेट रहें।", - "onboarding.notification.title": "सूचनाओं पर मुड़ें", - "onboarding.passkey.create": "अपना पासकी बनाएं", - "onboarding.passkey.loading.subtitle": "इसमें बस एक सेकंड लगेगा.", - "onboarding.passkey.loading.title": "अपना बटुआ ढूंढ़ना...", - "onboarding.passkey.secure": "अपने खाते को सुरक्षित करें", - "onboarding.passkey.secure.description": "पासकीज़ आपको केवल अपने चेहरे या फिंगरप्रिंट का उपयोग करके अपने खाते तक शीघ्रतापूर्वक और सुरक्षित रूप से पहुंचने की अनुमति देती है।", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "आइए पुष्टि करें कि आपने सही लिखा है। यदि आप इसे खो देते हैं या गलत तरीके से लिखते हैं, तो आप अपने धन को वापस नहीं पा सकेंगे।", - "onboarding.recoveryPhrase.confirm.subtitle.default": "यदि आप इसे खो देते हैं या गलत तरीके से लिख देते हैं, तो आप अपनी धनराशि वापस नहीं पा सकेंगे।", - "onboarding.recoveryPhrase.confirm.title": "चलिए पुष्टि करते हैं कि आपने सही उत्तर दिया है", - "onboarding.recoveryPhrase.view.subtitle": "आपको अपना बटुआ पुनः प्राप्त करने के लिए इन सभी 12 गुप्त शब्दों को दर्ज करना होगा।", - "onboarding.recoveryPhrase.view.title": "अपना पुनर्प्राप्ति वाक्यांश लिखें", - "onboarding.recoveryPhrase.view.title.hasPassword": "यदि आप कभी अपना पासवर्ड भूल जाएं...", - "onboarding.recoveryPhrase.warning.final.button": "मैं तैयार हूं", - "onboarding.recoveryPhrase.warning.final.message": "आपका पुनर्प्राप्ति वाक्यांश ही आपको (और जिसके पास भी यह है) आपके धन तक पहुंच प्रदान करता है। इसे अपने तक ही रखना सुनिश्चित करें।", - "onboarding.recoveryPhrase.warning.final.title": "यह चरण किसी निजी स्थान पर करें", - "onboarding.recoveryPhrase.warning.screenshot.message": "जो कोई भी आपकी तस्वीरों तक पहुंच प्राप्त करता है वह आपके बटुए तक पहुंच सकता है। हम अनुशंसा करते हैं कि आप इसके बजाय अपने शब्द लिखें।", - "onboarding.recoveryPhrase.warning.screenshot.title": "स्क्रीनशॉट सुरक्षित नहीं हैं", - "onboarding.resetPassword.complete.safety": "वॉलेट सुरक्षा के बारे में और जानें", - "onboarding.resetPassword.complete.subtitle": "अपने बटुए को अनलॉक करने के लिए अपने नए पासवर्ड का उपयोग करें।", - "onboarding.resetPassword.complete.title": "पासवर्ड रीसेट", - "onboarding.scan.error": "QR कोड लोड करते समय कोई त्रुटि हुई", - "onboarding.scan.otp.error": "आपके द्वारा सबमिट किया गया कोड गलत है, या सबमिट करने में कोई त्रुटि हुई है। कृपया पुन: प्रयास करें।", - "onboarding.scan.otp.failed": "असफल प्रयास: {{number}}", - "onboarding.scan.otp.subtitle": "6-अक्षर वाले कोड के लिए अपना Uniswap मोबाइल ऐप जांचें", - "onboarding.scan.otp.title": "एक बार का कोड दर्ज करें", - "onboarding.scan.subtitle": "अपना वॉलेट आयात करने के लिए Uniswap मोबाइल ऐप से QR कोड को स्कैन करें।", - "onboarding.scan.title": "ऐप से वॉलेट आयात करें", - "onboarding.scan.troubleScanning.message": "पुनर्प्राप्ति वाक्यांश के माध्यम से आयात करें", - "onboarding.scan.troubleScanning.title": "स्कैनिंग में समस्या?", - "onboarding.scan.wifi": "अपने फोन को अपने कंप्यूटर के समान वाई-फाई नेटवर्क से कनेक्ट करें।", - "onboarding.security.alert.biometrics.message.android": "बायोमेट्रिक्स का उपयोग करने के लिए, इसे पहले सेटिंग्स में सेट करें", - "onboarding.security.alert.biometrics.message.ios": "{{biometricsMethod}}का उपयोग करने के लिए, सिस्टम सेटिंग्स में पहुंच की अनुमति दें", - "onboarding.security.alert.biometrics.title.android": "बायोमेट्रिक्स अक्षम है", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} अक्षम है", - "onboarding.security.button.confirm.android": "बायोमेट्रिक्स सक्षम करें", - "onboarding.security.button.confirm.ios": "{{biometricsMethod}}सक्षम करें", - "onboarding.security.button.setup": "स्थापित करना", - "onboarding.security.subtitle.android": "लेनदेन भेजने के लिए बायोमेट्रिक्स की आवश्यकता करके सुरक्षा की एक अतिरिक्त परत जोड़ें।", - "onboarding.security.subtitle.ios": "लेनदेन भेजने के लिए {{biometricsMethod}} की आवश्यकता करके सुरक्षा की एक अतिरिक्त परत जोड़ें।", - "onboarding.security.title": "अपने बटुए को सुरक्षित रखें", - "onboarding.selectWallets.error": "पते लोड नहीं किये जा सके", - "onboarding.selectWallets.title.default": "आयात करने के लिए वॉलेट चुनें", - "onboarding.selectWallets.title.error": "वॉलेट आयात करने में त्रुटि", - "onboarding.termsOfService": "जारी रखते हुए, मैं सेवा की शर्तों से सहमत हूं और गोपनीयता नीतिसे सहमति देता हूं", - "onboarding.tooltip.recoveryPhrase.trigger": "पुनर्प्राप्ति वाक्यांश क्या है?", - "onboarding.wallet.continue": "आइए इसे सुरक्षित रखें", - "onboarding.wallet.defaultName": "वॉलेट {{number}}", - "onboarding.wallet.description.full": "यह टोकन, एनएफटी और आपके सभी ट्रेडों के लिए आपका व्यक्तिगत स्थान है। अपने धन को सुरक्षित रखने के लिए इसे स्थापित करना समाप्त करें।", - "onboarding.wallet.title": "आपके नए बटुए में आपका स्वागत है", - "onboarding.welcome.subtitle": "चलिए, अपना वॉलेट सेट अप करना पूरा करें।", - "onboarding.welcome.title": "स्वागत!", - "outageBanner.message": "{{chainName}}{{versionDescription}} डेटा अभी उपलब्ध नहीं है, लेकिन हमें उम्मीद है कि समस्या शीघ्र ही हल हो जाएगी।", - "outageBanner.message.sub": "आप अभी भी बिना किसी समस्या के इस श्रृंखला पर स्वैप और तरलता प्रदान कर सकते हैं।", - "outageBanner.title": "{{versionName}} जल्द ही वापस आऊंगा", - "passkeys.help.modal.subtitle": "यदि आपको पासकीज़ से संबंधित कोई समस्या आ रही है, तो सहायता के लिए Uniswap सहायता पर जाएँ।", - "passkeys.help.modal.subtitle.invalidPasskey": "आपका अनुरोध पूरा नहीं किया जा सका। कृपया इससे जुड़ी पासकी का उपयोग करके पुनः प्रयास करें ", - "passkeys.help.modal.subtitle.technicalError": "अप्रत्याशित तकनीकी त्रुटि के कारण आपका अनुरोध पूरा नहीं किया जा सका। आपके फंड सुरक्षित हैं। कृपया पुनः प्रयास करें।", - "passkeys.help.modal.title": "मदद की ज़रूरत है?", - "passkeys.help.modal.title.invalidPasskey": "अमान्य पासकी", - "passkeys.help.modal.title.technicalError": "तकनीकी त्रुटि", - "passkeys.manage.modal.subtitle": "पासकी जोड़ने या हटाने के लिए, कृपया {{passkeyManagementUrl}}में साइन इन करें।", - "passkeys.manage.modal.title": "पासकी प्रबंधित करें", - "permit.approval.fail": "परमिट स्वीकृति विफल", - "permit.approval.fail.message": "परमिट2 टोकन अनुमोदन को विभिन्न अनुप्रयोगों में साझा और प्रबंधित करने की अनुमति देता है।", - "pool.activeRange": "सक्रिय टिक रेंज", - "pool.addAs": "{{nativeWrappedSymbol}}के रूप में जोड़ें", - "pool.apr": "अप्रैल", - "pool.apr.base": "आधार ए.पी.आर.", - "pool.apr.description": "1 दिन की फीस के आधार पर वार्षिक", - "pool.apr.reward": "रिवॉर्ड ए.पी.आर.", - "pool.aprText": "पूल ए.पी.आर.", - "pool.balances": "पूल संतुलन", - "pool.closedCTA.description": "आप पृष्ठ के शीर्ष पर फ़िल्टर का उपयोग करके उन्हें देख सकते हैं।", - "pool.closedCTA.title": "क्या आप बंद पदों की तलाश में हैं?", - "pool.collectAs": "{{nativeWrappedSymbol}}के रूप में एकत्रित करें", - "pool.collectFees": "शुल्क एकत्रित करें", - "pool.connectEthereumToView": "अपने पूल देखने के लिए एक एथेरियम वॉलेट कनेक्ट करें", - "pool.create": "नया पूल बनाना", - "pool.create.info": "आपके चयन से एक नया लिक्विडिटी पूल बनेगा जिसके परिणामस्वरूप प्रारंभिक लिक्विडिटी कम हो सकती है और अस्थिरता बढ़ सकती है। इन जोखिमों को कम करने के लिए मौजूदा पूल में जोड़ने पर विचार करें।", - "pool.createdPosition": "निर्मित स्थिति", - "pool.createdPosition.canceled": "पद निर्माण रद्द", - "pool.createdPosition.failed": "स्थिति बनाना विफल", - "pool.dynamic": "गतिशील पूल", - "pool.earnings": "आय", - "pool.earnings.empty": "अभी तक आपकी कोई कमाई नहीं हुई है", - "pool.explorers": "खोजकर्ता", - "pool.import": "आयात पूल", - "pool.import.link.description": "कुछ v2 स्थितियाँ स्वचालित रूप से प्रदर्शित नहीं होतीं.", - "pool.import.positions.v2": "V2 स्थिति आयात करें", - "pool.import.positions.v2.selectPair.description": "कुछ v2 स्थितियाँ स्वचालित रूप से प्रदर्शित नहीं होती हैं। अपनी स्थितियाँ आयात करने और देखने के लिए टोकन जोड़ी चुनें।", - "pool.import.success": "पूल आयातित", - "pool.incentives.administeredRewards": "पुरस्कार स्वायत्त मर्कल वितरक अनुबंध द्वारा वितरित किए जाते हैं।", - "pool.incentives.collect": "इकट्ठा करना", - "pool.incentives.collectedRewards": "एकत्रित पुरस्कार", - "pool.incentives.collectFailed": "संग्रहण विफल, कृपया पुनः प्रयास करें.", - "pool.incentives.collectFailedNoRetry": "पुरस्कार एकत्रित करना विफल रहा.", - "pool.incentives.collectingRewards": "पुरस्कार एकत्रित करना", - "pool.incentives.collectRewards": "पुरस्कार एकत्रित करें", - "pool.incentives.collectRewardsCanceled": "पुरस्कार संग्रह रद्द", - "pool.incentives.daysLeft": "दिन शेष", - "pool.incentives.eligible": "योग्य पूल में टोकन पुरस्कार होते हैं ताकि आप अधिक कमा सकें", - "pool.incentives.merklDocs": "उत्सर्जन पुरस्कार और पूल टीवीएल से मर्कल द्वारा गणना की गई।", - "pool.incentives.rewardsDistribution": "पुरस्कार वितरण", - "pool.incentives.rewardsEarned": "अर्जित पुरस्कार", - "pool.incentives.similarPoolHasRewards": "इसी प्रकार के पूल में UNI पुरस्कार हैं", - "pool.incentives.switchPools": "स्विच पूल", - "pool.incentives.timePeriod": "समय सीमा", - "pool.incentives.uni.findMore": "UNI पुरस्कार वाले पूल खोजें", - "pool.incentives.yourRewards.error": "आपके पुरस्कार अभी उपलब्ध नहीं हैं", - "pool.incentives.yourRewards.error.description": "पुरस्कार प्राप्त नहीं किए जा सके। ऐसा नेटवर्क समस्या के कारण हो सकता है। पेज को पुनः लोड करने का प्रयास करें।", - "pool.info": "पूल जानकारी", - "pool.limitFluctuation.warning": "कृपया ध्यान रखें कि सीमाओं के लिए निष्पादन वास्तविक समय के बाजार में उतार-चढ़ाव और एथेरियम नेटवर्क की भीड़ के आधार पर भिन्न हो सकता है। टोकन निर्दिष्ट मूल्य तक पहुंचने पर सीमाएं ठीक से निष्पादित नहीं हो सकती हैं।", - "pool.liquidity.data.error.message": "आपके लेन-देन के लिए आवश्यक डेटा प्राप्त करते समय एक त्रुटि हुई.", - "pool.liquidity.outOfSync": "पूल और बाजार मूल्य में बेमेल", - "pool.liquidity.outOfSync.message": "इस पूल में कीमतें चयनित टोकन की बाज़ार कीमतों से अलग होती हैं। अपनी मूल्य सीमा को तदनुसार समायोजित करें या घाटे से बचने के लिए पूल के पुनर्संतुलन की प्रतीक्षा करें।", - "pool.maxPrice": "अधिकतम मूल्य", - "pool.migrateLiquidity": "तरलता माइग्रेट करें", - "pool.migrateLiquidityDisabledTooltip": "यह श्रृंखला v4 तरलता पूल का समर्थन नहीं करती है।", - "pool.migrateToV4": "v4 पर माइग्रेट करें", - "pool.minPrice": "न्यूनतम मूल्य", - "pool.newPosition.plus": "+ नई स्थिति", - "pool.newPosition.title": "नई स्थिति", - "pool.newSpecificPosition": "नई {{symbol}} स्थिति", - "pool.notAvailableOnSolana": "सोलाना में पूल उपलब्ध नहीं हैं", - "pool.notFound.description": "क्षमा करें, हमें इस पूल के बारे में कोई जानकारी नहीं मिल पाई। नाम और पता जाँचें और पुनः प्रयास करें।", - "pool.notFound.title": "पूल नहीं मिला", - "pool.openToStart.evmAndSolanaConnected": "शुरुआत करने के लिए कोई नया पद खोलें या पूल बनाएँ। सोलाना पर पूल उपलब्ध नहीं हैं।", - "pool.openToStart.evmOnly": "आरंभ करने के लिए एक नया पद खोलें या एक पूल बनाएं।", - "pool.percent": "{{pct}}% पूल", - "pool.pooled": "पूल्ड {{sym}}:", - "pool.position": "पद", - "pool.positions": "स्थितियां", - "pool.positions.title": "आपकी स्थिति", - "pool.positions.transaction.settings": "लेन-देन सेटिंग", - "pool.positions.usdValueUnavailable": "USD मूल्य उपलब्ध नहीं है", - "pool.positions.usdValueUnavailable.tooltip": "इस पद के लिए USD मूल्य वर्तमान में उपलब्ध नहीं है। जमा टोकन राशि के लिए पद विवरण देखें।", - "pool.refresh.prices": "ताज़ा कीमतें", - "pool.removeLiquidity": "तरलता हटाएँ", - "pool.rewardAPR": "रिवॉर्ड एपीआर (यूएनआई)", - "pool.rewardAPR.percent": "{{pct}} रिवॉर्ड APR", - "pool.rewards": "पुरस्कार", - "pool.rewardsPool.label": "पुरस्कार पूल में पूल टोकन:", - "pool.selectPair": "जोड़ी चुनें", - "pool.share.label": "आपका पूल शेयर:", - "pool.specificPosition": "{{symbol}} स्थिति", - "pool.tokenPair": "टोकन जोड़ी", - "pool.top.rewards": "पुरस्कार वाले पूल", - "pool.top.tvl": "टीवीएल द्वारा शीर्ष पूल", - "pool.top.volume": "24 घंटे की मात्रा के अनुसार पूल", - "pool.totalAPR": "कुल एपीआर", - "pool.totalTokens": "आपके कुल पूल टोकन:", - "pool.v2": "v2 पूल", - "pool.v3": "v3 पूल", - "pool.via": "{{tokenPair}} से {{dex}}तक", - "pool.volOverTvl": "1डी वॉल/टीवीएल", - "pool.volume.thirtyDay": "30 दिन का वॉल्यूम", - "pool.volume.thirtyDay.short": "30डी वॉल्यूम", - "pool.withdrawAs": "{{nativeWrappedSymbol}}के रूप में निकालें", - "poolFinder.availablePools": "उपलब्ध पूल", - "poolFinder.availablePools.found.description": "v2 पूल आपके जोड़ी चयन से मेल खाते हैं।", - "poolFinder.availablePools.notFound.description": "कोई मेल खाता v2 पूल नहीं मिला। अपने टोकन चयन की दोबारा जाँच करें और सुनिश्चित करें कि आप सही वॉलेट से जुड़े हैं।", - "pools.explore": "पूल का अन्वेषण करें", - "portfolio.activity.filters.timePeriod.all": "पूरे समय", - "portfolio.activity.filters.transactionType.all": "सभी प्रकार", - "portfolio.activity.filters.transactionType.deposits": "जमा", - "portfolio.activity.filters.transactionType.staking": "जताया", - "portfolio.activity.filters.transactionType.swaps": "स्वैप", - "portfolio.activity.title": "गतिविधि", - "portfolio.connectWallet.summary": "{{amount}}+ नेटवर्क पर टोकन, पूल और अन्य चीज़ों को ट्रैक करें", - "portfolio.defi.title": "डीफाई", - "portfolio.description": "सभी श्रृंखलाओं और प्रोटोकॉल में अपने क्रिप्टो पोर्टफोलियो को ट्रैक करें", - "portfolio.nfts.title": "एनएफटी", - "portfolio.overview.title": "अवलोकन", - "portfolio.title": "पोर्टफोलियो", - "portfolio.tokens.table.column.allocation": "आवंटन", - "portfolio.tokens.table.column.balance": "संतुलन", - "portfolio.tokens.table.column.change1d": "1डी परिवर्तन", - "portfolio.tokens.table.column.price": "कीमत", - "portfolio.tokens.table.column.token": "टोकन", - "portfolio.tokens.table.column.value": "कीमत", - "portfolio.tokens.title": "टोकन", - "position.addHook": "एक हुक जोड़ें", - "position.addHook.tooltip": "हुक एक उन्नत सुविधा है जो पूल को स्मार्ट कॉन्ट्रैक्ट के साथ इंटरैक्ट करने में सक्षम बनाती है, जिससे विभिन्न क्षमताएँ अनलॉक होती हैं। हुक जोड़ते समय सावधानी बरतें, क्योंकि कुछ दुर्भावनापूर्ण हो सकते हैं या अनपेक्षित परिणाम पैदा कर सकते हैं।", - "position.addingHook": "हुक जोड़ना", - "position.addingHook.disclaimer": "हुक जोड़ने से अनपेक्षित परिणाम हो सकते हैं। अपना शोध करें और अपने जोखिम पर आगे बढ़ें।", - "position.addingHook.hideProperties": "गुण छुपाएं", - "position.addingHook.invalidAddress": "वैध हुक पता दर्ज करें", - "position.addingHook.viewProperties": "गुण देखें", - "position.create.confirm": "स्थिति की पुष्टि करें", - "position.create.invalidPrice": "अमान्य मूल्य", - "position.create.invalidRange": "अमान्य श्रेणी", - "position.create.modal.header": "स्थिति बनाना", - "position.create.unsupportedSolana": "सोलाना पूल समर्थित नहीं हैं.", - "position.create.unsupportedSolana.description": "पूल बनाने के लिए, समर्थित EVM श्रृंखला पर स्विच करें.", - "position.create.unsupportedToken.description": "किसी भिन्न प्रोटोकॉल संस्करण के साथ बनाने का प्रयास करें.", - "position.create.v2unsupportedChain": "यह श्रृंखला v2 पूल के लिए समर्थित नहीं है.", - "position.currentValue": "वर्तमान स्थिति मान", - "position.default_price_strategies": "मूल्य रणनीतियाँ", - "position.default_price_strategies.error": "मूल्य रणनीति निर्धारित करने में असमर्थ", - "position.deposit.confirm.create.description.less": "दर्ज की गई प्रारंभिक कीमत बाजार मूल्य से {{value}}% कम है और इसके परिणामस्वरूप धन की हानि हो सकती है। क्या आप आगे बढ़ना चाहते हैं?", - "position.deposit.confirm.create.description.more": "दर्ज किया गया आरंभिक मूल्य बाजार मूल्य से {{value}}% अधिक है और इसके परिणामस्वरूप धन की हानि हो सकती है। क्या आप आगे बढ़ना चाहते हैं?", - "position.deposit.confirm.create.title": "बाजार मूल्य से बड़ा अंतर", - "position.deposit.description": "अपने तरलता योगदान के लिए टोकन राशि निर्दिष्ट करें.", - "position.depositedCurrency": "जमा {{currencySymbol}}", - "position.fot.warning": "{{token}} और अन्य “स्थानांतरण पर शुल्क” टोकन केवल Uniswap v2 द्वारा समर्थित हैं।", - "position.fot.warning.cta": "v2 स्थिति बनाएं", - "position.hook.disclaimer": "मैं इस हुक को जोड़ने में शामिल संभावित जोखिमों को समझता हूं।", - "position.hook.donateWarning": "इस ध्वज के परिणामस्वरूप अर्जित शुल्क में परिवर्तन हो सकता है।", - "position.hook.liquidityWarning": "यह फ़्लैग पूल को नई लिक्विडिटी जोड़ने से रोक सकता है। आपका लेन-देन वापस हो सकता है।", - "position.hook.removeWarning": "इससे आपकी धनराशि अवरुद्ध हो सकती है या आपको शुल्क जमा करने से रोका जा सकता है।", - "position.hook.swapWarning": "यह ध्वज तरलता प्रदाताओं को अधिक आसानी से जस्ट-इन-टाइम तरलता का लाभ उठाने की अनुमति दे सकता है, जिसके परिणामस्वरूप कम शुल्क अर्जित हो सकता है।", - "position.hook.warningHeader": "महत्वपूर्ण: हुक जोखिमों की पहचान की गई", - "position.hook.warningInfo": "हमने इस हुक से जुड़े संभावित जोखिमों की पहचान की है। कृपया आगे बढ़ने का फैसला करने से पहले सुनिश्चित करें कि आप यह समझ गए हैं कि यह हुक कैसे काम करता है।", - "position.increase.fot": "{{token}} और अन्य “स्थानांतरण पर शुल्क” टोकन के लिए तरलता जोड़ना समर्थित नहीं है।", - "position.initialPrice": "प्रारंभिक मूल्य", - "position.initialPrice.difference.negative": "{{ value }}बाजार मूल्य से % कम", - "position.initialPrice.difference.positive": "{{ value }}बाजार मूल्य से % अधिक", - "position.initialPrice.info": "नया पूल बनाते समय, आपको दोनों टोकन के लिए शुरुआती विनिमय दर निर्धारित करनी होगी। यह दर शुरुआती बाज़ार मूल्य को दर्शाएगी।", - "position.initialPrice.set": "प्रारंभिक मूल्य निर्धारित करें", - "position.initialPrice.useMarketPrice": "बाजार मूल्य का उपयोग करें", - "position.migrate.liquidity": "पोजीशन्स को माइग्रेट करते समय, आप अपने टोकन जोड़े को बदल नहीं सकते हैं, लेकिन आप कार्यक्षमता बढ़ाने के लिए एक हुक जोड़ सकते हैं।", - "position.migrate.v4unsupportedChain": "यह श्रृंखला v4 पूल के लिए समर्थित नहीं है.", - "position.new": "नई स्थिति", - "position.new.protocol": "नई {{protocol}} स्थिति", - "position.notFound": "स्थिति नहीं मिली", - "position.notFound.description": "इस पद के बारे में विस्तृत जानकारी उपलब्ध नहीं है। कृपया जाँच लें कि आप सही वॉलेट से जुड़े हैं।", - "position.one_sided_lower": "एक तरफा निचला", - "position.one_sided_lower.description": "यदि कीमत गिरती है तो तरलता की आपूर्ति करें", - "position.one_sided_upper": "एक तरफा ऊपरी", - "position.one_sided_upper.description": "यदि कीमत बढ़ती है तो तरलता की आपूर्ति करें", - "position.protocol": "{{protocol}} स्थिति", - "position.provide.liquidity": "वे टोकन चुनें जिनके लिए आप लिक्विडिटी प्रदान करना चाहते हैं। आप सभी समर्थित नेटवर्क पर टोकन चुन सकते हैं।", - "position.provide.liquidityDescription": "पूर्ण सीमा तक तरलता उपलब्ध कराने से सभी संभावित मूल्यों पर निरंतर बाजार भागीदारी सुनिश्चित होती है, जिससे सरलता मिलती है, लेकिन अस्थायी हानि की संभावना बनी रहती है।", - "position.provide.liquidityDescription.creatingPool": "पूल बनाते समय पूर्ण सीमा की तरलता निर्धारित करने से सभी संभावित मूल्यों पर निरंतर बाजार भागीदारी सुनिश्चित होती है, जिससे सरलता मिलती है, लेकिन अस्थायी हानि की संभावना अधिक रहती है।", - "position.provide.liquidityDescription.custom": "कस्टम रेंज आपको अपनी तरलता को विशिष्ट मूल्य सीमाओं के भीतर केंद्रित करने की अनुमति देती है, जिससे पूंजी दक्षता और शुल्क आय में वृद्धि होती है, लेकिन इसके लिए अधिक सक्रिय प्रबंधन की आवश्यकता होती है।", - "position.provide.outOfRange.closePosition": "बंद स्थिति", - "position.provide.outOfRange.description": "माइग्रेशन के दौरान इस स्थिति की सीमा को समायोजित नहीं किया जा सकता। नई सीमा निर्धारित करने के लिए, इस स्थिति को बंद करें और एक नई v4 स्थिति खोलें।", - "position.provide.outOfRange.title": "आप सीमा से बाहर की स्थिति में माइग्रेट कर रहे हैं", - "position.removeHook": "हुक हटाएँ", - "position.resetDescription": "आपके टोकन, मूल्य और रेंज चयन रीसेट हो जाएंगे.", - "position.setRange": "मूल्य सीमा निर्धारित करें", - "position.setRange.inputsBelow": "अपनी रेंज निर्धारित करने के लिए नीचे दिए गए इनपुट का उपयोग करें।", - "position.stable": "स्थिर", - "position.stable.description": "स्थिर सिक्कों या कम अस्थिरता वाले जोड़ों के लिए अच्छा", - "position.step.deposit": "जमा राशि दर्ज करें", - "position.step.price": "प्रारंभिक मूल्य और जमा राशि निर्धारित करें", - "position.step.range": "मूल्य सीमा और जमा राशि निर्धारित करें", - "position.step.select": "टोकन जोड़ी और शुल्क का चयन करें", - "position.value": "स्थिति मान", - "position.valueUnavailable": "इस पद के लिए USD मूल्य वर्तमान में उपलब्ध नहीं है। जमा टोकन राशि के लिए पद विवरण देखें।", - "position.wide": "चौड़ा", - "position.wide.description": "अस्थिर जोड़ों के लिए अच्छा", - "position.wrapped.unwrap": "खोलना {{wrappedToken}}", - "position.wrapped.warning": "{{nativeToken}} v4 पूल के लिए आवश्यक", - "position.wrapped.warning.info": "अधिक लागत प्रभावी और कुशल तरलता प्रदान करने के लिए अपने {{wrappedToken}} को खोलें और {{nativeToken}} जमा करें।", - "positions.noPositions.description": "आपके पास कोई लिक्विडिटी पोजीशन नहीं है। योग्य पूल पर फीस और रिवॉर्ड अर्जित करना शुरू करने के लिए एक नई पोजीशन बनाएँ।", - "positions.noPositions.title": "कोई पद नहीं", - "positions.welcome.connect.description": "अपनी स्थिति और पुरस्कार देखने के लिए आपको अपना वॉलेट कनेक्ट करना होगा।", - "positions.welcome.connect.wallet": "अपना वॉलेट कनेक्ट करें", - "privacy.anonymizedLogs": "समय के साथ सुधार करने के लिए ऐप अनाम उपयोग के आंकड़े लॉग करता है।", - "privacy.autoRouter": "यह ऐप यूनिस्वैप लैब्स सर्वर से इष्टतम व्यापार मार्ग प्राप्त करता है।", - "privacy.infura": "यह ऐप ऑन-चेन डेटा प्राप्त करता है और इन्फुरा एपीआई के साथ अनुबंध कॉल का निर्माण करता है।", - "privacy.thirdPartyApis": "यह ऐप निम्नलिखित तृतीय-पक्ष API का उपयोग करता है:", - "privacy.trm": "ऐप आपके वॉलेट पते को सुरक्षित रूप से एकत्रित करता है और जोखिम और अनुपालन कारणों से इसे TRM लैब्स इंक के साथ साझा करता है।", - "privacy.uniswaptos": "यूनिस्वैप लैब्स की सेवा की शर्तें", - "privateKeys.export.modal.speedbump.bullet1": "इसे अकेले में देखें", - "privateKeys.export.modal.speedbump.bullet2": "इसे किसी के साथ साझा न करें", - "privateKeys.export.modal.speedbump.bullet3": "इसे कभी भी किसी वेबसाइट या ऐप पर दर्ज न करें", - "privateKeys.export.modal.speedbump.subtitle": "जो कोई भी आपकी निजी कुंजी जानता है, वह आपके वॉलेट और धन तक पहुंच सकता है।", - "privateKeys.export.modal.speedbump.title": "इससे पहले कि आप जारी रखें", - "privateKeys.export.modal.subtitle": "ऐसा लगता है कि आप अपने वॉलेट को पूरी तरह से रीस्टोर नहीं कर पा रहे हैं। यह सुनिश्चित करने के लिए कि आप अपने फंड तक कभी पहुँच न खोएँ, अपनी प्राइवेट की कॉपी करें।", - "privateKeys.export.modal.title": "अपनी निजी कुंजी निर्यात करें", - "privateKeys.export.modal.warning": "यदि आप अपना फोन खो देते हैं या ऐप हटा देते हैं, तो आपको इस कुंजी को किसी अन्य वॉलेट में आयात करना होगा।", - "privateKeys.view.button.continue": "मैंने उन सभी की नकल की.", - "privateKeys.view.button.continue.single": "मैंने इसकी नकल की.", - "privateKeys.view.subtitle": "आपकी निजी कुंजी एक विशिष्ट वॉलेट तक पहुंच प्रदान करती है। प्रत्येक वॉलेट की एक अलग निजी कुंजी होती है।", - "privateKeys.view.title": "निजी चाबी", - "qrScanner.button.connections_one": "1 ऐप कनेक्ट हुआ", - "qrScanner.button.connections_other": "{{count}} ऐप्स कनेक्ट हैं", - "qrScanner.error.camera.message": "किसी कोड को स्कैन करने के लिए, सिस्टम सेटिंग्स में कैमरा एक्सेस की अनुमति दें", - "qrScanner.error.camera.title": "कैमरा अक्षम है", - "qrScanner.error.none": "कोई क्यूआर कोड नहीं मिला", - "qrScanner.recipient.action.scan": "QR कोड स्कैन करें", - "qrScanner.recipient.action.show": "मेरा क्यूआर कोड दिखाओ", - "qrScanner.recipient.error.message": "दोबारा प्रयास करने से पहले सुनिश्चित करें कि आप एक वैध एथेरियम एड्रेस क्यूआर कोड स्कैन कर रहे हैं।", - "qrScanner.recipient.error.title": "अमान्य क्यूआर कोड", - "qrScanner.request.message.unavailable": "कोई संदेश नहीं मिला.", - "qrScanner.request.method.default": "{{dappNameOrUrl}}से अनुरोध", - "qrScanner.request.method.signature": "{{dappNameOrUrl}}से हस्ताक्षर अनुरोध", - "qrScanner.request.method.transaction": "{{dappNameOrUrl}}से लेनदेन अनुरोध", - "qrScanner.request.withAmount": "{{dappName}} को {{amount}} {{currencySymbol}}तक उपयोग करने की अनुमति दें?", - "qrScanner.request.withoutAmount": "{{dappName}} को अपने {{currencySymbol}}का उपयोग करने की अनुमति दें?", - "qrScanner.status.connecting": "कनेक्ट हो रहा है...", - "qrScanner.status.loading": "लोड हो रहा है...", - "qrScanner.title": "QR कोड स्कैन करें", - "qrScanner.wallet.networks": "समर्थित नेटवर्क", - "range.outOfView": "दृश्य से बाहर की सीमा", - "removeLiquidity.pooled": "पूल्ड {{symbol}}:", - "revoke.failed.message": "नेटवर्क या कनेक्शन संबंधी समस्या के कारण आपका निरस्तीकरण विफल हो सकता है। अपना कनेक्शन जांचें और पुनः प्रयास करें।", - "routing.aggregateLiquidity": "जब उपलब्ध हो, तो बेहतर कीमतों और गैस मुक्त स्वैप के लिए तरलता स्रोतों को एकत्रित करता है।", - "routing.aggregateLiquidity.uniswapx": "यूनिस्वैपएक्स ऑन और ऑफ-चेन तरलता स्रोतों को एकत्रित करता है, जिससे आपको सर्वोत्तम उपलब्ध मूल्य और गैस मुक्त स्वैप मिलते हैं।", - "routing.cheapest": "यूनिस्वैप क्लाइंट मूल्य और नेटवर्क लागत को ध्यान में रखते हुए सबसे सस्ता व्यापार विकल्प चुनता है।", - "routing.cheapest.v4": "यूनिस्वैप क्लाइंट मूल्य और नेटवर्क लागत को ध्यान में रखते हुए इष्टतम व्यापार विकल्प का चयन करता है।", - "scantastic.code.expired": "खत्म हो चुका", - "scantastic.code.subtitle": "इस कोड को Uniswap एक्सटेंशन में दर्ज करें। आपका पुनर्प्राप्ति वाक्यांश सुरक्षित रूप से एन्क्रिप्ट और स्थानांतरित किया जाएगा।", - "scantastic.code.timeRemaining.shorthand.hours": "नया कोड {{hours}}h {{minutes}}m {{seconds}}s में", - "scantastic.code.timeRemaining.shorthand.minutes": "नया कोड {{minutes}}m {{seconds}}s में", - "scantastic.code.timeRemaining.shorthand.seconds": "{{seconds}}s में नया कोड", - "scantastic.code.title": "यूनिस्वैप वन-टाइम कोड", - "scantastic.confirmation.button.continue": "हाँ, जारी रखें", - "scantastic.confirmation.label.browser": "ब्राउज़र", - "scantastic.confirmation.label.device": "उपकरण", - "scantastic.confirmation.subtitle": "केवल तभी जारी रखें जब आप किसी विश्वसनीय डिवाइस पर Uniswap Extension से QR कोड स्कैन कर रहे हों।", - "scantastic.confirmation.title": "क्या आप अपना वॉलेट आयात करने का प्रयास कर रहे हैं?", - "scantastic.confirmation.warning": "Uniswap का नाम लेकर विज्ञापन करने वाली साइटों और ऐप्स से सावधान रहें। अन्यथा आपके वॉलेट से समझौता हो सकता है।", - "scantastic.error.encryption": "बीज वाक्यांश तैयार करने में विफल.", - "scantastic.error.noCode": "कोई OTP प्राप्त नहीं हुआ। कृपया पुनः प्रयास करें।", - "scantastic.error.timeout.message": "अपने वॉलेट को सिंक करना जारी रखने के लिए Uniswap एक्सटेंशन पर QR कोड को फिर से स्कैन करें।", - "scantastic.error.timeout.title": "आपके कनेक्शन का समय समाप्त हो गया", - "scantastic.modal.ipMismatch.description": "इस क्यूआर कोड को स्कैन करने के लिए, आपका फोन आपके कंप्यूटर के समान वाईफाई नेटवर्क से जुड़ा होना चाहिए और सभी वीपीएन अस्थायी रूप से बंद होने चाहिए।", - "scantastic.modal.ipMismatch.title": "अपना WiFi नेटवर्क बदलें", - "search.input.placeholder": "टोकन और पूल खोजें", - "search.ukDisclaimer": "ब्रिटेन के निवासियों के लिए अस्वीकरण", - "send.button.review": "स्थानांतरण की समीक्षा करें", - "send.gas.error.title": "एन/ए", - "send.gas.networkCost.title": "नेटवर्क लागत", - "send.input.token.balance.title": "शेष: {{balance}} {{symbol}}", - "send.recipient.header": "प्राप्तकर्ता चुनें", - "send.recipient.input.placeholder": "ईएनएस या पता खोजें", - "send.recipient.previous_one": "1 पिछला स्थानांतरण", - "send.recipient.previous_other": "{{count}} पिछला स्थानान्तरण", - "send.recipient.results.empty": "कोई परिणाम नहीं मिला", - "send.recipient.results.error": "आपके द्वारा टाइप किया गया पता या तो मौजूद नहीं है या गलत तरीके से लिखा गया है।", - "send.recipient.section.favorite": "पसंदीदा बटुए", - "send.recipient.section.recent": "हाल ही का", - "send.recipient.section.search": "खोज के परिणाम", - "send.recipient.section.viewOnly": "केवल देखने योग्य वॉलेट", - "send.recipient.section.yours": "आपके बटुए", - "send.recipient.warning.viewOnly.message": "इस वॉलेट में धनराशि केवल तभी भेजें जब आपके पास रिकवरी वाक्यांश हो या आप वॉलेट के मालिक को जानते हों।", - "send.recipient.warning.viewOnly.title": "आपके पास यह केवल देखने योग्य वॉलेट के रूप में है", - "send.recipientSelect.search.empty.message": "जब आप किसी वॉलेट पते पर टोकन भेजते हैं, तो वे यहां दिखाई देंगे", - "send.recipientSelect.search.empty.title": "कोई वॉलेट सहेजा नहीं गया", - "send.review.modal.title": "आप भेज रहे हैं", - "send.review.summary.button.title": "भेजने की पुष्टि करें", - "send.search.empty.subtitle": "आपके द्वारा टाइप किया गया पता या तो मौजूद नहीं है या गलत तरीके से लिखा गया है।", - "send.search.empty.title": "कोई परिणाम नहीं मिला", - "send.search.placeholder": "ईएनएस या पता खोजें", - "send.solanaSendNotSupported": "सोलाना पर भेजें समर्थित नहीं है", - "send.title": "भेजना", - "send.unavailableOnSolana.message": "सोलाना वॉलेट पर भेजने की सुविधा उपलब्ध नहीं है", - "send.warning.blocked.default": "यह वॉलेट ब्लॉक कर दिया गया है", - "send.warning.blocked.modal.message": "यह पता Uniswap वॉलेट पर अवरुद्ध है क्योंकि यह एक या अधिक अवरुद्ध गतिविधियों से संबद्ध है। यदि आपको लगता है कि यह एक त्रुटि है, तो कृपया Compliance@uniswap.org पर ईमेल करें।", - "send.warning.blocked.modal.title": "अवरुद्ध पता", - "send.warning.blocked.recipient": "प्राप्तकर्ता का बटुआ अवरुद्ध है", - "send.warning.erc20.checkbox.description": "आप टोकन पते पर धनराशि भेजने का प्रयास कर रहे हैं। इससे धनराशि की स्थायी हानि हो सकती है।", - "send.warning.erc20.checkbox.heading": "टोकन पता पता चला", - "send.warning.erc20.message": "आप टोकन पते पर फंड भेजने का प्रयास कर रहे हैं। इस प्रकार के पते पर क्रिप्टो भेजने से फंड की स्थायी हानि हो सकती है।", - "send.warning.erc20.title": "यह एक सांकेतिक पता है", - "send.warning.insufficientFunds.message": "आपके द्वारा भेजी जाने वाली राशि दर्ज करने के बाद से आपका {{currencySymbol}} बैलेंस कम हो गया है", - "send.warning.insufficientFunds.title": "पर्याप्त नहीं {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "भेजने के लिए {{networkName}}
पर {{currencySymbol}} पर्याप्त नहीं है", - "send.warning.insufficientGas.message.withoutNetwork": "भेजने के लिए पर्याप्त {{currencySymbol}} नहीं", - "send.warning.modal.button.cta.blocking": "ठीक है", - "send.warning.modal.button.cta.cancel": "रद्द करना", - "send.warning.modal.button.cta.confirm": "पुष्टि करना", - "send.warning.newAddress.details.ENS": "ईएनएस", - "send.warning.newAddress.details.username": "उपयोगकर्ता नाम", - "send.warning.newAddress.details.walletAddress": "वॉलेट पता", - "send.warning.newAddress.message": "आपने पहले इस पते से लेन-देन नहीं किया है. कृपया आगे बढ़ने से पहले पुष्टि करें कि पता सही है।", - "send.warning.newAddress.title": "नया पता", - "send.warning.self.message": "आप अपने वर्तमान वॉलेट में धनराशि भेजने का प्रयास कर रहे हैं। इस पते पर क्रिप्टो भेजने से अनावश्यक नेटवर्क लागत आएगी।", - "send.warning.self.title": "यह आपका वर्तमान वॉलेट है", - "send.warning.smartContract.message": "आप स्मार्ट कॉन्ट्रैक्ट पते पर फंड भेजने वाले हैं। सुनिश्चित करें कि यह सही पता है और यह टोकन प्राप्त कर सकता है। यदि नहीं, तो इससे फंड का स्थायी नुकसान हो सकता है।", - "send.warning.smartContract.title": "यह एक स्मार्ट अनुबंध पता है", - "send.warning.viewOnly.message": "संपत्तियां भेजने के लिए आपको पुनर्प्राप्ति वाक्यांश के माध्यम से इस वॉलेट को आयात करना होगा।", - "send.warning.viewOnly.title": "यह वॉलेट केवल देखने के लिए है", - "send.youAreSending": "आप भेज रहे हैं", - "sendRecipientForm.recentAddresses.label": "हाल ही", - "sendReviewModal.title": "समीक्षा भेजें", - "setting.recoveryPhrase.account.show": "पुनर्प्राप्ति वाक्यांश दिखाएँ", - "setting.recoveryPhrase.action.hide": "पुनर्प्राप्ति वाक्यांश छिपाएँ", - "setting.recoveryPhrase.remove": "पुनर्प्राप्ति वाक्यांश हटाएँ", - "setting.recoveryPhrase.remove.confirm.subtitle": "मैं समझता हूं कि अगर मैं ऐसा करने में विफल रहा तो Uniswap Labs मेरा बटुआ वापस पाने में मेरी मदद नहीं कर सकती", - "setting.recoveryPhrase.remove.confirm.title": "मैंने अपना पुनर्प्राप्ति वाक्यांश सहेजा है", - "setting.recoveryPhrase.remove.initial.subtitle": "सुनिश्चित करें कि आपने अपना पुनर्प्राप्ति वाक्यांश सहेज लिया है. अन्यथा आप अपने धन तक पहुंच खो देंगे", - "setting.recoveryPhrase.remove.initial.title": "इससे पहले कि आप जारी रखें", - "setting.recoveryPhrase.remove.subtitle": "जारी रखने के लिए अपना पासवर्ड दर्ज करें", - "setting.recoveryPhrase.remove.title": "आप अपना पुनर्प्राप्ति वाक्यांश हटा रहे हैं", - "setting.recoveryPhrase.view.warning.message1": "जो कोई भी आपके पुनर्प्राप्ति वाक्यांश को जानता है वह आपके वॉलेट और फंड तक पहुंच सकता है", - "setting.recoveryPhrase.view.warning.message2": "इसे अकेले में देखें", - "setting.recoveryPhrase.view.warning.message3": "इसे किसी के साथ साझा न करें", - "setting.recoveryPhrase.view.warning.message4": "इसे कभी भी किसी वेबसाइट या ऐप पर दर्ज न करें", - "setting.recoveryPhrase.view.warning.title": "इससे पहले कि आप जारी रखें", - "setting.recoveryPhrase.warning.view.message": "जो कोई भी आपके पुनर्प्राप्ति वाक्यांश को जानता है वह आपके वॉलेट और फंड तक पहुंच सकता है।", - "setting.recoveryPhrase.warning.view.title": "इसे किसी निजी स्थान पर देखें", - "settings.action.enableInSettings": "सेटिंग्स में सक्षम करें", - "settings.action.feedback": "प्रतिक्रिया भेजें", - "settings.action.help": "मदद लें", - "settings.action.lock": "बटुआ बंद करो", - "settings.action.privacy": "गोपनीयता नीति", - "settings.action.terms": "सेवा की शर्तें", - "settings.connectWalletPlatform.warning": "{{platform}}पर Uniswap का उपयोग करने के लिए, {{platform}}का समर्थन करने वाले वॉलेट से कनेक्ट करें।", - "settings.footer": "प्यार से बनाया गया, \nUniswap टीम 🦄", - "settings.hideSmallBalances": "छोटे-छोटे शेष छिपाएँ", - "settings.hideSmallBalances.subtitle": "1 USD से कम शेष राशि आपके पोर्टफोलियो से छिपा दी जाएगी।", - "settings.maxSlippage": "अधिकतम फिसलन", - "settings.maxSlippage.amount": "{{amount}} अधिकतम फिसलन", - "settings.section.about": "के बारे में", - "settings.section.preferences": "पसंद", - "settings.section.privacyAndSecurity": "गोपनीयता और सुरक्षा", - "settings.section.support": "सहायता", - "settings.section.wallet.hidden.row.title": "{{numHidden}} अन्य वॉलेट", - "settings.setting.advanced.title": "विकसित", - "settings.setting.advancedSettings": "Advanced settings", - "settings.setting.appearance.option.auto": "ऑटो", - "settings.setting.appearance.option.dark.subtitle": "हमेशा डार्क थीम का उपयोग करें.", - "settings.setting.appearance.option.dark.title": "अँधेरा", - "settings.setting.appearance.option.device.subtitle": "आपके डिवाइस की सेटिंग्स के अनुसार अनुकूलित होता है।", - "settings.setting.appearance.option.device.title": "ऑटो", - "settings.setting.appearance.option.light.subtitle": "हमेशा हल्के थीम का उपयोग करें.", - "settings.setting.appearance.option.light.title": "रोशनी", - "settings.setting.appearance.title": "विषय", - "settings.setting.backup.create.description": "पासवर्ड सेट करने से आपका पुनर्प्राप्ति वाक्यांश बैकअप एन्क्रिप्ट हो जाएगा, जिससे आपके {{cloudProviderName}} खाते के साथ कभी छेड़छाड़ होने पर सुरक्षा का एक अतिरिक्त स्तर प्राप्त हो जाएगा।", - "settings.setting.backup.create.title": "{{cloudProviderName}}तक वापस जाएं", - "settings.setting.backup.delete.confirm.message": "क्योंकि ये वॉलेट एक रिकवरी वाक्यांश साझा करते हैं, इसलिए यह नीचे दिए गए इन वॉलेट के बैकअप को भी हटा देगा", - "settings.setting.backup.delete.confirm.title": "क्या आपको यकीन है?", - "settings.setting.backup.delete.warning": "यदि आप अपना {{cloudProviderName}} बैकअप हटाते हैं, तो आप अपने वॉलेट को केवल अपने रिकवरी वाक्यांश के मैन्युअल बैकअप के साथ ही रिकवर कर पाएंगे। यदि आप अपना रिकवरी वाक्यांश खो देते हैं, तो Uniswap Labs आपकी संपत्तियों को रिकवर नहीं कर सकता है।", - "settings.setting.backup.error.message.full": "पुनर्प्राप्ति वाक्यांश का {{cloudProviderName}}पर बैकअप लेने में असमर्थ। कृपया सुनिश्चित करें कि आपके पास उपलब्ध संग्रहण स्थान के साथ {{cloudProviderName}} सक्षम है और पुनः प्रयास करें।", - "settings.setting.backup.error.message.short": "बैकअप हटाने में असमर्थ", - "settings.setting.backup.error.title": "{{cloudProviderName}} त्रुटि", - "settings.setting.backup.modal.description": "आपने अभी तक अपने रिकवरी फ्रेज को {{cloudProviderName}} पर बैकअप नहीं किया है। ऐसा करके, आप किसी भी डिवाइस पर {{cloudProviderName}} में लॉग इन करके अपना वॉलेट रिकवर कर सकते हैं।", - "settings.setting.backup.modal.title": "पुनर्प्राप्ति वाक्यांश का बैकअप {{cloudProviderName}}पर रखें?", - "settings.setting.backup.password.error.mismatch": "सांकेतिक शब्द मेल नहीं खाते", - "settings.setting.backup.password.medium": "यह एक मध्यम पासवर्ड है", - "settings.setting.backup.password.placeholder.confirm": "पासवर्ड की पुष्टि कीजिये", - "settings.setting.backup.password.placeholder.create": "पासवर्ड बनाएं", - "settings.setting.backup.password.strong": "यह एक मजबूत पासवर्ड है", - "settings.setting.backup.password.weak": "यह एक कमज़ोर पासवर्ड है", - "settings.setting.backup.recoveryPhrase.label": "पुनर्प्राप्ति वाक्यांश", - "settings.setting.backup.selected": "{{cloudProviderName}} बैकअप", - "settings.setting.backup.status.action.delete": "बैकअप हटाएँ", - "settings.setting.backup.status.complete": "{{cloudProviderName}}तक बैकअप लिया गया", - "settings.setting.backup.status.description": "अपने पुनर्प्राप्ति वाक्यांश को {{cloudProviderName}}तक बैकअप करके, आप किसी भी डिवाइस पर अपने {{cloudProviderName}} खाते में लॉग इन करके अपने वॉलेट को पुनर्प्राप्त कर सकते हैं।", - "settings.setting.backup.status.inProgress": "{{cloudProviderName}}तक बैकअप लिया जा रहा है...", - "settings.setting.backup.status.recoveryPhrase.backed": "को समर्थन", - "settings.setting.backup.status.title": "{{cloudProviderName}} बैकअप", - "settings.setting.beta.tooltip": "जल्द आ रहा है", - "settings.setting.biometrics.appAccess.subtitle.android": "ऐप खोलने के लिए चेहरा/फिंगरप्रिंट की आवश्यकता होगी।", - "settings.setting.biometrics.appAccess.subtitle.ios": "ऐप खोलने के लिए {{biometricsMethod}} की आवश्यकता है.", - "settings.setting.biometrics.appAccess.title": "ऐप एक्सेस", - "settings.setting.biometrics.auth": "कृपया प्रमाणित करें", - "settings.setting.biometrics.extension.waitingForBiometricsModal.content": "जारी रखने के लिए अपने ब्राउज़र या सिस्टम सेटिंग्स में {{biometricsMethod}} सक्षम करें।", - "settings.setting.biometrics.extension.waitingForBiometricsModal.title": "{{biometricsMethod}}की प्रतीक्षा कर रहा हूँ", - "settings.setting.biometrics.off.message.android": "बायोमेट्रिक्स वर्तमान में यूनिस्वैप वॉलेट के लिए बंद है - आप इसे अपनी सिस्टम सेटिंग्स में चालू कर सकते हैं।", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} वर्तमान में Uniswap वॉलेट के लिए बंद है—आप इसे अपनी सिस्टम सेटिंग्स में चालू कर सकते हैं।", - "settings.setting.biometrics.off.title.android": "बायोमेट्रिक्स बंद है", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} बंद है", - "settings.setting.biometrics.title": "चेहरा/फिंगरप्रिंट अनलॉक", - "settings.setting.biometrics.transactions.subtitle.android": "लेन-देन के लिए चेहरा/उंगलियों के निशान की आवश्यकता होगी।", - "settings.setting.biometrics.transactions.subtitle.ios": "लेन-देन करने के लिए {{biometricsMethod}} की आवश्यकता है।", - "settings.setting.biometrics.transactions.title": "लेनदेन", - "settings.setting.biometrics.unavailable.message.android": "आपके डिवाइस पर बायोमेट्रिक्स सेट नहीं है। बायोमेट्रिक्स का उपयोग करने के लिए, इसे पहले सेटिंग में सेट करें।", - "settings.setting.biometrics.unavailable.message.ios": "आपके डिवाइस पर {{biometricsMethod}} सेटअप नहीं है. {{biometricsMethod}}उपयोग करने के लिए, इसे पहले सेटिंग्स में सेट करें।", - "settings.setting.biometrics.unavailable.title.android": "बायोमेट्रिक्स सेटअप नहीं है", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} सेटअप नहीं है", - "settings.setting.biometrics.warning.message.android": "यदि आप बायोमेट्रिक्स चालू नहीं करते हैं, तो आपके डिवाइस तक पहुंच पाने वाला कोई भी व्यक्ति यूनिस्वैप वॉलेट खोल सकता है और लेनदेन कर सकता है।", - "settings.setting.biometrics.warning.message.ios": "यदि आप {{biometricsMethod}}चालू नहीं करते हैं, तो आपके डिवाइस तक पहुंच प्राप्त करने वाला कोई भी व्यक्ति Uniswap वॉलेट खोल सकता है और लेनदेन कर सकता है।", - "settings.setting.biometrics.warning.title": "क्या आपको यकीन है?", - "settings.setting.connections.disconnectAll": "सभी को डिस्कनेक्ट करें", - "settings.setting.connections.noConnectionsDescription": "“कनेक्ट वॉलेट” या “लॉग इन” बटन ढूंढकर किसी ऐप से कनेक्ट करें।", - "settings.setting.currency.title": "स्थानीय मुद्रा", - "settings.setting.deviceAccess.reset.title": "अपना {{biometricsMethod}}रीसेट करें", - "settings.setting.deviceAccess.title": "डिवाइस एक्सेस", - "settings.setting.deviceAccessTimeout.1hour": "1 घंटा", - "settings.setting.deviceAccessTimeout.24hours": "24 घंटे", - "settings.setting.deviceAccessTimeout.30minutes": "30 मिनट", - "settings.setting.deviceAccessTimeout.5minutes": "5 मिनट", - "settings.setting.deviceAccessTimeout.never": "कभी नहीं", - "settings.setting.deviceAccessTimeout.title": "ऑटो-लॉक टाइमआउट", - "settings.setting.hapticTouch.title": "स्पर्श स्पर्श", - "settings.setting.helpCenter.title": "सहायता केंद्र", - "settings.setting.language.button.navigate": "सेटिंग्स में जाओ", - "settings.setting.language.description.extension": "Uniswap डिफ़ॉल्ट रूप से आपकी सिस्टम भाषा सेटिंग पर सेट हो जाता है। अपनी पसंदीदा भाषा बदलने के लिए, अपनी सिस्टम सेटिंग पर जाएँ।", - "settings.setting.language.description.mobile": "Uniswap आपके डिवाइस की भाषा सेटिंग पर डिफ़ॉल्ट रूप से सेट हो जाता है। अपनी पसंदीदा भाषा बदलने के लिए, अपने डिवाइस सेटिंग में “Uniswap” पर जाएँ और “भाषा” पर टैप करें।", - "settings.setting.language.title": "भाषा", - "settings.setting.notifications.row.activity.description": "स्थानान्तरण, अनुरोध और अन्य गतिविधि", - "settings.setting.notifications.row.activity.title": "वॉलेट गतिविधि", - "settings.setting.notifications.row.updates.description": "अनुशंसाएँ और नई सुविधाएँ", - "settings.setting.notifications.row.updates.title": "यूनिस्वैप से अपडेट", - "settings.setting.notifications.title": "सूचनाएं", - "settings.setting.password.change.title": "नया पासवर्ड बनाएँ", - "settings.setting.password.title": "पासवर्ड बदलें", - "settings.setting.permissions.title": "अनुमतियां", - "settings.setting.privacy.analytics.description": "Uniswap Labs उत्पादों में आपके अनुभव को बेहतर बनाने के लिए हम अनाम उपयोग डेटा का उपयोग करते हैं। अक्षम होने पर, हम केवल त्रुटियों और आवश्यक उपयोग को ट्रैक करते हैं।", - "settings.setting.privacy.analytics.title": "ऐप एनालिटिक्स", - "settings.setting.privateKeys.title": "निजी कुंजियाँ", - "settings.setting.recoveryPhrase.title": "पुनर्प्राप्ति वाक्यांश", - "settings.setting.smallBalances.title": "पोर्टफोलियो संतुलन", - "settings.setting.smartWallet.action.enable": "सक्षम", - "settings.setting.smartWallet.action.smartWallet": "Smart wallet", - "settings.setting.smartWallet.notEligible": "पात्र नहीं है", - "settings.setting.smartWallet.status.actionRequired": "कार्रवाई आवश्यक है", - "settings.setting.smartWallet.status.active": "सक्रिय", - "settings.setting.smartWallet.status.inactive": "निष्क्रिय", - "settings.setting.smartWallet.status.unavailable": "अनुपलब्ध", - "settings.setting.unknownTokens.subtitle": "संभावित घोटाले वाले टोकन आपके पोर्टफोलियो से छिपा दिए जाएंगे।", - "settings.setting.unknownTokens.title": "अज्ञात टोकन छिपाएँ", - "settings.setting.wallet.action.editLabel": "लेबल संपादित करें", - "settings.setting.wallet.action.editProfile": "प्रोफ़ाइल संपादित करें", - "settings.setting.wallet.action.remove": "बटुआ हटाओ", - "settings.setting.wallet.connection.banner.description": "अपनी प्रोफ़ाइल छवि पर क्लिक करके वॉलेट सेटिंग्स के माध्यम से कनेक्शन प्रबंधित करें।", - "settings.setting.wallet.connection.banner.title": "कनेक्शन स्थानांतरित हो गए हैं", - "settings.setting.wallet.connections.title": "कनेक्शन", - "settings.setting.wallet.editLabel.description": "लेबल सार्वजनिक नहीं हैं. वे स्थानीय रूप से संग्रहीत हैं और केवल आपको दिखाई देते हैं।", - "settings.setting.wallet.editLabel.save": "परिवर्तनों को सुरक्षित करें", - "settings.setting.wallet.label": "उपनाम", - "settings.setting.wallet.testnetMode.description": "यह डेवलपर्स के लिए टेस्टनेट चालू करता है ताकि वे वास्तविक परिसंपत्तियों का उपयोग किए बिना सुविधाओं और लेनदेन को आज़मा सकें। टेस्टनेट पर टोकन का कोई वास्तविक मूल्य नहीं होता है।", - "settings.setting.wallet.testnetMode.title": "टेस्टनेट मोड", - "settings.switchNetwork.warning": "{{label}}पर Uniswap का उपयोग करने के लिए, अपने वॉलेट की सेटिंग में नेटवर्क स्विच करें।", - "settings.title": "समायोजन", - "settings.version": "संस्करण {{appVersion}}", - "smartWallet.actionRequired.cta": "1 नेटवर्क पर अक्षम करें", - "smartWallet.actionRequired.cta.plural": "{{amount}} नेटवर्क पर अक्षम करें", - "smartWallet.actionRequired.description": "स्मार्ट वॉलेट को निष्क्रिय करना एक ऑनचेन कार्रवाई है जिसके लिए थोड़ी नेटवर्क लागत की आवश्यकता होती है।", - "smartWallet.actionRequired.insufficientFunds": "अपर्याप्त कोष", - "smartWallet.actionRequired.reactivate": "स्मार्ट वॉलेट का उपयोग जारी रखें", - "smartWallet.actionRequired.title": "स्मार्ट वॉलेट 1 नेटवर्क पर सक्रिय है", - "smartWallet.actionRequired.title.plural": "स्मार्ट वॉलेट {{amount}} नेटवर्क पर सक्रिय है", - "smartWallet.activeNetworks.title": "स्मार्ट वॉलेट 1 नेटवर्क पर सक्रिय है", - "smartWallet.activeNetworks.title.plural": "स्मार्ट वॉलेट {{amount}} नेटवर्क पर सक्रिय है", - "smartWallet.banner.networkCost": "Includes a one-time cost to activate your smart wallet on {{chainName}}.", - "smartWallet.banner.text": "नेटवर्क लागत पर 50% तक की बचत के लिए स्मार्ट वॉलेट सक्षम करें।", - "smartWallet.confirmDisableSmartWallet.description": "आप तीव्र स्वैप, रियायती नेटवर्क लागत और अन्य आगामी सुधारों से वंचित रह जाएंगे।", - "smartWallet.confirmDisableSmartWallet.title": "क्या आपको यकीन है?", - "smartWallet.insufficient.description": "इन नेटवर्कों पर स्मार्ट वॉलेट को तब तक निष्क्रिय नहीं किया जा सकता जब तक आपके पास नेटवर्क लागतों को पूरा करने के लिए धनराशि न हो।", - "smartWallet.insufficient.title": "1 नेटवर्क पर अपर्याप्त निधि", - "smartWallet.insufficient.title.plural": "{{amount}} नेटवर्क पर अपर्याप्त निधि", - "smartWallet.InsufficientFunds.button.continue.text": "फिर भी जारी रखें", - "smartWallet.insufficientFunds.network.banner.description": "अपर्याप्त धनराशि के कारण अक्षम नहीं किया जा सकता.", - "smartWallet.insufficientFunds.network.banner.title_one": "{{count}} नेटवर्क बहिष्कृत", - "smartWallet.insufficientFunds.network.banner.title_other": "{{count}} नेटवर्क बहिष्कृत", - "smartWallet.insufficientFunds.network.disable.text": "अक्षम करने के लिए तैयार", - "smartWallet.insufficientFunds.network.text": "आपको {{nativeCurrency}}की आवश्यकता है", - "smartWallet.insufficientFunds.single.network.banner.title": "{{chain}} बहिष्कृत", - "smartWallet.modal.description.block1": "स्मार्ट वॉलेट तीव्र एवं कम लागत वाले लेनदेन के लिए स्मार्ट कॉन्ट्रैक्ट का उपयोग करते हैं।", - "smartWallet.modal.description.block2": "किसी अन्य ऐप से पहले से ही स्मार्ट वॉलेट सुविधाओं का उपयोग कर रहे वॉलेट प्रभावित नहीं होंगे।", - "smartWallet.modal.title": "स्मार्ट वॉलेट", - "smartWallets": "स्मार्ट वॉलेट", - "smartWallets.activeNetworks.description": "आपका स्मार्ट वॉलेट आपके द्वारा स्वैप किए जाने वाले प्रत्येक नए नेटवर्क पर स्वचालित रूप से सक्रिय हो जाता है।", - "smartWallets.createdModal.description": "You’re getting faster transactions and lower network costs on every swap.", - "smartWallets.createdModal.title": "स्मार्ट वॉलेट बनाया गया", - "smartWallets.delegation.limitedSupport": "आपके वॉलेट का समर्थन सीमित है", - "smartWallets.delegationMismatchModal.description": "{{walletName}} {{displayName}}द्वारा उपयोग किए जाने वाले नवीनतम एथेरियम मानकों का समर्थन नहीं करता है, इसलिए कुछ सुविधाएँ उपलब्ध नहीं हैं।", - "smartWallets.delegationMismatchModal.features.1ClickSwaps": "1-क्लिक स्वैप", - "smartWallets.delegationMismatchModal.features.gasFreeSwaps": "गैस-मुक्त स्वैप", - "smartWallets.delegationMismatchModal.features.limitOrders": "सीमा आदेश", - "smartWallets.delegationMismatchModal.limitOrders.unsupported": "आपके वॉलेट द्वारा लिमिट ऑर्डर समर्थित नहीं हैं.", - "smartWallets.delegationMismatchModal.title": "सीमित वॉलेट समर्थन", - "smartWallets.disable.failed": "एक त्रुटि हुई। स्मार्ट वॉलेट अभी भी 1 या अधिक नेटवर्क पर सक्रिय है। कृपया पुनः प्रयास करें।", - "smartWallets.disable.modal.description": "इस ऑनचेन क्रिया के लिए नेटवर्क लागत की आवश्यकता होती है।", - "smartWallets.disable.modal.title": "स्मार्ट वॉलेट अक्षम करें", - "smartWallets.educationalModal.description": "स्मार्ट वॉलेट स्मार्ट कॉन्ट्रैक्ट का उपयोग करके तेज़, कम लागत वाले लेनदेन प्रदान करते हैं।", - "smartWallets.educationalModal.info": "किसी अन्य ऐप से पहले से ही स्मार्ट वॉलेट सुविधाओं का उपयोग कर रहे वॉलेट प्रभावित नहीं होंगे।", - "smartWallets.enabledModal.description": "अपडेट आपके अगले स्वैप पर प्रभावी होंगे.", - "smartWallets.enabledModal.description.dapp": "अपडेट आपके अगले लेनदेन पर प्रभावी होंगे.", - "smartWallets.enabledModal.description.dapp.line2": "ऐप्स पर स्मार्ट वॉलेट सुविधाओं का तुरंत उपयोग शुरू करने के लिए अपने वॉलेट को पुनः कनेक्ट करें।", - "smartWallets.enabledModal.title": "स्मार्ट वॉलेट सक्षम", - "smartWallets.postSwapNudge.enable": "स्मार्ट वॉलेट सक्षम करें", - "smartWallets.postSwapNudge.title": "अपने अगले स्वैप पर बचत करें", - "smartWallets.postSwapNudge.title.dapp": "यह ऐप स्मार्ट वॉलेट को सपोर्ट करता है", - "smartWallets.unavailableModal.description": "एक अलग वॉलेट प्रदाता अब {{displayName}}के लिए स्मार्ट वॉलेट सेटिंग्स का प्रबंधन कर रहा है। आप सामान्य रूप से Uniswap का उपयोग जारी रख सकते हैं।", - "smartWallets.unavailableModal.title": "स्मार्ट वॉलेट सुविधाएँ उपलब्ध नहीं हैं", - "solanaPromo.banner.description": "यूनिस्वैप पर सीधे सोलाना टोकन का व्यापार करें।", - "solanaPromo.banner.title": "सोलाना अब उपलब्ध है", - "solanaPromo.modal.connectWallet": "अपने पसंदीदा सोलाना वॉलेट को कनेक्ट करें", - "solanaPromo.modal.startSwapping.button": "सोलाना पर स्वैपिंग शुरू करें", - "solanaPromo.modal.swapInstantly": "हजारों ट्रेंडिंग टोकन तुरंत स्वैप करें", - "solanaPromo.modal.viewTokenData": "टोकन डेटा और कीमतें एक ही स्थान पर देखें", - "speedBump.newAddress.warning.description": "आपने पहले कभी इस पते से लेन-देन नहीं किया है। आगे बढ़ने से पहले सुनिश्चित करें कि यह सही पता है।", - "speedBump.newAddress.warning.title": "नया पता", - "speedBump.smartContractAddress.warning.description": "आप एक खास तरह के पते पर टोकन भेजने वाले हैं - एक स्मार्ट कॉन्ट्रैक्ट। दोबारा जांच लें कि यह वही पता है जिस पर आप टोकन भेजना चाहते थे। अगर यह गलत है, तो आपके टोकन हमेशा के लिए खो सकते हैं।", - "speedBump.smartContractAddress.warning.title": "क्या यह बटुए का पता है?", - "stats.24fees": "24 घंटे की फीस", - "stats.24swapVolume": "24 घंटे स्वैप वॉल्यूम", - "stats.24volume": "24 घंटे का वॉल्यूम", - "stats.allTimeSwappers": "सभी समय स्वैपर्स", - "stats.allTimeVolume": "सभी समय मात्रा", - "stats.fdv": "एफडीवी", - "stats.fdv.description": "पूर्णतया तनुकृत मूल्यांकन (एफडीवी) में कुल बाजार मूल्य की गणना की जाती है, यह मानते हुए कि सभी टोकन प्रचलन में हैं।", - "stats.marketCap": "बाज़ार आकार", - "stats.marketCap.description": "बाजार पूंजीकरण किसी परिसंपत्ति की परिसंचारी आपूर्ति का कुल बाजार मूल्य है।", - "stats.noStatsAvailable": "कोई आँकड़े उपलब्ध नहीं हैं", - "stats.tvl": "कुल लॉक मूल्य", - "stats.tvl.description": "कुल लॉक मूल्य (TVL) सभी यूनिस्वैप तरलता पूलों में उपलब्ध परिसंपत्ति की कुल राशि है।", - "stats.volume.1d": "1 दिन का वॉल्यूम", - "stats.volume.1d.description": "1 दिन का वॉल्यूम उस परिसंपत्ति की राशि है जो पिछले 24 घंटों के दौरान यूनिस्वैप पर कारोबार की गई है।", - "stats.volume.1d.long": "1डी वॉल्यूम", - "stats.volume.1d.short": "1डी वॉल्यूम", - "stats.volume.description": "वॉल्यूम उस परिसंपत्ति की राशि है जो चयनित समय सीमा के दौरान यूनिस्वैप पर कारोबार की गई है।", - "swap.allow.oneTime": "{{sym}} (एक बार) की अनुमति दें", - "swap.approveAndSubmit": "स्वीकृत करें और सबमिट करें", - "swap.approveAndSwap": "स्वीकृति दें और अदला-बदली करें", - "swap.balance.amount": "शेष: {{amount}}", - "swap.bestPrice.through": "मार्ग {{provider}}से होकर", - "swap.bestRoute.cost": "सबसे कुशल मार्ग की नेटवर्क लागत ~{{gasPrice}} होने का अनुमान है। ", - "swap.bridging.title": "नेटवर्कों में अदला-बदली", - "swap.bridging.warning.description": "आप {{fromNetwork}} से {{toNetwork}}पर स्वैप कर रहे हैं। इसे \"ब्रिजिंग\" के रूप में भी जाना जाता है, जो आपके टोकन को एक नेटवर्क से दूसरे नेटवर्क पर ले जाता है।", - "swap.button.confirmSignAndSwap": "हस्ताक्षर और अदला-बदली की पुष्टि करें", - "swap.button.confirmSwapAnyways": "वैसे भी स्वैप की पुष्टि करें", - "swap.button.confirmUnwrap": "खोलना की पुष्टि करें", - "swap.button.max": "अधिकतम", - "swap.button.review": "समीक्षा", - "swap.button.submitting": "स्वैप सबमिट किया जा रहा है...", - "swap.button.submitting.keep.open": "अपना बटुआ खुला रखें...", - "swap.button.submitting.passkey": "पासकी से पुष्टि करें", - "swap.button.swap": "बदलना", - "swap.button.swapAnyways": "वैसे भी स्वैप", - "swap.button.unwrap": "खोलना", - "swap.button.wrap": "लपेटना", - "swap.buy.countryModal.placeholder": "देश या क्षेत्र के अनुसार खोजें", - "swap.cancel.cannotExecute_one": "रद्दीकरण प्रक्रिया से पहले आपका स्वैप निष्पादित हो सकता है। आपकी नेटवर्क लागत वापस नहीं की जा सकती। क्या आप आगे बढ़ना चाहते हैं?", - "swap.cancel.cannotExecute_other": "रद्दीकरण प्रक्रिया से पहले आपके स्वैप निष्पादित हो सकते हैं। आपकी नेटवर्क लागत वापस नहीं की जा सकती। क्या आप आगे बढ़ना चाहते हैं?", - "swap.confirmApproveAndSwap": "पुष्टि करें अनुमोदन करें और स्वैप करें", - "swap.confirmLimit": "सीमा की पुष्टि करें", - "swap.confirmSwap": "स्वैप की पुष्टि करें", - "swap.confirmWrap": "लपेटने की पुष्टि करें", - "swap.deadline.settings.title": "स्वैप की समय सीमा", - "swap.deadline.settings.title.short": "Tx. समय सीमा", - "swap.details.completed": "स्वैप पूर्ण", - "swap.details.estimatedTime": "अनुमानित समय", - "swap.details.fasterUnichainSwaps": "यूनिचेन द्वारा संचालित तेज़ स्वैप", - "swap.details.feeOnTransfer": "{{tokenSymbol}} शुल्क", - "swap.details.feeOnTransfer.symbol": "{{tokenSymbol}} टोकन शुल्क", - "swap.details.instant": "तुरंत", - "swap.details.newQuote.input": "नया इनपुट", - "swap.details.newQuote.output": "नया आउटपुट", - "swap.details.orderRouting": "ऑर्डर रूटिंग", - "swap.details.orderRoutingInfo": "यह स्वैप एक्रॉस के माध्यम से किया जाता है, जो एक विकेन्द्रीकृत प्रोटोकॉल है जो सुरक्षा, तीव्र निष्पादन और कम कीमतों को प्राथमिकता देते हुए परिसंपत्तियों को नेटवर्क के पार ले जाता है।", - "swap.details.poweredBy": "द्वारा संचालित", - "swap.details.rate": "दर", - "swap.details.slippage": "अधिकतम फिसलन", - "swap.details.slippage.uniswap": "यूनिस्वैप संरक्षित स्लिपेज", - "swap.details.swappedIn.unichain": "यूनिचेन पर {{time}}सेकंड में पूरा हुआ", - "swap.details.uniswapFee": "शुल्क", - "swap.error.default": "आपको अपनी स्लिपेज सहनशीलता बढ़ाने की आवश्यकता हो सकती है। नोट: फ़ीस-ऑन-ट्रांसफ़र और रीबेस टोकन Uniswap V3 के साथ असंगत हैं।", - "swap.error.expectedToFail": "आपका स्वैप असफल होने की आशंका है।", - "swap.error.fiatInputUnavailable": "{{fiatCurrencyCode}} इनपुट अनुपलब्ध", - "swap.error.modifiedByWallet": "आपके स्वैप को आपके वॉलेट के ज़रिए संशोधित किया गया था। अगर यह गलती से हुआ है, तो कृपया तुरंत रद्द करें या अपने पैसे खोने का जोखिम उठाएँ।", - "swap.error.rejected": "लेन-देन अस्वीकृत", - "swap.error.undefinedObject": "इस स्वैप को निष्पादित करने का प्रयास करते समय एक त्रुटि हुई। आपको अपनी स्लिपेज सहनशीलता बढ़ाने की आवश्यकता हो सकती है। यदि वह काम नहीं करता है, तो हो सकता है कि आप जिस टोकन का व्यापार कर रहे हैं, उसके साथ कोई असंगति हो। नोट: फ़ीस-ऑन-ट्रांसफ़र और रीबेस टोकन Uniswap V3 के साथ असंगत हैं।", - "swap.error.unknown": "अज्ञात त्रुटि।", - "swap.error.v2.expired": "यह लेनदेन नहीं भेजा जा सका क्योंकि समय सीमा बीत चुकी है। कृपया जाँच लें कि आपके लेनदेन की समय सीमा बहुत कम न हो।", - "swap.error.v2.k": "यूनिस्वैप इनवेरिएंट x*y=k स्वैप द्वारा संतुष्ट नहीं था। इसका आमतौर पर मतलब है कि आप जिस टोकन को स्वैप कर रहे हैं, उसमें से एक ट्रांसफर पर कस्टम व्यवहार को शामिल करता है।", - "swap.error.v2.slippage": "यह लेनदेन या तो मूल्य परिवर्तन या हस्तांतरण पर शुल्क के कारण सफल नहीं होगा। अपनी स्लिपेज सहनशीलता बढ़ाने का प्रयास करें", - "swap.error.v2.transferInput": "इनपुट टोकन को स्थानांतरित नहीं किया जा सकता। इनपुट टोकन में कोई समस्या हो सकती है।", - "swap.error.v2.transferOutput": "आउटपुट टोकन को स्थानांतरित नहीं किया जा सकता। आउटपुट टोकन में कोई समस्या हो सकती है।", - "swap.error.v3.slippage": "मूल्य में उतार-चढ़ाव के कारण यह लेनदेन सफल नहीं होगा। अपनी स्लिपेज सहनशीलता बढ़ाने का प्रयास करें। नोट: स्थानांतरण और रीबेस टोकन पर शुल्क Uniswap V3 के साथ असंगत हैं।", - "swap.error.v3.transferOutput": "आउटपुट टोकन को स्थानांतरित नहीं किया जा सकता। आउटपुट टोकन के साथ कोई समस्या हो सकती है। नोट: स्थानांतरण और रीबेस टोकन पर शुल्क Uniswap V3 के साथ असंगत हैं।", - "swap.estimatedDifference.label": "वर्तमान तरलता के कारण आपके इनपुट और आउटपुट मूल्यों के बीच बड़ा अंतर होगा।", - "swap.expected.price": "अपेक्षित मूल्य", - "swap.fail.batched": "हो सकता है कि आपका कनेक्टेड वॉलेट 1-क्लिक स्वैप का समर्थन न करे। इसके बजाय मानक स्वैप आज़माएँ।", - "swap.fail.batched.retry": "मानक स्वैप का प्रयास करें", - "swap.fail.batched.title": "1-क्लिक स्वैप विफल", - "swap.fail.message": "स्लिपेज को उच्चतर मान पर समायोजित करने का प्रयास करें।", - "swap.fail.uniswapX": "UniswapX के साथ स्वैप पूरा नहीं किया जा सका। क्लासिक Uniswap API के ज़रिए इसे रूट करने के लिए अपना स्वैप फिर से आज़माएँ।", - "swap.fees.experience": "यह शुल्क कुछ टोकन जोड़ों पर लगाया जाता है ताकि यूनिस्वैप के साथ सबसे अच्छा अनुभव सुनिश्चित किया जा सके। इसका भुगतान आउटपुट टोकन में किया जाता है और इसे पहले ही कोटेशन में शामिल कर लिया गया है।", - "swap.fees.jupiter.label": "बृहस्पति शुल्क", - "swap.fees.jupiter.message": "सोलाना पर शुल्क जुपिटर एपीआई द्वारा लिया जाता है। यूनिस्वैप लैब्स को ये शुल्क नहीं मिलते।", - "swap.fees.noFee": "Uniswap के साथ सबसे अच्छा अनुभव सुनिश्चित करने के लिए चुनिंदा टोकन जोड़ों पर शुल्क लगाया जाता है। इस स्वैप से जुड़ा कोई शुल्क नहीं है।", - "swap.finalizingQuote": "उद्धरण को अंतिम रूप दिया जा रहा है...", - "swap.form.header": "बदलना", - "swap.form.warning.output.fotFees": "{{fotCurrencySymbol}}टोकन शुल्क के कारण, स्वैप राशि केवल इनपुट फ़ील्ड का उपयोग करके दर्ज की जा सकती है", - "swap.form.warning.output.fotFees.fallback": "टोकन शुल्क के कारण, स्वैप राशि केवल इनपुट फ़ील्ड का उपयोग करके दर्ज की जा सकती है", - "swap.form.warning.output.solana": "सोलाना पर सटीक आउटपुट समर्थित नहीं है", - "swap.form.warning.restore": "स्वैप करने के लिए अपना बटुआ पुनर्स्थापित करें", - "swap.frontrun.warning": "आपका लेन-देन अग्रिम हो सकता है और इसका परिणाम प्रतिकूल व्यापार हो सकता है।", - "swap.header.viewOnly": "केवल देखें", - "swap.impactOfTrade": "आपके व्यापार का इस पूल के बाजार मूल्य पर प्रभाव।", - "swap.impactOfTrade.uniswapx": "बाजार मूल्य और निष्पादन मूल्य के बीच का अंतर, यूनिस्वैपएक्स गैस बचत को ध्यान में रखते हुए।", - "swap.impactOfTrade.uniswapx.missing": "कम तरलता वाले जोड़ों के लिए मूल्य प्रभाव गणना उपलब्ध नहीं हो सकती है।", - "swap.inputEstimated.atMost": "इनपुट अनुमानित है। आप अधिकतम पर बेचेंगे या लेनदेन वापस हो जाएगा।", - "swap.limit": "आप LIMIT", - "swap.limitFilled": "सीमा भर गयी!", - "swap.limitSubmitted": "सीमा प्रस्तुत की गई", - "swap.marketPrice.outsideRange.label": "बाजार मूल्य आपकी निर्दिष्ट मूल्य सीमा से बाहर है। केवल एकल-परिसंपत्ति जमा।", - "swap.min.price": "न्यूनतम मूल्य", - "swap.networkCost.paidIn": "लेन-देन करने के लिए नेटवर्क लागत का भुगतान {{sym}} में {{chainName}} नेटवर्क पर किया जाता है।", - "swap.orderRouting": "ऑर्डर रूटिंग", - "swap.outputEstimated.atLeast": "आउटपुट अनुमानित है। आपको कम से कम प्राप्त होगा अन्यथा लेनदेन वापस हो जाएगा।", - "swap.placeOrder": "आदेश देना", - "swap.priceImpact": "मूल्य प्रभाव", - "swap.request.title.full": "स्वैप {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "टोकन स्वैप करें", - "swap.review": "समीक्षा स्वैप", - "swap.review.summary": "आप अदला-बदली कर रहे हैं", - "swap.reviewLimit": "समीक्षा सीमा", - "swap.route.optimizedGasCost": "यह मार्ग विभाजित मार्गों, एकाधिक हॉप्स, तथा प्रत्येक चरण की नेटवर्क लागतों पर विचार करता है।", - "swap.routing.jupiter.description": "जुपिटर आपको सर्वोत्तम मूल्य प्रदान करने के लिए कई स्रोतों से तरलता एकत्रित करता है।", - "swap.routing.uniswapAutoRouter.description": "यूनिस्वैप ऑटो राउटर आपको सर्वोत्तम मूल्य प्रदान करने के लिए इष्टतम मार्गों और नेटवर्क लागतों पर विचार करता है।", - "swap.settings.deadline.tooltip": "यदि आपका लेन-देन इस समयावधि से अधिक समय तक लंबित रहता है तो उसे वापस कर दिया जाएगा। (अधिकतम: 3 दिन)।", - "swap.settings.deadline.warning": "उच्च समय सीमा", - "swap.settings.oneClickSwap.title": "1-क्लिक स्वैप", - "swap.settings.oneClickSwap.tooltip": "तीव्र, कम लागत वाले स्वैप के लिए मानक व्यापार क्रियाओं को एक साथ जोड़ता है।", - "swap.settings.protection.description": "स्वैप सुरक्षा चालू होने पर, आपका एथेरियम लेनदेन सैंडविच हमलों से सुरक्षित रहेगा, और विफलता की संभावना कम हो जाएगी।", - "swap.settings.protection.subtitle.supported": "{{chainName}} नेटवर्क", - "swap.settings.protection.subtitle.unavailable": "{{chainName}}पर उपलब्ध नहीं है", - "swap.settings.protection.title": "स्वैप सुरक्षा", - "swap.settings.routingPreference.option.default.description": "इस विकल्प का चयन करने से आपके स्वैप के लिए सबसे कुशल मार्ग की पहचान हो जाती है।", - "swap.settings.routingPreference.option.default.description.preV4": "यूनिस्वैप ग्राहक मूल्य और नेटवर्क लागत को ध्यान में रखते हुए सबसे सस्ता व्यापार विकल्प चुनता है।", - "swap.settings.routingPreference.option.default.description.uniswapXUnavailable": "UniswapX आपके वॉलेट के लिए उपलब्ध नहीं है", - "swap.settings.routingPreference.option.default.tooltip": "अनुमानित मूल्य प्रभाव और नेटवर्क लागत को ध्यान में रखते हुए v2, v3 और कुछ v4 पूलों पर विचार करते हुए एक मार्ग की पहचान की जाती है।", - "swap.settings.routingPreference.option.v2.title": "v2 पूल सक्षम करें", - "swap.settings.routingPreference.option.v3.title": "v3 पूल सक्षम करें", - "swap.settings.routingPreference.option.v4.hooks.title": "v4 हुक पूल सक्षम करें", - "swap.settings.routingPreference.option.v4.hooks.tooltip": "V4 हुक पूर्व-स्वीकृत हुक के एक सेट के माध्यम से स्वैप को रूट करता है।", - "swap.settings.routingPreference.option.v4.title": "v4 पूल सक्षम करें", - "swap.settings.routingPreference.title": "व्यापार विकल्प", - "swap.settings.slippage.alert": "उच्च फिसलन", - "swap.settings.slippage.control.auto": "ऑटो", - "swap.settings.slippage.description": "यदि कीमत में स्लिपेज प्रतिशत से अधिक परिवर्तन होता है तो आपका लेनदेन वापस कर दिया जाएगा।", - "swap.settings.slippage.input.message": "यदि कीमत में और गिरावट आती है, तो आपका लेनदेन वापस कर दिया जाएगा। नीचे वह न्यूनतम राशि दी गई है जो आपको मिलने की गारंटी है।", - "swap.settings.slippage.input.receive.title": "कम से कम प्राप्त करें", - "swap.settings.slippage.output.message": "यदि कीमत में और गिरावट आती है, तो आपका लेनदेन वापस कर दिया जाएगा। नीचे वह अधिकतम राशि दी गई है जो आपको खर्च करनी होगी।", - "swap.settings.slippage.output.spend.title": "ज्यादा से ज्यादा खर्च करो", - "swap.settings.slippage.warning": "बहुत अधिक फिसलन", - "swap.settings.slippage.warning.description": "20% से अधिक स्लिपेज के परिणामस्वरूप प्रतिकूल व्यापार होने की संभावना है। फ्रंट-रन होने के जोखिम को कम करने के लिए, अपनी सेटिंग्स कम करें।", - "swap.settings.slippage.warning.hover": "इससे प्रतिकूल ट्रेड हो सकता है। अपनी स्लिपेज सेटिंग कम करने का प्रयास करें।", - "swap.settings.slippage.warning.max": "{{maxSlippageTolerance}}से कम मान दर्ज करें", - "swap.settings.slippage.warning.message": "फिसलन आवश्यकता से अधिक हो सकती है", - "swap.settings.slippage.warning.min": "0 से बड़ा मान दर्ज करें", - "swap.settings.title": "सेटिंग्स बदलें", - "swap.settings.transactionRevertPrice": "यदि मूल्य में इस प्रतिशत से अधिक प्रतिकूल परिवर्तन होता है तो आपका लेनदेन पूर्ववत हो जाएगा।", - "swap.signAndSwap": "हस्ताक्षर करें और अदला-बदली करें", - "swap.slippage.amt": "{{amt}} फिसलन", - "swap.slippage.bridging": "नेटवर्कों के बीच स्वैपिंग करते समय कोई फिसलन नहीं", - "swap.slippage.description": "स्वैप पर अपेक्षित और निष्पादित मूल्य के बीच अंतर। कम तरलता, बाजार में अस्थिरता या बॉट्स के कारण अंतर हो सकता है। \n\nयूनिस्वैप प्रोटेक्शन फ्रंटरनिंग बॉट्स और MEV से सुरक्षा करता है।", - "swap.slippage.settings.title": "फिसलन सेटिंग्स", - "swap.slippage.tooltip": "आपके लेन-देन से पहले अधिकतम मूल्य परिवर्तन पूर्ववत हो जाएगा।", - "swap.slippageBelow.warning": "{{amt}} से नीचे स्लिपेज के परिणामस्वरूप लेनदेन विफल हो सकता है", - "swap.submitted": "स्वैप प्रस्तुत किया गया", - "swap.success": "स्वैप सफल!", - "swap.tokenOwnFees": "कुछ टोकन खरीदने या बेचने पर शुल्क लगता है, जिसे टोकन जारीकर्ता द्वारा निर्धारित किया जाता है। यूनिस्वैप को इनमें से कोई भी शुल्क नहीं मिलता है।", - "swap.tradeRoutes": "व्यापार मार्ग", - "swap.transaction.deadline": "लेन-देन की समय सीमा", - "swap.transaction.revertAfter": "यदि आपका लेन-देन इस अवधि से अधिक समय तक लंबित रहता है तो उसे वापस कर दिया जाएगा।", - "swap.warning.enterLargerAmount.title": "अधिक राशि दर्ज करें", - "swap.warning.expectedFailure.increaseSlippage": "अपनी फिसलन को बढ़ाने का प्रयास करें।", - "swap.warning.expectedFailure.titleMay": "यह स्वैप विफल हो सकता है", - "swap.warning.insufficientBalance.title": "आपके पास पर्याप्त {{currencySymbol}}नहीं है", - "swap.warning.insufficientGas.button": "पर्याप्त नहीं {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "{{ tokenSymbol }} को {{networkName}}पर बदलें", - "swap.warning.insufficientGas.button.buy": "खरीदें {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "कार्ड से खरीदें", - "swap.warning.insufficientGas.message.withNetwork": "स्वैप करने के लिए {{networkName}} पर पर्याप्त {{currencySymbol}} नहीं है", - "swap.warning.insufficientGas.message.withoutNetwork": "स्वैप करने के लिए पर्याप्त {{currencySymbol}} नहीं", - "swap.warning.insufficientGas.title": "आपके पास नेटवर्क लागत को कवर करने के लिए पर्याप्त {{currencySymbol}} नहीं है", - "swap.warning.networkFee.allow": "{{ inputTokenSymbol }} (एक बार) की अनुमति दें", - "swap.warning.networkFee.delegation.message": "यह आपके लेनदेन को संसाधित करने और यूनिचैन पर आपके स्मार्ट वॉलेट को सक्रिय करने की लागत है। यूनिस्वैप लैब्स को इन शुल्कों का कोई हिस्सा नहीं मिलता है।", - "swap.warning.networkFee.highRelativeToValue": "नेटवर्क लागत आपके कुल लेनदेन मूल्य के 10% से अधिक है। यह ब्लॉकचेन पर आपके लेनदेन को संसाधित करने की लागत है। Uniswap को इन शुल्कों का कोई हिस्सा नहीं मिलता है।", - "swap.warning.networkFee.highRelativeToValue.unichain": "नेटवर्क लागत आपके कुल लेनदेन मूल्य के 10% से अधिक है। यह ब्लॉकचेन पर आपके लेनदेन को संसाधित करने की लागत है।", - "swap.warning.networkFee.includesDelegation": "स्मार्ट वॉलेट सक्रियण शामिल है", - "swap.warning.networkFee.message": "यह ब्लॉकचेन पर आपके लेनदेन को संसाधित करने की लागत है। Uniswap को इन शुल्कों का कोई हिस्सा नहीं मिलता है।", - "swap.warning.networkFee.message.unichain": "यह ब्लॉकचेन पर आपके लेनदेन को संसाधित करने की लागत है।", - "swap.warning.networkFee.message.uniswapX": "यह ब्लॉकचेन पर आपके लेनदेन को संसाधित करने की लागत है। Uniswap को इन फीस का कोई हिस्सा नहीं मिलता है। UniswapX बेहतर कीमतों और गैस मुक्त स्वैप के लिए तरलता स्रोतों को एकत्रित करता है।", - "swap.warning.networkFee.message.uniswapX.title": "UniswapX के साथ कोई नेटवर्क लागत नहीं", - "swap.warning.networkFee.message.uniswapX.unichain": "यह ब्लॉकचेन पर आपके लेनदेन को संसाधित करने की लागत है। UniswapX बेहतर कीमतों और गैस मुक्त स्वैप के लिए तरलता स्रोतों को एकत्रित करता है।", - "swap.warning.noQuotesFound.bridging.message": "कोई ब्रिजिंग उद्धरण नहीं मिला। इस समय आधिकारिक ब्रिज का उपयोग करने का प्रयास करें।", - "swap.warning.noQuotesFound.title": "कोई उद्धरण नहीं मिला", - "swap.warning.noRoutesFound.message": "आपके चुने गए टोकन के लिए वर्तमान में कोई मार्ग उपलब्ध नहीं है। कृपया कोई दूसरा जोड़ा आज़माएँ या बाद में फिर से जाँच करें।", - "swap.warning.noRoutesFound.title": "कोई मार्ग उपलब्ध नहीं है", - "swap.warning.offline.message": "हो सकता है कि आपका इंटरनेट कनेक्शन खो गया हो या नेटवर्क डाउन हो गया हो। अपने इंटरनेट कनेक्शन की जाँच करें और पुन: प्रयास करें।", - "swap.warning.offline.title": "आप ऑफ़लाइन हैं", - "swap.warning.priceImpact.message": "वर्तमान में उपलब्ध {{outputCurrencySymbol}} तरलता की मात्रा के कारण, जितना अधिक {{inputCurrencySymbol}} आप स्वैप करने का प्रयास करेंगे, उतना ही कम {{outputCurrencySymbol}} आपको प्राप्त होगा।", - "swap.warning.priceImpact.message.veryHigh": "इस लेनदेन के परिणामस्वरूप इस पूल के बाजार मूल्य पर {{priceImpactValue}} मूल्य प्रभाव पड़ेगा और धन की हानि होगी।", - "swap.warning.priceImpact.title": "उच्च मूल्य प्रभाव ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "बहुत उच्च मूल्य प्रभाव ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "आपका लेनदेन सबमिट नहीं किया गया क्योंकि आपने ऐप बंद कर दिया था.", - "swap.warning.queuedOrder.approvalFailed": "आपका लेनदेन सबमिट नहीं किया गया क्योंकि टोकन अनुमोदन विफल हो गया.", - "swap.warning.queuedOrder.stale": "आपका लेन-देन सबमिट नहीं किया गया क्योंकि आपने ऐप बंद कर दिया था या स्वीकृति में बहुत अधिक समय लग गया था।", - "swap.warning.queuedOrder.submissionFailed": "आपका लेनदेन सबमिट करने में समस्या हुई.", - "swap.warning.queuedOrder.title": "स्वैप रद्द", - "swap.warning.rateLimit.message": "कुछ ही मिनटों में पुनः प्रयास करें।", - "swap.warning.rateLimit.title": "दर सीमा पार हो गई", - "swap.warning.router.message": "हो सकता है कि आपका कनेक्शन टूट गया हो या नेटवर्क डाउन हो गया हो. यदि समस्या बनी रहती है, तो कृपया बाद में पुनः प्रयास करें।", - "swap.warning.router.title": "यह व्यापार अभी पूरा नहीं किया जा सकता", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} अवरुद्ध है", - "swap.warning.tokenBlockedFallback.button": "टोकन अवरुद्ध है", - "swap.warning.uniswapFee.message": "यूनिस्वैप के साथ सर्वोत्तम अनुभव सुनिश्चित करने के लिए शुल्क लगाया जाता है।", - "swap.warning.uniswapFee.message.default": "Uniswap के साथ सबसे अच्छा अनुभव सुनिश्चित करने के लिए शुल्क लागू किया जाता है। इस स्वैप से जुड़ा कोई शुल्क नहीं है।", - "swap.warning.uniswapFee.message.included": "यूनिस्वैप के साथ सर्वोत्तम अनुभव सुनिश्चित करने के लिए शुल्क लागू किए जाते हैं, और उन्हें पहले ही इस उद्धरण में शामिल कर लिया गया है।", - "swap.warning.uniswapFee.title": "स्वैप शुल्क", - "swap.warning.viewOnly.message": "टोकन स्वैप करने के लिए आपको इस वॉलेट को पुनर्प्राप्ति वाक्यांश के माध्यम से आयात करना होगा।", - "swap.wrap.token": "लपेटें {{sym}}", - "tdp.balanceSummary.otherNetworks": "अन्य नेटवर्क पर", - "tdp.balanceSummary.otherNetworksBalance": "अन्य नेटवर्क पर शेष राशि", - "tdp.balanceSummary.title": "आपका बैलेंस", - "tdp.button.getToken": "{{ tokenSymbol }}प्राप्त करें", - "tdp.button.getTokenFallback": "टोकन प्राप्त करें", - "tdp.loading.title.default": "के लिए टोकन डेटा", - "tdp.loading.title.withChain": " के लिए टोकन डेटा {{chainName}}पर", - "tdp.nameNotFound": "नाम नहीं मिला", - "tdp.noInfoAvailable": "कोई टोकन जानकारी उपलब्ध नहीं", - "tdp.noTestnetSupportDescription": "कुछ टेस्टनेट टोकन की अदला-बदली, भेजने या खरीदने का समर्थन नहीं करते हैं।", - "tdp.symbolNotFound": "प्रतीक नहीं मिला", - "testnet.modal.swapDeepLink.description.toProdMode": "इस क्रिया के लिए टेस्टनेट मोड को अक्षम करना आवश्यक है। टेस्टनेट मोड को सेटिंग्स के भीतर किसी भी समय पुनः सक्षम किया जा सकता है।", - "testnet.modal.swapDeepLink.description.toTestnetMode": "इस क्रिया के लिए टेस्टनेट मोड को सक्षम करना आवश्यक है। टेस्टनेट पर टोकन का कोई वास्तविक मूल्य नहीं होता है। सेटिंग के भीतर टेस्टनेट मोड को कभी भी अक्षम किया जा सकता है।", - "testnet.modal.swapDeepLink.title.toProdMode": "टेस्टनेट मोड अक्षम करें", - "testnet.modal.swapDeepLink.title.toTestnetMode": "टेस्टनेट मोड सक्षम करें", - "testnet.unsupported": "यह कार्यक्षमता टेस्टनेट मोड में समर्थित नहीं है।", - "themeToggle.theme": "विषय", - "title.buySellTradeEthereum": "Uniswap पर Ethereum और अन्य शीर्ष टोकन खरीदें, बेचें और व्यापार करें", - "title.createGovernanceOn": "Uniswap पर एक नया गवर्नेंस प्रस्ताव बनाएं", - "title.createGovernanceTo": "UNI धारकों द्वारा मतदान के लिए एक नया शासन प्रस्ताव बनाएँ। UNI टोकन Uniswap शासन में मतदान शेयरों का प्रतिनिधित्व करते हैं।", - "title.earnFees": "जब अन्य लोग यूनिस्वैप पर लिक्विडिटी पूल में टोकन जोड़कर स्वैप करते हैं तो शुल्क अर्जित करें।", - "title.easilyRemove": "आसानी से Uniswap v2 से अपनी तरलता निकालें और Uniswap v3 में जमा करें।", - "title.easilyRemoveV4": "Uniswap v2 और v3 से अपनी तरलता को आसानी से निकालकर Uniswap v4 में जमा करें।", - "title.extension.uninstall": "एक्सटेंशन अनइंस्टॉल किया गया", - "title.extensionPasskeyLogIn": "पासकी से लॉग इन करें", - "title.managePasskeys": "Uniswap | अपनी पासकीज़ प्रबंधित करें", - "title.migratev2": "v2 पूल लिक्विडिटी को Uniswap v3 में माइग्रेट करें", - "title.migratev3": "पूल लिक्विडिटी को Uniswap v4 में माइग्रेट करें", - "title.placeLimit": "Uniswap पर लिमिट ऑर्डर रखें", - "title.realTime": "वास्तविक समय मूल्य, चार्ट, लेनदेन डेटा, और अधिक।", - "title.removeLiquidityv2": "Uniswap पर पूल लिक्विडिटी (v2) निकालें", - "title.removePoolLiquidity": "Uniswap पर पूल लिक्विडिटी हटाएँ", - "title.removeTokensv2": "अपने टोकन को v2 लिक्विडिटी पूल से हटाएँ।", - "title.removev3Liquidity": "अपने टोकन को v3 लिक्विडिटी पूल से हटाएँ।", - "title.sendCrypto": "क्रिप्टो भेजें", - "title.sendTokens": "Uniswap पर टोकन भेजें", - "title.swappingMadeSimple": "Ethereum, Base, Arbitrum, Polygon, Unichain और अन्य पर तुरंत क्रिप्टो खरीदें और बेचें। DeFi प्लेटफ़ॉर्म जिस पर लाखों लोग भरोसा करते हैं।", - "title.tradeTokens": "टोकन का व्यापार करें और लिक्विडिटी प्रदान करें। वास्तविक समय की कीमतें, चार्ट, लेनदेन डेटा और बहुत कुछ।", - "title.uniswapTradeCrypto": "Uniswap | DeFi के प्रमुख एक्सचेंज पर क्रिप्टो ट्रेड करें ", - "title.uniToken": "UNI टोकन Uniswap गवर्नेंस में वोटिंग शेयरों का प्रतिनिधित्व करते हैं। आप प्रत्येक प्रस्ताव पर खुद वोट कर सकते हैं या अपने वोट किसी तीसरे पक्ष को सौंप सकते हैं।", - "title.voteOnGov": "यूनिस्वैप पर गवर्नेंस प्रस्तावों पर मतदान", - "token.balances.main": "आपका बैलेंस", - "token.balances.other": "अन्य नेटवर्क पर संतुलन", - "token.balances.viewOnly": "{{ownerAddress}}का संतुलन", - "token.bridge": "{{label}} टोकन ब्रिज", - "token.chart.candlestick.unavailable": "इस टोकन के लिए कैंडलस्टिक चार्ट उपलब्ध नहीं हैं", - "token.chart.tooltip": "शुल्क: {{amount}}", - "token.details": "टोकन विवरण", - "token.error.unknown": "अज्ञात टोकन", - "token.fee.buy.label": "खरीद शुल्क", - "token.fee.label": "शुल्क", - "token.fee.sell.label": "विक्रय शुल्क", - "token.links.title": "लिंक", - "token.links.twitter": "ट्विटर", - "token.links.website": "वेबसाइट", - "token.notFound.description": "क्षमा करें, हमें इस टोकन के लिए कोई जानकारी नहीं मिल पाई। नाम और पता जाँचें और पुनः प्रयास करें।", - "token.notFound.title": "टोकन नहीं मिला", - "token.priceExplorer.error.description": "कुछ गलत हो गया।", - "token.priceExplorer.error.title": "मूल्य चार्ट लोड नहीं किया जा सका", - "token.priceExplorer.timeRangeLabel.all": "पूरे समय", - "token.priceExplorer.timeRangeLabel.day": "-1 डी", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 दिन", - "token.priceExplorer.timeRangeLabel.hour": "1 घंटे", - "token.priceExplorer.timeRangeLabel.month": "1एम", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 महीना", - "token.priceExplorer.timeRangeLabel.week": "1 माह", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 सप्ताह", - "token.priceExplorer.timeRangeLabel.year": "1 वर्ष", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 वर्ष", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} उपलब्ध नहीं है", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} और {{tokenSymbol1}} उपलब्ध नहीं हैं", - "token.safety.fee.detected": "टोकन शुल्क का पता चला", - "token.safety.fees.uniswapLabsDoesNotReceive": "यूनिस्वैप लैब्स को इनमें से कोई भी शुल्क नहीं मिलता है।", - "token.safety.warning.alwaysDoYourResearch": "हमेशा अपना शोध करें", - "token.safety.warning.blocked.description.default_one": "आप Uniswap ऐप का उपयोग करके इस टोकन का व्यापार नहीं कर सकते।", - "token.safety.warning.blocked.description.default_other": "आप Uniswap ऐप का उपयोग करके इन टोकन का व्यापार नहीं कर सकते।", - "token.safety.warning.copyContractAddress.message": "यह एक अनुबंध पता है, जो ब्लॉकचेन पर टोकन के लिए एक अद्वितीय पहचानकर्ता के रूप में कार्य करता है। इस पते पर आपके द्वारा भेजी गई कोई भी क्रिप्टो खो जाएगी।", - "token.safety.warning.copyContractAddress.title": "इस पते पर क्रिप्टो न भेजें", - "token.safety.warning.dontShowWarningAgain": "मुझे यह चेतावनी दोबारा मत दिखाओ", - "token.safety.warning.dontShowWarningAgainShort": "दोबारा मत दिखाओ", - "token.safety.warning.doYourOwnResearch": "आगे बढ़ने से पहले हमेशा स्वयं शोध करें।", - "token.safety.warning.feeDescription": "{{action}}होने पर चार्ज करता है", - "token.safety.warning.flaggedAsMalicious": "दुर्भावनापूर्ण के रूप में चिह्नित", - "token.safety.warning.flaggedAsSuspicious": "संदिग्ध के रूप में चिह्नित", - "token.safety.warning.fotHigh.title": "उच्च शुल्क का पता चला", - "token.safety.warning.fotLow.title": "शुल्क का पता चला", - "token.safety.warning.fotVeryHigh.title": "बहुत अधिक शुल्क पाया गया", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} को बेचने योग्य नहीं माना गया है। इस टोकन को स्वैप करने से आपके फंड का नुकसान हो सकता है।", - "token.safety.warning.honeypot.title": "100% बिक्री शुल्क का पता चला", - "token.safety.warning.impersonator": "किसी अन्य टोकन का प्रतिरूपण करता है", - "token.safety.warning.impersonator.title": "प्रतिरूपणकर्ता टोकन का पता चला", - "token.safety.warning.malicious.general.message": "{{tokenSymbol}} को ब्लॉकएड द्वारा दुर्भावनापूर्ण के रूप में चिह्नित किया गया है।", - "token.safety.warning.malicious.impersonator.message": "{{tokenSymbol}} को ब्लॉकएड द्वारा एक अलग टोकन की प्रतिलिपि बनाने के प्रयास के लिए फ़्लैग किया गया है। हो सकता है कि यह वह टोकन न हो जिसे आप स्वैप करना चाहते हैं।", - "token.safety.warning.malicious.impersonator.message.short": "{{tokenSymbol}} हो सकता है कि वह टोकन न हो जिसे आप बदलना चाहते हैं।", - "token.safety.warning.malicious.title": "दुर्भावनापूर्ण टोकन का पता चला", - "token.safety.warning.mayResultInLoss": "इसे बदलने से धन की हानि हो सकती है।", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} का कारोबार अमेरिका के प्रमुख केंद्रीकृत एक्सचेंजों पर नहीं होता है।", - "token.safety.warning.notListedOnExchanges": "प्रमुख अमेरिकी एक्सचेंजों में सूचीबद्ध नहीं", - "token.safety.warning.potentialHoneypot.card.message": "{{tokenSymbol}} को ब्लॉकएड द्वारा संदिग्ध के रूप में चिह्नित किया गया है।", - "token.safety.warning.potentialHoneypot.modal.message": "{{tokenSymbol}} को ब्लॉकएड द्वारा संभावित हनीपोट के रूप में चिह्नित किया गया है। आगे बढ़ने से पहले हमेशा अपना खुद का शोध करें।", - "token.safety.warning.potentialHoneypot.title": "संभावित हनीपोट का पता चला", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} को विक्रययोग्य नहीं माना गया है।", - "token.safety.warning.sellFee100.title": "100% बिक्री शुल्क का पता चला", - "token.safety.warning.spam.message": "{{tokenSymbol}} को ब्लॉकएड द्वारा स्पैम के रूप में चिह्नित किया गया है।", - "token.safety.warning.spam.title": "स्पैम टोकन का पता चला", - "token.safety.warning.spamsUsers": "स्पैम उपयोगकर्ता", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} खरीदने पर {{buyFeePercent}} शुल्क लेता है और बेचने पर {{sellFeePercent}} शुल्क लेता है।", - "token.safety.warning.tokenChargesFee.buy.message": "{{tokenSymbol}} खरीदने पर {{feePercent}} शुल्क लगता है।", - "token.safety.warning.tokenChargesFee.buy.message.descriptive": "{{tokenSymbol}} खरीदने पर {{feePercent}} शुल्क लगता है। इसे स्वैप करने से फंड का नुकसान हो सकता है। Uniswap Labs को इनमें से कोई भी शुल्क नहीं मिलता है।", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} बेचे जाने पर {{feePercent}} शुल्क लेता है।", - "token.safety.warning.tokenChargesFee.sell.message.descriptive": "{{tokenSymbol}} को बेचने पर {{feePercent}} शुल्क लगता है। इसे स्वैप करने से फंड का नुकसान हो सकता है। Uniswap Labs को इनमें से कोई भी शुल्क नहीं मिलता है।", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} खरीदने या बेचने पर शुल्क लेता है।", - "token.safetyLevel.blocked.message": "आप Uniswap वॉलेट का उपयोग करके इस टोकन का व्यापार नहीं कर सकते।", - "token.safetyLevel.medium.message.plural": "ये टोकन प्रमुख अमेरिकी केंद्रीकृत एक्सचेंजों पर कारोबार नहीं किए जाते हैं। आगे बढ़ने से पहले हमेशा अपना खुद का शोध करें।", - "token.selector.search.error": "खोज परिणाम लोड नहीं किये जा सके", - "token.stats.fullyDilutedValuation": "पूरी तरह से पतला मूल्यांकन", - "token.stats.marketCap": "बाज़ार आकार", - "token.stats.priceHighYear": "52W ऊँचा", - "token.stats.priceLowYear": "52W कम", - "token.stats.section.about": "लगभग {{token}}", - "token.stats.title": "आँकड़े", - "token.stats.translation.original": "मूल दिखाएं", - "token.stats.translation.translate": "{{language}}में अनुवाद करें", - "token.stats.volume": "24 घंटे वॉल्यूम", - "token.symbol.input.fallback": "इनपुट टोकन", - "token.symbol.output.fallback": "आउटपुट टोकन", - "token.wrap.fail.message": "यूनिस्वैप प्रोटोकॉल पर स्वैप ETH से शुरू और खत्म हो सकता है। हालाँकि, स्वैप के दौरान, ETH को WETH में लपेटा जाता है।", - "token.zeroNativeBalance.description.mainnet": "{{ tokenSymbol }}पाने के लिए आपको एथेरियम पर एक टोकन स्वैप करना होगा। स्वैपिंग के लिए नेटवर्क लागत के लिए ETH की आवश्यकता होती है।", - "token.zeroNativeBalance.description.otherChains": "आपको {{ tokenSymbol }}प्राप्त करने के लिए {{ chainName }} पर एक टोकन स्वैप करना होगा। नेटवर्क लागत के लिए स्वैपिंग के लिए {{ chainName }} {{ nativeTokenSymbol }} की आवश्यकता होती है।", - "token.zeroNativeBalance.subtitle": "{{ tokenSymbol }} प्रत्यक्ष खरीद के लिए उपलब्ध नहीं है।", - "token.zeroNativeBalance.title.mainnet": "आपको {{ nativeTokenName }}की आवश्यकता है", - "token.zeroNativeBalance.title.otherChains": "आपको {{ chainName }}पर {{ nativeTokenName }} की आवश्यकता है", - "tokens.action.hide": "टोकन छिपाएं", - "tokens.action.unhide": "टोकन छिपाएँ", - "tokens.nfts.action.viewOnExplorer": "{{blockExplorerName}}पर देखें", - "tokens.nfts.collection.error.load.title": "एनएफटी संग्रह लोड नहीं किया जा सका", - "tokens.nfts.collection.label.items": "सामान", - "tokens.nfts.collection.label.owners": "मालिकों", - "tokens.nfts.collection.label.priceFloor": "ज़मीन", - "tokens.nfts.collection.label.swapVolume": "आयतन", - "tokens.nfts.connectEthereumToView": "अपने NFT देखने के लिए एक Ethereum वॉलेट कनेक्ट करें", - "tokens.nfts.details.contract.address": "अनुबंध का पता", - "tokens.nfts.details.error.load.title": "एनएफटी विवरण लोड नहीं किया जा सका", - "tokens.nfts.details.network": "नेटवर्क", - "tokens.nfts.details.owner": "मालिक", - "tokens.nfts.details.price": "मौजूदा कीमत", - "tokens.nfts.details.recentPrice": "अंतिम विक्रय मूल्य", - "tokens.nfts.details.traits": "लक्षण", - "tokens.nfts.empty.description": "कोई एनएफटी नहीं मिला", - "tokens.nfts.error.unavailable": "सामग्री उपलब्ध नहीं है", - "tokens.nfts.hidden.action.hide": "एनएफटी छुपाएं", - "tokens.nfts.hidden.action.unhide": "एनएफटी को उजागर करें", - "tokens.nfts.link.collection": "संग्रह वेबसाइट", - "tokens.nfts.list.error.load.title": "एनएफटी लोड नहीं हो सका", - "tokens.nfts.list.none.button": "एनएफटी प्राप्त करें", - "tokens.nfts.list.none.description.default": "आरंभ करने के लिए एनएफटी को दूसरे वॉलेट से स्थानांतरित करें।", - "tokens.nfts.list.none.description.external": "जब यह वॉलेट एनएफटी खरीदता है या प्राप्त करता है, तो वे यहां दिखाई देंगे।", - "tokens.nfts.list.none.title": "अभी तक कोई एनएफटी नहीं", - "tokens.nfts.notAvailableOnSolana": "सोलाना पर NFT उपलब्ध नहीं हैं", - "tokens.selector.button.choose": "टोकन चुनें", - "tokens.selector.empty.buy.message": "टोकन भेजने के लिए कार्ड या बैंक से क्रिप्टो खरीदें।", - "tokens.selector.empty.buy.title": "क्रिप्टो खरीदें", - "tokens.selector.empty.receive.title": "टोकन प्राप्त करें", - "tokens.selector.empty.title": "अभी तक कोई टोकन नहीं", - "tokens.selector.error.load": "टोकन लोड नहीं किये जा सके", - "tokens.selector.search.empty": "{{searchText}}के लिए कोई परिणाम नहीं मिला", - "tokens.selector.search.placeholder": "टोकन खोजें", - "tokens.selector.section.bridging": "नेटवर्कों के बीच अदला-बदली", - "tokens.selector.section.favorite": "पसंदीदा", - "tokens.selector.section.otherNetworksSearchResults": "अन्य नेटवर्क पर पाए गए टोकन", - "tokens.selector.section.otherSearchResults": "{{network}}पर अन्य टोकन", - "tokens.selector.section.recent": "हाल की खोजें", - "tokens.selector.section.search": "खोज के परिणाम", - "tokens.selector.section.trending": "24 घंटे की मात्रा के अनुसार टोकन", - "tokens.selector.section.yours": "आपके टोकन", - "tokens.table.search.placeholder.pools": "पूल खोजें", - "tokens.table.search.placeholder.tokens": "टोकन खोजें", - "tokens.table.search.placeholder.transactions": "लेनदेन खोजें", - "toucan.auction.bidConcentration": "टूकेन सांद्रता", - "toucan.auction.bidConcentration.tooltip.description": "टूकेन टूलटिप विवरण", - "toucan.auction.bidConcentration.tooltip.title": "टूकेन टूलटिप शीर्षक", - "toucan.auctions": "नीलामी", - "toucan.bidForm.maxBudget": "अधिकतम बजट", - "toucan.bidForm.placeBid": "अपनी बोली लगाएं", - "toucan.displayMode.tokenPrice": "टोकन मूल्य", - "toucan.displayMode.valuation": "मूल्यांकन", - "transaction.action.cancel.button": "लेनदेन रद्द करें", - "transaction.action.cancel.description": "यदि आप नेटवर्क द्वारा संसाधित होने से पहले इस लेनदेन को रद्द करते हैं, तो आपको मूल लागत के बजाय नई नेटवर्क लागत का भुगतान करना होगा।", - "transaction.action.cancel.title": "यह लेन-देन रद्द करें?", - "transaction.action.clear": "लंबित साफ़ करें", - "transaction.action.copy": "लेन-देन आईडी कॉपी करें", - "transaction.action.copyProvider": "{{providerName}} लेनदेन आईडी कॉपी करें", - "transaction.amount.unlimited": "असीमित", - "transaction.callData": "कॉल डेटा", - "transaction.details.dappName": "अनुप्रयोग", - "transaction.details.from": "से", - "transaction.details.networkFee": "नेटवर्क लागत", - "transaction.details.networkFee.swap": "स्वैप नेटवर्क लागत", - "transaction.details.providerFee": "प्रदाता शुल्क", - "transaction.details.swapRate": "दर", - "transaction.details.transaction": "लेन-देन", - "transaction.details.uniswapFee": "शुल्क ({{ feePercent }}%)", - "transaction.network.all": "सभी नेटवर्क", - "transaction.networkCost.description": "ब्लॉकचेन पर आपके लेनदेन को संसाधित करने की लागत। यूनिस्वैप न्यूनतम नेटवर्क लागत के लिए अनुकूलित है।", - "transaction.networkCost.includesSmartWalletActivation": "स्मार्ट वॉलेट सक्रियण शामिल है", - "transaction.networkCost.label": "नेटवर्क लागत", - "transaction.networkCost.maxNativeBalance.description": "इस लेनदेन की नेटवर्क लागत को कवर करने के लिए नेटवर्क टोकन बैलेंस की एक छोटी राशि आरक्षित रखी जाती है।", - "transaction.networkCost.maxNativeBalance.title": "मैं अपनी अधिकतम शेष राशि का उपयोग क्यों नहीं कर सकता?", - "transaction.networkCost.veryHigh.label": "बहुत अधिक नेटवर्क लागत", - "transaction.notification.error.cancel": "लेनदेन रद्द करने में असमर्थ", - "transaction.notification.error.replace": "लेन-देन प्रतिस्थापित करने में असमर्थ", - "transaction.status.approval.canceled": "अनुमोदन रद्द", - "transaction.status.approval.failed": "अनुमोदन विफल", - "transaction.status.approve.canceled": "रद्द स्वीकृत", - "transaction.status.approve.canceling": "स्वीकृति रद्द करना", - "transaction.status.approve.failed": "स्वीकृत करने में विफल", - "transaction.status.approve.pending": "का अनुमोदन", - "transaction.status.approve.success": "अनुमत", - "transaction.status.approve.successDapp": "{{externalDappName}}पर स्वीकृत", - "transaction.status.buy.canceled": "खरीद रद्द", - "transaction.status.buy.canceling": "खरीदारी रद्द की जा रही है", - "transaction.status.buy.failed": "खरीदने में विफल", - "transaction.status.buy.pending": "क्रय करना", - "transaction.status.buy.success": "खरीदा", - "transaction.status.buy.successDapp": "{{externalDappName}}पर ख़रीदा गया", - "transaction.status.claim.canceled": "शुल्क संग्रह रद्द", - "transaction.status.claim.canceling": "शुल्क संग्रह रद्द करना", - "transaction.status.claim.failed": "शुल्क संग्रहण विफल", - "transaction.status.claim.pending": "शुल्क एकत्रित करना", - "transaction.status.claim.success": "एकत्रित शुल्क", - "transaction.status.collect.fees.canceled": "शुल्क संग्रहण रद्द", - "transaction.status.collect.fees.failed": "शुल्क एकत्रित करना विफल", - "transaction.status.collected.fees": "एकत्रित शुल्क", - "transaction.status.collecting.fees": "शुल्क एकत्रित करना", - "transaction.status.confirm.canceled": "रद्द की गई पुष्टि", - "transaction.status.confirm.canceling": "लंबित निरस्तीकरण", - "transaction.status.confirm.failed": "पुष्टि करने में विफल", - "transaction.status.confirm.pending": "लेन-देन चल रहा है", - "transaction.status.confirm.success": "लेन-देन की पुष्टि हो गई", - "transaction.status.confirm.successDapp": "{{externalDappName}}पर लेनदेन की पुष्टि हुई", - "transaction.status.createPair.canceled": "जोड़ी बनाना रद्द किया गया", - "transaction.status.createPair.canceling": "जोड़ी बनाना रद्द किया जा रहा है", - "transaction.status.createPair.failed": "जोड़ी बनाने में विफल", - "transaction.status.createPair.pending": "जोड़ी बनाना", - "transaction.status.createPair.success": "निर्मित जोड़ी", - "transaction.status.createPool.canceled": "पूल बनाना रद्द किया गया", - "transaction.status.createPool.canceling": "पूल बनाना रद्द किया जा रहा है", - "transaction.status.createPool.failed": "पूल बनाने में विफल", - "transaction.status.createPool.pending": "पूल बनाना", - "transaction.status.createPool.success": "बनाया गया पूल", - "transaction.status.liquidityDecrease.canceled": "लिक्विडिटी हटाना रद्द", - "transaction.status.liquidityDecrease.canceling": "रद्दीकरण तरलता हटाना", - "transaction.status.liquidityDecrease.failed": "तरलता हटाना विफल", - "transaction.status.liquidityDecrease.pending": "तरलता हटाना", - "transaction.status.liquidityDecrease.success": "हटाई गई तरलता", - "transaction.status.liquidityIncrease.canceled": "तरलता जोड़ना रद्द किया गया", - "transaction.status.liquidityIncrease.canceling": "अतिरिक्त तरलता रद्द करना", - "transaction.status.liquidityIncrease.failed": "तरलता जोड़ना विफल", - "transaction.status.liquidityIncrease.pending": "तरलता बढ़ाना", - "transaction.status.liquidityIncrease.success": "अतिरिक्त तरलता", - "transaction.status.lpIncentivesClaim.canceled": "एलपी पुरस्कार दावा रद्द कर दिया गया", - "transaction.status.lpIncentivesClaim.canceling": "एलपी पुरस्कार दावा रद्द करना", - "transaction.status.lpIncentivesClaim.failed": "एलपी पुरस्कारों का दावा करने में विफल", - "transaction.status.lpIncentivesClaim.pending": "एलपी पुरस्कारों का दावा करना", - "transaction.status.lpIncentivesClaim.success": "दावा किए गए LP पुरस्कार", - "transaction.status.migrateLiquidity.canceled": "माइग्रेट लिक्विडिटी रद्द", - "transaction.status.mint.canceled": "रद्द टकसाल", - "transaction.status.mint.canceling": "टकसाल रद्द करना", - "transaction.status.mint.failed": "टकसाल करने में विफल", - "transaction.status.mint.pending": "मिंटिंग", - "transaction.status.mint.success": "ढाला", - "transaction.status.mint.successDapp": "{{externalDappName}}पर ढाला गया", - "transaction.status.offramp.canceled": "ऑफरैंप रद्द", - "transaction.status.offramp.failed": "ऑफरैंप विफल", - "transaction.status.offramp.pending": "ऑफरैम्पिंग", - "transaction.status.offramp.success": "ऑफ्रैम्प्ड", - "transaction.status.onramp.canceled": "ऑनरैंप रद्द", - "transaction.status.onramp.failed": "ऑनरैंप विफल", - "transaction.status.onramp.pending": "ऑनरैम्पिंग", - "transaction.status.onramp.success": "ऑनरैम्प्ड", - "transaction.status.permit.approved": "परमिट स्वीकृत", - "transaction.status.permit.canceled": "परमिट रद्द कर दिया गया", - "transaction.status.permit.failed": "परमिट विफल", - "transaction.status.purchase.canceled": "रद्द की गई खरीदारी", - "transaction.status.purchase.canceling": "खरीदारी रद्द करना", - "transaction.status.purchase.failed": "खरीदारी विफल", - "transaction.status.purchase.failedOn": "{{serviceProvider}}पर खरीदारी विफल", - "transaction.status.purchase.pending": "क्रय", - "transaction.status.purchase.pendingOn": "{{serviceProvider}}पर खरीदारी", - "transaction.status.purchase.successOn": "{{serviceProvider}}पर खरीदा गया", - "transaction.status.receive.canceled": "रद्द प्राप्त", - "transaction.status.receive.canceling": "प्राप्ति रद्द करना", - "transaction.status.receive.failed": "प्राप्त करना विफल", - "transaction.status.receive.failedFrom": "{{serviceProvider}}से प्राप्त करने में विफल", - "transaction.status.receive.pending": "प्राप्त", - "transaction.status.receive.pendingFrom": "{{serviceProvider}}से प्राप्त करना", - "transaction.status.receive.success": "प्राप्त", - "transaction.status.receive.successDapp": "{{externalDappName}}पर प्राप्त हुआ", - "transaction.status.receive.successFrom": "{{serviceProvider}}से प्राप्त", - "transaction.status.removeDelegation.canceled": "प्रतिनिधि हटाना रद्द", - "transaction.status.removeDelegation.failed": "प्रत्यायोजन हटाना विफल", - "transaction.status.removeDelegation.pending": "प्रतिनिधिमंडल हटाना", - "transaction.status.removeDelegation.success": "प्रतिनिधिमंडल हटा दिया गया", - "transaction.status.revoke.canceled": "रद्द किया गया निरस्त करें", - "transaction.status.revoke.canceling": "निरस्तीकरण रद्द करना", - "transaction.status.revoke.failed": "निरस्त करने में विफल", - "transaction.status.revoke.pending": "निरस्त हो रहा है", - "transaction.status.revoke.success": "निरस्त किया गया", - "transaction.status.revoke.successDapp": "{{externalDappName}}पर निरस्त किया गया", - "transaction.status.sale.canceled": "रद्द की गई बिक्री", - "transaction.status.sale.canceling": "बिक्री रद्द करना", - "transaction.status.sale.failedOn": "बिक्री विफल हुई {{serviceProvider}}", - "transaction.status.sale.pendingCard.msg": "क्रिप्टो बेचने के बारे में अधिक जानें.", - "transaction.status.sale.pendingCard.title": "मेरी बिक्री अभी भी लंबित क्यों है?", - "transaction.status.sale.pendingOn": "{{serviceProvider}}के माध्यम से बेचना", - "transaction.status.sale.successOn": "{{serviceProvider}}द्वारा बेचा गया", - "transaction.status.sell.canceled": "रद्द की गई बिक्री", - "transaction.status.sell.canceling": "बिक्री रद्द करना", - "transaction.status.sell.failed": "बेचने में विफल", - "transaction.status.sell.pending": "बेचना", - "transaction.status.sell.success": "बिका हुआ", - "transaction.status.sell.successDapp": "बेचा गया {{externalDappName}}", - "transaction.status.send.canceled": "भेजना रद्द किया गया", - "transaction.status.send.canceling": "भेजना रद्द किया जा रहा है", - "transaction.status.send.failed": "भेजने में विफल", - "transaction.status.send.pending": "भेजना", - "transaction.status.send.success": "भेजा", - "transaction.status.send.successDapp": "{{externalDappName}}पर भेजा गया", - "transaction.status.swap.canceled": "स्वैप रद्द", - "transaction.status.swap.canceling": "स्वैप रद्द करना", - "transaction.status.swap.expired": "स्वैप की अवधि समाप्त हो गई", - "transaction.status.swap.failed": "स्वैप करने में विफल", - "transaction.status.swap.insufficientFunds": "अपर्याप्त कोष", - "transaction.status.swap.pending": "अदला-बदली", - "transaction.status.swap.success": "बदली", - "transaction.status.swap.successDapp": "{{externalDappName}}पर स्वैप किया गया", - "transaction.status.unwrap.canceled": "रद्द किया गया खोलना", - "transaction.status.unwrap.canceling": "अनरैप रद्द करना", - "transaction.status.unwrap.failed": "खोलना विफल", - "transaction.status.unwrap.pending": "खोलना", - "transaction.status.unwrap.success": "लपेटा न", - "transaction.status.unwrap.successDapp": "{{externalDappName}}पर अनरैप किया गया", - "transaction.status.wrap.canceled": "रद्द किया गया आवरण", - "transaction.status.wrap.canceling": "रैप रद्द करना", - "transaction.status.wrap.failed": "लपेटने में विफल", - "transaction.status.wrap.pending": "रैपिंग", - "transaction.status.wrap.success": "लपेटा हुआ", - "transaction.status.wrap.successDapp": "{{externalDappName}}पर लपेटा गया", - "transaction.submittedOn": "पर प्रस्तुत की", - "transaction.summary.liquidity": "{{firstAmountWithSymbol}} और {{secondAmountWithSymbol}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} से {{recipientAddress}}", - "transaction.summary.received.noAmount": "{{name}}से प्राप्त", - "transaction.summary.sent": "{{senderAddress}}से {{tokenAmountWithSymbol}}", - "transaction.summary.sent.noAmount": "{{name}}को भेजा गया", - "transaction.warning.insufficientGas.modal.message": "इस लेनदेन की नेटवर्क लागत को कवर करने के लिए आपको ~{{tokenAmount}} {{tokenSymbol}} () पर {{networkName}} की आवश्यकता है। आगे बढ़ने के लिए किसी अन्य चेन से {{tokenSymbol}} स्वैप करें या अपने कार्ड से खरीदें।", - "transaction.warning.insufficientGas.modal.message.noAction": "इस लेनदेन की नेटवर्क लागत को कवर करने के लिए आपको ~{{tokenAmount}} {{tokenSymbol}} () पर {{networkName}} की आवश्यकता है।", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount": "इस लेनदेन की नेटवर्क लागत को कवर करने के लिए आपको ~{{tokenAmount}} {{tokenSymbol}} () पर {{networkName}} की आवश्यकता है।", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount.noAction": "इस टोकन के लिए स्वैप करने के लिए, आपको {{networkName}}पर अधिक {{tokenSymbol}} की आवश्यकता है।", - "transaction.warning.insufficientGas.modal.title.withNetwork": "{{networkName}}पर पर्याप्त {{tokenSymbol}} नहीं", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "पर्याप्त नहीं {{tokenSymbol}}", - "transaction.warning.maxNative.message": "आप अपने नेटवर्क टोकन बैलेंस का ज़्यादातर हिस्सा खर्च करने वाले हैं। इससे भविष्य में नेटवर्क लागतों को कवर करने के लिए अपर्याप्त धनराशि बच सकती है।", - "transaction.warning.maxNative.title": "नेटवर्क टोकन बैलेंस कम", - "transaction.watcher.error.cancel": "लेनदेन रद्द करने में असमर्थ", - "transaction.watcher.error.status": "लेन-देन की स्थिति जाँचते समय त्रुटि", - "uniswapX.aggregatesLiquidity": " बेहतर कीमतों और गैस मुक्त स्वैप के लिए तरलता स्रोतों को एकत्रित करता है।", - "uniswapX.cost": "यूनिस्वैपएक्स ब्लॉकचेन पर लेनदेन करने की सामान्य लागतों को हटा देता है।", - "uniswapx.description": "यूनिस्वैपएक्स बेहतर कीमतों और गैस मुक्त स्वैप के लिए तरलता स्रोतों को एकत्रित करता है।", - "uniswapx.description.unsupported": "UniswapX वर्तमान में अनुपलब्ध है क्योंकि आपकी स्मार्ट वॉलेट सेटिंग्स एक अलग वॉलेट ऐप द्वारा प्रबंधित की जाती हैं।", - "uniswapx.included": "इसमें शामिल है UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "यूनिस्वैपएक्स", - "uniswapX.learnMore": "UniswapX के साथ स्वैपिंग के बारे में अधिक जानें", - "uniswapx.unavailable.title": "UniswapX उपलब्ध नहीं है", - "uniswapx.v2QuoteFailed": "UniswapX v2 हार्ड कोट विफल हुआ। क्लासिक स्वैप के साथ पुनः प्रयास करें।", - "unitags.banner.button.claim": "अभी दावा करें", - "unitags.banner.subtitle": "एक वैयक्तिकृत वेब3 प्रोफ़ाइल बनाएं और अपना पता आसानी से दोस्तों के साथ साझा करें।", - "unitags.banner.title.compact": "अपना {{unitagDomain}} उपयोगकर्ता नाम का दावा करें और अपना अनुकूलन योग्य प्रोफ़ाइल बनाएं।", - "unitags.banner.title.full": "अपने {{unitagDomain}} उपयोगकर्ता नाम का दावा करें", - "unitags.choosePhoto.option.cameraRoll": "कैमरा रोल में से चुनें", - "unitags.choosePhoto.option.computer": "कंप्यूटर से अपलोड करें", - "unitags.choosePhoto.option.nft": "एक एनएफटी चुनें", - "unitags.choosePhoto.option.remove": "प्रोफ़ाइल चित्र हटाएँ", - "unitags.claim.available": "उपलब्ध", - "unitags.claim.confirmation.customize": "प्रोफ़ाइल अनुकूलित करें", - "unitags.claim.confirmation.description": "{{unitagAddress}} क्रिप्टो भेजने और प्राप्त करने के लिए तैयार है। अपने वेब3 प्रोफ़ाइल को कस्टमाइज़ करके अपना वॉलेट बनाना जारी रखें।", - "unitags.claim.confirmation.success.long": "आपको यह मिला!", - "unitags.claim.confirmation.success.short": "समझ गया!", - "unitags.claim.error.addressLimit": "आप पहले ही इस पते के लिए अपने उपयोगकर्ता नाम में अधिकतम संख्या में परिवर्तन कर चुके हैं", - "unitags.claim.error.avatar": "अवतार सेट नहीं किया जा सका. बाद में पुन: प्रयास।", - "unitags.claim.error.default": "उपयोगकर्ता नाम का दावा नहीं किया जा सका. बाद में पुन: प्रयास।", - "unitags.claim.error.deviceLimit": "आपने इस डिवाइस के लिए सक्रिय हो सकने वाले उपयोगकर्ता नामों की अधिकतम संख्या प्राप्त कर ली है", - "unitags.claim.error.general": "उपयोगकर्ता नाम का दावा करने में असमर्थ", - "unitags.claim.error.unavailable": "यह उपयोगकर्ता नाम उपलब्ध नहीं है", - "unitags.claim.error.unknown": "अज्ञात त्रुटि", - "unitags.claim.username.default": "आपका नाम", - "unitags.delete.confirm.subtitle": "आप अपना उपयोगकर्ता नाम और अनुकूलन योग्य प्रोफ़ाइल विवरण हटाने वाले हैं। आप इसे पुनः प्राप्त नहीं कर पाएंगे.", - "unitags.delete.confirm.title": "क्या आपको यकीन है?", - "unitags.editProfile.placeholder": "उपयोगकर्ता नाम", - "unitags.editUsername.confirm.subtitle": "आप अपना उपयोगकर्ता नाम बदलने वाले हैं. एक बार जब आप इसे बदल देते हैं, तो आप कभी भी इस पर दोबारा दावा नहीं कर सकते।", - "unitags.editUsername.confirm.title": "क्या आपको यकीन है?", - "unitags.editUsername.title": "अपना उपयोगकर्ता नाम संपादित करें", - "unitags.editUsername.warning.default": "एक बार जब आप अपना उपयोगकर्ता नाम बदल लेते हैं, तो आप इसे फिर कभी दावा नहीं कर सकते। आप इसे केवल 2 बार ही बदल सकते हैं।", - "unitags.editUsername.warning.max": "आप उपयोगकर्ता नाम परिवर्तन की अधिकतम 2 संख्या तक पहुँच चुके हैं।", - "unitags.extension.intro.buttton": "उपयोगकर्ता नाम का दावा करें", - "unitags.extension.intro.description": "0x पतों को अलविदा कहें। उपयोगकर्ता नाम पढ़ने योग्य नाम हैं जो क्रिप्टो भेजना और प्राप्त करना आसान बनाते हैं।", - "unitags.extension.intro.title": "उपयोक्तानामों का परिचय", - "unitags.extension.intro.upsell.customizable": "अनुकूलन योग्य प्रोफ़ाइल", - "unitags.extension.intro.upsell.ens": "ईएनएस उपडोमेन द्वारा संचालित", - "unitags.extension.intro.upsell.free": "दावा करने के लिए स्वतंत्र", - "unitags.intro.features.ens": "ईएनएस उपडोमेन द्वारा संचालित", - "unitags.intro.features.free": "दावा करने के लिए स्वतंत्र", - "unitags.intro.features.profile": "अनुकूलन योग्य प्रोफ़ाइल", - "unitags.intro.subtitle": "0x पतों को अलविदा कहें। उपयोगकर्ता नाम पढ़ने योग्य नाम हैं जो क्रिप्टो भेजना और प्राप्त करना आसान बनाते हैं।", - "unitags.intro.title": "उपयोक्तानामों का परिचय", - "unitags.notification.delete.error": "उपयोक्तानाम हटाया नहीं जा सका. बाद में पुन: प्रयास।", - "unitags.notification.delete.title": "उपयोक्तानाम हटा दिया गया", - "unitags.notification.profile.error": "प्रोफ़ाइल अद्यतन नहीं किया जा सका. बाद में पुन: प्रयास।", - "unitags.notification.profile.title": "प्रोफाइल अद्यतन किया गया", - "unitags.notification.username.error": "उपयोक्तानाम नहीं बदला जा सका. बाद में पुन: प्रयास।", - "unitags.notification.username.title": "उपयोक्तानाम बदल गया", - "unitags.onboarding.claim.subtitle": "यह आपका व्यक्तिगत पता है जिस पर लोग क्रिप्टो भेज सकते हैं।", - "unitags.onboarding.claim.title.choose": "अपना उपयोगकर्ता नाम बनाएं", - "unitags.onboarding.claim.title.claim": "अपने उपयोक्तानाम का दावा करें", - "unitags.onboarding.info.description": "उपयोगकर्ता नाम जटिल 0x पतों को पढ़ने योग्य नामों में बदल देते हैं। {{unitagDomain}} उपयोगकर्ता नाम का दावा करके, आप आसानी से क्रिप्टो भेज और प्राप्त कर सकते हैं और एक सार्वजनिक वेब3 प्रोफ़ाइल बना सकते हैं।", - "unitags.onboarding.info.title": "एक सरलीकृत पता", - "unitags.onboarding.profile.subtitle": "अपना स्वयं का अपलोड करें या अपने अद्वितीय यूनिकॉन के साथ बने रहें। आप इसे बाद में कभी भी बदल सकते हैं.", - "unitags.onboarding.profile.title": "एक प्रोफ़ाइल फ़ोटो चुनें", - "unitags.profile.action.delete": "उपयोक्तानाम हटाएँ", - "unitags.profile.action.edit": "उपयोक्तानाम संपादित करें", - "unitags.profile.bio.label": "जैव", - "unitags.profile.bio.placeholder": "अपनी प्रोफ़ाइल के लिए एक बायो टाइप करें", - "unitags.profile.links.twitter": "ट्विटर", - "unitags.username.error.chars": "उपयोगकर्ता नाम में केवल अक्षर और संख्याएँ ही हो सकती हैं", - "unitags.username.error.max": "उपयोगकर्ता नाम {{number}} वर्णों से अधिक नहीं हो सकते", - "unitags.username.error.min": "उपयोगकर्ता नाम कम से कम {{number}} वर्णों का होना चाहिए", - "unitags.username.error.uppercase": "उपयोगकर्ता नाम में केवल छोटे अक्षर और संख्याएँ हो सकती हैं", - "uwulink.error.insufficientTokens": "{{chain}}पर पर्याप्त {{tokenSymbol}} नहीं", - "v2.notAvailable": "Uniswap V2 इस नेटवर्क पर उपलब्ध नहीं है।", - "wallet.appSignIn": "ऐप से साइन इन करें", - "wallet.connectingAgreement": "वॉलेट कनेक्ट करके, आप Uniswap Labs की सेवा की शर्तों से सहमत होते हैं और इसकी गोपनीयता नीतिसे सहमति देते हैं।", - "wallet.connectionFailed.message": "कनेक्शन का प्रयास विफल रहा। कृपया अपने वॉलेट में कनेक्ट करने के लिए दिए गए चरणों का पालन करते हुए पुनः प्रयास करें।", - "wallet.mismatch.popup.description": "कुछ सुविधाएं आपके कनेक्टेड वॉलेट द्वारा समर्थित नहीं हैं.", - "wallet.mismatch.popup.title": "सीमित वॉलेट समर्थन", - "wallet.other": "अन्य वॉलेट", - "wallet.scanToConnect": "कनेक्ट करने के लिए QR कोड स्कैन करें", - "wallet.wrongNet": "आपका वॉलेट ग़लत नेटवर्क से जुड़ा हुआ है.", - "walletConnect.dapps.empty.description": "वॉलेटकनेक्ट के माध्यम से एक कोड स्कैन करके किसी ऐप से कनेक्ट करें", - "walletConnect.dapps.manage.empty.title": "कोई ऐप्स कनेक्ट नहीं है", - "walletConnect.dapps.manage.title": "कनेक्शन", - "walletConnect.error.connection.message": "Uniswap वॉलेट वर्तमान में {{chainNames}}का समर्थन करता है। कृपया इन चेन पर केवल \"{{dappName}}\" का उपयोग करें", - "walletConnect.error.connection.title": "संपर्क त्रुटि", - "walletConnect.error.general.message": "वॉलेटकनेक्ट के साथ एक समस्या थी. कृपया पुन: प्रयास करें", - "walletConnect.error.general.title": "वॉलेटकनेक्ट त्रुटि", - "walletConnect.error.scantastic.message": "आपके QR कोड में कोई समस्या थी। कृपया पुनः प्रयास करें", - "walletConnect.error.scantastic.title": "अमान्य क्यूआर कोड", - "walletConnect.error.unsupported.message": "पुनः प्रयास करने से पहले सुनिश्चित करें कि आप वैध वॉलेटकनेक्ट, एथेरियम पता या यूनिस्वैप एक्सटेंशन क्यूआर कोड स्कैन कर रहे हैं।", - "walletConnect.error.unsupported.title": "अमान्य क्यूआर कोड", - "walletConnect.error.unsupportedV1.message": "वॉलेटकनेक्ट v1 अब समर्थित नहीं है. आप जिस एप्लिकेशन से कनेक्ट करने का प्रयास कर रहे हैं उसे वॉलेटकनेक्ट v2 में अपग्रेड करना होगा।", - "walletConnect.error.unsupportedV1.title": "अमान्य क्यूआर कोड", - "walletConnect.error.uwu.scan": "इस QR कोड को स्कैन करने में एक समस्या थी।", - "walletConnect.error.uwu.title": "UwU लिंक त्रुटि", - "walletConnect.error.uwu.unsupported": "यह QR कोड समर्थित नहीं है.", - "walletConnect.pending.button.connect": "जोड़ना", - "walletConnect.pending.button.reject": "अस्वीकार करना", - "walletConnect.pending.button.scrollDown": "कनेक्ट करने के लिए नीचे स्क्रॉल करें", - "walletConnect.pending.threat.confirmationText": "मैं जोखिम समझता हूं", - "walletConnect.pending.threat.description": "इस ऐप से संदेश या लेनदेन पर हस्ताक्षर करने से धन की हानि हो सकती है।", - "walletConnect.pending.threat.title": "दुर्भावनापूर्ण ऐप का पता चला", - "walletConnect.pending.title": "{{dappName}}से कनेक्ट करें", - "walletConnect.pending.unverified.description": "आगे बढ़ने से पहले सुनिश्चित करें कि आप इस साइट पर भरोसा करते हैं। ", - "walletConnect.pending.unverified.title": "असत्यापित ऐप", - "walletConnect.permissions.option.requestApprovals": "लेन-देन अनुमोदन का अनुरोध करें", - "walletConnect.permissions.option.transferAssets": "Move funds without permission", - "walletConnect.permissions.option.viewTokenBalances": "View your balance and activity", - "walletConnect.permissions.title": "App permissions", - "walletConnect.request.bundledTransactions.label_one": "एकल बंडल लेनदेन", - "walletConnect.request.bundledTransactions.label_other": "{{count}} बंडल लेनदेन", - "walletConnect.request.button.scrollDown": "हस्ताक्षर करने के लिए नीचे स्क्रॉल करें", - "walletConnect.request.button.sign": "संकेत", - "walletConnect.request.details.label.function": "समारोह", - "walletConnect.request.details.label.sending": "भेजना", - "walletConnect.request.details.label.token": "टोकन", - "walletConnect.request.details.label.tokens": "टोकन", - "walletConnect.request.error.insufficientFunds": "इस लेनदेन को पूरा करने के लिए आपके पास पर्याप्त {{currencySymbol}} नहीं है।", - "walletConnect.request.error.network": "इंटरनेट या नेटवर्क कनेक्शन त्रुटि", - "walletConnect.request.warning.batch.message": "सावधान रहें: इस अनुरोध में कई लेनदेन शामिल हैं और इससे संपत्तियां स्थानांतरित हो सकती हैं", - "walletConnect.request.warning.general.message": "सावधान रहें: यह संदेश संपत्ति हस्तांतरित कर सकता है", - "walletConnect.request.warning.message": "संदेशों या लेन-देन पर हस्ताक्षर करने के लिए, आपको वॉलेट के पुनर्प्राप्ति वाक्यांश को आयात करना होगा।", - "walletConnect.request.warning.title": "यह वॉलेट केवल देखने योग्य मोड में है", - "web.explore.description": "{{network}}पर टोकन खोजें और शोध करें। शीर्ष पूल का पता लगाएं। वास्तविक समय की कीमतें, ट्रेडिंग वॉल्यूम, TVL, चार्ट और लेनदेन डेटा देखें।", - "web.explore.title.pools": "Uniswap पर {{network}} पर शीर्ष पूल का अन्वेषण करें", - "web.explore.title.tokens": "Uniswap पर {{network}} पर शीर्ष टोकन खोजें", - "web.explore.title.transactions": "Uniswap पर {{network}} पर शीर्ष लेनदेन देखें" -} diff --git a/packages/uniswap/src/i18n/locales/translations/hu-HU.json b/packages/uniswap/src/i18n/locales/translations/hu-HU.json deleted file mode 100644 index 3265b8f67ee..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/hu-HU.json +++ /dev/null @@ -1,2563 +0,0 @@ -{ - "account.authHeader.claimReward": "Igényeljen {{amount}} jutalmat", - "account.cloud.backup.subtitle": "A {{cloudProviderName}}több helyreállítási kifejezésről van mentve.", - "account.cloud.backup.title": "Válassza ki a visszaállítani kívánt biztonsági másolatot", - "account.cloud.button.restore.android": "Visszaállítás a Google Drive-ból", - "account.cloud.button.restore.ios": "Visszaállítás az iCloudból", - "account.cloud.empty.description": "Úgy tűnik, nem készített biztonsági másolatot a helyreállítási kifejezésekről a {{cloudProviderName}}címre.", - "account.cloud.empty.title": "0 biztonsági mentés található", - "account.cloud.error.backup.message": "Nem sikerült a biztonsági másolatok importálása engedélyek hiánya, az engedélyezés megszakadása vagy felhőhiba miatt", - "account.cloud.error.backup.title": "Hiba a biztonsági másolatok importálása közben", - "account.cloud.error.password.title": "Érvénytelen jelszó. Kérlek próbáld újra.", - "account.cloud.error.unavailable.button.cancel": "Nem most", - "account.cloud.error.unavailable.button.settings": "Menj a beállításokhoz", - "account.cloud.error.unavailable.message.android": "Kérjük, ellenőrizze, hogy olyan Google-fiókba jelentkezett-e be, amelyben a Google Drive engedélyezve van ezen az eszközön, majd próbálja újra.", - "account.cloud.error.unavailable.message.ios": "Kérjük, ellenőrizze, hogy olyan Apple ID-vel jelentkezett-e be, amelyen az iCloud Drive engedélyezve van ezen az eszközön, majd próbálja újra.", - "account.cloud.error.unavailable.title.android": "A Google Drive nem érhető el", - "account.cloud.error.unavailable.title.ios": "Az iCloud Drive nem érhető el", - "account.cloud.loading.title": "Biztonsági másolatok keresése...", - "account.cloud.lockout.time.hours_one": "Túl sok próbálkozás. Próbálja újra 1 óra múlva.", - "account.cloud.lockout.time.hours_other": "Túl sok próbálkozás. Próbálja újra {{count}} óra múlva.", - "account.cloud.lockout.time.minutes_one": "Túl sok próbálkozás. Próbálja újra 1 perc múlva.", - "account.cloud.lockout.time.minutes_other": "Túl sok próbálkozás. Próbálja újra {{count}} perc múlva.", - "account.cloud.password.input": "Írd be a jelszót", - "account.cloud.password.recoveryPhrase": "Ehelyett írja be a helyreállítási kifejezést", - "account.cloud.password.subtitle": "Ez a jelszó szükséges a helyreállítási kifejezés biztonsági másolatának helyreállításához a {{cloudProviderName}}címről.", - "account.cloud.password.title": "Írja be a biztonsági jelszót", - "account.downloadWallet.subtitle": "Készítsen biztonsági másolatot pénztárcájáról, kereskedjen útközben, kapjon élő árértesítéseket és még sok mást.", - "account.drawer.gitHash": "Git hash: ", - "account.drawer.gitVersion": "Változat: ", - "account.drawer.modal.body": "Tárolja és cserélje biztonságosan a tokeneket az Uniswap alkalmazással. Elérhető iOS és Android rendszeren.", - "account.drawer.modal.dont": "Nincs Uniswap pénztárcája?", - "account.drawer.modal.scan": "Szkennelés az Uniswap Wallet segítségével", - "account.drawer.spamToggle": "Ismeretlen tokenek és NFT-k elrejtése", - "account.passkey.delete.acknowledge": "Biztonsági másolatot készítettem a helyreállítási kifejezésemről, és megértettem, hogy a Uniswap Labs nem tud segíteni a pénztárcám visszaszerzésében, ha ezt nem tenném meg.", - "account.passkey.delete.description": "Győződjön meg arról, hogy biztonsági másolatot készített a helyreállítási kifejezésről az Uniswap mobilalkalmazás vagy böngészőbővítmény segítségével.", - "account.passkey.delete.descriptionEmphasized": "A helyreállítási kifejezés nélkül előfordulhat, hogy nem tud hozzáférni pénztárcájához.", - "account.passkey.delete.speedbump.description": "Mielőtt folytatná, hajtsa végre a következő lépéseket, hogy elkerülje a pénztárcájához és az összes pénzeszközhöz való hozzáférését.", - "account.passkey.delete.speedbump.step1": "Töltse le az Uniswap mobilalkalmazást vagy böngészőbővítményt", - "account.passkey.delete.speedbump.step2": "Készítsen biztonsági másolatot a helyreállítási kifejezésről", - "account.passkey.delete.speedbump.title": "biztos vagy ebben?", - "account.passkey.delete.title": "Törli a jelszót?", - "account.passkey.log.in.title": "Bejelentkezés jelszóval", - "account.passkey.type.crossplatform": "Telefon, táblagép vagy biztonsági kulcs", - "account.passkey.type.platform": "Böngésző vagy operációs rendszer", - "account.passkey.verify.button": "Igazolás jelszóval", - "account.passkey.verify.description": "Mielőtt folytatná, kérjük, használja jelszavát személyazonossága igazolására. Ez segít megőrizni fiókja biztonságát.", - "account.passkey.verify.title": "Először is ellenőrizzük, hogy Ön az", - "account.portfolio.activity.canceledBelow": "Ezt a rendelést töröltük, mert egyenlege a bevitt összeg alá csökkent.", - "account.portfolio.activity.signLimit": "Ez a rendelés nem fog teljesülni, mert egyenlege a bevitt összeg alá csökkent. Növelje az egyensúlyt a javításhoz.", - "account.recoveryPhrase.education.part1": "A helyreállítási kifejezés (vagy kezdő kifejezés) szókészlet, amely a pénztárca eléréséhez szükséges, , mint a jelszó.", - "account.recoveryPhrase.education.part2": "beírhatja a helyreállítási kifejezést egy új eszközön , hogy visszaállítsa pénztárcáját és annak tartalmát.", - "account.recoveryPhrase.education.part3": "De ha elveszíti ahelyreállítási kifejezést, akkor elveszíti hozzáférését a pénztárcájához.", - "account.recoveryPhrase.education.part4": "Ahelyett, hogy megjegyezné a helyreállítási kifejezést, biztonsági másolatot készíthet {{cloudProviderName}} értékre, és jelszóval védheti meg.", - "account.recoveryPhrase.education.part5": "A helyreállítási kifejezésről manuálisan is biztonsági másolatot készíthet, ha lejegyzi és biztonságos helyen tárolja.", - "account.recoveryPhrase.education.part6": "Javasoljuk, hogy használjon mindkét típusú biztonsági másolatot, mert ha elveszíti a helyreállítási kifejezést, nem tudja visszaállítani pénztárcáját.", - "account.recoveryPhrase.error.invalid": "Érvénytelen kifejezés", - "account.recoveryPhrase.error.invalidWord": "Érvénytelen szó: {{word}}", - "account.recoveryPhrase.error.phraseLength": "A helyreállítási kifejezésnek 12-24 szóból kell állnia", - "account.recoveryPhrase.error.wordIsAddress": "Címet adott meg, nem helyreállítási kifejezést", - "account.recoveryPhrase.error.wrong": "Hibás helyreállítási kifejezés", - "account.recoveryPhrase.helpText.import": "Hogyan találhatom meg a helyreállítási kifejezést?", - "account.recoveryPhrase.helpText.restoring": "Próbáljon újra keresni", - "account.recoveryPhrase.input": "Írja be a helyreállítási kifejezést", - "account.recoveryPhrase.remove.final.description": "Győződjön meg arról, hogy felírta a helyreállítási kifejezést, vagy biztonsági másolatot készített róla a {{cloudProviderName}}címen. Máskülönben nem férhet hozzá pénzeszközeihez.", - "account.recoveryPhrase.remove.final.title": "Eltávolítja a helyreállítási kifejezést", - "account.recoveryPhrase.remove.import.description": "Egyszerre csak egy helyreállítási kifejezést tárolhat. Az új importálás folytatásához el kell távolítania a jelenlegi helyreállítási kifejezést és a kapcsolódó pénztárcákat erről az eszközről.", - "account.recoveryPhrase.remove.initial.description": "Ezzel eltávolítja pénztárcáját az eszközről a helyreállítási kifejezéssel együtt.", - "account.recoveryPhrase.remove.initial.title": "Eltávolítja a {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "A helyreállítási kifejezés mindaddig tárolva marad, amíg nem törli az összes fennmaradó pénztárcát.", - "account.recoveryPhrase.subtitle.import": "A helyreállítási kifejezés csak helyileg tárolódik az eszközén.", - "account.recoveryPhrase.subtitle.restoring": "Írja be alább a helyreállítási kifejezést, vagy próbálja meg újra megkeresni a biztonsági másolatokat.", - "account.recoveryPhrase.title.import": "Írja be a helyreállítási kifejezést", - "account.recoveryPhrase.title.restoring": "Nem találhatók biztonsági mentések", - "account.wallet.action.copy": "Cím másolása", - "account.wallet.action.manageConnections": "Kapcsolatok kezelése", - "account.wallet.action.report": "Profil bejelentése", - "account.wallet.action.viewExplorer": "Megtekintés itt: {{blockExplorerName}}", - "account.wallet.button.add": "Pénztárca hozzáadása", - "account.wallet.button.addViewOnly": "Adjon hozzá egy csak megtekinthető pénztárcát", - "account.wallet.button.create": "Hozzon létre egy új pénztárcát", - "account.wallet.button.import": "Új pénztárca importálása", - "account.wallet.button.manage": "Pénztárca beállításai", - "account.wallet.button.remove": "Távolítsa el a pénztárcát", - "account.wallet.button.watch": "Vigyázz a pénztárcára", - "account.wallet.create.placeholder": "Pénztárca {{index}}", - "account.wallet.edit.label.input.placeholder": "Pénztárca címke", - "account.wallet.header.button.disabled.title": "Profil szerkesztése", - "account.wallet.header.button.title": "Címke szerkesztése", - "account.wallet.header.viewOnly": "Csak megtekinthető pénztárcák", - "account.wallet.menu.claimUsername": "Felhasználónév igénylése", - "account.wallet.menu.copy.title": "Másolja a pénztárca címét", - "account.wallet.menu.edit.title": "Címke szerkesztése", - "account.wallet.menu.manageConnections": "Kapcsolatok kezelése", - "account.wallet.menu.remove.title": "Távolítsa el a pénztárcát", - "account.wallet.remove.check": "Biztonsági másolatot készítettem a helyreállítási kifejezésemről, és megértettem, hogy a Uniswap Labs nem tud segíteni a pénztárcám visszaszerzésében, ha ezt nem tenném meg.", - "account.wallet.remove.title": "Távolítsa el a {{name}}", - "account.wallet.remove.viewOnly": "A pénztárca címének megadásával bármikor hozzáadhat csak megtekinthető pénztárcákat.", - "account.wallet.restore.new_device.description": "Mivel új eszközt használ, a folytatáshoz vissza kell állítania a helyreállítási kifejezést, vagy meg kell adnia a felhőalapú biztonsági mentés jelszavát.", - "account.wallet.restore.new_device.title": "Szerezd vissza a pénztárcádat", - "account.wallet.restore.seed_phrase.description": "A helyreállítási kifejezés hiányzik az eszközéről. Annak érdekében, hogy soha ne veszítse el a pénzeszközeihez való hozzáférést, vissza kell állítania a pénztárcáját.", - "account.wallet.restore.seed_phrase.title": "Állítsa vissza a pénztárcáját", - "account.wallet.select.error": "Nem sikerült betölteni a címeket", - "account.wallet.select.loading.subtitle": "A pénztárcái lent jelennek meg.", - "account.wallet.select.loading.title": "Pénztárcák keresése", - "account.wallet.select.smartWalletDisclaimer": "Alapértelmezés szerint az összes jogosult pénztárca az importálást követően az intelligens pénztárca funkcióit fogja használni. Mi az az intelligens pénztárca?", - "account.wallet.select.title_one_one": "Egy pénztárcát találtak", - "account.wallet.select.title_one_other": "Válassza ki az importálni kívánt pénztárcákat", - "account.wallet.viewOnly.button": "Import pénztárca", - "account.wallet.viewOnly.description": "A tokenek cseréjéhez, vásárlásához, küldéséhez és fogadásához importálnia kell a pénztárca helyreállítási kifejezését.", - "account.wallet.viewOnly.title": "Ez a pénztárca csak megtekinthető", - "account.wallet.watch.error.alreadyImported": "Ez a cím már importálva van", - "account.wallet.watch.error.notFound": "A cím nem található", - "account.wallet.watch.error.smartContract": "A cím egy intelligens szerződés", - "account.wallet.watch.message": "A csak megtekinthető pénztárca hozzáadásával kipróbálhatja az alkalmazást, vagy nyomon követheti a pénztárcát. Nem cserélhet vagy küldhet pénzt.", - "account.wallet.watch.placeholder": "ENS vagy cím", - "account.wallet.watch.title": "Adja meg a pénztárca címét", - "activity.pending": "{{pendingActivityCount}} Függőben", - "activity.transaction.lpRewards.descriptor": "{{symbol}} jutalmak gyűjtése", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} a {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} {{amountWithSymbolB}}esetén", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} és {{amountWithSymbolB}}", - "addLiquidity.shareOfPool": "A medence részesedése", - "addressInput.recipient": "Befogadó", - "analytics.allow": "Engedélyezze az elemzést", - "analytics.allow.message": "Anonimizált adatokat használunk, hogy javítsuk az Uniswap Labs termékeivel kapcsolatos élményt.", - "appRating.button.notReally": "Nem igazán", - "appRating.description": "Ossza meg velünk, ha jó tapasztalatai vannak ezzel az alkalmazással", - "appRating.extension.review.description": "Válasszon csillagos értékelést, és írjon véleményt a Chrome Internetes áruházban.", - "appRating.extension.review.title": "Áttekinti az Uniswap bővítményt?", - "appRating.extension.title": "Élvezi az Uniswap bővítményt?", - "appRating.feedback.button.send": "Visszajelzés küldése", - "appRating.feedback.description": "Ossza meg velünk, hogyan javíthatjuk az élményét", - "appRating.feedback.title": "Sajnálattal halljuk.", - "appRating.mobile.title": "Tetszik az Uniswap Wallet?", - "bridgedAsset.modal.button": "Folytassa a cserét", - "bridgedAsset.modal.description": "Ez a {{chainName}} verziója a {{currencySymbol}} -nek, amelyet a natív {{currencySymbol}}támogat, és ugyanazt az árat tartja fenn, mint a .", - "bridgedAsset.modal.feature.securelyBacked": "Biztonságosan alátámasztva", - "bridgedAsset.modal.feature.securelyBacked.description": "1:1, natív {{currencySymbol}}támogatással.", - "bridgedAsset.modal.feature.tradeSeamlessly": "Zökkenőmentes kereskedés", - "bridgedAsset.modal.feature.tradeSeamlessly.description": "Vásárolj és adj el {{currencySymbol}} anélkül, hogy elhagynád az Uniswap-et.", - "bridgedAsset.modal.feature.withdrawToNativeChain": "Kifizetés {{nativeChainName}}-ig", - "bridgedAsset.modal.feature.withdrawToNativeChain.description": "Bármikor visszacsatlakozhat a natív hálózathoz.", - "bridgedAsset.modal.title": "Kereskedés {{currencySymbol}} ezen a napon: {{chainName}}", - "bridgedAsset.send.warning.description": "A {{currencySymbol}} egy becsomagolt verzióját küldöd el ekkor: {{chainName}}. Ha egy központosított tőzsdére küldöd, az végleges pénzveszteséget eredményez.", - "bridgedAsset.send.warning.title": "Győződjön meg róla, hogy kompatibilis címre küldi", - "bridgedAsset.tdp.description": "Ez a {{currencySymbol}} áthidalt változata, amelyet 1:1 arányban a natív {{currencySymbol}}támogat.", - "bridgedAsset.wormhole.button": "Tovább a féreglyuk felé", - "bridgedAsset.wormhole.description": "Haladj tovább a féreglyuk portál felé, hogy áthidald a {{currencySymbol}} -t {{chainName}} -ról {{nativeChainName}}-ra.", - "bridgedAsset.wormhole.title": "Kivétel {{currencySymbol}} - {{nativeChainName}}", - "bridgedAsset.wormhole.toNativeChain": "{{nativeChainName}}-ig", - "bridgedAsset.wormhole.withdrawToNativeChain": "Kifizetés {{nativeChainName}}-ig", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "chart.candlestick": "Gyertyatartó", - "chart.error.pools": "Nem lehet megjeleníteni az aktuális készlet előzményadatait.", - "chart.error.tokens": "Nem lehet megjeleníteni az aktuális token előzményadatait.", - "chart.line": "Vonaldiagram", - "chart.missingData": "Hiányzó diagramadatok", - "chart.price.label.close": "Bezárás", - "chart.price.label.high": "Magas", - "chart.price.label.low": "Alacsony", - "chart.price.label.open": "Nyisd ki", - "chart.settings.unavailable.label": "Ez a beállítás nem érhető el az aktuális diagramhoz", - "claim.thanks": "Köszönjük, hogy tagja vagy az Uniswap közösségnek ", - "claim.uni.arrived": "Megérkezett az UNI", - "common.about": "Ról ről", - "common.accept": "Elfogad", - "common.active": "Aktív", - "common.activeNetworks": "Aktív hálózatok", - "common.activity": "Tevékenység", - "common.add.label": "Hozzáadás", - "common.add.liquidity.canceled": "Likviditás hozzáadása törölve", - "common.addLiquidity": "Adjon hozzá likviditást", - "common.address": "Cím", - "common.addressOrENS": "Pénztárca címe vagy ENS neve", - "common.advanced": "Fejlett", - "common.all": "Minden", - "common.allTime": "Mindig", - "common.and": "és", - "common.app": "App", - "common.approved": "Jóváhagyott", - "common.approvePending": "Kérelem folyamatban...", - "common.approvePermitTx": "Kérelem jóváhagyása {{indexText}}", - "common.approvePermitTx.active": "Kérés jóváhagyása{{indexText}} a pénztárcában", - "common.approvePermitTx.explainer": "Mik azok a Permit2 jóváhagyások?", - "common.approvePermitTx.pending": "Kérelem jóváhagyása {{indexText}}...", - "common.approveSpend": "{{symbol}} kiadás jóváhagyása", - "common.approving": "Jóváhagyás", - "common.approximatelyValue": "~{{value}}", - "common.areYouSure": "biztos vagy ebben?", - "common.automatic": "Auto", - "common.availableIn": "Uniswap elérhető: ", - "common.availableOnIOSAndroidChrome": "Elérhető iOS, Android és Chrome rendszeren", - "common.backToPositions": "Vissza a pozíciókhoz", - "common.bestRoute": "Útvonal", - "common.bestRoute.with": "Útvonal {{provider}}-n keresztül", - "common.biometrics.generic": "Biometrikus adatok", - "common.biometrics.touchId": "Érintésazonosító", - "common.biometrics.windowsHello": "Windows Hello", - "common.blocked.ifError": "Ha úgy gondolja, hogy ez hiba, kérjük, küldjön egy e-mailt a címével együtt a címre", - "common.blocked.reason": "Ez a cím le van tiltva az Uniswap Labs felületén, mert egy vagy több letiltott tevékenységhez van társítva.", - "common.blockedAddress": "Letiltott cím", - "common.blog": "Blog", - "common.bought": "Vásárolt", - "common.brandAssets": "Márkaeszközök", - "common.button.accept": "Elfogad", - "common.button.back": "Vissza", - "common.button.buy": "megvesz", - "common.button.cancel": "Megszünteti", - "common.button.checkin": "Becsekkolás", - "common.button.close": "Bezárás", - "common.button.confirm": "megerősít", - "common.button.connect": "Csatlakozás", - "common.button.continue": "Folytatni", - "common.button.copied": "Másolva", - "common.button.copy": "Másolat", - "common.button.create": "Teremt", - "common.button.delete": "Töröl", - "common.button.disable": "Letiltás", - "common.button.disabling": "Letiltás", - "common.button.disconnect": "Leválasztás", - "common.button.dismiss": "Elvetés", - "common.button.done": "Kész", - "common.button.edit": "Szerkesztés", - "common.button.enable": "Engedélyezze", - "common.button.finish": "Befejezés", - "common.button.goBack": "Menjen vissza", - "common.button.later": "Talán később", - "common.button.learn": "Tudj meg többet", - "common.button.next": "Következő", - "common.button.notNow": "Nem most", - "common.button.ok": "rendben", - "common.button.paste": "Paszta", - "common.button.pay": "Fizetés", - "common.button.proceed": "Folytassa", - "common.button.receive": "Kap", - "common.button.remove": "Távolítsa el", - "common.button.reset": "Reset", - "common.button.retry": "Próbálja újra", - "common.button.reveal": "Felfedni", - "common.button.review": "Felülvizsgálat", - "common.button.save": "Megment", - "common.button.scrollDown": "Görgessen le", - "common.button.sell": "Elad", - "common.button.send": "Küld", - "common.button.setup": "Beállít", - "common.button.share": "Ossza meg", - "common.button.showLess": "Mutass kevesebbet", - "common.button.showMore": "Mutass többet", - "common.button.sign": "Jel", - "common.button.skip": "Kihagyás", - "common.button.swap": "Csere", - "common.button.tryAgain": "Próbáld újra", - "common.button.understand": "Megértem", - "common.button.unlock": "Kinyit", - "common.button.view": "Kilátás", - "common.button.viewDetails": "Részletek megtekintése", - "common.button.yes": "Igen", - "common.buy.label": "megvesz", - "common.buyAndSell": "Vásároljon és adjon el Uniswap-on", - "common.cancellationSubmitted": "Lemondás benyújtva", - "common.cancellationSuccessful": "A törlés sikeres", - "common.cancelOrder": "Megrendelés törlése", - "common.card.error.description": "Valami elromlott", - "common.card.error.title": "Hoppá! Valami elromlott.", - "common.careers": "Karrierek", - "common.chain.networkCost": "{{chain}} hálózati költség", - "common.chart": "Diagram", - "common.checkNetwork": "Ellenőrizze a hálózat állapotát itt.", - "common.chromeExtension": "Kiterjesztés", - "common.claim.failed": "A követelés sikertelen", - "common.claimed": "Azt állította", - "common.claiming": "Állítás", - "common.claimUnis": "Igényelje UNI tokenjeit", - "common.clear": "Világos", - "common.close": "Bezárás", - "common.closed": "Zárva", - "common.collect.button": "Gyűjt", - "common.company": "Vállalat", - "common.confirm": "megerősít", - "common.confirmCancellation": "Erősítse meg a törlést", - "common.confirmed": "Megerősített", - "common.confirmSend.button": "Küldés megerősítése", - "common.confirmSwap": "Erősítse meg a cserét a pénztárcában", - "common.confirmTimedOut": "A megerősítés időtúllépést szenvedett. Kérjük, próbálja újra.", - "common.confirmTransfer": "Átutalás megerősítése", - "common.confirmWallet": "Erősítse meg a pénztárcában", - "common.connect.button": "Csatlakozás", - "common.connectAWallet.button": "Csatlakoztasson egy pénztárcát", - "common.connectAWallet.button.evm": "Csatlakoztassa az Ethereum tárcát", - "common.connectAWallet.button.evm.switch": "Válts Ethereum tárcát", - "common.connectAWallet.button.svm": "Csatlakoztassa a Solana pénztárcát", - "common.connectAWallet.button.svm.switch": "Switch Solana pénztárca", - "common.connectAWallet.button.switch": "Pénztárcaváltás", - "common.connectTo": "Csatlakozás a következőhöz: {{platform}}", - "common.connectWallet.button": "Csatlakoztassa a pénztárcát", - "common.contactUs.button": "Lépjen kapcsolatba velünk", - "common.copied": "Másolva", - "common.copy.address": "Cím másolása", - "common.copy.poolId": "Medenceazonosító másolása", - "common.copyLink.button": "Link másolása", - "common.created.date": "Létrehozva {{date}}", - "common.currency": "Valuta", - "common.currentPrice": "Jelenlegi ár", - "common.custom": "Egyedi", - "common.customRange": "Egyedi tartomány", - "common.dataOutdated": "Az adatok elavultak lehetnek", - "common.day": "nap", - "common.default": "Alapértelmezett", - "common.defaultTradeOptions": "Alapértelmezett kereskedési opciók", - "common.deposit.toNetwork": "Befizetési tokenek a {{label}} hálózatba.", - "common.depositing": "Befizetés", - "common.depositTokens": "Befizetési tokenek", - "common.detected": "Észlelve", - "common.developers": "Fejlesztők", - "common.device": "Ez a készülék", - "common.device.other": "Más készülék", - "common.dismiss": "Elvetés", - "common.docs": "Dokumentumok", - "common.donate": "Adományoz", - "common.done": "Kész", - "common.dontShowAgain": "Ne mutasd ezt újra", - "common.download": "Letöltés", - "common.downloadAppStore": "Töltse le az App Store-ból", - "common.downloadPlayStore": "Töltse le a Play Áruházból", - "common.downloadUniswapApp": "Töltse le az Uniswap alkalmazást", - "common.downloadUniswapWallet": "Töltse le az Uniswap Wallet-et", - "common.dynamic": "Dinamikus", - "common.edit.button": "Szerkesztés", - "common.ended": "Véget ért", - "common.error.details": "Hiba részletei", - "common.error.general": "Valami elromlott", - "common.error.label": "Hiba", - "common.error.request": "Sajnáljuk, hiba történt kérésének feldolgozása közben. Ha támogatást kér, feltétlenül másolja át a hiba részleteit.", - "common.error.somethingWrong": "Valami elromlott!", - "common.errorConnecting.error": "Kapcsolati hiba", - "common.errorLoadingData.error": "Hiba az adatok betöltésekor", - "common.etherscan": "Etherscan", - "common.expiry": "Lejárat", - "common.explore": "Fedezd fel", - "common.explorer": "Felfedező", - "common.exploreTokens": "Fedezze fel a tokeneket", - "common.extension": "Uniswap bővítmény", - "common.failedSwitchNetwork": "Nem sikerült a hálózatváltás", - "common.fee": "Díj", - "common.fees": "Díjak", - "common.feesEarned": "Beszerzett díjak", - "common.feesEarnedPerBase": "{{symbolA}} per {{symbolB}}", - "common.for": "Mert", - "common.free": "Ingyenes", - "common.fullRange": "Teljes körű", - "common.getApp": "Alkalmazás beszerzése", - "common.getHelp.button": "Kaphat segítséget", - "common.getStarted": "Kezdje el", - "common.getSupport.button": "Támogatást kapni", - "common.getTheApp": "Szerezd meg az alkalmazást", - "common.getUniswapWallet": "Szerezze be az Uniswap Walletet", - "common.getUniswapWallet.mobile": "Szerezze be az Uniswap mobilalkalmazást", - "common.governance": "Kormányzás", - "common.happyHolidays": "Kellemes ünnepeket kíván az Uniswap csapata!", - "common.help": "Segítség", - "common.helpCenter": "Segítség Központ", - "common.hidden": "Rejtett", - "common.hide.button": "Elrejt", - "common.highPrice": "Magas ár", - "common.includes": "Magába foglalja", - "common.info.label": "Info", - "common.input.noRecipient.error": "Válassza ki a címzettet", - "common.input.password.confirm": "Jelszó megerősítése", - "common.input.password.error.mismatch": "A jelszavak nem egyeznek", - "common.input.password.error.weak": "Ez a jelszó túl gyenge", - "common.input.password.new": "Új jelszó", - "common.input.password.placeholder": "Jelszó", - "common.input.password.strength.medium": "Közepes", - "common.input.password.strength.strong": "Erős", - "common.input.password.strength.weak": "Gyenge", - "common.input.search": "Keresés", - "common.insufficient.funds": "Fedezethiány", - "common.insufficientBalance.error": "Fedezethiány", - "common.insufficientFundsForNetworkFee.error": "Nincs elegendő forrás a hálózati költségek fedezésére", - "common.insufficientTokenBalance.error": "Elégtelen {{tokenSymbol}} egyenleg", - "common.insufficientTokenBalance.error.simple": "Nem elég {{tokenSymbol}}", - "common.invalidPair": "Érvénytelen pár", - "common.invalidRecipient.error": "érvénytelen címzett", - "common.iOSAndroid": "iOS és Android", - "common.language": "Nyelv", - "common.learnMoreSwap": "Tudjon meg többet a swapokról", - "common.legalAndPrivacy": "Jogi és adatvédelem", - "common.less": "Kevesebb", - "common.limit.cancel_one": "Limit törlése", - "common.limit.cancel_other": "Törölje a {{count}} korlátokat", - "common.limit.canceled": "Korlát törölve", - "common.limit.executed": "Limit végrehajtva", - "common.limit.expired": "A limit lejárt", - "common.limit.failed": "A limit nem sikerült", - "common.limit.opened": "Limit nyitva", - "common.limit.pending": "Limit függőben", - "common.limits": "Korlátok", - "common.limits.approachMax": "A maximum 100-hoz közelít", - "common.limits.cancelProceed": "A folytatáshoz törölje a korlátozásokat", - "common.limits.expires": "{{timestamp}}lejár", - "common.limits.open": "Nyitott limitek", - "common.limits.when": "amikor {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "Linkek", - "common.liquidity": "Likviditás", - "common.liquidity.provision": "Likviditási ellátás", - "common.liquidity.removed": "Likviditás eltávolítva", - "common.loading": "Betöltés", - "common.longText.button.less": "Olvass kevesebbet", - "common.longText.button.more": "Olvass tovább", - "common.lowPrice": "Alacsony ár", - "common.manage": "Kezelése", - "common.market.label": "Piac", - "common.marketPrice": "Piaci ár", - "common.marketPrice.fetching": "Piaci ár lekérése...", - "common.marketPrice.label": "Piaci ár:", - "common.marketPrice.unavailable": "A piaci ár nem található. Kérjük, végezzen saját kutatást, hogy elkerülje a pénzvesztést.", - "common.max": "Max", - "common.message": "Üzenet", - "common.migrate": "Vándorol", - "common.migrate.liquidity.failed": "A likviditás migrálása nem sikerült", - "common.migrate.position": "Pozíció áttelepítése", - "common.migrated.liquidity": "Migrált likviditás", - "common.migrating.liquidity": "Likviditás migrációja", - "common.min": "Min", - "common.more": "Több", - "common.moreDetails": "További részletek", - "common.navigation.settings": "Beállítások", - "common.navigation.systemSettings": "Beállítások", - "common.navigationButton": "Navigációs gomb", - "common.needHelp": "Kell segítség?", - "common.networkCost": "Hálózati költség", - "common.neverMind": "Nem fontos", - "common.new": "Új", - "common.new.exclamation": "Új!", - "common.nft": "NFT", - "common.nfts": "NFT-k", - "common.noAmount.error": "Adjon meg egy összeget", - "common.noData": "Nincs adat", - "common.none": "Egyik sem", - "common.noResults": "Nincs találat.", - "common.notAvailableInRegion.error": "Nem érhető el az Ön régiójában", - "common.notCreated.label": "Nem jött létre", - "common.notSupported": "Nem támogatott", - "common.oneDay": "1 nap", - "common.oneDay.short": "1D", - "common.oneHour.short": "1H", - "common.oneMonth": "1 hónap", - "common.oneWeek": "1 hét", - "common.oneYear": "1 év", - "common.opensea.link": "Megtekintés az OpenSea-n", - "common.orderCanceled": "Rendelés lemondva", - "common.orderExecuted": "Megbízás végrehajtva", - "common.orderExpired": "A rendelés lejárt", - "common.orderPending": "Megrendelés függőben", - "common.outOfRange": "Hatótávolságon kívül", - "common.pageNotFound": "Az oldal nem található!", - "common.passkey.count": "Jelszó {{number}}", - "common.passkeys": "Érvények", - "common.passkeys.add": "Adjon hozzá egy jelszót", - "common.passkeys.add.description": "Válassza ki, hová szeretné menteni az új jelszót.", - "common.pastDay": "Múlt nap", - "common.pastFiveMinutes": "Elmúlt öt perc", - "common.pastHour": "Elmúlt óra", - "common.pastMonth": "Múlt hónap", - "common.pastWeek": "Múlt hét", - "common.pastYear": "Múlt év", - "common.pending": "Függőben levő", - "common.pending.cancellation": "Függőben lévő lemondás", - "common.pendingEllipsis": "Függőben levő...", - "common.permit": "Engedély", - "common.plusMore": "+{{number}} több", - "common.pool": "Medence", - "common.pools": "Medencék", - "common.portfolio": "Portfólió", - "common.poweredBy": "Üzemeltető: ", - "common.price": "Ár", - "common.priceUpdated": "Ár frissítve", - "common.privacyChoices": "Az Ön adatvédelmi választásai", - "common.privacyChoices.checkbox.description": "Ha be van jelölve, adatait nem osztjuk meg harmadik fél partnerekkel személyre szabott hirdetés céljából. A megosztást bármikor engedélyezheti, ha törli a négyzet bejelölését.", - "common.privacyChoices.checkbox.label": "Ne oszd meg az információimat", - "common.privacyChoices.description": "Eszközazonosítókat megoszthatunk hirdetési partnereinkkel, hogy szolgáltatásainkat más webhelyeken és platformokon népszerűsítsük. Ahol ez a vonatkozó törvények értelmében értékesítésnek, megosztásnak vagy célzott hirdetésnek minősül, a \"Ne ossza meg adataimat\" négyzet bejelölésével leiratkozhat. Az adatvédelmi gyakorlatunkkal kapcsolatos további információkért tekintse át Adatvédelmi szabályzatunkat.", - "common.privacyChoices.disclaimer": "Kérjük, vegye figyelembe, hogy a választása csak erre a böngészőre vonatkozik ezen az eszközön. Leiratkozhat a szolgáltatásaink eléréséhez használt böngészőben a Globális adatvédelmi beállítások engedélyezésével is. További lehetőségek megtekintéséhez lépjen a beállításokhoz.", - "common.privacyPolicy": "Adatvédelmi irányelvek", - "common.proceed": "Folytassa", - "common.proceedInWallet": "Folytassa a pénztárcájában", - "common.products": "Termékek", - "common.protocol": "Jegyzőkönyv", - "common.protocol.v2": "Unswap v2", - "common.protocol.v3": "Unswap v3", - "common.protocol.v4": "Unswap v4", - "common.purchased": "Vásárolt", - "common.rate": "Mérték", - "common.readMore": "Olvass tovább", - "common.receive": "Kap", - "common.received": "Megérkezett", - "common.recent": "Friss", - "common.refresh": "Frissítés", - "common.reload.label": "Töltse be újra az alkalmazást", - "common.remove.label": "Távolítsa el", - "common.remove.liquidity.canceled": "Törölt likviditás eltávolítása", - "common.remove.liquidity.failed": "A likviditás eltávolítása nem sikerült", - "common.removing.liquidity": "A likviditás eltávolítása", - "common.resetLimit": "Állítsa vissza a {{symbol}} korlátot", - "common.resetLimitWallet": "Állítsa vissza a {{symbol}} korlátot a pénztárcában", - "common.resettingLimit": "{{symbol}} korlát visszaállítása...", - "common.revoke.approval.failed": "A jóváhagyás visszavonása sikertelen", - "common.revoked.approval": "Visszavont jóváhagyás", - "common.revoking.approval": "Jóváhagyás visszavonása", - "common.scanQRDownload": "A letöltéshez olvassa be a QR-kódot telefonjával", - "common.selectRegion.label": "Válassza ki régióját", - "common.selectToken.label": "Válasszon ki egy tokent", - "common.sell.label": "Elad", - "common.send.button": "Küld", - "common.send.failed": "A küldés sikertelen", - "common.sending": "Küldés", - "common.sent": "Küldött", - "common.settings": "Beállítások", - "common.share": "Ossza meg", - "common.share.shareToTwitter": "Megosztás a Twitteren", - "common.show.button": "Előadás", - "common.showLess.button": "Mutass kevesebbet", - "common.showMore.button": "Mutass többet", - "common.signatureExpired": "Az aláírása lejárt.", - "common.signMessage": "Írd alá az üzenetet", - "common.signMessageWallet": "Írja alá az üzenetet a pénztárcában", - "common.socials": "Közösségi média", - "common.sold": "Eladott", - "common.stats": "Statisztika", - "common.status": "Állapot", - "common.step.number": "Lépés {{number}}", - "common.step.number.of": "{{current}} lépés a {{total}}-ből", - "common.swap": "Csere", - "common.swap.expired": "A csere lejárt", - "common.swap.failed": "A csere nem sikerült", - "common.swapPending": "Csere függőben...", - "common.termsOfService": "Szolgáltatás feltételei", - "common.text.connected": "csatlakoztatva", - "common.text.contract": "Szerződés", - "common.text.disconnected": "Szétkapcsolt", - "common.text.error": "Hiba", - "common.text.notAvailable": "N/A", - "common.text.recipient": "Nak nek", - "common.text.sender": "Tól től", - "common.text.unknown": "Ismeretlen", - "common.thisAccount": "ezt a fiókot", - "common.thisMonth": "Ebben a hónapban", - "common.thisToken": "Ezt a jelzőt", - "common.thisWeek": "Ezen a héten", - "common.thisYear": "Idén", - "common.time": "Idő", - "common.time.minute.amt": "{{time}}m", - "common.time.minutes": "percek", - "common.time.past.days": "{{days}} nap", - "common.time.past.days.short": "{{days}}d", - "common.time.past.hours": "{{hours}} óra", - "common.time.past.hours.short": "{{hours}}h", - "common.time.past.minutes.short": "{{minutes}}m", - "common.time.past.months.short": "{{months}}h", - "common.time.past.seconds.short": "{{seconds}}s", - "common.to": "nak nek", - "common.today": "Ma", - "common.tokenA": "Token A", - "common.tokenAmount": "Jelképes összeg", - "common.tokenB": "Token B", - "common.tokenName": "Token név", - "common.tokens": "Tokenek", - "common.totalUniswapTVL": "Összes Uniswap TVL", - "common.totalValueLocked": "TVL", - "common.trade": "Kereskedelmi", - "common.trademarkPolicy": "Védjegypolitika", - "common.transactionDetails": "Tranzakció részletek", - "common.transactionId": "Tranzakció azonosítója", - "common.transactionPending": "Tranzakció függőben", - "common.transactions": "Tranzakciók", - "common.transactionSettings": "Tranzakció beállításai", - "common.transfer_one": "átruházás", - "common.transfer_other": "transzferek", - "common.tryAgain.error": "Próbáld újra", - "common.twitter": "Twitter", - "common.type.label": "típus", - "common.unavailable": "Nem érhető el", - "common.unhide": "Felfed", - "common.unichain": "Unichain", - "common.uniswapMobile": "Uniswap Mobil", - "common.uniswapWallet": "Unswap pénztárca", - "common.uniswapX": "UniswapX", - "common.unknown": "Ismeretlen", - "common.unknownError.error": "Ismeretlen hiba", - "common.unwrap.button": "Kibont", - "common.unwrap.failed": "A kibontás nem sikerült", - "common.unwrapped": "Kibontva", - "common.unwrapping": "Kicsomagolás", - "common.view.profile": "Profil megtekintése", - "common.viewOnExplorer": "Megtekintés az Intézőben", - "common.volume": "Hangerő", - "common.vote": "Szavazás", - "common.wallet.approve": "Jóváhagyás a pénztárcában", - "common.wallet.label": "Pénztárca", - "common.warning": "Figyelem", - "common.webApp": "Webes alkalmazás", - "common.website": "Weboldal", - "common.whyApprove": "Miért kell jóváhagynom egy tokent?", - "common.whySign": "Miért szükségesek az aláírások?", - "common.whyWrap": "Miért kell becsomagolnom a {{symbol}}-t?", - "common.withdraw": "Visszavonás", - "common.withdrawal.amount": "Kivételi összeg", - "common.withinRange": "Hatótávolságban", - "common.wrap": "Burkolj {{symbol}}", - "common.wrap.failed": "A becsomagolás nem sikerült", - "common.wrapIn": "Csomagolja be a {{symbol}} tárcába", - "common.wrapped": "Csomagolt", - "common.wrapping": "Csomagolás", - "common.wrappingToken": "Csomagolás {{symbol}}...", - "common.yesterday": "Tegnap", - "common.your.account.had.insufficient.funds": "Fiókjában nem volt elegendő fedezet a csere végrehajtásához.", - "common.your.account.has.insufficient.funds": "Fiókjában nincs elegendő fedezet a csere végrehajtásához.", - "common.your.connected.wallet": "Az Ön csatlakoztatott pénztárcája", - "common.your.limit.could.not.be.fulfilled": "A korlátot jelenleg nem sikerült teljesíteni. Kérlek próbáld újra.", - "common.your.swap.could.not.be.fulfilled": "A csere jelenleg nem teljesíthető. Kérlek próbáld újra.", - "common.youreBuying": "Vásárolsz", - "common.youReceive": "Megkapod", - "common.youreSelling": "Eladsz", - "currency.ars": "Argentin peso", - "currency.aud": "Ausztrál dollár", - "currency.brl": "brazil real", - "currency.cad": "Kanadai dollár", - "currency.cny": "kínai jüan", - "currency.cop": "Kolumbiai peso", - "currency.eur": "Euro", - "currency.gbp": "Angol font", - "currency.hkd": "hongkongi dollár", - "currency.idr": "indonéz rúpia", - "currency.inr": "indiai rúpia", - "currency.jpy": "japán jen", - "currency.krw": "dél-koreai won", - "currency.mxn": "Mexikói peso", - "currency.ngn": "nigériai Naira", - "currency.pkr": "pakisztáni rúpia", - "currency.rub": "orosz rubel", - "currency.sgd": "szingapúri dollár", - "currency.try": "török líra", - "currency.uah": "Ukrán hrivnya", - "currency.usd": "Amerikai dollár", - "currency.vnd": "vietnami dong", - "dapp.request.actionCannotBeCompleted.description": "Bizonyos funkciók nem érhetők el, mert az okospénztárca beállításait egy másik pénztárcaalkalmazás kezeli.", - "dapp.request.actionCannotBeCompleted.header": "Aláírási kérés", - "dapp.request.actionCannotBeCompleted.title": "A művelet nem hajtható végre", - "dapp.request.approve.action": "Jóváhagy", - "dapp.request.approve.fallbackTitle": "Jóváhagyja ezt a webhelyet a tokenek eléréséhez", - "dapp.request.approve.helptext": "Engedélyezze ennek a webhelynek, hogy hozzáférjen ehhez a tokenhez, és tranzakciókhoz költse el. Győződjön meg arról, hogy megbízik ebben a webhelyben.", - "dapp.request.approve.label": "Pénztárca", - "dapp.request.approve.title": "A {{tokenSymbol}}hozzáférés jóváhagyása", - "dapp.request.base.title": "Tranzakciókérés", - "dapp.request.bridge.description": "Az ETH, USDC és egyebek áthelyezése {{numChains}}+ hálózatokon keresztül.", - "dapp.request.bridge.title": "Megpróbál áthidalni?", - "dapp.request.connect.helptext": "Engedélyezze a webhelynek, hogy megtekintse pénztárcája címét, egyenlegét, és jóváhagyást kérjen a tranzakciókhoz.", - "dapp.request.connect.title": "Csatlakozás a webhelyhez", - "dapp.request.fallback.calldata.label": "Nyers adatok", - "dapp.request.fallback.function.label": "Funkció", - "dapp.request.permit2.description": "A Permit2 több dapp-on keresztül kezeli a token jóváhagyásokat.", - "dapp.request.permit2.header": "Írja alá az engedélyt 2", - "dapp.request.permit2approve.action": "Jóváhagy", - "dapp.request.permit2approve.helptext": "A Permit2 több dapp-on keresztül kezeli a token jóváhagyásokat.", - "dapp.request.permit2approve.title": "Engedély jóváhagyása2", - "dapp.request.reject.action": "Az összes elutasítása", - "dapp.request.reject.info": "{{totalRequestCount}} tranzakciós kérelme van", - "dapp.request.revoke.action": "Visszavonás", - "dapp.request.revoke.helptext": "Engedélyezze a webhelynek, hogy visszavonja a hozzáférést a token tranzakciókhoz való elköltéséhez. Győződjön meg arról, hogy megbízik ebben a webhelyben.", - "dapp.request.revoke.title": "A {{tokenSymbol}}hozzáférésének visszavonása", - "dapp.request.signature.containsUnrenderableCharacters": "Ez az üzenet megjeleníthetetlen karaktereket tartalmaz. Győződjön meg arról, hogy megbízik ebben a webhelyben.", - "dapp.request.signature.decodeError": "Nem sikerült dekódolni az üzenetet", - "dapp.request.signature.header": "Aláírási kérés", - "dapp.request.signature.irregular": "Szabálytalan aláíráskérés", - "dapp.request.signature.irregular.description": "A folytatás előtt győződjön meg arról, hogy megbízik ebben a webhelyben", - "dapp.request.signature.irregular.understand": "Megértem a kockázatokat", - "dapp.request.signature.toggleDataView.raw": "Nyers adatok megtekintése", - "dapp.request.signature.toggleDataView.readable": "Eredeti adatok megtekintése", - "dapp.request.warning.notActive.message": "Győződjön meg róla, hogy a megfelelő", - "dapp.request.warning.notActive.title": "Ez nem az Ön aktív pénztárcája", - "delegation.upgradeModal.description": "Ez a tárcafrissítés intelligens szerződéseket használ a gyorsabb és alacsonyabb költségű tranzakciók érdekében. Tudj meg többet", - "delegation.upgradeModal.enableSmartWallet": "Okospénztárca engedélyezése", - "delegation.upgradeModal.title": "Okosabb cserék, alacsonyabb költségek", - "downloadApp.modal.connectExistingWallet": "Csatlakoztassa a meglévő pénztárcát", - "downloadApp.modal.getStarted.description": "Azonnal hozzáférhet több ezer tokenhez a világ legnagyobb onchain piacterén.", - "downloadApp.modal.getStarted.title": "Kezdje el a cserét másodpercek alatt", - "downloadApp.modal.getTheApp.title": "Kezdje el az Uniswap használatát", - "downloadApp.modal.uniswapProducts.subtitle": "Az Uniswap termékek zökkenőmentesen működnek együtt a legjobb onchain élmény megteremtése érdekében.", - "empty.swap.button.text": "Töltsön fel pénzt a cseréhez", - "error.dataUnavailable": "Az adatok jelenleg nem állnak rendelkezésre; dolgozunk a javításon", - "error.id": "Hibaazonosító: {{eventId}}", - "error.jupiterApi.execute.default.title": "Hiba történt a Jupiter API-val. Kérjük, próbáld újra.", - "error.jupiterApi.failedToLand": "(Kód {{code}}: A tranzakció nem érkezett meg a hálózatra)", - "error.jupiterApi.invalidBlockHeight": "(-1004-es kód: Érvénytelen blokkmagasság)", - "error.jupiterApi.invalidMessageBytes": "(-3. kód: Érvénytelen üzenetbájtok)", - "error.jupiterApi.invalidPayload": "(-2002-es kód: Érvénytelen hasznos adat)", - "error.jupiterApi.invalidSignedTransaction": "(-2. kód: Érvénytelen aláírt tranzakció)", - "error.jupiterApi.invalidTransaction": "(-1002-es kód: Érvénytelen tranzakció)", - "error.jupiterApi.missingCachedOrder": "(-1. kód: Hiányzó gyorsítótárazott rendelés)", - "error.jupiterApi.notFullySigned": "(-1003-as kód: A tranzakció nincs teljesen aláírva)", - "error.jupiterApi.quoteExpired": "Ez az idézet túllépte az időkorlátot, kérjük, próbálja újra. (Kód -2003)", - "error.jupiterApi.unknownErrorCode": "(Kód {{code}})", - "error.noData": "Nem található adat", - "error.request.provideId": "Sajnáljuk, hiba történt kérésének feldolgozása közben. Ha támogatást kér, feltétlenül adja meg hibaazonosítóját.", - "error.tokenApproval": "A token jóváhagyása sikertelen", - "error.tokenApproval.message": "Valószínűleg hálózati vagy kapcsolódási probléma okozta a jóváhagyás sikertelenségét. Ellenőrizze a kapcsolatot, és próbálja újra.", - "error.tokenApprovalEdited": "Elégtelen jóváhagyási összeg", - "error.tokenApprovalEdited.message": "A pénztárcájában beállított jóváhagyási összeg túl alacsony a tranzakció befejezéséhez. Kérjük, próbálja újra, és növelje az összeget.", - "errors.crash.message": "Valami összeomlott.", - "errors.crash.restart": "Indítsa újra az alkalmazást", - "errors.crash.title": "UH Oh!", - "explore.more.pools": "Fedezzen fel további medencéket", - "explore.more.unichain": "Fedezze fel az Unichain medencéit", - "explore.search.label.ownedBy": "{{ownerAddress}}tulajdonosa", - "explore.search.placeholder": "Keresés tokenek és pénztárcák", - "explore.search.section.nft": "NFT gyűjtemények", - "explore.search.section.popularNFT": "Népszerű NFT gyűjtemények", - "explore.search.section.wallets": "Pénztárcák", - "explore.tokens.error": "Nem sikerült betölteni a tokeneket", - "explore.tokens.favorite.action.add": "Kedvenc token", - "explore.tokens.favorite.action.edit": "Kedvencek szerkesztése", - "explore.tokens.favorite.action.remove": "Kedvenc eltávolítása", - "explore.tokens.favorite.title.default": "Kedvenc tokenek", - "explore.tokens.favorite.title.edit": "Szerkessze a kedvenc tokeneket", - "explore.tokens.metadata.marketCap": "{{number}} MCap", - "explore.tokens.metadata.totalValueLocked": "{{number}} TVL", - "explore.tokens.metadata.volume": "{{number}} Köt", - "explore.tokens.sort.label.marketCap": "Piac sapka", - "explore.tokens.sort.label.priceDecrease": "Árcsökkenés", - "explore.tokens.sort.label.priceIncrease": "Ár növekedés", - "explore.tokens.sort.label.totalValueLocked": "TVL", - "explore.tokens.sort.label.volume": "Hangerő", - "explore.tokens.sort.option.marketCap": "Piac sapka", - "explore.tokens.sort.option.priceDecrease": "Árcsökkenés (24H)", - "explore.tokens.sort.option.priceIncrease": "Áremelés (24H)", - "explore.tokens.sort.option.totalValueLocked": "A TVL lecserélése", - "explore.tokens.sort.option.volume": "Unswap hangerő (24H)", - "explore.tokens.top.title": "Legjobb tokenek", - "explore.v2TVL": "v2 TVL", - "explore.v3TVL": "v3 TVL", - "explore.v4TVL": "v4 TVL", - "explore.wallets.favorite.action.add": "Kedvenc pénztárca", - "explore.wallets.favorite.action.edit": "Kedvencek szerkesztése", - "explore.wallets.favorite.action.remove": "Kedvenc eltávolítása", - "explore.wallets.favorite.action.remove.short": "Törlés a kedvencek közül", - "explore.wallets.favorite.title.default": "Kedvenc pénztárcák", - "explore.wallets.favorite.title.edit": "Szerkessze kedvenc pénztárcáját", - "extension.connection.network": "Hálózat", - "extension.connection.networks": "Hálózatok", - "extension.connection.popup.trouble": "Hiba történt a csatlakozással?", - "extension.connection.titleConnected": "csatlakoztatva", - "extension.connection.titleNotConnected": "Nem kapcsolódik", - "extension.lock.button.forgot": "Elfelejtett jelszó?", - "extension.lock.button.reset": "Állítsa vissza a pénztárcát", - "extension.lock.button.submit": "Kinyit", - "extension.lock.password.error": "Rossz jelszó. Próbáld újra", - "extension.lock.password.reset.initial.description": "Az Uniswap nem tud segíteni a jelszó visszaállításában. A 12 szavas helyreállítási kifejezés újbóli megadásával alaphelyzetbe kell állítania pénztárcáját.", - "extension.lock.password.reset.initial.help": "Hol találom a helyreállítási kifejezést?", - "extension.lock.password.reset.initial.title": "Elfelejtetted a jelszavad", - "extension.lock.password.reset.speedbump.description": "Győződjön meg róla, hogy rendelkezik a 12 szavas helyreállítási kifejezéssel, mielőtt visszaállítja a pénztárcáját. Ellenkező esetben nem tudja visszaszerezni a pénzét.", - "extension.lock.password.reset.speedbump.help": "Elvesztettem a helyreállítási mondatomat", - "extension.lock.password.reset.speedbump.title": "Mielőtt folytatná", - "extension.lock.subtitle": "A feloldáshoz adja meg jelszavát", - "extension.lock.title": "Üdv újra", - "extension.network.notSupported": "Nem támogatott hálózat", - "extension.open": "Nyissa meg az Uniswap bővítményt", - "extension.passwordPrompt.error.wrongPassword": "Rossz jelszó. Próbáld újra", - "extension.passwordPrompt.title": "Írd be a jelszavad", - "extension.popup.chrome.button": "Nyissa meg a bővítményt", - "extension.popup.chrome.description": "Hajtsa végre ezt a műveletet az Uniswap bővítmény megnyitásával.", - "extension.popup.chrome.title": "Folytatás az Uniswapban", - "extension.settings.defaultWallet.message": "Alkalmazásokhoz való csatlakozáskor előnyben részesítse az Uniswap bővítményt.", - "extension.settings.defaultWallet.title": "Legyen alapértelmezett pénztárca", - "extension.uninstall.reason.missingFeatures": "Az Uniswap Wallet bizonyos funkciókat nem tartalmaz", - "extension.uninstall.reason.notUsingCrypto": "Nem akarok többé kriptovalutát használni", - "extension.uninstall.reason.other": "Egyéb okok", - "extension.uninstall.reason.switchingWallet": "Másik pénztárcára váltok", - "extension.uninstall.subtitle": "Ha van egy perced, szívesen hallanánk, hogy miért távolítottad el az Uniswap Wallet alkalmazást.", - "extension.uninstall.title": "Szomorúan látjuk, hogy elmész", - "extension.warning.storage.button": "Biztonsági mentés", - "extension.warning.storage.message": "Győződjön meg róla, hogy biztonsági másolatot készít a helyreállítási kifejezésről, nehogy elveszítse hozzáférését pénztárcájához és pénzeszközeihez.", - "extension.warning.storage.title": "Böngészőjének tárhelye kifogy", - "extensionPasskeyLogInPopUp.description": "Importálja Uniswap-fiókját egy meglévő jelszóval való bejelentkezéssel.", - "extensionPasskeyLogInPopUp.invalidReferrer": "Kérjük, zárja be ezt az oldalt, és próbálja újra.", - "fee.bestForCustomizability": "Legjobb a testreszabhatóság szempontjából.", - "fee.bestForExotic": "A legjobb egzotikus pároknak.", - "fee.bestForMost": "A legtöbb pár számára a legjobb.", - "fee.bestForStablePairs": "A legjobb stabil pároknak.", - "fee.bestForVeryStable": "A legjobb nagyon stabil párok számára.", - "fee.dynamic": "Dinamikus díj", - "fee.percentEarned": "Az a %, amelyet díjakból fog keresni.", - "fee.selectPercent": "{{pct}}% kiválaszt", - "fee.selectPercentDescription": "A likviditás {{pct}}%-a választotta ezt a szintet", - "fee.tier": "Díjszint", - "fee.tier.create": "Hozzon létre díjszintet", - "fee.tier.create.button": "Hozzon létre új díjszintet", - "fee.tier.create.description": "Az új szint létrehozása egy új készletben inicializálódik, és a szokásosnál magasabb hálózati költségeket eredményez.", - "fee.tier.description": "A likviditást biztosító keresett összeg. Válassza ki a kockázattűrő képességének és stratégiájának megfelelő összeget.", - "fee.tier.description.v2": "A likviditást biztosító keresett összeg. Minden v2 pool fix 0,3%-os díjakat tartalmaz. További lehetőségekért biztosítson likviditást a 4-es verzióban.", - "fee.tier.dynamic": "Dinamikus díjszint", - "fee.tier.dynamic.create": "Dinamikus díjszint létrehozása", - "fee.tier.dynamic.create.info": "Egy dinamikus díjszintű pool létrehozására készül. Mielőtt folytatná, ellenőrizze, hogy a kiválasztott horog támogatja-e a dinamikus díjakat.", - "fee.tier.highestTvl": "Legmagasabb TVL", - "fee.tier.label": "Az a %, amelyet díjakból fog keresni", - "fee.tier.missing.description": "Nem találja a keresett szintet?", - "fee.tier.new": "Új szint", - "fee.tier.percent.select": "{{percentage}} válassza ki", - "fee.tier.recommended.description": "Javasolt a kiválasztott tokenpár legmagasabb likviditási részesedése alapján.", - "fee.tier.search": "Keressen vagy hozzon létre más díjszinteket", - "fee.tier.search.short": "Keresési szintek", - "fee.tier.select": "Válassza ki a díjszintet", - "fee.tier.select.existing.button": "Válassza ki a meglévő díjszintet", - "fee.tierExact": "{{fee}} díjszint", - "fee.unavailable": "A megkeresett díjak nem láthatók a v2-es pozícióknál, amíg a likviditást meg nem szüntetik.", - "fee.uncollected": "Tartalmazza a be nem fizetett díjakat:", - "fee.uniswap": "Díj ({{percent}})", - "fee.uniswap.description": "A Uniswap szolgáltatással a legjobb felhasználói élmény biztosítása érdekében díjakat számítunk fel.", - "fiatOffRamp.checkout.title": "Visszavonás ide:", - "fiatOffRamp.connection.quote": "Eladás {{amount}} értékben {{currencySymbol}}értékben", - "fiatOffRamp.error.balance": "Túllépi az egyensúlyt", - "fiatOffRamp.error.populateSend.description": "Kérjük, várjon egy pillanatot, és próbálja újra.", - "fiatOffRamp.error.populateSend.title": "Nem sikerült betölteni a tranzakciót", - "fiatOffRamp.summary.total": "{{cryptoAmount}} {{fiatAmount}}esetén", - "fiatOffRamp.unsupportedToken.back": "Menjen vissza", - "fiatOffRamp.unsupportedToken.divider": "Nem támogatott tokenek", - "fiatOffRamp.unsupportedToken.message": "Ennek a tokennek az értékesítése nem támogatott. Cserélje le ezt az eszközt a támogatott tokenek egyikére.", - "fiatOffRamp.unsupportedToken.swap": "Cserélj támogatott tokenre", - "fiatOffRamp.unsupportedToken.title": "Nem támogatott token", - "fiatOffRamp.welcome.tooltip": "Adja el kriptopénzét bankszámlájára vagy betéti kártyájára.", - "fiatOnRamp.button.chooseToken": "Válassza ki a tokent", - "fiatOnRamp.buy.info.description": "Szükséged lesz rá a hálózati költségek fedezésére csere esetén.", - "fiatOnRamp.buy.info.title": "Kezdje az ETH-val", - "fiatOnRamp.cexTransferModal.description": "Az Ön régiójában nem támogatott a kriptokártya vásárlása. Vigyen át eszközöket egy központi csereszámláról, hogy feltöltse pénztárcáját.", - "fiatOnRamp.cexTransferModal.title": "Átvitel az induláshoz", - "fiatOnRamp.checkout.title": "Pénztár", - "fiatOnRamp.chooseMultiPlatformProvider.chooseNetwork": "Hálózat kiválasztása", - "fiatOnRamp.chooseMultiPlatformProvider.description": "Ez fogja meghatározni azt a pénztárca címet, amelyre a pénzeszközöket kapod.", - "fiatOnRamp.chooseProvider.description": "Továbbjut a szolgáltató portáljára, ahol megtekintheti a tranzakciójához kapcsolódó díjakat.", - "fiatOnRamp.completeTransactionHeader": "A tranzakció befejezése {{serviceProvider}}-vel", - "fiatOnRamp.connection.error": "Kapcsolat nem sikerült", - "fiatOnRamp.connection.errorDescription": "Hiba történt a {{serviceProvider}}csatlakoztatásakor.", - "fiatOnRamp.connection.message": "Csatlakoztatja Önt a {{serviceProvider}}-hez", - "fiatOnRamp.connection.quote": "{{amount}} értékű {{currencySymbol}}vásárlása", - "fiatOnRamp.connection.terms": "A folytatással tudomásul veszi, hogy a Általános Szerződési Feltételek és Adatvédelmi szabályzat és {{serviceProvider}}vonatkoznak rád.", - "fiatOnRamp.continueInTab": "A folytatáshoz lépjen a {{serviceProvider}} fülre. Most már biztonságosan bezárhatja ezt a modált.", - "fiatOnRamp.disclaimer": "A folytatással tudomásul veszi, hogy a Általános Szerződési Feltételek és Adatvédelmi szabályzat és {{serviceProvider}}vonatkoznak rád.", - "fiatOnRamp.error.default": "Valami elromlott.", - "fiatOnRamp.error.load": "Nem sikerült betölteni a vásárolni kívánt tokeneket", - "fiatOnRamp.error.max": "Maximum {{amount}}", - "fiatOnRamp.error.min": "Minimum {{amount}}", - "fiatOnRamp.error.noQuotes": "Nem található idézet.", - "fiatOnRamp.error.unavailable": "Ez a szolgáltatás nem érhető el az Ön régiójában", - "fiatOnRamp.error.unsupported": "A régióban nem támogatott", - "fiatOnRamp.error.usd": "Csak USD-ben vásárolható meg", - "fiatOnRamp.noQuotes.error": "Nem található idézet", - "fiatOnRamp.paymentMethods.applePay": "Apple Pay", - "fiatOnRamp.paymentMethods.bank": "Bank", - "fiatOnRamp.paymentMethods.debit": "Bankkártya", - "fiatOnRamp.paymentMethods.googlePay": "Google Pay", - "fiatOnRamp.paymentMethods.paypal": "PayPal", - "fiatOnRamp.paymentMethods.venmo": "Venmo", - "fiatOnRamp.quote.advice": "Továbbjut a szolgáltató portáljára, ahol megtekintheti a tranzakciójához kapcsolódó díjakat.", - "fiatOnRamp.quote.type.list": "{{optionsList}}és egyéb lehetőségek", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "Egy fiókból", - "fiatOnRamp.receiveCrypto.title": "Kap kriptot", - "fiatOnRamp.receiveCrypto.transferFunds": "Finanszírozza pénztárcáját egy másik pénztárcáról vagy számláról történő kriptográfiai átutalással", - "fiatOnRamp.receiveCrypto.useThisAddress": "Használja ezt a címet tokenek fogadásához", - "fiatOnRamp.region.placeholder": "Keresés ország vagy régió szerint", - "fiatOnRamp.region.title": "Válassza ki régióját", - "fiatOnRamp.summary.total": "{{cryptoAmount}} {{fiatAmount}}esetén", - "forceUpgrade.action.backup": "Mentse el a pénztárcáját", - "forceUpgrade.action.confirm": "Frissítse most", - "forceUpgrade.action.learn": "Ismerje meg a frissítés módját", - "forceUpgrade.description.extension": "Elérhető az alkalmazás új verziója. Az Uniswap bővítmény használatának folytatásához frissítse a legújabb verzióra.", - "forceUpgrade.description.wallet": "Elérhető az alkalmazás új verziója. Az Uniswap Wallet használatának folytatásához frissítse a legújabb verzióra.", - "forceUpgrade.label.recoveryPhrase": "Helyreállítási kifejezés", - "forceUpgrade.title": "Frissítés a legújabb verzióra", - "forceUpgrade.title.recommendedStatus": "Új verzió érhető el", - "globalPreferences.title": "Globális preferenciák", - "hero.scroll": "További információért görgessen", - "hero.subtitle": "Vásárolj és adj el kriptovalutákat {{amount}}+ hálózatokon, beleértve az Ethereumot, az Unichaint és a Base-t.", - "hero.swap.title": "Csere bármikor,
bárhol.", - "hidden.nfts.info.banner.text": "További információ a rejtett NFT-kről", - "hidden.nfts.info.text.button": "Rejtett NFT-k ({{numHidden}})", - "hidden.nfts.info.text.extension": "Ezek potenciális csalások és NFT-k, amelyeket elrejtett. Az NFT-re jobb gombbal kattintva felfedheti.", - "hidden.nfts.info.text.mobile": "Ezek potenciális csalások és NFT-k, amelyeket elrejtett. Az NFT-t hosszan lenyomva felfedheti.", - "hidden.nfts.info.text.title": "Rejtett NFT-k", - "hidden.tokens.info.banner.text": "További információ a rejtett tokenekről", - "hidden.tokens.info.text.button": "Rejtett tokenek ({{numHidden}})", - "hidden.tokens.info.text.info": "Ezek potenciális csalások, kis egyenlegek és elrejtett tokenek. A rejtett tokenek nem számítanak bele a pénztárca teljes egyenlegébe.", - "hidden.tokens.info.text.title": "Rejtett tokenek", - "home.activity.empty.button": "Token vagy NFT fogadása", - "home.activity.empty.description.default": "Amikor jóváhagyja, kereskedik vagy átad tokeneket vagy NFT-ket, a tranzakciói itt jelennek meg.", - "home.activity.empty.description.external": "Amikor ez a pénztárca tranzakciókat hajt végre, azok itt jelennek meg.", - "home.activity.empty.title": "Még nincs tevékenység", - "home.activity.error.load": "Nem sikerült betölteni a tevékenységet", - "home.activity.title": "Tevékenység", - "home.banner.offline": "Ön offline módban van", - "home.banner.testnetMode": "Testnet módban van", - "home.banner.testnetMode.nav": "Testnet módban van. Kapcsolja ki ezt a beállításokban.", - "home.empty.cexTransfer": "Átruházás", - "home.empty.cexTransfer.description": "Pénzt mozgatni egy kereskedési platformról.", - "home.empty.transfer": "Kap kriptot", - "home.empty.transfer.description": "Vigyen át pénzt egy másik pénztárcából.", - "home.explore.footer": "Koppintson ide több ezer token, NFT és egyebek felfedezéséhez", - "home.explore.title": "Fedezze fel a tokeneket", - "home.extension.error": "Hiba a fiókok betöltésekor", - "home.label.buy": "megvesz", - "home.label.for": "Vásárlás/eladás", - "home.label.receive": "Kap", - "home.label.send": "Küld", - "home.label.swap": "Csere", - "home.nfts.title": "NFT-k", - "home.tokens.empty.action.buy.description": "Vásároljon bankkártyával vagy bankszámlával.", - "home.tokens.empty.action.buy.title": "Vásároljon kriptot", - "home.tokens.empty.action.import.description": "A csere és a küldés megkezdéséhez írja be a pénztárca helyreállítási kifejezését.", - "home.tokens.empty.action.import.title": "Import pénztárca", - "home.tokens.empty.action.receive.description": "Átutalás másik pénztárcáról vagy számláról.", - "home.tokens.empty.action.receive.title": "Kap kriptot", - "home.tokens.empty.description": "Amikor ez a pénztárca tokeneket vásárol vagy kap, azok itt jelennek meg.", - "home.tokens.empty.title": "Még nincsenek tokenek", - "home.tokens.empty.welcome.description": "Adjon hozzá alapokat a kereskedés megkezdéséhez", - "home.tokens.error.fetch": "Nem sikerült lekérni a token egyenlegeket", - "home.tokens.error.load": "Nem sikerült betölteni a token egyenlegeket", - "home.tokens.title": "Tokenek", - "home.upsell.receive.cta": "Egy fiókból", - "home.upsell.receive.title": "Kap kriptot", - "home.warning.viewOnly": "Ez egy csak megtekinthető pénztárca", - "interface.metatags.description": "Cserélj kriptovalutákat Ethereum, Base, Arbitrum, Polygon, Unichain és más platformokon. A DeFi platform, ahol milliók bíznak.", - "interface.metatags.title": "Uniswap interfész", - "landing.api": "API", - "landing.appsOverview": "Mindenféle cserelehetőséghez tervezve", - "landing.blog.description": "Értesüljön a legfrissebb vállalati hírekről, termékjellemzőkről és sok másról", - "landing.docs.description": "Fedezd fel fejlesztői dokumentációink könyvtárát, hogy elkezdhesd az építést az Uniswap segítségével", - "landing.exploreUniverse": "Fedezd fel az Univerzumot", - "landing.getStarted": "Kereskedj a világ legnagyobb DEX-én", - "landing.helpCenter.body": "Böngésszen a GYIK között, és kérjen támogatást amerikai ügyfélszolgálatunktól", - "landing.protocolDescription": "Az Uniswap Labs a kriptoiparban leggyakrabban használt termékeket működteti. Tapasztalja meg az engedély nélküli hozzáférést, a bizonyított biztonságot és a dedikált támogatást.", - "landing.protocolStats": "Uniswap Protocol statisztikák", - "landing.provideLiquidity.body": "Likviditást biztosít és díjakat szed be az Uniswap felületen keresztül.", - "landing.provideLiquidity.subtitle": "Power onchain piacok.", - "landing.socials": "Kövesd az Uniswap Labs-ot a X, Farcaster, LinkedIn, és TikTokcsatornáin", - "landing.swapBody": "Hozzáférés a mély likviditáshoz, tokenek felfedezése, limit megbízások beállítása, és likviditás biztosítása több ezer token számára {{amount}} láncokon keresztül.", - "landing.swapSubtitle": "Engedély nélküli csere.", - "landing.tradingApi": "Kereskedési API", - "landing.tradingApiBody": "Használja ugyanazt az API-t, amely az Uniswap webalkalmazást és pénztárcát működteti, és amelyben a világ vezető csapatai bíznak.", - "landing.tradingApiButton": "Integrálja az Uniswap API-t", - "landing.tradingApiSubtitle": "DeFi, közvetlenül a felhasználóidnak.", - "landing.trusted": "Milliók bíznak benne", - "landing.unichain.body": "Csatlakozz a közösségépítéshez a gyors, decentralizált Ethereum L2-n, amelyet a DeFi otthonának építettek.", - "landing.unichain.button": "Építés megkezdése", - "landing.unichain.subtitle": "A DeFi lánc.", - "landing.uniswapX.body": "Gázmentes tranzakciók és MEV-védelem, nulla díjjal a sikertelen swapokért.", - "landing.uniswapX.button": "Tapasztalja meg az UniswapX-et", - "landing.uniswapX.subtitle": "Okosabb cserék, nulla súrlódás.", - "landing.walletBody": "A megbízható, saját felügyeletet igénylő kriptovaluta-tárca és -bővítmény több millió letöltéssel, valódi emberek támogatásával és 4,8 értékeléssel.", - "landing.walletSubtitle": "Cserélj, tárolj, fedezz fel.", - "language.afrikaans": "afrikaans", - "language.arabic": "arab", - "language.catalan": "katalán", - "language.chineseSimplified": "Kínai, egyszerűsítve", - "language.chineseTraditional": "Kínai (hagyományos", - "language.czech": "cseh", - "language.danish": "dán", - "language.dutch": "holland", - "language.english": "angol", - "language.finnish": "finn", - "language.french": "Francia", - "language.greek": "görög", - "language.hebrew": "héber", - "language.hindi": "hindi", - "language.hungarian": "magyar", - "language.indonesian": "indonéz", - "language.italian": "olasz", - "language.japanese": "japán", - "language.korean": "koreai", - "language.malay": "maláj", - "language.norwegian": "norvég", - "language.polish": "lengyel", - "language.portuguese": "portugál", - "language.romanian": "román", - "language.russian": "orosz", - "language.serbian": "szerb", - "language.spanishArgentina": "Spanyol (Argentína)", - "language.spanishBelize": "Spanyol (Belize)", - "language.spanishBolivia": "Spanyol (Bolívia)", - "language.spanishChile": "Spanyol (Chile)", - "language.spanishColombia": "Spanyol (Kolumbia)", - "language.spanishCostaRica": "spanyol (Costa Rica)", - "language.spanishCuba": "Spanyol (Kuba)", - "language.spanishDominicanRepublic": "Spanyol (Dominikai Köztársaság)", - "language.spanishEcuador": "Spanyol (Ecuador)", - "language.spanishElSalvador": "Spanyol (Salvador)", - "language.spanishGuatemala": "Spanyol (Guatemala)", - "language.spanishHonduras": "spanyol (Honduras)", - "language.spanishLatam": "spanyol (Latin-Amerika)", - "language.spanishMexico": "Spanyol (Mexikó)", - "language.spanishNicaragua": "spanyol (Nicaragua)", - "language.spanishPanama": "Spanyol (Panama)", - "language.spanishParaguay": "spanyol (Paraguay)", - "language.spanishPeru": "Spanyol (Peru)", - "language.spanishPuertoRico": "spanyol (Puerto Rico)", - "language.spanishSpain": "spanyol (Spanyolország)", - "language.spanishUruguay": "Spanyol (Uruguay)", - "language.spanishUs": "spanyol (USA)", - "language.spanishVenezuela": "spanyol (Venezuela)", - "language.swahili": "szuahéli", - "language.swedish": "svéd", - "language.turkish": "török", - "language.ukrainian": "ukrán", - "language.urdu": "urdu", - "language.vietnamese": "vietnami", - "large.price.difference": "Nagy árkülönbség", - "large.price.difference.tooltip": "A kereskedés folytatása pénzveszteséget eredményez. Ez a különbség nagy tranzakciók vagy alacsony likviditás miatt lehet.", - "limit.open.count_one": "1 nyitott limit", - "limit.open.count_other": "{{count}} nyitott limitek", - "limitPrice.buyingAboveMarketPrice.error.description": "A limitár {{percentage}}%-kal magasabb a piacinál. A folytatáshoz módosítsa a limitárat.", - "limitPrice.buyingAboveMarketPrice.error.title": "{{tokenSymbol}} piaci ár feletti vásárlás", - "limitPrice.marketPriceNotAvailable.error.description": "A jelenlegi piaci árat nem tudjuk kiszámítani. A piaci ár alatti megrendelés elkerülése érdekében ellenőrizze a hálózati kapcsolatot, és próbálja újra.", - "limitPrice.marketPriceNotAvailable.error.title": "Piaci ár nem elérhető", - "limitPrice.sellingBelowMarketPrice.error.description": "A limitár {{percentage}}%-kal alacsonyabb a piacinál. A folytatáshoz módosítsa a limitárat.", - "limitPrice.sellingBelowMarketPrice.error.title": "{{tokenSymbol}} piaci ár alatt eladó", - "limits.form.disclaimer.mainnet": "Csak az Ethereum mainnet tokenek elérhetők a limitekhez. ", - "limits.form.disclaimer.mainnet.short": "Csak Mainnet tokenek állnak rendelkezésre limitekhez.", - "limits.form.disclaimer.uniswapx": "Előfordulhat, hogy a limitek nem érvényesülnek pontosan, amikor a tokenek elérik a megadott árat. ", - "limits.learnMore": "Tudjon meg többet a korlátokról", - "limits.price.input.label": "Amikor 1 ér", - "limits.price.label": "Limit ár", - "limits.selectSupportedTokens": "Válassza ki a támogatott tokeneket", - "liquidity.hooks": "Horgok a v4-en", - "liquidity.hooks.address.input": "Írja be a horog címét", - "liquidity.hooks.address.tooltip": "Hook cím: {{address}}", - "liquidity.learnMoreLabel": "Tudjon meg többet a likviditásbiztosításról", - "liquidity.notEnough.label": "Nincs elég likviditás a pontos USD-érték megjelenítéséhez.", - "liquidity.provideOnProtocols": "Likviditás biztosítása különböző protokollokon", - "liquidityPool.page.title": "Likviditás hozzáadása a{{version}} poolokhoz Uniswap esetén", - "liquidityPool.positions.closed.title": "Zárt pozíciók", - "liquidityPool.positions.loadingMore": "További pozíciók betöltése...", - "liquidityPool.positions.page.title": "{{quoteSymbol}}/{{baseSymbol}} pool likviditás kezelése Uniswap esetén", - "liquidityPool.positions.page.version.description": "Tekintse meg aktív {{version}} likviditási pozícióit. Új pozíciók hozzáadása.", - "liquidityPool.positions.page.version.title": "A{{version}} pool likviditásának kezelése Uniswapon", - "migrate.allowed": "Engedélyezett", - "migrate.allowLpMigration": "LP token migráció engedélyezése", - "migrate.connectAccount": "Csatlakoznia kell egy fiókhoz, amely ezt a pozíciót birtokolja.", - "migrate.connectWallet": "Csatlakozzon egy pénztárcához, hogy megtekinthesse V2 likviditását.", - "migrate.contract": "Unswap migrációs szerződés", - "migrate.firstLP": "Ön az első likviditásszolgáltató ehhez az Uniswap V3-készlethez. Likviditása a jelenlegi {{source}} áron fog migrálni.", - "migrate.highGasCost": "A tranzakciós költsége sokkal magasabb lesz, mivel tartalmazza a medence létrehozásához szükséges gázt.", - "migrate.invalidRange": "Érvénytelen tartomány van kiválasztva. A minimális árnak alacsonyabbnak kell lennie, mint a maximális ár.", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} LP tokenek", - "migrate.migrating": "Migráció", - "migrate.missingV2Position": "Nem látja az egyik v2-pozíciót? Importálja.", - "migrate.noV2Liquidity": "Nem található V2 likviditás.", - "migrate.positionNoFees": "Pozíciód nem jár díjat, és nem használható fel kereskedésekben, amíg a piaci ár be nem költözik a tartományodba.", - "migrate.priceDifference": "Árkülönbség: ", - "migrate.priceWarning": "Csak a megfelelőnek vélt áron helyezzen el likviditást az Uniswap V3-ba.
Ha az ár hibásnak tűnik, vagy cserét hajthat végre az ár mozgatásához, vagy megvárhatja, amíg valaki más megteszi.", - "migrate.refund": "Legalább {{amtA}} {{symA}} és {{amtB}} {{symB}} visszatérítésre kerül a pénztárcájába a kiválasztott ártartomány miatt.", - "migrate.selectFeeTier": "Válassza ki a díjszintet", - "migrate.setRange": "Állítsa be az árkategóriát", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Ár:", - "migrate.v2Description": "Ez az eszköz biztonságosan migrálja a {{source}} likviditását a V3-ra. A folyamat teljesen megbízhatatlan az <0>Uniswap migrációs szerződésnek köszönhetően ↗", - "migrate.v2Instruction": "Minden alább látható készletnél kattintson az áttelepítés gombra, hogy eltávolítsa likviditását az Uniswap V2-ből, és helyezze el a Uniswap V3-ba.", - "migrate.v2Title": "V2 likviditás migrálása", - "migrate.v3Price": "V3 {{sym}} Ár:", - "mint.v3.input.invalidPrice.error": "Érvénytelen árbevitel", - "mobileAppPromo.banner.getTheApp.link": "Töltse le az Uniswap Wallet alkalmazást", - "mobileAppPromo.banner.title": "Unswap: Crypto & NFT Wallet", - "moonpay.poweredBy": "A Fiat rámpát a MoonPay USA LLC működteti", - "nav.createAccount.button": "Hozzon létre fiókot", - "nav.logIn.button": "Jelentkezzen be", - "nav.logInOrConnect.title": "Bejelentkezés vagy csatlakozás", - "nav.products.tradingApi": "Integrálja a protokollt", - "nav.products.unichain": "A DeFi lánc", - "nav.products.uniswapX": "A metaaggregátor", - "nav.products.wallet": "Cserélj, tárolj, fedezz fel", - "nav.signUp.button": "Regisztráljon", - "nav.tabs.createPosition": "Pozíció létrehozása", - "nav.tabs.viewPositions": "Pozíciók megtekintése", - "network.lostConnection": "Lehet, hogy megszakadt a hálózati kapcsolat.", - "network.mightBeDown": "Lehet, hogy a {{network}} jelenleg nem működik, vagy megszakadt a hálózati kapcsolat.", - "network.warning": "Hálózati figyelmeztetés", - "nft.noPools": "Még nincsenek medencék", - "nft.reportSpam": "Jelentés spamként", - "notFound.oops": "Hoppá, vigyél vissza a Swapba", - "notice.uk": "Ez a webalkalmazás eszközként szolgál a felhasználók számára, hogy saját kezdeményezésükre interakcióba léphessenek a Uniswap protokollal, anélkül, hogy jóváhagynák vagy ajánlanák a kriptovaluta kereskedési tevékenységeket. Ennek során az Uniswap nem javasolja a felhasználóknak vagy potenciális felhasználóknak, hogy kriptoeszköz-kereskedelemben vegyenek részt, és a webalkalmazás felhasználói vagy potenciális felhasználói ne tekintsék ezt a weboldalt vagy annak tartalmát olyannak, amely bármilyen formájú ajánlást, meghívást vagy ösztönzést tartalmaz kriptoeszköz-kereskedelemre. .", - "notice.uk.label": "UK felelősségi nyilatkozat:", - "notification.assetVisibility.hidden": "{{assetName}} rejtve", - "notification.assetVisibility.unhidden": "{{assetName}} feloldva", - "notification.buy.network": "Vásárlás {{network}}-on", - "notification.copied.address": "Cím másolva", - "notification.copied.calldata": "Hívásadatok másolva", - "notification.copied.contractAddress": "A szerződés címe másolva", - "notification.copied.failed": "Nem sikerült a vágólapra másolni", - "notification.copied.image": "Kép másolva", - "notification.copied.linkUrl": "Link másolva", - "notification.copied.nftUrl": "NFT URL másolva", - "notification.copied.poolId": "Medenceazonosító másolva", - "notification.copied.tokenUrl": "Token URL másolva", - "notification.copied.transactionId": "Tranzakcióazonosító másolva", - "notification.copied.unitag": "Felhasználónév másolva", - "notification.countryChange": "Átváltva {{countryName}}-ra", - "notification.limit.network": "Limit megbízás létrehozása {{network}}-kor", - "notification.lp.network": "Likviditás biztosítása {{network}}-kor", - "notification.network.changed": "Átváltva {{network}}-ra", - "notification.passwordChanged": "A jelszó megváltozott", - "notification.poolFinder.network": "Medence keresése a {{network}}oldalon", - "notification.restore.success": "A pénztárca helyreállított!", - "notification.sell.network": "Eladás {{network}}áron", - "notification.send.network": "Küldés ekkor: {{network}}", - "notification.smartWallet.disabled": "1 hálózaton letiltva", - "notification.smartWallet.disabled.all": "Okospénztárca letiltva", - "notification.smartWallet.disabled.plural": "Letiltva {{amount}} hálózatokon", - "notification.spam.NFT.failed": "Nem sikerült jelenteni az NFT-t. Próbálja újra később.", - "notification.spam.NFT.successful": "Jelentették", - "notification.swap.network": "Csere {{network}}-ra", - "notification.swap.pending.swap": "Csere függőben", - "notification.swap.pending.unwrap": "Felbontás függőben", - "notification.swap.pending.wrap": "Becsomagolás függőben", - "notification.transaction.approve.canceled": "Törölve {{currencySymbol}} jóváhagyás.", - "notification.transaction.approve.fail": "Nem sikerült a {{currencySymbol}} jóváhagyása a {{address}}használatához.", - "notification.transaction.approve.success": "Jóváhagyva {{currencySymbol}} {{address}}használatához.", - "notification.transaction.pending": "Tranzakció függőben", - "notification.transaction.swap.canceled": "Törölt {{inputCurrencySymbol}}-{{outputCurrencySymbol}} csere.", - "notification.transaction.swap.expired": "A {{inputCurrencyAmountWithSymbol}} {{outputCurrencyAmountWithSymbol}} csere lejárt.", - "notification.transaction.swap.fail": "Nem sikerült a {{inputCurrencyAmountWithSymbol}} cseréje {{outputCurrencyAmountWithSymbol}}értékre.", - "notification.transaction.swap.success": "A {{inputCurrencyAmountWithSymbol}} {{outputCurrencyAmountWithSymbol}}értékre cserélve.", - "notification.transaction.transfer.canceled": "Törölt {{tokenNameOrAddress}} küldés", - "notification.transaction.transfer.fail": "Nem sikerült elküldeni a {{tokenNameOrAddress}} {{walletNameOrAddress}}címre", - "notification.transaction.transfer.received": "{{tokenNameOrAddress}} érkezett a {{walletNameOrAddress}}címről", - "notification.transaction.transfer.success": "{{tokenNameOrAddress}} elküldve a {{walletNameOrAddress}}címre", - "notification.transaction.unknown.fail.full": "Nem sikerült a tranzakció a következővel: {{addressOrEnsName}}", - "notification.transaction.unknown.fail.short": "sikertelen tranzakció", - "notification.transaction.unknown.success.full": "Tranzakció a következővel: {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "Az ügylet megerősítve", - "notification.transaction.unwrap.canceled": "Törölve {{inputCurrencySymbol}} kibontás.", - "notification.transaction.unwrap.fail": "Nem sikerült kicsomagolni {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.unwrap.success": "Kibontva {{inputCurrencyAmountWithSymbol}} és {{outputCurrencyAmountWithSymbol}}érkezett.", - "notification.transaction.wrap.canceled": "Törölt {{inputCurrencySymbol}} wrap.", - "notification.transaction.wrap.fail": "Nem sikerült becsomagolni {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.success": "Becsomagolt {{inputCurrencyAmountWithSymbol}} és {{outputCurrencyAmountWithSymbol}}kapott.", - "notification.transfer.pending": "Küldés függőben", - "notification.walletConnect.confirmed": "A tranzakció megerősítve a következővel: {{dappName}}", - "notification.walletConnect.connected": "csatlakoztatva", - "notification.walletConnect.disconnected": "Szétkapcsolt", - "notification.walletConnect.failed": "A tranzakció sikertelen a következővel: {{dappName}}", - "notification.walletConnect.networkChanged.full": "Átváltva {{networkName}}-ra", - "notification.walletConnect.networkChanged.short": "Kapcsolt hálózatok", - "notifications.scantastic.subtitle": "Folytassa az Uniswap kiterjesztéssel", - "notifications.scantastic.title": "Siker!", - "onboarding.backup.manual.banner": "Javasoljuk, hogy írja fel ezt egy darab papírra, és tárolja biztonságos helyen, például széfben.", - "onboarding.backup.manual.displayWarning.description": "Mielőtt folytatná, figyelmesen olvassa el az alábbiakat.", - "onboarding.backup.manual.displayWarning.note.access": "Ez a helyreállítási kifejezés teljes hozzáférést biztosít pénztárcájához és pénzeszközeihez", - "onboarding.backup.manual.displayWarning.note.secure": "Tekintse meg ezt privátban, és ne ossza meg senkivel", - "onboarding.backup.manual.displayWarning.note.storage": "Írja le és tartsa biztonságos helyen", - "onboarding.backup.manual.displayWarning.title": "Néhány fontos tudnivaló", - "onboarding.backup.manual.error": "Érvénytelen vagy hibásan írt szó", - "onboarding.backup.manual.placeholder": "Titkos világ", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} kész", - "onboarding.backup.manual.selectedWordPlaceholder": "Válassza ki a szót", - "onboarding.backup.manual.subtitle_one": "Mi a {{count}}első szó a helyreállítási kifejezésben?", - "onboarding.backup.manual.subtitle_two": "Mi a {{count}}második szó a helyreállítási kifejezésben?", - "onboarding.backup.manual.subtitle_few": "Mi a {{count}}második szó a helyreállítási kifejezésben?", - "onboarding.backup.manual.subtitle_other": "Mi a {{count}}. szó a helyreállítási kifejezésben?", - "onboarding.backup.manual.title": "Győződjön meg arról, hogy helyesen rögzítette", - "onboarding.backup.option.badge.quick": "Gyors", - "onboarding.backup.option.cloud.description": "Készítsen biztonsági másolatot pénztárcájáról a {{cloudProviderName}}segítségével, amelyet helyreállítási jelszó véd.", - "onboarding.backup.option.cloud.title": "Állítson be helyreállítási jelszót", - "onboarding.backup.option.manual.description": "Rögzítse a 12 titkos szavát egy papírra, és tárolja biztonságos helyen.", - "onboarding.backup.option.manual.title": "Írja le a helyreállítási kifejezést", - "onboarding.backup.reminder.backupNowButton": "Biztonsági mentés most", - "onboarding.backup.reminder.remindMeLaterButton": "Emlékeztess később", - "onboarding.backup.reminder.title": "Mentse el a pénztárcáját", - "onboarding.backup.reminder.warning.description": "Készítsen biztonsági másolatot a pénztárcájáról, hogy visszaszerezhesse a pénzeszközeit, ha elveszíti telefonját, vagy újat vesz.", - "onboarding.backup.reminder.warning.fundsLabel": "Veszélyben lévő alapok", - "onboarding.backup.reminder.warning.title": "Elveszítheti a pénzét", - "onboarding.backup.speedBump.cloud.description": "Ha elfelejtené, nem tudjuk visszaállítani. Írja le biztonságos helyre, vagy tárolja biztonságosan a jelszókezelőben.", - "onboarding.backup.speedBump.cloud.disclaimer": "Megértettem, hogy a Uniswap Labs nem tudja visszaállítani a helyreállítási jelszavamat.", - "onboarding.backup.speedBump.cloud.title": "Fontos, hogy mentse ezt a jelszót", - "onboarding.backup.speedBump.manual.description": "Győződjön meg arról, hogy helyesen írta fel a helyreállítási kifejezést, és van egy biztonságos hely a tárolására.", - "onboarding.backup.speedBump.manual.disclaimer": "Tudomásul veszem, hogy az Uniswap Labs nem tudja visszaszerezni a pénztárcámat, ha ezt elveszítem.", - "onboarding.backup.speedBump.manual.title": "Mielőtt befejezné...", - "onboarding.backup.subtitle": "Így állíthatja vissza pénztárcáját, ha törli az alkalmazást vagy elveszíti eszközét.", - "onboarding.backup.title.existing": "Mentse el a pénztárcáját", - "onboarding.backup.title.new": "Válassza ki a biztonsági mentés módját", - "onboarding.backup.view.subtitle.message1": "Mielőtt folytatná, figyelmesen olvassa el az alábbiakat", - "onboarding.backup.view.subtitle.message2": "A pénztárcája visszaszerzéséhez meg kell adnia mind a 12 titkos szót.", - "onboarding.backup.view.title": "Írja le a helyreállítási kifejezést", - "onboarding.backup.view.warning.message1": "Ez a helyreállítási kifejezés teljes hozzáférést biztosít pénztárcájához és pénzeszközeihez", - "onboarding.backup.view.warning.message2": "Írja le és tartsa biztonságos helyen", - "onboarding.backup.view.warning.message3": "Tekintse meg ezt privátban, és ne ossza meg senkivel", - "onboarding.cloud.confirm.description": "Ezt meg kell adnia az összeg visszaszerzéséhez. Ha elfelejtené, nem tudjuk visszaszerezni.", - "onboarding.cloud.confirm.title": "Erősítse meg helyreállítási jelszavát", - "onboarding.cloud.createPassword.description": "Ezt meg kell adnia az összeg visszaszerzéséhez. Ha elfelejtené, nem tudjuk visszaszerezni.", - "onboarding.cloud.createPassword.title": "Hozza létre helyreállítási jelszavát", - "onboarding.complete.button": "Nyissa meg az Uniswap bővítményt", - "onboarding.complete.description": "Pénztárcája készen áll a kriptográfia küldésére és fogadására. Nyissa meg az Uniswap bővítményt az alábbi parancsikonnal.", - "onboarding.complete.go_to_uniswap": "Nyissa meg az Uniswap webalkalmazást", - "onboarding.complete.pin.description": "Kattintson a kitűző ikonra az Uniswap bővítmény hozzáadásához az eszköztárhoz.", - "onboarding.complete.pin.title": "Pin Uniswap bővítmény", - "onboarding.complete.title": "Minden készen áll", - "onboarding.extension.biometrics.subtitle.fingerprint": "Gyorsan és biztonságosan hozzáférhetsz pénztárcádhoz, csupán az ujjlenyomatoddal.", - "onboarding.extension.biometrics.title": "{{biometricsMethod}}engedélyezése", - "onboarding.extension.password.subtitle": "Erre a pénztárca feloldásához és a helyreállítási kifejezés eléréséhez lesz szüksége", - "onboarding.extension.password.title.default": "Jelszó létrehozása", - "onboarding.extension.password.title.reset": "Állítsd vissza a jelszavad", - "onboarding.extension.unsupported.android.description": "Az Uniswap bővítmény csak az asztali Chrome-mal kompatibilis.", - "onboarding.extension.unsupported.android.title": "A Chrome mobileszközön nem támogatott (még)", - "onboarding.extension.unsupported.description": "Az Uniswap bővítmény jelenleg csak a Chrome-mal kompatibilis.", - "onboarding.extension.unsupported.title": "Ez a böngésző nem támogatott (még)", - "onboarding.home.intro.backup.description.extension": "Mentsd el a helyreállítási kódodat, hogy soha ne veszítsd el a hozzáférést a pénztárcádhoz.", - "onboarding.home.intro.backup.description.mobile": "Készítsen helyreállítási tervet arra az esetre, ha elveszítené telefonját, vagy újat kapna.", - "onboarding.home.intro.backup.title": "Mentse el a pénztárcáját", - "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK és JUP — mostantól elérhető az Unichainen", - "onboarding.home.intro.bridgedAssets.title": "Új tokeneket kereskedhetsz az Unichainen", - "onboarding.home.intro.fund.description": "Finanszírozza pénztárcáját kriptovásárlással vagy másik számláról történő átutalással.", - "onboarding.home.intro.fund.title": "Szerezd meg az első tokenedet", - "onboarding.home.intro.label.required": "Kívánt", - "onboarding.home.intro.label.swipe": "Elcsór", - "onboarding.home.intro.pushNotifications.description": "Értesítéseket kaphat a kedvenc tokenekről, a piaci trendekről és egyebekről.", - "onboarding.home.intro.pushNotifications.title": "Maradjon tájékozott", - "onboarding.home.intro.unitag.description": "Hozzon létre egy személyre szabott web3-profilt, és egyszerűen ossza meg címét barátaival.", - "onboarding.home.intro.unitag.title": "Igényelje {{unitagDomain}} felhasználónevét", - "onboarding.import.error.invalidWords_one": "1 szó érvénytelen vagy hibásan van írva", - "onboarding.import.error.invalidWords_other": "A {{count}} szavak érvénytelenek vagy hibásan vannak írva", - "onboarding.import.method.restore.message.android": "Adja hozzá azokat a pénztárcákat, amelyekről biztonsági másolatot készített Google Drive-fiókjába.", - "onboarding.import.method.restore.message.ios": "Adja hozzá azokat a pénztárcákat, amelyekről biztonsági másolatot készített iCloud-fiókjába.", - "onboarding.import.method.restore.title": "Állítsa vissza a pénztárcát", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.android": "Add meg a helyreállítási jelszavadat a pénztárca Google Drive biztonsági mentésén keresztüli visszaállításához.", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.ios": "Add meg a helyreállítási jelszavadat a pénztárca iCloud biztonsági mentésen keresztüli visszaállításához.", - "onboarding.import.method.restoreSeedPhrase.cloud.title.android": "Visszaállítás a Google Drive-ból", - "onboarding.import.method.restoreSeedPhrase.cloud.title.ios": "Visszaállítás az iCloudból", - "onboarding.import.method.restoreSeedPhrase.title": "Válassza ki a pénztárca visszaállításának módját", - "onboarding.import.method.restoreSeedPhrase.wallet.desc": "Add meg a 12 titkos szavad, amit korábban biztonságos helyen tároltál.", - "onboarding.import.method.restoreSeedPhrase.wallet.title": "Írja be a helyreállítási kifejezést", - "onboarding.import.method.viewPrivateKeys.button.desc": "Tekintse meg a privát kulcsát", - "onboarding.import.method.viewPrivateKeys.title": "Nincs meg a fentiek közül egyik sem? ", - "onboarding.import.onDeviceRecovery.other_options": "Hozzon létre vagy importáljon másik pénztárcát", - "onboarding.import.onDeviceRecovery.other_options.label": "Nem szeretnél a fentiek közül semmit?", - "onboarding.import.onDeviceRecovery.subtitle": "Válassza ki, melyik pénztárcába szeretne újra bejelentkezni.", - "onboarding.import.onDeviceRecovery.title": "Üdvözöljük újra az Uniswapban", - "onboarding.import.onDeviceRecovery.wallet.button": "A helyreállítási kifejezés megtekintése", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 másik pénztárca", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} egyéb pénztárcák", - "onboarding.import.onDeviceRecovery.warning.caption": "Kérjük, győződjön meg róla, hogy az összes többi pénztárcáról biztonsági másolatot készített. Ha valaha is vissza szeretné állítani őket, szüksége lesz a helyreállítási kifejezéseikre vagy a megfelelő {{cloudProvider}} biztonsági másolatokra.", - "onboarding.import.onDeviceRecovery.warning.title": "biztos vagy ebben?", - "onboarding.import.selectMethod.errorMessage": "Váratlan hiba történt. Kérjük, próbálja újra.", - "onboarding.import.selectMethod.mobileApp.subtitle": "Importáljon pénztárcát a mobilalkalmazásból QR-kóddal.", - "onboarding.import.selectMethod.mobileApp.title": "Használja az Uniswap Mobile-t", - "onboarding.import.selectMethod.passkey.subtitle": "Szinkronizálja Uniswap pénztárcáját egy meglévő jelszóval.", - "onboarding.import.selectMethod.passkey.title": "Bejelentkezés jelszóval", - "onboarding.import.selectMethod.recoveryPhrase.subtitle": "Importálás másik kriptotárcából.", - "onboarding.import.selectMethod.recoveryPhrase.title": "Írja be a helyreállítási kifejezést", - "onboarding.import.selectMethod.title": "Bejelentkezés vagy pénztárca importálása", - "onboarding.import.title": "Válassza ki, hogyan szeretné hozzáadni pénztárcáját", - "onboarding.importMnemonic.button.default": "A helyreállítási kifejezésem 12 szó", - "onboarding.importMnemonic.button.importing": "Importálás...", - "onboarding.importMnemonic.button.longPhrase": "A helyreállítási mondatom hosszabb", - "onboarding.importMnemonic.error.invalidPhrase": "A megadott kifejezés érvénytelen", - "onboarding.importMnemonic.subtitle": "Írja be vagy illessze be a 12 szavas helyreállítási kifejezést", - "onboarding.importMnemonic.title": "Írja be a helyreállítási kifejezést", - "onboarding.importPasskey.bringWindowToFront": "Hozd az ablakot előre", - "onboarding.importPasskey.continueInSecureWindow": "Folytassa a biztonságos bejelentkezési ablakban.", - "onboarding.intro.button.alreadyHave": "Már van pénztárcám", - "onboarding.intro.button.logInOrImport": "Bejelentkezés vagy importálás", - "onboarding.intro.mobileScan.button": "Az importáláshoz olvassa be a QR-kódot", - "onboarding.intro.mobileScan.title": "Rendelkezik Uniswap alkalmazással?", - "onboarding.landing.button.add": "Adjon hozzá egy meglévő pénztárcát", - "onboarding.landing.button.create": "Hozzon létre egy pénztárcát", - "onboarding.landing.button.createAccount": "Hozzon létre egy fiókot", - "onboarding.name.choose": "Válasszon felhasználónevet", - "onboarding.name.choose.subtitle": "Ez egy nyilvános név, amelyet bárki használhat kriptográfiai adatok küldésére.", - "onboarding.notification.permission.message": "Értesítések fogadásához kapcsolja be az Uniswap Wallet értesítéseit az eszköz beállításaiban.", - "onboarding.notification.permission.title": "Értesítési engedély", - "onboarding.notification.subtitle": "Legyen naprakész a tranzakciók állapotáról és a kedvenc tokenek főbb árváltozásairól.", - "onboarding.notification.title": "Kapcsolja be az értesítéseket", - "onboarding.passkey.create": "Hozd létre a jelszót", - "onboarding.passkey.loading.subtitle": "Ez csak egy másodpercet vesz igénybe.", - "onboarding.passkey.loading.title": "Megtalálni a pénztárcáját...", - "onboarding.passkey.secure": "Biztosítsa fiókját", - "onboarding.passkey.secure.description": "A jelszavak segítségével gyorsan és biztonságosan hozzáférhet fiókjához csupán az arc vagy az ujjlenyomat használatával.", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "Győződjön meg arról, hogy jól tette. Ha elveszíti vagy hibásan írja le, akkor nem tudja visszaszerezni az összeget.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "Ha elveszíti vagy hibásan írja le, akkor nem tudja visszaszerezni az összeget.", - "onboarding.recoveryPhrase.confirm.title": "Győződjünk meg arról, hogy jól tetted", - "onboarding.recoveryPhrase.view.subtitle": "A pénztárcája visszaszerzéséhez meg kell adnia mind a 12 titkos szót.", - "onboarding.recoveryPhrase.view.title": "Írja le a helyreállítási kifejezést", - "onboarding.recoveryPhrase.view.title.hasPassword": "Ha valaha elfelejtené jelszavát...", - "onboarding.recoveryPhrase.warning.final.button": "készen állok", - "onboarding.recoveryPhrase.warning.final.message": "A helyreállítási kifejezés az, ami hozzáférést biztosít Önnek (és bárkinek, aki rendelkezik ezzel) a pénzeszközökhöz. Feltétlenül tartsa meg magának.", - "onboarding.recoveryPhrase.warning.final.title": "Ezt a lépést privát helyen végezze el", - "onboarding.recoveryPhrase.warning.screenshot.message": "Bárki, aki hozzáfér a fényképeihez, hozzáférhet pénztárcájához. Javasoljuk, hogy inkább írja le szavait.", - "onboarding.recoveryPhrase.warning.screenshot.title": "A képernyőképek nem biztonságosak", - "onboarding.resetPassword.complete.safety": "Tudjon meg többet a pénztárca biztonságáról", - "onboarding.resetPassword.complete.subtitle": "Használja új jelszavát a pénztárca feloldásához.", - "onboarding.resetPassword.complete.title": "Jelszó visszaállítása", - "onboarding.scan.error": "Hiba történt a QR-kód betöltésekor", - "onboarding.scan.otp.error": "A beküldött kód helytelen, vagy hiba történt a beküldés során. Kérlek próbáld újra.", - "onboarding.scan.otp.failed": "Sikertelen próbálkozások: {{number}}", - "onboarding.scan.otp.subtitle": "Nézze meg Uniswap mobilalkalmazásában a 6 karakteres kódot", - "onboarding.scan.otp.title": "Adja meg az egyszeri kódot", - "onboarding.scan.subtitle": "A pénztárca importálásának megkezdéséhez olvassa be a QR-kódot az Uniswap mobilalkalmazással.", - "onboarding.scan.title": "Importáljon pénztárcát az alkalmazásból", - "onboarding.scan.troubleScanning.message": "Importálás helyreállítási kifejezéssel", - "onboarding.scan.troubleScanning.title": "Hiba történt a beolvasással?", - "onboarding.scan.wifi": "Csatlakoztassa telefonját ugyanahhoz a WiFi hálózathoz, mint a számítógépéhez.", - "onboarding.security.alert.biometrics.message.android": "A biometrikus adatok használatához először állítsa be a beállításokban", - "onboarding.security.alert.biometrics.message.ios": "A {{biometricsMethod}}használatához engedélyezze a hozzáférést a rendszerbeállításokban", - "onboarding.security.alert.biometrics.title.android": "A biometria le van tiltva", - "onboarding.security.alert.biometrics.title.ios": "A {{biometricsMethod}} le van tiltva", - "onboarding.security.button.confirm.android": "Biometrikus adatok engedélyezése", - "onboarding.security.button.confirm.ios": "{{biometricsMethod}}engedélyezése", - "onboarding.security.button.setup": "Beállít", - "onboarding.security.subtitle.android": "A tranzakciók elküldéséhez biometrikus adatokat írjon elő, és növelheti a biztonságot.", - "onboarding.security.subtitle.ios": "A tranzakciók küldéséhez a {{biometricsMethod}} megköveteli a további biztonsági réteget.", - "onboarding.security.title": "Védje pénztárcáját", - "onboarding.selectWallets.error": "Nem sikerült betölteni a címeket", - "onboarding.selectWallets.title.default": "Válassza ki az importálandó pénztárcákat", - "onboarding.selectWallets.title.error": "Hiba a pénztárcák importálásakor", - "onboarding.termsOfService": "A folytatással elfogadom a Általános Szerződési Feltételeket és a Adatvédelmi szabályzatot", - "onboarding.tooltip.recoveryPhrase.trigger": "Mi a helyreállítási kifejezés?", - "onboarding.wallet.continue": "Vigyázzunk rá", - "onboarding.wallet.defaultName": "Pénztárca {{number}}", - "onboarding.wallet.description.full": "Ez az Ön személyes tere a tokeneknek, NFT-knek és az összes kereskedésének. Fejezze be a beállítást, hogy pénzei biztonságban legyenek.", - "onboarding.wallet.title": "Üdvözöljük új pénztárcájában", - "onboarding.welcome.subtitle": "Végezzük el a pénztárca beállítását.", - "onboarding.welcome.title": "Üdvözöljük!", - "outageBanner.message": "A {{chainName}}{{versionDescription}} adat jelenleg nem érhető el, de várhatóan a probléma hamarosan megoldódik.", - "outageBanner.message.sub": "Továbbra is probléma nélkül cserélhet és biztosíthat likviditást ezen a láncon.", - "outageBanner.title": "{{versionName}} hamarosan visszatér", - "passkeys.help.modal.subtitle": "Ha problémái vannak a jelszóval, keresse fel az Uniswap ügyfélszolgálatát segítségért.", - "passkeys.help.modal.subtitle.invalidPasskey": "Kérését nem sikerült teljesíteni. Kérjük, próbálja újra a következőhöz társított jelszó használatával ", - "passkeys.help.modal.subtitle.technicalError": "Kérését váratlan technikai hiba miatt nem lehetett teljesíteni. Pénzei biztonságban vannak. Kérjük, próbálja újra.", - "passkeys.help.modal.title": "Kell segítség?", - "passkeys.help.modal.title.invalidPasskey": "Érvénytelen jelszó", - "passkeys.help.modal.title.technicalError": "Műszaki hiba", - "passkeys.manage.modal.subtitle": "Jelszó hozzáadásához vagy eltávolításához jelentkezzen be a {{passkeyManagementUrl}}címre.", - "passkeys.manage.modal.title": "Jelszók kezelése", - "permit.approval.fail": "Az engedély jóváhagyása sikertelen", - "permit.approval.fail.message": "A Permit2 lehetővé teszi a token jóváhagyások megosztását és kezelését különböző alkalmazások között.", - "pool.activeRange": "Aktív kullancs tartomány", - "pool.addAs": "Hozzáadás mint {{nativeWrappedSymbol}}", - "pool.apr": "ÁPRILIS", - "pool.apr.base": "Alap THM", - "pool.apr.description": "Évesített 1 napi díj alapján", - "pool.apr.reward": "Jutalom THM", - "pool.aprText": "Medence THM", - "pool.balances": "Pool egyenlegek", - "pool.closedCTA.description": "Megtekintheti őket az oldal tetején található szűrő használatával.", - "pool.closedCTA.title": "Zárt pozícióit keresi?", - "pool.collectAs": "Gyűjtés {{nativeWrappedSymbol}}-ként", - "pool.collectFees": "Díjak beszedése", - "pool.connectEthereumToView": "Csatlakoztasson egy Ethereum-tárcát a poolok megtekintéséhez", - "pool.create": "Új medence létrehozása", - "pool.create.info": "Az Ön választása új likviditási készletet hoz létre, amely alacsonyabb kezdeti likviditást és megnövekedett volatilitást eredményezhet. E kockázatok minimalizálása érdekében fontolja meg egy meglévő készlet hozzáadását.", - "pool.createdPosition": "Létrehozva pozíció", - "pool.createdPosition.canceled": "Pozíció létrehozása megszakítva", - "pool.createdPosition.failed": "A pozíció létrehozása nem sikerült", - "pool.dynamic": "Dinamikus medence", - "pool.earnings": "Kereset", - "pool.earnings.empty": "Még nincs bevétele", - "pool.explorers": "Felfedezők", - "pool.import": "Medence importálása", - "pool.import.link.description": "Egyes v2-pozíciók nem jelennek meg automatikusan.", - "pool.import.positions.v2": "V2 pozíciók importálása", - "pool.import.positions.v2.selectPair.description": "Egyes v2-pozíciók nem jelennek meg automatikusan. Válasszon ki egy tokenpárt az importáláshoz és a pozíciók megtekintéséhez.", - "pool.import.success": "Medence importálva", - "pool.incentives.administeredRewards": "A jutalmakat az autonóm Merkl Distributor szerződés alapján osztják szét.", - "pool.incentives.collect": "Gyűjt", - "pool.incentives.collectedRewards": "Gyűjtött jutalmak", - "pool.incentives.collectFailed": "A begyűjtés sikertelen, próbálkozzon újra.", - "pool.incentives.collectFailedNoRetry": "A jutalmak begyűjtése nem sikerült.", - "pool.incentives.collectingRewards": "Jutalmak gyűjtése", - "pool.incentives.collectRewards": "Gyűjts jutalmakat", - "pool.incentives.collectRewardsCanceled": "Jutalmak gyűjtése lemondva", - "pool.incentives.daysLeft": "napok vannak hátra", - "pool.incentives.eligible": "A jogosult poolok jelképes jutalmakkal rendelkeznek, így többet kereshet", - "pool.incentives.merklDocs": "Merkl a kibocsátási jutalmakból és a pool TVL-ből számolta ki.", - "pool.incentives.rewardsDistribution": "Jutalomosztás", - "pool.incentives.rewardsEarned": "Megszerzett jutalmak", - "pool.incentives.similarPoolHasRewards": "Egy hasonló medence UNI jutalmakkal rendelkezik", - "pool.incentives.switchPools": "Válts medencéket", - "pool.incentives.timePeriod": "Időszak", - "pool.incentives.uni.findMore": "Keressen medencéket UNI jutalmakkal", - "pool.incentives.yourRewards.error": "Jutalmai jelenleg nem érhetők el", - "pool.incentives.yourRewards.error.description": "A jutalmakat nem lehetett lekérni. Ennek oka lehet hálózati probléma. Próbáld meg újratölteni az oldalt.", - "pool.info": "Medence információk", - "pool.limitFluctuation.warning": "Kérjük, vegye figyelembe, hogy a limitek végrehajtása a valós idejű piaci ingadozások és az Ethereum hálózat torlódásai miatt változhat. Előfordulhat, hogy a limitek nem érvényesülnek pontosan, amikor a tokenek elérik a megadott árat.", - "pool.liquidity.data.error.message": "Hiba történt a tranzakcióhoz szükséges adatok lekérésekor.", - "pool.liquidity.outOfSync": "A medence és a piaci ár nem egyezik", - "pool.liquidity.outOfSync.message": "Ebben a készletben az árak különböznek a kiválasztott tokenek piaci árától. Ennek megfelelően állítsa be az ártartományt, vagy várja meg, amíg a medence egyensúlyba kerül a veszteségek elkerülése érdekében.", - "pool.maxPrice": "Max ár", - "pool.migrateLiquidity": "Likviditás migrálása", - "pool.migrateLiquidityDisabledTooltip": "Ez a lánc nem támogatja a v4 likviditási poolokat.", - "pool.migrateToV4": "Migráció v4-re", - "pool.minPrice": "Minimális ár", - "pool.newPosition.plus": "+ Új pozíció", - "pool.newPosition.title": "Új pozíció", - "pool.newSpecificPosition": "Új {{symbol}} pozíció", - "pool.notAvailableOnSolana": "A Solanán nem állnak rendelkezésre medencék.", - "pool.notFound.description": "Sajnáljuk, nem találunk információt erről a készletről. Ellenőrizze a nevet és címet, majd próbálja újra.", - "pool.notFound.title": "A medence nem található", - "pool.openToStart.evmAndSolanaConnected": "Nyisson új pozíciót, vagy hozzon létre egy poolt a kezdéshez. Poolok nem érhetők el a Solana-n.", - "pool.openToStart.evmOnly": "A kezdéshez nyisson új pozíciót vagy hozzon létre egy készletet.", - "pool.percent": "{{pct}}% pool", - "pool.pooled": "Összevonva {{sym}}:", - "pool.position": "Pozíció", - "pool.positions": "Pozíciók", - "pool.positions.title": "A pozícióid", - "pool.positions.transaction.settings": "Tranzakció beállításai", - "pool.positions.usdValueUnavailable": "USD érték nem érhető el", - "pool.positions.usdValueUnavailable.tooltip": "USD érték jelenleg nem érhető el ehhez a pozícióhoz. Lásd a pozíció részleteit a befizetett token összegekről.", - "pool.refresh.prices": "Frissítse az árakat", - "pool.removeLiquidity": "Távolítsa el a likviditást", - "pool.rewardAPR": "Jutalom THM (UNI)", - "pool.rewardAPR.percent": "{{pct}} jutalom THM", - "pool.rewards": "Jutalmak", - "pool.rewardsPool.label": "Pool tokenek a jutalom poolban:", - "pool.selectPair": "Válasszon párat", - "pool.share.label": "Az Ön medencerészesedése:", - "pool.specificPosition": "{{symbol}} pozíció", - "pool.tokenPair": "Token pár", - "pool.top.rewards": "Medence jutalommal", - "pool.top.tvl": "A legjobb medencék a TVL-től", - "pool.top.volume": "Medencék 24 órás mennyiség szerint", - "pool.totalAPR": "Teljes THM", - "pool.totalTokens": "Az összes készlet token:", - "pool.v2": "v2 poolok", - "pool.v3": "v3 poolok", - "pool.via": "{{tokenPair}} {{dex}}-on keresztül", - "pool.volOverTvl": "1D vol/TVL", - "pool.volume.thirtyDay": "30 napos mennyiség", - "pool.volume.thirtyDay.short": "30D köt", - "pool.withdrawAs": "Visszavonás {{nativeWrappedSymbol}}-ként", - "poolFinder.availablePools": "Rendelkezésre álló medencék", - "poolFinder.availablePools.found.description": "v2 poolok, amelyek megfelelnek a párválasztásnak.", - "poolFinder.availablePools.notFound.description": "Nem található megfelelő v2-készlet. Ellenőrizze még egyszer a token kiválasztását, és győződjön meg arról, hogy a megfelelő pénztárcához csatlakozik.", - "pools.explore": "Fedezze fel a medencéket", - "portfolio.activity.filters.timePeriod.all": "Mindig", - "portfolio.activity.filters.transactionType.all": "Minden típus", - "portfolio.activity.filters.transactionType.deposits": "Betétek", - "portfolio.activity.filters.transactionType.staking": "Karózás", - "portfolio.activity.filters.transactionType.swaps": "Csereügyletek", - "portfolio.activity.title": "Tevékenység", - "portfolio.connectWallet.summary": "Tokenek, poolok és egyebek követése {{amount}}+ hálózatokon keresztül", - "portfolio.defi.title": "DeFi", - "portfolio.description": "Kövesse nyomon kriptoportfólióját minden láncon és protokollon keresztül", - "portfolio.nfts.title": "NFT-k", - "portfolio.overview.title": "Áttekintés", - "portfolio.title": "Portfólió", - "portfolio.tokens.table.column.allocation": "Kiosztás", - "portfolio.tokens.table.column.balance": "Egyensúly", - "portfolio.tokens.table.column.change1d": "1D változás", - "portfolio.tokens.table.column.price": "Ár", - "portfolio.tokens.table.column.token": "Jelképes", - "portfolio.tokens.table.column.value": "Érték", - "portfolio.tokens.title": "Tokenek", - "position.addHook": "Adj hozzá egy horgot", - "position.addHook.tooltip": "A horgok egy olyan fejlett funkció, amely lehetővé teszi a poolok számára, hogy kölcsönhatásba léphessenek az intelligens szerződésekkel, felszabadítva ezzel a különféle képességeket. Legyen körültekintő a horgok felszerelésekor, mivel egyesek rosszindulatúak lehetnek, vagy nem kívánt következményekkel járhatnak.", - "position.addingHook": "Horog hozzáadása", - "position.addingHook.disclaimer": "A horgok hozzáadása nem kívánt következményekkel járhat. Végezze el a kutatást, és folytassa a saját felelősségére.", - "position.addingHook.hideProperties": "Tulajdonságok elrejtése", - "position.addingHook.invalidAddress": "Adjon meg egy érvényes horogcímet", - "position.addingHook.viewProperties": "Tulajdonságok megtekintése", - "position.create.confirm": "Pozíció megerősítése", - "position.create.invalidPrice": "Érvénytelen ár", - "position.create.invalidRange": "Érvénytelen tartomány", - "position.create.modal.header": "Pozíció létrehozása", - "position.create.unsupportedSolana": "A Solana medencék nem támogatottak.", - "position.create.unsupportedSolana.description": "Medence létrehozásához váltson egy támogatott EVM-láncra.", - "position.create.unsupportedToken.description": "Próbáljon meg létrehozni egy másik protokollverzióval.", - "position.create.v2unsupportedChain": "Ez a lánc nem támogatott v2-es készletek esetén.", - "position.currentValue": "Aktuális pozíció értéke", - "position.default_price_strategies": "Árstratégiák", - "position.default_price_strategies.error": "Nem sikerült beállítani az árstratégiát", - "position.deposit.confirm.create.description.less": "A beírt kezdeti ár {{value}}%-kal alacsonyabb, mint a piaci ár, és forráskiesést eredményezhet. Szeretné folytatni?", - "position.deposit.confirm.create.description.more": "A beírt kezdeti ár {{value}}%-kal magasabb, mint a piaci ár, és forráskiesést eredményezhet. Szeretné folytatni?", - "position.deposit.confirm.create.title": "Nagy árkülönbség a piachoz képest", - "position.deposit.description": "Adja meg a likviditási hozzájárulás jelképes összegét.", - "position.depositedCurrency": "Letétbe helyezve {{currencySymbol}}", - "position.fot.warning": "A {{token}} és más „Átutalási díj” tokeneket csak az Uniswap v2 támogatja.", - "position.fot.warning.cta": "Hozzon létre egy v2 pozíciót", - "position.hook.disclaimer": "Megértem a horog hozzáadásával járó lehetséges kockázatokat.", - "position.hook.donateWarning": "Ez a megjelölés a megszerzett díjak változását eredményezheti.", - "position.hook.liquidityWarning": "Ez a jelző azt okozhatja, hogy a pool blokkolja az új likviditás hozzáadását. A tranzakció visszaállhat.", - "position.hook.removeWarning": "Előfordulhat, hogy pénzeszközeit zároljuk, vagy megakadályozhatja a díjak beszedését.", - "position.hook.swapWarning": "Ez a jelző lehetővé teheti a likviditásszolgáltatók számára, hogy könnyebben kihasználják a Just-In-Time likviditást, ami alacsonyabb díjakat eredményezhet.", - "position.hook.warningHeader": "Fontos: a horoggal kapcsolatos kockázatok azonosítva", - "position.hook.warningInfo": "Azonosítottuk a lehetséges kockázatokat ezzel a horoggal. Kérjük, győződjön meg arról, hogy megértette, hogyan működik ez a horog, mielőtt úgy dönt, hogy továbblép.", - "position.increase.fot": "A {{token}} és más „Átutalási díj” tokenek likviditásának hozzáadása nem támogatott.", - "position.initialPrice": "Kezdeti ár", - "position.initialPrice.difference.negative": "{{ value }}%-kal kevesebb a piaci árnál", - "position.initialPrice.difference.positive": "{{ value }}%-kal több, mint a piaci ár", - "position.initialPrice.info": "Új készlet létrehozásakor mindkét token kezdő árfolyamát be kell állítani. Ez az árfolyam a kezdeti piaci árat fogja tükrözni.", - "position.initialPrice.set": "Állítsa be a kezdeti árat", - "position.initialPrice.useMarketPrice": "Használja a piaci árat", - "position.migrate.liquidity": "Pozíciók áttelepítésekor nem módosíthatja a tokenpárt, de hozzáadhat egy horogot a funkcionalitás javítása érdekében.", - "position.migrate.v4unsupportedChain": "Ez a lánc nem támogatott v4-készleteknél.", - "position.new": "Új pozíció", - "position.new.protocol": "Új {{protocol}} pozíció", - "position.notFound": "A pozíció nem található", - "position.notFound.description": "Ennek a pozíciónak a részletei nem állnak rendelkezésre. Kérjük, ellenőrizze, hogy a megfelelő pénztárcához csatlakozik-e.", - "position.one_sided_lower": "Egyoldalas alsó", - "position.one_sided_lower.description": "Kínálati likviditás, ha az ár csökken", - "position.one_sided_upper": "Egyoldalas felsőrész", - "position.one_sided_upper.description": "Kínáljon likviditást, ha az ár emelkedik", - "position.protocol": "{{protocol}} pozíció", - "position.provide.liquidity": "Válassza ki azokat a tokeneket, amelyekhez likviditást kíván biztosítani. Az összes támogatott hálózaton kiválaszthat tokeneket.", - "position.provide.liquidityDescription": "A teljes körű likviditás biztosítása biztosítja a folyamatos piaci részvételt minden lehetséges áron, egyszerűséget kínálva, de nagyobb múlandó veszteség lehetőségével.", - "position.provide.liquidityDescription.creatingPool": "A teljes körű likviditás beállítása a pool létrehozása során biztosítja a folyamatos piaci részvételt minden lehetséges áron, egyszerűséget kínálva, de nagyobb múlhatatlan veszteség lehetőségével.", - "position.provide.liquidityDescription.custom": "Az egyedi kínálat lehetővé teszi, hogy likviditását meghatározott árhatárokon belül koncentrálja, növelve a tőkehatékonyságot és a díjbevételt, de aktívabb kezelést igényel.", - "position.provide.outOfRange.closePosition": "Pozíció bezárása", - "position.provide.outOfRange.description": "Ennek a pozíciónak a tartománya nem módosítható az áttelepítés során. Új tartomány beállításához zárja be ezt a pozíciót, és nyisson meg egy új v4 pozíciót.", - "position.provide.outOfRange.title": "Ön egy hatótávolságon kívüli pozíciót helyez át", - "position.removeHook": "Távolítsa el a horgot", - "position.resetDescription": "A tokenek, az ár és a tartomány beállításai visszaállnak.", - "position.setRange": "Állítsa be az árkategóriát", - "position.setRange.inputsBelow": "Használja az alábbi bemeneteket a tartomány beállításához.", - "position.stable": "Stabil", - "position.stable.description": "Jó stabilcoinokhoz vagy alacsony volatilitású párokhoz", - "position.step.deposit": "Adja meg a betét összegét", - "position.step.price": "Állítsa be a kezdeti árat és a befizetés összegét", - "position.step.range": "Állítsa be az ártartományt és a betét összegét", - "position.step.select": "Válassza ki a tokenpárt és a díjakat", - "position.value": "Pozíció értéke", - "position.valueUnavailable": "USD érték jelenleg nem érhető el ehhez a pozícióhoz. Lásd a pozíció részleteit a befizetett token összegekről.", - "position.wide": "Széles", - "position.wide.description": "Jó volatilis párokhoz", - "position.wrapped.unwrap": "Kicsomagolás {{wrappedToken}}", - "position.wrapped.warning": "{{nativeToken}} szükséges a v4-es készletekhez", - "position.wrapped.warning.info": "Csomagolja ki {{wrappedToken}} -ját, és helyezze be {{nativeToken}} , hogy költséghatékonyabb és hatékonyabb likviditást biztosítson.", - "positions.noPositions.description": "Nincsenek likviditási pozíciói. Hozzon létre új pozíciót, hogy díjakat és jutalmakat kezdhessen el keresni a jogosult poolok után.", - "positions.noPositions.title": "Nincsenek pozíciók", - "positions.welcome.connect.description": "Pozícióid és jutalmaid megtekintéséhez csatlakoztatnod kell a tárcádat.", - "positions.welcome.connect.wallet": "Csatlakoztassa a pénztárcáját", - "privacy.anonymizedLogs": "Az alkalmazás anonimizált használati statisztikákat naplóz, hogy idővel javítsa.", - "privacy.autoRouter": "Az alkalmazás lekéri az optimális kereskedelmi útvonalat egy Uniswap Labs szerverről.", - "privacy.infura": "Az alkalmazás lekéri a láncon belüli adatokat, és szerződéshívásokat hoz létre egy Infura API-val.", - "privacy.thirdPartyApis": "Ez az alkalmazás a következő harmadik féltől származó API-kat használja:", - "privacy.trm": "Az alkalmazás biztonságosan összegyűjti a pénztárca címét, és kockázati és megfelelőségi okokból megosztja a TRM Labs Inc.-vel.", - "privacy.uniswaptos": "Az Uniswap Labs szolgáltatási feltételei", - "privateKeys.export.modal.speedbump.bullet1": "Nézze meg privátban", - "privateKeys.export.modal.speedbump.bullet2": "Ne ossza meg senkivel", - "privateKeys.export.modal.speedbump.bullet3": "Soha ne írja be semmilyen webhelyen vagy alkalmazásban", - "privateKeys.export.modal.speedbump.subtitle": "Bárki, aki ismeri a privát kulcsodat, hozzáférhet a tárcádhoz és a pénzedhez.", - "privateKeys.export.modal.speedbump.title": "Mielőtt folytatná", - "privateKeys.export.modal.subtitle": "Úgy tűnik, nem tudod teljesen visszaállítani a tárcádat. Annak érdekében, hogy soha ne veszítsd el a pénzedhez való hozzáférést, másold le a privát kulcsodat.", - "privateKeys.export.modal.title": "Exportálja a privát kulcsát", - "privateKeys.export.modal.warning": "Ha elveszíted a telefonodat, vagy törlöd az alkalmazást, akkor ezt a kulcsot egy másik tárcába kell importálnod.", - "privateKeys.view.button.continue": "Mindegyiket lemásoltam.", - "privateKeys.view.button.continue.single": "Lemásoltam.", - "privateKeys.view.subtitle": "A privát kulcsod hozzáférést biztosít egy adott tárcához. Minden tárcához más privát kulcs tartozik.", - "privateKeys.view.title": "Privát kulcs", - "qrScanner.button.connections_one": "1 alkalmazás csatlakoztatva", - "qrScanner.button.connections_other": "{{count}} alkalmazások csatlakoztatva", - "qrScanner.error.camera.message": "Kód beolvasásához engedélyezze a kamera hozzáférését a rendszerbeállításokban", - "qrScanner.error.camera.title": "A kamera le van tiltva", - "qrScanner.error.none": "Nem található QR-kód", - "qrScanner.recipient.action.scan": "QR-kód beolvasása", - "qrScanner.recipient.action.show": "Mutasd a QR-kódomat", - "qrScanner.recipient.error.message": "Mielőtt újra próbálkozna, győződjön meg arról, hogy érvényes Ethereum-cím QR-kódját olvassa be.", - "qrScanner.recipient.error.title": "Érvénytelen QR-kód", - "qrScanner.request.message.unavailable": "Nem található üzenet.", - "qrScanner.request.method.default": "Kérelem tőle: {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "Aláírási kérés tőle: {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "Tranzakciókérés innen: {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "Engedélyezi a {{dappName}} {{amount}} {{currencySymbol}}használatát?", - "qrScanner.request.withoutAmount": "Engedélyezi {{dappName}} számára a {{currencySymbol}}használatát?", - "qrScanner.status.connecting": "Csatlakozás...", - "qrScanner.status.loading": "Betöltés...", - "qrScanner.title": "QR-kód beolvasása", - "qrScanner.wallet.networks": "Támogatott hálózatok", - "range.outOfView": "Tartomány látótávolságon kívül", - "removeLiquidity.pooled": "Összevonva {{symbol}}:", - "revoke.failed.message": "Valószínűleg hálózati vagy kapcsolódási probléma okozta a visszavonás sikertelenségét. Ellenőrizze a kapcsolatot, és próbálja újra.", - "routing.aggregateLiquidity": "Ha elérhető, összesíti a likviditási forrásokat a jobb árak és a gázmentes csereügyletek érdekében.", - "routing.aggregateLiquidity.uniswapx": "Az UniswapX a láncon belüli és kívüli likviditási forrásokat összesíti, így a legjobb elérhető árakat és gázmentes swapügyleteket kínálja.", - "routing.cheapest": "Az Uniswap kliens a legolcsóbb kereskedési opciót választja, figyelembe véve az árat és a hálózati költségeket.", - "routing.cheapest.v4": "Az Uniswap kliens az ár és a hálózati költségek figyelembevételével választja ki az optimális kereskedési lehetőséget.", - "scantastic.code.expired": "Lejárt", - "scantastic.code.subtitle": "Írja be ezt a kódot az Uniswap kiterjesztésbe. A helyreállítási kifejezést biztonságosan titkosítjuk és továbbítjuk.", - "scantastic.code.timeRemaining.shorthand.hours": "Új kód {{hours}}h {{minutes}}m {{seconds}}s múlva", - "scantastic.code.timeRemaining.shorthand.minutes": "Új kód {{minutes}}m {{seconds}}s alatt", - "scantastic.code.timeRemaining.shorthand.seconds": "Új kód {{seconds}}másodperc múlva", - "scantastic.code.title": "Unswap egyszeri kód", - "scantastic.confirmation.button.continue": "Igen, folytasd", - "scantastic.confirmation.label.browser": "Böngésző", - "scantastic.confirmation.label.device": "Eszköz", - "scantastic.confirmation.subtitle": "Csak akkor folytassa, ha megbízható eszközön olvas be QR-kódot az Uniswap bővítményből.", - "scantastic.confirmation.title": "Megpróbálja importálni a pénztárcáját?", - "scantastic.confirmation.warning": "Óvakodjon az Uniswap-t megszemélyesítő webhelyektől és alkalmazásoktól. Ellenkező esetben a pénztárcája veszélybe kerülhet.", - "scantastic.error.encryption": "Nem sikerült előkészíteni a kezdő kifejezést.", - "scantastic.error.noCode": "Nem érkezett OTP. Kérlek próbáld újra.", - "scantastic.error.timeout.message": "A pénztárca szinkronizálásának folytatásához olvassa be újra a QR-kódot az Uniswap bővítményen.", - "scantastic.error.timeout.title": "A kapcsolat ideje lejárt", - "scantastic.modal.ipMismatch.description": "A QR-kód beolvasásához telefonjának ugyanahhoz a WiFi hálózathoz kell csatlakoznia, mint a számítógépének, és ideiglenesen ki kell kapcsolnia a VPN-eket.", - "scantastic.modal.ipMismatch.title": "Váltsa át a WiFi hálózatot", - "search.input.placeholder": "Tokenek és készletek keresése", - "search.ukDisclaimer": "Jogi nyilatkozat az Egyesült Királyság lakosai számára", - "send.button.review": "Átvitel áttekintése", - "send.gas.error.title": "N/A", - "send.gas.networkCost.title": "Hálózati költség", - "send.input.token.balance.title": "Egyenleg: {{balance}} {{symbol}}", - "send.recipient.header": "Válassza ki a címzettet", - "send.recipient.input.placeholder": "Keressen az ENS-en vagy a címen", - "send.recipient.previous_one": "1 korábbi átutalás", - "send.recipient.previous_other": "{{count}} korábbi átutalások", - "send.recipient.results.empty": "Nincs találat", - "send.recipient.results.error": "A beírt cím nem létezik, vagy hibásan van írva.", - "send.recipient.section.favorite": "Kedvenc pénztárcák", - "send.recipient.section.recent": "Friss", - "send.recipient.section.search": "Keresési eredmények", - "send.recipient.section.viewOnly": "Csak megtekinthető pénztárcák", - "send.recipient.section.yours": "A pénztárcádat", - "send.recipient.warning.viewOnly.message": "Csak akkor küldjön pénzt ebbe a tárcába, ha rendelkezik a helyreállítási kifejezéssel, vagy ismeri a pénztárca tulajdonosát.", - "send.recipient.warning.viewOnly.title": "Ez csak megtekinthető pénztárca", - "send.recipientSelect.search.empty.message": "Ha tokeneket küld egy pénztárca címére, azok itt fognak megjelenni", - "send.recipientSelect.search.empty.title": "Nincs mentett pénztárca", - "send.review.modal.title": "Te küldöd", - "send.review.summary.button.title": "Küldés megerősítése", - "send.search.empty.subtitle": "A beírt cím nem létezik, vagy hibásan van írva.", - "send.search.empty.title": "Nincs találat", - "send.search.placeholder": "Keressen az ENS-en vagy a címen", - "send.solanaSendNotSupported": "A küldés nem támogatott a Solana rendszeren.", - "send.title": "Küld", - "send.unavailableOnSolana.message": "A küldés nem lehetséges Solana tárcákon", - "send.warning.blocked.default": "Ez a pénztárca le van tiltva", - "send.warning.blocked.modal.message": "Ez a cím le van tiltva az Uniswap Wallet szolgáltatásban, mert egy vagy több blokkolt tevékenységhez kapcsolódik. Ha úgy gondolja, hogy ez hiba, kérjük, írjon e-mailt a compliance@uniswap.org címre.", - "send.warning.blocked.modal.title": "Letiltott cím", - "send.warning.blocked.recipient": "A címzett pénztárcája blokkolva van", - "send.warning.erc20.checkbox.description": "Ön egy token címre próbál pénzt küldeni. Ez tartós pénzkiesést eredményezhet.", - "send.warning.erc20.checkbox.heading": "Token cím észlelve", - "send.warning.erc20.message": "Ön egy token címre próbál pénzt küldeni. A kriptográfiai adatok ilyen típusú címre történő küldése tartós pénzkiesést eredményezhet.", - "send.warning.erc20.title": "Ez egy token cím", - "send.warning.insufficientFunds.message": "{{currencySymbol}} egyenlege csökkent, mióta megadta az elküldeni kívánt összeget", - "send.warning.insufficientFunds.title": "Nem elég {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "Nincs elég {{currencySymbol}} {{networkName}} a küldéshez", - "send.warning.insufficientGas.message.withoutNetwork": "Nem elég {{currencySymbol}} a küldéshez", - "send.warning.modal.button.cta.blocking": "rendben", - "send.warning.modal.button.cta.cancel": "Megszünteti", - "send.warning.modal.button.cta.confirm": "megerősít", - "send.warning.newAddress.details.ENS": "ENS", - "send.warning.newAddress.details.username": "Felhasználónév", - "send.warning.newAddress.details.walletAddress": "Pénztárca címe", - "send.warning.newAddress.message": "Még nem kötött tranzakciót ezzel a címmel. Kérjük, ellenőrizze, hogy a cím helyes-e, mielőtt folytatná.", - "send.warning.newAddress.title": "Új cím", - "send.warning.self.message": "Pénzt próbál küldeni jelenlegi pénztárcájába. A kriptográfiai adatok erre a címre történő küldése szükségtelen hálózati költségekkel jár.", - "send.warning.self.title": "Ez a jelenlegi pénztárcája", - "send.warning.smartContract.message": "Arra készül, hogy pénzt küldjön egy intelligens szerződéses címre. Győződjön meg arról, hogy ez a helyes cím, és hogy képes tokeneket fogadni. Ellenkező esetben ez tartós pénzkiesést eredményezhet.", - "send.warning.smartContract.title": "Ez egy intelligens szerződéses cím", - "send.warning.viewOnly.message": "Az eszközök küldéséhez importálnia kell ezt a pénztárcát a helyreállítási kifejezésen keresztül.", - "send.warning.viewOnly.title": "Ez a pénztárca csak megtekinthető", - "send.youAreSending": "Te küldöd", - "sendRecipientForm.recentAddresses.label": "Legutóbbiak", - "sendReviewModal.title": "Értékelés küldése", - "setting.recoveryPhrase.account.show": "Helyreállítási kifejezés megjelenítése", - "setting.recoveryPhrase.action.hide": "Helyreállítási kifejezés elrejtése", - "setting.recoveryPhrase.remove": "Távolítsa el a helyreállítási kifejezést", - "setting.recoveryPhrase.remove.confirm.subtitle": "Tudomásul veszem, hogy az Uniswap Labs nem tud segíteni a pénztárcám visszaszerzésében, ha ezt nem tenném meg.", - "setting.recoveryPhrase.remove.confirm.title": "Mentettem a helyreállítási mondatomat", - "setting.recoveryPhrase.remove.initial.subtitle": "Győződjön meg arról, hogy elmentette a helyreállítási kifejezést. Ellenkező esetben elveszíti hozzáférését a pénztárcájához", - "setting.recoveryPhrase.remove.initial.title": "Mielőtt folytatná", - "setting.recoveryPhrase.remove.subtitle": "A megerősítéshez adja meg jelszavát", - "setting.recoveryPhrase.remove.title": "Eltávolítja a helyreállítási kifejezést", - "setting.recoveryPhrase.view.warning.message1": "Bárki, aki ismeri a helyreállítási kifejezést, hozzáférhet pénztárcájához és pénzeszközeihez", - "setting.recoveryPhrase.view.warning.message2": "Nézze meg privátban", - "setting.recoveryPhrase.view.warning.message3": "Ne ossza meg senkivel", - "setting.recoveryPhrase.view.warning.message4": "Soha ne írja be semmilyen webhelyen vagy alkalmazásban", - "setting.recoveryPhrase.view.warning.title": "Mielőtt folytatná", - "setting.recoveryPhrase.warning.view.message": "Bárki, aki ismeri a helyreállítási kifejezést, hozzáférhet pénztárcájához és pénzeszközeihez.", - "setting.recoveryPhrase.warning.view.title": "Tekintse meg ezt privát helyen", - "settings.action.enableInSettings": "Engedélyezze a Beállításokban", - "settings.action.feedback": "Visszajelzés küldése", - "settings.action.help": "Kaphat segítséget", - "settings.action.lock": "Zárható pénztárca", - "settings.action.privacy": "Adatvédelmi irányelvek", - "settings.action.terms": "Szolgáltatás feltételei", - "settings.connectWalletPlatform.warning": "A Uniswap {{platform}}tárcán való használatához csatlakozz egy olyan tárcához, amely támogatja a {{platform}}tárcát.", - "settings.footer": "Szeretettel készült, \nUniswap Team 🦄", - "settings.hideSmallBalances": "Kis egyenlegek elrejtése", - "settings.hideSmallBalances.subtitle": "Az 1 USD alatti egyenlegek el lesznek rejtve a portfóliójában.", - "settings.maxSlippage": "Max. csúszás", - "settings.maxSlippage.amount": "{{amount}} max. csúszás", - "settings.section.about": "Ról ről", - "settings.section.preferences": "preferenciák", - "settings.section.privacyAndSecurity": "Adatvédelem és biztonság", - "settings.section.support": "Támogatás", - "settings.section.wallet.hidden.row.title": "{{numHidden}} egyéb pénztárcák", - "settings.setting.advanced.title": "Fejlett", - "settings.setting.advancedSettings": "Advanced settings", - "settings.setting.appearance.option.auto": "Auto", - "settings.setting.appearance.option.dark.subtitle": "Mindig használjon sötét témát.", - "settings.setting.appearance.option.dark.title": "Sötét", - "settings.setting.appearance.option.device.subtitle": "Alkalmazkodik a készülék beállításaihoz.", - "settings.setting.appearance.option.device.title": "Auto", - "settings.setting.appearance.option.light.subtitle": "Mindig használjon világos témát.", - "settings.setting.appearance.option.light.title": "Fény", - "settings.setting.appearance.title": "Téma", - "settings.setting.backup.create.description": "A jelszó beállítása titkosítja a helyreállítási kifejezés biztonsági másolatát, ami további védelmet biztosít, ha {{cloudProviderName}} fiókját valaha is feltörik.", - "settings.setting.backup.create.title": "Vissza a {{cloudProviderName}}-ig", - "settings.setting.backup.delete.confirm.message": "Mivel ezek a pénztárcák egy helyreállítási kifejezést használnak, az alábbi biztonsági másolatokat is törli ezekről a pénztárcákról", - "settings.setting.backup.delete.confirm.title": "biztos vagy ebben?", - "settings.setting.backup.delete.warning": "Ha törli {{cloudProviderName}} biztonsági másolatát, csak a helyreállítási kifejezés manuális biztonsági másolatával tudja visszaállítani pénztárcáját. Az Uniswap Labs nem tudja visszaállítani az eszközöket, ha elveszíti a helyreállítási kifejezést.", - "settings.setting.backup.error.message.full": "Nem sikerült biztonsági másolatot készíteni a helyreállítási kifejezésről a {{cloudProviderName}}címre. Győződjön meg arról, hogy a {{cloudProviderName}} engedélyezve van a szabad tárhellyel, és próbálja újra.", - "settings.setting.backup.error.message.short": "Nem sikerült törölni a biztonsági másolatot", - "settings.setting.backup.error.title": "{{cloudProviderName}} hiba", - "settings.setting.backup.modal.description": "Még nem készített biztonsági másolatot a helyreállítási kifejezésről a {{cloudProviderName}} értékre. Ezzel helyreállíthatja pénztárcáját, ha bármely eszközön bejelentkezik a {{cloudProviderName}} fiókba.", - "settings.setting.backup.modal.title": "Menti a helyreállítási kifejezést a {{cloudProviderName}}címre?", - "settings.setting.backup.password.error.mismatch": "A jelszavak nem egyeznek", - "settings.setting.backup.password.medium": "Ez egy közepes jelszó", - "settings.setting.backup.password.placeholder.confirm": "Jelszó megerősítése", - "settings.setting.backup.password.placeholder.create": "Jelszó létrehozása", - "settings.setting.backup.password.strong": "Ez egy erős jelszó", - "settings.setting.backup.password.weak": "Ez egy gyenge jelszó", - "settings.setting.backup.recoveryPhrase.label": "Helyreállítási kifejezés", - "settings.setting.backup.selected": "{{cloudProviderName}} biztonsági mentés", - "settings.setting.backup.status.action.delete": "Biztonsági másolat törlése", - "settings.setting.backup.status.complete": "Biztonsági mentés a {{cloudProviderName}}értékre", - "settings.setting.backup.status.description": "Ha a helyreállítási kifejezésről biztonsági másolatot készít {{cloudProviderName}}értékre, akkor visszaállíthatja pénztárcáját, ha bármelyik eszközön bejelentkezik {{cloudProviderName}} fiókjába.", - "settings.setting.backup.status.inProgress": "Biztonsági mentés {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "Alátámasztva", - "settings.setting.backup.status.title": "{{cloudProviderName}} biztonsági mentés", - "settings.setting.beta.tooltip": "Hamarosan", - "settings.setting.biometrics.appAccess.subtitle.android": "Az alkalmazás megnyitásához arc/ujjlenyomat szükséges.", - "settings.setting.biometrics.appAccess.subtitle.ios": "Az alkalmazás megnyitásához {{biometricsMethod}} szükséges.", - "settings.setting.biometrics.appAccess.title": "Alkalmazás hozzáférés", - "settings.setting.biometrics.auth": "Kérjük, hitelesítse", - "settings.setting.biometrics.extension.waitingForBiometricsModal.content": "A folytatáshoz engedélyezd a {{biometricsMethod}} beállítást a böngésződben vagy a rendszerbeállításokban.", - "settings.setting.biometrics.extension.waitingForBiometricsModal.title": "Várom a {{biometricsMethod}}-t", - "settings.setting.biometrics.off.message.android": "A biometria jelenleg ki van kapcsolva az Uniswap Wallet esetében – a rendszerbeállításokban kapcsolhatja be.", - "settings.setting.biometrics.off.message.ios": "A {{biometricsMethod}} jelenleg ki van kapcsolva az Uniswap Wallet esetében – a rendszerbeállításokban kapcsolhatja be.", - "settings.setting.biometrics.off.title.android": "A biometria ki van kapcsolva", - "settings.setting.biometrics.off.title.ios": "A {{biometricsMethod}} ki van kapcsolva", - "settings.setting.biometrics.title": "Arc/ujjlenyomatos feloldás", - "settings.setting.biometrics.transactions.subtitle.android": "Arc/ujjlenyomat szükséges a tranzakcióhoz.", - "settings.setting.biometrics.transactions.subtitle.ios": "A tranzakcióhoz {{biometricsMethod}} szükséges.", - "settings.setting.biometrics.transactions.title": "Tranzakciók", - "settings.setting.biometrics.unavailable.message.android": "A biometria nincs beállítva az eszközön. A biometrikus adatok használatához először állítsa be a Beállításokban.", - "settings.setting.biometrics.unavailable.message.ios": "A {{biometricsMethod}} nincs beállítva az eszközön. A {{biometricsMethod}}használatához először állítsa be a Beállításokban.", - "settings.setting.biometrics.unavailable.title.android": "A biometria nincs beállítva", - "settings.setting.biometrics.unavailable.title.ios": "A {{biometricsMethod}} nincs beállítva", - "settings.setting.biometrics.warning.message.android": "Ha nem kapcsolja be a biometrikus adatokat, bárki, aki hozzáfér az eszközéhez, megnyithatja az Uniswap Wallet alkalmazást, és tranzakciókat hajthat végre.", - "settings.setting.biometrics.warning.message.ios": "Ha nem kapcsolja be a {{biometricsMethod}}funkciót, bárki, aki hozzáfér az eszközéhez, megnyithatja az Uniswap Wallet alkalmazást, és tranzakciókat hajthat végre.", - "settings.setting.biometrics.warning.title": "biztos vagy ebben?", - "settings.setting.connections.disconnectAll": "Válassza le az összeset", - "settings.setting.connections.noConnectionsDescription": "Csatlakozzon egy alkalmazáshoz a „pénztárca csatlakoztatása” vagy a „Bejelentkezés” gomb megkeresésével.", - "settings.setting.currency.title": "Helyi pénznem", - "settings.setting.deviceAccess.reset.title": "Állítsd vissza a {{biometricsMethod}}-t", - "settings.setting.deviceAccess.title": "Eszközhozzáférés", - "settings.setting.deviceAccessTimeout.1hour": "1 óra", - "settings.setting.deviceAccessTimeout.24hours": "24 óra", - "settings.setting.deviceAccessTimeout.30minutes": "30 perc", - "settings.setting.deviceAccessTimeout.5minutes": "5 perc", - "settings.setting.deviceAccessTimeout.never": "Soha", - "settings.setting.deviceAccessTimeout.title": "Automatikus zárolás időtúllépése", - "settings.setting.hapticTouch.title": "Haptikus érintés", - "settings.setting.helpCenter.title": "Segítség Központ", - "settings.setting.language.button.navigate": "Menj a beállításokhoz", - "settings.setting.language.description.extension": "Uniswap alapértelmezés szerint a rendszer nyelvi beállításai. A preferált nyelv megváltoztatásához lépjen a rendszerbeállításokhoz.", - "settings.setting.language.description.mobile": "Az Uniswap alapértelmezett beállításai az eszköz nyelvi beállításai. Az előnyben részesített nyelv megváltoztatásához lépjen az eszközbeállítások „Uniswap” elemére, és érintse meg a „Nyelv” elemet.", - "settings.setting.language.title": "Nyelv", - "settings.setting.notifications.row.activity.description": "Átutalások, kérések és egyéb tevékenységek", - "settings.setting.notifications.row.activity.title": "Pénztárca tevékenység", - "settings.setting.notifications.row.updates.description": "Ajánlások és új funkciók", - "settings.setting.notifications.row.updates.title": "Frissítések az Uniswapból", - "settings.setting.notifications.title": "Értesítések", - "settings.setting.password.change.title": "Hozzon létre egy új jelszót", - "settings.setting.password.title": "Jelszó módosítása", - "settings.setting.permissions.title": "Engedélyek", - "settings.setting.privacy.analytics.description": "Anonim használati adatokat használunk, hogy javítsuk az Uniswap Labs termékeinél tapasztalt élményt. Ha le van tiltva, csak a hibákat és az alapvető használatot követjük nyomon.", - "settings.setting.privacy.analytics.title": "Alkalmazáselemzés", - "settings.setting.privateKeys.title": "Privát kulcsok", - "settings.setting.recoveryPhrase.title": "Helyreállítási kifejezés", - "settings.setting.smallBalances.title": "Portfólió egyensúly", - "settings.setting.smartWallet.action.enable": "Engedélyezze", - "settings.setting.smartWallet.action.smartWallet": "Smart wallet", - "settings.setting.smartWallet.notEligible": "Nem jogosult", - "settings.setting.smartWallet.status.actionRequired": "Szükséges intézkedés", - "settings.setting.smartWallet.status.active": "Aktív", - "settings.setting.smartWallet.status.inactive": "Inaktív", - "settings.setting.smartWallet.status.unavailable": "Nem érhető el", - "settings.setting.unknownTokens.subtitle": "A lehetséges átverési tokenek el lesznek rejtve a portfóliójában.", - "settings.setting.unknownTokens.title": "Ismeretlen tokenek elrejtése", - "settings.setting.wallet.action.editLabel": "Címke szerkesztése", - "settings.setting.wallet.action.editProfile": "Profil szerkesztése", - "settings.setting.wallet.action.remove": "Távolítsa el a pénztárcát", - "settings.setting.wallet.connection.banner.description": "A profilképére kattintva kezelheti a kapcsolatokat a pénztárca beállításain keresztül.", - "settings.setting.wallet.connection.banner.title": "A kapcsolatok elköltöztek", - "settings.setting.wallet.connections.title": "Kapcsolatok", - "settings.setting.wallet.editLabel.description": "A címkék nem nyilvánosak. Helyben tárolják őket, és csak Ön láthatja őket.", - "settings.setting.wallet.editLabel.save": "Változtatások mentése", - "settings.setting.wallet.label": "Becenév", - "settings.setting.wallet.testnetMode.description": "Ez bekapcsolja a teszthálózatokat a fejlesztők számára, hogy valódi eszközök használata nélkül próbálhassák ki a funkciókat és a tranzakciókat. A teszthálózatokon lévő tokenek nem rendelkeznek valós értékkel.", - "settings.setting.wallet.testnetMode.title": "Testnet mód", - "settings.switchNetwork.warning": "Az Uniswap használatához {{label}}esetén váltson hálózatot a pénztárca beállításaiban.", - "settings.title": "Beállítások", - "settings.version": "{{appVersion}}verzió", - "smartWallet.actionRequired.cta": "Letiltás 1 hálózaton", - "smartWallet.actionRequired.cta.plural": "Letiltás {{amount}} hálózatokon", - "smartWallet.actionRequired.description": "Az intelligens pénztárca letiltása egy onchain művelet, amely kis hálózati költséget igényel.", - "smartWallet.actionRequired.insufficientFunds": "Fedezethiány", - "smartWallet.actionRequired.reactivate": "Továbbra is használd az okospénztárcát", - "smartWallet.actionRequired.title": "Az intelligens pénztárca 1 hálózaton aktív", - "smartWallet.actionRequired.title.plural": "Az intelligens pénztárca {{amount}} hálózaton aktív", - "smartWallet.activeNetworks.title": "Az intelligens pénztárca 1 hálózaton aktív", - "smartWallet.activeNetworks.title.plural": "Az intelligens pénztárca {{amount}} hálózaton aktív", - "smartWallet.banner.networkCost": "Includes a one-time cost to activate your smart wallet on {{chainName}}.", - "smartWallet.banner.text": "Engedélyezze az intelligens pénztárcát , hogy akár 50%-ot takarítson meg a hálózati költségeken.", - "smartWallet.confirmDisableSmartWallet.description": "Lemaradsz a gyorsabb cserékről, a kedvezményes hálózati költségekről és más közelgő fejlesztésekről.", - "smartWallet.confirmDisableSmartWallet.title": "biztos vagy ebben?", - "smartWallet.insufficient.description": "Az intelligens pénztárca nem kapcsolható ki ezeken a hálózatokon, amíg nincs fedezete a hálózati költségek fedezésére.", - "smartWallet.insufficient.title": "Nincs elegendő fedezet 1 hálózaton", - "smartWallet.insufficient.title.plural": "Nincs elegendő fedezet a {{amount}} hálózatokon", - "smartWallet.InsufficientFunds.button.continue.text": "Folytatás mindenképpen", - "smartWallet.insufficientFunds.network.banner.description": "Nem lehet letiltani elégtelen forrás miatt.", - "smartWallet.insufficientFunds.network.banner.title_one": "{{count}} hálózat kizárva", - "smartWallet.insufficientFunds.network.banner.title_other": "{{count}} hálózat kizárva", - "smartWallet.insufficientFunds.network.disable.text": "Készen áll a letiltásra", - "smartWallet.insufficientFunds.network.text": "Szükséged van {{nativeCurrency}}-ra", - "smartWallet.insufficientFunds.single.network.banner.title": "{{chain}} kizárva", - "smartWallet.modal.description.block1": "Az intelligens pénztárcák intelligens szerződéseket használnak a gyorsabb és alacsonyabb költségű tranzakciók lebonyolításához.", - "smartWallet.modal.description.block2": "Azokat a tárcákat, amelyek már egy másik alkalmazásból származó intelligens tárca funkciókat használnak, ez nem érinti.", - "smartWallet.modal.title": "Smart Wallet", - "smartWallets": "Intelligens pénztárcák", - "smartWallets.activeNetworks.description": "Az okostárcád automatikusan aktiválódik minden új hálózaton, amelyen váltasz.", - "smartWallets.createdModal.description": "You’re getting faster transactions and lower network costs on every swap.", - "smartWallets.createdModal.title": "Intelligens pénztárca létrehozva", - "smartWallets.delegation.limitedSupport": "A pénztárcád korlátozottan támogatja", - "smartWallets.delegationMismatchModal.description": "A {{walletName}} nem támogatja a {{displayName}}által használt legújabb Ethereum szabványokat, ezért néhány funkció nem érhető el.", - "smartWallets.delegationMismatchModal.features.1ClickSwaps": "1 kattintásos cserék", - "smartWallets.delegationMismatchModal.features.gasFreeSwaps": "Gázmentes csereprogramok", - "smartWallets.delegationMismatchModal.features.limitOrders": "Limit megbízások", - "smartWallets.delegationMismatchModal.limitOrders.unsupported": "A tárcád nem támogatja a limit megbízásokat.", - "smartWallets.delegationMismatchModal.title": "Korlátozott pénztárca-támogatás", - "smartWallets.disable.failed": "Hiba történt. Az intelligens pénztárca továbbra is aktív egy vagy több hálózaton. Kérjük, próbálja újra.", - "smartWallets.disable.modal.description": "Ez a láncba kapcsolt művelet hálózati költséget igényel.", - "smartWallets.disable.modal.title": "Okostárca letiltása", - "smartWallets.educationalModal.description": "Az okos pénztárcák gyorsabb és alacsonyabb költségű tranzakciókat tesznek lehetővé okos szerződések használatával.", - "smartWallets.educationalModal.info": "Ez nem érinti azokat a pénztárcákat, amelyek már használnak egy másik alkalmazás intelligens pénztárca funkcióit.", - "smartWallets.enabledModal.description": "A frissítések a következő cserénél lépnek életbe.", - "smartWallets.enabledModal.description.dapp": "A frissítések a következő tranzakcióddal lépnek életbe.", - "smartWallets.enabledModal.description.dapp.line2": "Csatlakoztasd újra a pénztárcádat, hogy azonnal elkezdhesd használni az intelligens pénztárca funkcióit az alkalmazásokban.", - "smartWallets.enabledModal.title": "Intelligens pénztárca engedélyezve", - "smartWallets.postSwapNudge.enable": "Intelligens pénztárca engedélyezése", - "smartWallets.postSwapNudge.title": "Takarítson meg a következő cserénél", - "smartWallets.postSwapNudge.title.dapp": "Ez az alkalmazás támogatja az intelligens pénztárcákat", - "smartWallets.unavailableModal.description": "Egy másik pénztárca-szolgáltató kezeli a {{displayName}}intelligens pénztárca beállításait. A Uniswap szolgáltatást a szokásos módon használhatod.", - "smartWallets.unavailableModal.title": "Az intelligens pénztárca funkciói nem érhetők el", - "solanaPromo.banner.description": "Cserélj Solana tokeneket közvetlenül az Uniswap-on.", - "solanaPromo.banner.title": "A Solana már elérhető", - "solanaPromo.modal.connectWallet": "Csatlakoztassa kedvenc Solana pénztárcáját", - "solanaPromo.modal.startSwapping.button": "Kezdj el cserélgetni a Solanán", - "solanaPromo.modal.swapInstantly": "Cseréljen azonnal több ezer trendi tokent", - "solanaPromo.modal.viewTokenData": "Token adatok és árak megtekintése egy helyen", - "speedBump.newAddress.warning.description": "Még nem kötött tranzakciót ezzel a címmel. Mielőtt folytatná, győződjön meg arról, hogy ez a helyes cím.", - "speedBump.newAddress.warning.title": "Új cím", - "speedBump.smartContractAddress.warning.description": "Arra készül, hogy tokeneket küldjön egy speciális címre – egy intelligens szerződésre. Ellenőrizze még egyszer, hogy az a cím, amelyre küldeni kívánt. Ha rossz, a tokenek örökre elveszhetnek.", - "speedBump.smartContractAddress.warning.title": "Ez egy pénztárca cím?", - "stats.24fees": "24 órás díjak", - "stats.24swapVolume": "24 órás swap volumen", - "stats.24volume": "24 órás hangerő", - "stats.allTimeSwappers": "Mindenkori cserélők", - "stats.allTimeVolume": "Mindenkori hangerő", - "stats.fdv": "FDV", - "stats.fdv.description": "A teljesen hígított értékelés (FDV) a teljes piaci értéket számítja ki, feltételezve, hogy az összes token forgalomban van.", - "stats.marketCap": "Piac sapka", - "stats.marketCap.description": "A piaci kapitalizáció egy eszköz forgalomban lévő készletének teljes piaci értéke.", - "stats.noStatsAvailable": "Nincsenek elérhető statisztikák", - "stats.tvl": "Teljes érték zárolva", - "stats.tvl.description": "A teljes zárolt érték (TVL) az összes Uniswap likviditási poolban elérhető eszköz összesített összege.", - "stats.volume.1d": "1 napos mennyiség", - "stats.volume.1d.description": "Az 1 napos mennyiség annak az eszköznek az összege, amellyel az elmúlt 24 órában Uniswapon kereskedtek.", - "stats.volume.1d.long": "1D kötet", - "stats.volume.1d.short": "1D köt", - "stats.volume.description": "A mennyiség annak az eszköznek az összege, amellyel az Uniswapon kereskedtek a kiválasztott időtartam alatt.", - "swap.allow.oneTime": "{{sym}} engedélyezése (egyszer)", - "swap.approveAndSubmit": "Jóváhagyás és benyújtás", - "swap.approveAndSwap": "Jóváhagyás és csere", - "swap.balance.amount": "Egyenleg: {{amount}}", - "swap.bestPrice.through": "Útvonal {{provider}}-n keresztül", - "swap.bestRoute.cost": "A leghatékonyabb útvonal a becslések szerint ~{{gasPrice}} hálózati költségekbe kerül. ", - "swap.bridging.title": "Csere a hálózatok között", - "swap.bridging.warning.description": "A {{fromNetwork}} értékről a {{toNetwork}}értékre vált. Ezt \"áthidalásnak\" is nevezik, amely áthelyezi a tokeneket egyik hálózatról a másikra.", - "swap.button.confirmSignAndSwap": "Aláírás és csere megerősítése", - "swap.button.confirmSwapAnyways": "Csere megerősítése mindenképpen", - "swap.button.confirmUnwrap": "Kibontás megerősítése", - "swap.button.max": "Max", - "swap.button.review": "Felülvizsgálat", - "swap.button.submitting": "Swap benyújtása...", - "swap.button.submitting.keep.open": "Tartsa nyitva a pénztárcáját...", - "swap.button.submitting.passkey": "Jelszóval való megerősítés", - "swap.button.swap": "Csere", - "swap.button.swapAnyways": "Cserélj mindenképp", - "swap.button.unwrap": "Kibont", - "swap.button.wrap": "Betakar", - "swap.buy.countryModal.placeholder": "Keresés ország vagy régió szerint", - "swap.cancel.cannotExecute_one": "A csere még a törlés feldolgozása előtt végrehajtható. Hálózati költségei nem téríthetők vissza. Szeretné folytatni?", - "swap.cancel.cannotExecute_other": "A csereügyletek még a törlés feldolgozása előtt végrehajthatók. Hálózati költségei nem téríthetők vissza. Szeretné folytatni?", - "swap.confirmApproveAndSwap": "Jóváhagyás megerősítése és csere", - "swap.confirmLimit": "Erősítse meg a limitet", - "swap.confirmSwap": "Erősítse meg a cserét", - "swap.confirmWrap": "Csomagolás megerősítése", - "swap.deadline.settings.title": "Csere határideje", - "swap.deadline.settings.title.short": "Tx. határidő", - "swap.details.completed": "Csere kész", - "swap.details.estimatedTime": "Becsült idő", - "swap.details.fasterUnichainSwaps": "Gyorsabb swapok az Unichain jóvoltából", - "swap.details.feeOnTransfer": "{{tokenSymbol}} díj", - "swap.details.feeOnTransfer.symbol": "{{tokenSymbol}} token díj", - "swap.details.instant": "Azonnali", - "swap.details.newQuote.input": "Új bemenet", - "swap.details.newQuote.output": "Új kimenet", - "swap.details.orderRouting": "Rendelési útválasztás", - "swap.details.orderRoutingInfo": "Ez a csere az Acrosson keresztül történik, egy decentralizált protokollon, amely az eszközöket a hálózatok között mozgatja, miközben előnyben részesíti a biztonságot, a gyors végrehajtást és az alacsony árakat.", - "swap.details.poweredBy": "Powered by", - "swap.details.rate": "Mérték", - "swap.details.slippage": "Max csúszás", - "swap.details.slippage.uniswap": "Uniswap Védett csúszás", - "swap.details.swappedIn.unichain": "{{time}}s alatt elkészült az Unichainen", - "swap.details.uniswapFee": "Díj", - "swap.error.default": "Előfordulhat, hogy növelnie kell a csúszástűrő képességét. Megjegyzés: az átviteli díjak és az alapjogkivonatok nem kompatibilisek az Uniswap V3-mal.", - "swap.error.expectedToFail": "A csere várhatóan sikertelen lesz.", - "swap.error.fiatInputUnavailable": "{{fiatCurrencyCode}} bemenet nem érhető el", - "swap.error.modifiedByWallet": "A cseréjét a pénztárcáján keresztül módosították. Ha ez tévedés volt, kérjük, azonnal mondja le, vagy kockáztatja a pénzeszközök elvesztését.", - "swap.error.rejected": "Tranzakció elutasítva", - "swap.error.undefinedObject": "Hiba történt a csere végrehajtásakor. Előfordulhat, hogy növelnie kell a csúszástűrő képességét. Ha ez nem működik, előfordulhat, hogy nem kompatibilis az Ön által kereskedett tokennel. Megjegyzés: az átviteli díjak és az alapjogkivonatok nem kompatibilisek az Uniswap V3-mal.", - "swap.error.unknown": "Ismeretlen hiba.", - "swap.error.v2.expired": "Ezt a tranzakciót nem lehetett elküldeni, mert lejárt a határidő. Kérjük, ellenőrizze, hogy a tranzakció határideje nem túl rövid.", - "swap.error.v2.k": "Az x*y=k Uniswap invariáns nem volt kielégítve a swap által. Ez általában azt jelenti, hogy az Ön által cserélt tokenek egyike egyéni viselkedést tartalmaz az átvitel során.", - "swap.error.v2.slippage": "Ez a tranzakció sem ármozgás, sem átutalási díj miatt nem fog sikerülni. Próbálja meg növelni a csúszástűrő képességét", - "swap.error.v2.transferInput": "A bemeneti token nem vihető át. Probléma lehet a beviteli tokennel.", - "swap.error.v2.transferOutput": "A kimeneti token nem vihető át. Probléma lehet a kimeneti tokennel.", - "swap.error.v3.slippage": "Ez a tranzakció az ármozgás miatt nem fog sikerülni. Próbálja meg növelni a csúszástűrő képességét. Megjegyzés: Az átviteli díj és az újraalapozási tokenek nem kompatibilisek az Uniswap V3-mal.", - "swap.error.v3.transferOutput": "A kimeneti token nem vihető át. Probléma lehet a kimeneti tokennel. Megjegyzés: Az átviteli díj és az újraalapozási tokenek nem kompatibilisek az Uniswap V3-mal.", - "swap.estimatedDifference.label": "A jelenlegi likviditás miatt nagy különbségek lesznek a bemeneti és kimeneti értékek között.", - "swap.expected.price": "Várható ár", - "swap.fail.batched": "Lehetséges, hogy a csatlakoztatott tárcád nem támogatja az egykattintásos swapokat. Próbálj ki egy hagyományos swapot helyette.", - "swap.fail.batched.retry": "Próbálja ki a standard swap-ot", - "swap.fail.batched.title": "1 kattintásos csere sikertelen", - "swap.fail.message": "Próbálja meg magasabb értékre állítani a csúszást.", - "swap.fail.uniswapX": "A csere nem hajtható végre UniswapX-szel. Próbálja újra a cserét, hogy a klasszikus Uniswap API-n keresztül irányítsa.", - "swap.fees.experience": "Ezt a díjat egyes tokenpárokra alkalmazzák a legjobb Uniswap élmény biztosítása érdekében. Kifizetik a kimeneti tokenben, és már bekerült az árajánlatba.", - "swap.fees.jupiter.label": "Jupiter-díj", - "swap.fees.jupiter.message": "A Solana díjait a Jupiter API számítja fel. Az Uniswap Labs nem kapja meg ezeket a díjakat.", - "swap.fees.noFee": "A kiválasztott tokenpárokra díjat számítanak fel, hogy a legjobb Uniswap élményt biztosítsák. Ehhez a cseréhez nem jár díj.", - "swap.finalizingQuote": "Árajánlat véglegesítése...", - "swap.form.header": "Csere", - "swap.form.warning.output.fotFees": "A {{fotCurrencySymbol}}jelképes díj miatt a swap összegeket csak a beviteli mező segítségével lehet megadni", - "swap.form.warning.output.fotFees.fallback": "A swap összegek a jelképes díjak miatt csak a beviteli mező használatával adhatók meg", - "swap.form.warning.output.solana": "A pontos kimenet nem támogatott a Solana rendszeren.", - "swap.form.warning.restore": "Helyezze vissza pénztárcáját a cseréhez", - "swap.frontrun.warning": "Előfordulhat, hogy az Ön tranzakciója előre lebonyolított, és kedvezőtlen kereskedést eredményezhet.", - "swap.header.viewOnly": "Csak megtekintésre", - "swap.impactOfTrade": "Az Ön kereskedésének hatása ennek a poolnak a piaci árára.", - "swap.impactOfTrade.uniswapx": "A piaci ár és a végrehajtási ár közötti különbség, figyelembe véve az UniswapX gázmegtakarítást.", - "swap.impactOfTrade.uniswapx.missing": "Előfordulhat, hogy az alacsony likviditású párok esetében nem állnak rendelkezésre árhatás számítások.", - "swap.inputEstimated.atMost": "A bemenet becsült. Legfeljebb ad el, különben a tranzakció visszaáll.", - "swap.limit": "Határ", - "swap.limitFilled": "Limit betöltött!", - "swap.limitSubmitted": "Limit elküldve", - "swap.marketPrice.outsideRange.label": "A piaci ár kívül esik a megadott ártartományon. Csak egy eszköz betét.", - "swap.min.price": "Minimális ár", - "swap.networkCost.paidIn": "A hálózati költséget {{sym}} -ban kell fizetni a {{chainName}} hálózaton az ügylet lebonyolítása érdekében.", - "swap.orderRouting": "Rendelési útválasztás", - "swap.outputEstimated.atLeast": "A kimenet becsült. Legalább érkezik, különben a tranzakció visszaáll.", - "swap.placeOrder": "Rendelés leadása", - "swap.priceImpact": "Árhatás", - "swap.request.title.full": "Csere {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "Cserélje ki a tokeneket", - "swap.review": "Véleménycsere", - "swap.review.summary": "Cserélsz", - "swap.reviewLimit": "Ellenőrzési korlát", - "swap.route.optimizedGasCost": "Ez az útvonal minden lépésnél figyelembe veszi a megosztott útvonalakat, a többszörös ugrásokat és a hálózati költségeket.", - "swap.routing.jupiter.description": "A Jupiter több forrásból összesíti a likviditást, hogy a legjobb árakat kínálja Önnek.", - "swap.routing.uniswapAutoRouter.description": "Az Uniswap Auto Router figyelembe veszi az optimális útvonalakat és hálózati költségeket, hogy a legjobb árakat kínálja.", - "swap.settings.deadline.tooltip": "A tranzakció visszaáll, ha az ennél hosszabb ideig függőben van. (Maximum: 3 nap).", - "swap.settings.deadline.warning": "Magas határidő", - "swap.settings.oneClickSwap.title": "1 kattintásos cserék", - "swap.settings.oneClickSwap.tooltip": "Összefogja a szabványos kereskedelmi műveleteket a gyorsabb és költséghatékonyabb cserék érdekében.", - "swap.settings.protection.description": "A cserevédelem bekapcsolásával az Ethereum-tranzakciói védettek lesznek a szendvicstámadásokkal szemben, és csökken a kudarc esélye.", - "swap.settings.protection.subtitle.supported": "{{chainName}} Hálózat", - "swap.settings.protection.subtitle.unavailable": "Nem érhető el itt: {{chainName}}", - "swap.settings.protection.title": "Cserevédelem", - "swap.settings.routingPreference.option.default.description": "Ennek az opciónak a kiválasztása azonosítja a leghatékonyabb útvonalat a cseréhez.", - "swap.settings.routingPreference.option.default.description.preV4": "Az Uniswap kliens az ár és a hálózati költségek figyelembevételével a legolcsóbb kereskedési lehetőséget választja.", - "swap.settings.routingPreference.option.default.description.uniswapXUnavailable": "Az UniswapX nem érhető el a pénztárcádhoz", - "swap.settings.routingPreference.option.default.tooltip": "Az útvonal a v2, v3 és bizonyos v4 készletek alapján kerül meghatározásra, figyelembe véve a becsült árhatást és a hálózati költségeket.", - "swap.settings.routingPreference.option.v2.title": "v2-készletek engedélyezése", - "swap.settings.routingPreference.option.v3.title": "v3-as készletek engedélyezése", - "swap.settings.routingPreference.option.v4.hooks.title": "v4 hookkészletek engedélyezése", - "swap.settings.routingPreference.option.v4.hooks.tooltip": "A V4 horgok útvonalakat cserélnek egy előre jóváhagyott horgok halmazán keresztül.", - "swap.settings.routingPreference.option.v4.title": "v4-készletek engedélyezése", - "swap.settings.routingPreference.title": "Kereskedelmi lehetőségek", - "swap.settings.slippage.alert": "Magas csúszás", - "swap.settings.slippage.control.auto": "Auto", - "swap.settings.slippage.description": "A tranzakció visszaáll, ha az ár a csúszási százaléknál nagyobb mértékben változik.", - "swap.settings.slippage.input.message": "Ha az ár tovább csúszik, a tranzakció visszaáll. Az alábbiakban látható a garantáltan megkapott minimális összeg.", - "swap.settings.slippage.input.receive.title": "Fogadjon legalább", - "swap.settings.slippage.output.message": "Ha az ár tovább csúszik, a tranzakció visszaáll. Az alábbiakban látható a maximálisan elkölthető összeg.", - "swap.settings.slippage.output.spend.title": "Legfeljebb költeni", - "swap.settings.slippage.warning": "Nagyon nagy csúszás", - "swap.settings.slippage.warning.description": "A 20% feletti csúszás valószínűleg kedvezőtlen kereskedést eredményez. Csökkentse a beállításokat az első lépések kockázatának csökkentése érdekében.", - "swap.settings.slippage.warning.hover": "Ez kedvezőtlen kereskedést eredményezhet. Próbálja csökkenteni a csúszási beállítást.", - "swap.settings.slippage.warning.max": "Adjon meg egy kisebb értéket, mint {{maxSlippageTolerance}}", - "swap.settings.slippage.warning.message": "A csúszás a szükségesnél nagyobb lehet", - "swap.settings.slippage.warning.min": "Adjon meg 0-nál nagyobb értéket", - "swap.settings.title": "Cserélje ki a beállításokat", - "swap.settings.transactionRevertPrice": "A tranzakció visszaáll, ha az ár ennél a százaléknál nagyobb mértékben változik kedvezőtlenül.", - "swap.signAndSwap": "Írd alá és cseréld", - "swap.slippage.amt": "{{amt}} csúszás", - "swap.slippage.bridging": "Nincs csúszás a hálózatok közötti csere során", - "swap.slippage.description": "Különbség a várt és a végrehajtott ár között egy swapügyleten. Az eltérések alacsony likviditás, piaci volatilitás vagy botok miatt fordulhatnak elő. \n\nAz Uniswap Protection védelmet nyújt az előretolt botok és a MEV ellen.", - "swap.slippage.settings.title": "Csúszási beállítások", - "swap.slippage.tooltip": "A tranzakció előtti maximális ármozgás visszaáll.", - "swap.slippageBelow.warning": "A {{amt}} alatti elcsúszás sikertelen tranzakcióhoz vezethet", - "swap.submitted": "Csere beküldve", - "swap.success": "Csere siker!", - "swap.tokenOwnFees": "Egyes tokenek vásárlásukkor vagy eladásukkor díjat számítanak fel, amelyet a token kibocsátója határoz meg. Az Uniswap nem kapja meg ezeket a díjakat.", - "swap.tradeRoutes": "Kereskedelmi utak", - "swap.transaction.deadline": "Tranzakció határideje", - "swap.transaction.revertAfter": "A tranzakció visszaáll, ha az ennél hosszabb ideig függőben van.", - "swap.warning.enterLargerAmount.title": "Adjon meg nagyobb összeget", - "swap.warning.expectedFailure.increaseSlippage": "Próbálja meg növelni a csúszását.", - "swap.warning.expectedFailure.titleMay": "Ez a csere sikertelen lehet", - "swap.warning.insufficientBalance.title": "Nincs elég {{currencySymbol}}", - "swap.warning.insufficientGas.button": "Nem elég {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "Csere {{ tokenSymbol }} értékre {{networkName}}-n", - "swap.warning.insufficientGas.button.buy": "Vásároljon {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "Vásároljon kártyával", - "swap.warning.insufficientGas.message.withNetwork": "Nem elég {{currencySymbol}} {{networkName}} a cseréhez", - "swap.warning.insufficientGas.message.withoutNetwork": "Nem elég {{currencySymbol}} a cseréhez", - "swap.warning.insufficientGas.title": "Nincs elég {{currencySymbol}} a hálózati költségek fedezésére", - "swap.warning.networkFee.allow": "{{ inputTokenSymbol }} engedélyezése (egyszer)", - "swap.warning.networkFee.delegation.message": "Ez a tranzakció feldolgozásának és az okostárca Unichain-en történő aktiválásának költsége. Az Uniswap Labs nem részesül ezekből a díjakból.", - "swap.warning.networkFee.highRelativeToValue": "A hálózati költség meghaladja a tranzakció teljes értékének 10%-át. Ez a tranzakció feldolgozási költsége a blokkláncon. Az Uniswap nem részesül ezekből a díjakból.", - "swap.warning.networkFee.highRelativeToValue.unichain": "A hálózati költség meghaladja a tranzakció teljes értékének 10%-át. Ez a tranzakció feldolgozási költsége a blokkláncon.", - "swap.warning.networkFee.includesDelegation": "Tartalmazza az intelligens pénztárca aktiválását", - "swap.warning.networkFee.message": "Ez a tranzakció folyamatának költsége a blokkláncon. Az Uniswap nem részesül ezekből a díjakból.", - "swap.warning.networkFee.message.unichain": "Ez a tranzakció folyamatának költsége a blokkláncon.", - "swap.warning.networkFee.message.uniswapX": "Ez a tranzakció folyamatának költsége a blokkláncon. Az Uniswap nem részesül ezekből a díjakból. UniswapX aggregálja a likviditási forrásokat a jobb árak és a gázmentes csereügyletek érdekében.", - "swap.warning.networkFee.message.uniswapX.title": "Nincsenek hálózati költségek az UniswapX-szel", - "swap.warning.networkFee.message.uniswapX.unichain": "Ez a tranzakció feldolgozási költsége a blokkláncon. UniswapX aggregálja a likviditási forrásokat a jobb árak és a gázmentes csereügyletek érdekében.", - "swap.warning.noQuotesFound.bridging.message": "Nem található áthidaló idézet. Próbálja meg most a hivatalos hidat használni.", - "swap.warning.noQuotesFound.title": "Nem található idézet", - "swap.warning.noRoutesFound.message": "Jelenleg nincsenek elérhető útvonalak a kiválasztott tokenekhez. Próbálkozzon másik párral, vagy ellenőrizze később.", - "swap.warning.noRoutesFound.title": "Nincsenek elérhető útvonalak", - "swap.warning.offline.message": "Lehetséges, hogy megszakadt az internetkapcsolat, vagy a hálózat nem működik. Kérjük, ellenőrizze internetkapcsolatát, és próbálja újra.", - "swap.warning.offline.title": "Ön offline állapotban van", - "swap.warning.priceImpact.message": "A jelenleg rendelkezésre álló {{outputCurrencySymbol}} likviditás mennyisége miatt minél több {{inputCurrencySymbol}} -t próbál meg swapolni, annál kevesebb {{outputCurrencySymbol}} -t fog kapni.", - "swap.warning.priceImpact.message.veryHigh": "Ez a tranzakció {{priceImpactValue}} árhatást fog okozni ennek a poolnak a piaci árára, és forráskiesést eredményez.", - "swap.warning.priceImpact.title": "Magas árhatás ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "Nagyon nagy árhatás ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "A tranzakciót nem küldte el, mert bezárta az alkalmazást.", - "swap.warning.queuedOrder.approvalFailed": "A tranzakció nem lett elküldve, mert a token jóváhagyása nem sikerült.", - "swap.warning.queuedOrder.stale": "A tranzakció nem lett elküldve, mert bezárta az alkalmazást, vagy a jóváhagyás túl sokáig tartott.", - "swap.warning.queuedOrder.submissionFailed": "Hiba történt a tranzakció elküldésekor.", - "swap.warning.queuedOrder.title": "Csere lemondva", - "swap.warning.rateLimit.message": "Kérjük, próbálja újra néhány perc múlva.", - "swap.warning.rateLimit.title": "A díjkorlát túllépve", - "swap.warning.router.message": "Lehetséges, hogy megszakadt a kapcsolat, vagy nem működik a hálózat. Ha a probléma továbbra is fennáll, próbálkozzon újra később.", - "swap.warning.router.title": "Ez a kereskedés jelenleg nem fejezhető be", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} le van tiltva", - "swap.warning.tokenBlockedFallback.button": "A token le van tiltva", - "swap.warning.uniswapFee.message": "A Uniswap szolgáltatással a legjobb felhasználói élmény biztosítása érdekében díjakat számítunk fel.", - "swap.warning.uniswapFee.message.default": "A díjakat a legjobb Uniswap-élmény biztosítása érdekében alkalmazzuk. Ehhez a cseréhez nem jár díj.", - "swap.warning.uniswapFee.message.included": "A díjakat a legjobb Uniswap-élmény biztosítása érdekében alkalmazzuk, és ezeket már figyelembe vettük ebben az árajánlatban.", - "swap.warning.uniswapFee.title": "Cseredíj", - "swap.warning.viewOnly.message": "A tokenek cseréjéhez a helyreállítási kifejezésen keresztül importálnia kell ezt a pénztárcát.", - "swap.wrap.token": "Burkolj {{sym}}", - "tdp.balanceSummary.otherNetworks": "Más hálózatokon", - "tdp.balanceSummary.otherNetworksBalance": "Egyensúly más hálózatokon", - "tdp.balanceSummary.title": "Az egyensúlyod", - "tdp.button.getToken": "Szerezz {{ tokenSymbol }}", - "tdp.button.getTokenFallback": "Szerezzen be Tokent", - "tdp.loading.title.default": "token adatok a számára", - "tdp.loading.title.withChain": " tokenadatok a {{chainName}}-n", - "tdp.nameNotFound": "A név nem található", - "tdp.noInfoAvailable": "Nem áll rendelkezésre token információ", - "tdp.noTestnetSupportDescription": "Egyes teszthálózatok nem támogatják a tokenek cseréjét, küldését vagy vásárlását.", - "tdp.symbolNotFound": "A szimbólum nem található", - "testnet.modal.swapDeepLink.description.toProdMode": "Ehhez a művelethez le kell tiltani a teszthálózati módot. A Testnet mód a beállításokon belül bármikor újra engedélyezhető.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "Ehhez a művelethez engedélyezni kell a teszthálózati módot. A teszthálókon található tokenek nem rendelkeznek valós értékkel. A Testnet mód bármikor letiltható a beállításokon belül.", - "testnet.modal.swapDeepLink.title.toProdMode": "A tesztnet mód letiltása", - "testnet.modal.swapDeepLink.title.toTestnetMode": "Engedélyezze a teszthálózati módot", - "testnet.unsupported": "Ez a funkció nem támogatott tesztnet módban.", - "themeToggle.theme": "Téma", - "title.buySellTradeEthereum": "Vásárolj, adj el és cserélj Ethereumot és más legjobb tokeneket az Uniswap-on", - "title.createGovernanceOn": "Hozzon létre új irányítási javaslatot az Uniswapban", - "title.createGovernanceTo": "Hozzon létre egy új irányítási javaslatot, amelyről az UNI tulajdonosai szavazhatnak. Az UNI tokenek az Uniswap irányításának szavazati jogát képviselik.", - "title.earnFees": "Szerezzen díjat, amikor mások Uniswapban cserélnek, ha tokeneket adnak a likviditási készletekhez.", - "title.easilyRemove": "Könnyen távolítsa el likviditását az Uniswap v2-ből, és helyezzen be a Uniswap v3-ba.", - "title.easilyRemoveV4": "Könnyen távolítsa el likviditását az Uniswap v2-ből és v3-ból, hogy befizesse az Uniswap v4-be.", - "title.extension.uninstall": "Bővítmény eltávolítva", - "title.extensionPasskeyLogIn": "Bejelentkezés jelszóval", - "title.managePasskeys": "Unswap | Kezelje jelszavát", - "title.migratev2": "A v2 pool likviditásának migrálása az Uniswap v3-ra", - "title.migratev3": "A készlet likviditásának migrálása az Uniswap v4-re", - "title.placeLimit": "Adjon le limites megbízásokat az Uniswap oldalon", - "title.realTime": "Valós idejű árak, diagramok, tranzakciós adatok és egyebek.", - "title.removeLiquidityv2": "Távolítsa el a pool likviditását (v2) az Uniswapnál", - "title.removePoolLiquidity": "Távolítsa el a pool likviditását az Uniswap során", - "title.removeTokensv2": "Távolítsa el a tokeneket a v2 likviditási készletekből.", - "title.removev3Liquidity": "Távolítsa el a tokeneket a v3 likviditási készletekből.", - "title.sendCrypto": "Kriptovaluta küldése", - "title.sendTokens": "Token küldése Uniswap-on", - "title.swappingMadeSimple": "Azonnal vásárolj és adj el kriptovalutákat Ethereumon, Base-en, Arbitrumon, Polygonon, Unichainen és más platformokon. A DeFi platform, ahol milliók bíznak.", - "title.tradeTokens": "Kereskedjen tokenekkel és biztosítson likviditást. Valós idejű árak, diagramok, tranzakciós adatok és egyebek.", - "title.uniswapTradeCrypto": "Uniswap | Kereskedjen kriptovalutákkal a DeFi vezető tőzsdéjén ", - "title.uniToken": "Az UNI tokenek az Uniswap irányításának szavazati jogát képviselik. Minden javaslatról szavazhat saját maga, vagy átruházhatja szavazatait harmadik félre.", - "title.voteOnGov": "Szavazás az Uniswap irányítási javaslatairól", - "token.balances.main": "Az egyensúlyod", - "token.balances.other": "Egyenlegek más hálózatokon", - "token.balances.viewOnly": "{{ownerAddress}}egyenlege", - "token.bridge": "{{label}} token híd", - "token.chart.candlestick.unavailable": "Ehhez a tokenhez nem állnak rendelkezésre gyertyatartó diagramok", - "token.chart.tooltip": "Díjak: {{amount}}", - "token.details": "Token részletei", - "token.error.unknown": "Ismeretlen token", - "token.fee.buy.label": "vásárlási díj", - "token.fee.label": "díj", - "token.fee.sell.label": "eladási díj", - "token.links.title": "Linkek", - "token.links.twitter": "Twitter", - "token.links.website": "Weboldal", - "token.notFound.description": "Sajnos nem találtunk információt ehhez a tokenhez. Ellenőrizze a nevet és címet, majd próbálja újra.", - "token.notFound.title": "Token nem található", - "token.priceExplorer.error.description": "Valami elromlott.", - "token.priceExplorer.error.title": "Nem sikerült betölteni az árdiagramot", - "token.priceExplorer.timeRangeLabel.all": "Mindig", - "token.priceExplorer.timeRangeLabel.day": "1D", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 nap", - "token.priceExplorer.timeRangeLabel.hour": "1H", - "token.priceExplorer.timeRangeLabel.month": "1M", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 hónap", - "token.priceExplorer.timeRangeLabel.week": "1W", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 hét", - "token.priceExplorer.timeRangeLabel.year": "1Y", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 év", - "token.safety.blocked.title.tokenNotAvailable": "A {{tokenSymbol}} nem érhető el", - "token.safety.blocked.title.tokensNotAvailable": "A {{tokenSymbol0}} és {{tokenSymbol1}} nem elérhető", - "token.safety.fee.detected": "Token díj észlelve", - "token.safety.fees.uniswapLabsDoesNotReceive": "Az Uniswap Labs nem kapja meg ezeket a díjakat.", - "token.safety.warning.alwaysDoYourResearch": "Mindig végezzen kutatást", - "token.safety.warning.blocked.description.default_one": "Ezzel a tokent nem lehet kereskedni az Uniswap alkalmazással.", - "token.safety.warning.blocked.description.default_other": "Ezekkel a tokenekkel nem kereskedhet az Uniswap alkalmazással.", - "token.safety.warning.copyContractAddress.message": "Ez egy szerződési cím, amely a blokkláncon lévő tokenek egyedi azonosítójaként működik. Az erre a címre küldött kriptográfiai adatok elvesznek.", - "token.safety.warning.copyContractAddress.title": "Ne küldjön titkosítást erre a címre", - "token.safety.warning.dontShowWarningAgain": "Ne mutasd többé ezt a figyelmeztetést", - "token.safety.warning.dontShowWarningAgainShort": "Ne mutassa meg újra", - "token.safety.warning.doYourOwnResearch": "Mindig végezzen saját kutatást, mielőtt folytatná.", - "token.safety.warning.feeDescription": " -t tölt fel, amikor {{action}}", - "token.safety.warning.flaggedAsMalicious": "Rosszindulatúként megjelölve", - "token.safety.warning.flaggedAsSuspicious": "Gyanúsként megjelölve", - "token.safety.warning.fotHigh.title": "Magas díj észlelve", - "token.safety.warning.fotLow.title": "Díj észlelve", - "token.safety.warning.fotVeryHigh.title": "Nagyon magas díjat észleltek", - "token.safety.warning.honeypot.message": "A {{tokenSymbol}} eladhatatlanként lett megjelölve. Ennek a tokennek a cseréje a pénzeszközök elvesztését eredményezheti.", - "token.safety.warning.honeypot.title": "100%-os eladási díj észlelve", - "token.safety.warning.impersonator": "Egy másik tokent személyesíti meg", - "token.safety.warning.impersonator.title": "Megszemélyesítő token észlelve", - "token.safety.warning.malicious.general.message": "A {{tokenSymbol}} rosszindulatúként jelölte meg a Blockaid.", - "token.safety.warning.malicious.impersonator.message": "A {{tokenSymbol}} a Blockaid megjelölte, mert egy másik tokent próbált másolni. Lehet, hogy nem az a token, amelyet cserélni szeretne.", - "token.safety.warning.malicious.impersonator.message.short": "Előfordulhat, hogy a {{tokenSymbol}} nem az a token, amelyet cserélni szeretne.", - "token.safety.warning.malicious.title": "Rosszindulatú token észlelve", - "token.safety.warning.mayResultInLoss": "A csere pénzkiesést okozhat.", - "token.safety.warning.medium.heading.named": "A {{tokenSymbol}} -vel nem kereskednek a vezető amerikai központosított tőzsdéken.", - "token.safety.warning.notListedOnExchanges": "Nem jegyzik a vezető amerikai tőzsdéken", - "token.safety.warning.potentialHoneypot.card.message": "A Blockaid {{tokenSymbol}} gyanúsként jelölte meg.", - "token.safety.warning.potentialHoneypot.modal.message": "A {{tokenSymbol}} potenciális mézesedényként jelölte meg a Blockaid. Mindig végezzen saját kutatást, mielőtt továbblép.", - "token.safety.warning.potentialHoneypot.title": "Lehetséges mézesedény észlelve", - "token.safety.warning.sellFee100.message": "A {{ tokenSymbol }} eladhatatlanként lett megjelölve.", - "token.safety.warning.sellFee100.title": "100%-os eladási díj észlelve", - "token.safety.warning.spam.message": "{{tokenSymbol}} a Blockaid spamként jelölte meg.", - "token.safety.warning.spam.title": "Spam token észlelve", - "token.safety.warning.spamsUsers": "Spam felhasználók", - "token.safety.warning.tokenChargesFee.both.message": "A {{tokenSymbol}} {{buyFeePercent}} díjat számít fel vásárláskor és {{sellFeePercent}} adásvétel esetén.", - "token.safety.warning.tokenChargesFee.buy.message": "A {{tokenSymbol}} {{feePercent}} díjat számít fel vásárláskor.", - "token.safety.warning.tokenChargesFee.buy.message.descriptive": "A {{tokenSymbol}} {{feePercent}} díjat számít fel vásárláskor. A csere pénzveszteséget eredményezhet. Az Uniswap Labs nem kap ilyen díjakat.", - "token.safety.warning.tokenChargesFee.sell.message": "A {{tokenSymbol}} {{feePercent}} díjat számít fel eladáskor.", - "token.safety.warning.tokenChargesFee.sell.message.descriptive": "A {{tokenSymbol}} {{feePercent}} díjat számít fel eladáskor. A csere pénzveszteséget eredményezhet. Az Uniswap Labs nem kap ilyen díjakat.", - "token.safety.warning.tokenChargesFee.unknownFee.message": "A {{tokenSymbol}} vásárláskor vagy eladáskor díjat számít fel.", - "token.safetyLevel.blocked.message": "Ezzel a tokennel nem kereskedhet az Uniswap Wallet használatával.", - "token.safetyLevel.medium.message.plural": "Ezekkel a tokenekkel nem kereskednek a vezető amerikai központosított tőzsdéken. Mindig végezzen saját kutatást, mielőtt folytatná.", - "token.selector.search.error": "Nem sikerült betölteni a keresési eredményeket", - "token.stats.fullyDilutedValuation": "Teljesen hígított értékelés", - "token.stats.marketCap": "Piac Cap", - "token.stats.priceHighYear": "52W magas", - "token.stats.priceLowYear": "52W alacsony", - "token.stats.section.about": "Körülbelül {{token}}", - "token.stats.title": "Statisztika", - "token.stats.translation.original": "Mutasd az eredetit", - "token.stats.translation.translate": "Fordítás {{language}}nyelvre", - "token.stats.volume": "24 órás hangerő", - "token.symbol.input.fallback": "Beviteli token", - "token.symbol.output.fallback": "Kimeneti token", - "token.wrap.fail.message": "Az Uniswap protokollon a swapok ETH-val kezdődhetnek és végződhetnek. A csere során azonban az ETH WETH-ba kerül.", - "token.zeroNativeBalance.description.mainnet": "Cserélned kell egy tokent az Ethereumon, hogy {{ tokenSymbol }}-t kapj. A cseréhez ETH szükséges a hálózati költségekhez.", - "token.zeroNativeBalance.description.otherChains": "A {{ chainName }} tokent fel kell cserélnie a {{ tokenSymbol }}eléréséhez. A cseréhez {{ chainName }} {{ nativeTokenSymbol }} szükséges a hálózati költségekhez.", - "token.zeroNativeBalance.subtitle": "A {{ tokenSymbol }} nem vásárolható meg közvetlenül.", - "token.zeroNativeBalance.title.mainnet": "{{ nativeTokenName }}kell", - "token.zeroNativeBalance.title.otherChains": "A {{ nativeTokenName }} {{ chainName }}-n kell", - "tokens.action.hide": "Token elrejtése", - "tokens.action.unhide": "Token felfedése", - "tokens.nfts.action.viewOnExplorer": "Megtekintés itt: {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "Nem sikerült betölteni az NFT-gyűjteményt", - "tokens.nfts.collection.label.items": "Tételek", - "tokens.nfts.collection.label.owners": "Tulajdonosok", - "tokens.nfts.collection.label.priceFloor": "Padló", - "tokens.nfts.collection.label.swapVolume": "Hangerő", - "tokens.nfts.connectEthereumToView": "Csatlakoztasson egy Ethereum-tárcát az NFT-k megtekintéséhez", - "tokens.nfts.details.contract.address": "Szerződés címe", - "tokens.nfts.details.error.load.title": "Nem sikerült betölteni az NFT-adatokat", - "tokens.nfts.details.network": "Hálózat", - "tokens.nfts.details.owner": "Tulajdonában lévő", - "tokens.nfts.details.price": "Jelenlegi ár", - "tokens.nfts.details.recentPrice": "Utolsó eladási ár", - "tokens.nfts.details.traits": "Tulajdonságok", - "tokens.nfts.empty.description": "Nem található NFT", - "tokens.nfts.error.unavailable": "A tartalom nem érhető el", - "tokens.nfts.hidden.action.hide": "NFT elrejtése", - "tokens.nfts.hidden.action.unhide": "NFT felfedése", - "tokens.nfts.link.collection": "Gyűjtemény weboldala", - "tokens.nfts.list.error.load.title": "Nem sikerült betölteni az NFT-ket", - "tokens.nfts.list.none.button": "NFT-k fogadása", - "tokens.nfts.list.none.description.default": "A kezdéshez vigye át NFT-ket egy másik pénztárcából.", - "tokens.nfts.list.none.description.external": "Amikor ez a pénztárca NFT-ket vásárol vagy fogad, azok itt fognak megjelenni.", - "tokens.nfts.list.none.title": "Még nincsenek NFT-k", - "tokens.nfts.notAvailableOnSolana": "Az NFT-k nem érhetők el a Solana-n", - "tokens.selector.button.choose": "Válassza ki a tokent", - "tokens.selector.empty.buy.message": "Vásároljon kriptot kártyával vagy bankkal tokenek küldéséhez.", - "tokens.selector.empty.buy.title": "Vásároljon kriptot", - "tokens.selector.empty.receive.title": "Token fogadása", - "tokens.selector.empty.title": "Még nincsenek tokenek", - "tokens.selector.error.load": "Nem sikerült betölteni a tokeneket", - "tokens.selector.search.empty": "Nincs találat a következőre: {{searchText}}", - "tokens.selector.search.placeholder": "Tokenek keresése", - "tokens.selector.section.bridging": "Csere a hálózatok között", - "tokens.selector.section.favorite": "Kedvencek", - "tokens.selector.section.otherNetworksSearchResults": "Más hálózatokon található tokenek", - "tokens.selector.section.otherSearchResults": "Egyéb tokenek a {{network}}oldalon", - "tokens.selector.section.recent": "Legutóbbi keresések", - "tokens.selector.section.search": "Keresési eredmények", - "tokens.selector.section.trending": "Tokenek 24 órás hangerővel", - "tokens.selector.section.yours": "A tokenek", - "tokens.table.search.placeholder.pools": "Keresés a medencékben", - "tokens.table.search.placeholder.tokens": "Tokenek keresése", - "tokens.table.search.placeholder.transactions": "Keressen tranzakciókat", - "toucan.auction.bidConcentration": "Tukán koncentráció", - "toucan.auction.bidConcentration.tooltip.description": "Tukán elemleírás leírása", - "toucan.auction.bidConcentration.tooltip.title": "Tukán elemleírás címe", - "toucan.auctions": "Aukciók", - "toucan.bidForm.maxBudget": "Max. költségvetés", - "toucan.bidForm.placeBid": "Tedd meg licitedet", - "toucan.displayMode.tokenPrice": "Token Ár", - "toucan.displayMode.valuation": "Értékelés", - "transaction.action.cancel.button": "Tranzakció törlése", - "transaction.action.cancel.description": "Ha törli ezt a tranzakciót, mielőtt a hálózat feldolgozná, akkor új hálózati költséget kell fizetnie az eredeti helyett.", - "transaction.action.cancel.title": "Törli ezt a tranzakciót?", - "transaction.action.clear": "Törlés függőben", - "transaction.action.copy": "Tranzakcióazonosító másolása", - "transaction.action.copyProvider": "Másolja a {{providerName}} tranzakcióazonosítót", - "transaction.amount.unlimited": "Korlátlan", - "transaction.callData": "Hívásadatok", - "transaction.details.dappName": "App", - "transaction.details.from": "Tól től", - "transaction.details.networkFee": "Hálózati költség", - "transaction.details.networkFee.swap": "Csere hálózati költség", - "transaction.details.providerFee": "Szolgáltatói díj", - "transaction.details.swapRate": "Mérték", - "transaction.details.transaction": "Tranzakció", - "transaction.details.uniswapFee": "Díj ({{ feePercent }}%)", - "transaction.network.all": "Minden hálózat", - "transaction.networkCost.description": "A tranzakció feldolgozásának költsége a blokkláncon. Az Uniswap minimális hálózati költségekre van optimalizálva.", - "transaction.networkCost.includesSmartWalletActivation": "Tartalmazza az intelligens pénztárca aktiválását", - "transaction.networkCost.label": "Hálózati költség", - "transaction.networkCost.maxNativeBalance.description": "A hálózati token egyenlegének egy kis része a tranzakció hálózati költségének fedezésére van fenntartva.", - "transaction.networkCost.maxNativeBalance.title": "Miért nem tudom kihasználni a maximális egyenlegemet?", - "transaction.networkCost.veryHigh.label": "Nagyon magas hálózati költség", - "transaction.notification.error.cancel": "Nem lehet törölni a tranzakciót", - "transaction.notification.error.replace": "A tranzakció nem pótolható", - "transaction.status.approval.canceled": "Jóváhagyás visszavonva", - "transaction.status.approval.failed": "A jóváhagyás sikertelen", - "transaction.status.approve.canceled": "Jóváhagyás visszavonva", - "transaction.status.approve.canceling": "Jóváhagyás visszavonása", - "transaction.status.approve.failed": "Nem sikerült jóváhagyni", - "transaction.status.approve.pending": "Jóváhagyás", - "transaction.status.approve.success": "Jóváhagyott", - "transaction.status.approve.successDapp": "Jóváhagyva: {{externalDappName}}", - "transaction.status.buy.canceled": "Törölt vásárlás", - "transaction.status.buy.canceling": "Vásárlás törlése", - "transaction.status.buy.failed": "Nem sikerült vásárolni", - "transaction.status.buy.pending": "Vásárlás", - "transaction.status.buy.success": "Vásárolt", - "transaction.status.buy.successDapp": "Vásárlás: {{externalDappName}}", - "transaction.status.claim.canceled": "Díjbeszedés törölve", - "transaction.status.claim.canceling": "Díjbeszedés törlése", - "transaction.status.claim.failed": "Díjbeszedés sikertelen", - "transaction.status.claim.pending": "Díjak beszedése", - "transaction.status.claim.success": "Beszedett díjak", - "transaction.status.collect.fees.canceled": "Díjbeszedés törölve", - "transaction.status.collect.fees.failed": "A díjak beszedése nem sikerült", - "transaction.status.collected.fees": "Beszedett díjak", - "transaction.status.collecting.fees": "Díjak beszedése", - "transaction.status.confirm.canceled": "Megerősítés visszavonva", - "transaction.status.confirm.canceling": "Függőben lévő lemondás", - "transaction.status.confirm.failed": "Nem sikerült megerősíteni", - "transaction.status.confirm.pending": "Tranzakció folyamatban", - "transaction.status.confirm.success": "Az ügylet megerősítve", - "transaction.status.confirm.successDapp": "A tranzakció megerősítve ekkor: {{externalDappName}}", - "transaction.status.createPair.canceled": "Pár létrehozása megszakítva", - "transaction.status.createPair.canceling": "Párosítás létrehozása megszakítva", - "transaction.status.createPair.failed": "Nem sikerült létrehozni a párost", - "transaction.status.createPair.pending": "Pár létrehozása", - "transaction.status.createPair.success": "Létrehozott pár", - "transaction.status.createPool.canceled": "Medence létrehozása megszakítva", - "transaction.status.createPool.canceling": "Létrehozási készlet megszakítása", - "transaction.status.createPool.failed": "Nem sikerült létrehozni a medencét", - "transaction.status.createPool.pending": "Medence létrehozása", - "transaction.status.createPool.success": "Létrehozva medence", - "transaction.status.liquidityDecrease.canceled": "Törölt likviditás eltávolítása", - "transaction.status.liquidityDecrease.canceling": "Likviditás eltávolításának visszavonása", - "transaction.status.liquidityDecrease.failed": "A likviditás eltávolítása nem sikerült", - "transaction.status.liquidityDecrease.pending": "A likviditás eltávolítása", - "transaction.status.liquidityDecrease.success": "Likviditás eltávolítva", - "transaction.status.liquidityIncrease.canceled": "Likviditás hozzáadása törölve", - "transaction.status.liquidityIncrease.canceling": "Likviditásnövelés megszakítása", - "transaction.status.liquidityIncrease.failed": "Nem sikerült a likviditás hozzáadása", - "transaction.status.liquidityIncrease.pending": "Likviditás hozzáadása", - "transaction.status.liquidityIncrease.success": "Hozzáadott likviditás", - "transaction.status.lpIncentivesClaim.canceled": "Lemondott LP jutalomigénylés", - "transaction.status.lpIncentivesClaim.canceling": "LP jutalmak igénylésének lemondása", - "transaction.status.lpIncentivesClaim.failed": "Nem sikerült igényelni az LP jutalmakat", - "transaction.status.lpIncentivesClaim.pending": "LP jutalmak igénylése", - "transaction.status.lpIncentivesClaim.success": "Igényelt LP-jutalmak", - "transaction.status.migrateLiquidity.canceled": "Likviditásmigráció törölve", - "transaction.status.mint.canceled": "Törölt menta", - "transaction.status.mint.canceling": "Menta törlése", - "transaction.status.mint.failed": "Nem sikerült menteni", - "transaction.status.mint.pending": "Pénzverés", - "transaction.status.mint.success": "Verés", - "transaction.status.mint.successDapp": "Verés: {{externalDappName}}", - "transaction.status.offramp.canceled": "Leszállópálya törölve", - "transaction.status.offramp.failed": "Leszállási kísérlet sikertelen", - "transaction.status.offramp.pending": "Lehajtás", - "transaction.status.offramp.success": "Lefelé haladva", - "transaction.status.onramp.canceled": "A felhajtó lemondva", - "transaction.status.onramp.failed": "A rámpára lépés sikertelen", - "transaction.status.onramp.pending": "Felhajtás", - "transaction.status.onramp.success": "Rámpázott", - "transaction.status.permit.approved": "Engedély jóváhagyva", - "transaction.status.permit.canceled": "Engedélyezett átvitel törölve", - "transaction.status.permit.failed": "Engedélyezés sikertelen", - "transaction.status.purchase.canceled": "Törölt vásárlás", - "transaction.status.purchase.canceling": "Vásárlás törlése", - "transaction.status.purchase.failed": "Vásárlás sikertelen", - "transaction.status.purchase.failedOn": "Nem sikerült vásárolni a {{serviceProvider}}napon", - "transaction.status.purchase.pending": "Vásárlás", - "transaction.status.purchase.pendingOn": "Vásárlás itt: {{serviceProvider}}", - "transaction.status.purchase.successOn": "Vásárlás: {{serviceProvider}}", - "transaction.status.receive.canceled": "Fogadás megszakítva", - "transaction.status.receive.canceling": "Fogadás megszakítása", - "transaction.status.receive.failed": "Sikertelen fogadás", - "transaction.status.receive.failedFrom": "Nem sikerült fogadni a {{serviceProvider}}címről", - "transaction.status.receive.pending": "Fogadás", - "transaction.status.receive.pendingFrom": "Fogadás innen: {{serviceProvider}}", - "transaction.status.receive.success": "Megérkezett", - "transaction.status.receive.successDapp": "Beérkezett {{externalDappName}}", - "transaction.status.receive.successFrom": "Kapva innen: {{serviceProvider}}", - "transaction.status.removeDelegation.canceled": "A delegálás eltávolítása megszakítva", - "transaction.status.removeDelegation.failed": "A delegálás eltávolítása sikertelen", - "transaction.status.removeDelegation.pending": "Delegálás eltávolítása", - "transaction.status.removeDelegation.success": "Felhatalmazás eltávolítva", - "transaction.status.revoke.canceled": "Visszavonás visszavonva", - "transaction.status.revoke.canceling": "Visszavonás visszavonása", - "transaction.status.revoke.failed": "Nem sikerült visszavonni", - "transaction.status.revoke.pending": "Visszavonás", - "transaction.status.revoke.success": "Visszavonva", - "transaction.status.revoke.successDapp": "Visszavonva ekkor: {{externalDappName}}", - "transaction.status.sale.canceled": "Törölt értékesítés", - "transaction.status.sale.canceling": "Eladás törlése", - "transaction.status.sale.failedOn": "Az értékesítés sikertelen a következőn keresztül: {{serviceProvider}}", - "transaction.status.sale.pendingCard.msg": "Tudjon meg többet a kriptoértékesítésről.", - "transaction.status.sale.pendingCard.title": "Miért van még folyamatban az eladásom?", - "transaction.status.sale.pendingOn": "Eladás: {{serviceProvider}}", - "transaction.status.sale.successOn": "{{serviceProvider}}keresztül értékesítve", - "transaction.status.sell.canceled": "Eladás törölve", - "transaction.status.sell.canceling": "Eladás visszavonása", - "transaction.status.sell.failed": "Nem sikerült eladni", - "transaction.status.sell.pending": "Eladási", - "transaction.status.sell.success": "Eladott", - "transaction.status.sell.successDapp": "Eladás dátuma: {{externalDappName}}", - "transaction.status.send.canceled": "Küldés megszakítva", - "transaction.status.send.canceling": "Küldés megszakítása", - "transaction.status.send.failed": "nem sikerült elküldeni", - "transaction.status.send.pending": "Küldés", - "transaction.status.send.success": "Küldött", - "transaction.status.send.successDapp": "Elküldve: {{externalDappName}}", - "transaction.status.swap.canceled": "Csere lemondva", - "transaction.status.swap.canceling": "Csere lemondása", - "transaction.status.swap.expired": "A csere lejárt", - "transaction.status.swap.failed": "Nem sikerült a csere", - "transaction.status.swap.insufficientFunds": "Fedezethiány", - "transaction.status.swap.pending": "Csere", - "transaction.status.swap.success": "Cserélve", - "transaction.status.swap.successDapp": "Cserélve a {{externalDappName}}-ra", - "transaction.status.unwrap.canceled": "Kibontás megszakítva", - "transaction.status.unwrap.canceling": "Kibontás megszakítása", - "transaction.status.unwrap.failed": "Nem sikerült kicsomagolni", - "transaction.status.unwrap.pending": "Kicsomagolás", - "transaction.status.unwrap.success": "Kibontva", - "transaction.status.unwrap.successDapp": "Kibontva: {{externalDappName}}", - "transaction.status.wrap.canceled": "Törölt pakolás", - "transaction.status.wrap.canceling": "A pakolás visszavonása", - "transaction.status.wrap.failed": "Nem sikerült becsomagolni", - "transaction.status.wrap.pending": "Csomagolás", - "transaction.status.wrap.success": "Csomagolt", - "transaction.status.wrap.successDapp": "{{externalDappName}}-ra burkolva", - "transaction.submittedOn": "Beküldve:", - "transaction.summary.liquidity": "{{firstAmountWithSymbol}} és {{secondAmountWithSymbol}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} a {{recipientAddress}}", - "transaction.summary.received.noAmount": "{{name}}-tól érkezett", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} innen: {{senderAddress}}", - "transaction.summary.sent.noAmount": "Elküldve ide: {{name}}", - "transaction.warning.insufficientGas.modal.message": "A tranzakció hálózati költségeinek fedezéséhez ~{{tokenAmount}} {{tokenSymbol}} () szükséges a {{networkName}} oldalon. Cserélj {{tokenSymbol}} egy másik láncról, vagy vásárolj a kártyáddal a folytatáshoz.", - "transaction.warning.insufficientGas.modal.message.noAction": "A tranzakció hálózati költségeinek fedezéséhez ~{{tokenAmount}} {{tokenSymbol}} () szükséges a {{networkName}} oldalon.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount": "A tranzakció hálózati költségeinek fedezéséhez ~{{tokenAmount}} {{tokenSymbol}} () szükséges a {{networkName}} oldalon.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount.noAction": "Az erre a tokenre való cseréhez több {{tokenSymbol}} kell a {{networkName}}oldalon.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "Nem elég {{tokenSymbol}} a {{networkName}}-n", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Nem elég {{tokenSymbol}}", - "transaction.warning.maxNative.message": "Hamarosan elkölti hálózati token egyenlegének nagy részét. Ez nem hagyhat elegendő forrást a jövőbeli hálózati költségek fedezésére.", - "transaction.warning.maxNative.title": "Alacsony hálózati token egyenleg", - "transaction.watcher.error.cancel": "Nem lehet törölni a tranzakciót", - "transaction.watcher.error.status": "Hiba a tranzakció állapotának ellenőrzése közben", - "uniswapX.aggregatesLiquidity": " aggregálja a likviditási forrásokat a jobb árak és a gázmentes csereügyletek érdekében.", - "uniswapX.cost": "Az UniswapX megszünteti a blokkláncon történő tranzakciók tipikus költségeit.", - "uniswapx.description": "Az UniswapX összesíti a likviditási forrásokat a jobb árak és a gázmentes csereügyletek érdekében.", - "uniswapx.description.unsupported": "Az UniswapX jelenleg nem érhető el, mert az okostárca beállításait egy másik tárcaalkalmazás kezeli.", - "uniswapx.included": "Tartalmazza a UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "Tudjon meg többet az UniswapX-szel való cseréről", - "uniswapx.unavailable.title": "Az UniswapX nem érhető el.", - "uniswapx.v2QuoteFailed": "Az UniswapX v2 kemény árajánlat nem sikerült. Próbálja újra a klasszikus cserével.", - "unitags.banner.button.claim": "Igényeljen most", - "unitags.banner.subtitle": "Hozzon létre egy személyre szabott web3-profilt, és egyszerűen ossza meg címét barátaival.", - "unitags.banner.title.compact": "Igényelje {{unitagDomain}} felhasználónevét, és készítse el testreszabható profilját.", - "unitags.banner.title.full": "Igényelje {{unitagDomain}} felhasználónevét", - "unitags.choosePhoto.option.cameraRoll": "Válasszon a fényképezőgép tekercséből", - "unitags.choosePhoto.option.computer": "Feltöltés számítógépről", - "unitags.choosePhoto.option.nft": "Válasszon egy NFT-t", - "unitags.choosePhoto.option.remove": "Profilkép eltávolítása", - "unitags.claim.available": "Elérhető", - "unitags.claim.confirmation.customize": "Profil testreszabása", - "unitags.claim.confirmation.description": "A {{unitagAddress}} készen áll a kriptográfia küldésére és fogadására. Folytassa a pénztárca bővítését web3-profilja testreszabásával.", - "unitags.claim.confirmation.success.long": "Megcsináltad!", - "unitags.claim.confirmation.success.short": "megvan!", - "unitags.claim.error.addressLimit": "Már végrehajtotta a maximális számú módosítást ehhez a címhez tartozó felhasználónevében", - "unitags.claim.error.avatar": "Nem sikerült beállítani az avatart. Próbáld újra később.", - "unitags.claim.error.default": "A felhasználónév nem igényelhető. Próbáld újra később.", - "unitags.claim.error.deviceLimit": "Elérte az eszközhöz használható felhasználónevek maximális számát", - "unitags.claim.error.general": "A felhasználónév nem igényelhető", - "unitags.claim.error.unavailable": "Ez a felhasználónév nem áll rendelkezésre", - "unitags.claim.error.unknown": "Ismeretlen hiba", - "unitags.claim.username.default": "a neved", - "unitags.delete.confirm.subtitle": "Törölni készül felhasználónevét és testreszabható profiladatait. Nem fogja tudni visszaigényelni.", - "unitags.delete.confirm.title": "biztos vagy ebben?", - "unitags.editProfile.placeholder": "felhasználónév", - "unitags.editUsername.confirm.subtitle": "A felhasználónév megváltoztatására készül. Ha egyszer megváltoztatja, soha többé nem igényelheti.", - "unitags.editUsername.confirm.title": "biztos vagy ebben?", - "unitags.editUsername.title": "Szerkessze a felhasználónevét", - "unitags.editUsername.warning.default": "Miután megváltoztatta a felhasználónevét, soha többé nem igényelheti azt. Csak 2 alkalommal módosíthatja.", - "unitags.editUsername.warning.max": "Elérte a maximum 2 felhasználónév-módosítások számát.", - "unitags.extension.intro.buttton": "Kérjen felhasználónevet", - "unitags.extension.intro.description": "Mondjon búcsút a 0x címeknek. A felhasználónevek olvasható nevek, amelyek megkönnyítik a kriptográfia küldését és fogadását.", - "unitags.extension.intro.title": "Felhasználónevek bemutatása", - "unitags.extension.intro.upsell.customizable": "Testreszabható profilok", - "unitags.extension.intro.upsell.ens": "Az ENS aldomainek üzemeltetik", - "unitags.extension.intro.upsell.free": "Szabadon igényelhető", - "unitags.intro.features.ens": "Az ENS aldomainek üzemeltetik", - "unitags.intro.features.free": "Szabadon igényelhető", - "unitags.intro.features.profile": "Testreszabható profilok", - "unitags.intro.subtitle": "Mondjon búcsút a 0x címeknek. A felhasználónevek olvasható nevek, amelyek megkönnyítik a kriptográfia küldését és fogadását.", - "unitags.intro.title": "Felhasználónevek bemutatása", - "unitags.notification.delete.error": "Nem sikerült törölni a felhasználónevet. Próbáld újra később.", - "unitags.notification.delete.title": "Felhasználónév törölve", - "unitags.notification.profile.error": "Nem sikerült frissíteni a profilt. Próbáld újra később.", - "unitags.notification.profile.title": "profil frissítve", - "unitags.notification.username.error": "Nem sikerült módosítani a felhasználónevet. Próbáld újra később.", - "unitags.notification.username.title": "Felhasználónév megváltozott", - "unitags.onboarding.claim.subtitle": "Ez az Ön személyre szabott címe, amelyre az emberek kriptot küldhetnek.", - "unitags.onboarding.claim.title.choose": "Hozd létre a felhasználóneved", - "unitags.onboarding.claim.title.claim": "Igényelje felhasználónevét", - "unitags.onboarding.info.description": "A felhasználónevek az összetett 0x címeket olvasható nevekké alakítják. A {{unitagDomain}} felhasználónév igénylésével könnyen küldhet és fogadhat titkosítást, valamint nyilvános web3-profilt hozhat létre.", - "unitags.onboarding.info.title": "Egyszerűsített cím", - "unitags.onboarding.profile.subtitle": "Töltsd fel sajátodat, vagy ragaszkodj egyedi Uniconodhoz. Ezt később bármikor módosíthatja.", - "unitags.onboarding.profile.title": "Válasszon egy profilfotót", - "unitags.profile.action.delete": "Felhasználónév törlése", - "unitags.profile.action.edit": "Felhasználónév szerkesztése", - "unitags.profile.bio.label": "Bio", - "unitags.profile.bio.placeholder": "Írjon be egy életrajzot a profiljához", - "unitags.profile.links.twitter": "Twitter", - "unitags.username.error.chars": "A felhasználónevek csak betűket és számokat tartalmazhatnak", - "unitags.username.error.max": "A felhasználónevek nem lehetnek hosszabbak {{number}} karakternél", - "unitags.username.error.min": "A felhasználóneveknek legalább {{number}} karakterből kell állniuk", - "unitags.username.error.uppercase": "A felhasználónevek csak kisbetűket és számokat tartalmazhatnak", - "uwulink.error.insufficientTokens": "Nem elég {{tokenSymbol}} a {{chain}}-n", - "v2.notAvailable": "Az Uniswap V2 nem érhető el ezen a hálózaton.", - "wallet.appSignIn": "Jelentkezzen be az alkalmazással", - "wallet.connectingAgreement": "A pénztárca csatlakoztatásával Ön elfogadja az Uniswap Labs szolgáltatási feltételeit és adatvédelmi szabályzatát.", - "wallet.connectionFailed.message": "A kapcsolódási kísérlet sikertelen. Kérjük, próbálja újra a pénztárcájában található lépéseket követve.", - "wallet.mismatch.popup.description": "A csatlakoztatott tárca bizonyos funkciókat nem támogat.", - "wallet.mismatch.popup.title": "Korlátozott pénztárca-támogatás", - "wallet.other": "Egyéb pénztárcák", - "wallet.scanToConnect": "A csatlakozáshoz olvassa be a QR-kódot", - "wallet.wrongNet": "A pénztárcája rossz hálózathoz csatlakozik.", - "walletConnect.dapps.empty.description": "Csatlakozzon egy alkalmazáshoz a kód beolvasásával a WalletConnect segítségével", - "walletConnect.dapps.manage.empty.title": "Nincsenek csatlakoztatott alkalmazások", - "walletConnect.dapps.manage.title": "Kapcsolatok", - "walletConnect.error.connection.message": "Az Uniswap Wallet jelenleg a {{chainNames}}funkciót támogatja. Kérjük, csak a \"{{dappName}}\"-t használja ezeken a láncokon", - "walletConnect.error.connection.title": "Kapcsolati hiba", - "walletConnect.error.general.message": "Probléma lépett fel a WalletConnect szolgáltatással. Kérlek próbáld újra", - "walletConnect.error.general.title": "WalletConnect hiba", - "walletConnect.error.scantastic.message": "Probléma lépett fel a QR-kóddal. Kérlek próbáld újra", - "walletConnect.error.scantastic.title": "Érvénytelen QR-kód", - "walletConnect.error.unsupported.message": "Mielőtt újra próbálkozna, győződjön meg arról, hogy érvényes WalletConnect-, Ethereum-címet vagy Uniswap-bővítmény QR-kódot olvas be.", - "walletConnect.error.unsupported.title": "Érvénytelen QR-kód", - "walletConnect.error.unsupportedV1.message": "A WalletConnect v1 már nem támogatott. Az alkalmazásnak, amelyhez csatlakozni próbál, frissítenie kell a WalletConnect v2-re.", - "walletConnect.error.unsupportedV1.title": "Érvénytelen QR-kód", - "walletConnect.error.uwu.scan": "Hiba történt a QR-kód beolvasása közben.", - "walletConnect.error.uwu.title": "UwU Link hiba", - "walletConnect.error.uwu.unsupported": "Ez a QR-kód nem támogatott.", - "walletConnect.pending.button.connect": "Csatlakozás", - "walletConnect.pending.button.reject": "Elutasít", - "walletConnect.pending.button.scrollDown": "A csatlakozáshoz görgessen lefelé", - "walletConnect.pending.threat.confirmationText": "Értem a kockázatokat", - "walletConnect.pending.threat.description": "Az alkalmazásból történő üzenetek vagy tranzakciók aláírása pénzeszközök elvesztéséhez vezethet.", - "walletConnect.pending.threat.title": "Rosszindulatú alkalmazás észlelve", - "walletConnect.pending.title": "Csatlakozás ehhez: {{dappName}}", - "walletConnect.pending.unverified.description": "Mielőtt folytatná, győződjön meg róla, hogy megbízik ebben az oldalon. ", - "walletConnect.pending.unverified.title": "Nem ellenőrzött alkalmazás", - "walletConnect.permissions.option.requestApprovals": "Tranzakciójóváhagyás kérése", - "walletConnect.permissions.option.transferAssets": "Move funds without permission", - "walletConnect.permissions.option.viewTokenBalances": "View your balance and activity", - "walletConnect.permissions.title": "App permissions", - "walletConnect.request.bundledTransactions.label_one": "Egyetlen kötegelt tranzakció", - "walletConnect.request.bundledTransactions.label_other": "{{count}} kötegelt tranzakciók", - "walletConnect.request.button.scrollDown": "Görgessen le az aláíráshoz", - "walletConnect.request.button.sign": "Jel", - "walletConnect.request.details.label.function": "Funkció", - "walletConnect.request.details.label.sending": "Küldés", - "walletConnect.request.details.label.token": "Jelképes", - "walletConnect.request.details.label.tokens": "Tokenek", - "walletConnect.request.error.insufficientFunds": "Nincs elég {{currencySymbol}} a tranzakció befejezéséhez.", - "walletConnect.request.error.network": "Internet vagy hálózati csatlakozási hiba", - "walletConnect.request.warning.batch.message": "Legyen óvatos: ez a kérelem több tranzakciót tartalmaz, és eszközöket ruházhat át", - "walletConnect.request.warning.general.message": "Legyen óvatos: ez az üzenet eszközöket helyezhet át", - "walletConnect.request.warning.message": "Üzenetek vagy tranzakciók aláírásához importálnia kell a pénztárca helyreállítási kifejezését.", - "walletConnect.request.warning.title": "Ez a pénztárca csak megtekintés módban van", - "web.explore.description": "Fedezze fel és kutasson tokeneket a {{network}}oldalon. Fedezze fel a legjobb medencéket. Valós idejű árak, kereskedési volumen, TVL, diagramok és tranzakciós adatok megtekintése.", - "web.explore.title.pools": "Fedezze fel a legnépszerűbb medencéket a {{network}} oldalon az Uniswapon", - "web.explore.title.tokens": "Fedezze fel a legjobb tokeneket a {{network}} oldalon az Uniswapon", - "web.explore.title.transactions": "Fedezze fel a legjobb tranzakciókat a {{network}} oldalon az Uniswapon" -} diff --git a/packages/uniswap/src/i18n/locales/translations/id-ID.json b/packages/uniswap/src/i18n/locales/translations/id-ID.json index 61ac7b19cc6..3e59f86e52d 100644 --- a/packages/uniswap/src/i18n/locales/translations/id-ID.json +++ b/packages/uniswap/src/i18n/locales/translations/id-ID.json @@ -30,7 +30,6 @@ "account.drawer.modal.body": "Simpan dan tukar token dengan aman menggunakan apl Uniswap. Tersedia di iOS dan Android.", "account.drawer.modal.dont": "Tidak punya Uniswap Wallet?", "account.drawer.modal.scan": "Pindai dengan Uniswap Wallet", - "account.drawer.spamToggle": "Sembunyikan token & NFT yang tidak diketahui", "account.passkey.delete.acknowledge": "Saya sudah mencadangkan frasa pemulihan dan memahami bahwa Uniswap Labs tidak bisa memulihkan dompet jika saya tidak melakukannya.", "account.passkey.delete.description": "Pastikan Anda sudah mencadangkan frasa pemulihan dengan apl Uniswap mobile atau ekstensi browser.", "account.passkey.delete.descriptionEmphasized": "Tanpa frasa pemulihan, Anda tidak bisa mengakses dompetmu.", @@ -115,6 +114,7 @@ "account.wallet.watch.placeholder": "ENS atau alamat", "account.wallet.watch.title": "Masukkan alamat dompet", "activity.pending": "{{pendingActivityCount}} Tertunda", + "activity.recentActivity": "Recent activity", "activity.transaction.lpRewards.descriptor": "{{symbol}} reward diambil", "activity.transaction.send.descriptor": "{{amountWithSymbol}} ke {{walletAddress}}", "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} untuk {{amountWithSymbolB}}", @@ -144,15 +144,15 @@ "bridgedAsset.send.warning.description": "Kamu akan mengirim {{currencySymbol}} versi wrapped di {{chainName}}. Jika dikirim ke bursa terpusat, kamu akan kehilangan dana secara permanen.", "bridgedAsset.send.warning.title": "Pastikan alamat tujuan kompatibel", "bridgedAsset.tdp.description": "Ini adalah {{currencySymbol}} versi dijembatani yang dijamin 1:1 dengan {{currencySymbol}} asli.", - "bridgedAsset.wormhole.button": "Lanjutkan ke Wormhole", - "bridgedAsset.wormhole.description": "Lanjutkan ke portal Wormhole untuk menjembatani {{currencySymbol}} dari {{chainName}} ke {{nativeChainName}}.", + "bridgedAsset.wormhole.button": "Continue to {{provider}}", + "bridgedAsset.wormhole.description": "Continue to the {{provider}} portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", "bridgedAsset.wormhole.title": "Tarik {{currencySymbol}} ke {{nativeChainName}}", "bridgedAsset.wormhole.toNativeChain": "ke {{nativeChainName}}", "bridgedAsset.wormhole.withdrawToNativeChain": "Tarik ke {{nativeChainName}}", "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} mnt {{seconds}} dtk", "bridging.estimatedTime.minutesOnly": "~{{minutes}} mnt", "bridging.estimatedTime.secondsOnly": "~{{seconds}} dtk", - "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XPL, ZEC — now available on Unichain.", "chart.candlestick": "Kandil", "chart.error.pools": "Tidak dapat menampilkan data historis untuk pool saat ini.", "chart.error.tokens": "Tidak dapat menampilkan data historis untuk token saat ini.", @@ -257,6 +257,7 @@ "common.button.unlock": "Buka", "common.button.view": "Lihat", "common.button.viewDetails": "Lihat detail", + "common.button.viewMore": "View more", "common.button.yes": "Ya", "common.buy.label": "Beli", "common.buyAndSell": "Beli dan jual di Uniswap", @@ -370,6 +371,7 @@ "common.input.noRecipient.error": "Pilih penerima", "common.input.password.confirm": "Konfirmasikan kata sandi", "common.input.password.error.mismatch": "Kata sandi tidak cocok", + "common.input.password.error.same": "New password must be different from current password", "common.input.password.error.weak": "Kata sandi ini terlalu lemah", "common.input.password.new": "Kata sandi baru", "common.input.password.placeholder": "Kata sandi", @@ -503,6 +505,7 @@ "common.remove.liquidity.canceled": "Penghapusan likuiditas dibatalkan", "common.remove.liquidity.failed": "Penghapusan likuiditas gagal", "common.removing.liquidity": "Menghapus likuiditas", + "common.reported": "Reported", "common.resetLimit": "Setel ulang batas {{symbol}}", "common.resetLimitWallet": "Setel ulang batas {{symbol}} di dompet", "common.resettingLimit": "Menyetel ulang batas {{symbol}}...", @@ -532,6 +535,7 @@ "common.status": "Status", "common.step.number": "Langkah {{number}}", "common.step.number.of": "Langkah {{current}} dari {{total}}", + "common.submit": "Submit", "common.swap": "Pertukaran", "common.swap.expired": "Masa berlaku pertukaran sudah habis", "common.swap.failed": "Pertukaran gagal", @@ -797,6 +801,7 @@ "fee.tier.create": "Buat tingkatan komisi", "fee.tier.create.button": "Buat tingkatan komisi baru", "fee.tier.create.description": "Pembuatan tingkatan baru akan menginisialisasi pool baru dan mengakibatkan biaya jaringan yang lebih tinggi dari biasanya.", + "fee.tier.default": "-- fee tier", "fee.tier.description": "Jumlah yang diperoleh dari penyediaan likuiditas. Pilihlah jumlah yang sesuai dengan toleransi risiko dan strategimu.", "fee.tier.description.v2": "Jumlah yang diperoleh dari penyediaan likuiditas. Semua pool v2 dipungut biaya tetap 0,3%. Untuk opsi lainnya, sediakan likuiditas pada pool v4.", "fee.tier.dynamic": "Tingkatan komisi dinamis", @@ -884,9 +889,9 @@ "hero.swap.title": "Tukar kapan saja,
di mana saja.", "hidden.nfts.info.banner.text": "Pelajari lebih lanjut tentang NFT tersembunyi", "hidden.nfts.info.text.button": "NFT Tersembunyi ({{numHidden}})", - "hidden.nfts.info.text.extension": "Ini adalah potensi penipuan dan NFT yang kamu sembunyikan. Kamu dapat mengklik kanan pada NFT untuk menampilkannya kembali.", "hidden.nfts.info.text.mobile": "Ini adalah potensi penipuan dan NFT yang kamu sembunyikan. Kamu dapat menekan lama pada NFT untuk menampilkannya kembali.", "hidden.nfts.info.text.title": "NFT Tersembunyi", + "hidden.nfts.info.text.web": "These are potential scams and NFTs you’ve hidden. You can click on an NFT to unhide it.", "hidden.tokens.info.banner.text": "Pelajari lebih lanjut tentang token tersembunyi", "hidden.tokens.info.text.button": "Token tersembunyi ({{numHidden}})", "hidden.tokens.info.text.info": "Ini adalah potensi penipuan, saldo kecil, dan token yang kamu sembunyikan. Token tersembunyi tidak termasuk dalam total saldo dompetmu.", @@ -957,32 +962,16 @@ "landing.uniswapX.subtitle": "Pertukaran lebih cerdas, bebas kendala.", "landing.walletBody": "Dompet kripto kustodian mandiri (self-custody) dan ekstensi tepercaya yang telah diunduh jutaan kali, didukung manusia nyata, dan meraih nilai 4,8 .", "landing.walletSubtitle": "Tukar, simpan, jelajahi.", - "language.afrikaans": "Bahasa Afrika", - "language.arabic": "Bahasa Arab", - "language.catalan": "Bahasa Katalan", "language.chineseSimplified": "Bahasa Tionghoa Disederhanakan", "language.chineseTraditional": "Bahasa Tionghoa Tradisional", - "language.czech": "Bahasa Ceko", - "language.danish": "Bahasa Denmark", "language.dutch": "Bahasa Belanda", "language.english": "Bahasa Inggris", - "language.finnish": "Bahasa Finlandia", "language.french": "Bahasa Prancis", - "language.greek": "Bahasa Yunani", - "language.hebrew": "Bahasa Ibrani", - "language.hindi": "Bahasa Hindi", - "language.hungarian": "Bahasa Hungaria", "language.indonesian": "Bahasa Indonesia", - "language.italian": "Bahasa Italia", "language.japanese": "Bahasa Jepang", "language.korean": "Bahasa Korea", - "language.malay": "Bahasa Melayu", - "language.norwegian": "Bahasa Norwegia", - "language.polish": "Polandia", "language.portuguese": "Portugis", - "language.romanian": "Rumania", "language.russian": "Rusia", - "language.serbian": "Serbia", "language.spanishArgentina": "Spanyol (Argentina)", "language.spanishBelize": "Spanyol (Belize)", "language.spanishBolivia": "Spanyol (Bolivia)", @@ -1006,11 +995,7 @@ "language.spanishUruguay": "Spanyol (Uruguay)", "language.spanishUs": "Bahasa Spanyol (AS)", "language.spanishVenezuela": "Spanyol (Venezuela)", - "language.swahili": "Bahasa Swahili", - "language.swedish": "Bahasa Swedia", "language.turkish": "Bahasa Turki", - "language.ukrainian": "Bahasa Ukraina", - "language.urdu": "Bahasa Urdu", "language.vietnamese": "Bahasa Vietnam", "large.price.difference": "Selisih harga yang besar", "large.price.difference.tooltip": "Jika perdagangan ini dilanjutkan, kamu berisiko kehilangan dana. Selisih ini mungkin timbul akibat besarnya perdagangan atau rendahnya likuiditas.", @@ -1114,7 +1099,6 @@ "notification.smartWallet.disabled.all": "Dompet cerdas dinonkatifkan", "notification.smartWallet.disabled.plural": "Dinonaktifkan di {{amount}} jaringan", "notification.spam.NFT.failed": "Tidak dapat melaporkan NFT. Coba lagi nanti.", - "notification.spam.NFT.successful": "Dilaporkan", "notification.swap.network": "Menukar di {{network}}", "notification.swap.pending.swap": "Pertukaran tertunda", "notification.swap.pending.unwrap": "Buka wrapping tertunda", @@ -1214,6 +1198,7 @@ "onboarding.home.intro.backup.description.mobile": "Siapkan rencana pemulihan jika kamu kehilangan ponsel atau menggunakan ponsel baru.", "onboarding.home.intro.backup.title": "Cadangkan dompet", "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK, dan JUP kini tersedia di Unichain", + "onboarding.home.intro.bridgedAssets.description.v2": "DOGE, XRP, XPL, ZEC — now available on Unichain", "onboarding.home.intro.bridgedAssets.title": "Perdagangkan token baru di Unichain", "onboarding.home.intro.fund.description": "Danai dompetmu dengan membeli kripto atau mentransfer dari akun lain.", "onboarding.home.intro.fund.title": "Dapatkan token pertamamu", @@ -1438,15 +1423,18 @@ "poolFinder.availablePools.notFound.description": "Cadangan aset v2 yang sesuai tidak ditemukan. Periksa kembali pilihan tokenmu dan pastikan kamu telah terhubung dengan dompet yang benar.", "pools.explore": "Jelajahi pool", "portfolio.activity.filters.timePeriod.all": "Sepanjang periode", - "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", + "portfolio.activity.filters.transactionType.addLiquidity": "Added liquidity", "portfolio.activity.filters.transactionType.all": "Semua jenis", "portfolio.activity.filters.transactionType.approvals": "Approvals", - "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", - "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.claimFees": "Claimed fees", + "portfolio.activity.filters.transactionType.createPool": "Pools created", "portfolio.activity.filters.transactionType.mints": "Mints", - "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", + "portfolio.activity.filters.transactionType.receives": "Receives", + "portfolio.activity.filters.transactionType.removeLiquidity": "Removed liquidity", + "portfolio.activity.filters.transactionType.sends": "Sends", "portfolio.activity.filters.transactionType.swaps": "Pertukaran", "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.search.placeholder": "Search activity", "portfolio.activity.table.column.address": "Address", "portfolio.activity.table.column.amount": "Amount", "portfolio.activity.table.column.time": "Time", @@ -1459,7 +1447,12 @@ "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", "portfolio.disconnected.demoWallet.title": "Demo wallet", "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", + "portfolio.nfts.search.placeholder": "Search your NFTs", "portfolio.nfts.title": "NFT", + "portfolio.overview.stats.averageSwapSize": "Average swap size", + "portfolio.overview.stats.swappedThisWeek": "Swapped this week", + "portfolio.overview.stats.swapsThisWeek": "Swaps this week", + "portfolio.overview.stats.totalSwapVolume": "Total swap volume", "portfolio.overview.title": "Ikhtisar", "portfolio.title": "Portofolio", "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", @@ -1471,6 +1464,7 @@ "portfolio.tokens.table.column.token": "Token", "portfolio.tokens.table.column.value": "Nilai", "portfolio.tokens.title": "Token", + "portfolio.view": "View portfolio", "position.addHook": "Tambahkan Hook", "position.addHook.tooltip": "Hook merupakan fitur canggih yang memungkinkan pool berinteraksi dengan kontrak cerdas dan membuka berbagai kemampuan. Berhati-hatilah saat menambahkan hook, karena beberapa hook mungkin berbahaya atau menyebabkan konsekuensi yang tidak diinginkan.", "position.addingHook": "Menambahkan hook", @@ -1588,6 +1582,33 @@ "qrScanner.wallet.networks": "Jaringan yang didukung", "range.outOfView": "Rentang tidak terbaca", "removeLiquidity.pooled": "Kumpulan {{symbol}}:", + "reporting.activity.unhide.action": "Unhide activity", + "reporting.pool.details.title": "Don’t recognize this position?", + "reporting.token.data.options.price.subtitle": "Token price is wrong or unavailable", + "reporting.token.data.options.price.title": "Price", + "reporting.token.data.options.priceChart.subtitle": "Data is wrong or incomplete", + "reporting.token.data.options.priceChart.title": "Price chart", + "reporting.token.data.options.tokenDetails.subtitle": "Token image, description, or link issue", + "reporting.token.data.options.tokenDetails.title": "Token details", + "reporting.token.data.options.volume.subtitle": "Token volume is wrong or unavailable", + "reporting.token.data.options.volume.title": "Volume", + "reporting.token.data.title": "Data issue", + "reporting.token.options.hiddenFees.subtitle": "Token has undisclosed fees when bought/sold", + "reporting.token.options.hiddenFees.title": "Hidden fees", + "reporting.token.options.imposter.subtitle": "Token seems fraudulent or misleading", + "reporting.token.options.imposter.title": "Imposter token", + "reporting.token.options.other.title": "Something else", + "reporting.token.options.spam.subtitle": "Token appeared in wallet unexpectedly", + "reporting.token.options.spam.title": "Spam token", + "reporting.token.report.button.disabled": "Select an issue", + "reporting.token.report.other.placeholder": "Describe the issue", + "reporting.token.report.title": "Report token", + "reporting.token.report.title.withSymbol": "Report {{symbol}}", + "reporting.token.warning.button": "This warning is incorrect", + "reporting.token.warning.report.placeholder": "Add details (optional)", + "reporting.token.warning.report.submit": "Report issue", + "reporting.token.warning.report.subtitle": "Report an issue if the warning below seems wrong. We’ll take a closer look.", + "reporting.token.warning.report.title": "Report an inaccurate warning", "revoke.failed.message": "Masalah jaringan atau koneksi kemungkinan besar menyebabkan kegagalan pencabutan. Periksa koneksi dan coba lagi.", "routing.aggregateLiquidity": "Jika tersedia, kumpulkan sumber likuiditas untuk mendapatkan harga yang lebih baik dan pertukaran bebas biaya gas.", "routing.aggregateLiquidity.uniswapx": "UniswapX mengumpulkan sumber likuiditas di dalam dan di luar blockchain demi memberimu harga terbaik dan membebaskan pertukaran dari beban biaya gas.", @@ -1735,6 +1756,7 @@ "settings.setting.backup.status.inProgress": "Mencadangkan ke {{cloudProviderName}}...", "settings.setting.backup.status.recoveryPhrase.backed": "Dicadangkan", "settings.setting.backup.status.title": "Cadangan {{cloudProviderName}}", + "settings.setting.balancesActivity.title": "Balances and activity", "settings.setting.beta.tooltip": "Segera hadir", "settings.setting.biometrics.appAccess.subtitle.android": "Membutuhkan wajah/sidik jari untuk membuka apl.", "settings.setting.biometrics.appAccess.subtitle.ios": "Membutuhkan {{biometricsMethod}} untuk membuka apl.", @@ -1786,7 +1808,8 @@ "settings.setting.privacy.analytics.title": "Analitik apl", "settings.setting.privateKeys.title": "Kunci pribadi", "settings.setting.recoveryPhrase.title": "Frasa pemulihan", - "settings.setting.smallBalances.title": "Saldo portofolio", + "settings.setting.reportedActivity.subtitle": "Transactions you’ve reported as spam will be hidden from your activity feed.", + "settings.setting.reportedActivity.title": "Hide reported activity", "settings.setting.smartWallet.action.enable": "Aktifkan", "settings.setting.smartWallet.action.smartWallet": "Dompet cerdas", "settings.setting.smartWallet.notEligible": "Tidak memenuhi syarat", @@ -2290,6 +2313,8 @@ "transaction.networkCost.label": "Biaya jaringan", "transaction.networkCost.maxNativeBalance.description": "Sejumlah kecil saldo token jaringan akan disimpan untuk membayar biaya jaringan dari transaksi ini.", "transaction.networkCost.maxNativeBalance.title": "Mengapa saya tidak dapat menggunakan saldo maks.?", + "transaction.networkCost.presetNativeBalance.description": "You don’t have enough balance to cover both this amount and the network cost of the transaction.", + "transaction.networkCost.presetNativeBalance.title": "Why can’t I use this amount?", "transaction.networkCost.veryHigh.label": "Biaya jaringan sangat tinggi", "transaction.notification.error.cancel": "Tidak dapat membatalkan transaksi", "transaction.notification.error.replace": "Tidak dapat menggantikan transaksi", diff --git a/packages/uniswap/src/i18n/locales/translations/it-IT.json b/packages/uniswap/src/i18n/locales/translations/it-IT.json deleted file mode 100644 index 275f8c80b31..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/it-IT.json +++ /dev/null @@ -1,2563 +0,0 @@ -{ - "account.authHeader.claimReward": "Richiedi {{amount}} ricompensa", - "account.cloud.backup.subtitle": "Sono presenti più frasi di ripristino di cui è stato eseguito il backup sul tuo {{cloudProviderName}}.", - "account.cloud.backup.title": "Seleziona un backup da ripristinare", - "account.cloud.button.restore.android": "Ripristina da Google Drive", - "account.cloud.button.restore.ios": "Ripristina da iCloud", - "account.cloud.empty.description": "Sembra che tu non abbia eseguito il backup di nessuna delle tue frasi di recupero in {{cloudProviderName}}.", - "account.cloud.empty.title": "0 backup trovati", - "account.cloud.error.backup.message": "Impossibile importare i backup a causa della mancanza di autorizzazioni, dell'interruzione dell'autorizzazione o di un errore nel cloud", - "account.cloud.error.backup.title": "Errore durante l'importazione dei backup", - "account.cloud.error.password.title": "Password non valida. Per favore riprova.", - "account.cloud.error.unavailable.button.cancel": "Non adesso", - "account.cloud.error.unavailable.button.settings": "Vai alle impostazioni", - "account.cloud.error.unavailable.message.android": "Verifica di aver effettuato l'accesso a un account Google con Google Drive abilitato su questo dispositivo e riprova.", - "account.cloud.error.unavailable.message.ios": "Verifica di aver effettuato l'accesso a un ID Apple con iCloud Drive abilitato su questo dispositivo e riprova.", - "account.cloud.error.unavailable.title.android": "Google Drive non disponibile", - "account.cloud.error.unavailable.title.ios": "iCloud Drive non disponibile", - "account.cloud.loading.title": "Ricerca di backup...", - "account.cloud.lockout.time.hours_one": "Troppi tentativi. Riprova tra 1 ora.", - "account.cloud.lockout.time.hours_other": "Troppi tentativi. Riprova tra {{count}} ore.", - "account.cloud.lockout.time.minutes_one": "Troppi tentativi. Riprova tra 1 minuto.", - "account.cloud.lockout.time.minutes_other": "Troppi tentativi. Riprova tra {{count}} minuti.", - "account.cloud.password.input": "Inserire la password", - "account.cloud.password.recoveryPhrase": "Inserisci invece la tua frase di recupero", - "account.cloud.password.subtitle": "Questa password è necessaria per ripristinare il backup della frase di ripristino da {{cloudProviderName}}.", - "account.cloud.password.title": "Inserisci la password di backup", - "account.downloadWallet.subtitle": "Esegui il backup del tuo portafoglio, fai trading ovunque ti trovi, ricevi avvisi sui prezzi in tempo reale e molto altro ancora.", - "account.drawer.gitHash": "Hash git: ", - "account.drawer.gitVersion": "Versione: ", - "account.drawer.modal.body": "Conserva e scambia token in sicurezza con l'app Uniswap. Disponibile su iOS e Android.", - "account.drawer.modal.dont": "Non hai un portafoglio Uniswap?", - "account.drawer.modal.scan": "Scansione con Uniswap Wallet", - "account.drawer.spamToggle": "Nascondi token e NFT sconosciuti", - "account.passkey.delete.acknowledge": "Ho eseguito il backup della mia frase di recupero e sono consapevole che Uniswap Labs non potrà aiutarmi a recuperare il mio portafoglio se non ci riuscissi.", - "account.passkey.delete.description": "Assicurati di aver eseguito il backup della frase di recupero utilizzando l'app mobile Uniswap o l'estensione del browser.", - "account.passkey.delete.descriptionEmphasized": "Senza la frase di recupero potresti non riuscire ad accedere al tuo portafoglio.", - "account.passkey.delete.speedbump.description": "Prima di continuare, completa i seguenti passaggi per evitare di perdere l'accesso al tuo portafoglio e a tutti i fondi.", - "account.passkey.delete.speedbump.step1": "Scarica l'app mobile Uniswap o l'estensione del browser", - "account.passkey.delete.speedbump.step2": "Esegui il backup della frase di ripristino", - "account.passkey.delete.speedbump.title": "Sei sicuro?", - "account.passkey.delete.title": "Eliminare la passkey?", - "account.passkey.log.in.title": "Accedi con la passkey", - "account.passkey.type.crossplatform": "Telefono, tablet o chiave di sicurezza", - "account.passkey.type.platform": "Browser o sistema operativo", - "account.passkey.verify.button": "Verifica con passkey", - "account.passkey.verify.description": "Prima di continuare, utilizza la tua passkey per verificare la tua identità. Questo contribuisce a proteggere il tuo account.", - "account.passkey.verify.title": "Per prima cosa, verifichiamo che sia tu", - "account.portfolio.activity.canceledBelow": "Questo ordine è stato annullato perché il tuo saldo è sceso al di sotto dell'importo inserito.", - "account.portfolio.activity.signLimit": "Questo ordine non verrà eseguito perché il tuo saldo è sceso al di sotto dell'importo inserito. Aumenta il tuo saldo per risolvere.", - "account.recoveryPhrase.education.part1": "Una frase di recupero (o frase seed) è un insieme di parole necessarie per accedere al tuo portafoglio, come una password.", - "account.recoveryPhrase.education.part2": "Puoi inserire la tua frase di recupero su un nuovo dispositivo per ripristinare il tuo portafoglio e i suoi contenuti.", - "account.recoveryPhrase.education.part3": "Tuttavia, se perdi la frase di recupero, perderai l'accesso al tuo portafoglio.", - "account.recoveryPhrase.education.part4": "Invece di memorizzare la frase di recupero, puoi eseguirne il backup da a {{cloudProviderName}} e proteggerla con una password.", - "account.recoveryPhrase.education.part5": "Puoi anche eseguire manualmente il backup della frase di recupero scrivendola e archiviandola in un luogo sicuro.", - "account.recoveryPhrase.education.part6": "Ti consigliamo di utilizzare entrambi i tipi di backup, perché se perdi la frase di recupero, non sarai in grado di ripristinare il tuo portafoglio.", - "account.recoveryPhrase.error.invalid": "Frase non valida", - "account.recoveryPhrase.error.invalidWord": "Parola non valida: {{word}}", - "account.recoveryPhrase.error.phraseLength": "La frase di recupero deve contenere 12-24 parole", - "account.recoveryPhrase.error.wordIsAddress": "Hai inserito un indirizzo, non una frase di recupero", - "account.recoveryPhrase.error.wrong": "Frase di recupero sbagliata", - "account.recoveryPhrase.helpText.import": "Come trovo la mia frase di recupero?", - "account.recoveryPhrase.helpText.restoring": "Prova a cercare di nuovo", - "account.recoveryPhrase.input": "Digita la tua frase di recupero", - "account.recoveryPhrase.remove.final.description": "Assicurati di aver annotato la frase di recupero o di averne eseguito il backup su {{cloudProviderName}}. Altrimenti non potrai accedere ai tuoi fondi.", - "account.recoveryPhrase.remove.final.title": "Stai rimuovendo la frase di recupero ", - "account.recoveryPhrase.remove.import.description": "Puoi memorizzare solo una frase di recupero alla volta. Per continuare a importarne una nuova, dovrai rimuovere la frase di recupero corrente ed eventuali portafogli associati da questo dispositivo.", - "account.recoveryPhrase.remove.initial.description": "Ciò rimuoverà il tuo portafoglio da questo dispositivo insieme alla tua frase di recupero.", - "account.recoveryPhrase.remove.initial.title": "Stai rimuovendo {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "La frase di recupero rimarrà memorizzata finché non eliminerai tutti i portafogli rimanenti.", - "account.recoveryPhrase.subtitle.import": "La tua frase di recupero verrà archiviata solo localmente sul tuo dispositivo.", - "account.recoveryPhrase.subtitle.restoring": "Inserisci la tua frase di recupero qui sotto o prova a cercare nuovamente i backup.", - "account.recoveryPhrase.title.import": "Inserisci la tua frase di recupero", - "account.recoveryPhrase.title.restoring": "Nessun backup trovato", - "account.wallet.action.copy": "Copia indirizzo", - "account.wallet.action.manageConnections": "Gestisci connessioni", - "account.wallet.action.report": "Segnala profilo", - "account.wallet.action.viewExplorer": "Visualizza su {{blockExplorerName}}", - "account.wallet.button.add": "Aggiungi portafoglio", - "account.wallet.button.addViewOnly": "Aggiungi un portafoglio di sola visualizzazione", - "account.wallet.button.create": "Crea un nuovo portafoglio", - "account.wallet.button.import": "Importa un nuovo portafoglio", - "account.wallet.button.manage": "Impostazioni del portafoglio", - "account.wallet.button.remove": "Rimuovi il portafoglio", - "account.wallet.button.watch": "Guarda un portafoglio", - "account.wallet.create.placeholder": "Portafoglio {{index}}", - "account.wallet.edit.label.input.placeholder": "Etichetta del portafoglio", - "account.wallet.header.button.disabled.title": "Modifica Profilo", - "account.wallet.header.button.title": "Modifica etichetta", - "account.wallet.header.viewOnly": "Portafogli di sola visualizzazione", - "account.wallet.menu.claimUsername": "Richiedi nome utente", - "account.wallet.menu.copy.title": "Copia l'indirizzo del portafoglio", - "account.wallet.menu.edit.title": "Modifica etichetta", - "account.wallet.menu.manageConnections": "Gestisci le connessioni", - "account.wallet.menu.remove.title": "Rimuovi il portafoglio", - "account.wallet.remove.check": "Ho eseguito il backup della mia frase di recupero e capisco che Uniswap Labs non può aiutarmi a recuperare i miei portafogli se non ci riesco.", - "account.wallet.remove.title": "Rimuovi {{name}}", - "account.wallet.remove.viewOnly": "Puoi sempre aggiungere portafogli di sola visualizzazione inserendo l'indirizzo del portafoglio.", - "account.wallet.restore.new_device.description": "Poiché stai utilizzando un nuovo dispositivo, dovrai ripristinare la frase di recupero o inserire la password del backup sul cloud per continuare.", - "account.wallet.restore.new_device.title": "Recupera il tuo portafoglio", - "account.wallet.restore.seed_phrase.description": "La tua frase di recupero è scomparsa dal tuo dispositivo. Per assicurarti di non perdere mai l'accesso ai tuoi fondi, ti chiederemo di ripristinare il tuo portafoglio.", - "account.wallet.restore.seed_phrase.title": "Ripristina il tuo portafoglio", - "account.wallet.select.error": "Impossibile caricare gli indirizzi", - "account.wallet.select.loading.subtitle": "I tuoi portafogli appariranno di seguito.", - "account.wallet.select.loading.title": "Alla ricerca di portafogli", - "account.wallet.select.smartWalletDisclaimer": "Per impostazione predefinita, tutti i portafogli idonei utilizzeranno le funzionalità del portafoglio intelligente una volta importati. Cos'è un portafoglio intelligente?", - "account.wallet.select.title_one_one": "Trovato un portafoglio", - "account.wallet.select.title_one_other": "Seleziona i portafogli da importare", - "account.wallet.viewOnly.button": "Importa portafoglio", - "account.wallet.viewOnly.description": "Per scambiare, acquistare, inviare e ricevere token, devi importare la frase di recupero di questo portafoglio.", - "account.wallet.viewOnly.title": "Questo portafoglio è di sola visualizzazione", - "account.wallet.watch.error.alreadyImported": "Questo indirizzo è già importato", - "account.wallet.watch.error.notFound": "Indirizzo non trovato", - "account.wallet.watch.error.smartContract": "L'indirizzo è un contratto intelligente", - "account.wallet.watch.message": "L'aggiunta di un portafoglio di sola visualizzazione ti consente di provare l'app o tenere traccia di un portafoglio. Non sarai in grado di scambiare o inviare fondi.", - "account.wallet.watch.placeholder": "ENS o indirizzo", - "account.wallet.watch.title": "Inserisci l'indirizzo di un portafoglio", - "activity.pending": "{{pendingActivityCount}} In sospeso", - "activity.transaction.lpRewards.descriptor": "{{symbol}} ricompense raccolte", - "activity.transaction.send.descriptor": "Da {{amountWithSymbol}} a {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} per {{amountWithSymbolB}}", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} e {{amountWithSymbolB}}", - "addLiquidity.shareOfPool": "Quota della piscina", - "addressInput.recipient": "Destinatario", - "analytics.allow": "Consenti analisi", - "analytics.allow.message": "Utilizziamo dati anonimi per migliorare la tua esperienza con i prodotti Uniswap Labs.", - "appRating.button.notReally": "Non proprio", - "appRating.description": "Facci sapere se la tua esperienza con questa app è positiva", - "appRating.extension.review.description": "Scegli una valutazione a stelle e lascia una recensione sul Chrome Web Store.", - "appRating.extension.review.title": "Vuoi valutare l'estensione Uniswap?", - "appRating.extension.title": "Ti piace l'estensione Uniswap?", - "appRating.feedback.button.send": "Invia feedback", - "appRating.feedback.description": "Facci sapere come possiamo migliorare la tua esperienza", - "appRating.feedback.title": "Siamo spiacenti.", - "appRating.mobile.title": "Ti piace Uniswap Wallet?", - "bridgedAsset.modal.button": "Continua a scambiare", - "bridgedAsset.modal.description": "Questa è una versione {{chainName}} di {{currencySymbol}} che è supportata e mantiene lo stesso prezzo della versione nativa {{currencySymbol}}.", - "bridgedAsset.modal.feature.securelyBacked": "Supportato in modo sicuro", - "bridgedAsset.modal.feature.securelyBacked.description": "1:1 supportato da {{currencySymbol}}nativo.", - "bridgedAsset.modal.feature.tradeSeamlessly": "Fai trading senza problemi", - "bridgedAsset.modal.feature.tradeSeamlessly.description": "Acquista e vendi {{currencySymbol}} senza uscire da Uniswap.", - "bridgedAsset.modal.feature.withdrawToNativeChain": "Ritirarsi a {{nativeChainName}}", - "bridgedAsset.modal.feature.withdrawToNativeChain.description": "Riconnettiti alla rete nativa in qualsiasi momento.", - "bridgedAsset.modal.title": "Scambia {{currencySymbol}} su {{chainName}}", - "bridgedAsset.send.warning.description": "Stai inviando una versione wrappata di {{currencySymbol}} su {{chainName}}. Inviarla a un exchange centralizzato comporterà una perdita permanente di fondi.", - "bridgedAsset.send.warning.title": "Assicurati di inviare a un indirizzo compatibile", - "bridgedAsset.tdp.description": "Questa è una versione bridge di {{currencySymbol}} supportata 1:1 dal nativo {{currencySymbol}}.", - "bridgedAsset.wormhole.button": "Continua verso Wormhole", - "bridgedAsset.wormhole.description": "Prosegui verso il portale del Wormhole per collegare il tuo {{currencySymbol}} da {{chainName}} a {{nativeChainName}}.", - "bridgedAsset.wormhole.title": "Ritira {{currencySymbol}} a {{nativeChainName}}", - "bridgedAsset.wormhole.toNativeChain": "a {{nativeChainName}}", - "bridgedAsset.wormhole.withdrawToNativeChain": "Ritirarsi a {{nativeChainName}}", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}minimo {{seconds}}s", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}minimo", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "chart.candlestick": "Candeliere", - "chart.error.pools": "Impossibile visualizzare i dati storici per il pool corrente.", - "chart.error.tokens": "Impossibile visualizzare i dati storici per il token corrente.", - "chart.line": "Grafico a linee", - "chart.missingData": "Dati cartografici mancanti", - "chart.price.label.close": "Vicino", - "chart.price.label.high": "Alto", - "chart.price.label.low": "Basso", - "chart.price.label.open": "Aprire", - "chart.settings.unavailable.label": "Questa impostazione non è disponibile per il grafico corrente", - "claim.thanks": "Grazie per far parte della comunità Uniswap ", - "claim.uni.arrived": "E' arrivata l'UNI", - "common.about": "Di", - "common.accept": "Accettare", - "common.active": "Attivo", - "common.activeNetworks": "Reti attive", - "common.activity": "Attività", - "common.add.label": "Aggiungere", - "common.add.liquidity.canceled": "Aggiungi liquidità annullata", - "common.addLiquidity": "Aggiungi liquidità", - "common.address": "Indirizzo", - "common.addressOrENS": "Indirizzo del portafoglio o nome ENS", - "common.advanced": "Avanzato", - "common.all": "Tutto", - "common.allTime": "Sempre", - "common.and": "E", - "common.app": "Applicazione", - "common.approved": "Approvato", - "common.approvePending": "In attesa di approvazione...", - "common.approvePermitTx": "Approva richiesta {{indexText}}", - "common.approvePermitTx.active": "Approva la richiesta{{indexText}} nel portafoglio", - "common.approvePermitTx.explainer": "Cosa sono le approvazioni Permit2?", - "common.approvePermitTx.pending": "Richiesta di approvazione {{indexText}}...", - "common.approveSpend": "Approva {{symbol}} spesa", - "common.approving": "Approvazione", - "common.approximatelyValue": "~{{value}}", - "common.areYouSure": "Sei sicuro?", - "common.automatic": "Auto", - "common.availableIn": "Uniswap disponibile in: ", - "common.availableOnIOSAndroidChrome": "Disponibile su iOS, Android e Chrome", - "common.backToPositions": "Torna alle posizioni", - "common.bestRoute": "Itinerario", - "common.bestRoute.with": "Percorso tramite {{provider}}", - "common.biometrics.generic": "Biometrica", - "common.biometrics.touchId": "ID tocco", - "common.biometrics.windowsHello": "Windows Hello", - "common.blocked.ifError": "Se ritieni che si tratti di un errore, invia un'e-mail includendo il tuo indirizzo a ", - "common.blocked.reason": "Questo indirizzo è bloccato sull'interfaccia di Uniswap Labs perché è associato a una o più attività bloccate.", - "common.blockedAddress": "Indirizzo bloccato", - "common.blog": "Blog", - "common.bought": "Comprato", - "common.brandAssets": "Risorse del marchio", - "common.button.accept": "Accettare", - "common.button.back": "Indietro", - "common.button.buy": "Acquistare", - "common.button.cancel": "Annulla", - "common.button.checkin": "Registrare", - "common.button.close": "Vicino", - "common.button.confirm": "Confermare", - "common.button.connect": "Collegare", - "common.button.continue": "Continua", - "common.button.copied": "Copiato", - "common.button.copy": "copia", - "common.button.create": "Creare", - "common.button.delete": "Eliminare", - "common.button.disable": "Disabilitare", - "common.button.disabling": "Disabilitazione", - "common.button.disconnect": "Disconnetti", - "common.button.dismiss": "Congedare", - "common.button.done": "Fatto", - "common.button.edit": "Modificare", - "common.button.enable": "Abilitare", - "common.button.finish": "Fine", - "common.button.goBack": "Torna indietro", - "common.button.later": "Forse più tardi", - "common.button.learn": "Saperne di più", - "common.button.next": "Prossimo", - "common.button.notNow": "Non adesso", - "common.button.ok": "OK", - "common.button.paste": "Impasto", - "common.button.pay": "Paga", - "common.button.proceed": "Procedere", - "common.button.receive": "Ricevere", - "common.button.remove": "Rimuovere", - "common.button.reset": "Reset", - "common.button.retry": "Riprova", - "common.button.reveal": "Svelare", - "common.button.review": "Revisione", - "common.button.save": "Salva", - "common.button.scrollDown": "Scorrere verso il basso", - "common.button.sell": "Vendere", - "common.button.send": "Inviare", - "common.button.setup": "Impostare", - "common.button.share": "Condividere", - "common.button.showLess": "Mostra meno", - "common.button.showMore": "Mostra di più", - "common.button.sign": "Cartello", - "common.button.skip": "Saltare", - "common.button.swap": "Scambio", - "common.button.tryAgain": "Riprova", - "common.button.understand": "Capisco", - "common.button.unlock": "Sbloccare", - "common.button.view": "Visualizzazione", - "common.button.viewDetails": "Visualizza i dettagli", - "common.button.yes": "SÌ", - "common.buy.label": "Acquistare", - "common.buyAndSell": "Acquista e vendi su Uniswap", - "common.cancellationSubmitted": "Cancellazione inviata", - "common.cancellationSuccessful": "Cancellazione avvenuta con successo", - "common.cancelOrder": "Annulla Ordine", - "common.card.error.description": "Qualcosa è andato storto", - "common.card.error.title": "Ops! Qualcosa è andato storto.", - "common.careers": "Carriere", - "common.chain.networkCost": "{{chain}} costo di rete", - "common.chart": "Grafico", - "common.checkNetwork": "Controlla lo stato della rete qui.", - "common.chromeExtension": "Estensione", - "common.claim.failed": "Reclamo non riuscito", - "common.claimed": "Reclamato", - "common.claiming": "Rivendicare", - "common.claimUnis": "Richiedi i tuoi gettoni UNI", - "common.clear": "Chiaro", - "common.close": "Vicino", - "common.closed": "Chiuso", - "common.collect.button": "Raccogliere", - "common.company": "Azienda", - "common.confirm": "Confermare", - "common.confirmCancellation": "Conferma la cancellazione", - "common.confirmed": "Confermato", - "common.confirmSend.button": "Conferma l'invio", - "common.confirmSwap": "Conferma lo scambio nel portafoglio", - "common.confirmTimedOut": "Conferma scaduta. Per favore riprova.", - "common.confirmTransfer": "Conferma il trasferimento", - "common.confirmWallet": "Conferma nel portafoglio", - "common.connect.button": "Collegare", - "common.connectAWallet.button": "Collega un portafoglio", - "common.connectAWallet.button.evm": "Connetti il portafoglio Ethereum", - "common.connectAWallet.button.evm.switch": "Cambia portafoglio Ethereum", - "common.connectAWallet.button.svm": "Connetti il portafoglio Solana", - "common.connectAWallet.button.svm.switch": "Cambia portafoglio Solana", - "common.connectAWallet.button.switch": "Cambia portafoglio", - "common.connectTo": "Connettiti a {{platform}}", - "common.connectWallet.button": "Collega il portafoglio", - "common.contactUs.button": "Contattaci", - "common.copied": "Copiato", - "common.copy.address": "Copia indirizzo", - "common.copy.poolId": "Copia ID pool", - "common.copyLink.button": "Copia link", - "common.created.date": "Creato {{date}}", - "common.currency": "Valuta", - "common.currentPrice": "Prezzo attuale", - "common.custom": "Costume", - "common.customRange": "Gamma personalizzata", - "common.dataOutdated": "I dati potrebbero essere obsoleti", - "common.day": "giorno", - "common.default": "Predefinito", - "common.defaultTradeOptions": "Opzioni commerciali predefinite", - "common.deposit.toNetwork": "Deposita token sulla rete {{label}} .", - "common.depositing": "Depositare", - "common.depositTokens": "Deposita token", - "common.detected": "Rilevato", - "common.developers": "Sviluppatori", - "common.device": "Questo dispositivo", - "common.device.other": "Altro dispositivo", - "common.dismiss": "Congedare", - "common.docs": "Documenti", - "common.donate": "Donare", - "common.done": "Fatto", - "common.dontShowAgain": "Non mostrare più questo messaggio", - "common.download": "Scaricamento", - "common.downloadAppStore": "Scarica dall'App Store", - "common.downloadPlayStore": "Scarica dal Play Store", - "common.downloadUniswapApp": "Scarica l'app Uniswap", - "common.downloadUniswapWallet": "Scarica Uniswap Wallet", - "common.dynamic": "Dinamico", - "common.edit.button": "Modificare", - "common.ended": "Finito", - "common.error.details": "Dettagli dell'errore", - "common.error.general": "Qualcosa è andato storto", - "common.error.label": "Errore", - "common.error.request": "Siamo spiacenti, si è verificato un errore durante l'elaborazione della tua richiesta. Se richiedi supporto, assicurati di copiare i dettagli di questo errore.", - "common.error.somethingWrong": "Qualcosa è andato storto!", - "common.errorConnecting.error": "Errore di connessione", - "common.errorLoadingData.error": "Errore durante il caricamento dei dati", - "common.etherscan": "Eteri scansionati", - "common.expiry": "Scadenza", - "common.explore": "Esplorare", - "common.explorer": "Esploratore", - "common.exploreTokens": "Esplora i token", - "common.extension": "Estensione Uniswap", - "common.failedSwitchNetwork": "Impossibile cambiare rete", - "common.fee": "Tassa", - "common.fees": "Commissioni", - "common.feesEarned": "Commissioni guadagnate", - "common.feesEarnedPerBase": "{{symbolA}} ogni {{symbolB}}", - "common.for": "Per", - "common.free": "Gratuito", - "common.fullRange": "Gamma completa", - "common.getApp": "Ottieni l'applicazione", - "common.getHelp.button": "Ottenere aiuto", - "common.getStarted": "Iniziare", - "common.getSupport.button": "Ottieni supporto", - "common.getTheApp": "Ottieni l'applicazione", - "common.getUniswapWallet": "Ottieni il portafoglio Uniswap", - "common.getUniswapWallet.mobile": "Scarica l'app mobile Uniswap", - "common.governance": "Governo", - "common.happyHolidays": "Buone vacanze dal team Uniswap!", - "common.help": "Aiuto", - "common.helpCenter": "Centro assistenza", - "common.hidden": "Nascosto", - "common.hide.button": "Nascondere", - "common.highPrice": "Alto prezzo", - "common.includes": "Include", - "common.info.label": "Informazioni", - "common.input.noRecipient.error": "Seleziona destinatario", - "common.input.password.confirm": "Conferma password", - "common.input.password.error.mismatch": "Le password non corrispondono", - "common.input.password.error.weak": "Questa password è troppo debole", - "common.input.password.new": "Nuova password", - "common.input.password.placeholder": "Parola d'ordine", - "common.input.password.strength.medium": "medio", - "common.input.password.strength.strong": "Forte", - "common.input.password.strength.weak": "Debole", - "common.input.search": "Ricerca", - "common.insufficient.funds": "Fondi insufficienti", - "common.insufficientBalance.error": "Equilibrio insufficiente", - "common.insufficientFundsForNetworkFee.error": "Fondi insufficienti per coprire i costi di rete", - "common.insufficientTokenBalance.error": "Saldo {{tokenSymbol}} insufficiente", - "common.insufficientTokenBalance.error.simple": "Non abbastanza {{tokenSymbol}}", - "common.invalidPair": "Coppia non valida", - "common.invalidRecipient.error": "Destinatario non valido", - "common.iOSAndroid": "iOS e Android", - "common.language": "Lingua", - "common.learnMoreSwap": "Ulteriori informazioni sugli scambi", - "common.legalAndPrivacy": "Legale e Privacy", - "common.less": "Meno", - "common.limit.cancel_one": "Annulla limite", - "common.limit.cancel_other": "Annulla {{count}} limiti", - "common.limit.canceled": "Limite annullato", - "common.limit.executed": "Limite eseguito", - "common.limit.expired": "Limite scaduto", - "common.limit.failed": "Limite non riuscito", - "common.limit.opened": "Limite aperto", - "common.limit.pending": "Limite in sospeso", - "common.limits": "Limiti", - "common.limits.approachMax": "Avvicinamento al limite massimo di 100", - "common.limits.cancelProceed": "Annulla i limiti per procedere", - "common.limits.expires": "Scade {{timestamp}}", - "common.limits.open": "Limiti aperti", - "common.limits.when": "quando {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "Collegamenti", - "common.liquidity": "Liquidità", - "common.liquidity.provision": "Fornitura di liquidità", - "common.liquidity.removed": "Liquidità rimossa", - "common.loading": "Caricamento", - "common.longText.button.less": "Leggi di meno", - "common.longText.button.more": "Per saperne di più", - "common.lowPrice": "Prezzo basso", - "common.manage": "Maneggio", - "common.market.label": "Mercato", - "common.marketPrice": "Prezzo di mercato", - "common.marketPrice.fetching": "Recupero del prezzo di mercato...", - "common.marketPrice.label": "Prezzo di mercato:", - "common.marketPrice.unavailable": "Prezzo di mercato non trovato. Si prega di effettuare le proprie ricerche per evitare perdite di fondi.", - "common.max": "Massimo", - "common.message": "Messaggio", - "common.migrate": "Migrare", - "common.migrate.liquidity.failed": "La migrazione della liquidità non è riuscita", - "common.migrate.position": "Migrare la posizione", - "common.migrated.liquidity": "Liquidità migrata", - "common.migrating.liquidity": "Migrazione della liquidità", - "common.min": "Minimo", - "common.more": "Di più", - "common.moreDetails": "Maggiori dettagli", - "common.navigation.settings": "Impostazioni", - "common.navigation.systemSettings": "Impostazioni", - "common.navigationButton": "Pulsante di navigazione", - "common.needHelp": "Ho bisogno di aiuto?", - "common.networkCost": "Costo di rete", - "common.neverMind": "Non importa", - "common.new": "Nuovo", - "common.new.exclamation": "Nuovo!", - "common.nft": "NFT", - "common.nfts": "NFT", - "common.noAmount.error": "Inserisci un importo", - "common.noData": "Nessun dato", - "common.none": "Nessuno", - "common.noResults": "nessun risultato trovato.", - "common.notAvailableInRegion.error": "Non disponibile nella tua regione", - "common.notCreated.label": "Non creato", - "common.notSupported": "Non supportato", - "common.oneDay": "1 giorno", - "common.oneDay.short": "1D", - "common.oneHour.short": "1 ora", - "common.oneMonth": "1 mese", - "common.oneWeek": "1 settimana", - "common.oneYear": "1 anno", - "common.opensea.link": "Visualizza su OpenSea", - "common.orderCanceled": "Ordine annullato", - "common.orderExecuted": "Ordine eseguito", - "common.orderExpired": "Ordine scaduto", - "common.orderPending": "Ordine in sospeso", - "common.outOfRange": "Fuori dal limite", - "common.pageNotFound": "Pagina non trovata!", - "common.passkey.count": "Chiave di accesso {{number}}", - "common.passkeys": "Passkeys", - "common.passkeys.add": "Aggiungi una passkey", - "common.passkeys.add.description": "Scegli dove salvare la tua nuova passkey.", - "common.pastDay": "Il giorno passato", - "common.pastFiveMinutes": "Ultimi cinque minuti", - "common.pastHour": "L'ultima ora", - "common.pastMonth": "Mese scorso", - "common.pastWeek": "Settimana scorsa", - "common.pastYear": "L'anno scorso", - "common.pending": "In attesa di", - "common.pending.cancellation": "In attesa di cancellazione", - "common.pendingEllipsis": "In attesa di...", - "common.permit": "Permesso", - "common.plusMore": "+{{number}} altro", - "common.pool": "Piscina", - "common.pools": "Piscine", - "common.portfolio": "Portfolio", - "common.poweredBy": "Alimentato da ", - "common.price": "Prezzo", - "common.priceUpdated": "Prezzo aggiornato", - "common.privacyChoices": "Le tue scelte sulla privacy", - "common.privacyChoices.checkbox.description": "Se selezionata, non condivideremo i tuoi dati con partner terzi per pubblicità personalizzate. Puoi abilitare la condivisione in qualsiasi momento deselezionando questa casella.", - "common.privacyChoices.checkbox.label": "Non condividere le mie informazioni", - "common.privacyChoices.description": "Potremmo condividere gli identificatori dei dispositivi con i nostri partner pubblicitari per promuovere i nostri servizi su altri siti Web e piattaforme. Laddove ciò si qualifichi come vendita, condivisione o pubblicità mirata ai sensi delle leggi applicabili, puoi rinunciare selezionando la casella \"non condividere le mie informazioni\". Per maggiori informazioni sulle nostre pratiche sulla privacy, consulta la nostra Informativa sulla privacy.", - "common.privacyChoices.disclaimer": "Si prega di notare che la selezione verrà applicata solo a questo browser su questo dispositivo. È anche possibile rinunciare abilitando l'impostazione Global Privacy Control nel browser che si utilizza per accedere ai nostri servizi. Per vedere altre opzioni, andare alle impostazioni.", - "common.privacyPolicy": "politica sulla riservatezza", - "common.proceed": "Procedere", - "common.proceedInWallet": "Procedi nel tuo portafoglio", - "common.products": "Prodotti", - "common.protocol": "Protocollo", - "common.protocol.v2": "Uniswap v2", - "common.protocol.v3": "Uniswap v3", - "common.protocol.v4": "Uniswap v4", - "common.purchased": "Acquistato", - "common.rate": "Valutare", - "common.readMore": "Per saperne di più", - "common.receive": "Ricevere", - "common.received": "Ricevuto", - "common.recent": "Recente", - "common.refresh": "Aggiornare", - "common.reload.label": "Ricarica l'app", - "common.remove.label": "Rimuovere", - "common.remove.liquidity.canceled": "Rimuovi liquidità annullata", - "common.remove.liquidity.failed": "Rimuovere la liquidità fallito", - "common.removing.liquidity": "Togliere liquidità", - "common.resetLimit": "Reimposta il limite di {{symbol}}", - "common.resetLimitWallet": "Reimposta il limite di {{symbol}} nel portafoglio", - "common.resettingLimit": "Reimpostazione del limite di {{symbol}} ...", - "common.revoke.approval.failed": "Revoca dell'approvazione non riuscita", - "common.revoked.approval": "Approvazione revocata", - "common.revoking.approval": "Revoca dell'approvazione", - "common.scanQRDownload": "Scansiona il codice QR con il tuo telefono per scaricarlo", - "common.selectRegion.label": "Seleziona la tua regione", - "common.selectToken.label": "Seleziona un gettone", - "common.sell.label": "Vendere", - "common.send.button": "Inviare", - "common.send.failed": "Invio fallito", - "common.sending": "Invio", - "common.sent": "Inviato", - "common.settings": "Impostazioni", - "common.share": "Condividere", - "common.share.shareToTwitter": "Condividi su Twitter", - "common.show.button": "Spettacolo", - "common.showLess.button": "Mostra meno", - "common.showMore.button": "Mostra di più", - "common.signatureExpired": "La tua firma è scaduta.", - "common.signMessage": "Firma il messaggio", - "common.signMessageWallet": "Firma il messaggio nel portafoglio", - "common.socials": "Sociali", - "common.sold": "Venduto", - "common.stats": "Statistiche", - "common.status": "Stato", - "common.step.number": "Passo {{number}}", - "common.step.number.of": "Passo {{current}} di {{total}}", - "common.swap": "Scambio", - "common.swap.expired": "Scambio scaduto", - "common.swap.failed": "Scambio fallito", - "common.swapPending": "Scambio in sospeso...", - "common.termsOfService": "Termini di servizio", - "common.text.connected": "Collegato", - "common.text.contract": "Contrarre", - "common.text.disconnected": "Disconnesso", - "common.text.error": "Errore", - "common.text.notAvailable": "N / A", - "common.text.recipient": "A", - "common.text.sender": "Da", - "common.text.unknown": "Sconosciuto", - "common.thisAccount": "questo account", - "common.thisMonth": "Questo mese", - "common.thisToken": "Questo gettone", - "common.thisWeek": "Questa settimana", - "common.thisYear": "Quest'anno", - "common.time": "Tempo", - "common.time.minute.amt": "{{time}}il", - "common.time.minutes": "minuti", - "common.time.past.days": "{{days}} giorni", - "common.time.past.days.short": "{{days}}d", - "common.time.past.hours": "{{hours}} ore", - "common.time.past.hours.short": "{{hours}}h", - "common.time.past.minutes.short": "{{minutes}}il", - "common.time.past.months.short": "{{months}}mese", - "common.time.past.seconds.short": "{{seconds}}s", - "common.to": "a", - "common.today": "Oggi", - "common.tokenA": "Segnalino A", - "common.tokenAmount": "Importo del gettone", - "common.tokenB": "Segnalino B", - "common.tokenName": "Nome del token", - "common.tokens": "Gettoni", - "common.totalUniswapTVL": "Totale TVL Uniswap", - "common.totalValueLocked": "TVL", - "common.trade": "Commercio", - "common.trademarkPolicy": "Politica sui marchi", - "common.transactionDetails": "Dettagli di Transazione", - "common.transactionId": "ID della transazione", - "common.transactionPending": "Transazione in sospeso", - "common.transactions": "Transazioni", - "common.transactionSettings": "Impostazioni della transazione", - "common.transfer_one": "trasferimento", - "common.transfer_other": "trasferimenti", - "common.tryAgain.error": "Riprova", - "common.twitter": "Cinguettio", - "common.type.label": "Tipo", - "common.unavailable": "Non disponibile", - "common.unhide": "Scopri", - "common.unichain": "Unichain", - "common.uniswapMobile": "Cellulare Uniswap", - "common.uniswapWallet": "Portafoglio Uniswap", - "common.uniswapX": "UniswapX", - "common.unknown": "Sconosciuto", - "common.unknownError.error": "Errore sconosciuto", - "common.unwrap.button": "Scartare", - "common.unwrap.failed": "Scarto non riuscito", - "common.unwrapped": "Scartato", - "common.unwrapping": "Scartare", - "common.view.profile": "Visualizza il profilo", - "common.viewOnExplorer": "Visualizza su Explorer", - "common.volume": "Volume", - "common.vote": "Votare", - "common.wallet.approve": "Approva nel portafoglio", - "common.wallet.label": "Portafoglio", - "common.warning": "Avvertimento", - "common.webApp": "Applicazione Web", - "common.website": "Sito web", - "common.whyApprove": "Perché devo approvare un token?", - "common.whySign": "Perché sono necessarie le firme?", - "common.whyWrap": "Perché devo avvolgere il mio {{symbol}}?", - "common.withdraw": "Ritirare", - "common.withdrawal.amount": "Importo del prelievo", - "common.withinRange": "Nel raggio d'azione", - "common.wrap": "Avvolgi {{symbol}}", - "common.wrap.failed": "Avvolgimento non riuscito", - "common.wrapIn": "Avvolgi {{symbol}} nel portafoglio", - "common.wrapped": "Avvolto", - "common.wrapping": "Avvolgimento", - "common.wrappingToken": "Avvolgimento {{symbol}}...", - "common.yesterday": "Ieri", - "common.your.account.had.insufficient.funds": "Il tuo account non disponeva di fondi sufficienti per completare questo scambio.", - "common.your.account.has.insufficient.funds": "Il tuo account non dispone di fondi sufficienti per completare questo scambio.", - "common.your.connected.wallet": "Il tuo portafoglio connesso", - "common.your.limit.could.not.be.fulfilled": "Impossibile soddisfare il limite in questo momento. Per favore riprova.", - "common.your.swap.could.not.be.fulfilled": "Il tuo scambio non può essere completato in questo momento. Per favore riprova.", - "common.youreBuying": "Stai comprando", - "common.youReceive": "Ricevi", - "common.youreSelling": "Stai vendendo", - "currency.ars": "Peso argentino", - "currency.aud": "Dollaro australiano", - "currency.brl": "Real brasiliano", - "currency.cad": "Dollaro canadese", - "currency.cny": "Yuan cinese", - "currency.cop": "Peso colombiano", - "currency.eur": "Euro", - "currency.gbp": "Sterlina Inglese", - "currency.hkd": "Dollaro di Hong Kong", - "currency.idr": "Rupia indonesiana", - "currency.inr": "Rupia indiana", - "currency.jpy": "Yen Giapponese", - "currency.krw": "Won sudcoreano", - "currency.mxn": "Peso messicano", - "currency.ngn": "Naira nigeriana", - "currency.pkr": "Rupia pakistana", - "currency.rub": "Rublo russo", - "currency.sgd": "Dollaro di Singapore", - "currency.try": "Lira turca", - "currency.uah": "Grivnia ucraina", - "currency.usd": "Dollaro degli Stati Uniti", - "currency.vnd": "Dong vietnamita", - "dapp.request.actionCannotBeCompleted.description": "Alcune funzionalità non sono disponibili perché le impostazioni del tuo portafoglio intelligente sono gestite da un'app portafoglio diversa.", - "dapp.request.actionCannotBeCompleted.header": "Richiesta di firma", - "dapp.request.actionCannotBeCompleted.title": "L'azione non può essere completata", - "dapp.request.approve.action": "Approvare", - "dapp.request.approve.fallbackTitle": "Approva questo sito per accedere ai token", - "dapp.request.approve.helptext": "Consenti a questo sito di accedere e spendere questo token per le transazioni. Assicurati di fidarti di questo sito.", - "dapp.request.approve.label": "Portafoglio", - "dapp.request.approve.title": "Approva l'accesso a {{tokenSymbol}}", - "dapp.request.base.title": "Richiesta di transazione", - "dapp.request.bridge.description": "Sposta ETH, USDC e altro su reti {{numChains}}+.", - "dapp.request.bridge.title": "Stai cercando di fare un ponte?", - "dapp.request.connect.helptext": "Consenti a questo sito di visualizzare l'indirizzo del tuo portafoglio, il saldo e di richiedere approvazioni per le transazioni.", - "dapp.request.connect.title": "Connettiti al sito", - "dapp.request.fallback.calldata.label": "Dati grezzi", - "dapp.request.fallback.function.label": "Funzione", - "dapp.request.permit2.description": "Permit2 gestisce le approvazioni dei token su più dapp.", - "dapp.request.permit2.header": "Firmare il permesso2", - "dapp.request.permit2approve.action": "Approvare", - "dapp.request.permit2approve.helptext": "Permit2 gestisce le approvazioni dei token su più dapp.", - "dapp.request.permit2approve.title": "Approva Permesso2", - "dapp.request.reject.action": "Rifiuta tutto", - "dapp.request.reject.info": "Hai {{totalRequestCount}} richieste di transazione", - "dapp.request.revoke.action": "Revocare", - "dapp.request.revoke.helptext": "Consenti a questo sito di revocare l'accesso per spendere questo token per le transazioni. Assicurati di fidarti di questo sito.", - "dapp.request.revoke.title": "Revoca l'accesso a {{tokenSymbol}}", - "dapp.request.signature.containsUnrenderableCharacters": "Questo messaggio contiene caratteri non visualizzabili. Assicurati di fidarti di questo sito.", - "dapp.request.signature.decodeError": "Impossibile decodificare il messaggio", - "dapp.request.signature.header": "Richiesta di firma", - "dapp.request.signature.irregular": "Richiesta di firma irregolare", - "dapp.request.signature.irregular.description": "Assicurati di fidarti di questo sito prima di procedere", - "dapp.request.signature.irregular.understand": "Capisco i rischi", - "dapp.request.signature.toggleDataView.raw": "Visualizza i dati grezzi", - "dapp.request.signature.toggleDataView.readable": "Visualizza i dati originali", - "dapp.request.warning.notActive.message": "Assicurati che sia quello giusto", - "dapp.request.warning.notActive.title": "Questo non è il tuo portafoglio attivo", - "delegation.upgradeModal.description": "Questo aggiornamento del portafoglio utilizza contratti intelligenti per transazioni più veloci e a basso costo. Scopri di più", - "delegation.upgradeModal.enableSmartWallet": "Abilita il portafoglio intelligente", - "delegation.upgradeModal.title": "Scambi più intelligenti, costi più bassi", - "downloadApp.modal.connectExistingWallet": "Collega il portafoglio esistente", - "downloadApp.modal.getStarted.description": "Ottieni l'accesso immediato a migliaia di token tramite il più grande marketplace on-chain del mondo.", - "downloadApp.modal.getStarted.title": "Inizia a scambiare in pochi secondi", - "downloadApp.modal.getTheApp.title": "Inizia con Uniswap", - "downloadApp.modal.uniswapProducts.subtitle": "I prodotti Uniswap interagiscono in modo ottimale per creare la migliore esperienza on-chain.", - "empty.swap.button.text": "Aggiungi fondi allo swap", - "error.dataUnavailable": "I dati non sono al momento disponibili; stiamo lavorando a una soluzione", - "error.id": "ID errore: {{eventId}}", - "error.jupiterApi.execute.default.title": "Si è verificato un problema con l'API Jupiter. Riprova.", - "error.jupiterApi.failedToLand": "(Codice {{code}}: La transazione non è riuscita ad arrivare sulla rete)", - "error.jupiterApi.invalidBlockHeight": "(Codice -1004: Altezza del blocco non valida)", - "error.jupiterApi.invalidMessageBytes": "(Codice -3: Byte del messaggio non validi)", - "error.jupiterApi.invalidPayload": "(Codice -2002: Carico utile non valido)", - "error.jupiterApi.invalidSignedTransaction": "(Codice -2: Transazione firmata non valida)", - "error.jupiterApi.invalidTransaction": "(Codice -1002: Transazione non valida)", - "error.jupiterApi.missingCachedOrder": "(Codice -1: ordine memorizzato nella cache mancante)", - "error.jupiterApi.notFullySigned": "(Codice -1003: Transazione non completamente firmata)", - "error.jupiterApi.quoteExpired": "Questa citazione è scaduta, riprova. (Codice -2003)", - "error.jupiterApi.unknownErrorCode": "(Codice {{code}})", - "error.noData": "Nessun dato trovato", - "error.request.provideId": "Siamo spiacenti, si è verificato un errore durante l'elaborazione della tua richiesta. Se richiedi supporto, assicurati di fornire l'ID errore.", - "error.tokenApproval": "L'approvazione del token non è riuscita", - "error.tokenApproval.message": "Probabilmente un problema di rete o di connessione ha impedito l'approvazione. Controlla la connessione e riprova.", - "error.tokenApprovalEdited": "Importo di approvazione insufficiente", - "error.tokenApprovalEdited.message": "L'importo di approvazione impostato nel tuo portafoglio è troppo basso per completare questa transazione. Riprova e aumenta l'importo.", - "errors.crash.message": "Qualcosa si è schiantato.", - "errors.crash.restart": "Riavvia l'app", - "errors.crash.title": "Uh Oh!", - "explore.more.pools": "Esplora altre piscine", - "explore.more.unichain": "Esplora i pool Unichain", - "explore.search.label.ownedBy": "Di proprietà di {{ownerAddress}}", - "explore.search.placeholder": "Cerca token e portafogli", - "explore.search.section.nft": "Collezioni NFT", - "explore.search.section.popularNFT": "Collezioni NFT popolari", - "explore.search.section.wallets": "Portafogli", - "explore.tokens.error": "Impossibile caricare i token", - "explore.tokens.favorite.action.add": "Gettone preferito", - "explore.tokens.favorite.action.edit": "Modifica Preferiti", - "explore.tokens.favorite.action.remove": "Rimuovi preferito", - "explore.tokens.favorite.title.default": "Gettoni preferiti", - "explore.tokens.favorite.title.edit": "Modifica i token preferiti", - "explore.tokens.metadata.marketCap": "{{number}} MCapp.", - "explore.tokens.metadata.totalValueLocked": "{{number}} TVL", - "explore.tokens.metadata.volume": "{{number}} Vol", - "explore.tokens.sort.label.marketCap": "Capitalizzazione di mercato", - "explore.tokens.sort.label.priceDecrease": "Diminuzione del prezzo", - "explore.tokens.sort.label.priceIncrease": "Aumento di prezzo", - "explore.tokens.sort.label.totalValueLocked": "TVL", - "explore.tokens.sort.label.volume": "Volume", - "explore.tokens.sort.option.marketCap": "Capitalizzazione di mercato", - "explore.tokens.sort.option.priceDecrease": "Diminuzione del prezzo (24 ore)", - "explore.tokens.sort.option.priceIncrease": "Aumento dei prezzi (24 ore)", - "explore.tokens.sort.option.totalValueLocked": "TVL di Uniswap", - "explore.tokens.sort.option.volume": "Volume Uniswap (24 ore)", - "explore.tokens.top.title": "I migliori token", - "explore.v2TVL": "v2 linea di trasmissione", - "explore.v3TVL": "v3 linea di trasmissione", - "explore.v4TVL": "v4 linea di trasmissione", - "explore.wallets.favorite.action.add": "Portafoglio preferito", - "explore.wallets.favorite.action.edit": "Modifica Preferiti", - "explore.wallets.favorite.action.remove": "Rimuovi preferito", - "explore.wallets.favorite.action.remove.short": "Amico", - "explore.wallets.favorite.title.default": "Portafogli preferiti", - "explore.wallets.favorite.title.edit": "Modifica i portafogli preferiti", - "extension.connection.network": "Rete", - "extension.connection.networks": "Reti", - "extension.connection.popup.trouble": "Problemi di connessione?", - "extension.connection.titleConnected": "Collegato", - "extension.connection.titleNotConnected": "Non collegata", - "extension.lock.button.forgot": "Ha dimenticato la password?", - "extension.lock.button.reset": "Reimposta portafoglio", - "extension.lock.button.submit": "Sbloccare", - "extension.lock.password.error": "Password errata. Riprova", - "extension.lock.password.reset.initial.description": "Uniswap non può aiutarti a recuperare la tua password. Devi reimpostare il tuo portafoglio inserendo nuovamente la frase di recupero di 12 parole.", - "extension.lock.password.reset.initial.help": "Dove trovo la mia frase di recupero?", - "extension.lock.password.reset.initial.title": "Ha dimenticato la password", - "extension.lock.password.reset.speedbump.description": "Assicurati di avere la frase di recupero di 12 parole prima di ripristinare il tuo portafoglio. Altrimenti non sarai in grado di recuperare i tuoi fondi.", - "extension.lock.password.reset.speedbump.help": "Ho perso la frase di recupero", - "extension.lock.password.reset.speedbump.title": "Prima di continuare", - "extension.lock.subtitle": "Inserisci la tua password per sbloccare", - "extension.lock.title": "Bentornato", - "extension.network.notSupported": "Rete non supportata", - "extension.open": "Apri l'estensione Uniswap", - "extension.passwordPrompt.error.wrongPassword": "Password errata. Riprova", - "extension.passwordPrompt.title": "Inserisci la tua password", - "extension.popup.chrome.button": "Estensione aperta", - "extension.popup.chrome.description": "Per completare questa azione, apri l'estensione Uniswap.", - "extension.popup.chrome.title": "Continua su Uniswap", - "extension.settings.defaultWallet.message": "Dare priorità all'estensione Uniswap quando ci si connette alle app.", - "extension.settings.defaultWallet.title": "Rendi il portafoglio predefinito", - "extension.uninstall.reason.missingFeatures": "Il portafoglio Uniswap non ha alcune funzionalità", - "extension.uninstall.reason.notUsingCrypto": "Non voglio più usare le criptovalute", - "extension.uninstall.reason.other": "Altri motivi", - "extension.uninstall.reason.switchingWallet": "Sto passando a un portafoglio diverso", - "extension.uninstall.subtitle": "Se hai un momento, ci piacerebbe sapere perché hai disinstallato Uniswap Wallet", - "extension.uninstall.title": "Ci dispiace vederti andare", - "extension.warning.storage.button": "Backup", - "extension.warning.storage.message": "Assicurati di eseguire il backup della frase di recupero per evitare di perdere l'accesso al tuo portafoglio e ai tuoi fondi.", - "extension.warning.storage.title": "Il tuo browser sta esaurendo lo spazio di archiviazione", - "extensionPasskeyLogInPopUp.description": "Importa il tuo account Uniswap effettuando l'accesso con una passkey esistente.", - "extensionPasskeyLogInPopUp.invalidReferrer": "Si prega di chiudere questa pagina e riprovare.", - "fee.bestForCustomizability": "Ideale per la personalizzazione.", - "fee.bestForExotic": "Ideale per coppie esotiche.", - "fee.bestForMost": "Ideale per la maggior parte delle coppie.", - "fee.bestForStablePairs": "Ideale per coppie stabili.", - "fee.bestForVeryStable": "Ideale per coppie molto stabili.", - "fee.dynamic": "Tariffa dinamica", - "fee.percentEarned": "La % che guadagnerai in commissioni.", - "fee.selectPercent": "{{pct}}% seleziona", - "fee.selectPercentDescription": "{{pct}}% di liquidità selezionata in questo livello", - "fee.tier": "Livello tariffario", - "fee.tier.create": "Crea livello tariffario", - "fee.tier.create.button": "Crea un nuovo livello tariffario", - "fee.tier.create.description": "La creazione di un nuovo livello inizializzerà un nuovo pool e comporterà costi di rete più elevati del solito.", - "fee.tier.description": "L'importo guadagnato fornendo liquidità. Scegli un importo che si adatti alla tua tolleranza al rischio e alla tua strategia.", - "fee.tier.description.v2": "L'importo guadagnato fornendo liquidità. Tutti i pool v2 hanno commissioni fisse dello 0,3%. Per altre opzioni, fornisci liquidità su v4.", - "fee.tier.dynamic": "Livello tariffario dinamico", - "fee.tier.dynamic.create": "Creazione di livelli tariffari dinamici", - "fee.tier.dynamic.create.info": "Stai per creare un pool con un livello di commissioni dinamico. Prima di procedere, assicurati che l'hook selezionato supporti le commissioni dinamiche.", - "fee.tier.highestTvl": "TVL più alto", - "fee.tier.label": "La % che guadagnerai in commissioni", - "fee.tier.missing.description": "Non riesci a trovare il livello che stai cercando?", - "fee.tier.new": "Nuovo livello", - "fee.tier.percent.select": "{{percentage}} seleziona", - "fee.tier.recommended.description": "Consigliato in quanto offre la quota più elevata di liquidità per la coppia di token selezionata.", - "fee.tier.search": "Cerca o crea altri livelli tariffari", - "fee.tier.search.short": "Cerca livelli", - "fee.tier.select": "Seleziona il livello di tariffa", - "fee.tier.select.existing.button": "Seleziona il livello tariffario esistente", - "fee.tierExact": "{{fee}} livello tariffario", - "fee.unavailable": "Le commissioni guadagnate non sono visibili per le posizioni v2 finché non viene rimossa la liquidità.", - "fee.uncollected": "Include le commissioni non riscosse:", - "fee.uniswap": "Tariffa ({{percent}})", - "fee.uniswap.description": "Le commissioni vengono applicate per garantire la migliore esperienza con Uniswap.", - "fiatOffRamp.checkout.title": "Ritirarsi a", - "fiatOffRamp.connection.quote": "Vendita di {{amount}} di {{currencySymbol}}", - "fiatOffRamp.error.balance": "Supera il saldo", - "fiatOffRamp.error.populateSend.description": "Attendi un attimo e riprova.", - "fiatOffRamp.error.populateSend.title": "Impossibile caricare la transazione", - "fiatOffRamp.summary.total": "{{cryptoAmount}} per {{fiatAmount}}", - "fiatOffRamp.unsupportedToken.back": "Torna indietro", - "fiatOffRamp.unsupportedToken.divider": "Token non supportati", - "fiatOffRamp.unsupportedToken.message": "Questo token non è supportato per la vendita. Scambia questa risorsa con uno dei token supportati.", - "fiatOffRamp.unsupportedToken.swap": "Passa a un token supportato", - "fiatOffRamp.unsupportedToken.title": "Token non supportato", - "fiatOffRamp.welcome.tooltip": "Vendi le tue criptovalute sul tuo conto bancario o sulla tua carta di debito.", - "fiatOnRamp.button.chooseToken": "Scegli il token", - "fiatOnRamp.buy.info.description": "Ti servirà per pagare i costi di rete durante lo scambio.", - "fiatOnRamp.buy.info.title": "Inizia con ETH", - "fiatOnRamp.cexTransferModal.description": "L'acquisto di criptovalute con una carta non è supportato nella tua regione. Trasferisci asset da un account di exchange centralizzato per finanziare il tuo portafoglio.", - "fiatOnRamp.cexTransferModal.title": "Trasferisci per iniziare", - "fiatOnRamp.checkout.title": "Guardare", - "fiatOnRamp.chooseMultiPlatformProvider.chooseNetwork": "Scegli la rete", - "fiatOnRamp.chooseMultiPlatformProvider.description": "Questo determinerà l'indirizzo del portafoglio su cui riceverai i fondi.", - "fiatOnRamp.chooseProvider.description": "Continuerai al portale del fornitore per vedere le commissioni associate alla tua transazione.", - "fiatOnRamp.completeTransactionHeader": "Completa la transazione con {{serviceProvider}}", - "fiatOnRamp.connection.error": "Connessione fallita", - "fiatOnRamp.connection.errorDescription": "Qualcosa è andato storto durante la connessione a {{serviceProvider}}.", - "fiatOnRamp.connection.message": "Ti collego a {{serviceProvider}}", - "fiatOnRamp.connection.quote": "Acquistando {{amount}} per un valore di {{currencySymbol}}", - "fiatOnRamp.connection.terms": "Se continui, riconosci di essere soggetto ai Termini di servizio e all' Informativa sulla privacy con {{serviceProvider}}, a seconda dei casi.", - "fiatOnRamp.continueInTab": "Vai alla scheda {{serviceProvider}} per continuare. È sicuro chiudere questa modale ora.", - "fiatOnRamp.disclaimer": "Se continui, riconosci di essere soggetto ai Termini di servizio e all' Informativa sulla privacy con {{serviceProvider}}, a seconda dei casi.", - "fiatOnRamp.error.default": "Qualcosa è andato storto.", - "fiatOnRamp.error.load": "Impossibile caricare i token da acquistare", - "fiatOnRamp.error.max": "Massimo {{amount}}", - "fiatOnRamp.error.min": "Minimo {{amount}}", - "fiatOnRamp.error.noQuotes": "Nessuna citazione trovata.", - "fiatOnRamp.error.unavailable": "Questo servizio non è disponibile nella tua regione", - "fiatOnRamp.error.unsupported": "Non supportato nella regione", - "fiatOnRamp.error.usd": "Disponibile solo per l'acquisto in USD", - "fiatOnRamp.noQuotes.error": "Nessuna citazione trovata", - "fiatOnRamp.paymentMethods.applePay": "Apple Pay", - "fiatOnRamp.paymentMethods.bank": "Banca", - "fiatOnRamp.paymentMethods.debit": "Addebito", - "fiatOnRamp.paymentMethods.googlePay": "Google Pay", - "fiatOnRamp.paymentMethods.paypal": "PayPal", - "fiatOnRamp.paymentMethods.venmo": "Venmo", - "fiatOnRamp.quote.advice": "Continuerai al portale del fornitore per vedere le commissioni associate alla tua transazione.", - "fiatOnRamp.quote.type.list": "{{optionsList}}e altre opzioni", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "Da un conto", - "fiatOnRamp.receiveCrypto.title": "Ricevi criptovaluta", - "fiatOnRamp.receiveCrypto.transferFunds": "Finanzia il tuo portafoglio trasferendo criptovalute da un altro portafoglio o account", - "fiatOnRamp.receiveCrypto.useThisAddress": "Utilizza questo indirizzo per ricevere token su", - "fiatOnRamp.region.placeholder": "Cerca per paese o regione", - "fiatOnRamp.region.title": "Seleziona la tua regione", - "fiatOnRamp.summary.total": "{{cryptoAmount}} per {{fiatAmount}}", - "forceUpgrade.action.backup": "Fai il backup del tuo portafoglio", - "forceUpgrade.action.confirm": "Aggiorna ora", - "forceUpgrade.action.learn": "Scopri come aggiornare", - "forceUpgrade.description.extension": "È disponibile una nuova versione dell'app. Per continuare a usare l'estensione Uniswap, aggiornala all'ultima versione.", - "forceUpgrade.description.wallet": "È disponibile una nuova versione dell'app. Per continuare a usare Uniswap Wallet, aggiornalo all'ultima versione.", - "forceUpgrade.label.recoveryPhrase": "Frase di recupero", - "forceUpgrade.title": "Aggiorna all'ultima versione", - "forceUpgrade.title.recommendedStatus": "È disponibile una nuova versione", - "globalPreferences.title": "Preferenze globali", - "hero.scroll": "Scorri per saperne di più", - "hero.subtitle": "Acquista e vendi criptovalute su reti {{amount}}+ tra cui Ethereum, Unichain e Base.", - "hero.swap.title": "Scambia quando vuoi,
ovunque.", - "hidden.nfts.info.banner.text": "Scopri di più sugli NFT nascosti", - "hidden.nfts.info.text.button": "NFT nascosti ({{numHidden}})", - "hidden.nfts.info.text.extension": "Queste sono potenziali truffe e NFT che hai nascosto. Puoi cliccare con il tasto destro su un NFT per visualizzarlo.", - "hidden.nfts.info.text.mobile": "Queste sono potenziali truffe e NFT che hai nascosto. Puoi premere a lungo su un NFT per renderlo visibile.", - "hidden.nfts.info.text.title": "NFT nascosti", - "hidden.tokens.info.banner.text": "Scopri di più sui token nascosti", - "hidden.tokens.info.text.button": "Segnalini nascosti ({{numHidden}})", - "hidden.tokens.info.text.info": "Si tratta di potenziali truffe, piccoli saldi e token che hai nascosto. I token nascosti non sono inclusi nel saldo totale del tuo portafoglio.", - "hidden.tokens.info.text.title": "Gettoni nascosti", - "home.activity.empty.button": "Ricevi token o NFT", - "home.activity.empty.description.default": "Quando approvi, scambi o trasferisci token o NFT, le tue transazioni verranno visualizzate qui.", - "home.activity.empty.description.external": "Quando questo portafoglio effettua transazioni, queste verranno visualizzate qui.", - "home.activity.empty.title": "Nessuna attività ancora", - "home.activity.error.load": "Impossibile caricare l'attività", - "home.activity.title": "Attività", - "home.banner.offline": "Sei in modalità offline", - "home.banner.testnetMode": "Sei in modalità testnet", - "home.banner.testnetMode.nav": "Sei in modalità testnet. Disattiva questa opzione nelle impostazioni.", - "home.empty.cexTransfer": "Trasferire", - "home.empty.cexTransfer.description": "Sposta fondi da una piattaforma di trading.", - "home.empty.transfer": "Ricevi criptovaluta", - "home.empty.transfer.description": "Sposta fondi da un altro portafoglio.", - "home.explore.footer": "Tocca qui per esplorare migliaia di token, NFT e altro ancora", - "home.explore.title": "Esplora i token", - "home.extension.error": "Errore durante il caricamento degli account", - "home.label.buy": "Acquistare", - "home.label.for": "Acquista/Vendi", - "home.label.receive": "Ricevere", - "home.label.send": "Inviare", - "home.label.swap": "Scambio", - "home.nfts.title": "NFT", - "home.tokens.empty.action.buy.description": "Acquista con carta di debito o conto bancario.", - "home.tokens.empty.action.buy.title": "Acquista criptovaluta", - "home.tokens.empty.action.import.description": "Inserisci la frase di recupero di questo portafoglio per iniziare lo scambio e l'invio.", - "home.tokens.empty.action.import.title": "Importa portafoglio", - "home.tokens.empty.action.receive.description": "Trasferimento da un altro portafoglio o conto.", - "home.tokens.empty.action.receive.title": "Ricevi criptovaluta", - "home.tokens.empty.description": "Quando questo portafoglio acquista o riceve token, verranno visualizzati qui.", - "home.tokens.empty.title": "Nessun token ancora", - "home.tokens.empty.welcome.description": "Aggiungi fondi per iniziare a fare trading", - "home.tokens.error.fetch": "Impossibile recuperare i saldi dei token", - "home.tokens.error.load": "Impossibile caricare i saldi dei token", - "home.tokens.title": "Gettoni", - "home.upsell.receive.cta": "Da un conto", - "home.upsell.receive.title": "Ricevi criptovaluta", - "home.warning.viewOnly": "Questo è un portafoglio di sola visualizzazione", - "interface.metatags.description": "Fai trading di criptovalute su Ethereum, Base, Arbitrum, Polygon, Unichain e altro ancora. La piattaforma DeFi di cui si fidano milioni di persone.", - "interface.metatags.title": "Interfaccia Uniswap", - "landing.api": "API", - "landing.appsOverview": "Progettato per tutti i modi in cui cambi", - "landing.blog.description": "Resta aggiornato sulle ultime novità aziendali, sulle caratteristiche dei prodotti e altro ancora", - "landing.docs.description": "Esplora la nostra libreria di documenti per sviluppatori per iniziare a sviluppare con Uniswap", - "landing.exploreUniverse": "Esplora l'UNIverso", - "landing.getStarted": "Fai trading sul DEX più grande del mondo", - "landing.helpCenter.body": "Consulta le FAQ e ricevi supporto dal nostro team di supporto con sede negli Stati Uniti", - "landing.protocolDescription": "Uniswap Labs supporta alcuni dei prodotti più utilizzati nel settore delle criptovalute. Scopri l'accesso senza autorizzazione, la sicurezza comprovata e il supporto dedicato.", - "landing.protocolStats": "Statistiche del protocollo Uniswap", - "landing.provideLiquidity.body": "Fornisci liquidità e riscuoti commissioni tramite l'interfaccia Uniswap.", - "landing.provideLiquidity.subtitle": "Potenzia i mercati on-chain.", - "landing.socials": "Segui Uniswap Labs su X, Farcaster, LinkedIn, e TikTok", - "landing.swapBody": "Accedi a una liquidità elevata, esplora i token, imposta ordini limite e fornisci liquidità per migliaia di token su catene {{amount}} .", - "landing.swapSubtitle": "Scambio senza autorizzazione.", - "landing.tradingApi": "API di trading", - "landing.tradingApiBody": "Utilizza la stessa API che alimenta l'app Web e il portafoglio Uniswap, apprezzati dai team leader in tutto il mondo.", - "landing.tradingApiButton": "Integra l'API Uniswap", - "landing.tradingApiSubtitle": "DeFi, direttamente ai tuoi utenti.", - "landing.trusted": "Scelto da milioni di persone", - "landing.unichain.body": "Unisciti alla community che sta costruendo su Ethereum L2, una rete veloce e decentralizzata progettata per ospitare la DeFi.", - "landing.unichain.button": "Inizia a costruire", - "landing.unichain.subtitle": "La catena DeFi.", - "landing.uniswapX.body": "Transazioni senza carburante e protezione MEV, senza commissioni per gli swap falliti.", - "landing.uniswapX.button": "Prova UniswapX", - "landing.uniswapX.subtitle": "Scambi più intelligenti, zero attriti.", - "landing.walletBody": "Portafoglio crittografico e estensione di fiducia con custodia autonoma, milioni di download, supporto da persone reali e una valutazione di 4,8 .", - "landing.walletSubtitle": "Scambia, conserva, esplora.", - "language.afrikaans": "afrikaans", - "language.arabic": "arabo", - "language.catalan": "catalano", - "language.chineseSimplified": "Cinese semplificato", - "language.chineseTraditional": "Cinese tradizionale", - "language.czech": "ceco", - "language.danish": "danese", - "language.dutch": "Olandese", - "language.english": "Inglese", - "language.finnish": "finlandese", - "language.french": "francese", - "language.greek": "greco", - "language.hebrew": "ebraico", - "language.hindi": "hindi", - "language.hungarian": "ungherese", - "language.indonesian": "indonesiano", - "language.italian": "Italiano", - "language.japanese": "giapponese", - "language.korean": "coreano", - "language.malay": "malese", - "language.norwegian": "norvegese", - "language.polish": "Polacco", - "language.portuguese": "portoghese", - "language.romanian": "rumeno", - "language.russian": "russo", - "language.serbian": "serbo", - "language.spanishArgentina": "spagnolo (Argentina)", - "language.spanishBelize": "Spagnolo (Belize)", - "language.spanishBolivia": "spagnolo (Bolivia)", - "language.spanishChile": "spagnolo (Cile)", - "language.spanishColombia": "spagnolo (Colombia)", - "language.spanishCostaRica": "spagnolo (Costa Rica)", - "language.spanishCuba": "spagnolo (Cuba)", - "language.spanishDominicanRepublic": "spagnolo (Repubblica Dominicana)", - "language.spanishEcuador": "spagnolo (Ecuador)", - "language.spanishElSalvador": "spagnolo (El Salvador)", - "language.spanishGuatemala": "spagnolo (Guatemala)", - "language.spanishHonduras": "spagnolo (Honduras)", - "language.spanishLatam": "Spagnolo (America Latina)", - "language.spanishMexico": "spagnolo (Messico)", - "language.spanishNicaragua": "spagnolo (Nicaragua)", - "language.spanishPanama": "spagnolo (Panama)", - "language.spanishParaguay": "spagnolo (Paraguay)", - "language.spanishPeru": "spagnolo (Perù)", - "language.spanishPuertoRico": "spagnolo (Porto Rico)", - "language.spanishSpain": "Spagnolo (Spagna)", - "language.spanishUruguay": "spagnolo (Uruguay)", - "language.spanishUs": "Spagnolo (Stati Uniti)", - "language.spanishVenezuela": "spagnolo (Venezuela)", - "language.swahili": "swahili", - "language.swedish": "svedese", - "language.turkish": "Turco", - "language.ukrainian": "ucraino", - "language.urdu": "Italiano:", - "language.vietnamese": "vietnamita", - "large.price.difference": "Grande differenza di prezzo", - "large.price.difference.tooltip": "Procedere con questa operazione comporterà una perdita di fondi. Questa differenza può essere dovuta a transazioni di grandi dimensioni o a scarsa liquidità.", - "limit.open.count_one": "1 limite aperto", - "limit.open.count_other": "{{count}} limiti aperti", - "limitPrice.buyingAboveMarketPrice.error.description": "Il tuo prezzo limite è superiore del {{percentage}}% rispetto al mercato. Modifica il prezzo limite per procedere.", - "limitPrice.buyingAboveMarketPrice.error.title": "Acquistando {{tokenSymbol}} sopra il prezzo di mercato", - "limitPrice.marketPriceNotAvailable.error.description": "Non siamo in grado di calcolare il prezzo di mercato attuale. Per evitare di inviare un ordine al di sotto del prezzo di mercato, controlla la connessione di rete e riprova.", - "limitPrice.marketPriceNotAvailable.error.title": "Prezzo di mercato non disponibile", - "limitPrice.sellingBelowMarketPrice.error.description": "Il tuo prezzo limite è inferiore del {{percentage}}% rispetto al mercato. Modifica il prezzo limite per procedere.", - "limitPrice.sellingBelowMarketPrice.error.title": "Vendita di {{tokenSymbol}} al di sotto del prezzo di mercato", - "limits.form.disclaimer.mainnet": "Per i limiti sono disponibili solo i token della rete principale Ethereum. ", - "limits.form.disclaimer.mainnet.short": "Per i limiti sono disponibili solo i token Mainnet.", - "limits.form.disclaimer.uniswapx": "I limiti potrebbero non essere eseguiti esattamente quando i token raggiungono il prezzo specificato. ", - "limits.learnMore": "Ulteriori informazioni sui limiti", - "limits.price.input.label": "Quando vale 1 ", - "limits.price.label": "Prezzo limite", - "limits.selectSupportedTokens": "Seleziona i token supportati", - "liquidity.hooks": "Ganci su v4", - "liquidity.hooks.address.input": "Inserisci l'indirizzo del gancio", - "liquidity.hooks.address.tooltip": "Indirizzo hook: {{address}}", - "liquidity.learnMoreLabel": "Scopri di più sulla fornitura di liquidità", - "liquidity.notEnough.label": "Liquidità insufficiente per mostrare un valore USD accurato.", - "liquidity.provideOnProtocols": "Fornire liquidità su diversi protocolli", - "liquidityPool.page.title": "Aggiungi liquidità alle pool{{version}} su Uniswap", - "liquidityPool.positions.closed.title": "Posizioni chiuse", - "liquidityPool.positions.loadingMore": "Caricamento di altre posizioni...", - "liquidityPool.positions.page.title": "Gestisci la liquidità del pool di {{quoteSymbol}}/{{baseSymbol}} su Uniswap", - "liquidityPool.positions.page.version.description": "Visualizza le tue {{version}} posizioni di liquidità attive. Aggiungi nuove posizioni.", - "liquidityPool.positions.page.version.title": "Gestisci la liquidità del pool{{version}} su Uniswap", - "migrate.allowed": "Consentito", - "migrate.allowLpMigration": "Consenti la migrazione del token LP", - "migrate.connectAccount": "Devi collegare un account a cui appartiene questa posizione.", - "migrate.connectWallet": "Connettiti a un portafoglio per visualizzare la tua liquidità V2.", - "migrate.contract": "Contratto di migrazione Uniswap", - "migrate.firstLP": "Sei il primo fornitore di liquidità per questo pool Uniswap V3. La tua liquidità migrerà al prezzo attuale di {{source}} .", - "migrate.highGasCost": "Il costo della transazione sarà molto più elevato poiché include il gas per creare il pool.", - "migrate.invalidRange": "Intervallo selezionato non valido. Il prezzo minimo deve essere inferiore al prezzo massimo.", - "migrate.lpNFT": "{{symA}}/{{symB}} NFT LP", - "migrate.lpTokens": "{{symA}}/{{symB}} gettoni LP", - "migrate.migrating": "Migrazione", - "migrate.missingV2Position": "Non vedi una delle tue posizioni v2? Importalo.", - "migrate.noV2Liquidity": "Nessuna liquidità V2 trovata.", - "migrate.positionNoFees": "La tua posizione non guadagnerà commissioni né verrà utilizzata nelle transazioni finché il prezzo di mercato non si sposterà nel tuo intervallo.", - "migrate.priceDifference": "Differenza di prezzo: ", - "migrate.priceWarning": "Dovresti depositare liquidità su Uniswap V3 solo al prezzo che ritieni corretto.
Se il prezzo sembra sbagliato, puoi fare uno scambio per spostare il prezzo o aspettare che lo faccia qualcun altro.", - "migrate.refund": "Almeno {{amtA}} {{symA}} e {{amtB}} {{symB}} verranno rimborsati sul tuo portafoglio a causa della fascia di prezzo selezionata.", - "migrate.selectFeeTier": "Seleziona il livello di tariffa", - "migrate.setRange": "Imposta la fascia di prezzo", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Prezzo:", - "migrate.v2Description": "Questo strumento migrerà in modo sicuro la tua liquidità {{source}} alla V3. Il processo è completamente trustless grazie al <0>contratto di migrazione Uniswap ↗", - "migrate.v2Instruction": "Per ogni pool mostrato di seguito, fai clic su Migra per rimuovere la liquidità da Uniswap V2 e depositarla su Uniswap V3.", - "migrate.v2Title": "Migrare la liquidità V2", - "migrate.v3Price": "V3 {{sym}} Prezzo:", - "mint.v3.input.invalidPrice.error": "Immissione del prezzo non valida", - "mobileAppPromo.banner.getTheApp.link": "Ottieni l'app Uniswap Wallet", - "mobileAppPromo.banner.title": "Uniswap: portafoglio criptovaluta e NFT", - "moonpay.poweredBy": "Fiat onramp gestito da MoonPay USA LLC", - "nav.createAccount.button": "Creare un account", - "nav.logIn.button": "Login", - "nav.logInOrConnect.title": "Accedi o connettiti", - "nav.products.tradingApi": "Integrare il protocollo", - "nav.products.unichain": "La catena DeFi", - "nav.products.uniswapX": "Il meta-aggregatore", - "nav.products.wallet": "Scambia, conserva, esplora", - "nav.signUp.button": "Iscrizione", - "nav.tabs.createPosition": "Crea posizione", - "nav.tabs.viewPositions": "Visualizza le posizioni", - "network.lostConnection": "Potresti aver perso la connessione di rete.", - "network.mightBeDown": "{{network}} potrebbe essere inattivo in questo momento o potresti aver perso la connessione di rete.", - "network.warning": "Avviso di rete", - "nft.noPools": "Nessuna piscina ancora", - "nft.reportSpam": "Segnala come spam", - "notFound.oops": "Ops, riportami a Swap", - "notice.uk": "Questa applicazione web viene fornita come strumento per consentire agli utenti di interagire con il protocollo Uniswap di propria iniziativa, senza alcuna approvazione o raccomandazione delle attività di trading di criptovaluta. In tal modo, Uniswap non consiglia agli utenti o ai potenziali utenti di impegnarsi in attività di trading di criptoasset e gli utenti o potenziali utenti dell'applicazione web non dovrebbero considerare questa pagina web o i suoi contenuti come implicanti qualsiasi forma di raccomandazione, invito o incentivo a negoziare criptoasset. .", - "notice.uk.label": "Dichiarazione di non responsabilità nel Regno Unito:", - "notification.assetVisibility.hidden": "{{assetName}} nascosto", - "notification.assetVisibility.unhidden": "{{assetName}} non nascosto", - "notification.buy.network": "Acquista su {{network}}", - "notification.copied.address": "Indirizzo copiato", - "notification.copied.calldata": "Dati chiamata copiati", - "notification.copied.contractAddress": "Indirizzo del contratto copiato", - "notification.copied.failed": "Impossibile copiare negli appunti", - "notification.copied.image": "Immagine copiata", - "notification.copied.linkUrl": "Collegamento copiato", - "notification.copied.nftUrl": "URL NFT copiato", - "notification.copied.poolId": "ID pool copiato", - "notification.copied.tokenUrl": "URL del token copiato", - "notification.copied.transactionId": "ID transazione copiato", - "notification.copied.unitag": "Nome utente copiato", - "notification.countryChange": "Passato a {{countryName}}", - "notification.limit.network": "Creazione di un ordine limite su {{network}}", - "notification.lp.network": "Fornire liquidità su {{network}}", - "notification.network.changed": "Passato a {{network}}", - "notification.passwordChanged": "Password cambiata", - "notification.poolFinder.network": "Cerca pool su {{network}}", - "notification.restore.success": "Portafoglio ripristinato!", - "notification.sell.network": "In vendita su {{network}}", - "notification.send.network": "Invio il {{network}}", - "notification.smartWallet.disabled": "Disabilitato su 1 rete", - "notification.smartWallet.disabled.all": "Portafoglio intelligente disabilitato", - "notification.smartWallet.disabled.plural": "Disabilitato sulle reti {{amount}}", - "notification.spam.NFT.failed": "Impossibile segnalare l'NFT. Riprova più tardi.", - "notification.spam.NFT.successful": "Segnalato", - "notification.swap.network": "Scambio su {{network}}", - "notification.swap.pending.swap": "Scambio in sospeso", - "notification.swap.pending.unwrap": "Scarta in sospeso", - "notification.swap.pending.wrap": "Avvolgi in sospeso", - "notification.transaction.approve.canceled": "Annullato {{currencySymbol}} approvazione.", - "notification.transaction.approve.fail": "Impossibile approvare {{currencySymbol}} per l'uso con {{address}}.", - "notification.transaction.approve.success": "Approvato {{currencySymbol}} per l'uso con {{address}}.", - "notification.transaction.pending": "Transazione in sospeso", - "notification.transaction.swap.canceled": "Scambio {{inputCurrencySymbol}}-{{outputCurrencySymbol}} annullato.", - "notification.transaction.swap.expired": "Lo scambio di {{inputCurrencyAmountWithSymbol}} per {{outputCurrencyAmountWithSymbol}} è scaduto.", - "notification.transaction.swap.fail": "Impossibile scambiare {{inputCurrencyAmountWithSymbol}} con {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.swap.success": "Scambiato {{inputCurrencyAmountWithSymbol}} con {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.transfer.canceled": "Annullato {{tokenNameOrAddress}} invia", - "notification.transaction.transfer.fail": "Impossibile inviare {{tokenNameOrAddress}} a {{walletNameOrAddress}}", - "notification.transaction.transfer.received": "Ricevuto {{tokenNameOrAddress}} da {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "Inviato {{tokenNameOrAddress}} a {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "Impossibile effettuare la transazione con {{addressOrEnsName}}", - "notification.transaction.unknown.fail.short": "transazione fallita", - "notification.transaction.unknown.success.full": "Transato con {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "Transazione confermata", - "notification.transaction.unwrap.canceled": "Scarto {{inputCurrencySymbol}} annullato.", - "notification.transaction.unwrap.fail": "Impossibile aprire {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.unwrap.success": "Ho scartato {{inputCurrencyAmountWithSymbol}} e ho ricevuto {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.canceled": "Avvolgimento {{inputCurrencySymbol}} annullato.", - "notification.transaction.wrap.fail": "Impossibile eseguire il wrapper di {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.success": "Avvolto {{inputCurrencyAmountWithSymbol}} e ricevuto {{outputCurrencyAmountWithSymbol}}.", - "notification.transfer.pending": "Invia in sospeso", - "notification.walletConnect.confirmed": "Transazione confermata con {{dappName}}", - "notification.walletConnect.connected": "Collegato", - "notification.walletConnect.disconnected": "Disconnesso", - "notification.walletConnect.failed": "Transazione fallita con {{dappName}}", - "notification.walletConnect.networkChanged.full": "Passato a {{networkName}}", - "notification.walletConnect.networkChanged.short": "Reti commutate", - "notifications.scantastic.subtitle": "Continua sull'estensione Uniswap", - "notifications.scantastic.title": "Successo!", - "onboarding.backup.manual.banner": "Ti consigliamo di scriverlo su un pezzo di carta e di conservarlo in un luogo sicuro, come una cassaforte.", - "onboarding.backup.manual.displayWarning.description": "Prima di continuare, leggere attentamente quanto segue.", - "onboarding.backup.manual.displayWarning.note.access": "Questa frase di recupero ti dà pieno accesso al tuo portafoglio e ai tuoi fondi", - "onboarding.backup.manual.displayWarning.note.secure": "Visualizza questo in privato e non condividerlo con nessuno", - "onboarding.backup.manual.displayWarning.note.storage": "Annotatelo e conservatelo in un luogo sicuro", - "onboarding.backup.manual.displayWarning.title": "Alcune cose importanti da sapere", - "onboarding.backup.manual.error": "Parola non valida o scritta in modo errato", - "onboarding.backup.manual.placeholder": "Parola segreta", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} completato", - "onboarding.backup.manual.selectedWordPlaceholder": "Seleziona la parola", - "onboarding.backup.manual.subtitle_one": "Qual è la {{count}}prima parola nella tua frase di recupero?", - "onboarding.backup.manual.subtitle_two": "Qual è la {{count}}seconda parola nella tua frase di recupero?", - "onboarding.backup.manual.subtitle_few": "Qual è la {{count}}terza parola nella tua frase di recupero?", - "onboarding.backup.manual.subtitle_other": "Qual è la {{count}}esima parola nella tua frase di recupero?", - "onboarding.backup.manual.title": "Assicuriamoci di averlo registrato correttamente", - "onboarding.backup.option.badge.quick": "Presto", - "onboarding.backup.option.cloud.description": "Esegui il backup del tuo portafoglio tramite {{cloudProviderName}}, protetto da una password di recupero.", - "onboarding.backup.option.cloud.title": "Imposta una password di recupero", - "onboarding.backup.option.manual.description": "Annota le tue 12 parole segrete su un foglio di carta e conservalo in un posto sicuro.", - "onboarding.backup.option.manual.title": "Scrivi la frase di recupero", - "onboarding.backup.reminder.backupNowButton": "Esegui il backup ora", - "onboarding.backup.reminder.remindMeLaterButton": "Ricordamelo più tardi", - "onboarding.backup.reminder.title": "Fai il backup del tuo portafoglio", - "onboarding.backup.reminder.warning.description": "Esegui il backup del tuo portafoglio in modo da poter recuperare i tuoi beni se dovessi perdere il telefono o acquistarne uno nuovo.", - "onboarding.backup.reminder.warning.fundsLabel": "Fondi a rischio", - "onboarding.backup.reminder.warning.title": "Potresti perdere i tuoi fondi", - "onboarding.backup.speedBump.cloud.description": "Se dovessi dimenticarlo, non possiamo reimpostarlo per te. Scrivilo in un posto sicuro o conservalo in modo sicuro in un gestore di password.", - "onboarding.backup.speedBump.cloud.disclaimer": "Capisco che Uniswap Labs non può reimpostare la mia password di recupero.", - "onboarding.backup.speedBump.cloud.title": "È importante salvare questa password", - "onboarding.backup.speedBump.manual.description": "Assicurati di aver scritto correttamente la frase di recupero e di avere un posto sicuro dove conservarla.", - "onboarding.backup.speedBump.manual.disclaimer": "Capisco che Uniswap Labs non potrà recuperare il mio portafoglio se lo perdo.", - "onboarding.backup.speedBump.manual.title": "Prima di concludere...", - "onboarding.backup.subtitle": "Ecco come recupererai il tuo portafoglio se elimini l'app o perdi il dispositivo.", - "onboarding.backup.title.existing": "Fai il backup del tuo portafoglio", - "onboarding.backup.title.new": "Scegli il tuo metodo di backup", - "onboarding.backup.view.subtitle.message1": "Leggere attentamente quanto segue prima di continuare", - "onboarding.backup.view.subtitle.message2": "Dovrai inserire tutte e 12 queste parole segrete per recuperare il tuo portafoglio.", - "onboarding.backup.view.title": "Scrivi la tua frase di recupero", - "onboarding.backup.view.warning.message1": "Questa frase di recupero ti dà pieno accesso al tuo portafoglio e ai tuoi fondi", - "onboarding.backup.view.warning.message2": "Annotatelo e conservatelo in un luogo sicuro", - "onboarding.backup.view.warning.message3": "Visualizzalo in privato e non condividerlo con nessuno", - "onboarding.cloud.confirm.description": "Dovrai inserirlo per recuperare i tuoi fondi. Se dovessi dimenticarlo, non potremo recuperarlo per te.", - "onboarding.cloud.confirm.title": "Conferma la tua password di recupero", - "onboarding.cloud.createPassword.description": "Dovrai inserirlo per recuperare i tuoi fondi. Se dovessi dimenticarlo, non potremo recuperarlo per te.", - "onboarding.cloud.createPassword.title": "Crea la tua password di recupero", - "onboarding.complete.button": "Apri l'estensione Uniswap", - "onboarding.complete.description": "Il tuo portafoglio è pronto per inviare e ricevere criptovalute. Apri l'estensione Uniswap con la scorciatoia qui sotto.", - "onboarding.complete.go_to_uniswap": "Vai all'applicazione Web Uniswap", - "onboarding.complete.pin.description": "Fai clic sull'icona della puntina per aggiungere l'estensione Uniswap alla barra degli strumenti.", - "onboarding.complete.pin.title": "Pin Estensione Uniswap", - "onboarding.complete.title": "È tutto a posto", - "onboarding.extension.biometrics.subtitle.fingerprint": "Accedi al tuo portafoglio in modo rapido e sicuro utilizzando solo la tua impronta digitale.", - "onboarding.extension.biometrics.title": "Abilita {{biometricsMethod}}", - "onboarding.extension.password.subtitle": "Ne avrai bisogno per sbloccare il tuo portafoglio e accedere alla tua frase di recupero", - "onboarding.extension.password.title.default": "Crea password", - "onboarding.extension.password.title.reset": "reimposta la tua password", - "onboarding.extension.unsupported.android.description": "L'estensione Uniswap è compatibile solo con Chrome su desktop.", - "onboarding.extension.unsupported.android.title": "Chrome sui dispositivi mobili non è supportato (ancora)", - "onboarding.extension.unsupported.description": "L'estensione Uniswap è compatibile solo con Chrome al momento.", - "onboarding.extension.unsupported.title": "Questo browser non è supportato (ancora)", - "onboarding.home.intro.backup.description.extension": "Salva la tua frase di recupero per assicurarti di non perdere mai l'accesso al tuo portafoglio.", - "onboarding.home.intro.backup.description.mobile": "Imposta un piano di recupero nel caso in cui dovessi perdere il telefono oppure acquistane uno nuovo.", - "onboarding.home.intro.backup.title": "Fai il backup del tuo portafoglio", - "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK e JUP: ora disponibili su Unichain", - "onboarding.home.intro.bridgedAssets.title": "Scambia nuovi token su Unichain", - "onboarding.home.intro.fund.description": "Finanzia il tuo portafoglio acquistando criptovalute o trasferendo da un altro conto.", - "onboarding.home.intro.fund.title": "Ottieni il tuo primo gettone", - "onboarding.home.intro.label.required": "Necessario", - "onboarding.home.intro.label.swipe": "Scorrere", - "onboarding.home.intro.pushNotifications.description": "Ricevi avvisi sui prezzi dei tuoi token preferiti, sulle tendenze di mercato e altro ancora.", - "onboarding.home.intro.pushNotifications.title": "Rimani informato", - "onboarding.home.intro.unitag.description": "Crea un profilo web3 personalizzato e condividi facilmente il tuo indirizzo con gli amici.", - "onboarding.home.intro.unitag.title": "Richiedi il tuo nome utente {{unitagDomain}}", - "onboarding.import.error.invalidWords_one": "1 parola non è valida o è scritta in modo errato", - "onboarding.import.error.invalidWords_other": "{{count}} parole non valide o scritte in modo errato", - "onboarding.import.method.restore.message.android": "Aggiungi i portafogli di cui hai eseguito il backup al tuo account Google Drive.", - "onboarding.import.method.restore.message.ios": "Aggiungi i portafogli di cui hai eseguito il backup al tuo account iCloud.", - "onboarding.import.method.restore.title": "Ripristina un portafoglio", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.android": "Inserisci la password di recupero per ripristinare il tuo portafoglio tramite il backup di Google Drive.", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.ios": "Inserisci la password di recupero per ripristinare il tuo portafoglio tramite backup iCloud.", - "onboarding.import.method.restoreSeedPhrase.cloud.title.android": "Ripristina da Google Drive", - "onboarding.import.method.restoreSeedPhrase.cloud.title.ios": "Ripristina da iCloud", - "onboarding.import.method.restoreSeedPhrase.title": "Seleziona come ripristinare il tuo portafoglio", - "onboarding.import.method.restoreSeedPhrase.wallet.desc": "Inserisci le 12 parole segrete che hai precedentemente conservato in un posto sicuro.", - "onboarding.import.method.restoreSeedPhrase.wallet.title": "Inserisci la frase di recupero", - "onboarding.import.method.viewPrivateKeys.button.desc": "Visualizza la tua chiave privata", - "onboarding.import.method.viewPrivateKeys.title": "Non hai nessuno dei requisiti sopra elencati? ", - "onboarding.import.onDeviceRecovery.other_options": "Crea o importa un portafoglio diverso", - "onboarding.import.onDeviceRecovery.other_options.label": "Non vuoi niente di quanto sopra?", - "onboarding.import.onDeviceRecovery.subtitle": "Scegli a quale portafoglio desideri accedere nuovamente.", - "onboarding.import.onDeviceRecovery.title": "Bentornati su Uniswap", - "onboarding.import.onDeviceRecovery.wallet.button": "Visualizza la frase di recupero", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 altro portafoglio", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} altri portafogli", - "onboarding.import.onDeviceRecovery.warning.caption": "Assicurati di aver eseguito il backup di tutti gli altri wallet. Se mai volessi ripristinarli, ti serviranno le loro frasi di recupero o i corrispondenti backup {{cloudProvider}} .", - "onboarding.import.onDeviceRecovery.warning.title": "Sei sicuro?", - "onboarding.import.selectMethod.errorMessage": "Si è verificato un errore imprevisto. Riprova.", - "onboarding.import.selectMethod.mobileApp.subtitle": "Importa un portafoglio dall'app mobile tramite codice QR.", - "onboarding.import.selectMethod.mobileApp.title": "Usa Uniswap Mobile", - "onboarding.import.selectMethod.passkey.subtitle": "Sincronizza il tuo portafoglio Uniswap utilizzando una passkey esistente.", - "onboarding.import.selectMethod.passkey.title": "Accedi con la passkey", - "onboarding.import.selectMethod.recoveryPhrase.subtitle": "Importa da un altro portafoglio crittografico.", - "onboarding.import.selectMethod.recoveryPhrase.title": "Inserisci la frase di recupero", - "onboarding.import.selectMethod.title": "Accedi o importa un portafoglio", - "onboarding.import.title": "Scegli come vuoi aggiungere il tuo portafoglio", - "onboarding.importMnemonic.button.default": "La mia frase di recupero è di 12 parole", - "onboarding.importMnemonic.button.importing": "Importazione in corso...", - "onboarding.importMnemonic.button.longPhrase": "La mia frase di recupero è più lunga", - "onboarding.importMnemonic.error.invalidPhrase": "La frase inserita non è valida", - "onboarding.importMnemonic.subtitle": "Digita o incolla la tua frase di recupero di 12 parole", - "onboarding.importMnemonic.title": "Inserisci la tua frase di recupero", - "onboarding.importPasskey.bringWindowToFront": "Porta la finestra in primo piano", - "onboarding.importPasskey.continueInSecureWindow": "Continua nella finestra di accesso sicuro.", - "onboarding.intro.button.alreadyHave": "Ho già un portafoglio", - "onboarding.intro.button.logInOrImport": "Accedi o importa", - "onboarding.intro.mobileScan.button": "Scansiona il codice QR per importare", - "onboarding.intro.mobileScan.title": "Hai l'app Uniswap?", - "onboarding.landing.button.add": "Aggiungi un portafoglio esistente", - "onboarding.landing.button.create": "Crea un portafoglio", - "onboarding.landing.button.createAccount": "Creare un account", - "onboarding.name.choose": "Scegli un nome utente", - "onboarding.name.choose.subtitle": "Questo è un nome pubblico che chiunque può utilizzare per inviarti criptovalute.", - "onboarding.notification.permission.message": "Per ricevere notifiche, attiva le notifiche per Uniswap Wallet nelle impostazioni del tuo dispositivo.", - "onboarding.notification.permission.title": "Autorizzazione notifiche", - "onboarding.notification.subtitle": "Rimani aggiornato sullo stato delle transazioni e sulle principali variazioni di prezzo dei tuoi token preferiti.", - "onboarding.notification.title": "Attiva le notifiche", - "onboarding.passkey.create": "Crea la tua passkey", - "onboarding.passkey.loading.subtitle": "Ci vorrà solo un secondo.", - "onboarding.passkey.loading.title": "Trovare il portafoglio...", - "onboarding.passkey.secure": "Proteggi il tuo account", - "onboarding.passkey.secure.description": "Le passkey ti consentono di accedere in modo rapido e sicuro al tuo account utilizzando solo il tuo volto o l'impronta digitale.", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "Confermiamo che hai capito bene. Se perdi o scrivi male, non potrai recuperare i tuoi fondi.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "Se perdi o scrivi male, non potrai recuperare i tuoi fondi.", - "onboarding.recoveryPhrase.confirm.title": "Confermiamo che hai capito bene", - "onboarding.recoveryPhrase.view.subtitle": "Dovrai inserire tutte e 12 queste parole segrete per recuperare il tuo portafoglio.", - "onboarding.recoveryPhrase.view.title": "Scrivi la tua frase di recupero", - "onboarding.recoveryPhrase.view.title.hasPassword": "Se dovessi dimenticare la tua password...", - "onboarding.recoveryPhrase.warning.final.button": "Sono pronto", - "onboarding.recoveryPhrase.warning.final.message": "La tua frase di recupero è ciò che garantisce a te (e a chiunque ne sia in possesso) l'accesso ai tuoi fondi. Assicurati di tenerlo per te.", - "onboarding.recoveryPhrase.warning.final.title": "Esegui questo passaggio in un luogo privato", - "onboarding.recoveryPhrase.warning.screenshot.message": "Chiunque abbia accesso alle tue foto può accedere al tuo portafoglio. Ti consigliamo invece di scrivere le tue parole.", - "onboarding.recoveryPhrase.warning.screenshot.title": "Gli screenshot non sono sicuri", - "onboarding.resetPassword.complete.safety": "Ulteriori informazioni sulla sicurezza del portafoglio", - "onboarding.resetPassword.complete.subtitle": "Usa la tua nuova password per sbloccare il tuo portafoglio.", - "onboarding.resetPassword.complete.title": "Reimpostazione della password", - "onboarding.scan.error": "Si è verificato un errore durante il caricamento del codice QR", - "onboarding.scan.otp.error": "Il codice che hai inviato non è corretto oppure si è verificato un errore durante l'invio. Per favore riprova.", - "onboarding.scan.otp.failed": "Tentativi falliti: {{number}}", - "onboarding.scan.otp.subtitle": "Controlla la tua app mobile Uniswap per il codice di 6 caratteri", - "onboarding.scan.otp.title": "Inserisci il codice monouso", - "onboarding.scan.subtitle": "Scansiona il codice QR con l'app mobile Uniswap per iniziare a importare il tuo portafoglio.", - "onboarding.scan.title": "Importa portafoglio dall'app", - "onboarding.scan.troubleScanning.message": "Importa tramite frase di recupero", - "onboarding.scan.troubleScanning.title": "Problemi di scansione?", - "onboarding.scan.wifi": "Collega il tuo telefono alla stessa rete WiFi del tuo computer.", - "onboarding.security.alert.biometrics.message.android": "Per utilizzare la biometria, configurala prima nelle impostazioni", - "onboarding.security.alert.biometrics.message.ios": "Per utilizzare {{biometricsMethod}}, consenti l'accesso nelle impostazioni di sistema", - "onboarding.security.alert.biometrics.title.android": "La biometria è disabilitata", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} è disabilitato", - "onboarding.security.button.confirm.android": "Abilita la biometria", - "onboarding.security.button.confirm.ios": "Abilita {{biometricsMethod}}", - "onboarding.security.button.setup": "Impostare", - "onboarding.security.subtitle.android": "Aggiungi un ulteriore livello di sicurezza richiedendo la biometria per inviare transazioni.", - "onboarding.security.subtitle.ios": "Aggiungi un ulteriore livello di sicurezza richiedendo {{biometricsMethod}} per inviare transazioni.", - "onboarding.security.title": "Proteggi il tuo portafoglio", - "onboarding.selectWallets.error": "Impossibile caricare gli indirizzi", - "onboarding.selectWallets.title.default": "Scegli i portafogli da importare", - "onboarding.selectWallets.title.error": "Errore durante l'importazione dei portafogli", - "onboarding.termsOfService": "Continuando, accetto i Termini di servizio e acconsento alla Informativa sulla privacy", - "onboarding.tooltip.recoveryPhrase.trigger": "Cos'è una frase di recupero?", - "onboarding.wallet.continue": "Teniamolo al sicuro", - "onboarding.wallet.defaultName": "Portafoglio {{number}}", - "onboarding.wallet.description.full": "Questo è il tuo spazio personale per token, NFT e tutte le tue operazioni. Completa la configurazione per mantenere i tuoi fondi al sicuro.", - "onboarding.wallet.title": "Benvenuto nel tuo nuovo portafoglio", - "onboarding.welcome.subtitle": "Completiamo la configurazione del tuo portafoglio.", - "onboarding.welcome.title": "Benvenuto!", - "outageBanner.message": "I dati {{chainName}}{{versionDescription}} non sono al momento disponibili, ma prevediamo che il problema verrà risolto a breve.", - "outageBanner.message.sub": "Puoi comunque scambiare e fornire liquidità su questa catena senza problemi.", - "outageBanner.title": "{{versionName}} torneremo presto", - "passkeys.help.modal.subtitle": "Se riscontri problemi con le passkey, visita il supporto Uniswap per ricevere assistenza.", - "passkeys.help.modal.subtitle.invalidPasskey": "La tua richiesta non è stata completata. Riprova utilizzando una passkey associata a ", - "passkeys.help.modal.subtitle.technicalError": "La tua richiesta non è stata completata a causa di un errore tecnico imprevisto. I tuoi fondi sono al sicuro. Riprova.", - "passkeys.help.modal.title": "Ho bisogno di aiuto?", - "passkeys.help.modal.title.invalidPasskey": "Chiave di accesso non valida", - "passkeys.help.modal.title.technicalError": "Errore tecnico", - "passkeys.manage.modal.subtitle": "Per aggiungere o rimuovere le passkey, accedi a {{passkeyManagementUrl}}.", - "passkeys.manage.modal.title": "Gestisci le passkey", - "permit.approval.fail": "L'approvazione del permesso non è riuscita", - "permit.approval.fail.message": "Permit2 consente di condividere e gestire le approvazioni dei token tra diverse applicazioni.", - "pool.activeRange": "Intervallo di tick attivo", - "pool.addAs": "Aggiungi come {{nativeWrappedSymbol}}", - "pool.apr": "TAEG", - "pool.apr.base": "TAEG base", - "pool.apr.description": "Annualizzato in base alle tariffe di 1 giorno", - "pool.apr.reward": "Tasso annuo di ricompensa", - "pool.aprText": "Tasso annuo effettivo globale (TAEG) della piscina", - "pool.balances": "Saldi della piscina", - "pool.closedCTA.description": "Puoi vederli utilizzando il filtro in cima alla pagina.", - "pool.closedCTA.title": "Stai cercando le tue posizioni chiuse?", - "pool.collectAs": "Raccogli come {{nativeWrappedSymbol}}", - "pool.collectFees": "Raccogli le tasse", - "pool.connectEthereumToView": "Collega un portafoglio Ethereum per visualizzare i tuoi pool", - "pool.create": "Creazione di un nuovo pool", - "pool.create.info": "Le tue selezioni creeranno un nuovo pool di liquidità che potrebbe comportare una liquidità iniziale inferiore e una maggiore volatilità. Considera di aggiungere a un pool esistente per ridurre al minimo questi rischi.", - "pool.createdPosition": "Posizione creata", - "pool.createdPosition.canceled": "Creazione posizione annullata", - "pool.createdPosition.failed": "Creazione posizione non riuscita", - "pool.dynamic": "Piscina dinamica", - "pool.earnings": "Guadagni", - "pool.earnings.empty": "Non hai ancora alcun guadagno", - "pool.explorers": "Esploratori", - "pool.import": "Importa pool", - "pool.import.link.description": "Alcune posizioni v2 non vengono visualizzate automaticamente.", - "pool.import.positions.v2": "Importa posizioni V2", - "pool.import.positions.v2.selectPair.description": "Alcune posizioni v2 non vengono visualizzate automaticamente. Seleziona una coppia di token da importare e visualizza le tue posizioni.", - "pool.import.success": "Pool importato", - "pool.incentives.administeredRewards": "I premi vengono distribuiti tramite il contratto autonomo di Distributore Merkl.", - "pool.incentives.collect": "Raccogliere", - "pool.incentives.collectedRewards": "Ricompense raccolte", - "pool.incentives.collectFailed": "Raccolta non riuscita, riprova.", - "pool.incentives.collectFailedNoRetry": "La riscossione delle ricompense non è riuscita.", - "pool.incentives.collectingRewards": "Raccolta di ricompense", - "pool.incentives.collectRewards": "Raccogli ricompense", - "pool.incentives.collectRewardsCanceled": "Raccolta premi annullata", - "pool.incentives.daysLeft": "giorni rimasti", - "pool.incentives.eligible": "I pool idonei offrono ricompense in token, così puoi guadagnare di più", - "pool.incentives.merklDocs": "Calcolato da Merkl in base alle ricompense sulle emissioni e al TVL complessivo.", - "pool.incentives.rewardsDistribution": "Distribuzione dei premi", - "pool.incentives.rewardsEarned": "Premi guadagnati", - "pool.incentives.similarPoolHasRewards": "Un pool simile ha premi UNI", - "pool.incentives.switchPools": "Cambia pool", - "pool.incentives.timePeriod": "Periodo di tempo", - "pool.incentives.uni.findMore": "Trova piscine con premi UNI", - "pool.incentives.yourRewards.error": "I tuoi premi non sono disponibili al momento", - "pool.incentives.yourRewards.error.description": "Impossibile recuperare i premi. Potrebbe essere dovuto a un problema di rete. Prova a ricaricare la pagina.", - "pool.info": "Informazioni sulla piscina", - "pool.limitFluctuation.warning": "Tieni presente che l'esecuzione dei limiti può variare in base alle fluttuazioni del mercato in tempo reale e alla congestione della rete Ethereum. I limiti potrebbero non essere eseguiti esattamente quando i token raggiungono il prezzo specificato.", - "pool.liquidity.data.error.message": "Si è verificato un errore durante il recupero dei dati necessari per la transazione.", - "pool.liquidity.outOfSync": "Disallineamento tra prezzo di mercato e prezzo di piscina", - "pool.liquidity.outOfSync.message": "I prezzi in questo pool differiscono dai prezzi di mercato dei token selezionati. Regola di conseguenza il tuo intervallo di prezzo o attendi che il pool si ribilanci per evitare perdite.", - "pool.maxPrice": "Prezzo massimo", - "pool.migrateLiquidity": "Migrare la liquidità", - "pool.migrateLiquidityDisabledTooltip": "Questa catena non supporta pool di liquidità v4.", - "pool.migrateToV4": "Migrare alla v4", - "pool.minPrice": "Prezzo minimo", - "pool.newPosition.plus": "+ Nuova posizione", - "pool.newPosition.title": "Nuova posizione", - "pool.newSpecificPosition": "Nuova posizione {{symbol}}", - "pool.notAvailableOnSolana": "Le piscine non sono disponibili su Solana", - "pool.notFound.description": "Spiacenti, non riusciamo a trovare informazioni per questa piscina. Controlla il nome e l'indirizzo e riprova.", - "pool.notFound.title": "Pool non trovato", - "pool.openToStart.evmAndSolanaConnected": "Apri una nuova posizione o crea un pool per iniziare. I pool non sono disponibili su Solana.", - "pool.openToStart.evmOnly": "Apri una nuova posizione o crea un pool per iniziare.", - "pool.percent": "{{pct}}% piscina", - "pool.pooled": "Raggruppati {{sym}}:", - "pool.position": "Posizione", - "pool.positions": "Posizioni", - "pool.positions.title": "Le tue posizioni", - "pool.positions.transaction.settings": "Impostazioni della transazione", - "pool.positions.usdValueUnavailable": "Valore USD non disponibile", - "pool.positions.usdValueUnavailable.tooltip": "Il valore USD non è al momento disponibile per questa posizione. Consulta i dettagli della posizione per gli importi dei token depositati.", - "pool.refresh.prices": "Aggiorna i prezzi", - "pool.removeLiquidity": "Rimuovere la liquidità", - "pool.rewardAPR": "Tasso annuo di ricompensa (UNI)", - "pool.rewardAPR.percent": "{{pct}} APR della ricompensa", - "pool.rewards": "Ricompense", - "pool.rewardsPool.label": "Token del pool nel pool di premi:", - "pool.selectPair": "Seleziona coppia", - "pool.share.label": "La tua quota in piscina:", - "pool.specificPosition": "posizione {{symbol}}", - "pool.tokenPair": "Coppia di token", - "pool.top.rewards": "Piscine con premi", - "pool.top.tvl": "Le migliori piscine per TVL", - "pool.top.volume": "Piscine per volume 24H", - "pool.totalAPR": "TAEG totale", - "pool.totalTokens": "Il tuo totale di gettoni del pool:", - "pool.v2": "piscine v2", - "pool.v3": "pool v3", - "pool.via": "{{tokenPair}} tramite {{dex}}", - "pool.volOverTvl": "1D vol/TVL", - "pool.volume.thirtyDay": "Volume 30 giorni", - "pool.volume.thirtyDay.short": "30D vol", - "pool.withdrawAs": "Ritira come {{nativeWrappedSymbol}}", - "poolFinder.availablePools": "Piscine disponibili", - "poolFinder.availablePools.found.description": "Pool v2 corrispondenti alla tua selezione di coppie.", - "poolFinder.availablePools.notFound.description": "Non sono stati trovati pool v2 corrispondenti. Controlla attentamente la selezione del token e assicurati di essere connesso al portafoglio corretto.", - "pools.explore": "Esplora le piscine", - "portfolio.activity.filters.timePeriod.all": "Sempre", - "portfolio.activity.filters.transactionType.all": "Tutti i tipi", - "portfolio.activity.filters.transactionType.deposits": "Depositi", - "portfolio.activity.filters.transactionType.staking": "Picchettamento", - "portfolio.activity.filters.transactionType.swaps": "Scambi", - "portfolio.activity.title": "Attività", - "portfolio.connectWallet.summary": "Tieni traccia di token, pool e altro su reti {{amount}}+", - "portfolio.defi.title": "DeFi", - "portfolio.description": "Tieni traccia del tuo portafoglio di criptovalute su tutte le catene e i protocolli", - "portfolio.nfts.title": "NFT", - "portfolio.overview.title": "Panoramica", - "portfolio.title": "Portfolio", - "portfolio.tokens.table.column.allocation": "Assegnazione", - "portfolio.tokens.table.column.balance": "Bilancia", - "portfolio.tokens.table.column.change1d": "Cambiamento 1D", - "portfolio.tokens.table.column.price": "Prezzo", - "portfolio.tokens.table.column.token": "Gettone", - "portfolio.tokens.table.column.value": "Valore", - "portfolio.tokens.title": "Gettoni", - "position.addHook": "Aggiungi un gancio", - "position.addHook.tooltip": "Gli hook sono una funzionalità avanzata che consente ai pool di interagire con gli smart contract, sbloccando varie capacità. Fai attenzione quando aggiungi hook, poiché alcuni potrebbero essere dannosi o causare conseguenze indesiderate.", - "position.addingHook": "Aggiunta di un gancio", - "position.addingHook.disclaimer": "Aggiungere hook potrebbe avere conseguenze indesiderate. Fai le tue ricerche e procedi a tuo rischio e pericolo.", - "position.addingHook.hideProperties": "Nascondi proprietà", - "position.addingHook.invalidAddress": "Inserisci un indirizzo di hook valido", - "position.addingHook.viewProperties": "Visualizza le proprietà", - "position.create.confirm": "Conferma posizione", - "position.create.invalidPrice": "Prezzo non valido", - "position.create.invalidRange": "Intervallo non valido", - "position.create.modal.header": "Creazione della posizione", - "position.create.unsupportedSolana": "I pool Solana non sono supportati.", - "position.create.unsupportedSolana.description": "Per creare un pool, passare a una catena EVM supportata.", - "position.create.unsupportedToken.description": "Prova a creare con una versione diversa del protocollo.", - "position.create.v2unsupportedChain": "Questa catena non è supportata per i pool v2.", - "position.currentValue": "Valore della posizione corrente", - "position.default_price_strategies": "Strategie di prezzo", - "position.default_price_strategies.error": "Impossibile impostare la strategia dei prezzi", - "position.deposit.confirm.create.description.less": "Il prezzo iniziale inserito è {{value}}% inferiore al prezzo di mercato e potrebbe comportare una perdita di fondi. Vuoi procedere?", - "position.deposit.confirm.create.description.more": "Il prezzo iniziale inserito è {{value}}% in più rispetto al prezzo di mercato e potrebbe comportare una perdita di fondi. Vuoi procedere?", - "position.deposit.confirm.create.title": "Grande differenza di prezzo con il mercato", - "position.deposit.description": "Specifica gli importi dei token per il tuo contributo di liquidità.", - "position.depositedCurrency": "Depositato {{currencySymbol}}", - "position.fot.warning": "{{token}} e altri token \"Commissione sul trasferimento\" sono supportati solo da Uniswap v2.", - "position.fot.warning.cta": "Crea una posizione v2", - "position.hook.disclaimer": "Sono consapevole dei potenziali rischi connessi all'aggiunta di questo hook.", - "position.hook.donateWarning": "Questa segnalazione potrebbe comportare modifiche alle commissioni guadagnate.", - "position.hook.liquidityWarning": "Questo flag può causare il blocco dell'aggiunta di nuova liquidità da parte del pool. La tua transazione potrebbe essere annullata.", - "position.hook.removeWarning": "Potrebbe causare il blocco dei tuoi fondi o impedirti di riscuotere commissioni.", - "position.hook.swapWarning": "Questo flag potrebbe consentire ai fornitori di liquidità di sfruttare più facilmente la liquidità Just-In-Time, il che potrebbe tradursi in commissioni inferiori.", - "position.hook.warningHeader": "Importante: identificare i rischi di aggancio", - "position.hook.warningInfo": "Abbiamo identificato potenziali rischi con questo hook. Assicurati di aver capito come funziona questo hook prima di decidere di procedere.", - "position.increase.fot": "L'aggiunta di liquidità per {{token}} e altri token \"Fee on Transfer\" non è supportata.", - "position.initialPrice": "Prezzo iniziale", - "position.initialPrice.difference.negative": "{{ value }}% in meno rispetto al prezzo di mercato", - "position.initialPrice.difference.positive": "{{ value }}% in più rispetto al prezzo di mercato", - "position.initialPrice.info": "Quando si crea un nuovo pool, è necessario impostare il tasso di cambio iniziale per entrambi i token. Questo tasso rifletterà il prezzo di mercato iniziale.", - "position.initialPrice.set": "Imposta il prezzo iniziale", - "position.initialPrice.useMarketPrice": "Utilizzare il prezzo di mercato", - "position.migrate.liquidity": "Durante la migrazione delle posizioni, non è possibile modificare la coppia di token, ma è possibile aggiungere un hook per migliorarne la funzionalità.", - "position.migrate.v4unsupportedChain": "Questa catena non è supportata per i pool v4.", - "position.new": "Nuova posizione", - "position.new.protocol": "Nuova posizione {{protocol}}", - "position.notFound": "Posizione non trovata", - "position.notFound.description": "I dettagli su questa posizione non sono disponibili. Controlla di essere connesso al portafoglio corretto.", - "position.one_sided_lower": "Inferiore monolaterale", - "position.one_sided_lower.description": "Fornire liquidità se il prezzo scende", - "position.one_sided_upper": "Parte superiore monolaterale", - "position.one_sided_upper.description": "Fornire liquidità se il prezzo sale", - "position.protocol": "posizione {{protocol}}", - "position.provide.liquidity": "Scegli i token per i quali vuoi fornire liquidità. Puoi selezionare token su tutte le reti supportate.", - "position.provide.liquidityDescription": "Fornire una liquidità completa garantisce una partecipazione continua al mercato a tutti i prezzi possibili, offrendo semplicità ma con il potenziale per una maggiore perdita temporanea.", - "position.provide.liquidityDescription.creatingPool": "L'impostazione della liquidità a gamma completa durante la creazione di un pool garantisce una partecipazione continua al mercato a tutti i prezzi possibili, offrendo semplicità ma con il potenziale per una maggiore perdita temporanea.", - "position.provide.liquidityDescription.custom": "L'intervallo personalizzato consente di concentrare la liquidità entro limiti di prezzo specifici, migliorando l'efficienza del capitale e i guadagni dalle commissioni, ma richiedendo una gestione più attiva.", - "position.provide.outOfRange.closePosition": "Posizione ravvicinata", - "position.provide.outOfRange.description": "L'intervallo di questa posizione non può essere modificato durante la migrazione. Per impostare un nuovo intervallo, chiudi questa posizione e apri una nuova posizione v4.", - "position.provide.outOfRange.title": "Stai migrando una posizione fuori portata", - "position.removeHook": "Rimuovere il gancio", - "position.resetDescription": "I tuoi token, il prezzo e le selezioni dell'intervallo verranno reimpostati.", - "position.setRange": "Imposta la fascia di prezzo", - "position.setRange.inputsBelow": "Utilizza i dati di input sottostanti per impostare il tuo intervallo.", - "position.stable": "Stabile", - "position.stable.description": "Adatto per stablecoin o coppie a bassa volatilità", - "position.step.deposit": "Inserisci gli importi dei depositi", - "position.step.price": "Imposta il prezzo iniziale e gli importi del deposito", - "position.step.range": "Imposta intervallo di prezzo e importi di deposito", - "position.step.select": "Seleziona la coppia di token e le commissioni", - "position.value": "Valore della posizione", - "position.valueUnavailable": "Il valore USD non è al momento disponibile per questa posizione. Consulta i dettagli della posizione per gli importi dei token depositati.", - "position.wide": "Largo", - "position.wide.description": "Buono per coppie volatili", - "position.wrapped.unwrap": "Disimballare {{wrappedToken}}", - "position.wrapped.warning": "{{nativeToken}} richiesto per i pool v4", - "position.wrapped.warning.info": "Scarta i tuoi {{wrappedToken}} e deposita {{nativeToken}} per ottenere una liquidità più efficiente e conveniente.", - "positions.noPositions.description": "Non hai posizioni di liquidità. Crea una nuova posizione per iniziare a guadagnare commissioni e premi sui pool idonei.", - "positions.noPositions.title": "Nessuna posizione", - "positions.welcome.connect.description": "Per visualizzare le tue posizioni e le tue ricompense devi collegare il tuo portafoglio.", - "positions.welcome.connect.wallet": "Collega il tuo portafoglio", - "privacy.anonymizedLogs": "L'app registra statistiche di utilizzo anonimizzate per migliorare nel tempo.", - "privacy.autoRouter": "L'app recupera la rotta commerciale ottimale da un server Uniswap Labs.", - "privacy.infura": "L'app recupera i dati sulla catena e costruisce chiamate di contratto con un'API Infura.", - "privacy.thirdPartyApis": "Questa app utilizza le seguenti API di terze parti:", - "privacy.trm": "L'app raccoglie in modo sicuro l'indirizzo del tuo portafoglio e lo condivide con TRM Labs Inc. per motivi di rischio e conformità.", - "privacy.uniswaptos": "Termini di servizio di Uniswap Labs", - "privateKeys.export.modal.speedbump.bullet1": "Visualizzalo in privato", - "privateKeys.export.modal.speedbump.bullet2": "Non condividere con nessuno", - "privateKeys.export.modal.speedbump.bullet3": "Non inserirlo mai in alcun sito Web o applicazione", - "privateKeys.export.modal.speedbump.subtitle": "Chiunque conosca la tua chiave privata può accedere al tuo portafoglio e ai tuoi fondi.", - "privateKeys.export.modal.speedbump.title": "Prima di continuare", - "privateKeys.export.modal.subtitle": "Sembra che tu non riesca a ripristinare completamente il tuo portafoglio. Per assicurarti di non perdere mai l'accesso ai tuoi fondi, copia la tua chiave privata.", - "privateKeys.export.modal.title": "Esporta la tua chiave privata", - "privateKeys.export.modal.warning": "Se perdi il telefono o elimini l'app, dovrai importare questa chiave in un portafoglio diverso.", - "privateKeys.view.button.continue": "Li ho copiati tutti.", - "privateKeys.view.button.continue.single": "L'ho copiato.", - "privateKeys.view.subtitle": "La tua chiave privata garantisce l'accesso a un portafoglio specifico. Ogni portafoglio ha una chiave privata diversa.", - "privateKeys.view.title": "Chiave privata", - "qrScanner.button.connections_one": "1 applicazione connessa", - "qrScanner.button.connections_other": "{{count}} app connesse", - "qrScanner.error.camera.message": "Per scansionare un codice, consenti l'accesso alla Fotocamera nelle impostazioni di sistema", - "qrScanner.error.camera.title": "La fotocamera è disabilitata", - "qrScanner.error.none": "Nessun codice QR trovato", - "qrScanner.recipient.action.scan": "Scansiona un codice QR", - "qrScanner.recipient.action.show": "Mostra il mio codice QR", - "qrScanner.recipient.error.message": "Assicurati di scansionare un codice QR di un indirizzo Ethereum valido prima di riprovare.", - "qrScanner.recipient.error.title": "Codice QR non valido", - "qrScanner.request.message.unavailable": "Nessun messaggio trovato.", - "qrScanner.request.method.default": "Richiesta da {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "Richiesta di firma da {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "Richiesta di transazione da {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "Consentire a {{dappName}} di utilizzare fino a {{amount}} {{currencySymbol}}?", - "qrScanner.request.withoutAmount": "Consentire a {{dappName}} di utilizzare il tuo {{currencySymbol}}?", - "qrScanner.status.connecting": "Connessione...", - "qrScanner.status.loading": "Caricamento...", - "qrScanner.title": "Scansiona un codice QR", - "qrScanner.wallet.networks": "Reti supportate", - "range.outOfView": "Intervallo fuori dalla vista", - "removeLiquidity.pooled": "Raggruppati {{symbol}}:", - "revoke.failed.message": "Probabilmente un problema di rete o di connessione ha causato il fallimento della revoca. Controlla la connessione e riprova.", - "routing.aggregateLiquidity": "Quando disponibile, aggrega le fonti di liquidità per prezzi migliori e scambi senza gas.", - "routing.aggregateLiquidity.uniswapx": "UniswapX aggrega le fonti di liquidità on e off-chain, offrendoti i migliori prezzi disponibili e swap senza gas.", - "routing.cheapest": "Il cliente Uniswap seleziona il prezzo di factoring e i costi di rete dell'opzione commerciale più economici.", - "routing.cheapest.v4": "Il cliente Uniswap seleziona l'opzione di trading ottimale tenendo conto del prezzo e dei costi di rete.", - "scantastic.code.expired": "Scaduto", - "scantastic.code.subtitle": "Inserisci questo codice nell'estensione Uniswap. La tua frase di recupero verrà crittografata e trasferita in modo sicuro.", - "scantastic.code.timeRemaining.shorthand.hours": "Nuovo codice tra {{hours}}h {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.minutes": "Nuovo codice tra {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.seconds": "Nuovo codice tra {{seconds}}s", - "scantastic.code.title": "Codice monouso Uniswap", - "scantastic.confirmation.button.continue": "Sì, continua", - "scantastic.confirmation.label.browser": "Navigatore", - "scantastic.confirmation.label.device": "Dispositivo", - "scantastic.confirmation.subtitle": "Continua solo se stai scansionando un codice QR da Uniswap Extension su un dispositivo attendibile.", - "scantastic.confirmation.title": "Stai cercando di importare il tuo portafoglio?", - "scantastic.confirmation.warning": "Fai attenzione ai siti e alle app che si spacciano per Uniswap. Altrimenti il tuo portafoglio potrebbe essere compromesso.", - "scantastic.error.encryption": "Impossibile preparare la frase seed.", - "scantastic.error.noCode": "Nessuna OTP ricevuta. Per favore riprova.", - "scantastic.error.timeout.message": "Scansiona nuovamente il codice QR sull'estensione Uniswap per continuare a sincronizzare il tuo portafoglio.", - "scantastic.error.timeout.title": "La tua connessione è scaduta", - "scantastic.modal.ipMismatch.description": "Per scansionare questo codice QR, il tuo telefono deve essere connesso alla stessa rete WiFi del tuo computer e qualsiasi VPN deve essere temporaneamente disattivata.", - "scantastic.modal.ipMismatch.title": "Cambia la tua rete WiFi", - "search.input.placeholder": "Cerca token e pool", - "search.ukDisclaimer": "Dichiarazione di non responsabilità per i residenti nel Regno Unito", - "send.button.review": "Rivedere il trasferimento", - "send.gas.error.title": "N / A", - "send.gas.networkCost.title": "Costo di rete", - "send.input.token.balance.title": "Saldo: {{balance}} {{symbol}}", - "send.recipient.header": "Seleziona destinatario", - "send.recipient.input.placeholder": "Cerca ENS o indirizzo", - "send.recipient.previous_one": "1 trasferimento precedente", - "send.recipient.previous_other": "{{count}} trasferimenti precedenti", - "send.recipient.results.empty": "nessun risultato trovato", - "send.recipient.results.error": "L'indirizzo che hai digitato non esiste o è scritto in modo errato.", - "send.recipient.section.favorite": "Portafogli preferiti", - "send.recipient.section.recent": "Recente", - "send.recipient.section.search": "Risultati di ricerca", - "send.recipient.section.viewOnly": "Portafogli di sola visualizzazione", - "send.recipient.section.yours": "I tuoi portafogli", - "send.recipient.warning.viewOnly.message": "Invia fondi a questo portafoglio solo se disponi della frase di recupero o conosci il proprietario del portafoglio.", - "send.recipient.warning.viewOnly.title": "Hai questo come portafoglio di sola visualizzazione", - "send.recipientSelect.search.empty.message": "Quando invii token all'indirizzo di un portafoglio, verranno visualizzati qui", - "send.recipientSelect.search.empty.title": "Nessun portafoglio salvato", - "send.review.modal.title": "Stai inviando", - "send.review.summary.button.title": "Conferma l'invio", - "send.search.empty.subtitle": "L'indirizzo che hai digitato non esiste o è scritto in modo errato.", - "send.search.empty.title": "nessun risultato trovato", - "send.search.placeholder": "Cerca ENS o indirizzo", - "send.solanaSendNotSupported": "L'invio non è supportato su Solana", - "send.title": "Inviare", - "send.unavailableOnSolana.message": "L'invio non è disponibile sui portafogli Solana", - "send.warning.blocked.default": "Questo portafoglio è bloccato", - "send.warning.blocked.modal.message": "Questo indirizzo è bloccato su Uniswap Wallet perché è associato a una o più attività bloccate. Se ritieni che si tratti di un errore, invia un'e-mail a compliance@uniswap.org.", - "send.warning.blocked.modal.title": "Indirizzo bloccato", - "send.warning.blocked.recipient": "Il portafoglio del destinatario è bloccato", - "send.warning.erc20.checkbox.description": "Stai tentando di inviare fondi a un indirizzo token. Ciò potrebbe comportare una perdita permanente di fondi.", - "send.warning.erc20.checkbox.heading": "Rilevato indirizzo token", - "send.warning.erc20.message": "Stai tentando di inviare fondi a un indirizzo token. L'invio di criptovalute a questo tipo di indirizzo può comportare una perdita permanente di fondi.", - "send.warning.erc20.title": "Questo è un indirizzo token", - "send.warning.insufficientFunds.message": "Il tuo saldo di {{currencySymbol}} è diminuito da quando hai inserito l'importo che desideri inviare", - "send.warning.insufficientFunds.title": "Non abbastanza {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "{{currencySymbol}} su {{networkName}} insufficienti per inviare", - "send.warning.insufficientGas.message.withoutNetwork": "{{currencySymbol}} insufficienti per inviare", - "send.warning.modal.button.cta.blocking": "OK", - "send.warning.modal.button.cta.cancel": "Annulla", - "send.warning.modal.button.cta.confirm": "Confermare", - "send.warning.newAddress.details.ENS": "ENS", - "send.warning.newAddress.details.username": "Nome utente", - "send.warning.newAddress.details.walletAddress": "Indirizzo del portafoglio", - "send.warning.newAddress.message": "Non hai effettuato transazioni con questo indirizzo prima. Per favore conferma che l'indirizzo è corretto prima di continuare.", - "send.warning.newAddress.title": "Nuovo indirizzo", - "send.warning.self.message": "Stai tentando di inviare fondi al tuo portafoglio attuale. L'invio di criptovalute a questo indirizzo comporterà costi di rete non necessari.", - "send.warning.self.title": "Questo è il tuo portafoglio attuale", - "send.warning.smartContract.message": "Stai per inviare fondi a un indirizzo di smart contract. Assicurati che questo sia l'indirizzo corretto e che possa ricevere token. In caso contrario, ciò potrebbe comportare una perdita permanente di fondi.", - "send.warning.smartContract.title": "Questo è un indirizzo di contratto intelligente", - "send.warning.viewOnly.message": "È necessario importare questo portafoglio tramite la frase di recupero per inviare risorse.", - "send.warning.viewOnly.title": "Questo portafoglio è di sola visualizzazione", - "send.youAreSending": "Stai inviando", - "sendRecipientForm.recentAddresses.label": "Recenti", - "sendReviewModal.title": "Invia revisione", - "setting.recoveryPhrase.account.show": "Mostra la frase di recupero", - "setting.recoveryPhrase.action.hide": "Nascondi la frase di recupero", - "setting.recoveryPhrase.remove": "Rimuovi la frase di recupero", - "setting.recoveryPhrase.remove.confirm.subtitle": "Comprendo che Uniswap Labs non può aiutarmi a recuperare il mio portafoglio se non ci riesco.", - "setting.recoveryPhrase.remove.confirm.title": "Ho salvato la frase di recupero", - "setting.recoveryPhrase.remove.initial.subtitle": "Assicurati di aver salvato la frase di recupero. Altrimenti perderai l'accesso ai tuoi portafogli", - "setting.recoveryPhrase.remove.initial.title": "Prima di continuare", - "setting.recoveryPhrase.remove.subtitle": "Inserisci la tua password per confermare", - "setting.recoveryPhrase.remove.title": "Stai rimuovendo la frase di recupero ", - "setting.recoveryPhrase.view.warning.message1": "Chiunque conosca la tua frase di recupero può accedere al tuo portafoglio e ai tuoi fondi", - "setting.recoveryPhrase.view.warning.message2": "Visualizzalo in privato", - "setting.recoveryPhrase.view.warning.message3": "Non condividere con nessuno", - "setting.recoveryPhrase.view.warning.message4": "Non inserirlo mai in alcun sito Web o applicazione", - "setting.recoveryPhrase.view.warning.title": "Prima di continuare", - "setting.recoveryPhrase.warning.view.message": "Chiunque conosca la tua frase di recupero può accedere al tuo portafoglio e ai tuoi fondi.", - "setting.recoveryPhrase.warning.view.title": "Visualizzalo in un luogo privato", - "settings.action.enableInSettings": "Abilita nelle Impostazioni", - "settings.action.feedback": "Invia feedback", - "settings.action.help": "Ottenere aiuto", - "settings.action.lock": "Blocca il portafoglio", - "settings.action.privacy": "Politica sulla riservatezza", - "settings.action.terms": "Termini di servizio", - "settings.connectWalletPlatform.warning": "Per utilizzare Uniswap su {{platform}}, connettiti a un portafoglio che supporti {{platform}}.", - "settings.footer": "Fatto con amore, \nUniswap Team 🦄", - "settings.hideSmallBalances": "Nascondi piccoli saldi", - "settings.hideSmallBalances.subtitle": "I saldi inferiori a 1 USD saranno nascosti dal tuo portafoglio.", - "settings.maxSlippage": "Massimo. slittamento", - "settings.maxSlippage.amount": "{{amount}} slittamento massimo", - "settings.section.about": "Di", - "settings.section.preferences": "Preferenze", - "settings.section.privacyAndSecurity": "Privacy e sicurezza", - "settings.section.support": "Supporto", - "settings.section.wallet.hidden.row.title": "{{numHidden}} altri portafogli", - "settings.setting.advanced.title": "Avanzato", - "settings.setting.advancedSettings": "Advanced settings", - "settings.setting.appearance.option.auto": "Auto", - "settings.setting.appearance.option.dark.subtitle": "Utilizza sempre il tema scuro.", - "settings.setting.appearance.option.dark.title": "Buio", - "settings.setting.appearance.option.device.subtitle": "Si adatta alle impostazioni del tuo dispositivo.", - "settings.setting.appearance.option.device.title": "Auto", - "settings.setting.appearance.option.light.subtitle": "Utilizzare sempre un tema chiaro.", - "settings.setting.appearance.option.light.title": "Leggero", - "settings.setting.appearance.title": "Tema", - "settings.setting.backup.create.description": "L'impostazione di una password crittograferà il backup della frase di ripristino, aggiungendo un ulteriore livello di protezione nel caso in cui il tuo account {{cloudProviderName}} venga compromesso.", - "settings.setting.backup.create.title": "Esegui il backup fino a {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "Poiché questi portafogli condividono una frase di ripristino, verranno eliminati anche i backup per questi portafogli riportati di seguito", - "settings.setting.backup.delete.confirm.title": "Sei sicuro?", - "settings.setting.backup.delete.warning": "Se elimini il backup di {{cloudProviderName}} , potrai recuperare il tuo portafoglio solo con un backup manuale della tua frase di recupero. Uniswap Labs non può recuperare le tue risorse se perdi la frase di recupero.", - "settings.setting.backup.error.message.full": "Impossibile eseguire il backup della frase di ripristino su {{cloudProviderName}}. Assicurati di avere {{cloudProviderName}} abilitato con spazio di archiviazione disponibile e riprova.", - "settings.setting.backup.error.message.short": "Impossibile eliminare il backup", - "settings.setting.backup.error.title": "{{cloudProviderName}} errore", - "settings.setting.backup.modal.description": "Non hai ancora eseguito il backup della frase di recupero su {{cloudProviderName}} . In questo modo, puoi recuperare il tuo portafoglio semplicemente effettuando l'accesso a {{cloudProviderName}} su qualsiasi dispositivo.", - "settings.setting.backup.modal.title": "Eseguire il backup della frase di ripristino su {{cloudProviderName}}?", - "settings.setting.backup.password.error.mismatch": "le passwords non corrispondono", - "settings.setting.backup.password.medium": "Questa è una password media", - "settings.setting.backup.password.placeholder.confirm": "Conferma password", - "settings.setting.backup.password.placeholder.create": "Crea password", - "settings.setting.backup.password.strong": "Questa è una password complessa", - "settings.setting.backup.password.weak": "Questa è una password debole", - "settings.setting.backup.recoveryPhrase.label": "Frase di recupero", - "settings.setting.backup.selected": "{{cloudProviderName}} di riserva", - "settings.setting.backup.status.action.delete": "Elimina backup", - "settings.setting.backup.status.complete": "Backup fino a {{cloudProviderName}}", - "settings.setting.backup.status.description": "Eseguendo il backup della tua frase di recupero su {{cloudProviderName}}, puoi recuperare il tuo portafoglio semplicemente accedendo al tuo account {{cloudProviderName}} su qualsiasi dispositivo.", - "settings.setting.backup.status.inProgress": "Backup su {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "Backup", - "settings.setting.backup.status.title": "{{cloudProviderName}} di riserva", - "settings.setting.beta.tooltip": "Prossimamente", - "settings.setting.biometrics.appAccess.subtitle.android": "Richiedi il riconoscimento facciale/impronta digitale per aprire l'app.", - "settings.setting.biometrics.appAccess.subtitle.ios": "Richiede {{biometricsMethod}} per aprire l'app.", - "settings.setting.biometrics.appAccess.title": "Accesso all'app", - "settings.setting.biometrics.auth": "Per favore autenticati", - "settings.setting.biometrics.extension.waitingForBiometricsModal.content": "Abilita {{biometricsMethod}} nel tuo browser o nelle impostazioni di sistema per continuare.", - "settings.setting.biometrics.extension.waitingForBiometricsModal.title": "In attesa di {{biometricsMethod}}", - "settings.setting.biometrics.off.message.android": "La biometria è attualmente disattivata per Uniswap Wallet: puoi attivarla nelle impostazioni di sistema.", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} è attualmente disattivato per Uniswap Wallet: puoi attivarlo nelle impostazioni di sistema.", - "settings.setting.biometrics.off.title.android": "La biometria è disattivata", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} è spento", - "settings.setting.biometrics.title": "Sblocco tramite riconoscimento facciale/impronta digitale", - "settings.setting.biometrics.transactions.subtitle.android": "Richiede il riconoscimento facciale/impronta digitale per effettuare transazioni.", - "settings.setting.biometrics.transactions.subtitle.ios": "Richiede {{biometricsMethod}} per effettuare la transazione.", - "settings.setting.biometrics.transactions.title": "Transazioni", - "settings.setting.biometrics.unavailable.message.android": "La biometria non è configurata sul tuo dispositivo. Per utilizzare la biometria, configurala prima in Impostazioni.", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} non è configurato sul tuo dispositivo. Per utilizzare {{biometricsMethod}}, configuralo prima in Impostazioni.", - "settings.setting.biometrics.unavailable.title.android": "La biometria non è impostata", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} non è configurato", - "settings.setting.biometrics.warning.message.android": "Se non attivi la biometria, chiunque abbia accesso al tuo dispositivo potrà aprire Uniswap Wallet ed effettuare transazioni.", - "settings.setting.biometrics.warning.message.ios": "Se non attivi {{biometricsMethod}}, chiunque abbia accesso al tuo dispositivo potrà aprire Uniswap Wallet ed effettuare transazioni.", - "settings.setting.biometrics.warning.title": "Sei sicuro?", - "settings.setting.connections.disconnectAll": "Disconnetti tutto", - "settings.setting.connections.noConnectionsDescription": "Connettiti a un'app cercando il pulsante \"Connetti portafoglio\" o \"Accedi\".", - "settings.setting.currency.title": "Moneta locale", - "settings.setting.deviceAccess.reset.title": "Reimposta il tuo {{biometricsMethod}}", - "settings.setting.deviceAccess.title": "Accesso al dispositivo", - "settings.setting.deviceAccessTimeout.1hour": "1 ora", - "settings.setting.deviceAccessTimeout.24hours": "24 ore", - "settings.setting.deviceAccessTimeout.30minutes": "30 minuti", - "settings.setting.deviceAccessTimeout.5minutes": "5 minuti", - "settings.setting.deviceAccessTimeout.never": "Mai", - "settings.setting.deviceAccessTimeout.title": "Timeout del blocco automatico", - "settings.setting.hapticTouch.title": "Tocco tattile", - "settings.setting.helpCenter.title": "Centro assistenza", - "settings.setting.language.button.navigate": "Vai alle impostazioni", - "settings.setting.language.description.extension": "Uniswap utilizza per impostazione predefinita le impostazioni della lingua del sistema. Per cambiare la lingua preferita, vai alle impostazioni di sistema.", - "settings.setting.language.description.mobile": "Uniswap usa di default le impostazioni di lingua del tuo dispositivo. Per cambiare la tua lingua preferita, vai su \"Uniswap\" nelle impostazioni del tuo dispositivo e tocca \"Lingua\".", - "settings.setting.language.title": "Lingua", - "settings.setting.notifications.row.activity.description": "Trasferimenti, richieste e altre attività", - "settings.setting.notifications.row.activity.title": "Attività del portafoglio", - "settings.setting.notifications.row.updates.description": "Raccomandazioni e nuove funzionalità", - "settings.setting.notifications.row.updates.title": "Aggiornamenti da Uniswap", - "settings.setting.notifications.title": "Notifiche", - "settings.setting.password.change.title": "Crea una nuova password", - "settings.setting.password.title": "Cambiare la password", - "settings.setting.permissions.title": "Permessi", - "settings.setting.privacy.analytics.description": "Utilizziamo dati di utilizzo anonimi per migliorare la tua esperienza con i prodotti Uniswap Labs. Quando disabilitato, tracciamo solo gli errori e l'utilizzo essenziale.", - "settings.setting.privacy.analytics.title": "Analisi delle app", - "settings.setting.privateKeys.title": "chiavi private", - "settings.setting.recoveryPhrase.title": "Frase di recupero", - "settings.setting.smallBalances.title": "Saldo del portafoglio", - "settings.setting.smartWallet.action.enable": "Abilitare", - "settings.setting.smartWallet.action.smartWallet": "Smart wallet", - "settings.setting.smartWallet.notEligible": "Non idoneo", - "settings.setting.smartWallet.status.actionRequired": "Azione richiesta", - "settings.setting.smartWallet.status.active": "Attivo", - "settings.setting.smartWallet.status.inactive": "Inattivo", - "settings.setting.smartWallet.status.unavailable": "Non disponibile", - "settings.setting.unknownTokens.subtitle": "I token potenzialmente truffaldini verranno nascosti dal tuo portafoglio.", - "settings.setting.unknownTokens.title": "Nascondi token sconosciuti", - "settings.setting.wallet.action.editLabel": "Modifica etichetta", - "settings.setting.wallet.action.editProfile": "Modifica Profilo", - "settings.setting.wallet.action.remove": "Rimuovi il portafoglio", - "settings.setting.wallet.connection.banner.description": "Gestisci le connessioni tramite le impostazioni del portafoglio, cliccando sulla tua immagine del profilo.", - "settings.setting.wallet.connection.banner.title": "Le connessioni si sono spostate", - "settings.setting.wallet.connections.title": "Connessioni", - "settings.setting.wallet.editLabel.description": "Le etichette non sono pubbliche. Sono archiviati localmente e visibili solo a te.", - "settings.setting.wallet.editLabel.save": "Salvare le modifiche", - "settings.setting.wallet.label": "Soprannome", - "settings.setting.wallet.testnetMode.description": "Questo attiva le testnet per consentire agli sviluppatori di provare funzionalità e transazioni senza utilizzare asset reali. I token sulle testnet non hanno alcun valore reale.", - "settings.setting.wallet.testnetMode.title": "Modalità testnet", - "settings.switchNetwork.warning": "Per utilizzare Uniswap su {{label}}, cambia la rete nelle impostazioni del tuo portafoglio.", - "settings.title": "Impostazioni", - "settings.version": "Versione {{appVersion}}", - "smartWallet.actionRequired.cta": "Disabilita su 1 rete", - "smartWallet.actionRequired.cta.plural": "Disabilita su reti {{amount}}", - "smartWallet.actionRequired.description": "La disattivazione del portafoglio intelligente è un'azione onchain che richiede un piccolo costo di rete.", - "smartWallet.actionRequired.insufficientFunds": "Fondi insufficienti", - "smartWallet.actionRequired.reactivate": "Continua a usare il portafoglio intelligente", - "smartWallet.actionRequired.title": "Il portafoglio intelligente è attivo su 1 rete", - "smartWallet.actionRequired.title.plural": "Il portafoglio intelligente è attivo sulle reti {{amount}}", - "smartWallet.activeNetworks.title": "Il portafoglio intelligente è attivo su 1 rete", - "smartWallet.activeNetworks.title.plural": "Il portafoglio intelligente è attivo sulle reti {{amount}}", - "smartWallet.banner.networkCost": "Includes a one-time cost to activate your smart wallet on {{chainName}}.", - "smartWallet.banner.text": "Abilita il portafoglio intelligente per risparmiare fino al 50% sui costi di rete.", - "smartWallet.confirmDisableSmartWallet.description": "Ti perderai scambi più rapidi, costi di rete scontati e altri miglioramenti imminenti.", - "smartWallet.confirmDisableSmartWallet.title": "Sei sicuro?", - "smartWallet.insufficient.description": "Non è possibile disattivare lo smart wallet su queste reti finché non si hanno fondi sufficienti a coprire i costi della rete.", - "smartWallet.insufficient.title": "Fondi insufficienti su 1 rete", - "smartWallet.insufficient.title.plural": "Fondi insufficienti sulle reti {{amount}}", - "smartWallet.InsufficientFunds.button.continue.text": "Continua comunque", - "smartWallet.insufficientFunds.network.banner.description": "Impossibile disattivare per fondi insufficienti.", - "smartWallet.insufficientFunds.network.banner.title_one": "{{count}} rete esclusa", - "smartWallet.insufficientFunds.network.banner.title_other": "{{count}} rete esclusa", - "smartWallet.insufficientFunds.network.disable.text": "Pronto per la disattivazione", - "smartWallet.insufficientFunds.network.text": "Hai bisogno di {{nativeCurrency}}", - "smartWallet.insufficientFunds.single.network.banner.title": "{{chain}} escluso", - "smartWallet.modal.description.block1": "I portafogli intelligenti utilizzano contratti intelligenti per transazioni più rapide e a basso costo.", - "smartWallet.modal.description.block2": "I portafogli che già utilizzano le funzionalità smart wallet di un'altra app non saranno interessati.", - "smartWallet.modal.title": "Portafoglio intelligente", - "smartWallets": "Portafogli intelligenti", - "smartWallets.activeNetworks.description": "Il tuo portafoglio intelligente si attiva automaticamente su ogni nuova rete a cui accedi.", - "smartWallets.createdModal.description": "You’re getting faster transactions and lower network costs on every swap.", - "smartWallets.createdModal.title": "Creato portafoglio intelligente", - "smartWallets.delegation.limitedSupport": "Il tuo portafoglio ha un supporto limitato", - "smartWallets.delegationMismatchModal.description": "{{walletName}} non supporta gli ultimi standard Ethereum utilizzati da {{displayName}}, quindi alcune funzionalità non sono disponibili.", - "smartWallets.delegationMismatchModal.features.1ClickSwaps": "Scambi con 1 clic", - "smartWallets.delegationMismatchModal.features.gasFreeSwaps": "Scambi senza gas", - "smartWallets.delegationMismatchModal.features.limitOrders": "Ordini limite", - "smartWallets.delegationMismatchModal.limitOrders.unsupported": "Gli ordini limite non sono supportati dal tuo portafoglio.", - "smartWallets.delegationMismatchModal.title": "Supporto limitato del portafoglio", - "smartWallets.disable.failed": "Si è verificato un errore. Il portafoglio intelligente è ancora attivo su una o più reti. Riprova.", - "smartWallets.disable.modal.description": "Questa azione onchain richiede un costo di rete.", - "smartWallets.disable.modal.title": "Disabilitare il portafoglio intelligente", - "smartWallets.educationalModal.description": "I portafogli intelligenti consentono transazioni più rapide e a basso costo utilizzando contratti intelligenti.", - "smartWallets.educationalModal.info": "I portafogli che già utilizzano le funzionalità di portafoglio intelligente di un'altra app non saranno interessati.", - "smartWallets.enabledModal.description": "Gli aggiornamenti saranno effettivi a partire dal prossimo scambio.", - "smartWallets.enabledModal.description.dapp": "Gli aggiornamenti saranno effettivi a partire dalla tua prossima transazione.", - "smartWallets.enabledModal.description.dapp.line2": "Ricollega il tuo portafoglio per iniziare subito a utilizzare le funzionalità del portafoglio intelligente sulle app.", - "smartWallets.enabledModal.title": "Portafoglio intelligente abilitato", - "smartWallets.postSwapNudge.enable": "Abilita portafoglio intelligente", - "smartWallets.postSwapNudge.title": "Risparmia sul tuo prossimo scambio", - "smartWallets.postSwapNudge.title.dapp": "Questa app supporta i portafogli intelligenti", - "smartWallets.unavailableModal.description": "Un altro fornitore di wallet gestisce ora le impostazioni del wallet intelligente per {{displayName}}. Puoi continuare a utilizzare Uniswap normalmente.", - "smartWallets.unavailableModal.title": "Funzionalità del portafoglio intelligente non disponibili", - "solanaPromo.banner.description": "Scambia i token Solana direttamente su Uniswap.", - "solanaPromo.banner.title": "Solana è ora disponibile", - "solanaPromo.modal.connectWallet": "Collega il tuo portafoglio Solana preferito", - "solanaPromo.modal.startSwapping.button": "Inizia a scambiare su Solana", - "solanaPromo.modal.swapInstantly": "Scambia migliaia di token di tendenza all'istante", - "solanaPromo.modal.viewTokenData": "Visualizza i dati e i prezzi dei token in un unico posto", - "speedBump.newAddress.warning.description": "Non hai effettuato transazioni con questo indirizzo prima. Assicurati che sia l'indirizzo corretto prima di continuare.", - "speedBump.newAddress.warning.title": "Nuovo indirizzo", - "speedBump.smartContractAddress.warning.description": "Stai per inviare token a un tipo speciale di indirizzo: un contratto intelligente. Ricontrolla che sia l'indirizzo a cui intendevi inviare. Se è sbagliato, i tuoi token potrebbero andare persi per sempre.", - "speedBump.smartContractAddress.warning.title": "È questo l'indirizzo di un portafoglio?", - "stats.24fees": "Commissioni 24 ore su 24", - "stats.24swapVolume": "Volume di scambio 24 ore", - "stats.24volume": "Volume 24 ore", - "stats.allTimeSwappers": "Scambisti di tutti i tempi", - "stats.allTimeVolume": "Volume di tutti i tempi", - "stats.fdv": "FDV", - "stats.fdv.description": "La valutazione completamente diluita (FDV) calcola il valore di mercato totale presupponendo che tutti i token siano in circolazione.", - "stats.marketCap": "Capitalizzazione di mercato", - "stats.marketCap.description": "La capitalizzazione di mercato è il valore di mercato totale dell'offerta circolante di un asset.", - "stats.noStatsAvailable": "Nessuna statistica disponibile", - "stats.tvl": "Valore totale bloccato", - "stats.tvl.description": "Il valore totale bloccato (TVL) è l'importo aggregato dell'asset disponibile su tutti i pool di liquidità di Uniswap.", - "stats.volume.1d": "Volume di 1 giorni", - "stats.volume.1d.description": "Il volume giornaliero è la quantità di asset scambiata su Uniswap nelle ultime 24 ore.", - "stats.volume.1d.long": "Volume 1D", - "stats.volume.1d.short": "1D volume", - "stats.volume.description": "Il volume è la quantità di asset scambiata su Uniswap durante l'intervallo di tempo selezionato.", - "swap.allow.oneTime": "Consenti {{sym}} (una volta)", - "swap.approveAndSubmit": "Approva e invia", - "swap.approveAndSwap": "Approva e scambia", - "swap.balance.amount": "Saldo: {{amount}}", - "swap.bestPrice.through": "Percorso tramite {{provider}}", - "swap.bestRoute.cost": "Si stima che il percorso più efficiente abbia un costo di circa ~{{gasPrice}} in costi di rete. ", - "swap.bridging.title": "Scambio tra reti", - "swap.bridging.warning.description": "Stai passando da {{fromNetwork}} a {{toNetwork}}. Questo è anche noto come \"bridging\", che sposta i tuoi token da una rete all'altra.", - "swap.button.confirmSignAndSwap": "Conferma il segno e scambia", - "swap.button.confirmSwapAnyways": "Conferma comunque lo scambio", - "swap.button.confirmUnwrap": "Conferma lo scarto", - "swap.button.max": "Massimo", - "swap.button.review": "Revisione", - "swap.button.submitting": "Invio scambio...", - "swap.button.submitting.keep.open": "Tieni il portafoglio aperto...", - "swap.button.submitting.passkey": "Conferma con la passkey", - "swap.button.swap": "Scambio", - "swap.button.swapAnyways": "Scambia comunque", - "swap.button.unwrap": "Scartare", - "swap.button.wrap": "Avvolgere", - "swap.buy.countryModal.placeholder": "Cerca per paese o regione", - "swap.cancel.cannotExecute_one": "Il tuo scambio potrebbe essere eseguito prima che venga elaborata la cancellazione. I costi di rete non possono essere rimborsati. Desideri procedere?", - "swap.cancel.cannotExecute_other": "I tuoi swap potrebbero essere eseguiti prima che venga elaborata la cancellazione. I costi di rete non possono essere rimborsati. Desideri procedere?", - "swap.confirmApproveAndSwap": "Conferma, approva e scambia", - "swap.confirmLimit": "Conferma limite", - "swap.confirmSwap": "Conferma lo scambio", - "swap.confirmWrap": "Conferma avvolgimento", - "swap.deadline.settings.title": "Scadenza scambio", - "swap.deadline.settings.title.short": "Scadenza Tx.", - "swap.details.completed": "Scambio completato", - "swap.details.estimatedTime": "Tempo stimato", - "swap.details.fasterUnichainSwaps": "Scambi più rapidi grazie a Unichain", - "swap.details.feeOnTransfer": "{{tokenSymbol}} tariffa", - "swap.details.feeOnTransfer.symbol": "Commissione token {{tokenSymbol}}", - "swap.details.instant": "Istantaneo", - "swap.details.newQuote.input": "Nuovo ingresso", - "swap.details.newQuote.output": "Nuova uscita", - "swap.details.orderRouting": "Instradamento degli ordini", - "swap.details.orderRoutingInfo": "Questo scambio viene instradato tramite Across, un protocollo decentralizzato che sposta le risorse tra le reti, dando priorità alla sicurezza, alla rapidità di esecuzione e ai prezzi bassi.", - "swap.details.poweredBy": "Offerto da", - "swap.details.rate": "Valutare", - "swap.details.slippage": "Slittamento massimo", - "swap.details.slippage.uniswap": "Slittamento protetto Uniswap", - "swap.details.swappedIn.unichain": "Completato in {{time}}s su Unichain", - "swap.details.uniswapFee": "Tassa", - "swap.error.default": "Potrebbe essere necessario aumentare la tolleranza allo slittamento. Nota: la commissione sul trasferimento e i token rebase non sono compatibili con Uniswap V3.", - "swap.error.expectedToFail": "Si prevede che il tuo scambio fallisca.", - "swap.error.fiatInputUnavailable": "{{fiatCurrencyCode}} input non disponibile", - "swap.error.modifiedByWallet": "Il tuo swap è stato modificato tramite il tuo portafoglio. Se si è trattato di un errore, annulla immediatamente o rischi di perdere i tuoi fondi.", - "swap.error.rejected": "Transazione rifiutata", - "swap.error.undefinedObject": "Si è verificato un errore durante il tentativo di eseguire questo scambio. Potrebbe essere necessario aumentare la tolleranza allo slittamento. Se non funziona, potrebbe esserci un'incompatibilità con il token che stai scambiando. Nota: la commissione sul trasferimento e i token rebase non sono compatibili con Uniswap V3.", - "swap.error.unknown": "Errore sconosciuto.", - "swap.error.v2.expired": "Impossibile inviare questa transazione perché la scadenza è scaduta. Ti invitiamo a verificare che la scadenza della transazione non sia troppo vicina.", - "swap.error.v2.k": "L'invariante Uniswap x*y=k non è stato soddisfatto dallo scambio. Questo di solito significa che uno dei token che stai scambiando incorpora un comportamento personalizzato durante il trasferimento.", - "swap.error.v2.slippage": "Questa transazione non avrà successo a causa del movimento dei prezzi o della commissione sul trasferimento. Prova ad aumentare la tolleranza allo slittamento", - "swap.error.v2.transferInput": "Il token di input non può essere trasferito. Potrebbe esserci un problema con il token di input.", - "swap.error.v2.transferOutput": "Il token di output non può essere trasferito. Potrebbe essersi verificato un problema con il token di output.", - "swap.error.v3.slippage": "Questa transazione non avrà successo a causa del movimento dei prezzi. Prova ad aumentare la tolleranza allo slittamento. Nota: le commissioni sui token di trasferimento e rebase non sono compatibili con Uniswap V3.", - "swap.error.v3.transferOutput": "Il token di output non può essere trasferito. Potrebbe essersi verificato un problema con il token di output. Nota: le commissioni sui token di trasferimento e rebase non sono compatibili con Uniswap V3.", - "swap.estimatedDifference.label": "Ci sarà una grande differenza tra i valori di input e di output a causa della liquidità attuale.", - "swap.expected.price": "Prezzo previsto", - "swap.fail.batched": "Il tuo portafoglio connesso potrebbe non supportare gli scambi in 1 clic. Prova invece uno scambio standard.", - "swap.fail.batched.retry": "Prova lo scambio standard", - "swap.fail.batched.title": "Scambio con 1 clic non riuscito", - "swap.fail.message": "Prova a regolare lo slittamento su un valore più alto.", - "swap.fail.uniswapX": "Non è stato possibile completare lo scambio con UniswapX. Prova di nuovo lo scambio per instradarlo attraverso la classica API Uniswap.", - "swap.fees.experience": "Questa commissione viene applicata su alcune coppie di token per garantire la migliore esperienza con Uniswap. Viene pagata nel token di output ed è già stata calcolata nel preventivo.", - "swap.fees.jupiter.label": "Tariffa di Giove", - "swap.fees.jupiter.message": "Le commissioni su Solana sono addebitate dall'API Jupiter. Uniswap Labs non riceve queste commissioni.", - "swap.fees.noFee": "Le commissioni vengono applicate su coppie di token selezionate per garantire la migliore esperienza con Uniswap. Non è prevista alcuna commissione associata a questo scambio.", - "swap.finalizingQuote": "Finalizzazione preventivo...", - "swap.form.header": "Scambio", - "swap.form.warning.output.fotFees": "A causa della commissione token di {{fotCurrencySymbol}}, gli importi dello swap possono essere inseriti solo utilizzando il campo di immissione", - "swap.form.warning.output.fotFees.fallback": "A causa delle commissioni sui token, gli importi degli swap possono essere inseriti solo utilizzando il campo di immissione", - "swap.form.warning.output.solana": "L'output esatto non è supportato su Solana", - "swap.form.warning.restore": "Ripristina il tuo portafoglio per lo scambio", - "swap.frontrun.warning": "La tua transazione potrebbe essere anticipata e risultare in un'operazione sfavorevole.", - "swap.header.viewOnly": "Visualizzare solamente", - "swap.impactOfTrade": "L'impatto che la tua operazione ha sul prezzo di mercato di questo pool.", - "swap.impactOfTrade.uniswapx": "Differenza tra prezzo di mercato e prezzo di esecuzione, tenendo conto del risparmio di gas di UniswapX.", - "swap.impactOfTrade.uniswapx.missing": "I calcoli dell'impatto sui prezzi potrebbero non essere disponibili per le coppie con bassa liquidità.", - "swap.inputEstimated.atMost": "L'input è stimato. Venderai al massimo o la transazione verrà annullata.", - "swap.limit": "Limite", - "swap.limitFilled": "Limite riempito!", - "swap.limitSubmitted": "Limite inviato", - "swap.marketPrice.outsideRange.label": "Il prezzo di mercato non rientra nella fascia di prezzo specificata. Solo deposito per asset singolo.", - "swap.min.price": "Prezzo minimo", - "swap.networkCost.paidIn": "Il costo di rete viene pagato in {{sym}} sulla rete {{chainName}} per effettuare transazioni.", - "swap.orderRouting": "Instradamento degli ordini", - "swap.outputEstimated.atLeast": "La produzione è stimata. Riceverai almeno altrimenti la transazione verrà annullata.", - "swap.placeOrder": "Invia ordine", - "swap.priceImpact": "Impatto sui prezzi", - "swap.request.title.full": "Scambia {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "Scambia gettoni", - "swap.review": "Scambio di recensioni", - "swap.review.summary": "Stai scambiando", - "swap.reviewLimit": "Limite di revisione", - "swap.route.optimizedGasCost": "Questo percorso considera percorsi suddivisi, salti multipli e costi di rete di ogni passaggio.", - "swap.routing.jupiter.description": "Jupiter aggrega liquidità da più fonti per offrirti i prezzi migliori.", - "swap.routing.uniswapAutoRouter.description": "Uniswap Auto Router considera i percorsi ottimali e i costi di rete per offrirti i prezzi migliori.", - "swap.settings.deadline.tooltip": "La transazione verrà annullata se rimane in sospeso per un periodo di tempo superiore a questo. (Massimo: 3 giorni).", - "swap.settings.deadline.warning": "Scadenza elevata", - "swap.settings.oneClickSwap.title": "Scambi con 1 clic", - "swap.settings.oneClickSwap.tooltip": "Raggruppa le azioni di trading standard per scambi più rapidi e a costi inferiori.", - "swap.settings.protection.description": "Con la protezione swap attiva, le tue transazioni Ethereum saranno protette dagli attacchi sandwich, con ridotte possibilità di fallimento.", - "swap.settings.protection.subtitle.supported": "{{chainName}} Rete", - "swap.settings.protection.subtitle.unavailable": "Non disponibile su {{chainName}}", - "swap.settings.protection.title": "Protezione dallo scambio", - "swap.settings.routingPreference.option.default.description": "Selezionando questa opzione si identifica il percorso più efficiente per lo scambio.", - "swap.settings.routingPreference.option.default.description.preV4": "Il cliente Uniswap seleziona l'opzione di trading più economica tenendo conto del prezzo e dei costi di rete.", - "swap.settings.routingPreference.option.default.description.uniswapXUnavailable": "UniswapX non disponibile per il tuo portafoglio", - "swap.settings.routingPreference.option.default.tooltip": "Viene identificato un percorso considerando i pool v2, v3 e alcuni pool v4, tenendo conto dell'impatto stimato sui prezzi e dei costi di rete.", - "swap.settings.routingPreference.option.v2.title": "Abilita pool v2", - "swap.settings.routingPreference.option.v3.title": "Abilita pool v3", - "swap.settings.routingPreference.option.v4.hooks.title": "Abilita pool di hook v4", - "swap.settings.routingPreference.option.v4.hooks.tooltip": "Gli hook V4 indirizzano gli scambi tramite una serie di hook pre-approvati.", - "swap.settings.routingPreference.option.v4.title": "Abilita pool v4", - "swap.settings.routingPreference.title": "Opzioni commerciali", - "swap.settings.slippage.alert": "Elevato slittamento", - "swap.settings.slippage.control.auto": "Auto", - "swap.settings.slippage.description": "La transazione verrà annullata se il prezzo cambia più della percentuale di slittamento.", - "swap.settings.slippage.input.message": "Se il prezzo scende ulteriormente, la transazione verrà annullata. Di seguito è riportato l'importo minimo che hai la garanzia di ricevere.", - "swap.settings.slippage.input.receive.title": "Ricevi almeno", - "swap.settings.slippage.output.message": "Se il prezzo scende ulteriormente, la transazione verrà annullata. Di seguito è riportato l'importo massimo che dovresti spendere.", - "swap.settings.slippage.output.spend.title": "Spendere al massimo", - "swap.settings.slippage.warning": "Slittamento molto elevato", - "swap.settings.slippage.warning.description": "Uno slippage superiore al 20% probabilmente darà luogo a un trade sfavorevole. Per ridurre il rischio di essere front-run, abbassa le tue impostazioni.", - "swap.settings.slippage.warning.hover": "Ciò potrebbe comportare un trade sfavorevole. Prova ad abbassare l'impostazione dello slippage.", - "swap.settings.slippage.warning.max": "Inserisci un valore inferiore a {{maxSlippageTolerance}}", - "swap.settings.slippage.warning.message": "Lo slittamento potrebbe essere superiore al necessario", - "swap.settings.slippage.warning.min": "Inserisci un valore maggiore di 0", - "swap.settings.title": "Scambia le impostazioni", - "swap.settings.transactionRevertPrice": "La tua transazione verrà annullata se il prezzo cambia sfavorevolmente di più di questa percentuale.", - "swap.signAndSwap": "Firma e scambia", - "swap.slippage.amt": "{{amt}} slittamento", - "swap.slippage.bridging": "Nessuno slittamento durante lo scambio tra reti", - "swap.slippage.description": "Differenza tra il prezzo previsto e quello eseguito su uno swap. Le differenze possono verificarsi a causa di scarsa liquidità, volatilità del mercato o bot. \n\nLa protezione Uniswap protegge da bot di frontrunning e MEV.", - "swap.slippage.settings.title": "Impostazioni di slittamento", - "swap.slippage.tooltip": "Il movimento massimo del prezzo prima che la transazione venga annullata.", - "swap.slippageBelow.warning": "Lo slittamento al di sotto di {{amt}} potrebbe comportare il fallimento della transazione", - "swap.submitted": "Scambio inviato", - "swap.success": "Scambia il successo!", - "swap.tokenOwnFees": "Alcuni token richiedono una commissione quando vengono acquistati o venduti, che viene stabilita dall'emittente del token. Uniswap non riceve nessuna di queste commissioni.", - "swap.tradeRoutes": "Rotte commerciali", - "swap.transaction.deadline": "Scadenza della transazione", - "swap.transaction.revertAfter": "La tua transazione verrà annullata se rimane in sospeso per più di questo periodo di tempo.", - "swap.warning.enterLargerAmount.title": "Inserisci un importo maggiore", - "swap.warning.expectedFailure.increaseSlippage": "Prova ad aumentare lo slittamento.", - "swap.warning.expectedFailure.titleMay": "Questo scambio potrebbe fallire", - "swap.warning.insufficientBalance.title": "Non ne hai abbastanza {{currencySymbol}}", - "swap.warning.insufficientGas.button": "Non abbastanza {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "Sostituisci {{ tokenSymbol }} con {{networkName}}", - "swap.warning.insufficientGas.button.buy": "Acquista {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "Acquista con carta", - "swap.warning.insufficientGas.message.withNetwork": "Non abbastanza {{currencySymbol}} su {{networkName}} per lo scambio", - "swap.warning.insufficientGas.message.withoutNetwork": "{{currencySymbol}} insufficienti per lo scambio", - "swap.warning.insufficientGas.title": "Non hai abbastanza {{currencySymbol}} per coprire il costo della rete", - "swap.warning.networkFee.allow": "Consenti {{ inputTokenSymbol }} (una volta)", - "swap.warning.networkFee.delegation.message": "Questo è il costo per elaborare la tua transazione e attivare il tuo portafoglio intelligente su Unichain. Uniswap Labs non riceve alcuna quota di queste commissioni.", - "swap.warning.networkFee.highRelativeToValue": "Il costo di rete supera il 10% del valore totale della tua transazione. Questo è il costo per elaborare la tua transazione sulla blockchain. Uniswap non riceve alcuna quota di queste commissioni.", - "swap.warning.networkFee.highRelativeToValue.unichain": "Il costo di rete supera il 10% del valore totale della tua transazione. Questo è il costo per elaborare la tua transazione sulla blockchain.", - "swap.warning.networkFee.includesDelegation": "Include l'attivazione del portafoglio intelligente", - "swap.warning.networkFee.message": "Questo è il costo per elaborare la tua transazione sulla blockchain. Uniswap non riceve alcuna quota di queste commissioni.", - "swap.warning.networkFee.message.unichain": "Questo è il costo per elaborare la tua transazione sulla blockchain.", - "swap.warning.networkFee.message.uniswapX": "Questo è il costo per elaborare la tua transazione sulla blockchain. Uniswap non riceve alcuna quota di queste commissioni. UniswapX aggrega fonti di liquidità per prezzi migliori e swap senza gas.", - "swap.warning.networkFee.message.uniswapX.title": "Nessun costo di rete con UniswapX", - "swap.warning.networkFee.message.uniswapX.unichain": "Questo è il costo per elaborare la tua transazione sulla blockchain. UniswapX aggrega fonti di liquidità per prezzi migliori e swap senza gas.", - "swap.warning.noQuotesFound.bridging.message": "Nessuna citazione di bridging trovata. Prova a usare il bridge ufficiale in questo momento.", - "swap.warning.noQuotesFound.title": "Nessuna citazione trovata", - "swap.warning.noRoutesFound.message": "Al momento non ci sono percorsi disponibili per i token selezionati. Prova una coppia diversa o controlla di nuovo più tardi.", - "swap.warning.noRoutesFound.title": "Nessun percorso disponibile", - "swap.warning.offline.message": "Potresti aver perso la connessione Internet o la rete potrebbe essere inattiva. Per favore controlla la tua connessione Internet e prova di nuovo.", - "swap.warning.offline.title": "Sei offline", - "swap.warning.priceImpact.message": "A causa della quantità di {{outputCurrencySymbol}} liquidità attualmente disponibile, più {{inputCurrencySymbol}} provi a scambiare, meno {{outputCurrencySymbol}} riceverai.", - "swap.warning.priceImpact.message.veryHigh": "Questa transazione comporterà un impatto di {{priceImpactValue}} sul prezzo di mercato di questo pool e comporterà una perdita di fondi.", - "swap.warning.priceImpact.title": "Elevato impatto sui prezzi ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "Impatto sul prezzo molto elevato ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "La tua transazione non è stata inviata perché hai chiuso l'app.", - "swap.warning.queuedOrder.approvalFailed": "La tua transazione non è stata inviata perché l'approvazione del token non è riuscita.", - "swap.warning.queuedOrder.stale": "La tua transazione non è stata inviata perché hai chiuso l'app o l'approvazione ha richiesto troppo tempo.", - "swap.warning.queuedOrder.submissionFailed": "Si è verificato un problema durante l'invio della transazione.", - "swap.warning.queuedOrder.title": "Scambio annullato", - "swap.warning.rateLimit.message": "Riprova tra qualche minuto.", - "swap.warning.rateLimit.title": "Limite di velocità superato", - "swap.warning.router.message": "Potresti aver perso la connessione o la rete potrebbe essere inattiva. Se il problema persiste, riprova più tardi.", - "swap.warning.router.title": "Questo scambio non può essere completato in questo momento", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} è bloccato", - "swap.warning.tokenBlockedFallback.button": "Il token è bloccato", - "swap.warning.uniswapFee.message": "Le commissioni vengono applicate per garantire la migliore esperienza con Uniswap.", - "swap.warning.uniswapFee.message.default": "Le commissioni vengono applicate per garantire la migliore esperienza con Uniswap. Non è prevista alcuna commissione associata a questo scambio.", - "swap.warning.uniswapFee.message.included": "Le commissioni vengono applicate per garantire la migliore esperienza con Uniswap e sono già state prese in considerazione in questo preventivo.", - "swap.warning.uniswapFee.title": "Commissione di scambio", - "swap.warning.viewOnly.message": "È necessario importare questo portafoglio tramite la frase di ripristino per scambiare i token.", - "swap.wrap.token": "Avvolgi {{sym}}", - "tdp.balanceSummary.otherNetworks": "Su altre reti", - "tdp.balanceSummary.otherNetworksBalance": "Saldo su altre reti", - "tdp.balanceSummary.title": "Il tuo bilancio", - "tdp.button.getToken": "Ottieni {{ tokenSymbol }}", - "tdp.button.getTokenFallback": "Ottieni il token", - "tdp.loading.title.default": "dati token per ", - "tdp.loading.title.withChain": "dati del token per su {{chainName}}", - "tdp.nameNotFound": "Nome non trovato", - "tdp.noInfoAvailable": "Nessuna informazione sul token disponibile", - "tdp.noTestnetSupportDescription": "Alcune testnet non supportano lo scambio, l'invio o l'acquisto di token.", - "tdp.symbolNotFound": "Simbolo non trovato", - "testnet.modal.swapDeepLink.description.toProdMode": "Questa azione richiede che la modalità testnet sia disabilitata. La modalità testnet può essere riabilitata in qualsiasi momento nelle impostazioni.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "Questa azione richiede che la modalità testnet sia abilitata. I token sulle testnet non hanno alcun valore reale. La modalità testnet può essere disabilitata in qualsiasi momento nelle impostazioni.", - "testnet.modal.swapDeepLink.title.toProdMode": "Disabilita la modalità testnet", - "testnet.modal.swapDeepLink.title.toTestnetMode": "Abilita la modalità testnet", - "testnet.unsupported": "Questa funzionalità non è supportata in modalità testnet.", - "themeToggle.theme": "Tema", - "title.buySellTradeEthereum": "Acquista, vendi e scambia Ethereum e altri token di punta su Uniswap", - "title.createGovernanceOn": "Creare una nuova proposta di governance su Uniswap", - "title.createGovernanceTo": "Creare una nuova proposta di governance da sottoporre al voto dei titolari dell'UNI. I token UNI rappresentano azioni con diritto di voto nella governance di Uniswap.", - "title.earnFees": "Guadagna commissioni quando altri effettuano scambi su Uniswap aggiungendo token ai pool di liquidità.", - "title.easilyRemove": "Rimuovi facilmente la tua liquidità da Uniswap v2 e deposita su Uniswap v3.", - "title.easilyRemoveV4": "Rimuovi facilmente la tua liquidità da Uniswap v2 e v3 per depositarla su Uniswap v4.", - "title.extension.uninstall": "Estensione disinstallata", - "title.extensionPasskeyLogIn": "Accedi con Passkey", - "title.managePasskeys": "Uniswap | Gestisci le tue passkey", - "title.migratev2": "Migrare la liquidità del pool v2 su Uniswap v3", - "title.migratev3": "Migrazione della liquidità del pool su Uniswap v4", - "title.placeLimit": "Effettua ordini limite su Uniswap", - "title.realTime": "Prezzi in tempo reale, grafici, dati sulle transazioni e altro ancora.", - "title.removeLiquidityv2": "Rimuovi la liquidità della pool (v2) su Uniswap", - "title.removePoolLiquidity": "Rimuovi la liquidità della pool su Uniswap", - "title.removeTokensv2": "Rimuovi i tuoi token dai pool di liquidità v2.", - "title.removev3Liquidity": "Rimuovi i tuoi token dai pool di liquidità v3.", - "title.sendCrypto": "Invia criptovaluta", - "title.sendTokens": "Invia token su Uniswap", - "title.swappingMadeSimple": "Acquista e vendi criptovalute all'istante su Ethereum, Base, Arbitrum, Polygon, Unichain e altro ancora. La piattaforma DeFi di cui si fidano milioni di persone.", - "title.tradeTokens": "Scambia token e fornisci liquidità. Prezzi in tempo reale, grafici, dati sulle transazioni e altro ancora.", - "title.uniswapTradeCrypto": "Uniswap | Fai trading di criptovalute sul principale exchange DeFi ", - "title.uniToken": "I token UNI rappresentano azioni con diritto di voto nella governance di Uniswap. Puoi votare tu stesso ciascuna proposta o delegare i tuoi voti a terzi.", - "title.voteOnGov": "Votazione sulle proposte di governance su Uniswap", - "token.balances.main": "Il tuo bilancio", - "token.balances.other": "Saldi su altre reti", - "token.balances.viewOnly": "Il saldo di {{ownerAddress}}", - "token.bridge": "{{label}} ponte di gettoni", - "token.chart.candlestick.unavailable": "I grafici a candela non sono disponibili per questo token", - "token.chart.tooltip": "Commissioni: {{amount}}", - "token.details": "Dettagli del token", - "token.error.unknown": "Gettone sconosciuto", - "token.fee.buy.label": "acquistare la quota", - "token.fee.label": "tassa", - "token.fee.sell.label": "commissione di vendita", - "token.links.title": "Collegamenti", - "token.links.twitter": "Cinguettio", - "token.links.website": "Sito web", - "token.notFound.description": "Spiacenti, non riusciamo a trovare informazioni per questo token. Controlla il nome e l'indirizzo e riprova.", - "token.notFound.title": "Token non trovato", - "token.priceExplorer.error.description": "Qualcosa è andato storto.", - "token.priceExplorer.error.title": "Impossibile caricare il grafico dei prezzi", - "token.priceExplorer.timeRangeLabel.all": "Sempre", - "token.priceExplorer.timeRangeLabel.day": "1D", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 giorno", - "token.priceExplorer.timeRangeLabel.hour": "1 ora", - "token.priceExplorer.timeRangeLabel.month": "1 milione", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 mese", - "token.priceExplorer.timeRangeLabel.week": "1 W", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 settimana", - "token.priceExplorer.timeRangeLabel.year": "1 anno", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 anno", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} non è disponibile", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} e {{tokenSymbol1}} non sono disponibili", - "token.safety.fee.detected": "Commissione token rilevata", - "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs non riceve nessuna di queste commissioni.", - "token.safety.warning.alwaysDoYourResearch": "Fai sempre le tue ricerche", - "token.safety.warning.blocked.description.default_one": "Non puoi scambiare questo token utilizzando l'app Uniswap.", - "token.safety.warning.blocked.description.default_other": "Non puoi scambiare questi token utilizzando l'app Uniswap.", - "token.safety.warning.copyContractAddress.message": "Questo è un indirizzo di contratto, che funge da identificatore univoco per i token sulla blockchain. Qualsiasi criptovaluta che invii a questo indirizzo andrà persa.", - "token.safety.warning.copyContractAddress.title": "Non inviare criptovalute a questo indirizzo", - "token.safety.warning.dontShowWarningAgain": "Non mostrarmi più questo avviso", - "token.safety.warning.dontShowWarningAgainShort": "Non mostrare più", - "token.safety.warning.doYourOwnResearch": "Prima di procedere, fai sempre le tue ricerche.", - "token.safety.warning.feeDescription": "Carica un quando {{action}}", - "token.safety.warning.flaggedAsMalicious": "Segnalato come dannoso", - "token.safety.warning.flaggedAsSuspicious": "Segnalato come sospetto", - "token.safety.warning.fotHigh.title": "Rilevata tariffa elevata", - "token.safety.warning.fotLow.title": "Tassa rilevata", - "token.safety.warning.fotVeryHigh.title": "Rilevata una tariffa molto alta", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} è stato contrassegnato come non vendibile. Lo scambio di questo token potrebbe comportare la perdita dei tuoi fondi.", - "token.safety.warning.honeypot.title": "Commissione di vendita rilevata al 100%", - "token.safety.warning.impersonator": "Impersona un altro token", - "token.safety.warning.impersonator.title": "Rilevato token di imitazione", - "token.safety.warning.malicious.general.message": "{{tokenSymbol}} è stato segnalato come dannoso da Blockaid.", - "token.safety.warning.malicious.impersonator.message": "{{tokenSymbol}} è stato segnalato da Blockaid per aver tentato di copiare un token diverso. Potrebbe non essere il token che stai cercando di scambiare.", - "token.safety.warning.malicious.impersonator.message.short": "{{tokenSymbol}} potrebbe non essere il token che stai cercando di scambiare.", - "token.safety.warning.malicious.title": "Rilevato token dannoso", - "token.safety.warning.mayResultInLoss": "Lo scambio potrebbe comportare una perdita di fondi.", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} non è negoziato nelle principali borse centralizzate statunitensi.", - "token.safety.warning.notListedOnExchanges": "Non quotato nelle principali borse statunitensi", - "token.safety.warning.potentialHoneypot.card.message": "{{tokenSymbol}} è stato segnalato come sospetto da Blockaid.", - "token.safety.warning.potentialHoneypot.modal.message": "{{tokenSymbol}} è stato segnalato come potenziale honeypot da Blockaid. Fai sempre le tue ricerche prima di procedere.", - "token.safety.warning.potentialHoneypot.title": "Rilevato potenziale honeypot", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} è stato segnalato come invendibile.", - "token.safety.warning.sellFee100.title": "Commissione di vendita rilevata al 100%", - "token.safety.warning.spam.message": "{{tokenSymbol}} è stato segnalato come spam da Blockaid.", - "token.safety.warning.spam.title": "Rilevato token spam", - "token.safety.warning.spamsUsers": "Spam agli utenti", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} addebita una commissione di {{buyFeePercent}} quando viene acquistato e di {{sellFeePercent}} quando viene venduto.", - "token.safety.warning.tokenChargesFee.buy.message": "{{tokenSymbol}} addebita una commissione di {{feePercent}} quando viene acquistato.", - "token.safety.warning.tokenChargesFee.buy.message.descriptive": "{{tokenSymbol}} addebita una commissione di {{feePercent}} all'acquisto. Scambiarlo potrebbe comportare una perdita di fondi. Uniswap Labs non riceve alcuna di queste commissioni.", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} addebita una commissione di {{feePercent}} quando viene venduto.", - "token.safety.warning.tokenChargesFee.sell.message.descriptive": "{{tokenSymbol}} addebita una commissione di {{feePercent}} alla vendita. Scambiarlo potrebbe comportare una perdita di fondi. Uniswap Labs non riceve alcuna di queste commissioni.", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} addebita una commissione quando viene acquistato o venduto.", - "token.safetyLevel.blocked.message": "Non puoi scambiare questo token utilizzando Uniswap Wallet.", - "token.safetyLevel.medium.message.plural": "Questi token non sono scambiati sui principali exchange centralizzati degli Stati Uniti. Fai sempre le tue ricerche prima di procedere.", - "token.selector.search.error": "Impossibile caricare i risultati della ricerca", - "token.stats.fullyDilutedValuation": "Valutazione completamente diluita", - "token.stats.marketCap": "Capitalizzazione di mercato", - "token.stats.priceHighYear": "52 W di altezza", - "token.stats.priceLowYear": "52 W Basso", - "token.stats.section.about": "Circa {{token}}", - "token.stats.title": "Statistiche", - "token.stats.translation.original": "Spettacolo originale", - "token.stats.translation.translate": "Traduci in {{language}}", - "token.stats.volume": "Volume 24 ore", - "token.symbol.input.fallback": "Token di input", - "token.symbol.output.fallback": "Token di output", - "token.wrap.fail.message": "Gli swap sul protocollo Uniswap possono iniziare e terminare con ETH. Tuttavia, durante lo scambio, ETH viene avvolto in WETH.", - "token.zeroNativeBalance.description.mainnet": "Dovrai scambiare un token su Ethereum per ottenere {{ tokenSymbol }}. Lo scambio richiede ETH per i costi di rete.", - "token.zeroNativeBalance.description.otherChains": "Dovrai scambiare un token su {{ chainName }} per ottenere {{ tokenSymbol }}. Lo scambio richiede {{ chainName }} {{ nativeTokenSymbol }} per i costi di rete.", - "token.zeroNativeBalance.subtitle": "{{ tokenSymbol }} non è disponibile per l'acquisto diretto.", - "token.zeroNativeBalance.title.mainnet": "Hai bisogno di {{ nativeTokenName }}", - "token.zeroNativeBalance.title.otherChains": "Hai bisogno di {{ nativeTokenName }} su {{ chainName }}", - "tokens.action.hide": "Nascondi il token", - "tokens.action.unhide": "Scopri il token", - "tokens.nfts.action.viewOnExplorer": "Visualizza su {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "Impossibile caricare la raccolta NFT", - "tokens.nfts.collection.label.items": "Elementi", - "tokens.nfts.collection.label.owners": "Proprietari", - "tokens.nfts.collection.label.priceFloor": "Pavimento", - "tokens.nfts.collection.label.swapVolume": "Volume", - "tokens.nfts.connectEthereumToView": "Collega un portafoglio Ethereum per visualizzare i tuoi NFT", - "tokens.nfts.details.contract.address": "Indirizzo del contratto", - "tokens.nfts.details.error.load.title": "Impossibile caricare i dettagli NFT", - "tokens.nfts.details.network": "Rete", - "tokens.nfts.details.owner": "Posseduto da", - "tokens.nfts.details.price": "Prezzo attuale", - "tokens.nfts.details.recentPrice": "Ultimo prezzo di vendita", - "tokens.nfts.details.traits": "Tratti", - "tokens.nfts.empty.description": "Nessun NFT trovato", - "tokens.nfts.error.unavailable": "Contenuto non disponibile", - "tokens.nfts.hidden.action.hide": "Nascondi NFT", - "tokens.nfts.hidden.action.unhide": "Scopri NFT", - "tokens.nfts.link.collection": "Sito web della collezione", - "tokens.nfts.list.error.load.title": "Impossibile caricare gli NFT", - "tokens.nfts.list.none.button": "Ricevi NFT", - "tokens.nfts.list.none.description.default": "Trasferisci NFT da un altro portafoglio per iniziare.", - "tokens.nfts.list.none.description.external": "Quando questo portafoglio acquista o riceve NFT, verranno visualizzati qui.", - "tokens.nfts.list.none.title": "Nessun NFT ancora", - "tokens.nfts.notAvailableOnSolana": "Gli NFT non sono disponibili su Solana", - "tokens.selector.button.choose": "Seleziona gettone", - "tokens.selector.empty.buy.message": "Acquista criptovalute con una carta o una banca per inviare token.", - "tokens.selector.empty.buy.title": "Acquista criptovaluta", - "tokens.selector.empty.receive.title": "Ricevi gettoni", - "tokens.selector.empty.title": "Nessun token ancora", - "tokens.selector.error.load": "Impossibile caricare i token", - "tokens.selector.search.empty": "Nessun risultato trovato per {{searchText}}", - "tokens.selector.search.placeholder": "Cerca token", - "tokens.selector.section.bridging": "Scambio tra reti", - "tokens.selector.section.favorite": "Preferiti", - "tokens.selector.section.otherNetworksSearchResults": "Token trovati su altre reti", - "tokens.selector.section.otherSearchResults": "Altri token su {{network}}", - "tokens.selector.section.recent": "Ricerche recenti", - "tokens.selector.section.search": "Risultati di ricerca", - "tokens.selector.section.trending": "Token per volume 24H", - "tokens.selector.section.yours": "I tuoi gettoni", - "tokens.table.search.placeholder.pools": "Cerca pool", - "tokens.table.search.placeholder.tokens": "Cerca token", - "tokens.table.search.placeholder.transactions": "Cerca transazioni", - "toucan.auction.bidConcentration": "Concentrazione del tucano", - "toucan.auction.bidConcentration.tooltip.description": "Descrizione del suggerimento del tucano", - "toucan.auction.bidConcentration.tooltip.title": "Titolo del suggerimento del tucano", - "toucan.auctions": "Aste", - "toucan.bidForm.maxBudget": "Budget massimo", - "toucan.bidForm.placeBid": "Fai la tua offerta", - "toucan.displayMode.tokenPrice": "Prezzo del token", - "toucan.displayMode.valuation": "Valutazione", - "transaction.action.cancel.button": "Annulla transazione", - "transaction.action.cancel.description": "Se annulli questa transazione prima che venga elaborata dalla rete, pagherai un nuovo costo di rete anziché quello originale.", - "transaction.action.cancel.title": "Annullare questa transazione?", - "transaction.action.clear": "Cancella in attesa", - "transaction.action.copy": "Copia l'ID della transazione", - "transaction.action.copyProvider": "Copia {{providerName}} ID transazione", - "transaction.amount.unlimited": "Illimitato", - "transaction.callData": "Dati delle chiamate", - "transaction.details.dappName": "Applicazione", - "transaction.details.from": "Da", - "transaction.details.networkFee": "Costo di rete", - "transaction.details.networkFee.swap": "Costo di rete di swap", - "transaction.details.providerFee": "Commissione del fornitore", - "transaction.details.swapRate": "Valutare", - "transaction.details.transaction": "Transazione", - "transaction.details.uniswapFee": "Commissione ({{ feePercent }}%)", - "transaction.network.all": "Tutte le reti", - "transaction.networkCost.description": "Il costo per elaborare la tua transazione sulla blockchain. Uniswap è ottimizzato per ridurre al minimo i costi di rete.", - "transaction.networkCost.includesSmartWalletActivation": "Include l'attivazione del portafoglio intelligente", - "transaction.networkCost.label": "Costo di rete", - "transaction.networkCost.maxNativeBalance.description": "Una piccola parte del saldo del token di rete è riservata per coprire i costi di rete di questa transazione.", - "transaction.networkCost.maxNativeBalance.title": "Perché non riesco a utilizzare il mio saldo massimo?", - "transaction.networkCost.veryHigh.label": "Costo di rete molto elevato", - "transaction.notification.error.cancel": "Impossibile annullare la transazione", - "transaction.notification.error.replace": "Impossibile sostituire la transazione", - "transaction.status.approval.canceled": "Approvazione annullata", - "transaction.status.approval.failed": "Approvazione non riuscita", - "transaction.status.approve.canceled": "Approvazione annullata", - "transaction.status.approve.canceling": "Annullamento dell'approvazione", - "transaction.status.approve.failed": "Impossibile approvare", - "transaction.status.approve.pending": "Approvazione", - "transaction.status.approve.success": "Approvato", - "transaction.status.approve.successDapp": "Approvato il {{externalDappName}}", - "transaction.status.buy.canceled": "Acquisto annullato", - "transaction.status.buy.canceling": "Annullamento dell'acquisto", - "transaction.status.buy.failed": "Impossibile acquistare", - "transaction.status.buy.pending": "Acquisto", - "transaction.status.buy.success": "Comprato", - "transaction.status.buy.successDapp": "Acquistato il {{externalDappName}}", - "transaction.status.claim.canceled": "Riscossione delle commissioni annullata", - "transaction.status.claim.canceling": "Annullamento della riscossione delle commissioni", - "transaction.status.claim.failed": "La riscossione della quota non è riuscita", - "transaction.status.claim.pending": "Tasse di riscossione", - "transaction.status.claim.success": "Commissioni riscosse", - "transaction.status.collect.fees.canceled": "Riscossione commissioni annullata", - "transaction.status.collect.fees.failed": "Riscossione delle commissioni non riuscita", - "transaction.status.collected.fees": "Commissioni riscosse", - "transaction.status.collecting.fees": "Tasse di riscossione", - "transaction.status.confirm.canceled": "Conferma annullata", - "transaction.status.confirm.canceling": "In attesa di cancellazione", - "transaction.status.confirm.failed": "Impossibile confermare", - "transaction.status.confirm.pending": "Transazione in corso", - "transaction.status.confirm.success": "Transazione confermata", - "transaction.status.confirm.successDapp": "Transazione confermata il {{externalDappName}}", - "transaction.status.createPair.canceled": "Creazione coppia annullata", - "transaction.status.createPair.canceling": "Annullamento della creazione della coppia", - "transaction.status.createPair.failed": "Impossibile creare la coppia", - "transaction.status.createPair.pending": "Creazione di una coppia", - "transaction.status.createPair.success": "Coppia creata", - "transaction.status.createPool.canceled": "Creazione pool annullata", - "transaction.status.createPool.canceling": "Annullamento della creazione del pool", - "transaction.status.createPool.failed": "Impossibile creare il pool", - "transaction.status.createPool.pending": "Creazione della piscina", - "transaction.status.createPool.success": "Piscina creata", - "transaction.status.liquidityDecrease.canceled": "Rimuovi liquidità annullata", - "transaction.status.liquidityDecrease.canceling": "Annullamento rimozione liquidità", - "transaction.status.liquidityDecrease.failed": "Rimuovere la liquidità fallito", - "transaction.status.liquidityDecrease.pending": "Togliere liquidità", - "transaction.status.liquidityDecrease.success": "Liquidità rimossa", - "transaction.status.liquidityIncrease.canceled": "Aggiungi liquidità annullata", - "transaction.status.liquidityIncrease.canceling": "Annullamento aggiunta liquidità", - "transaction.status.liquidityIncrease.failed": "Aggiunta di liquidità fallita", - "transaction.status.liquidityIncrease.pending": "Aggiunta di liquidità", - "transaction.status.liquidityIncrease.success": "Aggiunta liquidità", - "transaction.status.lpIncentivesClaim.canceled": "Richiesta di premi LP annullata", - "transaction.status.lpIncentivesClaim.canceling": "Annullamento della richiesta di premi LP", - "transaction.status.lpIncentivesClaim.failed": "Impossibile richiedere i premi LP", - "transaction.status.lpIncentivesClaim.pending": "Richiedere ricompense LP", - "transaction.status.lpIncentivesClaim.success": "Ricompense LP richieste", - "transaction.status.migrateLiquidity.canceled": "Migrazione della liquidità annullata", - "transaction.status.mint.canceled": "Nuovo annullato", - "transaction.status.mint.canceling": "Annullamento della zecca", - "transaction.status.mint.failed": "Impossibile coniare", - "transaction.status.mint.pending": "Conio", - "transaction.status.mint.success": "Coniato", - "transaction.status.mint.successDapp": "Coniata il {{externalDappName}}", - "transaction.status.offramp.canceled": "Offramp annullato", - "transaction.status.offramp.failed": "Offramp non riuscito", - "transaction.status.offramp.pending": "Offramping", - "transaction.status.offramp.success": "Fuori rampa", - "transaction.status.onramp.canceled": "Rampa di accesso annullata", - "transaction.status.onramp.failed": "Rampa di accesso non riuscita", - "transaction.status.onramp.pending": "Rampa di accesso", - "transaction.status.onramp.success": "In rampa", - "transaction.status.permit.approved": "Permesso approvato", - "transaction.status.permit.canceled": "Permesso di soggiorno annullato", - "transaction.status.permit.failed": "Permesso non riuscito", - "transaction.status.purchase.canceled": "Acquisto annullato", - "transaction.status.purchase.canceling": "Annullamento dell'acquisto", - "transaction.status.purchase.failed": "Acquisto fallito", - "transaction.status.purchase.failedOn": "Impossibile acquistare il {{serviceProvider}}", - "transaction.status.purchase.pending": "Acquisto", - "transaction.status.purchase.pendingOn": "Acquistando su {{serviceProvider}}", - "transaction.status.purchase.successOn": "Acquistato il {{serviceProvider}}", - "transaction.status.receive.canceled": "Ricezione annullata", - "transaction.status.receive.canceling": "Annullamento della ricezione", - "transaction.status.receive.failed": "Ricezione fallita", - "transaction.status.receive.failedFrom": "Impossibile ricevere da {{serviceProvider}}", - "transaction.status.receive.pending": "Ricevere", - "transaction.status.receive.pendingFrom": "Ricevo da {{serviceProvider}}", - "transaction.status.receive.success": "Ricevuto", - "transaction.status.receive.successDapp": "Ricevuto il {{externalDappName}}", - "transaction.status.receive.successFrom": "Ricevuto da {{serviceProvider}}", - "transaction.status.removeDelegation.canceled": "Rimozione delega annullata", - "transaction.status.removeDelegation.failed": "Rimozione delega non riuscita", - "transaction.status.removeDelegation.pending": "Rimozione della delega", - "transaction.status.removeDelegation.success": "Delega rimossa", - "transaction.status.revoke.canceled": "Revoca annullata", - "transaction.status.revoke.canceling": "Annullamento della revoca", - "transaction.status.revoke.failed": "Impossibile revocare", - "transaction.status.revoke.pending": "Revoca", - "transaction.status.revoke.success": "Revocato", - "transaction.status.revoke.successDapp": "Revocato il {{externalDappName}}", - "transaction.status.sale.canceled": "Vendita annullata", - "transaction.status.sale.canceling": "Annullamento della vendita", - "transaction.status.sale.failedOn": "Vendita fallita tramite {{serviceProvider}}", - "transaction.status.sale.pendingCard.msg": "Scopri di più sulla vendita di criptovalute.", - "transaction.status.sale.pendingCard.title": "Perché la mia vendita è ancora in sospeso?", - "transaction.status.sale.pendingOn": "Vendita tramite {{serviceProvider}}", - "transaction.status.sale.successOn": "Venduto tramite {{serviceProvider}}", - "transaction.status.sell.canceled": "Vendita annullata", - "transaction.status.sell.canceling": "Annullamento della vendita", - "transaction.status.sell.failed": "Impossibile vendere", - "transaction.status.sell.pending": "Vendita", - "transaction.status.sell.success": "Venduto", - "transaction.status.sell.successDapp": "Venduto il {{externalDappName}}", - "transaction.status.send.canceled": "Invio annullato", - "transaction.status.send.canceling": "Annullamento invio", - "transaction.status.send.failed": "Impossibile inviare", - "transaction.status.send.pending": "Invio", - "transaction.status.send.success": "Inviato", - "transaction.status.send.successDapp": "Inviato il {{externalDappName}}", - "transaction.status.swap.canceled": "Scambio annullato", - "transaction.status.swap.canceling": "Annullamento dello scambio", - "transaction.status.swap.expired": "Scambio scaduto", - "transaction.status.swap.failed": "Impossibile scambiare", - "transaction.status.swap.insufficientFunds": "Fondi insufficienti", - "transaction.status.swap.pending": "Scambio", - "transaction.status.swap.success": "Scambiato", - "transaction.status.swap.successDapp": "Scambiato il {{externalDappName}}", - "transaction.status.unwrap.canceled": "Scarto annullato", - "transaction.status.unwrap.canceling": "Annullamento dello scarto", - "transaction.status.unwrap.failed": "Impossibile scartare", - "transaction.status.unwrap.pending": "Scartare", - "transaction.status.unwrap.success": "Scartato", - "transaction.status.unwrap.successDapp": "Scartato il {{externalDappName}}", - "transaction.status.wrap.canceled": "Avvolgimento annullato", - "transaction.status.wrap.canceling": "Annullamento dell'avvolgimento", - "transaction.status.wrap.failed": "Impossibile avvolgere", - "transaction.status.wrap.pending": "Avvolgimento", - "transaction.status.wrap.success": "Avvolto", - "transaction.status.wrap.successDapp": "Avvolto su {{externalDappName}}", - "transaction.submittedOn": "Inviato il", - "transaction.summary.liquidity": "{{firstAmountWithSymbol}} e {{secondAmountWithSymbol}}", - "transaction.summary.received": "Da {{tokenAmountWithSymbol}} a {{recipientAddress}}", - "transaction.summary.received.noAmount": "Ricevuto da {{name}}", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} da {{senderAddress}}", - "transaction.summary.sent.noAmount": "Inviato a {{name}}", - "transaction.warning.insufficientGas.modal.message": "Hai bisogno di ~{{tokenAmount}} {{tokenSymbol}} () su {{networkName}} per coprire i costi di rete di questa transazione. Scambia {{tokenSymbol}} da un'altra catena o acquista con la tua carta per procedere.", - "transaction.warning.insufficientGas.modal.message.noAction": "Hai bisogno di ~{{tokenAmount}} {{tokenSymbol}} () il {{networkName}} per coprire il costo di rete di questa transazione.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount": "Hai bisogno di ~{{tokenAmount}} {{tokenSymbol}} () il {{networkName}} per coprire il costo di rete di questa transazione.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount.noAction": "Per effettuare lo scambio con questo token, hai bisogno di più {{tokenSymbol}} su {{networkName}}.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "Non abbastanza {{tokenSymbol}} su {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Non abbastanza {{tokenSymbol}}", - "transaction.warning.maxNative.message": "Stai per spendere la maggior parte del saldo del tuo token di rete. Ciò potrebbe lasciare fondi insufficienti per coprire i costi futuri della rete.", - "transaction.warning.maxNative.title": "Basso saldo del token di rete", - "transaction.watcher.error.cancel": "Impossibile annullare la transazione", - "transaction.watcher.error.status": "Errore durante il controllo dello stato della transazione", - "uniswapX.aggregatesLiquidity": " aggrega fonti di liquidità per prezzi migliori e scambi senza gas.", - "uniswapX.cost": "UniswapX elimina i costi tipici delle transazioni sulla blockchain.", - "uniswapx.description": "UniswapX aggrega le fonti di liquidità per prezzi migliori e swap senza gas.", - "uniswapx.description.unsupported": "UniswapX non è al momento disponibile perché le impostazioni del tuo portafoglio intelligente sono gestite da un'app portafoglio diversa.", - "uniswapx.included": "Include UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "Scopri di più sullo scambio con UniswapX", - "uniswapx.unavailable.title": "UniswapX non è disponibile", - "uniswapx.v2QuoteFailed": "Il preventivo hard di UniswapX v2 non è riuscito. Riprova con lo scambio classico.", - "unitags.banner.button.claim": "Richiedi ora", - "unitags.banner.subtitle": "Crea un profilo web3 personalizzato e condividi facilmente il tuo indirizzo con gli amici.", - "unitags.banner.title.compact": "Richiedi il tuo nome utente {{unitagDomain}} e crea il tuo profilo personalizzabile.", - "unitags.banner.title.full": "Richiedi il tuo nome utente {{unitagDomain}}", - "unitags.choosePhoto.option.cameraRoll": "Scegli dal rullino fotografico", - "unitags.choosePhoto.option.computer": "Carica dal computer", - "unitags.choosePhoto.option.nft": "Scegli un NFT", - "unitags.choosePhoto.option.remove": "Rimuovi l'immagine del profilo", - "unitags.claim.available": "Disponibile", - "unitags.claim.confirmation.customize": "Personalizza il profilo", - "unitags.claim.confirmation.description": "{{unitagAddress}} è pronto per inviare e ricevere criptovalute. Continua ad arricchire il tuo portafoglio personalizzando il tuo profilo web3.", - "unitags.claim.confirmation.success.long": "Avete capito bene!", - "unitags.claim.confirmation.success.short": "fatto!", - "unitags.claim.error.addressLimit": "Hai già apportato il numero massimo di modifiche al tuo nome utente per questo indirizzo", - "unitags.claim.error.avatar": "Impossibile impostare l'avatar. Riprovare più tardi.", - "unitags.claim.error.default": "Impossibile rivendicare il nome utente. Riprovare più tardi.", - "unitags.claim.error.deviceLimit": "Hai raggiunto il numero massimo di nomi utente che possono essere attivi per questo dispositivo", - "unitags.claim.error.general": "Impossibile richiedere il nome utente", - "unitags.claim.error.unavailable": "questo nome utente non è disponibile", - "unitags.claim.error.unknown": "Errore sconosciuto", - "unitags.claim.username.default": "il tuo nome", - "unitags.delete.confirm.subtitle": "Stai per eliminare il tuo nome utente e i dettagli personalizzabili del profilo. Non sarai in grado di recuperarlo.", - "unitags.delete.confirm.title": "Sei sicuro?", - "unitags.editProfile.placeholder": "nome utente", - "unitags.editUsername.confirm.subtitle": "Stai per cambiare il tuo nome utente. Una volta modificato, non potrai più reclamarlo.", - "unitags.editUsername.confirm.title": "Sei sicuro?", - "unitags.editUsername.title": "Modifica il tuo nome utente", - "unitags.editUsername.warning.default": "Una volta cambiato il tuo nome utente, non potrai più reclamarlo. Puoi cambiarlo solo 2 volte.", - "unitags.editUsername.warning.max": "Hai raggiunto il numero massimo di 2 modifiche al nome utente.", - "unitags.extension.intro.buttton": "Richiedi un nome utente", - "unitags.extension.intro.description": "Dì addio agli indirizzi 0x. I nomi utente sono nomi leggibili che semplificano l'invio e la ricezione di criptovalute.", - "unitags.extension.intro.title": "Presentazione dei nomi utente", - "unitags.extension.intro.upsell.customizable": "Profili personalizzabili", - "unitags.extension.intro.upsell.ens": "Alimentato dai sottodomini ENS", - "unitags.extension.intro.upsell.free": "Libero di reclamare", - "unitags.intro.features.ens": "Alimentato dai sottodomini ENS", - "unitags.intro.features.free": "Libero di reclamare", - "unitags.intro.features.profile": "Profili personalizzabili", - "unitags.intro.subtitle": "Dì addio agli indirizzi 0x. I nomi utente sono nomi leggibili che semplificano l'invio e la ricezione di criptovalute.", - "unitags.intro.title": "Presentazione dei nomi utente", - "unitags.notification.delete.error": "Impossibile eliminare il nome utente. Riprovare più tardi.", - "unitags.notification.delete.title": "Nome utente eliminato", - "unitags.notification.profile.error": "Impossibile aggiornare il profilo. Riprovare più tardi.", - "unitags.notification.profile.title": "profilo aggiornato", - "unitags.notification.username.error": "Impossibile modificare il nome utente. Riprovare più tardi.", - "unitags.notification.username.title": "Il nome utente è cambiato", - "unitags.onboarding.claim.subtitle": "Questo è il tuo indirizzo personalizzato a cui le persone possono inviare criptovalute.", - "unitags.onboarding.claim.title.choose": "Crea il tuo nome utente", - "unitags.onboarding.claim.title.claim": "Richiedi il tuo nome utente", - "unitags.onboarding.info.description": "I nomi utente trasformano indirizzi 0x complessi in nomi leggibili. Richiedendo un nome utente {{unitagDomain}} , puoi facilmente inviare e ricevere criptovalute e creare un profilo web3 pubblico.", - "unitags.onboarding.info.title": "Un indirizzo semplificato", - "unitags.onboarding.profile.subtitle": "Carica il tuo o mantieni il tuo Unicon unico. Puoi sempre modificarlo in seguito.", - "unitags.onboarding.profile.title": "Scegli una foto del profilo", - "unitags.profile.action.delete": "Elimina nome utente", - "unitags.profile.action.edit": "Modifica nome utente", - "unitags.profile.bio.label": "Biografia", - "unitags.profile.bio.placeholder": "Digita una biografia per il tuo profilo", - "unitags.profile.links.twitter": "Cinguettio", - "unitags.username.error.chars": "I nomi utente possono contenere solo lettere e numeri", - "unitags.username.error.max": "I nomi utente non possono contenere più di {{number}} caratteri", - "unitags.username.error.min": "I nomi utente devono contenere almeno {{number}} caratteri", - "unitags.username.error.uppercase": "I nomi utente possono contenere solo lettere minuscole e numeri", - "uwulink.error.insufficientTokens": "Non abbastanza {{tokenSymbol}} su {{chain}}", - "v2.notAvailable": "Uniswap V2 non è disponibile su questa rete.", - "wallet.appSignIn": "Accedi con l'app", - "wallet.connectingAgreement": "Collegando un portafoglio, accetti i Termini di servizio di Uniswap Labs e acconsenti alla sua Informativa sulla privacy.", - "wallet.connectionFailed.message": "Tentativo di connessione fallito. Riprova seguendo i passaggi per connetterti nel tuo portafoglio.", - "wallet.mismatch.popup.description": "Alcune funzionalità non sono supportate dal tuo portafoglio connesso.", - "wallet.mismatch.popup.title": "Supporto limitato del portafoglio", - "wallet.other": "Altri portafogli", - "wallet.scanToConnect": "Scansiona il codice QR per connetterti", - "wallet.wrongNet": "Il tuo portafoglio è connesso alla rete sbagliata.", - "walletConnect.dapps.empty.description": "Connettiti a un'app scansionando un codice tramite WalletConnect", - "walletConnect.dapps.manage.empty.title": "Nessuna app connessa", - "walletConnect.dapps.manage.title": "Connessioni", - "walletConnect.error.connection.message": "Uniswap Wallet attualmente supporta {{chainNames}}. Per favore usa solo \"{{dappName}}\" su queste catene", - "walletConnect.error.connection.title": "Errore di connessione", - "walletConnect.error.general.message": "Si è verificato un problema con WalletConnect. Per favore riprova", - "walletConnect.error.general.title": "Errore WalletConnect", - "walletConnect.error.scantastic.message": "Si è verificato un problema con il tuo codice QR. Per favore riprova", - "walletConnect.error.scantastic.title": "Codice QR non valido", - "walletConnect.error.unsupported.message": "Assicurati di scansionare un codice QR valido di WalletConnect, indirizzo Ethereum o estensione Uniswap prima di riprovare.", - "walletConnect.error.unsupported.title": "Codice QR non valido", - "walletConnect.error.unsupportedV1.message": "WalletConnect v1 non è più supportato. L'applicazione a cui stai tentando di connetterti deve essere aggiornata a WalletConnect v2.", - "walletConnect.error.unsupportedV1.title": "Codice QR non valido", - "walletConnect.error.uwu.scan": "Si è verificato un problema durante la scansione di questo codice QR.", - "walletConnect.error.uwu.title": "Errore di collegamento UwU", - "walletConnect.error.uwu.unsupported": "Questo codice QR non è supportato.", - "walletConnect.pending.button.connect": "Collegare", - "walletConnect.pending.button.reject": "Rifiutare", - "walletConnect.pending.button.scrollDown": "Scorri verso il basso per connetterti", - "walletConnect.pending.threat.confirmationText": "Capisco i rischi", - "walletConnect.pending.threat.description": "La firma di messaggi o transazioni da questa app potrebbe comportare la perdita di fondi.", - "walletConnect.pending.threat.title": "App dannosa rilevata", - "walletConnect.pending.title": "Connettiti a {{dappName}}", - "walletConnect.pending.unverified.description": "Prima di procedere, assicurati che questo sito sia attendibile. ", - "walletConnect.pending.unverified.title": "App non verificata", - "walletConnect.permissions.option.requestApprovals": "Richiedi l'approvazione delle transazioni", - "walletConnect.permissions.option.transferAssets": "Move funds without permission", - "walletConnect.permissions.option.viewTokenBalances": "View your balance and activity", - "walletConnect.permissions.title": "App permissions", - "walletConnect.request.bundledTransactions.label_one": "Singola transazione in bundle", - "walletConnect.request.bundledTransactions.label_other": "{{count}} transazioni in bundle", - "walletConnect.request.button.scrollDown": "Scorri verso il basso per firmare", - "walletConnect.request.button.sign": "Cartello", - "walletConnect.request.details.label.function": "Funzione", - "walletConnect.request.details.label.sending": "Invio", - "walletConnect.request.details.label.token": "Gettone", - "walletConnect.request.details.label.tokens": "Gettoni", - "walletConnect.request.error.insufficientFunds": "Non hai abbastanza {{currencySymbol}} per completare questa transazione.", - "walletConnect.request.error.network": "Errore di connessione a Internet o alla rete", - "walletConnect.request.warning.batch.message": "Attenzione: questa richiesta contiene più transazioni e potrebbe trasferire asset", - "walletConnect.request.warning.general.message": "Attenzione: questo messaggio potrebbe trasferire beni", - "walletConnect.request.warning.message": "Per firmare messaggi o transazioni, dovrai importare la frase di recupero del portafoglio.", - "walletConnect.request.warning.title": "Questo portafoglio è in modalità di sola visualizzazione", - "web.explore.description": "Scopri e ricerca gettoni su {{network}}. Esplora le migliori piscine. Visualizza prezzi in tempo reale, volume degli scambi, TVL, grafici e dati sulle transazioni.", - "web.explore.title.pools": "Esplora le migliori piscine su {{network}} su Uniswap", - "web.explore.title.tokens": "Esplora i migliori token su {{network}} su Uniswap", - "web.explore.title.transactions": "Esplora le transazioni principali su {{network}} su Uniswap" -} diff --git a/packages/uniswap/src/i18n/locales/translations/ja-JP.json b/packages/uniswap/src/i18n/locales/translations/ja-JP.json index 2add2c812a9..507afb59570 100644 --- a/packages/uniswap/src/i18n/locales/translations/ja-JP.json +++ b/packages/uniswap/src/i18n/locales/translations/ja-JP.json @@ -30,7 +30,6 @@ "account.drawer.modal.body": "Uniswap アプリでは、トークンの保管とスワップを安全に行えます。iOS と Android でご利用いただけます。", "account.drawer.modal.dont": "Uniswap ウォレットをお持ちではありませんか?", "account.drawer.modal.scan": "Uniswap ウォレットでスキャン", - "account.drawer.spamToggle": "不明なトークンと NFT を非表示にする", "account.passkey.delete.acknowledge": "リカバリーフレーズをバックアップしましたが、私がウォレットの復元に失敗した場合でも Uniswap Labs がウォレットの復元をサポートできないことを理解しています。", "account.passkey.delete.description": "Uniswap モバイルアプリまたはブラウザ拡張機能を使用してリカバリーフレーズをバックアップしていることを確認してください。", "account.passkey.delete.descriptionEmphasized": "リカバリーフレーズがないと、ウォレットにアクセスできない可能性があります。", @@ -115,6 +114,7 @@ "account.wallet.watch.placeholder": "ENS またはアドレス", "account.wallet.watch.title": "ウォレットアドレスを入力してください", "activity.pending": "{{pendingActivityCount}} 件のアクティビティを実施中です", + "activity.recentActivity": "Recent activity", "activity.transaction.lpRewards.descriptor": "{{symbol}} リワードを回収しました", "activity.transaction.send.descriptor": "{{amountWithSymbol}} の受領者 {{walletAddress}}", "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} - 次に相当:{{amountWithSymbolB}}", @@ -144,15 +144,15 @@ "bridgedAsset.send.warning.description": "{{chainName}} 上で {{currencySymbol}} のラップドバージョンを送信しようとしています。中央集権型取引所に送信すると、資金が永久に失われます。", "bridgedAsset.send.warning.title": "送信先が互換性のあるアドレスであることを確認してください", "bridgedAsset.tdp.description": "これは {{currencySymbol}} のブリッジバージョンで、ネイティブの {{currencySymbol}} と 1 対 1 で担保されています。", - "bridgedAsset.wormhole.button": "Wormhole で続行", - "bridgedAsset.wormhole.description": "{{currencySymbol}} を {{chainName}} から {{nativeChainName}} にブリッジするには、Wormhole ポータルで続行してください。", + "bridgedAsset.wormhole.button": "Continue to {{provider}}", + "bridgedAsset.wormhole.description": "Continue to the {{provider}} portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", "bridgedAsset.wormhole.title": "{{currencySymbol}} を {{nativeChainName}} に引き出す", "bridgedAsset.wormhole.toNativeChain": "{{nativeChainName}} へ", "bridgedAsset.wormhole.withdrawToNativeChain": "{{nativeChainName}} に引き出す", "bridging.estimatedTime.minutesAndSeconds": "約 {{minutes}} 分 {{seconds}} 秒", "bridging.estimatedTime.minutesOnly": "約 {{minutes}} 分", "bridging.estimatedTime.secondsOnly": "約 {{seconds}} 秒", - "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XPL, ZEC — now available on Unichain.", "chart.candlestick": "ローソク足", "chart.error.pools": "現在のプールの履歴データを表示できません。", "chart.error.tokens": "現在のトークンの履歴データを表示できません。", @@ -257,6 +257,7 @@ "common.button.unlock": "ロックを解除", "common.button.view": "表示する", "common.button.viewDetails": "詳細を表示", + "common.button.viewMore": "View more", "common.button.yes": "はい", "common.buy.label": "購入", "common.buyAndSell": "Uniswap で売買", @@ -370,6 +371,7 @@ "common.input.noRecipient.error": "受領者を選択", "common.input.password.confirm": "パスワードを確定", "common.input.password.error.mismatch": "パスワードが一致しません", + "common.input.password.error.same": "New password must be different from current password", "common.input.password.error.weak": "このパスワードは弱すぎます", "common.input.password.new": "新規パスワード", "common.input.password.placeholder": "パスワード", @@ -503,6 +505,7 @@ "common.remove.liquidity.canceled": "流動性の削除がキャンセルされました", "common.remove.liquidity.failed": "流動性の削除に失敗しました", "common.removing.liquidity": "流動性を削除中です", + "common.reported": "Reported", "common.resetLimit": "{{symbol}} の制限をリセット", "common.resetLimitWallet": "ウォレットの {{symbol}} の制限をリセット", "common.resettingLimit": "{{symbol}} の制限をリセット中です...", @@ -532,6 +535,7 @@ "common.status": "状態", "common.step.number": "ステップ {{number}}", "common.step.number.of": "ステップ {{current}}/{{total}}", + "common.submit": "Submit", "common.swap": "スワップする", "common.swap.expired": "スワップは期限切れです", "common.swap.failed": "スワップに失敗しました", @@ -797,6 +801,7 @@ "fee.tier.create": "手数料区分を作成", "fee.tier.create.button": "新規手数料区分を作成", "fee.tier.create.description": "新規区分を作成すると、新しいプールで初期化され、通常よりもネットワークコストが高くなります。", + "fee.tier.default": "-- fee tier", "fee.tier.description": "流動性を提供することで得られる金額。リスク許容度と戦略に合った金額を選択してください。", "fee.tier.description.v2": "流動性を提供することで得られる金額。すべての v2 プールには 0.3% の固定手数料がかかります。より多くのオプションを利用するには、v4 で流動性を提供してください。", "fee.tier.dynamic": "動的手数料区分", @@ -884,9 +889,9 @@ "hero.swap.title": "いつでもどこでも
スワップできます。", "hidden.nfts.info.banner.text": "隠した NFT についてさらに詳しく", "hidden.nfts.info.text.button": "隠した NFT({{numHidden}})", - "hidden.nfts.info.text.extension": "これらは疑われる詐欺とあなたが隠した NFT です。NFT を右クリックすると非表示を解除できます。", "hidden.nfts.info.text.mobile": "これらは疑われる詐欺とあなたが隠した NFT です。NFT を長押しすると非表示を解除できます。", "hidden.nfts.info.text.title": "隠した NFT", + "hidden.nfts.info.text.web": "These are potential scams and NFTs you’ve hidden. You can click on an NFT to unhide it.", "hidden.tokens.info.banner.text": "隠しトークンについて詳しく知る", "hidden.tokens.info.text.button": "隠しトークン({{numHidden}})", "hidden.tokens.info.text.info": "これらは、疑われる詐欺、少額の残高、またはユーザーが隠したトークンです。隠しトークンはウォレットの合計残高に含まれません。", @@ -957,32 +962,16 @@ "landing.uniswapX.subtitle": "よりスマートなスワップを快適に。", "landing.walletBody": "この信頼されている自己管理型暗号ウォレットとその拡張機能は数百万件を超えるダウンロードを誇り、多くの人々から支持されて 4.8 の評価を得ています。", "landing.walletSubtitle": "スワップ、保存、探索。", - "language.afrikaans": "アフリカーンス語", - "language.arabic": "アラビア語", - "language.catalan": "カタロニア語", "language.chineseSimplified": "中国語(簡体字)", "language.chineseTraditional": "中国語(繁体字)", - "language.czech": "チェコ語", - "language.danish": "デンマーク語", "language.dutch": "オランダ語", "language.english": "英語", - "language.finnish": "フィンランド語", "language.french": "フランス語", - "language.greek": "ギリシャ語", - "language.hebrew": "ヘブライ語", - "language.hindi": "ヒンディー語", - "language.hungarian": "ハンガリー語", "language.indonesian": "インドネシア語", - "language.italian": "イタリア語", "language.japanese": "日本語", "language.korean": "韓国語", - "language.malay": "マレー語", - "language.norwegian": "ノルウェー語", - "language.polish": "ポーランド語", "language.portuguese": "ポルトガル語", - "language.romanian": "ルーマニア語", "language.russian": "ロシア語", - "language.serbian": "セルビア語", "language.spanishArgentina": "スペイン語(アルゼンチン)", "language.spanishBelize": "スペイン語(ベリーズ)", "language.spanishBolivia": "スペイン語(ボリビア)", @@ -1006,11 +995,7 @@ "language.spanishUruguay": "スペイン語(ウルグアイ)", "language.spanishUs": "スペイン語(米国)", "language.spanishVenezuela": "スペイン語(ベネズエラ)", - "language.swahili": "スワヒリ語", - "language.swedish": "スウェーデン語", "language.turkish": "トルコ語", - "language.ukrainian": "ウクライナ語", - "language.urdu": "ウルドゥー語", "language.vietnamese": "ベトナム語", "large.price.difference": "価格差が大きい", "large.price.difference.tooltip": "この取引を進めると資金を損失します。この差は、大規模取引あるいは流動性の低さにより生じたものです。", @@ -1114,7 +1099,6 @@ "notification.smartWallet.disabled.all": "スマートウォレットが無効", "notification.smartWallet.disabled.plural": "{{amount}}個のネットワークで無効", "notification.spam.NFT.failed": "NFT をレポートできませんでした。後でもう一度お試しください。", - "notification.spam.NFT.successful": "報告済み", "notification.swap.network": "{{network}} でスワップ中です", "notification.swap.pending.swap": "スワップ中です", "notification.swap.pending.unwrap": "アンラップ中です", @@ -1214,6 +1198,7 @@ "onboarding.home.intro.backup.description.mobile": "携帯電話をなくした場合や新しい携帯電話を入手した場合に備えて、復旧計画を立ててください。", "onboarding.home.intro.backup.title": "ウォレットをバックアップ", "onboarding.home.intro.bridgedAssets.description": "SOL、WIF、BONK、JUP — Unichain で利用可能になりました", + "onboarding.home.intro.bridgedAssets.description.v2": "DOGE, XRP, XPL, ZEC — now available on Unichain", "onboarding.home.intro.bridgedAssets.title": "Unichain で新しいトークンを取引", "onboarding.home.intro.fund.description": "暗号通貨を購入するか別のアカウントから転送してウォレットに資金を入金します。", "onboarding.home.intro.fund.title": "最初のトークンを取得", @@ -1438,15 +1423,18 @@ "poolFinder.availablePools.notFound.description": "一致する v2 プールが見つかりませんでした。選択したトークンを再確認し、正しいウォレットに接続されていることを確認してください。", "pools.explore": "プールを探索", "portfolio.activity.filters.timePeriod.all": "全期間", - "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", + "portfolio.activity.filters.transactionType.addLiquidity": "Added liquidity", "portfolio.activity.filters.transactionType.all": "全種類", "portfolio.activity.filters.transactionType.approvals": "Approvals", - "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", - "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.claimFees": "Claimed fees", + "portfolio.activity.filters.transactionType.createPool": "Pools created", "portfolio.activity.filters.transactionType.mints": "Mints", - "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", + "portfolio.activity.filters.transactionType.receives": "Receives", + "portfolio.activity.filters.transactionType.removeLiquidity": "Removed liquidity", + "portfolio.activity.filters.transactionType.sends": "Sends", "portfolio.activity.filters.transactionType.swaps": "スワップ", "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.search.placeholder": "Search activity", "portfolio.activity.table.column.address": "Address", "portfolio.activity.table.column.amount": "Amount", "portfolio.activity.table.column.time": "Time", @@ -1459,7 +1447,12 @@ "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", "portfolio.disconnected.demoWallet.title": "Demo wallet", "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", + "portfolio.nfts.search.placeholder": "Search your NFTs", "portfolio.nfts.title": "NFT", + "portfolio.overview.stats.averageSwapSize": "Average swap size", + "portfolio.overview.stats.swappedThisWeek": "Swapped this week", + "portfolio.overview.stats.swapsThisWeek": "Swaps this week", + "portfolio.overview.stats.totalSwapVolume": "Total swap volume", "portfolio.overview.title": "概要", "portfolio.title": "ポートフォリオ", "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", @@ -1471,6 +1464,7 @@ "portfolio.tokens.table.column.token": "トークン", "portfolio.tokens.table.column.value": "値", "portfolio.tokens.title": "トークン", + "portfolio.view": "View portfolio", "position.addHook": "フックを追加", "position.addHook.tooltip": "フックは、プールがスマートコントラクトと対話してさまざまな機能を利用できるようにする高度な機能です。フックを追加するときは注意してください。フックの中には悪意のあるものや、意図しない結果を引き起こすものもあるかもしれません。", "position.addingHook": "フックの追加", @@ -1588,6 +1582,33 @@ "qrScanner.wallet.networks": "サポートされているネットワーク", "range.outOfView": "範囲が表示されません", "removeLiquidity.pooled": "プールされた {{symbol}}:", + "reporting.activity.unhide.action": "Unhide activity", + "reporting.pool.details.title": "Don’t recognize this position?", + "reporting.token.data.options.price.subtitle": "Token price is wrong or unavailable", + "reporting.token.data.options.price.title": "Price", + "reporting.token.data.options.priceChart.subtitle": "Data is wrong or incomplete", + "reporting.token.data.options.priceChart.title": "Price chart", + "reporting.token.data.options.tokenDetails.subtitle": "Token image, description, or link issue", + "reporting.token.data.options.tokenDetails.title": "Token details", + "reporting.token.data.options.volume.subtitle": "Token volume is wrong or unavailable", + "reporting.token.data.options.volume.title": "Volume", + "reporting.token.data.title": "Data issue", + "reporting.token.options.hiddenFees.subtitle": "Token has undisclosed fees when bought/sold", + "reporting.token.options.hiddenFees.title": "Hidden fees", + "reporting.token.options.imposter.subtitle": "Token seems fraudulent or misleading", + "reporting.token.options.imposter.title": "Imposter token", + "reporting.token.options.other.title": "Something else", + "reporting.token.options.spam.subtitle": "Token appeared in wallet unexpectedly", + "reporting.token.options.spam.title": "Spam token", + "reporting.token.report.button.disabled": "Select an issue", + "reporting.token.report.other.placeholder": "Describe the issue", + "reporting.token.report.title": "Report token", + "reporting.token.report.title.withSymbol": "Report {{symbol}}", + "reporting.token.warning.button": "This warning is incorrect", + "reporting.token.warning.report.placeholder": "Add details (optional)", + "reporting.token.warning.report.submit": "Report issue", + "reporting.token.warning.report.subtitle": "Report an issue if the warning below seems wrong. We’ll take a closer look.", + "reporting.token.warning.report.title": "Report an inaccurate warning", "revoke.failed.message": "ネットワークまたは接続の問題により取り消しに失敗している可能性があります。接続を確認して、もう一度お試しください。", "routing.aggregateLiquidity": "利用可能な場合、流動性ソースを集約し、より良い価格とガス代無料のスワップを実現します。", "routing.aggregateLiquidity.uniswapx": "UniswapX は、オンチェーンおよびオフチェーンの流動性ソースを統合し、ベストな価格とガス代無料スワップを提供します。", @@ -1735,6 +1756,7 @@ "settings.setting.backup.status.inProgress": "{{cloudProviderName}} にバックアップ中です...", "settings.setting.backup.status.recoveryPhrase.backed": "バックアップしました", "settings.setting.backup.status.title": "{{cloudProviderName}} バックアップ", + "settings.setting.balancesActivity.title": "Balances and activity", "settings.setting.beta.tooltip": "まもなくリリース", "settings.setting.biometrics.appAccess.subtitle.android": "アプリを開くには顔認証/指紋認証が必要です。", "settings.setting.biometrics.appAccess.subtitle.ios": "アプリを開くには {{biometricsMethod}} が必要です。", @@ -1786,7 +1808,8 @@ "settings.setting.privacy.analytics.title": "アプリ分析", "settings.setting.privateKeys.title": "秘密鍵", "settings.setting.recoveryPhrase.title": "リカバリーフレーズ", - "settings.setting.smallBalances.title": "ポートフォリオ残高", + "settings.setting.reportedActivity.subtitle": "Transactions you’ve reported as spam will be hidden from your activity feed.", + "settings.setting.reportedActivity.title": "Hide reported activity", "settings.setting.smartWallet.action.enable": "有効にする", "settings.setting.smartWallet.action.smartWallet": "スマートウォレット", "settings.setting.smartWallet.notEligible": "利用資格がありません", @@ -2290,6 +2313,8 @@ "transaction.networkCost.label": "ネットワークコスト", "transaction.networkCost.maxNativeBalance.description": "このトランザクションのネットワークコストをカバーするために、少額のネットワークトークン残高が予約されています。", "transaction.networkCost.maxNativeBalance.title": "最大残高を利用できないのはなぜですか?", + "transaction.networkCost.presetNativeBalance.description": "You don’t have enough balance to cover both this amount and the network cost of the transaction.", + "transaction.networkCost.presetNativeBalance.title": "Why can’t I use this amount?", "transaction.networkCost.veryHigh.label": "非常に高いネットワークコスト", "transaction.notification.error.cancel": "トランザクションをキャンセルできません", "transaction.notification.error.replace": "トランザクションを置き換えできません", diff --git a/packages/uniswap/src/i18n/locales/translations/ko-KR.json b/packages/uniswap/src/i18n/locales/translations/ko-KR.json index 8e7df5d1fcf..68d1dd291cc 100644 --- a/packages/uniswap/src/i18n/locales/translations/ko-KR.json +++ b/packages/uniswap/src/i18n/locales/translations/ko-KR.json @@ -30,7 +30,6 @@ "account.drawer.modal.body": "Uniswap 앱으로 토큰을 안전하게 저장하고 스왑하세요. iOS와 Android에서 이용 가능합니다.", "account.drawer.modal.dont": "Uniswap 지갑이 없나요?", "account.drawer.modal.scan": "Uniswap Wallet으로 스캔", - "account.drawer.spamToggle": "알 수 없는 토큰 및 NFT 숨기기", "account.passkey.delete.acknowledge": "복구 문구를 백업했으며, 복구 실패 시 Uniswap Labs에서 지갑 복구를 도와줄 수 없다는 사실을 인지하고 있습니다.", "account.passkey.delete.description": "Uniswap 모바일 앱 또는 브라우저 확장 프로그램을 사용하여 복구 문구를 백업했는지 확인하세요.", "account.passkey.delete.descriptionEmphasized": "복구 문구가 없으면 지갑에 액세스하지 못할 수 있습니다.", @@ -115,6 +114,7 @@ "account.wallet.watch.placeholder": "ENS 또는 주소", "account.wallet.watch.title": "지갑 주소를 입력하세요", "activity.pending": "{{pendingActivityCount}} 대기 중", + "activity.recentActivity": "Recent activity", "activity.transaction.lpRewards.descriptor": "{{symbol}} 보상 획득", "activity.transaction.send.descriptor": "{{walletAddress}} 에게 {{amountWithSymbol}}", "activity.transaction.swap.descriptor": "{{amountWithSymbolB}} 위해 {{amountWithSymbolA}} 스왑", @@ -144,15 +144,15 @@ "bridgedAsset.send.warning.description": "현재 {{chainName}}에서 래핑된 버전의 {{currencySymbol}}을(를) 전송하고 있습니다. 이를 중앙화된 거래소로 보내면 자금이 영구적으로 손실될 수 있습니다.", "bridgedAsset.send.warning.title": "호환되는 주소로 보내고 있는지 확인하세요", "bridgedAsset.tdp.description": "이는 네이티브 {{currencySymbol}}(으)로 1:1 보장되는 {{currencySymbol}}의 브리지 버전입니다.", - "bridgedAsset.wormhole.button": "Wormhole로 계속하기", - "bridgedAsset.wormhole.description": "Wormhole 포털로 이동하여 {{chainName}}의 {{currencySymbol}}을(를) {{nativeChainName}}(으)로 브리지하는 작업을 계속하세요.", + "bridgedAsset.wormhole.button": "Continue to {{provider}}", + "bridgedAsset.wormhole.description": "Continue to the {{provider}} portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", "bridgedAsset.wormhole.title": "{{nativeChainName}}(으)로 {{currencySymbol}} 회수", "bridgedAsset.wormhole.toNativeChain": "{{nativeChainName}}(으)로", "bridgedAsset.wormhole.withdrawToNativeChain": "{{nativeChainName}}(으)로 회수", "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}분 {{seconds}}초", "bridging.estimatedTime.minutesOnly": "~{{minutes}}분", "bridging.estimatedTime.secondsOnly": "~{{seconds}}초", - "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XPL, ZEC — now available on Unichain.", "chart.candlestick": "촛대", "chart.error.pools": "현재 풀에 대한 기록 데이터를 표시할 수 없습니다.", "chart.error.tokens": "현재 토큰에 대한 기록 데이터를 표시할 수 없습니다.", @@ -257,6 +257,7 @@ "common.button.unlock": "잠금 해제", "common.button.view": "보기", "common.button.viewDetails": "세부 정보 보기", + "common.button.viewMore": "View more", "common.button.yes": "예", "common.buy.label": "구입하다", "common.buyAndSell": "Uniswap에서 구매 및 판매", @@ -370,6 +371,7 @@ "common.input.noRecipient.error": "수신자 선택", "common.input.password.confirm": "비밀번호 확인", "common.input.password.error.mismatch": "비밀번호가 일치하지 않습니다.", + "common.input.password.error.same": "New password must be different from current password", "common.input.password.error.weak": "비밀번호가 너무 취약합니다.", "common.input.password.new": "새 비밀번호", "common.input.password.placeholder": "비밀번호", @@ -503,6 +505,7 @@ "common.remove.liquidity.canceled": "유동성 제거 취소됨", "common.remove.liquidity.failed": "유동성 제거 실패", "common.removing.liquidity": "유동성 제거", + "common.reported": "Reported", "common.resetLimit": "{{symbol}} 한도 재설정", "common.resetLimitWallet": "지갑에서 {{symbol}} 한도 재설정", "common.resettingLimit": "{{symbol}} 한도 재설정 중...", @@ -532,6 +535,7 @@ "common.status": "상태", "common.step.number": "{{number}}단계", "common.step.number.of": "{{current}}/{{total}}단계", + "common.submit": "Submit", "common.swap": "스왑", "common.swap.expired": "스왑 만료됨", "common.swap.failed": "스왑 실패", @@ -797,6 +801,7 @@ "fee.tier.create": "수수료 등급 생성", "fee.tier.create.button": "새로운 수수료 등급 생성", "fee.tier.create.description": "새로운 등급을 생성하면 새로운 풀이 초기화되고 일반적인 네트워크 비용보다 더 높은 비용이 발생합니다.", + "fee.tier.default": "-- fee tier", "fee.tier.description": "유동성을 제공하는 수익 금액입니다. 위험 허용 범위와 전략에 맞는 금액을 선택하세요.", "fee.tier.description.v2": "유동성을 제공하는 수익 금액입니다. 모든 v2 풀은 0.3%의 고정 수수료가 부과됩니다. 더 많은 옵션을 원하시면 v4에서 유동성을 제공하세요.", "fee.tier.dynamic": "동적 수수료 등급", @@ -884,9 +889,9 @@ "hero.swap.title": "언제 어디서나
스왑하세요.", "hidden.nfts.info.banner.text": "숨겨진 NFT에 대해 자세히 알아보세요", "hidden.nfts.info.text.button": "숨겨진 NFT ({{numHidden}})", - "hidden.nfts.info.text.extension": "잠재적인 사기 및 숨겨진 NFT입니다. NFT를 마우스 오른쪽 버튼으로 클릭하면 숨김을 해제할 수 있습니다.", "hidden.nfts.info.text.mobile": "잠재적인 사기 및 숨겨진 NFT입니다. NFT를 길게 눌러서 숨김을 해제할 수 있습니다.", "hidden.nfts.info.text.title": "숨겨진 NFT", + "hidden.nfts.info.text.web": "These are potential scams and NFTs you’ve hidden. You can click on an NFT to unhide it.", "hidden.tokens.info.banner.text": "숨겨진 토큰에 대해 자세히 알아보세요", "hidden.tokens.info.text.button": "숨겨진 토큰 ({{numHidden}})", "hidden.tokens.info.text.info": "잠재적인 사기, 소액 잔액, 그리고 숨겨진 토큰입니다. 숨겨진 토큰은 총 지갑 잔액에 포함되지 않습니다.", @@ -957,32 +962,16 @@ "landing.uniswapX.subtitle": "더 스마트한 스왑, 원활한 거래.", "landing.walletBody": "수백만 다운로드를 기록한 신뢰받는 자가 보관형 암호화폐 지갑 및 브라우저 확장 프로그램으로, 사람이 직접 지원하며 4.8점의 평점을 자랑합니다.", "landing.walletSubtitle": "스왑하고, 보관하고, 탐색하세요.", - "language.afrikaans": "아프리칸스어", - "language.arabic": "아랍어", - "language.catalan": "카탈로니아어", "language.chineseSimplified": "중국어, 간체", "language.chineseTraditional": "중국어, 번체", - "language.czech": "체코어", - "language.danish": "덴마크어", "language.dutch": "네덜란드어", "language.english": "영어", - "language.finnish": "핀란드어", "language.french": "프랑스어", - "language.greek": "그리스어", - "language.hebrew": "히브리어", - "language.hindi": "힌디어", - "language.hungarian": "헝가리어", "language.indonesian": "인도네시아어", - "language.italian": "이탈리아어", "language.japanese": "일본어", "language.korean": "한국어", - "language.malay": "말레이어", - "language.norwegian": "노르웨이어", - "language.polish": "폴란드어", "language.portuguese": "포르투갈어", - "language.romanian": "루마니아어", "language.russian": "러시아어", - "language.serbian": "세르비아어", "language.spanishArgentina": "스페인어(아르헨티나)", "language.spanishBelize": "스페인어(벨리즈)", "language.spanishBolivia": "스페인어(볼리비아)", @@ -1006,11 +995,7 @@ "language.spanishUruguay": "스페인어(우루과이)", "language.spanishUs": "스페인어(미국)", "language.spanishVenezuela": "스페인어(베네수엘라)", - "language.swahili": "스와힐리어", - "language.swedish": "스웨덴어", "language.turkish": "터키어", - "language.ukrainian": "우크라이나어", - "language.urdu": "우르두어", "language.vietnamese": "베트남어", "large.price.difference": "큰 가격 차이", "large.price.difference.tooltip": "이 거래를 진행할 경우 자금 손실이 발생할 수 있습니다. 이러한 차이는 대규모 거래 또는 유동성이 낮은 경우에 발생할 수 있습니다.", @@ -1114,7 +1099,6 @@ "notification.smartWallet.disabled.all": "스마트 지갑이 비활성화됨", "notification.smartWallet.disabled.plural": "{{amount}}개 네트워크에서 비활성화됨", "notification.spam.NFT.failed": "NFT를 신고할 수 없습니다. 나중에 다시 시도하세요.", - "notification.spam.NFT.successful": "보고됨", "notification.swap.network": "스왑 중 {{network}}", "notification.swap.pending.swap": "스왑 보류 중", "notification.swap.pending.unwrap": "랩핑 풀기 보류 중", @@ -1214,6 +1198,7 @@ "onboarding.home.intro.backup.description.mobile": "휴대폰을 분실하거나 새 휴대폰을 구입한 경우를 대비하여 복구 계획을 설정하세요.", "onboarding.home.intro.backup.title": "지갑 백업", "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK 및 JUP — Unichain에서 지금 이용 가능", + "onboarding.home.intro.bridgedAssets.description.v2": "DOGE, XRP, XPL, ZEC — now available on Unichain", "onboarding.home.intro.bridgedAssets.title": "Unichain에서 새로운 토큰 거래하기", "onboarding.home.intro.fund.description": "암호화폐를 구매하거나 다른 계정에서 이체하여 지갑에 자금을 추가하세요.", "onboarding.home.intro.fund.title": "첫 번째 토큰 받기", @@ -1438,15 +1423,18 @@ "poolFinder.availablePools.notFound.description": "일치하는 v2 풀을 찾지 못했습니다. 토큰 선택을 다시 한번 확인하고 올바른 지갑에 연결되어 있는지 확인하세요.", "pools.explore": "풀 탐색", "portfolio.activity.filters.timePeriod.all": "누적", - "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", + "portfolio.activity.filters.transactionType.addLiquidity": "Added liquidity", "portfolio.activity.filters.transactionType.all": "모든 유형", "portfolio.activity.filters.transactionType.approvals": "Approvals", - "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", - "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.claimFees": "Claimed fees", + "portfolio.activity.filters.transactionType.createPool": "Pools created", "portfolio.activity.filters.transactionType.mints": "Mints", - "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", + "portfolio.activity.filters.transactionType.receives": "Receives", + "portfolio.activity.filters.transactionType.removeLiquidity": "Removed liquidity", + "portfolio.activity.filters.transactionType.sends": "Sends", "portfolio.activity.filters.transactionType.swaps": "스왑", "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.search.placeholder": "Search activity", "portfolio.activity.table.column.address": "Address", "portfolio.activity.table.column.amount": "Amount", "portfolio.activity.table.column.time": "Time", @@ -1459,7 +1447,12 @@ "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", "portfolio.disconnected.demoWallet.title": "Demo wallet", "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", + "portfolio.nfts.search.placeholder": "Search your NFTs", "portfolio.nfts.title": "NFT", + "portfolio.overview.stats.averageSwapSize": "Average swap size", + "portfolio.overview.stats.swappedThisWeek": "Swapped this week", + "portfolio.overview.stats.swapsThisWeek": "Swaps this week", + "portfolio.overview.stats.totalSwapVolume": "Total swap volume", "portfolio.overview.title": "개요", "portfolio.title": "포트폴리오", "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", @@ -1471,6 +1464,7 @@ "portfolio.tokens.table.column.token": "토큰", "portfolio.tokens.table.column.value": "가치", "portfolio.tokens.title": "토큰", + "portfolio.view": "View portfolio", "position.addHook": "후크 추가", "position.addHook.tooltip": "후크는 풀이 스마트 계약과 상호작용하여 다양한 기능을 잠금 해제할 수 있도록 하는 고급 기능입니다. 후크를 추가할 때는 일부는 악의적이거나 의도치 않은 결과를 초래할 수 있으므로 주의하세요.", "position.addingHook": "후크 추가", @@ -1588,6 +1582,33 @@ "qrScanner.wallet.networks": "지원 네트워크", "range.outOfView": "표시되지 않는 범위", "removeLiquidity.pooled": "풀링된 {{symbol}}:", + "reporting.activity.unhide.action": "Unhide activity", + "reporting.pool.details.title": "Don’t recognize this position?", + "reporting.token.data.options.price.subtitle": "Token price is wrong or unavailable", + "reporting.token.data.options.price.title": "Price", + "reporting.token.data.options.priceChart.subtitle": "Data is wrong or incomplete", + "reporting.token.data.options.priceChart.title": "Price chart", + "reporting.token.data.options.tokenDetails.subtitle": "Token image, description, or link issue", + "reporting.token.data.options.tokenDetails.title": "Token details", + "reporting.token.data.options.volume.subtitle": "Token volume is wrong or unavailable", + "reporting.token.data.options.volume.title": "Volume", + "reporting.token.data.title": "Data issue", + "reporting.token.options.hiddenFees.subtitle": "Token has undisclosed fees when bought/sold", + "reporting.token.options.hiddenFees.title": "Hidden fees", + "reporting.token.options.imposter.subtitle": "Token seems fraudulent or misleading", + "reporting.token.options.imposter.title": "Imposter token", + "reporting.token.options.other.title": "Something else", + "reporting.token.options.spam.subtitle": "Token appeared in wallet unexpectedly", + "reporting.token.options.spam.title": "Spam token", + "reporting.token.report.button.disabled": "Select an issue", + "reporting.token.report.other.placeholder": "Describe the issue", + "reporting.token.report.title": "Report token", + "reporting.token.report.title.withSymbol": "Report {{symbol}}", + "reporting.token.warning.button": "This warning is incorrect", + "reporting.token.warning.report.placeholder": "Add details (optional)", + "reporting.token.warning.report.submit": "Report issue", + "reporting.token.warning.report.subtitle": "Report an issue if the warning below seems wrong. We’ll take a closer look.", + "reporting.token.warning.report.title": "Report an inaccurate warning", "revoke.failed.message": "네트워크 또는 연결 문제로 인해 취소가 실패했을 수 있습니다.\n연결을 확인하고 다시 시도해 주세요.", "routing.aggregateLiquidity": "가능한 경우, 더 나은 가격과 가스 무료 스왑을 위해 유동성 소스를 집계합니다.", "routing.aggregateLiquidity.uniswapx": "UniswapX는 온체인 및 오프체인의 유동성 소스를 통합하여 최적의 가격과 가스비 무료 스왑 서비스를 제공합니다.", @@ -1735,6 +1756,7 @@ "settings.setting.backup.status.inProgress": "{{cloudProviderName}}에 백업 중...", "settings.setting.backup.status.recoveryPhrase.backed": "백업됨", "settings.setting.backup.status.title": "{{cloudProviderName}} 백업", + "settings.setting.balancesActivity.title": "Balances and activity", "settings.setting.beta.tooltip": "곧 출시 예정", "settings.setting.biometrics.appAccess.subtitle.android": "앱을 열려면 얼굴/지문 인증이 필요합니다.", "settings.setting.biometrics.appAccess.subtitle.ios": "앱을 열려면 {{biometricsMethod}}이 필요합니다.", @@ -1786,7 +1808,8 @@ "settings.setting.privacy.analytics.title": "앱 분석", "settings.setting.privateKeys.title": "프라이빗 키", "settings.setting.recoveryPhrase.title": "복구 문구", - "settings.setting.smallBalances.title": "포트폴리오 잔액", + "settings.setting.reportedActivity.subtitle": "Transactions you’ve reported as spam will be hidden from your activity feed.", + "settings.setting.reportedActivity.title": "Hide reported activity", "settings.setting.smartWallet.action.enable": "활성화", "settings.setting.smartWallet.action.smartWallet": "스마트 지갑", "settings.setting.smartWallet.notEligible": "대상 아님", @@ -2290,6 +2313,8 @@ "transaction.networkCost.label": "네트워크 비용", "transaction.networkCost.maxNativeBalance.description": "네트워크 토큰의 잔액 일부가 이 트랜잭션의 네트워크 비용으로 할당되었습니다.", "transaction.networkCost.maxNativeBalance.title": "최대 잔액을 사용할 수 없는 이유는 무엇인가요?", + "transaction.networkCost.presetNativeBalance.description": "You don’t have enough balance to cover both this amount and the network cost of the transaction.", + "transaction.networkCost.presetNativeBalance.title": "Why can’t I use this amount?", "transaction.networkCost.veryHigh.label": "네트워크 비용이 매우 높음", "transaction.notification.error.cancel": "트랜잭션을 취소할 수 없습니다.", "transaction.notification.error.replace": "트랜잭션을 대체할 수 없습니다.", diff --git a/packages/uniswap/src/i18n/locales/translations/ms-MY.json b/packages/uniswap/src/i18n/locales/translations/ms-MY.json deleted file mode 100644 index dd31542a088..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/ms-MY.json +++ /dev/null @@ -1,2563 +0,0 @@ -{ - "account.authHeader.claimReward": "Tuntut {{amount}} ganjaran", - "account.cloud.backup.subtitle": "Terdapat berbilang frasa pemulihan disandarkan ke {{cloudProviderName}}anda.", - "account.cloud.backup.title": "Pilih sandaran untuk dipulihkan", - "account.cloud.button.restore.android": "Pulihkan daripada Google Drive", - "account.cloud.button.restore.ios": "Pulihkan daripada iCloud", - "account.cloud.empty.description": "Nampaknya anda belum menyandarkan mana-mana frasa pemulihan anda ke {{cloudProviderName}}.", - "account.cloud.empty.title": "0 sandaran ditemui", - "account.cloud.error.backup.message": "Gagal mengimport sandaran kerana kekurangan kebenaran, gangguan keizinan atau disebabkan ralat awan", - "account.cloud.error.backup.title": "Ralat semasa mengimport sandaran", - "account.cloud.error.password.title": "Kata laluan tidak sah. Sila cuba lagi.", - "account.cloud.error.unavailable.button.cancel": "Bukan sekarang", - "account.cloud.error.unavailable.button.settings": "Pergi ke tetapan", - "account.cloud.error.unavailable.message.android": "Sila sahkan bahawa anda telah log masuk ke akaun Google dengan Google Drive didayakan pada peranti ini dan cuba lagi.", - "account.cloud.error.unavailable.message.ios": "Sila sahkan bahawa anda telah log masuk ke Apple ID dengan iCloud Drive didayakan pada peranti ini dan cuba lagi.", - "account.cloud.error.unavailable.title.android": "Google Drive tidak tersedia", - "account.cloud.error.unavailable.title.ios": "iCloud Drive tidak tersedia", - "account.cloud.loading.title": "Mencari sandaran...", - "account.cloud.lockout.time.hours_one": "Terlalu banyak percubaan. Cuba lagi dalam masa 1 jam.", - "account.cloud.lockout.time.hours_other": "Terlalu banyak percubaan. Cuba lagi dalam {{count}} jam.", - "account.cloud.lockout.time.minutes_one": "Terlalu banyak percubaan. Cuba lagi dalam 1 minit.", - "account.cloud.lockout.time.minutes_other": "Terlalu banyak percubaan. Cuba lagi dalam {{count}} minit.", - "account.cloud.password.input": "Masukkan kata laluan", - "account.cloud.password.recoveryPhrase": "Masukkan frasa pemulihan anda sebaliknya", - "account.cloud.password.subtitle": "Kata laluan ini diperlukan untuk memulihkan sandaran frasa pemulihan anda daripada {{cloudProviderName}}.", - "account.cloud.password.title": "Masukkan kata laluan sandaran", - "account.downloadWallet.subtitle": "Sandarkan dompet anda, berdagang semasa dalam perjalanan, dapatkan makluman harga secara langsung dan banyak lagi.", - "account.drawer.gitHash": "Git hash: ", - "account.drawer.gitVersion": "Versi: ", - "account.drawer.modal.body": "Simpan dan tukar token dengan selamat dengan apl Uniswap. Tersedia pada iOS dan Android.", - "account.drawer.modal.dont": "Tidak mempunyai dompet Uniswap?", - "account.drawer.modal.scan": "Imbas dengan Uniswap Wallet", - "account.drawer.spamToggle": "Sembunyikan token & NFT yang tidak diketahui", - "account.passkey.delete.acknowledge": "Saya telah menyandarkan frasa pemulihan saya dan memahami bahawa Uniswap Labs tidak dapat membantu saya memulihkan dompet saya jika saya gagal berbuat demikian.", - "account.passkey.delete.description": "Pastikan anda telah menyandarkan frasa pemulihan anda menggunakan apl mudah alih Uniswap atau sambungan penyemak imbas.", - "account.passkey.delete.descriptionEmphasized": "Tanpa frasa pemulihan anda, anda mungkin tidak dapat mengakses dompet anda.", - "account.passkey.delete.speedbump.description": "Sebelum meneruskan, lengkapkan langkah berikut untuk mengelakkan kehilangan akses kepada dompet anda dan semua dana.", - "account.passkey.delete.speedbump.step1": "Muat turun apl mudah alih Uniswap atau sambungan penyemak imbas", - "account.passkey.delete.speedbump.step2": "Sandarkan frasa pemulihan anda", - "account.passkey.delete.speedbump.title": "Adakah anda pasti?", - "account.passkey.delete.title": "Padamkan kunci laluan?", - "account.passkey.log.in.title": "Log masuk dengan kunci laluan", - "account.passkey.type.crossplatform": "Telefon, tablet atau kunci keselamatan", - "account.passkey.type.platform": "Pelayar atau sistem pengendalian", - "account.passkey.verify.button": "Sahkan dengan kunci laluan", - "account.passkey.verify.description": "Sebelum anda meneruskan, sila gunakan kunci laluan anda untuk mengesahkan identiti anda. Ini membantu memastikan akaun anda selamat.", - "account.passkey.verify.title": "Mula-mula, mari sahkan itu anda", - "account.portfolio.activity.canceledBelow": "Pesanan ini telah dibatalkan kerana baki anda berada di bawah jumlah input.", - "account.portfolio.activity.signLimit": "Pesanan ini tidak akan diisi kerana baki anda berada di bawah jumlah input. Tingkatkan baki anda untuk membetulkan.", - "account.recoveryPhrase.education.part1": "Frasa pemulihan (atau frasa benih) ialah set perkataan yang diperlukan untuk mengakses dompet anda, seperti kata laluan.", - "account.recoveryPhrase.education.part2": "Anda boleh masukkan frasa pemulihan anda pada peranti baharu untuk memulihkan dompet anda dan kandungannya.", - "account.recoveryPhrase.education.part3": "Tetapi, jika anda kehilangan frasa pemulihan anda, anda akan kehilangan akses ke dompet anda.", - "account.recoveryPhrase.education.part4": "Daripada menghafal frasa pemulihan anda, anda boleh menyandarkannya kepada {{cloudProviderName}} dan melindunginya dengan kata laluan.", - "account.recoveryPhrase.education.part5": "Anda juga boleh menyandarkan frasa pemulihan anda secara manual dengan menuliskannya dan menyimpannya di tempat yang selamat.", - "account.recoveryPhrase.education.part6": "Kami mengesyorkan menggunakan kedua-dua jenis sandaran, kerana jika anda kehilangan frasa pemulihan anda, anda tidak akan dapat memulihkan dompet anda.", - "account.recoveryPhrase.error.invalid": "Frasa tidak sah", - "account.recoveryPhrase.error.invalidWord": "Perkataan tidak sah: {{word}}", - "account.recoveryPhrase.error.phraseLength": "Frasa pemulihan mestilah 12-24 patah perkataan", - "account.recoveryPhrase.error.wordIsAddress": "Anda telah memasukkan alamat, bukan frasa pemulihan", - "account.recoveryPhrase.error.wrong": "Frasa pemulihan yang salah", - "account.recoveryPhrase.helpText.import": "Bagaimanakah saya mencari frasa pemulihan saya?", - "account.recoveryPhrase.helpText.restoring": "Cuba cari lagi", - "account.recoveryPhrase.input": "Taip frasa pemulihan anda", - "account.recoveryPhrase.remove.final.description": "Pastikan anda telah menulis frasa pemulihan anda atau menyandarkannya pada {{cloudProviderName}}. Anda tidak akan dapat mengakses dana anda sebaliknya.", - "account.recoveryPhrase.remove.final.title": "Anda sedang mengalih keluar frasa pemulihan", - "account.recoveryPhrase.remove.import.description": "Anda hanya boleh menyimpan satu frasa pemulihan pada satu masa. Untuk terus mengimport yang baharu, anda perlu mengalih keluar frasa pemulihan semasa anda dan sebarang dompet yang berkaitan daripada peranti ini.", - "account.recoveryPhrase.remove.initial.description": "Ini akan mengalih keluar dompet anda daripada peranti ini bersama-sama dengan frasa pemulihan anda.", - "account.recoveryPhrase.remove.initial.title": "Anda sedang mengalih keluar {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "Frasa pemulihan anda akan kekal disimpan sehingga anda memadamkan semua dompet yang tinggal.", - "account.recoveryPhrase.subtitle.import": "Frasa pemulihan anda hanya akan disimpan secara setempat pada peranti anda.", - "account.recoveryPhrase.subtitle.restoring": "Masukkan frasa pemulihan anda di bawah atau cuba cari sandaran sekali lagi.", - "account.recoveryPhrase.title.import": "Masukkan frasa pemulihan anda", - "account.recoveryPhrase.title.restoring": "Tiada sandaran ditemui", - "account.wallet.action.copy": "Salin alamat", - "account.wallet.action.manageConnections": "Urus Sambungan", - "account.wallet.action.report": "Laporkan profil", - "account.wallet.action.viewExplorer": "Lihat pada {{blockExplorerName}}", - "account.wallet.button.add": "Tambah dompet", - "account.wallet.button.addViewOnly": "Tambahkan dompet lihat sahaja", - "account.wallet.button.create": "Buat dompet baharu", - "account.wallet.button.import": "Import dompet baharu", - "account.wallet.button.manage": "Tetapan dompet", - "account.wallet.button.remove": "Keluarkan dompet", - "account.wallet.button.watch": "Tonton dompet", - "account.wallet.create.placeholder": "Dompet {{index}}", - "account.wallet.edit.label.input.placeholder": "Label dompet", - "account.wallet.header.button.disabled.title": "Sunting profil", - "account.wallet.header.button.title": "Edit label", - "account.wallet.header.viewOnly": "Dompet lihat sahaja", - "account.wallet.menu.claimUsername": "Tuntut nama pengguna", - "account.wallet.menu.copy.title": "Salin alamat dompet", - "account.wallet.menu.edit.title": "Edit label", - "account.wallet.menu.manageConnections": "Urus sambungan", - "account.wallet.menu.remove.title": "Keluarkan dompet", - "account.wallet.remove.check": "Saya menyandarkan frasa pemulihan saya dan memahami bahawa Uniswap Labs tidak dapat membantu saya memulihkan dompet saya jika saya gagal berbuat demikian.", - "account.wallet.remove.title": "Alih keluar {{name}}", - "account.wallet.remove.viewOnly": "Anda sentiasa boleh menambah kembali dompet lihat sahaja dengan memasukkan alamat dompet.", - "account.wallet.restore.new_device.description": "Oleh kerana anda menggunakan peranti baharu, anda perlu memulihkan frasa pemulihan anda atau memasukkan kata laluan sandaran awan anda untuk meneruskan.", - "account.wallet.restore.new_device.title": "Pulihkan dompet anda", - "account.wallet.restore.seed_phrase.description": "Frasa pemulihan anda tiada daripada peranti anda. Untuk memastikan anda tidak akan kehilangan akses kepada dana anda, kami memerlukan anda memulihkan dompet anda.", - "account.wallet.restore.seed_phrase.title": "Pulihkan dompet anda", - "account.wallet.select.error": "Tidak dapat memuatkan alamat", - "account.wallet.select.loading.subtitle": "Dompet anda akan dipaparkan di bawah.", - "account.wallet.select.loading.title": "Mencari dompet", - "account.wallet.select.smartWalletDisclaimer": "Secara lalai, semua dompet yang layak akan menggunakan ciri dompet pintar setelah diimport. Apakah dompet pintar?", - "account.wallet.select.title_one_one": "Satu dompet ditemui", - "account.wallet.select.title_one_other": "Pilih dompet untuk diimport", - "account.wallet.viewOnly.button": "Import dompet", - "account.wallet.viewOnly.description": "Untuk menukar, membeli, menghantar dan menerima token, anda perlu mengimport frasa pemulihan dompet ini.", - "account.wallet.viewOnly.title": "Dompet ini adalah lihat sahaja", - "account.wallet.watch.error.alreadyImported": "Alamat ini sudah diimport", - "account.wallet.watch.error.notFound": "Alamat tidak ditemui", - "account.wallet.watch.error.smartContract": "Alamat ialah kontrak pintar", - "account.wallet.watch.message": "Menambah dompet lihat sahaja membolehkan anda mencuba apl atau menjejaki dompet. Anda tidak akan dapat menukar atau menghantar dana.", - "account.wallet.watch.placeholder": "ENS atau alamat", - "account.wallet.watch.title": "Masukkan alamat dompet", - "activity.pending": "{{pendingActivityCount}} Belum selesai", - "activity.transaction.lpRewards.descriptor": "{{symbol}} ganjaran dikumpul", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} hingga {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} untuk {{amountWithSymbolB}}", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} dan {{amountWithSymbolB}}", - "addLiquidity.shareOfPool": "Bahagian kolam", - "addressInput.recipient": "Penerima", - "analytics.allow": "Benarkan analisis", - "analytics.allow.message": "Kami menggunakan data tanpa nama untuk meningkatkan pengalaman anda dengan produk Uniswap Labs.", - "appRating.button.notReally": "Tidak juga", - "appRating.description": "Beritahu kami jika anda mempunyai pengalaman yang baik dengan apl ini", - "appRating.extension.review.description": "Pilih penarafan bintang dan tinggalkan ulasan di Kedai Web Chrome.", - "appRating.extension.review.title": "Semak Sambungan Uniswap?", - "appRating.extension.title": "Menikmati Sambungan Uniswap?", - "appRating.feedback.button.send": "Hantar maklumbalas", - "appRating.feedback.description": "Beritahu kami cara kami boleh meningkatkan pengalaman anda", - "appRating.feedback.title": "Kami kesal mendengarnya.", - "appRating.mobile.title": "Menikmati Uniswap Wallet?", - "bridgedAsset.modal.button": "Teruskan bertukar", - "bridgedAsset.modal.description": "Ini ialah {{chainName}} versi {{currencySymbol}} yang disokong dan mengekalkan harga yang sama seperti asli {{currencySymbol}}.", - "bridgedAsset.modal.feature.securelyBacked": "Disokong dengan selamat", - "bridgedAsset.modal.feature.securelyBacked.description": "1:1 disokong oleh orang asli {{currencySymbol}}.", - "bridgedAsset.modal.feature.tradeSeamlessly": "Berdagang dengan lancar", - "bridgedAsset.modal.feature.tradeSeamlessly.description": "Beli dan jual {{currencySymbol}} tanpa meninggalkan Uniswap.", - "bridgedAsset.modal.feature.withdrawToNativeChain": "Tarik diri kepada {{nativeChainName}}", - "bridgedAsset.modal.feature.withdrawToNativeChain.description": "Jambatan kembali ke rangkaian asli pada bila-bila masa.", - "bridgedAsset.modal.title": "Berdagang {{currencySymbol}} pada {{chainName}}", - "bridgedAsset.send.warning.description": "Anda menghantar versi dibungkus {{currencySymbol}} pada {{chainName}}. Menghantarnya ke bursa berpusat akan mengakibatkan kehilangan dana kekal.", - "bridgedAsset.send.warning.title": "Pastikan anda menghantar ke alamat yang serasi", - "bridgedAsset.tdp.description": "Ini ialah versi ringkas {{currencySymbol}} iaitu 1:1 disokong oleh asli {{currencySymbol}}.", - "bridgedAsset.wormhole.button": "Teruskan ke Wormhole", - "bridgedAsset.wormhole.description": "Teruskan ke portal Wormhole untuk merapatkan {{currencySymbol}} anda daripada {{chainName}} kepada {{nativeChainName}}.", - "bridgedAsset.wormhole.title": "Tarik balik {{currencySymbol}} kepada {{nativeChainName}}", - "bridgedAsset.wormhole.toNativeChain": "kepada {{nativeChainName}}", - "bridgedAsset.wormhole.withdrawToNativeChain": "Tarik diri kepada {{nativeChainName}}", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "chart.candlestick": "Candlestick", - "chart.error.pools": "Tidak dapat memaparkan data sejarah untuk kumpulan semasa.", - "chart.error.tokens": "Tidak dapat memaparkan data sejarah untuk token semasa.", - "chart.line": "Carta garisan", - "chart.missingData": "Data carta tiada", - "chart.price.label.close": "tutup", - "chart.price.label.high": "tinggi", - "chart.price.label.low": "rendah", - "chart.price.label.open": "Buka", - "chart.settings.unavailable.label": "Tetapan ini tidak tersedia untuk carta semasa", - "claim.thanks": "Terima kasih kerana menjadi sebahagian daripada komuniti Uniswap ", - "claim.uni.arrived": "UNI telah tiba", - "common.about": "Tentang", - "common.accept": "Terima", - "common.active": "Aktif", - "common.activeNetworks": "Rangkaian aktif", - "common.activity": "Aktiviti", - "common.add.label": "Tambah", - "common.add.liquidity.canceled": "Tambah kecairan dibatalkan", - "common.addLiquidity": "Tambah kecairan", - "common.address": "Alamat", - "common.addressOrENS": "Alamat dompet atau nama ENS", - "common.advanced": "Maju", - "common.all": "Semua", - "common.allTime": "Setiap masa", - "common.and": "dan", - "common.app": "Aplikasi", - "common.approved": "Diluluskan", - "common.approvePending": "Kelulusan belum selesai...", - "common.approvePermitTx": "Luluskan permintaan {{indexText}}", - "common.approvePermitTx.active": "Luluskan permintaan{{indexText}} dalam dompet", - "common.approvePermitTx.explainer": "Apakah kelulusan Permit2?", - "common.approvePermitTx.pending": "Meluluskan permintaan {{indexText}}...", - "common.approveSpend": "Luluskan {{symbol}} perbelanjaan", - "common.approving": "Meluluskan", - "common.approximatelyValue": "~{{value}}", - "common.areYouSure": "Adakah anda pasti?", - "common.automatic": "Auto", - "common.availableIn": "Uniswap tersedia dalam: ", - "common.availableOnIOSAndroidChrome": "Tersedia pada iOS, Android dan Chrome", - "common.backToPositions": "Kembali ke kedudukan", - "common.bestRoute": "Laluan", - "common.bestRoute.with": "Laluan melalui {{provider}}", - "common.biometrics.generic": "Biometrik", - "common.biometrics.touchId": "Touch ID", - "common.biometrics.windowsHello": "Windows Hello", - "common.blocked.ifError": "Jika anda percaya ini adalah satu ralat, sila hantar e-mel termasuk alamat anda kepada ", - "common.blocked.reason": "Alamat ini disekat pada antara muka Uniswap Labs kerana ia dikaitkan dengan satu atau lebih aktiviti yang disekat.", - "common.blockedAddress": "Alamat disekat", - "common.blog": "Blog", - "common.bought": "Dibeli", - "common.brandAssets": "Aset jenama", - "common.button.accept": "Terima", - "common.button.back": "belakang", - "common.button.buy": "Beli", - "common.button.cancel": "Batal", - "common.button.checkin": "Daftar masuk", - "common.button.close": "tutup", - "common.button.confirm": "sahkan", - "common.button.connect": "Sambung", - "common.button.continue": "teruskan", - "common.button.copied": "disalin", - "common.button.copy": "Salinan", - "common.button.create": "Buat", - "common.button.delete": "Padam", - "common.button.disable": "Lumpuhkan", - "common.button.disabling": "Melumpuhkan", - "common.button.disconnect": "Putuskan sambungan", - "common.button.dismiss": "Tolak", - "common.button.done": "Selesai", - "common.button.edit": "Sunting", - "common.button.enable": "Dayakan", - "common.button.finish": "Selesai", - "common.button.goBack": "Pergi balik", - "common.button.later": "Mungkin kemudian", - "common.button.learn": "Ketahui lebih lanjut", - "common.button.next": "Seterusnya", - "common.button.notNow": "Bukan sekarang", - "common.button.ok": "okey", - "common.button.paste": "tampal", - "common.button.pay": "bayar", - "common.button.proceed": "Teruskan", - "common.button.receive": "terima", - "common.button.remove": "Alih keluar", - "common.button.reset": "Tetapkan semula", - "common.button.retry": "Cuba semula", - "common.button.reveal": "Dedahkan", - "common.button.review": "Semakan", - "common.button.save": "Jimat", - "common.button.scrollDown": "Tatal ke bawah", - "common.button.sell": "Jual", - "common.button.send": "Hantar", - "common.button.setup": "Sediakan", - "common.button.share": "Kongsi", - "common.button.showLess": "Tunjukkan lebih sedikit", - "common.button.showMore": "Tunjukkan lagi", - "common.button.sign": "Tanda", - "common.button.skip": "Langkau", - "common.button.swap": "Tukar", - "common.button.tryAgain": "Cuba lagi", - "common.button.understand": "saya faham", - "common.button.unlock": "Buka kunci", - "common.button.view": "Lihat", - "common.button.viewDetails": "Lihat butiran", - "common.button.yes": "ya", - "common.buy.label": "Beli", - "common.buyAndSell": "Beli dan jual di Uniswap", - "common.cancellationSubmitted": "Pembatalan diserahkan", - "common.cancellationSuccessful": "Pembatalan berjaya", - "common.cancelOrder": "Batalkan pesanan", - "common.card.error.description": "Sesuatu telah berlaku", - "common.card.error.title": "Aduh! Sesuatu telah berlaku.", - "common.careers": "Kerjaya", - "common.chain.networkCost": "{{chain}} kos rangkaian", - "common.chart": "Carta", - "common.checkNetwork": "Semak status rangkaian di sini.", - "common.chromeExtension": "Sambungan", - "common.claim.failed": "Tuntutan gagal", - "common.claimed": "Dituntut", - "common.claiming": "Menuntut", - "common.claimUnis": "Tuntut token UNI anda", - "common.clear": "Jelas", - "common.close": "tutup", - "common.closed": "tertutup", - "common.collect.button": "Kumpul", - "common.company": "Syarikat", - "common.confirm": "sahkan", - "common.confirmCancellation": "Sahkan pembatalan", - "common.confirmed": "Disahkan", - "common.confirmSend.button": "Sahkan hantar", - "common.confirmSwap": "Sahkan pertukaran dalam dompet", - "common.confirmTimedOut": "Pengesahan tamat masa. Sila cuba semula.", - "common.confirmTransfer": "Sahkan pemindahan", - "common.confirmWallet": "Sahkan dalam dompet", - "common.connect.button": "Sambung", - "common.connectAWallet.button": "Sambung dompet", - "common.connectAWallet.button.evm": "Sambungkan dompet Ethereum", - "common.connectAWallet.button.evm.switch": "Tukar dompet Ethereum", - "common.connectAWallet.button.svm": "Sambung dompet Solana", - "common.connectAWallet.button.svm.switch": "Tukar dompet Solana", - "common.connectAWallet.button.switch": "Tukar dompet", - "common.connectTo": "Sambung ke {{platform}}", - "common.connectWallet.button": "Sambung dompet", - "common.contactUs.button": "Hubungi Kami", - "common.copied": "disalin", - "common.copy.address": "Salin alamat", - "common.copy.poolId": "Salin ID kolam", - "common.copyLink.button": "Salin pautan", - "common.created.date": "Dibuat {{date}}", - "common.currency": "mata wang", - "common.currentPrice": "Harga semasa", - "common.custom": "Adat", - "common.customRange": "Julat tersuai", - "common.dataOutdated": "Data mungkin sudah lapuk", - "common.day": "hari", - "common.default": "Lalai", - "common.defaultTradeOptions": "Pilihan perdagangan lalai", - "common.deposit.toNetwork": "Deposit token ke rangkaian {{label}} .", - "common.depositing": "Mendepositkan", - "common.depositTokens": "Token deposit", - "common.detected": "Dikesan", - "common.developers": "pemaju", - "common.device": "Peranti ini", - "common.device.other": "Peranti lain", - "common.dismiss": "Tolak", - "common.docs": "Dokumen", - "common.donate": "Menderma", - "common.done": "Selesai", - "common.dontShowAgain": "Jangan tunjukkan ini lagi", - "common.download": "Muat turun", - "common.downloadAppStore": "Muat turun di App Store", - "common.downloadPlayStore": "Muat turun di Gedung Play", - "common.downloadUniswapApp": "Muat turun apl Uniswap", - "common.downloadUniswapWallet": "Muat turun Uniswap Wallet", - "common.dynamic": "Dinamik", - "common.edit.button": "Sunting", - "common.ended": "tamat", - "common.error.details": "Butiran ralat", - "common.error.general": "Sesuatu telah berlaku", - "common.error.label": "Ralat", - "common.error.request": "Maaf, ralat telah berlaku semasa memproses permintaan anda. Jika anda meminta sokongan, pastikan anda menyalin butiran ralat ini.", - "common.error.somethingWrong": "Sesuatu telah berlaku!", - "common.errorConnecting.error": "Ralat Sambungan", - "common.errorLoadingData.error": "Ralat memuatkan data", - "common.etherscan": "Etherscan", - "common.expiry": "tamat tempoh", - "common.explore": "Meneroka", - "common.explorer": "Penjelajah", - "common.exploreTokens": "Terokai token", - "common.extension": "Sambungan Uniswap", - "common.failedSwitchNetwork": "Gagal menukar rangkaian", - "common.fee": "Bayaran", - "common.fees": "Yuran", - "common.feesEarned": "Yuran yang diperolehi", - "common.feesEarnedPerBase": "{{symbolA}} setiap {{symbolB}}", - "common.for": "Untuk", - "common.free": "Percuma", - "common.fullRange": "Liputan penuh", - "common.getApp": "Dapatkan apl", - "common.getHelp.button": "Dapatkan bantuan", - "common.getStarted": "Mulakan", - "common.getSupport.button": "Dapatkan sokongan", - "common.getTheApp": "Dapatkan aplikasi", - "common.getUniswapWallet": "Dapatkan Uniswap Wallet", - "common.getUniswapWallet.mobile": "Dapatkan apl mudah alih Uniswap", - "common.governance": "Tadbir urus", - "common.happyHolidays": "Selamat Hari Raya daripada pasukan Uniswap!", - "common.help": "Tolong", - "common.helpCenter": "Pusat bantuan", - "common.hidden": "Tersembunyi", - "common.hide.button": "Sembunyi", - "common.highPrice": "Harga tinggi", - "common.includes": "Termasuk", - "common.info.label": "info", - "common.input.noRecipient.error": "Pilih penerima", - "common.input.password.confirm": "Sahkan kata laluan", - "common.input.password.error.mismatch": "Kata laluan tidak sepadan", - "common.input.password.error.weak": "Kata laluan ini terlalu lemah", - "common.input.password.new": "Kata laluan baharu", - "common.input.password.placeholder": "Kata laluan", - "common.input.password.strength.medium": "Sederhana", - "common.input.password.strength.strong": "kuat", - "common.input.password.strength.weak": "Lemah", - "common.input.search": "Cari", - "common.insufficient.funds": "Kekurangan dana", - "common.insufficientBalance.error": "Baki tidak mencukupi", - "common.insufficientFundsForNetworkFee.error": "Dana tidak mencukupi untuk menampung kos rangkaian", - "common.insufficientTokenBalance.error": "Baki {{tokenSymbol}} tidak mencukupi", - "common.insufficientTokenBalance.error.simple": "Tidak cukup {{tokenSymbol}}", - "common.invalidPair": "Pasangan tidak sah", - "common.invalidRecipient.error": "Penerima tidak sah", - "common.iOSAndroid": "iOS dan Android", - "common.language": "Bahasa", - "common.learnMoreSwap": "Ketahui lebih lanjut tentang swap", - "common.legalAndPrivacy": "Undang-undang & Privasi", - "common.less": "Kurang", - "common.limit.cancel_one": "Batalkan had", - "common.limit.cancel_other": "Batalkan {{count}} had", - "common.limit.canceled": "Had dibatalkan", - "common.limit.executed": "Had dilaksanakan", - "common.limit.expired": "Had tamat tempoh", - "common.limit.failed": "Had gagal", - "common.limit.opened": "Had dibuka", - "common.limit.pending": "Had belum selesai", - "common.limits": "had", - "common.limits.approachMax": "Menghampiri had maksimum 100", - "common.limits.cancelProceed": "Batalkan had untuk meneruskan", - "common.limits.expires": "Tamat tempoh {{timestamp}}", - "common.limits.open": "Had terbuka", - "common.limits.when": "apabila {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "Pautan", - "common.liquidity": "Kecairan", - "common.liquidity.provision": "Peruntukan Kecairan", - "common.liquidity.removed": "Kecairan dikeluarkan", - "common.loading": "Memuatkan", - "common.longText.button.less": "Kurangkan membaca", - "common.longText.button.more": "Baca lagi", - "common.lowPrice": "Harga rendah", - "common.manage": "Mengurus", - "common.market.label": "Pasaran", - "common.marketPrice": "Harga pasaran", - "common.marketPrice.fetching": "Mengambil harga pasaran...", - "common.marketPrice.label": "Harga pasaran:", - "common.marketPrice.unavailable": "Harga pasaran tidak ditemui. Sila buat kajian sendiri untuk mengelakkan kehilangan dana.", - "common.max": "Maks", - "common.message": "Mesej", - "common.migrate": "Berhijrah", - "common.migrate.liquidity.failed": "Kecairan berhijrah gagal", - "common.migrate.position": "Berhijrah kedudukan", - "common.migrated.liquidity": "Kecairan berhijrah", - "common.migrating.liquidity": "Menghijrahkan kecairan", - "common.min": "Min", - "common.more": "Lagi", - "common.moreDetails": "Butiran lanjut", - "common.navigation.settings": "tetapan", - "common.navigation.systemSettings": "tetapan", - "common.navigationButton": "Butang navigasi", - "common.needHelp": "Perlukan bantuan?", - "common.networkCost": "Kos rangkaian", - "common.neverMind": "Tidak mengapa", - "common.new": "baru", - "common.new.exclamation": "Baru!", - "common.nft": "NFT", - "common.nfts": "NFT", - "common.noAmount.error": "Masukkan jumlah", - "common.noData": "Tiada data", - "common.none": "tiada", - "common.noResults": "Tiada keputusan dijumpai.", - "common.notAvailableInRegion.error": "Tidak tersedia di wilayah anda", - "common.notCreated.label": "Tidak dicipta", - "common.notSupported": "Tidak disokong", - "common.oneDay": "1 hari", - "common.oneDay.short": "1D", - "common.oneHour.short": "1H", - "common.oneMonth": "1 bulan", - "common.oneWeek": "1 minggu", - "common.oneYear": "1 tahun", - "common.opensea.link": "Lihat di OpenSea", - "common.orderCanceled": "Pesanan dibatalkan", - "common.orderExecuted": "Perintah dilaksanakan", - "common.orderExpired": "Pesanan tamat tempoh", - "common.orderPending": "Pesanan belum selesai", - "common.outOfRange": "Luar kawasan", - "common.pageNotFound": "Laman tidak dijumpai!", - "common.passkey.count": "Kunci laluan {{number}}", - "common.passkeys": "Kunci laluan", - "common.passkeys.add": "Tambah kunci laluan", - "common.passkeys.add.description": "Pilih tempat untuk menyimpan kunci laluan baharu anda.", - "common.pastDay": "hari lepas", - "common.pastFiveMinutes": "Lima minit lepas", - "common.pastHour": "jam lepas", - "common.pastMonth": "bulan lepas", - "common.pastWeek": "Minggu lepas", - "common.pastYear": "Tahun lepas", - "common.pending": "Yang belum selesai", - "common.pending.cancellation": "Menunggu pembatalan", - "common.pendingEllipsis": "Yang belum selesai...", - "common.permit": "izin", - "common.plusMore": "+{{number}} lagi", - "common.pool": "Kolam", - "common.pools": "kolam", - "common.portfolio": "Portfolio", - "common.poweredBy": "Dikuasakan oleh ", - "common.price": "harga", - "common.priceUpdated": "Harga dikemas kini", - "common.privacyChoices": "Pilihan Privasi Anda", - "common.privacyChoices.checkbox.description": "Apabila disemak, kami tidak akan berkongsi data anda dengan rakan kongsi pihak ketiga untuk pengiklanan yang diperibadikan. Anda boleh mendayakan perkongsian pada bila-bila masa dengan menyahtanda kotak ini.", - "common.privacyChoices.checkbox.label": "Jangan kongsi maklumat saya", - "common.privacyChoices.description": "Kami mungkin berkongsi pengecam peranti dengan rakan kongsi pengiklanan kami untuk mempromosikan perkhidmatan kami di tapak web dan platform lain. Jika ini layak sebagai penjualan, perkongsian atau pengiklanan disasarkan di bawah undang-undang yang berkenaan, anda boleh menarik diri dengan menandai kotak \"jangan kongsi maklumat saya\". Untuk mendapatkan maklumat lanjut tentang amalan privasi kami, sila semak Dasar Privasikami.", - "common.privacyChoices.disclaimer": "Sila ambil perhatian bahawa pilihan anda hanya akan digunakan pada penyemak imbas ini pada peranti ini. Anda juga boleh menarik diri dengan mendayakan tetapan Kawalan Privasi Global dalam penyemak imbas yang anda gunakan untuk mengakses perkhidmatan kami. Untuk melihat lebih banyak pilihan, pergi ke tetapan anda.", - "common.privacyPolicy": "Dasar Privasi", - "common.proceed": "Teruskan", - "common.proceedInWallet": "Teruskan dalam dompet anda", - "common.products": "Produk", - "common.protocol": "Protokol", - "common.protocol.v2": "Uniswap v2", - "common.protocol.v3": "Uniswap v3", - "common.protocol.v4": "Uniswap v4", - "common.purchased": "Dibeli", - "common.rate": "Kadar", - "common.readMore": "Baca lagi", - "common.receive": "terima", - "common.received": "Menerima", - "common.recent": "Baru-baru ini", - "common.refresh": "Segarkan semula", - "common.reload.label": "Muat semula apl", - "common.remove.label": "Alih keluar", - "common.remove.liquidity.canceled": "Alih keluar kecairan dibatalkan", - "common.remove.liquidity.failed": "Gagal mengalih keluar kecairan", - "common.removing.liquidity": "Mengeluarkan kecairan", - "common.resetLimit": "Tetapkan semula had {{symbol}}", - "common.resetLimitWallet": "Tetapkan semula had {{symbol}} dalam dompet", - "common.resettingLimit": "Menetapkan semula had {{symbol}} ...", - "common.revoke.approval.failed": "Gagal membatalkan kelulusan", - "common.revoked.approval": "Dibatalkan kelulusan", - "common.revoking.approval": "Membatalkan kelulusan", - "common.scanQRDownload": "Imbas kod QR dengan telefon anda untuk memuat turun", - "common.selectRegion.label": "Pilih wilayah anda", - "common.selectToken.label": "Pilih token", - "common.sell.label": "Jual", - "common.send.button": "Hantar", - "common.send.failed": "Hantar gagal", - "common.sending": "Menghantar", - "common.sent": "Dihantar", - "common.settings": "tetapan", - "common.share": "Kongsi", - "common.share.shareToTwitter": "Kongsi ke Twitter", - "common.show.button": "Tunjukkan", - "common.showLess.button": "Tunjukkan lebih sedikit", - "common.showMore.button": "Tunjukkan lagi", - "common.signatureExpired": "Tandatangan anda telah tamat tempoh.", - "common.signMessage": "Tandatangan mesej", - "common.signMessageWallet": "Log masuk mesej dalam dompet", - "common.socials": "sosial", - "common.sold": "terjual", - "common.stats": "Statistik", - "common.status": "Status", - "common.step.number": "Langkah {{number}}", - "common.step.number.of": "Langkah {{current}} daripada {{total}}", - "common.swap": "Tukar", - "common.swap.expired": "Swap tamat tempoh", - "common.swap.failed": "Pertukaran gagal", - "common.swapPending": "Swap belum selesai...", - "common.termsOfService": "Syarat Perkhidmatan", - "common.text.connected": "Bersambung", - "common.text.contract": "Kontrak", - "common.text.disconnected": "Terputus sambungan", - "common.text.error": "Ralat", - "common.text.notAvailable": "T/A", - "common.text.recipient": "Kepada", - "common.text.sender": "daripada", - "common.text.unknown": "Tidak diketahui", - "common.thisAccount": "akaun ini", - "common.thisMonth": "Bulan ini", - "common.thisToken": "Token ini", - "common.thisWeek": "Minggu ini", - "common.thisYear": "Tahun ini", - "common.time": "Masa", - "common.time.minute.amt": "{{time}}m", - "common.time.minutes": "minit", - "common.time.past.days": "{{days}} hari", - "common.time.past.days.short": "{{days}}d", - "common.time.past.hours": "{{hours}} jam", - "common.time.past.hours.short": "{{hours}}h", - "common.time.past.minutes.short": "{{minutes}}m", - "common.time.past.months.short": "{{months}}mo", - "common.time.past.seconds.short": "{{seconds}}s", - "common.to": "kepada", - "common.today": "Hari ini", - "common.tokenA": "Token A", - "common.tokenAmount": "Jumlah token", - "common.tokenB": "Token B", - "common.tokenName": "Nama token", - "common.tokens": "Token", - "common.totalUniswapTVL": "Jumlah Uniswap TVL", - "common.totalValueLocked": "TVL", - "common.trade": "Berdagang", - "common.trademarkPolicy": "Dasar Tanda Dagangan", - "common.transactionDetails": "Butiran transaksi", - "common.transactionId": "ID Transaksi", - "common.transactionPending": "Urus niaga belum selesai", - "common.transactions": "Transaksi", - "common.transactionSettings": "Tetapan Transaksi", - "common.transfer_one": "pemindahan", - "common.transfer_other": "pemindahan", - "common.tryAgain.error": "Cuba lagi", - "common.twitter": "Twitter", - "common.type.label": "taip", - "common.unavailable": "Tidak ada", - "common.unhide": "Nyahsembunyikan", - "common.unichain": "Unichain", - "common.uniswapMobile": "Uniswap Mudah Alih", - "common.uniswapWallet": "Dompet uniswap", - "common.uniswapX": "UniswapX", - "common.unknown": "Tidak diketahui", - "common.unknownError.error": "Ralat tidak diketahui", - "common.unwrap.button": "Buka bungkus", - "common.unwrap.failed": "Gagal membuka balutan", - "common.unwrapped": "Dibuka", - "common.unwrapping": "Membuka balutan", - "common.view.profile": "Lihat profil", - "common.viewOnExplorer": "Lihat pada Explorer", - "common.volume": "Kelantangan", - "common.vote": "Undi", - "common.wallet.approve": "Luluskan dalam dompet", - "common.wallet.label": "Dompet", - "common.warning": "Amaran", - "common.webApp": "Apl web", - "common.website": "laman web", - "common.whyApprove": "Mengapa saya perlu meluluskan token?", - "common.whySign": "Mengapa tandatangan diperlukan?", - "common.whyWrap": "Mengapa saya perlu membalut {{symbol}}saya?", - "common.withdraw": "tarik diri", - "common.withdrawal.amount": "Jumlah pengeluaran", - "common.withinRange": "Dalam julat", - "common.wrap": "Balut {{symbol}}", - "common.wrap.failed": "Balut gagal", - "common.wrapIn": "Balut {{symbol}} dalam dompet", - "common.wrapped": "berbalut", - "common.wrapping": "Membungkus", - "common.wrappingToken": "Membungkus {{symbol}}...", - "common.yesterday": "Semalam", - "common.your.account.had.insufficient.funds": "Akaun anda tidak mempunyai dana yang mencukupi untuk menyelesaikan pertukaran ini.", - "common.your.account.has.insufficient.funds": "Akaun anda tidak mempunyai dana yang mencukupi untuk menyelesaikan pertukaran ini.", - "common.your.connected.wallet": "Dompet anda yang disambungkan", - "common.your.limit.could.not.be.fulfilled": "Had anda tidak dapat dipenuhi pada masa ini. Sila cuba lagi.", - "common.your.swap.could.not.be.fulfilled": "Pertukaran anda tidak dapat dipenuhi pada masa ini. Sila cuba lagi.", - "common.youreBuying": "Awak beli", - "common.youReceive": "awak terima", - "common.youreSelling": "Awak jual", - "currency.ars": "Peso Argentina", - "currency.aud": "Dolar Australia", - "currency.brl": "Real Brazil", - "currency.cad": "Dolar Kanada", - "currency.cny": "Yuan Cina", - "currency.cop": "Peso Colombia", - "currency.eur": "Euro", - "currency.gbp": "Paun British", - "currency.hkd": "Dolar Hong Kong", - "currency.idr": "Rupiah Indonesia", - "currency.inr": "Rupee India", - "currency.jpy": "Yen Jepun", - "currency.krw": "Won Korea Selatan", - "currency.mxn": "Peso Mexico", - "currency.ngn": "Naira Nigeria", - "currency.pkr": "Rupee Pakistan", - "currency.rub": "Ruble Rusia", - "currency.sgd": "Dolar Singapura", - "currency.try": "Lira Turki", - "currency.uah": "Hryvnia Ukraine", - "currency.usd": "Dolar Amerika Syarikat", - "currency.vnd": "Dong Vietnam", - "dapp.request.actionCannotBeCompleted.description": "Sesetengah fungsi tidak tersedia kerana tetapan dompet pintar anda diurus oleh apl dompet yang berbeza.", - "dapp.request.actionCannotBeCompleted.header": "Permintaan tandatangan", - "dapp.request.actionCannotBeCompleted.title": "Tindakan tidak dapat diselesaikan", - "dapp.request.approve.action": "Terima", - "dapp.request.approve.fallbackTitle": "Luluskan token perbelanjaan", - "dapp.request.approve.helptext": "Benarkan tapak ini mengakses dan membelanjakan token ini daripada dompet anda.", - "dapp.request.approve.label": "Dompet", - "dapp.request.approve.title": "Luluskan perbelanjaan {{tokenSymbol}}", - "dapp.request.base.title": "Permintaan transaksi", - "dapp.request.bridge.description": "Alihkan ETH, USDC dan banyak lagi merentasi {{numChains}}+ rangkaian.", - "dapp.request.bridge.title": "Cuba untuk jambatan?", - "dapp.request.connect.helptext": "Benarkan tapak ini melihat alamat dompet anda, baki dan meminta kelulusan untuk transaksi.", - "dapp.request.connect.title": "Sambung ke tapak", - "dapp.request.fallback.calldata.label": "Data mentah", - "dapp.request.fallback.function.label": "Fungsi", - "dapp.request.permit2.description": "Permit2 menguruskan kelulusan token merentas berbilang dapps.", - "dapp.request.permit2.header": "Tandatangan Permit2", - "dapp.request.permit2approve.action": "Terima", - "dapp.request.permit2approve.helptext": "Permit2 menguruskan kelulusan token merentas berbilang dapps.", - "dapp.request.permit2approve.title": "Meluluskan Permit2", - "dapp.request.reject.action": "Tolak semua", - "dapp.request.reject.info": "Anda mempunyai {{totalRequestCount}} permintaan transaksi", - "dapp.request.revoke.action": "Membatalkan", - "dapp.request.revoke.helptext": "Benarkan tapak ini membatalkan akses untuk membelanjakan token ini untuk transaksi. Pastikan anda mempercayai tapak ini.", - "dapp.request.revoke.title": "Batalkan akses kepada {{tokenSymbol}}", - "dapp.request.signature.containsUnrenderableCharacters": "Mesej ini mengandungi aksara yang tidak boleh dipaparkan. Pastikan anda mempercayai tapak ini.", - "dapp.request.signature.decodeError": "Gagal menyahkod mesej", - "dapp.request.signature.header": "Permintaan tandatangan", - "dapp.request.signature.irregular": "Permintaan tandatangan tidak teratur", - "dapp.request.signature.irregular.description": "Pastikan anda mempercayai tapak ini sebelum meneruskan", - "dapp.request.signature.irregular.understand": "Saya faham risikonya", - "dapp.request.signature.toggleDataView.raw": "Lihat data mentah", - "dapp.request.signature.toggleDataView.readable": "Lihat data asal", - "dapp.request.warning.notActive.message": "Pastikan ia betul", - "dapp.request.warning.notActive.title": "Ini bukan dompet aktif anda", - "delegation.upgradeModal.description": "Kemas kini dompet ini menggunakan kontrak pintar untuk transaksi yang lebih pantas dan kos lebih rendah. Ketahui lebih lanjut", - "delegation.upgradeModal.enableSmartWallet": "Dayakan dompet pintar", - "delegation.upgradeModal.title": "Swap yang lebih bijak, kos yang lebih rendah", - "downloadApp.modal.connectExistingWallet": "Sambungkan dompet sedia ada", - "downloadApp.modal.getStarted.description": "Dapatkan akses kepada beribu-ribu token serta-merta melalui pasaran onchain terbesar di dunia.", - "downloadApp.modal.getStarted.title": "Mula bertukar dalam beberapa saat", - "downloadApp.modal.getTheApp.title": "Mulakan dengan Uniswap", - "downloadApp.modal.uniswapProducts.subtitle": "Produk Uniswap berfungsi dengan lancar bersama-sama untuk mencipta pengalaman onchain yang terbaik.", - "empty.swap.button.text": "Tambah dana untuk bertukar", - "error.dataUnavailable": "Data tidak tersedia pada masa ini; kami sedang berusaha untuk membaiki", - "error.id": "ID ralat: {{eventId}}", - "error.jupiterApi.execute.default.title": "Sesuatu telah berlaku dengan Jupiter API. Sila cuba lagi.", - "error.jupiterApi.failedToLand": "(Kod {{code}}: Transaksi gagal mendarat di rangkaian)", - "error.jupiterApi.invalidBlockHeight": "(Kod -1004: Ketinggian blok tidak sah)", - "error.jupiterApi.invalidMessageBytes": "(Kod -3: Bait mesej tidak sah)", - "error.jupiterApi.invalidPayload": "(Kod -2002: Muatan tidak sah)", - "error.jupiterApi.invalidSignedTransaction": "(Kod -2: Transaksi yang ditandatangani tidak sah)", - "error.jupiterApi.invalidTransaction": "(Kod -1002: Transaksi tidak sah)", - "error.jupiterApi.missingCachedOrder": "(Kod -1: Pesanan cache tiada)", - "error.jupiterApi.notFullySigned": "(Kod -1003: Transaksi tidak ditandatangani sepenuhnya)", - "error.jupiterApi.quoteExpired": "Petikan ini tamat masa, sila cuba lagi. (Kod -2003)", - "error.jupiterApi.unknownErrorCode": "(Kod {{code}})", - "error.noData": "Tiada data dijumpai", - "error.request.provideId": "Maaf, ralat telah berlaku semasa memproses permintaan anda. Jika anda meminta sokongan, pastikan anda memberikan ID ralat anda.", - "error.tokenApproval": "Kelulusan token gagal", - "error.tokenApproval.message": "Isu rangkaian atau sambungan berkemungkinan menyebabkan kelulusan anda gagal. Semak sambungan anda dan cuba lagi.", - "error.tokenApprovalEdited": "Jumlah kelulusan yang tidak mencukupi", - "error.tokenApprovalEdited.message": "Amaun kelulusan yang ditetapkan dalam dompet anda terlalu rendah untuk menyelesaikan transaksi ini. Sila cuba lagi dan tingkatkan jumlahnya.", - "errors.crash.message": "Sesuatu terhempas.", - "errors.crash.restart": "Mulakan semula apl", - "errors.crash.title": "Eh oh!", - "explore.more.pools": "Terokai lebih banyak kolam", - "explore.more.unichain": "Terokai kolam Unichain", - "explore.search.label.ownedBy": "Dimiliki oleh {{ownerAddress}}", - "explore.search.placeholder": "Cari token dan dompet", - "explore.search.section.nft": "Koleksi NFT", - "explore.search.section.popularNFT": "Koleksi NFT popular", - "explore.search.section.wallets": "Dompet", - "explore.tokens.error": "Tidak dapat memuatkan token", - "explore.tokens.favorite.action.add": "Token kegemaran", - "explore.tokens.favorite.action.edit": "Edit kegemaran", - "explore.tokens.favorite.action.remove": "Alih keluar kegemaran", - "explore.tokens.favorite.title.default": "Token kegemaran", - "explore.tokens.favorite.title.edit": "Edit token kegemaran", - "explore.tokens.metadata.marketCap": "{{number}} MCap", - "explore.tokens.metadata.totalValueLocked": "{{number}} TVL", - "explore.tokens.metadata.volume": "{{number}} Jld", - "explore.tokens.sort.label.marketCap": "Modal pasaran", - "explore.tokens.sort.label.priceDecrease": "Penurunan harga", - "explore.tokens.sort.label.priceIncrease": "Kenaikan harga", - "explore.tokens.sort.label.totalValueLocked": "TVL", - "explore.tokens.sort.label.volume": "Kelantangan", - "explore.tokens.sort.option.marketCap": "Modal pasaran", - "explore.tokens.sort.option.priceDecrease": "Penurunan harga (24J)", - "explore.tokens.sort.option.priceIncrease": "Kenaikan harga (24J)", - "explore.tokens.sort.option.totalValueLocked": "Uniswap TVL", - "explore.tokens.sort.option.volume": "Kelantangan uniswap (24J)", - "explore.tokens.top.title": "Token teratas", - "explore.v2TVL": "v2 TVL", - "explore.v3TVL": "v3 TVL", - "explore.v4TVL": "v4 TVL", - "explore.wallets.favorite.action.add": "Dompet kegemaran", - "explore.wallets.favorite.action.edit": "Edit kegemaran", - "explore.wallets.favorite.action.remove": "Alih keluar kegemaran", - "explore.wallets.favorite.action.remove.short": "Tidak digemari", - "explore.wallets.favorite.title.default": "Dompet kegemaran", - "explore.wallets.favorite.title.edit": "Edit dompet kegemaran", - "extension.connection.network": "Rangkaian", - "extension.connection.networks": "Rangkaian", - "extension.connection.popup.trouble": "Masalah menyambung?", - "extension.connection.titleConnected": "Bersambung", - "extension.connection.titleNotConnected": "Tidak bersambung", - "extension.lock.button.forgot": "lupa kata laluan?", - "extension.lock.button.reset": "Tetapkan semula dompet", - "extension.lock.button.submit": "Buka kunci", - "extension.lock.password.error": "Salah kata laluan. Cuba lagi", - "extension.lock.password.reset.initial.description": "Uniswap tidak dapat membantu memulihkan kata laluan anda. Anda perlu menetapkan semula dompet anda dengan memasukkan semula frasa pemulihan 12 perkataan anda.", - "extension.lock.password.reset.initial.help": "Di manakah saya boleh mencari frasa pemulihan saya?", - "extension.lock.password.reset.initial.title": "lupa kata laluan", - "extension.lock.password.reset.speedbump.description": "Pastikan anda mempunyai frasa pemulihan 12 perkataan anda sebelum anda menetapkan semula dompet anda. Jika tidak, anda tidak akan dapat mendapatkan semula dana anda.", - "extension.lock.password.reset.speedbump.help": "Saya kehilangan frasa pemulihan saya", - "extension.lock.password.reset.speedbump.title": "Sebelum anda meneruskan", - "extension.lock.subtitle": "Masukkan kata laluan anda untuk membuka kunci", - "extension.lock.title": "Selamat kembali", - "extension.network.notSupported": "Rangkaian tidak disokong", - "extension.open": "Buka Sambungan Uniswap", - "extension.passwordPrompt.error.wrongPassword": "Salah kata laluan. Cuba lagi", - "extension.passwordPrompt.title": "Masukkan kata laluan anda", - "extension.popup.chrome.button": "Buka sambungan", - "extension.popup.chrome.description": "Lengkapkan tindakan ini dengan membuka sambungan Uniswap.", - "extension.popup.chrome.title": "Teruskan dalam Uniswap", - "extension.settings.defaultWallet.message": "Utamakan Sambungan Uniswap apabila menyambung ke apl.", - "extension.settings.defaultWallet.title": "Buat dompet lalai", - "extension.uninstall.reason.missingFeatures": "Uniswap Wallet tidak mempunyai ciri tertentu", - "extension.uninstall.reason.notUsingCrypto": "Saya tidak lagi mahu menggunakan crypto", - "extension.uninstall.reason.other": "Sebab lain", - "extension.uninstall.reason.switchingWallet": "Saya beralih kepada dompet lain", - "extension.uninstall.subtitle": "Jika anda mempunyai sedikit masa, kami ingin mendengar sebab anda menyahpasang Uniswap Wallet", - "extension.uninstall.title": "Kami sedih melihat anda pergi", - "extension.warning.storage.button": "sandarkan", - "extension.warning.storage.message": "Pastikan anda menyandarkan frasa pemulihan anda untuk mengelakkan kehilangan akses kepada dompet dan dana anda.", - "extension.warning.storage.title": "Penyemak imbas anda kehabisan storan", - "extensionPasskeyLogInPopUp.description": "Import akaun Uniswap anda dengan log masuk menggunakan kunci laluan sedia ada.", - "extensionPasskeyLogInPopUp.invalidReferrer": "Sila tutup halaman ini dan cuba lagi.", - "fee.bestForCustomizability": "Terbaik untuk kebolehsesuaian.", - "fee.bestForExotic": "Terbaik untuk pasangan eksotik.", - "fee.bestForMost": "Terbaik untuk kebanyakan pasangan.", - "fee.bestForStablePairs": "Terbaik untuk pasangan yang stabil.", - "fee.bestForVeryStable": "Terbaik untuk pasangan yang sangat stabil.", - "fee.dynamic": "Yuran dinamik", - "fee.percentEarned": "% yang anda akan perolehi dalam yuran.", - "fee.selectPercent": "{{pct}}% pilih", - "fee.selectPercentDescription": "{{pct}}% kecairan memilih peringkat ini", - "fee.tier": "Peringkat yuran", - "fee.tier.create": "Buat peringkat yuran", - "fee.tier.create.button": "Buat peringkat yuran baharu", - "fee.tier.create.description": "Mencipta peringkat baharu akan dimulakan dalam kumpulan baharu dan menghasilkan kos rangkaian yang lebih tinggi daripada biasa.", - "fee.tier.description": "Jumlah yang diperoleh menyediakan kecairan. Pilih jumlah yang sesuai dengan toleransi risiko dan strategi anda.", - "fee.tier.description.v2": "Jumlah yang diperoleh menyediakan kecairan. Semua kolam v2 mempunyai yuran tetap 0.3%. Untuk lebih banyak pilihan, sediakan kecairan pada v4.", - "fee.tier.dynamic": "Peringkat yuran dinamik", - "fee.tier.dynamic.create": "Mencipta peringkat yuran dinamik", - "fee.tier.dynamic.create.info": "Anda akan membuat kolam dengan peringkat yuran dinamik. Sebelum meneruskan, sila pastikan cangkuk yang dipilih menyokong yuran dinamik.", - "fee.tier.highestTvl": "TVL tertinggi", - "fee.tier.label": "% yang anda akan perolehi dalam yuran", - "fee.tier.missing.description": "Tidak menemui peringkat yang anda cari?", - "fee.tier.new": "Peringkat baharu", - "fee.tier.percent.select": "{{percentage}} pilih", - "fee.tier.recommended.description": "Disyorkan berdasarkan mempunyai bahagian kecairan tertinggi untuk pasangan token yang dipilih.", - "fee.tier.search": "Cari atau buat peringkat yuran lain", - "fee.tier.search.short": "Cari peringkat", - "fee.tier.select": "Pilih peringkat yuran", - "fee.tier.select.existing.button": "Pilih peringkat yuran sedia ada", - "fee.tierExact": "{{fee}} peringkat yuran", - "fee.unavailable": "Yuran yang diperoleh tidak kelihatan untuk kedudukan v2 sehingga kecairan dikeluarkan.", - "fee.uncollected": "Termasuk yuran yang tidak dikutip:", - "fee.uniswap": "Yuran ({{percent}})", - "fee.uniswap.description": "Yuran dikenakan untuk memastikan pengalaman terbaik dengan Uniswap.", - "fiatOffRamp.checkout.title": "Menarik diri ke", - "fiatOffRamp.connection.quote": "Menjual {{amount}} bernilai {{currencySymbol}}", - "fiatOffRamp.error.balance": "Melebihi keseimbangan", - "fiatOffRamp.error.populateSend.description": "Sila tunggu sebentar dan cuba lagi.", - "fiatOffRamp.error.populateSend.title": "Tidak dapat memuatkan transaksi", - "fiatOffRamp.summary.total": "{{cryptoAmount}} untuk {{fiatAmount}}", - "fiatOffRamp.unsupportedToken.back": "Pergi balik", - "fiatOffRamp.unsupportedToken.divider": "Token yang tidak disokong", - "fiatOffRamp.unsupportedToken.message": "Token ini tidak disokong untuk dijual. Tukar aset ini kepada salah satu token yang disokong.", - "fiatOffRamp.unsupportedToken.swap": "Tukar kepada token yang disokong", - "fiatOffRamp.unsupportedToken.title": "Token tidak disokong", - "fiatOffRamp.welcome.tooltip": "Jual kripto anda ke akaun bank atau kad debit anda.", - "fiatOnRamp.button.chooseToken": "Pilih token", - "fiatOnRamp.buy.info.description": "Anda memerlukannya untuk membayar kos rangkaian semasa bertukar.", - "fiatOnRamp.buy.info.title": "Mulakan dengan ETH", - "fiatOnRamp.cexTransferModal.description": "Membeli kripto dengan kad tidak disokong di rantau anda. Pindahkan aset daripada akaun pertukaran berpusat untuk membiayai dompet anda.", - "fiatOnRamp.cexTransferModal.title": "Pemindahan untuk bermula", - "fiatOnRamp.checkout.title": "Checkout", - "fiatOnRamp.chooseMultiPlatformProvider.chooseNetwork": "Pilih rangkaian", - "fiatOnRamp.chooseMultiPlatformProvider.description": "Ini akan menentukan alamat dompet anda akan menerima dana.", - "fiatOnRamp.chooseProvider.description": "Anda akan terus ke portal penyedia untuk melihat yuran yang berkaitan dengan transaksi anda.", - "fiatOnRamp.completeTransactionHeader": "Lengkapkan transaksi dengan {{serviceProvider}}", - "fiatOnRamp.connection.error": "Sambungan gagal", - "fiatOnRamp.connection.errorDescription": "Kesilapan telah berlaku semasa menyambung dengan {{serviceProvider}}.", - "fiatOnRamp.connection.message": "Menghubungkan anda ke {{serviceProvider}}", - "fiatOnRamp.connection.quote": "Membeli {{amount}} bernilai {{currencySymbol}}", - "fiatOnRamp.connection.terms": "Dengan meneruskan, anda mengakui bahawa anda akan tertakluk pada Syarat Perkhidmatan dan Dasar Privasi dengan {{serviceProvider}}, mengikut mana yang berkenaan.", - "fiatOnRamp.continueInTab": "Pergi ke tab {{serviceProvider}} untuk meneruskan. Ia selamat untuk menutup modal ini sekarang.", - "fiatOnRamp.disclaimer": "Dengan meneruskan, anda mengakui bahawa anda akan tertakluk kepada Syarat Perkhidmatan dan Dasar Privasi dengan {{serviceProvider}}, mengikut mana yang berkenaan.", - "fiatOnRamp.error.default": "Sesuatu telah berlaku.", - "fiatOnRamp.error.load": "Tidak dapat memuatkan token untuk dibeli", - "fiatOnRamp.error.max": "Maksimum {{amount}}", - "fiatOnRamp.error.min": "Minimum {{amount}}", - "fiatOnRamp.error.noQuotes": "Tiada petikan ditemui.", - "fiatOnRamp.error.unavailable": "Perkhidmatan ini tidak tersedia di rantau anda", - "fiatOnRamp.error.unsupported": "Tidak disokong di wilayah", - "fiatOnRamp.error.usd": "Hanya tersedia untuk pembelian dalam USD", - "fiatOnRamp.noQuotes.error": "Tiada petikan ditemui", - "fiatOnRamp.paymentMethods.applePay": "Apple Pay", - "fiatOnRamp.paymentMethods.bank": "Bank", - "fiatOnRamp.paymentMethods.debit": "Debit", - "fiatOnRamp.paymentMethods.googlePay": "Google Pay", - "fiatOnRamp.paymentMethods.paypal": "PayPal", - "fiatOnRamp.paymentMethods.venmo": "Venmo", - "fiatOnRamp.quote.advice": "Anda akan terus ke portal penyedia untuk melihat yuran yang berkaitan dengan transaksi anda.", - "fiatOnRamp.quote.type.list": "{{optionsList}}, dan pilihan lain", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "Daripada akaun", - "fiatOnRamp.receiveCrypto.title": "Terima crypto", - "fiatOnRamp.receiveCrypto.transferFunds": "Membiayai dompet anda dengan memindahkan kripto daripada dompet atau akaun lain", - "fiatOnRamp.receiveCrypto.useThisAddress": "Gunakan alamat ini untuk menerima token", - "fiatOnRamp.region.placeholder": "Cari mengikut negara atau wilayah", - "fiatOnRamp.region.title": "Pilih wilayah anda", - "fiatOnRamp.summary.total": "{{cryptoAmount}} untuk {{fiatAmount}}", - "forceUpgrade.action.backup": "Sandarkan dompet anda", - "forceUpgrade.action.confirm": "Kemas kini sekarang", - "forceUpgrade.action.learn": "Ketahui cara mengemas kini", - "forceUpgrade.description.extension": "Versi baharu apl tersedia. Untuk terus menggunakan Sambungan Uniswap, sila kemas kini kepada versi terkini.", - "forceUpgrade.description.wallet": "Versi baharu apl tersedia. Untuk terus menggunakan Uniswap Wallet, sila kemas kini kepada versi terkini.", - "forceUpgrade.label.recoveryPhrase": "Frasa pemulihan", - "forceUpgrade.title": "Kemas kini kepada versi terkini", - "forceUpgrade.title.recommendedStatus": "Versi baharu tersedia", - "globalPreferences.title": "Pilihan global", - "hero.scroll": "Tatal untuk mengetahui lebih lanjut", - "hero.subtitle": "Beli dan jual kripto di {{amount}}+ rangkaian termasuk Ethereum, Unichain dan Base.", - "hero.swap.title": "Tukar bila-bila masa,
di mana-mana sahaja.", - "hidden.nfts.info.banner.text": "Ketahui lebih lanjut tentang NFT tersembunyi", - "hidden.nfts.info.text.button": "NFT Tersembunyi ({{numHidden}})", - "hidden.nfts.info.text.extension": "Ini adalah potensi penipuan dan NFT yang telah anda sembunyikan. Anda boleh klik kanan pada NFT untuk menyahsembunyikannya.", - "hidden.nfts.info.text.mobile": "Ini adalah potensi penipuan dan NFT yang telah anda sembunyikan. Anda boleh menekan lama pada NFT untuk menyahsembunyikannya.", - "hidden.nfts.info.text.title": "NFT Tersembunyi", - "hidden.tokens.info.banner.text": "Ketahui lebih lanjut tentang token tersembunyi", - "hidden.tokens.info.text.button": "Token tersembunyi ({{numHidden}})", - "hidden.tokens.info.text.info": "Ini adalah potensi penipuan, baki kecil dan token yang telah anda sembunyikan. Token tersembunyi tidak termasuk dalam jumlah baki dompet anda.", - "hidden.tokens.info.text.title": "Token tersembunyi", - "home.activity.empty.button": "Terima token atau NFT", - "home.activity.empty.description.default": "Apabila anda meluluskan, berdagang atau memindahkan token atau NFT, transaksi anda akan dipaparkan di sini.", - "home.activity.empty.description.external": "Apabila dompet ini membuat transaksi, ia akan dipaparkan di sini.", - "home.activity.empty.title": "Tiada aktiviti lagi", - "home.activity.error.load": "Tidak dapat memuatkan aktiviti", - "home.activity.title": "Aktiviti", - "home.banner.offline": "Anda berada dalam mod luar talian", - "home.banner.testnetMode": "Anda berada dalam mod testnet", - "home.banner.testnetMode.nav": "Anda berada dalam mod testnet. Togol ini mati dalam tetapan.", - "home.empty.cexTransfer": "Pemindahan", - "home.empty.cexTransfer.description": "Pindahkan dana daripada platform dagangan.", - "home.empty.transfer": "Terima crypto", - "home.empty.transfer.description": "Pindahkan dana dari dompet lain.", - "home.explore.footer": "Ketik di sini untuk meneroka beribu-ribu token, NFT dan banyak lagi", - "home.explore.title": "Terokai token", - "home.extension.error": "Ralat memuatkan akaun", - "home.label.buy": "Beli", - "home.label.for": "Beli/Jual", - "home.label.receive": "terima", - "home.label.send": "Hantar", - "home.label.swap": "Tukar", - "home.nfts.title": "NFT", - "home.tokens.empty.action.buy.description": "Beli dengan kad debit atau akaun bank.", - "home.tokens.empty.action.buy.title": "Beli kripto", - "home.tokens.empty.action.import.description": "Masukkan frasa pemulihan dompet ini untuk mula bertukar dan menghantar.", - "home.tokens.empty.action.import.title": "Import dompet", - "home.tokens.empty.action.receive.description": "Pindahan daripada dompet atau akaun lain.", - "home.tokens.empty.action.receive.title": "Terima crypto", - "home.tokens.empty.description": "Apabila dompet ini membeli atau menerima token, ia akan dipaparkan di sini.", - "home.tokens.empty.title": "Tiada token lagi", - "home.tokens.empty.welcome.description": "Tambah dana untuk memulakan dagangan", - "home.tokens.error.fetch": "Gagal mengambil baki token", - "home.tokens.error.load": "Tidak dapat memuatkan baki token", - "home.tokens.title": "Token", - "home.upsell.receive.cta": "Daripada akaun", - "home.upsell.receive.title": "Terima crypto", - "home.warning.viewOnly": "Ini ialah dompet lihat sahaja", - "interface.metatags.description": "Tukar kripto pada Ethereum, Base, Arbitrum, Poligon, Unichain dan banyak lagi. Platform DeFi dipercayai oleh jutaan orang.", - "interface.metatags.title": "Antara Muka Uniswap", - "landing.api": "API", - "landing.appsOverview": "Dibina untuk semua cara anda bertukar", - "landing.blog.description": "Ikuti berita syarikat terkini, ciri produk dan banyak lagi", - "landing.docs.description": "Terokai perpustakaan dokumen pembangun kami untuk mula membina dengan Uniswap", - "landing.exploreUniverse": "Terokai Alam Semesta", - "landing.getStarted": "Berdagang di DEX terbesar di dunia", - "landing.helpCenter.body": "Semak imbas Soalan Lazim dan dapatkan sokongan daripada pasukan sokongan kami yang berpangkalan di AS", - "landing.protocolDescription": "Uniswap Labs menguasai beberapa produk yang paling banyak digunakan dalam crypto. Alami akses tanpa kebenaran, keselamatan yang terbukti dan sokongan khusus.", - "landing.protocolStats": "Statistik Protokol Uniswap", - "landing.provideLiquidity.body": "Menyediakan kecairan dan mengutip yuran menggunakan Antara Muka Uniswap.", - "landing.provideLiquidity.subtitle": "Pasaran rantaian kuasa.", - "landing.socials": "Ikuti Uniswap Labs di X, Farcaster, LinkedIn, dan TikTok", - "landing.swapBody": "Akses kecairan dalam, terokai token, tetapkan pesanan had dan sediakan kecairan untuk beribu-ribu token merentas rantaian {{amount}} .", - "landing.swapSubtitle": "Pertukaran tanpa kebenaran.", - "landing.tradingApi": "API Perdagangan", - "landing.tradingApiBody": "Gunakan API yang sama yang menguatkan Apl Web dan Dompet Uniswap, yang dipercayai oleh pasukan terkemuka di seluruh dunia.", - "landing.tradingApiButton": "Sepadukan API Uniswap", - "landing.tradingApiSubtitle": "DeFi, terus kepada pengguna anda.", - "landing.trusted": "Dipercayai oleh berjuta-juta", - "landing.unichain.body": "Sertai pembinaan komuniti di Ethereum L2 terdesentralisasi yang pantas dan dibina untuk menjadi rumah bagi DeFi.", - "landing.unichain.button": "Mula membina", - "landing.unichain.subtitle": "Rantaian DeFi.", - "landing.uniswapX.body": "Transaksi tanpa gas dan perlindungan MEV, dengan sifar bayaran untuk pertukaran yang gagal.", - "landing.uniswapX.button": "Alami UniswapX", - "landing.uniswapX.subtitle": "Pertukaran yang lebih bijak, geseran sifar.", - "landing.walletBody": "Dompet dan sambungan crypto jagaan sendiri yang dipercayai dengan jutaan muat turun, sokongan daripada manusia sebenar dan penilaian 4.8 .", - "landing.walletSubtitle": "Tukar, simpan, teroka.", - "language.afrikaans": "Afrikaans", - "language.arabic": "bahasa arab", - "language.catalan": "Catalan", - "language.chineseSimplified": "Cina Ringkas", - "language.chineseTraditional": "Cina, Tradisional", - "language.czech": "bahasa Czech", - "language.danish": "Danish", - "language.dutch": "Belanda", - "language.english": "Bahasa Inggeris", - "language.finnish": "bahasa Finland", - "language.french": "Perancis", - "language.greek": "bahasa Yunani", - "language.hebrew": "bahasa Ibrani", - "language.hindi": "Hindi", - "language.hungarian": "bahasa Hungary", - "language.indonesian": "Bahasa Indonesia", - "language.italian": "Itali", - "language.japanese": "Jepun", - "language.korean": "Korea", - "language.malay": "Bahasa Melayu", - "language.norwegian": "bahasa Norway", - "language.polish": "Poland", - "language.portuguese": "Portugis", - "language.romanian": "bahasa Romania", - "language.russian": "bahasa Rusia", - "language.serbian": "bahasa Serbia", - "language.spanishArgentina": "Sepanyol (Argentina)", - "language.spanishBelize": "Sepanyol (Belize)", - "language.spanishBolivia": "Sepanyol (Bolivia)", - "language.spanishChile": "Sepanyol (Chile)", - "language.spanishColombia": "Sepanyol (Colombia)", - "language.spanishCostaRica": "Sepanyol (Costa Rica)", - "language.spanishCuba": "Sepanyol (Cuba)", - "language.spanishDominicanRepublic": "Sepanyol (Republik Dominika)", - "language.spanishEcuador": "Sepanyol (Ecuador)", - "language.spanishElSalvador": "Sepanyol (El Salvador)", - "language.spanishGuatemala": "Sepanyol (Guatemala)", - "language.spanishHonduras": "Sepanyol (Honduras)", - "language.spanishLatam": "Sepanyol (Amerika Latin)", - "language.spanishMexico": "Sepanyol (Mexico)", - "language.spanishNicaragua": "Sepanyol (Nicaragua)", - "language.spanishPanama": "Sepanyol (Panama)", - "language.spanishParaguay": "Sepanyol (Paraguay)", - "language.spanishPeru": "Sepanyol (Peru)", - "language.spanishPuertoRico": "Sepanyol (Puerto Rico)", - "language.spanishSpain": "Sepanyol (Sepanyol)", - "language.spanishUruguay": "Sepanyol (Uruguay)", - "language.spanishUs": "Sepanyol (AS)", - "language.spanishVenezuela": "Sepanyol (Venezuela)", - "language.swahili": "bahasa Swahili", - "language.swedish": "Bahasa Sweden", - "language.turkish": "Turki", - "language.ukrainian": "Ukraine", - "language.urdu": "bahasa Urdu", - "language.vietnamese": "Vietnam", - "large.price.difference": "Perbezaan harga yang besar", - "large.price.difference.tooltip": "Meneruskan perdagangan ini akan mengakibatkan kehilangan dana. Perbezaan ini boleh disebabkan oleh dagangan yang besar atau kecairan yang rendah.", - "limit.open.count_one": "1 had terbuka", - "limit.open.count_other": "{{count}} had terbuka", - "limitPrice.buyingAboveMarketPrice.error.description": "Harga had anda ialah {{percentage}}% lebih tinggi daripada pasaran. Laraskan harga had anda untuk meneruskan.", - "limitPrice.buyingAboveMarketPrice.error.title": "Membeli {{tokenSymbol}} melebihi harga pasaran", - "limitPrice.marketPriceNotAvailable.error.description": "Kami tidak dapat mengira harga pasaran semasa. Untuk mengelak daripada menyerahkan pesanan di bawah harga pasaran, sila semak sambungan rangkaian anda dan cuba lagi.", - "limitPrice.marketPriceNotAvailable.error.title": "Harga pasaran tidak tersedia", - "limitPrice.sellingBelowMarketPrice.error.description": "Harga had anda ialah {{percentage}}% lebih rendah daripada pasaran. Laraskan harga had anda untuk meneruskan.", - "limitPrice.sellingBelowMarketPrice.error.title": "Menjual {{tokenSymbol}} di bawah harga pasaran", - "limits.form.disclaimer.mainnet": "Hanya token mainnet Ethereum tersedia untuk had. ", - "limits.form.disclaimer.mainnet.short": "Hanya token Mainnet tersedia untuk had.", - "limits.form.disclaimer.uniswapx": "Had mungkin tidak dilaksanakan tepat apabila token mencapai harga yang ditentukan. ", - "limits.learnMore": "Ketahui lebih lanjut tentang had", - "limits.price.input.label": "Apabila 1 bernilai", - "limits.price.label": "Hadkan harga", - "limits.selectSupportedTokens": "Pilih token yang disokong", - "liquidity.hooks": "Cangkuk pada v4", - "liquidity.hooks.address.input": "Masukkan alamat cangkuk", - "liquidity.hooks.address.tooltip": "Alamat cangkuk: {{address}}", - "liquidity.learnMoreLabel": "Ketahui tentang penyediaan kecairan", - "liquidity.notEnough.label": "Kecairan tidak mencukupi untuk menunjukkan nilai USD yang tepat.", - "liquidity.provideOnProtocols": "Menyediakan kecairan pada protokol yang berbeza", - "liquidityPool.page.title": "Tambahkan kecairan pada kumpulan{{version}} pada Uniswap", - "liquidityPool.positions.closed.title": "Kedudukan tertutup", - "liquidityPool.positions.loadingMore": "Memuatkan lebih banyak jawatan...", - "liquidityPool.positions.page.title": "Urus {{quoteSymbol}}/{{baseSymbol}} kecairan kumpulan pada Uniswap", - "liquidityPool.positions.page.version.description": "Lihat {{version}} kedudukan mudah tunai anda yang aktif. Tambah jawatan baharu.", - "liquidityPool.positions.page.version.title": "Urus kecairan kumpulan{{version}} pada Uniswap", - "migrate.allowed": "Dibenarkan", - "migrate.allowLpMigration": "Benarkan penghijrahan token LP", - "migrate.connectAccount": "Anda mesti menyambungkan akaun yang memiliki kedudukan ini.", - "migrate.connectWallet": "Sambung ke dompet untuk melihat kecairan V2 anda.", - "migrate.contract": "Kontrak migrasi uniswap", - "migrate.firstLP": "Anda ialah penyedia kecairan pertama untuk kumpulan Uniswap V3 ini. Kecairan anda akan berhijrah pada harga {{source}} semasa.", - "migrate.highGasCost": "Kos transaksi anda akan menjadi lebih tinggi kerana ia termasuk gas untuk membuat kolam.", - "migrate.invalidRange": "Julat tidak sah dipilih. Harga min mestilah lebih rendah daripada harga maks.", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} Token LP", - "migrate.migrating": "Berhijrah", - "migrate.missingV2Position": "Tidak nampak salah satu kedudukan v2 anda? Importnya.", - "migrate.noV2Liquidity": "Tiada kecairan V2 ditemui.", - "migrate.positionNoFees": "Kedudukan anda tidak akan mendapat bayaran atau digunakan dalam dagangan sehingga harga pasaran bergerak ke dalam julat anda.", - "migrate.priceDifference": "Perbezaan harga: ", - "migrate.priceWarning": "Anda hanya perlu mendepositkan kecairan ke dalam Uniswap V3 pada harga yang anda percaya adalah betul.
Jika harga kelihatan tidak betul, anda boleh sama ada membuat pertukaran untuk memindahkan harga atau menunggu orang lain berbuat demikian.", - "migrate.refund": "Sekurang-kurangnya {{amtA}} {{symA}} dan {{amtB}} {{symB}} akan dipulangkan ke dompet anda kerana julat harga yang dipilih.", - "migrate.selectFeeTier": "Pilih peringkat yuran", - "migrate.setRange": "Tetapkan julat harga", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Harga:", - "migrate.v2Description": "Alat ini akan memindahkan kecairan {{source}} anda kepada V3 dengan selamat. Proses ini tidak boleh dipercayai sepenuhnya terima kasih kepada <0>kontrak migrasi Uniswap ↗", - "migrate.v2Instruction": "Untuk setiap kumpulan yang ditunjukkan di bawah, klik migrasi untuk mengalih keluar kecairan anda daripada Uniswap V2 dan mendepositkannya ke dalam Uniswap V3.", - "migrate.v2Title": "Pindahkan kecairan V2", - "migrate.v3Price": "V3 {{sym}} Harga:", - "mint.v3.input.invalidPrice.error": "Input harga tidak sah", - "mobileAppPromo.banner.getTheApp.link": "Dapatkan apl Uniswap Wallet", - "mobileAppPromo.banner.title": "Uniswap: Dompet Kripto & NFT", - "moonpay.poweredBy": "Fiat onramp dikuasakan oleh MoonPay USA LLC", - "nav.createAccount.button": "Buat akaun", - "nav.logIn.button": "Log masuk", - "nav.logInOrConnect.title": "Log masuk atau sambung", - "nav.products.tradingApi": "Mengintegrasikan protokol", - "nav.products.unichain": "Rantaian DeFi", - "nav.products.uniswapX": "Meta-agregator", - "nav.products.wallet": "Tukar, simpan, teroka", - "nav.signUp.button": "daftar", - "nav.tabs.createPosition": "Cipta kedudukan", - "nav.tabs.viewPositions": "Lihat kedudukan", - "network.lostConnection": "Anda mungkin telah kehilangan sambungan rangkaian anda.", - "network.mightBeDown": "{{network}} mungkin terputus sekarang, atau anda mungkin terputus sambungan rangkaian anda.", - "network.warning": "Amaran rangkaian", - "nft.noPools": "Tiada kolam lagi", - "nft.reportSpam": "Laporkan sebagai spam", - "notFound.oops": "Op, bawa saya kembali ke Swap", - "notice.uk": "Aplikasi web ini disediakan sebagai alat untuk pengguna berinteraksi dengan Protokol Uniswap atas inisiatif mereka sendiri, tanpa pengesahan atau pengesyoran aktiviti perdagangan mata wang kripto. Dengan berbuat demikian, Uniswap tidak mengesyorkan bahawa pengguna atau bakal pengguna melibatkan diri dalam aktiviti perdagangan aset kripto, dan pengguna atau bakal pengguna aplikasi web tidak seharusnya menganggap halaman web ini atau kandungannya sebagai melibatkan sebarang bentuk pengesyoran, jemputan atau dorongan untuk berurusan dalam aset kripto. .", - "notice.uk.label": "Penafian UK:", - "notification.assetVisibility.hidden": "{{assetName}} tersembunyi", - "notification.assetVisibility.unhidden": "{{assetName}} tidak tersembunyi", - "notification.buy.network": "Membeli pada {{network}}", - "notification.copied.address": "Alamat disalin", - "notification.copied.calldata": "Data panggilan disalin", - "notification.copied.contractAddress": "Alamat kontrak disalin", - "notification.copied.failed": "Gagal menyalin ke papan keratan", - "notification.copied.image": "Imej disalin", - "notification.copied.linkUrl": "Pautan disalin", - "notification.copied.nftUrl": "URL NFT disalin", - "notification.copied.poolId": "ID kolam disalin", - "notification.copied.tokenUrl": "URL Token disalin", - "notification.copied.transactionId": "ID Transaksi disalin", - "notification.copied.unitag": "Nama pengguna disalin", - "notification.countryChange": "Bertukar kepada {{countryName}}", - "notification.limit.network": "Mencipta tertib had pada {{network}}", - "notification.lp.network": "Menyediakan kecairan pada {{network}}", - "notification.network.changed": "Bertukar kepada {{network}}", - "notification.passwordChanged": "Kata laluan ditukar", - "notification.poolFinder.network": "Cari kolam di {{network}}", - "notification.restore.success": "Dompet dipulihkan!", - "notification.sell.network": "Menjual pada {{network}}", - "notification.send.network": "Menghantar pada {{network}}", - "notification.smartWallet.disabled": "Dilumpuhkan pada 1 rangkaian", - "notification.smartWallet.disabled.all": "Dompet pintar dilumpuhkan", - "notification.smartWallet.disabled.plural": "Dilumpuhkan pada rangkaian {{amount}}", - "notification.spam.NFT.failed": "Tidak dapat melaporkan NFT. Cuba lagi nanti.", - "notification.spam.NFT.successful": "Dilaporkan", - "notification.swap.network": "Bertukar pada {{network}}", - "notification.swap.pending.swap": "Swap belum selesai", - "notification.swap.pending.unwrap": "Buka bungkus belum selesai", - "notification.swap.pending.wrap": "Bungkus belum selesai", - "notification.transaction.approve.canceled": "Dibatalkan {{currencySymbol}} meluluskan.", - "notification.transaction.approve.fail": "Gagal meluluskan {{currencySymbol}} untuk digunakan dengan {{address}}.", - "notification.transaction.approve.success": "Diluluskan {{currencySymbol}} untuk digunakan dengan {{address}}.", - "notification.transaction.pending": "Urus niaga belum selesai", - "notification.transaction.swap.canceled": "Dibatalkan {{inputCurrencySymbol}}-{{outputCurrencySymbol}} pertukaran.", - "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} untuk {{outputCurrencyAmountWithSymbol}} pertukaran tamat tempoh.", - "notification.transaction.swap.fail": "Gagal menukar {{inputCurrencyAmountWithSymbol}} dengan {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.swap.success": "Bertukar {{inputCurrencyAmountWithSymbol}} dengan {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.transfer.canceled": "Dibatalkan {{tokenNameOrAddress}} hantar", - "notification.transaction.transfer.fail": "Gagal menghantar {{tokenNameOrAddress}} ke {{walletNameOrAddress}}", - "notification.transaction.transfer.received": "Menerima {{tokenNameOrAddress}} daripada {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "Dihantar {{tokenNameOrAddress}} kepada {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "Gagal berurus niaga dengan {{addressOrEnsName}}", - "notification.transaction.unknown.fail.short": "transaksi gagal", - "notification.transaction.unknown.success.full": "Berurus niaga dengan {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "Transaksi disahkan", - "notification.transaction.unwrap.canceled": "Dibatalkan {{inputCurrencySymbol}} buka bungkus.", - "notification.transaction.unwrap.fail": "Gagal membuka bungkus {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.unwrap.success": "Membuka bungkus {{inputCurrencyAmountWithSymbol}} dan menerima {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.canceled": "Dibatalkan {{inputCurrencySymbol}} bungkus.", - "notification.transaction.wrap.fail": "Gagal membalut {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.success": "Dibungkus {{inputCurrencyAmountWithSymbol}} dan diterima {{outputCurrencyAmountWithSymbol}}.", - "notification.transfer.pending": "Hantar belum selesai", - "notification.walletConnect.confirmed": "Transaksi disahkan dengan {{dappName}}", - "notification.walletConnect.connected": "Bersambung", - "notification.walletConnect.disconnected": "Terputus sambungan", - "notification.walletConnect.failed": "Transaksi gagal dengan {{dappName}}", - "notification.walletConnect.networkChanged.full": "Bertukar kepada {{networkName}}", - "notification.walletConnect.networkChanged.short": "Rangkaian bertukar", - "notifications.scantastic.subtitle": "Teruskan pada Sambungan Uniswap", - "notifications.scantastic.title": "Kejayaan!", - "onboarding.backup.manual.banner": "Kami cadangkan menulis ini pada sekeping kertas dan menyimpannya di tempat yang selamat, seperti peti besi.", - "onboarding.backup.manual.displayWarning.description": "Baca perkara berikut dengan teliti sebelum meneruskan.", - "onboarding.backup.manual.displayWarning.note.access": "Frasa pemulihan ini memberi anda akses penuh kepada dompet dan dana anda", - "onboarding.backup.manual.displayWarning.note.secure": "Lihat ini secara peribadi dan jangan kongsikannya dengan sesiapa pun", - "onboarding.backup.manual.displayWarning.note.storage": "Tulis dan simpan di tempat yang selamat", - "onboarding.backup.manual.displayWarning.title": "Beberapa perkara penting untuk diketahui", - "onboarding.backup.manual.error": "Perkataan tidak sah atau salah eja", - "onboarding.backup.manual.placeholder": "Perkataan rahsia", - "onboarding.backup.manual.progress": "{{completedStepsCount}}{{totalStepsCount}}", - "onboarding.backup.manual.selectedWordPlaceholder": "Pilih perkataan", - "onboarding.backup.manual.subtitle_one": "Apakah perkataan {{count}}st dalam frasa pemulihan anda?", - "onboarding.backup.manual.subtitle_two": "Apakah perkataan {{count}}dan dalam frasa pemulihan anda?", - "onboarding.backup.manual.subtitle_few": "Apakah perkataan {{count}}rd dalam frasa pemulihan anda?", - "onboarding.backup.manual.subtitle_other": "Apakah perkataan {{count}}ke dalam frasa pemulihan anda?", - "onboarding.backup.manual.title": "Mari pastikan anda telah merakamnya dengan betul", - "onboarding.backup.option.badge.quick": "Cepat", - "onboarding.backup.option.cloud.description": "Sandarkan dompet anda melalui {{cloudProviderName}}, dilindungi oleh kata laluan pemulihan.", - "onboarding.backup.option.cloud.title": "Tetapkan kata laluan pemulihan", - "onboarding.backup.option.manual.description": "Catatkan 12 perkataan rahsia anda pada sekeping kertas dan simpan di tempat yang selamat.", - "onboarding.backup.option.manual.title": "Tulis frasa pemulihan", - "onboarding.backup.reminder.backupNowButton": "Sandarkan sekarang", - "onboarding.backup.reminder.remindMeLaterButton": "Ingatkan saya nanti", - "onboarding.backup.reminder.title": "Sandarkan dompet anda", - "onboarding.backup.reminder.warning.description": "Sandarkan dompet anda supaya anda boleh memulihkan aset anda jika anda kehilangan telefon anda atau mendapatkan yang baharu.", - "onboarding.backup.reminder.warning.fundsLabel": "Dana berisiko", - "onboarding.backup.reminder.warning.title": "Anda boleh kehilangan dana anda", - "onboarding.backup.speedBump.cloud.description": "Jika anda terlupa, kami tidak boleh menetapkan semula untuk anda. Tuliskannya di tempat yang selamat atau simpan dengan selamat dalam pengurus kata laluan.", - "onboarding.backup.speedBump.cloud.disclaimer": "Saya faham bahawa Uniswap Labs tidak boleh menetapkan semula kata laluan pemulihan saya.", - "onboarding.backup.speedBump.cloud.title": "Adalah penting untuk menyimpan kata laluan ini", - "onboarding.backup.speedBump.manual.description": "Pastikan anda menulis frasa pemulihan anda dengan betul dan mempunyai tempat yang selamat untuk menyimpannya.", - "onboarding.backup.speedBump.manual.disclaimer": "Saya faham bahawa Uniswap Labs tidak dapat memulihkan dompet saya jika saya kehilangan ini.", - "onboarding.backup.speedBump.manual.title": "Sebelum anda selesai...", - "onboarding.backup.subtitle": "Beginilah cara anda memulihkan dompet anda jika anda memadamkan apl atau kehilangan peranti anda.", - "onboarding.backup.title.existing": "Sandarkan dompet anda", - "onboarding.backup.title.new": "Pilih kaedah sandaran anda", - "onboarding.backup.view.subtitle.message1": "Baca perkara berikut dengan teliti sebelum meneruskan", - "onboarding.backup.view.subtitle.message2": "Anda perlu memasukkan kesemua 12 perkataan rahsia ini untuk mendapatkan semula dompet anda.", - "onboarding.backup.view.title": "Tulis frasa pemulihan anda", - "onboarding.backup.view.warning.message1": "Frasa pemulihan ini memberi anda akses penuh kepada dompet dan dana anda", - "onboarding.backup.view.warning.message2": "Tulis dan simpan di tempat yang selamat", - "onboarding.backup.view.warning.message3": "Lihat ini secara tertutup dan jangan kongsikannya dengan sesiapa pun", - "onboarding.cloud.confirm.description": "Anda perlu memasukkan ini untuk mendapatkan semula dana anda. Jika anda terlupa, kami tidak boleh mendapatkannya untuk anda.", - "onboarding.cloud.confirm.title": "Sahkan kata laluan pemulihan anda", - "onboarding.cloud.createPassword.description": "Anda perlu memasukkan ini untuk mendapatkan semula dana anda. Jika anda terlupa, kami tidak boleh mendapatkannya untuk anda.", - "onboarding.cloud.createPassword.title": "Cipta kata laluan pemulihan anda", - "onboarding.complete.button": "Buka Sambungan Uniswap", - "onboarding.complete.description": "Dompet anda sedia untuk menghantar dan menerima crypto. Buka Sambungan Uniswap dengan pintasan di bawah.", - "onboarding.complete.go_to_uniswap": "Pergi ke Apl Web Uniswap", - "onboarding.complete.pin.description": "Klik ikon pin untuk menambah Sambungan Uniswap pada bar alat anda.", - "onboarding.complete.pin.title": "Sambungan Uniswap Pin", - "onboarding.complete.title": "Anda telah siap sedia", - "onboarding.extension.biometrics.subtitle.fingerprint": "Akses dompet anda dengan cepat dan selamat menggunakan cap jari anda sahaja.", - "onboarding.extension.biometrics.title": "Dayakan {{biometricsMethod}}", - "onboarding.extension.password.subtitle": "Anda memerlukan ini untuk membuka kunci dompet anda dan mengakses frasa pemulihan anda", - "onboarding.extension.password.title.default": "Bina kata laluan", - "onboarding.extension.password.title.reset": "Menetapkan semula kata laluan anda", - "onboarding.extension.unsupported.android.description": "Sambungan Uniswap hanya serasi dengan Chrome pada desktop.", - "onboarding.extension.unsupported.android.title": "Chrome pada mudah alih tidak disokong (lagi)", - "onboarding.extension.unsupported.description": "Sambungan Uniswap hanya serasi dengan Chrome sekarang.", - "onboarding.extension.unsupported.title": "Penyemak imbas ini tidak disokong (lagi)", - "onboarding.home.intro.backup.description.extension": "Simpan frasa pemulihan anda untuk memastikan anda tidak kehilangan akses kepada dompet anda.", - "onboarding.home.intro.backup.description.mobile": "Sediakan pelan pemulihan jika anda kehilangan telefon anda atau mendapat yang baharu.", - "onboarding.home.intro.backup.title": "Sandarkan dompet anda", - "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK dan JUP — kini tersedia di Unichain", - "onboarding.home.intro.bridgedAssets.title": "Berdagang token baharu pada Unichain", - "onboarding.home.intro.fund.description": "Membiayai dompet anda dengan membeli crypto atau memindahkan daripada akaun lain.", - "onboarding.home.intro.fund.title": "Dapatkan token pertama anda", - "onboarding.home.intro.label.required": "Diperlukan", - "onboarding.home.intro.label.swipe": "Leret", - "onboarding.home.intro.pushNotifications.description": "Dapatkan makluman harga tentang token kegemaran anda, arah aliran pasaran dan banyak lagi.", - "onboarding.home.intro.pushNotifications.title": "Kekal dalam pengetahuan", - "onboarding.home.intro.unitag.description": "Bina profil web3 yang diperibadikan dan kongsi alamat anda dengan rakan dengan mudah.", - "onboarding.home.intro.unitag.title": "Tuntut nama pengguna {{unitagDomain}} anda", - "onboarding.import.error.invalidWords_one": "1 perkataan tidak sah atau salah ejaan", - "onboarding.import.error.invalidWords_other": "{{count}} perkataan tidak sah atau salah ejaan", - "onboarding.import.method.restore.message.android": "Tambahkan dompet yang telah anda sandarkan ke akaun Google Drive anda.", - "onboarding.import.method.restore.message.ios": "Tambahkan dompet yang telah anda sandarkan ke akaun iCloud anda.", - "onboarding.import.method.restore.title": "Pulihkan dompet", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.android": "Masukkan kata laluan pemulihan anda untuk memulihkan dompet anda melalui sandaran Google Drive.", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.ios": "Masukkan kata laluan pemulihan anda untuk memulihkan dompet anda melalui sandaran iCloud.", - "onboarding.import.method.restoreSeedPhrase.cloud.title.android": "Pulihkan daripada Google Drive", - "onboarding.import.method.restoreSeedPhrase.cloud.title.ios": "Pulihkan daripada iCloud", - "onboarding.import.method.restoreSeedPhrase.title": "Pilih cara memulihkan dompet anda", - "onboarding.import.method.restoreSeedPhrase.wallet.desc": "Masukkan 12 perkataan rahsia anda yang anda simpan sebelum ini di tempat yang selamat.", - "onboarding.import.method.restoreSeedPhrase.wallet.title": "Masukkan frasa pemulihan", - "onboarding.import.method.viewPrivateKeys.button.desc": "Lihat kunci peribadi anda", - "onboarding.import.method.viewPrivateKeys.title": "Tidak mempunyai mana-mana perkara di atas? ", - "onboarding.import.onDeviceRecovery.other_options": "Buat atau import dompet yang berbeza", - "onboarding.import.onDeviceRecovery.other_options.label": "Tidak mahu mana-mana di atas?", - "onboarding.import.onDeviceRecovery.subtitle": "Pilih dompet yang anda mahu log masuk semula.", - "onboarding.import.onDeviceRecovery.title": "Selamat kembali ke Uniswap", - "onboarding.import.onDeviceRecovery.wallet.button": "Lihat frasa pemulihan", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 dompet lain", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} dompet lain", - "onboarding.import.onDeviceRecovery.warning.caption": "Sila pastikan anda telah menyandarkan semua dompet lain. Jika anda mahu memulihkannya, anda memerlukan frasa pemulihan atau sandaran {{cloudProvider}} yang sepadan.", - "onboarding.import.onDeviceRecovery.warning.title": "Adakah anda pasti?", - "onboarding.import.selectMethod.errorMessage": "Ralat yang tidak dijangka berlaku. Sila cuba lagi.", - "onboarding.import.selectMethod.mobileApp.subtitle": "Import dompet daripada apl mudah alih melalui kod QR.", - "onboarding.import.selectMethod.mobileApp.title": "Gunakan Mudah Alih Uniswap", - "onboarding.import.selectMethod.passkey.subtitle": "Segerakkan dompet Uniswap anda menggunakan kunci laluan sedia ada.", - "onboarding.import.selectMethod.passkey.title": "Log masuk dengan kunci laluan", - "onboarding.import.selectMethod.recoveryPhrase.subtitle": "Import dari dompet crypto lain.", - "onboarding.import.selectMethod.recoveryPhrase.title": "Masukkan frasa pemulihan", - "onboarding.import.selectMethod.title": "Log masuk atau import dompet", - "onboarding.import.title": "Pilih cara anda mahu menambah dompet anda", - "onboarding.importMnemonic.button.default": "Frasa pemulihan saya ialah 12 patah perkataan", - "onboarding.importMnemonic.button.importing": "Mengimport...", - "onboarding.importMnemonic.button.longPhrase": "Frasa pemulihan saya lebih panjang", - "onboarding.importMnemonic.error.invalidPhrase": "Frasa yang anda masukkan tidak sah", - "onboarding.importMnemonic.subtitle": "Taip atau tampal frasa pemulihan 12 perkataan anda", - "onboarding.importMnemonic.title": "Masukkan frasa pemulihan anda", - "onboarding.importPasskey.bringWindowToFront": "Bawa tingkap ke hadapan", - "onboarding.importPasskey.continueInSecureWindow": "Teruskan dalam tetingkap log masuk selamat.", - "onboarding.intro.button.alreadyHave": "Saya sudah mempunyai dompet", - "onboarding.intro.button.logInOrImport": "Log masuk atau import", - "onboarding.intro.mobileScan.button": "Imbas kod QR untuk mengimport", - "onboarding.intro.mobileScan.title": "Ada apl Uniswap?", - "onboarding.landing.button.add": "Tambah dompet sedia ada", - "onboarding.landing.button.create": "Buat dompet baharu", - "onboarding.landing.button.createAccount": "Buat akaun", - "onboarding.name.choose": "Pilih nama pengguna", - "onboarding.name.choose.subtitle": "Ini adalah nama awam yang boleh digunakan oleh sesiapa sahaja untuk menghantar kripto kepada anda.", - "onboarding.notification.permission.message": "Untuk menerima pemberitahuan, hidupkan pemberitahuan untuk Uniswap Wallet dalam tetapan peranti anda.", - "onboarding.notification.permission.title": "Kebenaran pemberitahuan", - "onboarding.notification.subtitle": "Kekal dikemas kini tentang status transaksi dan perubahan harga utama untuk token kegemaran.", - "onboarding.notification.title": "Hidupkan pemberitahuan", - "onboarding.passkey.create": "Cipta kunci laluan anda", - "onboarding.passkey.loading.subtitle": "Ini sepatutnya mengambil masa hanya sebentar.", - "onboarding.passkey.loading.title": "Mencari dompet anda...", - "onboarding.passkey.secure": "Lindungi akaun anda", - "onboarding.passkey.secure.description": "Kunci laluan membolehkan anda mengakses akaun anda dengan cepat dan selamat menggunakan muka atau cap jari anda sahaja.", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "Mari sahkan bahawa anda melakukannya dengan betul. Jika anda kehilangan atau menulis ini secara salah, anda tidak akan dapat mendapatkan semula dana anda.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "Jika anda kehilangan atau menulis ini secara salah, anda tidak akan dapat mendapatkan semula dana anda.", - "onboarding.recoveryPhrase.confirm.title": "Mari sahkan bahawa anda melakukannya dengan betul", - "onboarding.recoveryPhrase.view.subtitle": "Anda perlu memasukkan kesemua 12 perkataan rahsia ini untuk mendapatkan semula dompet anda.", - "onboarding.recoveryPhrase.view.title": "Tulis frasa pemulihan anda", - "onboarding.recoveryPhrase.view.title.hasPassword": "Jika anda terlupa kata laluan anda...", - "onboarding.recoveryPhrase.warning.final.button": "saya dah bersedia", - "onboarding.recoveryPhrase.warning.final.message": "Frasa pemulihan anda ialah yang memberi anda (dan sesiapa sahaja yang memilikinya) akses kepada dana anda. Pastikan untuk menyimpannya untuk diri sendiri.", - "onboarding.recoveryPhrase.warning.final.title": "Lakukan langkah ini di tempat peribadi", - "onboarding.recoveryPhrase.warning.screenshot.message": "Sesiapa sahaja yang mendapat akses kepada foto anda boleh mengakses dompet anda. Kami mengesyorkan anda menulis perkataan anda sebaliknya.", - "onboarding.recoveryPhrase.warning.screenshot.title": "Tangkapan skrin tidak selamat", - "onboarding.resetPassword.complete.safety": "Ketahui lebih lanjut tentang keselamatan dompet", - "onboarding.resetPassword.complete.subtitle": "Gunakan kata laluan baharu anda untuk membuka kunci dompet anda.", - "onboarding.resetPassword.complete.title": "Memadam kata laluan", - "onboarding.scan.error": "Terdapat ralat semasa memuatkan kod QR", - "onboarding.scan.otp.error": "Kod yang anda serahkan adalah salah, atau terdapat ralat semasa menyerahkan. Sila cuba lagi.", - "onboarding.scan.otp.failed": "Percubaan gagal: {{number}}", - "onboarding.scan.otp.subtitle": "Semak apl mudah alih Uniswap anda untuk kod 6 aksara", - "onboarding.scan.otp.title": "Masukkan kod sekali sahaja", - "onboarding.scan.subtitle": "Imbas kod QR dengan apl mudah alih Uniswap untuk mula mengimport dompet anda.", - "onboarding.scan.title": "Import dompet daripada apl", - "onboarding.scan.troubleScanning.message": "Import melalui frasa pemulihan", - "onboarding.scan.troubleScanning.title": "Masalah mengimbas?", - "onboarding.scan.wifi": "Sambungkan telefon anda ke rangkaian WiFi yang sama seperti komputer anda.", - "onboarding.security.alert.biometrics.message.android": "Untuk menggunakan biometrik, sediakannya dahulu dalam tetapan", - "onboarding.security.alert.biometrics.message.ios": "Untuk menggunakan {{biometricsMethod}}, benarkan akses dalam tetapan sistem", - "onboarding.security.alert.biometrics.title.android": "Biometrik dilumpuhkan", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} dilumpuhkan", - "onboarding.security.button.confirm.android": "Dayakan biometrik", - "onboarding.security.button.confirm.ios": "Dayakan {{biometricsMethod}}", - "onboarding.security.button.setup": "Sediakan", - "onboarding.security.subtitle.android": "Tambahkan lapisan keselamatan tambahan dengan memerlukan biometrik untuk menghantar transaksi.", - "onboarding.security.subtitle.ios": "Tambahkan lapisan keselamatan tambahan dengan memerlukan {{biometricsMethod}} untuk menghantar transaksi.", - "onboarding.security.title": "Lindungi dompet anda", - "onboarding.selectWallets.error": "Tidak dapat memuatkan alamat", - "onboarding.selectWallets.title.default": "Pilih dompet untuk diimport", - "onboarding.selectWallets.title.error": "Ralat mengimport dompet", - "onboarding.termsOfService": "Dengan meneruskan, saya bersetuju menerima Syarat Perkhidmatan dan bersetuju dengan Dasar Privasi", - "onboarding.tooltip.recoveryPhrase.trigger": "Apakah frasa pemulihan?", - "onboarding.wallet.continue": "Mari kita pastikan ia selamat", - "onboarding.wallet.defaultName": "Dompet {{number}}", - "onboarding.wallet.description.full": "Ini ialah ruang peribadi anda untuk token, NFT dan semua dagangan anda. Selesaikan menyediakannya untuk memastikan dana anda selamat.", - "onboarding.wallet.title": "Selamat datang ke dompet baharu anda", - "onboarding.welcome.subtitle": "Mari selesaikan persediaan dompet anda.", - "onboarding.welcome.title": "Selamat datang!", - "outageBanner.message": "{{chainName}}{{versionDescription}} data tidak tersedia sekarang, tetapi kami menjangkakan isu itu akan diselesaikan tidak lama lagi.", - "outageBanner.message.sub": "Anda masih boleh menukar dan menyediakan kecairan pada rantaian ini tanpa masalah.", - "outageBanner.title": "{{versionName}} akan kembali tidak lama lagi", - "passkeys.help.modal.subtitle": "Jika anda menghadapi masalah dengan kunci laluan, lawati Sokongan Uniswap untuk mendapatkan bantuan.", - "passkeys.help.modal.subtitle.invalidPasskey": "Permintaan anda tidak dapat diselesaikan. Sila cuba lagi menggunakan kunci laluan yang dikaitkan dengan ", - "passkeys.help.modal.subtitle.technicalError": "Permintaan anda tidak dapat diselesaikan kerana ralat teknikal yang tidak dijangka. Dana anda selamat. Sila cuba lagi.", - "passkeys.help.modal.title": "Perlukan bantuan?", - "passkeys.help.modal.title.invalidPasskey": "Kunci laluan tidak sah", - "passkeys.help.modal.title.technicalError": "Ralat teknikal", - "passkeys.manage.modal.subtitle": "Untuk menambah atau mengalih keluar kunci laluan, sila log masuk ke {{passkeyManagementUrl}}.", - "passkeys.manage.modal.title": "Urus kunci laluan", - "permit.approval.fail": "Kelulusan permit gagal", - "permit.approval.fail.message": "Permit2 membenarkan kelulusan token dikongsi dan diuruskan merentas aplikasi yang berbeza.", - "pool.activeRange": "Julat tanda aktif", - "pool.addAs": "Tambahkan sebagai {{nativeWrappedSymbol}}", - "pool.apr": "APR", - "pool.apr.base": "APR asas", - "pool.apr.description": "Ditahunkan berdasarkan yuran 1 hari", - "pool.apr.reward": "Ganjaran APR", - "pool.aprText": "APR kolam", - "pool.balances": "Baki kolam", - "pool.closedCTA.description": "Anda boleh melihatnya dengan menggunakan penapis di bahagian atas halaman.", - "pool.closedCTA.title": "Mencari jawatan tertutup anda?", - "pool.collectAs": "Kumpul sebagai {{nativeWrappedSymbol}}", - "pool.collectFees": "Kutip yuran", - "pool.connectEthereumToView": "Sambungkan dompet Ethereum untuk melihat kolam anda", - "pool.create": "Mencipta kolam baharu", - "pool.create.info": "Pilihan anda akan mewujudkan kumpulan kecairan baharu yang boleh mengakibatkan kecairan awal yang lebih rendah dan peningkatan turun naik. Pertimbangkan untuk menambah kumpulan sedia ada untuk meminimumkan risiko ini.", - "pool.createdPosition": "Kedudukan tercipta", - "pool.createdPosition.canceled": "Cipta kedudukan dibatalkan", - "pool.createdPosition.failed": "Gagal mencipta kedudukan", - "pool.dynamic": "Kolam dinamik", - "pool.earnings": "Pendapatan", - "pool.earnings.empty": "Anda belum mempunyai pendapatan", - "pool.explorers": "Penjelajah", - "pool.import": "Kolam import", - "pool.import.link.description": "Sesetengah kedudukan v2 tidak dipaparkan secara automatik.", - "pool.import.positions.v2": "Import kedudukan V2", - "pool.import.positions.v2.selectPair.description": "Sesetengah kedudukan v2 tidak dipaparkan secara automatik. Pilih pasangan token untuk diimport dan melihat kedudukan anda.", - "pool.import.success": "Kolam diimport", - "pool.incentives.administeredRewards": "Ganjaran diedarkan oleh kontrak Pengedar Merkl berautonomi.", - "pool.incentives.collect": "Kumpul", - "pool.incentives.collectedRewards": "Ganjaran yang dikumpul", - "pool.incentives.collectFailed": "Gagal mengumpul, sila cuba lagi.", - "pool.incentives.collectFailedNoRetry": "Gagal mengumpul ganjaran.", - "pool.incentives.collectingRewards": "Mengumpul ganjaran", - "pool.incentives.collectRewards": "Kumpul ganjaran", - "pool.incentives.collectRewardsCanceled": "Kumpul ganjaran dibatalkan", - "pool.incentives.daysLeft": "hari lagi", - "pool.incentives.eligible": "Kumpulan yang layak mempunyai ganjaran token supaya anda boleh memperoleh lebih banyak", - "pool.incentives.merklDocs": "Dikira oleh Merkl daripada ganjaran pelepasan dan kumpulan TVL.", - "pool.incentives.rewardsDistribution": "Pengagihan ganjaran", - "pool.incentives.rewardsEarned": "Ganjaran diperolehi", - "pool.incentives.similarPoolHasRewards": "Kumpulan yang serupa mempunyai ganjaran UNI", - "pool.incentives.switchPools": "Tukar kolam", - "pool.incentives.timePeriod": "Tempoh masa", - "pool.incentives.uni.findMore": "Cari kumpulan dengan ganjaran UNI", - "pool.incentives.yourRewards.error": "Ganjaran anda tidak tersedia sekarang", - "pool.incentives.yourRewards.error.description": "Ganjaran tidak dapat diperoleh. Ini mungkin disebabkan oleh isu rangkaian. Cuba muat semula halaman.", - "pool.info": "Maklumat kolam", - "pool.limitFluctuation.warning": "Harap maklum bahawa pelaksanaan untuk had mungkin berbeza-beza berdasarkan turun naik pasaran masa nyata dan kesesakan rangkaian Ethereum. Had mungkin tidak dilaksanakan tepat apabila token mencapai harga yang ditentukan.", - "pool.liquidity.data.error.message": "Terdapat ralat semasa mengambil data yang diperlukan untuk transaksi anda.", - "pool.liquidity.outOfSync": "Kolam dan ketidakpadanan harga pasaran", - "pool.liquidity.outOfSync.message": "Harga dalam kumpulan ini berbeza dengan harga pasaran token yang dipilih. Laraskan julat harga anda dengan sewajarnya atau tunggu kumpulan untuk mengimbangi semula untuk mengelakkan kerugian.", - "pool.maxPrice": "Harga maks", - "pool.migrateLiquidity": "Berhijrah kecairan", - "pool.migrateLiquidityDisabledTooltip": "Rantaian ini tidak menyokong kumpulan kecairan v4.", - "pool.migrateToV4": "Berhijrah ke v4", - "pool.minPrice": "Harga min", - "pool.newPosition.plus": "+ Jawatan baru", - "pool.newPosition.title": "Jawatan baru", - "pool.newSpecificPosition": "Kedudukan {{symbol}} baharu", - "pool.notAvailableOnSolana": "Kolam renang tidak tersedia di Solana", - "pool.notFound.description": "Maaf, kami tidak dapat mencari sebarang maklumat untuk kolam ini. Semak nama dan alamat dan cuba lagi.", - "pool.notFound.title": "Kolam tidak ditemui", - "pool.openToStart.evmAndSolanaConnected": "Buka kedudukan baharu atau buat kolam untuk bermula. Kolam renang tidak tersedia di Solana.", - "pool.openToStart.evmOnly": "Buka kedudukan baharu atau buat kolam untuk bermula.", - "pool.percent": "{{pct}}% kolam", - "pool.pooled": "Disatukan {{sym}}:", - "pool.position": "kedudukan", - "pool.positions": "jawatan", - "pool.positions.title": "jawatan anda", - "pool.positions.transaction.settings": "Tetapan urus niaga", - "pool.positions.usdValueUnavailable": "Nilai USD tidak tersedia", - "pool.positions.usdValueUnavailable.tooltip": "Nilai USD tidak tersedia pada masa ini untuk kedudukan ini. Lihat butiran kedudukan untuk jumlah token yang didepositkan.", - "pool.refresh.prices": "Muat semula harga", - "pool.removeLiquidity": "Keluarkan kecairan", - "pool.rewardAPR": "APR Ganjaran (UNI)", - "pool.rewardAPR.percent": "{{pct}} ganjaran APR", - "pool.rewards": "Ganjaran", - "pool.rewardsPool.label": "Token kumpulan dalam kumpulan ganjaran:", - "pool.selectPair": "Pilih pasangan", - "pool.share.label": "Bahagian kolam anda:", - "pool.specificPosition": "{{symbol}} kedudukan", - "pool.tokenPair": "Pasangan token", - "pool.top.rewards": "Kolam dengan ganjaran", - "pool.top.tvl": "Kolam teratas oleh TVL", - "pool.top.volume": "Kumpulan mengikut volum 24J", - "pool.totalAPR": "Jumlah APR", - "pool.totalTokens": "Jumlah token kolam anda:", - "pool.v2": "kolam v2", - "pool.v3": "kolam v3", - "pool.via": "{{tokenPair}} melalui {{dex}}", - "pool.volOverTvl": "1D vol/TVL", - "pool.volume.thirtyDay": "volum 30 hari", - "pool.volume.thirtyDay.short": "30D jld", - "pool.withdrawAs": "Tarik balik sebagai {{nativeWrappedSymbol}}", - "poolFinder.availablePools": "Kolam yang tersedia", - "poolFinder.availablePools.found.description": "kolam v2 sepadan dengan pilihan pasangan anda.", - "poolFinder.availablePools.notFound.description": "Tiada kumpulan v2 yang sepadan ditemui. Semak semula pemilihan token anda dan pastikan anda disambungkan ke dompet yang betul.", - "pools.explore": "Terokai kolam", - "portfolio.activity.filters.timePeriod.all": "Setiap masa", - "portfolio.activity.filters.transactionType.all": "Semua jenis", - "portfolio.activity.filters.transactionType.deposits": "Deposit", - "portfolio.activity.filters.transactionType.staking": "mempertaruhkan", - "portfolio.activity.filters.transactionType.swaps": "Pertukaran", - "portfolio.activity.title": "Aktiviti", - "portfolio.connectWallet.summary": "Jejaki token, kumpulan dan banyak lagi merentasi {{amount}}+ rangkaian", - "portfolio.defi.title": "DeFi", - "portfolio.description": "Jejaki portfolio kripto anda merentas semua rantaian dan protokol", - "portfolio.nfts.title": "NFT", - "portfolio.overview.title": "Gambaran keseluruhan", - "portfolio.title": "Portfolio", - "portfolio.tokens.table.column.allocation": "Peruntukan", - "portfolio.tokens.table.column.balance": "Seimbang", - "portfolio.tokens.table.column.change1d": "Perubahan 1D", - "portfolio.tokens.table.column.price": "harga", - "portfolio.tokens.table.column.token": "Token", - "portfolio.tokens.table.column.value": "Nilai", - "portfolio.tokens.title": "Token", - "position.addHook": "Tambah Cangkuk", - "position.addHook.tooltip": "Cangkuk ialah ciri lanjutan yang membolehkan kumpulan berinteraksi dengan kontrak pintar, membuka kunci pelbagai keupayaan. Berhati-hati apabila menambah cangkuk, kerana sesetengahnya mungkin berniat jahat atau menyebabkan akibat yang tidak diingini.", - "position.addingHook": "Menambah cangkuk", - "position.addingHook.disclaimer": "Menambah cangkuk mungkin mempunyai akibat yang tidak diingini. Lakukan penyelidikan anda dan teruskan atas risiko anda sendiri.", - "position.addingHook.hideProperties": "Sembunyikan sifat", - "position.addingHook.invalidAddress": "Masukkan alamat cangkuk yang sah", - "position.addingHook.viewProperties": "Lihat hartanah", - "position.create.confirm": "Sahkan kedudukan", - "position.create.invalidPrice": "Harga tidak sah", - "position.create.invalidRange": "Julat tidak sah", - "position.create.modal.header": "Mencipta kedudukan", - "position.create.unsupportedSolana": "Kolam Solana tidak disokong.", - "position.create.unsupportedSolana.description": "Untuk membuat kumpulan, tukar kepada rantaian EVM yang disokong.", - "position.create.unsupportedToken.description": "Cuba buat dengan versi protokol yang berbeza.", - "position.create.v2unsupportedChain": "Rantaian ini tidak disokong untuk kumpulan v2.", - "position.currentValue": "Nilai kedudukan semasa", - "position.default_price_strategies": "Strategi harga", - "position.default_price_strategies.error": "Tidak dapat menetapkan strategi harga", - "position.deposit.confirm.create.description.less": "Harga awal yang dimasukkan adalah {{value}}% kurang daripada harga pasaran dan boleh mengakibatkan kehilangan dana. Adakah anda ingin meneruskan?", - "position.deposit.confirm.create.description.more": "Harga awal yang dimasukkan adalah {{value}}% lebih daripada harga pasaran dan boleh mengakibatkan kehilangan dana. Adakah anda ingin meneruskan?", - "position.deposit.confirm.create.title": "Perbezaan harga yang besar dengan pasaran", - "position.deposit.description": "Nyatakan jumlah token untuk sumbangan kecairan anda.", - "position.depositedCurrency": "Didepositkan {{currencySymbol}}", - "position.fot.warning": "{{token}} dan token \"Yuran untuk pemindahan\" lain hanya disokong oleh Uniswap v2.", - "position.fot.warning.cta": "Buat kedudukan v2", - "position.hook.disclaimer": "Saya memahami potensi risiko yang terlibat dalam menambah cangkuk ini.", - "position.hook.donateWarning": "Bendera ini mungkin menyebabkan perubahan pada yuran yang diperoleh.", - "position.hook.liquidityWarning": "Bendera ini boleh menyebabkan kumpulan menyekat penambahan kecairan baharu. Transaksi anda mungkin kembali.", - "position.hook.removeWarning": "Boleh menyebabkan dana anda dikunci atau menghalang anda daripada mengutip yuran.", - "position.hook.swapWarning": "Bendera ini mungkin membenarkan penyedia kecairan untuk memanfaatkan kecairan Just-In-Time dengan lebih mudah, yang boleh menyebabkan yuran yang diperolehi lebih rendah.", - "position.hook.warningHeader": "Penting: risiko cangkuk dikenal pasti", - "position.hook.warningInfo": "Kami telah mengenal pasti potensi risiko dengan cangkuk ini. Sila pastikan anda memahami cara cangkuk ini berfungsi sebelum membuat keputusan untuk meneruskan.", - "position.increase.fot": "Menambah kecairan untuk {{token}} dan token “Yuran Pemindahan” lain tidak disokong.", - "position.initialPrice": "Harga permulaan", - "position.initialPrice.difference.negative": "{{ value }}% kurang daripada harga pasaran", - "position.initialPrice.difference.positive": "{{ value }}% lebih daripada harga pasaran", - "position.initialPrice.info": "Apabila membuat kumpulan baharu, anda mesti menetapkan kadar pertukaran permulaan untuk kedua-dua token. Kadar ini akan mencerminkan harga pasaran awal.", - "position.initialPrice.set": "Tetapkan harga awal", - "position.initialPrice.useMarketPrice": "Gunakan harga pasaran", - "position.migrate.liquidity": "Apabila memindahkan kedudukan, anda tidak boleh menukar pasangan token anda, tetapi anda boleh menambah cangkuk untuk meningkatkan fungsi.", - "position.migrate.v4unsupportedChain": "Rantaian ini tidak disokong untuk kumpulan v4.", - "position.new": "Jawatan baru", - "position.new.protocol": "Kedudukan baru {{protocol}}", - "position.notFound": "Kedudukan tidak ditemui", - "position.notFound.description": "Butiran mengenai jawatan ini tidak tersedia. Sila pastikan anda disambungkan dengan dompet yang betul.", - "position.one_sided_lower": "Sebelah bawah", - "position.one_sided_lower.description": "Kecairan bekalan jika harga turun", - "position.one_sided_upper": "Bahagian atas satu sisi", - "position.one_sided_upper.description": "Kecairan bekalan jika harga naik", - "position.protocol": "{{protocol}} kedudukan", - "position.provide.liquidity": "Pilih token yang anda ingin berikan kecairan. Anda boleh memilih token pada semua rangkaian yang disokong.", - "position.provide.liquidityDescription": "Menyediakan kecairan penuh memastikan penyertaan pasaran yang berterusan merentas semua harga yang mungkin, menawarkan kesederhanaan tetapi berpotensi untuk kerugian tidak kekal yang lebih tinggi.", - "position.provide.liquidityDescription.creatingPool": "Menetapkan kecairan penuh apabila mencipta kumpulan memastikan penyertaan pasaran berterusan merentas semua harga yang mungkin, menawarkan kesederhanaan tetapi berpotensi untuk kerugian tidak kekal yang lebih tinggi.", - "position.provide.liquidityDescription.custom": "Julat tersuai membolehkan anda menumpukan kecairan anda dalam had harga tertentu, meningkatkan kecekapan modal dan pendapatan yuran tetapi memerlukan pengurusan yang lebih aktif.", - "position.provide.outOfRange.closePosition": "Tutup kedudukan", - "position.provide.outOfRange.description": "Julat kedudukan ini tidak boleh dilaraskan semasa penghijrahan. Untuk menetapkan julat baharu, tutup kedudukan ini dan buka kedudukan v4 baharu.", - "position.provide.outOfRange.title": "Anda sedang memindahkan kedudukan di luar julat", - "position.removeHook": "Tanggalkan cangkuk", - "position.resetDescription": "Token, harga dan pilihan julat anda akan ditetapkan semula.", - "position.setRange": "Tetapkan julat harga", - "position.setRange.inputsBelow": "Gunakan input di bawah untuk menetapkan julat anda.", - "position.stable": "Stabil", - "position.stable.description": "Baik untuk stablecoin atau pasangan turun naik yang rendah", - "position.step.deposit": "Masukkan jumlah deposit", - "position.step.price": "Tetapkan harga awal dan jumlah deposit", - "position.step.range": "Tetapkan julat harga dan jumlah deposit", - "position.step.select": "Pilih pasangan token dan yuran", - "position.value": "Nilai kedudukan", - "position.valueUnavailable": "Nilai USD tidak tersedia pada masa ini untuk kedudukan ini. Lihat butiran kedudukan untuk jumlah token yang didepositkan.", - "position.wide": "lebar", - "position.wide.description": "Baik untuk pasangan yang tidak menentu", - "position.wrapped.unwrap": "Buka bungkus {{wrappedToken}}", - "position.wrapped.warning": "{{nativeToken}} diperlukan untuk kumpulan v4", - "position.wrapped.warning.info": "Buka {{wrappedToken}} anda dan deposit {{nativeToken}} untuk menyediakan kecairan yang lebih kos efektif dan cekap.", - "positions.noPositions.description": "Anda tidak mempunyai sebarang kedudukan mudah tunai. Cipta kedudukan baharu untuk mula memperoleh yuran dan ganjaran pada kumpulan yang layak.", - "positions.noPositions.title": "Tiada jawatan", - "positions.welcome.connect.description": "Untuk melihat kedudukan dan ganjaran anda, anda mesti menyambungkan dompet anda.", - "positions.welcome.connect.wallet": "Sambungkan dompet anda", - "privacy.anonymizedLogs": "Apl ini merekodkan statistik penggunaan tanpa nama untuk bertambah baik dari semasa ke semasa.", - "privacy.autoRouter": "Apl mengambil laluan perdagangan optimum daripada pelayan Uniswap Labs.", - "privacy.infura": "Apl ini mengambil data dalam rantaian dan membina panggilan kontrak dengan API Infura.", - "privacy.thirdPartyApis": "Apl ini menggunakan API pihak ketiga berikut:", - "privacy.trm": "Apl mengumpul alamat dompet anda dengan selamat dan berkongsi dengan TRM Labs Inc. atas sebab risiko dan pematuhan.", - "privacy.uniswaptos": "Syarat Perkhidmatan Makmal Uniswap", - "privateKeys.export.modal.speedbump.bullet1": "Lihat ini secara peribadi", - "privateKeys.export.modal.speedbump.bullet2": "Jangan kongsi ini dengan sesiapa", - "privateKeys.export.modal.speedbump.bullet3": "Jangan sekali-kali memasukkannya ke mana-mana tapak web atau apl", - "privateKeys.export.modal.speedbump.subtitle": "Sesiapa sahaja yang mengetahui kunci peribadi anda boleh mengakses dompet dan dana anda.", - "privateKeys.export.modal.speedbump.title": "Sebelum anda meneruskan", - "privateKeys.export.modal.subtitle": "Nampaknya anda tidak dapat memulihkan dompet anda sepenuhnya. Untuk memastikan anda tidak kehilangan akses kepada dana anda, salin kunci peribadi anda.", - "privateKeys.export.modal.title": "Eksport kunci peribadi anda", - "privateKeys.export.modal.warning": "Jika anda kehilangan telefon anda atau memadamkan apl, anda perlu mengimport kunci ini ke dalam dompet lain.", - "privateKeys.view.button.continue": "Saya menyalin kesemuanya.", - "privateKeys.view.button.continue.single": "Saya menyalinnya.", - "privateKeys.view.subtitle": "Kunci peribadi anda memberikan akses kepada dompet tertentu. Setiap dompet mempunyai kunci peribadi yang berbeza.", - "privateKeys.view.title": "Kunci Peribadi", - "qrScanner.button.connections_one": "1 apl disambungkan", - "qrScanner.button.connections_other": "{{count}} apl disambungkan", - "qrScanner.error.camera.message": "Untuk mengimbas kod, benarkan akses Kamera dalam tetapan sistem", - "qrScanner.error.camera.title": "Kamera dilumpuhkan", - "qrScanner.error.none": "Tiada kod QR ditemui", - "qrScanner.recipient.action.scan": "Imbas kod QR", - "qrScanner.recipient.action.show": "Tunjukkan kod QR saya", - "qrScanner.recipient.error.message": "Pastikan anda mengimbas kod QR alamat Ethereum yang sah sebelum mencuba lagi.", - "qrScanner.recipient.error.title": "Kod QR tidak sah", - "qrScanner.request.message.unavailable": "Tiada mesej ditemui.", - "qrScanner.request.method.default": "Permintaan daripada {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "Permintaan tandatangan daripada {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "Permintaan transaksi daripada {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "Benarkan {{dappName}} menggunakan sehingga {{amount}} {{currencySymbol}}?", - "qrScanner.request.withoutAmount": "Benarkan {{dappName}} menggunakan {{currencySymbol}}anda?", - "qrScanner.status.connecting": "Menyambung...", - "qrScanner.status.loading": "Memuatkan...", - "qrScanner.title": "Imbas kod QR", - "qrScanner.wallet.networks": "Rangkaian yang disokong", - "range.outOfView": "Jarak jauh dari pandangan", - "removeLiquidity.pooled": "Disatukan {{symbol}}:", - "revoke.failed.message": "Isu rangkaian atau sambungan mungkin menyebabkan pembatalan anda gagal. Semak sambungan anda dan cuba lagi.", - "routing.aggregateLiquidity": "Apabila tersedia, agregat sumber kecairan untuk harga yang lebih baik dan pertukaran bebas gas.", - "routing.aggregateLiquidity.uniswapx": "UniswapX mengagregatkan sumber kecairan dalam dan luar rantaian, memberikan anda harga terbaik yang tersedia dan pertukaran bebas gas.", - "routing.cheapest": "Pelanggan Uniswap memilih harga pemfaktoran pilihan perdagangan termurah dan kos rangkaian.", - "routing.cheapest.v4": "Pelanggan Uniswap memilih pemfaktoran pilihan perdagangan yang optimum dalam harga dan kos rangkaian.", - "scantastic.code.expired": "Tamat tempoh", - "scantastic.code.subtitle": "Masukkan kod ini dalam Sambungan Uniswap. Frasa pemulihan anda akan disulitkan dan dipindahkan dengan selamat.", - "scantastic.code.timeRemaining.shorthand.hours": "Kod baharu dalam {{hours}}h {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.minutes": "Kod baharu dalam {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.seconds": "Kod baharu dalam {{seconds}}s", - "scantastic.code.title": "Uniswap kod sekali", - "scantastic.confirmation.button.continue": "Ya, teruskan", - "scantastic.confirmation.label.browser": "pelayar", - "scantastic.confirmation.label.device": "Peranti", - "scantastic.confirmation.subtitle": "Hanya teruskan jika anda mengimbas kod QR daripada Sambungan Uniswap pada peranti yang dipercayai.", - "scantastic.confirmation.title": "Adakah anda cuba mengimport dompet anda?", - "scantastic.confirmation.warning": "Berhati-hati dengan tapak dan apl yang menyamar sebagai Uniswap. Jika tidak, dompet anda mungkin terjejas.", - "scantastic.error.encryption": "Gagal menyediakan frasa benih.", - "scantastic.error.noCode": "Tiada OTP diterima. Sila cuba lagi.", - "scantastic.error.timeout.message": "Imbas kod QR pada Sambungan Uniswap sekali lagi untuk meneruskan penyegerakan dompet anda.", - "scantastic.error.timeout.title": "Sambungan anda tamat masa", - "scantastic.modal.ipMismatch.description": "Untuk mengimbas kod QR ini, telefon anda mesti disambungkan ke rangkaian WiFi yang sama seperti komputer anda dan mana-mana VPN hendaklah dimatikan buat sementara waktu.", - "scantastic.modal.ipMismatch.title": "Tukar rangkaian WiFi anda", - "search.input.placeholder": "Cari token dan kolam", - "search.ukDisclaimer": "Penafian untuk penduduk UK", - "send.button.review": "Semak semula pemindahan", - "send.gas.error.title": "T/A", - "send.gas.networkCost.title": "Kos rangkaian", - "send.input.token.balance.title": "Baki: {{balance}} {{symbol}}", - "send.recipient.header": "Pilih penerima", - "send.recipient.input.placeholder": "Cari ENS atau alamat", - "send.recipient.previous_one": "1 pemindahan sebelumnya", - "send.recipient.previous_other": "{{count}} pemindahan sebelumnya", - "send.recipient.results.empty": "Tiada keputusan dijumpai", - "send.recipient.results.error": "Alamat yang anda taip sama ada tidak wujud atau dieja dengan salah.", - "send.recipient.section.favorite": "Dompet kegemaran", - "send.recipient.section.recent": "Baru-baru ini", - "send.recipient.section.search": "Keputusan Carian", - "send.recipient.section.viewOnly": "Dompet lihat sahaja", - "send.recipient.section.yours": "dompet anda", - "send.recipient.warning.viewOnly.message": "Hanya hantar dana ke dompet ini jika anda mempunyai frasa pemulihan atau mengenali pemilik dompet itu.", - "send.recipient.warning.viewOnly.title": "Anda mempunyai ini sebagai dompet lihat sahaja", - "send.recipientSelect.search.empty.message": "Apabila anda menghantar token ke alamat dompet, ia akan dipaparkan di sini", - "send.recipientSelect.search.empty.title": "Tiada dompet disimpan", - "send.review.modal.title": "Anda menghantar", - "send.review.summary.button.title": "Sahkan hantar", - "send.search.empty.subtitle": "Alamat yang anda taip sama ada tidak wujud atau dieja dengan salah.", - "send.search.empty.title": "Tiada keputusan dijumpai", - "send.search.placeholder": "Cari ENS atau alamat", - "send.solanaSendNotSupported": "Hantar tidak disokong pada Solana", - "send.title": "Hantar", - "send.unavailableOnSolana.message": "Penghantaran tidak tersedia pada dompet Solana", - "send.warning.blocked.default": "Dompet ini disekat", - "send.warning.blocked.modal.message": "Alamat ini disekat pada Uniswap Wallet kerana ia dikaitkan dengan satu atau lebih aktiviti yang disekat. Jika anda percaya ini adalah satu ralat, sila e-mel compliance@uniswap.org.", - "send.warning.blocked.modal.title": "Alamat disekat", - "send.warning.blocked.recipient": "Dompet penerima disekat", - "send.warning.erc20.checkbox.description": "Anda cuba menghantar dana ke alamat token. Ini boleh mengakibatkan kehilangan dana kekal.", - "send.warning.erc20.checkbox.heading": "Alamat token dikesan", - "send.warning.erc20.message": "Anda cuba menghantar dana ke alamat token. Menghantar crypto ke alamat jenis ini boleh mengakibatkan kehilangan dana kekal.", - "send.warning.erc20.title": "Ini adalah alamat token", - "send.warning.insufficientFunds.message": "Baki {{currencySymbol}} anda telah berkurangan sejak anda memasukkan jumlah yang anda ingin hantar", - "send.warning.insufficientFunds.title": "Tidak cukup {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "Tidak cukup {{currencySymbol}} pada {{networkName}} untuk dihantar", - "send.warning.insufficientGas.message.withoutNetwork": "Tidak cukup {{currencySymbol}} untuk dihantar", - "send.warning.modal.button.cta.blocking": "okey", - "send.warning.modal.button.cta.cancel": "Batal", - "send.warning.modal.button.cta.confirm": "sahkan", - "send.warning.newAddress.details.ENS": "ENS", - "send.warning.newAddress.details.username": "Nama pengguna", - "send.warning.newAddress.details.walletAddress": "Alamat Dompet", - "send.warning.newAddress.message": "Anda tidak pernah berurusan dengan alamat ini sebelum ini. Sila sahkan bahawa alamat adalah betul sebelum meneruskan.", - "send.warning.newAddress.title": "Alamat baru", - "send.warning.self.message": "Anda cuba menghantar dana ke dompet semasa anda. Menghantar crypto ke alamat ini akan menanggung kos rangkaian yang tidak perlu.", - "send.warning.self.title": "Ini adalah dompet semasa anda", - "send.warning.smartContract.message": "Anda akan menghantar dana ke alamat kontrak pintar. Pastikan ini adalah alamat yang betul dan ia boleh menerima token. Jika tidak, ini boleh mengakibatkan kehilangan dana kekal.", - "send.warning.smartContract.title": "Ini ialah alamat kontrak pintar", - "send.warning.viewOnly.message": "Anda perlu mengimport dompet ini melalui frasa pemulihan untuk menghantar aset.", - "send.warning.viewOnly.title": "Dompet ini adalah lihat sahaja", - "send.youAreSending": "Anda menghantar", - "sendRecipientForm.recentAddresses.label": "Terkini", - "sendReviewModal.title": "Semakan hantar", - "setting.recoveryPhrase.account.show": "Tunjukkan frasa pemulihan", - "setting.recoveryPhrase.action.hide": "Sembunyikan frasa pemulihan", - "setting.recoveryPhrase.remove": "Alih keluar frasa pemulihan", - "setting.recoveryPhrase.remove.confirm.subtitle": "Saya faham bahawa Uniswap Labs tidak dapat membantu saya mendapatkan semula dompet saya jika saya gagal berbuat demikian", - "setting.recoveryPhrase.remove.confirm.title": "Saya menyimpan frasa pemulihan saya", - "setting.recoveryPhrase.remove.initial.subtitle": "Pastikan anda telah menyimpan frasa pemulihan anda. Anda akan kehilangan akses kepada dana anda jika tidak", - "setting.recoveryPhrase.remove.initial.title": "Sebelum anda meneruskan", - "setting.recoveryPhrase.remove.subtitle": "Masukkan kata laluan anda untuk meneruskan", - "setting.recoveryPhrase.remove.title": "Anda sedang mengalih keluar frasa pemulihan anda", - "setting.recoveryPhrase.view.warning.message1": "Sesiapa sahaja yang mengetahui frasa pemulihan anda boleh mengakses dompet dan dana anda", - "setting.recoveryPhrase.view.warning.message2": "Lihat ini secara peribadi", - "setting.recoveryPhrase.view.warning.message3": "Jangan kongsi ini dengan sesiapa", - "setting.recoveryPhrase.view.warning.message4": "Jangan sekali-kali memasukkannya ke mana-mana tapak web atau apl", - "setting.recoveryPhrase.view.warning.title": "Sebelum anda meneruskan", - "setting.recoveryPhrase.warning.view.message": "Sesiapa sahaja yang mengetahui frasa pemulihan anda boleh mengakses dompet dan dana anda.", - "setting.recoveryPhrase.warning.view.title": "Lihat ini di tempat peribadi", - "settings.action.enableInSettings": "Dayakan dalam Tetapan", - "settings.action.feedback": "Hantar maklumbalas", - "settings.action.help": "Dapatkan bantuan", - "settings.action.lock": "Kunci dompet", - "settings.action.privacy": "Dasar privasi", - "settings.action.terms": "Syarat perkhidmatan", - "settings.connectWalletPlatform.warning": "Untuk menggunakan Uniswap pada {{platform}}, sambung ke dompet yang menyokong {{platform}}.", - "settings.footer": "Dibuat dengan penuh kasih sayang, \nPasukan Uniswap 🦄", - "settings.hideSmallBalances": "Sembunyikan baki kecil", - "settings.hideSmallBalances.subtitle": "Baki di bawah 1 USD akan disembunyikan daripada portfolio anda.", - "settings.maxSlippage": "Maks. gelinciran", - "settings.maxSlippage.amount": "{{amount}} maks. gelinciran", - "settings.section.about": "Tentang", - "settings.section.preferences": "Keutamaan", - "settings.section.privacyAndSecurity": "Privasi dan keselamatan", - "settings.section.support": "Sokongan", - "settings.section.wallet.hidden.row.title": "{{numHidden}} dompet lain", - "settings.setting.advanced.title": "Maju", - "settings.setting.advancedSettings": "Advanced settings", - "settings.setting.appearance.option.auto": "Auto", - "settings.setting.appearance.option.dark.subtitle": "Sentiasa gunakan tema gelap.", - "settings.setting.appearance.option.dark.title": "Gelap", - "settings.setting.appearance.option.device.subtitle": "Menyesuaikan diri dengan tetapan peranti anda.", - "settings.setting.appearance.option.device.title": "Auto", - "settings.setting.appearance.option.light.subtitle": "Sentiasa gunakan tema ringan.", - "settings.setting.appearance.option.light.title": "Cahaya", - "settings.setting.appearance.title": "Tema", - "settings.setting.backup.create.description": "Menetapkan kata laluan akan menyulitkan sandaran frasa pemulihan anda, menambahkan tahap perlindungan tambahan jika akaun {{cloudProviderName}} anda pernah terjejas.", - "settings.setting.backup.create.title": "Sandarkan kepada {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "Oleh kerana dompet ini berkongsi frasa pemulihan, ia juga akan memadamkan sandaran untuk dompet ini di bawah", - "settings.setting.backup.delete.confirm.title": "Adakah anda pasti?", - "settings.setting.backup.delete.warning": "Jika anda memadamkan sandaran {{cloudProviderName}} anda, anda hanya akan dapat memulihkan dompet anda dengan sandaran manual frasa pemulihan anda. Uniswap Labs tidak dapat memulihkan aset anda jika anda kehilangan frasa pemulihan anda.", - "settings.setting.backup.error.message.full": "Tidak dapat menyandarkan frasa pemulihan kepada {{cloudProviderName}}. Sila pastikan anda telah mendayakan {{cloudProviderName}} dengan ruang storan yang tersedia dan cuba lagi.", - "settings.setting.backup.error.message.short": "Tidak dapat memadamkan sandaran", - "settings.setting.backup.error.title": "{{cloudProviderName}} ralat", - "settings.setting.backup.modal.description": "Anda belum menyandarkan frasa pemulihan anda ke {{cloudProviderName}} lagi. Dengan berbuat demikian, anda boleh memulihkan dompet anda hanya dengan log masuk ke {{cloudProviderName}} pada mana-mana peranti.", - "settings.setting.backup.modal.title": "Sandarkan frasa pemulihan ke {{cloudProviderName}}?", - "settings.setting.backup.password.error.mismatch": "Kata laluan tidak sepadan", - "settings.setting.backup.password.medium": "Ini adalah kata laluan sederhana", - "settings.setting.backup.password.placeholder.confirm": "Sahkan kata laluan", - "settings.setting.backup.password.placeholder.create": "Bina kata laluan", - "settings.setting.backup.password.strong": "Ini adalah kata laluan yang kuat", - "settings.setting.backup.password.weak": "Ini adalah kata laluan yang lemah", - "settings.setting.backup.recoveryPhrase.label": "Frasa pemulihan", - "settings.setting.backup.selected": "{{cloudProviderName}} sandaran", - "settings.setting.backup.status.action.delete": "Padamkan sandaran", - "settings.setting.backup.status.complete": "Disandarkan kepada {{cloudProviderName}}", - "settings.setting.backup.status.description": "Dengan membuat sandaran frasa pemulihan anda kepada {{cloudProviderName}}, anda boleh memulihkan dompet anda hanya dengan log masuk ke akaun {{cloudProviderName}} anda pada mana-mana peranti.", - "settings.setting.backup.status.inProgress": "Membuat sandaran kepada {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "Disokong", - "settings.setting.backup.status.title": "{{cloudProviderName}} sandaran", - "settings.setting.beta.tooltip": "Akan datang", - "settings.setting.biometrics.appAccess.subtitle.android": "Memerlukan muka/cap jari untuk membuka apl.", - "settings.setting.biometrics.appAccess.subtitle.ios": "Memerlukan {{biometricsMethod}} untuk membuka apl.", - "settings.setting.biometrics.appAccess.title": "Akses apl", - "settings.setting.biometrics.auth": "Sila sahkan", - "settings.setting.biometrics.extension.waitingForBiometricsModal.content": "Dayakan {{biometricsMethod}} dalam tetapan penyemak imbas atau sistem anda untuk meneruskan.", - "settings.setting.biometrics.extension.waitingForBiometricsModal.title": "Menunggu {{biometricsMethod}}", - "settings.setting.biometrics.off.message.android": "Biometrik pada masa ini dimatikan untuk Uniswap Wallet—anda boleh menghidupkannya dalam tetapan sistem anda.", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} sedang dimatikan untuk Uniswap Wallet—anda boleh menghidupkannya dalam tetapan sistem anda.", - "settings.setting.biometrics.off.title.android": "Biometrik dimatikan", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} dimatikan", - "settings.setting.biometrics.title": "Buka kunci muka/cap jari", - "settings.setting.biometrics.transactions.subtitle.android": "Memerlukan cap muka/jari untuk berurus niaga.", - "settings.setting.biometrics.transactions.subtitle.ios": "Memerlukan {{biometricsMethod}} untuk berurus niaga.", - "settings.setting.biometrics.transactions.title": "Transaksi", - "settings.setting.biometrics.unavailable.message.android": "Biometrik tidak disediakan pada peranti anda. Untuk menggunakan biometrik, sediakannya dahulu dalam Tetapan.", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} tidak disediakan pada peranti anda. Untuk menggunakan {{biometricsMethod}}, sediakannya dahulu dalam Tetapan.", - "settings.setting.biometrics.unavailable.title.android": "Biometrik tidak disediakan", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} bukan persediaan", - "settings.setting.biometrics.warning.message.android": "Jika anda tidak menghidupkan biometrik, sesiapa sahaja yang mendapat akses kepada peranti anda boleh membuka Uniswap Wallet dan membuat transaksi.", - "settings.setting.biometrics.warning.message.ios": "Jika anda tidak menghidupkan {{biometricsMethod}}, sesiapa sahaja yang mendapat akses kepada peranti anda boleh membuka Uniswap Wallet dan membuat transaksi.", - "settings.setting.biometrics.warning.title": "Adakah anda pasti?", - "settings.setting.connections.disconnectAll": "Putuskan sambungan semua", - "settings.setting.connections.noConnectionsDescription": "Sambung ke apl dengan mencari butang \"Sambung Dompet\" atau \"Log masuk\".", - "settings.setting.currency.title": "Mata wang tempatan", - "settings.setting.deviceAccess.reset.title": "Tetapkan semula {{biometricsMethod}}anda", - "settings.setting.deviceAccess.title": "Akses peranti", - "settings.setting.deviceAccessTimeout.1hour": "1 jam", - "settings.setting.deviceAccessTimeout.24hours": "24 jam", - "settings.setting.deviceAccessTimeout.30minutes": "30 min", - "settings.setting.deviceAccessTimeout.5minutes": "5 min", - "settings.setting.deviceAccessTimeout.never": "tidak pernah", - "settings.setting.deviceAccessTimeout.title": "Autokunci tamat masa", - "settings.setting.hapticTouch.title": "Sentuhan haptik", - "settings.setting.helpCenter.title": "Pusat bantuan", - "settings.setting.language.button.navigate": "Pergi ke tetapan", - "settings.setting.language.description.extension": "Uniswap lalai kepada tetapan bahasa sistem anda. Untuk menukar bahasa pilihan anda, pergi ke tetapan sistem anda.", - "settings.setting.language.description.mobile": "Uniswap lalai kepada tetapan bahasa peranti anda. Untuk menukar bahasa pilihan anda, pergi ke \"Uniswap\" dalam tetapan peranti anda dan ketik pada \"Bahasa\".", - "settings.setting.language.title": "Bahasa", - "settings.setting.notifications.row.activity.description": "Pemindahan, permintaan dan aktiviti lain", - "settings.setting.notifications.row.activity.title": "Aktiviti dompet", - "settings.setting.notifications.row.updates.description": "Pengesyoran dan ciri baharu", - "settings.setting.notifications.row.updates.title": "Kemas kini daripada Uniswap", - "settings.setting.notifications.title": "Pemberitahuan", - "settings.setting.password.change.title": "Buat kata laluan baharu", - "settings.setting.password.title": "Tukar kata laluan", - "settings.setting.permissions.title": "kebenaran", - "settings.setting.privacy.analytics.description": "Kami menggunakan data penggunaan tanpa nama untuk meningkatkan pengalaman anda merentas produk Uniswap Labs. Apabila dilumpuhkan, kami hanya menjejaki ralat dan penggunaan penting.", - "settings.setting.privacy.analytics.title": "Analitis apl", - "settings.setting.privateKeys.title": "Kunci peribadi", - "settings.setting.recoveryPhrase.title": "Frasa pemulihan", - "settings.setting.smallBalances.title": "Baki portfolio", - "settings.setting.smartWallet.action.enable": "Dayakan", - "settings.setting.smartWallet.action.smartWallet": "Smart wallet", - "settings.setting.smartWallet.notEligible": "Tidak layak", - "settings.setting.smartWallet.status.actionRequired": "Tindakan diperlukan", - "settings.setting.smartWallet.status.active": "Aktif", - "settings.setting.smartWallet.status.inactive": "Tidak aktif", - "settings.setting.smartWallet.status.unavailable": "Tidak ada", - "settings.setting.unknownTokens.subtitle": "Token penipuan yang berpotensi akan disembunyikan daripada portfolio anda.", - "settings.setting.unknownTokens.title": "Sembunyikan token yang tidak diketahui", - "settings.setting.wallet.action.editLabel": "Edit label", - "settings.setting.wallet.action.editProfile": "Sunting profil", - "settings.setting.wallet.action.remove": "Keluarkan dompet", - "settings.setting.wallet.connection.banner.description": "Urus sambungan melalui tetapan dompet, dengan mengklik imej profil anda.", - "settings.setting.wallet.connection.banner.title": "Sambungan telah berpindah", - "settings.setting.wallet.connections.title": "Sambungan", - "settings.setting.wallet.editLabel.description": "Label bukan umum. Ia disimpan secara tempatan dan hanya kelihatan kepada anda.", - "settings.setting.wallet.editLabel.save": "Simpan perubahan", - "settings.setting.wallet.label": "nama samaran", - "settings.setting.wallet.testnetMode.description": "Ini menghidupkan testnets untuk pembangun mencuba ciri dan transaksi tanpa menggunakan aset sebenar. Token pada testnets tidak mempunyai sebarang nilai sebenar.", - "settings.setting.wallet.testnetMode.title": "Mod Testnet", - "settings.switchNetwork.warning": "Untuk menggunakan Uniswap pada {{label}}, tukar rangkaian dalam tetapan dompet anda.", - "settings.title": "tetapan", - "settings.version": "Versi {{appVersion}}", - "smartWallet.actionRequired.cta": "Lumpuhkan pada 1 rangkaian", - "smartWallet.actionRequired.cta.plural": "Lumpuhkan pada rangkaian {{amount}}", - "smartWallet.actionRequired.description": "Melumpuhkan dompet pintar ialah tindakan onchain yang memerlukan kos rangkaian yang kecil.", - "smartWallet.actionRequired.insufficientFunds": "Kekurangan dana", - "smartWallet.actionRequired.reactivate": "Teruskan menggunakan dompet pintar", - "smartWallet.actionRequired.title": "Dompet pintar aktif pada 1 rangkaian", - "smartWallet.actionRequired.title.plural": "Dompet pintar aktif pada rangkaian {{amount}}", - "smartWallet.activeNetworks.title": "Dompet pintar aktif pada 1 rangkaian", - "smartWallet.activeNetworks.title.plural": "Dompet pintar aktif pada rangkaian {{amount}}", - "smartWallet.banner.networkCost": "Includes a one-time cost to activate your smart wallet on {{chainName}}.", - "smartWallet.banner.text": "Dayakan dompet pintar untuk menjimatkan sehingga 50% kos rangkaian.", - "smartWallet.confirmDisableSmartWallet.description": "Anda akan terlepas swap yang lebih pantas, kos rangkaian diskaun dan peningkatan lain yang akan datang.", - "smartWallet.confirmDisableSmartWallet.title": "Adakah anda pasti?", - "smartWallet.insufficient.description": "Dompet pintar tidak boleh dilumpuhkan pada rangkaian ini sehingga anda mempunyai dana untuk menampung kos rangkaian.", - "smartWallet.insufficient.title": "Dana tidak mencukupi pada 1 rangkaian", - "smartWallet.insufficient.title.plural": "Dana tidak mencukupi pada rangkaian {{amount}}", - "smartWallet.InsufficientFunds.button.continue.text": "Teruskan juga", - "smartWallet.insufficientFunds.network.banner.description": "Tidak boleh melumpuhkan kerana dana tidak mencukupi.", - "smartWallet.insufficientFunds.network.banner.title_one": "{{count}} rangkaian dikecualikan", - "smartWallet.insufficientFunds.network.banner.title_other": "{{count}} rangkaian dikecualikan", - "smartWallet.insufficientFunds.network.disable.text": "Bersedia untuk melumpuhkan", - "smartWallet.insufficientFunds.network.text": "Anda perlukan {{nativeCurrency}}", - "smartWallet.insufficientFunds.single.network.banner.title": "{{chain}} dikecualikan", - "smartWallet.modal.description.block1": "Dompet pintar menggunakan kontrak pintar untuk transaksi yang lebih pantas dan kos lebih rendah.", - "smartWallet.modal.description.block2": "Dompet yang sudah menggunakan ciri dompet pintar daripada apl lain tidak akan terjejas.", - "smartWallet.modal.title": "Dompet Pintar", - "smartWallets": "Dompet Pintar", - "smartWallets.activeNetworks.description": "Dompet pintar anda diaktifkan secara automatik merentas setiap rangkaian baharu yang anda tukar.", - "smartWallets.createdModal.description": "You’re getting faster transactions and lower network costs on every swap.", - "smartWallets.createdModal.title": "Dompet pintar dicipta", - "smartWallets.delegation.limitedSupport": "Dompet anda mempunyai sokongan terhad", - "smartWallets.delegationMismatchModal.description": "{{walletName}} tidak menyokong piawaian Ethereum terkini yang digunakan oleh {{displayName}}, jadi beberapa ciri tidak tersedia.", - "smartWallets.delegationMismatchModal.features.1ClickSwaps": "Swap 1 klik", - "smartWallets.delegationMismatchModal.features.gasFreeSwaps": "Pertukaran bebas gas", - "smartWallets.delegationMismatchModal.features.limitOrders": "Hadkan pesanan", - "smartWallets.delegationMismatchModal.limitOrders.unsupported": "Had pesanan tidak disokong oleh dompet anda.", - "smartWallets.delegationMismatchModal.title": "Sokongan dompet terhad", - "smartWallets.disable.failed": "Ralat berlaku. Dompet pintar masih aktif pada 1 atau lebih rangkaian. Sila cuba lagi.", - "smartWallets.disable.modal.description": "Tindakan onchain ini memerlukan kos rangkaian.", - "smartWallets.disable.modal.title": "Lumpuhkan dompet pintar", - "smartWallets.educationalModal.description": "Dompet pintar menyediakan transaksi yang lebih pantas dan kos rendah menggunakan kontrak pintar.", - "smartWallets.educationalModal.info": "Dompet yang sudah menggunakan ciri dompet pintar daripada apl lain tidak akan terjejas.", - "smartWallets.enabledModal.description": "Kemas kini akan berkuat kuasa pada pertukaran anda yang seterusnya.", - "smartWallets.enabledModal.description.dapp": "Kemas kini akan berkuat kuasa pada transaksi anda yang seterusnya.", - "smartWallets.enabledModal.description.dapp.line2": "Sambung semula dompet anda untuk mula menggunakan ciri dompet pintar pada apl dengan segera.", - "smartWallets.enabledModal.title": "Dompet pintar didayakan", - "smartWallets.postSwapNudge.enable": "Dayakan dompet pintar", - "smartWallets.postSwapNudge.title": "Jimat pada pertukaran seterusnya", - "smartWallets.postSwapNudge.title.dapp": "Aplikasi ini menyokong dompet pintar", - "smartWallets.unavailableModal.description": "Pembekal dompet yang berbeza kini menguruskan tetapan dompet pintar untuk {{displayName}}. Anda boleh terus menggunakan Uniswap seperti biasa.", - "smartWallets.unavailableModal.title": "Ciri dompet pintar tidak tersedia", - "solanaPromo.banner.description": "Berdagang token Solana terus pada Uniswap.", - "solanaPromo.banner.title": "Solana kini tersedia", - "solanaPromo.modal.connectWallet": "Sambungkan dompet Solana kegemaran anda", - "solanaPromo.modal.startSwapping.button": "Mula bertukar pada Solana", - "solanaPromo.modal.swapInstantly": "Tukar beribu-ribu token arah aliran serta-merta", - "solanaPromo.modal.viewTokenData": "Lihat data token dan harga di satu tempat", - "speedBump.newAddress.warning.description": "Anda tidak pernah berurusan dengan alamat ini sebelum ini. Pastikan ia adalah alamat yang betul sebelum meneruskan.", - "speedBump.newAddress.warning.title": "Alamat baru", - "speedBump.smartContractAddress.warning.description": "Anda akan menghantar token ke jenis alamat khas - kontrak pintar. Semak semula alamat yang ingin anda hantar. Jika salah, token anda boleh hilang selama-lamanya.", - "speedBump.smartContractAddress.warning.title": "Adakah ini alamat dompet?", - "stats.24fees": "Yuran 24H", - "stats.24swapVolume": "Kelantangan pertukaran 24H", - "stats.24volume": "isipadu 24H", - "stats.allTimeSwappers": "Semua penukar masa", - "stats.allTimeVolume": "Jumlah sepanjang masa", - "stats.fdv": "FDV", - "stats.fdv.description": "Penilaian dicairkan sepenuhnya (FDV) mengira jumlah nilai pasaran dengan mengandaikan semua token dalam edaran.", - "stats.marketCap": "Modal pasaran", - "stats.marketCap.description": "Permodalan pasaran ialah jumlah nilai pasaran bagi bekalan edaran aset.", - "stats.noStatsAvailable": "Tiada statistik tersedia", - "stats.tvl": "Jumlah nilai dikunci", - "stats.tvl.description": "Jumlah nilai terkunci (TVL) ialah jumlah agregat aset yang tersedia di semua kumpulan kecairan Uniswap.", - "stats.volume.1d": "volum 1 hari", - "stats.volume.1d.description": "Jumlah 1 hari ialah amaun aset yang telah didagangkan di Uniswap sepanjang 24 jam yang lalu.", - "stats.volume.1d.long": "kelantangan 1D", - "stats.volume.1d.short": "1D jld", - "stats.volume.description": "Volum ialah amaun aset yang telah didagangkan di Uniswap dalam tempoh masa yang dipilih.", - "swap.allow.oneTime": "Benarkan {{sym}} (sekali)", - "swap.approveAndSubmit": "Lulus dan serahkan", - "swap.approveAndSwap": "Lulus dan tukar", - "swap.balance.amount": "Baki: {{amount}}", - "swap.bestPrice.through": "Laluan melalui {{provider}}", - "swap.bestRoute.cost": "Laluan paling cekap dianggarkan bernilai ~{{gasPrice}} dalam kos rangkaian. ", - "swap.bridging.title": "Bertukar merentasi rangkaian", - "swap.bridging.warning.description": "Anda bertukar daripada {{fromNetwork}} kepada {{toNetwork}}. Ini juga dikenali sebagai \"merapatkan\", yang memindahkan token anda dari satu rangkaian ke rangkaian yang lain.", - "swap.button.confirmSignAndSwap": "Sahkan tandatangan dan tukar", - "swap.button.confirmSwapAnyways": "Sahkan pertukaran juga", - "swap.button.confirmUnwrap": "Sahkan buka bungkus", - "swap.button.max": "Maks", - "swap.button.review": "Semakan", - "swap.button.submitting": "Menyerahkan pertukaran...", - "swap.button.submitting.keep.open": "Pastikan dompet anda terbuka...", - "swap.button.submitting.passkey": "Sahkan dengan kunci laluan", - "swap.button.swap": "Tukar", - "swap.button.swapAnyways": "Bertukar pula", - "swap.button.unwrap": "Buka bungkus", - "swap.button.wrap": "Bungkus", - "swap.buy.countryModal.placeholder": "Cari mengikut negara atau wilayah", - "swap.cancel.cannotExecute_one": "Pertukaran anda boleh dilaksanakan sebelum pembatalan diproses. Kos rangkaian anda tidak boleh dikembalikan. Adakah anda ingin meneruskan?", - "swap.cancel.cannotExecute_other": "Swap anda boleh dilaksanakan sebelum pembatalan diproses. Kos rangkaian anda tidak boleh dikembalikan. Adakah anda ingin meneruskan?", - "swap.confirmApproveAndSwap": "Sahkan meluluskan dan menukar", - "swap.confirmLimit": "Sahkan had", - "swap.confirmSwap": "Sahkan pertukaran", - "swap.confirmWrap": "Confirm bungkus", - "swap.deadline.settings.title": "Tarikh akhir pertukaran", - "swap.deadline.settings.title.short": "Tx. tarikh akhir", - "swap.details.completed": "Pertukaran selesai", - "swap.details.estimatedTime": "Anggaran masa", - "swap.details.fasterUnichainSwaps": "Swap lebih pantas dikuasakan oleh Unichain", - "swap.details.feeOnTransfer": "{{tokenSymbol}} yuran", - "swap.details.feeOnTransfer.symbol": "{{tokenSymbol}} yuran token", - "swap.details.instant": "segera", - "swap.details.newQuote.input": "Input baharu", - "swap.details.newQuote.output": "Keluaran baharu", - "swap.details.orderRouting": "Penghalaan pesanan", - "swap.details.orderRoutingInfo": "Pertukaran ini dihalakan melalui Across, protokol terdesentralisasi yang memindahkan aset merentas rangkaian sambil mengutamakan keselamatan, pelaksanaan pantas dan harga yang rendah.", - "swap.details.poweredBy": "Dikuasakan oleh", - "swap.details.rate": "Kadar", - "swap.details.slippage": "Kegelinciran maksimum", - "swap.details.slippage.uniswap": "Gelinciran Uniswap Protected", - "swap.details.swappedIn.unichain": "Selesai dalam {{time}}s pada Unichain", - "swap.details.uniswapFee": "Bayaran", - "swap.error.default": "Anda mungkin perlu meningkatkan toleransi gelinciran anda. Nota: token yuran atas pemindahan dan pangkalan semula tidak serasi dengan Uniswap V3.", - "swap.error.expectedToFail": "Pertukaran anda dijangka gagal.", - "swap.error.fiatInputUnavailable": "{{fiatCurrencyCode}} input tidak tersedia", - "swap.error.modifiedByWallet": "Swap anda telah diubah suai melalui dompet anda. Jika ini satu kesilapan, sila batalkan segera atau berisiko kehilangan dana anda.", - "swap.error.rejected": "Urus niaga ditolak", - "swap.error.undefinedObject": "Ralat berlaku semasa cuba melaksanakan pertukaran ini. Anda mungkin perlu meningkatkan toleransi gelinciran anda. Jika itu tidak berjaya, mungkin terdapat ketidakserasian dengan token yang anda berdagang. Nota: token fee-on-transfer dan rebase tidak serasi dengan Uniswap V3.", - "swap.error.unknown": "Ralat tidak diketahui.", - "swap.error.v2.expired": "Urus niaga ini tidak dapat dihantar kerana tarikh akhir telah berlalu. Sila pastikan tarikh akhir transaksi anda tidak terlalu rendah.", - "swap.error.v2.k": "Invarian Uniswap x*y=k tidak berpuas hati dengan pertukaran tersebut. Ini biasanya bermakna salah satu token yang anda tukarkan menggabungkan tingkah laku tersuai semasa pemindahan.", - "swap.error.v2.slippage": "Urus niaga ini tidak akan berjaya sama ada disebabkan oleh pergerakan harga atau bayaran semasa pemindahan. Cuba tingkatkan toleransi gelinciran anda", - "swap.error.v2.transferInput": "Token input tidak boleh dipindahkan. Mungkin terdapat masalah dengan token input.", - "swap.error.v2.transferOutput": "Token keluaran tidak boleh dipindahkan. Mungkin terdapat masalah dengan token output.", - "swap.error.v3.slippage": "Urus niaga ini tidak akan berjaya kerana pergerakan harga. Cuba tingkatkan toleransi gelinciran anda. Nota: yuran untuk pemindahan dan token asas semula tidak serasi dengan Uniswap V3.", - "swap.error.v3.transferOutput": "Token keluaran tidak boleh dipindahkan. Mungkin terdapat masalah dengan token output. Nota: yuran untuk pemindahan dan token asas semula tidak serasi dengan Uniswap V3.", - "swap.estimatedDifference.label": "Akan terdapat perbezaan besar antara nilai input dan output anda disebabkan oleh kecairan semasa.", - "swap.expected.price": "Harga yang dijangkakan", - "swap.fail.batched": "Dompet anda yang disambungkan mungkin tidak menyokong pertukaran 1 klik. Cuba swap standard sebaliknya.", - "swap.fail.batched.retry": "Cuba swap standard", - "swap.fail.batched.title": "Pertukaran 1 klik gagal", - "swap.fail.message": "Cuba laraskan gelinciran kepada nilai yang lebih tinggi.", - "swap.fail.uniswapX": "Pertukaran tidak dapat diselesaikan dengan UniswapX. Cuba swap anda sekali lagi untuk menghalakannya melalui API Uniswap klasik.", - "swap.fees.experience": "Yuran ini dikenakan pada beberapa pasangan token untuk memastikan pengalaman terbaik dengan Uniswap. Ia dibayar dalam token output dan telah difaktorkan ke dalam sebut harga.", - "swap.fees.jupiter.label": "Yuran Jupiter", - "swap.fees.jupiter.message": "Yuran untuk Solana dikenakan oleh Jupiter API. Uniswap Labs tidak menerima yuran ini.", - "swap.fees.noFee": "Yuran dikenakan pada pasangan token terpilih untuk memastikan pengalaman terbaik dengan Uniswap. Tiada bayaran yang berkaitan dengan pertukaran ini.", - "swap.finalizingQuote": "Memuktamadkan sebut harga...", - "swap.form.header": "Tukar", - "swap.form.warning.output.fotFees": "Disebabkan oleh yuran token {{fotCurrencySymbol}}, jumlah swap hanya boleh dimasukkan menggunakan medan input", - "swap.form.warning.output.fotFees.fallback": "Disebabkan oleh yuran token, jumlah swap hanya boleh dimasukkan menggunakan medan input", - "swap.form.warning.output.solana": "Output tepat tidak disokong pada Solana", - "swap.form.warning.restore": "Pulihkan dompet anda untuk bertukar", - "swap.frontrun.warning": "Urus niaga anda mungkin dijalankan di hadapan dan mengakibatkan perdagangan yang tidak menguntungkan.", - "swap.header.viewOnly": "Lihat sahaja", - "swap.impactOfTrade": "Kesan perdagangan anda terhadap harga pasaran kumpulan ini.", - "swap.impactOfTrade.uniswapx": "Perbezaan antara harga pasaran dan harga pelaksanaan, pemfaktoran dalam penjimatan gas UniswapX.", - "swap.impactOfTrade.uniswapx.missing": "Pengiraan kesan harga mungkin tidak tersedia untuk pasangan dengan kecairan rendah.", - "swap.inputEstimated.atMost": "Input dianggarkan. Anda akan menjual paling banyak atau transaksi akan kembali.", - "swap.limit": "Had", - "swap.limitFilled": "Had diisi!", - "swap.limitSubmitted": "Had diserahkan", - "swap.marketPrice.outsideRange.label": "Harga pasaran adalah di luar julat harga yang anda tentukan. Deposit aset tunggal sahaja.", - "swap.min.price": "Harga minima", - "swap.networkCost.paidIn": "Kos rangkaian dibayar dalam {{sym}} pada rangkaian {{chainName}} untuk berurus niaga.", - "swap.orderRouting": "Penghalaan pesanan", - "swap.outputEstimated.atLeast": "Output dianggarkan. Anda akan menerima sekurang-kurangnya atau transaksi akan kembali.", - "swap.placeOrder": "Buat pesanan", - "swap.priceImpact": "Kesan harga", - "swap.request.title.full": "Tukar {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "Tukar Token", - "swap.review": "Tukar ulasan", - "swap.review.summary": "Anda bertukar-tukar", - "swap.reviewLimit": "Had semakan", - "swap.route.optimizedGasCost": "Laluan ini mempertimbangkan laluan berpecah, berbilang lompatan dan kos rangkaian bagi setiap langkah.", - "swap.routing.jupiter.description": "Musytari mengagregatkan kecairan daripada pelbagai sumber untuk memberikan anda harga terbaik.", - "swap.routing.uniswapAutoRouter.description": "Penghala Auto Uniswap mempertimbangkan laluan optimum dan kos rangkaian untuk memberikan anda harga terbaik.", - "swap.settings.deadline.tooltip": "Urus niaga anda akan kembali jika ia belum selesai lebih daripada tempoh masa ini. (Maksimum: 3 hari).", - "swap.settings.deadline.warning": "Tarikh akhir yang tinggi", - "swap.settings.oneClickSwap.title": "Swap 1 klik", - "swap.settings.oneClickSwap.tooltip": "Menggabungkan tindakan perdagangan standard bersama-sama untuk pertukaran yang lebih pantas dan kos lebih rendah.", - "swap.settings.protection.description": "Dengan perlindungan swap dihidupkan, urus niaga Ethereum anda akan dilindungi daripada serangan sandwic, dengan mengurangkan kemungkinan kegagalan.", - "swap.settings.protection.subtitle.supported": "{{chainName}} Rangkaian", - "swap.settings.protection.subtitle.unavailable": "Tidak tersedia pada {{chainName}}", - "swap.settings.protection.title": "Perlindungan Pertukaran", - "swap.settings.routingPreference.option.default.description": "Memilih pilihan ini mengenal pasti laluan paling cekap untuk pertukaran anda.", - "swap.settings.routingPreference.option.default.description.preV4": "Pelanggan Uniswap memilih pemfaktoran pilihan perdagangan termurah dalam harga dan kos rangkaian.", - "swap.settings.routingPreference.option.default.description.uniswapXUnavailable": "UniswapX tidak tersedia untuk dompet anda", - "swap.settings.routingPreference.option.default.tooltip": "Satu laluan dikenal pasti dengan mengambil kira v2, v3 dan kumpulan v4 tertentu, mengambil kira dalam anggaran impak harga dan kos rangkaian.", - "swap.settings.routingPreference.option.v2.title": "Dayakan kumpulan v2", - "swap.settings.routingPreference.option.v3.title": "Dayakan kumpulan v3", - "swap.settings.routingPreference.option.v4.hooks.title": "Dayakan kolam cangkuk v4", - "swap.settings.routingPreference.option.v4.hooks.tooltip": "Laluan cangkuk V4 bertukar melalui set cangkuk yang telah diluluskan terlebih dahulu.", - "swap.settings.routingPreference.option.v4.title": "Dayakan kumpulan v4", - "swap.settings.routingPreference.title": "Pilihan perdagangan", - "swap.settings.slippage.alert": "gelinciran tinggi", - "swap.settings.slippage.control.auto": "Auto", - "swap.settings.slippage.description": "Urus niaga anda akan kembali jika harga berubah lebih daripada peratusan gelinciran.", - "swap.settings.slippage.input.message": "Jika harga turun lagi, transaksi anda akan kembali. Di bawah ialah jumlah minimum yang dijamin anda akan terima.", - "swap.settings.slippage.input.receive.title": "Terima sekurang-kurangnya", - "swap.settings.slippage.output.message": "Jika harga turun lagi, transaksi anda akan kembali. Di bawah ialah jumlah maksimum yang anda perlu belanjakan.", - "swap.settings.slippage.output.spend.title": "Berbelanja paling banyak", - "swap.settings.slippage.warning": "gelinciran yang sangat tinggi", - "swap.settings.slippage.warning.description": "Kegelinciran melebihi 20% mungkin akan mengakibatkan perdagangan yang tidak menguntungkan. Untuk mengurangkan risiko dijalankan di hadapan, turunkan tetapan anda.", - "swap.settings.slippage.warning.hover": "Ini boleh mengakibatkan perdagangan yang tidak menguntungkan. Cuba turunkan tetapan gelinciran anda.", - "swap.settings.slippage.warning.max": "Masukkan nilai kurang daripada {{maxSlippageTolerance}}", - "swap.settings.slippage.warning.message": "Gelinciran mungkin lebih tinggi daripada yang diperlukan", - "swap.settings.slippage.warning.min": "Masukkan nilai yang lebih besar daripada 0", - "swap.settings.title": "Tukar tetapan", - "swap.settings.transactionRevertPrice": "Urus niaga anda akan kembali jika harga berubah secara tidak menguntungkan dengan lebih daripada peratusan ini.", - "swap.signAndSwap": "Tandatangan dan tukar", - "swap.slippage.amt": "{{amt}} gelincir", - "swap.slippage.bridging": "Tiada gelinciran apabila bertukar-tukar merentasi rangkaian", - "swap.slippage.description": "Perbezaan antara harga dijangka dan dilaksanakan pada swap. Perbezaan boleh berlaku disebabkan oleh kecairan yang rendah, turun naik pasaran atau bot. \n\nPerlindungan Uniswap melindungi daripada bot dan MEV yang berjalan di hadapan.", - "swap.slippage.settings.title": "Tetapan gelinciran", - "swap.slippage.tooltip": "Pergerakan harga maksimum sebelum transaksi anda akan kembali.", - "swap.slippageBelow.warning": "Gelinciran di bawah {{amt}} boleh mengakibatkan transaksi gagal", - "swap.submitted": "Swap diserahkan", - "swap.success": "Bertukar kejayaan!", - "swap.tokenOwnFees": "Sesetengah token mengambil bayaran apabila ia dibeli atau dijual, yang ditetapkan oleh pengeluar token. Uniswap tidak menerima sebarang yuran ini.", - "swap.tradeRoutes": "Laluan perdagangan", - "swap.transaction.deadline": "Tarikh akhir urus niaga", - "swap.transaction.revertAfter": "Urus niaga anda akan kembali jika ia belum selesai lebih daripada tempoh masa ini.", - "swap.warning.enterLargerAmount.title": "Masukkan jumlah yang lebih besar", - "swap.warning.expectedFailure.increaseSlippage": "Cuba tingkatkan gelinciran anda.", - "swap.warning.expectedFailure.titleMay": "Pertukaran ini mungkin gagal", - "swap.warning.insufficientBalance.title": "Anda tidak mempunyai {{currencySymbol}}", - "swap.warning.insufficientGas.button": "Tidak cukup {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "Tukar kepada {{ tokenSymbol }} pada {{networkName}}", - "swap.warning.insufficientGas.button.buy": "Beli {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "Beli dengan kad", - "swap.warning.insufficientGas.message.withNetwork": "Tidak cukup {{currencySymbol}} pada {{networkName}} untuk bertukar", - "swap.warning.insufficientGas.message.withoutNetwork": "Tidak cukup {{currencySymbol}} untuk bertukar", - "swap.warning.insufficientGas.title": "Anda tidak mempunyai cukup {{currencySymbol}} untuk menampung kos rangkaian", - "swap.warning.networkFee.allow": "Benarkan {{ inputTokenSymbol }} (sekali)", - "swap.warning.networkFee.delegation.message": "Ini ialah kos untuk memproses transaksi anda dan mengaktifkan dompet pintar anda di Unichain. Uniswap Labs tidak menerima sebarang bahagian daripada yuran ini.", - "swap.warning.networkFee.highRelativeToValue": "Kos rangkaian melebihi 10% daripada jumlah nilai transaksi anda. Ini ialah kos untuk memproses transaksi anda pada blockchain. Uniswap tidak menerima sebarang bahagian daripada yuran ini.", - "swap.warning.networkFee.highRelativeToValue.unichain": "Kos rangkaian melebihi 10% daripada jumlah nilai transaksi anda. Ini ialah kos untuk memproses transaksi anda pada blockchain.", - "swap.warning.networkFee.includesDelegation": "Termasuk pengaktifan dompet pintar", - "swap.warning.networkFee.message": "Ini ialah kos untuk memproses transaksi anda pada blockchain. Uniswap tidak menerima sebarang bahagian daripada yuran ini.", - "swap.warning.networkFee.message.unichain": "Ini ialah kos untuk memproses transaksi anda di blockchain.", - "swap.warning.networkFee.message.uniswapX": "Ini ialah kos untuk memproses transaksi anda pada blockchain. Uniswap tidak menerima sebarang bahagian daripada yuran ini. UniswapX mengagregatkan sumber kecairan untuk harga yang lebih baik dan pertukaran bebas gas.", - "swap.warning.networkFee.message.uniswapX.title": "Tiada kos rangkaian dengan UniswapX", - "swap.warning.networkFee.message.uniswapX.unichain": "Ini ialah kos untuk memproses transaksi anda pada blockchain. UniswapX mengagregatkan sumber kecairan untuk harga yang lebih baik dan pertukaran bebas gas.", - "swap.warning.noQuotesFound.bridging.message": "Tiada petikan penyambung ditemui. Cuba gunakan jambatan rasmi pada masa ini.", - "swap.warning.noQuotesFound.title": "Tiada petikan ditemui", - "swap.warning.noRoutesFound.message": "Pada masa ini tiada laluan tersedia untuk token pilihan anda. Sila cuba pasangan lain atau semak semula kemudian.", - "swap.warning.noRoutesFound.title": "Tiada laluan tersedia", - "swap.warning.offline.message": "Anda mungkin terputus sambungan internet atau rangkaian mungkin terputus. Sila semak sambungan internet anda dan cuba lagi.", - "swap.warning.offline.title": "Anda di luar talian", - "swap.warning.priceImpact.message": "Disebabkan oleh jumlah {{outputCurrencySymbol}} kecairan yang tersedia pada masa ini, semakin banyak {{inputCurrencySymbol}} anda cuba menukar, semakin kurang {{outputCurrencySymbol}} anda akan terima.", - "swap.warning.priceImpact.message.veryHigh": "Urus niaga ini akan mengakibatkan kesan harga {{priceImpactValue}} pada harga pasaran kumpulan ini dan akan mengakibatkan kehilangan dana.", - "swap.warning.priceImpact.title": "Kesan harga yang tinggi ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "Kesan harga yang sangat tinggi ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "Urus niaga anda tidak diserahkan kerana anda menutup apl.", - "swap.warning.queuedOrder.approvalFailed": "Transaksi anda tidak diserahkan kerana kelulusan token gagal.", - "swap.warning.queuedOrder.stale": "Urus niaga anda tidak diserahkan kerana anda menutup apl atau kelulusan mengambil masa terlalu lama.", - "swap.warning.queuedOrder.submissionFailed": "Terdapat masalah menyerahkan transaksi anda.", - "swap.warning.queuedOrder.title": "Pertukaran dibatalkan", - "swap.warning.rateLimit.message": "Sila cuba sebentar lagi.", - "swap.warning.rateLimit.title": "Had kadar melebihi", - "swap.warning.router.message": "Anda mungkin terputus sambungan atau rangkaian mungkin terputus. Jika masalah berterusan, sila cuba lagi kemudian.", - "swap.warning.router.title": "Perdagangan ini tidak dapat diselesaikan sekarang", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} disekat", - "swap.warning.tokenBlockedFallback.button": "Token disekat", - "swap.warning.uniswapFee.message": "Yuran dikenakan untuk memastikan pengalaman terbaik dengan Uniswap.", - "swap.warning.uniswapFee.message.default": "Yuran dikenakan untuk memastikan pengalaman terbaik dengan Uniswap. Tiada bayaran yang berkaitan dengan pertukaran ini.", - "swap.warning.uniswapFee.message.included": "Yuran dikenakan untuk memastikan pengalaman terbaik dengan Uniswap, dan telah pun diambil kira dalam sebut harga ini.", - "swap.warning.uniswapFee.title": "Yuran pertukaran", - "swap.warning.viewOnly.message": "Anda perlu mengimport dompet ini melalui frasa pemulihan untuk menukar token.", - "swap.wrap.token": "Balut {{sym}}", - "tdp.balanceSummary.otherNetworks": "Pada rangkaian lain", - "tdp.balanceSummary.otherNetworksBalance": "Imbangan pada rangkaian lain", - "tdp.balanceSummary.title": "Baki anda", - "tdp.button.getToken": "Dapatkan {{ tokenSymbol }}", - "tdp.button.getTokenFallback": "Dapatkan Token", - "tdp.loading.title.default": "data token untuk ", - "tdp.loading.title.withChain": "data token untuk pada {{chainName}}", - "tdp.nameNotFound": "Nama tidak ditemui", - "tdp.noInfoAvailable": "Tiada maklumat token tersedia", - "tdp.noTestnetSupportDescription": "Sesetengah testnet tidak menyokong pertukaran, penghantaran atau pembelian token.", - "tdp.symbolNotFound": "Simbol tidak ditemui", - "testnet.modal.swapDeepLink.description.toProdMode": "Tindakan ini memerlukan mod testnet untuk dilumpuhkan. Mod Testnet boleh didayakan semula pada bila-bila masa dalam tetapan.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "Tindakan ini memerlukan mod testnet didayakan. Token pada testnets tidak mempunyai sebarang nilai sebenar. Mod Testnet boleh dilumpuhkan pada bila-bila masa dalam tetapan.", - "testnet.modal.swapDeepLink.title.toProdMode": "Lumpuhkan mod testnet", - "testnet.modal.swapDeepLink.title.toTestnetMode": "Dayakan mod testnet", - "testnet.unsupported": "Fungsi ini tidak disokong dalam mod testnet.", - "themeToggle.theme": "Tema", - "title.buySellTradeEthereum": "Beli, jual & niagakan Ethereum dan token teratas lain di Uniswap", - "title.createGovernanceOn": "Buat cadangan tadbir urus baharu pada Uniswap", - "title.createGovernanceTo": "Buat cadangan tadbir urus baharu untuk diundi oleh pemegang UNI. Token UNI mewakili bahagian mengundi dalam tadbir urus Uniswap.", - "title.earnFees": "Peroleh yuran apabila orang lain bertukar pada Uniswap dengan menambahkan token pada kumpulan kecairan.", - "title.easilyRemove": "Keluarkan kecairan anda dengan mudah daripada Uniswap v2 dan deposit ke Uniswap v3.", - "title.easilyRemoveV4": "Keluarkan kecairan anda dengan mudah daripada Uniswap v2 dan v3 untuk mendepositkan ke dalam Uniswap v4.", - "title.extension.uninstall": "Sambungan Dinyahpasang", - "title.extensionPasskeyLogIn": "Log masuk dengan Passkey", - "title.managePasskeys": "Uniswap | Urus kunci laluan anda", - "title.migratev2": "Pindahkan kecairan kumpulan v2 kepada Uniswap v3", - "title.migratev3": "Pindahkan kecairan kumpulan kepada Uniswap v4", - "title.placeLimit": "Letakkan pesanan had pada Uniswap", - "title.realTime": "Harga masa nyata, carta, data transaksi dan banyak lagi.", - "title.removeLiquidityv2": "Alih keluar kecairan kumpulan (v2) pada Uniswap", - "title.removePoolLiquidity": "Alih keluar kecairan kumpulan pada Uniswap", - "title.removeTokensv2": "Alih keluar token anda daripada kumpulan kecairan v2.", - "title.removev3Liquidity": "Alih keluar token anda daripada kumpulan kecairan v3.", - "title.sendCrypto": "Hantar kripto", - "title.sendTokens": "Hantar token pada Uniswap", - "title.swappingMadeSimple": "Beli dan jual kripto dengan segera di Ethereum, Base, Arbitrum, Polygon, Unichain dan banyak lagi. Platform DeFi dipercayai oleh jutaan orang.", - "title.tradeTokens": "Berdagang token dan menyediakan kecairan. Harga masa nyata, carta, data transaksi dan banyak lagi.", - "title.uniswapTradeCrypto": "Uniswap | Berdagang Kripto di Bursa Utama DeFi ", - "title.uniToken": "Token UNI mewakili bahagian mengundi dalam tadbir urus Uniswap. Anda boleh mengundi sendiri pada setiap cadangan atau mewakilkan undi anda kepada pihak ketiga.", - "title.voteOnGov": "Undi cadangan tadbir urus di Uniswap", - "token.balances.main": "Baki anda", - "token.balances.other": "Baki pada rangkaian lain", - "token.balances.viewOnly": "baki {{ownerAddress}}", - "token.bridge": "{{label}} jambatan token", - "token.chart.candlestick.unavailable": "Carta candlestick tidak tersedia untuk token ini", - "token.chart.tooltip": "Yuran: {{amount}}", - "token.details": "Butiran token", - "token.error.unknown": "Token tidak diketahui", - "token.fee.buy.label": "yuran beli", - "token.fee.label": "bayaran", - "token.fee.sell.label": "bayaran jual", - "token.links.title": "Pautan", - "token.links.twitter": "Twitter", - "token.links.website": "laman web", - "token.notFound.description": "Maaf, kami tidak dapat mencari sebarang maklumat untuk token ini. Semak nama dan alamat dan cuba lagi.", - "token.notFound.title": "Token tidak ditemui", - "token.priceExplorer.error.description": "Sesuatu telah berlaku.", - "token.priceExplorer.error.title": "Tidak dapat memuatkan carta harga", - "token.priceExplorer.timeRangeLabel.all": "Setiap masa", - "token.priceExplorer.timeRangeLabel.day": "1D", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 Hari", - "token.priceExplorer.timeRangeLabel.hour": "1H", - "token.priceExplorer.timeRangeLabel.month": "1M", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 Bulan", - "token.priceExplorer.timeRangeLabel.week": "1W", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 Minggu", - "token.priceExplorer.timeRangeLabel.year": "1Y", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 Tahun", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} tidak tersedia", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} dan {{tokenSymbol1}} tidak tersedia", - "token.safety.fee.detected": "Bayaran token dikesan", - "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs tidak menerima sebarang yuran ini.", - "token.safety.warning.alwaysDoYourResearch": "Sentiasa buat kajian anda", - "token.safety.warning.blocked.description.default_one": "Anda tidak boleh menukar token ini menggunakan Apl Uniswap.", - "token.safety.warning.blocked.description.default_other": "Anda tidak boleh berdagang token ini menggunakan Apl Uniswap.", - "token.safety.warning.copyContractAddress.message": "Ini ialah alamat kontrak, yang bertindak sebagai pengecam unik untuk token pada rantaian blok. Sebarang crypto yang anda hantar ke alamat ini akan hilang.", - "token.safety.warning.copyContractAddress.title": "Jangan hantar crypto ke alamat ini", - "token.safety.warning.dontShowWarningAgain": "Jangan tunjukkan amaran ini kepada saya lagi", - "token.safety.warning.dontShowWarningAgainShort": "Jangan tunjukkan lagi", - "token.safety.warning.doYourOwnResearch": "Sentiasa lakukan penyelidikan anda sendiri sebelum meneruskan.", - "token.safety.warning.feeDescription": "Mengecas apabila {{action}}", - "token.safety.warning.flaggedAsMalicious": "Ditandakan sebagai berniat jahat", - "token.safety.warning.flaggedAsSuspicious": "Ditandakan sebagai mencurigakan", - "token.safety.warning.fotHigh.title": "Bayaran tinggi dikesan", - "token.safety.warning.fotLow.title": "Yuran dikesan", - "token.safety.warning.fotVeryHigh.title": "Bayaran yang sangat tinggi dikesan", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} telah dibenderakan sebagai tidak boleh dijual. Pertukaran token ini boleh mengakibatkan kehilangan dana anda.", - "token.safety.warning.honeypot.title": "100% yuran jualan dikesan", - "token.safety.warning.impersonator": "Menyamar sebagai token lain", - "token.safety.warning.impersonator.title": "Token penyamar dikesan", - "token.safety.warning.malicious.general.message": "{{tokenSymbol}} telah dibenderakan sebagai berniat jahat oleh Blockaid.", - "token.safety.warning.malicious.impersonator.message": "{{tokenSymbol}} telah dibenderakan oleh Blockaid kerana cuba menyalin token lain. Ia mungkin bukan token yang anda ingin tukar.", - "token.safety.warning.malicious.impersonator.message.short": "{{tokenSymbol}} mungkin bukan token yang anda ingin tukar.", - "token.safety.warning.malicious.title": "Token berniat jahat dikesan", - "token.safety.warning.mayResultInLoss": "Pertukaran itu boleh mengakibatkan kehilangan dana.", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} tidak didagangkan di bursa terpusat AS terkemuka.", - "token.safety.warning.notListedOnExchanges": "Tidak disenaraikan di bursa AS terkemuka", - "token.safety.warning.potentialHoneypot.card.message": "{{tokenSymbol}} telah dibenderakan sebagai mencurigakan oleh Blockaid.", - "token.safety.warning.potentialHoneypot.modal.message": "{{tokenSymbol}} telah dibenderakan sebagai honeypot berpotensi oleh Blockaid. Sentiasa lakukan penyelidikan anda sendiri sebelum meneruskan.", - "token.safety.warning.potentialHoneypot.title": "Potensi honeypot dikesan", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} telah dibenderakan sebagai tidak boleh dijual.", - "token.safety.warning.sellFee100.title": "100% yuran jualan dikesan", - "token.safety.warning.spam.message": "{{tokenSymbol}} telah dibenderakan sebagai spam oleh Blockaid.", - "token.safety.warning.spam.title": "Token spam dikesan", - "token.safety.warning.spamsUsers": "Pengguna spam", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} mengenakan bayaran {{buyFeePercent}} apabila dibeli dan {{sellFeePercent}} apabila dijual.", - "token.safety.warning.tokenChargesFee.buy.message": "{{tokenSymbol}} mengenakan bayaran {{feePercent}} apabila dibeli.", - "token.safety.warning.tokenChargesFee.buy.message.descriptive": "{{tokenSymbol}} mengenakan bayaran {{feePercent}} apabila dibeli. Pertukaran itu boleh mengakibatkan kehilangan dana. Uniswap Labs tidak menerima sebarang yuran ini.", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} mengenakan bayaran {{feePercent}} apabila dijual.", - "token.safety.warning.tokenChargesFee.sell.message.descriptive": "{{tokenSymbol}} mengenakan bayaran {{feePercent}} apabila dijual. Pertukaran itu boleh mengakibatkan kehilangan dana. Uniswap Labs tidak menerima sebarang yuran ini.", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} mengenakan bayaran apabila dibeli atau dijual.", - "token.safetyLevel.blocked.message": "Anda tidak boleh menukar token ini menggunakan Uniswap Wallet.", - "token.safetyLevel.medium.message.plural": "Token ini tidak didagangkan di bursa terpusat AS yang terkemuka. Sentiasa lakukan penyelidikan anda sendiri sebelum meneruskan.", - "token.selector.search.error": "Tidak dapat memuatkan hasil carian", - "token.stats.fullyDilutedValuation": "Penilaian Dicairkan Sepenuhnya", - "token.stats.marketCap": "Modal Pasaran", - "token.stats.priceHighYear": "Tinggi 52W", - "token.stats.priceLowYear": "52W Rendah", - "token.stats.section.about": "Mengenai {{token}}", - "token.stats.title": "Statistik", - "token.stats.translation.original": "Paparkan yang asli", - "token.stats.translation.translate": "Terjemah ke {{language}}", - "token.stats.volume": "Kelantangan 24j", - "token.symbol.input.fallback": "Token input", - "token.symbol.output.fallback": "Token keluaran", - "token.wrap.fail.message": "Swap pada Uniswap Protocol boleh bermula dan berakhir dengan ETH. Walau bagaimanapun, semasa pertukaran, ETH dibungkus ke dalam WETH.", - "token.zeroNativeBalance.description.mainnet": "Anda perlu menukar token pada Ethereum untuk mendapatkan {{ tokenSymbol }}. Pertukaran memerlukan ETH untuk kos rangkaian.", - "token.zeroNativeBalance.description.otherChains": "Anda perlu menukar token pada {{ chainName }} untuk mendapatkan {{ tokenSymbol }}. Pertukaran memerlukan {{ chainName }} {{ nativeTokenSymbol }} untuk kos rangkaian.", - "token.zeroNativeBalance.subtitle": "{{ tokenSymbol }} tidak tersedia untuk pembelian terus.", - "token.zeroNativeBalance.title.mainnet": "Anda perlukan {{ nativeTokenName }}", - "token.zeroNativeBalance.title.otherChains": "Anda memerlukan {{ nativeTokenName }} pada {{ chainName }}", - "tokens.action.hide": "Sembunyikan token", - "tokens.action.unhide": "Nyahsembunyikan token", - "tokens.nfts.action.viewOnExplorer": "Lihat pada {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "Tidak dapat memuatkan koleksi NFT", - "tokens.nfts.collection.label.items": "barang", - "tokens.nfts.collection.label.owners": "Pemilik", - "tokens.nfts.collection.label.priceFloor": "Lantai", - "tokens.nfts.collection.label.swapVolume": "Kelantangan", - "tokens.nfts.connectEthereumToView": "Sambungkan dompet Ethereum untuk melihat NFT anda", - "tokens.nfts.details.contract.address": "Alamat kontrak", - "tokens.nfts.details.error.load.title": "Tidak dapat memuatkan butiran NFT", - "tokens.nfts.details.network": "Rangkaian", - "tokens.nfts.details.owner": "Dimiliki oleh", - "tokens.nfts.details.price": "Harga semasa", - "tokens.nfts.details.recentPrice": "Harga jualan terakhir", - "tokens.nfts.details.traits": "sifat", - "tokens.nfts.empty.description": "Tiada NFT ditemui", - "tokens.nfts.error.unavailable": "Kandungan tidak tersedia", - "tokens.nfts.hidden.action.hide": "Sembunyikan NFT", - "tokens.nfts.hidden.action.unhide": "Nyahsembunyikan NFT", - "tokens.nfts.link.collection": "Laman web koleksi", - "tokens.nfts.list.error.load.title": "Tidak dapat memuatkan NFT", - "tokens.nfts.list.none.button": "Terima NFT", - "tokens.nfts.list.none.description.default": "Pindahkan NFT daripada dompet lain untuk bermula.", - "tokens.nfts.list.none.description.external": "Apabila dompet ini membeli atau menerima NFT, ia akan dipaparkan di sini.", - "tokens.nfts.list.none.title": "Belum ada NFT", - "tokens.nfts.notAvailableOnSolana": "NFT tidak tersedia di Solana", - "tokens.selector.button.choose": "Pilih token", - "tokens.selector.empty.buy.message": "Beli crypto dengan kad atau bank untuk menghantar token.", - "tokens.selector.empty.buy.title": "Beli kripto", - "tokens.selector.empty.receive.title": "Terima token", - "tokens.selector.empty.title": "Tiada token lagi", - "tokens.selector.error.load": "Tidak dapat memuatkan token", - "tokens.selector.search.empty": "Tiada hasil ditemui untuk {{searchText}}", - "tokens.selector.search.placeholder": "Cari token", - "tokens.selector.section.bridging": "Bertukar merentasi rangkaian", - "tokens.selector.section.favorite": "Kegemaran", - "tokens.selector.section.otherNetworksSearchResults": "Token ditemui pada rangkaian lain", - "tokens.selector.section.otherSearchResults": "Token lain pada {{network}}", - "tokens.selector.section.recent": "Carian terkini", - "tokens.selector.section.search": "Keputusan Carian", - "tokens.selector.section.trending": "Token mengikut volum 24H", - "tokens.selector.section.yours": "Token anda", - "tokens.table.search.placeholder.pools": "Kolam carian", - "tokens.table.search.placeholder.tokens": "Cari token", - "tokens.table.search.placeholder.transactions": "Cari urus niaga", - "toucan.auction.bidConcentration": "Kepekatan toucan", - "toucan.auction.bidConcentration.tooltip.description": "Penerangan petua alat Toucan", - "toucan.auction.bidConcentration.tooltip.title": "Tajuk petua alat Toucan", - "toucan.auctions": "Lelongan", - "toucan.bidForm.maxBudget": "Belanjawan maks", - "toucan.bidForm.placeBid": "Letakkan tawaran anda", - "toucan.displayMode.tokenPrice": "Harga Token", - "toucan.displayMode.valuation": "Penilaian", - "transaction.action.cancel.button": "Batalkan transaksi", - "transaction.action.cancel.description": "Jika anda membatalkan transaksi ini sebelum ia diproses oleh rangkaian, anda akan membayar kos rangkaian baharu dan bukannya kos asal.", - "transaction.action.cancel.title": "Batalkan transaksi ini?", - "transaction.action.clear": "Kosongkan belum selesai", - "transaction.action.copy": "Salin ID transaksi", - "transaction.action.copyProvider": "Salin {{providerName}} ID transaksi", - "transaction.amount.unlimited": "Tidak terhad", - "transaction.callData": "Data panggilan", - "transaction.details.dappName": "Aplikasi", - "transaction.details.from": "daripada", - "transaction.details.networkFee": "Kos rangkaian", - "transaction.details.networkFee.swap": "Tukar kos rangkaian", - "transaction.details.providerFee": "Bayaran pembekal", - "transaction.details.swapRate": "Kadar", - "transaction.details.transaction": "Transaksi", - "transaction.details.uniswapFee": "Yuran ({{ feePercent }}%)", - "transaction.network.all": "Semua rangkaian", - "transaction.networkCost.description": "Kos untuk memproses transaksi anda pada blockchain. Uniswap dioptimumkan untuk kos rangkaian yang minimum.", - "transaction.networkCost.includesSmartWalletActivation": "Termasuk pengaktifan dompet pintar", - "transaction.networkCost.label": "Kos rangkaian", - "transaction.networkCost.maxNativeBalance.description": "Sebilangan kecil baki token rangkaian dikhaskan untuk menampung kos rangkaian transaksi ini.", - "transaction.networkCost.maxNativeBalance.title": "Mengapa saya tidak boleh menggunakan baki maks saya?", - "transaction.networkCost.veryHigh.label": "Kos rangkaian yang sangat tinggi", - "transaction.notification.error.cancel": "Tidak dapat membatalkan transaksi", - "transaction.notification.error.replace": "Tidak dapat menggantikan transaksi", - "transaction.status.approval.canceled": "Kelulusan dibatalkan", - "transaction.status.approval.failed": "Kelulusan gagal", - "transaction.status.approve.canceled": "Dibatalkan meluluskan", - "transaction.status.approve.canceling": "Membatalkan meluluskan", - "transaction.status.approve.failed": "Gagal meluluskan", - "transaction.status.approve.pending": "Meluluskan", - "transaction.status.approve.success": "Diluluskan", - "transaction.status.approve.successDapp": "Diluluskan pada {{externalDappName}}", - "transaction.status.buy.canceled": "Pembelian dibatalkan", - "transaction.status.buy.canceling": "Membatalkan pembelian", - "transaction.status.buy.failed": "Gagal membeli", - "transaction.status.buy.pending": "Membeli", - "transaction.status.buy.success": "Dibeli", - "transaction.status.buy.successDapp": "Dibeli pada {{externalDappName}}", - "transaction.status.claim.canceled": "Kutipan yuran dibatalkan", - "transaction.status.claim.canceling": "Membatalkan kutipan yuran", - "transaction.status.claim.failed": "Kutipan yuran gagal", - "transaction.status.claim.pending": "Mengutip yuran", - "transaction.status.claim.success": "Yuran dikutip", - "transaction.status.collect.fees.canceled": "Kutipan yuran dibatalkan", - "transaction.status.collect.fees.failed": "Kutipan yuran gagal", - "transaction.status.collected.fees": "Yuran yang dikutip", - "transaction.status.collecting.fees": "Mengutip yuran", - "transaction.status.confirm.canceled": "Pengesahan dibatalkan", - "transaction.status.confirm.canceling": "Menunggu pembatalan", - "transaction.status.confirm.failed": "Gagal mengesahkan", - "transaction.status.confirm.pending": "Urus niaga sedang berjalan", - "transaction.status.confirm.success": "Transaksi disahkan", - "transaction.status.confirm.successDapp": "Transaksi disahkan pada {{externalDappName}}", - "transaction.status.createPair.canceled": "Buat pasangan dibatalkan", - "transaction.status.createPair.canceling": "Membatalkan buat pasangan", - "transaction.status.createPair.failed": "Gagal membuat pasangan", - "transaction.status.createPair.pending": "Mencipta pasangan", - "transaction.status.createPair.success": "Pasangan yang dicipta", - "transaction.status.createPool.canceled": "Kolam ciptaan dibatalkan", - "transaction.status.createPool.canceling": "Membatalkan buat kolam", - "transaction.status.createPool.failed": "Gagal membuat kolam", - "transaction.status.createPool.pending": "Mencipta kolam", - "transaction.status.createPool.success": "Kolam tercipta", - "transaction.status.liquidityDecrease.canceled": "Alih keluar kecairan dibatalkan", - "transaction.status.liquidityDecrease.canceling": "Membatalkan mengeluarkan kecairan", - "transaction.status.liquidityDecrease.failed": "Gagal mengalih keluar kecairan", - "transaction.status.liquidityDecrease.pending": "Mengeluarkan kecairan", - "transaction.status.liquidityDecrease.success": "Kecairan dikeluarkan", - "transaction.status.liquidityIncrease.canceled": "Tambah kecairan dibatalkan", - "transaction.status.liquidityIncrease.canceling": "Membatalkan menambah kecairan", - "transaction.status.liquidityIncrease.failed": "Tambah kecairan gagal", - "transaction.status.liquidityIncrease.pending": "Menambah kecairan", - "transaction.status.liquidityIncrease.success": "Menambah kecairan", - "transaction.status.lpIncentivesClaim.canceled": "Tuntutan ganjaran LP dibatalkan", - "transaction.status.lpIncentivesClaim.canceling": "Membatalkan tuntutan ganjaran LP", - "transaction.status.lpIncentivesClaim.failed": "Gagal menuntut ganjaran LP", - "transaction.status.lpIncentivesClaim.pending": "Menuntut ganjaran LP", - "transaction.status.lpIncentivesClaim.success": "Ganjaran LP yang dituntut", - "transaction.status.migrateLiquidity.canceled": "Kecairan berhijrah dibatalkan", - "transaction.status.mint.canceled": "pudina dibatalkan", - "transaction.status.mint.canceling": "Membatalkan pudina", - "transaction.status.mint.failed": "Gagal mencetak", - "transaction.status.mint.pending": "Mencetak", - "transaction.status.mint.success": "Dicetak", - "transaction.status.mint.successDapp": "Dicetak pada {{externalDappName}}", - "transaction.status.offramp.canceled": "Offramp dibatalkan", - "transaction.status.offramp.failed": "Offramp gagal", - "transaction.status.offramp.pending": "Offramping", - "transaction.status.offramp.success": "Terkecoh", - "transaction.status.onramp.canceled": "Onramp dibatalkan", - "transaction.status.onramp.failed": "Onramp gagal", - "transaction.status.onramp.pending": "Onramping", - "transaction.status.onramp.success": "Onramped", - "transaction.status.permit.approved": "Permit diluluskan", - "transaction.status.permit.canceled": "Permit tx dibatalkan", - "transaction.status.permit.failed": "Permit gagal", - "transaction.status.purchase.canceled": "Pembelian dibatalkan", - "transaction.status.purchase.canceling": "Membatalkan pembelian", - "transaction.status.purchase.failed": "Pembelian gagal", - "transaction.status.purchase.failedOn": "Gagal membeli pada {{serviceProvider}}", - "transaction.status.purchase.pending": "Membeli", - "transaction.status.purchase.pendingOn": "Membeli pada {{serviceProvider}}", - "transaction.status.purchase.successOn": "Dibeli pada {{serviceProvider}}", - "transaction.status.receive.canceled": "Batal menerima", - "transaction.status.receive.canceling": "Membatalkan penerimaan", - "transaction.status.receive.failed": "Terima gagal", - "transaction.status.receive.failedFrom": "Gagal menerima daripada {{serviceProvider}}", - "transaction.status.receive.pending": "Menerima", - "transaction.status.receive.pendingFrom": "Menerima daripada {{serviceProvider}}", - "transaction.status.receive.success": "Menerima", - "transaction.status.receive.successDapp": "Diterima pada {{externalDappName}}", - "transaction.status.receive.successFrom": "Diterima daripada {{serviceProvider}}", - "transaction.status.removeDelegation.canceled": "Alih keluar perwakilan dibatalkan", - "transaction.status.removeDelegation.failed": "Gagal mengalih keluar perwakilan", - "transaction.status.removeDelegation.pending": "Mengalih keluar delegasi", - "transaction.status.removeDelegation.success": "Delegasi dialih keluar", - "transaction.status.revoke.canceled": "Pembatalan dibatalkan", - "transaction.status.revoke.canceling": "Membatalkan pembatalan", - "transaction.status.revoke.failed": "Gagal membatalkan", - "transaction.status.revoke.pending": "Membatalkan", - "transaction.status.revoke.success": "Dibatalkan", - "transaction.status.revoke.successDapp": "Dibatalkan pada {{externalDappName}}", - "transaction.status.sale.canceled": "Jualan dibatalkan", - "transaction.status.sale.canceling": "Membatalkan jualan", - "transaction.status.sale.failedOn": "Jualan Gagal melalui {{serviceProvider}}", - "transaction.status.sale.pendingCard.msg": "Ketahui lebih lanjut tentang menjual crypto.", - "transaction.status.sale.pendingCard.title": "Mengapa jualan saya masih belum selesai?", - "transaction.status.sale.pendingOn": "Menjual melalui {{serviceProvider}}", - "transaction.status.sale.successOn": "Dijual melalui {{serviceProvider}}", - "transaction.status.sell.canceled": "Jualan dibatalkan", - "transaction.status.sell.canceling": "Membatalkan penjualan", - "transaction.status.sell.failed": "Gagal menjual", - "transaction.status.sell.pending": "Menjual", - "transaction.status.sell.success": "terjual", - "transaction.status.sell.successDapp": "Dijual pada {{externalDappName}}", - "transaction.status.send.canceled": "Batal hantar", - "transaction.status.send.canceling": "Membatalkan penghantaran", - "transaction.status.send.failed": "gagal untuk dihantar", - "transaction.status.send.pending": "Menghantar", - "transaction.status.send.success": "Dihantar", - "transaction.status.send.successDapp": "Dihantar pada {{externalDappName}}", - "transaction.status.swap.canceled": "Pertukaran dibatalkan", - "transaction.status.swap.canceling": "Membatalkan pertukaran", - "transaction.status.swap.expired": "Swap tamat tempoh", - "transaction.status.swap.failed": "Gagal bertukar", - "transaction.status.swap.insufficientFunds": "Kekurangan dana", - "transaction.status.swap.pending": "Bertukar-tukar", - "transaction.status.swap.success": "Ditukar", - "transaction.status.swap.successDapp": "Bertukar pada {{externalDappName}}", - "transaction.status.unwrap.canceled": "Pembatalan dibatalkan", - "transaction.status.unwrap.canceling": "Membatalkan buka bungkus", - "transaction.status.unwrap.failed": "Gagal membuka balutan", - "transaction.status.unwrap.pending": "Membuka balutan", - "transaction.status.unwrap.success": "Dibuka", - "transaction.status.unwrap.successDapp": "Dibuka pada {{externalDappName}}", - "transaction.status.wrap.canceled": "Pembalut dibatalkan", - "transaction.status.wrap.canceling": "Membatalkan bungkus", - "transaction.status.wrap.failed": "Gagal membalut", - "transaction.status.wrap.pending": "Membungkus", - "transaction.status.wrap.success": "berbalut", - "transaction.status.wrap.successDapp": "Dibalut pada {{externalDappName}}", - "transaction.submittedOn": "Diserahkan pada", - "transaction.summary.liquidity": "{{firstAmountWithSymbol}} dan {{secondAmountWithSymbol}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} hingga {{recipientAddress}}", - "transaction.summary.received.noAmount": "Diterima daripada {{name}}", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} daripada {{senderAddress}}", - "transaction.summary.sent.noAmount": "Dihantar kepada {{name}}", - "transaction.warning.insufficientGas.modal.message": "Anda memerlukan ~{{tokenAmount}} {{tokenSymbol}} () pada {{networkName}} untuk menampung kos rangkaian transaksi ini. Tukar {{tokenSymbol}} daripada rangkaian lain atau beli dengan kad anda untuk meneruskan.", - "transaction.warning.insufficientGas.modal.message.noAction": "Anda memerlukan ~{{tokenAmount}} {{tokenSymbol}} () pada {{networkName}} untuk menampung kos rangkaian transaksi ini.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount": "Anda memerlukan ~{{tokenAmount}} {{tokenSymbol}} () pada {{networkName}} untuk menampung kos rangkaian transaksi ini.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount.noAction": "Untuk menukar token ini, anda memerlukan lebih banyak {{tokenSymbol}} pada {{networkName}}.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "Tidak cukup {{tokenSymbol}} pada {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Tidak cukup {{tokenSymbol}}", - "transaction.warning.maxNative.message": "Anda akan membelanjakan kebanyakan baki token rangkaian anda. Ini mungkin meninggalkan dana yang tidak mencukupi untuk menampung kos rangkaian masa hadapan.", - "transaction.warning.maxNative.title": "Baki token rangkaian yang rendah", - "transaction.watcher.error.cancel": "Tidak dapat membatalkan transaksi", - "transaction.watcher.error.status": "Ralat semasa menyemak status transaksi", - "uniswapX.aggregatesLiquidity": " mengagregatkan sumber kecairan untuk harga yang lebih baik dan pertukaran bebas gas.", - "uniswapX.cost": "UniswapX mengalih keluar kos biasa untuk berurus niaga pada rantaian blok.", - "uniswapx.description": "UniswapX mengagregatkan sumber kecairan untuk harga yang lebih baik dan pertukaran bebas gas.", - "uniswapx.description.unsupported": "UniswapX tidak tersedia pada masa ini kerana tetapan dompet pintar anda diurus oleh apl dompet yang berbeza.", - "uniswapx.included": "Termasuk UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "Ketahui lebih lanjut tentang bertukar dengan UniswapX", - "uniswapx.unavailable.title": "UniswapX tidak tersedia", - "uniswapx.v2QuoteFailed": "Petikan keras UniswapX v2 gagal. Cuba semula dengan pertukaran klasik.", - "unitags.banner.button.claim": "Tuntut sekarang", - "unitags.banner.subtitle": "Bina profil web3 yang diperibadikan dan kongsi alamat anda dengan rakan dengan mudah.", - "unitags.banner.title.compact": "Tuntut {{unitagDomain}} nama pengguna anda dan bina profil anda yang boleh disesuaikan.", - "unitags.banner.title.full": "Tuntut nama pengguna {{unitagDomain}} anda", - "unitags.choosePhoto.option.cameraRoll": "Pilih daripada gulungan kamera", - "unitags.choosePhoto.option.computer": "Muat naik dari komputer", - "unitags.choosePhoto.option.nft": "Pilih NFT", - "unitags.choosePhoto.option.remove": "Alih keluar gambar profil", - "unitags.claim.available": "Tersedia", - "unitags.claim.confirmation.customize": "Sesuaikan profil", - "unitags.claim.confirmation.description": "{{unitagAddress}} sedia untuk menghantar dan menerima crypto. Teruskan membina dompet anda dengan menyesuaikan profil web3 anda.", - "unitags.claim.confirmation.success.long": "Anda mendapatnya!", - "unitags.claim.confirmation.success.short": "faham!", - "unitags.claim.error.addressLimit": "Anda telah membuat jumlah maksimum perubahan pada nama pengguna anda untuk alamat ini", - "unitags.claim.error.avatar": "Tidak dapat menetapkan avatar. Cuba lagi nanti.", - "unitags.claim.error.default": "Tidak dapat menuntut nama pengguna. Cuba lagi nanti.", - "unitags.claim.error.deviceLimit": "Anda telah mencapai bilangan maksimum nama pengguna yang boleh aktif untuk peranti ini", - "unitags.claim.error.general": "Tidak dapat menuntut nama pengguna", - "unitags.claim.error.unavailable": "Nama pengguna ini tidak tersedia", - "unitags.claim.error.unknown": "Ralat tidak diketahui", - "unitags.claim.username.default": "nama awak", - "unitags.delete.confirm.subtitle": "Anda akan memadamkan nama pengguna dan butiran profil anda yang boleh disesuaikan. Anda tidak akan dapat menuntutnya semula.", - "unitags.delete.confirm.title": "Adakah anda pasti?", - "unitags.editProfile.placeholder": "nama pengguna", - "unitags.editUsername.confirm.subtitle": "Anda akan menukar nama pengguna anda. Sebaik sahaja anda menukarnya, anda tidak boleh menuntutnya lagi.", - "unitags.editUsername.confirm.title": "Adakah anda pasti?", - "unitags.editUsername.title": "Edit nama pengguna anda", - "unitags.editUsername.warning.default": "Sebaik sahaja anda menukar nama pengguna anda, anda tidak boleh menuntutnya lagi. Anda hanya boleh menukarnya 2 kali.", - "unitags.editUsername.warning.max": "Anda telah mencapai bilangan maksimum 2 perubahan nama pengguna.", - "unitags.extension.intro.buttton": "Tuntut nama pengguna", - "unitags.extension.intro.description": "Ucapkan selamat tinggal kepada 0x alamat. Nama pengguna ialah nama yang boleh dibaca yang memudahkan penghantaran dan penerimaan crypto.", - "unitags.extension.intro.title": "Memperkenalkan nama pengguna", - "unitags.extension.intro.upsell.customizable": "Profil boleh disesuaikan", - "unitags.extension.intro.upsell.ens": "Dikuasakan oleh subdomain ENS", - "unitags.extension.intro.upsell.free": "Percuma untuk menuntut", - "unitags.intro.features.ens": "Dikuasakan oleh subdomain ENS", - "unitags.intro.features.free": "Percuma untuk menuntut", - "unitags.intro.features.profile": "Profil boleh disesuaikan", - "unitags.intro.subtitle": "Ucapkan selamat tinggal kepada 0x alamat. Nama pengguna ialah nama yang boleh dibaca yang memudahkan penghantaran dan penerimaan crypto.", - "unitags.intro.title": "Memperkenalkan nama pengguna", - "unitags.notification.delete.error": "Tidak dapat memadam nama pengguna. Cuba lagi nanti.", - "unitags.notification.delete.title": "Nama pengguna dipadamkan", - "unitags.notification.profile.error": "Tidak dapat mengemas kini profil. Cuba lagi nanti.", - "unitags.notification.profile.title": "Profil dikemaskini", - "unitags.notification.username.error": "Tidak dapat menukar nama pengguna. Cuba lagi nanti.", - "unitags.notification.username.title": "Nama pengguna ditukar", - "unitags.onboarding.claim.subtitle": "Ini ialah alamat peribadi anda yang boleh dihantar oleh orang ramai kepada kripto.", - "unitags.onboarding.claim.title.choose": "Cipta nama pengguna anda", - "unitags.onboarding.claim.title.claim": "Tuntut nama pengguna anda", - "unitags.onboarding.info.description": "Nama pengguna mengubah alamat 0x kompleks kepada nama yang boleh dibaca. Dengan menuntut nama pengguna {{unitagDomain}} , anda boleh menghantar dan menerima crypto dengan mudah dan membina profil web3 awam.", - "unitags.onboarding.info.title": "Alamat yang dipermudahkan", - "unitags.onboarding.profile.subtitle": "Muat naik sendiri atau kekalkan dengan Unicon unik anda. Anda sentiasa boleh menukar ini kemudian.", - "unitags.onboarding.profile.title": "Pilih foto profil", - "unitags.profile.action.delete": "Padam nama pengguna", - "unitags.profile.action.edit": "Edit nama pengguna", - "unitags.profile.bio.label": "Bio", - "unitags.profile.bio.placeholder": "Taip bio untuk profil anda", - "unitags.profile.links.twitter": "Twitter", - "unitags.username.error.chars": "Nama pengguna hanya boleh mengandungi huruf dan nombor", - "unitags.username.error.max": "Nama pengguna tidak boleh lebih daripada {{number}} aksara", - "unitags.username.error.min": "Nama pengguna mestilah sekurang-kurangnya {{number}} aksara", - "unitags.username.error.uppercase": "Nama pengguna hanya boleh mengandungi huruf kecil dan nombor", - "uwulink.error.insufficientTokens": "Tidak cukup {{tokenSymbol}} pada {{chain}}", - "v2.notAvailable": "Uniswap V2 tidak tersedia pada rangkaian ini.", - "wallet.appSignIn": "Log masuk dengan apl", - "wallet.connectingAgreement": "Dengan menyambungkan dompet, anda bersetuju menerima Syarat Perkhidmatan Uniswap Labs dan bersetuju dengan Dasar Privasi.", - "wallet.connectionFailed.message": "Percubaan sambungan gagal. Sila cuba lagi, mengikut langkah-langkah untuk menyambung dalam dompet anda.", - "wallet.mismatch.popup.description": "Sesetengah ciri tidak disokong oleh dompet anda yang disambungkan.", - "wallet.mismatch.popup.title": "Sokongan dompet terhad", - "wallet.other": "Dompet lain", - "wallet.scanToConnect": "Imbas kod QR untuk menyambung", - "wallet.wrongNet": "Dompet anda disambungkan ke rangkaian yang salah.", - "walletConnect.dapps.empty.description": "Sambung ke apl dengan mengimbas kod melalui WalletConnect", - "walletConnect.dapps.manage.empty.title": "Tiada apl disambungkan", - "walletConnect.dapps.manage.title": "Sambungan", - "walletConnect.error.connection.message": "Uniswap Wallet kini menyokong {{chainNames}}. Sila gunakan hanya \"{{dappName}}\" pada rantai ini", - "walletConnect.error.connection.title": "Ralat Sambungan", - "walletConnect.error.general.message": "Terdapat masalah dengan WalletConnect. Sila cuba lagi", - "walletConnect.error.general.title": "Ralat WalletConnect", - "walletConnect.error.scantastic.message": "Terdapat masalah dengan kod QR anda. Sila cuba lagi", - "walletConnect.error.scantastic.title": "Kod QR tidak sah", - "walletConnect.error.unsupported.message": "Pastikan anda mengimbas kod QR WalletConnect, Ethereum atau Uniswap Extension yang sah sebelum mencuba lagi.", - "walletConnect.error.unsupported.title": "Kod QR tidak sah", - "walletConnect.error.unsupportedV1.message": "WalletConnect v1 tidak lagi disokong. Aplikasi yang anda cuba sambungkan perlu meningkatkan kepada WalletConnect v2.", - "walletConnect.error.unsupportedV1.title": "Kod QR tidak sah", - "walletConnect.error.uwu.scan": "Terdapat masalah mengimbas kod QR ini.", - "walletConnect.error.uwu.title": "Ralat Pautan UwU", - "walletConnect.error.uwu.unsupported": "Kod QR ini tidak disokong.", - "walletConnect.pending.button.connect": "Sambung", - "walletConnect.pending.button.reject": "Tolak", - "walletConnect.pending.button.scrollDown": "Tatal ke bawah untuk menyambung", - "walletConnect.pending.threat.confirmationText": "Saya faham risikonya", - "walletConnect.pending.threat.description": "Menandatangani mesej atau transaksi daripada apl ini boleh mengakibatkan kehilangan dana.", - "walletConnect.pending.threat.title": "Apl berniat jahat dikesan", - "walletConnect.pending.title": "Sambung ke {{dappName}}", - "walletConnect.pending.unverified.description": "Pastikan anda mempercayai tapak ini sebelum meneruskan. ", - "walletConnect.pending.unverified.title": "Apl tidak disahkan", - "walletConnect.permissions.option.requestApprovals": "Minta kelulusan transaksi", - "walletConnect.permissions.option.transferAssets": "Move funds without permission", - "walletConnect.permissions.option.viewTokenBalances": "View your balance and activity", - "walletConnect.permissions.title": "App permissions", - "walletConnect.request.bundledTransactions.label_one": "Urus niaga dibundel tunggal", - "walletConnect.request.bundledTransactions.label_other": "{{count}} urus niaga yang digabungkan", - "walletConnect.request.button.scrollDown": "Tatal ke bawah untuk menandatangani", - "walletConnect.request.button.sign": "Tanda", - "walletConnect.request.details.label.function": "Fungsi", - "walletConnect.request.details.label.sending": "Menghantar", - "walletConnect.request.details.label.token": "Token", - "walletConnect.request.details.label.tokens": "Token", - "walletConnect.request.error.insufficientFunds": "Anda tidak mempunyai cukup {{currencySymbol}} untuk melengkapkan transaksi ini.", - "walletConnect.request.error.network": "Ralat sambungan Internet atau rangkaian", - "walletConnect.request.warning.batch.message": "Berhati-hati: permintaan ini mengandungi berbilang transaksi dan boleh memindahkan aset", - "walletConnect.request.warning.general.message": "Berhati-hati: mesej ini mungkin memindahkan aset", - "walletConnect.request.warning.message": "Untuk menandatangani mesej atau transaksi, anda perlu mengimport frasa pemulihan dompet.", - "walletConnect.request.warning.title": "Dompet ini dalam mod lihat sahaja", - "web.explore.description": "Temui dan selidiki token pada {{network}}. Terokai kolam teratas. Lihat harga masa nyata, volum dagangan, TVL, carta dan data transaksi.", - "web.explore.title.pools": "Teroka kumpulan teratas di {{network}} di Uniswap", - "web.explore.title.tokens": "Terokai token teratas di {{network}} di Uniswap", - "web.explore.title.transactions": "Terokai urus niaga teratas pada {{network}} di Uniswap" -} diff --git a/packages/uniswap/src/i18n/locales/translations/nl-NL.json b/packages/uniswap/src/i18n/locales/translations/nl-NL.json index 81f0d03cc5d..88a7b1a1ddb 100644 --- a/packages/uniswap/src/i18n/locales/translations/nl-NL.json +++ b/packages/uniswap/src/i18n/locales/translations/nl-NL.json @@ -30,7 +30,6 @@ "account.drawer.modal.body": "Veilig tokens opslaan en swappen met de Uniswap-app. Beschikbaar op iOS en Android.", "account.drawer.modal.dont": "Heb je geen Uniswap Wallet?", "account.drawer.modal.scan": "Met Uniswap Wallet scannen", - "account.drawer.spamToggle": "Onbekende tokens en NFT's verbergen", "account.passkey.delete.acknowledge": "Ik heb een back-up gemaakt van mijn herstelzin en begrijp dat Uniswap Labs mij niet kan helpen mijn wallet te herstellen als ik dit niet heb gedaan.", "account.passkey.delete.description": "Zorg ervoor dat je een back-up hebt gemaakt van je herstelzin met de mobiele app of browserextensie van Uniswap.", "account.passkey.delete.descriptionEmphasized": "Zonder je herstelzin heb je mogelijk geen toegang tot je wallet.", @@ -115,6 +114,7 @@ "account.wallet.watch.placeholder": "ENS of adres", "account.wallet.watch.title": "Een walletadres invoeren", "activity.pending": "{{pendingActivityCount}} in behandeling", + "activity.recentActivity": "Recent activity", "activity.transaction.lpRewards.descriptor": "{{symbol}} beloningen verzameld", "activity.transaction.send.descriptor": "{{amountWithSymbol}} naar {{walletAddress}}", "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} voor {{amountWithSymbolB}}", @@ -144,15 +144,15 @@ "bridgedAsset.send.warning.description": "Je verzendt een ingepakte versie van {{currencySymbol}} op {{chainName}}. Als je dit naar een gecentraliseerde beurs stuurt, gaat je geld permanent verloren.", "bridgedAsset.send.warning.title": "Zorg ervoor dat je naar een compatibel adres verzendt", "bridgedAsset.tdp.description": "Dit is een gebridgede versie van {{currencySymbol}} die 1:1 wordt gedekt door de oorspronkelijke {{currencySymbol}}.", - "bridgedAsset.wormhole.button": "Doorgaan naar Wormhole", - "bridgedAsset.wormhole.description": "Ga door naar het Wormhole-portaal om je {{currencySymbol}} van {{chainName}} naar {{nativeChainName}} te bridgen.", + "bridgedAsset.wormhole.button": "Continue to {{provider}}", + "bridgedAsset.wormhole.description": "Continue to the {{provider}} portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", "bridgedAsset.wormhole.title": "{{currencySymbol}} opnemen naar {{nativeChainName}}", "bridgedAsset.wormhole.toNativeChain": "naar {{nativeChainName}}", "bridgedAsset.wormhole.withdrawToNativeChain": "Opnemen naar {{nativeChainName}}", "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XPL, ZEC — now available on Unichain.", "chart.candlestick": "Candlestick", "chart.error.pools": "Kon de historische data voor de huidige pool niet weergeven.", "chart.error.tokens": "Kon de historische data voor het huidige token niet weergeven.", @@ -257,6 +257,7 @@ "common.button.unlock": "Ontgrendelen", "common.button.view": "Bekijken", "common.button.viewDetails": "Details bekijken", + "common.button.viewMore": "View more", "common.button.yes": "Ja", "common.buy.label": "Kopen", "common.buyAndSell": "Op Uniswap kopen en verkopen", @@ -370,6 +371,7 @@ "common.input.noRecipient.error": "Selecteer ontvanger", "common.input.password.confirm": "Wachtwoord bevestigen", "common.input.password.error.mismatch": "Wachtwoorden komen niet overeen", + "common.input.password.error.same": "New password must be different from current password", "common.input.password.error.weak": "Dit wachtwoord is te zwak", "common.input.password.new": "Nieuw wachtwoord", "common.input.password.placeholder": "Wachtwoord", @@ -503,6 +505,7 @@ "common.remove.liquidity.canceled": "Verwijderen van liquiditeit geannuleerd", "common.remove.liquidity.failed": "Verwijderen van liquiditeit mislukt", "common.removing.liquidity": "Bezig de liquiditeit te verwijderen", + "common.reported": "Reported", "common.resetLimit": "Limiet van {{symbol}} resetten", "common.resetLimitWallet": "Limiet van {{symbol}} in wallet resetten", "common.resettingLimit": "Bezig de limiet van {{symbol}} te resetten...", @@ -532,6 +535,7 @@ "common.status": "Status", "common.step.number": "Stap {{number}}", "common.step.number.of": "Stap {{current}} van {{total}}", + "common.submit": "Submit", "common.swap": "Swappen", "common.swap.expired": "Swap verlopen", "common.swap.failed": "Swap mislukt", @@ -797,6 +801,7 @@ "fee.tier.create": "Vergoedingsniveau aanmaken", "fee.tier.create.button": "Nieuw vergoedingsniveau aanmaken", "fee.tier.create.description": "Als je een nieuw niveau aanmaakt, wordt deze in een nieuwe pool geïnitialiseerd. Dit leidt tot hogere netwerkkosten dan normaal.", + "fee.tier.default": "-- fee tier", "fee.tier.description": "Het bedrag dat je verdient door liquiditeit te verstrekken. Kies een bedrag dat past bij je risicotolerantie en -strategie.", "fee.tier.description.v2": "Het bedrag dat je verdient door liquiditeit te verstrekken. Alle v2-pools hebben vaste kosten van 0,3%. Voor meer opties kun je liquiditeit verstrekken op v4.", "fee.tier.dynamic": "Dynamisch kostenniveau", @@ -884,9 +889,9 @@ "hero.swap.title": "Swap altijd en
overal.", "hidden.nfts.info.banner.text": "Meer informatie over verborgen NFT's", "hidden.nfts.info.text.button": "Verborgen NFT's ({{numHidden}})", - "hidden.nfts.info.text.extension": "Dit zijn potentiële scams en NFT's die je hebt verborgen. Je kunt met de rechtermuisknop op een NFT klikken om deze weer zichtbaar te maken.", "hidden.nfts.info.text.mobile": "Dit zijn potentiële scams en NFT's die je hebt verborgen. Je kunt lang op een NFT drukken om deze weer zichtbaar te maken.", "hidden.nfts.info.text.title": "Verborgen NFT's", + "hidden.nfts.info.text.web": "These are potential scams and NFTs you’ve hidden. You can click on an NFT to unhide it.", "hidden.tokens.info.banner.text": "Meer informatie over verborgen tokens", "hidden.tokens.info.text.button": "Verborgen tokens ({{numHidden}})", "hidden.tokens.info.text.info": "Dit zijn potentiële scams, kleine saldi en tokens die je hebt verborgen. Verborgen tokens worden niet opgenomen in het totale saldo van je wallet.", @@ -957,32 +962,16 @@ "landing.uniswapX.subtitle": "Slimmere swaps, zonder gedoe.", "landing.walletBody": "De vertrouwde cryptowallet in eigen beheer en extensie met miljoenen downloads, ondersteuning door echte mensen en een beoordeling van 4,8 .", "landing.walletSubtitle": "Swap, bewaar, ontdek.", - "language.afrikaans": "Afrikaans", - "language.arabic": "Arabisch", - "language.catalan": "Catalaans", "language.chineseSimplified": "Chinees (vereenvoudigd)", "language.chineseTraditional": "Chinees (traditioneel)", - "language.czech": "Tsjechisch", - "language.danish": "Deens", "language.dutch": "Nederlands", "language.english": "Engels", - "language.finnish": "Fins", "language.french": "Frans", - "language.greek": "Grieks", - "language.hebrew": "Hebreeuws", - "language.hindi": "Hindi", - "language.hungarian": "Hongaars", "language.indonesian": "Indonesisch", - "language.italian": "Italiaans", "language.japanese": "Japans", "language.korean": "Koreaans", - "language.malay": "Maleis", - "language.norwegian": "Noors", - "language.polish": "Pools", "language.portuguese": "Portugees", - "language.romanian": "Roemeens", "language.russian": "Russisch", - "language.serbian": "Servisch", "language.spanishArgentina": "Spaans (Argentinië)", "language.spanishBelize": "Spaans (Belize)", "language.spanishBolivia": "Spaans (Bolivia)", @@ -1006,11 +995,7 @@ "language.spanishUruguay": "Spaans (Uruguay)", "language.spanishUs": "Spaans (VS)", "language.spanishVenezuela": "Spaans (Venezuela)", - "language.swahili": "Swahili", - "language.swedish": "Zweeds", "language.turkish": "Turks", - "language.ukrainian": "Oekraïens", - "language.urdu": "Urdu", "language.vietnamese": "Vietnamees", "large.price.difference": "Groot prijsverschil", "large.price.difference.tooltip": "Het doorgaan met deze transactie zal resulteren in een verlies van geld. Dit verschil kan te wijten zijn aan grote transacties of lage liquiditeit.", @@ -1114,7 +1099,6 @@ "notification.smartWallet.disabled.all": "Smart wallet uitgeschakeld", "notification.smartWallet.disabled.plural": "Uitgeschakeld op {{amount}} netwerken", "notification.spam.NFT.failed": "Kon NFT niet rapporteren. Probeer het later nog eens.", - "notification.spam.NFT.successful": "Gerapporteerd", "notification.swap.network": "Swappen op {{network}}", "notification.swap.pending.swap": "Swap in behandeling", "notification.swap.pending.unwrap": "Unwrappen in behandeling", @@ -1214,6 +1198,7 @@ "onboarding.home.intro.backup.description.mobile": "Maak een herstelplan voor het geval je ooit je telefoon kwijtraakt of een nieuwe krijgt.", "onboarding.home.intro.backup.title": "Maak een back-up van je wallet", "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK en JUP - nu beschikbaar op Unichain", + "onboarding.home.intro.bridgedAssets.description.v2": "DOGE, XRP, XPL, ZEC — now available on Unichain", "onboarding.home.intro.bridgedAssets.title": "Nieuwe tokens traden op Unichain", "onboarding.home.intro.fund.description": "Financier je wallet door crypto te kopen of over te boeken vanaf een ander account.", "onboarding.home.intro.fund.title": "Ontvang je eerste token", @@ -1438,15 +1423,18 @@ "poolFinder.availablePools.notFound.description": "Geen overeenkomende v2-pools gevonden. Controleer je tokenselectie nogmaals en zorg ervoor dat je verbonden bent met de juiste wallet.", "pools.explore": "Pools verkennen", "portfolio.activity.filters.timePeriod.all": "Altijd", - "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", + "portfolio.activity.filters.transactionType.addLiquidity": "Added liquidity", "portfolio.activity.filters.transactionType.all": "Alle typen", "portfolio.activity.filters.transactionType.approvals": "Approvals", - "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", - "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.claimFees": "Claimed fees", + "portfolio.activity.filters.transactionType.createPool": "Pools created", "portfolio.activity.filters.transactionType.mints": "Mints", - "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", + "portfolio.activity.filters.transactionType.receives": "Receives", + "portfolio.activity.filters.transactionType.removeLiquidity": "Removed liquidity", + "portfolio.activity.filters.transactionType.sends": "Sends", "portfolio.activity.filters.transactionType.swaps": "Swaps", "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.search.placeholder": "Search activity", "portfolio.activity.table.column.address": "Address", "portfolio.activity.table.column.amount": "Amount", "portfolio.activity.table.column.time": "Time", @@ -1459,7 +1447,12 @@ "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", "portfolio.disconnected.demoWallet.title": "Demo wallet", "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", + "portfolio.nfts.search.placeholder": "Search your NFTs", "portfolio.nfts.title": "NFT's", + "portfolio.overview.stats.averageSwapSize": "Average swap size", + "portfolio.overview.stats.swappedThisWeek": "Swapped this week", + "portfolio.overview.stats.swapsThisWeek": "Swaps this week", + "portfolio.overview.stats.totalSwapVolume": "Total swap volume", "portfolio.overview.title": "Overzicht", "portfolio.title": "Portefeuille", "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", @@ -1471,6 +1464,7 @@ "portfolio.tokens.table.column.token": "Token", "portfolio.tokens.table.column.value": "Waarde", "portfolio.tokens.title": "Tokens", + "portfolio.view": "View portfolio", "position.addHook": "Een hook toevoegen", "position.addHook.tooltip": "Hooks zijn een geavanceerde functie die het mogelijk maken voor pools om te interageren met smartcontracten, waardoor verschillende mogelijkheden beschikbaar worden. Wees voorzichtig bij het toevoegen van hooks, aangezien sommige kwaadaardig kunnen zijn of onbedoelde gevolgen kunnen hebben.", "position.addingHook": "Hook toevoegen", @@ -1588,6 +1582,33 @@ "qrScanner.wallet.networks": "Ondersteunde netwerken", "range.outOfView": "Bereik niet zichtbaar", "removeLiquidity.pooled": "Gepoold {{symbol}}:", + "reporting.activity.unhide.action": "Unhide activity", + "reporting.pool.details.title": "Don’t recognize this position?", + "reporting.token.data.options.price.subtitle": "Token price is wrong or unavailable", + "reporting.token.data.options.price.title": "Price", + "reporting.token.data.options.priceChart.subtitle": "Data is wrong or incomplete", + "reporting.token.data.options.priceChart.title": "Price chart", + "reporting.token.data.options.tokenDetails.subtitle": "Token image, description, or link issue", + "reporting.token.data.options.tokenDetails.title": "Token details", + "reporting.token.data.options.volume.subtitle": "Token volume is wrong or unavailable", + "reporting.token.data.options.volume.title": "Volume", + "reporting.token.data.title": "Data issue", + "reporting.token.options.hiddenFees.subtitle": "Token has undisclosed fees when bought/sold", + "reporting.token.options.hiddenFees.title": "Hidden fees", + "reporting.token.options.imposter.subtitle": "Token seems fraudulent or misleading", + "reporting.token.options.imposter.title": "Imposter token", + "reporting.token.options.other.title": "Something else", + "reporting.token.options.spam.subtitle": "Token appeared in wallet unexpectedly", + "reporting.token.options.spam.title": "Spam token", + "reporting.token.report.button.disabled": "Select an issue", + "reporting.token.report.other.placeholder": "Describe the issue", + "reporting.token.report.title": "Report token", + "reporting.token.report.title.withSymbol": "Report {{symbol}}", + "reporting.token.warning.button": "This warning is incorrect", + "reporting.token.warning.report.placeholder": "Add details (optional)", + "reporting.token.warning.report.submit": "Report issue", + "reporting.token.warning.report.subtitle": "Report an issue if the warning below seems wrong. We’ll take a closer look.", + "reporting.token.warning.report.title": "Report an inaccurate warning", "revoke.failed.message": "Een netwerk- of verbindingsprobleem heeft er waarschijnlijk toe geleid dat je intrekking is mislukt. Controleer je verbinding en probeer het opnieuw.", "routing.aggregateLiquidity": "Indien beschikbaar worden liquiditeitsbronnen samengevoegd voor betere prijzen en gasvrij swappen.", "routing.aggregateLiquidity.uniswapx": "UniswapX bundelt liquiditeitsbronnen zowel on-chain als off-chain en biedt je zo de best beschikbare prijzen en swaps zonder gaskosten.", @@ -1735,6 +1756,7 @@ "settings.setting.backup.status.inProgress": "Back-up maken naar {{cloudProviderName}} ...", "settings.setting.backup.status.recoveryPhrase.backed": "Back-up gemaakt", "settings.setting.backup.status.title": "Back-up op {{cloudProviderName}}", + "settings.setting.balancesActivity.title": "Balances and activity", "settings.setting.beta.tooltip": "Binnenkort beschikbaar", "settings.setting.biometrics.appAccess.subtitle.android": "Gezichtsherkenning/vingerafdruk vereisen om de app te openen.", "settings.setting.biometrics.appAccess.subtitle.ios": "{{biometricsMethod}} vereisen om de app te openen.", @@ -1786,7 +1808,8 @@ "settings.setting.privacy.analytics.title": "App-analyses", "settings.setting.privateKeys.title": "Privésleutels", "settings.setting.recoveryPhrase.title": "Herstelzin", - "settings.setting.smallBalances.title": "Saldo van portefeuille", + "settings.setting.reportedActivity.subtitle": "Transactions you’ve reported as spam will be hidden from your activity feed.", + "settings.setting.reportedActivity.title": "Hide reported activity", "settings.setting.smartWallet.action.enable": "Inschakelen", "settings.setting.smartWallet.action.smartWallet": "Smart wallet", "settings.setting.smartWallet.notEligible": "Komt niet in aanmerking", @@ -2290,6 +2313,8 @@ "transaction.networkCost.label": "Netwerkkosten", "transaction.networkCost.maxNativeBalance.description": "Een klein bedrag van het netwerktokensaldo wordt gebruikt voor de netwerkkosten van deze overboeking.", "transaction.networkCost.maxNativeBalance.title": "Waarom kan ik mijn maximale saldo niet gebruiken?", + "transaction.networkCost.presetNativeBalance.description": "You don’t have enough balance to cover both this amount and the network cost of the transaction.", + "transaction.networkCost.presetNativeBalance.title": "Why can’t I use this amount?", "transaction.networkCost.veryHigh.label": "Zeer hoge netwerkkosten", "transaction.notification.error.cancel": "Kon de transactie niet annuleren", "transaction.notification.error.replace": "Kon de transactie niet vervangen", diff --git a/packages/uniswap/src/i18n/locales/translations/no-NO.json b/packages/uniswap/src/i18n/locales/translations/no-NO.json deleted file mode 100644 index 8ec9064c887..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/no-NO.json +++ /dev/null @@ -1,2384 +0,0 @@ -{ - "account.authHeader.claimReward": "Gjør krav på {{amount}} belønning", - "account.cloud.backup.subtitle": "Det er flere gjenopprettingsfraser som er sikkerhetskopiert til din {{cloudProviderName}}.", - "account.cloud.backup.title": "Velg en sikkerhetskopi for å gjenopprette", - "account.cloud.button.restore.android": "Gjenopprett fra Google Disk", - "account.cloud.button.restore.ios": "Gjenopprett fra iCloud", - "account.cloud.empty.description": "Det ser ut til at du ikke har sikkerhetskopiert noen av gjenopprettingsfrasene dine til {{cloudProviderName}}.", - "account.cloud.empty.title": "0 sikkerhetskopier funnet", - "account.cloud.error.backup.message": "Kunne ikke importere sikkerhetskopier på grunn av manglende tillatelser, avbrudd i autorisasjonen eller på grunn av en skyfeil", - "account.cloud.error.backup.title": "Feil under import av sikkerhetskopier", - "account.cloud.error.password.title": "Ugyldig passord. Vær så snill, prøv på nytt.", - "account.cloud.error.unavailable.button.cancel": "Ikke nå", - "account.cloud.error.unavailable.button.settings": "Gå til Innstillinger", - "account.cloud.error.unavailable.message.android": "Bekreft at du er logget på en Google-konto med Google Disk aktivert på denne enheten, og prøv igjen.", - "account.cloud.error.unavailable.message.ios": "Kontroller at du er logget på en Apple-ID med iCloud Drive aktivert på denne enheten, og prøv igjen.", - "account.cloud.error.unavailable.title.android": "Google Disk er ikke tilgjengelig", - "account.cloud.error.unavailable.title.ios": "iCloud Drive er ikke tilgjengelig", - "account.cloud.loading.title": "Søker etter sikkerhetskopier...", - "account.cloud.lockout.time.hours_one": "For mange forsøk. Prøv igjen om 1 time.", - "account.cloud.lockout.time.hours_other": "For mange forsøk. Prøv igjen om {{count}} timer.", - "account.cloud.lockout.time.minutes_one": "For mange forsøk. Prøv igjen om 1 minutt.", - "account.cloud.lockout.time.minutes_other": "For mange forsøk. Prøv igjen om {{count}} minutter.", - "account.cloud.password.input": "Oppgi passord", - "account.cloud.password.recoveryPhrase": "Skriv inn gjenopprettingsfrasen i stedet", - "account.cloud.password.subtitle": "Dette passordet kreves for å gjenopprette sikkerhetskopien av gjenopprettingsfrasen fra {{cloudProviderName}}.", - "account.cloud.password.title": "Skriv inn sikkerhetskopipassord", - "account.drawer.gitVersion": "Versjon: ", - "account.drawer.modal.body": "Lagre og bytt ut tokens trygt med Uniswap-appen. Tilgjengelig på iOS og Android.", - "account.drawer.modal.dont": "Har du ikke en Uniswap-lommebok?", - "account.drawer.modal.scan": "Skann med Uniswap Wallet", - "account.drawer.spamToggle": "Skjul ukjente tokens og NFT-er", - "account.porfolio.activity.cancelledBelow": "Denne bestillingen ble kansellert fordi saldoen din gikk under det angitte beløpet.", - "account.portfolio.activity.signLimit": "Denne bestillingen vil ikke fylles fordi saldoen din gikk under det angitte beløpet. Øk saldoen for å fikse.", - "account.recoveryPhrase.education.part1": "En gjenopprettingsfrase (eller frøsetning) er et sett med ord som kreves for å få tilgang til lommeboken din, som et passord.", - "account.recoveryPhrase.education.part2": "Du kan skrive inn gjenopprettingsfrasen din på en ny enhet for å gjenopprette lommeboken og dens innhold.", - "account.recoveryPhrase.education.part3": "Men hvis du mister gjenopprettingsfrasen, vil du miste tilgangen til lommeboken din.", - "account.recoveryPhrase.education.part4": "I stedet for å huske gjenopprettingsfrasen din, kan du sikkerhetskopiere den til {{cloudProviderName}} og beskytte den med et passord.", - "account.recoveryPhrase.education.part5": "Du kan også sikkerhetskopiere gjenopprettingsfrasen manuelt ved å skrive den ned og lagre den på et trygt sted.", - "account.recoveryPhrase.education.part6": "Vi anbefaler å bruke begge typer sikkerhetskopier, fordi hvis du mister gjenopprettingsfrasen, vil du ikke kunne gjenopprette lommeboken.", - "account.recoveryPhrase.error.invalid": "Ugyldig setning", - "account.recoveryPhrase.error.invalidWord": "Ugyldig ord: {{word}}", - "account.recoveryPhrase.error.phraseLength": "Gjenopprettingsfrase må bestå av 12-24 ord", - "account.recoveryPhrase.error.wrong": "Feil gjenopprettingsfrase", - "account.recoveryPhrase.helpText.import": "Hvordan finner jeg min gjenopprettingsfrase?", - "account.recoveryPhrase.helpText.restoring": "Prøv å søke på nytt", - "account.recoveryPhrase.input": "Skriv inn gjenopprettingsfrasen", - "account.recoveryPhrase.remove.final.description": "Sørg for at du har skrevet ned gjenopprettingsfrasen eller sikkerhetskopiert den på {{cloudProviderName}}. Du vil ikke ha tilgang til midlene dine ellers.", - "account.recoveryPhrase.remove.final.title": "Du fjerner gjenopprettingsfrasen", - "account.recoveryPhrase.remove.import.description": "Du kan bare lagre én gjenopprettingsfrase om gangen. For å fortsette å importere en ny, må du fjerne den nåværende gjenopprettingsfrasen og eventuelle tilknyttede lommebøker fra denne enheten.", - "account.recoveryPhrase.remove.initial.description": "Dette vil fjerne lommeboken din fra denne enheten sammen med gjenopprettingsfrasen.", - "account.recoveryPhrase.remove.initial.title": "Du fjerner {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "Den deler den samme gjenopprettingsfrasen som {{walletNames, list}}. Gjenopprettingsfrasen forblir lagret til du sletter alle gjenværende lommebøker.", - "account.recoveryPhrase.subtitle.import": "Gjenopprettingsfrasen din vil bare bli lagret lokalt på enheten din.", - "account.recoveryPhrase.subtitle.restoring": "Skriv inn gjenopprettingsfrasen nedenfor, eller prøv å søke etter sikkerhetskopier på nytt.", - "account.recoveryPhrase.title.import": "Skriv inn gjenopprettingsfrasen", - "account.recoveryPhrase.title.restoring": "Ingen sikkerhetskopier funnet", - "account.transactionSummary.addLiquidity": "Legg til {{baseSymbol}}/{{quoteSymbol}} V3-likviditet", - "account.transactionSummary.addLiquidityv2": "Legg til og til Uniswap V2", - "account.transactionSummary.approve": "Godkjenn {{tokenSymbol}}", - "account.transactionSummary.claimFor": "Gjør krav på for {{username}}", - "account.transactionSummary.claimReward": "Gjør krav på UNI-belønning for {{username}}", - "account.transactionSummary.collectFees": "Samle gebyrer for {{symbol0}}/{{symbol1}}", - "account.transactionSummary.createAddLiquidity": "Opprett pool og legg til {{baseSymbol}}/{{quoteSymbol}} V3-likviditet", - "account.transactionSummary.createPool": "Lag {{baseSymbol}}/{{quoteSymbol}} V3-pool", - "account.transactionSummary.decision.abstain": "Stem for å avstå fra forslaget {{proposalKey}} med begrunnelse "{{reason}}"", - "account.transactionSummary.decision.against": "Stem mot forslaget {{proposalKey}} med begrunnelse "{{reason}}"", - "account.transactionSummary.decision.for": "Stem på forslag {{proposalKey}} med begrunnelse "{{reason: info.reason}}"", - "account.transactionSummary.delegateSummary": "Delegere stemmerett til {{username}}", - "account.transactionSummary.depositLiquidity": "Innskuddslikviditet", - "account.transactionSummary.executeProposal": "Utfør forslaget {{proposalKey}}.", - "account.transactionSummary.migrateLiquidity": "Migrer {{baseSymbol}}/{{quoteSymbol}} likviditet til V3", - "account.transactionSummary.queueProposal": "Køforslag {{proposalKey}}.", - "account.transactionSummary.removeLiquiditySummary": "Fjern og ", - "account.transactionSummary.revoke": "Opphev {{tokenSymbol}}", - "account.transactionSummary.sendSummary": "Sendt til {{recipient}}", - "account.transactionSummary.submitProposal": "Send inn nytt forslag", - "account.transactionSummary.swapExactIn": "Bytt nøyaktig med ", - "account.transactionSummary.swapExactOut": "Bytt med nøyaktig ", - "account.transactionSummary.unwrapTo": "Pakk ut til {{symbol}}", - "account.transactionSummary.vote.abstain": "Stem for å avstå fra forslaget {{proposalKey}}", - "account.transactionSummary.vote.against": "Stem mot forslaget {{proposalKey}}", - "account.transactionSummary.vote.for": "Stem for forslag {{proposalKey}}", - "account.transactionSummary.withdrawLiquidity": "Ta ut innskuddslikviditet", - "account.transactionSummary.wrapTo": "Pakk til {{symbol}}", - "account.wallet.action.copy": "Kopier lommebokadressen", - "account.wallet.action.report": "Rapporter profil", - "account.wallet.action.settings": "Lommebokinnstillinger", - "account.wallet.action.viewExplorer": "Se på {{blockExplorerName}}", - "account.wallet.button.add": "Legg til lommebok", - "account.wallet.button.addViewOnly": "Legg til en lommebok for visning", - "account.wallet.button.create": "Lag en ny lommebok", - "account.wallet.button.import": "Importer en ny lommebok", - "account.wallet.button.manage": "Administrer lommebok", - "account.wallet.button.remove": "Fjern lommeboken", - "account.wallet.button.restore": "Gjenopprett lommebok", - "account.wallet.button.watch": "Se på en lommebok", - "account.wallet.create.placeholder": "Lommebok {{index}}", - "account.wallet.edit.label.input.placeholder": "Lommeboketikett", - "account.wallet.header.button.disabled.title": "Rediger profil", - "account.wallet.header.button.title": "Rediger etikett", - "account.wallet.header.other": "Dine andre lommebøker", - "account.wallet.header.viewOnly": "Se-bare lommebøker", - "account.wallet.menu.copy.title": "Kopier lommebokadressen", - "account.wallet.menu.edit.title": "Rediger etikett", - "account.wallet.menu.remove.title": "Fjern lommeboken", - "account.wallet.remove.check": "Jeg har sikkerhetskopiert gjenopprettingsfrasen og forstår at Uniswap Labs ikke kan hjelpe meg med å gjenopprette lommeboken hvis jeg ikke klarte å gjøre det.", - "account.wallet.remove.title": "Fjern {{name}}", - "account.wallet.remove.viewOnly": "Du kan alltid legge til visningsbeskyttede lommebøker ved å skrive inn lommebokens adresse.", - "account.wallet.restore.description": "Fordi du bruker en ny enhet, må du gjenopprette gjenopprettingsfrasen. Dette vil tillate deg å bytte og sende tokens.", - "account.wallet.select.error": "Kunne ikke laste inn adresser", - "account.wallet.select.loading.subtitle": "Lommebøkene dine vises nedenfor.", - "account.wallet.select.loading.title": "Søker etter lommebøker", - "account.wallet.select.title_one_one": "En lommebok funnet", - "account.wallet.select.title_one_other": "Velg lommebøker som skal importeres", - "account.wallet.viewOnly.button": "Importer lommebok", - "account.wallet.viewOnly.description": "For å bytte, kjøpe, sende og motta tokens, må du importere denne lommebokens gjenopprettingsfrase.", - "account.wallet.viewOnly.title": "Denne lommeboken er visningsbeskyttet", - "account.wallet.watch.error.alreadyImported": "Denne adressen er allerede importert", - "account.wallet.watch.error.notFound": "Adressen ble ikke funnet", - "account.wallet.watch.error.smartContract": "Adresse er en smart kontrakt", - "account.wallet.watch.message": "Ved å legge til en visningslommebok kan du prøve appen eller spore en lommebok. Du vil ikke kunne bytte eller sende penger.", - "account.wallet.watch.placeholder": "ENS eller adresse", - "account.wallet.watch.title": "Skriv inn en lommebokadresse", - "activity.pending": "{{pendingActivityCount}} Venter", - "activity.transaction.receive.descriptor": "{{amountWithSymbol}} fra {{walletAddress}}", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} til {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} for {{amountWithSymbolB}}", - "activity.transaction.swap.descriptor.formatted": " for ", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} og {{amountWithSymbolB}}", - "activity.transaction.tokens.descriptor.formatted": " og ", - "addLiquidity.shareOfPool": "Andel av bassenget", - "addressInput.recipient": "Mottaker", - "analytics.allow": "Tillat analyser", - "analytics.allow.message": "Vi bruker anonymiserte data for å forbedre opplevelsen din med Uniswap Labs-produkter.", - "appRating.button.notReally": "Ikke egentlig", - "appRating.description": "Gi oss beskjed hvis du har en god opplevelse med denne appen", - "appRating.extension.review.description": "Velg en stjernerangering og legg igjen en anmeldelse på Chrome Nettmarked.", - "appRating.extension.review.title": "Vil du vurdere Uniswap-utvidelsen?", - "appRating.extension.title": "Liker du Uniswap Extension?", - "appRating.feedback.button.send": "Send tilbakemelding", - "appRating.feedback.description": "Fortell oss hvordan vi kan forbedre opplevelsen din", - "appRating.feedback.title": "Vi beklager å høre det.", - "appRating.mobile.title": "Liker du Uniswap Wallet?", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "burn.input.enterAPercent.error": "Skriv inn en prosent", - "chart.candlestick": "Lysestake", - "chart.error.pools": "Kan ikke vise historiske data for gjeldende basseng.", - "chart.error.tokens": "Kan ikke vise historiske data for gjeldende token.", - "chart.line": "Linjediagram", - "chart.missingData": "Manglende kartdata", - "chart.price.label.close": "Lukk", - "chart.price.label.high": "Høy", - "chart.price.label.low": "Lav", - "chart.price.label.open": "Åpen", - "chart.settings.unavailable.label": "Denne innstillingen er utilgjengelig for gjeldende diagram", - "claim.thanks": "Takk for at du er en del av Uniswap-fellesskapet ", - "claim.uni.arrived": "UNI har kommet", - "common.accept": "Aksepterer", - "common.activity": "Aktivitet", - "common.add.label": "Legg til", - "common.add.liquidity.cancelled": "Legg til likviditet kansellert", - "common.add.liquidity.failed": "Tilførsel av likviditet mislyktes", - "common.add.v2.liquidity.cancelled": "Legg til V2-likviditet kansellert", - "common.add.v2.liquidity.failed": "Legg til V2-likviditet mislyktes", - "common.added.liquidity": "Tilført likviditet", - "common.added.v2.liquidity": "Lagt til V2-likviditet", - "common.addedLiquidity": "Tilført likviditet", - "common.adding.liquidity": "Tilføre likviditet", - "common.adding.v2.liquidity": "Legger til V2-likviditet", - "common.addLiquidity": "Legg til likviditet", - "common.addressOrENS": "Lommebokadresse eller ENS-navn", - "common.advanced": "Avansert", - "common.all": "Alle", - "common.allTime": "Hele tiden", - "common.amount.label": "Beløp", - "common.amountDeposited.label": "{{amount}} Deponert", - "common.and": "og", - "common.app": "App", - "common.approval.cancelled": "Godkjenning kansellert", - "common.approval.failed": "Godkjenning mislyktes", - "common.approve": "Vedta", - "common.approved": "Godkjent", - "common.approvePending": "Venter på godkjenning...", - "common.approveSpend": "Godkjenn {{symbol}} utgifter", - "common.approving": "Godkjenner", - "common.areYouSure": "Er du sikker?", - "common.automatic": "Auto", - "common.availableIn": "Uniswap tilgjengelig i: ", - "common.availableOnIOSAndroid": "Tilgjengelig på iOS og Android", - "common.availableOnIOSAndroidChrome": "Tilgjengelig på iOS, Android og Chrome", - "common.backToPositions": "Tilbake til posisjoner", - "common.blocked.ifError": "Hvis du mener dette er en feil, vennligst send en e-post med adressen din til ", - "common.blocked.reason": "Denne adressen er blokkert på Uniswap Labs-grensesnittet fordi den er knyttet til en eller flere blokkerte aktiviteter.", - "common.blockedAddress": "Blokkert adresse", - "common.blog": "Blogg", - "common.borrow.cancelled": "Lån kansellert", - "common.borrow.failed": "Lånet mislyktes", - "common.borrowed": "Lånt", - "common.borrowing": "Låne", - "common.bought": "Kjøpt", - "common.brandAssets": "Merkeverdier", - "common.burn.cancelled": "Brenningen avbrutt", - "common.burn.failed": "Brenningen mislyktes", - "common.burned": "Brent", - "common.burning": "Brenning", - "common.button.accept": "Aksepterer", - "common.button.back": "Tilbake", - "common.button.buy": "Kjøpe", - "common.button.cancel": "Avbryt", - "common.button.checkin": "Sjekk inn", - "common.button.close": "Lukk", - "common.button.confirm": "Bekrefte", - "common.button.connect": "Koble", - "common.button.continue": "Fortsette", - "common.button.copied": "Kopiert", - "common.button.copy": "Kopiere", - "common.button.create": "Skape", - "common.button.delete": "Slett", - "common.button.disconnect": "Koble fra", - "common.button.dismiss": "Avskjedige", - "common.button.done": "Ferdig", - "common.button.edit": "Redigere", - "common.button.enable": "Muliggjøre", - "common.button.finish": "Fullfør", - "common.button.goBack": "Gå tilbake", - "common.button.later": "Kanskje senere", - "common.button.learn": "Lære mer", - "common.button.next": "Neste", - "common.button.notNow": "Ikke nå", - "common.button.ok": "OK", - "common.button.paste": "Lim inn", - "common.button.pay": "Betale", - "common.button.receive": "Motta", - "common.button.remove": "Fjerne", - "common.button.reset": "Tilbakestill", - "common.button.restore": "Restaurere", - "common.button.retry": "Prøv på nytt", - "common.button.reveal": "Avsløre", - "common.button.review": "Anmeldelse", - "common.button.save": "Lagre", - "common.button.scrollDown": "Bla nedover", - "common.button.sell": "Selge", - "common.button.send": "Sende", - "common.button.setup": "Sett opp", - "common.button.share": "Dele", - "common.button.showLess": "Vis mindre", - "common.button.showMore": "Vis mer", - "common.button.sign": "Skilt", - "common.button.skip": "Hopp over", - "common.button.swap": "Bytte", - "common.button.tryAgain": "Prøv igjen", - "common.button.understand": "jeg forstår", - "common.button.view": "Utsikt", - "common.button.viewDetails": "Se detaljer", - "common.button.yes": "Ja", - "common.buy.cancelled": "Kjøp kansellert", - "common.buy.failed": "Kjøp mislyktes", - "common.buy.label": "Kjøpe", - "common.buyAndSell": "Kjøp og selg på Uniswap", - "common.buying": "Kjøpe", - "common.by": "Av", - "common.cancel.failed": "Avbryt mislyktes", - "common.cancellation.cancelled": "Avbestilling kansellert", - "common.cancellationSubmitted": "Avbestilling sendt", - "common.cancellationSuccessful": "Kanselleringen var vellykket", - "common.cancelled": "avbrutt", - "common.cancelling": "Avbryter", - "common.cancelOrder": "Avbryt bestillingen", - "common.card.error.description": "Noe gikk galt", - "common.card.error.title": "Oops! Noe gikk galt.", - "common.careers": "Karrierer", - "common.chartType": "Diagramtype", - "common.checkNetwork": "Sjekk nettverksstatus her.", - "common.chromeExtension": "Utvidelse", - "common.claim.cancelled": "Kravet kansellert", - "common.claim.failed": "Kravet mislyktes", - "common.claimed": "Hevdet", - "common.claiming": "Hevde", - "common.claimUnis": "Gjør krav på UNI-tokensene dine", - "common.clear": "Klar", - "common.close": "Lukk", - "common.closed": "Lukket", - "common.collect.button": "Samle inn", - "common.collect.fees.cancelled": "Innkrevingsgebyrer kansellert", - "common.collect.fees.failed": "Innkreving av gebyrer mislyktes", - "common.collected.fees": "Innkrevde gebyrer", - "common.collecting.fees": "Innkreving av gebyrer", - "common.company": "Selskap", - "common.confirm": "Bekrefte", - "common.confirmCancellation": "Bekreft kansellering", - "common.confirmSend.button": "Bekreft sending", - "common.confirmSwap": "Bekreft bytte i lommeboken", - "common.confirmTimedOut": "Bekreftelsen ble tidsavbrutt. Vennligst prøv på nytt.", - "common.confirmTransaction.button": "Bekreft denne transaksjonen i lommeboken din", - "common.confirmWallet": "Bekreft i lommeboken", - "common.connect.button": "Koble", - "common.connectAWallet.button": "Koble til en lommebok", - "common.connectingWallet": "Kobler til lommebok...", - "common.connectWallet.button": "Koble til lommebok", - "common.contactUs.button": "Kontakt oss", - "common.contractInteraction": "Kontraktsinteraksjon", - "common.copied": "Kopiert", - "common.copy.address": "Kopier adresse", - "common.copyLink.button": "Kopier link", - "common.create": "Skape", - "common.create.pool.cancelled": "Opprett basseng kansellert", - "common.create.pool.failed": "Oppretting av basseng mislyktes", - "common.created.pool": "Laget basseng", - "common.creating.pool": "Skaper basseng", - "common.currency": "Valuta", - "common.currentPrice": "Gjeldende pris", - "common.currentPrice.label": "Gjeldende pris:", - "common.currentPrice.unavailable": "Gjeldende pris er ikke tilgjengelig", - "common.custom": "Tilpasset", - "common.customRange": "Egendefinert rekkevidde", - "common.dataOutdated": "Data kan være utdaterte", - "common.default": "Misligholde", - "common.defaultTradeOptions": "Standard handelsopsjoner", - "common.delegate.cancelled": "Delegat kansellert", - "common.delegate.failed": "Delegater mislyktes", - "common.delegated": "Delegert", - "common.delegating": "Delegering", - "common.deploy.cancelled": "Implementeringen kansellert", - "common.deploy.failed": "Implementeringen mislyktes", - "common.deployed": "Utplassert", - "common.deploying": "Utplassering", - "common.deposit.cancelled": "Innskudd kansellert", - "common.deposit.failed": "Innskudd mislyktes", - "common.deposit.toNetwork": "Sett inn tokens til {{label}} -nettverket.", - "common.deposited": "Deponert", - "common.depositing": "Innskudd", - "common.depositTokens": "Innskuddsbrikker", - "common.detailed.label": "Detaljert", - "common.detected": "Oppdaget", - "common.developers": "Utviklere", - "common.dismiss": "Avskjedige", - "common.displaySettings": "Skjerminnstillinger", - "common.dnsRegistrar": "DNS-registrator", - "common.donate": "Donere", - "common.dontShowAgain": "Ikke vis dette igjen", - "common.download": "nedlasting", - "common.downloadAppStore": "Last ned i App Store", - "common.downloadPlayStore": "Last ned i Play-butikken", - "common.downloadUniswap": "Last ned Uniswap", - "common.downloadUniswapApp": "Last ned Uniswap-appen", - "common.dynamic": "Dynamisk", - "common.edit.button": "Redigere", - "common.error.general": "Noe gikk galt", - "common.error.label": "Feil", - "common.error.request": "Beklager, det oppstod en feil under behandlingen av forespørselen din. Hvis du ber om støtte, sørg for å kopiere detaljene for denne feilen.", - "common.error.somethingWrong": "Noe gikk galt!", - "common.error.wrong.tryAgain": "Noe gikk galt. Vær så snill, prøv på nytt.", - "common.errorConnecting.error": "Feil ved tilkobling", - "common.errorLoadingData.error": "Feil ved innlasting av data", - "common.ethereumNameService": "Ethereum navnetjeneste", - "common.etherscan": "Etherscan", - "common.etherscan.link": "Se på Etherscan", - "common.ethRegistrarController": "ETH-registratorkontrollør", - "common.execute.cancelled": "Utførelse avbrutt", - "common.execute.failed": "Utførelse mislyktes", - "common.executed": "Henrettet", - "common.executing": "Utfører", - "common.expired": "Utløpt", - "common.expiry": "Utløp", - "common.explore": "Utforske", - "common.explorer": "Utforsker", - "common.exploreTokens": "Utforsk tokens", - "common.extension": "Uniswap-utvidelse", - "common.failed.error": "Mislyktes", - "common.failedSwitchNetwork": "Kunne ikke bytte nettverk", - "common.fee": "Avgift", - "common.fees": "Gebyrer", - "common.feesEarned.label": "{{symbol}} Opptjente gebyrer:", - "common.feesEarnedPerBase": "{{symbolA}} per {{symbolB}}", - "common.fetchingRoute": "Henter rute", - "common.floor": "Gulv", - "common.floorPrice": "Gulvpris", - "common.for": "Til", - "common.fullRange": "Hele spekteret", - "common.getApp": "Få appen", - "common.getHelp.button": "Få hjelp", - "common.getStarted": "Kom i gang", - "common.getSupport.button": "Få støtte", - "common.getTheApp": "Skaff deg appen", - "common.getUniswapWallet": "Få Uniswap Wallet", - "common.governance": "styresett", - "common.happyHolidays": "God ferie fra Uniswap-teamet!", - "common.helpCenter": "Hjelpesenter", - "common.hidden": "Skjult", - "common.hide.button": "Gjemme seg", - "common.highPrice": "Høy pris", - "common.includes": "Inkluderer", - "common.info.label": "Info", - "common.input.noRecipient.error": "Velg mottaker", - "common.input.password.confirm": "Bekreft passord", - "common.input.password.error.mismatch": "Passord stemmer ikke", - "common.input.password.error.weak": "Dette passordet er for svakt", - "common.input.password.new": "Nytt passord", - "common.input.password.placeholder": "Passord", - "common.input.password.strength.medium": "Medium", - "common.input.password.strength.strong": "Sterk", - "common.input.password.strength.weak": "Svak", - "common.input.search": "Søk", - "common.insufficient.funds": "Utilstrekkelige midler", - "common.insufficientBalance.error": "Utilstrekkelig balanse", - "common.insufficientFundsForNetworkFee.error": "Ikke nok midler til å dekke nettverkskostnader", - "common.insufficientLiquidity": "Utilstrekkelig likviditet", - "common.insufficientTokenBalance.error": "Utilstrekkelig {{tokenSymbol}} balanse", - "common.insufficientTokenBalance.error.simple": "Utilstrekkelig {{tokenSymbol}}", - "common.invalidPair": "Ugyldig par", - "common.invalidRecipient.error": "Ugyldig mottaker", - "common.iOSAndroid": "iOS og Android", - "common.language": "Språk", - "common.lastPrice": "Siste pris", - "common.learnMoreSwap": "Lær mer om bytte", - "common.legalAndPrivacy": "Juridisk og personvern", - "common.less": "Mindre", - "common.limit.cancel_one": "Avbryt grensen", - "common.limit.cancel_other": "Avbryt {{count}} grenser", - "common.limit.cancelled": "Grensen kansellert", - "common.limit.executed": "Begrensning utført", - "common.limit.expired": "Grensen er utløpt", - "common.limit.failed": "Grensen mislyktes", - "common.limit.opened": "Grensen er åpnet", - "common.limit.pending": "Begrensning venter", - "common.limits": "Grenser", - "common.limits.approachMax": "Nærmer seg 100-grensen maksimum", - "common.limits.cancelProceed": "Avbryt grensene for å fortsette", - "common.limits.expires": "Utløper {{timestamp}}", - "common.limits.open": "Åpne grenser", - "common.limits.when": "når {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "Linker", - "common.liquidity": "Likviditet", - "common.liquidity.removed": "Likviditet fjernet", - "common.loading": "Laster", - "common.loadingAllowance": "Lastegodtgjørelse", - "common.loadMore": "Last inn mer", - "common.longText.button.less": "Les mindre", - "common.longText.button.more": "Les mer", - "common.lowPrice": "Lav pris", - "common.manage": "Få til", - "common.market.label": "Marked", - "common.max": "Maks", - "common.migrate": "Migrer", - "common.migrate.liquidity.cancelled": "Migrering av likviditet kansellert", - "common.migrate.liquidity.failed": "Migrering av likviditet mislyktes", - "common.migrate.position": "Migrer posisjon", - "common.migrate.v3": "Migrer til V3", - "common.migrated.liquidity": "Migrert likviditet", - "common.migrating.liquidity": "Migrering av likviditet", - "common.min": "Min", - "common.mint.cancelled": "Mint kansellert", - "common.mint.failed": "Mint mislyktes", - "common.minted": "Preget", - "common.minting": "Minting", - "common.mobile": "Mobil", - "common.more": "Mer", - "common.multiDevice": "Multi-enhet", - "common.navigation.settings": "Innstillinger", - "common.navigation.systemSettings": "Innstillinger", - "common.navigationButton": "Navigasjonsknapp", - "common.needHelp": "Trenger hjelp?", - "common.networkCost": "Nettverkskostnad", - "common.neverMind": "Glem det", - "common.new": "Ny", - "common.new.exclamation": "Ny!", - "common.nfts": "NFT-er", - "common.noActivity": "Ingen aktivitet ennå", - "common.noAmount.error": "Angi et beløp", - "common.noData": "Ingen data", - "common.noResults": "Ingen resultater.", - "common.notAvailableInRegion.error": "Ikke tilgjengelig i din region", - "common.notCreated.label": "Ikke opprettet", - "common.notSupported": "Støttes ikke", - "common.oneDay": "1 dag", - "common.oneHour": "1 time", - "common.oneMonth": "1 måned", - "common.oneWeek": "1 uke", - "common.oneYear": "1 år", - "common.orderCancelled": "Bestillingen kansellert", - "common.orderExecuted": "Ordre utført", - "common.orderExpired": "Bestillingen er utløpt", - "common.orderPending": "Bestilling venter", - "common.outOfRange": "Ute av rekkevidde", - "common.pageNotFound": "Side ikke funnet!", - "common.passkey": "Passnøkkel", - "common.pastDay": "Siste dag", - "common.pastFiveMinutes": "De siste fem minuttene", - "common.pastHour": "Siste time", - "common.pastMonth": "Siste måned", - "common.pastWeek": "Forrige uke", - "common.pastYear": "Siste året", - "common.pay.button": "Betale", - "common.pending": "Avventer", - "common.pending.cancellation": "Venter på kansellering", - "common.pendingEllipsis": "Avventer...", - "common.permit2": "Tillatelse 2", - "common.pool": "Basseng", - "common.pools": "Bassenger", - "common.positionUnavailable": "Stillingen er utilgjengelig", - "common.poweredBy": "Drevet av ", - "common.preview": "Forhåndsvisning", - "common.price": "Pris", - "common.priceImpact": "Advarsel om prispåvirkning", - "common.priceUpdated": "Pris oppdatert", - "common.privacyChoices": "Dine personvernvalg", - "common.privacyChoices.checkbox.description": "Når det er merket av, deler vi ikke dataene dine med tredjepartspartnere for personlig tilpasset annonsering. Du kan aktivere deling når som helst ved å fjerne merket for denne boksen.", - "common.privacyChoices.checkbox.label": "Ikke del informasjonen min", - "common.privacyChoices.description": "Vi kan dele enhetsidentifikatorer med våre annonseringspartnere for å markedsføre tjenestene våre på andre nettsteder og plattformer. Der dette kvalifiserer som salg, deling eller målrettet annonsering i henhold til gjeldende lover, kan du velge bort dette ved å merke av for «ikke del min informasjon»-boksen. For mer informasjon om vår personvernpraksis, se vår Personvernerklæring.", - "common.privacyChoices.disclaimer": "Vær oppmerksom på at valget ditt gjelder kun for denne nettleseren på denne enheten. Du kan også melde deg ut ved å aktivere innstillingen Global Privacy Control i nettleseren du bruker for å få tilgang til tjenestene våre. For å se flere alternativer, gå til innstillingene dine.", - "common.privacyPolicy": "Personvernerklæring", - "common.proceed": "Fortsette", - "common.proceedInWallet": "Fortsett i lommeboken", - "common.proceedInWallet.short": "Fortsett i lommeboken", - "common.protocol": "Protokoll", - "common.publicResolver": "Offentlig oppløser", - "common.purchased": "Kjøpt", - "common.queue.cancelled": "Køen kansellert", - "common.queue.failed": "Køen mislyktes", - "common.queued": "I kø", - "common.queuing": "I kø", - "common.rate": "Vurdere", - "common.readMore": "Les mer", - "common.receive": "Motta", - "common.receive.cancelled": "Mottak kansellert", - "common.receive.failed": "Mottak mislyktes", - "common.received": "Mottatt", - "common.receiving": "Mottar", - "common.recent": "Nylig", - "common.rejected": "Avvist", - "common.reload.label": "Last inn appen på nytt", - "common.remove.label": "Fjerne", - "common.remove.liquidity.cancelled": "Fjern likviditet kansellert", - "common.remove.liquidity.failed": "Fjerning av likviditet mislyktes", - "common.removeAmount": "Fjern beløpet", - "common.removedLiquidity": "Fjernet likviditet", - "common.removeItem": "Fjerne gjenstand", - "common.removing.liquidity": "Fjerne likviditet", - "common.repaid": "Nedbetalt", - "common.repay.cancelled": "Tilbakebetaling kansellert", - "common.repay.failed": "Tilbakebetaling mislyktes", - "common.repaying": "Tilbakebetaler", - "common.resetLimit": "Tilbakestill {{symbol}} grensen", - "common.resetLimitWallet": "Tilbakestill {{symbol}} grensen i lommeboken", - "common.resettingLimit": "Tilbakestiller {{symbol}} grensen...", - "common.resolveIssues_one": "Løs problemet", - "common.resolveIssues_other": "Løs {{count}} problemer", - "common.restricted.region": "Begrenset region", - "common.return.label": "Komme tilbake", - "common.returnToTop": "Gå tilbake til toppen", - "common.reverseRegistrar": "Omvendt registrar", - "common.revoke.approval.failed": "Tilbakekall godkjenning mislyktes", - "common.revoked.approval": "Opphevet godkjenning", - "common.revokedApproval": "Opphevet godkjenning", - "common.revoking.approval": "Tilbakekalle godkjenning", - "common.samePrice": "Samme pris", - "common.scanQRDownload": "Skann QR-koden med telefonen for å laste ned", - "common.selectRegion.label": "Velg din region", - "common.selectToken.label": "Velg et token", - "common.selfCustodial": "Selvforsorg", - "common.sell.label": "Selge", - "common.send.button": "Sende", - "common.send.cancelled": "Sendingen kansellert", - "common.send.failed": "Sendingen mislyktes", - "common.sending": "Sender", - "common.sent": "Sendt", - "common.settings": "Innstillinger", - "common.share": "Dele", - "common.share.shareToTwitter": "Del på Twitter", - "common.share.twitter": "Del på Twitter", - "common.show.button": "Forestilling", - "common.showLess.button": "Vis mindre", - "common.showMore.button": "Vis mer", - "common.signatureExpired": "Signaturen din er utløpt.", - "common.signMessage": "Signer melding", - "common.signMessageWallet": "Signer melding i lommeboken", - "common.simple.label": "Enkel", - "common.sold": "Solgt", - "common.stats": "Statistikk", - "common.status": "Status", - "common.stayConnected": "Hold kontakten", - "common.step.number": "Trinn {{number}}", - "common.submit.proposal.cancelled": "Send inn forslag kansellert", - "common.submit.proposal.failed": "Sending av forslag mislyktes", - "common.submitted.proposal": "Innsendt forslag", - "common.submitting.proposal": "Sender inn forslag", - "common.success": "Suksess", - "common.swap": "Bytte", - "common.swap.cancelled": "Bytte kansellert", - "common.swap.expired": "Bytte utløpt", - "common.swap.failed": "Bytte mislyktes", - "common.swapped": "Byttet", - "common.swapPending": "Bytte venter...", - "common.swapping": "Bytting", - "common.switchNetworks": "Bytt nettverk", - "common.termsOfService": "Vilkår for bruk", - "common.text.connected": "Tilkoblet", - "common.text.contract": "Kontrakt", - "common.text.disconnected": "Koblet fra", - "common.text.error": "Feil", - "common.text.notAvailable": "N/A", - "common.text.recipient": "Til", - "common.text.sender": "Fra", - "common.text.unknown": "Ukjent", - "common.thisMonth": "Denne måneden", - "common.thisWeek": "Denne uka", - "common.thisYear": "I år", - "common.time": "Tid", - "common.time.days": "dager", - "common.time.days_one": "dag", - "common.time.days_other": "dager", - "common.time.hours": "timer", - "common.time.hours_one": "time", - "common.time.hours_other": "timer", - "common.time.minute.amt": "{{time}}m", - "common.time.minutes": "minutter", - "common.time.months": "måneder", - "common.time.months_one": "måned", - "common.time.months_other": "måneder", - "common.time.past.days": "{{days}}d siden", - "common.time.past.hours": "{{hours}}t siden", - "common.time.past.minutes": "{{minutes}}m siden", - "common.time.past.months": "{{months}}måned siden", - "common.time.past.seconds": "{{seconds}}s siden", - "common.time.weeks": "uker", - "common.time.weeks_one": "uke", - "common.time.weeks_other": "uker", - "common.tip.label": "Tips:", - "common.to": "til", - "common.today": "I dag", - "common.tokenA": "Token A", - "common.tokenAmount": "Token beløp", - "common.tokenB": "Token B", - "common.tokenName": "Tokennavn", - "common.tokens": "Tokens", - "common.totalValueLocked": "TVL", - "common.trade": "Handel", - "common.trademarkPolicy": "Varemerkepolitikk", - "common.transactionDetails": "Transaksjonsdetaljer", - "common.transactionId": "Transaksjons-ID", - "common.transactionPending": "Transaksjonen venter", - "common.transactions": "Transaksjoner", - "common.transactionSettings": "Transaksjonsinnstillinger", - "common.transactionSubmitted": "Transaksjonen er sendt inn", - "common.transfer_one": "overføre", - "common.transfer_other": "overføringer", - "common.tryAgain.error": "Prøv igjen", - "common.twitter": "Twitter", - "common.type.label": "Type", - "common.unavailable": "Utilgjengelig", - "common.uniGovernance": "UNIs styresett", - "common.uniswapMobile": "Uniswap mobil", - "common.uniswapProtocol": "Uniswap-protokoll", - "common.uniswapTVL": "Uniswap TVL", - "common.uniswapWallet": "Uniswap lommebok", - "common.uniswapX": "UniswapX", - "common.unknown": "Ukjent", - "common.unknownApproval": "Ukjent godkjenning", - "common.unknownBridge": "Ukjent bro", - "common.unknownError.error": "Ukjent feil", - "common.unknownLend": "Ukjent utlån", - "common.unknownMint": "Ukjent mynte", - "common.unknownSend": "Ukjent Send", - "common.unknownSwap": "Ukjent bytte", - "common.unsupportedAsset_one": "Innholdselementet støttes ikke", - "common.unsupportedAsset_other": "Eiendeler som ikke støttes", - "common.unwrap.button": "Pakk ut", - "common.unwrap.failed": "Utpakking mislyktes", - "common.unwrapped": "Utpakket", - "common.unwrapping": "Utpakking", - "common.view.profile": "Se profil", - "common.viewOnBlockExplorer": "Vis på Block Explorer", - "common.viewOnExplorer": "Vis på Explorer", - "common.volume": "Volum", - "common.vote": "Stemme", - "common.vote.cancelled": "Avstemningen kansellert", - "common.vote.failed": "Avstemning mislyktes", - "common.voted": "Stemte", - "common.voting": "Stemmegivning", - "common.wallet.approve": "Godkjenne i lommebok", - "common.wallet.label": "Lommebok", - "common.walletForSwapping": "Lommeboken bygget for å bytte. Tilgjengelig på iOS og Android.", - "common.warning": "Advarsel", - "common.webApp": "Nettapp", - "common.website": "Nettsted", - "common.whyApprove": "Hvorfor må jeg godkjenne et token?", - "common.whySign": "Hvorfor kreves det signaturer?", - "common.whyWrap": "Hvorfor må jeg pakke inn {{symbol}}?", - "common.withdraw.failed": "Tilbaketrekking mislyktes", - "common.withdrawal.amount": "Uttaksbeløp", - "common.withdrawal.cancelled": "Uttak kansellert", - "common.withdrawing": "Trekke tilbake", - "common.withdrew": "Trakk seg", - "common.withinRange": "Innen rekkevidde", - "common.wrap": "Pakk inn {{symbol}}", - "common.wrap.button": "Pakke inn", - "common.wrap.cancelled": "Innpakning avbrutt", - "common.wrap.failed": "Innpakning mislyktes", - "common.wrapIn": "Pakk {{symbol}} inn i lommeboken", - "common.wrapped": "Innpakket", - "common.wrapping": "Innpakning", - "common.wrappingToken": "Innpakning {{symbol}}...", - "common.wrongNetwork": "Feil nettverk", - "common.your.account.had.insufficient.funds": "Kontoen din hadde ikke nok midler til å fullføre dette byttet.", - "common.your.account.has.insufficient.funds": "Kontoen din har ikke nok midler til å fullføre dette byttet.", - "common.your.limit.could.not.be.fulfilled": "Grensen din kunne ikke nås på dette tidspunktet. Vær så snill, prøv på nytt.", - "common.your.swap.could.not.be.fulfilled": "Byttet ditt kunne ikke oppfylles på dette tidspunktet. Vær så snill, prøv på nytt.", - "common.youreBuying": "Du kjøper", - "common.youReceive": "Du mottar", - "common.youreSending": "Du sender", - "common.youWillReceive": "Du vil motta", - "currency.aud": "australske dollar", - "currency.brl": "Brasiliansk real", - "currency.cad": "kanadiske dollar", - "currency.cny": "kinesisk yuan", - "currency.eur": "Euro", - "currency.gbp": "Britisk pund", - "currency.hkd": "Hong Kong Dollar", - "currency.idr": "indonesisk rupiah", - "currency.inr": "Indisk Rupee", - "currency.jpy": "japansk yen", - "currency.krw": "Sørkoreansk won", - "currency.ngn": "nigerianske Naira", - "currency.pkr": "pakistanske rupi", - "currency.rub": "Russisk rubel", - "currency.sgd": "Singapore dollar", - "currency.thb": "Thai baht", - "currency.try": "tyrkiske lira", - "currency.uah": "ukrainsk hryvnia", - "currency.usd": "Amerikanske dollar", - "currency.vnd": "vietnamesisk dong", - "dapp.request.approve.action": "Vedta", - "dapp.request.approve.fallbackTitle": "Godkjenn dette nettstedet for å få tilgang til tokens", - "dapp.request.approve.helptext": "Tillat dette nettstedet å få tilgang til og bruke dette tokenet for transaksjoner. Sørg for at du stoler på dette nettstedet.", - "dapp.request.approve.label": "Lommebok", - "dapp.request.approve.title": "Godkjenn tilgang til {{tokenSymbol}}", - "dapp.request.base.title": "Transaksjonsforespørsel", - "dapp.request.bridge.description": "Flytt ETH, USDC og mer på tvers av {{numChains}}+ nettverk.", - "dapp.request.bridge.title": "Prøver du å bygge bro?", - "dapp.request.connect.helptext": "La dette nettstedet se din lommebokadresse, saldo og be om godkjenning for transaksjoner.", - "dapp.request.connect.title": "Koble til nettstedet", - "dapp.request.fallback.calldata.label": "Rådata", - "dapp.request.fallback.function.label": "Funksjon", - "dapp.request.permit2.description": "Permit2 administrerer token-godkjenninger på tvers av flere dapps.", - "dapp.request.permit2.header": "Signer tillatelse 2", - "dapp.request.reject.action": "Avvis alle", - "dapp.request.reject.info": "Du har {{totalRequestCount}} transaksjonsforespørsler", - "dapp.request.revoke.action": "Oppheve", - "dapp.request.revoke.helptext": "La dette nettstedet tilbakekalle tilgangen til å bruke dette tokenet for transaksjoner. Sørg for at du stoler på dette nettstedet.", - "dapp.request.revoke.title": "Oppheve tilgangen til {{tokenSymbol}}", - "dapp.request.signature.containsUnrenderableCharacters": "Denne meldingen inneholder tegn som ikke kan gjengis. Sørg for at du stoler på dette nettstedet.", - "dapp.request.signature.error.712-spec-compliance": "SignTypedDataRequestContent mottok data for signering som ikke samsvarer med EIP-712-spesifikasjonen.", - "dapp.request.signature.header": "Signaturforespørsel", - "dapp.request.signature.toggleDataView.raw": "Se rådata", - "dapp.request.signature.toggleDataView.readable": "Se originaldata", - "dapp.request.warning.notActive.message": "Pass på at det er den rette", - "dapp.request.warning.notActive.title": "Dette er ikke din aktive lommebok", - "downloadApp.modal.alreadyHaveWallet": "Har du allerede en lommebok? ", - "downloadApp.modal.alreadyHaveWallet.signInLink": "Logg på her", - "downloadApp.modal.getStarted.description": "Start med å laste ned Uniswap Wallet, tilgjengelig på telefonen eller nettleseren din.", - "downloadApp.modal.getStarted.title": "Kom i gang med Uniswap", - "downloadApp.modal.signUp.description": "Kom i gang ved å laste ned Uniswap Wallet, tilgjengelig på telefonen eller nettleseren din.", - "downloadApp.modal.signUp.description.embeddedWallet": "Kom i gang på sekunder ved å registrere deg nedenfor eller last ned lommeboken vår, tilgjengelig på telefonen eller nettleseren din.", - "downloadApp.modal.signUp.title": "Registrer deg med Uniswap", - "downloadApp.modal.uniswapProducts.subtitle": "Uniswap-produkter fungerer sømløst sammen for å skape den beste onchain-opplevelsen.", - "error.access.expiry": "Dette gir Uniswap-protokollen tilgang til tokenet ditt for handel. For sikkerhets skyld utløper den etter 30 dager.", - "error.dataUnavailable": "Data er utilgjengelig for øyeblikket; vi jobber med en løsning", - "error.id": "Feil-ID: {{eventId}}", - "error.noData": "Ingen data funnet", - "error.request.provideId": "Beklager, det oppstod en feil under behandlingen av forespørselen din. Hvis du ber om støtte, sørg for å oppgi feil-ID.", - "error.tokenApproval": "Token-godkjenning mislyktes", - "error.tokenApprovalEdited": "Utilstrekkelig godkjenningsbeløp", - "error.tokenApprovalEdited.message": "Godkjenningsbeløpet som er angitt i lommeboken din er for lavt til å fullføre denne transaksjonen. Vennligst prøv igjen og øk beløpet.", - "errors.crash.message": "Noe krasjet.", - "errors.crash.restart": "Start appen på nytt", - "errors.crash.title": "UH oh!", - "explore.more.pools": "Utforsk flere bassenger", - "explore.search.action.clear": "Klar", - "explore.search.action.viewEtherscan": "Se på {{blockExplorerName}}", - "explore.search.empty.full": "Ingen resultater funnet for \"{{searchQuery}}\"", - "explore.search.error": "Kunne ikke laste inn søkeresultater", - "explore.search.label.ownedBy": "Eies av {{ownerAddress}}", - "explore.search.placeholder": "Søk på tokens og lommebøker", - "explore.search.section.nft": "NFT-samlinger", - "explore.search.section.popularNFT": "Populære NFT-samlinger", - "explore.search.section.popularTokenInfo": "Populære tokens identifiseres basert på deres handelsvolum på Uniswap de siste 24 timene.", - "explore.search.section.popularTokens": "Populære tokens", - "explore.search.section.recent": "Nylige søk", - "explore.search.section.tokens": "Tokens", - "explore.search.section.wallets": "Lommebøker", - "explore.tokens.error": "Kunne ikke laste inn tokens", - "explore.tokens.favorite.action.add": "Favoritt token", - "explore.tokens.favorite.action.edit": "Rediger favoritter", - "explore.tokens.favorite.action.remove": "Fjern favoritt", - "explore.tokens.favorite.title.default": "Favoritt tokens", - "explore.tokens.favorite.title.edit": "Rediger favorittsymboler", - "explore.tokens.metadata.marketCap": "{{number}} MCap", - "explore.tokens.metadata.totalValueLocked": "{{number}} TVL", - "explore.tokens.metadata.volume": "{{number}} Vol", - "explore.tokens.sort.label.marketCap": "Markedsverdi", - "explore.tokens.sort.label.priceDecrease": "Prisnedgang", - "explore.tokens.sort.label.priceIncrease": "Prisøkning", - "explore.tokens.sort.label.totalValueLocked": "TVL", - "explore.tokens.sort.label.volume": "Volum", - "explore.tokens.sort.option.marketCap": "Markedsverdi", - "explore.tokens.sort.option.priceDecrease": "Prisnedgang (24 timer)", - "explore.tokens.sort.option.priceIncrease": "Prisøkning (24 timer)", - "explore.tokens.sort.option.totalValueLocked": "Uniswap TVL", - "explore.tokens.sort.option.volume": "Unitswap volum (24 timer)", - "explore.tokens.top.title": "Topp tokens", - "explore.unableToDisplayHistorical": "Kan ikke vise historiske volumdata for gjeldende kjede.", - "explore.unableToDisplayHistoricalTVL": "Kan ikke vise historiske TVL-data for gjeldende kjede.", - "explore.uniVolume": "Unitswap volum", - "explore.wallets.favorite.action.add": "Favoritt lommebok", - "explore.wallets.favorite.action.edit": "Rediger favoritter", - "explore.wallets.favorite.action.remove": "Fjern favoritt", - "explore.wallets.favorite.title.default": "Favoritt lommebøker", - "explore.wallets.favorite.title.edit": "Rediger favorittlommebøker", - "extension.connection.networks": "Nettverk", - "extension.connection.popup": "Lommeboken din er ikke koblet til dette nettstedet. Se etter en \"Koble til lommebok\" eller \"Logg inn\"-knapp.", - "extension.connection.popup.trouble": "Problemer med å koble til?", - "extension.connection.popupWithButton": "Lommeboken din er ikke koblet til dette nettstedet.", - "extension.connection.titleConnected": "Tilkoblet", - "extension.connection.titleNotConnected": "Ikke tilkoblet", - "extension.lock.button.forgot": "Glemt passord?", - "extension.lock.button.reset": "Tilbakestill lommebok", - "extension.lock.button.submit": "Låse opp", - "extension.lock.password.error": "Feil passord. Prøv igjen", - "extension.lock.password.reset.initial.description": "Uniswap kan ikke hjelpe å gjenopprette passordet ditt. Du må tilbakestille lommeboken ved å skrive inn gjenopprettingsfrasen på 12 ord på nytt.", - "extension.lock.password.reset.initial.help": "Hvor finner jeg min gjenopprettingsfrase?", - "extension.lock.password.reset.initial.title": "Glemt passord", - "extension.lock.password.reset.speedbump.description": "Sørg for at du har 12-ords gjenopprettingsfrasen før du tilbakestiller lommeboken. Ellers vil du ikke kunne få tilbake pengene dine.", - "extension.lock.password.reset.speedbump.help": "Jeg mistet restitusjonsfrasen", - "extension.lock.password.reset.speedbump.title": "Før du fortsetter", - "extension.lock.subtitle": "Skriv inn passordet ditt for å låse opp", - "extension.lock.title": "Velkommen tilbake", - "extension.network.notSupported": "Ikke-støttet nettverk", - "extension.open": "Åpne Uniswap Extension", - "extension.popup.chrome.button": "Åpne utvidelse", - "extension.popup.chrome.description": "Fullfør denne handlingen ved å åpne Uniswap-utvidelsen.", - "extension.popup.chrome.title": "Fortsett i Uniswap", - "extension.settings.password.enter.title": "Skriv inn ditt nåværende passord", - "extension.settings.password.error.wrong": "Feil passord", - "extension.settings.password.placeholder": "Nåværende passord", - "extension.warning.storage.button": "Sikkerhetskopiere", - "extension.warning.storage.message": "Sørg for å sikkerhetskopiere gjenopprettingsfrasen for å forhindre at du mister tilgang til lommeboken og pengene.", - "extension.warning.storage.title": "Nettleseren din går tom for lagringsplass", - "fee.bestForExotic": "Best for eksotiske par.", - "fee.bestForMost": "Best for de fleste par.", - "fee.bestForStablePairs": "Best for stabile par.", - "fee.bestForVeryStable": "Best for veldig stabile par.", - "fee.dynamic": "Dynamisk avgift", - "fee.percentEarned": "% du vil tjene i gebyrer.", - "fee.selectPercent": "{{pct}}% velg", - "fee.selectPercentDescription": "{{pct}}% av likviditeten valgte dette nivået", - "fee.tier": "Gebyrnivå", - "fee.tier.create": "Opprett gebyrnivå", - "fee.tier.create.button": "Opprett nytt gebyrnivå", - "fee.tier.create.description": "Oppretting av et nytt nivå vil initialiseres i en ny pool og resultere i høyere nettverkskostnader enn vanlig.", - "fee.tier.description": "Beløpet opptjent gir likviditet. Velg et beløp som passer din risikotoleranse og strategi.", - "fee.tier.description.v2": "Beløpet opptjent gir likviditet. Alle v2-pooler har faste avgifter på 0,3 %. For flere alternativer, gi likviditet på v4.", - "fee.tier.dynamic": "Dynamisk gebyrnivå", - "fee.tier.dynamic.create": "Opprette dynamisk gebyrnivå", - "fee.tier.dynamic.create.info": "Du er i ferd med å opprette et basseng med et dynamisk gebyrnivå. Før du fortsetter, sørg for at den valgte kroken støtter dynamiske avgifter.", - "fee.tier.highestTvl": "Høyeste TVL", - "fee.tier.label": "% du vil tjene i gebyrer", - "fee.tier.missing.description": "Finner du ikke nivået du leter etter?", - "fee.tier.new": "Nytt nivå", - "fee.tier.percent.select": "{{percentage}} velg", - "fee.tier.recommended.description": "Anbefalt basert på å ha den høyeste andelen likviditet for det valgte token-paret.", - "fee.tier.search": "Søk eller opprett andre gebyrnivåer", - "fee.tier.search.short": "Søk i nivåer", - "fee.tier.select": "Velg gebyrnivå", - "fee.tier.select.existing.button": "Velg eksisterende gebyrnivå", - "fee.tierExact": "{{fee}} gebyrnivå", - "fee.unavailable": "Opptjente gebyrer er ikke synlige for v2-posisjoner før likviditeten er fjernet.", - "fee.uncollected": "Inkluderer uinnkrevde avgifter:", - "fiatOffRamp.checkout.title": "Selg med", - "fiatOffRamp.connection.quote": "Selger {{amount}} verdt {{currencySymbol}}", - "fiatOffRamp.error.balance": "Overskrider balansen", - "fiatOffRamp.summary.total": "{{cryptoAmount}} for {{fiatAmount}}", - "fiatOffRamp.unsupportedToken.back": "Gå tilbake", - "fiatOffRamp.unsupportedToken.divider": "Ikke-støttede tokens", - "fiatOffRamp.unsupportedToken.message": "Dette tokenet støttes ikke for salg. Bytt denne ressursen til en av de støttede tokenene.", - "fiatOffRamp.unsupportedToken.swap": "Bytt til et støttet token", - "fiatOffRamp.unsupportedToken.title": "Ikke-støttet token", - "fiatOffRamp.welcome.tooltip": "Selg kryptoen din til bankkontoen din eller debetkortet.", - "fiatOnRamp.button.chooseToken": "Velg token", - "fiatOnRamp.cexTransferModal.description": "Kjøp av krypto med et kort støttes ikke i din region. Overfør eiendeler fra en sentralisert byttekonto for å finansiere lommeboken din.", - "fiatOnRamp.cexTransferModal.title": "Overfør for å komme i gang", - "fiatOnRamp.checkout.title": "Kasse med", - "fiatOnRamp.checkoutWith": "Kasse med", - "fiatOnRamp.chooseProvider.description": "Du fortsetter til leverandørens portal for å se gebyrene knyttet til transaksjonen din.", - "fiatOnRamp.completeTransactionHeader": "Fullfør transaksjonen med {{serviceProvider}}", - "fiatOnRamp.connection.error": "Tilkoblingen mislyktes", - "fiatOnRamp.connection.errorDescription": "Noe gikk galt med å koble til {{serviceProvider}}.", - "fiatOnRamp.connection.message": "Kobler deg til {{serviceProvider}}", - "fiatOnRamp.connection.quote": "Kjøper {{amount}} verdt {{currencySymbol}}", - "fiatOnRamp.connection.terms": "Ved å fortsette erkjenner du at du vil være underlagt vilkårene for bruk og personvernreglene med {{serviceProvider}}, som aktuelt.", - "fiatOnRamp.continueInTab": "Gå til {{serviceProvider}} -fanen for å fortsette. Det er trygt å stenge denne modalen nå.", - "fiatOnRamp.disclaimer": "Ved å fortsette erkjenner du at du vil være underlagt vilkårene for bruk og personvernreglene med {{serviceProvider}}, som aktuelt.", - "fiatOnRamp.error.default": "Noe gikk galt.", - "fiatOnRamp.error.load": "Kunne ikke laste inn tokens for å kjøpe", - "fiatOnRamp.error.max": "Maksimalt {{amount}}", - "fiatOnRamp.error.min": "Minimum {{amount}}", - "fiatOnRamp.error.noQuotes": "Ingen sitater funnet.", - "fiatOnRamp.error.unavailable": "Denne tjenesten er utilgjengelig i din region", - "fiatOnRamp.error.unsupported": "Støttes ikke i regionen", - "fiatOnRamp.error.usd": "Kun tilgjengelig for kjøp i USD", - "fiatOnRamp.exchangeRate": "{{outputAmount}} {{outputSymbol}} for {{inputAmount}} {{inputSymbol}}", - "fiatOnRamp.noQuotes.error": "Ingen sitater funnet", - "fiatOnRamp.purchasedOn": "Kjøpt på {{serviceProvider}}", - "fiatOnRamp.quote.advice": "Du fortsetter til leverandørens portal for å se gebyrene knyttet til transaksjonen din.", - "fiatOnRamp.quote.type.list": "{{optionsList}}og andre alternativer", - "fiatOnRamp.quote.type.other": "Andre muligheter", - "fiatOnRamp.quote.type.recent": "Nylig brukt", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "Fra en konto", - "fiatOnRamp.receiveCrypto.title": "Motta krypto", - "fiatOnRamp.receiveCrypto.transferFunds": "Finansier lommeboken din ved å overføre krypto fra en annen lommebok eller konto", - "fiatOnRamp.region.placeholder": "Søk etter land eller region", - "fiatOnRamp.region.title": "Velg din region", - "fiatOnRamp.summary.total": "{{cryptoAmount}} for {{fiatAmount}}", - "forceUpgrade.action.confirm": "Oppdater nå", - "forceUpgrade.action.learn": "Finn ut hvordan du oppdaterer", - "forceUpgrade.action.recoveryPhrase": "Se gjenopprettingsfrase", - "forceUpgrade.description.extension": "En ny versjon av appen er tilgjengelig. For å fortsette å bruke Uniswap-utvidelsen, oppdater den til den nyeste versjonen.", - "forceUpgrade.description.wallet": "En ny versjon av appen er tilgjengelig. For å fortsette å bruke Uniswap Wallet, vennligst oppdater den til den nyeste versjonen.", - "forceUpgrade.label.recoveryPhrase": "Gjenopprettingsfrase", - "forceUpgrade.title": "Oppdater til siste versjon", - "globalPreferences.title": "Globale preferanser", - "hero.scroll": "Rull for å lære mer", - "hero.subtitle": "Den største onchain-markedsplassen. Kjøp og selg krypto på Ethereum og 11+ andre kjeder.", - "hero.swap.title": "Bytt når som helst,
hvor som helst.", - "hidden.nfts.info.banner.text": "Finn ut mer om skjulte NFT-er", - "hidden.nfts.info.text.button": "Skjulte NFT-er ({{numHidden}})", - "hidden.nfts.info.text.extension": "Dette er potensielle svindel og NFT-er du har gjemt. Du kan høyreklikke på en NFT for å vise den.", - "hidden.nfts.info.text.mobile": "Dette er potensielle svindel og NFT-er du har gjemt. Du kan trykke lenge på en NFT for å vise den.", - "hidden.nfts.info.text.title": "Skjulte NFT-er", - "hidden.tokens.info.banner.text": "Lær mer om skjulte tokens", - "hidden.tokens.info.text.button": "Skjulte tokens ({{numHidden}})", - "hidden.tokens.info.text.info": "Dette er potensielle svindel, små saldoer og tokens du har gjemt. Skjulte tokens er ikke inkludert i din totale lommeboksaldo.", - "hidden.tokens.info.text.title": "Skjulte tokens", - "home.activity.empty.button": "Motta tokens eller NFT-er", - "home.activity.empty.description.default": "Når du godkjenner, handler eller overfører tokens eller NFT-er, vil transaksjonene dine vises her.", - "home.activity.empty.description.external": "Når denne lommeboken foretar transaksjoner, vises de her.", - "home.activity.empty.title": "Ingen aktivitet ennå", - "home.activity.error.load": "Kunne ikke laste inn aktiviteten", - "home.activity.title": "Aktivitet", - "home.banner.offline": "Du er i frakoblet modus", - "home.banner.testnetMode": "Du er i testnettmodus", - "home.banner.testnetMode.nav": "Du er i testnettmodus. Slå dette av i innstillingene.", - "home.explore.footer": "Trykk her for å utforske tusenvis av tokens, NFT-er og mer", - "home.explore.title": "Utforsk tokens", - "home.extension.error": "Feil ved innlasting av kontoer", - "home.label.buy": "Kjøpe", - "home.label.for": "Kjøp/selg", - "home.label.receive": "Motta", - "home.label.send": "Sende", - "home.label.swap": "Bytte", - "home.nfts.title": "NFT-er", - "home.tokens.empty.action.buy.description": "Kjøp med debetkort eller bankkonto.", - "home.tokens.empty.action.buy.title": "Kjøp krypto", - "home.tokens.empty.action.import.description": "Skriv inn denne lommebokens gjenopprettingsfrase for å begynne å bytte og sende.", - "home.tokens.empty.action.import.title": "Importer lommebok", - "home.tokens.empty.action.receive.description": "Overfør fra en annen lommebok eller konto.", - "home.tokens.empty.action.receive.title": "Motta krypto", - "home.tokens.empty.description": "Når denne lommeboken kjøper eller mottar tokens, vises de her.", - "home.tokens.empty.title": "Ingen tokens ennå", - "home.tokens.empty.welcome": "Velkommen til lommeboken!", - "home.tokens.empty.welcome.description": "Ser ut som du har en ny lommebok. La oss få det finansiert før du foretar ditt første bytte.", - "home.tokens.error.fetch": "Kunne ikke hente token-saldo", - "home.tokens.error.load": "Kunne ikke laste inn tokensaldoer", - "home.tokens.title": "Tokens", - "home.upsell.receive.cta": "Fra en konto", - "home.upsell.receive.description": "Finansier lommeboken din ved å overføre krypto fra en annen lommebok eller konto", - "home.upsell.receive.title": "Motta krypto", - "home.warning.viewOnly": "Dette er en lommebok for visning", - "interface.metatags.description": "Bytt eller gi likviditet på Uniswap-protokollen", - "interface.metatags.title": "Uniswap-grensesnitt", - "landing.buildNextGen": "Bygg neste generasjon av åpne applikasjoner og verktøy.", - "landing.connectWithUs": "Ta kontakt med oss", - "landing.devDocs": "Utviklerdokumenter", - "landing.directToDeFi": "Gå direkte til DeFi", - "landing.followOnX": "Følg @Uniswap på X for de siste oppdateringene", - "landing.protocolDescription": "Uniswap-produkter drives av Uniswap-protokollen. Protokollen er den største onchain-markedsplassen, med milliarder av dollar i ukentlig volum over tusenvis av tokens på Ethereum og 7+ tilleggskjeder.", - "landing.provideLiquidity.message": "Gi likviditet til pooler på Uniswap-protokollen og tjen gebyrer på bytteavtaler.", - "landing.swapSimple": "Bytte gjort enkelt. Få tilgang til tusenvis av tokens på 11+ kjeder.", - "landing.teamInsights": "Innsikt og nyheter fra teamet", - "landing.trusted": "Stolt på av millioner", - "language.afrikaans": "Afrikaans", - "language.arabic": "arabisk", - "language.catalan": "katalansk", - "language.chineseSimplified": "Forenklet kinesisk", - "language.chineseTraditional": "Tradisjonell kinesisk", - "language.czech": "tsjekkisk", - "language.danish": "dansk", - "language.dutch": "nederlandsk", - "language.english": "Engelsk", - "language.finnish": "finsk", - "language.french": "fransk", - "language.greek": "gresk", - "language.hebrew": "hebraisk", - "language.hindi": "Hindi", - "language.hungarian": "ungarsk", - "language.indonesian": "indonesisk", - "language.italian": "italiensk", - "language.japanese": "japansk", - "language.korean": "koreansk", - "language.malay": "malaysisk", - "language.norwegian": "norsk", - "language.polish": "Pusse", - "language.portuguese": "portugisisk", - "language.romanian": "rumensk", - "language.russian": "russisk", - "language.serbian": "serbisk", - "language.spanishLatam": "Spansk (Latin-Amerika)", - "language.spanishSpain": "Spansk (Spania)", - "language.spanishUs": "spansk (USA)", - "language.swahili": "Swahili", - "language.swedish": "svensk", - "language.turkish": "tyrkisk", - "language.ukrainian": "ukrainsk", - "language.urdu": "Urdu", - "language.vietnamese": "vietnamesisk", - "limit.open.count_one": "1 åpen grense", - "limit.open.count_other": "{{count}} åpne grenser", - "limitPrice.buyingAboveMarketPrice.error.description": "Grenseprisen din er {{percentage}}% høyere enn markedet. Juster grenseprisen for å fortsette.", - "limitPrice.buyingAboveMarketPrice.error.title": "Kjøper {{tokenSymbol}} over markedsprisen", - "limitPrice.marketPriceNotAvailable.error.description": "Vi kan ikke beregne gjeldende markedspris. For å unngå å sende inn en ordre under markedspris, vennligst sjekk nettverkstilkoblingen og prøv igjen.", - "limitPrice.marketPriceNotAvailable.error.title": "Markedspris ikke tilgjengelig", - "limitPrice.sellingBelowMarketPrice.error.description": "Grenseprisen din er {{percentage}}% lavere enn markedet. Juster grenseprisen for å fortsette.", - "limitPrice.sellingBelowMarketPrice.error.title": "Selger {{tokenSymbol}} under markedspris", - "limits.form.disclaimer.mainnet": "Bare Ethereum mainnet-tokens er tilgjengelige for grenser. ", - "limits.form.disclaimer.mainnet.short": "Bare Mainnet-tokens er tilgjengelige for grenser.", - "limits.form.disclaimer.uniswapx": "Grenser vil kanskje ikke utføres nøyaktig når tokens når den angitte prisen. ", - "limits.learnMore": "Finn ut mer om grenser", - "limits.price.input.label": "Når 1 er verdt", - "limits.price.label": "Begrens pris", - "limits.selectSupportedTokens": "Velg støttede tokens", - "liquidity.hooks": "Henger på v4", - "liquidity.hooks.address.input": "Skriv inn hook-adressen", - "liquidity.learnMoreLabel": "Lær om likviditetstilførsel", - "liquidity.notEnough.label": "Ikke nok likviditet til å vise nøyaktig USD-verdi.", - "liquidity.provideOnProtocols": "Tilføre likviditet på forskjellige protokoller", - "liquidityPool.chart.tooltip.amount": "{{token}} likviditet: {{amount}}", - "liquidityPool.page.title": "Legg til likviditet til poolene{{version}} på Uniswap", - "liquidityPool.positions.closed.title": "Lukkede stillinger", - "liquidityPool.positions.page.title": "Administrer {{quoteSymbol}}/{{baseSymbol}} pool likviditet på Uniswap", - "liquidityPool.positions.page.version.description": "Se dine aktive {{version}} likviditetsposisjoner. Legg til nye stillinger.", - "liquidityPool.positions.page.version.title": "Administrer poollikviditet{{version}} på Uniswap", - "liquidityPool.positions.price.formatted": " per ", - "migrate.allowed": "Tillatt", - "migrate.allowLpMigration": "Tillat migrering av LP-token", - "migrate.connectAccount": "Du må koble til en konto.", - "migrate.connectWallet": "Koble til en lommebok for å se V2-likviditeten din.", - "migrate.contract": "Uniswap migrasjonskontrakt", - "migrate.firstLP": "Du er den første likviditetsleverandøren for denne Uniswap V3-poolen. Din likviditet vil migrere til gjeldende {{source}} pris.", - "migrate.highGasCost": "Transaksjonskostnadene dine vil være mye høyere ettersom den inkluderer gassen for å lage bassenget.", - "migrate.invalidRange": "Ugyldig område er valgt. Minsteprisen må være lavere enn maksprisen.", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} LP-tokens", - "migrate.migrating": "Migrerer", - "migrate.missingV2Position": "Ser du ikke en av v2-posisjonene dine? Importer den.", - "migrate.noV2Liquidity": "Ingen V2-likviditet funnet.", - "migrate.positionNoFees": "Posisjonen din vil ikke tjene gebyrer eller bli brukt i handler før markedsprisen beveger seg inn i området ditt.", - "migrate.priceDifference": "Prisforskjell: ", - "migrate.priceWarning": "Du bør kun sette inn likviditet i Uniswap V3 til en pris du mener er riktig.
Hvis prisen virker feil, kan du enten bytte for å flytte prisen eller vente på at noen andre gjør det.", - "migrate.refund": "Minst {{amtA}} {{symA}} og {{amtB}} {{symB}} vil bli refundert til lommeboken din på grunn av valgt prisklasse.", - "migrate.selectFeeTier": "Velg gebyrnivå", - "migrate.setRange": "Angi prisklasse", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Pris:", - "migrate.v2Description": "Dette verktøyet vil trygt migrere {{source}} likviditeten til V3. Prosessen er fullstendig tillitsløs takket være <0>Uniswap-migreringskontrakten ↗", - "migrate.v2Instruction": "For hver pool vist nedenfor, klikk på migrere for å fjerne likviditeten din fra Uniswap V2 og sette den inn i Uniswap V3.", - "migrate.v2Title": "Migrer V2-likviditet", - "migrate.v3Price": "V3 {{sym}} Pris:", - "mint.v3.input.invalidPrice.error": "Ugyldig prisinndata", - "mobileAppPromo.banner.getTheApp.link": "Skaff deg Uniswap Wallet-appen", - "mobileAppPromo.banner.title": "Uniswap: Krypto- og NFT-lommebok", - "moonpay.poweredBy": "Fiat onramp drevet av MoonPay USA LLC", - "moonpay.restricted.region": "Moonpay er ikke tilgjengelig i enkelte regioner. Klikk for å lære mer.", - "nav.createAccount.button": "Opprett konto", - "nav.logIn.button": "Logg inn", - "nav.signIn.button": "Logg på", - "nav.signUp.button": "Registrer deg", - "nav.tabs.createPosition": "Opprett posisjon", - "nav.tabs.viewPositions": "Se posisjoner", - "network.lostConnection": "Du kan ha mistet nettverkstilkoblingen.", - "network.mightBeDown": "{{network}} kan være nede akkurat nå, eller du kan ha mistet nettverkstilkoblingen.", - "network.warning": "Nettverksadvarsel", - "nft.addToBag": "Legg til i kurven", - "nft.authorsCollectionOnUni": "{{name}}sin NFT-samling på Uniswap", - "nft.bag": "Bag", - "nft.blockedCollection": "Denne samlingen er blokkert", - "nft.blockedOpenSea": "Blokkert på OpenSea", - "nft.buyTransferNFTToStart": "Kjøp eller overfør NFT-er til denne lommeboken for å komme i gang.", - "nft.buyTransferTokensToStart": "Kjøp eller overfør tokens til denne lommeboken for å komme i gang.", - "nft.card.notAvailable": "Innhold er ikke
tilgjengelig ennå", - "nft.chainSupportComingSoon": "{{chainName}} støtte kommer snart", - "nft.collection.title": "Utforsk og kjøp på Uniswap", - "nft.collectionOnUni": "NFT-samling på Uniswap", - "nft.collectonOnAddress": "NFT-samling på Uniswap - {{address}}", - "nft.complete": "Fullstendig!", - "nft.editListings": "Rediger oppføringer", - "nft.event": "Begivenhet", - "nft.explore": "Utforsk NFT-er", - "nft.learnWhy": "Finn ut hvorfor", - "nft.list.header.lastPrice": "Siste", - "nft.list.title": "List opp NFT-er", - "nft.listedSignificantly_one": "Én NFT er oppført {{percentage}} under samlingens gulvpris. Er du sikker på at du vil fortsette?", - "nft.listedSignificantly_other": "{{count}} NFT-er er oppført betydelig under samlingens gulvpris. Er du sikker på at du vil fortsette?", - "nft.listForSale": "Liste til salgs", - "nft.lowPrice": "Lav noteringspris", - "nft.marketplace.royalty.header": "{{marketName}} avgifter", - "nft.maxFees": "Maks gebyrer", - "nft.maxRoyalties": "Maks royalties for skaperen", - "nft.noItems": "Ingen elementer å vise", - "nft.noneAtAddress": "Det finnes ingen innsamlingsmidler på denne adressen", - "nft.noPools": "Ingen bassenger ennå", - "nft.notListed": "Ikke listet", - "nft.proceedsIfSold": "Inntekter ved salg", - "nft.profile.priceInput.warning.alreadyListed": "Allerede oppført på {{tokenAmountWithSymbol}}", - "nft.profile.priceInput.warning.belowFloor": "{{percentage}} under gulvpris.", - "nft.refundsInEth": "Refusjon for ikke-tilgjengelige varer vil bli gitt i ETH", - "nft.removeFromBag": "Fjern fra posen", - "nft.reportSpam": "Rapporter som spam", - "nft.returnToExplore": "Gå tilbake til NFT Explore", - "nft.returnToMy": "Gå tilbake til Mine NFT-er", - "nft.setPrices": "Angi priser for å fortsette", - "nft.startListing": "Start oppføringen", - "nft.successListed": "Vellykket oppført", - "nft.sweep": "Feie", - "nft.unavailableToList": "Ikke tilgjengelig for oppføring", - "nft.whyTransaction": "Hvorfor kreves en transaksjon?", - "nft.whyTransaction.reason": "Oppføring av en NFT krever en engangsgodkjenning fra markedsplassen for hver NFT-samling.", - "nft.willAppearHere": "Dine onchain-transaksjoner og kryptokjøp vil vises her.", - "nft.wishGranted": "Uniswap har oppfylt ønsket ditt!", - "nfts.collection.action.approve_one": "Godkjenne innsamling", - "nfts.collection.action.approve_other": "Godkjenne samlinger", - "nfts.collection.action.sign_one": "Signer oppføring", - "nfts.collection.action.sign_other": "Signer oppføringer", - "nfts.marketplace.fees.deltaMax": "{{percentChanged}} maks", - "nfts.my": "Mine NFT-er", - "nfts.noneYet": "Ingen NFT-er ennå", - "nfts.sell": "Selg NFT-er", - "nfts.viewAndSell": "Se og selg NFT-er", - "notFound.oops": "Oops, ta meg tilbake til Swap", - "notice.uk": "Denne nettapplikasjonen er gitt som et verktøy for brukere til å samhandle med Uniswap-protokollen på eget initiativ, uten godkjenning eller anbefaling av kryptovaluta-handelsaktiviteter. Ved å gjøre dette anbefaler ikke Uniswap at brukere eller potensielle brukere engasjerer seg i handel med kryptoaktiva, og brukere eller potensielle brukere av nettapplikasjonen bør ikke betrakte denne nettsiden eller dens innhold som involverer noen form for anbefaling, invitasjon eller oppfordring til å handle med kryptoaktiva. .", - "notice.uk.label": "UK ansvarsfraskrivelse:", - "notification.assetVisibility.hidden": "{{assetName}} skjult", - "notification.assetVisibility.unhidden": "{{assetName}} skjult", - "notification.copied.address": "Adressen er kopiert", - "notification.copied.calldata": "Samtaledata er kopiert", - "notification.copied.contractAddress": "Kontraktsadresse kopiert", - "notification.copied.failed": "Kunne ikke kopiere til utklippstavlen", - "notification.copied.image": "Bilde kopiert", - "notification.copied.nftUrl": "NFT URL kopiert", - "notification.copied.tokenUrl": "Token URL kopiert", - "notification.copied.transactionId": "Transaksjons-ID kopiert", - "notification.copied.unitag": "Brukernavnet er kopiert", - "notification.countryChange": "Byttet til {{countryName}}", - "notification.network.changed": "Byttet til {{network}}", - "notification.passwordChanged": "passord endret", - "notification.restore.success": "Lommebok gjenopprettet!", - "notification.send.network": "Sender på {{network}}", - "notification.spam.NFT.successful": "Rapportert", - "notification.swap.network": "Bytter på {{network}}", - "notification.swap.pending.swap": "Bytte venter", - "notification.swap.pending.unwrap": "Utpakking venter", - "notification.swap.pending.wrap": "Innpakning venter", - "notification.transaction.approve.canceled": "Kansellert {{currencySymbol}} godkjenne.", - "notification.transaction.approve.fail": "Kunne ikke godkjenne {{currencySymbol}} for bruk med {{address}}.", - "notification.transaction.approve.success": "Godkjent {{currencySymbol}} for bruk med {{address}}.", - "notification.transaction.pending": "Transaksjonen venter", - "notification.transaction.swap.canceled": "Kansellert bytte mellom {{inputCurrencySymbol}}-{{outputCurrencySymbol}} .", - "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} for {{outputCurrencyAmountWithSymbol}} bytte utløp.", - "notification.transaction.swap.fail": "Kunne ikke bytte {{inputCurrencyAmountWithSymbol}} med {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.swap.success": "Byttet {{inputCurrencyAmountWithSymbol}} med {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.transfer.canceled": "Kansellert {{tokenNameOrAddress}} sending", - "notification.transaction.transfer.fail": "Kunne ikke sende {{tokenNameOrAddress}} til {{walletNameOrAddress}}", - "notification.transaction.transfer.received": "Mottok {{tokenNameOrAddress}} fra {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "Sendt {{tokenNameOrAddress}} til {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "Kunne ikke handle med {{addressOrEnsName}}", - "notification.transaction.unknown.fail.short": "Transaksjonen mislyktes", - "notification.transaction.unknown.success.full": "Transaksjoner med {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "Transaksjonen bekreftet", - "notification.transaction.unwrap.canceled": "Avbrutt {{inputCurrencySymbol}} utpakning.", - "notification.transaction.unwrap.fail": "Kunne ikke pakke ut {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.unwrap.success": "Pakket ut {{inputCurrencyAmountWithSymbol}} og mottok {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.canceled": "Kansellert {{inputCurrencySymbol}} innpakning.", - "notification.transaction.wrap.fail": "Kunne ikke pakke {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.success": "Pakket inn {{inputCurrencyAmountWithSymbol}} og mottok {{outputCurrencyAmountWithSymbol}}.", - "notification.transfer.pending": "Send venter", - "notification.walletConnect.confirmed": "Transaksjonen bekreftet med {{dappName}}", - "notification.walletConnect.connected": "Tilkoblet", - "notification.walletConnect.disconnected": "Koblet fra", - "notification.walletConnect.failed": "Transaksjonen mislyktes med {{dappName}}", - "notification.walletConnect.networkChanged.full": "Byttet til {{networkName}}", - "notification.walletConnect.networkChanged.short": "Byttet nettverk", - "notifications.scantastic.subtitle": "Fortsett på Uniswap Extension", - "notifications.scantastic.title": "Suksess!", - "onboarding.backup.manual.banner": "Vi foreslår å skrive dette på et stykke papir og oppbevare det på et sikkert sted, som en safe.", - "onboarding.backup.manual.displayWarning.description": "Les følgende nøye før du fortsetter.", - "onboarding.backup.manual.displayWarning.note.access": "Denne gjenopprettingsfrasen gir deg full tilgang til lommeboken og midlene", - "onboarding.backup.manual.displayWarning.note.secure": "Se dette privat og ikke del det med noen", - "onboarding.backup.manual.displayWarning.note.storage": "Skriv det ned og oppbevar det på et trygt sted", - "onboarding.backup.manual.displayWarning.title": "Noen viktige ting å vite", - "onboarding.backup.manual.error": "Ugyldig eller feilstavet ord", - "onboarding.backup.manual.placeholder": "Hemmelig ord", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} fullført", - "onboarding.backup.manual.selectedWordPlaceholder": "Velg ord", - "onboarding.backup.manual.subtitle_one": "Hva er det {{count}}første ordet i gjenopprettingsfrasen?", - "onboarding.backup.manual.subtitle_two": "Hva er det {{count}}andre ordet i gjenopprettingsfrasen?", - "onboarding.backup.manual.subtitle_few": "Hva er det {{count}}tredje ordet i gjenopprettingsfrasen?", - "onboarding.backup.manual.subtitle_other": "Hva er det {{count}}ordet i gjenopprettingsfrasen?", - "onboarding.backup.manual.title": "La oss sørge for at du har registrert det riktig", - "onboarding.backup.option.badge.quick": "Rask", - "onboarding.backup.option.cloud.description": "Sikkerhetskopier lommeboken din via {{cloudProviderName}}, beskyttet av et gjenopprettingspassord.", - "onboarding.backup.option.cloud.title": "Angi et gjenopprettingspassord", - "onboarding.backup.option.manual.description": "Ta opp dine 12 hemmelige ord på et stykke papir og oppbevar det på et trygt sted.", - "onboarding.backup.option.manual.title": "Skriv ned gjenopprettingsfrase", - "onboarding.backup.reminder.description": "Sikkerhetskopiering av lommeboken sikrer at du alltid kan gjenopprette eiendelene dine hvis du mister telefonen eller får en ny enhet.", - "onboarding.backup.reminder.title": "Det er på tide å sikkerhetskopiere lommeboken", - "onboarding.backup.reminder.warning.description": "Hvis du ikke konfigurerer en sikkerhetskopimetode, har du ikke mulighet til å gjenopprette lommeboken din hvis du mister telefonen, sletter appen eller får en ny enhet.", - "onboarding.backup.reminder.warning.title": "Du kan miste pengene dine", - "onboarding.backup.speedBump.cloud.description": "Hvis du noen gang glemmer det, kan vi ikke tilbakestille det for deg. Skriv det ned på et trygt sted eller oppbevar det trygt i en passordbehandling.", - "onboarding.backup.speedBump.cloud.disclaimer": "Jeg forstår at Uniswap Labs ikke kan tilbakestille gjenopprettingspassordet mitt.", - "onboarding.backup.speedBump.cloud.title": "Det er viktig å lagre dette passordet", - "onboarding.backup.speedBump.manual.description": "Sørg for at du skrev ned gjenopprettingsfrasen riktig og at du har et trygt sted å lagre den.", - "onboarding.backup.speedBump.manual.disclaimer": "Jeg forstår at Uniswap Labs ikke kan gjenopprette lommeboken min hvis jeg mister denne.", - "onboarding.backup.speedBump.manual.title": "Før du er ferdig...", - "onboarding.backup.subtitle": "Slik vil du gjenopprette lommeboken din hvis du sletter appen eller mister enheten.", - "onboarding.backup.title.existing": "Sikkerhetskopier lommeboken", - "onboarding.backup.title.new": "Velg sikkerhetskopieringsmetoden", - "onboarding.backup.view.disclaimer": "Jeg forstår at hvis jeg mister gjenopprettingsfrasen, kan ikke Uniswap Labs hjelpe meg med å gjenopprette den.", - "onboarding.backup.view.subtitle.message1": "Les følgende nøye før du fortsetter", - "onboarding.backup.view.subtitle.message2": "Du må skrive inn alle 12 av disse hemmelige ordene for å gjenopprette lommeboken din.", - "onboarding.backup.view.title": "Skriv ned restitusjonsfrasen din", - "onboarding.backup.view.warning.message1": "Denne gjenopprettingsfrasen gir deg full tilgang til lommeboken og midlene", - "onboarding.backup.view.warning.message2": "Skriv det ned og oppbevar det på et trygt sted", - "onboarding.backup.view.warning.message3": "Se dette privat og ikke del det med noen", - "onboarding.cloud.confirm.description": "Du må angi dette for å få tilbake pengene dine. Hvis du noen gang glemmer det, kan vi ikke hente det for deg.", - "onboarding.cloud.confirm.title": "Bekreft gjenopprettingspassordet ditt", - "onboarding.cloud.createPassword.description": "Du må angi dette for å få tilbake pengene dine. Hvis du noen gang glemmer det, kan vi ikke hente det for deg.", - "onboarding.cloud.createPassword.title": "Opprett gjenopprettingspassordet ditt", - "onboarding.complete.button": "Åpne Uniswap Extension", - "onboarding.complete.description": "Lommeboken din er klar til å sende og motta krypto. Åpne Uniswap Extension med snarveien nedenfor.", - "onboarding.complete.go_to_uniswap": "Gå til Uniswap Web App", - "onboarding.complete.pin.description": "Klikk på pin-ikonet for å legge til Uniswap Extension til verktøylinjen.", - "onboarding.complete.pin.title": "Pin Uniswap Extension", - "onboarding.complete.title": "Du er klar", - "onboarding.extension.password.subtitle": "Du trenger dette for å låse opp lommeboken og få tilgang til gjenopprettingsfrasen", - "onboarding.extension.password.title.default": "Lag passord", - "onboarding.extension.password.title.reset": "Tilbakestill passordet ditt", - "onboarding.extension.unsupported.android.description": "Uniswap Extension er bare kompatibel med Chrome på skrivebordet.", - "onboarding.extension.unsupported.android.title": "Chrome på mobil støttes ikke (ennå)", - "onboarding.extension.unsupported.description": "Uniswap Extension er bare kompatibel med Chrome akkurat nå.", - "onboarding.extension.unsupported.title": "Denne nettleseren støttes ikke (ennå)", - "onboarding.home.intro.backup.description": "Sett opp en gjenopprettingsplan hvis du noen gang mister telefonen eller får en ny.", - "onboarding.home.intro.backup.title": "Sikkerhetskopier lommeboken", - "onboarding.home.intro.bridging.description_one": "Flytt ETH, USDC og mer på tvers av {{count}}+ nettverk.", - "onboarding.home.intro.bridging.description_other": "Flytt ETH, USDC og mer på tvers av {{count}}+ nettverk.", - "onboarding.home.intro.fund.description": "Finansier lommeboken din ved å kjøpe krypto eller overføre fra en annen konto.", - "onboarding.home.intro.fund.title": "Få ditt første token", - "onboarding.home.intro.label.required": "Obligatorisk", - "onboarding.home.intro.label.swipe": "Sveip", - "onboarding.home.intro.unitag.description": "Bygg en personlig web3-profil og del enkelt adressen din med venner.", - "onboarding.home.intro.unitag.title": "Gjør krav på ditt {{unitagDomain}} brukernavn", - "onboarding.home.intro.welcome.description": "Fullfør konfigureringen av lommeboken for å begynne å bytte på sekunder.", - "onboarding.home.intro.welcome.title": "Velkommen til Uniswap", - "onboarding.import.error.invalidWords_one": "1 ord er ugyldig eller feilstavet", - "onboarding.import.error.invalidWords_other": "{{count}} ord er ugyldige eller feilstavet", - "onboarding.import.method.import.message": "Skriv inn gjenopprettingsfrasen fra en annen kryptolommebok", - "onboarding.import.method.import.title": "Importer en lommebok", - "onboarding.import.method.restore.message.android": "Legg til lommebøker du har sikkerhetskopiert til Google Disk-kontoen din", - "onboarding.import.method.restore.message.ios": "Legg til lommebøker du har sikkerhetskopiert til iCloud-kontoen din", - "onboarding.import.method.restore.title": "Gjenopprett en lommebok", - "onboarding.import.onDeviceRecovery.other_options": "Opprett eller importer en annen lommebok", - "onboarding.import.onDeviceRecovery.other_options.label": "Vil du ikke ha noe av det ovennevnte?", - "onboarding.import.onDeviceRecovery.subtitle": "Velg hvilken lommebok du vil logge på igjen.", - "onboarding.import.onDeviceRecovery.title": "Velkommen tilbake til Uniswap", - "onboarding.import.onDeviceRecovery.wallet.button": "Se gjenopprettingsfrase", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 annen lommebok", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} andre lommebøker", - "onboarding.import.onDeviceRecovery.warning.caption": "Sørg for at du har sikkerhetskopiert alle de andre lommebokene. Hvis du noen gang vil gjenopprette dem, trenger du gjenopprettingsfrasene deres eller tilsvarende {{cloudProvider}} sikkerhetskopier.", - "onboarding.import.onDeviceRecovery.warning.title": "Er du sikker?", - "onboarding.import.title": "Velg hvordan du vil legge til lommeboken", - "onboarding.importMnemonic.button.default": "Min gjenopprettingsfrase er på 12 ord", - "onboarding.importMnemonic.button.importing": "Importerer...", - "onboarding.importMnemonic.button.longPhrase": "Min restitusjonsfrase er lengre", - "onboarding.importMnemonic.error.invalidPhrase": "Uttrykket du skrev inn er ugyldig", - "onboarding.importMnemonic.subtitle": "Skriv eller lim inn gjenopprettingsfrasen på 12 ord", - "onboarding.importMnemonic.title": "Skriv inn gjenopprettingsfrasen", - "onboarding.intro.button.alreadyHave": "Jeg har allerede en lommebok", - "onboarding.intro.mobileScan.button": "Skann QR-kode for å importere", - "onboarding.intro.mobileScan.title": "Har du Uniswap-appen?", - "onboarding.landing.button.add": "Legg til en eksisterende lommebok", - "onboarding.landing.button.create": "Lag en lommebok", - "onboarding.name.wallet.button.text": "Fullfør", - "onboarding.name.wallet.subtitle": "Dette kallenavnet er kun synlig for deg", - "onboarding.name.wallet.title": "Gi lommeboken et navn", - "onboarding.notification.permission.message": "For å motta varsler, slå på varsler for Uniswap Wallet i enhetens innstillinger.", - "onboarding.notification.permission.title": "Tillatelse for varsler", - "onboarding.notification.subtitle": "Hold deg oppdatert på transaksjonsstatuser og store prisendringer for favoritt-tokens", - "onboarding.notification.title": "Slå på varsler", - "onboarding.passkey.account.protection": "Kontoen din er beskyttet av din egen sikre passordlagring.", - "onboarding.passkey.biometric.scan": "Telefon, nettbrett eller nettleser – bare skann biometrien din, så blir du logget på.", - "onboarding.passkey.create": "Opprett passordet ditt", - "onboarding.passkey.use.recovery.phrase": "Bruk en gjenopprettingsfrase i stedet", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "La oss bekrefte at du har rett. Hvis du mister eller skriver ned dette feil, vil du ikke kunne gjenopprette pengene dine.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "Hvis du mister eller skriver ned dette feil, vil du ikke kunne gjenopprette pengene dine.", - "onboarding.recoveryPhrase.confirm.title": "La oss bekrefte at du har rett", - "onboarding.recoveryPhrase.view.subtitle": "Du må skrive inn alle 12 av disse hemmelige ordene for å gjenopprette lommeboken din.", - "onboarding.recoveryPhrase.view.title": "Skriv ned restitusjonsfrasen din", - "onboarding.recoveryPhrase.view.title.hasPassword": "Hvis du noen gang glemmer passordet ditt...", - "onboarding.recoveryPhrase.warning.final.button": "jeg er klar", - "onboarding.recoveryPhrase.warning.final.message": "Gjenopprettingsfrasen din er det som gir deg (og alle som har det) tilgang til midlene dine. Sørg for å holde det for deg selv.", - "onboarding.recoveryPhrase.warning.final.title": "Gjør dette trinnet på et privat sted", - "onboarding.recoveryPhrase.warning.screenshot.message": "Alle som får tilgang til bildene dine kan få tilgang til lommeboken din. Vi anbefaler at du heller skriver ned ordene dine.", - "onboarding.recoveryPhrase.warning.screenshot.title": "Skjermbilder er ikke sikre", - "onboarding.resetPassword.complete.safety": "Lær mer om lommeboksikkerhet", - "onboarding.resetPassword.complete.subtitle": "Bruk ditt nye passord for å låse opp lommeboken.", - "onboarding.resetPassword.complete.title": "Reset passord", - "onboarding.scan.button": "Skann med Uniswap-appen", - "onboarding.scan.error": "Beklager, vi kan ikke laste inn QR-koden akkurat nå. Prøv en annen innføringsmetode.", - "onboarding.scan.otp.error": "Koden du sendte inn er feil, eller det oppsto en feil ved innsending. Vær så snill, prøv på nytt.", - "onboarding.scan.otp.failed": "Mislykkede forsøk: {{number}}", - "onboarding.scan.otp.subtitle": "Sjekk din Uniswap-mobilapp for koden på 6 tegn", - "onboarding.scan.otp.title": "Skriv inn engangskode", - "onboarding.scan.subtitle": "Skann QR-koden med Uniswap-mobilappen for å begynne å importere lommeboken.", - "onboarding.scan.title": "Importer lommebok fra appen", - "onboarding.scan.wifi": "Koble telefonen til det samme WiFi-nettverket som datamaskinen.", - "onboarding.security.alert.biometrics.message.android": "For å bruke biometri, konfigurer den først i innstillingene", - "onboarding.security.alert.biometrics.message.ios": "For å bruke {{biometricsMethod}}, gi tilgang i systeminnstillingene", - "onboarding.security.alert.biometrics.title.android": "Biometri er deaktivert", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} er deaktivert", - "onboarding.security.button.confirm.android": "Aktiver biometri", - "onboarding.security.button.confirm.ios": "Aktiver {{biometricsMethod}}", - "onboarding.security.button.setup": "Sett opp", - "onboarding.security.subtitle.android": "Legg til et ekstra lag med sikkerhet ved å kreve biometri for å sende transaksjoner.", - "onboarding.security.subtitle.ios": "Legg til et ekstra lag med sikkerhet ved å kreve {{biometricsMethod}} for å sende transaksjoner.", - "onboarding.security.title": "Beskytt lommeboken din", - "onboarding.selectWallets.error": "Kunne ikke laste inn adresser", - "onboarding.selectWallets.title.default": "Velg lommebøker å importere", - "onboarding.selectWallets.title.error": "Feil ved import av lommebøker", - "onboarding.termsOfService": "Ved å fortsette godtar jeg vilkårene for bruk og samtykker til personvernreglene", - "onboarding.tooltip.recoveryPhrase.trigger": "Hva er en gjenopprettingsfrase?", - "onboarding.wallet.continue": "La oss holde det trygt", - "onboarding.wallet.defaultName": "Lommebok {{number}}", - "onboarding.wallet.description.full": "Dette er din personlige plass for tokens, NFT-er og alle dine handler. Fullfør konfigureringen for å holde pengene dine trygge.", - "onboarding.wallet.title": "Velkommen til din nye lommebok", - "outageBanner.message": "{{chainName}} {{versionDescription}} data er utilgjengelig akkurat nå, men vi forventer at problemet blir løst snart.", - "outageBanner.message.sub": "Du kan fortsatt bytte og gi likviditet i denne kjeden uten problemer.", - "outageBanner.title": "{{versionName}} kommer snart tilbake", - "permit.approval.fail": "Tillatelsesgodkjenning mislyktes", - "permit.approval.fail.message": "Permit2 lar token-godkjenninger deles og administreres på tvers av forskjellige applikasjoner.", - "pool.activePositions.appear": "Dine aktive V3-likviditetsposisjoner vil vises her.", - "pool.activeRange": "Aktivt flåttområde", - "pool.addAs": "Legg til som {{nativeWrappedSymbol}}", - "pool.addLiquidity.seoTitle": "Legg til likviditet til {{tokenPair}} ({{chain}}) på Uniswap", - "pool.addMoreLiquidity": "Legg til mer likviditet", - "pool.apr": "APR", - "pool.apr.description": "Annualisert basert på 1 dags avgifter", - "pool.areCreating": "Du lager et basseng", - "pool.areFirst": "Du er den første likviditetstilbyderen.", - "pool.back": "Tilbake til bassenget", - "pool.balances": "Pool saldo", - "pool.closedCTA.description": "Du kan se dem ved å bruke filteret øverst på siden.", - "pool.closedCTA.title": "Ser du etter dine lukkede stillinger?", - "pool.collectAs": "Samle som {{nativeWrappedSymbol}}", - "pool.collected": " Samlet", - "pool.collectFees": "Samle gebyrer", - "pool.collecting": "Samler", - "pool.collectingFeesWithdraw": "Innkreving av avgifter vil trekke tilbake avgifter som er tilgjengelige for deg.", - "pool.confirmSupply": "Bekreft levering", - "pool.connection.networkUnsupported": "Det tilkoblede nettverket ditt støttes ikke.", - "pool.create": "Skaper nytt basseng", - "pool.create.info": "Valgene dine vil skape en ny likviditetspool som kan resultere i lavere initial likviditet og økt volatilitet. Vurder å legge til et eksisterende basseng for å minimere disse risikoene.", - "pool.create.pair": "Lag et par", - "pool.createAndSupply": "Lag basseng og forsyning", - "pool.createdPosition": "Opprettet stilling", - "pool.createdPosition.cancelled": "Opprett stilling kansellert", - "pool.createdPosition.failed": "Oppretting av posisjon mislyktes", - "pool.depositAmounts": "Innskuddsbeløp", - "pool.earnFees": "Ved å legge til likviditet vil du tjene 0,3 % av alle handler på dette paret proporsjonalt med din andel av poolen. Gebyrer legges til bassenget, påløper i sanntid og kan kreves ved å ta ut likviditeten din.", - "pool.estimatePercentToRevert": "Utgang er estimert. Hvis prisen endres med mer enn {{allowed}}% vil transaksjonen din gå tilbake.", - "pool.explorers": "Utforskere", - "pool.exporeAnalytics": "Utforsk Uniswap Analytics.", - "pool.hideClosed": "Skjul lukkede posisjoner", - "pool.import": "Import basseng", - "pool.import.link.description": "Noen v2-posisjoner vises ikke automatisk.", - "pool.import.positions.v2": "Importer V2-posisjoner", - "pool.import.positions.v2.selectPair.description": "Noen v2-posisjoner vises ikke automatisk. Velg et token-par for å importere og se posisjonene dine.", - "pool.import.success": "Pool importert", - "pool.increaseLiquidity": "Øk likviditeten", - "pool.info": "Bassenginformasjon", - "pool.initialShare": "Startpriser og poolandel", - "pool.learn": "Lære", - "pool.learnAbout": "Les mer om å skaffe likviditet", - "pool.learnLiquidity": "Lær om å skaffe likviditet", - "pool.learnv3LP": "Sjekk ut våre v3 LP-gjennomganger og migreringsveiledninger.", - "pool.limitFluctuation.warning": "Vær oppmerksom på at utførelse av grenser kan variere basert på sanntidssvingninger i markedet og overbelastning av Ethereum-nettverket. Grenser vil kanskje ikke utføres nøyaktig når tokens når den angitte prisen.", - "pool.liquidity.connectToAdd": "Koble til en lommebok for å se likviditeten din.", - "pool.liquidity.data.error.message": "Det oppsto en feil under henting av data som kreves for transaksjonen din.", - "pool.liquidity.earn.fee": "Likviditetstilbydere tjener et gebyr på 0,3 % på alle handler proporsjonalt med deres andel av poolen. Gebyrer legges til bassenget, påløper i sanntid og kan kreves ved å ta ut likviditeten din.", - "pool.liquidity.outOfSync": "Pool og markedspris uoverensstemmelse", - "pool.liquidity.outOfSync.message": "Prisene i denne poolen avviker med markedsprisene på de valgte tokens. Juster prisklassen din tilsvarende eller vent til bassenget balanserer seg på nytt for å unngå tap.", - "pool.liquidity.ownershipWarning.message": "Du er ikke eieren av denne LP-stillingen. Du vil ikke kunne ta ut likviditeten fra denne posisjonen med mindre du eier følgende adresse: {{ownerAddress}}", - "pool.liquidity.rewards": "Likviditetsleverandørens belønninger", - "pool.liquidity.taxWarning": "Symbolskatter", - "pool.liquidity.taxWarning.message": "En eller flere av disse tokens har skatter på overføringer. Å legge til likviditet med V3 kan føre til tap av midler. Prøv å bruke V2 i stedet.", - "pool.liquidityPoolFeesNotice": "Når du legger til likviditet, vil du motta pool-tokens som representerer din posisjon. Disse tokenene tjener automatisk avgifter proporsjonalt med din andel av bassenget, og kan løses inn når som helst.", - "pool.manageRewardsLiquidity": "Administrer likviditet i belønningspoolen", - "pool.max.label": "Maks:", - "pool.maxPrice": "Maks pris", - "pool.migrateLiquidity": "Migrer likviditet", - "pool.migrateLiquidityDisabledTooltip": "Denne kjeden støtter ikke v4 likviditetspooler.", - "pool.migrateToV4": "Migrer til v4", - "pool.min.label": "Min:", - "pool.minPrice": "Min pris", - "pool.mustBeInitialized": "Denne poolen må initialiseres før du kan legge til likviditet. For å initialisere, velg en startpris for bassenget. Angi deretter likviditetsprisområdet og innskuddsbeløpet. Gassavgiftene vil være høyere enn vanlig på grunn av initialiseringstransaksjonen.", - "pool.newPosition.plus": "+ Ny stilling", - "pool.newPosition.title": "Ny stilling", - "pool.newSpecificPosition": "Ny {{symbol}} stilling", - "pool.noLiquidity": "Ingen likviditet funnet.", - "pool.onceHappyReview": "Når du er fornøyd med prisen, klikker du på forsyningen for å vurdere.", - "pool.openPosition": "Åpne en bassengposisjon", - "pool.openPosition.cta": "Legg til likviditet i en pool og se posisjonene dine her", - "pool.openToStart": "Åpne en ny stilling eller opprett en pool for å komme i gang.", - "pool.owner": "Eieren", - "pool.percent": "{{pct}}% pool", - "pool.pooled": "Samlet {{sym}}:", - "pool.position": "Posisjon", - "pool.position.100": "Din posisjon vil være 100 % til denne prisen.", - "pool.position.100.at": "Posisjonen din vil være 100 % {{symbol}} til denne prisen.", - "pool.position.networkConnect": "For å se en posisjon må du være koblet til nettverket den tilhører.", - "pool.position.willBe100": "Posisjonen din vil være 100 % sammensatt av {{sym}} til denne prisen", - "pool.positions": "Stillinger", - "pool.positions.title": "Dine posisjoner", - "pool.positions.transaction.settings": "Transaksjonsinnstillinger", - "pool.positions.usdValueUnavailable": "USD-verdi ikke tilgjengelig", - "pool.positions.usdValueUnavailable.tooltip": "USD-verdi er for øyeblikket utilgjengelig for denne stillingen. Se posisjonsdetaljer for innsatte tokenbeløp.", - "pool.priceRange": "Prisklasse", - "pool.rangeBadge.tooltip.outsideRange": "Prisen på dette bassenget er utenfor det valgte området. Stillingen din tjener for øyeblikket ikke gebyrer.", - "pool.rangeBadge.tooltip.text": "Posisjonen din har 0 likviditet og tjener ikke gebyrer.", - "pool.rangeBadge.tooltip.withinRange": "Prisen på dette bassenget er innenfor det valgte området. Stillingen din tjener for øyeblikket avgifter.", - "pool.rates": "Priser", - "pool.ratioTokenToPrice": "Forholdet mellom tokens du legger til vil sette prisen på denne poolen.", - "pool.refresh.prices": "Oppdater prisene", - "pool.removeLiquidity": "Fjern likviditet", - "pool.rewardsPool.label": "Pool tokens i belønningspoolen:", - "pool.selectedRange": "Valgt område", - "pool.selectPair": "Velg par", - "pool.share": "Priser og pool andel", - "pool.share.label": "Poolandelen din:", - "pool.shareOf": "Andel av bassenget:", - "pool.showClosed": "Vis lukkede stillinger", - "pool.specificPosition": "{{symbol}} posisjon", - "pool.startingPrice": "Fra {{sym}} Pris:", - "pool.supply": "Forsyning", - "pool.supplyingMaths": "Leverer {{amtA}} {{symA}} og {{amtB}} {{symB}}", - "pool.tokenPair": "Token-par", - "pool.top": "Topp bassenger", - "pool.top.tvl": "Topp bassenger av TVL", - "pool.totalTokens": "Dine totale pool-tokens:", - "pool.uncollectedFees": "Uinnkrevde gebyrer", - "pool.v2": "v2 bassenger", - "pool.v2.add": "Legg til V2-likviditet", - "pool.v2.migratev3": "Migrer likviditet til V3", - "pool.v2liquidity": "V2 likviditet", - "pool.v3": "v3 bassenger", - "pool.v4": "v4 bassenger", - "pool.viewUncollectedFees": "Se uinnkrevde avgifter og analyser", - "pool.volOverTvl": "1D vol/TVL", - "pool.volume.thirtyDay": "30 dagers volum", - "pool.volume.thirtyDay.short": "30D vol", - "pool.withdrawAs": "Trekk tilbake som {{nativeWrappedSymbol}}", - "pool.yourv2": "Din V2-likviditet", - "poolFinder.availablePools": "Tilgjengelige bassenger", - "poolFinder.availablePools.found.description": "v2-puljer som matcher parvalget ditt.", - "poolFinder.availablePools.notFound.description": "Ingen samsvarende v2-pooler funnet. Dobbeltsjekk tokenvalget ditt og sørg for at du er koblet til riktig lommebok.", - "pools.approving.amount": "Godkjenner {{amount}}", - "pools.explore": "Utforsk bassenger", - "position.addHook": "Legg til en krok", - "position.addHook.tooltip": "Hooks er en avansert funksjon som lar bassenger samhandle med smarte kontrakter, og låser opp ulike funksjoner. Vær forsiktig når du legger til kroker, siden noen kan være skadelige eller forårsake utilsiktede konsekvenser.", - "position.addingHook": "Legge til krok", - "position.addingHook.disclaimer": "Å legge til kroker kan ha utilsiktede konsekvenser. Gjør din forskning og fortsett på egen risiko.", - "position.addingHook.hideProperties": "Skjul egenskaper", - "position.addingHook.invalidAddress": "Skriv inn en gyldig hook-adresse", - "position.addingHook.viewProperties": "Se eiendommer", - "position.appearHere": "Posisjonen din vil vises her.", - "position.create.invalidPrice": "Ugyldig pris", - "position.create.invalidRange": "Ugyldig område", - "position.create.modal.header": "Skaper posisjon", - "position.currentValue": "Nåværende posisjonsverdi", - "position.deposit.description": "Spesifiser symbolbeløpene for likviditetsbidraget ditt.", - "position.depositedCurrency": "Deponert {{currencySymbol}}", - "position.hook.disclaimer": "Jeg forstår de potensielle risikoene ved å legge til denne kroken.", - "position.hook.donateWarning": "Dette flagget kan føre til endringer i opptjente gebyrer.", - "position.hook.liquidityWarning": "Dette flagget kan føre til at bassenget blokkerer tilførsel av ny likviditet. Transaksjonen din kan gå tilbake.", - "position.hook.removeWarning": "Kan føre til at midlene dine blir låst eller blokkere deg fra å kreve inn gebyrer.", - "position.hook.swapWarning": "Dette flagget kan tillate likviditetsleverandører å lettere utnytte Just-In-Time-likviditet, noe som kan resultere i lavere opptjente gebyrer.", - "position.hook.warningHeader": "Viktig: krokrisiko identifisert", - "position.hook.warningInfo": "Vi har identifisert potensielle risikoer med denne kroken. Sørg for at du forstår hvordan denne kroken fungerer før du bestemmer deg for å fortsette.", - "position.initialPrice": "Startpris", - "position.initialPrice.info": "Angi startkursen mellom de to tokenene du gir.", - "position.migrate.liquidity": "Når du migrerer posisjoner, kan du ikke endre token-paret ditt, men du kan legge til en krok for å forbedre funksjonaliteten.", - "position.migrate.v4unsupportedChain": "Denne kjeden støttes ikke for v4-pooler.", - "position.new": "Ny stilling", - "position.new.protocol": "Ny {{protocol}} stilling", - "position.noLiquidity": "Likviditetsdata ikke tilgjengelig.", - "position.noLiquidityData": "Det er ingen likviditetsdata.", - "position.notFound": "Posisjon ikke funnet", - "position.notFound.description": "Detaljer om denne stillingen er ikke tilgjengelig. Kontroller at du er koblet til riktig lommebok.", - "position.protocol": "{{protocol}} posisjon", - "position.provide.liquidity": "Velg tokens du vil gi likviditet til. Du kan velge tokens på alle støttede nettverk.", - "position.provide.liquidityDescription": "Å tilby likviditet i hele spekteret sikrer kontinuerlig markedsdeltakelse på tvers av alle mulige priser, og tilbyr enkelhet, men med potensial for høyere permanent tap.", - "position.provide.liquidityDescription.custom": "Egendefinert rekkevidde lar deg konsentrere likviditeten din innenfor spesifikke prisgrenser, noe som øker kapitaleffektiviteten og gebyrinntektene, men krever mer aktiv styring.", - "position.removeHook": "Fjern kroken", - "position.resetDescription": "Dine tokens, pris og utvalg vil bli tilbakestilt.", - "position.setRange": "Angi prisklasse", - "position.setRange.inputsBelow": "Bruk inngangene nedenfor for å angi rekkevidden.", - "position.step.deposit": "Angi innskuddsbeløp", - "position.step.price": "Angi startpris", - "position.step.range": "Angi prisklasse", - "position.step.select": "Velg token-par og avgifter", - "position.value": "Posisjonsverdi", - "position.valueUnavailable": "USD-verdi er for øyeblikket utilgjengelig for denne stillingen. Se posisjonsdetaljer for innsatte tokenbeløp.", - "position.your": "Din posisjon", - "positions.welcome": "Velkommen til dine stillinger", - "positions.welcome.connect": "Koble til lommeboken for å se dine nåværende posisjoner.", - "privacy.anonymizedLogs": "Appen logger anonymisert bruksstatistikk for å forbedre seg over tid.", - "privacy.autoRouter": "Appen henter den optimale handelsruten fra en Uniswap Labs-server.", - "privacy.infura": "Appen henter kjededata og konstruerer kontraktanrop med et Infura API.", - "privacy.thirdPartyApis": "Denne appen bruker følgende tredjeparts APIer:", - "privacy.trm": "Appen samler sikkert lommebokadressen din og deler den med TRM Labs Inc. av risiko- og samsvarsgrunner.", - "privacy.uniswaptos": "Uniswap Labs sine vilkår for bruk", - "qrScanner.button.connections_one": "1 app tilkoblet", - "qrScanner.button.connections_other": "{{count}} apper tilkoblet", - "qrScanner.error.camera.message": "For å skanne en kode, gi kameratilgang i systeminnstillingene", - "qrScanner.error.camera.title": "Kameraet er deaktivert", - "qrScanner.error.none": "Finner ingen QR-kode", - "qrScanner.recipient.action.scan": "Skann en QR-kode", - "qrScanner.recipient.action.show": "Vis QR-koden min", - "qrScanner.recipient.error.message": "Sørg for at du skanner en gyldig QR-kode for Ethereum-adresse før du prøver igjen.", - "qrScanner.recipient.error.title": "Ugyldig QR-kode", - "qrScanner.request.message.unavailable": "Ingen melding funnet.", - "qrScanner.request.method.default": "Forespørsel fra {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "Signaturforespørsel fra {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "Transaksjonsforespørsel fra {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "La {{dappName}} bruke opptil {{amount}} {{currencySymbol}}?", - "qrScanner.request.withoutAmount": "Tillat {{dappName}} å bruke din {{currencySymbol}}?", - "qrScanner.status.connecting": "Kobler til...", - "qrScanner.status.loading": "Laster inn...", - "qrScanner.title": "Skann en QR-kode", - "qrScanner.wallet.networks": "Støttede nettverk", - "qrScanner.wallet.title": "Du kan sende og motta tokens og NFT-er på alle våre {{numOfNetworks}} -støttede nettverk.", - "range.outOfView": "Rekkevidde ute av syne", - "removeLiquidity.collectFees": "Du vil også kreve inn avgifter opptjent fra denne stillingen.", - "removeLiquidity.outputEstimated": "Utgang er estimert. Hvis prisen endres med mer enn {{allowed}}% vil transaksjonen din gå tilbake.", - "removeLiquidity.pendingText": "Fjerner {{amtA}} {{symA}} og {{amtB}} {{symB}}", - "removeLiquidity.pooled": "Samlet {{symbol}}:", - "removeLiquidity.removing": "Fjerner {{amt1}} {{symbol1}} og {{amt2}} {{symbol2}}", - "removeLiquidity.removingTokensTip": "Tips: Hvis du fjerner pool-tokens, konverteres posisjonen din tilbake til underliggende tokens med gjeldende kurs, proporsjonal med din andel av poolen. Uinnkrevde gebyrer er inkludert i beløpene du mottar.", - "removeLiquidity.uniBurned": "UNI {{a}}/{{b}} Brent", - "revoke.failed.message": "Dette gir Uniswap-protokollen tilgang til tokenet ditt for handel.", - "routing.aggregateLiquidity": "Når tilgjengelig, samler likviditetskilder for bedre priser og gassfrie bytteavtaler.", - "routing.cheapest": "Uniswap-klienten velger det billigste alternativet med hensyn til pris og nettverkskostnader.", - "routing.cheapest.v4": "Uniswap-klienten velger det optimale handelsalternativet med tanke på pris og nettverkskostnader.", - "scantastic.code.expired": "Utløpt", - "scantastic.code.subtitle": "Skriv inn denne koden i Uniswap-utvidelsen. Gjenopprettingsfrasen din blir trygt kryptert og overført.", - "scantastic.code.timeRemaining.shorthand.hours": "Ny kode i {{hours}}h {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.minutes": "Ny kode i {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.seconds": "Ny kode i {{seconds}}s", - "scantastic.code.title": "Uniswap engangskode", - "scantastic.confirmation.button.continue": "Ja, fortsett", - "scantastic.confirmation.label.browser": "Nettleser", - "scantastic.confirmation.label.device": "Enhet", - "scantastic.confirmation.subtitle": "Fortsett bare hvis du skanner en QR-kode fra Uniswap Extension på en pålitelig enhet.", - "scantastic.confirmation.title": "Prøver du å importere lommeboken din?", - "scantastic.confirmation.warning": "Vær oppmerksom på nettsteder og apper som utgir seg for å være Uniswap. Ellers kan lommeboken din bli kompromittert.", - "scantastic.error.encryption": "Kunne ikke forberede frøsetningen.", - "scantastic.error.noCode": "Ingen OTP mottatt. Vær så snill, prøv på nytt.", - "scantastic.error.timeout.message": "Skann QR-koden på Uniswap-utvidelsen igjen for å fortsette å synkronisere lommeboken.", - "scantastic.error.timeout.title": "Tilkoblingen din ble tidsavbrutt", - "scantastic.modal.ipMismatch.description": "For å skanne denne QR-koden, må telefonen være koblet til det samme WiFi-nettverket som datamaskinen din, og eventuelle VPN-er bør være midlertidig slått av.", - "scantastic.modal.ipMismatch.title": "Bytt WiFi-nettverk", - "search.chainComing": "Kommer snart: søk og utforsk tokens på {{chainName}} Chain", - "search.results.count_one": "1 vare", - "search.results.count_other": "{{count}} elementer", - "search.ukDisclaimer": "Ansvarsfraskrivelse for innbyggere i Storbritannia", - "send.button.review": "Gjennomgå overføringen", - "send.gas.error.title": "N/A", - "send.gas.networkCost.title": "Nettverkskostnad", - "send.input.token.balance.title": "Saldo: {{balance}} {{symbol}}", - "send.recipient.header": "Velg mottaker", - "send.recipient.input.placeholder": "Søk på ENS eller adresse", - "send.recipient.previous_one": "1 tidligere overføring", - "send.recipient.previous_other": "{{count}} tidligere overføringer", - "send.recipient.results.empty": "Ingen resultater", - "send.recipient.results.error": "Adressen du skrev inn eksisterer enten ikke eller er stavet feil.", - "send.recipient.section.favorite": "Favoritt lommebøker", - "send.recipient.section.recent": "Nylig", - "send.recipient.section.search": "Søkeresultater", - "send.recipient.section.viewOnly": "Se-bare lommebøker", - "send.recipient.section.yours": "Dine lommebøker", - "send.recipient.warning.viewOnly.message": "Send kun penger til denne lommeboken hvis du har gjenopprettingsfrasen eller kjenner eieren av lommeboken.", - "send.recipient.warning.viewOnly.title": "Du har denne som en lommebok for visning", - "send.recipientSelect.search.empty.message": "Når du sender tokens til en lommebokadresse, vises de her", - "send.recipientSelect.search.empty.title": "Ingen lommebøker lagret", - "send.review.modal.title": "Du sender", - "send.review.summary.button.title": "Bekreft sending", - "send.search.empty.subtitle": "Adressen du skrev inn eksisterer enten ikke eller er stavet feil.", - "send.search.empty.title": "Ingen resultater", - "send.search.placeholder": "Søk på ENS eller adresse", - "send.title": "Sende", - "send.warning.blocked.default": "Denne lommeboken er blokkert", - "send.warning.blocked.modal.message": "Denne adressen er blokkert på Uniswap Wallet fordi den er knyttet til én eller flere blokkerte aktiviteter. Hvis du mener dette er en feil, vennligst send en e-post til compliance@uniswap.org.", - "send.warning.blocked.modal.title": "Blokkert adresse", - "send.warning.blocked.recipient": "Mottakers lommebok er blokkert", - "send.warning.erc20.message": "Du prøver å sende penger til en token-adresse. Sending av krypto til denne typen adresse kan føre til permanent tap av midler.", - "send.warning.erc20.title": "Dette er en symbolsk adresse", - "send.warning.insufficientFunds.message": "Saldoen på {{currencySymbol}} har gått ned siden du skrev inn beløpet du vil sende", - "send.warning.insufficientFunds.title": "Ikke nok {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "Ikke nok {{currencySymbol}} på {{networkName}} til å sende", - "send.warning.insufficientGas.message.withoutNetwork": "Ikke nok {{currencySymbol}} til å sende", - "send.warning.modal.button.cta.blocking": "OK", - "send.warning.modal.button.cta.cancel": "Avbryt", - "send.warning.modal.button.cta.confirm": "Bekrefte", - "send.warning.newAddress.details.ENS": "ENS", - "send.warning.newAddress.details.username": "Brukernavn", - "send.warning.newAddress.details.walletAddress": "Lommebokadresse", - "send.warning.newAddress.message": "Du har ikke handlet med denne adressen før. Vennligst bekreft at adressen er riktig før du fortsetter.", - "send.warning.newAddress.title": "Ny adresse", - "send.warning.restore": "Gjenopprett lommeboken for å sende", - "send.warning.self.message": "Du prøver å sende penger til din nåværende lommebok. Å sende krypto til denne adressen vil medføre unødvendige nettverkskostnader.", - "send.warning.self.title": "Dette er din nåværende lommebok", - "send.warning.smartContract.message": "Du er i ferd med å sende tokens til en spesiell type adresse – en smart kontrakt. Dobbeltsjekk at det er adressen du hadde tenkt å sende til. Hvis det er feil, kan tokens dine gå tapt for alltid.", - "send.warning.smartContract.title": "Er dette en lommebokadresse?", - "send.warning.viewOnly.message": "Du må importere denne lommeboken via gjenopprettingsfrasen for å sende eiendeler.", - "send.warning.viewOnly.title": "Denne lommeboken er visningsbeskyttet", - "sendRecipientForm.recentAddresses.label": "Nylig", - "sendReviewModal.title": "Send anmeldelse", - "setting.recoveryPhrase.account.show": "Vis gjenopprettingsfrase", - "setting.recoveryPhrase.action.hide": "Skjul gjenopprettingsfrase", - "setting.recoveryPhrase.remove": "Fjern gjenopprettingsfrase", - "setting.recoveryPhrase.remove.confirm.subtitle": "Jeg forstår at Uniswap Labs ikke kan hjelpe meg med å gjenopprette lommeboken min hvis jeg ikke klarte å gjøre det.", - "setting.recoveryPhrase.remove.confirm.title": "Jeg lagret min gjenopprettingsfrase", - "setting.recoveryPhrase.remove.initial.subtitle": "Sørg for at du har lagret gjenopprettingsfrasen. Ellers mister du tilgangen til lommeboken", - "setting.recoveryPhrase.remove.initial.title": "Før du fortsetter", - "setting.recoveryPhrase.remove.password.error": "Feil passord. Prøv igjen", - "setting.recoveryPhrase.remove.subtitle": "Skriv inn passordet ditt for å bekrefte", - "setting.recoveryPhrase.remove.title": "Du fjerner gjenopprettingsfrasen", - "setting.recoveryPhrase.title": "Din gjenopprettingsfrase", - "setting.recoveryPhrase.view.warning.message1": "Alle som kjenner gjenopprettingsfrasen din kan få tilgang til lommeboken og pengene dine", - "setting.recoveryPhrase.view.warning.message2": "Se dette privat", - "setting.recoveryPhrase.view.warning.message3": "Ikke del med noen", - "setting.recoveryPhrase.view.warning.message4": "Skriv den aldri inn på noen nettsteder eller applikasjoner", - "setting.recoveryPhrase.view.warning.title": "Før du fortsetter", - "setting.recoveryPhrase.warning.screenshot.message": "Alle som får tilgang til bildene dine kan få tilgang til lommeboken din. Vi anbefaler at du heller skriver ned ordene dine.", - "setting.recoveryPhrase.warning.screenshot.title": "Skjermbilder er ikke sikre", - "setting.recoveryPhrase.warning.view.message": "Alle som kjenner gjenopprettingsfrasen din kan få tilgang til lommeboken og pengene dine.", - "setting.recoveryPhrase.warning.view.title": "Se dette på et privat sted", - "settings.action.enableInSettings": "Aktiver i Innstillinger", - "settings.action.feedback": "Del tilbakemelding", - "settings.action.help": "Få hjelp", - "settings.action.lock": "Lås lommebok", - "settings.action.privacy": "Personvernerklæring", - "settings.action.terms": "Vilkår for bruk", - "settings.footer": "Laget med kjærlighet, \nUniswap Team 🦄", - "settings.hideSmallBalances": "Skjul små saldoer", - "settings.maxSlippage": "Maks. utglidning", - "settings.screen.appearance.title": "Utseende", - "settings.section.about": "Om", - "settings.section.preferences": "Preferanser", - "settings.section.security": "Sikkerhet", - "settings.section.support": "Brukerstøtte", - "settings.section.wallet.button.viewAll": "Se alt", - "settings.section.wallet.button.viewLess": "Se mindre", - "settings.section.wallet.label.viewOnly": "Bare visning", - "settings.section.wallet.title": "Lommebokinnstillinger", - "settings.setting.appearance.option.auto": "Auto", - "settings.setting.appearance.option.dark.subtitle": "Bruk alltid mørk modus", - "settings.setting.appearance.option.dark.title": "Mørk modus", - "settings.setting.appearance.option.device.subtitle": "Standard til enhetens utseende", - "settings.setting.appearance.option.device.title": "Enhetsinnstillinger", - "settings.setting.appearance.option.light.subtitle": "Bruk alltid lysmodus", - "settings.setting.appearance.option.light.title": "Lysmodus", - "settings.setting.appearance.title": "Utseende", - "settings.setting.backup.create.description": "Å angi et passord vil kryptere sikkerhetskopieringen av gjenopprettingsfrasen, og legge til et ekstra beskyttelsesnivå hvis {{cloudProviderName}} -kontoen din noen gang blir kompromittert.", - "settings.setting.backup.create.title": "Sikkerhetskopier til {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "Fordi disse lommebøkene deler en gjenopprettingsfrase, vil den også slette sikkerhetskopiene for disse lommebøkene nedenfor", - "settings.setting.backup.delete.confirm.title": "Er du sikker?", - "settings.setting.backup.delete.warning": "Hvis du sletter {{cloudProviderName}} -sikkerhetskopien, vil du bare kunne gjenopprette lommeboken din med en manuell sikkerhetskopi av gjenopprettingsfrasen. Uniswap Labs kan ikke gjenopprette eiendelene dine hvis du mister gjenopprettingsfrasen.", - "settings.setting.backup.error.message.full": "Kan ikke sikkerhetskopiere gjenopprettingsfrasen til {{cloudProviderName}}. Sørg for at du har {{cloudProviderName}} aktivert med tilgjengelig lagringsplass, og prøv igjen.", - "settings.setting.backup.error.message.short": "Kan ikke slette sikkerhetskopien", - "settings.setting.backup.error.title": "{{cloudProviderName}} feil", - "settings.setting.backup.modal.description": "Du har ikke sikkerhetskopiert gjenopprettingsfrasen til {{cloudProviderName}} ennå. Ved å gjøre det kan du gjenopprette lommeboken din bare ved å være logget på {{cloudProviderName}} på hvilken som helst enhet.", - "settings.setting.backup.modal.title": "Sikkerhetskopiere gjenopprettingsfrasen til {{cloudProviderName}}?", - "settings.setting.backup.password.error.mismatch": "passordene er ikke like", - "settings.setting.backup.password.medium": "Dette er et middels passord", - "settings.setting.backup.password.placeholder.confirm": "Bekreft passord", - "settings.setting.backup.password.placeholder.create": "Lag passord", - "settings.setting.backup.password.strong": "Dette er et sterkt passord", - "settings.setting.backup.password.weak": "Dette er et svakt passord", - "settings.setting.backup.recoveryPhrase.label": "Gjenopprettingsfrase", - "settings.setting.backup.selected": "{{cloudProviderName}} sikkerhetskopiering", - "settings.setting.backup.status.action.delete": "Slett sikkerhetskopi", - "settings.setting.backup.status.complete": "Sikkerhetskopiert til {{cloudProviderName}}", - "settings.setting.backup.status.description": "Ved å sikkerhetskopiere gjenopprettingsfrasen til {{cloudProviderName}}, kan du gjenopprette lommeboken ved å være logget på {{cloudProviderName}} -kontoen din på en hvilken som helst enhet.", - "settings.setting.backup.status.inProgress": "Sikkerhetskopierer til {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "Støttet opp", - "settings.setting.backup.status.title": "{{cloudProviderName}} sikkerhetskopiering", - "settings.setting.beta.tooltip": "Kommer snart", - "settings.setting.biometrics.appAccess.subtitle.android": "Krev biometri for å åpne appen", - "settings.setting.biometrics.appAccess.subtitle.ios": "Krev {{biometricsMethod}} for å åpne appen", - "settings.setting.biometrics.appAccess.title": "App-tilgang", - "settings.setting.biometrics.auth": "Vennligst autentiser", - "settings.setting.biometrics.off.message.android": "Biometri er for øyeblikket slått av for Uniswap Wallet – du kan slå den på i systeminnstillingene.", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} er for øyeblikket slått av for Uniswap Wallet – du kan slå den på i systeminnstillingene.", - "settings.setting.biometrics.off.title.android": "Biometri er slått av", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} er slått av", - "settings.setting.biometrics.title": "Biometri", - "settings.setting.biometrics.transactions.subtitle.android": "Krev biometri for å handle", - "settings.setting.biometrics.transactions.subtitle.ios": "Krev {{biometricsMethod}} for å handle", - "settings.setting.biometrics.transactions.title": "Transaksjoner", - "settings.setting.biometrics.unavailable.message.android": "Biometri er ikke konfigurert på enheten din. For å bruke biometri, konfigurer den først i Innstillinger.", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} er ikke konfigurert på enheten din. For å bruke {{biometricsMethod}}, konfigurer den først i Innstillinger.", - "settings.setting.biometrics.unavailable.title.android": "Biometri er ikke satt opp", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} er ikke konfigurert", - "settings.setting.biometrics.warning.message.android": "Hvis du ikke slår på biometri, kan alle som får tilgang til enheten din åpne Uniswap Wallet og foreta transaksjoner.", - "settings.setting.biometrics.warning.message.ios": "Hvis du ikke slår på {{biometricsMethod}}, kan alle som får tilgang til enheten din åpne Uniswap Wallet og foreta transaksjoner.", - "settings.setting.biometrics.warning.title": "Er du sikker?", - "settings.setting.connections.disconnectAll": "Koble fra alle", - "settings.setting.connections.noConnectionsDescription": "Koble til en app ved å se etter en \"Koble til lommebok\" eller \"Logg inn\"-knapp.", - "settings.setting.currency.title": "Lokal valuta", - "settings.setting.hapticTouch.title": "Haptisk berøring", - "settings.setting.helpCenter.title": "Hjelpesenter", - "settings.setting.language.button.navigate": "Gå til Innstillinger", - "settings.setting.language.description.extension": "Uniswap standarder til systemspråkinnstillingene. For å endre foretrukket språk, gå til systeminnstillingene.", - "settings.setting.language.description.mobile": "Uniswap er standard til enhetens språkinnstillinger. For å endre ditt foretrukne språk, gå til \"Uniswap\" i enhetsinnstillingene og trykk på \"Språk\".", - "settings.setting.language.title": "Språk", - "settings.setting.notifications.row.activity.description": "Overføringer, forespørsler og annen aktivitet", - "settings.setting.notifications.row.activity.title": "Lommebokaktivitet", - "settings.setting.notifications.row.priceAlerts.description": "Store prisendringer for favoritt-tokens", - "settings.setting.notifications.row.priceAlerts.title": "Prisvarsler", - "settings.setting.notifications.row.updates.description": "Anbefalinger og nye funksjoner", - "settings.setting.notifications.row.updates.title": "Oppdateringer fra Uniswap", - "settings.setting.notifications.title": "Varsler", - "settings.setting.password.title": "Bytt passord", - "settings.setting.privacy.analytics.description": "Vi bruker anonyme bruksdata for å forbedre opplevelsen din på tvers av Uniswap Labs-produkter. Når den er deaktivert, sporer vi bare feil og viktig bruk.", - "settings.setting.privacy.analytics.title": "Tillat analyser", - "settings.setting.privacy.title": "Personvern", - "settings.setting.recoveryPhrase.password.title": "Skriv inn passordet ditt", - "settings.setting.recoveryPhrase.title": "Gjenopprettingsfrase", - "settings.setting.smallBalances.title": "Skjul små saldoer", - "settings.setting.unknownTokens.title": "Skjul ukjente tokens", - "settings.setting.wallet.action.editLabel": "Rediger etikett", - "settings.setting.wallet.action.editProfile": "Rediger profil", - "settings.setting.wallet.action.remove": "Fjern lommeboken", - "settings.setting.wallet.connections.title": "Tilkoblinger", - "settings.setting.wallet.editLabel.description": "Etiketter er ikke offentlige. De lagres lokalt og er kun synlige for deg.", - "settings.setting.wallet.editLabel.save": "Lagre endringer", - "settings.setting.wallet.label": "Kallenavn", - "settings.setting.wallet.testnetMode.description": "Dette slår på testnett for utviklere å prøve ut funksjoner og transaksjoner uten å bruke reelle eiendeler. Tokens på testnett har ingen reell verdi.", - "settings.setting.wallet.testnetMode.title": "Testnett-modus", - "settings.switchNetwork.warning": "For å bruke Uniswap på {{label}}, bytt nettverk i lommebokens innstillinger.", - "settings.title": "Innstillinger", - "settings.version": "Versjon {{appVersion}}", - "speedBump.newAddress.warning.description": "Du har ikke handlet med denne adressen før. Kontroller at det er riktig adresse før du fortsetter.", - "speedBump.newAddress.warning.title": "Ny adresse", - "speedBump.smartContractAddress.warning.description": "Du er i ferd med å sende tokens til en spesiell type adresse - en smart kontrakt. Dobbeltsjekk at det er adressen du hadde tenkt å sende til. Hvis det er feil, kan tokens dine gå tapt for alltid.", - "speedBump.smartContractAddress.warning.title": "Er dette en lommebokadresse?", - "stats.24fees": "24-timers avgifter", - "stats.24volume": "24H volum", - "stats.allTimeFees": "Alle tiders LP-avgifter", - "stats.allTimeSwappers": "All time swappers", - "stats.allTimeVolume": "Volum hele tiden", - "stats.fdv": "FDV", - "stats.fdv.description": "Fullt utvannet verdivurdering (FDV) beregner den totale markedsverdien forutsatt at alle tokens er i omløp.", - "stats.marketCap": "Markedsverdi", - "stats.marketCap.description": "Markedsverdi er den totale markedsverdien av en eiendels sirkulerende forsyning.", - "stats.tvl": "Totalverdi låst", - "stats.tvl.description": "Total verdi låst (TVL) er det samlede beløpet av eiendelen som er tilgjengelig på tvers av alle Uniswap v3 likviditetspooler.", - "stats.volume.1d": "1 dagers volum", - "stats.volume.1d.description": "1-dagers volum er mengden av eiendelen som har blitt handlet på Uniswap v3 i løpet av de siste 24 timene.", - "stats.volume.1d.short": "1D vol", - "stats.volume.description": "Volum er mengden av eiendelen som har blitt handlet på Uniswap v3 i løpet av den valgte tidsrammen.", - "swap.allow.oneTime": "Tillat {{sym}} (én gang)", - "swap.approvalNeeded": "En godkjenning er nødvendig for å bruke dette tokenet. ", - "swap.approvalPending": "Venter på godkjenning", - "swap.approveAndSubmit": "Godkjenne og sende inn", - "swap.approveAndSwap": "Godkjenn og bytt", - "swap.approveInWallet": "Godkjenne i lommeboken", - "swap.balance.amount": "Saldo: {{amount}}", - "swap.bestRoute.cost": "Den mest effektive ruten er beregnet til å koste ~{{gasPrice}} i nettverkskostnader. ", - "swap.details.estimatedTime": "Est. tid", - "swap.bridging.title": "Bytte på tvers av nettverk", - "swap.bridging.warning.description": "Du bytter fra {{fromNetwork}} til {{toNetwork}}. Dette er også kjent som \"bridging\", som flytter dine tokens fra ett nettverk til et annet.", - "swap.button.max": "Maks", - "swap.button.review": "Anmeldelse", - "swap.button.submitting": "Sender inn bytte...", - "swap.button.submitting.keep.open": "Hold lommeboken åpen...", - "swap.button.swap": "Bytte", - "swap.button.swapAnyways": "Bytt uansett", - "swap.button.unwrap": "Pakk ut", - "swap.button.wrap": "Pakke inn", - "swap.buy.countryModal.placeholder": "Søk etter land eller region", - "swap.cancel.cannotExecute_one": "Byttet ditt kan utføres før kanselleringen er behandlet. Nettverkskostnadene dine kan ikke refunderes. Ønsker du å fortsette?", - "swap.cancel.cannotExecute_other": "Byttene dine kan utføres før kanselleringen er behandlet. Nettverkskostnadene dine kan ikke refunderes. Ønsker du å fortsette?", - "swap.confirmLimit": "Bekreft grense", - "swap.confirmSwap": "Bekreft bytte", - "swap.deadline.settings.title": "Transaksjonsfrist", - "swap.deadline.settings.title.short": "Tx. frist", - "swap.details.feeOnTransfer": "{{tokenSymbol}} gebyr", - "swap.details.feeOnTransfer.default": "Tokenavgift", - "swap.details.newQuote.input": "Nytt innspill", - "swap.details.newQuote.output": "Ny utgang", - "swap.details.orderRouting": "Bestillingsruting", - "swap.details.orderRoutingInfo": "Dette byttet rutes via Across, en desentralisert protokoll som flytter eiendeler på tvers av nettverk samtidig som sikkerhet, rask utførelse og lave priser prioriteres.", - "swap.details.poweredBy": "Drevet av", - "swap.details.rate": "Vurdere", - "swap.details.slippage": "Maks glidning", - "swap.details.uniswapFee": "Avgift", - "swap.enterAmount": "Skriv inn {{sym}} beløp", - "swap.error.default": "Det kan hende du må øke utglidningstoleransen. Merk: gebyr-ved-overføring og rebase-tokens er inkompatible med Uniswap V3.", - "swap.error.expectedToFail": "Byttet ditt forventes å mislykkes.", - "swap.error.modifiedByWallet": "Byttet ditt ble endret gjennom lommeboken din. Hvis dette var en feil, må du avbryte umiddelbart eller risikere å miste pengene dine.", - "swap.error.rejected": "Transaksjonen avvist", - "swap.error.undefinedObject": "Det oppstod en feil under forsøk på å utføre denne vekslingen. Det kan hende du må øke utglidningstoleransen. Hvis det ikke fungerer, kan det være en inkompatibilitet med tokenet du handler. Merk: gebyr-ved-overføring og rebase-tokens er inkompatible med Uniswap V3.", - "swap.error.unknown": "Ukjent feil.", - "swap.error.v2.expired": "Denne transaksjonen kunne ikke sendes fordi fristen har gått ut. Kontroller at transaksjonsfristen ikke er for lav.", - "swap.error.v2.k": "Uniswap-invarianten x*y=k ble ikke tilfredsstilt av byttet. Dette betyr vanligvis at en av tokenene du bytter, inneholder tilpasset oppførsel ved overføring.", - "swap.error.v2.slippage": "Denne transaksjonen vil ikke lykkes enten på grunn av prisbevegelse eller gebyr ved overføring. Prøv å øke slipp-toleransen", - "swap.error.v2.transferInput": "Inndatatokenet kan ikke overføres. Det kan være et problem med inndatatokenet.", - "swap.error.v2.transferOutput": "Utdatatokenet kan ikke overføres. Det kan være et problem med utdatatokenet.", - "swap.error.v3.slippage": "Denne transaksjonen vil ikke lykkes på grunn av prisbevegelser. Prøv å øke glidningstoleransen. Merk: gebyr på overføring og rebase-tokens er inkompatible med Uniswap V3.", - "swap.error.v3.transferOutput": "Utdatatokenet kan ikke overføres. Det kan være et problem med utdatatokenet. Merk: gebyr på overføring og rebase-tokens er inkompatible med Uniswap V3.", - "swap.estimatedDifference.label": "Det vil være stor forskjell mellom input- og outputverdiene dine på grunn av gjeldende likviditet.", - "swap.fail.message": "Prøv å justere glidningen til en høyere verdi.", - "swap.fail.uniswapX": "Bytte kunne ikke fullføres med UniswapX. Prøv byttet på nytt for å rute det gjennom det klassiske Uniswap API.", - "swap.fees.experience": "Denne avgiften brukes på noen token-par for å sikre den beste opplevelsen med Uniswap. Det betales i utdatatokenet og er allerede tatt med i tilbudet.", - "swap.fees.noFee": "Avgifter påløper på utvalgte token-par for å sikre den beste opplevelsen med Uniswap. Det er ingen avgift knyttet til denne byttet.", - "swap.fetchingBestPrice": "Får best pris...", - "swap.fetchingPrice": "Henter pris...", - "swap.finalizingQuote": "Avslutter sitat...", - "swap.form.header": "Bytte", - "swap.form.insufficientLiquidity": "Utilstrekkelig likviditet for denne handelen.", - "swap.form.pocketUniverseExtension.warning": "Pocket Universe-utvidelsen bryter med ved å modifisere produktet vårt på en måte som er villedende og kan skade brukere. Vennligst deaktiver utvidelsen og last inn siden på nytt.", - "swap.form.warning.output.fotFees": "På grunn av symbolgebyret på {{fotCurrencySymbol}}, kan byttebeløp kun angis ved å bruke inntastingsfeltet", - "swap.form.warning.output.fotFees.fallback": "På grunn av tokenavgifter kan byttebeløp kun legges inn ved å bruke inntastingsfeltet", - "swap.form.warning.restore": "Gjenopprett lommeboken for å bytte", - "swap.frontrun.warning": "Transaksjonen din kan være frontrun og resultere i en ugunstig handel.", - "swap.header.viewOnly": "Bare visning", - "swap.impactOfTrade": "Påvirkningen din handel har på markedsprisen for denne poolen.", - "swap.inputEstimated.atMost": "Innspill er estimert. Du selger maksimalt , ellers vil transaksjonen gå tilbake.", - "swap.limit": "Grense", - "swap.limitedAssets.warning": "Noen eiendeler er ikke tilgjengelige gjennom dette grensesnittet fordi de kanskje ikke fungerer bra med smarte kontrakter, eller vi ikke kan tillate handel av juridiske årsaker.", - "swap.limitFilled": "Grensen er fylt!", - "swap.limitSubmitted": "Grensen er sendt inn", - "swap.marketPrice.outsideRange.label": "Markedsprisen er utenfor din spesifiserte prisklasse. Kun innskudd for enkeltstående eiendeler.", - "swap.maxPriceSlip.revert": "Det maksimale beløpet du er garantert å bruke. Hvis prisen faller ytterligere, vil transaksjonen gå tilbake.", - "swap.minPriceSlip.revert": "Hvis prisen beveger seg slik at du vil motta mindre enn {{amount}}, vil transaksjonen gå tilbake.", - "swap.networkCost.paidIn": "Nettverkskostnad betales i {{sym}} på {{chainName}} -nettverket for å utføre transaksjoner.", - "swap.orderRouting": "Bestillingsruting", - "swap.outputEstimated.atLeast": "Utgang er estimert. Du vil motta minst eller transaksjonen går tilbake.", - "swap.payAnyway": "Betal uansett", - "swap.payAtMost": "Betal på det meste", - "swap.payWith": "Betale med", - "swap.placeOrder": "Legg inn bestilling", - "swap.priceImpact": "Prispåvirkning", - "swap.receive.atLeast": "Motta i det minste", - "swap.request.title.full": "Bytt {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "Bytt ut tokens", - "swap.review": "Anmeldelsesbytte", - "swap.review.summary": "Du bytter", - "swap.reviewLimit": "Gjennomgangsgrense", - "swap.route.optimizedGasCost": "Denne ruten vurderer delte ruter, flere hopp og nettverkskostnader for hvert trinn.", - "swap.settings.deadline.tooltip": "Transaksjonen din vil gå tilbake hvis den venter i mer enn denne perioden. (Maksimalt: 3 dager).", - "swap.settings.deadline.warning": "Høy frist", - "swap.settings.protection.description": "Med byttebeskyttelse på, vil dine Ethereum-transaksjoner være beskyttet mot sandwich-angrep, med reduserte sjanser for å mislykkes.", - "swap.settings.protection.subtitle.supported": "{{chainName}} Nettverk", - "swap.settings.protection.subtitle.unavailable": "Ikke tilgjengelig på {{chainName}}", - "swap.settings.protection.title": "Byttebeskyttelse", - "swap.settings.routingPreference.option.default.description": "Hvis du velger dette alternativet, identifiseres den mest effektive ruten for byttet ditt.", - "swap.settings.routingPreference.option.default.description.preV4": "Uniswap-klienten velger det billigste alternativet med tanke på pris og nettverkskostnader.", - "swap.settings.routingPreference.option.default.tooltip": "En rute er identifisert med tanke på v2, v3 og visse v4-pooler, og tar hensyn til estimert prispåvirkning og nettverkskostnader.", - "swap.settings.routingPreference.option.v2.title": "v2 bassenger", - "swap.settings.routingPreference.option.v3.title": "v3 bassenger", - "swap.settings.routingPreference.option.v4.title": "v4 bassenger", - "swap.settings.routingPreference.title": "Handel med alternativer", - "swap.settings.slippage.alert": "Høy glidning", - "swap.settings.slippage.control.auto": "Auto", - "swap.settings.slippage.description": "Transaksjonen din vil gå tilbake hvis prisen endres mer enn glidningsprosenten.", - "swap.settings.slippage.input.message": "Hvis prisen faller ytterligere, vil transaksjonen gå tilbake. Nedenfor er minimumsbeløpet du er garantert å motta.", - "swap.settings.slippage.input.receive.title": "Motta i det minste", - "swap.settings.slippage.output.message": "Hvis prisen faller ytterligere, vil transaksjonen gå tilbake. Nedenfor er det maksimale beløpet du trenger å bruke.", - "swap.settings.slippage.output.spend.title": "Bruk på det meste", - "swap.settings.slippage.warning": "Svært høy utglidning", - "swap.settings.slippage.warning.description": "Slipp over 20 % vil sannsynligvis føre til en ugunstig handel. Senk innstillingene dine for å redusere risikoen for frontkjøring.", - "swap.settings.slippage.warning.hover": "Dette kan føre til en ugunstig handel. Prøv å senke utglidningsinnstillingen.", - "swap.settings.slippage.warning.max": "Skriv inn en verdi mindre enn {{maxSlippageTolerance}}", - "swap.settings.slippage.warning.message": "Utglidningen kan være høyere enn nødvendig", - "swap.settings.slippage.warning.min": "Skriv inn en verdi større enn 0", - "swap.settings.title": "Bytt innstillinger", - "swap.settings.transactionRevertPrice": "Transaksjonen din vil gå tilbake hvis prisen endres ugunstig med mer enn denne prosentandelen.", - "swap.signAndSwap": "Signer og bytt", - "swap.slippage.amt": "{{amt}} glidning", - "swap.slippage.bridging": "Ingen glidning når du bytter på tvers av nettverk", - "swap.slippage.settings.title": "Slippinnstillinger", - "swap.slippage.tooltip": "Den maksimale prisbevegelsen før transaksjonen din vil gå tilbake.", - "swap.slippageBelow.warning": "Slipp under {{amt}} kan resultere i en mislykket transaksjon", - "swap.submitted": "Bytte sendt inn", - "swap.success": "Bytte suksess!", - "swap.taxTooltip.label": "Kun eksakt innspill", - "swap.taxTooltip.noTokenSelected": "Avgifter på det valgte utdatatokenet tillater ikke nøyaktige utdata. Bruk `Selg`-feltet i stedet.", - "swap.taxTooltip.tokenSelected": "{{tokenSymbol}} avgifter tillater ikke nøyaktige nøyaktige utdata. Bruk 'Selg'-feltet i stedet.", - "swap.tokenOwnFees": "Noen tokens tar et gebyr når de kjøpes eller selges, som settes av tokenutstederen. Uniswap mottar ingen av disse avgiftene.", - "swap.total": "Total", - "swap.tradeRoutes": "Handelsruter", - "swap.transaction.deadline": "Transaksjonsfrist", - "swap.transaction.revertAfter": "Transaksjonen din vil gå tilbake hvis den venter i mer enn denne perioden.", - "swap.unsupportedAssets.readMore": "Les mer om ikke-støttede eiendeler", - "swap.warning.enterLargerAmount.title": "Angi et større beløp", - "swap.warning.expectedFailure.increaseSlippage": "Prøv å øke glidningen.", - "swap.warning.expectedFailure.titleMay": "Dette byttet kan mislykkes", - "swap.warning.insufficientBalance.title": "Du har ikke nok {{currencySymbol}}", - "swap.warning.insufficientGas.button": "Ikke nok {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "Bytt til {{ tokenSymbol }} på {{networkName}}", - "swap.warning.insufficientGas.button.buy": "Kjøp {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "Kjøp med kort", - "swap.warning.insufficientGas.message.withNetwork": "Ikke nok {{currencySymbol}} på {{networkName}} til å bytte", - "swap.warning.insufficientGas.message.withoutNetwork": "Ikke nok {{currencySymbol}} til å bytte", - "swap.warning.insufficientGas.title": "Du har ikke nok {{currencySymbol}} til å dekke nettverkskostnadene", - "swap.warning.networkFee.allow": "Tillat {{ inputTokenSymbol }} (én gang)", - "swap.warning.networkFee.highRelativeToValue": "Nettverkskostnaden overstiger 10 % av den totale transaksjonsverdien.", - "swap.warning.networkFee.highRelativeToValue.unichain": "Nettverkskostnaden overstiger 10 % av den totale transaksjonsverdien.", - "swap.warning.networkFee.message": "Dette er kostnaden for å behandle transaksjonen din på blokkjeden. Uniswap mottar ingen andel av disse avgiftene.", - "swap.warning.networkFee.message.unichain": "Dette er kostnaden for å behandle transaksjonen din på blokkjeden.", - "swap.warning.networkFee.message.uniswapX": "Dette er kostnaden for å behandle transaksjonen din på blokkjeden. Uniswap mottar ingen andel av disse avgiftene. UniswapX samler likviditetskilder for bedre priser og gassfrie bytteavtaler.", - "swap.warning.networkFee.message.uniswapX.unichain": "Dette er kostnaden for å behandle transaksjonen din på blokkjeden. UniswapX samler likviditetskilder for bedre priser og gassfrie bytteavtaler.", - "swap.warning.networkFee.wrap": "Pakk inn ETH", - "swap.warning.noQuotesFound.bridging.message": "Fant ingen overgangssitater. Prøv å bruke den offisielle broen på dette tidspunktet.", - "swap.warning.noQuotesFound.title": "Ingen sitater funnet", - "swap.warning.noRoutesFound.message": "Det er for øyeblikket ingen tilgjengelige ruter for dine valgte tokens. Prøv et annet par eller sjekk igjen senere.", - "swap.warning.noRoutesFound.title": "Ingen ruter tilgjengelig", - "swap.warning.offline.message": "Du kan ha mistet internettforbindelsen eller nettverket kan være nede. Kontroller Internett-tilkoblingen din og prøv igjen.", - "swap.warning.offline.title": "Du er frakoblet", - "swap.warning.priceImpact": "Denne transaksjonen vil resultere i en prispåvirkning på markedsprisen for denne poolen. Ønsker du å fortsette?", - "swap.warning.priceImpact.message": "På grunn av mengden av {{outputCurrencySymbol}} likviditet tilgjengelig for øyeblikket, jo mer {{inputCurrencySymbol}} du prøver å bytte, jo mindre {{outputCurrencySymbol}} vil du motta.", - "swap.warning.priceImpact.message.veryHigh": "Denne transaksjonen vil resultere i en {{priceImpactValue}} prispåvirkning på markedsprisen for denne poolen og vil resultere i tap av midler.", - "swap.warning.priceImpact.title": "Høy prispåvirkning ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "Svært høy prispåvirkning ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "Transaksjonen din ble ikke sendt inn fordi du stengte appen.", - "swap.warning.queuedOrder.approvalFailed": "Transaksjonen din ble ikke sendt fordi token-godkjenning mislyktes.", - "swap.warning.queuedOrder.stale": "Transaksjonen din ble ikke sendt inn fordi du lukket appen eller godkjenningen tok for lang tid.", - "swap.warning.queuedOrder.submissionFailed": "Det oppsto et problem under innsending av transaksjonen.", - "swap.warning.queuedOrder.title": "Bytte kansellert", - "swap.warning.queuedOrder.wrap.message": "Din ETH forblir pakket inn som WETH.", - "swap.warning.queuedOrder.wrapFailed": "Transaksjonen din ble ikke sendt inn fordi innpakningstransaksjonen mislyktes.", - "swap.warning.rateLimit.message": "Vennligst prøv igjen om noen minutter.", - "swap.warning.rateLimit.title": "Satsgrensen er overskredet", - "swap.warning.router.message": "Du kan ha mistet forbindelsen eller nettverket kan være nede. Hvis problemet vedvarer, prøv igjen senere.", - "swap.warning.router.title": "Denne handelen kan ikke fullføres akkurat nå", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} er blokkert", - "swap.warning.uniswapFee.message.default": "Gebyrer påløper for å sikre den beste opplevelsen med Uniswap. Det er ingen avgift knyttet til denne byttet.", - "swap.warning.uniswapFee.message.included": "Gebyrer påløper for å sikre den beste opplevelsen med Uniswap, og er allerede tatt med i dette tilbudet.", - "swap.warning.uniswapFee.title": "Byttegebyr", - "swap.warning.viewOnly.message": "Du må importere denne lommeboken via gjenopprettingsfrase for å bytte tokens.", - "swap.wrap.token": "Pakk inn {{sym}}", - "tdp.balanceSummary.otherNetworks": "På andre nettverk", - "tdp.balanceSummary.otherNetworksBalance": "Balanse på andre nettverk", - "tdp.balanceSummary.title": "Din balanse", - "tdp.invalidTokenPage.switchChainPrompt": "Bytt til {{network}}", - "tdp.invalidTokenPage.title": "Dette tokenet eksisterer ikke", - "tdp.invalidTokenPage.titleWithChain": "Dette tokenet finnes ikke på {{network}}", - "tdp.loading.title.default": "tokendata for ", - "tdp.loading.title.withChain": "tokendata for på {{chainName}}", - "tdp.nameNotFound": "Finner ikke navn", - "tdp.noInfoAvailable": "Ingen tokeninformasjon tilgjengelig", - "tdp.noTestnetSupportDescription": "Noen testnett støtter ikke bytte, sending eller kjøp av tokens.", - "tdp.stats.unsupportedChainDescription": "Tokenstatistikk og diagrammer for {{chain}} er tilgjengelig på {{infoLink}}", - "tdp.symbolNotFound": "Symbol ikke funnet", - "testnet.modal.swapDeepLink.description.toProdMode": "Denne handlingen krever at testnettmodus er deaktivert. Testnett-modus kan aktiveres igjen når som helst innenfor innstillingene.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "Denne handlingen krever at testnettmodus er aktivert. Tokens på testnett har ingen reell verdi. Testnet-modus kan deaktiveres når som helst i innstillingene.", - "testnet.modal.swapDeepLink.title.toProdMode": "Deaktiver testnettmodus", - "testnet.modal.swapDeepLink.title.toTestnetMode": "Aktiver testnettmodus", - "testnet.unsupported": "Denne funksjonaliteten støttes ikke i testnettmodus.", - "themeToggle.theme": "Tema", - "title.betterPricesMoreListings": "Bedre priser. Flere oppføringer. Kjøp, selg og bytt NFT-er på tvers av toppmarkedsplasser som OpenSea. Utforsk populære samlinger.", - "title.buySellTradeEthereum": "Kjøp, selg og bytt Ethereum og andre topp-tokens på Uniswap", - "title.createGovernanceOn": "Lag et nytt styringsforslag på Uniswap", - "title.createGovernanceTo": "Lag et nytt styringsforslag som skal stemmes over av UNI-innehavere. UNI-tokens representerer stemmeberettigede andeler i Uniswap-styring.", - "title.earnFees": "Tjen gebyrer når andre bytter på Uniswap ved å legge til tokens i likviditetspuljer.", - "title.easilyRemove": "Fjern enkelt likviditeten din fra Uniswap v2 og sett inn i Uniswap v3.", - "title.easilyRemoveV4": "Fjern enkelt likviditeten din fra Uniswap v2 og v3 for å sette inn i Uniswap v4.", - "title.explore": "Utforsk NFT-er på Uniswap", - "title.exploreNFTs": "Utforsk og kjøp NFT-er på tvers av toppmarkedsplasser på Uniswap", - "title.manageNFT": "Administrer NFT-samlingen din. Se egenskaper, handelsaktivitet, beskrivelser og andre detaljer på NFT-ene dine.", - "title.migratev2": "Migrer v2 pool likviditet til Uniswap v3", - "title.migratev3": "Migrer pool likviditet til Uniswap v4", - "title.placeLimit": "Legg inn grensebestillinger på Uniswap", - "title.realTime": "Sanntidspriser, diagrammer, transaksjonsdata og mer.", - "title.removeLiquidityv2": "Fjern pool likviditet (v2) på Uniswap", - "title.removePoolLiquidity": "Fjern poollikviditet på Uniswap", - "title.removeTokensv2": "Fjern tokens fra v2 likviditetspuljer.", - "title.removev3Liquidity": "Fjern tokens fra v3 likviditetspuljer.", - "title.sendTokens": "Send tokens på Uniswap", - "title.swappingMadeSimple": "Bytte gjort enkelt. Kjøp og selg krypto på Ethereum, Base, Arbitrum, Polygon og mer. Stolt på av millioner.", - "title.tradeTokens": "Handle tokens og gi likviditet. Sanntidspriser, diagrammer, transaksjonsdata og mer.", - "title.uniswapTradeCrypto": "Uniswap | Handle krypto og NFT-er trygt på den øverste DeFi-plattformen", - "title.uniToken": "UNI-tokens representerer stemmeberettigede andeler i Uniswap-styring. Du kan stemme på hvert forslag selv eller delegere stemmene dine til en tredjepart.", - "title.voteOnGov": "Stem på styringsforslag på Uniswap", - "token.balances.main": "Din balanse", - "token.balances.other": "Saldoer på andre nettverk", - "token.balances.viewOnly": "{{ownerAddress}}sin saldo", - "token.bridge": "{{label}} symbolbro", - "token.chart.tooltip": "Avgifter: {{amount}}", - "token.details.testnet.unsupported": "Tokendetaljer er utilgjengelige for testnet-tokens.", - "token.error.unknown": "Ukjent token", - "token.fee.buy.label": "kjøpe gebyr", - "token.fee.label": "avgift", - "token.fee.sell.label": "salgsgebyr", - "token.links.title": "Linker", - "token.links.twitter": "Twitter", - "token.links.website": "Nettsted", - "token.priceExplorer.error.description": "Noe gikk galt.", - "token.priceExplorer.error.title": "Kunne ikke laste inn prisdiagrammet", - "token.priceExplorer.timeRangeLabel.all": "Hele tiden", - "token.priceExplorer.timeRangeLabel.day": "1D", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 dag", - "token.priceExplorer.timeRangeLabel.hour": "1H", - "token.priceExplorer.timeRangeLabel.month": "1M", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 måned", - "token.priceExplorer.timeRangeLabel.week": "1W", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 uke", - "token.priceExplorer.timeRangeLabel.year": "1Y", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 år", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} er ikke tilgjengelig", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} og {{tokenSymbol1}} er ikke tilgjengelige", - "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs mottar ingen av disse avgiftene.", - "token.safety.warning.alwaysDoYourResearch": "Gjør alltid research", - "token.safety.warning.blocked.description.default_one": "Du kan ikke bytte dette tokenet ved å bruke Uniswap-appen.", - "token.safety.warning.blocked.description.default_other": "Du kan ikke bytte disse tokenene ved å bruke Uniswap-appen.", - "token.safety.warning.dontShowWarningAgain": "Ikke vis meg denne advarselen igjen", - "token.safety.warning.doYourOwnResearch": "Gjør alltid din egen forskning før du fortsetter.", - "token.safety.warning.feeDescription": "Lader en når {{action}}", - "token.safety.warning.flaggedAsMalicious": "Flagget som ondsinnet", - "token.safety.warning.fotHigh.title": "Høy avgift oppdaget", - "token.safety.warning.fotLow.title": "Gebyr oppdaget", - "token.safety.warning.fotVeryHigh.title": "Svært høy avgift oppdaget", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} har blitt flagget som uselgbar. Bytting av dette tokenet kan føre til tap av midlene dine.", - "token.safety.warning.honeypot.title": "100 % salgsgebyr oppdaget", - "token.safety.warning.impersonator": "Etterligner et annet token", - "token.safety.warning.impersonator.title": "Imitatortoken oppdaget", - "token.safety.warning.malicious.general.message": "{{tokenSymbol}} har blitt flagget som ondsinnet av Blockaid.", - "token.safety.warning.malicious.impersonator.message": "{{tokenSymbol}} har blitt flagget av Blockaid for forsøk på å kopiere et annet token. Det er kanskje ikke tokenet du ønsker å bytte.", - "token.safety.warning.malicious.impersonator.message.short": "{{tokenSymbol}} er kanskje ikke tokenet du ønsker å bytte.", - "token.safety.warning.malicious.title": "Skadelig token oppdaget", - "token.safety.warning.mayResultInLoss": "Å bytte det kan føre til tap av midler.", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} handles ikke på ledende amerikanske sentraliserte børser.", - "token.safety.warning.notListedOnExchanges": "Ikke notert på ledende amerikanske børser", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} har blitt flagget som uselgbar.", - "token.safety.warning.sellFee100.title": "100 % salgsgebyr oppdaget", - "token.safety.warning.spam.message": "{{tokenSymbol}} har blitt flagget som spam av Blockaid.", - "token.safety.warning.spam.title": "Spam-token oppdaget", - "token.safety.warning.spamsUsers": "Spam-brukere", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} belaster et {{buyFeePercent}} gebyr ved kjøp og {{sellFeePercent}} ved salg.", - "token.safety.warning.tokenChargesFee.buy.message": "{{tokenSymbol}} belaster et {{feePercent}} gebyr ved kjøp.", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} belaster et {{feePercent}} gebyr ved salg.", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} krever et gebyr ved kjøp eller salg.", - "token.safetyLevel.blocked.message": "Du kan ikke bytte dette tokenet ved å bruke Uniswap Wallet.", - "token.safetyLevel.medium.message.plural": "Disse tokenene handles ikke på ledende amerikanske sentraliserte børser. Gjør alltid din egen forskning før du fortsetter.", - "token.selector.search.error": "Kunne ikke laste inn søkeresultater", - "token.stats.fullyDilutedValuation": "Fullstendig utvannet verdivurdering", - "token.stats.marketCap": "Markedsverdi", - "token.stats.priceHighYear": "52W høy", - "token.stats.priceLowYear": "52W lav", - "token.stats.section.about": "Om {{token}}", - "token.stats.title": "Statistikk", - "token.stats.translation.original": "Vis originalen", - "token.stats.translation.translate": "Oversett til {{language}}", - "token.stats.volume": "24 timers volum", - "token.symbol.input.fallback": "Input token", - "token.symbol.output.fallback": "Output token", - "token.wrap.fail.message": "Bytter på Uniswap-protokollen kan starte og slutte med ETH. Men under byttet blir ETH pakket inn i WETH.", - "token.zeroNativeBalance.description": "For å få {{ tokenSymbol }}trenger du først {{ nativeTokenSymbol }} for å betale for nettverkskostnaden. Kom i gang ved å finansiere lommeboken din med {{ nativeTokenSymbol }}.", - "token.zeroNativeBalance.title": "Du trenger {{ nativeTokenName }} ", - "tokens.action.hide": "Skjul token", - "tokens.action.unhide": "Vis token", - "tokens.nfts.action.viewOnExplorer": "Se på {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "Kunne ikke laste inn NFT-samlingen", - "tokens.nfts.collection.label.items": "Varer", - "tokens.nfts.collection.label.owners": "Eiere", - "tokens.nfts.collection.label.priceFloor": "Gulv", - "tokens.nfts.collection.label.swapVolume": "Volum", - "tokens.nfts.details.error.load.title": "Kunne ikke laste inn NFT-detaljer", - "tokens.nfts.details.network": "Nettverk", - "tokens.nfts.details.owner": "Eid av", - "tokens.nfts.details.price": "Gjeldende pris", - "tokens.nfts.details.recentPrice": "Siste salgspris", - "tokens.nfts.details.traits": "Egenskaper", - "tokens.nfts.empty.description": "Ingen NFT-er funnet", - "tokens.nfts.error.unavailable": "Innhold ikke tilgjengelig", - "tokens.nfts.hidden.action.hide": "Skjul NFT", - "tokens.nfts.hidden.action.unhide": "Vis NFT", - "tokens.nfts.link.collection": "Samlingsnettsted", - "tokens.nfts.list.error.load.title": "Kunne ikke laste inn NFT-er", - "tokens.nfts.list.none.button": "Motta NFT-er", - "tokens.nfts.list.none.description.default": "Overfør NFT-er fra en annen lommebok for å komme i gang.", - "tokens.nfts.list.none.description.external": "Når denne lommeboken kjøper eller mottar NFT-er, vises de her.", - "tokens.nfts.list.none.title": "Ingen NFT-er ennå", - "tokens.noneFound": "Ingen tokens funnet.", - "tokens.selector.button.choose": "Velg token", - "tokens.selector.button.clear": "Rydd alt", - "tokens.selector.empty.buy.message": "Kjøp krypto med kort eller bank for å sende tokens.", - "tokens.selector.empty.buy.title": "Kjøp krypto", - "tokens.selector.empty.receive.title": "Motta tokens", - "tokens.selector.empty.title": "Ingen tokens ennå", - "tokens.selector.error.load": "Kunne ikke laste inn tokens", - "tokens.selector.search.empty": "Ingen resultater funnet for {{searchText}}", - "tokens.selector.search.placeholder": "Søk tokens", - "tokens.selector.section.bridging": "Bytt på tvers av nettverk", - "tokens.selector.section.favorite": "Favoritter", - "tokens.selector.section.otherSearchResults": "Andre tokens på {{network}}", - "tokens.selector.section.recent": "Nylige søk", - "tokens.selector.section.search": "Søkeresultater", - "tokens.selector.section.trending": "Tokens med 24-timers volum", - "tokens.selector.section.yours": "Dine tokens", - "tokens.table.search.placeholder.pools": "Søk i bassenger", - "tokens.table.search.placeholder.tokens": "Søk tokens", - "transaction.action.cancel.button": "Avbryt transaksjonen", - "transaction.action.cancel.description": "Hvis du kansellerer denne transaksjonen før den er behandlet av nettverket, betaler du en ny nettverkskostnad i stedet for den opprinnelige.", - "transaction.action.cancel.title": "Vil du avbryte denne transaksjonen?", - "transaction.action.copy": "Kopiér transaksjons-ID", - "transaction.action.copyProvider": "Kopiér {{providerName}} transaksjons-ID", - "transaction.amount.unlimited": "Ubegrenset", - "transaction.confirmation.completionTime_one": "Transaksjonen fullført på {{count}} sekund 🎉", - "transaction.confirmation.completionTime_other": "Transaksjonen fullført på {{count}} sekunder 🎉", - "transaction.confirmation.pending.wallet": "Bekreft transaksjonen i lommeboken", - "transaction.confirmation.submitted.currency.add": "Legg til {{currency}}", - "transaction.confirmation.submitted.currency.added": "Lagt til {{currency}}", - "transaction.confirmation.waiting": "Venter på bekreftelse", - "transaction.date": "Sendt inn {{date}}", - "transaction.details.dappName": "App", - "transaction.details.from": "Fra", - "transaction.details.networkFee": "Nettverkskostnad", - "transaction.details.providerFee": "Leverandøravgift", - "transaction.details.swapRate": "Vurdere", - "transaction.details.transaction": "Transaksjon", - "transaction.details.uniswapFee": "Gebyr ({{ feePercent }}%)", - "transaction.insufficientLiquidity": "Utilstrekkelig poollikviditet til å fullføre transaksjonen", - "transaction.network.all": "Alle nettverk", - "transaction.networkCost.label": "Nettverkskostnad", - "transaction.networkCost.maxNativeBalance.description": "En liten mengde av nettverkstoken-saldoen er reservert for å dekke nettverkskostnadene for denne transaksjonen.", - "transaction.networkCost.maxNativeBalance.title": "Hvorfor kan jeg ikke bruke makssaldoen min?", - "transaction.networkCost.veryHigh.label": "Svært høye nettverkskostnader", - "transaction.notification.error.cancel": "Kan ikke kansellere transaksjonen", - "transaction.notification.error.replace": "Kan ikke erstatte transaksjonen", - "transaction.status.approve.canceled": "Kansellert godkjenning", - "transaction.status.approve.canceling": "Kansellerer godkjenning", - "transaction.status.approve.failed": "Kunne ikke godkjenne", - "transaction.status.approve.pending": "Godkjenner", - "transaction.status.approve.success": "Godkjent", - "transaction.status.approve.successDapp": "Godkjent {{externalDappName}}", - "transaction.status.buy.canceled": "Kansellert kjøp", - "transaction.status.buy.canceling": "Kansellerer kjøp", - "transaction.status.buy.failed": "Kunne ikke kjøpe", - "transaction.status.buy.pending": "Kjøpe", - "transaction.status.buy.success": "Kjøpt", - "transaction.status.buy.successDapp": "Kjøpt på {{externalDappName}}", - "transaction.status.confirm.canceled": "Avbrutt bekrefte", - "transaction.status.confirm.canceling": "Venter på kansellering", - "transaction.status.confirm.failed": "Kunne ikke bekrefte", - "transaction.status.confirm.pending": "Transaksjon pågår", - "transaction.status.confirm.success": "Transaksjonen bekreftet", - "transaction.status.confirm.successDapp": "Transaksjonen bekreftet {{externalDappName}}", - "transaction.status.mint.canceled": "Kansellert mint", - "transaction.status.mint.canceling": "Kansellerer mint", - "transaction.status.mint.failed": "Kunne ikke prege", - "transaction.status.mint.pending": "Minting", - "transaction.status.mint.success": "Preget", - "transaction.status.mint.successDapp": "Preget på {{externalDappName}}", - "transaction.status.purchase.canceled": "Kansellert kjøp", - "transaction.status.purchase.canceling": "Kansellerer kjøpet", - "transaction.status.purchase.failedOn": "Kunne ikke kjøpe på {{serviceProvider}}", - "transaction.status.purchase.pendingOn": "Kjøper på {{serviceProvider}}", - "transaction.status.purchase.successOn": "Kjøpt på {{serviceProvider}}", - "transaction.status.receive.canceled": "Kansellert mottak", - "transaction.status.receive.canceling": "Kansellerer mottak", - "transaction.status.receive.failedFrom": "Kunne ikke motta fra {{serviceProvider}}", - "transaction.status.receive.pendingFrom": "Mottar fra {{serviceProvider}}", - "transaction.status.receive.success": "Mottatt", - "transaction.status.receive.successDapp": "Mottatt {{externalDappName}}", - "transaction.status.receive.successFrom": "Mottatt fra {{serviceProvider}}", - "transaction.status.revoke.canceled": "Kansellert tilbakekall", - "transaction.status.revoke.canceling": "Kansellerer tilbakekall", - "transaction.status.revoke.failed": "Kunne ikke tilbakekalle", - "transaction.status.revoke.pending": "Opphever", - "transaction.status.revoke.success": "Opphevet", - "transaction.status.revoke.successDapp": "Opphevet {{externalDappName}}", - "transaction.status.sale.canceled": "Kansellert salg", - "transaction.status.sale.canceling": "Avbryter salg", - "transaction.status.sale.failedOn": "Salg mislyktes via {{serviceProvider}}", - "transaction.status.sale.pendingOn": "Selges via {{serviceProvider}}", - "transaction.status.sale.successOn": "Selges via {{serviceProvider}}", - "transaction.status.sell.canceled": "Kansellert salg", - "transaction.status.sell.canceling": "Kansellerer salg", - "transaction.status.sell.failed": "Kunne ikke selge", - "transaction.status.sell.pending": "Selger", - "transaction.status.sell.success": "Solgt", - "transaction.status.sell.successDapp": "Selges på {{externalDappName}}", - "transaction.status.send.canceled": "Avbrutt sending", - "transaction.status.send.canceling": "Avbryter sending", - "transaction.status.send.failed": "Mislykket sending", - "transaction.status.send.pending": "Sender", - "transaction.status.send.success": "Sendt", - "transaction.status.send.successDapp": "Sendt {{externalDappName}}", - "transaction.status.swap.canceled": "Kansellert bytte", - "transaction.status.swap.canceling": "Kansellerer bytte", - "transaction.status.swap.expired": "Bytte utløpt", - "transaction.status.swap.failed": "Kunne ikke bytte", - "transaction.status.swap.insufficientFunds": "Utilstrekkelige midler", - "transaction.status.swap.pending": "Bytting", - "transaction.status.swap.success": "Byttet", - "transaction.status.swap.successDapp": "Byttet på {{externalDappName}}", - "transaction.status.unwrap.canceled": "Avbrutt utpakning", - "transaction.status.unwrap.canceling": "Avbryter utpakking", - "transaction.status.unwrap.failed": "Kunne ikke pakke ut", - "transaction.status.unwrap.pending": "Utpakking", - "transaction.status.unwrap.success": "Utpakket", - "transaction.status.unwrap.successDapp": "Utpakket på {{externalDappName}}", - "transaction.status.wrap.canceled": "Kansellert innpakning", - "transaction.status.wrap.canceling": "Avbryter innpakning", - "transaction.status.wrap.failed": "Kunne ikke pakke inn", - "transaction.status.wrap.pending": "Innpakning", - "transaction.status.wrap.success": "Innpakket", - "transaction.status.wrap.successDapp": "Pakket på {{externalDappName}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} til {{recipientAddress}}", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} fra {{senderAddress}}", - "transaction.warning.insufficientGas.modal.message": "Du trenger ~{{tokenAmount}} {{tokenSymbol}} () på {{networkName}} for å dekke denne transaksjonens nettverkskostnader.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "Ikke nok {{tokenSymbol}} på {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Ikke nok {{tokenSymbol}}", - "transaction.warning.maxNative.message": "Du er i ferd med å bruke mesteparten av nettverkstoken-saldoen din. Dette kan etterlate utilstrekkelige midler til å dekke fremtidige nettverkskostnader.", - "transaction.warning.maxNative.title": "Lav nettverkstokenbalanse", - "transaction.watcher.error.cancel": "Kan ikke kansellere transaksjonen", - "transaction.watcher.error.status": "Feil under kontroll av transaksjonsstatus", - "unichain.promotion.bridging.description": "Bytt til Unichain", - "unichain.promotion.bridging.tooltip.description": "Bruk din ETH for å komme i gang med Unichain.", - "unichain.promotion.cold.description": "Raskere bytte. Lavere avgifter. Unichain er hjemmet til DeFi.", - "unichain.promotion.cold.title": "Vi introduserer Unichain", - "unichain.promotion.modal.description": "Raskere bytte. Lavere avgifter. Unichain er hjemmet for likviditet på tvers av kjeder.", - "unichain.promotion.modal.detail.costs": "Lavere kostnader for å opprette pools og administrere stillinger.", - "unichain.promotion.modal.detail.fees": "Spar 95% på gebyrer sammenlignet med Ethereum.", - "unichain.promotion.modal.detail.instant": "Bytt umiddelbart", - "unichain.promotion.tooltip.description": "Raskere bytte. Lavere avgifter. Unichain er hjemmet for likviditet på tvers av kjeder.", - "unichain.promotion.tooltip.switch": "Bytt til Unichain", - "unichain.promotion.tooltip.title": "Unichain er her", - "unichain.promotion.warm.description": "Bytt favorittsymbolene dine raskere og med lavere bensinkostnader.", - "unichain.promotion.warm.title": "Begynn å bytte på Unichain", - "uniswapX.aggregatesLiquidity": " samler likviditetskilder for bedre priser og gassfrie bytteavtaler.", - "uniswapx.description": "UniswapX samler likviditetskilder for bedre priser og gassfrie bytteavtaler.", - "uniswapx.included": "Inkluderer UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "Lær mer om å bytte med UniswapX", - "uniswapx.v2QuoteFailed": "UniswapX v2 hardt sitat mislyktes. Prøv igjen med klassisk bytte.", - "unitags.banner.button.claim": "Krev nå", - "unitags.banner.subtitle": "Bygg en personlig web3-profil og del enkelt adressen din med venner.", - "unitags.banner.title.compact": "Gjør krav på {{unitagDomain}} brukernavnet ditt og bygg ut din tilpassbare profil.", - "unitags.banner.title.full": "Gjør krav på ditt {{unitagDomain}} brukernavn", - "unitags.choosePhoto.option.cameraRoll": "Velg fra kamerarull", - "unitags.choosePhoto.option.computer": "Last opp fra datamaskinen", - "unitags.choosePhoto.option.nft": "Velg en NFT", - "unitags.choosePhoto.option.remove": "Fjern profilbilde", - "unitags.claim.confirmation.customize": "Tilpass profil", - "unitags.claim.confirmation.description": "{{unitagAddress}} er klar til å sende og motta krypto. Fortsett å bygge ut lommeboken din ved å tilpasse web3-profilen din.", - "unitags.claim.confirmation.success.long": "Du har det!", - "unitags.claim.confirmation.success.short": "har det!", - "unitags.claim.error.addressLimit": "Du har allerede gjort det maksimale antallet endringer i brukernavnet ditt for denne adressen", - "unitags.claim.error.appCheck": "Kunne ikke gjøre krav på brukernavn. Prøv igjen i morgen.", - "unitags.claim.error.avatar": "Kunne ikke angi avatar. Prøv igjen senere.", - "unitags.claim.error.default": "Kunne ikke gjøre krav på brukernavn. Prøv igjen senere.", - "unitags.claim.error.deviceLimit": "Du har nådd det maksimale antallet brukernavn som kan være aktive for denne enheten", - "unitags.claim.error.general": "Kan ikke gjøre krav på brukernavn", - "unitags.claim.error.unavailable": "Brukernavnet er ikke tilgjengelig", - "unitags.claim.error.unknown": "Ukjent feil", - "unitags.claim.username.default": "navnet ditt", - "unitags.delete.confirm.subtitle": "Du er i ferd med å slette brukernavnet og tilpassbare profildetaljer. Du vil ikke kunne kreve det tilbake.", - "unitags.delete.confirm.title": "Er du sikker?", - "unitags.editProfile.placeholder": "brukernavn", - "unitags.editUsername.confirm.subtitle": "Du er i ferd med å endre brukernavnet ditt. Når du først har endret det, kan du aldri kreve det igjen.", - "unitags.editUsername.confirm.title": "Er du sikker?", - "unitags.editUsername.title": "Rediger brukernavnet ditt", - "unitags.editUsername.warning.default": "Når du har endret brukernavnet ditt, kan du aldri gjøre krav på det igjen. Du kan bare endre den 2 ganger.", - "unitags.editUsername.warning.max": "Du har nådd det maksimale antallet 2 brukernavnendringer.", - "unitags.extension.intro.buttton": "Gjør krav på et brukernavn", - "unitags.extension.intro.description": "Si farvel til 0x-adresser. Brukernavn er lesbare navn som gjør det enklere å sende og motta krypto.", - "unitags.extension.intro.title": "Vi introduserer brukernavn", - "unitags.extension.intro.upsell.customizable": "Tilpassbare profiler", - "unitags.extension.intro.upsell.ens": "Drevet av ENS underdomener", - "unitags.extension.intro.upsell.free": "Gratis å kreve", - "unitags.intro.features.ens": "Drevet av ENS underdomener", - "unitags.intro.features.free": "Gratis å kreve", - "unitags.intro.features.profile": "Tilpassbare profiler", - "unitags.intro.subtitle": "Si farvel til 0x-adresser. Brukernavn er lesbare navn som gjør det enklere å sende og motta krypto.", - "unitags.intro.title": "Vi introduserer brukernavn", - "unitags.notification.delete.error": "Kunne ikke slette brukernavnet. Prøv igjen senere.", - "unitags.notification.delete.title": "Brukernavnet er slettet", - "unitags.notification.profile.error": "Kunne ikke oppdatere profilen. Prøv igjen senere.", - "unitags.notification.profile.title": "Profil oppdatert", - "unitags.notification.username.error": "Kunne ikke endre brukernavn. Prøv igjen senere.", - "unitags.notification.username.title": "Brukernavn endret", - "unitags.onboarding.claim.subtitle": "Dette er din personlige adresse som folk kan sende krypto til.", - "unitags.onboarding.claim.title.choose": "Opprett brukernavnet ditt", - "unitags.onboarding.claim.title.claim": "Gjør krav på brukernavnet ditt", - "unitags.onboarding.info.description": "Brukernavn forvandler komplekse 0x-adresser til lesbare navn. Ved å kreve et {{unitagDomain}} brukernavn kan du enkelt sende og motta krypto og bygge ut en offentlig web3-profil.", - "unitags.onboarding.info.title": "En forenklet adresse", - "unitags.onboarding.profile.subtitle": "Last opp din egen eller hold deg til din unike Unicon. Du kan alltid endre dette senere.", - "unitags.onboarding.profile.title": "Velg et profilbilde", - "unitags.profile.action.delete": "Slett brukernavn", - "unitags.profile.action.edit": "Rediger brukernavn", - "unitags.profile.bio.label": "Bio", - "unitags.profile.bio.placeholder": "Skriv inn en biografi for profilen din", - "unitags.profile.links.twitter": "Twitter", - "unitags.username.error.chars": "Brukernavn kan bare inneholde bokstaver og tall", - "unitags.username.error.max": "Brukernavn kan ikke være mer enn {{number}} tegn", - "unitags.username.error.min": "Brukernavn må inneholde minst {{number}} tegn", - "unitags.username.error.uppercase": "Brukernavn kan bare inneholde små bokstaver og tall", - "uwulink.error.insufficientTokens": "Ikke nok {{tokenSymbol}} på {{chain}}", - "v2.notAvailable": "Uniswap V2 er ikke tilgjengelig på dette nettverket.", - "v2.switchTo": "Bytt til v2", - "v3.blast.yield.usdbAndWeth": "På Blast rebaserer USDB og WETH tokens som automatisk gir avkastning. På grunn av inkompatibilitet med Uniswap v3, vil LP-posisjoner med USDB eller WETH ikke tjene rebasing yield, men vil i Uniswap v2.", - "v3.continue": "Fortsett på v3", - "v3.rebase.unavailable": "Rebasing er utilgjengelig på v3", - "wallet.appSignIn": "Logg på med appen", - "wallet.connectingAgreement": "Ved å koble til en lommebok godtar du Uniswap Labs' vilkår for bruk og samtykker til deres personvernregler.", - "wallet.connectionFailed.message": "Tilkoblingsforsøket mislyktes. Klikk prøv igjen og følg trinnene for å koble til i lommeboken.", - "wallet.other": "Andre lommebøker", - "wallet.scanToConnect": "Skann QR-koden for å koble til", - "wallet.wrongNet": "Lommeboken din er koblet til feil nettverk.", - "walletConnect.dapps.connection": "Koblet til {{dappNameOrUrl}}", - "walletConnect.dapps.empty.description": "Koble til en app ved å skanne en kode via WalletConnect", - "walletConnect.dapps.manage.empty.title": "Ingen apper er tilkoblet", - "walletConnect.dapps.manage.title": "Tilkoblinger", - "walletConnect.error.connection.message": "Uniswap Wallet støtter for øyeblikket {{chainNames}}. Vennligst bruk bare \"{{dappName}}\" på disse kjedene", - "walletConnect.error.connection.title": "Tilkoblingsfeil", - "walletConnect.error.general.message": "Det var et problem med WalletConnect. Vær så snill, prøv på nytt", - "walletConnect.error.general.title": "WalletConnect-feil", - "walletConnect.error.scantastic.message": "Det var et problem med QR-koden din. Vær så snill, prøv på nytt", - "walletConnect.error.scantastic.title": "Ugyldig QR-kode", - "walletConnect.error.unsupported.message": "Sørg for at du skanner en gyldig WalletConnect-, Ethereum-adresse eller Uniswap Extension QR-kode før du prøver igjen.", - "walletConnect.error.unsupported.title": "Ugyldig QR-kode", - "walletConnect.error.unsupportedV1.message": "WalletConnect v1 støttes ikke lenger. Appen du prøver å koble til må oppgraderes til WalletConnect v2.", - "walletConnect.error.unsupportedV1.title": "Ugyldig QR-kode", - "walletConnect.error.uwu.scan": "Det oppsto et problem med å skanne denne QR-koden.", - "walletConnect.error.uwu.title": "UwU-koblingsfeil", - "walletConnect.error.uwu.unsupported": "Denne QR-koden støttes ikke.", - "walletConnect.pending.button.connect": "Koble", - "walletConnect.pending.button.scrollDown": "Rull ned for å koble til", - "walletConnect.pending.switchAccount": "Bytt konto", - "walletConnect.pending.switchNetwork": "Bytt nettverk", - "walletConnect.pending.title": "Koble til {{dappName}}", - "walletConnect.permissions.option.transferAssets": "Overfør eiendelene dine uten samtykke", - "walletConnect.permissions.option.viewTokenBalances": "Se symbolsaldoene dine", - "walletConnect.permissions.option.viewWalletAddress": "Se lommebokadressen din", - "walletConnect.permissions.title": "Nettstedstillatelser", - "walletConnect.request.button.scrollDown": "Rull ned for å signere", - "walletConnect.request.button.sign": "Skilt", - "walletConnect.request.details.label.function": "Funksjon", - "walletConnect.request.details.label.sending": "Sender", - "walletConnect.request.details.label.token": "Token", - "walletConnect.request.details.label.tokens": "Tokens", - "walletConnect.request.error.insufficientFunds": "Du har ikke nok {{currencySymbol}} til å fullføre denne transaksjonen.", - "walletConnect.request.error.network": "Internett- eller nettverkstilkoblingsfeil", - "walletConnect.request.warning.general.message": "Vær forsiktig: denne meldingen kan overføre eiendeler", - "walletConnect.request.warning.message": "For å signere meldinger eller transaksjoner, må du importere lommebokens gjenopprettingsfrase.", - "walletConnect.request.warning.title": "Denne lommeboken er i visningsbeskyttet modus", - "web.explore.description": "Oppdag og undersøk tokens på {{network}}. Utforsk de beste bassengene. Se sanntidspriser, handelsvolum, TVL, diagrammer og transaksjonsdata.", - "web.explore.title.pools": "Utforsk de beste bassengene på {{network}} på Uniswap", - "web.explore.title.tokens": "Utforsk de beste symbolene på {{network}} på Uniswap", - "web.explore.title.transactions": "Utforsk de beste transaksjonene på {{network}} på Uniswap" -} diff --git a/packages/uniswap/src/i18n/locales/translations/pl-PL.json b/packages/uniswap/src/i18n/locales/translations/pl-PL.json deleted file mode 100644 index 29ec82c2163..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/pl-PL.json +++ /dev/null @@ -1,2563 +0,0 @@ -{ - "account.authHeader.claimReward": "Odbierz nagrodę {{amount}}", - "account.cloud.backup.subtitle": "Na {{cloudProviderName}}znajduje się kopia zapasowa wielu fraz odzyskiwania.", - "account.cloud.backup.title": "Wybierz kopię zapasową do przywrócenia", - "account.cloud.button.restore.android": "Przywróć z Dysku Google", - "account.cloud.button.restore.ios": "Przywróć z iCloud", - "account.cloud.empty.description": "Wygląda na to, że nie utworzono kopii zapasowej żadnych fraz odzyskiwania w {{cloudProviderName}}.", - "account.cloud.empty.title": "Znaleziono 0 kopii zapasowych", - "account.cloud.error.backup.message": "Nie udało się zaimportować kopii zapasowych z powodu braku uprawnień, przerwania autoryzacji lub błędu chmury", - "account.cloud.error.backup.title": "Błąd podczas importowania kopii zapasowych", - "account.cloud.error.password.title": "Nieprawidłowe hasło. Proszę spróbuj ponownie.", - "account.cloud.error.unavailable.button.cancel": "Nie teraz", - "account.cloud.error.unavailable.button.settings": "Przejdź do ustawień", - "account.cloud.error.unavailable.message.android": "Sprawdź, czy jesteś zalogowany na konto Google z włączonym Dyskiem Google na tym urządzeniu i spróbuj ponownie.", - "account.cloud.error.unavailable.message.ios": "Sprawdź, czy jesteś zalogowany na koncie Apple ID z włączoną usługą iCloud Drive na tym urządzeniu i spróbuj ponownie.", - "account.cloud.error.unavailable.title.android": "Dysk Google jest niedostępny", - "account.cloud.error.unavailable.title.ios": "Dysk iCloud jest niedostępny", - "account.cloud.loading.title": "Wyszukiwanie kopii zapasowych...", - "account.cloud.lockout.time.hours_one": "Zbyt wiele prób. Spróbuj ponownie za 1 godzinę.", - "account.cloud.lockout.time.hours_other": "Zbyt wiele prób. Spróbuj ponownie za {{count}} godzin.", - "account.cloud.lockout.time.minutes_one": "Zbyt wiele prób. Spróbuj ponownie za 1 minutę.", - "account.cloud.lockout.time.minutes_other": "Zbyt wiele prób. Spróbuj ponownie za {{count}} minut.", - "account.cloud.password.input": "Wprowadź hasło", - "account.cloud.password.recoveryPhrase": "Zamiast tego wpisz frazę odzyskiwania", - "account.cloud.password.subtitle": "To hasło jest wymagane do odzyskania kopii zapasowej frazy odzyskiwania z {{cloudProviderName}}.", - "account.cloud.password.title": "Wprowadź hasło zapasowe", - "account.downloadWallet.subtitle": "Twórz kopie zapasowe swojego portfela, handluj w podróży, otrzymuj alerty o cenach na żywo i wiele więcej.", - "account.drawer.gitHash": "Skrót Git: ", - "account.drawer.gitVersion": "Wersja: ", - "account.drawer.modal.body": "Bezpiecznie przechowuj i wymieniaj tokeny za pomocą aplikacji Uniswap. Dostępne na iOS i Androida.", - "account.drawer.modal.dont": "Nie masz portfela Uniswap?", - "account.drawer.modal.scan": "Zeskanuj za pomocą portfela Uniswap", - "account.drawer.spamToggle": "Ukryj nieznane tokeny i NFT", - "account.passkey.delete.acknowledge": "Zrobiłem kopię zapasową swojej frazy odzyskiwania i rozumiem, że Uniswap Labs nie będzie mogło mi pomóc w odzyskaniu portfela, jeśli tego nie zrobię.", - "account.passkey.delete.description": "Upewnij się, że wykonałeś kopię zapasową frazy odzyskiwania za pomocą aplikacji mobilnej Uniswap lub rozszerzenia przeglądarki.", - "account.passkey.delete.descriptionEmphasized": "Bez hasła odzyskiwania możesz nie mieć dostępu do swojego portfela.", - "account.passkey.delete.speedbump.description": "Zanim przejdziesz dalej, wykonaj poniższe czynności, aby nie utracić dostępu do portfela i wszystkich środków.", - "account.passkey.delete.speedbump.step1": "Pobierz aplikację mobilną Uniswap lub rozszerzenie przeglądarki", - "account.passkey.delete.speedbump.step2": "Utwórz kopię zapasową frazy odzyskiwania", - "account.passkey.delete.speedbump.title": "Jesteś pewny?", - "account.passkey.delete.title": "Usunąć klucz dostępu?", - "account.passkey.log.in.title": "Zaloguj się za pomocą klucza dostępu", - "account.passkey.type.crossplatform": "Telefon, tablet lub klucz bezpieczeństwa", - "account.passkey.type.platform": "Przeglądarka lub system operacyjny", - "account.passkey.verify.button": "Zweryfikuj za pomocą klucza", - "account.passkey.verify.description": "Zanim przejdziesz dalej, użyj swojego klucza, aby zweryfikować swoją tożsamość. Pomaga to zachować bezpieczeństwo Twojego konta.", - "account.passkey.verify.title": "Najpierw sprawdźmy, czy to Ty", - "account.portfolio.activity.canceledBelow": "To zamówienie zostało anulowane, ponieważ saldo spadło poniżej wprowadzonej kwoty.", - "account.portfolio.activity.signLimit": "To zamówienie nie zostanie zrealizowane, ponieważ saldo spadło poniżej wprowadzonej kwoty. Zwiększ swoje saldo, aby to naprawić.", - "account.recoveryPhrase.education.part1": "Fraza odzyskiwania (lub fraza początkowa) to zestaw słów wymaganych do uzyskania dostępu do portfela, jak hasło.", - "account.recoveryPhrase.education.part2": "Możesz wprowadzić frazę odzyskiwania na nowym urządzeniu , aby przywrócić portfel i jego zawartość.", - "account.recoveryPhrase.education.part3": "Ale jeśli utracisz frazę odzyskiwania, stracisz dostęp do swojego portfela.", - "account.recoveryPhrase.education.part4": "Zamiast zapamiętywać frazę odzyskiwania, możesz wykonać jej kopię zapasową do {{cloudProviderName}} i zabezpieczyć ją hasłem.", - "account.recoveryPhrase.education.part5": "Możesz także ręcznie wykonać kopię zapasową frazy odzyskiwania, zapisując ją i przechowując w bezpiecznym miejscu.", - "account.recoveryPhrase.education.part6": "Zalecamy używanie obu typów kopii zapasowych, ponieważ jeśli zgubisz frazę odzyskiwania, nie będziesz mógł przywrócić swojego portfela.", - "account.recoveryPhrase.error.invalid": "Nieprawidłowe wyrażenie", - "account.recoveryPhrase.error.invalidWord": "Nieprawidłowe słowo: {{word}}", - "account.recoveryPhrase.error.phraseLength": "Fraza odzyskiwania musi składać się z 12–24 słów", - "account.recoveryPhrase.error.wordIsAddress": "Wprowadzono adres, a nie frazę odzyskiwania", - "account.recoveryPhrase.error.wrong": "Błędne zdanie dotyczące odzyskiwania", - "account.recoveryPhrase.helpText.import": "Jak znaleźć frazę odzyskiwania?", - "account.recoveryPhrase.helpText.restoring": "Spróbuj wyszukać ponownie", - "account.recoveryPhrase.input": "Wpisz frazę odzyskiwania", - "account.recoveryPhrase.remove.final.description": "Upewnij się, że zapisałeś frazę odzyskiwania lub utworzyłeś jej kopię zapasową na {{cloudProviderName}}. W przeciwnym razie nie będziesz mieć dostępu do swoich środków.", - "account.recoveryPhrase.remove.final.title": "Usuwasz frazę odzyskiwania", - "account.recoveryPhrase.remove.import.description": "Jednocześnie można zapisać tylko jedną frazę odzyskiwania. Aby kontynuować importowanie nowego, musisz usunąć z tego urządzenia bieżącą frazę odzyskiwania i wszystkie powiązane portfele.", - "account.recoveryPhrase.remove.initial.description": "Spowoduje to usunięcie Twojego portfela z tego urządzenia wraz z frazą odzyskiwania.", - "account.recoveryPhrase.remove.initial.title": "Usuwasz {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "Twoja fraza odzyskiwania będzie przechowywana do momentu usunięcia wszystkich pozostałych portfeli.", - "account.recoveryPhrase.subtitle.import": "Twoja fraza odzyskiwania będzie przechowywana wyłącznie lokalnie na Twoim urządzeniu.", - "account.recoveryPhrase.subtitle.restoring": "Wpisz poniżej frazę odzyskiwania lub spróbuj ponownie wyszukać kopie zapasowe.", - "account.recoveryPhrase.title.import": "Wpisz frazę odzyskiwania", - "account.recoveryPhrase.title.restoring": "Nie znaleziono kopii zapasowych", - "account.wallet.action.copy": "Kopiuj adres", - "account.wallet.action.manageConnections": "Zarządzaj połączeniami", - "account.wallet.action.report": "Zgłoś profil", - "account.wallet.action.viewExplorer": "Zobacz na {{blockExplorerName}}", - "account.wallet.button.add": "Dodaj portfel", - "account.wallet.button.addViewOnly": "Dodaj portfel tylko do przeglądania", - "account.wallet.button.create": "Utwórz nowy portfel", - "account.wallet.button.import": "Zaimportuj nowy portfel", - "account.wallet.button.manage": "Ustawienia portfela", - "account.wallet.button.remove": "Usuń portfel", - "account.wallet.button.watch": "Obserwuj portfel", - "account.wallet.create.placeholder": "Portfel {{index}}", - "account.wallet.edit.label.input.placeholder": "Etykieta portfela", - "account.wallet.header.button.disabled.title": "Edytuj profil", - "account.wallet.header.button.title": "Edytuj etykietę", - "account.wallet.header.viewOnly": "Portfele tylko do przeglądania", - "account.wallet.menu.claimUsername": "Złóż wniosek o nazwę użytkownika", - "account.wallet.menu.copy.title": "Skopiuj adres portfela", - "account.wallet.menu.edit.title": "Edytuj etykietę", - "account.wallet.menu.manageConnections": "Zarządzać połączeniami", - "account.wallet.menu.remove.title": "Usuń portfel", - "account.wallet.remove.check": "Utworzyłem kopię zapasową hasła odzyskiwania i rozumiem, że Uniswap Labs nie pomoże mi odzyskać portfeli, jeśli tego nie zrobię.", - "account.wallet.remove.title": "Usuń {{name}}", - "account.wallet.remove.viewOnly": "Zawsze możesz dodać portfele tylko do widoku wstecznego, wprowadzając adres portfela.", - "account.wallet.restore.new_device.description": "Ponieważ korzystasz z nowego urządzenia, aby kontynuować, musisz przywrócić frazę odzyskiwania lub wprowadzić hasło do kopii zapasowej w chmurze.", - "account.wallet.restore.new_device.title": "Odzyskaj swój portfel", - "account.wallet.restore.seed_phrase.description": "Fraza odzyskiwania zniknęła z Twojego urządzenia. Aby mieć pewność, że nigdy nie utracisz dostępu do swoich środków, będziemy potrzebować przywrócenia Twojego portfela.", - "account.wallet.restore.seed_phrase.title": "Przywróć swój portfel", - "account.wallet.select.error": "Nie udało się wczytać adresów", - "account.wallet.select.loading.subtitle": "Twoje portfele pojawią się poniżej.", - "account.wallet.select.loading.title": "Szukanie portfeli", - "account.wallet.select.smartWalletDisclaimer": "Domyślnie wszystkie kwalifikujące się portfele będą korzystać z funkcji inteligentnego portfela po zaimportowaniu. Czym jest inteligentny portfel?", - "account.wallet.select.title_one_one": "Znaleziono jeden portfel", - "account.wallet.select.title_one_other": "Wybierz portfele do zaimportowania", - "account.wallet.viewOnly.button": "Importuj portfel", - "account.wallet.viewOnly.description": "Aby wymieniać, kupować, wysyłać i odbierać tokeny, musisz zaimportować frazę odzyskiwania tego portfela.", - "account.wallet.viewOnly.title": "Ten portfel można tylko przeglądać", - "account.wallet.watch.error.alreadyImported": "Ten adres został już zaimportowany", - "account.wallet.watch.error.notFound": "Adres nie znaleziony", - "account.wallet.watch.error.smartContract": "Adres to inteligentna umowa", - "account.wallet.watch.message": "Dodanie portfela tylko do przeglądania umożliwia wypróbowanie aplikacji lub śledzenie portfela. Nie będziesz mógł wymieniać ani wysyłać środków.", - "account.wallet.watch.placeholder": "ENS lub adres", - "account.wallet.watch.title": "Wpisz adres portfela", - "activity.pending": "{{pendingActivityCount}} Oczekuje", - "activity.transaction.lpRewards.descriptor": "{{symbol}} zebrano nagrody", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} do {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} dla {{amountWithSymbolB}}", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} i {{amountWithSymbolB}}", - "addLiquidity.shareOfPool": "Udział w basenie", - "addressInput.recipient": "Odbiorca", - "analytics.allow": "Zezwól na analizę", - "analytics.allow.message": "Używamy anonimowych danych, aby poprawić Twoje doświadczenia z produktami Uniswap Labs.", - "appRating.button.notReally": "Nie bardzo", - "appRating.description": "Daj nam znać, jeśli masz dobre doświadczenia z tą aplikacją", - "appRating.extension.review.description": "Wybierz ocenę gwiazdkową i zostaw recenzję w Chrome Web Store.", - "appRating.extension.review.title": "Przejrzyj rozszerzenie Uniswap?", - "appRating.extension.title": "Podoba Ci się rozszerzenie Uniswap?", - "appRating.feedback.button.send": "Wyślij opinię", - "appRating.feedback.description": "Daj nam znać, jak możemy ulepszyć Twoje doświadczenie", - "appRating.feedback.title": "Przykro nam to słyszeć.", - "appRating.mobile.title": "Podoba Ci się portfel Uniswap?", - "bridgedAsset.modal.button": "Kontynuuj zamianę", - "bridgedAsset.modal.description": "Jest to wersja {{chainName}} {{currencySymbol}} , która jest wspierana i utrzymuje tę samą cenę co natywna {{currencySymbol}}.", - "bridgedAsset.modal.feature.securelyBacked": "Bezpiecznie zabezpieczone", - "bridgedAsset.modal.feature.securelyBacked.description": "1:1 wspierane przez natywny {{currencySymbol}}.", - "bridgedAsset.modal.feature.tradeSeamlessly": "Handluj bezproblemowo", - "bridgedAsset.modal.feature.tradeSeamlessly.description": "Kupuj i sprzedawaj {{currencySymbol}} bez opuszczania Uniswap.", - "bridgedAsset.modal.feature.withdrawToNativeChain": "Wycofaj się do {{nativeChainName}}", - "bridgedAsset.modal.feature.withdrawToNativeChain.description": "Możliwość powrotu do sieci macierzystej w dowolnym momencie.", - "bridgedAsset.modal.title": "Handluj {{currencySymbol}} na {{chainName}}", - "bridgedAsset.send.warning.description": "Wysyłasz opakowaną wersję {{currencySymbol}} na {{chainName}}. Wysłanie jej na scentralizowaną giełdę spowoduje trwałą utratę środków.", - "bridgedAsset.send.warning.title": "Upewnij się, że wysyłasz na zgodny adres", - "bridgedAsset.tdp.description": "Jest to wersja pomostowa {{currencySymbol}} oparta w stosunku 1:1 na natywnym {{currencySymbol}}.", - "bridgedAsset.wormhole.button": "Kontynuuj do tunelu czasoprzestrzennego", - "bridgedAsset.wormhole.description": "Przejdź do portalu Wormhole, aby połączyć {{currencySymbol}} z {{chainName}} do {{nativeChainName}}.", - "bridgedAsset.wormhole.title": "Wycofaj {{currencySymbol}} do {{nativeChainName}}", - "bridgedAsset.wormhole.toNativeChain": "do {{nativeChainName}}", - "bridgedAsset.wormhole.withdrawToNativeChain": "Wycofaj się do {{nativeChainName}}", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}minuta {{seconds}}sekunda", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}minuta", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "chart.candlestick": "Świecznik", - "chart.error.pools": "Nie można wyświetlić danych historycznych dla bieżącej puli.", - "chart.error.tokens": "Nie można wyświetlić danych historycznych dla bieżącego tokena.", - "chart.line": "Wykres liniowy", - "chart.missingData": "Brak danych wykresu", - "chart.price.label.close": "Zamknąć", - "chart.price.label.high": "Wysoki", - "chart.price.label.low": "Niski", - "chart.price.label.open": "otwarty", - "chart.settings.unavailable.label": "To ustawienie jest niedostępne dla bieżącego wykresu", - "claim.thanks": "Dziękujemy za bycie częścią społeczności Uniswap ", - "claim.uni.arrived": "UNI przybyło", - "common.about": "O", - "common.accept": "Zaakceptować", - "common.active": "Aktywny", - "common.activeNetworks": "Aktywne sieci", - "common.activity": "Działalność", - "common.add.label": "Dodać", - "common.add.liquidity.canceled": "Dodanie płynności anulowane", - "common.addLiquidity": "Dodaj płynność", - "common.address": "Adres", - "common.addressOrENS": "Adres portfela lub nazwa ENS", - "common.advanced": "Zaawansowany", - "common.all": "Wszystko", - "common.allTime": "Cały czas", - "common.and": "I", - "common.app": "Aplikacja", - "common.approved": "Zatwierdzony", - "common.approvePending": "Oczekiwanie na zatwierdzenie...", - "common.approvePermitTx": "Zatwierdź prośbę {{indexText}}", - "common.approvePermitTx.active": "Zatwierdź żądanie{{indexText}} w portfelu", - "common.approvePermitTx.explainer": "Czym są zatwierdzenia Permit2?", - "common.approvePermitTx.pending": "Zatwierdzanie żądania {{indexText}}...", - "common.approveSpend": "Zatwierdź wydatki {{symbol}}", - "common.approving": "Pochlebny", - "common.approximatelyValue": "~{{value}}", - "common.areYouSure": "Jesteś pewny?", - "common.automatic": "Automatyczny", - "common.availableIn": "Uniswap dostępny w: ", - "common.availableOnIOSAndroidChrome": "Dostępne na iOS, Androida i Chrome", - "common.backToPositions": "Powrót do pozycji", - "common.bestRoute": "Trasa", - "common.bestRoute.with": "Trasa przez {{provider}}", - "common.biometrics.generic": "Biometria", - "common.biometrics.touchId": "Dotyk ID", - "common.biometrics.windowsHello": "Witamy w systemie Windows", - "common.blocked.ifError": "Jeśli uważasz, że to pomyłka, wyślij e-mail zawierający swój adres na adres ", - "common.blocked.reason": "Ten adres jest zablokowany w interfejsie Uniswap Labs, ponieważ jest powiązany z jedną lub większą liczbą zablokowanych działań.", - "common.blockedAddress": "Zablokowany adres", - "common.blog": "Blog", - "common.bought": "Kupił", - "common.brandAssets": "Aktywa marki", - "common.button.accept": "Zaakceptować", - "common.button.back": "Z powrotem", - "common.button.buy": "Kupić", - "common.button.cancel": "Anulować", - "common.button.checkin": "Zameldować się", - "common.button.close": "Zamknąć", - "common.button.confirm": "Potwierdzać", - "common.button.connect": "Łączyć", - "common.button.continue": "Kontynuować", - "common.button.copied": "Skopiowano", - "common.button.copy": "Kopiuj", - "common.button.create": "Tworzyć", - "common.button.delete": "Usuwać", - "common.button.disable": "Wyłączyć", - "common.button.disabling": "Wyłączanie", - "common.button.disconnect": "Rozłączyć się", - "common.button.dismiss": "Odrzucać", - "common.button.done": "Zrobione", - "common.button.edit": "Edytować", - "common.button.enable": "Włączać", - "common.button.finish": "Skończyć", - "common.button.goBack": "Wróć", - "common.button.later": "Może później", - "common.button.learn": "Ucz się więcej", - "common.button.next": "Następny", - "common.button.notNow": "Nie teraz", - "common.button.ok": "OK", - "common.button.paste": "Pasta", - "common.button.pay": "Płacić", - "common.button.proceed": "Przystępować", - "common.button.receive": "Odbierać", - "common.button.remove": "Usunąć", - "common.button.reset": "Nastawić", - "common.button.retry": "Spróbować ponownie", - "common.button.reveal": "Ujawnić", - "common.button.review": "Recenzja", - "common.button.save": "Ratować", - "common.button.scrollDown": "Przewiń w dół", - "common.button.sell": "Sprzedać", - "common.button.send": "Wysłać", - "common.button.setup": "Organizować coś", - "common.button.share": "Udział", - "common.button.showLess": "Pokaż mniej", - "common.button.showMore": "Pokaż więcej", - "common.button.sign": "Podpisać", - "common.button.skip": "Pominąć", - "common.button.swap": "Zamieniać", - "common.button.tryAgain": "Spróbuj ponownie", - "common.button.understand": "Rozumiem", - "common.button.unlock": "Odblokować", - "common.button.view": "Pogląd", - "common.button.viewDetails": "Zobacz szczegóły", - "common.button.yes": "Tak", - "common.buy.label": "Kupić", - "common.buyAndSell": "Kupuj i sprzedawaj na Uniswap", - "common.cancellationSubmitted": "Anulowanie przesłane", - "common.cancellationSuccessful": "Anulowanie powiodło się", - "common.cancelOrder": "Anuluj zamówienie", - "common.card.error.description": "Coś poszło nie tak", - "common.card.error.title": "Ups! Coś poszło nie tak.", - "common.careers": "Kariery", - "common.chain.networkCost": "{{chain}} koszt sieci", - "common.chart": "Wykres", - "common.checkNetwork": "Sprawdź status sieci tutaj.", - "common.chromeExtension": "Rozszerzenie", - "common.claim.failed": "Reklamacja nie powiodła się", - "common.claimed": "Przejęte", - "common.claiming": "Twierdzenie", - "common.claimUnis": "Odbierz swoje tokeny UNI", - "common.clear": "Jasne", - "common.close": "Zamknąć", - "common.closed": "Zamknięte", - "common.collect.button": "Zbierać", - "common.company": "Firma", - "common.confirm": "Potwierdzać", - "common.confirmCancellation": "Potwierdź anulowanie", - "common.confirmed": "Potwierdzony", - "common.confirmSend.button": "Potwierdź wysłanie", - "common.confirmSwap": "Potwierdź zamianę w portfelu", - "common.confirmTimedOut": "Upłynął limit czasu potwierdzenia. Proszę spróbuj ponownie.", - "common.confirmTransfer": "Potwierdź przelew", - "common.confirmWallet": "Potwierdź w portfelu", - "common.connect.button": "Łączyć", - "common.connectAWallet.button": "Podłącz portfel", - "common.connectAWallet.button.evm": "Połącz portfel Ethereum", - "common.connectAWallet.button.evm.switch": "Przełącz portfel Ethereum", - "common.connectAWallet.button.svm": "Połącz portfel Solana", - "common.connectAWallet.button.svm.switch": "Przełącz portfel Solana", - "common.connectAWallet.button.switch": "Zmień portfel", - "common.connectTo": "Połącz się z {{platform}}", - "common.connectWallet.button": "Podłącz portfel", - "common.contactUs.button": "Skontaktuj się z nami", - "common.copied": "Skopiowano", - "common.copy.address": "Kopiuj adres", - "common.copy.poolId": "Kopiuj identyfikator puli", - "common.copyLink.button": "Skopiuj link", - "common.created.date": "Utworzono {{date}}", - "common.currency": "Waluta", - "common.currentPrice": "Aktualna cena", - "common.custom": "Zwyczaj", - "common.customRange": "Zakres niestandardowy", - "common.dataOutdated": "Dane mogą być nieaktualne", - "common.day": "dzień", - "common.default": "Domyślny", - "common.defaultTradeOptions": "Domyślne opcje handlu", - "common.deposit.toNetwork": "Wpłać tokeny do sieci {{label}} .", - "common.depositing": "Deponowanie", - "common.depositTokens": "Depozyt tokenów", - "common.detected": "Wykryto", - "common.developers": "Deweloperzy", - "common.device": "To urządzenie", - "common.device.other": "Inne urządzenie", - "common.dismiss": "Odrzucać", - "common.docs": "Dokumenty", - "common.donate": "Podarować", - "common.done": "Zrobione", - "common.dontShowAgain": "Nie pokazuj tego ponownie", - "common.download": "Pobierać", - "common.downloadAppStore": "Pobierz w App Store", - "common.downloadPlayStore": "Pobierz w sklepie Play", - "common.downloadUniswapApp": "Pobierz aplikację Uniswap", - "common.downloadUniswapWallet": "Pobierz portfel Uniswap", - "common.dynamic": "Dynamiczny", - "common.edit.button": "Edytować", - "common.ended": "Zakończone", - "common.error.details": "Szczegóły błędu", - "common.error.general": "Coś poszło nie tak", - "common.error.label": "Błąd", - "common.error.request": "Przepraszamy, wystąpił błąd podczas przetwarzania Twojego żądania. Jeśli poprosisz o pomoc, pamiętaj o skopiowaniu szczegółów tego błędu.", - "common.error.somethingWrong": "Coś poszło nie tak!", - "common.errorConnecting.error": "Błąd połączenia", - "common.errorLoadingData.error": "Błąd ładowania danych", - "common.etherscan": "Etherscan", - "common.expiry": "Wygaśnięcie", - "common.explore": "Badać", - "common.explorer": "poszukiwacz", - "common.exploreTokens": "Przeglądaj tokeny", - "common.extension": "Rozszerzenie Uniswap", - "common.failedSwitchNetwork": "Nie udało się przełączyć sieci", - "common.fee": "Opłata", - "common.fees": "Opłaty", - "common.feesEarned": "Opłaty zarobione", - "common.feesEarnedPerBase": "{{symbolA}} na {{symbolB}}", - "common.for": "Dla", - "common.free": "Bezpłatny", - "common.fullRange": "Pełny zasięg", - "common.getApp": "Ściągnij aplikację", - "common.getHelp.button": "Sprowadź pomoc", - "common.getStarted": "Zacznij", - "common.getSupport.button": "Uzyskać wsparcie", - "common.getTheApp": "Pobierz aplikację", - "common.getUniswapWallet": "Zdobądź portfel Uniswap", - "common.getUniswapWallet.mobile": "Pobierz aplikację mobilną Uniswap", - "common.governance": "Zarządzanie", - "common.happyHolidays": "Wesołych Świąt życzy zespół Uniswap!", - "common.help": "Pomoc", - "common.helpCenter": "Centrum pomocy", - "common.hidden": "Ukryty", - "common.hide.button": "Ukrywać", - "common.highPrice": "Wysoka cena", - "common.includes": "Zawiera", - "common.info.label": "Informacje", - "common.input.noRecipient.error": "Wybierz odbiorcę", - "common.input.password.confirm": "Potwierdź hasło", - "common.input.password.error.mismatch": "Hasła nie pasują", - "common.input.password.error.weak": "To hasło jest za słabe", - "common.input.password.new": "Nowe hasło", - "common.input.password.placeholder": "Hasło", - "common.input.password.strength.medium": "Średni", - "common.input.password.strength.strong": "Mocny", - "common.input.password.strength.weak": "Słaby", - "common.input.search": "Szukaj", - "common.insufficient.funds": "Niewystarczające środki", - "common.insufficientBalance.error": "Niewystarczająca ilość środków", - "common.insufficientFundsForNetworkFee.error": "Niewystarczające środki na pokrycie kosztów sieci", - "common.insufficientTokenBalance.error": "Niewystarczające saldo {{tokenSymbol}}", - "common.insufficientTokenBalance.error.simple": "Za mało {{tokenSymbol}}", - "common.invalidPair": "Nieprawidłowa para", - "common.invalidRecipient.error": "Nieprawidłowy odbiorca", - "common.iOSAndroid": "iOS i Androida", - "common.language": "Język", - "common.learnMoreSwap": "Dowiedz się więcej o swapach", - "common.legalAndPrivacy": "Informacje prawne i prywatność", - "common.less": "Mniej", - "common.limit.cancel_one": "Anuluj limit", - "common.limit.cancel_other": "Anuluj limity {{count}}", - "common.limit.canceled": "Limit anulowany", - "common.limit.executed": "Limit wykonany", - "common.limit.expired": "Limit wygasł", - "common.limit.failed": "Limit nie powiódł się", - "common.limit.opened": "Limit otwarty", - "common.limit.pending": "Limit oczekujący", - "common.limits": "Granice", - "common.limits.approachMax": "Zbliżam się do maksymalnego limitu 100", - "common.limits.cancelProceed": "Anuluj limity, aby kontynuować", - "common.limits.expires": "Wygasa {{timestamp}}", - "common.limits.open": "Otwarte limity", - "common.limits.when": "kiedy {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "Spinki do mankietów", - "common.liquidity": "Płynność", - "common.liquidity.provision": "Zapewnienie płynności", - "common.liquidity.removed": "Usunięto płynność", - "common.loading": "Ładowanie", - "common.longText.button.less": "Mniej czytać", - "common.longText.button.more": "Czytaj więcej", - "common.lowPrice": "Niska cena", - "common.manage": "Zarządzać", - "common.market.label": "Rynek", - "common.marketPrice": "Cena rynkowa", - "common.marketPrice.fetching": "Pobieranie ceny rynkowej...", - "common.marketPrice.label": "Cena rynkowa:", - "common.marketPrice.unavailable": "Cena rynkowa nie została znaleziona. Proszę przeprowadzić własne badania, aby uniknąć utraty funduszy.", - "common.max": "Maks", - "common.message": "Wiadomość", - "common.migrate": "Migrować", - "common.migrate.liquidity.failed": "Migracja płynności nie powiodła się", - "common.migrate.position": "Migracja pozycji", - "common.migrated.liquidity": "Migrowana płynność", - "common.migrating.liquidity": "Migracja płynności", - "common.min": "Min", - "common.more": "Więcej", - "common.moreDetails": "Więcej szczegółów", - "common.navigation.settings": "Ustawienia", - "common.navigation.systemSettings": "Ustawienia", - "common.navigationButton": "Przycisk nawigacji", - "common.needHelp": "Potrzebuję pomocy?", - "common.networkCost": "Koszt sieci", - "common.neverMind": "Nieważne", - "common.new": "Nowy", - "common.new.exclamation": "Nowy!", - "common.nft": "NFT", - "common.nfts": "NFT", - "common.noAmount.error": "Wpisz kwotę", - "common.noData": "Brak danych", - "common.none": "Nic", - "common.noResults": "Nie znaleziono wyników.", - "common.notAvailableInRegion.error": "Niedostępne w Twoim regionie", - "common.notCreated.label": "Nie utworzono", - "common.notSupported": "Nieobsługiwane", - "common.oneDay": "1 dzień", - "common.oneDay.short": "1D", - "common.oneHour.short": "1 godz.", - "common.oneMonth": "1 miesiąc", - "common.oneWeek": "1 tydzień", - "common.oneYear": "1 rok", - "common.opensea.link": "Widok na OpenSea", - "common.orderCanceled": "Zamówienie anulowane", - "common.orderExecuted": "Zamówienie wykonane", - "common.orderExpired": "Zamówienie wygasło", - "common.orderPending": "Zamówienie w toku", - "common.outOfRange": "Poza zakresem", - "common.pageNotFound": "Strona nie znaleziona!", - "common.passkey.count": "Klucz dostępu {{number}}", - "common.passkeys": "Klucze dostępu", - "common.passkeys.add": "Dodaj klucz dostępu", - "common.passkeys.add.description": "Wybierz miejsce zapisania nowego klucza dostępu.", - "common.pastDay": "Po dniu", - "common.pastFiveMinutes": "Ostatnie pięć minut", - "common.pastHour": "Ostatnia godzina", - "common.pastMonth": "Ostatni miesiąc", - "common.pastWeek": "Ostatni tydzień", - "common.pastYear": "Poprzedni rok", - "common.pending": "Aż do", - "common.pending.cancellation": "Oczekuje na anulowanie", - "common.pendingEllipsis": "Aż do...", - "common.permit": "Zezwolenie", - "common.plusMore": "+{{number}} więcej", - "common.pool": "Basen", - "common.pools": "Totalizator piłkarski", - "common.portfolio": "Teczka", - "common.poweredBy": "Obsługiwane przez ", - "common.price": "Cena", - "common.priceUpdated": "Cena zaktualizowana", - "common.privacyChoices": "Twoje wybory dotyczące prywatności", - "common.privacyChoices.checkbox.description": "Po zaznaczeniu nie będziemy udostępniać Twoich danych partnerom zewnętrznym w celu personalizacji reklam. Możesz włączyć udostępnianie w dowolnym momencie, odznaczając to pole.", - "common.privacyChoices.checkbox.label": "Nie udostępniaj moich danych", - "common.privacyChoices.description": "Możemy udostępniać identyfikatory urządzeń naszym partnerom reklamowym w celu promowania naszych usług na innych stronach internetowych i platformach. Jeśli kwalifikuje się to jako sprzedaż, udostępnianie lub ukierunkowana reklama zgodnie z obowiązującymi przepisami, możesz zrezygnować, zaznaczając pole „nie udostępniaj moich informacji”. Aby uzyskać więcej informacji na temat naszych praktyk dotyczących prywatności, zapoznaj się z naszą Polityką prywatności.", - "common.privacyChoices.disclaimer": "Należy pamiętać, że Twój wybór będzie dotyczył tylko tej przeglądarki na tym urządzeniu. Możesz również zrezygnować, włączając ustawienie Global Privacy Control w przeglądarce, której używasz do uzyskiwania dostępu do naszych usług. Aby zobaczyć więcej opcji, przejdź do ustawień.", - "common.privacyPolicy": "Polityka prywatności", - "common.proceed": "Przystępować", - "common.proceedInWallet": "Kontynuuj w swoim portfelu", - "common.products": "Produkty", - "common.protocol": "Protokół", - "common.protocol.v2": "Uniswap v2", - "common.protocol.v3": "Uniswap v3", - "common.protocol.v4": "Uniswap v4", - "common.purchased": "Zakupione", - "common.rate": "Wskaźnik", - "common.readMore": "Czytaj więcej", - "common.receive": "Odbierać", - "common.received": "Otrzymane", - "common.recent": "Ostatni", - "common.refresh": "Odświeżać", - "common.reload.label": "Załaduj ponownie aplikację", - "common.remove.label": "Usunąć", - "common.remove.liquidity.canceled": "Usuń anulowaną płynność", - "common.remove.liquidity.failed": "Usunięcie płynności nie powiodło się", - "common.removing.liquidity": "Usuwanie płynności", - "common.resetLimit": "Zresetuj limit {{symbol}}", - "common.resetLimitWallet": "Zresetuj limit {{symbol}} w portfelu", - "common.resettingLimit": "Resetuję limit {{symbol}} ...", - "common.revoke.approval.failed": "Nie udało się cofnąć zatwierdzenia", - "common.revoked.approval": "Cofnięto zgodę", - "common.revoking.approval": "Cofnięcie zgody", - "common.scanQRDownload": "Aby pobrać, zeskanuj kod QR telefonem", - "common.selectRegion.label": "Wybierz swój region", - "common.selectToken.label": "Wybierz token", - "common.sell.label": "Sprzedać", - "common.send.button": "Wysłać", - "common.send.failed": "Wysyłanie nie powiodło się", - "common.sending": "Wysyłanie", - "common.sent": "Wysłano", - "common.settings": "Ustawienia", - "common.share": "Udział", - "common.share.shareToTwitter": "Udostępnij na Twitterze", - "common.show.button": "Pokazywać", - "common.showLess.button": "Pokaż mniej", - "common.showMore.button": "Pokaż więcej", - "common.signatureExpired": "Twój podpis wygasł.", - "common.signMessage": "Podpisz wiadomość", - "common.signMessageWallet": "Podpisz wiadomość w portfelu", - "common.socials": "Media społecznościowe", - "common.sold": "Sprzedany", - "common.stats": "Statystyki", - "common.status": "Status", - "common.step.number": "Krok {{number}}", - "common.step.number.of": "Krok {{current}} z {{total}}", - "common.swap": "Zamieniać", - "common.swap.expired": "Zamiana wygasła", - "common.swap.failed": "Zamiana nie powiodła się", - "common.swapPending": "Zamiana w toku...", - "common.termsOfService": "Warunki usługi", - "common.text.connected": "Połączony", - "common.text.contract": "Kontrakt", - "common.text.disconnected": "Bezładny", - "common.text.error": "Błąd", - "common.text.notAvailable": "Nie dotyczy", - "common.text.recipient": "Do", - "common.text.sender": "Z", - "common.text.unknown": "Nieznany", - "common.thisAccount": "to konto", - "common.thisMonth": "Ten miesiąc", - "common.thisToken": "Ten żeton", - "common.thisWeek": "W tym tygodniu", - "common.thisYear": "W tym roku", - "common.time": "Czas", - "common.time.minute.amt": "{{time}}miesiąc", - "common.time.minutes": "minuty", - "common.time.past.days": "{{days}} dni", - "common.time.past.days.short": "{{days}}d", - "common.time.past.hours": "{{hours}} godzin", - "common.time.past.hours.short": "{{hours}}godz.", - "common.time.past.minutes.short": "{{minutes}}miesiąc", - "common.time.past.months.short": "{{months}}miesiąc", - "common.time.past.seconds.short": "{{seconds}}s", - "common.to": "do", - "common.today": "Dzisiaj", - "common.tokenA": "Żeton A", - "common.tokenAmount": "Kwota symboliczna", - "common.tokenB": "Żeton B", - "common.tokenName": "Nazwa tokenu", - "common.tokens": "Żetony", - "common.totalUniswapTVL": "Całkowity TVL Uniswap", - "common.totalValueLocked": "TVL", - "common.trade": "Handel", - "common.trademarkPolicy": "Polityka dotycząca znaków towarowych", - "common.transactionDetails": "Szczegóły transakcji", - "common.transactionId": "Identyfikator transakcji", - "common.transactionPending": "Transakcja oczekująca", - "common.transactions": "Transakcje", - "common.transactionSettings": "Ustawienia transakcji", - "common.transfer_one": "przenosić", - "common.transfer_other": "transfery", - "common.tryAgain.error": "Spróbuj ponownie", - "common.twitter": "Świergot", - "common.type.label": "Typ", - "common.unavailable": "Niedostępne", - "common.unhide": "Odkryj", - "common.unichain": "Unichain", - "common.uniswapMobile": "Uniswap komórkowy", - "common.uniswapWallet": "Uniswapowy portfel", - "common.uniswapX": "UniswapX", - "common.unknown": "Nieznany", - "common.unknownError.error": "Nieznany błąd", - "common.unwrap.button": "Odwijać się", - "common.unwrap.failed": "Rozpakowanie nie powiodło się", - "common.unwrapped": "Rozpakowany", - "common.unwrapping": "Rozpakowywanie", - "common.view.profile": "Wyświetl profil", - "common.viewOnExplorer": "Zobacz w Eksploratorze", - "common.volume": "Tom", - "common.vote": "Głosować", - "common.wallet.approve": "Zatwierdź w portfelu", - "common.wallet.label": "Portfel", - "common.warning": "Ostrzeżenie", - "common.webApp": "Aplikacja internetowa", - "common.website": "Strona internetowa", - "common.whyApprove": "Dlaczego muszę zatwierdzić token?", - "common.whySign": "Dlaczego wymagane są podpisy?", - "common.whyWrap": "Dlaczego muszę owijać {{symbol}}?", - "common.withdraw": "Wycofać", - "common.withdrawal.amount": "Kwota wypłaty", - "common.withinRange": "W zakresie", - "common.wrap": "Zawiń {{symbol}}", - "common.wrap.failed": "Zawijanie nie powiodło się", - "common.wrapIn": "Zapakuj {{symbol}} do portfela", - "common.wrapped": "Owinięty", - "common.wrapping": "Zawijanie", - "common.wrappingToken": "Zawijanie {{symbol}}...", - "common.yesterday": "Wczoraj", - "common.your.account.had.insufficient.funds": "Na Twoim koncie nie było wystarczających środków, aby ukończyć tę zamianę.", - "common.your.account.has.insufficient.funds": "Na Twoim koncie nie ma wystarczających środków, aby ukończyć tę zamianę.", - "common.your.connected.wallet": "Twój połączony portfel", - "common.your.limit.could.not.be.fulfilled": "W tej chwili nie można wykorzystać Twojego limitu. Proszę spróbuj ponownie.", - "common.your.swap.could.not.be.fulfilled": "Twoja zamiana nie mogła zostać zrealizowana w tej chwili. Proszę spróbuj ponownie.", - "common.youreBuying": "Kupujesz", - "common.youReceive": "Otrzymujesz", - "common.youreSelling": "Sprzedajesz", - "currency.ars": "Peso argentyńskie", - "currency.aud": "Dolar australijski", - "currency.brl": "Real brazylijski", - "currency.cad": "Dolar kanadyjski", - "currency.cny": "Chiński juan", - "currency.cop": "kolumbijskie peso", - "currency.eur": "Euro", - "currency.gbp": "Funt brytyjski", - "currency.hkd": "Dolar hongkoński", - "currency.idr": "Rupia indonezyjska", - "currency.inr": "Rupia indyjska", - "currency.jpy": "Japoński jen", - "currency.krw": "Won południowokoreański", - "currency.mxn": "Peso meksykańskie", - "currency.ngn": "Nigeryjska Naira", - "currency.pkr": "Rupia pakistańska", - "currency.rub": "Rubel rosyjski", - "currency.sgd": "Dolar singapurski", - "currency.try": "Lira turecka", - "currency.uah": "Hrywna ukraińska", - "currency.usd": "Dolar amerykański", - "currency.vnd": "Dong wietnamski", - "dapp.request.actionCannotBeCompleted.description": "Niektóre funkcje są niedostępne, ponieważ ustawienia inteligentnego portfela są zarządzane przez inną aplikację portfela.", - "dapp.request.actionCannotBeCompleted.header": "Prośba o podpis", - "dapp.request.actionCannotBeCompleted.title": "Akcja nie może zostać ukończona", - "dapp.request.approve.action": "Zatwierdzić", - "dapp.request.approve.fallbackTitle": "Zatwierdź tę witrynę, aby uzyskać dostęp do tokenów", - "dapp.request.approve.helptext": "Zezwól tej witrynie na dostęp i wydawanie tego tokena na transakcje. Upewnij się, że ufasz tej witrynie.", - "dapp.request.approve.label": "Portfel", - "dapp.request.approve.title": "Zatwierdź dostęp do {{tokenSymbol}}", - "dapp.request.base.title": "Żądanie transakcji", - "dapp.request.bridge.description": "Przenoś ETH, USDC i inne pomiędzy {{numChains}}+ sieciami.", - "dapp.request.bridge.title": "Próbujesz zbudować most?", - "dapp.request.connect.helptext": "Pozwól tej witrynie przeglądać adres Twojego portfela, saldo i żądać zatwierdzeń transakcji.", - "dapp.request.connect.title": "Połącz się z witryną", - "dapp.request.fallback.calldata.label": "Surowe dane", - "dapp.request.fallback.function.label": "Funkcjonować", - "dapp.request.permit2.description": "Permit2 zarządza zatwierdzaniem tokenów w wielu aplikacjach.", - "dapp.request.permit2.header": "Podpisz zezwolenie 2", - "dapp.request.permit2approve.action": "Zatwierdzić", - "dapp.request.permit2approve.helptext": "Permit2 zarządza zatwierdzaniem tokenów w wielu aplikacjach.", - "dapp.request.permit2approve.title": "Zatwierdź Permit2", - "dapp.request.reject.action": "Odrzuć wszystko", - "dapp.request.reject.info": "Masz {{totalRequestCount}} żądań transakcji", - "dapp.request.revoke.action": "Unieważnić", - "dapp.request.revoke.helptext": "Zezwól tej witrynie na cofnięcie dostępu w celu wykorzystania tego tokena na transakcje. Upewnij się, że ufasz tej witrynie.", - "dapp.request.revoke.title": "Odbierz dostęp do {{tokenSymbol}}", - "dapp.request.signature.containsUnrenderableCharacters": "Ta wiadomość zawiera znaki, których nie można odczytać. Upewnij się, że ufasz tej witrynie.", - "dapp.request.signature.decodeError": "Nie udało się zdekodować wiadomości", - "dapp.request.signature.header": "Prośba o podpis", - "dapp.request.signature.irregular": "Nieregularne żądanie podpisu", - "dapp.request.signature.irregular.description": "Przed kontynuowaniem upewnij się, że ufasz tej witrynie", - "dapp.request.signature.irregular.understand": "Rozumiem ryzyko", - "dapp.request.signature.toggleDataView.raw": "Zobacz surowe dane", - "dapp.request.signature.toggleDataView.readable": "Zobacz oryginalne dane", - "dapp.request.warning.notActive.message": "Upewnij się, że to ten właściwy", - "dapp.request.warning.notActive.title": "To nie jest Twój aktywny portfel", - "delegation.upgradeModal.description": "Ta aktualizacja portfela wykorzystuje inteligentne kontrakty, aby zapewnić szybsze i tańsze transakcje. Dowiedz się więcej", - "delegation.upgradeModal.enableSmartWallet": "Włącz inteligentny portfel", - "delegation.upgradeModal.title": "Lepsze zamiany, niższe koszty", - "downloadApp.modal.connectExistingWallet": "Połącz istniejący portfel", - "downloadApp.modal.getStarted.description": "Uzyskaj natychmiastowy dostęp do tysięcy tokenów za pośrednictwem największego na świecie rynku onchain.", - "downloadApp.modal.getStarted.title": "Rozpocznij wymianę w kilka sekund", - "downloadApp.modal.getTheApp.title": "Zacznij korzystać z Uniswapa", - "downloadApp.modal.uniswapProducts.subtitle": "Produkty Uniswap doskonale ze sobą współpracują, tworząc najlepsze doświadczenie onchain.", - "empty.swap.button.text": "Dodaj środki do wymiany", - "error.dataUnavailable": "Dane są w tej chwili niedostępne; pracujemy nad rozwiązaniem", - "error.id": "Identyfikator błędu: {{eventId}}", - "error.jupiterApi.execute.default.title": "Wystąpił problem z API Jupitera. Spróbuj ponownie.", - "error.jupiterApi.failedToLand": "(Kod {{code}}: Transakcja nie dotarła do sieci)", - "error.jupiterApi.invalidBlockHeight": "(Kod -1004: Nieprawidłowa wysokość bloku)", - "error.jupiterApi.invalidMessageBytes": "(Kod -3: Nieprawidłowe bajty wiadomości)", - "error.jupiterApi.invalidPayload": "(Kod -2002: Nieprawidłowy ładunek)", - "error.jupiterApi.invalidSignedTransaction": "(Kod -2: Nieprawidłowo podpisana transakcja)", - "error.jupiterApi.invalidTransaction": "(Kod -1002: Nieprawidłowa transakcja)", - "error.jupiterApi.missingCachedOrder": "(Kod -1: Brak zamówienia w pamięci podręcznej)", - "error.jupiterApi.notFullySigned": "(Kod -1003: Transakcja nie została w pełni podpisana)", - "error.jupiterApi.quoteExpired": "Ten cytat przekroczył limit czasu. Spróbuj ponownie. (Kod -2003)", - "error.jupiterApi.unknownErrorCode": "(Kod {{code}})", - "error.noData": "Nie znaleziono danych", - "error.request.provideId": "Przepraszamy, wystąpił błąd podczas przetwarzania Twojego żądania. Jeśli poprosisz o pomoc, pamiętaj o podaniu identyfikatora błędu.", - "error.tokenApproval": "Zatwierdzenie tokenu nie powiodło się", - "error.tokenApproval.message": "Problem z siecią lub połączeniem prawdopodobnie spowodował niepowodzenie zatwierdzenia. Sprawdź połączenie i spróbuj ponownie.", - "error.tokenApprovalEdited": "Niewystarczająca kwota zatwierdzenia", - "error.tokenApprovalEdited.message": "Kwota zatwierdzenia ustawiona w Twoim portfelu jest zbyt niska, aby ukończyć tę transakcję. Spróbuj ponownie i zwiększ kwotę.", - "errors.crash.message": "Coś się rozbiło.", - "errors.crash.restart": "Uruchom ponownie aplikację", - "errors.crash.title": "O o!", - "explore.more.pools": "Odkryj więcej basenów", - "explore.more.unichain": "Odkryj pule Unichain", - "explore.search.label.ownedBy": "Właścicielem {{ownerAddress}}", - "explore.search.placeholder": "Szukaj tokenów i portfeli", - "explore.search.section.nft": "Kolekcje NFT", - "explore.search.section.popularNFT": "Popularne kolekcje NFT", - "explore.search.section.wallets": "Portfele", - "explore.tokens.error": "Nie udało się wczytać tokenów", - "explore.tokens.favorite.action.add": "Ulubiony token", - "explore.tokens.favorite.action.edit": "Edytować ulubione", - "explore.tokens.favorite.action.remove": "Usuń ulubione", - "explore.tokens.favorite.title.default": "Ulubione żetony", - "explore.tokens.favorite.title.edit": "Edytuj ulubione tokeny", - "explore.tokens.metadata.marketCap": "{{number}} MCap", - "explore.tokens.metadata.totalValueLocked": "{{number}} TVL", - "explore.tokens.metadata.volume": "{{number}} Cz", - "explore.tokens.sort.label.marketCap": "Kapitalizacja rynkowa", - "explore.tokens.sort.label.priceDecrease": "Spadek ceny", - "explore.tokens.sort.label.priceIncrease": "Wzrost ceny", - "explore.tokens.sort.label.totalValueLocked": "TVL", - "explore.tokens.sort.label.volume": "Tom", - "explore.tokens.sort.option.marketCap": "Kapitalizacja rynkowa", - "explore.tokens.sort.option.priceDecrease": "Spadek ceny (24H)", - "explore.tokens.sort.option.priceIncrease": "Wzrost ceny (24H)", - "explore.tokens.sort.option.totalValueLocked": "Stawka TVL Uniswap", - "explore.tokens.sort.option.volume": "Głośność Uniswap (24H)", - "explore.tokens.top.title": "Najlepsze tokeny", - "explore.v2TVL": "v2 TVL", - "explore.v3TVL": "v3 TVL", - "explore.v4TVL": "v4 TVL", - "explore.wallets.favorite.action.add": "Ulubiony portfel", - "explore.wallets.favorite.action.edit": "Edytować ulubione", - "explore.wallets.favorite.action.remove": "Usuń ulubione", - "explore.wallets.favorite.action.remove.short": "Nielubiane", - "explore.wallets.favorite.title.default": "Ulubione portfele", - "explore.wallets.favorite.title.edit": "Edytuj ulubione portfele", - "extension.connection.network": "Sieć", - "extension.connection.networks": "Sieci", - "extension.connection.popup.trouble": "Problem z połączeniem?", - "extension.connection.titleConnected": "Połączony", - "extension.connection.titleNotConnected": "Nie połączony", - "extension.lock.button.forgot": "Zapomniałeś hasła?", - "extension.lock.button.reset": "Zresetuj portfel", - "extension.lock.button.submit": "Odblokować", - "extension.lock.password.error": "Złe hasło. Spróbuj ponownie", - "extension.lock.password.reset.initial.description": "Uniswap nie może pomóc w odzyskaniu Twojego hasła. Musisz zresetować portfel, wprowadzając ponownie 12-wyrazową frazę odzyskiwania.", - "extension.lock.password.reset.initial.help": "Gdzie znajdę frazę odzyskiwania?", - "extension.lock.password.reset.initial.title": "Zapomniałeś hasła", - "extension.lock.password.reset.speedbump.description": "Zanim zresetujesz portfel, upewnij się, że znasz frazę odzyskiwania składającą się z 12 słów. W przeciwnym razie nie będziesz mógł odzyskać swoich środków.", - "extension.lock.password.reset.speedbump.help": "Zgubiłem frazę odzyskiwania", - "extension.lock.password.reset.speedbump.title": "Zanim będziesz kontynuować", - "extension.lock.subtitle": "Wprowadź hasło, aby odblokować", - "extension.lock.title": "Witamy spowrotem", - "extension.network.notSupported": "Nieobsługiwana sieć", - "extension.open": "Otwórz rozszerzenie Uniswap", - "extension.passwordPrompt.error.wrongPassword": "Złe hasło. Spróbuj ponownie", - "extension.passwordPrompt.title": "Wprowadź hasło", - "extension.popup.chrome.button": "Otwórz rozszerzenie", - "extension.popup.chrome.description": "Aby ukończyć tę czynność, otwórz rozszerzenie Uniswap.", - "extension.popup.chrome.title": "Kontynuuj w Uniswap", - "extension.settings.defaultWallet.message": "Nadaj priorytet rozszerzeniu Uniswap podczas łączenia się z aplikacjami.", - "extension.settings.defaultWallet.title": "Ustaw jako domyślny portfel", - "extension.uninstall.reason.missingFeatures": "Portfel Uniswap nie ma pewnych funkcji", - "extension.uninstall.reason.notUsingCrypto": "Nie chcę już używać kryptowalut", - "extension.uninstall.reason.other": "Inne powody", - "extension.uninstall.reason.switchingWallet": "Przechodzę na inny portfel", - "extension.uninstall.subtitle": "Jeśli masz chwilę, chętnie dowiemy się, dlaczego odinstalowałeś portfel Uniswap", - "extension.uninstall.title": "Smutno nam, że odchodzisz", - "extension.warning.storage.button": "Kopia zapasowa", - "extension.warning.storage.message": "Pamiętaj o utworzeniu kopii zapasowej frazy odzyskiwania, aby zapobiec utracie dostępu do portfela i środków.", - "extension.warning.storage.title": "W Twojej przeglądarce kończy się pamięć", - "extensionPasskeyLogInPopUp.description": "Zaimportuj swoje konto Uniswap logując się przy użyciu istniejącego klucza dostępu.", - "extensionPasskeyLogInPopUp.invalidReferrer": "Zamknij tę stronę i spróbuj ponownie.", - "fee.bestForCustomizability": "Najlepiej sprawdza się możliwość personalizacji.", - "fee.bestForExotic": "Najlepsze dla par egzotycznych.", - "fee.bestForMost": "Najlepsze dla większości par.", - "fee.bestForStablePairs": "Najlepsze dla stabilnych par.", - "fee.bestForVeryStable": "Najlepsze dla bardzo stabilnych par.", - "fee.dynamic": "Opłata dynamiczna", - "fee.percentEarned": "%, jaki zarobisz na opłatach.", - "fee.selectPercent": "{{pct}}% wyboru", - "fee.selectPercentDescription": "{{pct}}% płynności wybranej na tym poziomie", - "fee.tier": "Poziom opłat", - "fee.tier.create": "Utwórz poziom opłat", - "fee.tier.create.button": "Utwórz nowy poziom opłat", - "fee.tier.create.description": "Utworzenie nowego poziomu spowoduje zainicjowanie nowej puli i spowoduje wyższe niż zwykle koszty sieci.", - "fee.tier.description": "Kwota zarobiona zapewniająca płynność. Wybierz kwotę, która odpowiada Twojej tolerancji ryzyka i strategii.", - "fee.tier.description.v2": "Zarobiona kwota zapewniająca płynność. Wszystkie pule v2 mają stałe opłaty w wysokości 0,3%. Aby uzyskać więcej opcji, zapewnij płynność w v4.", - "fee.tier.dynamic": "Dynamiczny poziom opłat", - "fee.tier.dynamic.create": "Tworzenie dynamicznego poziomu opłat", - "fee.tier.dynamic.create.info": "Zamierzasz utworzyć pulę z dynamicznym poziomem opłat. Przed kontynuowaniem upewnij się, że wybrany hak obsługuje dynamiczne opłaty.", - "fee.tier.highestTvl": "Najwyższy TVL", - "fee.tier.label": "%, jaki zarobisz na prowizjach", - "fee.tier.missing.description": "Nie możesz znaleźć interesującego Cię poziomu?", - "fee.tier.new": "Nowy poziom", - "fee.tier.percent.select": "{{percentage}} wybierz", - "fee.tier.recommended.description": "Polecane na podstawie najwyższego udziału płynności dla wybranej pary tokenów.", - "fee.tier.search": "Wyszukaj lub utwórz inne poziomy opłat", - "fee.tier.search.short": "Wyszukaj poziomy", - "fee.tier.select": "Wybierz poziom opłat", - "fee.tier.select.existing.button": "Wybierz istniejący poziom opłat", - "fee.tierExact": "{{fee}} poziom opłat", - "fee.unavailable": "Uzyskane opłaty nie będą widoczne dla pozycji v2 do momentu usunięcia płynności.", - "fee.uncollected": "Obejmuje niepobrane opłaty:", - "fee.uniswap": "Opłata ({{percent}})", - "fee.uniswap.description": "Opłaty są pobierane w celu zapewnienia najlepszych wrażeń z korzystania z Uniswap.", - "fiatOffRamp.checkout.title": "Wycofać się do", - "fiatOffRamp.connection.quote": "Sprzedaję {{amount}} o wartości {{currencySymbol}}", - "fiatOffRamp.error.balance": "Przekracza równowagę", - "fiatOffRamp.error.populateSend.description": "Poczekaj chwilę i spróbuj ponownie.", - "fiatOffRamp.error.populateSend.title": "Nie można załadować transakcji", - "fiatOffRamp.summary.total": "{{cryptoAmount}} dla {{fiatAmount}}", - "fiatOffRamp.unsupportedToken.back": "Wróć", - "fiatOffRamp.unsupportedToken.divider": "Nieobsługiwane tokeny", - "fiatOffRamp.unsupportedToken.message": "Ten token nie jest obsługiwany do sprzedaży. Zamień ten zasób na jeden z obsługiwanych tokenów.", - "fiatOffRamp.unsupportedToken.swap": "Zmień na obsługiwany token", - "fiatOffRamp.unsupportedToken.title": "Nieobsługiwany token", - "fiatOffRamp.welcome.tooltip": "Sprzedaj swoją kryptowalutę na swoje konto bankowe lub kartę debetową.", - "fiatOnRamp.button.chooseToken": "Wybierz token", - "fiatOnRamp.buy.info.description": "Będzie on potrzebny do pokrycia kosztów sieciowych przy zamianie.", - "fiatOnRamp.buy.info.title": "Zacznij od ETH", - "fiatOnRamp.cexTransferModal.description": "Kupowanie kryptowalut za pomocą karty nie jest obsługiwane w Twoim regionie. Przelej aktywa z centralnego konta giełdowego, aby zasilić swój portfel.", - "fiatOnRamp.cexTransferModal.title": "Przenieś, aby rozpocząć", - "fiatOnRamp.checkout.title": "Wymeldować się", - "fiatOnRamp.chooseMultiPlatformProvider.chooseNetwork": "Wybierz sieć", - "fiatOnRamp.chooseMultiPlatformProvider.description": "W ten sposób ustalisz adres portfela, na który otrzymasz środki.", - "fiatOnRamp.chooseProvider.description": "Przejdziesz do portalu dostawcy, aby zobaczyć opłaty związane z Twoją transakcją.", - "fiatOnRamp.completeTransactionHeader": "Zakończ transakcję za {{serviceProvider}}", - "fiatOnRamp.connection.error": "Połączenie nieudane", - "fiatOnRamp.connection.errorDescription": "Coś poszło nie tak podczas łączenia z {{serviceProvider}}.", - "fiatOnRamp.connection.message": "Łączę Cię z {{serviceProvider}}", - "fiatOnRamp.connection.quote": "Kupno {{amount}} o wartości {{currencySymbol}}", - "fiatOnRamp.connection.terms": "Kontynuując, potwierdzasz, że będziesz podlegać Warunkom świadczenia usług i Polityce prywatności z {{serviceProvider}}, stosownie do przypadku.", - "fiatOnRamp.continueInTab": "Aby kontynuować, przejdź do zakładki {{serviceProvider}} . Możesz teraz bezpiecznie zamknąć ten moduł.", - "fiatOnRamp.disclaimer": "Kontynuując, potwierdzasz, że będziesz podlegać Warunkom świadczenia usług i Polityce prywatności z {{serviceProvider}}, stosownie do przypadku.", - "fiatOnRamp.error.default": "Coś poszło nie tak.", - "fiatOnRamp.error.load": "Nie udało się wczytać tokenów do kupienia", - "fiatOnRamp.error.max": "Maksymalnie {{amount}}", - "fiatOnRamp.error.min": "Minimalnie {{amount}}", - "fiatOnRamp.error.noQuotes": "Nie znaleziono cytatów.", - "fiatOnRamp.error.unavailable": "Ta usługa jest niedostępna w Twoim regionie", - "fiatOnRamp.error.unsupported": "Nieobsługiwane w regionie", - "fiatOnRamp.error.usd": "Możliwość zakupu wyłącznie w USD", - "fiatOnRamp.noQuotes.error": "Nie znaleziono cytatów", - "fiatOnRamp.paymentMethods.applePay": "Apple Pay", - "fiatOnRamp.paymentMethods.bank": "Bank", - "fiatOnRamp.paymentMethods.debit": "Obciążyć", - "fiatOnRamp.paymentMethods.googlePay": "Google Pay", - "fiatOnRamp.paymentMethods.paypal": "PayPal", - "fiatOnRamp.paymentMethods.venmo": "Venmo", - "fiatOnRamp.quote.advice": "Przejdziesz do portalu dostawcy, aby zobaczyć opłaty związane z Twoją transakcją.", - "fiatOnRamp.quote.type.list": "{{optionsList}}i inne opcje", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "Z konta", - "fiatOnRamp.receiveCrypto.title": "Odbierz kryptowalutę", - "fiatOnRamp.receiveCrypto.transferFunds": "Zasil swój portfel, przesyłając kryptowaluty z innego portfela lub konta", - "fiatOnRamp.receiveCrypto.useThisAddress": "Użyj tego adresu, aby otrzymywać tokeny na", - "fiatOnRamp.region.placeholder": "Szukaj według kraju lub regionu", - "fiatOnRamp.region.title": "Wybierz swój region", - "fiatOnRamp.summary.total": "{{cryptoAmount}} dla {{fiatAmount}}", - "forceUpgrade.action.backup": "Utwórz kopię zapasową swojego portfela", - "forceUpgrade.action.confirm": "Aktualizuj teraz", - "forceUpgrade.action.learn": "Dowiedz się, jak aktualizować", - "forceUpgrade.description.extension": "Dostępna jest nowa wersja aplikacji. Aby kontynuować korzystanie z rozszerzenia Uniswap, zaktualizuj je do najnowszej wersji.", - "forceUpgrade.description.wallet": "Dostępna jest nowa wersja aplikacji. Aby kontynuować korzystanie z Uniswap Wallet, zaktualizuj ją do najnowszej wersji.", - "forceUpgrade.label.recoveryPhrase": "Fraza odzyskiwania", - "forceUpgrade.title": "Zaktualizuj do najnowszej wersji", - "forceUpgrade.title.recommendedStatus": "Dostępna jest nowa wersja", - "globalPreferences.title": "Globalne preferencje", - "hero.scroll": "Przewiń, aby dowiedzieć się więcej", - "hero.subtitle": "Kupuj i sprzedawaj kryptowaluty w sieciach {{amount}}+, w tym Ethereum, Unichain i Base.", - "hero.swap.title": "Zamień w dowolnym momencie,
gdziekolwiek.", - "hidden.nfts.info.banner.text": "Dowiedz się więcej o ukrytych NFT", - "hidden.nfts.info.text.button": "Ukryte NFT ({{numHidden}})", - "hidden.nfts.info.text.extension": "Oto potencjalne oszustwa i NFT, które ukryłeś. Możesz kliknąć prawym przyciskiem myszy na NFT, aby je odkryć.", - "hidden.nfts.info.text.mobile": "To są potencjalne oszustwa i NFT, które ukryłeś. Możesz nacisnąć i przytrzymać NFT, aby je odsłonić.", - "hidden.nfts.info.text.title": "Ukryte NFT", - "hidden.tokens.info.banner.text": "Dowiedz się więcej o ukrytych tokenach", - "hidden.tokens.info.text.button": "Ukryte tokeny ({{numHidden}})", - "hidden.tokens.info.text.info": "Są to potencjalne oszustwa, małe salda i tokeny, które ukryłeś. Ukryte tokeny nie są uwzględniane w całkowitym saldzie portfela.", - "hidden.tokens.info.text.title": "Ukryte tokeny", - "home.activity.empty.button": "Otrzymuj tokeny lub NFT", - "home.activity.empty.description.default": "Kiedy zatwierdzisz, wymienisz lub przeniesiesz tokeny lub NFT, Twoje transakcje pojawią się tutaj.", - "home.activity.empty.description.external": "Kiedy ten portfel dokona transakcji, pojawią się one tutaj.", - "home.activity.empty.title": "Brak aktywności", - "home.activity.error.load": "Nie udało się wczytać aktywności", - "home.activity.title": "Działalność", - "home.banner.offline": "Jesteś w trybie offline", - "home.banner.testnetMode": "Jesteś w trybie testowym", - "home.banner.testnetMode.nav": "Jesteś w trybie testnet. Wyłącz to w ustawieniach.", - "home.empty.cexTransfer": "Przenosić", - "home.empty.cexTransfer.description": "Przelewaj środki z platformy handlowej.", - "home.empty.transfer": "Odbierz kryptowalutę", - "home.empty.transfer.description": "Przenieś środki z innego portfela.", - "home.explore.footer": "Kliknij tutaj, aby poznać tysiące tokenów, NFT i nie tylko", - "home.explore.title": "Przeglądaj tokeny", - "home.extension.error": "Błąd ładowania kont", - "home.label.buy": "Kupić", - "home.label.for": "Kup/Sprzedaj", - "home.label.receive": "Odbierać", - "home.label.send": "Wysłać", - "home.label.swap": "Zamieniać", - "home.nfts.title": "NFT", - "home.tokens.empty.action.buy.description": "Dokonaj zakupu za pomocą karty debetowej lub konta bankowego.", - "home.tokens.empty.action.buy.title": "Kup kryptowalutę", - "home.tokens.empty.action.import.description": "Wprowadź frazę odzyskiwania tego portfela, aby rozpocząć wymianę i wysyłanie.", - "home.tokens.empty.action.import.title": "Importuj portfel", - "home.tokens.empty.action.receive.description": "Przelej z innego portfela lub konta.", - "home.tokens.empty.action.receive.title": "Odbierz kryptowalutę", - "home.tokens.empty.description": "Kiedy ten portfel kupi lub otrzyma tokeny, pojawią się one tutaj.", - "home.tokens.empty.title": "Nie ma jeszcze tokenów", - "home.tokens.empty.welcome.description": "Dodaj środki, aby rozpocząć handel", - "home.tokens.error.fetch": "Nie udało się pobrać salda tokenów", - "home.tokens.error.load": "Nie udało się wczytać salda tokenów", - "home.tokens.title": "Żetony", - "home.upsell.receive.cta": "Z konta", - "home.upsell.receive.title": "Odbierz kryptowalutę", - "home.warning.viewOnly": "To jest portfel tylko do przeglądania", - "interface.metatags.description": "Wymieniaj kryptowaluty na Ethereum, Base, Arbitrum, Polygon, Unichain i innych. Platforma DeFi, której ufają miliony.", - "interface.metatags.title": "Interfejs Uniswapa", - "landing.api": "API", - "landing.appsOverview": "Zbudowany do wszystkich sposobów zamiany", - "landing.blog.description": "Bądź na bieżąco z najnowszymi informacjami o firmie, funkcjami produktów i nie tylko", - "landing.docs.description": "Zapoznaj się z naszą biblioteką dokumentów dla programistów, aby rozpocząć tworzenie oprogramowania za pomocą Uniswap", - "landing.exploreUniverse": "Odkryj Wszechświat", - "landing.getStarted": "Handluj na największej na świecie giełdzie DEX", - "landing.helpCenter.body": "Przeglądaj często zadawane pytania i uzyskaj pomoc od naszego zespołu wsparcia w USA", - "landing.protocolDescription": "Uniswap Labs oferuje jedne z najpopularniejszych produktów w branży kryptowalut. Ciesz się dostępem bez uprawnień, sprawdzonym bezpieczeństwem i dedykowanym wsparciem.", - "landing.protocolStats": "Statystyki protokołu Uniswap", - "landing.provideLiquidity.body": "Zapewnij płynność i pobieraj opłaty korzystając z interfejsu Uniswap.", - "landing.provideLiquidity.subtitle": "Zasilaj rynki łańcuchowe.", - "landing.socials": "Obserwuj Uniswap Labs na X, Farcaster, LinkedIni TikTok", - "landing.swapBody": "Uzyskaj dostęp do dużej płynności, eksploruj tokeny, ustalaj zlecenia limitowane i zapewnij płynność tysiącom tokenów w łańcuchach {{amount}} .", - "landing.swapSubtitle": "Wymiana bez zezwolenia.", - "landing.tradingApi": "API handlowe", - "landing.tradingApiBody": "Skorzystaj z tego samego interfejsu API, który obsługuje aplikację internetową i portfel Uniswap, którym zaufały wiodące zespoły na całym świecie.", - "landing.tradingApiButton": "Zintegruj API Uniswap", - "landing.tradingApiSubtitle": "DeFi bezpośrednio do Twoich użytkowników.", - "landing.trusted": "Zaufały mu miliony", - "landing.unichain.body": "Dołącz do społeczności budującej szybką, zdecentralizowaną sieć Ethereum L2, stworzoną jako siedziba DeFi.", - "landing.unichain.button": "Zacznij budować", - "landing.unichain.subtitle": "Sieć DeFi.", - "landing.uniswapX.body": "Transakcje bezgazowe i ochrona MEV, z zerowymi opłatami za nieudane swapy.", - "landing.uniswapX.button": "Poznaj UniswapX", - "landing.uniswapX.subtitle": "Inteligentniejsze zamiany, zero tarcia.", - "landing.walletBody": "Zaufany portfel kryptowalutowy z możliwością samodzielnego przechowywania i rozszerzeniem, pobrany już miliony razy, ze wsparciem prawdziwych ludzi i oceną 4,8 .", - "landing.walletSubtitle": "Wymieniaj, przechowuj, odkrywaj.", - "language.afrikaans": "Afrykanerski", - "language.arabic": "arabski", - "language.catalan": "Kataloński", - "language.chineseSimplified": "Uproszczony chiński", - "language.chineseTraditional": "Chiński tradycyjny", - "language.czech": "czeski", - "language.danish": "duński", - "language.dutch": "Holenderski", - "language.english": "język angielski", - "language.finnish": "fiński", - "language.french": "Francuski", - "language.greek": "grecki", - "language.hebrew": "hebrajski", - "language.hindi": "hinduski", - "language.hungarian": "węgierski", - "language.indonesian": "indonezyjski", - "language.italian": "włoski", - "language.japanese": "język japoński", - "language.korean": "koreański", - "language.malay": "malajski", - "language.norwegian": "norweski", - "language.polish": "Polski", - "language.portuguese": "portugalski", - "language.romanian": "rumuński", - "language.russian": "Rosyjski", - "language.serbian": "serbski", - "language.spanishArgentina": "hiszpański (Argentyna)", - "language.spanishBelize": "hiszpański (Belize)", - "language.spanishBolivia": "hiszpański (Boliwia)", - "language.spanishChile": "hiszpański (Chile)", - "language.spanishColombia": "hiszpański (Kolumbia)", - "language.spanishCostaRica": "hiszpański (Kostaryka)", - "language.spanishCuba": "hiszpański (Kuba)", - "language.spanishDominicanRepublic": "hiszpański (Republika Dominikańska)", - "language.spanishEcuador": "hiszpański (Ekwador)", - "language.spanishElSalvador": "hiszpański (Salwador)", - "language.spanishGuatemala": "hiszpański (Gwatemala)", - "language.spanishHonduras": "hiszpański (Honduras)", - "language.spanishLatam": "hiszpański (Ameryka Łacińska)", - "language.spanishMexico": "hiszpański (Meksyk)", - "language.spanishNicaragua": "hiszpański (Nikaragua)", - "language.spanishPanama": "hiszpański (Panama)", - "language.spanishParaguay": "hiszpański (Paragwaj)", - "language.spanishPeru": "hiszpański (Peru)", - "language.spanishPuertoRico": "hiszpański (Portoryko)", - "language.spanishSpain": "hiszpański (Hiszpania)", - "language.spanishUruguay": "hiszpański (Urugwaj)", - "language.spanishUs": "hiszpański (amerykański)", - "language.spanishVenezuela": "hiszpański (Wenezuela)", - "language.swahili": "suahili", - "language.swedish": "szwedzki", - "language.turkish": "turecki", - "language.ukrainian": "ukraiński", - "language.urdu": "urdu", - "language.vietnamese": "wietnamski", - "large.price.difference": "Duża różnica w cenie", - "large.price.difference.tooltip": "Kontynuowanie tej transakcji spowoduje utratę środków. Ta różnica może być spowodowana dużymi transakcjami lub niską płynnością.", - "limit.open.count_one": "1 otwarty limit", - "limit.open.count_other": "{{count}} otwarte limity", - "limitPrice.buyingAboveMarketPrice.error.description": "Twoja cena graniczna jest {{percentage}}% wyższa niż cena rynkowa. Aby kontynuować, dostosuj cenę graniczną.", - "limitPrice.buyingAboveMarketPrice.error.title": "Kupno {{tokenSymbol}} powyżej ceny rynkowej", - "limitPrice.marketPriceNotAvailable.error.description": "Nie jesteśmy w stanie obliczyć aktualnej ceny rynkowej. Aby uniknąć złożenia zamówienia poniżej ceny rynkowej, sprawdź połączenie sieciowe i spróbuj ponownie.", - "limitPrice.marketPriceNotAvailable.error.title": "Cena rynkowa niedostępna", - "limitPrice.sellingBelowMarketPrice.error.description": "Twoja cena graniczna jest {{percentage}}% niższa od rynkowej. Aby kontynuować, dostosuj cenę graniczną.", - "limitPrice.sellingBelowMarketPrice.error.title": "Sprzedaje {{tokenSymbol}} poniżej ceny rynkowej", - "limits.form.disclaimer.mainnet": "W przypadku limitów dostępne są tylko tokeny sieci głównej Ethereum. ", - "limits.form.disclaimer.mainnet.short": "Do limitów dostępne są tylko tokeny Mainnet.", - "limits.form.disclaimer.uniswapx": "Limity mogą nie zostać wykonane dokładnie wtedy, gdy tokeny osiągną określoną cenę. ", - "limits.learnMore": "Dowiedz się więcej o limitach", - "limits.price.input.label": "Kiedy 1 jest warte", - "limits.price.label": "Cena graniczna", - "limits.selectSupportedTokens": "Wybierz obsługiwane tokeny", - "liquidity.hooks": "Haki na v4", - "liquidity.hooks.address.input": "Wprowadź adres haka", - "liquidity.hooks.address.tooltip": "Adres haka: {{address}}", - "liquidity.learnMoreLabel": "Dowiedz się więcej o zapewnianiu płynności", - "liquidity.notEnough.label": "Za mało płynności, aby pokazać dokładną wartość w USD.", - "liquidity.provideOnProtocols": "Zapewnianie płynności w różnych protokołach", - "liquidityPool.page.title": "Dodaj płynność do pul{{version}} na Uniswap", - "liquidityPool.positions.closed.title": "Zamknięte pozycje", - "liquidityPool.positions.loadingMore": "Ładowanie większej liczby pozycji...", - "liquidityPool.positions.page.title": "Zarządzaj {{quoteSymbol}}/{{baseSymbol}} płynnością puli na Uniswap", - "liquidityPool.positions.page.version.description": "Wyświetl swoje aktywne pozycje płynności {{version}} . Dodaj nowe pozycje.", - "liquidityPool.positions.page.version.title": "Zarządzaj płynnością puli{{version}} na Uniswap", - "migrate.allowed": "Dozwolony", - "migrate.allowLpMigration": "Zezwalaj na migrację tokenów LP", - "migrate.connectAccount": "Musisz połączyć konto, do którego należy ta pozycja.", - "migrate.connectWallet": "Połącz się z portfelem, aby zobaczyć swoją płynność V2.", - "migrate.contract": "Umowa migracyjna Uniswap", - "migrate.firstLP": "Jesteś pierwszym dostawcą płynności dla tej puli Uniswap V3. Twoja płynność będzie migrować po bieżącej cenie {{source}} .", - "migrate.highGasCost": "Koszt transakcji będzie znacznie wyższy, ponieważ obejmuje gaz potrzebny do utworzenia basenu.", - "migrate.invalidRange": "Wybrano nieprawidłowy zakres. Cena minimalna musi być niższa niż cena maksymalna.", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} żetony PL", - "migrate.migrating": "Migracja", - "migrate.missingV2Position": "Nie widzisz jednej ze swoich pozycji v2? Zaimportuj.", - "migrate.noV2Liquidity": "Nie znaleziono płynności V2.", - "migrate.positionNoFees": "Twoja pozycja nie będzie generować opłat ani być wykorzystywana w transakcjach, dopóki cena rynkowa nie znajdzie się w Twoim zakresie.", - "migrate.priceDifference": "Różnica ceny: ", - "migrate.priceWarning": "Powinieneś wpłacać płynność do Uniswap V3 tylko po cenie, którą uważasz za właściwą.
Jeśli cena wydaje się nieprawidłowa, możesz albo dokonać zamiany, aby zmienić cenę, albo poczekać, aż zrobi to ktoś inny.", - "migrate.refund": "Co najmniej {{amtA}} {{symA}} i {{amtB}} {{symB}} zostaną zwrócone do Twojego portfela ze względu na wybrany przedział cenowy.", - "migrate.selectFeeTier": "Wybierz poziom opłat", - "migrate.setRange": "Ustal przedział cenowy", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Cena:", - "migrate.v2Description": "To narzędzie bezpiecznie przeprowadzi migrację Twojej płynności {{source}} do wersji V3. Proces ten jest całkowicie pozbawiony zaufania dzięki umowie migracyjnej <0>Uniswap ↗", - "migrate.v2Instruction": "Dla każdej puli pokazanej poniżej kliknij opcję migracji, aby usunąć płynność z Uniswap V2 i zdeponować ją w Uniswap V3.", - "migrate.v2Title": "Przeprowadź migrację płynności V2", - "migrate.v3Price": "V3 {{sym}} Cena:", - "mint.v3.input.invalidPrice.error": "Nieprawidłowe wprowadzone ceny", - "mobileAppPromo.banner.getTheApp.link": "Pobierz aplikację Portfel Uniswap", - "mobileAppPromo.banner.title": "Uniswap: Portfel kryptowalut i NFT", - "moonpay.poweredBy": "Fiat onramp obsługiwany przez MoonPay USA LLC", - "nav.createAccount.button": "Utwórz konto", - "nav.logIn.button": "Zaloguj się", - "nav.logInOrConnect.title": "Zaloguj się lub połącz", - "nav.products.tradingApi": "Zintegruj protokół", - "nav.products.unichain": "Łańcuch DeFi", - "nav.products.uniswapX": "Meta-agregator", - "nav.products.wallet": "Wymieniaj, przechowuj, eksploruj", - "nav.signUp.button": "Zapisać się", - "nav.tabs.createPosition": "Utwórz pozycję", - "nav.tabs.viewPositions": "Zobacz stanowiska", - "network.lostConnection": "Być może utraciłeś połączenie sieciowe.", - "network.mightBeDown": "{{network}} może być teraz wyłączony lub mogłeś utracić połączenie sieciowe.", - "network.warning": "Ostrzeżenie sieciowe", - "nft.noPools": "Nie ma jeszcze basenów", - "nft.reportSpam": "Zgłoś jako spam", - "notFound.oops": "Ups, zabierz mnie z powrotem do Swap", - "notice.uk": "Ta aplikacja internetowa jest udostępniana jako narzędzie umożliwiające użytkownikom interakcję z protokołem Uniswap z własnej inicjatywy, bez popierania lub rekomendowania działalności związanej z handlem kryptowalutami. Czyniąc to, Uniswap nie zaleca, aby użytkownicy lub potencjalni użytkownicy angażowali się w handel kryptowalutami, a użytkownicy lub potencjalni użytkownicy aplikacji internetowej nie powinni postrzegać tej strony internetowej ani jej zawartości jako zawierającej jakąkolwiek formę rekomendacji, zaproszenia lub zachęty do handlu kryptowalutami .", - "notice.uk.label": "Zastrzeżenie dotyczące Wielkiej Brytanii:", - "notification.assetVisibility.hidden": "{{assetName}} ukryte", - "notification.assetVisibility.unhidden": "{{assetName}} nieukryte", - "notification.buy.network": "Kupuję na {{network}}", - "notification.copied.address": "Adres skopiowany", - "notification.copied.calldata": "Dane połączeń skopiowane", - "notification.copied.contractAddress": "Skopiowano adres umowy", - "notification.copied.failed": "Nie udało się skopiować do schowka", - "notification.copied.image": "Obraz skopiowany", - "notification.copied.linkUrl": "Link skopiowany", - "notification.copied.nftUrl": "Skopiowano adres URL NFT", - "notification.copied.poolId": "Skopiowano identyfikator puli", - "notification.copied.tokenUrl": "Adres URL tokena został skopiowany", - "notification.copied.transactionId": "Skopiowano identyfikator transakcji", - "notification.copied.unitag": "Nazwa użytkownika została skopiowana", - "notification.countryChange": "Przełączono na {{countryName}}", - "notification.limit.network": "Tworzenie zlecenia limitowanego na {{network}}", - "notification.lp.network": "Zapewnianie płynności na {{network}}", - "notification.network.changed": "Przełączono na {{network}}", - "notification.passwordChanged": "Hasło zostało zmienione", - "notification.poolFinder.network": "Wyszukaj basen na {{network}}", - "notification.restore.success": "Portfel odnowiony!", - "notification.sell.network": "Sprzedaję {{network}}", - "notification.send.network": "Wysyłam {{network}}", - "notification.smartWallet.disabled": "Wyłączone w 1 sieci", - "notification.smartWallet.disabled.all": "Inteligentny portfel wyłączony", - "notification.smartWallet.disabled.plural": "Wyłączone w sieciach {{amount}}", - "notification.spam.NFT.failed": "Nie można zgłosić NFT. Spróbuj ponownie później.", - "notification.spam.NFT.successful": "Zgłoszono", - "notification.swap.network": "Zamiana na {{network}}", - "notification.swap.pending.swap": "Zamiana w oczekiwaniu", - "notification.swap.pending.unwrap": "Rozpakuj w oczekiwaniu", - "notification.swap.pending.wrap": "Zawijanie w toku", - "notification.transaction.approve.canceled": "Anulowano {{currencySymbol}} zatwierdzono.", - "notification.transaction.approve.fail": "Nie udało się zatwierdzić {{currencySymbol}} do użycia z {{address}}.", - "notification.transaction.approve.success": "Zatwierdzono {{currencySymbol}} do użytku z {{address}}.", - "notification.transaction.pending": "Transakcja oczekująca", - "notification.transaction.swap.canceled": "Anulowano wymianę {{inputCurrencySymbol}}-{{outputCurrencySymbol}} .", - "notification.transaction.swap.expired": "Zamiana {{inputCurrencyAmountWithSymbol}} na {{outputCurrencyAmountWithSymbol}} wygasła.", - "notification.transaction.swap.fail": "Nie udało się zamienić {{inputCurrencyAmountWithSymbol}} na {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.swap.success": "Zamieniono {{inputCurrencyAmountWithSymbol}} na {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.transfer.canceled": "Anulowano {{tokenNameOrAddress}} wyślij", - "notification.transaction.transfer.fail": "Nie udało się wysłać {{tokenNameOrAddress}} do {{walletNameOrAddress}}", - "notification.transaction.transfer.received": "Otrzymano {{tokenNameOrAddress}} od {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "Wysłano {{tokenNameOrAddress}} do {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "Nie udało się dokonać transakcji z {{addressOrEnsName}}", - "notification.transaction.unknown.fail.short": "transakcja nieudana", - "notification.transaction.unknown.success.full": "Transakcja z {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "Transakcja potwierdzona", - "notification.transaction.unwrap.canceled": "Anulowano {{inputCurrencySymbol}} rozpakowywanie.", - "notification.transaction.unwrap.fail": "Nie udało się rozpakować {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.unwrap.success": "Rozpakowano {{inputCurrencyAmountWithSymbol}} i otrzymano {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.canceled": "Anulowano zawijanie {{inputCurrencySymbol}} .", - "notification.transaction.wrap.fail": "Nie udało się zawinąć {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.success": "Zapakowano {{inputCurrencyAmountWithSymbol}} i otrzymano {{outputCurrencyAmountWithSymbol}}.", - "notification.transfer.pending": "Wyślij oczekujące", - "notification.walletConnect.confirmed": "Transakcja potwierdzona {{dappName}}", - "notification.walletConnect.connected": "Połączony", - "notification.walletConnect.disconnected": "Bezładny", - "notification.walletConnect.failed": "Transakcja nie powiodła się z {{dappName}}", - "notification.walletConnect.networkChanged.full": "Przełączono na {{networkName}}", - "notification.walletConnect.networkChanged.short": "Sieci przełączane", - "notifications.scantastic.subtitle": "Kontynuuj rozszerzenie Uniswap", - "notifications.scantastic.title": "Powodzenie!", - "onboarding.backup.manual.banner": "Zalecamy spisanie tego na kartce papieru i przechowywanie jej w bezpiecznym miejscu, np. w sejfie.", - "onboarding.backup.manual.displayWarning.description": "Zanim przejdziesz dalej, przeczytaj uważnie poniższy tekst.", - "onboarding.backup.manual.displayWarning.note.access": "Ta fraza odzyskiwania zapewnia pełny dostęp do portfela i środków", - "onboarding.backup.manual.displayWarning.note.secure": "Obejrzyj to prywatnie i nie udostępniaj nikomu", - "onboarding.backup.manual.displayWarning.note.storage": "Zapisz go i trzymaj w bezpiecznym miejscu", - "onboarding.backup.manual.displayWarning.title": "Kilka ważnych rzeczy, które warto wiedzieć", - "onboarding.backup.manual.error": "Nieprawidłowe lub błędnie napisane słowo", - "onboarding.backup.manual.placeholder": "Sekretne słowo", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} ukończono", - "onboarding.backup.manual.selectedWordPlaceholder": "Wybierz słowo", - "onboarding.backup.manual.subtitle_one": "Jakie jest {{count}}pierwsze słowo w Twojej frazie regeneracyjnej?", - "onboarding.backup.manual.subtitle_two": "Jakie jest {{count}}drugie słowo w Twojej frazie odzyskiwania?", - "onboarding.backup.manual.subtitle_few": "Jakie jest {{count}}trzecie słowo w Twojej frazie odzyskiwania?", - "onboarding.backup.manual.subtitle_other": "Jakie jest {{count}}-te słowo w Twojej frazie odzyskiwania?", - "onboarding.backup.manual.title": "Upewnijmy się, że nagrałeś to poprawnie", - "onboarding.backup.option.badge.quick": "Szybki", - "onboarding.backup.option.cloud.description": "Utwórz kopię zapasową swojego portfela za pomocą {{cloudProviderName}}i zabezpiecz ją hasłem odzyskiwania.", - "onboarding.backup.option.cloud.title": "Ustaw hasło odzyskiwania", - "onboarding.backup.option.manual.description": "Zapisz 12 sekretnych słów na kartce papieru i przechowuj ją w bezpiecznym miejscu.", - "onboarding.backup.option.manual.title": "Zapisz frazę odzyskiwania", - "onboarding.backup.reminder.backupNowButton": "Utwórz kopię zapasową teraz", - "onboarding.backup.reminder.remindMeLaterButton": "Przypomnij mi później", - "onboarding.backup.reminder.title": "Utwórz kopię zapasową swojego portfela", - "onboarding.backup.reminder.warning.description": "Utwórz kopię zapasową swojego portfela, aby móc odzyskać środki, jeśli zgubisz telefon lub kupisz nowy.", - "onboarding.backup.reminder.warning.fundsLabel": "Fundusze zagrożone", - "onboarding.backup.reminder.warning.title": "Możesz stracić swoje fundusze", - "onboarding.backup.speedBump.cloud.description": "Jeśli kiedykolwiek o tym zapomnisz, nie możemy tego zresetować za Ciebie. Zapisz to w bezpiecznym miejscu lub przechowuj bezpiecznie w menedżerze haseł.", - "onboarding.backup.speedBump.cloud.disclaimer": "Rozumiem, że Uniswap Labs nie może zresetować mojego hasła odzyskiwania.", - "onboarding.backup.speedBump.cloud.title": "Ważne jest, aby zapisać to hasło", - "onboarding.backup.speedBump.manual.description": "Upewnij się, że poprawnie zapisałeś frazę odzyskiwania i masz bezpieczne miejsce do jej przechowywania.", - "onboarding.backup.speedBump.manual.disclaimer": "Rozumiem, że Uniswap Labs nie będzie w stanie odzyskać mojego portfela, jeśli go zgubię.", - "onboarding.backup.speedBump.manual.title": "Zanim skończysz...", - "onboarding.backup.subtitle": "Oto jak odzyskać swój portfel, jeśli usuniesz aplikację lub zgubisz urządzenie.", - "onboarding.backup.title.existing": "Utwórz kopię zapasową swojego portfela", - "onboarding.backup.title.new": "Wybierz metodę tworzenia kopii zapasowej", - "onboarding.backup.view.subtitle.message1": "Zanim przejdziesz dalej, przeczytaj uważnie poniższe informacje", - "onboarding.backup.view.subtitle.message2": "Aby odzyskać portfel, musisz wpisać wszystkie 12 z tych tajnych słów.", - "onboarding.backup.view.title": "Zapisz frazę odzyskiwania", - "onboarding.backup.view.warning.message1": "Ta fraza odzyskiwania zapewnia pełny dostęp do portfela i środków", - "onboarding.backup.view.warning.message2": "Zapisz go i trzymaj w bezpiecznym miejscu", - "onboarding.backup.view.warning.message3": "Zobacz to prywatnie i nie udostępniaj tego nikomu", - "onboarding.cloud.confirm.description": "Musisz to wpisać, aby odzyskać swoje środki. Jeśli kiedykolwiek zapomnisz, nie będziemy mogli ich odzyskać.", - "onboarding.cloud.confirm.title": "Potwierdź hasło odzyskiwania", - "onboarding.cloud.createPassword.description": "Musisz to wpisać, aby odzyskać swoje środki. Jeśli kiedykolwiek zapomnisz, nie będziemy mogli ich odzyskać.", - "onboarding.cloud.createPassword.title": "Utwórz hasło odzyskiwania", - "onboarding.complete.button": "Otwórz rozszerzenie Uniswap", - "onboarding.complete.description": "Twój portfel jest gotowy do wysyłania i odbierania kryptowalut. Otwórz rozszerzenie Uniswap za pomocą poniższego skrótu.", - "onboarding.complete.go_to_uniswap": "Przejdź do aplikacji internetowej Uniswap", - "onboarding.complete.pin.description": "Kliknij ikonę pinezki, aby dodać rozszerzenie Uniswap do paska narzędzi.", - "onboarding.complete.pin.title": "Przypnij rozszerzenie Uniswap", - "onboarding.complete.title": "Wszystko gotowe", - "onboarding.extension.biometrics.subtitle.fingerprint": "Uzyskaj szybki i bezpieczny dostęp do swojego portfela za pomocą odcisku palca.", - "onboarding.extension.biometrics.title": "Włącz {{biometricsMethod}}", - "onboarding.extension.password.subtitle": "Będziesz tego potrzebować, aby odblokować portfel i uzyskać dostęp do frazy odzyskiwania", - "onboarding.extension.password.title.default": "Stwórz hasło", - "onboarding.extension.password.title.reset": "Zresetuj swoje hasło", - "onboarding.extension.unsupported.android.description": "Rozszerzenie Uniswap jest kompatybilne tylko z przeglądarką Chrome na komputerze.", - "onboarding.extension.unsupported.android.title": "Przeglądarka Chrome na urządzeniach mobilnych nie jest (jeszcze) obsługiwana", - "onboarding.extension.unsupported.description": "Rozszerzenie Uniswap jest obecnie kompatybilne tylko z przeglądarką Chrome.", - "onboarding.extension.unsupported.title": "Ta przeglądarka nie jest obsługiwana (jeszcze)", - "onboarding.home.intro.backup.description.extension": "Zapisz frazę odzyskiwania, aby mieć pewność, że nigdy nie utracisz dostępu do portfela.", - "onboarding.home.intro.backup.description.mobile": "Utwórz plan odzyskiwania danych na wypadek zgubienia telefonu lub zakupu nowego.", - "onboarding.home.intro.backup.title": "Utwórz kopię zapasową swojego portfela", - "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK i JUP — teraz dostępne w Unichain", - "onboarding.home.intro.bridgedAssets.title": "Handluj nowymi tokenami na Unichain", - "onboarding.home.intro.fund.description": "Zasil swój portfel, kupując kryptowalutę lub przelewając z innego konta.", - "onboarding.home.intro.fund.title": "Zdobądź swój pierwszy token", - "onboarding.home.intro.label.required": "Wymagany", - "onboarding.home.intro.label.swipe": "Trzepnąć", - "onboarding.home.intro.pushNotifications.description": "Otrzymuj alerty cenowe dotyczące Twoich ulubionych tokenów, trendów rynkowych i nie tylko.", - "onboarding.home.intro.pushNotifications.title": "Bądź na bieżąco", - "onboarding.home.intro.unitag.description": "Zbuduj spersonalizowany profil web3 i łatwo udostępniaj swój adres znajomym.", - "onboarding.home.intro.unitag.title": "Odbierz swoją nazwę użytkownika {{unitagDomain}}", - "onboarding.import.error.invalidWords_one": "1 słowo jest nieprawidłowe lub błędnie napisane", - "onboarding.import.error.invalidWords_other": "{{count}} słowa są nieprawidłowe lub błędnie napisane", - "onboarding.import.method.restore.message.android": "Dodaj portfele, których kopię zapasową utworzyłeś, do konta Google Drive.", - "onboarding.import.method.restore.message.ios": "Dodaj portfele, których kopię zapasową utworzyłeś, do swojego konta iCloud.", - "onboarding.import.method.restore.title": "Przywróć portfel", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.android": "Wprowadź hasło odzyskiwania, aby przywrócić portfel za pomocą kopii zapasowej na Dysku Google.", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.ios": "Wprowadź hasło odzyskiwania, aby przywrócić portfel za pomocą kopii zapasowej iCloud.", - "onboarding.import.method.restoreSeedPhrase.cloud.title.android": "Przywróć z Dysku Google", - "onboarding.import.method.restoreSeedPhrase.cloud.title.ios": "Przywróć z iCloud", - "onboarding.import.method.restoreSeedPhrase.title": "Wybierz sposób przywrócenia portfela", - "onboarding.import.method.restoreSeedPhrase.wallet.desc": "Wprowadź 12 tajnych słów, które wcześniej zapisałeś w bezpiecznym miejscu.", - "onboarding.import.method.restoreSeedPhrase.wallet.title": "Wprowadź frazę odzyskiwania", - "onboarding.import.method.viewPrivateKeys.button.desc": "Wyświetl swój klucz prywatny", - "onboarding.import.method.viewPrivateKeys.title": "Nie posiadasz żadnego z powyższych? ", - "onboarding.import.onDeviceRecovery.other_options": "Utwórz lub zaimportuj inny portfel", - "onboarding.import.onDeviceRecovery.other_options.label": "Nie chcesz żadnego z powyższych?", - "onboarding.import.onDeviceRecovery.subtitle": "Wybierz portfel, do którego chcesz się ponownie zalogować.", - "onboarding.import.onDeviceRecovery.title": "Witamy ponownie w Uniswapie", - "onboarding.import.onDeviceRecovery.wallet.button": "Zobacz frazę odzyskiwania", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 inny portfel", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} inne portfele", - "onboarding.import.onDeviceRecovery.warning.caption": "Upewnij się, że wykonałeś kopię zapasową wszystkich innych portfeli. Jeśli kiedykolwiek będziesz chciał je przywrócić, będziesz potrzebować ich fraz odzyskiwania lub odpowiadających im kopii zapasowych {{cloudProvider}} .", - "onboarding.import.onDeviceRecovery.warning.title": "Jesteś pewny?", - "onboarding.import.selectMethod.errorMessage": "Wystąpił nieoczekiwany błąd. Spróbuj ponownie.", - "onboarding.import.selectMethod.mobileApp.subtitle": "Importuj portfel z aplikacji mobilnej za pomocą kodu QR.", - "onboarding.import.selectMethod.mobileApp.title": "Użyj Uniswap Mobile", - "onboarding.import.selectMethod.passkey.subtitle": "Zsynchronizuj swój portfel Uniswap przy użyciu istniejącego klucza dostępu.", - "onboarding.import.selectMethod.passkey.title": "Zaloguj się za pomocą klucza dostępu", - "onboarding.import.selectMethod.recoveryPhrase.subtitle": "Importuj z innego portfela kryptowalut.", - "onboarding.import.selectMethod.recoveryPhrase.title": "Wprowadź frazę odzyskiwania", - "onboarding.import.selectMethod.title": "Zaloguj się lub zaimportuj portfel", - "onboarding.import.title": "Wybierz sposób dodania portfela", - "onboarding.importMnemonic.button.default": "Moje zdanie naprawcze składa się z 12 słów", - "onboarding.importMnemonic.button.importing": "Importowanie...", - "onboarding.importMnemonic.button.longPhrase": "Moje zdanie dotyczące odzyskiwania jest dłuższe", - "onboarding.importMnemonic.error.invalidPhrase": "Wprowadzona fraza jest nieprawidłowa", - "onboarding.importMnemonic.subtitle": "Wpisz lub wklej frazę odzyskiwania składającą się z 12 słów", - "onboarding.importMnemonic.title": "Wpisz frazę odzyskiwania", - "onboarding.importPasskey.bringWindowToFront": "Przesuń okno do przodu", - "onboarding.importPasskey.continueInSecureWindow": "Kontynuuj w bezpiecznym oknie logowania.", - "onboarding.intro.button.alreadyHave": "Mam już portfel", - "onboarding.intro.button.logInOrImport": "Zaloguj się lub importuj", - "onboarding.intro.mobileScan.button": "Zeskanuj kod QR, aby zaimportować", - "onboarding.intro.mobileScan.title": "Masz aplikację Uniswap?", - "onboarding.landing.button.add": "Dodaj istniejący portfel", - "onboarding.landing.button.create": "Utwórz portfel", - "onboarding.landing.button.createAccount": "Utwórz konto", - "onboarding.name.choose": "Wybierz nazwę użytkownika", - "onboarding.name.choose.subtitle": "Jest to publiczna nazwa, której każdy może używać, aby wysyłać Ci kryptowaluty.", - "onboarding.notification.permission.message": "Aby otrzymywać powiadomienia, włącz powiadomienia dla Portfela Uniswap w ustawieniach swojego urządzenia.", - "onboarding.notification.permission.title": "Zezwolenie na powiadomienia", - "onboarding.notification.subtitle": "Bądź na bieżąco ze statusami transakcji i większymi zmianami cen ulubionych tokenów.", - "onboarding.notification.title": "Włącz powiadomienia", - "onboarding.passkey.create": "Utwórz swój klucz dostępu", - "onboarding.passkey.loading.subtitle": "To zajmie tylko chwilę.", - "onboarding.passkey.loading.title": "Znalezienie portfela...", - "onboarding.passkey.secure": "Zabezpiecz swoje konto", - "onboarding.passkey.secure.description": "Klucze dostępu umożliwiają szybki i bezpieczny dostęp do konta przy użyciu wyłącznie twarzy lub odcisku palca.", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "Potwierdźmy, że zrobiłeś to dobrze. Jeśli zgubisz lub zapiszesz to niepoprawnie, nie będziesz w stanie odzyskać swoich środków.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "Jeśli zgubisz lub zapiszesz nieprawidłowo te dane, nie będziesz mógł odzyskać swoich środków.", - "onboarding.recoveryPhrase.confirm.title": "Potwierdźmy, że masz rację", - "onboarding.recoveryPhrase.view.subtitle": "Aby odzyskać portfel, musisz wpisać wszystkie 12 z tych tajnych słów.", - "onboarding.recoveryPhrase.view.title": "Zapisz frazę odzyskiwania", - "onboarding.recoveryPhrase.view.title.hasPassword": "Jeśli kiedykolwiek zapomnisz swojego hasła...", - "onboarding.recoveryPhrase.warning.final.button": "jestem gotowy", - "onboarding.recoveryPhrase.warning.final.message": "Twoja fraza odzyskiwania zapewnia Tobie (i każdemu, kto ją posiada) dostęp do Twoich środków. Pamiętaj, aby zachować to dla siebie.", - "onboarding.recoveryPhrase.warning.final.title": "Wykonaj ten krok w odosobnionym miejscu", - "onboarding.recoveryPhrase.warning.screenshot.message": "Każdy, kto uzyska dostęp do Twoich zdjęć, może uzyskać dostęp do Twojego portfela. Zamiast tego zalecamy zapisanie słów.", - "onboarding.recoveryPhrase.warning.screenshot.title": "Zrzuty ekranu nie są bezpieczne", - "onboarding.resetPassword.complete.safety": "Dowiedz się więcej o bezpieczeństwie portfela", - "onboarding.resetPassword.complete.subtitle": "Użyj nowego hasła, aby odblokować swój portfel.", - "onboarding.resetPassword.complete.title": "Resetowania hasła", - "onboarding.scan.error": "Wystąpił błąd podczas ładowania kodu QR", - "onboarding.scan.otp.error": "Przesłany kod jest nieprawidłowy lub wystąpił błąd podczas przesyłania. Proszę spróbuj ponownie.", - "onboarding.scan.otp.failed": "Nieudane próby: {{number}}", - "onboarding.scan.otp.subtitle": "Sprawdź swoją aplikację mobilną Uniswap pod kątem 6-znakowego kodu", - "onboarding.scan.otp.title": "Wpisz kod jednorazowy", - "onboarding.scan.subtitle": "Zeskanuj kod QR za pomocą aplikacji mobilnej Uniswap, aby rozpocząć importowanie swojego portfela.", - "onboarding.scan.title": "Zaimportuj portfel z aplikacji", - "onboarding.scan.troubleScanning.message": "Importuj za pomocą frazy odzyskiwania", - "onboarding.scan.troubleScanning.title": "Masz problemy ze skanowaniem?", - "onboarding.scan.wifi": "Podłącz telefon do tej samej sieci Wi-Fi co komputer.", - "onboarding.security.alert.biometrics.message.android": "Aby korzystać z biometrii, najpierw skonfiguruj ją w ustawieniach", - "onboarding.security.alert.biometrics.message.ios": "Aby użyć {{biometricsMethod}}, zezwól na dostęp w ustawieniach systemu", - "onboarding.security.alert.biometrics.title.android": "Biometria jest wyłączona", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} jest wyłączone", - "onboarding.security.button.confirm.android": "Włącz biometrię", - "onboarding.security.button.confirm.ios": "Włącz {{biometricsMethod}}", - "onboarding.security.button.setup": "Organizować coś", - "onboarding.security.subtitle.android": "Dodaj dodatkową warstwę bezpieczeństwa, wymagając danych biometrycznych do wysyłania transakcji.", - "onboarding.security.subtitle.ios": "Dodaj dodatkową warstwę zabezpieczeń, wymagając {{biometricsMethod}} wysyłania transakcji.", - "onboarding.security.title": "Chroń swój portfel", - "onboarding.selectWallets.error": "Nie udało się wczytać adresów", - "onboarding.selectWallets.title.default": "Wybierz portfele do zaimportowania", - "onboarding.selectWallets.title.error": "Błąd podczas importowania portfeli", - "onboarding.termsOfService": "Kontynuując, zgadzam się z Warunkami świadczenia usług i wyrażam zgodę na Politykę prywatności", - "onboarding.tooltip.recoveryPhrase.trigger": "Co to jest zwrot dotyczący odzyskiwania?", - "onboarding.wallet.continue": "Chrońmy to", - "onboarding.wallet.defaultName": "Portfel {{number}}", - "onboarding.wallet.description.full": "To jest Twoja osobista przestrzeń na tokeny, transakcje NFT i wszystkie transakcje. Zakończ konfigurację, aby zapewnić bezpieczeństwo swoich środków.", - "onboarding.wallet.title": "Witamy w Twoim nowym portfelu", - "onboarding.welcome.subtitle": "Dokończmy konfigurację Twojego portfela.", - "onboarding.welcome.title": "Powitanie!", - "outageBanner.message": "Dane {{chainName}}{{versionDescription}} są w tej chwili niedostępne, spodziewamy się jednak, że problem ten wkrótce zostanie rozwiązany.", - "outageBanner.message.sub": "Nadal możesz bez problemu wymieniać i zapewniać płynność w tym łańcuchu.", - "outageBanner.title": "{{versionName}} wkrótce powróci", - "passkeys.help.modal.subtitle": "Jeśli masz problemy z kluczami dostępu, odwiedź dział pomocy technicznej Uniswap, aby uzyskać pomoc.", - "passkeys.help.modal.subtitle.invalidPasskey": "Twoje żądanie nie mogło zostać zrealizowane. Spróbuj ponownie, używając klucza dostępu powiązanego z ", - "passkeys.help.modal.subtitle.technicalError": "Twoje żądanie nie mogło zostać zrealizowane z powodu nieoczekiwanego błędu technicznego. Twoje środki są bezpieczne. Spróbuj ponownie.", - "passkeys.help.modal.title": "Potrzebuję pomocy?", - "passkeys.help.modal.title.invalidPasskey": "Nieprawidłowy klucz dostępu", - "passkeys.help.modal.title.technicalError": "Błąd techniczny", - "passkeys.manage.modal.subtitle": "Aby dodać lub usunąć klucze dostępu, zaloguj się do {{passkeyManagementUrl}}.", - "passkeys.manage.modal.title": "Zarządzaj kluczami dostępu", - "permit.approval.fail": "Zatwierdzenie pozwolenia nie powiodło się", - "permit.approval.fail.message": "Permit2 umożliwia udostępnianie zatwierdzeń tokenów i zarządzanie nimi w różnych aplikacjach.", - "pool.activeRange": "Aktywny zakres zaznaczeń", - "pool.addAs": "Dodaj jako {{nativeWrappedSymbol}}", - "pool.apr": "KWIECIEŃ", - "pool.apr.base": "Podstawowa APR", - "pool.apr.description": "Rocznie w oparciu o opłaty za 1 dzień", - "pool.apr.reward": "Nagroda APR", - "pool.aprText": "Basen APR", - "pool.balances": "Bilanse basenowe", - "pool.closedCTA.description": "Możesz je zobaczyć korzystając z filtra znajdującego się na górze strony.", - "pool.closedCTA.title": "Szukasz zamkniętych pozycji?", - "pool.collectAs": "Zbierz jako {{nativeWrappedSymbol}}", - "pool.collectFees": "Zbieraj opłaty", - "pool.connectEthereumToView": "Połącz portfel Ethereum, aby wyświetlić swoje pule", - "pool.create": "Tworzenie nowego puli", - "pool.create.info": "Twoje wybory stworzą nową pulę płynności, co może skutkować niższą początkową płynnością i zwiększoną zmiennością. Rozważ dodanie do istniejącej puli, aby zminimalizować te ryzyka.", - "pool.createdPosition": "Utworzono pozycję", - "pool.createdPosition.canceled": "Utwórz pozycję anulowaną", - "pool.createdPosition.failed": "Nie udało się utworzyć pozycji", - "pool.dynamic": "Pula dynamiczna", - "pool.earnings": "Zyski", - "pool.earnings.empty": "Nie masz jeszcze żadnych zarobków", - "pool.explorers": "Odkrywcy", - "pool.import": "Importuj pulę", - "pool.import.link.description": "Niektóre pozycje v2 nie są wyświetlane automatycznie.", - "pool.import.positions.v2": "Importuj pozycje V2", - "pool.import.positions.v2.selectPair.description": "Niektóre pozycje v2 nie są wyświetlane automatycznie. Wybierz parę tokenów, aby zaimportować i wyświetlić swoje pozycje.", - "pool.import.success": "Pula zaimportowana", - "pool.incentives.administeredRewards": "Nagrody są dystrybuowane na podstawie autonomicznej umowy dystrybutorskiej Merkl.", - "pool.incentives.collect": "Zbierać", - "pool.incentives.collectedRewards": "Zebrane nagrody", - "pool.incentives.collectFailed": "Odbieranie nie powiodło się. Spróbuj ponownie.", - "pool.incentives.collectFailedNoRetry": "Odbieranie nagród nie powiodło się.", - "pool.incentives.collectingRewards": "Zbieranie nagród", - "pool.incentives.collectRewards": "Zbieraj nagrody", - "pool.incentives.collectRewardsCanceled": "Zbieranie nagród anulowane", - "pool.incentives.daysLeft": "dni pozostałe", - "pool.incentives.eligible": "Kwalifikujące się pule oferują nagrody w postaci tokenów, dzięki którym możesz zarobić więcej", - "pool.incentives.merklDocs": "Obliczone przez Merkla na podstawie nagród za emisję i puli TVL.", - "pool.incentives.rewardsDistribution": "Dystrybucja nagród", - "pool.incentives.rewardsEarned": "Zdobyte nagrody", - "pool.incentives.similarPoolHasRewards": "Podobny basen ma nagrody UNI", - "pool.incentives.switchPools": "Pule przełączników", - "pool.incentives.timePeriod": "Okres czasu", - "pool.incentives.uni.findMore": "Znajdź baseny z nagrodami UNI", - "pool.incentives.yourRewards.error": "Twoje nagrody są obecnie niedostępne", - "pool.incentives.yourRewards.error.description": "Nie można pobrać nagród. Może to być spowodowane problemem z siecią. Spróbuj ponownie załadować stronę.", - "pool.info": "Informacje o basenie", - "pool.limitFluctuation.warning": "Należy pamiętać, że realizacja limitów może się różnić w zależności od wahań rynkowych w czasie rzeczywistym i przeciążenia sieci Ethereum. Limity mogą nie zostać wykonane dokładnie wtedy, gdy tokeny osiągną określoną cenę.", - "pool.liquidity.data.error.message": "Wystąpił błąd podczas pobierania danych wymaganych do transakcji.", - "pool.liquidity.outOfSync": "Niedopasowanie cen basenowych i rynkowych", - "pool.liquidity.outOfSync.message": "Ceny w tej puli różnią się od cen rynkowych wybranych tokenów. Dostosuj odpowiednio swój przedział cenowy lub poczekaj, aż pula zostanie zrównoważona, aby uniknąć strat.", - "pool.maxPrice": "Cena maksymalna", - "pool.migrateLiquidity": "Migracja płynności", - "pool.migrateLiquidityDisabledTooltip": "Ten łańcuch nie obsługuje pul płynności v4.", - "pool.migrateToV4": "Migracja do v4", - "pool.minPrice": "Cena minimalna", - "pool.newPosition.plus": "+ Nowa pozycja", - "pool.newPosition.title": "Nowa pozycja", - "pool.newSpecificPosition": "Nowa pozycja {{symbol}}", - "pool.notAvailableOnSolana": "Na Solanie nie ma basenów", - "pool.notFound.description": "Przepraszamy, nie możemy znaleźć żadnych informacji o tym basenie. Sprawdź nazwę i adres i spróbuj ponownie.", - "pool.notFound.title": "Basen nie znaleziony", - "pool.openToStart.evmAndSolanaConnected": "Otwórz nową pozycję lub utwórz pulę, aby zacząć. Pule nie są dostępne na platformie Solana.", - "pool.openToStart.evmOnly": "Aby rozpocząć, otwórz nową pozycję lub utwórz pulę.", - "pool.percent": "{{pct}}% puli", - "pool.pooled": "Połączone {{sym}}:", - "pool.position": "Pozycja", - "pool.positions": "Pozycje", - "pool.positions.title": "Twoje pozycje", - "pool.positions.transaction.settings": "Ustawienia transakcji", - "pool.positions.usdValueUnavailable": "Wartość USD niedostępna", - "pool.positions.usdValueUnavailable.tooltip": "Wartość USD jest obecnie niedostępna dla tej pozycji. Zobacz szczegóły pozycji dla zdeponowanych kwot tokenów.", - "pool.refresh.prices": "Odśwież ceny", - "pool.removeLiquidity": "Usuń płynność", - "pool.rewardAPR": "Nagroda APR (UNI)", - "pool.rewardAPR.percent": "{{pct}} nagroda APR", - "pool.rewards": "Nagrody", - "pool.rewardsPool.label": "Żetony puli w puli nagród:", - "pool.selectPair": "Wybierz parę", - "pool.share.label": "Twój udział w puli:", - "pool.specificPosition": "{{symbol}} pozycja", - "pool.tokenPair": "Para tokenów", - "pool.top.rewards": "Baseny z nagrodami", - "pool.top.tvl": "Najlepsze baseny według TVL", - "pool.top.volume": "Baseny według wolumenu 24H", - "pool.totalAPR": "Całkowite RRSO", - "pool.totalTokens": "Twoje całkowite tokeny puli:", - "pool.v2": "baseny v2", - "pool.v3": "baseny v3", - "pool.via": "{{tokenPair}} przez {{dex}}", - "pool.volOverTvl": "1D objętość/TVL", - "pool.volume.thirtyDay": "30-dniowy wolumen", - "pool.volume.thirtyDay.short": "30D tom", - "pool.withdrawAs": "Wypłać jako {{nativeWrappedSymbol}}", - "poolFinder.availablePools": "Dostępne baseny", - "poolFinder.availablePools.found.description": "Pule v2 odpowiadające wybranemu przez Ciebie wyborowi par.", - "poolFinder.availablePools.notFound.description": "Nie znaleziono pasujących puli v2. Sprawdź ponownie swój wybór tokenów i upewnij się, że jesteś połączony z właściwym portfelem.", - "pools.explore": "Odkryj baseny", - "portfolio.activity.filters.timePeriod.all": "Cały czas", - "portfolio.activity.filters.transactionType.all": "Wszystkie typy", - "portfolio.activity.filters.transactionType.deposits": "Depozyty", - "portfolio.activity.filters.transactionType.staking": "Staking", - "portfolio.activity.filters.transactionType.swaps": "Swapy", - "portfolio.activity.title": "Działalność", - "portfolio.connectWallet.summary": "Śledź tokeny, pule i inne w sieciach {{amount}}+", - "portfolio.defi.title": "DeFi", - "portfolio.description": "Śledź swój portfel kryptowalut we wszystkich łańcuchach i protokołach", - "portfolio.nfts.title": "NFT", - "portfolio.overview.title": "Przegląd", - "portfolio.title": "Teczka", - "portfolio.tokens.table.column.allocation": "Przydział", - "portfolio.tokens.table.column.balance": "Balansować", - "portfolio.tokens.table.column.change1d": "Zmiana 1D", - "portfolio.tokens.table.column.price": "Cena", - "portfolio.tokens.table.column.token": "Znak", - "portfolio.tokens.table.column.value": "Wartość", - "portfolio.tokens.title": "Żetony", - "position.addHook": "Dodaj hak", - "position.addHook.tooltip": "Hooki to zaawansowana funkcja, która umożliwia pulom interakcję z inteligentnymi kontraktami, odblokowując różne możliwości. Zachowaj ostrożność podczas dodawania hooków, ponieważ niektóre mogą być złośliwe lub powodować niezamierzone konsekwencje.", - "position.addingHook": "Dodawanie haka", - "position.addingHook.disclaimer": "Dodawanie haczyków może mieć niezamierzone konsekwencje. Przeprowadź rozeznanie i działaj na własne ryzyko.", - "position.addingHook.hideProperties": "Ukryj właściwości", - "position.addingHook.invalidAddress": "Wprowadź prawidłowy adres haka", - "position.addingHook.viewProperties": "Wyświetl właściwości", - "position.create.confirm": "Potwierdź pozycję", - "position.create.invalidPrice": "Nieprawidłowa cena", - "position.create.invalidRange": "Nieprawidłowy zakres", - "position.create.modal.header": "Tworzenie pozycji", - "position.create.unsupportedSolana": "Pule Solana nie są obsługiwane.", - "position.create.unsupportedSolana.description": "Aby utworzyć pulę, należy przełączyć się na obsługiwany łańcuch EVM.", - "position.create.unsupportedToken.description": "Spróbuj utworzyć przy użyciu innej wersji protokołu.", - "position.create.v2unsupportedChain": "Ten łańcuch nie jest obsługiwany w przypadku pul v2.", - "position.currentValue": "Wartość bieżącej pozycji", - "position.default_price_strategies": "Strategie cenowe", - "position.default_price_strategies.error": "Nie można ustawić strategii cenowej", - "position.deposit.confirm.create.description.less": "Wprowadzona cena początkowa jest o {{value}}% niższa od ceny rynkowej i może skutkować utratą środków. Czy chcesz kontynuować?", - "position.deposit.confirm.create.description.more": "Wprowadzona cena początkowa jest o {{value}}% wyższa od ceny rynkowej i może skutkować utratą środków. Czy chcesz kontynuować?", - "position.deposit.confirm.create.title": "Duża różnica cen w stosunku do cen rynkowych", - "position.deposit.description": "Określ kwoty tokenów dla swojego wkładu płynnościowego.", - "position.depositedCurrency": "Złożono {{currencySymbol}}", - "position.fot.warning": "{{token}} i inne tokeny „Opłaty za transfer” obsługiwane są wyłącznie przez Uniswap v2.", - "position.fot.warning.cta": "Utwórz pozycję v2", - "position.hook.disclaimer": "Rozumiem potencjalne ryzyko związane z dodaniem tego haka.", - "position.hook.donateWarning": "Ta flaga może spowodować zmianę wysokości naliczonych opłat.", - "position.hook.liquidityWarning": "Ta flaga może spowodować, że pula zablokuje dodawanie nowej płynności. Twoja transakcja może zostać cofnięta.", - "position.hook.removeWarning": "Może spowodować zablokowanie środków lub uniemożliwić pobieranie opłat.", - "position.hook.swapWarning": "Ta flaga może umożliwić dostawcom płynności łatwiejsze wykorzystanie płynności Just-In-Time, co może skutkować niższymi opłatami.", - "position.hook.warningHeader": "Ważne: zidentyfikowano ryzyko związane z haczykami", - "position.hook.warningInfo": "Zidentyfikowaliśmy potencjalne zagrożenia związane z tym hakiem. Upewnij się, że rozumiesz, jak działa ten haczyk, zanim zdecydujesz się kontynuować.", - "position.increase.fot": "Dodawanie płynności dla {{token}} i innych tokenów „Opłata za transfer” nie jest obsługiwane.", - "position.initialPrice": "Cena początkowa", - "position.initialPrice.difference.negative": "{{ value }}% mniej niż cena rynkowa", - "position.initialPrice.difference.positive": "{{ value }}% więcej niż cena rynkowa", - "position.initialPrice.info": "Podczas tworzenia nowego puli należy ustawić początkowy kurs wymiany dla obu tokenów. Kurs ten będzie odzwierciedlał początkową cenę rynkową.", - "position.initialPrice.set": "Ustaw cenę początkową", - "position.initialPrice.useMarketPrice": "Użyj ceny rynkowej", - "position.migrate.liquidity": "Podczas migracji pozycji nie możesz zmienić pary tokenów, ale możesz dodać hak w celu zwiększenia funkcjonalności.", - "position.migrate.v4unsupportedChain": "Ten łańcuch nie jest obsługiwany dla pul v4.", - "position.new": "Nowa pozycja", - "position.new.protocol": "Nowa pozycja {{protocol}}", - "position.notFound": "Pozycja nie znaleziona", - "position.notFound.description": "Szczegóły dotyczące tego stanowiska są niedostępne. Sprawdź, czy jesteś połączony z właściwym portfelem.", - "position.one_sided_lower": "Jednostronna dolna", - "position.one_sided_lower.description": "Zapewnij płynność, jeśli cena spadnie", - "position.one_sided_upper": "Jednostronna górna", - "position.one_sided_upper.description": "Zapewnij płynność, jeśli cena wzrośnie", - "position.protocol": "{{protocol}} pozycja", - "position.provide.liquidity": "Wybierz tokeny, dla których chcesz zapewnić płynność. Możesz wybrać tokeny we wszystkich obsługiwanych sieciach.", - "position.provide.liquidityDescription": "Zapewnienie pełnej płynności gwarantuje ciągły udział w rynku przy wszystkich możliwych cenach, oferując prostotę, ale niosąc ze sobą potencjał wyższych nietrwałych strat.", - "position.provide.liquidityDescription.creatingPool": "Ustawienie pełnego zakresu płynności podczas tworzenia puli zapewnia ciągły udział w rynku przy wszystkich możliwych cenach, oferując prostotę, ale niosąc ze sobą potencjał wyższych nietrwałych strat.", - "position.provide.liquidityDescription.custom": "Niestandardowy zakres pozwala Ci skoncentrować płynność finansową w określonych ramach cenowych, zwiększając efektywność kapitału i przychody z opłat, ale wymagając bardziej aktywnego zarządzania.", - "position.provide.outOfRange.closePosition": "Zamknij pozycję", - "position.provide.outOfRange.description": "Zakres tej pozycji nie może być dostosowany podczas migracji. Aby ustawić nowy zakres, zamknij tę pozycję i otwórz nową pozycję v4.", - "position.provide.outOfRange.title": "Migrujesz pozycję poza zasięgiem", - "position.removeHook": "Usuń hak", - "position.resetDescription": "Twoje wybory dotyczące tokenów, cen i zakresów zostaną zresetowane.", - "position.setRange": "Ustal przedział cenowy", - "position.setRange.inputsBelow": "Użyj poniższych danych wejściowych, aby ustawić swój zakres.", - "position.stable": "Stabilny", - "position.stable.description": "Dobre dla stablecoinów lub par o niskiej zmienności", - "position.step.deposit": "Wprowadź kwotę depozytu", - "position.step.price": "Ustaw cenę początkową i kwotę depozytu", - "position.step.range": "Ustaw przedział cenowy i kwoty depozytów", - "position.step.select": "Wybierz parę tokenów i opłaty", - "position.value": "Wartość pozycji", - "position.valueUnavailable": "Wartość USD jest obecnie niedostępna dla tej pozycji. Zobacz szczegóły pozycji dla zdeponowanych kwot tokenów.", - "position.wide": "Szeroki", - "position.wide.description": "Dobre dla zmiennych par", - "position.wrapped.unwrap": "Rozwiń {{wrappedToken}}", - "position.wrapped.warning": "{{nativeToken}} wymagane dla pul v4", - "position.wrapped.warning.info": "Rozpakuj swoje {{wrappedToken}} i wpłać {{nativeToken}} , aby zapewnić sobie bardziej opłacalną i wydajną płynność.", - "positions.noPositions.description": "Nie masz żadnych pozycji płynności. Utwórz nową pozycję, aby zacząć zarabiać opłaty i nagrody w kwalifikujących się pulach.", - "positions.noPositions.title": "Brak stanowisk", - "positions.welcome.connect.description": "Aby zobaczyć swoje pozycje i nagrody musisz połączyć swój portfel.", - "positions.welcome.connect.wallet": "Połącz swój portfel", - "privacy.anonymizedLogs": "Aplikacja rejestruje anonimowe statystyki użytkowania, aby z czasem je udoskonalać.", - "privacy.autoRouter": "Aplikacja pobiera optymalną trasę handlową z serwera Uniswap Labs.", - "privacy.infura": "Aplikacja pobiera dane z łańcucha i tworzy wywołania kontraktów za pomocą interfejsu API Infura.", - "privacy.thirdPartyApis": "Ta aplikacja korzysta z następujących interfejsów API innych firm:", - "privacy.trm": "Aplikacja bezpiecznie zbiera adres Twojego portfela i udostępnia go TRM Labs Inc. ze względu na ryzyko i zgodność.", - "privacy.uniswaptos": "Warunki świadczenia usług Uniswap Labs", - "privateKeys.export.modal.speedbump.bullet1": "Zobacz to prywatnie", - "privateKeys.export.modal.speedbump.bullet2": "Nie udostępniaj nikomu", - "privateKeys.export.modal.speedbump.bullet3": "Nigdy nie wpisuj go do żadnych stron internetowych ani aplikacji", - "privateKeys.export.modal.speedbump.subtitle": "Każdy, kto zna Twój klucz prywatny, może uzyskać dostęp do Twojego portfela i środków.", - "privateKeys.export.modal.speedbump.title": "Zanim będziesz kontynuować", - "privateKeys.export.modal.subtitle": "Wygląda na to, że nie możesz w pełni przywrócić swojego portfela. Aby mieć pewność, że nigdy nie stracisz dostępu do swoich środków, skopiuj swój klucz prywatny.", - "privateKeys.export.modal.title": "Eksportuj swój klucz prywatny", - "privateKeys.export.modal.warning": "Jeśli zgubisz telefon lub usuniesz aplikację, będziesz musiał zaimportować ten klucz do innego portfela.", - "privateKeys.view.button.continue": "Skopiowałem je wszystkie.", - "privateKeys.view.button.continue.single": "Skopiowałem to.", - "privateKeys.view.subtitle": "Twój klucz prywatny przyznaje dostęp do określonego portfela. Każdy portfel ma inny klucz prywatny.", - "privateKeys.view.title": "Klucz prywatny", - "qrScanner.button.connections_one": "Połączono 1 aplikację", - "qrScanner.button.connections_other": "{{count}} aplikacje połączone", - "qrScanner.error.camera.message": "Aby zeskanować kod, zezwól na dostęp do aparatu w ustawieniach systemu", - "qrScanner.error.camera.title": "Kamera jest wyłączona", - "qrScanner.error.none": "Nie znaleziono kodu QR", - "qrScanner.recipient.action.scan": "Zeskanuj kod QR", - "qrScanner.recipient.action.show": "Pokaż mój kod QR", - "qrScanner.recipient.error.message": "Zanim spróbujesz ponownie, upewnij się, że skanujesz prawidłowy kod QR adresu Ethereum.", - "qrScanner.recipient.error.title": "Nieprawidłowy kod QR", - "qrScanner.request.message.unavailable": "Nie znaleziono wiadomości.", - "qrScanner.request.method.default": "Prośba od {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "Prośba o podpis od {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "Żądanie transakcji od {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "Zezwól {{dappName}} na użycie do {{amount}} {{currencySymbol}}?", - "qrScanner.request.withoutAmount": "Zezwól {{dappName}} na użycie twojego {{currencySymbol}}?", - "qrScanner.status.connecting": "Złączony...", - "qrScanner.status.loading": "Ładowanie...", - "qrScanner.title": "Zeskanuj kod QR", - "qrScanner.wallet.networks": "Obsługiwane sieci", - "range.outOfView": "Zasięg poza zasięgiem wzroku", - "removeLiquidity.pooled": "Połączone {{symbol}}:", - "revoke.failed.message": "Problem z siecią lub połączeniem prawdopodobnie spowodował niepowodzenie odwołania. Sprawdź połączenie i spróbuj ponownie.", - "routing.aggregateLiquidity": "Jeśli jest to możliwe, agreguje źródła płynności w celu uzyskania lepszych cen i swapów bezgazowych.", - "routing.aggregateLiquidity.uniswapx": "UniswapX agreguje źródła płynności w łańcuchu i poza nim, oferując najlepsze dostępne ceny i swapy bez gazu.", - "routing.cheapest": "Klient Uniswap wybiera najtańszą opcję handlu, cenę faktoringu i koszty sieci.", - "routing.cheapest.v4": "Klient Uniswap wybiera optymalną opcję transakcji, biorąc pod uwagę cenę i koszty sieciowe.", - "scantastic.code.expired": "Wygasły", - "scantastic.code.subtitle": "Wprowadź ten kod w rozszerzeniu Uniswap. Twoja fraza odzyskiwania zostanie bezpiecznie zaszyfrowana i przesłana.", - "scantastic.code.timeRemaining.shorthand.hours": "Nowy kod za {{hours}}h {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.minutes": "Nowy kod za {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.seconds": "Nowy kod za {{seconds}}s", - "scantastic.code.title": "Kod jednorazowy Uniswap", - "scantastic.confirmation.button.continue": "Tak, kontynuuj", - "scantastic.confirmation.label.browser": "Przeglądarka", - "scantastic.confirmation.label.device": "Urządzenie", - "scantastic.confirmation.subtitle": "Kontynuuj tylko, jeśli skanujesz kod QR z rozszerzenia Uniswap na zaufanym urządzeniu.", - "scantastic.confirmation.title": "Czy próbujesz zaimportować swój portfel?", - "scantastic.confirmation.warning": "Uważaj na witryny i aplikacje podszywające się pod Uniswap. W przeciwnym razie Twój portfel może zostać naruszony.", - "scantastic.error.encryption": "Nie udało się przygotować frazy początkowej.", - "scantastic.error.noCode": "Nie otrzymano hasła jednorazowego. Proszę spróbuj ponownie.", - "scantastic.error.timeout.message": "Zeskanuj ponownie kod QR na rozszerzeniu Uniswap, aby kontynuować synchronizację swojego portfela.", - "scantastic.error.timeout.title": "Upłynął limit czasu połączenia", - "scantastic.modal.ipMismatch.description": "Aby zeskanować ten kod QR, Twój telefon musi być podłączony do tej samej sieci Wi-Fi co Twój komputer, a wszelkie sieci VPN powinny być tymczasowo wyłączone.", - "scantastic.modal.ipMismatch.title": "Zmień sieć Wi-Fi", - "search.input.placeholder": "Wyszukaj tokeny i pule", - "search.ukDisclaimer": "Zastrzeżenie dla mieszkańców Wielkiej Brytanii", - "send.button.review": "Przejrzyj transfer", - "send.gas.error.title": "Nie dotyczy", - "send.gas.networkCost.title": "Koszt sieci", - "send.input.token.balance.title": "Saldo: {{balance}} {{symbol}}", - "send.recipient.header": "Wybierz odbiorcę", - "send.recipient.input.placeholder": "Wyszukaj ENS lub adres", - "send.recipient.previous_one": "1 poprzedni transfer", - "send.recipient.previous_other": "{{count}} poprzednie transfery", - "send.recipient.results.empty": "Nie znaleziono wyników", - "send.recipient.results.error": "Wpisany adres albo nie istnieje, albo jest wpisany niepoprawnie.", - "send.recipient.section.favorite": "Ulubione portfele", - "send.recipient.section.recent": "Ostatni", - "send.recipient.section.search": "Wyniki wyszukiwania", - "send.recipient.section.viewOnly": "Portfele tylko do przeglądania", - "send.recipient.section.yours": "Twoje portfele", - "send.recipient.warning.viewOnly.message": "Wysyłaj środki do tego portfela tylko wtedy, gdy znasz hasło odzyskiwania lub znasz właściciela portfela.", - "send.recipient.warning.viewOnly.title": "Masz to jako portfel tylko do przeglądania", - "send.recipientSelect.search.empty.message": "Kiedy wyślesz tokeny na adres portfela, pojawią się one tutaj", - "send.recipientSelect.search.empty.title": "Nie zapisano żadnych portfeli", - "send.review.modal.title": "Wysyłasz", - "send.review.summary.button.title": "Potwierdź wysłanie", - "send.search.empty.subtitle": "Wpisany adres albo nie istnieje, albo jest wpisany niepoprawnie.", - "send.search.empty.title": "Nie znaleziono wyników", - "send.search.placeholder": "Wyszukaj ENS lub adres", - "send.solanaSendNotSupported": "Wysyłanie nie jest obsługiwane w systemie Solana", - "send.title": "Wysłać", - "send.unavailableOnSolana.message": "Wysyłanie nie jest dostępne w portfelach Solana", - "send.warning.blocked.default": "Ten portfel jest zablokowany", - "send.warning.blocked.modal.message": "Ten adres jest zablokowany w portfelu Uniswap, ponieważ jest powiązany z jedną lub większą liczbą zablokowanych działań. Jeśli uważasz, że to pomyłka, wyślij e-mail na adres compliance@uniswap.org.", - "send.warning.blocked.modal.title": "Zablokowany adres", - "send.warning.blocked.recipient": "Portfel odbiorcy jest zablokowany", - "send.warning.erc20.checkbox.description": "Próbujesz wysłać środki na adres tokena. Może to spowodować trwałą utratę środków.", - "send.warning.erc20.checkbox.heading": "Wykryto adres tokena", - "send.warning.erc20.message": "Próbujesz wysłać środki na adres tokena. Wysłanie kryptowaluty na tego typu adres może skutkować trwałą utratą środków.", - "send.warning.erc20.title": "To jest adres tokenowy", - "send.warning.insufficientFunds.message": "Twoje saldo {{currencySymbol}} zmniejszyło się od czasu wprowadzenia kwoty, którą chcesz wysłać", - "send.warning.insufficientFunds.title": "Za mało {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "Za mało {{currencySymbol}} na {{networkName}} , aby wysłać", - "send.warning.insufficientGas.message.withoutNetwork": "Za mało {{currencySymbol}} , aby wysłać", - "send.warning.modal.button.cta.blocking": "OK", - "send.warning.modal.button.cta.cancel": "Anulować", - "send.warning.modal.button.cta.confirm": "Potwierdzać", - "send.warning.newAddress.details.ENS": "ENS", - "send.warning.newAddress.details.username": "Nazwa użytkownika", - "send.warning.newAddress.details.walletAddress": "Adres portfela", - "send.warning.newAddress.message": "Nie przeprowadzałeś wcześniej transakcji z tym adresem. Przed kontynuowaniem potwierdź, że adres jest poprawny.", - "send.warning.newAddress.title": "Nowy adres", - "send.warning.self.message": "Próbujesz wysłać środki do swojego bieżącego portfela. Wysyłanie kryptowalut na ten adres będzie wiązało się z niepotrzebnymi kosztami sieciowymi.", - "send.warning.self.title": "To jest Twój obecny portfel", - "send.warning.smartContract.message": "Zamierzasz wysłać środki na adres inteligentnego kontraktu. Upewnij się, że jest to poprawny adres i że może on odbierać tokeny. W przeciwnym razie może to skutkować trwałą utratą środków.", - "send.warning.smartContract.title": "To jest adres inteligentnego kontraktu", - "send.warning.viewOnly.message": "Aby wysłać zasoby, musisz zaimportować ten portfel za pomocą frazy odzyskiwania.", - "send.warning.viewOnly.title": "Ten portfel można tylko przeglądać", - "send.youAreSending": "Wysyłasz", - "sendRecipientForm.recentAddresses.label": "Najnowsze", - "sendReviewModal.title": "Wyślij recenzję", - "setting.recoveryPhrase.account.show": "Pokaż frazę odzyskiwania", - "setting.recoveryPhrase.action.hide": "Ukryj frazę odzyskiwania", - "setting.recoveryPhrase.remove": "Usuń frazę odzyskiwania", - "setting.recoveryPhrase.remove.confirm.subtitle": "Rozumiem, że Uniswap Labs nie pomoże mi odzyskać portfela, jeżeli tego nie zrobię.", - "setting.recoveryPhrase.remove.confirm.title": "Zapisałem frazę odzyskiwania", - "setting.recoveryPhrase.remove.initial.subtitle": "Upewnij się, że zapisałeś frazę odzyskiwania. W przeciwnym razie utracisz dostęp do swoich portfeli", - "setting.recoveryPhrase.remove.initial.title": "Zanim będziesz kontynuować", - "setting.recoveryPhrase.remove.subtitle": "Wpisz swoje hasło, aby potwierdzić", - "setting.recoveryPhrase.remove.title": "Usuwasz frazę odzyskiwania", - "setting.recoveryPhrase.view.warning.message1": "Każdy, kto zna Twoją frazę odzyskiwania, może uzyskać dostęp do Twojego portfela i środków", - "setting.recoveryPhrase.view.warning.message2": "Zobacz to prywatnie", - "setting.recoveryPhrase.view.warning.message3": "Nie udostępniaj nikomu", - "setting.recoveryPhrase.view.warning.message4": "Nigdy nie wpisuj go do żadnych stron internetowych ani aplikacji", - "setting.recoveryPhrase.view.warning.title": "Zanim będziesz kontynuować", - "setting.recoveryPhrase.warning.view.message": "Każdy, kto zna Twoją frazę odzyskiwania, może uzyskać dostęp do Twojego portfela i środków.", - "setting.recoveryPhrase.warning.view.title": "Zobacz to w miejscu prywatnym", - "settings.action.enableInSettings": "Włącz w Ustawieniach", - "settings.action.feedback": "Wyślij opinię", - "settings.action.help": "Sprowadź pomoc", - "settings.action.lock": "Zablokuj portfel", - "settings.action.privacy": "Polityka prywatności", - "settings.action.terms": "Warunki usługi", - "settings.connectWalletPlatform.warning": "Aby użyć Uniswap na {{platform}}, połącz się z portfelem, który obsługuje {{platform}}.", - "settings.footer": "Wykonane z miłością, \nZespół Uniswap 🦄", - "settings.hideSmallBalances": "Ukryj małe salda", - "settings.hideSmallBalances.subtitle": "Salda poniżej 1 USD nie będą widoczne w Twoim portfelu.", - "settings.maxSlippage": "Maks. poślizg", - "settings.maxSlippage.amount": "{{amount}} maks. poślizg", - "settings.section.about": "O", - "settings.section.preferences": "Preferencje", - "settings.section.privacyAndSecurity": "Prywatność i bezpieczeństwo", - "settings.section.support": "Wsparcie", - "settings.section.wallet.hidden.row.title": "{{numHidden}} inne portfele", - "settings.setting.advanced.title": "Zaawansowany", - "settings.setting.advancedSettings": "Advanced settings", - "settings.setting.appearance.option.auto": "Automatyczny", - "settings.setting.appearance.option.dark.subtitle": "Zawsze używaj ciemnego motywu.", - "settings.setting.appearance.option.dark.title": "Ciemny", - "settings.setting.appearance.option.device.subtitle": "Dostosowuje się do ustawień Twojego urządzenia.", - "settings.setting.appearance.option.device.title": "Automatyczny", - "settings.setting.appearance.option.light.subtitle": "Zawsze używaj jasnego motywu.", - "settings.setting.appearance.option.light.title": "Światło", - "settings.setting.appearance.title": "Temat", - "settings.setting.backup.create.description": "Ustawienie hasła zaszyfruje kopię zapasową frazy odzyskiwania, zapewniając dodatkowy poziom ochrony w przypadku kiedykolwiek naruszenia bezpieczeństwa Twojego konta {{cloudProviderName}} .", - "settings.setting.backup.create.title": "Wróć do {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "Ponieważ te portfele mają wspólną frazę odzyskiwania, kopie zapasowe tych portfeli zostaną również usunięte poniżej", - "settings.setting.backup.delete.confirm.title": "Jesteś pewny?", - "settings.setting.backup.delete.warning": "Jeśli usuniesz kopię zapasową {{cloudProviderName}} , portfel będziesz mógł odzyskać jedynie poprzez ręczną kopię zapasową frazy odzyskiwania. Uniswap Labs nie będzie w stanie odzyskać Twoich zasobów, jeśli utracisz termin odzyskiwania.", - "settings.setting.backup.error.message.full": "Nie można utworzyć kopii zapasowej frazy odzyskiwania w {{cloudProviderName}}. Upewnij się, że masz włączone {{cloudProviderName}} i dostępną przestrzeń dyskową, i spróbuj ponownie.", - "settings.setting.backup.error.message.short": "Nie można usunąć kopii zapasowej", - "settings.setting.backup.error.title": "{{cloudProviderName}} błąd", - "settings.setting.backup.modal.description": "Nie masz jeszcze kopii zapasowej frazy odzyskiwania w {{cloudProviderName}} . W ten sposób możesz odzyskać swój portfel po zalogowaniu się do {{cloudProviderName}} na dowolnym urządzeniu.", - "settings.setting.backup.modal.title": "Utwórz kopię zapasową frazy odzyskiwania w {{cloudProviderName}}?", - "settings.setting.backup.password.error.mismatch": "Hasła nie pasują do siebie", - "settings.setting.backup.password.medium": "To jest hasło średnie", - "settings.setting.backup.password.placeholder.confirm": "Potwierdź hasło", - "settings.setting.backup.password.placeholder.create": "Stwórz hasło", - "settings.setting.backup.password.strong": "To jest mocne hasło", - "settings.setting.backup.password.weak": "To jest słabe hasło", - "settings.setting.backup.recoveryPhrase.label": "Fraza odzyskiwania", - "settings.setting.backup.selected": "{{cloudProviderName}} kopia zapasowa", - "settings.setting.backup.status.action.delete": "Usuń kopię zapasową", - "settings.setting.backup.status.complete": "Kopia zapasowa została utworzona do {{cloudProviderName}}", - "settings.setting.backup.status.description": "Mając kopię zapasową frazy odzyskiwania do {{cloudProviderName}}, możesz odzyskać swój portfel po zalogowaniu się na swoje konto {{cloudProviderName}} na dowolnym urządzeniu.", - "settings.setting.backup.status.inProgress": "Tworzenie kopii zapasowej do {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "Kopia zapasowa", - "settings.setting.backup.status.title": "{{cloudProviderName}} kopia zapasowa", - "settings.setting.beta.tooltip": "Wkrótce", - "settings.setting.biometrics.appAccess.subtitle.android": "Wymagaj twarzy/odcisku palca, aby otworzyć aplikację.", - "settings.setting.biometrics.appAccess.subtitle.ios": "Wymagane jest {{biometricsMethod}} do otwarcia aplikacji.", - "settings.setting.biometrics.appAccess.title": "Dostęp do aplikacji", - "settings.setting.biometrics.auth": "Proszę o uwierzytelnienie", - "settings.setting.biometrics.extension.waitingForBiometricsModal.content": "Aby kontynuować, włącz opcję {{biometricsMethod}} w przeglądarce lub ustawieniach systemowych.", - "settings.setting.biometrics.extension.waitingForBiometricsModal.title": "Czekam na {{biometricsMethod}}", - "settings.setting.biometrics.off.message.android": "Funkcja biometryczna jest obecnie wyłączona w portfelu Uniswap — możesz ją włączyć w ustawieniach systemu.", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} jest obecnie wyłączone w portfelu Uniswap — możesz je włączyć w ustawieniach systemu.", - "settings.setting.biometrics.off.title.android": "Biometria jest wyłączona", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} jest wyłączone", - "settings.setting.biometrics.title": "Odblokowanie twarzą/odciskiem palca", - "settings.setting.biometrics.transactions.subtitle.android": "Wymagaj podania twarzy/odcisku palca w celu dokonania transakcji.", - "settings.setting.biometrics.transactions.subtitle.ios": "Wymagane jest {{biometricsMethod}} do przeprowadzenia transakcji.", - "settings.setting.biometrics.transactions.title": "Transakcje", - "settings.setting.biometrics.unavailable.message.android": "Biometria nie jest skonfigurowana na Twoim urządzeniu. Aby korzystać z danych biometrycznych, skonfiguruj je najpierw w Ustawieniach.", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} nie jest skonfigurowane na Twoim urządzeniu. Aby użyć {{biometricsMethod}}, skonfiguruj je najpierw w Ustawieniach.", - "settings.setting.biometrics.unavailable.title.android": "Biometria nie jest skonfigurowana", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} nie jest skonfigurowane", - "settings.setting.biometrics.warning.message.android": "Jeśli nie włączysz biometrii, każdy, kto uzyska dostęp do Twojego urządzenia, będzie mógł otworzyć portfel Uniswap i dokonywać transakcji.", - "settings.setting.biometrics.warning.message.ios": "Jeśli nie włączysz {{biometricsMethod}}, każdy, kto uzyska dostęp do Twojego urządzenia, będzie mógł otworzyć portfel Uniswap i dokonywać transakcji.", - "settings.setting.biometrics.warning.title": "Jesteś pewny?", - "settings.setting.connections.disconnectAll": "Odłącz wszystko", - "settings.setting.connections.noConnectionsDescription": "Połącz się z aplikacją, szukając przycisku „Połącz portfel” lub „Zaloguj się”.", - "settings.setting.currency.title": "Waluta lokalna", - "settings.setting.deviceAccess.reset.title": "Zresetuj swoje {{biometricsMethod}}", - "settings.setting.deviceAccess.title": "Dostęp do urządzenia", - "settings.setting.deviceAccessTimeout.1hour": "1 godz.", - "settings.setting.deviceAccessTimeout.24hours": "24 godziny", - "settings.setting.deviceAccessTimeout.30minutes": "30 minut", - "settings.setting.deviceAccessTimeout.5minutes": "5 minut", - "settings.setting.deviceAccessTimeout.never": "Nigdy", - "settings.setting.deviceAccessTimeout.title": "Limit czasu automatycznej blokady", - "settings.setting.hapticTouch.title": "Dotyk dotykowy", - "settings.setting.helpCenter.title": "Centrum pomocy", - "settings.setting.language.button.navigate": "Przejdź do ustawień", - "settings.setting.language.description.extension": "Uniswap domyślnie przyjmuje ustawienia języka systemu. Aby zmienić preferowany język, przejdź do ustawień systemu.", - "settings.setting.language.description.mobile": "Uniswap domyślnie używa ustawień języka Twojego urządzenia. Aby zmienić preferowany język, przejdź do „Uniswap” w ustawieniach urządzenia i stuknij w „Język”.", - "settings.setting.language.title": "Język", - "settings.setting.notifications.row.activity.description": "Przelewy, prośby i inne działania", - "settings.setting.notifications.row.activity.title": "Aktywność portfela", - "settings.setting.notifications.row.updates.description": "Rekomendacje i nowe funkcje", - "settings.setting.notifications.row.updates.title": "Aktualizacje z Uniswap", - "settings.setting.notifications.title": "Powiadomienia", - "settings.setting.password.change.title": "Utwórz nowe hasło", - "settings.setting.password.title": "Zmień hasło", - "settings.setting.permissions.title": "Uprawnienia", - "settings.setting.privacy.analytics.description": "Używamy anonimowych danych o użytkowaniu, aby poprawić Twoje doświadczenia związane z produktami Uniswap Labs. Po wyłączeniu śledzimy tylko błędy i niezbędne użycie.", - "settings.setting.privacy.analytics.title": "Analityka aplikacji", - "settings.setting.privateKeys.title": "Klucze prywatne", - "settings.setting.recoveryPhrase.title": "Fraza odzyskiwania", - "settings.setting.smallBalances.title": "Saldo portfela", - "settings.setting.smartWallet.action.enable": "Włączać", - "settings.setting.smartWallet.action.smartWallet": "Smart wallet", - "settings.setting.smartWallet.notEligible": "Nie kwalifikuje się", - "settings.setting.smartWallet.status.actionRequired": "Wymagane działanie", - "settings.setting.smartWallet.status.active": "Aktywny", - "settings.setting.smartWallet.status.inactive": "Nieaktywny", - "settings.setting.smartWallet.status.unavailable": "Niedostępne", - "settings.setting.unknownTokens.subtitle": "Potencjalne tokeny oszustwa zostaną ukryte w Twoim portfolio.", - "settings.setting.unknownTokens.title": "Ukryj nieznane tokeny", - "settings.setting.wallet.action.editLabel": "Edytuj etykietę", - "settings.setting.wallet.action.editProfile": "Edytuj profil", - "settings.setting.wallet.action.remove": "Usuń portfel", - "settings.setting.wallet.connection.banner.description": "Zarządzaj połączeniami za pomocą ustawień portfela, klikając swój obrazek profilowy.", - "settings.setting.wallet.connection.banner.title": "Połączenia zostały przeniesione", - "settings.setting.wallet.connections.title": "Znajomości", - "settings.setting.wallet.editLabel.description": "Etykiety nie są publiczne. Są one przechowywane lokalnie i widoczne tylko dla Ciebie.", - "settings.setting.wallet.editLabel.save": "Zapisz zmiany", - "settings.setting.wallet.label": "Przezwisko", - "settings.setting.wallet.testnetMode.description": "Włącza to sieci testowe, aby deweloperzy mogli wypróbować funkcje i transakcje bez korzystania z prawdziwych zasobów. Tokeny w sieciach testowych nie mają żadnej rzeczywistej wartości.", - "settings.setting.wallet.testnetMode.title": "Tryb testowy", - "settings.switchNetwork.warning": "Aby korzystać z Uniswap na {{label}}, przełącz sieć w ustawieniach swojego portfela.", - "settings.title": "Ustawienia", - "settings.version": "Wersja {{appVersion}}", - "smartWallet.actionRequired.cta": "Wyłącz w 1 sieci", - "smartWallet.actionRequired.cta.plural": "Wyłącz w sieciach {{amount}}", - "smartWallet.actionRequired.description": "Wyłączenie inteligentnego portfela to działanie łańcuchowe wymagające niewielkiego kosztu sieciowego.", - "smartWallet.actionRequired.insufficientFunds": "Niewystarczające środki", - "smartWallet.actionRequired.reactivate": "Nadal korzystaj ze inteligentnego portfela", - "smartWallet.actionRequired.title": "Portfel inteligentny jest aktywny w 1 sieci", - "smartWallet.actionRequired.title.plural": "Inteligentny portfel jest aktywny w sieciach {{amount}}", - "smartWallet.activeNetworks.title": "Portfel inteligentny jest aktywny w 1 sieci", - "smartWallet.activeNetworks.title.plural": "Inteligentny portfel jest aktywny w sieciach {{amount}}", - "smartWallet.banner.networkCost": "Includes a one-time cost to activate your smart wallet on {{chainName}}.", - "smartWallet.banner.text": "Włącz inteligentny portfel , aby zaoszczędzić do 50% kosztów sieciowych.", - "smartWallet.confirmDisableSmartWallet.description": "Nie będziesz mógł skorzystać z szybszych wymian, obniżonych kosztów sieciowych i innych nadchodzących ulepszeń.", - "smartWallet.confirmDisableSmartWallet.title": "Jesteś pewny?", - "smartWallet.insufficient.description": "Nie można wyłączyć inteligentnego portfela w tych sieciach, dopóki nie zgromadzisz środków na pokrycie kosztów sieci.", - "smartWallet.insufficient.title": "Niewystarczające środki na 1 sieci", - "smartWallet.insufficient.title.plural": "Niewystarczające środki w sieciach {{amount}}", - "smartWallet.InsufficientFunds.button.continue.text": "Kontynuuj mimo wszystko", - "smartWallet.insufficientFunds.network.banner.description": "Nie można wyłączyć z powodu niewystarczających środków.", - "smartWallet.insufficientFunds.network.banner.title_one": "{{count}} wykluczono sieć", - "smartWallet.insufficientFunds.network.banner.title_other": "{{count}} wykluczono sieć", - "smartWallet.insufficientFunds.network.disable.text": "Gotowy do wyłączenia", - "smartWallet.insufficientFunds.network.text": "Potrzebujesz {{nativeCurrency}}", - "smartWallet.insufficientFunds.single.network.banner.title": "{{chain}} wykluczone", - "smartWallet.modal.description.block1": "Inteligentne portfele wykorzystują inteligentne kontrakty, co umożliwia szybsze i tańsze transakcje.", - "smartWallet.modal.description.block2": "Zmiany nie będą dotyczyły portfeli, które już korzystają z funkcji inteligentnego portfela z innej aplikacji.", - "smartWallet.modal.title": "Inteligentny portfel", - "smartWallets": "Inteligentne portfele", - "smartWallets.activeNetworks.description": "Twój inteligentny portfel aktywuje się automatycznie przy każdej nowej sieci, do której się podłączasz.", - "smartWallets.createdModal.description": "You’re getting faster transactions and lower network costs on every swap.", - "smartWallets.createdModal.title": "Utworzono inteligentny portfel", - "smartWallets.delegation.limitedSupport": "Twój portfel ma ograniczone wsparcie", - "smartWallets.delegationMismatchModal.description": "{{walletName}} nie obsługuje najnowszych standardów Ethereum używanych przez {{displayName}}, więc niektóre funkcje są niedostępne.", - "smartWallets.delegationMismatchModal.features.1ClickSwaps": "Zamiana jednym kliknięciem", - "smartWallets.delegationMismatchModal.features.gasFreeSwaps": "Swapy bez gazu", - "smartWallets.delegationMismatchModal.features.limitOrders": "Zamówienia limitowane", - "smartWallets.delegationMismatchModal.limitOrders.unsupported": "Twój portfel nie obsługuje zleceń limitowanych.", - "smartWallets.delegationMismatchModal.title": "Ograniczone wsparcie portfela", - "smartWallets.disable.failed": "Wystąpił błąd. Smart wallet jest nadal aktywny w 1 lub więcej sieciach. Spróbuj ponownie.", - "smartWallets.disable.modal.description": "Ta akcja łańcuchowa wymaga kosztu sieciowego.", - "smartWallets.disable.modal.title": "Wyłącz inteligentny portfel", - "smartWallets.educationalModal.description": "Inteligentne portfele umożliwiają szybsze i tańsze transakcje przy użyciu inteligentnych kontraktów.", - "smartWallets.educationalModal.info": "Zmiany nie będą dotyczyły portfeli, które już korzystają z funkcji inteligentnego portfela z innej aplikacji.", - "smartWallets.enabledModal.description": "Aktualizacje zaczną obowiązywać od następnej wymiany.", - "smartWallets.enabledModal.description.dapp": "Aktualizacje zaczną obowiązywać od następnej transakcji.", - "smartWallets.enabledModal.description.dapp.line2": "Ponownie połącz swój portfel, aby natychmiast zacząć korzystać z funkcji inteligentnego portfela w aplikacjach.", - "smartWallets.enabledModal.title": "Włączony inteligentny portfel", - "smartWallets.postSwapNudge.enable": "Włącz inteligentny portfel", - "smartWallets.postSwapNudge.title": "Zaoszczędź przy następnej wymianie", - "smartWallets.postSwapNudge.title.dapp": "Ta aplikacja obsługuje inteligentne portfele", - "smartWallets.unavailableModal.description": "Inny dostawca portfela zarządza teraz ustawieniami inteligentnego portfela dla {{displayName}}. Możesz nadal używać Uniswap jak zwykle.", - "smartWallets.unavailableModal.title": "Funkcje inteligentnego portfela są niedostępne", - "solanaPromo.banner.description": "Handluj tokenami Solana bezpośrednio na platformie Uniswap.", - "solanaPromo.banner.title": "Solana jest już dostępna", - "solanaPromo.modal.connectWallet": "Podłącz swój ulubiony portfel Solana", - "solanaPromo.modal.startSwapping.button": "Rozpocznij wymianę na Solanie", - "solanaPromo.modal.swapInstantly": "Wymieniaj tysiące popularnych tokenów natychmiast", - "solanaPromo.modal.viewTokenData": "Przeglądaj dane i ceny tokenów w jednym miejscu", - "speedBump.newAddress.warning.description": "Nie przeprowadzałeś wcześniej transakcji z tym adresem. Zanim przejdziesz dalej, upewnij się, że jest to właściwy adres.", - "speedBump.newAddress.warning.title": "Nowy adres", - "speedBump.smartContractAddress.warning.description": "Za chwilę wyślesz tokeny na specjalny typ adresu – inteligentny kontrakt. Sprawdź dokładnie, czy jest to adres, na który chcesz wysłać wiadomość. Jeśli się pomylisz, Twoje tokeny mogą zostać utracone na zawsze.", - "speedBump.smartContractAddress.warning.title": "Czy to adres portfela?", - "stats.24fees": "Opłaty 24H", - "stats.24swapVolume": "Wolumen swapu 24H", - "stats.24volume": "Objętość 24H", - "stats.allTimeSwappers": "Wszyscy zmienniki czasu", - "stats.allTimeVolume": "Cały czas głośność", - "stats.fdv": "FDV", - "stats.fdv.description": "W pełni rozwodniona wycena (FDV) oblicza całkowitą wartość rynkową przy założeniu, że wszystkie tokeny są w obiegu.", - "stats.marketCap": "Kapitalizacja rynkowa", - "stats.marketCap.description": "Kapitalizacja rynkowa to całkowita wartość rynkowa podaży aktywów w obiegu.", - "stats.noStatsAvailable": "Brak dostępnych statystyk", - "stats.tvl": "Całkowita wartość zablokowana", - "stats.tvl.description": "Całkowita zablokowana wartość (TVL) to łączna kwota aktywów dostępna we wszystkich pulach płynności Uniswap.", - "stats.volume.1d": "Objętość 1-dniowa", - "stats.volume.1d.description": "Wolumen jednodniowy to wartość aktywów, które zostały sprzedane na platformie Uniswap w ciągu ostatnich 24 godzin.", - "stats.volume.1d.long": "Objętość 1D", - "stats.volume.1d.short": "1D tom", - "stats.volume.description": "Wolumen to wartość aktywów, które zostały sprzedane na platformie Uniswap w wybranym przedziale czasowym.", - "swap.allow.oneTime": "Zezwól {{sym}} (jednorazowo)", - "swap.approveAndSubmit": "Zatwierdź i prześlij", - "swap.approveAndSwap": "Zatwierdź i zamień", - "swap.balance.amount": "Saldo: {{amount}}", - "swap.bestPrice.through": "Trasa przez {{provider}}", - "swap.bestRoute.cost": "Szacuje się, że najbardziej efektywna trasa będzie kosztować około ~{{gasPrice}} w kosztach sieciowych. ", - "swap.bridging.title": "Wymiana między sieciami", - "swap.bridging.warning.description": "Zamieniasz się z {{fromNetwork}} na {{toNetwork}}. Jest to znane również jako „mostkowanie”, które przenosi twoje tokeny z jednej sieci do drugiej.", - "swap.button.confirmSignAndSwap": "Potwierdź znak i zamień", - "swap.button.confirmSwapAnyways": "Potwierdź zamianę mimo wszystko", - "swap.button.confirmUnwrap": "Potwierdź rozpakowanie", - "swap.button.max": "Maks", - "swap.button.review": "Recenzja", - "swap.button.submitting": "Przesyłam wymianę...", - "swap.button.submitting.keep.open": "Trzymaj portfel otwarty...", - "swap.button.submitting.passkey": "Potwierdź za pomocą klucza dostępu", - "swap.button.swap": "Zamieniać", - "swap.button.swapAnyways": "Zamień w każdym razie", - "swap.button.unwrap": "Odwijać się", - "swap.button.wrap": "Zawinąć", - "swap.buy.countryModal.placeholder": "Szukaj według kraju lub regionu", - "swap.cancel.cannotExecute_one": "Twoja zamiana może zostać wykonana przed przetworzeniem anulowania. Koszty Twojej sieci nie podlegają zwrotowi. Czy chcesz kontynuować?", - "swap.cancel.cannotExecute_other": "Twoje swapy mogą zostać zrealizowane przed przetworzeniem anulowania. Koszty Twojej sieci nie podlegają zwrotowi. Czy chcesz kontynuować?", - "swap.confirmApproveAndSwap": "Potwierdź, zatwierdź i zamień", - "swap.confirmLimit": "Potwierdź limit", - "swap.confirmSwap": "Potwierdź zamianę", - "swap.confirmWrap": "Potwierdź zawinięcie", - "swap.deadline.settings.title": "Termin wymiany", - "swap.deadline.settings.title.short": "Termin Tx.", - "swap.details.completed": "Zamiana zakończona", - "swap.details.estimatedTime": "Szacowany czas", - "swap.details.fasterUnichainSwaps": "Szybsze wymiany obsługiwane przez Unichain", - "swap.details.feeOnTransfer": "{{tokenSymbol}} opłata", - "swap.details.feeOnTransfer.symbol": "{{tokenSymbol}} opłata za token", - "swap.details.instant": "Natychmiastowy", - "swap.details.newQuote.input": "Nowe wejście", - "swap.details.newQuote.output": "Nowe wyjście", - "swap.details.orderRouting": "Kierowanie zamówień", - "swap.details.orderRoutingInfo": "Transakcje wymiany są przesyłane za pośrednictwem protokołu Across, zdecentralizowanego protokołu, który umożliwia przesyłanie aktywów pomiędzy sieciami, kładąc nacisk na bezpieczeństwo, szybką realizację transakcji i niskie ceny.", - "swap.details.poweredBy": "Zasilane przez", - "swap.details.rate": "Wskaźnik", - "swap.details.slippage": "Maksymalny poślizg", - "swap.details.slippage.uniswap": "Uniswap Chroniony poślizg", - "swap.details.swappedIn.unichain": "Ukończono w {{time}}s na Unichain", - "swap.details.uniswapFee": "Opłata", - "swap.error.default": "Może być konieczne zwiększenie tolerancji poślizgu. Uwaga: tokeny opłaty za transfer i rebase są niekompatybilne z Uniswap V3.", - "swap.error.expectedToFail": "Oczekuje się, że Twoja zamiana zakończy się niepowodzeniem.", - "swap.error.fiatInputUnavailable": "{{fiatCurrencyCode}} wejście niedostępne", - "swap.error.modifiedByWallet": "Twoja zamiana została zmodyfikowana za pośrednictwem Twojego portfela. Jeśli to był błąd, anuluj natychmiastowo, w przeciwnym razie ryzykujesz utratę środków.", - "swap.error.rejected": "Transakcja odrzucona", - "swap.error.undefinedObject": "Wystąpił błąd podczas próby wykonania tej zamiany. Może być konieczne zwiększenie tolerancji poślizgu. Jeśli to nie zadziała, może występować niezgodność z tokenem, którym handlujesz. Uwaga: tokeny opłaty za transfer i rebase są niekompatybilne z Uniswap V3.", - "swap.error.unknown": "Nieznany błąd.", - "swap.error.v2.expired": "Transakcja ta nie mogła zostać wysłana, ponieważ upłynął termin. Sprawdź, czy termin transakcji nie jest zbyt krótki.", - "swap.error.v2.k": "Niezmiennik Uniswap x*y=k nie został spełniony przez zamianę. Zwykle oznacza to, że jeden z wymienianych tokenów zachowuje się niestandardowo podczas transferu.", - "swap.error.v2.slippage": "Ta transakcja nie powiedzie się ze względu na zmianę cen lub opłatę za przelew. Spróbuj zwiększyć tolerancję poślizgu", - "swap.error.v2.transferInput": "Nie można przenieść tokena wejściowego. Może występować problem z tokenem wejściowym.", - "swap.error.v2.transferOutput": "Tokena wyjściowego nie można przenieść. Może występować problem z tokenem wyjściowym.", - "swap.error.v3.slippage": "Ta transakcja nie powiedzie się ze względu na zmianę cen. Spróbuj zwiększyć tolerancję poślizgu. Uwaga: opłata za transfer i tokeny rebase są niekompatybilne z Uniswap V3.", - "swap.error.v3.transferOutput": "Tokena wyjściowego nie można przenieść. Może występować problem z tokenem wyjściowym. Uwaga: opłata za transfer i tokeny rebase są niekompatybilne z Uniswap V3.", - "swap.estimatedDifference.label": "Będzie duża różnica między wartościami wejściowymi i wyjściowymi ze względu na bieżącą płynność.", - "swap.expected.price": "Oczekiwana cena", - "swap.fail.batched": "Twój połączony portfel może nie obsługiwać wymiany 1-kliknięcia. Zamiast tego spróbuj standardowej wymiany.", - "swap.fail.batched.retry": "Wypróbuj standardową wymianę", - "swap.fail.batched.title": "Nieudana zamiana jednym kliknięciem", - "swap.fail.message": "Spróbuj dostosować poślizg do wyższej wartości.", - "swap.fail.uniswapX": "Nie można ukończyć wymiany za pomocą UniswapX. Spróbuj ponownie wykonać zamianę, aby skierować ją przez klasyczny interfejs API Uniswap.", - "swap.fees.experience": "Ta opłata jest stosowana w przypadku niektórych par tokenów, aby zapewnić najlepsze doświadczenia z Uniswap. Jest ona płacona w tokenie wyjściowym i została już uwzględniona w ofercie.", - "swap.fees.jupiter.label": "Opłata za Jowisza", - "swap.fees.jupiter.message": "Opłaty za Solanę pobierane są przez API Jupiter. Uniswap Labs nie pobiera tych opłat.", - "swap.fees.noFee": "Opłaty są pobierane na wybranych parach tokenów, aby zapewnić najlepszą jakość korzystania z Uniswap. Z tą zamianą nie wiążą się żadne opłaty.", - "swap.finalizingQuote": "Kończąc cytat...", - "swap.form.header": "Zamieniać", - "swap.form.warning.output.fotFees": "Ze względu na opłatę tokenową wynoszącą {{fotCurrencySymbol}}kwoty swapów można wprowadzić wyłącznie za pomocą pola wejściowego", - "swap.form.warning.output.fotFees.fallback": "Ze względu na opłaty tokenowe kwoty swapów można wprowadzić wyłącznie za pomocą pola wejściowego", - "swap.form.warning.output.solana": "Dokładny wynik nie jest obsługiwany w systemie Solana", - "swap.form.warning.restore": "Przywróć portfel, aby go wymienić", - "swap.frontrun.warning": "Twoja transakcja może mieć charakter frontrun i skutkować niekorzystną transakcją.", - "swap.header.viewOnly": "Tylko podgląd", - "swap.impactOfTrade": "Wpływ Twojej transakcji na cenę rynkową tej puli.", - "swap.impactOfTrade.uniswapx": "Różnica między ceną rynkową a ceną realizacji, uwzględniająca oszczędności na gazie UniswapX.", - "swap.impactOfTrade.uniswapx.missing": "Obliczenia wpływu na cenę mogą być niedostępne w przypadku par o niskiej płynności.", - "swap.inputEstimated.atMost": "Dane wejściowe są szacowane. Sprzedasz najwyżej lub transakcja zostanie cofnięta.", - "swap.limit": "Limit", - "swap.limitFilled": "Limit wypełniony!", - "swap.limitSubmitted": "Limit przesłany", - "swap.marketPrice.outsideRange.label": "Cena rynkowa wykracza poza określony zakres cenowy. Tylko depozyt jednego aktywa.", - "swap.min.price": "Cena minimalna", - "swap.networkCost.paidIn": "Koszt sieciowy jest płacony w {{sym}} w sieci {{chainName}} w celu przeprowadzenia transakcji.", - "swap.orderRouting": "Kierowanie zamówień", - "swap.outputEstimated.atLeast": "Wydajność jest szacowana. Otrzymasz co najmniej lub transakcja zostanie cofnięta.", - "swap.placeOrder": "Złożyć zamówienie", - "swap.priceImpact": "Wpływ na cenę", - "swap.request.title.full": "Zamień {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "Zamień tokeny", - "swap.review": "Przejrzyj wymianę", - "swap.review.summary": "Zamieniasz się", - "swap.reviewLimit": "Limit przeglądu", - "swap.route.optimizedGasCost": "Trasa ta uwzględnia trasy rozdzielone, wiele przeskoków i koszty sieciowe każdego kroku.", - "swap.routing.jupiter.description": "Jupiter gromadzi płynność z wielu źródeł, aby zapewnić Ci najlepsze ceny.", - "swap.routing.uniswapAutoRouter.description": "Uniswap Auto Router dobiera optymalne trasy i koszty sieci, aby zapewnić Ci najlepsze ceny.", - "swap.settings.deadline.tooltip": "Twoja transakcja zostanie cofnięta, jeśli będzie oczekiwała na realizację przez okres dłuższy niż ten. (Maksymalnie: 3 dni).", - "swap.settings.deadline.warning": "Wysoki termin", - "swap.settings.oneClickSwap.title": "Zamiana jednym kliknięciem", - "swap.settings.oneClickSwap.tooltip": "Łączy standardowe działania handlowe, umożliwiając szybsze i tańsze wymiany.", - "swap.settings.protection.description": "Po włączeniu ochrony swap Twoje transakcje Ethereum będą chronione przed atakami typu „sandwich”, przy zmniejszonym ryzyku niepowodzenia.", - "swap.settings.protection.subtitle.supported": "{{chainName}} Sieć", - "swap.settings.protection.subtitle.unavailable": "Niedostępne w {{chainName}}", - "swap.settings.protection.title": "Ochrona wymiany", - "swap.settings.routingPreference.option.default.description": "Wybranie tej opcji identyfikuje najefektywniejszą trasę wymiany.", - "swap.settings.routingPreference.option.default.description.preV4": "Klient Uniswap wybiera najtańszą opcję transakcji, biorąc pod uwagę cenę i koszty sieciowe.", - "swap.settings.routingPreference.option.default.description.uniswapXUnavailable": "UniswapX niedostępny dla Twojego portfela", - "swap.settings.routingPreference.option.default.tooltip": "Trasa jest identyfikowana z uwzględnieniem puli v2, v3 i niektórych v4, biorąc pod uwagę szacowany wpływ na cenę i koszty sieciowe.", - "swap.settings.routingPreference.option.v2.title": "Włącz pule v2", - "swap.settings.routingPreference.option.v3.title": "Włącz pule v3", - "swap.settings.routingPreference.option.v4.hooks.title": "Włącz pule haków v4", - "swap.settings.routingPreference.option.v4.hooks.tooltip": "Haki V4 przekierowują zamiany tras poprzez zestaw wstępnie zatwierdzonych haków.", - "swap.settings.routingPreference.option.v4.title": "Włącz pule v4", - "swap.settings.routingPreference.title": "Opcje handlu", - "swap.settings.slippage.alert": "Duży poślizg", - "swap.settings.slippage.control.auto": "Automatyczny", - "swap.settings.slippage.description": "Twoja transakcja zostanie cofnięta, jeśli cena zmieni się bardziej niż procent poślizgu.", - "swap.settings.slippage.input.message": "Jeżeli cena spadnie jeszcze bardziej, transakcja zostanie cofnięta. Poniżej znajduje się minimalna kwota, którą masz gwarancję otrzymania.", - "swap.settings.slippage.input.receive.title": "Odbierz przynajmniej", - "swap.settings.slippage.output.message": "Jeżeli cena spadnie jeszcze bardziej, transakcja zostanie cofnięta. Poniżej znajduje się maksymalna kwota, jaką musisz wydać.", - "swap.settings.slippage.output.spend.title": "Wydaj co najwyżej", - "swap.settings.slippage.warning": "Bardzo duży poślizg", - "swap.settings.slippage.warning.description": "Poślizg powyżej 20% prawdopodobnie spowoduje niekorzystną transakcję. Aby zmniejszyć ryzyko bycia front-run, obniż swoje ustawienia.", - "swap.settings.slippage.warning.hover": "Może to skutkować niekorzystną transakcją. Spróbuj obniżyć ustawienie poślizgu.", - "swap.settings.slippage.warning.max": "Wprowadź wartość mniejszą niż {{maxSlippageTolerance}}", - "swap.settings.slippage.warning.message": "Poślizg może być większy niż jest to konieczne", - "swap.settings.slippage.warning.min": "Wprowadź wartość większą niż 0", - "swap.settings.title": "Zamień ustawienia", - "swap.settings.transactionRevertPrice": "Twoja transakcja zostanie cofnięta, jeśli cena zmieni się niekorzystnie o więcej niż ten procent.", - "swap.signAndSwap": "Podpisz i zamień", - "swap.slippage.amt": "{{amt}} poślizg", - "swap.slippage.bridging": "Brak poślizgu podczas przełączania między sieciami", - "swap.slippage.description": "Różnica między oczekiwaną a wykonaną ceną swapu. Różnice mogą wystąpić z powodu niskiej płynności, zmienności rynku lub botów. \n\nOchrona Uniswap chroni przed botami frontrunning i MEV.", - "swap.slippage.settings.title": "Ustawienia poślizgu", - "swap.slippage.tooltip": "Maksymalny ruch ceny przed transakcją zostanie przywrócony.", - "swap.slippageBelow.warning": "Spadek poniżej {{amt}} może skutkować nieudaną transakcją", - "swap.submitted": "Zamiana przesłana", - "swap.success": "Zamień sukces!", - "swap.tokenOwnFees": "Niektóre tokeny pobierają opłatę przy zakupie lub sprzedaży, którą ustala wystawca tokena. Uniswap nie otrzymuje żadnych z tych opłat.", - "swap.tradeRoutes": "Szlaki handlowe", - "swap.transaction.deadline": "Termin transakcji", - "swap.transaction.revertAfter": "Twoja transakcja zostanie cofnięta, jeśli będzie oczekująca dłużej niż ten okres.", - "swap.warning.enterLargerAmount.title": "Wprowadź większą kwotę", - "swap.warning.expectedFailure.increaseSlippage": "Spróbuj zwiększyć poślizg.", - "swap.warning.expectedFailure.titleMay": "Ta zamiana może się nie powieść", - "swap.warning.insufficientBalance.title": "Nie masz dość {{currencySymbol}}", - "swap.warning.insufficientGas.button": "Za mało {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "Zamień na {{ tokenSymbol }} na {{networkName}}", - "swap.warning.insufficientGas.button.buy": "Kup {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "Kup kartą", - "swap.warning.insufficientGas.message.withNetwork": "Za mało {{currencySymbol}} na {{networkName}} do zamiany", - "swap.warning.insufficientGas.message.withoutNetwork": "Za mało {{currencySymbol}} do zamiany", - "swap.warning.insufficientGas.title": "Nie masz wystarczającej ilości {{currencySymbol}} na pokrycie kosztów sieci", - "swap.warning.networkFee.allow": "Zezwól {{ inputTokenSymbol }} (jednorazowo)", - "swap.warning.networkFee.delegation.message": "To jest koszt przetworzenia transakcji i aktywacji inteligentnego portfela w Unichain. Uniswap Labs nie otrzymuje żadnej części tych opłat.", - "swap.warning.networkFee.highRelativeToValue": "Koszt sieci przekracza 10% całkowitej wartości transakcji. Jest to koszt przetworzenia transakcji na blockchain. Uniswap nie otrzymuje żadnej części tych opłat.", - "swap.warning.networkFee.highRelativeToValue.unichain": "Koszt sieci przekracza 10% całkowitej wartości transakcji. Jest to koszt przetworzenia transakcji na blockchain.", - "swap.warning.networkFee.includesDelegation": "Zawiera aktywację inteligentnego portfela", - "swap.warning.networkFee.message": "Jest to koszt przetworzenia transakcji w łańcuchu bloków. Uniswap nie otrzymuje żadnej części tych opłat.", - "swap.warning.networkFee.message.unichain": "Jest to koszt przetworzenia Twojej transakcji w blockchainie.", - "swap.warning.networkFee.message.uniswapX": "Jest to koszt przetworzenia transakcji w łańcuchu bloków. Uniswap nie otrzymuje żadnej części tych opłat. UniswapX agreguje źródła płynności w celu uzyskania lepszych cen i swapów bez gazu.", - "swap.warning.networkFee.message.uniswapX.title": "Brak kosztów sieciowych z UniswapX", - "swap.warning.networkFee.message.uniswapX.unichain": "To koszt przetworzenia Twojej transakcji na blockchainie. UniswapX agreguje źródła płynności w celu uzyskania lepszych cen i swapów bez gazu.", - "swap.warning.noQuotesFound.bridging.message": "Nie znaleziono żadnych cytatów pomostowych. Spróbuj użyć oficjalnego pomostu w tym momencie.", - "swap.warning.noQuotesFound.title": "Nie znaleziono cytatów", - "swap.warning.noRoutesFound.message": "Obecnie nie ma dostępnych tras dla wybranych przez Ciebie tokenów. Spróbuj innej pary lub sprawdź ponownie później.", - "swap.warning.noRoutesFound.title": "Brak dostępnych tras", - "swap.warning.offline.message": "Być może utraciłeś połączenie z Internetem lub sieć może nie działać. Sprawdź swoje połączenie internetowe i spróbuj ponownie.", - "swap.warning.offline.title": "Jesteś offline", - "swap.warning.priceImpact.message": "Ze względu na aktualnie dostępną ilość {{outputCurrencySymbol}} płynności, im więcej {{inputCurrencySymbol}} spróbujesz wymienić, tym mniej {{outputCurrencySymbol}} otrzymasz.", - "swap.warning.priceImpact.message.veryHigh": "Transakcja ta spowoduje zmianę ceny rynkowej tego puli o {{priceImpactValue}} i doprowadzi do utraty środków.", - "swap.warning.priceImpact.title": "Duży wpływ na cenę ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "Bardzo wysoki wpływ na cenę ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "Twoja transakcja nie została przesłana, ponieważ zamknąłeś aplikację.", - "swap.warning.queuedOrder.approvalFailed": "Twoja transakcja nie została przesłana, ponieważ zatwierdzenie tokena nie powiodło się.", - "swap.warning.queuedOrder.stale": "Twoja transakcja nie została przesłana, ponieważ zamknąłeś aplikację lub zatwierdzenie trwało zbyt długo.", - "swap.warning.queuedOrder.submissionFailed": "Wystąpił problem z przesłaniem transakcji.", - "swap.warning.queuedOrder.title": "Wymiana anulowana", - "swap.warning.rateLimit.message": "Prosze spróbować za kilka minut.", - "swap.warning.rateLimit.title": "Przekroczono limit stawki", - "swap.warning.router.message": "Być może utraciłeś połączenie lub sieć nie działa. Jeśli problem będzie się powtarzał, spróbuj ponownie później.", - "swap.warning.router.title": "Nie można teraz zakończyć tej transakcji", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} jest zablokowany", - "swap.warning.tokenBlockedFallback.button": "Token jest zablokowany", - "swap.warning.uniswapFee.message": "Opłaty są pobierane w celu zapewnienia najlepszych wrażeń z korzystania z Uniswap.", - "swap.warning.uniswapFee.message.default": "Aby zapewnić najlepszą jakość korzystania z Uniswap, pobierane są opłaty. Z tą zamianą nie wiążą się żadne opłaty.", - "swap.warning.uniswapFee.message.included": "Aby zapewnić najlepszą jakość korzystania z Uniswap, pobierane są opłaty i zostały one już uwzględnione w tej wycenie.", - "swap.warning.uniswapFee.title": "Opłata za zamianę", - "swap.warning.viewOnly.message": "Aby wymienić tokeny, musisz zaimportować ten portfel za pomocą frazy odzyskiwania.", - "swap.wrap.token": "Zawiń {{sym}}", - "tdp.balanceSummary.otherNetworks": "W innych sieciach", - "tdp.balanceSummary.otherNetworksBalance": "Saldo w innych sieciach", - "tdp.balanceSummary.title": "Twój balans", - "tdp.button.getToken": "Zdobądź {{ tokenSymbol }}", - "tdp.button.getTokenFallback": "Pobierz token", - "tdp.loading.title.default": "dane tokena dla ", - "tdp.loading.title.withChain": "dane tokena dla na {{chainName}}", - "tdp.nameNotFound": "Nie znaleziono nazwy", - "tdp.noInfoAvailable": "Brak dostępnych informacji o tokenie", - "tdp.noTestnetSupportDescription": "Niektóre sieci testowe nie obsługują wymiany, wysyłania ani kupowania tokenów.", - "tdp.symbolNotFound": "Nie znaleziono symbolu", - "testnet.modal.swapDeepLink.description.toProdMode": "Ta akcja wymaga wyłączenia trybu testnet. Tryb testnet można ponownie włączyć w dowolnym momencie w ustawieniach.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "Ta akcja wymaga włączenia trybu testnet. Tokeny w sieciach testnet nie mają żadnej rzeczywistej wartości. Tryb testnet można wyłączyć w dowolnym momencie w ustawieniach.", - "testnet.modal.swapDeepLink.title.toProdMode": "Wyłącz tryb testowy", - "testnet.modal.swapDeepLink.title.toTestnetMode": "Włącz tryb testowy", - "testnet.unsupported": "Ta funkcjonalność nie jest obsługiwana w trybie testnetowym.", - "themeToggle.theme": "Temat", - "title.buySellTradeEthereum": "Kupuj, sprzedawaj i wymieniaj Ethereum i inne najlepsze tokeny na Uniswap", - "title.createGovernanceOn": "Utwórz nową propozycję zarządzania na Uniswap", - "title.createGovernanceTo": "Utwórz nową propozycję zarządzania, która będzie przedmiotem głosowania posiadaczy UNI. Tokeny UNI reprezentują udziały z prawem głosu w zarządzaniu Uniswap.", - "title.earnFees": "Zarabiaj opłaty, gdy inni wymieniają się na Uniswap, dodając tokeny do pul płynności.", - "title.easilyRemove": "Z łatwością usuń swoją płynność z Uniswap v2 i wpłać do Uniswap v3.", - "title.easilyRemoveV4": "Łatwo usuń swoją płynność z kont Uniswap v2 i v3 i wpłać ją do Uniswap v4.", - "title.extension.uninstall": "Rozszerzenie odinstalowane", - "title.extensionPasskeyLogIn": "Zaloguj się za pomocą klucza dostępu", - "title.managePasskeys": "Uniswap | Zarządzaj swoimi kluczami dostępu", - "title.migratev2": "Przeprowadź migrację płynności puli v2 do Uniswap v3", - "title.migratev3": "Migracja płynności puli do Uniswap v4", - "title.placeLimit": "Składaj zlecenia z limitem na Uniswap", - "title.realTime": "Ceny, wykresy, dane transakcyjne i inne w czasie rzeczywistym.", - "title.removeLiquidityv2": "Usuń płynność puli (v2) na Uniswap", - "title.removePoolLiquidity": "Usuń płynność puli na Uniswap", - "title.removeTokensv2": "Usuń swoje tokeny z pul płynności v2.", - "title.removev3Liquidity": "Usuń swoje tokeny z pul płynności v3.", - "title.sendCrypto": "Wyślij krypto", - "title.sendTokens": "Wyślij tokeny na Uniswap", - "title.swappingMadeSimple": "Natychmiast kupuj i sprzedawaj kryptowaluty na Ethereum, Base, Arbitrum, Polygon, Unichain i innych. Platforma DeFi, której ufają miliony.", - "title.tradeTokens": "Handluj tokenami i zapewniaj płynność. Ceny, wykresy, dane transakcyjne i inne w czasie rzeczywistym.", - "title.uniswapTradeCrypto": "Uniswap | Handluj kryptowalutami na wiodącej giełdzie DeFi ", - "title.uniToken": "Tokeny UNI reprezentują udziały z prawem głosu w zarządzaniu Uniswap. Na każdą propozycję możesz głosować samodzielnie lub przekazać swoje głosy osobie trzeciej.", - "title.voteOnGov": "Głosuj nad propozycjami zarządzania w Uniswap", - "token.balances.main": "Twój balans", - "token.balances.other": "Salda w innych sieciach", - "token.balances.viewOnly": "Saldo {{ownerAddress}}", - "token.bridge": "{{label}} most żetonowy", - "token.chart.candlestick.unavailable": "Wykresy świecowe są niedostępne dla tego tokena", - "token.chart.tooltip": "Opłaty: {{amount}}", - "token.details": "Szczegóły tokena", - "token.error.unknown": "Nieznany token", - "token.fee.buy.label": "opłata za zakup", - "token.fee.label": "opłata", - "token.fee.sell.label": "opłata za sprzedaż", - "token.links.title": "Spinki do mankietów", - "token.links.twitter": "Świergot", - "token.links.website": "Strona internetowa", - "token.notFound.description": "Przepraszamy, nie możemy znaleźć żadnych informacji o tym tokenie. Sprawdź nazwę i adres i spróbuj ponownie.", - "token.notFound.title": "Nie znaleziono tokena", - "token.priceExplorer.error.description": "Coś poszło nie tak.", - "token.priceExplorer.error.title": "Nie udało się załadować wykresu cen", - "token.priceExplorer.timeRangeLabel.all": "Cały czas", - "token.priceExplorer.timeRangeLabel.day": "1D", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 dzień", - "token.priceExplorer.timeRangeLabel.hour": "1 godz.", - "token.priceExplorer.timeRangeLabel.month": "1 mln", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 miesiąc", - "token.priceExplorer.timeRangeLabel.week": "1 W", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 tydzień", - "token.priceExplorer.timeRangeLabel.year": "1 rok", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 rok", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} nie jest dostępny", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} i {{tokenSymbol1}} nie są dostępne", - "token.safety.fee.detected": "Wykryto opłatę za token", - "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs nie pobiera żadnych z tych opłat.", - "token.safety.warning.alwaysDoYourResearch": "Zawsze rób rozeznanie", - "token.safety.warning.blocked.description.default_one": "Nie możesz handlować tym tokenem za pomocą aplikacji Uniswap.", - "token.safety.warning.blocked.description.default_other": "Nie możesz handlować tymi tokenami za pomocą aplikacji Uniswap.", - "token.safety.warning.copyContractAddress.message": "To jest adres kontraktu, który działa jako unikalny identyfikator tokenów w blockchain. Wszelkie kryptowaluty wysłane na ten adres zostaną utracone.", - "token.safety.warning.copyContractAddress.title": "Nie wysyłaj kryptowalut na ten adres", - "token.safety.warning.dontShowWarningAgain": "Nie pokazuj mi więcej tego ostrzeżenia", - "token.safety.warning.dontShowWarningAgainShort": "Nie pokazuj ponownie", - "token.safety.warning.doYourOwnResearch": "Zawsze przeprowadź własne badania przed podjęciem dalszych działań.", - "token.safety.warning.feeDescription": "Ładuje , gdy {{action}}", - "token.safety.warning.flaggedAsMalicious": "Oznaczono jako złośliwe", - "token.safety.warning.flaggedAsSuspicious": "Oznaczono jako podejrzane", - "token.safety.warning.fotHigh.title": "Wykryto wysoką opłatę", - "token.safety.warning.fotLow.title": "Wykryto opłatę", - "token.safety.warning.fotVeryHigh.title": "Wykryto bardzo wysoką opłatę", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} został oznaczony jako niesprzedawalny. Zamiana tego tokena może skutkować utratą środków.", - "token.safety.warning.honeypot.title": "Wykryto 100% opłatę za sprzedaż", - "token.safety.warning.impersonator": "Podszywa się pod inny token", - "token.safety.warning.impersonator.title": "Wykryto token podszywający się pod kogoś", - "token.safety.warning.malicious.general.message": "{{tokenSymbol}} został oznaczony jako złośliwy przez Blockaid.", - "token.safety.warning.malicious.impersonator.message": "{{tokenSymbol}} został oznaczony przez Blockaid jako próbujący skopiować inny token. Może to nie być token, który chcesz wymienić.", - "token.safety.warning.malicious.impersonator.message.short": "{{tokenSymbol}} może nie być tokenem, który chcesz wymienić.", - "token.safety.warning.malicious.title": "Wykryto złośliwy token", - "token.safety.warning.mayResultInLoss": "Zamiana może skutkować utratą środków.", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} nie jest przedmiotem obrotu na wiodących scentralizowanych giełdach w USA.", - "token.safety.warning.notListedOnExchanges": "Nie jest notowany na wiodących giełdach amerykańskich", - "token.safety.warning.potentialHoneypot.card.message": "{{tokenSymbol}} został oznaczony jako podejrzany przez Blockaid.", - "token.safety.warning.potentialHoneypot.modal.message": "{{tokenSymbol}} zostało oznaczone jako potencjalny honeypot przez Blockaid. Zawsze przeprowadź własne badania przed kontynuowaniem.", - "token.safety.warning.potentialHoneypot.title": "Wykryto potencjalny honeypot", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} został oznaczony jako niesprzedawalny.", - "token.safety.warning.sellFee100.title": "Wykryto 100% opłatę za sprzedaż", - "token.safety.warning.spam.message": "Wiadomość {{tokenSymbol}} została oznaczona jako spam przez Blockaid.", - "token.safety.warning.spam.title": "Wykryto token spamowy", - "token.safety.warning.spamsUsers": "Spamuje użytkowników", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} pobiera opłatę {{buyFeePercent}} przy zakupie i {{sellFeePercent}} przy sprzedaży.", - "token.safety.warning.tokenChargesFee.buy.message": "{{tokenSymbol}} pobiera opłatę {{feePercent}} przy zakupie.", - "token.safety.warning.tokenChargesFee.buy.message.descriptive": "{{tokenSymbol}} pobiera opłatę {{feePercent}} przy zakupie. Wymiana może skutkować utratą środków. Uniswap Labs nie pobiera żadnych z tych opłat.", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} pobiera opłatę {{feePercent}} przy sprzedaży.", - "token.safety.warning.tokenChargesFee.sell.message.descriptive": "{{tokenSymbol}} pobiera opłatę {{feePercent}} przy sprzedaży. Wymiana może skutkować utratą środków. Uniswap Labs nie pobiera żadnych z tych opłat.", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} pobiera opłatę przy zakupie lub sprzedaży.", - "token.safetyLevel.blocked.message": "Nie możesz handlować tym tokenem za pomocą portfela Uniswap.", - "token.safetyLevel.medium.message.plural": "Te tokeny nie są przedmiotem obrotu na wiodących amerykańskich giełdach scentralizowanych. Zawsze przeprowadź własne badania przed kontynuowaniem.", - "token.selector.search.error": "Nie udało się wczytać wyników wyszukiwania", - "token.stats.fullyDilutedValuation": "W pełni rozwodniona wycena", - "token.stats.marketCap": "Kapitalizacja rynkowa", - "token.stats.priceHighYear": "Wysoka 52W", - "token.stats.priceLowYear": "52 W, niski", - "token.stats.section.about": "Około {{token}}", - "token.stats.title": "Statystyki", - "token.stats.translation.original": "Pokaż oryginał", - "token.stats.translation.translate": "Przetłumacz na {{language}}", - "token.stats.volume": "Objętość 24h", - "token.symbol.input.fallback": "Token wejściowy", - "token.symbol.output.fallback": "Token wyjściowy", - "token.wrap.fail.message": "Swapy w protokole Uniswap mogą zaczynać się i kończyć na ETH. Jednak podczas zamiany ETH jest pakowany w WETH.", - "token.zeroNativeBalance.description.mainnet": "Będziesz musiał wymienić token na Ethereum, aby otrzymać {{ tokenSymbol }}. Wymiana wymaga ETH na pokrycie kosztów sieci.", - "token.zeroNativeBalance.description.otherChains": "Będziesz musiał wymienić token na {{ chainName }} , aby otrzymać {{ tokenSymbol }}. Zamiana wymaga pokrycia kosztów sieciowych w wysokości {{ chainName }} {{ nativeTokenSymbol }} .", - "token.zeroNativeBalance.subtitle": "{{ tokenSymbol }} nie jest dostępny do bezpośredniego zakupu.", - "token.zeroNativeBalance.title.mainnet": "Potrzebujesz {{ nativeTokenName }}", - "token.zeroNativeBalance.title.otherChains": "Potrzebujesz {{ nativeTokenName }} na {{ chainName }}", - "tokens.action.hide": "Ukryj token", - "tokens.action.unhide": "Pokaż token", - "tokens.nfts.action.viewOnExplorer": "Zobacz na {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "Nie udało się wczytać kolekcji NFT", - "tokens.nfts.collection.label.items": "Rzeczy", - "tokens.nfts.collection.label.owners": "Właściciele", - "tokens.nfts.collection.label.priceFloor": "Podłoga", - "tokens.nfts.collection.label.swapVolume": "Tom", - "tokens.nfts.connectEthereumToView": "Połącz portfel Ethereum, aby przeglądać swoje NFT", - "tokens.nfts.details.contract.address": "Adres umowy", - "tokens.nfts.details.error.load.title": "Nie udało się wczytać szczegółów NFT", - "tokens.nfts.details.network": "Sieć", - "tokens.nfts.details.owner": "Posiadany przez", - "tokens.nfts.details.price": "Aktualna cena", - "tokens.nfts.details.recentPrice": "Ostatnia cena sprzedaży", - "tokens.nfts.details.traits": "Cechy", - "tokens.nfts.empty.description": "Nie znaleziono NFT", - "tokens.nfts.error.unavailable": "Treść niedostępna", - "tokens.nfts.hidden.action.hide": "Ukryj NFT", - "tokens.nfts.hidden.action.unhide": "Odkryj NFT", - "tokens.nfts.link.collection": "Strona internetowa kolekcji", - "tokens.nfts.list.error.load.title": "Nie udało się wczytać plików NFT", - "tokens.nfts.list.none.button": "Otrzymuj NFT", - "tokens.nfts.list.none.description.default": "Aby rozpocząć, przenieś NFT z innego portfela.", - "tokens.nfts.list.none.description.external": "Kiedy ten portfel kupi lub otrzyma NFT, pojawią się one tutaj.", - "tokens.nfts.list.none.title": "Nie ma jeszcze NFT", - "tokens.nfts.notAvailableOnSolana": "NFT nie są dostępne na platformie Solana", - "tokens.selector.button.choose": "Wybierz token", - "tokens.selector.empty.buy.message": "Kup kryptowalutę za pomocą karty lub banku, aby wysłać tokeny.", - "tokens.selector.empty.buy.title": "Kup kryptowalutę", - "tokens.selector.empty.receive.title": "Odbierz tokeny", - "tokens.selector.empty.title": "Nie ma jeszcze tokenów", - "tokens.selector.error.load": "Nie udało się wczytać tokenów", - "tokens.selector.search.empty": "Nie znaleziono wyników dla {{searchText}}", - "tokens.selector.search.placeholder": "Szukaj tokenów", - "tokens.selector.section.bridging": "Wymiana między sieciami", - "tokens.selector.section.favorite": "Ulubione", - "tokens.selector.section.otherNetworksSearchResults": "Tokeny znalezione w innych sieciach", - "tokens.selector.section.otherSearchResults": "Inne tokeny na {{network}}", - "tokens.selector.section.recent": "Ostatnie wyszukiwania", - "tokens.selector.section.search": "Wyniki wyszukiwania", - "tokens.selector.section.trending": "Tokeny według wolumenu 24H", - "tokens.selector.section.yours": "Twoje tokeny", - "tokens.table.search.placeholder.pools": "Wyszukaj baseny", - "tokens.table.search.placeholder.tokens": "Szukaj tokenów", - "tokens.table.search.placeholder.transactions": "Wyszukaj transakcje", - "toucan.auction.bidConcentration": "Koncentracja tukana", - "toucan.auction.bidConcentration.tooltip.description": "Opis podpowiedzi Tukana", - "toucan.auction.bidConcentration.tooltip.title": "Tytuł podpowiedzi Tukan", - "toucan.auctions": "Aukcje", - "toucan.bidForm.maxBudget": "Maksymalny budżet", - "toucan.bidForm.placeBid": "Złóż swoją ofertę", - "toucan.displayMode.tokenPrice": "Cena tokena", - "toucan.displayMode.valuation": "Wycena", - "transaction.action.cancel.button": "Anuluj transakcję", - "transaction.action.cancel.description": "Jeśli anulujesz tę transakcję, zanim zostanie ona przetworzona przez sieć, zamiast pierwotnej zapłacisz nowy koszt sieciowy.", - "transaction.action.cancel.title": "Anulować tę transakcję?", - "transaction.action.clear": "Wyczyść oczekujące", - "transaction.action.copy": "Skopiuj identyfikator transakcji", - "transaction.action.copyProvider": "Skopiuj {{providerName}} identyfikator transakcji", - "transaction.amount.unlimited": "Nieograniczony", - "transaction.callData": "Dane połączeń", - "transaction.details.dappName": "Aplikacja", - "transaction.details.from": "Z", - "transaction.details.networkFee": "Koszt sieci", - "transaction.details.networkFee.swap": "Koszt wymiany sieci", - "transaction.details.providerFee": "Opłata dostawcy", - "transaction.details.swapRate": "Wskaźnik", - "transaction.details.transaction": "Transakcja", - "transaction.details.uniswapFee": "Opłata ({{ feePercent }}%)", - "transaction.network.all": "Wszystkie sieci", - "transaction.networkCost.description": "Koszt przetworzenia transakcji w blockchainie. Uniswap jest zoptymalizowany pod kątem minimalnych kosztów sieciowych.", - "transaction.networkCost.includesSmartWalletActivation": "Zawiera aktywację inteligentnego portfela", - "transaction.networkCost.label": "Koszt sieci", - "transaction.networkCost.maxNativeBalance.description": "Niewielka część salda tokena sieciowego jest zarezerwowana na pokrycie kosztów sieciowych tej transakcji.", - "transaction.networkCost.maxNativeBalance.title": "Dlaczego nie mogę wykorzystać maksymalnego salda?", - "transaction.networkCost.veryHigh.label": "Bardzo wysoki koszt sieci", - "transaction.notification.error.cancel": "Nie można anulować transakcji", - "transaction.notification.error.replace": "Nie można zastąpić transakcji", - "transaction.status.approval.canceled": "Zatwierdzenie anulowane", - "transaction.status.approval.failed": "Zatwierdzenie nie powiodło się", - "transaction.status.approve.canceled": "Anulowano zatwierdzenie", - "transaction.status.approve.canceling": "Anulowanie zatwierdzenia", - "transaction.status.approve.failed": "Nie udało się zatwierdzić", - "transaction.status.approve.pending": "Pochlebny", - "transaction.status.approve.success": "Zatwierdzony", - "transaction.status.approve.successDapp": "Zatwierdzono {{externalDappName}}", - "transaction.status.buy.canceled": "Anulowany zakup", - "transaction.status.buy.canceling": "Anulowanie zakupu", - "transaction.status.buy.failed": "Nie udało się kupić", - "transaction.status.buy.pending": "Kupowanie", - "transaction.status.buy.success": "Kupił", - "transaction.status.buy.successDapp": "Kupiony {{externalDappName}}", - "transaction.status.claim.canceled": "Anulowano pobieranie opłat", - "transaction.status.claim.canceling": "Anulowanie pobierania opłat", - "transaction.status.claim.failed": "Pobranie opłaty nie powiodło się", - "transaction.status.claim.pending": "Zbieranie opłat", - "transaction.status.claim.success": "Opłaty pobierane", - "transaction.status.collect.fees.canceled": "Zbierz opłaty anulowane", - "transaction.status.collect.fees.failed": "Pobieranie opłat nie powiodło się", - "transaction.status.collected.fees": "Zebrane opłaty", - "transaction.status.collecting.fees": "Zbieranie opłat", - "transaction.status.confirm.canceled": "Anulowano, potwierdź", - "transaction.status.confirm.canceling": "Oczekuje na anulowanie", - "transaction.status.confirm.failed": "Nie udało się potwierdzić", - "transaction.status.confirm.pending": "Transakcja w toku", - "transaction.status.confirm.success": "Transakcja potwierdzona", - "transaction.status.confirm.successDapp": "Transakcja potwierdzona {{externalDappName}}", - "transaction.status.createPair.canceled": "Anulowano tworzenie pary", - "transaction.status.createPair.canceling": "Anulowanie tworzenia pary", - "transaction.status.createPair.failed": "Nie udało się utworzyć pary", - "transaction.status.createPair.pending": "Tworzenie pary", - "transaction.status.createPair.success": "Utworzono parę", - "transaction.status.createPool.canceled": "Anulowano tworzenie puli", - "transaction.status.createPool.canceling": "Anulowanie tworzenia puli", - "transaction.status.createPool.failed": "Nie udało się utworzyć puli", - "transaction.status.createPool.pending": "Tworzenie puli", - "transaction.status.createPool.success": "Utworzono basen", - "transaction.status.liquidityDecrease.canceled": "Usuń płynność anulowaną", - "transaction.status.liquidityDecrease.canceling": "Anulowanie usuwania płynności", - "transaction.status.liquidityDecrease.failed": "Usunięcie płynności nie powiodło się", - "transaction.status.liquidityDecrease.pending": "Usuwanie płynności", - "transaction.status.liquidityDecrease.success": "Usunięto płynność", - "transaction.status.liquidityIncrease.canceled": "Dodanie płynności anulowane", - "transaction.status.liquidityIncrease.canceling": "Anulowanie dodawania płynności", - "transaction.status.liquidityIncrease.failed": "Dodanie płynności nie powiodło się", - "transaction.status.liquidityIncrease.pending": "Dodanie płynności", - "transaction.status.liquidityIncrease.success": "Dodano płynność", - "transaction.status.lpIncentivesClaim.canceled": "Anulowane roszczenie o nagrody LP", - "transaction.status.lpIncentivesClaim.canceling": "Anulowanie roszczeń dotyczących nagród LP", - "transaction.status.lpIncentivesClaim.failed": "Nie udało się odebrać nagród LP", - "transaction.status.lpIncentivesClaim.pending": "Odbieranie nagród LP", - "transaction.status.lpIncentivesClaim.success": "Odebrane nagrody LP", - "transaction.status.migrateLiquidity.canceled": "Migracja płynności anulowana", - "transaction.status.mint.canceled": "Anulowana mięta", - "transaction.status.mint.canceling": "Anulowanie mięty", - "transaction.status.mint.failed": "Nie udało się wybić", - "transaction.status.mint.pending": "Bicie", - "transaction.status.mint.success": "Wybity", - "transaction.status.mint.successDapp": "Wybito {{externalDappName}}", - "transaction.status.offramp.canceled": "Zjazd odwołany", - "transaction.status.offramp.failed": "Nieudany zjazd", - "transaction.status.offramp.pending": "Zjazd", - "transaction.status.offramp.success": "Zjazd z rampy", - "transaction.status.onramp.canceled": "Wjazd odwołany", - "transaction.status.onramp.failed": "Wjazd nieudany", - "transaction.status.onramp.pending": "Wjazd", - "transaction.status.onramp.success": "Wjazd", - "transaction.status.permit.approved": "Pozwolenie zatwierdzone", - "transaction.status.permit.canceled": "Anulowano transakcję pozwolenia", - "transaction.status.permit.failed": "Pozwolenie nie zostało wydane", - "transaction.status.purchase.canceled": "Anulowany zakup", - "transaction.status.purchase.canceling": "Anulowanie zakupu", - "transaction.status.purchase.failed": "Zakup nieudany", - "transaction.status.purchase.failedOn": "Nie udało się dokonać zakupu w dniu {{serviceProvider}}", - "transaction.status.purchase.pending": "Nabywczy", - "transaction.status.purchase.pendingOn": "Zakupy w {{serviceProvider}}", - "transaction.status.purchase.successOn": "Zakupiono {{serviceProvider}}", - "transaction.status.receive.canceled": "Anulowano odbiór", - "transaction.status.receive.canceling": "Anulowanie odbioru", - "transaction.status.receive.failed": "Odbiór nie powiódł się", - "transaction.status.receive.failedFrom": "Nie udało się odebrać od {{serviceProvider}}", - "transaction.status.receive.pending": "Otrzymujący", - "transaction.status.receive.pendingFrom": "Odbieram od {{serviceProvider}}", - "transaction.status.receive.success": "Otrzymane", - "transaction.status.receive.successDapp": "Otrzymano {{externalDappName}}", - "transaction.status.receive.successFrom": "Otrzymano od {{serviceProvider}}", - "transaction.status.removeDelegation.canceled": "Usuń delegację anulowaną", - "transaction.status.removeDelegation.failed": "Usunięcie delegacji nie powiodło się", - "transaction.status.removeDelegation.pending": "Usuwanie delegacji", - "transaction.status.removeDelegation.success": "Usunięto delegację", - "transaction.status.revoke.canceled": "Anulowano odwołanie", - "transaction.status.revoke.canceling": "Anulowanie odwołania", - "transaction.status.revoke.failed": "Nie udało się odwołać", - "transaction.status.revoke.pending": "Odwołanie", - "transaction.status.revoke.success": "Odwołany", - "transaction.status.revoke.successDapp": "Unieważniono {{externalDappName}}", - "transaction.status.sale.canceled": "Anulowana sprzedaż", - "transaction.status.sale.canceling": "Anulowanie sprzedaży", - "transaction.status.sale.failedOn": "Sprzedaż nie powiodła się przez {{serviceProvider}}", - "transaction.status.sale.pendingCard.msg": "Dowiedz się więcej o sprzedaży kryptowalut.", - "transaction.status.sale.pendingCard.title": "Dlaczego moja sprzedaż jest nadal w toku?", - "transaction.status.sale.pendingOn": "Sprzedaję przez {{serviceProvider}}", - "transaction.status.sale.successOn": "Sprzedano przez {{serviceProvider}}", - "transaction.status.sell.canceled": "Anulowano sprzedaż", - "transaction.status.sell.canceling": "Anulowanie sprzedaży", - "transaction.status.sell.failed": "Nie udało się sprzedać", - "transaction.status.sell.pending": "Sprzedawanie", - "transaction.status.sell.success": "Sprzedany", - "transaction.status.sell.successDapp": "Sprzedawane {{externalDappName}}", - "transaction.status.send.canceled": "Anulowano wysyłanie", - "transaction.status.send.canceling": "Anulowanie wysyłania", - "transaction.status.send.failed": "Nie udało się wysłać", - "transaction.status.send.pending": "Wysyłanie", - "transaction.status.send.success": "Wysłano", - "transaction.status.send.successDapp": "Wysłano {{externalDappName}}", - "transaction.status.swap.canceled": "Wymiana anulowana", - "transaction.status.swap.canceling": "Anulowanie wymiany", - "transaction.status.swap.expired": "Zamiana wygasła", - "transaction.status.swap.failed": "Nie udało się dokonać zamiany", - "transaction.status.swap.insufficientFunds": "Niewystarczające środki", - "transaction.status.swap.pending": "Zamiana", - "transaction.status.swap.success": "Zamienione", - "transaction.status.swap.successDapp": "Zamiana na {{externalDappName}}", - "transaction.status.unwrap.canceled": "Anulowano rozpakowywanie", - "transaction.status.unwrap.canceling": "Anulowanie rozpakowywania", - "transaction.status.unwrap.failed": "Nie udało się rozpakować", - "transaction.status.unwrap.pending": "Rozpakowywanie", - "transaction.status.unwrap.success": "Rozpakowany", - "transaction.status.unwrap.successDapp": "Rozpakowany {{externalDappName}}", - "transaction.status.wrap.canceled": "Anulowane opakowanie", - "transaction.status.wrap.canceling": "Anulowanie owijania", - "transaction.status.wrap.failed": "Nie udało się zapakować", - "transaction.status.wrap.pending": "Zawijanie", - "transaction.status.wrap.success": "Owinięty", - "transaction.status.wrap.successDapp": "Zapakowano {{externalDappName}}", - "transaction.submittedOn": "Złożono dnia", - "transaction.summary.liquidity": "{{firstAmountWithSymbol}} i {{secondAmountWithSymbol}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} do {{recipientAddress}}", - "transaction.summary.received.noAmount": "Otrzymano od {{name}}", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} od {{senderAddress}}", - "transaction.summary.sent.noAmount": "Wysłano do {{name}}", - "transaction.warning.insufficientGas.modal.message": "Potrzebujesz ~{{tokenAmount}} {{tokenSymbol}} () na {{networkName}} , aby pokryć koszt sieciowy tej transakcji. Zamień {{tokenSymbol}} z innego łańcucha lub kup za pomocą swojej karty, aby kontynuować.", - "transaction.warning.insufficientGas.modal.message.noAction": "Potrzebujesz ~{{tokenAmount}} {{tokenSymbol}} () na {{networkName}} , aby pokryć koszt sieci tej transakcji.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount": "Potrzebujesz ~{{tokenAmount}} {{tokenSymbol}} () na {{networkName}} , aby pokryć koszt sieci tej transakcji.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount.noAction": "Aby dokonać wymiany na ten token, potrzebujesz więcej {{tokenSymbol}} na {{networkName}}.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "Za mało {{tokenSymbol}} na {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Za mało {{tokenSymbol}}", - "transaction.warning.maxNative.message": "Zamierzasz wydać większość swojego salda tokena sieciowego. Może to pozostawić niewystarczające środki na pokrycie przyszłych kosztów sieciowych.", - "transaction.warning.maxNative.title": "Niskie saldo tokenów sieciowych", - "transaction.watcher.error.cancel": "Nie można anulować transakcji", - "transaction.watcher.error.status": "Błąd podczas sprawdzania statusu transakcji", - "uniswapX.aggregatesLiquidity": " agreguje źródła płynności w celu uzyskania lepszych cen i swapów bez gazu.", - "uniswapX.cost": "UniswapX eliminuje typowe koszty transakcji w blockchainie.", - "uniswapx.description": "UniswapX agreguje źródła płynności w celu uzyskania lepszych cen i swapów bez gazu.", - "uniswapx.description.unsupported": "Usługa UniswapX jest obecnie niedostępna, ponieważ ustawienia inteligentnego portfela są zarządzane przez inną aplikację portfela.", - "uniswapx.included": "Zawiera UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "Dowiedz się więcej o wymianie z UniswapX", - "uniswapx.unavailable.title": "UniswapX jest niedostępny", - "uniswapx.v2QuoteFailed": "Twarda wycena UniswapX v2 nie powiodła się. Spróbuj ponownie z klasyczną zamianą.", - "unitags.banner.button.claim": "Odbierz teraz", - "unitags.banner.subtitle": "Zbuduj spersonalizowany profil web3 i łatwo udostępniaj swój adres znajomym.", - "unitags.banner.title.compact": "Zdobądź swoją {{unitagDomain}} nazwę użytkownika i stwórz swój konfigurowalny profil.", - "unitags.banner.title.full": "Odbierz swoją nazwę użytkownika {{unitagDomain}}", - "unitags.choosePhoto.option.cameraRoll": "Wybierz z rolki aparatu", - "unitags.choosePhoto.option.computer": "Prześlij z komputera", - "unitags.choosePhoto.option.nft": "Wybierz NFT", - "unitags.choosePhoto.option.remove": "Usuń zdjęcie profilowe", - "unitags.claim.available": "Dostępny", - "unitags.claim.confirmation.customize": "Dostosuj profil", - "unitags.claim.confirmation.description": "{{unitagAddress}} jest gotowy do wysyłania i odbierania kryptowalut. Kontynuuj rozbudowę swojego portfela, dostosowując swój profil web3.", - "unitags.claim.confirmation.success.long": "Masz to!", - "unitags.claim.confirmation.success.short": "Rozumiem!", - "unitags.claim.error.addressLimit": "Dokonałeś już maksymalnej liczby zmian w nazwie użytkownika dla tego adresu", - "unitags.claim.error.avatar": "Nie można ustawić awatara. Spróbuj ponownie później.", - "unitags.claim.error.default": "Nie można zgłosić nazwy użytkownika. Spróbuj ponownie później.", - "unitags.claim.error.deviceLimit": "Osiągnąłeś maksymalną liczbę nazw użytkowników, które mogą być aktywne na tym urządzeniu", - "unitags.claim.error.general": "Nie można zarezerwować nazwy użytkownika", - "unitags.claim.error.unavailable": "Ta nazwa użytkownika nie jest dostępna", - "unitags.claim.error.unknown": "Nieznany błąd", - "unitags.claim.username.default": "Twoje imię", - "unitags.delete.confirm.subtitle": "Zamierzasz usunąć swoją nazwę użytkownika i konfigurowalne szczegóły profilu. Nie będzie można go odzyskać.", - "unitags.delete.confirm.title": "Jesteś pewny?", - "unitags.editProfile.placeholder": "nazwa użytkownika", - "unitags.editUsername.confirm.subtitle": "Zamierzasz zmienić swoją nazwę użytkownika. Kiedy już to zmienisz, nie będziesz mógł już nigdy więcej po niego sięgnąć.", - "unitags.editUsername.confirm.title": "Jesteś pewny?", - "unitags.editUsername.title": "Edytuj swoją nazwę użytkownika", - "unitags.editUsername.warning.default": "Po zmianie nazwy użytkownika nie możesz jej już nigdy odzyskać. Możesz ją zmienić tylko 2 razy.", - "unitags.editUsername.warning.max": "Osiągnąłeś maksymalną liczbę 2 zmian nazw użytkowników.", - "unitags.extension.intro.buttton": "Złóż wniosek o nazwę użytkownika", - "unitags.extension.intro.description": "Pożegnaj adresy 0x. Nazwy użytkowników to czytelne nazwy, które ułatwiają wysyłanie i odbieranie kryptowalut.", - "unitags.extension.intro.title": "Przedstawiamy nazwy użytkowników", - "unitags.extension.intro.upsell.customizable": "Konfigurowalne profile", - "unitags.extension.intro.upsell.ens": "Obsługiwane przez subdomeny ENS", - "unitags.extension.intro.upsell.free": "Swobodne zgłaszanie roszczeń", - "unitags.intro.features.ens": "Obsługiwane przez subdomeny ENS", - "unitags.intro.features.free": "Swobodne zgłaszanie roszczeń", - "unitags.intro.features.profile": "Konfigurowalne profile", - "unitags.intro.subtitle": "Pożegnaj adresy 0x. Nazwy użytkowników to czytelne nazwy, które ułatwiają wysyłanie i odbieranie kryptowalut.", - "unitags.intro.title": "Przedstawiamy nazwy użytkowników", - "unitags.notification.delete.error": "Nie można usunąć nazwy użytkownika. Spróbuj ponownie później.", - "unitags.notification.delete.title": "Nazwa użytkownika została usunięta", - "unitags.notification.profile.error": "Nie można zaktualizować profilu. Spróbuj ponownie później.", - "unitags.notification.profile.title": "Profil zaktualizowany", - "unitags.notification.username.error": "Nie można zmienić nazwy użytkownika. Spróbuj ponownie później.", - "unitags.notification.username.title": "Nazwa użytkownika została zmieniona", - "unitags.onboarding.claim.subtitle": "To Twój spersonalizowany adres, na który ludzie mogą wysyłać kryptowaluty.", - "unitags.onboarding.claim.title.choose": "Utwórz swoją nazwę użytkownika", - "unitags.onboarding.claim.title.claim": "Zgłoś swoją nazwę użytkownika", - "unitags.onboarding.info.description": "Nazwy użytkowników przekształcają złożone adresy 0x w czytelne nazwy. Pobierając nazwę użytkownika {{unitagDomain}} , możesz łatwo wysyłać i odbierać kryptowaluty oraz tworzyć publiczny profil web3.", - "unitags.onboarding.info.title": "Uproszczony adres", - "unitags.onboarding.profile.subtitle": "Prześlij własny lub trzymaj się swojego unikalnego Unicona. Zawsze możesz to zmienić później.", - "unitags.onboarding.profile.title": "Wybierz zdjęcie profilowe", - "unitags.profile.action.delete": "Usuń nazwę użytkownika", - "unitags.profile.action.edit": "Edytuj nazwę użytkownika", - "unitags.profile.bio.label": "Życiorys", - "unitags.profile.bio.placeholder": "Wpisz biografię swojego profilu", - "unitags.profile.links.twitter": "Świergot", - "unitags.username.error.chars": "Nazwy użytkowników mogą zawierać wyłącznie litery i cyfry", - "unitags.username.error.max": "Nazwy użytkowników nie mogą mieć więcej niż {{number}} znaków", - "unitags.username.error.min": "Nazwy użytkowników muszą mieć co najmniej {{number}} znaków", - "unitags.username.error.uppercase": "Nazwy użytkowników mogą zawierać wyłącznie małe litery i cyfry", - "uwulink.error.insufficientTokens": "Za mało {{tokenSymbol}} na {{chain}}", - "v2.notAvailable": "Uniswap V2 nie jest dostępny w tej sieci.", - "wallet.appSignIn": "Zaloguj się za pomocą aplikacji", - "wallet.connectingAgreement": "Podłączając portfel, wyrażasz zgodę na Warunki świadczenia usług Uniswap Labs i wyrażasz zgodę na jego Politykę prywatności.", - "wallet.connectionFailed.message": "Próba połączenia nie powiodła się. Spróbuj ponownie, postępując zgodnie z instrukcjami, aby połączyć się z portfelem.", - "wallet.mismatch.popup.description": "Niektóre funkcje nie są obsługiwane przez podłączony portfel.", - "wallet.mismatch.popup.title": "Ograniczone wsparcie portfela", - "wallet.other": "Inne portfele", - "wallet.scanToConnect": "Zeskanuj kod QR, aby się połączyć", - "wallet.wrongNet": "Twój portfel jest podłączony do niewłaściwej sieci.", - "walletConnect.dapps.empty.description": "Połącz się z aplikacją, skanując kod za pośrednictwem WalletConnect", - "walletConnect.dapps.manage.empty.title": "Brak połączonych aplikacji", - "walletConnect.dapps.manage.title": "Znajomości", - "walletConnect.error.connection.message": "Portfel Uniswap obsługuje obecnie {{chainNames}}. Proszę używać tylko \"{{dappName}}\" na tych łańcuchach", - "walletConnect.error.connection.title": "Błąd połączenia", - "walletConnect.error.general.message": "Wystąpił problem z WalletConnect. Proszę spróbuj ponownie", - "walletConnect.error.general.title": "Błąd Portfela", - "walletConnect.error.scantastic.message": "Wystąpił problem z Twoim kodem QR. Proszę spróbuj ponownie", - "walletConnect.error.scantastic.title": "Nieprawidłowy kod QR", - "walletConnect.error.unsupported.message": "Zanim spróbujesz ponownie, upewnij się, że skanujesz prawidłowy kod QR WalletConnect, adresu Ethereum lub rozszerzenia Uniswap.", - "walletConnect.error.unsupported.title": "Nieprawidłowy kod QR", - "walletConnect.error.unsupportedV1.message": "Usługa WalletConnect v1 nie jest już obsługiwana. Aplikacja, z którą próbujesz się połączyć, wymaga aktualizacji do wersji WalletConnect v2.", - "walletConnect.error.unsupportedV1.title": "Nieprawidłowy kod QR", - "walletConnect.error.uwu.scan": "Wystąpił problem ze skanowaniem tego kodu QR.", - "walletConnect.error.uwu.title": "Błąd łącza UwU", - "walletConnect.error.uwu.unsupported": "Ten kod QR nie jest obsługiwany.", - "walletConnect.pending.button.connect": "Łączyć", - "walletConnect.pending.button.reject": "Odrzucić", - "walletConnect.pending.button.scrollDown": "Przewiń w dół, aby się połączyć", - "walletConnect.pending.threat.confirmationText": "Rozumiem ryzyko", - "walletConnect.pending.threat.description": "Podpisywanie wiadomości lub dokonywanie transakcji za pomocą tej aplikacji może skutkować utratą środków.", - "walletConnect.pending.threat.title": "Wykryto złośliwą aplikację", - "walletConnect.pending.title": "Połącz się z {{dappName}}", - "walletConnect.pending.unverified.description": "Zanim przejdziesz dalej, upewnij się, że ufasz tej witrynie. ", - "walletConnect.pending.unverified.title": "Niezweryfikowana aplikacja", - "walletConnect.permissions.option.requestApprovals": "Poproś o zatwierdzenie transakcji", - "walletConnect.permissions.option.transferAssets": "Move funds without permission", - "walletConnect.permissions.option.viewTokenBalances": "View your balance and activity", - "walletConnect.permissions.title": "App permissions", - "walletConnect.request.bundledTransactions.label_one": "Pojedyncza transakcja pakietowa", - "walletConnect.request.bundledTransactions.label_other": "{{count}} transakcji pakietowych", - "walletConnect.request.button.scrollDown": "Przewiń w dół, aby podpisać", - "walletConnect.request.button.sign": "Podpisać", - "walletConnect.request.details.label.function": "Funkcjonować", - "walletConnect.request.details.label.sending": "Wysyłanie", - "walletConnect.request.details.label.token": "Znak", - "walletConnect.request.details.label.tokens": "Żetony", - "walletConnect.request.error.insufficientFunds": "Nie masz wystarczającej ilości {{currencySymbol}} , aby sfinalizować tę transakcję.", - "walletConnect.request.error.network": "Błąd połączenia internetowego lub sieciowego", - "walletConnect.request.warning.batch.message": "Uważaj: to żądanie zawiera wiele transakcji i może spowodować przeniesienie aktywów", - "walletConnect.request.warning.general.message": "Uważaj: ta wiadomość może spowodować przeniesienie zasobów", - "walletConnect.request.warning.message": "Aby podpisywać wiadomości lub transakcje, musisz zaimportować frazę odzyskiwania portfela.", - "walletConnect.request.warning.title": "Ten portfel jest w trybie tylko do przeglądania", - "web.explore.description": "Odkrywaj i badaj żetony na {{network}}. Poznaj najlepsze baseny. Przeglądaj ceny w czasie rzeczywistym, wolumen obrotu, TVL, wykresy i dane transakcyjne.", - "web.explore.title.pools": "Przeglądaj najlepsze baseny na {{network}} na Uniswap", - "web.explore.title.tokens": "Przeglądaj najlepsze tokeny na {{network}} na Uniswap", - "web.explore.title.transactions": "Przeglądaj najlepsze transakcje {{network}} na Uniswap" -} diff --git a/packages/uniswap/src/i18n/locales/translations/pt-PT.json b/packages/uniswap/src/i18n/locales/translations/pt-PT.json index cb8e48d7a01..a48db0d37eb 100644 --- a/packages/uniswap/src/i18n/locales/translations/pt-PT.json +++ b/packages/uniswap/src/i18n/locales/translations/pt-PT.json @@ -30,7 +30,6 @@ "account.drawer.modal.body": "Armazene e faça swap de tokens com segurança com o aplicativo Uniswap. Disponível para iOS e Android.", "account.drawer.modal.dont": "Não tem uma Uniswap Wallet?", "account.drawer.modal.scan": "Leia com a Uniswap Wallet", - "account.drawer.spamToggle": "Ocultar tokens e NFTs desconhecidos", "account.passkey.delete.acknowledge": "Salvei minha frase de recuperação e entendo que a Uniswap Labs não poderá me ajudar a recuperar minha carteira caso eu perca o acesso à frase.", "account.passkey.delete.description": "Salve sua frase de recuperação usando o aplicativo ou a extensão de navegador da Uniswap.", "account.passkey.delete.descriptionEmphasized": "Sem a frase de recuperação, talvez não seja possível acessar a carteira.", @@ -115,6 +114,7 @@ "account.wallet.watch.placeholder": "ENS ou endereço", "account.wallet.watch.title": "Digite um endereço de carteira", "activity.pending": "{{pendingActivityCount}} pendente", + "activity.recentActivity": "Recent activity", "activity.transaction.lpRewards.descriptor": "{{symbol}} recompensas recolhidas", "activity.transaction.send.descriptor": "{{amountWithSymbol}} para {{walletAddress}}", "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} para {{amountWithSymbolB}}", @@ -144,15 +144,15 @@ "bridgedAsset.send.warning.description": "Você está enviando uma versão com wrap realizado de {{currencySymbol}} em {{chainName}}. O envio para uma bolsa centralizada resultará em perda de fundos permanente.", "bridgedAsset.send.warning.title": "Certifique-se de que você esteja enviando para um endereço compatível", "bridgedAsset.tdp.description": "Esta é uma versão em ponte de {{currencySymbol}} que está lastreado pela proporção 1:1 pelo {{currencySymbol}} nativo.", - "bridgedAsset.wormhole.button": "Continuar para o Wormhole", - "bridgedAsset.wormhole.description": "Continue para o portal Wormhole para fazer ponte do seu {{currencySymbol}} de {{chainName}} para {{nativeChainName}}.", + "bridgedAsset.wormhole.button": "Continue to {{provider}}", + "bridgedAsset.wormhole.description": "Continue to the {{provider}} portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", "bridgedAsset.wormhole.title": "Sacar {{currencySymbol}} para {{nativeChainName}}", "bridgedAsset.wormhole.toNativeChain": "para {{nativeChainName}}", "bridgedAsset.wormhole.withdrawToNativeChain": "Sacar para {{nativeChainName}}", "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} min {{seconds}} s", "bridging.estimatedTime.minutesOnly": "~{{minutes}} min", "bridging.estimatedTime.secondsOnly": "~{{seconds}} s", - "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XPL, ZEC — now available on Unichain.", "chart.candlestick": "Vela", "chart.error.pools": "Não foi possível exibir dados históricos do pool atual.", "chart.error.tokens": "Não foi possível exibir dados históricos do token atual.", @@ -257,6 +257,7 @@ "common.button.unlock": "Desbloquear", "common.button.view": "Visualizar", "common.button.viewDetails": "Ver detalhes", + "common.button.viewMore": "View more", "common.button.yes": "Sim", "common.buy.label": "Comprar", "common.buyAndSell": "Comprar e vender na Uniswap", @@ -370,6 +371,7 @@ "common.input.noRecipient.error": "Selecionar destinatário", "common.input.password.confirm": "Confirmar senha", "common.input.password.error.mismatch": "Senhas discrepantes", + "common.input.password.error.same": "New password must be different from current password", "common.input.password.error.weak": "Senha muito fraca", "common.input.password.new": "Nova senha", "common.input.password.placeholder": "Senha", @@ -503,6 +505,7 @@ "common.remove.liquidity.canceled": "Remoção de liquidez cancelada", "common.remove.liquidity.failed": "Falha ao remover liquidez", "common.removing.liquidity": "Removendo liquidez", + "common.reported": "Reported", "common.resetLimit": "Redefinir limite de {{symbol}}", "common.resetLimitWallet": "Redefinir limite de {{symbol}} na carteira", "common.resettingLimit": "Redefinindo limite de {{symbol}}...", @@ -532,6 +535,7 @@ "common.status": "Status", "common.step.number": "Etapa {{number}}", "common.step.number.of": "Etapa {{current}} de {{total}}", + "common.submit": "Submit", "common.swap": "Fazer swap", "common.swap.expired": "Swap expirado", "common.swap.failed": "Falha na fazer swap", @@ -797,6 +801,7 @@ "fee.tier.create": "Criar nível de tarifas", "fee.tier.create.button": "Criar novo nível de tarifas", "fee.tier.create.description": "A criação de um novo nível iniciará em um novo pool e gerará taxas de rede mais altas do que o normal.", + "fee.tier.default": "-- fee tier", "fee.tier.description": "O valor ganho por oferecer liquidez. Escolha um valor compatível com sua tolerância a risco e estratégia.", "fee.tier.description.v2": "O valor ganho por ofertar liquidez. Todos os pools v2 têm tarifa fixa de 0,3%. Para mais opções, oferte liquidez no v4.", "fee.tier.dynamic": "Nível de tarifas dinâmico", @@ -884,9 +889,9 @@ "hero.swap.title": "Faça swap a qualquer hora,
em qualquer lugar.", "hidden.nfts.info.banner.text": "Saiba mais sobre NFTs ocultos", "hidden.nfts.info.text.button": "NFTs ocultos ({{numHidden}})", - "hidden.nfts.info.text.extension": "Estes são possíveis golpes e NFTs que você ocultou. Clique com o botão direito em um NFT para exibi-lo.", "hidden.nfts.info.text.mobile": "Estes são possíveis golpes e NFTs que você ocultou. Pressione um NFT continuamente para exibi-lo.", "hidden.nfts.info.text.title": "NFTs ocultos", + "hidden.nfts.info.text.web": "These are potential scams and NFTs you’ve hidden. You can click on an NFT to unhide it.", "hidden.tokens.info.banner.text": "Saiba mais sobre tokens ocultos", "hidden.tokens.info.text.button": "Tokens ocultos ({{numHidden}})", "hidden.tokens.info.text.info": "Estes são possíveis golpes, pequenos saldos e tokens que você ocultou. Os tokens ocultos não estão incluídos no saldo total da sua carteira.", @@ -957,32 +962,16 @@ "landing.uniswapX.subtitle": "Swaps mais inteligentes, sem atrito.", "landing.walletBody": "A carteira não custodial e extensão de criptos confiável com milhões de downloads, suporte de pessoas reais e uma avaliação de 4,8 .", "landing.walletSubtitle": "Faça swaps, armazene, explore.", - "language.afrikaans": "Africâner", - "language.arabic": "Árabe", - "language.catalan": "Catalão", "language.chineseSimplified": "Chinês simplificado", "language.chineseTraditional": "Chinês tradicional", - "language.czech": "Tcheco", - "language.danish": "Dinamarquês", "language.dutch": "Holandês", "language.english": "Inglês", - "language.finnish": "Finlandês", "language.french": "Francês", - "language.greek": "Grego", - "language.hebrew": "Hebraico", - "language.hindi": "Hindi", - "language.hungarian": "Húngaro", "language.indonesian": "Indonésio", - "language.italian": "Italiano", "language.japanese": "Japonês", "language.korean": "Coreano", - "language.malay": "Malaio", - "language.norwegian": "Norueguês", - "language.polish": "Polonês", "language.portuguese": "Português", - "language.romanian": "Romeno", "language.russian": "Russo", - "language.serbian": "Sérvio", "language.spanishArgentina": "Espanhol (Argentina)", "language.spanishBelize": "Espanhol (Belize)", "language.spanishBolivia": "Espanhol (Bolívia)", @@ -1006,11 +995,7 @@ "language.spanishUruguay": "Espanhol (Uruguai)", "language.spanishUs": "Espanhol (EUA)", "language.spanishVenezuela": "Espanhol (Venezuela)", - "language.swahili": "Suaíli", - "language.swedish": "Sueco", "language.turkish": "Turco", - "language.ukrainian": "Ucraniano", - "language.urdu": "Urdu", "language.vietnamese": "Vietnamita", "large.price.difference": "Diferença grande de preço", "large.price.difference.tooltip": "Prosseguir com esta negociação resultará em perda de fundos. Essa diferença pode ocorrer devido a negociações de grande volume ou baixa liquidez.", @@ -1114,7 +1099,6 @@ "notification.smartWallet.disabled.all": "Carteira inteligente desativada", "notification.smartWallet.disabled.plural": "Desativada em {{amount}} redes", "notification.spam.NFT.failed": "Não foi possível denunciar o NFT. Tente novamente mais tarde.", - "notification.spam.NFT.successful": "Denunciado", "notification.swap.network": "Fazendo swap em {{network}}", "notification.swap.pending.swap": "Swap pendente", "notification.swap.pending.unwrap": "Unwrap pendente", @@ -1214,6 +1198,7 @@ "onboarding.home.intro.backup.description.mobile": "Defina um plano de recuperação caso você perca seu celular ou adquira um novo.", "onboarding.home.intro.backup.title": "Faça backup da sua carteira", "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK e JUP — agora disponíveis na Unichain", + "onboarding.home.intro.bridgedAssets.description.v2": "DOGE, XRP, XPL, ZEC — now available on Unichain", "onboarding.home.intro.bridgedAssets.title": "Negocie novos tokens na Unichain", "onboarding.home.intro.fund.description": "Abasteça sua carteira comprando criptos ou transferindo de outra conta.", "onboarding.home.intro.fund.title": "Obtenha seu primeiro token", @@ -1438,15 +1423,18 @@ "poolFinder.availablePools.notFound.description": "Não foram encontrados pools v2 correspondentes. Verifique novamente sua seleção de tokens e se está acessando a carteira certa.", "pools.explore": "Explorar pools", "portfolio.activity.filters.timePeriod.all": "Todo o período", - "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", + "portfolio.activity.filters.transactionType.addLiquidity": "Added liquidity", "portfolio.activity.filters.transactionType.all": "Todos os tipos", "portfolio.activity.filters.transactionType.approvals": "Approvals", - "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", - "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.claimFees": "Claimed fees", + "portfolio.activity.filters.transactionType.createPool": "Pools created", "portfolio.activity.filters.transactionType.mints": "Mints", - "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", + "portfolio.activity.filters.transactionType.receives": "Receives", + "portfolio.activity.filters.transactionType.removeLiquidity": "Removed liquidity", + "portfolio.activity.filters.transactionType.sends": "Sends", "portfolio.activity.filters.transactionType.swaps": "Swaps", "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.search.placeholder": "Search activity", "portfolio.activity.table.column.address": "Address", "portfolio.activity.table.column.amount": "Amount", "portfolio.activity.table.column.time": "Time", @@ -1459,7 +1447,12 @@ "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", "portfolio.disconnected.demoWallet.title": "Demo wallet", "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", + "portfolio.nfts.search.placeholder": "Search your NFTs", "portfolio.nfts.title": "NFTs", + "portfolio.overview.stats.averageSwapSize": "Average swap size", + "portfolio.overview.stats.swappedThisWeek": "Swapped this week", + "portfolio.overview.stats.swapsThisWeek": "Swaps this week", + "portfolio.overview.stats.totalSwapVolume": "Total swap volume", "portfolio.overview.title": "Visão geral", "portfolio.title": "Portfólio", "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", @@ -1471,6 +1464,7 @@ "portfolio.tokens.table.column.token": "Token", "portfolio.tokens.table.column.value": "Valor", "portfolio.tokens.title": "Tokens", + "portfolio.view": "View portfolio", "position.addHook": "Adicionar um hook", "position.addHook.tooltip": "Hooks são um recurso avançado que permite que pools interajam com contratos inteligentes, possibilitando o acesso a vários recursos. Tenha cuidado ao adicionar hooks, pois alguns podem ser maliciosos ou causar consequências não intencionais.", "position.addingHook": "Adicionar hook", @@ -1588,6 +1582,33 @@ "qrScanner.wallet.networks": "Redes com suporte", "range.outOfView": "Intervalo fora da vista", "removeLiquidity.pooled": "{{symbol}} em pool:", + "reporting.activity.unhide.action": "Unhide activity", + "reporting.pool.details.title": "Don’t recognize this position?", + "reporting.token.data.options.price.subtitle": "Token price is wrong or unavailable", + "reporting.token.data.options.price.title": "Price", + "reporting.token.data.options.priceChart.subtitle": "Data is wrong or incomplete", + "reporting.token.data.options.priceChart.title": "Price chart", + "reporting.token.data.options.tokenDetails.subtitle": "Token image, description, or link issue", + "reporting.token.data.options.tokenDetails.title": "Token details", + "reporting.token.data.options.volume.subtitle": "Token volume is wrong or unavailable", + "reporting.token.data.options.volume.title": "Volume", + "reporting.token.data.title": "Data issue", + "reporting.token.options.hiddenFees.subtitle": "Token has undisclosed fees when bought/sold", + "reporting.token.options.hiddenFees.title": "Hidden fees", + "reporting.token.options.imposter.subtitle": "Token seems fraudulent or misleading", + "reporting.token.options.imposter.title": "Imposter token", + "reporting.token.options.other.title": "Something else", + "reporting.token.options.spam.subtitle": "Token appeared in wallet unexpectedly", + "reporting.token.options.spam.title": "Spam token", + "reporting.token.report.button.disabled": "Select an issue", + "reporting.token.report.other.placeholder": "Describe the issue", + "reporting.token.report.title": "Report token", + "reporting.token.report.title.withSymbol": "Report {{symbol}}", + "reporting.token.warning.button": "This warning is incorrect", + "reporting.token.warning.report.placeholder": "Add details (optional)", + "reporting.token.warning.report.submit": "Report issue", + "reporting.token.warning.report.subtitle": "Report an issue if the warning below seems wrong. We’ll take a closer look.", + "reporting.token.warning.report.title": "Report an inaccurate warning", "revoke.failed.message": "É provável que um problema de rede ou conexão tenha causado a falha na revogação. Verifique sua conexão e tente novamente.", "routing.aggregateLiquidity": "Quando disponível, agrega fontes de liquidez para melhores preços e swaps sem custos de gas.", "routing.aggregateLiquidity.uniswapx": "O UniswapX agrega fontes de liquidez dentro e fora da rede, oferecendo os melhores preços disponíveis e swaps sem taxas de gas.", @@ -1735,6 +1756,7 @@ "settings.setting.backup.status.inProgress": "Fazendo backup no {{cloudProviderName}}...", "settings.setting.backup.status.recoveryPhrase.backed": "Backup realizado", "settings.setting.backup.status.title": "Backup do {{cloudProviderName}}", + "settings.setting.balancesActivity.title": "Balances and activity", "settings.setting.beta.tooltip": "Em breve", "settings.setting.biometrics.appAccess.subtitle.android": "Exigir reconhecimento facial/impressão digital para abrir o aplicativo.", "settings.setting.biometrics.appAccess.subtitle.ios": "Exigir {{biometricsMethod}} para abrir o aplicativo.", @@ -1786,7 +1808,8 @@ "settings.setting.privacy.analytics.title": "Análise do aplicativo", "settings.setting.privateKeys.title": "Chaves privadas", "settings.setting.recoveryPhrase.title": "Frase de recuperação", - "settings.setting.smallBalances.title": "Saldo do portfólio", + "settings.setting.reportedActivity.subtitle": "Transactions you’ve reported as spam will be hidden from your activity feed.", + "settings.setting.reportedActivity.title": "Hide reported activity", "settings.setting.smartWallet.action.enable": "Ativar", "settings.setting.smartWallet.action.smartWallet": "Carteira inteligente", "settings.setting.smartWallet.notEligible": "Não qualificado", @@ -2007,7 +2030,7 @@ "swap.settings.routingPreference.option.v4.title": "Ativar pools v4", "swap.settings.routingPreference.title": "Opções de negociação", "swap.settings.slippage.alert": "Slippage elevado", - "swap.settings.slippage.control.auto": "Automático", + "swap.settings.slippage.control.auto": "Auto", "swap.settings.slippage.description": "Sua transação será revertida se o preço mudar mais do que a porcentagem de slippage.", "swap.settings.slippage.input.message": "Se ocorrer ainda mais movimentação no preço, sua transação será revertida. Abaixo está o valor mínimo garantido que você pode receber.", "swap.settings.slippage.input.receive.title": "Receber no mínimo", @@ -2290,6 +2313,8 @@ "transaction.networkCost.label": "Taxa de rede", "transaction.networkCost.maxNativeBalance.description": "Uma pequena quantia do saldo do token de rede é reservada para cobrir a taxa de rede dessa transação.", "transaction.networkCost.maxNativeBalance.title": "Por que não posso usar meu saldo máximo?", + "transaction.networkCost.presetNativeBalance.description": "You don’t have enough balance to cover both this amount and the network cost of the transaction.", + "transaction.networkCost.presetNativeBalance.title": "Why can’t I use this amount?", "transaction.networkCost.veryHigh.label": "Taxa de rede muito alta", "transaction.notification.error.cancel": "Não é possível cancelar a transação", "transaction.notification.error.replace": "Não é possível substituir a transação", diff --git a/packages/uniswap/src/i18n/locales/translations/ro-RO.json b/packages/uniswap/src/i18n/locales/translations/ro-RO.json deleted file mode 100644 index e926646e136..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/ro-RO.json +++ /dev/null @@ -1,2384 +0,0 @@ -{ - "account.authHeader.claimReward": "Revendicați {{amount}} recompensă", - "account.cloud.backup.subtitle": "Există mai multe fraze de recuperare pentru care au fost salvate în {{cloudProviderName}}.", - "account.cloud.backup.title": "Selectați o copie de rezervă pentru restaurare", - "account.cloud.button.restore.android": "Restaurați din Google Drive", - "account.cloud.button.restore.ios": "Restaurați din iCloud", - "account.cloud.empty.description": "Se pare că nu ați făcut copii de rezervă pentru niciuna dintre frazele dvs. de recuperare în {{cloudProviderName}}.", - "account.cloud.empty.title": "0 copii de rezervă găsite", - "account.cloud.error.backup.message": "Nu s-au putut importa copii de rezervă din cauza lipsei de permisiuni, a întreruperii autorizației sau din cauza unei erori în cloud", - "account.cloud.error.backup.title": "Eroare la importul copiilor de rezervă", - "account.cloud.error.password.title": "Parolă Invalidă. Vă rugăm să încercați din nou.", - "account.cloud.error.unavailable.button.cancel": "Nu acum", - "account.cloud.error.unavailable.button.settings": "Mergi la Setari", - "account.cloud.error.unavailable.message.android": "Verificați dacă sunteți conectat la un cont Google cu Google Drive activat pe acest dispozitiv și încercați din nou.", - "account.cloud.error.unavailable.message.ios": "Verificați dacă sunteți conectat la un ID Apple cu iCloud Drive activat pe acest dispozitiv și încercați din nou.", - "account.cloud.error.unavailable.title.android": "Google Drive nu este disponibil", - "account.cloud.error.unavailable.title.ios": "iCloud Drive nu este disponibil", - "account.cloud.loading.title": "Se caută copii de rezervă...", - "account.cloud.lockout.time.hours_one": "Prea multe incercari. Încercați din nou peste 1 oră.", - "account.cloud.lockout.time.hours_other": "Prea multe incercari. Încercați din nou peste {{count}} ore.", - "account.cloud.lockout.time.minutes_one": "Prea multe incercari. Încercați din nou peste 1 minut.", - "account.cloud.lockout.time.minutes_other": "Prea multe incercari. Încercați din nou peste {{count}} minute.", - "account.cloud.password.input": "Introdu parola", - "account.cloud.password.recoveryPhrase": "Introduceți expresia de recuperare", - "account.cloud.password.subtitle": "Această parolă este necesară pentru a recupera copia de rezervă a frazei de recuperare din {{cloudProviderName}}.", - "account.cloud.password.title": "Introduceți parola de rezervă", - "account.drawer.gitVersion": "Versiune: ", - "account.drawer.modal.body": "Stocați și schimbați în siguranță jetoanele cu aplicația Uniswap. Disponibil pe iOS și Android.", - "account.drawer.modal.dont": "Nu aveți un portofel Uniswap?", - "account.drawer.modal.scan": "Scanați cu Uniswap Wallet", - "account.drawer.spamToggle": "Ascundeți jetoanele și NFT-urile necunoscute", - "account.porfolio.activity.cancelledBelow": "Această comandă a fost anulată deoarece soldul dvs. a scăzut sub valoarea introdusă.", - "account.portfolio.activity.signLimit": "Această comandă nu se va completa deoarece soldul dvs. a scăzut sub valoarea introdusă. Măriți-vă soldul pentru a repara.", - "account.recoveryPhrase.education.part1": "O expresie de recuperare (sau o expresie de bază) este un set de cuvinte necesare pentru a vă accesa portofelul, ca o parolă.", - "account.recoveryPhrase.education.part2": "Puteți să să introduceți fraza dvs. de recuperare pe un dispozitiv nou pentru a vă restaura portofelul și conținutul acestuia.", - "account.recoveryPhrase.education.part3": "Dar, dacă pierdeți expresia de recuperare, veți pierde accesul la portofel.", - "account.recoveryPhrase.education.part4": "În loc să memorezi fraza de recuperare, poți să o faci o copie de rezervă pe la {{cloudProviderName}} și să o protejezi cu o parolă.", - "account.recoveryPhrase.education.part5": "Puteți, de asemenea, să faceți o copie de rezervă manuală a frazei de recuperare prin notând-o și păstrând-o într-un loc sigur.", - "account.recoveryPhrase.education.part6": "Vă recomandăm să utilizați ambele tipuri de copii de rezervă, deoarece dacă vă pierdeți expresia de recuperare, nu vă veți putea restaura portofelul.", - "account.recoveryPhrase.error.invalid": "Expresie nevalidă", - "account.recoveryPhrase.error.invalidWord": "Cuvânt nevalid: {{word}}", - "account.recoveryPhrase.error.phraseLength": "Expresia de recuperare trebuie să aibă 12-24 de cuvinte", - "account.recoveryPhrase.error.wrong": "Fraza de recuperare greșită", - "account.recoveryPhrase.helpText.import": "Cum îmi găsesc fraza de recuperare?", - "account.recoveryPhrase.helpText.restoring": "Încercați să căutați din nou", - "account.recoveryPhrase.input": "Introduceți expresia de recuperare", - "account.recoveryPhrase.remove.final.description": "Asigurați-vă că ați notat fraza de recuperare sau ați făcut o copie de rezervă pe {{cloudProviderName}}. Altfel, nu vă veți putea accesa fondurile.", - "account.recoveryPhrase.remove.final.title": "Îți elimini expresia de recuperare ", - "account.recoveryPhrase.remove.import.description": "Puteți stoca doar o singură frază de recuperare la un moment dat. Pentru a continua să importați unul nou, va trebui să eliminați fraza de recuperare actuală și orice portofel asociat de pe acest dispozitiv.", - "account.recoveryPhrase.remove.initial.description": "Aceasta vă va elimina portofelul de pe acest dispozitiv împreună cu expresia de recuperare.", - "account.recoveryPhrase.remove.initial.title": "Îndepărtezi {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "Are aceeași expresie de recuperare ca {{walletNames, list}}. Fraza dvs. de recuperare va rămâne stocată până când ștergeți toate portofelele rămase.", - "account.recoveryPhrase.subtitle.import": "Fraza dvs. de recuperare va fi stocată numai local pe dispozitivul dvs.", - "account.recoveryPhrase.subtitle.restoring": "Introduceți mai jos expresia de recuperare sau încercați din nou să căutați copii de rezervă.", - "account.recoveryPhrase.title.import": "Introduceți expresia de recuperare", - "account.recoveryPhrase.title.restoring": "Nu s-au găsit copii de rezervă", - "account.transactionSummary.addLiquidity": "Adăugați lichiditate {{baseSymbol}}/{{quoteSymbol}} V3", - "account.transactionSummary.addLiquidityv2": "Adăugați și la Uniswap V2", - "account.transactionSummary.approve": "Aprobați {{tokenSymbol}}", - "account.transactionSummary.claimFor": "Revendicați pentru {{username}}", - "account.transactionSummary.claimReward": "Solicitați recompensa UNI pentru {{username}}", - "account.transactionSummary.collectFees": "Colectați taxe {{symbol0}}/{{symbol1}}", - "account.transactionSummary.createAddLiquidity": "Creați un pool și adăugați lichiditate {{baseSymbol}}/{{quoteSymbol}} V3", - "account.transactionSummary.createPool": "Creați grupul {{baseSymbol}}/{{quoteSymbol}} V3", - "account.transactionSummary.decision.abstain": "Votează abținerea la propunere {{proposalKey}} cu motive "{{reason}}"", - "account.transactionSummary.decision.against": "Votează împotriva propunerii {{proposalKey}} cu motive "{{reason}}"", - "account.transactionSummary.decision.for": "Votați propunerea {{proposalKey}} cu motiv "{{reason: info.reason}}"", - "account.transactionSummary.delegateSummary": "Delegați puterea de vot către {{username}}", - "account.transactionSummary.depositLiquidity": "Lichiditatea depozitului", - "account.transactionSummary.executeProposal": "Executați propunerea {{proposalKey}}.", - "account.transactionSummary.migrateLiquidity": "Migrați lichiditatea {{baseSymbol}}/{{quoteSymbol}} la V3", - "account.transactionSummary.queueProposal": "Propunere de coadă {{proposalKey}}.", - "account.transactionSummary.removeLiquiditySummary": "Eliminați și ", - "account.transactionSummary.revoke": "Revocați {{tokenSymbol}}", - "account.transactionSummary.sendSummary": "Trimis către {{recipient}}", - "account.transactionSummary.submitProposal": "Trimiteți o nouă propunere", - "account.transactionSummary.swapExactIn": "Schimbați exact cu ", - "account.transactionSummary.swapExactOut": "Schimbați cu exact ", - "account.transactionSummary.unwrapTo": "Desfaceți în {{symbol}}", - "account.transactionSummary.vote.abstain": "Votează pentru abținerea la propunere {{proposalKey}}", - "account.transactionSummary.vote.against": "Votează împotriva propunerii {{proposalKey}}", - "account.transactionSummary.vote.for": "Votează propunerea {{proposalKey}}", - "account.transactionSummary.withdrawLiquidity": "Retrageți lichiditatea depozitată", - "account.transactionSummary.wrapTo": "Înfășurați în {{symbol}}", - "account.wallet.action.copy": "Copiați adresa portofelului", - "account.wallet.action.report": "Raportați profilul", - "account.wallet.action.settings": "Setări portofel", - "account.wallet.action.viewExplorer": "Vizualizați pe {{blockExplorerName}}", - "account.wallet.button.add": "Adăugați portofel", - "account.wallet.button.addViewOnly": "Adăugați un portofel numai pentru vizualizare", - "account.wallet.button.create": "Creați un portofel nou", - "account.wallet.button.import": "Importați un portofel nou", - "account.wallet.button.manage": "Gestionați portofelul", - "account.wallet.button.remove": "Scoateți portofelul", - "account.wallet.button.restore": "Restaurați portofelul", - "account.wallet.button.watch": "Urmăriți un portofel", - "account.wallet.create.placeholder": "Portofel {{index}}", - "account.wallet.edit.label.input.placeholder": "Eticheta portofel", - "account.wallet.header.button.disabled.title": "Editează profilul", - "account.wallet.header.button.title": "Editați eticheta", - "account.wallet.header.other": "Celelalte portofele tale", - "account.wallet.header.viewOnly": "Portofele pentru vizualizare", - "account.wallet.menu.copy.title": "Copiați adresa portofelului", - "account.wallet.menu.edit.title": "Editați eticheta", - "account.wallet.menu.remove.title": "Scoateți portofelul", - "account.wallet.remove.check": "Am făcut o copie de rezervă a frazei mele de recuperare și am înțeles că Uniswap Labs nu mă poate ajuta să-mi recuperez portofelele dacă nu reușesc să fac acest lucru.", - "account.wallet.remove.title": "Eliminați {{name}}", - "account.wallet.remove.viewOnly": "Puteți adăuga oricând portofele pentru vizualizare din spate introducând adresa portofelului.", - "account.wallet.restore.description": "Deoarece sunteți pe un dispozitiv nou, va trebui să vă restabiliți expresia de recuperare. Acest lucru vă va permite să schimbați și să trimiteți jetoane.", - "account.wallet.select.error": "Nu s-au putut încărca adresele", - "account.wallet.select.loading.subtitle": "Portofelele dvs. vor apărea mai jos.", - "account.wallet.select.loading.title": "Caut portofele", - "account.wallet.select.title_one_one": "Un portofel găsit", - "account.wallet.select.title_one_other": "Selectați portofelele de importat", - "account.wallet.viewOnly.button": "Import portofel", - "account.wallet.viewOnly.description": "Pentru a schimba, cumpăra, trimite și primi jetoane, trebuie să importați fraza de recuperare a acestui portofel.", - "account.wallet.viewOnly.title": "Acest portofel este doar pentru vizualizare", - "account.wallet.watch.error.alreadyImported": "Această adresă este deja importată", - "account.wallet.watch.error.notFound": "Adresa nu a fost găsită", - "account.wallet.watch.error.smartContract": "Adresa este un contract inteligent", - "account.wallet.watch.message": "Adăugarea unui portofel numai pentru vizualizare vă permite să încercați aplicația sau să urmăriți un portofel. Nu veți putea schimba sau trimite fonduri.", - "account.wallet.watch.placeholder": "ENS sau adresa", - "account.wallet.watch.title": "Introduceți o adresă de portofel", - "activity.pending": "{{pendingActivityCount}} În așteptare", - "activity.transaction.receive.descriptor": "{{amountWithSymbol}} din {{walletAddress}}", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} la {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} pentru {{amountWithSymbolB}}", - "activity.transaction.swap.descriptor.formatted": " pentru ", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} și {{amountWithSymbolB}}", - "activity.transaction.tokens.descriptor.formatted": " și ", - "addLiquidity.shareOfPool": "Cota din bazin", - "addressInput.recipient": "Destinatar", - "analytics.allow": "Permite analize", - "analytics.allow.message": "Folosim date anonimizate pentru a vă îmbunătăți experiența cu produsele Uniswap Labs.", - "appRating.button.notReally": "Nu chiar", - "appRating.description": "Anunțați-ne dacă aveți o experiență bună cu această aplicație", - "appRating.extension.review.description": "Alegeți o evaluare cu stele și lăsați o recenzie în Magazinul web Chrome.", - "appRating.extension.review.title": "Examinați extensia Uniswap?", - "appRating.extension.title": "Vă bucurați de extensia Uniswap?", - "appRating.feedback.button.send": "Trimite feedback", - "appRating.feedback.description": "Spuneți-ne cum vă putem îmbunătăți experiența", - "appRating.feedback.title": "Ne pare rău să auzim asta.", - "appRating.mobile.title": "Vă place Uniswap Wallet?", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "burn.input.enterAPercent.error": "Introduceți un procent", - "chart.candlestick": "Sfeşnic", - "chart.error.pools": "Nu se pot afișa datele istorice pentru grupul curent.", - "chart.error.tokens": "Nu se pot afișa datele istorice pentru simbolul curent.", - "chart.line": "Diagramă cu linii", - "chart.missingData": "Lipsesc date din diagramă", - "chart.price.label.close": "Închide", - "chart.price.label.high": "Înalt", - "chart.price.label.low": "Scăzut", - "chart.price.label.open": "Deschis", - "chart.settings.unavailable.label": "Această setare nu este disponibilă pentru diagrama curentă", - "claim.thanks": "Vă mulțumim că faceți parte din comunitatea Uniswap ", - "claim.uni.arrived": "UNI a sosit", - "common.accept": "Accepta", - "common.activity": "Activitate", - "common.add.label": "Adăuga", - "common.add.liquidity.cancelled": "Adăugați lichiditate anulată", - "common.add.liquidity.failed": "Adăugarea lichidității a eșuat", - "common.add.v2.liquidity.cancelled": "Adăugați lichiditate V2 anulată", - "common.add.v2.liquidity.failed": "Adăugarea lichidității V2 a eșuat", - "common.added.liquidity": "Lichiditate adăugată", - "common.added.v2.liquidity": "S-a adăugat lichiditate V2", - "common.addedLiquidity": "Lichiditate adăugată", - "common.adding.liquidity": "Adăugarea lichidității", - "common.adding.v2.liquidity": "Adăugarea lichidității V2", - "common.addLiquidity": "Adăugați lichiditate", - "common.addressOrENS": "Adresa portofelului sau numele ENS", - "common.advanced": "Avansat", - "common.all": "Toate", - "common.allTime": "Tot timpul", - "common.amount.label": "Cantitate", - "common.amountDeposited.label": "{{amount}} Depus", - "common.and": "şi", - "common.app": "App", - "common.approval.cancelled": "Aprobare anulată", - "common.approval.failed": "Aprobarea a eșuat", - "common.approve": "Aproba", - "common.approved": "Aprobat", - "common.approvePending": "În curs de aprobare...", - "common.approveSpend": "Aprobați cheltuielile de {{symbol}}", - "common.approving": "Aprobarea", - "common.areYouSure": "Esti sigur?", - "common.automatic": "Auto", - "common.availableIn": "Uniswap disponibil în: ", - "common.availableOnIOSAndroid": "Disponibil pe iOS și Android", - "common.availableOnIOSAndroidChrome": "Disponibil pe iOS, Android și Chrome", - "common.backToPositions": "Înapoi la poziții", - "common.blocked.ifError": "Dacă credeți că aceasta este o eroare, vă rugăm să trimiteți un e-mail cu adresa dvs. la ", - "common.blocked.reason": "Această adresă este blocată în interfața Uniswap Labs deoarece este asociată cu una sau mai multe activități blocate.", - "common.blockedAddress": "Adresă blocată", - "common.blog": "Blog", - "common.borrow.cancelled": "Împrumut anulat", - "common.borrow.failed": "Împrumutul a eșuat", - "common.borrowed": "Împrumutat", - "common.borrowing": "Împrumutarea", - "common.bought": "Cumparat", - "common.brandAssets": "Activele mărcii", - "common.burn.cancelled": "Arderea a fost anulată", - "common.burn.failed": "Arderea a eșuat", - "common.burned": "Ars", - "common.burning": "Ardere", - "common.button.accept": "Accepta", - "common.button.back": "Înapoi", - "common.button.buy": "Cumpără", - "common.button.cancel": "Anulare", - "common.button.checkin": "Check-in", - "common.button.close": "Închide", - "common.button.confirm": "A confirma", - "common.button.connect": "Conectați", - "common.button.continue": "Continua", - "common.button.copied": "Copiat", - "common.button.copy": "Copie", - "common.button.create": "Crea", - "common.button.delete": "Șterge", - "common.button.disconnect": "Deconectat", - "common.button.dismiss": "Respingeți", - "common.button.done": "Terminat", - "common.button.edit": "Editați | ×", - "common.button.enable": "Permite", - "common.button.finish": "Termina", - "common.button.goBack": "Întoarce-te", - "common.button.later": "Poate mai târziu", - "common.button.learn": "Află mai multe", - "common.button.next": "Următorul", - "common.button.notNow": "Nu acum", - "common.button.ok": "Bine", - "common.button.paste": "Pastă", - "common.button.pay": "A plati", - "common.button.receive": "A primi", - "common.button.remove": "Elimina", - "common.button.reset": "Resetați", - "common.button.restore": "Restabili", - "common.button.retry": "Reîncercați", - "common.button.reveal": "Dezvăluie", - "common.button.review": "Revizuire", - "common.button.save": "Salvați", - "common.button.scrollDown": "Deruleaza in jos", - "common.button.sell": "Vinde", - "common.button.send": "Trimite", - "common.button.setup": "Înființat", - "common.button.share": "Acțiune", - "common.button.showLess": "Arata mai putin", - "common.button.showMore": "Afișați mai multe", - "common.button.sign": "Semn", - "common.button.skip": "Ocolire", - "common.button.swap": "Schimbați", - "common.button.tryAgain": "Încearcă din nou", - "common.button.understand": "Am înțeles", - "common.button.view": "Vedere", - "common.button.viewDetails": "Vezi detalii", - "common.button.yes": "da", - "common.buy.cancelled": "Cumpărare anulată", - "common.buy.failed": "Cumpărarea a eșuat", - "common.buy.label": "Cumpără", - "common.buyAndSell": "Cumpărați și vindeți pe Uniswap", - "common.buying": "Cumpărare", - "common.by": "De", - "common.cancel.failed": "Anularea a eșuat", - "common.cancellation.cancelled": "Anularea a fost anulată", - "common.cancellationSubmitted": "Anularea a fost trimisă", - "common.cancellationSuccessful": "Anulare reușită", - "common.cancelled": "Anulat", - "common.cancelling": "Anulare", - "common.cancelOrder": "Anulați comanda", - "common.card.error.description": "Ceva n-a mers bine", - "common.card.error.title": "Hopa! Ceva n-a mers bine.", - "common.careers": "Cariere", - "common.chartType": "Tipul graficului", - "common.checkNetwork": "Verificați starea rețelei aici.", - "common.chromeExtension": "Extensie", - "common.claim.cancelled": "Revendicare anulată", - "common.claim.failed": "Revendicarea a eșuat", - "common.claimed": "Revendicat", - "common.claiming": "Revendicarea", - "common.claimUnis": "Revendicați-vă jetoanele UNI", - "common.clear": "Clar", - "common.close": "Închide", - "common.closed": "Închis", - "common.collect.button": "Colectarea", - "common.collect.fees.cancelled": "Comisioane de colectare anulate", - "common.collect.fees.failed": "Colectarea taxelor nu a reușit", - "common.collected.fees": "Taxe colectate", - "common.collecting.fees": "Comisioane de colectare", - "common.company": "Companie", - "common.confirm": "A confirma", - "common.confirmCancellation": "Confirmați anularea", - "common.confirmSend.button": "Confirmați trimiterea", - "common.confirmSwap": "Confirmați schimbul în portofel", - "common.confirmTimedOut": "Confirmarea a expirat. Vă rugăm să reîncercați.", - "common.confirmTransaction.button": "Confirmați această tranzacție în portofel", - "common.confirmWallet": "Confirmați în portofel", - "common.connect.button": "Conectați", - "common.connectAWallet.button": "Conectați un portofel", - "common.connectingWallet": "Se conectează portofelul...", - "common.connectWallet.button": "Conectați portofelul", - "common.contactUs.button": "Contactaţi-ne", - "common.contractInteraction": "Interacțiunea contractului", - "common.copied": "Copiat", - "common.copy.address": "Copiați adresa", - "common.copyLink.button": "Copiază legătură", - "common.create": "Crea", - "common.create.pool.cancelled": "Crearea grupului a fost anulată", - "common.create.pool.failed": "Crearea grupului nu a reușit", - "common.created.pool": "Piscina creată", - "common.creating.pool": "Crearea piscinei", - "common.currency": "Valută", - "common.currentPrice": "Pretul curent", - "common.currentPrice.label": "Pretul curent:", - "common.currentPrice.unavailable": "Prețul actual nu este disponibil", - "common.custom": "Personalizat", - "common.customRange": "Gamă personalizată", - "common.dataOutdated": "Datele pot fi depășite", - "common.default": "Mod implicit", - "common.defaultTradeOptions": "Opțiuni comerciale implicite", - "common.delegate.cancelled": "Delegat anulat", - "common.delegate.failed": "Delegatul a eșuat", - "common.delegated": "Delegat", - "common.delegating": "Delegarea", - "common.deploy.cancelled": "Implementarea a fost anulată", - "common.deploy.failed": "Implementarea a eșuat", - "common.deployed": "Desfăşurat", - "common.deploying": "Desfășurare", - "common.deposit.cancelled": "Depozit anulat", - "common.deposit.failed": "Depunerea nu a reușit", - "common.deposit.toNetwork": "Depuneți jetoane în rețeaua {{label}} .", - "common.deposited": "Depus", - "common.depositing": "Depozitare", - "common.depositTokens": "Jetoane de depozit", - "common.detailed.label": "Detaliat", - "common.detected": "Detectat", - "common.developers": "Dezvoltatori", - "common.dismiss": "Respingeți", - "common.displaySettings": "Setări de afișare", - "common.dnsRegistrar": "Registrul DNS", - "common.donate": "Dona", - "common.dontShowAgain": "Nu mai arăta asta", - "common.download": "Descarca", - "common.downloadAppStore": "Descărcați în App Store", - "common.downloadPlayStore": "Descărcați în Magazinul Play", - "common.downloadUniswap": "Descărcați Uniswap", - "common.downloadUniswapApp": "Descărcați aplicația Uniswap", - "common.dynamic": "Dinamic", - "common.edit.button": "Editați | ×", - "common.error.general": "Ceva n-a mers bine", - "common.error.label": "Eroare", - "common.error.request": "Ne pare rău, a apărut o eroare la procesarea solicitării dvs. Dacă solicitați asistență, asigurați-vă că copiați detaliile acestei erori.", - "common.error.somethingWrong": "Ceva n-a mers bine!", - "common.error.wrong.tryAgain": "Ceva n-a mers bine. Vă rugăm să încercați din nou.", - "common.errorConnecting.error": "Eroare la conectare", - "common.errorLoadingData.error": "Eroare la încărcarea datelor", - "common.ethereumNameService": "Serviciul de nume Ethereum", - "common.etherscan": "Etherscan", - "common.etherscan.link": "Vizualizare pe Etherscan", - "common.ethRegistrarController": "Controller al registratorului ETH", - "common.execute.cancelled": "Executare anulată", - "common.execute.failed": "Executarea a eșuat", - "common.executed": "Executat", - "common.executing": "Executarea", - "common.expired": "Expirat", - "common.expiry": "Expirare", - "common.explore": "Explora", - "common.explorer": "Explorator", - "common.exploreTokens": "Explorați jetoanele", - "common.extension": "Extensia Uniswap", - "common.failed.error": "A eșuat", - "common.failedSwitchNetwork": "Schimbarea rețelelor a eșuat", - "common.fee": "Taxa", - "common.fees": "Taxe", - "common.feesEarned.label": "{{symbol}} Taxe câștigate:", - "common.feesEarnedPerBase": "{{symbolA}} pe {{symbolB}}", - "common.fetchingRoute": "Preluare traseu", - "common.floor": "Podea", - "common.floorPrice": "Preț la etaj", - "common.for": "Pentru", - "common.fullRange": "Gamă completă", - "common.getApp": "Obține aplicația", - "common.getHelp.button": "Obține ajutor", - "common.getStarted": "Începeți", - "common.getSupport.button": "Obțineți sprijin", - "common.getTheApp": "Ia aplicatia", - "common.getUniswapWallet": "Obțineți portofel Uniswap", - "common.governance": "Guvernare", - "common.happyHolidays": "Sărbători fericite din partea echipei Uniswap!", - "common.helpCenter": "Centru de ajutor", - "common.hidden": "Ascuns", - "common.hide.button": "Ascunde", - "common.highPrice": "Preț mare", - "common.includes": "Include", - "common.info.label": "Info", - "common.input.noRecipient.error": "Selectați destinatarul", - "common.input.password.confirm": "Confirmă parola", - "common.input.password.error.mismatch": "Parolele nu se potrivesc", - "common.input.password.error.weak": "Această parolă este prea slabă", - "common.input.password.new": "Parolă Nouă", - "common.input.password.placeholder": "Parola", - "common.input.password.strength.medium": "Mediu", - "common.input.password.strength.strong": "Puternic", - "common.input.password.strength.weak": "Slab", - "common.input.search": "Căutare", - "common.insufficient.funds": "Fonduri insuficiente", - "common.insufficientBalance.error": "Echilibru insuficient", - "common.insufficientFundsForNetworkFee.error": "Fonduri insuficiente pentru a acoperi costul rețelei", - "common.insufficientLiquidity": "Lichiditate insuficientă", - "common.insufficientTokenBalance.error": "Echilibrul {{tokenSymbol}} insuficient", - "common.insufficientTokenBalance.error.simple": "Insuficient {{tokenSymbol}}", - "common.invalidPair": "Pereche nevalidă", - "common.invalidRecipient.error": "Destinatar nevalid", - "common.iOSAndroid": "iOS și Android", - "common.language": "Limba", - "common.lastPrice": "Ultimul pret", - "common.learnMoreSwap": "Aflați mai multe despre schimburi", - "common.legalAndPrivacy": "Legal și confidențialitate", - "common.less": "Mai puțin", - "common.limit.cancel_one": "Anulați limita", - "common.limit.cancel_other": "Anulați limitele {{count}}", - "common.limit.cancelled": "Limită anulată", - "common.limit.executed": "Limită executată", - "common.limit.expired": "Limita a expirat", - "common.limit.failed": "Limita a eșuat", - "common.limit.opened": "Limită deschisă", - "common.limit.pending": "Limită în așteptare", - "common.limits": "Limite", - "common.limits.approachMax": "Se apropie limita maximă de 100", - "common.limits.cancelProceed": "Anulați limitele pentru a continua", - "common.limits.expires": "Expiră {{timestamp}}", - "common.limits.open": "Limite deschise", - "common.limits.when": "când {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "Legături", - "common.liquidity": "Lichiditate", - "common.liquidity.removed": "Lichiditatea eliminată", - "common.loading": "Se încarcă", - "common.loadingAllowance": "Indemnizație de încărcare", - "common.loadMore": "Încărcați mai multe", - "common.longText.button.less": "Citiți mai puțin", - "common.longText.button.more": "Citeşte mai mult", - "common.lowPrice": "Preț scăzut", - "common.manage": "Administra", - "common.market.label": "Piaţă", - "common.max": "Max", - "common.migrate": "Migra", - "common.migrate.liquidity.cancelled": "Migrarea lichidității a fost anulată", - "common.migrate.liquidity.failed": "Migrarea lichidității a eșuat", - "common.migrate.position": "Migrați poziția", - "common.migrate.v3": "Migrați la V3", - "common.migrated.liquidity": "Lichiditate migrată", - "common.migrating.liquidity": "Migrarea lichidității", - "common.min": "Min", - "common.mint.cancelled": "Monetăria anulată", - "common.mint.failed": "Mint a eșuat", - "common.minted": "Bateriat", - "common.minting": "Mint", - "common.mobile": "Mobil", - "common.more": "Mai mult", - "common.multiDevice": "Multi-dispozitiv", - "common.navigation.settings": "Setări", - "common.navigation.systemSettings": "Setări", - "common.navigationButton": "Buton de navigare", - "common.needHelp": "Nevoie de ajutor?", - "common.networkCost": "Costul rețelei", - "common.neverMind": "Nu face nimic", - "common.new": "Nou", - "common.new.exclamation": "Nou!", - "common.nfts": "NFT-uri", - "common.noActivity": "Nicio activitate încă", - "common.noAmount.error": "Introduceți o sumă", - "common.noData": "Nu există date", - "common.noResults": "Nici un rezultat gasit.", - "common.notAvailableInRegion.error": "Nu este disponibil în regiunea dvs", - "common.notCreated.label": "Nu este creat", - "common.notSupported": "Nu este acceptat", - "common.oneDay": "1 zi", - "common.oneHour": "1 oră", - "common.oneMonth": "1 lună", - "common.oneWeek": "1 săptămână", - "common.oneYear": "1 an", - "common.orderCancelled": "Comanda anulata", - "common.orderExecuted": "Ordin executat", - "common.orderExpired": "Comanda a expirat", - "common.orderPending": "Comanda în așteptare", - "common.outOfRange": "În afara razei", - "common.pageNotFound": "Pagina nu a fost gasita!", - "common.passkey": "Cheie de acces", - "common.pastDay": "Ziua trecută", - "common.pastFiveMinutes": "Ultimele cinci minute", - "common.pastHour": "Ora trecută", - "common.pastMonth": "Luna trecuta", - "common.pastWeek": "Saptamana trecuta", - "common.pastYear": "Anul trecut", - "common.pay.button": "A plati", - "common.pending": "In asteptarea", - "common.pending.cancellation": "În așteptarea anulării", - "common.pendingEllipsis": "In asteptarea...", - "common.permit2": "Permisul 2", - "common.pool": "Bazin", - "common.pools": "Piscine", - "common.positionUnavailable": "Poziție indisponibilă", - "common.poweredBy": "Produs de ", - "common.preview": "previzualizare", - "common.price": "Preț", - "common.priceImpact": "Avertisment de impact asupra prețului", - "common.priceUpdated": "Preț actualizat", - "common.privacyChoices": "Opțiunile dvs. de confidențialitate", - "common.privacyChoices.checkbox.description": "Când este bifată, nu vom împărtăși datele dumneavoastră cu parteneri terți pentru publicitate personalizată. Puteți activa oricând partajarea debifând această casetă.", - "common.privacyChoices.checkbox.label": "Nu împărtășiți informațiile mele", - "common.privacyChoices.description": "Este posibil să împărtășim identificatori de dispozitiv cu partenerii noștri de publicitate pentru a ne promova serviciile pe alte site-uri web și platforme. În cazul în care aceasta se califică drept vânzare, partajare sau publicitate direcționată în conformitate cu legile aplicabile, puteți renunța bifând caseta „nu-mi partajați informațiile”. Pentru mai multe informații despre practicile noastre de confidențialitate, consultați Politica noastră de confidențialitate.", - "common.privacyChoices.disclaimer": "Vă rugăm să rețineți că selecția dvs. se va aplica numai acestui browser pe acest dispozitiv. De asemenea, puteți renunța activând setarea Global Privacy Control în browserul pe care îl utilizați pentru a accesa serviciile noastre. Pentru a vedea mai multe opțiuni, accesați setările dvs.", - "common.privacyPolicy": "Politica de confidențialitate", - "common.proceed": "Continua", - "common.proceedInWallet": "Continuați în portofel", - "common.proceedInWallet.short": "Continuați în portofel", - "common.protocol": "Protocol", - "common.publicResolver": "Rezolvant public", - "common.purchased": "Cumparat", - "common.queue.cancelled": "Coada anulată", - "common.queue.failed": "Coada a eșuat", - "common.queued": "În așteptare", - "common.queuing": "La coadă", - "common.rate": "Rată", - "common.readMore": "Citeşte mai mult", - "common.receive": "A primi", - "common.receive.cancelled": "Primire anulată", - "common.receive.failed": "Primirea a eșuat", - "common.received": "Primit", - "common.receiving": "Primirea", - "common.recent": "Recent", - "common.rejected": "Respins", - "common.reload.label": "Reîncărcați aplicația", - "common.remove.label": "Elimina", - "common.remove.liquidity.cancelled": "Eliminați lichiditatea anulată", - "common.remove.liquidity.failed": "Eliminarea lichidității a eșuat", - "common.removeAmount": "Eliminați cantitatea", - "common.removedLiquidity": "Lichiditatea eliminată", - "common.removeItem": "Eliminați elementul", - "common.removing.liquidity": "Eliminarea lichidității", - "common.repaid": "Rambursat", - "common.repay.cancelled": "Rambursare anulată", - "common.repay.failed": "Rambursarea eșuată", - "common.repaying": "Rambursare", - "common.resetLimit": "Resetați limita {{symbol}}", - "common.resetLimitWallet": "Resetați limita de {{symbol}} în portofel", - "common.resettingLimit": "Se resetează limita {{symbol}} ...", - "common.resolveIssues_one": "Rezolvați problema", - "common.resolveIssues_other": "Rezolvați problemele {{count}}", - "common.restricted.region": "Regiunea restrânsă", - "common.return.label": "Întoarcere", - "common.returnToTop": "Înapoi sus", - "common.reverseRegistrar": "Registrator invers", - "common.revoke.approval.failed": "Revocarea aprobării a eșuat", - "common.revoked.approval": "Aprobare revocată", - "common.revokedApproval": "Aprobare revocată", - "common.revoking.approval": "Revocarea aprobării", - "common.samePrice": "Același preț", - "common.scanQRDownload": "Scanați codul QR cu telefonul pentru a descărca", - "common.selectRegion.label": "Selectați regiunea dvs", - "common.selectToken.label": "Selectați un simbol", - "common.selfCustodial": "Auto-custodie", - "common.sell.label": "Vinde", - "common.send.button": "Trimite", - "common.send.cancelled": "Trimite anulat", - "common.send.failed": "Trimiterea a eșuat", - "common.sending": "Trimiterea", - "common.sent": "Trimis", - "common.settings": "Setări", - "common.share": "Acțiune", - "common.share.shareToTwitter": "Distribuie pe Twitter", - "common.share.twitter": "Distribuie pe Twitter", - "common.show.button": "Spectacol", - "common.showLess.button": "Arata mai putin", - "common.showMore.button": "Afișați mai multe", - "common.signatureExpired": "Semnătura dvs. a expirat.", - "common.signMessage": "Semnează mesajul", - "common.signMessageWallet": "Semnează mesajul în portofel", - "common.simple.label": "Simplu", - "common.sold": "Vândut", - "common.stats": "Statistici", - "common.status": "Stare", - "common.stayConnected": "Rămâi conectat", - "common.step.number": "Pasul {{number}}", - "common.submit.proposal.cancelled": "Trimiterea propunerii a fost anulată", - "common.submit.proposal.failed": "Trimiterea propunerii a eșuat", - "common.submitted.proposal": "Propunerea depusă", - "common.submitting.proposal": "Depunerea propunerii", - "common.success": "Succes", - "common.swap": "Schimbați", - "common.swap.cancelled": "Schimbul a fost anulat", - "common.swap.expired": "Schimbul a expirat", - "common.swap.failed": "Schimbarea a eșuat", - "common.swapped": "Schimbat", - "common.swapPending": "Schimb în așteptare...", - "common.swapping": "Schimbarea", - "common.switchNetworks": "Schimbați rețele", - "common.termsOfService": "Termenii serviciului", - "common.text.connected": "Conectat", - "common.text.contract": "Contracta", - "common.text.disconnected": "Deconectat", - "common.text.error": "Eroare", - "common.text.notAvailable": "N / A", - "common.text.recipient": "La", - "common.text.sender": "Din", - "common.text.unknown": "Necunoscut", - "common.thisMonth": "Luna aceasta", - "common.thisWeek": "În această săptămână", - "common.thisYear": "Anul acesta", - "common.time": "Timp", - "common.time.days": "zile", - "common.time.days_one": "zi", - "common.time.days_other": "zile", - "common.time.hours": "ore", - "common.time.hours_one": "ora", - "common.time.hours_other": "ore", - "common.time.minute.amt": "{{time}}m", - "common.time.minutes": "minute", - "common.time.months": "luni", - "common.time.months_one": "lună", - "common.time.months_other": "luni", - "common.time.past.days": "acum {{days}}zi", - "common.time.past.hours": "{{hours}}h în urmă", - "common.time.past.minutes": "{{minutes}}m în urmă", - "common.time.past.months": "{{months}}lună în urmă", - "common.time.past.seconds": "{{seconds}}acum", - "common.time.weeks": "săptămâni", - "common.time.weeks_one": "săptămână", - "common.time.weeks_other": "săptămâni", - "common.tip.label": "Bacsis:", - "common.to": "la", - "common.today": "Astăzi", - "common.tokenA": "Jetonul A", - "common.tokenAmount": "Suma simbolului", - "common.tokenB": "Jetonul B", - "common.tokenName": "Nume simbol", - "common.tokens": "Jetoane", - "common.totalValueLocked": "TVL", - "common.trade": "Comerț", - "common.trademarkPolicy": "Politica privind mărcile comerciale", - "common.transactionDetails": "Detalii tranzacție", - "common.transactionId": "ID-ul de tranzacție", - "common.transactionPending": "Tranzacție în așteptare", - "common.transactions": "Tranzacții", - "common.transactionSettings": "Setări de tranzacție", - "common.transactionSubmitted": "Tranzacție trimisă", - "common.transfer_one": "transfer", - "common.transfer_other": "transferuri", - "common.tryAgain.error": "Încearcă din nou", - "common.twitter": "Stare de nervozitate", - "common.type.label": "Tip", - "common.unavailable": "Indisponibil", - "common.uniGovernance": "Guvernarea UNI", - "common.uniswapMobile": "Uniswap Mobile", - "common.uniswapProtocol": "Protocolul Uniswap", - "common.uniswapTVL": "Uniswap TVL", - "common.uniswapWallet": "Portofel Uniswap", - "common.uniswapX": "UniswapX", - "common.unknown": "Necunoscut", - "common.unknownApproval": "Aprobare necunoscută", - "common.unknownBridge": "Podul necunoscut", - "common.unknownError.error": "Eroare necunoscută", - "common.unknownLend": "Împrumut necunoscut", - "common.unknownMint": "Monetărie necunoscută", - "common.unknownSend": "Trimitere necunoscută", - "common.unknownSwap": "Schimb necunoscut", - "common.unsupportedAsset_one": "Activ neacceptat", - "common.unsupportedAsset_other": "Active neacceptate", - "common.unwrap.button": "Desfaceți", - "common.unwrap.failed": "Desfacerea eșuată", - "common.unwrapped": "Desfăcut", - "common.unwrapping": "Desfacerea", - "common.view.profile": "Vezi profilul", - "common.viewOnBlockExplorer": "Vizualizați în Block Explorer", - "common.viewOnExplorer": "Vizualizare pe Explorer", - "common.volume": "Volum", - "common.vote": "Vot", - "common.vote.cancelled": "Votul a fost anulat", - "common.vote.failed": "Votul nu a reușit", - "common.voted": "Votat", - "common.voting": "Vot", - "common.wallet.approve": "Aprobați în portofel", - "common.wallet.label": "Portofel", - "common.walletForSwapping": "Portofelul construit pentru schimb. Disponibil pe iOS și Android.", - "common.warning": "Avertizare", - "common.webApp": "aplicație web", - "common.website": "Site-ul web", - "common.whyApprove": "De ce trebuie să aprob un token?", - "common.whySign": "De ce sunt necesare semnături?", - "common.whyWrap": "De ce trebuie să-mi împachetez {{symbol}}?", - "common.withdraw.failed": "Retragerea a eșuat", - "common.withdrawal.amount": "Suma de retragere", - "common.withdrawal.cancelled": "Retragerea anulată", - "common.withdrawing": "Retragerea", - "common.withdrew": "S-a retras", - "common.withinRange": "In raza de actiune", - "common.wrap": "Înfășurați {{symbol}}", - "common.wrap.button": "Înfășurați", - "common.wrap.cancelled": "Wrap anulat", - "common.wrap.failed": "Încheierea eșuată", - "common.wrapIn": "Înfășurați {{symbol}} în portofel", - "common.wrapped": "Înfășurat", - "common.wrapping": "Ambalaj", - "common.wrappingToken": "Se împachetează {{symbol}}...", - "common.wrongNetwork": "Rețea greșită", - "common.your.account.had.insufficient.funds": "Contul dvs. nu avea fonduri suficiente pentru a finaliza acest schimb.", - "common.your.account.has.insufficient.funds": "Contul dvs. nu are fonduri suficiente pentru a finaliza acest schimb.", - "common.your.limit.could.not.be.fulfilled": "Limita dvs. nu a putut fi îndeplinită în acest moment. Vă rugăm să încercați din nou.", - "common.your.swap.could.not.be.fulfilled": "Schimbul dvs. nu a putut fi îndeplinit în acest moment. Vă rugăm să încercați din nou.", - "common.youreBuying": "Tu cumperi", - "common.youReceive": "Primesti", - "common.youreSending": "Tu trimiți", - "common.youWillReceive": "Vei primi", - "currency.aud": "Dolarul australian", - "currency.brl": "Real brazilian", - "currency.cad": "Dolarul canadian", - "currency.cny": "Yuan chinezesc", - "currency.eur": "Euro", - "currency.gbp": "Lira sterlină", - "currency.hkd": "Dolarul Hong Kong", - "currency.idr": "Rupia indoneziană", - "currency.inr": "Rupia indiană", - "currency.jpy": "Yen japonez", - "currency.krw": "Won sud-coreean", - "currency.ngn": "Naira nigeriană", - "currency.pkr": "Rupia pakistaneză", - "currency.rub": "Rubla rusă", - "currency.sgd": "Dolarul din Singapore", - "currency.thb": "Baht thailandez", - "currency.try": "Lira turceasca", - "currency.uah": "Grivnia ucraineană", - "currency.usd": "Dolarul Statelor Unite", - "currency.vnd": "Dong vietnamez", - "dapp.request.approve.action": "Aproba", - "dapp.request.approve.fallbackTitle": "Aprobați acest site pentru a accesa jetoane", - "dapp.request.approve.helptext": "Permiteți acestui site să acceseze și să cheltuiască acest simbol pentru tranzacții. Asigurați-vă că aveți încredere în acest site.", - "dapp.request.approve.label": "Portofel", - "dapp.request.approve.title": "Aprobați accesul la {{tokenSymbol}}", - "dapp.request.base.title": "Cerere de tranzacție", - "dapp.request.bridge.description": "Mutați ETH, USDC și multe altele prin rețele {{numChains}}+.", - "dapp.request.bridge.title": "Încercați să faceți o punte?", - "dapp.request.connect.helptext": "Permiteți acestui site să vadă adresa portofelului, soldul și să solicite aprobări pentru tranzacții.", - "dapp.request.connect.title": "Conectați-vă la site", - "dapp.request.fallback.calldata.label": "Date neprelucrate", - "dapp.request.fallback.function.label": "Funcţie", - "dapp.request.permit2.description": "Permit2 gestionează aprobările token-urilor în mai multe aplicații.", - "dapp.request.permit2.header": "Semnează permisul2", - "dapp.request.reject.action": "Respinge totul", - "dapp.request.reject.info": "Aveți {{totalRequestCount}} solicitări de tranzacție", - "dapp.request.revoke.action": "Revoca", - "dapp.request.revoke.helptext": "Permiteți acestui site să revoce accesul pentru a cheltui acest simbol pentru tranzacții. Asigurați-vă că aveți încredere în acest site.", - "dapp.request.revoke.title": "Revocați accesul la {{tokenSymbol}}", - "dapp.request.signature.containsUnrenderableCharacters": "Acest mesaj conține caractere care nu pot fi redate. Asigurați-vă că aveți încredere în acest site.", - "dapp.request.signature.error.712-spec-compliance": "SignTypedDataRequestContent a primit date pentru semnare care nu sunt conforme cu specificațiile EIP-712.", - "dapp.request.signature.header": "Cerere de semnătură", - "dapp.request.signature.toggleDataView.raw": "Vedeți datele brute", - "dapp.request.signature.toggleDataView.readable": "Vedeți datele originale", - "dapp.request.warning.notActive.message": "Asigurați-vă că este cea potrivită", - "dapp.request.warning.notActive.title": "Acesta nu este portofelul tău activ", - "downloadApp.modal.alreadyHaveWallet": "Ai deja un portofel? ", - "downloadApp.modal.alreadyHaveWallet.signInLink": "Conectați-vă aici", - "downloadApp.modal.getStarted.description": "Începeți prin a descărca portofelul Uniswap, disponibil pe telefon sau browser.", - "downloadApp.modal.getStarted.title": "Începeți cu Uniswap", - "downloadApp.modal.signUp.description": "Începeți prin descărcarea portofelului Uniswap, disponibil pe telefon sau browser.", - "downloadApp.modal.signUp.description.embeddedWallet": "Începeți în câteva secunde înregistrându-vă mai jos sau descărcați portofelul nostru, disponibil pe telefon sau browser.", - "downloadApp.modal.signUp.title": "Înscrieți-vă la Uniswap", - "downloadApp.modal.uniswapProducts.subtitle": "Produsele Uniswap funcționează perfect împreună pentru a crea cea mai bună experiență onchain.", - "error.access.expiry": "Acest lucru oferă protocolul Uniswap acces la tokenul dvs. pentru tranzacționare. Pentru securitate, expiră după 30 de zile.", - "error.dataUnavailable": "Datele nu sunt disponibile momentan; lucrăm la o remediere", - "error.id": "ID eroare: {{eventId}}", - "error.noData": "Nu s-au gasit date", - "error.request.provideId": "Ne pare rău, a apărut o eroare la procesarea solicitării dvs. Dacă solicitați asistență, asigurați-vă că furnizați ID-ul dvs. de eroare.", - "error.tokenApproval": "Aprobarea simbolului nu a reușit", - "error.tokenApprovalEdited": "Sumă de aprobare insuficientă", - "error.tokenApprovalEdited.message": "Suma de aprobare setată în portofel este prea mică pentru a finaliza această tranzacție. Vă rugăm să încercați din nou și să măriți suma.", - "errors.crash.message": "Ceva sa prăbușit.", - "errors.crash.restart": "Reporniți aplicația", - "errors.crash.title": "Uh oh!", - "explore.more.pools": "Explorează mai multe piscine", - "explore.search.action.clear": "Clar", - "explore.search.action.viewEtherscan": "Vizualizați pe {{blockExplorerName}}", - "explore.search.empty.full": "Nu s-au găsit rezultate pentru \"{{searchQuery}}\"", - "explore.search.error": "Nu s-au putut încărca rezultatele căutării", - "explore.search.label.ownedBy": "Deținut de {{ownerAddress}}", - "explore.search.placeholder": "Căutați jetoane și portofele", - "explore.search.section.nft": "Colecții NFT", - "explore.search.section.popularNFT": "Colecții populare NFT", - "explore.search.section.popularTokenInfo": "Jetoanele populare sunt identificate pe baza volumului lor de tranzacționare pe Uniswap în ultimele 24 de ore.", - "explore.search.section.popularTokens": "Jetoane populare", - "explore.search.section.recent": "Căutări recente", - "explore.search.section.tokens": "Jetoane", - "explore.search.section.wallets": "Portofele", - "explore.tokens.error": "Nu s-au putut încărca jetoanele", - "explore.tokens.favorite.action.add": "Jetonul preferat", - "explore.tokens.favorite.action.edit": "Editeaza favoritele", - "explore.tokens.favorite.action.remove": "Eliminați preferatul", - "explore.tokens.favorite.title.default": "Jetoane preferate", - "explore.tokens.favorite.title.edit": "Editați jetoanele preferate", - "explore.tokens.metadata.marketCap": "{{number}} MCap", - "explore.tokens.metadata.totalValueLocked": "{{number}} TVL", - "explore.tokens.metadata.volume": "{{number}} Vol", - "explore.tokens.sort.label.marketCap": "Capitalizarea pieței", - "explore.tokens.sort.label.priceDecrease": "Scăderea prețului", - "explore.tokens.sort.label.priceIncrease": "Cresterea preturilor", - "explore.tokens.sort.label.totalValueLocked": "TVL", - "explore.tokens.sort.label.volume": "Volum", - "explore.tokens.sort.option.marketCap": "Capitalizarea pieței", - "explore.tokens.sort.option.priceDecrease": "Scădere de preț (24 ore)", - "explore.tokens.sort.option.priceIncrease": "Creștere de preț (24 ore)", - "explore.tokens.sort.option.totalValueLocked": "Uniswap TVL", - "explore.tokens.sort.option.volume": "Volum uniswap (24 ore)", - "explore.tokens.top.title": "Jetoane de top", - "explore.unableToDisplayHistorical": "Nu se pot afișa datele istorice privind volumul pentru lanțul curent.", - "explore.unableToDisplayHistoricalTVL": "Nu se pot afișa datele istorice TVL pentru lanțul curent.", - "explore.uniVolume": "Volumul uniswap", - "explore.wallets.favorite.action.add": "Portofelul preferat", - "explore.wallets.favorite.action.edit": "Editeaza favoritele", - "explore.wallets.favorite.action.remove": "Eliminați preferatul", - "explore.wallets.favorite.title.default": "Portofelele preferate", - "explore.wallets.favorite.title.edit": "Editați portofelele preferate", - "extension.connection.networks": "Rețele", - "extension.connection.popup": "Portofelul dvs. nu este conectat la acest site. Căutați un buton „Conectați portofelul” sau „Conectați-vă”.", - "extension.connection.popup.trouble": "Probleme la conectare?", - "extension.connection.popupWithButton": "Portofelul dvs. nu este conectat la acest site.", - "extension.connection.titleConnected": "Conectat", - "extension.connection.titleNotConnected": "Nu este conectat", - "extension.lock.button.forgot": "Aţi uitat parola?", - "extension.lock.button.reset": "Resetați portofelul", - "extension.lock.button.submit": "Deblocați", - "extension.lock.password.error": "Parola gresita. Încearcă din nou", - "extension.lock.password.reset.initial.description": "Uniswap nu vă poate ajuta să vă recuperați parola. Trebuie să vă resetați portofelul introducând din nou expresia de recuperare de 12 cuvinte.", - "extension.lock.password.reset.initial.help": "Unde îmi găsesc fraza de recuperare?", - "extension.lock.password.reset.initial.title": "Aţi uitat parola", - "extension.lock.password.reset.speedbump.description": "Asigurați-vă că aveți expresia de recuperare de 12 cuvinte înainte de a vă reseta portofelul. În caz contrar, nu vă veți putea recupera fondurile.", - "extension.lock.password.reset.speedbump.help": "Mi-am pierdut fraza de recuperare", - "extension.lock.password.reset.speedbump.title": "Înainte de a continua", - "extension.lock.subtitle": "Introduceți parola pentru deblocare", - "extension.lock.title": "Bine ai revenit", - "extension.network.notSupported": "Rețea neacceptată", - "extension.open": "Deschideți extensia Uniswap", - "extension.popup.chrome.button": "Deschideți extensia", - "extension.popup.chrome.description": "Finalizați această acțiune deschizând extensia Uniswap.", - "extension.popup.chrome.title": "Continuați în Uniswap", - "extension.settings.password.enter.title": "Introduceti parola curenta", - "extension.settings.password.error.wrong": "Parola gresita", - "extension.settings.password.placeholder": "Parola actuală", - "extension.warning.storage.button": "Backup", - "extension.warning.storage.message": "Asigurați-vă că faceți o copie de rezervă a frazei de recuperare pentru a preveni pierderea accesului la portofel și la fonduri.", - "extension.warning.storage.title": "Browserul tău rămâne fără spațiu de stocare", - "fee.bestForExotic": "Cel mai bun pentru perechi exotice.", - "fee.bestForMost": "Cel mai bun pentru majoritatea perechilor.", - "fee.bestForStablePairs": "Cel mai bun pentru perechi stabile.", - "fee.bestForVeryStable": "Cel mai bun pentru perechi foarte stabile.", - "fee.dynamic": "Taxa dinamica", - "fee.percentEarned": "Procentul pe care îl veți câștiga în comisioane.", - "fee.selectPercent": "{{pct}}% selectare", - "fee.selectPercentDescription": "{{pct}}% din lichiditate a selectat acest nivel", - "fee.tier": "Nivelul taxei", - "fee.tier.create": "Creați un nivel de taxe", - "fee.tier.create.button": "Creați un nou nivel de taxe", - "fee.tier.create.description": "Crearea unui nou nivel se va inițializa într-un grup nou și va avea ca rezultat costuri de rețea mai mari decât de obicei.", - "fee.tier.description": "Suma câștigată oferind lichiditate. Alegeți o sumă care se potrivește cu toleranța și strategia dvs. la risc.", - "fee.tier.description.v2": "Suma câștigată oferind lichiditate. Toate pool-urile v2 au taxe fixe de 0,3%. Pentru mai multe opțiuni, furnizați lichiditate pe v4.", - "fee.tier.dynamic": "Nivelul de taxe dinamic", - "fee.tier.dynamic.create": "Crearea unui nivel dinamic de taxe", - "fee.tier.dynamic.create.info": "Sunteți pe cale să creați un pool cu un nivel de taxe dinamic. Înainte de a continua, asigurați-vă că cârligul selectat acceptă taxe dinamice.", - "fee.tier.highestTvl": "Cel mai mare TVL", - "fee.tier.label": "Procentul pe care îl veți câștiga în comisioane", - "fee.tier.missing.description": "Nu găsiți nivelul pe care îl căutați?", - "fee.tier.new": "Nivel nou", - "fee.tier.percent.select": "{{percentage}} selectează", - "fee.tier.recommended.description": "Recomandat pe baza faptului că are cea mai mare cotă de lichiditate pentru perechea de jetoane selectată.", - "fee.tier.search": "Căutați sau creați alte niveluri de taxe", - "fee.tier.search.short": "Căutare niveluri", - "fee.tier.select": "Selectați nivelul de taxă", - "fee.tier.select.existing.button": "Selectați nivelul de taxă existent", - "fee.tierExact": "{{fee}} nivel de taxă", - "fee.unavailable": "Taxele câștigate nu sunt vizibile pentru pozițiile v2 până când lichiditatea este eliminată.", - "fee.uncollected": "Include taxe neîncasate:", - "fiatOffRamp.checkout.title": "Vinde cu", - "fiatOffRamp.connection.quote": "Vând {{amount}} în valoare de {{currencySymbol}}", - "fiatOffRamp.error.balance": "Depășește echilibrul", - "fiatOffRamp.summary.total": "{{cryptoAmount}} pentru {{fiatAmount}}", - "fiatOffRamp.unsupportedToken.back": "Întoarce-te", - "fiatOffRamp.unsupportedToken.divider": "Jetoane neacceptate", - "fiatOffRamp.unsupportedToken.message": "Acest token nu este acceptat pentru vânzare. Schimbați acest activ cu unul dintre jetoanele acceptate.", - "fiatOffRamp.unsupportedToken.swap": "Schimbați la un token acceptat", - "fiatOffRamp.unsupportedToken.title": "Jeton neacceptat", - "fiatOffRamp.welcome.tooltip": "Vinde-ți cripto-ul în contul tău bancar sau pe cardul de debit.", - "fiatOnRamp.button.chooseToken": "Alegeți jetonul", - "fiatOnRamp.cexTransferModal.description": "Cumpărarea cripto cu un card nu este acceptată în regiunea dvs. Transferați active dintr-un cont de schimb centralizat pentru a vă finanța portofelul.", - "fiatOnRamp.cexTransferModal.title": "Transferați pentru a începe", - "fiatOnRamp.checkout.title": "Checkout cu", - "fiatOnRamp.checkoutWith": "Checkout cu", - "fiatOnRamp.chooseProvider.description": "Veți continua către portalul furnizorului pentru a vedea taxele asociate tranzacției dvs.", - "fiatOnRamp.completeTransactionHeader": "Finalizați tranzacția cu {{serviceProvider}}", - "fiatOnRamp.connection.error": "Conexiune esuata", - "fiatOnRamp.connection.errorDescription": "A apărut o eroare la conectarea cu {{serviceProvider}}.", - "fiatOnRamp.connection.message": "Vă conectez la {{serviceProvider}}", - "fiatOnRamp.connection.quote": "Cumpărați {{amount}} în valoare de {{currencySymbol}}", - "fiatOnRamp.connection.terms": "Continuând, recunoașteți că veți fi supus Termenilor și condițiilor și Politica de confidențialitate cu {{serviceProvider}}, după caz.", - "fiatOnRamp.continueInTab": "Accesați fila {{serviceProvider}} pentru a continua. Este sigur să închideți acest modal acum.", - "fiatOnRamp.disclaimer": "Continuând, recunoașteți că veți fi supus Termenilor și condițiilor și Politica de confidențialitate cu {{serviceProvider}}, după caz.", - "fiatOnRamp.error.default": "Ceva n-a mers bine.", - "fiatOnRamp.error.load": "Nu s-au putut încărca jetoane pentru a cumpăra", - "fiatOnRamp.error.max": "Maxim {{amount}}", - "fiatOnRamp.error.min": "Minimum {{amount}}", - "fiatOnRamp.error.noQuotes": "Nu s-au găsit ghilimele.", - "fiatOnRamp.error.unavailable": "Acest serviciu nu este disponibil în regiunea dvs", - "fiatOnRamp.error.unsupported": "Nu este acceptat în regiune", - "fiatOnRamp.error.usd": "Disponibil pentru cumpărare numai în USD", - "fiatOnRamp.exchangeRate": "{{outputAmount}} {{outputSymbol}} pentru {{inputAmount}} {{inputSymbol}}", - "fiatOnRamp.noQuotes.error": "Nu s-au găsit ghilimele", - "fiatOnRamp.purchasedOn": "Achiziționat pe {{serviceProvider}}", - "fiatOnRamp.quote.advice": "Veți continua către portalul furnizorului pentru a vedea taxele asociate tranzacției dvs.", - "fiatOnRamp.quote.type.list": "{{optionsList}}și alte opțiuni", - "fiatOnRamp.quote.type.other": "Alte optiuni", - "fiatOnRamp.quote.type.recent": "Folosit recent", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "Dintr-un cont", - "fiatOnRamp.receiveCrypto.title": "Primește cripto", - "fiatOnRamp.receiveCrypto.transferFunds": "Finanțați-vă portofelul prin transferul criptomonelor dintr-un alt portofel sau cont", - "fiatOnRamp.region.placeholder": "Căutați după țară sau regiune", - "fiatOnRamp.region.title": "Selectați regiunea dvs", - "fiatOnRamp.summary.total": "{{cryptoAmount}} pentru {{fiatAmount}}", - "forceUpgrade.action.confirm": "Actualizați acum", - "forceUpgrade.action.learn": "Aflați cum să actualizați", - "forceUpgrade.action.recoveryPhrase": "Vedeți fraza de recuperare", - "forceUpgrade.description.extension": "Este disponibilă o nouă versiune a aplicației. Pentru a continua să utilizați extensia Uniswap, actualizați-o la cea mai recentă versiune.", - "forceUpgrade.description.wallet": "Este disponibilă o nouă versiune a aplicației. Pentru a continua să utilizați portofelul Uniswap, actualizați-l la cea mai recentă versiune.", - "forceUpgrade.label.recoveryPhrase": "Fraza de recuperare", - "forceUpgrade.title": "Actualizați la cea mai recentă versiune", - "globalPreferences.title": "Preferințe globale", - "hero.scroll": "Derulați pentru a afla mai multe", - "hero.subtitle": "Cea mai mare piață onchain. Cumpărați și vindeți cripto pe Ethereum și peste 11 alte lanțuri.", - "hero.swap.title": "Schimbați oricând,
oriunde.", - "hidden.nfts.info.banner.text": "Aflați mai multe despre NFT-urile ascunse", - "hidden.nfts.info.text.button": "NFT ascunse ({{numHidden}})", - "hidden.nfts.info.text.extension": "Acestea sunt potențiale escrocherii și NFT pe care le-ați ascuns. Puteți face clic dreapta pe un NFT pentru a-l afișa.", - "hidden.nfts.info.text.mobile": "Acestea sunt potențiale escrocherii și NFT pe care le-ați ascuns. Puteți apăsa lung pe un NFT pentru a-l afișa.", - "hidden.nfts.info.text.title": "NFT ascunse", - "hidden.tokens.info.banner.text": "Aflați mai multe despre jetoanele ascunse", - "hidden.tokens.info.text.button": "Jetoane ascunse ({{numHidden}})", - "hidden.tokens.info.text.info": "Acestea sunt potențiale înșelătorii, solduri mici și jetoane pe care le-ați ascuns. Jetoanele ascunse nu sunt incluse în soldul total al portofelului.", - "hidden.tokens.info.text.title": "Jetoane ascunse", - "home.activity.empty.button": "Primiți jetoane sau NFT", - "home.activity.empty.description.default": "Când aprobați, tranzacționați sau transferați jetoane sau NFT, tranzacțiile dvs. vor apărea aici.", - "home.activity.empty.description.external": "Când acest portofel face tranzacții, acestea vor apărea aici.", - "home.activity.empty.title": "Nicio activitate încă", - "home.activity.error.load": "Activitatea nu a putut fi încărcată", - "home.activity.title": "Activitate", - "home.banner.offline": "Sunteți în modul offline", - "home.banner.testnetMode": "Sunteți în modul testnet", - "home.banner.testnetMode.nav": "Sunteți în modul testnet. Dezactivați această opțiune în setări.", - "home.explore.footer": "Atingeți aici pentru a explora mii de jetoane, NFT-uri și multe altele", - "home.explore.title": "Explorați jetoanele", - "home.extension.error": "Eroare la încărcarea conturilor", - "home.label.buy": "Cumpără", - "home.label.for": "Cumpărați/Vând", - "home.label.receive": "A primi", - "home.label.send": "Trimite", - "home.label.swap": "Schimbați", - "home.nfts.title": "NFT-uri", - "home.tokens.empty.action.buy.description": "Cumpărați cu card de debit sau cont bancar.", - "home.tokens.empty.action.buy.title": "Cumpărați Crypto", - "home.tokens.empty.action.import.description": "Introduceți fraza de recuperare a acestui portofel pentru a începe schimbarea și trimiterea.", - "home.tokens.empty.action.import.title": "Import portofel", - "home.tokens.empty.action.receive.description": "Transfer din alt portofel sau cont.", - "home.tokens.empty.action.receive.title": "Primește cripto", - "home.tokens.empty.description": "Când acest portofel cumpără sau primește jetoane, acestea vor apărea aici.", - "home.tokens.empty.title": "Nu există încă jetoane", - "home.tokens.empty.welcome": "Bun venit în portofelul tău!", - "home.tokens.empty.welcome.description": "Se pare că ai un portofel nou. Să-l finanțăm înainte de a face primul schimb.", - "home.tokens.error.fetch": "Nu s-au putut prelua soldurile de simboluri", - "home.tokens.error.load": "Nu s-au putut încărca soldurile de simboluri", - "home.tokens.title": "Jetoane", - "home.upsell.receive.cta": "Dintr-un cont", - "home.upsell.receive.description": "Finanțați-vă portofelul prin transferul criptomonelor dintr-un alt portofel sau cont", - "home.upsell.receive.title": "Primește cripto", - "home.warning.viewOnly": "Acesta este un portofel pentru vizualizare", - "interface.metatags.description": "Schimbați sau furnizați lichiditate prin Protocolul Uniswap", - "interface.metatags.title": "Interfață Uniswap", - "landing.buildNextGen": "Construiți următoarea generație de aplicații și instrumente deschise.", - "landing.connectWithUs": "conecteaza-te cu noi", - "landing.devDocs": "Documente pentru dezvoltatori", - "landing.directToDeFi": "Mergeți direct la DeFi", - "landing.followOnX": "Urmărește @Uniswap pe X pentru cele mai recente actualizări", - "landing.protocolDescription": "Produsele Uniswap sunt alimentate de Protocolul Uniswap. Protocolul este cea mai mare piață onchain, cu un volum săptămânal de miliarde de dolari în mii de jetoane pe Ethereum și peste 7 lanțuri suplimentare.", - "landing.provideLiquidity.message": "Oferiți lichidități pool-urilor pe protocolul Uniswap și câștigați comisioane pe swap.", - "landing.swapSimple": "Schimbarea este simplă. Accesați mii de jetoane pe 11+ lanțuri.", - "landing.teamInsights": "Perspective și știri de la echipă", - "landing.trusted": "De încredere de milioane", - "language.afrikaans": "afrikaans", - "language.arabic": "arabic", - "language.catalan": "catalan", - "language.chineseSimplified": "Chineză simplificată", - "language.chineseTraditional": "Tradițional chinezesc", - "language.czech": "ceh", - "language.danish": "danez", - "language.dutch": "olandeză", - "language.english": "Engleză", - "language.finnish": "finlandeză", - "language.french": "limba franceza", - "language.greek": "greacă", - "language.hebrew": "ebraică", - "language.hindi": "hindi", - "language.hungarian": "maghiară", - "language.indonesian": "indoneziană", - "language.italian": "italian", - "language.japanese": "japonez", - "language.korean": "coreean", - "language.malay": "Malaeză", - "language.norwegian": "norvegian", - "language.polish": "Lustrui", - "language.portuguese": "portugheză", - "language.romanian": "română", - "language.russian": "Rusă", - "language.serbian": "sârb", - "language.spanishLatam": "spaniolă (America Latină)", - "language.spanishSpain": "spaniolă (Spania)", - "language.spanishUs": "spaniolă (SUA)", - "language.swahili": "Swahili", - "language.swedish": "suedez", - "language.turkish": "turc", - "language.ukrainian": "ucrainean", - "language.urdu": "Urdu", - "language.vietnamese": "vietnamez", - "limit.open.count_one": "1 limită deschisă", - "limit.open.count_other": "{{count}} limite deschise", - "limitPrice.buyingAboveMarketPrice.error.description": "Prețul dvs. limită este cu {{percentage}}% mai mare decât pe piață. Ajustați prețul limită pentru a continua.", - "limitPrice.buyingAboveMarketPrice.error.title": "Cumpărați cu {{tokenSymbol}} peste prețul pieței", - "limitPrice.marketPriceNotAvailable.error.description": "Nu putem calcula prețul actual de piață. Pentru a evita trimiterea unei comenzi sub prețul pieței, vă rugăm să verificați conexiunea la rețea și să încercați din nou.", - "limitPrice.marketPriceNotAvailable.error.title": "Prețul pieței nu este disponibil", - "limitPrice.sellingBelowMarketPrice.error.description": "Prețul dvs. limită este cu {{percentage}}% mai mic decât pe piață. Ajustați prețul limită pentru a continua.", - "limitPrice.sellingBelowMarketPrice.error.title": "Vând cu {{tokenSymbol}} sub prețul pieței", - "limits.form.disclaimer.mainnet": "Doar jetoanele Ethereum mainnet sunt disponibile pentru limite. ", - "limits.form.disclaimer.mainnet.short": "Doar jetoanele Mainnet sunt disponibile pentru limite.", - "limits.form.disclaimer.uniswapx": "Este posibil ca limitele să nu se execute exact când jetoanele ating prețul specificat. ", - "limits.learnMore": "Aflați mai multe despre limite", - "limits.price.input.label": "Când 1 valorează", - "limits.price.label": "Preț limită", - "limits.selectSupportedTokens": "Selectați jetoanele acceptate", - "liquidity.hooks": "Cârlige pe v4", - "liquidity.hooks.address.input": "Introduceți adresa cârligului", - "liquidity.learnMoreLabel": "Aflați mai multe despre furnizarea de lichidități", - "liquidity.notEnough.label": "Lichiditate insuficientă pentru a afișa valoarea exactă a USD.", - "liquidity.provideOnProtocols": "Furnizarea de lichiditate pe diferite protocoale", - "liquidityPool.chart.tooltip.amount": "{{token}} lichiditate: {{amount}}", - "liquidityPool.page.title": "Adăugați lichiditate în pool-uri{{version}} pe Uniswap", - "liquidityPool.positions.closed.title": "Poziții închise", - "liquidityPool.positions.page.title": "Gestionați lichiditatea pool-ului de {{quoteSymbol}}/{{baseSymbol}} pe Uniswap", - "liquidityPool.positions.page.version.description": "Vedeți pozițiile dvs. active de lichiditate {{version}} . Adăugați noi poziții.", - "liquidityPool.positions.page.version.title": "Gestionați lichiditatea poolului{{version}} pe Uniswap", - "liquidityPool.positions.price.formatted": " pe ", - "migrate.allowed": "Permis", - "migrate.allowLpMigration": "Permite migrarea jetonului LP", - "migrate.connectAccount": "Trebuie să conectați un cont.", - "migrate.connectWallet": "Conectați-vă la un portofel pentru a vă vedea lichiditatea V2.", - "migrate.contract": "Contract de migrare Uniswap", - "migrate.firstLP": "Sunteți primul furnizor de lichidități pentru acest pool Uniswap V3. Lichiditatea dvs. va migra la prețul actual de {{source}} .", - "migrate.highGasCost": "Costul dvs. de tranzacție va fi mult mai mare, deoarece include gazul pentru a crea pool-ul.", - "migrate.invalidRange": "Interval nevalid selectat. Prețul minim trebuie să fie mai mic decât prețul maxim.", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} jetoane LP", - "migrate.migrating": "Migrare", - "migrate.missingV2Position": "Nu vedeți una dintre pozițiile dvs. v2? Importă-l.", - "migrate.noV2Liquidity": "Nu a fost găsită nicio lichiditate V2.", - "migrate.positionNoFees": "Poziția dvs. nu va câștiga comisioane și nu va fi utilizată în tranzacții până când prețul pieței nu se va muta în intervalul dvs.", - "migrate.priceDifference": "Diferenta de pret: ", - "migrate.priceWarning": "Ar trebui să depuneți lichiditate în Uniswap V3 doar la un preț pe care îl considerați corect.
Dacă prețul pare incorect, puteți fie să faceți un schimb pentru a muta prețul, fie să așteptați ca altcineva să facă acest lucru.", - "migrate.refund": "Cel puțin {{amtA}} {{symA}} și {{amtB}} {{symB}} vor fi rambursate în portofel din cauza intervalului de preț selectat.", - "migrate.selectFeeTier": "Selectați nivelul de taxă", - "migrate.setRange": "Setați intervalul de preț", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Preț:", - "migrate.v2Description": "Acest instrument va migra în siguranță lichiditatea dvs. {{source}} la V3. Procesul este complet lipsit de încredere datorită contractului de migrare <0>Uniswap ↗", - "migrate.v2Instruction": "Pentru fiecare grup afișat mai jos, faceți clic pe migrați pentru a elimina lichiditatea din Uniswap V2 și a o depune în Uniswap V3.", - "migrate.v2Title": "Migrați lichiditatea V2", - "migrate.v3Price": "V3 {{sym}} Preț:", - "mint.v3.input.invalidPrice.error": "Preț introdus nevalid", - "mobileAppPromo.banner.getTheApp.link": "Obțineți aplicația Uniswap Wallet", - "mobileAppPromo.banner.title": "Uniswap: portofel Crypto și NFT", - "moonpay.poweredBy": "Fiat onramp alimentat de MoonPay USA LLC", - "moonpay.restricted.region": "Moonpay nu este disponibil în unele regiuni. Faceți clic pentru a afla mai multe.", - "nav.createAccount.button": "Creează cont", - "nav.logIn.button": "Log in", - "nav.signIn.button": "Conectare", - "nav.signUp.button": "Înscrie-te", - "nav.tabs.createPosition": "Creați poziție", - "nav.tabs.viewPositions": "Vedeți pozițiile", - "network.lostConnection": "Este posibil să fi pierdut conexiunea la rețea.", - "network.mightBeDown": "Este posibil ca {{network}} să fie întrerupt în acest moment sau este posibil să fi pierdut conexiunea la rețea.", - "network.warning": "Avertisment de rețea", - "nft.addToBag": "Adăugați în coș", - "nft.authorsCollectionOnUni": "Colecția NFT a lui {{name}}pe Uniswap", - "nft.bag": "Sac", - "nft.blockedCollection": "Această colecție este blocată", - "nft.blockedOpenSea": "Blocat pe OpenSea", - "nft.buyTransferNFTToStart": "Cumpărați sau transferați NFT-uri în acest portofel pentru a începe.", - "nft.buyTransferTokensToStart": "Cumpărați sau transferați jetoane în acest portofel pentru a începe.", - "nft.card.notAvailable": "Conținutul nu este încă
disponibil", - "nft.chainSupportComingSoon": "{{chainName}} asistență va veni în curând", - "nft.collection.title": "Explorează și cumpără pe Uniswap", - "nft.collectionOnUni": "Colecția NFT pe Uniswap", - "nft.collectonOnAddress": "Colecție NFT pe Uniswap - {{address}}", - "nft.complete": "Complet!", - "nft.editListings": "Editați listele", - "nft.event": "Eveniment", - "nft.explore": "Explorați NFT-urile", - "nft.learnWhy": "Află de ce", - "nft.list.header.lastPrice": "Ultimul", - "nft.list.title": "Listați NFT-urile", - "nft.listedSignificantly_one": "Un NFT este listat {{percentage}} sub prețul minim al colecției. Esti sigur ca vrei sa continui?", - "nft.listedSignificantly_other": "{{count}} NFT-urile sunt listate semnificativ sub prețul minim al colecției. Esti sigur ca vrei sa continui?", - "nft.listForSale": "Lista de vanzare", - "nft.lowPrice": "Preț de listare scăzut", - "nft.marketplace.royalty.header": "{{marketName}} taxe", - "nft.maxFees": "Taxe maxime", - "nft.maxRoyalties": "Redevențe maxime pentru creatori", - "nft.noItems": "Nu există elemente de afișat", - "nft.noneAtAddress": "Nu există bunuri de colectare la această adresă", - "nft.noPools": "Încă nu există piscine", - "nft.notListed": "Nu e in lista", - "nft.proceedsIfSold": "Încasări dacă sunt vândute", - "nft.profile.priceInput.warning.alreadyListed": "Deja listat la {{tokenAmountWithSymbol}}", - "nft.profile.priceInput.warning.belowFloor": "{{percentage}} sub prețul minim.", - "nft.refundsInEth": "Rambursările pentru articolele indisponibile vor fi acordate în ETH", - "nft.removeFromBag": "Scoateți din sac", - "nft.reportSpam": "Raportați ca spam", - "nft.returnToExplore": "Reveniți la NFT Explore", - "nft.returnToMy": "Reveniți la NFT-urile mele", - "nft.setPrices": "Setați prețurile pentru a continua", - "nft.startListing": "Începeți listarea", - "nft.successListed": "Listat cu succes", - "nft.sweep": "Mătura", - "nft.unavailableToList": "Indisponibil pentru listare", - "nft.whyTransaction": "De ce este necesară o tranzacție?", - "nft.whyTransaction.reason": "Listarea unui NFT necesită o aprobare unică a pieței pentru fiecare colecție NFT.", - "nft.willAppearHere": "Tranzacțiile dvs. onchain și achizițiile cripto vor apărea aici.", - "nft.wishGranted": "Uniswap ți-a îndeplinit dorința!", - "nfts.collection.action.approve_one": "Aprobați colectarea", - "nfts.collection.action.approve_other": "Aprobați colecțiile", - "nfts.collection.action.sign_one": "Semnează lista", - "nfts.collection.action.sign_other": "Semnează liste", - "nfts.marketplace.fees.deltaMax": "{{percentChanged}} max", - "nfts.my": "NFT-urile mele", - "nfts.noneYet": "Nu există încă NFT", - "nfts.sell": "Vinde NFT-uri", - "nfts.viewAndSell": "Vizualizați și vindeți NFT-uri", - "notFound.oops": "Hopa, du-mă înapoi la Swap", - "notice.uk": "Această aplicație web este oferită ca un instrument pentru ca utilizatorii să interacționeze cu Protocolul Uniswap din proprie inițiativă, fără aprobarea sau recomandarea activităților de tranzacționare cu criptomonede. Procedând astfel, Uniswap nu recomandă utilizatorilor sau potențialilor utilizatori să se implice în activități de tranzacționare cu criptoactive, iar utilizatorii sau potențialii utilizatori ai aplicației web nu ar trebui să considere această pagină web sau conținutul acesteia ca implicând vreo formă de recomandare, invitație sau stimulare la tranzacționarea cu criptoactive. .", - "notice.uk.label": "Disclaimer Marea Britanie:", - "notification.assetVisibility.hidden": "{{assetName}} ascuns", - "notification.assetVisibility.unhidden": "{{assetName}} neascuns", - "notification.copied.address": "Adresă copiată", - "notification.copied.calldata": "Datele apelului au fost copiate", - "notification.copied.contractAddress": "Adresa contractului a fost copiată", - "notification.copied.failed": "Copierea eșuată în clipboard", - "notification.copied.image": "Imaginea a fost copiată", - "notification.copied.nftUrl": "Adresa URL NFT a fost copiată", - "notification.copied.tokenUrl": "Adresa URL a simbolului a fost copiată", - "notification.copied.transactionId": "ID-ul tranzacției a fost copiat", - "notification.copied.unitag": "Numele de utilizator a fost copiat", - "notification.countryChange": "S-a schimbat la {{countryName}}", - "notification.network.changed": "S-a schimbat la {{network}}", - "notification.passwordChanged": "parolă schimbată", - "notification.restore.success": "Portofelul a fost restaurat!", - "notification.send.network": "Se trimite pe {{network}}", - "notification.spam.NFT.successful": "Raportat", - "notification.swap.network": "Schimbarea pe {{network}}", - "notification.swap.pending.swap": "Schimb în așteptare", - "notification.swap.pending.unwrap": "Desfacere în așteptare", - "notification.swap.pending.wrap": "Wrap în așteptare", - "notification.transaction.approve.canceled": "Anulat {{currencySymbol}} aprobare.", - "notification.transaction.approve.fail": "Nu s-a aprobat {{currencySymbol}} pentru utilizare cu {{address}}.", - "notification.transaction.approve.success": "Aprobat {{currencySymbol}} pentru utilizare cu {{address}}.", - "notification.transaction.pending": "Tranzacție în așteptare", - "notification.transaction.swap.canceled": "Schimbarea {{inputCurrencySymbol}}-{{outputCurrencySymbol}} a fost anulată.", - "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} pentru {{outputCurrencyAmountWithSymbol}} schimbul a expirat.", - "notification.transaction.swap.fail": "Nu s-a putut schimba {{inputCurrencyAmountWithSymbol}} cu {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.swap.success": "Schimbat {{inputCurrencyAmountWithSymbol}} cu {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.transfer.canceled": "Trimitere {{tokenNameOrAddress}} anulată", - "notification.transaction.transfer.fail": "Nu s-a putut trimite {{tokenNameOrAddress}} către {{walletNameOrAddress}}", - "notification.transaction.transfer.received": "Primit {{tokenNameOrAddress}} de la {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "Trimis {{tokenNameOrAddress}} către {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "Tranzacția cu {{addressOrEnsName}}", - "notification.transaction.unknown.fail.short": "tranzactie nereusita", - "notification.transaction.unknown.success.full": "S-a tranzacționat cu {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "Tranzacție confirmată", - "notification.transaction.unwrap.canceled": "Anulat {{inputCurrencySymbol}} despachetare.", - "notification.transaction.unwrap.fail": "Nu s-a desfășurat {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.unwrap.success": "S-a despachetat {{inputCurrencyAmountWithSymbol}} și a primit {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.canceled": "Încheierea {{inputCurrencySymbol}} anulată.", - "notification.transaction.wrap.fail": "Nu s-a putut încheia {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.success": "Înfășurat {{inputCurrencyAmountWithSymbol}} și primit {{outputCurrencyAmountWithSymbol}}.", - "notification.transfer.pending": "Trimite în așteptare", - "notification.walletConnect.confirmed": "Tranzacție confirmată cu {{dappName}}", - "notification.walletConnect.connected": "Conectat", - "notification.walletConnect.disconnected": "Deconectat", - "notification.walletConnect.failed": "Tranzacția a eșuat cu {{dappName}}", - "notification.walletConnect.networkChanged.full": "S-a schimbat la {{networkName}}", - "notification.walletConnect.networkChanged.short": "Rețele comutate", - "notifications.scantastic.subtitle": "Continuați pe Extensia Uniswap", - "notifications.scantastic.title": "Succes!", - "onboarding.backup.manual.banner": "Vă sugerăm să scrieți acest lucru pe o bucată de hârtie și să o depozitați într-un loc sigur, ca un seif.", - "onboarding.backup.manual.displayWarning.description": "Citiți cu atenție următoarele înainte de a continua.", - "onboarding.backup.manual.displayWarning.note.access": "Această expresie de recuperare vă oferă acces deplin la portofel și la fonduri", - "onboarding.backup.manual.displayWarning.note.secure": "Vizualizați acest lucru în privat și nu îl distribuiți nimănui", - "onboarding.backup.manual.displayWarning.note.storage": "Notează-l și păstrează-l într-un loc sigur", - "onboarding.backup.manual.displayWarning.title": "Câteva lucruri importante de știut", - "onboarding.backup.manual.error": "Cuvânt nevalid sau scris greșit", - "onboarding.backup.manual.placeholder": "Cuvant secret", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} finalizat", - "onboarding.backup.manual.selectedWordPlaceholder": "Selectați cuvântul", - "onboarding.backup.manual.subtitle_one": "Care este {{count}}primul cuvânt din fraza ta de recuperare?", - "onboarding.backup.manual.subtitle_two": "Care este cuvântul {{count}}din fraza ta de recuperare?", - "onboarding.backup.manual.subtitle_few": "Care este {{count}}al doilea cuvânt din fraza ta de recuperare?", - "onboarding.backup.manual.subtitle_other": "Care este {{count}}al-lea cuvânt din fraza ta de recuperare?", - "onboarding.backup.manual.title": "Să ne asigurăm că ai înregistrat-o corect", - "onboarding.backup.option.badge.quick": "Rapid", - "onboarding.backup.option.cloud.description": "Faceți backup pentru portofel prin {{cloudProviderName}}, protejat de o parolă de recuperare.", - "onboarding.backup.option.cloud.title": "Setați o parolă de recuperare", - "onboarding.backup.option.manual.description": "Înregistrați-vă 12 cuvinte secrete pe o bucată de hârtie și păstrați-o într-un loc sigur.", - "onboarding.backup.option.manual.title": "Notează fraza de recuperare", - "onboarding.backup.reminder.description": "Efectuarea unei copii de rezervă a portofelului vă asigură că vă puteți recupera întotdeauna bunurile dacă vă pierdeți telefonul sau obțineți un dispozitiv nou.", - "onboarding.backup.reminder.title": "Este timpul să-ți faci o copie de rezervă a portofelului", - "onboarding.backup.reminder.warning.description": "Dacă nu configurați o metodă de rezervă, nu veți avea o modalitate de a vă recupera portofelul dacă vă pierdeți telefonul, ștergeți aplicația sau obțineți un dispozitiv nou.", - "onboarding.backup.reminder.warning.title": "Ai putea să-ți pierzi fondurile", - "onboarding.backup.speedBump.cloud.description": "Dacă îl uiți vreodată, nu îl putem reseta pentru tine. Notează-l într-un loc sigur sau păstrează-l în siguranță într-un manager de parole.", - "onboarding.backup.speedBump.cloud.disclaimer": "Înțeleg că Uniswap Labs nu poate reseta parola mea de recuperare.", - "onboarding.backup.speedBump.cloud.title": "Este important să salvați această parolă", - "onboarding.backup.speedBump.manual.description": "Asigurați-vă că ați scris corect fraza de recuperare și aveți un loc sigur pentru a o stoca.", - "onboarding.backup.speedBump.manual.disclaimer": "Înțeleg că Uniswap Labs nu-mi poate recupera portofelul dacă pierd asta.", - "onboarding.backup.speedBump.manual.title": "Înainte să termini...", - "onboarding.backup.subtitle": "Acesta este modul în care vă veți recupera portofelul dacă ștergeți aplicația sau pierdeți dispozitivul.", - "onboarding.backup.title.existing": "Faceți backup pentru portofel", - "onboarding.backup.title.new": "Alegeți metoda de backup", - "onboarding.backup.view.disclaimer": "Înțeleg că, dacă îmi pierd fraza de recuperare, Uniswap Labs nu mă poate ajuta să o repar.", - "onboarding.backup.view.subtitle.message1": "Citiți cu atenție următoarele înainte de a continua", - "onboarding.backup.view.subtitle.message2": "Va trebui să introduceți toate aceste 12 cuvinte secrete pentru a vă recupera portofelul.", - "onboarding.backup.view.title": "Notează-ți fraza de recuperare", - "onboarding.backup.view.warning.message1": "Această expresie de recuperare vă oferă acces deplin la portofel și la fonduri", - "onboarding.backup.view.warning.message2": "Notează-l și păstrează-l într-un loc sigur", - "onboarding.backup.view.warning.message3": "Vizualizați acest lucru în privat și nu îl distribuiți nimănui", - "onboarding.cloud.confirm.description": "Va trebui să introduceți acest lucru pentru a vă recupera fondurile. Dacă îl uiți vreodată, nu îl putem recupera pentru tine.", - "onboarding.cloud.confirm.title": "Confirmați parola de recuperare", - "onboarding.cloud.createPassword.description": "Va trebui să introduceți acest lucru pentru a vă recupera fondurile. Dacă îl uiți vreodată, nu îl putem recupera pentru tine.", - "onboarding.cloud.createPassword.title": "Creați-vă parola de recuperare", - "onboarding.complete.button": "Deschideți extensia Uniswap", - "onboarding.complete.description": "Portofelul tău este gata să trimită și să primească cripto. Deschideți extensia Uniswap cu comanda rapidă de mai jos.", - "onboarding.complete.go_to_uniswap": "Accesați aplicația web Uniswap", - "onboarding.complete.pin.description": "Faceți clic pe pictograma PIN pentru a adăuga Extensia Uniswap în bara de instrumente.", - "onboarding.complete.pin.title": "Fixați extensia Uniswap", - "onboarding.complete.title": "Ești gata", - "onboarding.extension.password.subtitle": "Veți avea nevoie de acesta pentru a vă debloca portofelul și pentru a accesa expresia de recuperare", - "onboarding.extension.password.title.default": "Creaza parola", - "onboarding.extension.password.title.reset": "reseteaza parola", - "onboarding.extension.unsupported.android.description": "Extensia Uniswap este compatibilă numai cu Chrome pe desktop.", - "onboarding.extension.unsupported.android.title": "Chrome pe mobil nu este acceptat (încă)", - "onboarding.extension.unsupported.description": "Extensia Uniswap este compatibilă doar cu Chrome acum.", - "onboarding.extension.unsupported.title": "Acest browser nu este acceptat (încă)", - "onboarding.home.intro.backup.description": "Configurați un plan de recuperare dacă vă pierdeți vreodată telefonul sau obțineți unul nou.", - "onboarding.home.intro.backup.title": "Faceți backup pentru portofel", - "onboarding.home.intro.bridging.description_one": "Mutați ETH, USDC și multe altele prin rețele {{count}}+.", - "onboarding.home.intro.bridging.description_other": "Mutați ETH, USDC și multe altele prin rețele {{count}}+.", - "onboarding.home.intro.fund.description": "Finanțați-vă portofelul cumpărând cripto sau transferând dintr-un alt cont.", - "onboarding.home.intro.fund.title": "Obține primul tău simbol", - "onboarding.home.intro.label.required": "Necesar", - "onboarding.home.intro.label.swipe": "Beţivan", - "onboarding.home.intro.unitag.description": "Creați un profil web3 personalizat și partajați-vă cu ușurință adresa prietenilor.", - "onboarding.home.intro.unitag.title": "Revendicați-vă numele de utilizator {{unitagDomain}}", - "onboarding.home.intro.welcome.description": "Termină de configurat portofelul pentru a începe schimbul în câteva secunde.", - "onboarding.home.intro.welcome.title": "Bun venit la Uniswap", - "onboarding.import.error.invalidWords_one": "1 cuvânt este invalid sau scris greșit", - "onboarding.import.error.invalidWords_other": "{{count}} cuvintele sunt nevalide sau scrise greșit", - "onboarding.import.method.import.message": "Introduceți expresia de recuperare dintr-un alt portofel cripto", - "onboarding.import.method.import.title": "Importă un portofel", - "onboarding.import.method.restore.message.android": "Adăugați portofelele pentru care ați făcut backup în contul dvs. Google Drive", - "onboarding.import.method.restore.message.ios": "Adăugați portofelele pentru care ați făcut backup în contul dvs. iCloud", - "onboarding.import.method.restore.title": "Restaurați un portofel", - "onboarding.import.onDeviceRecovery.other_options": "Creați sau importați un alt portofel", - "onboarding.import.onDeviceRecovery.other_options.label": "Nu vrei nimic din cele de mai sus?", - "onboarding.import.onDeviceRecovery.subtitle": "Alegeți la ce portofel doriți să vă conectați din nou.", - "onboarding.import.onDeviceRecovery.title": "Bine ați revenit la Uniswap", - "onboarding.import.onDeviceRecovery.wallet.button": "Vedeți fraza de recuperare", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 alt portofel", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} alte portofele", - "onboarding.import.onDeviceRecovery.warning.caption": "Asigurați-vă că ați făcut backup pentru toate celelalte portofele. Dacă doriți vreodată să le restaurați, veți avea nevoie de frazele lor de recuperare sau de copiile de rezervă corespunzătoare {{cloudProvider}} .", - "onboarding.import.onDeviceRecovery.warning.title": "Esti sigur?", - "onboarding.import.title": "Alegeți cum doriți să adăugați portofelul", - "onboarding.importMnemonic.button.default": "Expresia mea de recuperare are 12 cuvinte", - "onboarding.importMnemonic.button.importing": "Se importă...", - "onboarding.importMnemonic.button.longPhrase": "Fraza mea de recuperare este mai lungă", - "onboarding.importMnemonic.error.invalidPhrase": "Expresia introdusă este nevalidă", - "onboarding.importMnemonic.subtitle": "Introduceți sau inserați expresia de recuperare de 12 cuvinte", - "onboarding.importMnemonic.title": "Introduceți expresia de recuperare", - "onboarding.intro.button.alreadyHave": "Am deja un portofel", - "onboarding.intro.mobileScan.button": "Scanați codul QR pentru a importa", - "onboarding.intro.mobileScan.title": "Ai aplicația Uniswap?", - "onboarding.landing.button.add": "Adăugați un portofel existent", - "onboarding.landing.button.create": "Creați un portofel", - "onboarding.name.wallet.button.text": "Termina", - "onboarding.name.wallet.subtitle": "Acest pseudonim este vizibil doar pentru tine", - "onboarding.name.wallet.title": "Dă-ți portofel un nume", - "onboarding.notification.permission.message": "Pentru a primi notificări, activați notificările pentru Uniswap Wallet în setările dispozitivului dvs.", - "onboarding.notification.permission.title": "Permisiune de notificări", - "onboarding.notification.subtitle": "Rămâneți la curent cu starea tranzacțiilor și modificările majore ale prețurilor pentru jetoanele preferate", - "onboarding.notification.title": "Activați notificările", - "onboarding.passkey.account.protection": "Contul dvs. este protejat de propria dvs. stocare sigură a parolei.", - "onboarding.passkey.biometric.scan": "Telefon, tabletă sau browser — scanați-vă datele biometrice și veți fi conectat.", - "onboarding.passkey.create": "Creați-vă cheia de acces", - "onboarding.passkey.use.recovery.phrase": "Utilizați în schimb o expresie de recuperare", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "Să confirmăm că ai înțeles bine. Dacă pierdeți sau notați acest lucru incorect, nu vă veți putea recupera fondurile.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "Dacă pierdeți sau notați acest lucru incorect, nu vă veți putea recupera fondurile.", - "onboarding.recoveryPhrase.confirm.title": "Să confirmăm că ai înțeles bine", - "onboarding.recoveryPhrase.view.subtitle": "Va trebui să introduceți toate aceste 12 cuvinte secrete pentru a vă recupera portofelul.", - "onboarding.recoveryPhrase.view.title": "Notează-ți fraza de recuperare", - "onboarding.recoveryPhrase.view.title.hasPassword": "Dacă îți uiți vreodată parola...", - "onboarding.recoveryPhrase.warning.final.button": "Sunt gata", - "onboarding.recoveryPhrase.warning.final.message": "Expresia dvs. de recuperare este cea care vă oferă (și oricui o are) acces la fondurile dvs. Asigurați-vă că o păstrați pentru dvs.", - "onboarding.recoveryPhrase.warning.final.title": "Faceți acest pas într-un loc privat", - "onboarding.recoveryPhrase.warning.screenshot.message": "Oricine are acces la fotografiile tale poate accesa portofelul tău. Vă recomandăm să vă scrieți cuvintele.", - "onboarding.recoveryPhrase.warning.screenshot.title": "Capturile de ecran nu sunt sigure", - "onboarding.resetPassword.complete.safety": "Aflați mai multe despre siguranța portofelului", - "onboarding.resetPassword.complete.subtitle": "Utilizați noua parolă pentru a vă debloca portofelul.", - "onboarding.resetPassword.complete.title": "Resetare parola", - "onboarding.scan.button": "Scanați cu aplicația Uniswap", - "onboarding.scan.error": "Ne pare rău, nu putem încărca codul QR în acest moment. Vă rugăm să încercați o altă metodă de integrare.", - "onboarding.scan.otp.error": "Codul pe care l-ați trimis este incorect sau a apărut o eroare la trimitere. Vă rugăm să încercați din nou.", - "onboarding.scan.otp.failed": "Încercări eșuate: {{number}}", - "onboarding.scan.otp.subtitle": "Verificați aplicația mobilă Uniswap pentru codul de 6 caractere", - "onboarding.scan.otp.title": "Introduceți codul unic", - "onboarding.scan.subtitle": "Scanați codul QR cu aplicația mobilă Uniswap pentru a începe să vă importați portofelul.", - "onboarding.scan.title": "Importați portofelul din aplicație", - "onboarding.scan.wifi": "Conectați-vă telefonul la aceeași rețea WiFi ca și computerul dvs.", - "onboarding.security.alert.biometrics.message.android": "Pentru a utiliza datele biometrice, configurați-o mai întâi în setări", - "onboarding.security.alert.biometrics.message.ios": "Pentru a utiliza {{biometricsMethod}}, permiteți accesul în setările sistemului", - "onboarding.security.alert.biometrics.title.android": "Biometria este dezactivată", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} este dezactivat", - "onboarding.security.button.confirm.android": "Activați biometria", - "onboarding.security.button.confirm.ios": "Activați {{biometricsMethod}}", - "onboarding.security.button.setup": "Înființat", - "onboarding.security.subtitle.android": "Adăugați un nivel suplimentar de securitate solicitând datele biometrice pentru a trimite tranzacții.", - "onboarding.security.subtitle.ios": "Adăugați un nivel suplimentar de securitate solicitând {{biometricsMethod}} pentru a trimite tranzacții.", - "onboarding.security.title": "Protejați-vă portofelul", - "onboarding.selectWallets.error": "Nu s-au putut încărca adresele", - "onboarding.selectWallets.title.default": "Alegeți portofelele de importat", - "onboarding.selectWallets.title.error": "Eroare la importarea portofelelor", - "onboarding.termsOfService": "Continuând, sunt de acord cu Termenii și condițiile și sunt de acord cu Politica de confidențialitate", - "onboarding.tooltip.recoveryPhrase.trigger": "Ce este o frază de recuperare?", - "onboarding.wallet.continue": "Să-l păstrăm în siguranță", - "onboarding.wallet.defaultName": "Portofel {{number}}", - "onboarding.wallet.description.full": "Acesta este spațiul tău personal pentru jetoane, NFT-uri și toate tranzacțiile tale. Finalizați configurarea pentru a vă păstra fondurile în siguranță.", - "onboarding.wallet.title": "Bun venit la noul tău portofel", - "outageBanner.message": "Datele {{chainName}} {{versionDescription}} nu sunt disponibile momentan, dar ne așteptăm ca problema să fie rezolvată în curând.", - "outageBanner.message.sub": "Puteți încă schimba și furniza lichiditate pe acest lanț fără probleme.", - "outageBanner.title": "{{versionName}} va reveni în curând", - "permit.approval.fail": "Aprobarea permisului a eșuat", - "permit.approval.fail.message": "Permisul2 permite aprobările jetonelor să fie partajate și gestionate în diferite aplicații.", - "pool.activePositions.appear": "Pozițiile dvs. active de lichiditate V3 vor apărea aici.", - "pool.activeRange": "Interval de bifă activ", - "pool.addAs": "Adăugați ca {{nativeWrappedSymbol}}", - "pool.addLiquidity.seoTitle": "Adăugați lichiditate la {{tokenPair}} ({{chain}}) pe Uniswap", - "pool.addMoreLiquidity": "Adăugați mai multă lichiditate", - "pool.apr": "APRILIE", - "pool.apr.description": "Anualizat pe baza taxelor de 1 zi", - "pool.areCreating": "Creezi un bazin", - "pool.areFirst": "Sunteți primul furnizor de lichidități.", - "pool.back": "Înapoi la piscină", - "pool.balances": "Soldurile piscinei", - "pool.closedCTA.description": "Le puteți vedea folosind filtrul din partea de sus a paginii.", - "pool.closedCTA.title": "Căutați pozițiile dvs. închise?", - "pool.collectAs": "Colectați ca {{nativeWrappedSymbol}}", - "pool.collected": " Colectat", - "pool.collectFees": "Colectați taxe", - "pool.collecting": "Colectare", - "pool.collectingFeesWithdraw": "Taxele de colectare vor retrage taxele disponibile în prezent pentru dvs.", - "pool.confirmSupply": "Confirmați aprovizionarea", - "pool.connection.networkUnsupported": "Rețeaua dvs. conectată nu este acceptată.", - "pool.create": "Crearea unui bazin nou", - "pool.create.info": "Selecțiile dvs. vor crea un nou grup de lichidități care poate duce la o lichiditate inițială mai mică și o volatilitate crescută. Luați în considerare adăugarea la un pool existent pentru a minimiza aceste riscuri.", - "pool.create.pair": "Creați o pereche", - "pool.createAndSupply": "Creați bazin și aprovizionare", - "pool.createdPosition": "Poziția creată", - "pool.createdPosition.cancelled": "Crearea poziției a fost anulată", - "pool.createdPosition.failed": "Crearea poziției nu a reușit", - "pool.depositAmounts": "Sume de depozit", - "pool.earnFees": "Adăugând lichiditate, veți câștiga 0,3% din toate tranzacțiile pe această pereche proporțional cu cota dvs. din pool. Taxele sunt adăugate la pool, se acumulează în timp real și pot fi solicitate prin retragerea lichidității.", - "pool.estimatePercentToRevert": "Ieșirea este estimată. Dacă prețul se modifică cu mai mult de {{allowed}}%, tranzacția dvs. se va reveni.", - "pool.explorers": "Exploratori", - "pool.exporeAnalytics": "Explorați Uniswap Analytics.", - "pool.hideClosed": "Ascunde pozițiile închise", - "pool.import": "Import pool", - "pool.import.link.description": "Unele poziții v2 nu sunt afișate automat.", - "pool.import.positions.v2": "Importați poziții V2", - "pool.import.positions.v2.selectPair.description": "Unele poziții v2 nu sunt afișate automat. Selectați o pereche de jetoane pentru a vă importa și vizualiza pozițiile.", - "pool.import.success": "Pool importat", - "pool.increaseLiquidity": "Creșteți lichiditatea", - "pool.info": "Informații despre piscină", - "pool.initialShare": "Prețurile inițiale și cota de la piscină", - "pool.learn": "Învăța", - "pool.learnAbout": "Citiți mai multe despre furnizarea de lichidități", - "pool.learnLiquidity": "Aflați despre furnizarea de lichidități", - "pool.learnv3LP": "Consultați ghidurile noastre de trecere și migrare v3 LP.", - "pool.limitFluctuation.warning": "Vă rugăm să rețineți că execuția pentru limite poate varia în funcție de fluctuațiile pieței în timp real și de congestionarea rețelei Ethereum. Este posibil ca limitele să nu se execute exact când jetoanele ating prețul specificat.", - "pool.liquidity.connectToAdd": "Conectați-vă la un portofel pentru a vă vedea lichiditatea.", - "pool.liquidity.data.error.message": "A apărut o eroare la preluarea datelor necesare pentru tranzacția dvs.", - "pool.liquidity.earn.fee": "Furnizorii de lichiditate câștigă o taxă de 0,3% pentru toate tranzacțiile proporțional cu cota lor din pool. Taxele sunt adăugate la pool, se acumulează în timp real și pot fi solicitate prin retragerea lichidității.", - "pool.liquidity.outOfSync": "Nepotrivirea prețului de piață și a grupului", - "pool.liquidity.outOfSync.message": "Prețurile din acest pool diferă în funcție de prețurile de piață ale jetoanelor selectate. Ajustați-vă intervalul de preț în consecință sau așteptați ca grupul să se reechilibreze pentru a evita pierderile.", - "pool.liquidity.ownershipWarning.message": "Nu sunteți proprietarul acestei poziții LP. Nu veți putea retrage lichiditatea din această poziție decât dacă dețineți următoarea adresă: {{ownerAddress}}", - "pool.liquidity.rewards": "Recompense ale furnizorului de lichiditate", - "pool.liquidity.taxWarning": "Taxe simbol", - "pool.liquidity.taxWarning.message": "Unul sau mai multe dintre aceste jetoane au taxe pe transferuri. Adăugarea de lichiditate cu V3 poate duce la pierderea de fonduri. Încercați să utilizați V2 în schimb.", - "pool.liquidityPoolFeesNotice": "Când adăugați lichiditate, veți primi jetoane de grup reprezentând poziția dvs. Aceste jetoane câștigă automat taxe proporționale cu cota dvs. din fond și pot fi răscumpărate în orice moment.", - "pool.manageRewardsLiquidity": "Gestionați lichiditatea în fondul de recompense", - "pool.max.label": "Max:", - "pool.maxPrice": "Pret maxim", - "pool.migrateLiquidity": "Migrați lichiditatea", - "pool.migrateLiquidityDisabledTooltip": "Acest lanț nu acceptă fonduri de lichiditate v4.", - "pool.migrateToV4": "Migrați la v4", - "pool.min.label": "Min:", - "pool.minPrice": "Preț minim", - "pool.mustBeInitialized": "Acest pool trebuie inițializat înainte de a putea adăuga lichiditate. Pentru a inițializa, selectați un preț de pornire pentru piscină. Apoi, introduceți intervalul de preț al lichidității și suma depozitului. Taxele de gaz vor fi mai mari decât de obicei din cauza tranzacției de inițializare.", - "pool.newPosition.plus": "+ Pozitie noua", - "pool.newPosition.title": "Poziție nouă", - "pool.newSpecificPosition": "Poziție nouă {{symbol}}", - "pool.noLiquidity": "Nu s-a găsit lichiditate.", - "pool.onceHappyReview": "Odată ce sunteți mulțumit de rata, faceți clic pe furnizarea de revizuire.", - "pool.openPosition": "Deschideți o poziție de piscină", - "pool.openPosition.cta": "Adăugați lichiditate la un pool și vedeți-vă pozițiile aici", - "pool.openToStart": "Deschideți o poziție nouă sau creați un grup pentru a începe.", - "pool.owner": "Proprietar", - "pool.percent": "{{pct}}% pool", - "pool.pooled": "Grupat {{sym}}:", - "pool.position": "Poziţie", - "pool.position.100": "Poziția ta va fi 100% la acest preț.", - "pool.position.100.at": "Poziția ta va fi 100% {{symbol}} la acest preț.", - "pool.position.networkConnect": "Pentru a vizualiza o poziție, trebuie să fiți conectat la rețeaua căreia îi aparține.", - "pool.position.willBe100": "Poziția ta va fi compusă 100% din {{sym}} la acest preț", - "pool.positions": "Poziții", - "pool.positions.title": "Pozițiile tale", - "pool.positions.transaction.settings": "Setări de tranzacție", - "pool.positions.usdValueUnavailable": "Valoarea USD nu este disponibilă", - "pool.positions.usdValueUnavailable.tooltip": "Valoarea USD este momentan indisponibilă pentru această poziție. Consultați detaliile poziției pentru sumele de simboluri depuse.", - "pool.priceRange": "Gama de prețuri", - "pool.rangeBadge.tooltip.outsideRange": "Prețul acestui bazin este în afara intervalului selectat de dvs. Poziția dvs. nu câștigă în prezent comisioane.", - "pool.rangeBadge.tooltip.text": "Poziția dvs. are 0 lichiditate și nu câștigă comisioane.", - "pool.rangeBadge.tooltip.withinRange": "Prețul acestui bazin se încadrează în intervalul selectat de dvs. Poziția dvs. câștigă în prezent comisioane.", - "pool.rates": "Tarife", - "pool.ratioTokenToPrice": "Raportul de jetoane pe care îl adăugați va stabili prețul acestui pool.", - "pool.refresh.prices": "Actualizează prețurile", - "pool.removeLiquidity": "Eliminați lichiditatea", - "pool.rewardsPool.label": "Jetoane din grupul de recompense:", - "pool.selectedRange": "Gama selectată", - "pool.selectPair": "Selectați perechea", - "pool.share": "Prețuri și cota de la piscină", - "pool.share.label": "Cota dvs. de piscină:", - "pool.shareOf": "Cota de fond:", - "pool.showClosed": "Afișează pozițiile închise", - "pool.specificPosition": "poziţia {{symbol}}", - "pool.startingPrice": "Începând de {{sym}} Preț:", - "pool.supply": "Livra", - "pool.supplyingMaths": "Furnizarea {{amtA}} {{symA}} și {{amtB}} {{symB}}", - "pool.tokenPair": "Pereche de jetoane", - "pool.top": "Piscine de top", - "pool.top.tvl": "Top piscine de la TVL", - "pool.totalTokens": "Numărul total de jetoane de la piscină:", - "pool.uncollectedFees": "Taxe neîncasate", - "pool.v2": "piscine v2", - "pool.v2.add": "Adăugați lichiditate V2", - "pool.v2.migratev3": "Migrați lichiditatea la V3", - "pool.v2liquidity": "Lichiditatea V2", - "pool.v3": "piscine v3", - "pool.v4": "piscine v4", - "pool.viewUncollectedFees": "Vedeți taxele și analizele neîncasate", - "pool.volOverTvl": "1D vol/TVL", - "pool.volume.thirtyDay": "Volum de 30 de zile", - "pool.volume.thirtyDay.short": "30D vol", - "pool.withdrawAs": "Retrageți ca {{nativeWrappedSymbol}}", - "pool.yourv2": "Lichiditatea dvs. V2", - "poolFinder.availablePools": "Piscine disponibile", - "poolFinder.availablePools.found.description": "v2 pool-uri care se potrivesc cu selecția dvs. de pereche.", - "poolFinder.availablePools.notFound.description": "Nu s-au găsit pool-uri v2 care se potrivesc. Verificați din nou selecția de simboluri și asigurați-vă că sunteți conectat la portofelul corect.", - "pools.approving.amount": "Se aprobă {{amount}}", - "pools.explore": "Explorează piscinele", - "position.addHook": "Adăugați un cârlig", - "position.addHook.tooltip": "Cârligele sunt o caracteristică avansată care permite grupurilor să interacționeze cu contractele inteligente, deblocând diverse capabilități. Fiți atenți când adăugați cârlige, deoarece unele pot fi rău intenționate sau pot provoca consecințe nedorite.", - "position.addingHook": "Adăugarea cârligului", - "position.addingHook.disclaimer": "Adăugarea de cârlige poate avea consecințe nedorite. Faceți-vă cercetările și continuați pe propriul risc.", - "position.addingHook.hideProperties": "Ascunde proprietățile", - "position.addingHook.invalidAddress": "Introduceți o adresă de cârlig validă", - "position.addingHook.viewProperties": "Vizualizați proprietăți", - "position.appearHere": "Poziția ta va apărea aici.", - "position.create.invalidPrice": "Preț nevalid", - "position.create.invalidRange": "Interval nevalid", - "position.create.modal.header": "Crearea poziției", - "position.currentValue": "Valoarea poziției curente", - "position.deposit.description": "Specificați sumele simbolice pentru contribuția dvs. de lichiditate.", - "position.depositedCurrency": "Depus {{currencySymbol}}", - "position.hook.disclaimer": "Înțeleg potențialele riscuri implicate în adăugarea acestui cârlig.", - "position.hook.donateWarning": "Acest semnalizare poate duce la modificări ale taxelor câștigate.", - "position.hook.liquidityWarning": "Acest indicator poate determina ca pool-ul să blocheze adăugarea de noi lichidități. Tranzacția dvs. poate reveni.", - "position.hook.removeWarning": "Poate cauza blocarea fondurilor sau blocarea taxelor.", - "position.hook.swapWarning": "Acest indicator poate permite furnizorilor de lichidități să folosească mai ușor lichiditatea Just-In-Time, ceea ce poate duce la comisioane câștigate mai mici.", - "position.hook.warningHeader": "Important: riscurile legate de cârlig identificate", - "position.hook.warningInfo": "Am identificat riscuri potențiale cu acest cârlig. Vă rugăm să vă asigurați că înțelegeți cum funcționează acest cârlig înainte de a decide să continuați.", - "position.initialPrice": "Pretul initial", - "position.initialPrice.info": "Setați cursul de schimb inițial între cele două jetoane pe care le furnizați.", - "position.migrate.liquidity": "Când migrați pozițiile, nu vă puteți schimba perechea de jetoane, dar puteți adăuga un cârlig pentru a îmbunătăți funcționalitatea.", - "position.migrate.v4unsupportedChain": "Acest lanț nu este acceptat pentru pool-urile v4.", - "position.new": "Poziție nouă", - "position.new.protocol": "Poziție nouă {{protocol}}", - "position.noLiquidity": "Datele de lichiditate nu sunt disponibile.", - "position.noLiquidityData": "Nu există date de lichiditate.", - "position.notFound": "Poziția nu a fost găsită", - "position.notFound.description": "Detalii despre această poziție nu sunt disponibile. Vă rugăm să verificați dacă sunteți conectat cu portofelul corect.", - "position.protocol": "poziţia {{protocol}}", - "position.provide.liquidity": "Alegeți jetoanele pentru care doriți să furnizați lichiditate. Puteți selecta jetoane pe toate rețelele acceptate.", - "position.provide.liquidityDescription": "Furnizarea de lichiditate completă asigură participarea continuă pe piață la toate prețurile posibile, oferind simplitate, dar cu potențial de pierdere temporară mai mare.", - "position.provide.liquidityDescription.custom": "Gama personalizată vă permite să vă concentrați lichiditatea în limite specifice de preț, sporind eficiența capitalului și câștigurile din comisioane, dar necesitând o gestionare mai activă.", - "position.removeHook": "Scoateți cârligul", - "position.resetDescription": "Selecțiile dvs. de jetoane, preț și intervale vor fi resetate.", - "position.setRange": "Setați intervalul de preț", - "position.setRange.inputsBelow": "Utilizați intrările de mai jos pentru a vă seta intervalul.", - "position.step.deposit": "Introduceți sumele de depozit", - "position.step.price": "Setați prețul inițial", - "position.step.range": "Setați intervalul de preț", - "position.step.select": "Selectați perechea de jetoane și taxe", - "position.value": "Valoarea poziției", - "position.valueUnavailable": "Valoarea USD este momentan indisponibilă pentru această poziție. Consultați detaliile poziției pentru sumele de simboluri depuse.", - "position.your": "Pozitia ta", - "positions.welcome": "Bine ați venit la pozițiile dvs", - "positions.welcome.connect": "Conectați-vă portofelul pentru a vă vedea pozițiile curente.", - "privacy.anonymizedLogs": "Aplicația înregistrează statistici de utilizare anonimizate pentru a se îmbunătăți în timp.", - "privacy.autoRouter": "Aplicația preia ruta comercială optimă de pe un server Uniswap Labs.", - "privacy.infura": "Aplicația preia date în lanț și construiește apeluri contractuale cu un API Infura.", - "privacy.thirdPartyApis": "Această aplicație folosește următoarele API-uri terță parte:", - "privacy.trm": "Aplicația vă colectează în siguranță adresa portofelului și o partajează cu TRM Labs Inc. din motive de risc și de conformitate.", - "privacy.uniswaptos": "Termenii și condițiile Uniswap Labs", - "qrScanner.button.connections_one": "1 aplicație conectată", - "qrScanner.button.connections_other": "{{count}} aplicații conectate", - "qrScanner.error.camera.message": "Pentru a scana un cod, permiteți accesul la Cameră în setările de sistem", - "qrScanner.error.camera.title": "Camera este dezactivată", - "qrScanner.error.none": "Nu a fost găsit niciun cod QR", - "qrScanner.recipient.action.scan": "Scanați un cod QR", - "qrScanner.recipient.action.show": "Arată-mi codul QR", - "qrScanner.recipient.error.message": "Asigurați-vă că scanați un cod QR valid de adresă Ethereum înainte de a încerca din nou.", - "qrScanner.recipient.error.title": "Cod QR nevalid", - "qrScanner.request.message.unavailable": "Nu a fost găsit niciun mesaj.", - "qrScanner.request.method.default": "Solicitare de la {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "Solicitare de semnătură de la {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "Solicitare de tranzacție de la {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "Permite {{dappName}} să utilizeze până la {{amount}} {{currencySymbol}}?", - "qrScanner.request.withoutAmount": "Permiteți lui {{dappName}} să utilizeze {{currencySymbol}}?", - "qrScanner.status.connecting": "Se conectează...", - "qrScanner.status.loading": "Se încarcă...", - "qrScanner.title": "Scanați un cod QR", - "qrScanner.wallet.networks": "Rețele acceptate", - "qrScanner.wallet.title": "Puteți trimite și primi jetoane și NFT-uri pe toate rețelele noastre acceptate de {{numOfNetworks}} .", - "range.outOfView": "Raza în afara vederii", - "removeLiquidity.collectFees": "De asemenea, veți încasa taxele câștigate din această poziție.", - "removeLiquidity.outputEstimated": "Ieșirea este estimată. Dacă prețul se modifică cu mai mult de {{allowed}}%, tranzacția dvs. se va reveni.", - "removeLiquidity.pendingText": "Se elimină {{amtA}} {{symA}} și {{amtB}} {{symB}}", - "removeLiquidity.pooled": "Grupat {{symbol}}:", - "removeLiquidity.removing": "Se elimină {{amt1}} {{symbol1}} și {{amt2}} {{symbol2}}", - "removeLiquidity.removingTokensTip": "Sfat: eliminarea jetoanelor de grup vă transformă poziția înapoi în jetoane de bază la rata actuală, proporțională cu cota dvs. din pool. Taxele neîncasate sunt incluse în sumele pe care le primiți.", - "removeLiquidity.uniBurned": "UNI {{a}}/{{b}} Ars", - "revoke.failed.message": "Acest lucru oferă protocolul Uniswap acces la jetonul dvs. pentru tranzacționare.", - "routing.aggregateLiquidity": "Când este disponibil, cumulează sursele de lichiditate pentru prețuri mai bune și swap fără gaz.", - "routing.cheapest": "Clientul Uniswap selectează cea mai ieftină opțiune de tranzacționare factoring prețul și costurile de rețea.", - "routing.cheapest.v4": "Clientul Uniswap selectează opțiunea de tranzacționare optimă luând în considerare prețul și costurile de rețea.", - "scantastic.code.expired": "Expirat", - "scantastic.code.subtitle": "Introduceți acest cod în extensia Uniswap. Fraza dvs. de recuperare va fi criptată și transferată în siguranță.", - "scantastic.code.timeRemaining.shorthand.hours": "Cod nou în {{hours}}h {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.minutes": "Cod nou în {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.seconds": "Cod nou în {{seconds}}s", - "scantastic.code.title": "Cod unic de schimb unic", - "scantastic.confirmation.button.continue": "Da, continua", - "scantastic.confirmation.label.browser": "Browser", - "scantastic.confirmation.label.device": "Dispozitiv", - "scantastic.confirmation.subtitle": "Continuați doar dacă scanați un cod QR de la Extensia Uniswap pe un dispozitiv de încredere.", - "scantastic.confirmation.title": "Încercați să vă importați portofelul?", - "scantastic.confirmation.warning": "Atenție la site-urile și aplicațiile care usurează identitatea Uniswap. În caz contrar, portofelul dvs. poate fi compromis.", - "scantastic.error.encryption": "Nu s-a putut pregăti fraza de bază.", - "scantastic.error.noCode": "Nu s-a primit OTP. Vă rugăm să încercați din nou.", - "scantastic.error.timeout.message": "Scanați din nou codul QR de pe extensia Uniswap pentru a continua sincronizarea portofelului.", - "scantastic.error.timeout.title": "Conexiunea dvs. a expirat", - "scantastic.modal.ipMismatch.description": "Pentru a scana acest cod QR, telefonul trebuie să fie conectat la aceeași rețea WiFi ca computerul și orice VPN ar trebui să fie temporar oprit.", - "scantastic.modal.ipMismatch.title": "Schimbați-vă rețeaua WiFi", - "search.chainComing": "În curând: căutați și explorați jetoane pe lanțul {{chainName}}", - "search.results.count_one": "1 articol", - "search.results.count_other": "{{count}} articole", - "search.ukDisclaimer": "Disclaimer pentru rezidenții din Marea Britanie", - "send.button.review": "Examinați transferul", - "send.gas.error.title": "N / A", - "send.gas.networkCost.title": "Costul rețelei", - "send.input.token.balance.title": "Sold: {{balance}} {{symbol}}", - "send.recipient.header": "Selectați destinatarul", - "send.recipient.input.placeholder": "Căutați ENS sau adresa", - "send.recipient.previous_one": "1 transfer anterior", - "send.recipient.previous_other": "{{count}} transferuri anterioare", - "send.recipient.results.empty": "Nici un rezultat gasit", - "send.recipient.results.error": "Adresa pe care ați introdus-o fie nu există, fie este scrisă greșit.", - "send.recipient.section.favorite": "Portofelele preferate", - "send.recipient.section.recent": "Recent", - "send.recipient.section.search": "Rezultatele cautarii", - "send.recipient.section.viewOnly": "Portofele pentru vizualizare", - "send.recipient.section.yours": "Portofelele tale", - "send.recipient.warning.viewOnly.message": "Trimiteți fonduri către acest portofel numai dacă aveți expresia de recuperare sau cunoașteți proprietarul portofelului.", - "send.recipient.warning.viewOnly.title": "Aveți asta ca portofel numai pentru vizualizare", - "send.recipientSelect.search.empty.message": "Când trimiteți jetoane la o adresă de portofel, acestea vor apărea aici", - "send.recipientSelect.search.empty.title": "Niciun portofel salvat", - "send.review.modal.title": "Tu trimiți", - "send.review.summary.button.title": "Confirmați trimiterea", - "send.search.empty.subtitle": "Adresa pe care ați introdus-o fie nu există, fie este scrisă greșit.", - "send.search.empty.title": "Nici un rezultat gasit", - "send.search.placeholder": "Căutați ENS sau adresa", - "send.title": "Trimite", - "send.warning.blocked.default": "Acest portofel este blocat", - "send.warning.blocked.modal.message": "Această adresă este blocată pe Uniswap Wallet deoarece este asociată cu una sau mai multe activități blocate. Dacă credeți că aceasta este o eroare, vă rugăm să trimiteți un e-mail la compliance@uniswap.org.", - "send.warning.blocked.modal.title": "Adresă blocată", - "send.warning.blocked.recipient": "Portofelul destinatarului este blocat", - "send.warning.erc20.message": "Încercați să trimiteți fonduri la o adresă indicativă. Trimiterea criptografică la acest tip de adresă poate duce la o pierdere permanentă de fonduri.", - "send.warning.erc20.title": "Aceasta este o adresă simbol", - "send.warning.insufficientFunds.message": "Soldul dvs. de {{currencySymbol}} a scăzut de când ați introdus suma pe care doriți să o trimiteți", - "send.warning.insufficientFunds.title": "Nu este suficient {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "Nu este suficient {{currencySymbol}} pe {{networkName}} pentru a trimite", - "send.warning.insufficientGas.message.withoutNetwork": "Nu este suficient {{currencySymbol}} pentru a trimite", - "send.warning.modal.button.cta.blocking": "Bine", - "send.warning.modal.button.cta.cancel": "Anulare", - "send.warning.modal.button.cta.confirm": "A confirma", - "send.warning.newAddress.details.ENS": "ENS", - "send.warning.newAddress.details.username": "Nume de utilizator", - "send.warning.newAddress.details.walletAddress": "Adresa portofel", - "send.warning.newAddress.message": "Nu ați făcut tranzacții cu această adresă până acum. Vă rugăm să confirmați că adresa este corectă înainte de a continua.", - "send.warning.newAddress.title": "Adresa noua", - "send.warning.restore": "Restabiliți-vă portofelul pentru a trimite", - "send.warning.self.message": "Încercați să trimiteți fonduri în portofelul dvs. actual. Trimiterea criptografiei la această adresă va implica costuri inutile de rețea.", - "send.warning.self.title": "Acesta este portofelul dvs. actual", - "send.warning.smartContract.message": "Sunteți pe cale să trimiteți jetoane la un tip special de adresă - un contract inteligent. Verificați de două ori dacă este adresa la care intenționați să o trimiteți. Dacă este greșit, jetoanele tale ar putea fi pierdute pentru totdeauna.", - "send.warning.smartContract.title": "Aceasta este o adresă de portofel?", - "send.warning.viewOnly.message": "Trebuie să importați acest portofel prin expresia de recuperare pentru a trimite active.", - "send.warning.viewOnly.title": "Acest portofel este doar pentru vizualizare", - "sendRecipientForm.recentAddresses.label": "Recente", - "sendReviewModal.title": "Trimitere recenzie", - "setting.recoveryPhrase.account.show": "Afișați fraza de recuperare", - "setting.recoveryPhrase.action.hide": "Ascundeți expresia de recuperare", - "setting.recoveryPhrase.remove": "Eliminați fraza de recuperare", - "setting.recoveryPhrase.remove.confirm.subtitle": "Înțeleg că Uniswap Labs nu mă poate ajuta să-mi recuperez portofelul dacă nu reușesc să fac acest lucru.", - "setting.recoveryPhrase.remove.confirm.title": "Mi-am salvat fraza de recuperare", - "setting.recoveryPhrase.remove.initial.subtitle": "Asigurați-vă că ați salvat expresia de recuperare. În caz contrar, veți pierde accesul la portofelele dvs", - "setting.recoveryPhrase.remove.initial.title": "Înainte de a continua", - "setting.recoveryPhrase.remove.password.error": "Parola gresita. Încearcă din nou", - "setting.recoveryPhrase.remove.subtitle": "Introduceți parola pentru a confirma", - "setting.recoveryPhrase.remove.title": "Îți elimini expresia de recuperare ", - "setting.recoveryPhrase.title": "Fraza ta de recuperare", - "setting.recoveryPhrase.view.warning.message1": "Oricine vă cunoaște expresia de recuperare vă poate accesa portofelul și fondurile", - "setting.recoveryPhrase.view.warning.message2": "Vedeți asta în privat", - "setting.recoveryPhrase.view.warning.message3": "Nu împărtăși cu nimeni", - "setting.recoveryPhrase.view.warning.message4": "Nu îl introduceți niciodată pe niciun site web sau aplicație", - "setting.recoveryPhrase.view.warning.title": "Înainte de a continua", - "setting.recoveryPhrase.warning.screenshot.message": "Oricine are acces la fotografiile tale poate accesa portofelul tău. Vă recomandăm să vă scrieți cuvintele.", - "setting.recoveryPhrase.warning.screenshot.title": "Capturile de ecran nu sunt sigure", - "setting.recoveryPhrase.warning.view.message": "Oricine vă cunoaște expresia de recuperare vă poate accesa portofelul și fondurile.", - "setting.recoveryPhrase.warning.view.title": "Vizualizați acest lucru într-un loc privat", - "settings.action.enableInSettings": "Activați în Setări", - "settings.action.feedback": "Distribuiți feedback", - "settings.action.help": "Obține ajutor", - "settings.action.lock": "Blocați portofelul", - "settings.action.privacy": "Politica de confidențialitate", - "settings.action.terms": "Termenii serviciului", - "settings.footer": "Făcut cu dragoste, \nUniswap Team 🦄", - "settings.hideSmallBalances": "Ascunde soldurile mici", - "settings.maxSlippage": "Max. alunecare", - "settings.screen.appearance.title": "Aspect", - "settings.section.about": "Despre", - "settings.section.preferences": "Preferințe", - "settings.section.security": "Securitate", - "settings.section.support": "A sustine", - "settings.section.wallet.button.viewAll": "A vedea tot", - "settings.section.wallet.button.viewLess": "Vedeți mai puțin", - "settings.section.wallet.label.viewOnly": "Doar vizualizare", - "settings.section.wallet.title": "Setări portofel", - "settings.setting.appearance.option.auto": "Auto", - "settings.setting.appearance.option.dark.subtitle": "Utilizați întotdeauna modul întunecat", - "settings.setting.appearance.option.dark.title": "Modul întunecat", - "settings.setting.appearance.option.device.subtitle": "Implicit la aspectul dispozitivului dvs", - "settings.setting.appearance.option.device.title": "Setările dispozitivului", - "settings.setting.appearance.option.light.subtitle": "Utilizați întotdeauna modul de lumină", - "settings.setting.appearance.option.light.title": "Modul de lumină", - "settings.setting.appearance.title": "Aspect", - "settings.setting.backup.create.description": "Setarea unei parole va cripta copia de rezervă a frazei de recuperare, adăugând un nivel suplimentar de protecție dacă contul dvs. {{cloudProviderName}} este vreodată compromis.", - "settings.setting.backup.create.title": "Faceți backup la {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "Deoarece aceste portofele partajează o expresie de recuperare, vor șterge și copiile de rezervă pentru aceste portofele de mai jos", - "settings.setting.backup.delete.confirm.title": "Esti sigur?", - "settings.setting.backup.delete.warning": "Dacă ștergeți copia de rezervă {{cloudProviderName}} , veți putea recupera portofelul numai cu o copie de rezervă manuală a frazei de recuperare. Uniswap Labs nu vă poate recupera activele dacă vă pierdeți expresia de recuperare.", - "settings.setting.backup.error.message.full": "Nu se poate face backup pentru fraza de recuperare în {{cloudProviderName}}. Asigurați-vă că ați activat {{cloudProviderName}} cu spațiu de stocare disponibil și încercați din nou.", - "settings.setting.backup.error.message.short": "Nu se poate șterge backupul", - "settings.setting.backup.error.title": "eroare {{cloudProviderName}}", - "settings.setting.backup.modal.description": "Încă nu ați făcut backup pentru fraza de recuperare în {{cloudProviderName}} . Procedând astfel, vă puteți recupera portofelul doar dacă vă conectați la {{cloudProviderName}} de pe orice dispozitiv.", - "settings.setting.backup.modal.title": "Faceți backup pentru fraza de recuperare în {{cloudProviderName}}?", - "settings.setting.backup.password.error.mismatch": "parolele nu se potrivesc", - "settings.setting.backup.password.medium": "Aceasta este o parolă medie", - "settings.setting.backup.password.placeholder.confirm": "Confirmă parola", - "settings.setting.backup.password.placeholder.create": "Creaza parola", - "settings.setting.backup.password.strong": "Aceasta este o parolă puternică", - "settings.setting.backup.password.weak": "Aceasta este o parolă slabă", - "settings.setting.backup.recoveryPhrase.label": "Fraza de recuperare", - "settings.setting.backup.selected": "{{cloudProviderName}} copie de rezervă", - "settings.setting.backup.status.action.delete": "Ștergeți backupul", - "settings.setting.backup.status.complete": "S-a făcut backup până la {{cloudProviderName}}", - "settings.setting.backup.status.description": "Făcând o copie de rezervă a frazei de recuperare la {{cloudProviderName}}, vă puteți recupera portofelul doar dacă vă conectați la contul dvs. {{cloudProviderName}} pe orice dispozitiv.", - "settings.setting.backup.status.inProgress": "Se face backup la {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "A făcut rezervă", - "settings.setting.backup.status.title": "{{cloudProviderName}} copie de rezervă", - "settings.setting.beta.tooltip": "In curand", - "settings.setting.biometrics.appAccess.subtitle.android": "Solicitați datele biometrice pentru a deschide aplicația", - "settings.setting.biometrics.appAccess.subtitle.ios": "Necesită {{biometricsMethod}} pentru a deschide aplicația", - "settings.setting.biometrics.appAccess.title": "Acces la aplicație", - "settings.setting.biometrics.auth": "Vă rugăm să vă autentificați", - "settings.setting.biometrics.off.message.android": "Biometria este în prezent dezactivată pentru Uniswap Wallet — o puteți activa în setările sistemului.", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} este în prezent dezactivat pentru Uniswap Wallet — îl puteți activa în setările sistemului.", - "settings.setting.biometrics.off.title.android": "Biometria este dezactivată", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} este dezactivat", - "settings.setting.biometrics.title": "Biometrie", - "settings.setting.biometrics.transactions.subtitle.android": "Solicitați datele biometrice pentru a tranzacționa", - "settings.setting.biometrics.transactions.subtitle.ios": "Necesită {{biometricsMethod}} pentru a tranzacționa", - "settings.setting.biometrics.transactions.title": "Tranzacții", - "settings.setting.biometrics.unavailable.message.android": "Biometria nu este configurată pe dispozitivul dvs. Pentru a utiliza datele biometrice, configurați-o mai întâi în Setări.", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} nu este configurat pe dispozitivul dvs. Pentru a utiliza {{biometricsMethod}}, configurați-l mai întâi în Setări.", - "settings.setting.biometrics.unavailable.title.android": "Biometria nu este configurată", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} nu este configurat", - "settings.setting.biometrics.warning.message.android": "Dacă nu activați datele biometrice, oricine obține acces la dispozitivul dvs. poate deschide Uniswap Wallet și poate face tranzacții.", - "settings.setting.biometrics.warning.message.ios": "Dacă nu activați {{biometricsMethod}}, oricine obține acces la dispozitivul dvs. poate deschide Uniswap Wallet și poate face tranzacții.", - "settings.setting.biometrics.warning.title": "Esti sigur?", - "settings.setting.connections.disconnectAll": "Deconectați toate", - "settings.setting.connections.noConnectionsDescription": "Conectați-vă la o aplicație căutând un buton „Conectați portofel” sau „Conectați-vă”.", - "settings.setting.currency.title": "Monedă locală", - "settings.setting.hapticTouch.title": "Atingere haptică", - "settings.setting.helpCenter.title": "Centru de ajutor", - "settings.setting.language.button.navigate": "Mergi la Setari", - "settings.setting.language.description.extension": "Uniswap are setările implicite pentru limba sistemului. Pentru a schimba limba preferată, accesați setările sistemului.", - "settings.setting.language.description.mobile": "Uniswap este implicit la setările de limbă ale dispozitivului dvs. Pentru a schimba limba preferată, accesați „Uniswap” în setările dispozitivului și atingeți „Limbă”.", - "settings.setting.language.title": "Limba", - "settings.setting.notifications.row.activity.description": "Transferuri, solicitări și alte activități", - "settings.setting.notifications.row.activity.title": "Activitate din portofel", - "settings.setting.notifications.row.priceAlerts.description": "Schimbări mari de preț pentru jetoanele preferate", - "settings.setting.notifications.row.priceAlerts.title": "Alerte de preț", - "settings.setting.notifications.row.updates.description": "Recomandări și funcții noi", - "settings.setting.notifications.row.updates.title": "Actualizări de la Uniswap", - "settings.setting.notifications.title": "Notificări", - "settings.setting.password.title": "Schimbaţi parola", - "settings.setting.privacy.analytics.description": "Folosim date anonime de utilizare pentru a vă îmbunătăți experiența în produsele Uniswap Labs. Când este dezactivată, urmărim doar erorile și utilizarea esențială.", - "settings.setting.privacy.analytics.title": "Permite analize", - "settings.setting.privacy.title": "Confidențialitate", - "settings.setting.recoveryPhrase.password.title": "Introduceți parola", - "settings.setting.recoveryPhrase.title": "Fraza de recuperare", - "settings.setting.smallBalances.title": "Ascunde soldurile mici", - "settings.setting.unknownTokens.title": "Ascundeți jetoanele necunoscute", - "settings.setting.wallet.action.editLabel": "Editați eticheta", - "settings.setting.wallet.action.editProfile": "Editează profilul", - "settings.setting.wallet.action.remove": "Scoateți portofelul", - "settings.setting.wallet.connections.title": "Conexiuni", - "settings.setting.wallet.editLabel.description": "Etichetele nu sunt publice. Sunt stocate local și sunt vizibile numai pentru dvs.", - "settings.setting.wallet.editLabel.save": "Salvează modificările", - "settings.setting.wallet.label": "Poreclă", - "settings.setting.wallet.testnetMode.description": "Acest lucru activează rețelele de testare pentru ca dezvoltatorii să încerce funcții și tranzacții fără a utiliza active reale. Tokenurile de pe rețelele de testare nu au nicio valoare reală.", - "settings.setting.wallet.testnetMode.title": "Modul Testnet", - "settings.switchNetwork.warning": "Pentru a utiliza Uniswap pe {{label}}, comutați rețeaua în setările portofelului.", - "settings.title": "Setări", - "settings.version": "Versiunea {{appVersion}}", - "speedBump.newAddress.warning.description": "Nu ați făcut tranzacții cu această adresă până acum. Asigurați-vă că este adresa corectă înainte de a continua.", - "speedBump.newAddress.warning.title": "Adresa noua", - "speedBump.smartContractAddress.warning.description": "Sunteți pe cale să trimiteți jetoane la un tip special de adresă - un contract inteligent. Verificați de două ori dacă este adresa la care intenționați să o trimiteți. Dacă este greșit, jetoanele dvs. ar putea fi pierdute pentru totdeauna.", - "speedBump.smartContractAddress.warning.title": "Aceasta este o adresă de portofel?", - "stats.24fees": "Taxe 24 de ore", - "stats.24volume": "Volum 24 ore", - "stats.allTimeFees": "Taxele LP tot timpul", - "stats.allTimeSwappers": "Schimbători de timp", - "stats.allTimeVolume": "Volumul tot timpul", - "stats.fdv": "FDV", - "stats.fdv.description": "Evaluarea complet diluată (FDV) calculează valoarea totală de piață presupunând că toate jetoanele sunt în circulație.", - "stats.marketCap": "Capitalizarea pieței", - "stats.marketCap.description": "Capitalizarea pieței este valoarea totală de piață a ofertei circulante a unui activ.", - "stats.tvl": "Valoarea totală blocată", - "stats.tvl.description": "Valoarea totală blocată (TVL) este valoarea totală a activului disponibil în toate fondurile de lichiditate Uniswap v3.", - "stats.volume.1d": "Volum de 1 zile", - "stats.volume.1d.description": "Volumul pentru 1 zi este valoarea activului care a fost tranzacționat pe Uniswap v3 în ultimele 24 de ore.", - "stats.volume.1d.short": "1D vol", - "stats.volume.description": "Volumul este valoarea activului care a fost tranzacționat pe Uniswap v3 în intervalul de timp selectat.", - "swap.allow.oneTime": "Permite {{sym}} (o singură dată)", - "swap.approvalNeeded": "Este necesară o aprobare pentru a utiliza acest simbol. ", - "swap.approvalPending": "În curs de aprobare", - "swap.approveAndSubmit": "Aprobați și trimiteți", - "swap.approveAndSwap": "Aprobați și schimbați", - "swap.approveInWallet": "Aprobați în portofel", - "swap.balance.amount": "Sold: {{amount}}", - "swap.bestRoute.cost": "Se estimează că cea mai eficientă rută costă ~{{gasPrice}} în costuri de rețea. ", - "swap.details.estimatedTime": "EST. timp", - "swap.bridging.title": "Schimbarea între rețele", - "swap.bridging.warning.description": "Schimbați de la {{fromNetwork}} la {{toNetwork}}. Acest lucru este cunoscut și sub denumirea de „punte”, care vă mută jetoanele de la o rețea la alta.", - "swap.button.max": "Max", - "swap.button.review": "Revizuire", - "swap.button.submitting": "Se trimite schimbul...", - "swap.button.submitting.keep.open": "Ține-ți portofelul deschis...", - "swap.button.swap": "Schimbați", - "swap.button.swapAnyways": "Schimbați oricum", - "swap.button.unwrap": "Desfaceți", - "swap.button.wrap": "Înfășurați", - "swap.buy.countryModal.placeholder": "Căutați după țară sau regiune", - "swap.cancel.cannotExecute_one": "Schimbul dvs. se poate executa înainte ca anularea să fie procesată. Costurile de rețea nu pot fi rambursate. Doresti sa continui?", - "swap.cancel.cannotExecute_other": "Schimburile dvs. se pot executa înainte ca anularea să fie procesată. Costurile de rețea nu pot fi rambursate. Doresti sa continui?", - "swap.confirmLimit": "Confirmați limita", - "swap.confirmSwap": "Confirmați schimbul", - "swap.deadline.settings.title": "Termenul limită pentru tranzacție", - "swap.deadline.settings.title.short": "Tx. Termen limită", - "swap.details.feeOnTransfer": "{{tokenSymbol}} taxă", - "swap.details.feeOnTransfer.default": "Taxa de simbol", - "swap.details.newQuote.input": "Intrare nouă", - "swap.details.newQuote.output": "Ieșire nouă", - "swap.details.orderRouting": "Dirijarea comenzilor", - "swap.details.orderRoutingInfo": "Acest schimb este direcționat prin Across, un protocol descentralizat care mută activele peste rețele, acordând prioritate siguranței, execuției rapide și prețurilor scăzute.", - "swap.details.poweredBy": "Cu sprijinul", - "swap.details.rate": "Rată", - "swap.details.slippage": "Alunecare maximă", - "swap.details.uniswapFee": "Taxa", - "swap.enterAmount": "Introduceți suma de {{sym}}", - "swap.error.default": "Poate fi necesar să vă măriți toleranța la alunecare. Notă: jetoanele cu taxă la transfer și rebase sunt incompatibile cu Uniswap V3.", - "swap.error.expectedToFail": "Se așteaptă ca schimbul dvs. să eșueze.", - "swap.error.modifiedByWallet": "Schimbul dvs. a fost modificat prin portofel. Dacă aceasta a fost o greșeală, vă rugăm să anulați imediat sau riscați să vă pierdeți fondurile.", - "swap.error.rejected": "Tranzacție respinsă", - "swap.error.undefinedObject": "A apărut o eroare la încercarea de a executa această schimbare. Poate fi necesar să vă măriți toleranța la alunecare. Dacă acest lucru nu funcționează, poate exista o incompatibilitate cu simbolul pe care îl tranzacționați. Notă: jetoanele cu taxă la transfer și rebase sunt incompatibile cu Uniswap V3.", - "swap.error.unknown": "Eroare necunoscută.", - "swap.error.v2.expired": "Această tranzacție nu a putut fi trimisă deoarece termenul limită a depășit. Vă rugăm să verificați dacă termenul limită pentru tranzacție nu este prea mic.", - "swap.error.v2.k": "Invariantul Uniswap x*y=k nu a fost satisfăcut de swap. Acest lucru înseamnă de obicei că unul dintre jetoanele pe care le schimbați încorporează un comportament personalizat la transfer.", - "swap.error.v2.slippage": "Această tranzacție nu va reuși nici din cauza mișcării prețului, nici din cauza taxei de transfer. Încercați să vă creșteți toleranța la alunecare", - "swap.error.v2.transferInput": "Jetonul de intrare nu poate fi transferat. Este posibil să existe o problemă cu simbolul de intrare.", - "swap.error.v2.transferOutput": "Jetonul de ieșire nu poate fi transferat. Poate exista o problemă cu jetonul de ieșire.", - "swap.error.v3.slippage": "Această tranzacție nu va reuși din cauza mișcării prețului. Încercați să vă creșteți toleranța la alunecare. Notă: taxa pentru transfer și jetoanele de rebazare sunt incompatibile cu Uniswap V3.", - "swap.error.v3.transferOutput": "Jetonul de ieșire nu poate fi transferat. Poate exista o problemă cu jetonul de ieșire. Notă: taxa pentru transfer și jetoanele de rebazare sunt incompatibile cu Uniswap V3.", - "swap.estimatedDifference.label": "Va exista o mare diferență între valorile de intrare și de ieșire din cauza lichidității curente.", - "swap.fail.message": "Încercați să ajustați alunecarea la o valoare mai mare.", - "swap.fail.uniswapX": "Schimbarea nu a putut fi finalizată cu UniswapX. Încercați din nou schimbul pentru a-l ruta prin API-ul clasic Uniswap.", - "swap.fees.experience": "Această taxă se aplică unor perechi de jetoane pentru a asigura cea mai bună experiență cu Uniswap. Este plătit în simbolul de ieșire și a fost deja luat în considerare în cotație.", - "swap.fees.noFee": "Taxele sunt aplicate pe anumite perechi de jetoane pentru a asigura cea mai bună experiență cu Uniswap. Nu există nicio taxă asociată cu acest swap.", - "swap.fetchingBestPrice": "Se aduc cel mai bun preț...", - "swap.fetchingPrice": "Se aduc prețul...", - "swap.finalizingQuote": "Se finalizează oferta...", - "swap.form.header": "Schimbați", - "swap.form.insufficientLiquidity": "Lichiditate insuficientă pentru această tranzacție.", - "swap.form.pocketUniverseExtension.warning": "Extensia Pocket Universe încalcă prin modificarea produsului nostru într-un mod care induce în eroare și ar putea dăuna utilizatorilor. Dezactivați extensia și reîncărcați pagina.", - "swap.form.warning.output.fotFees": "Datorită taxei simbolice de {{fotCurrencySymbol}}, sumele swap pot fi introduse numai folosind câmpul de introducere", - "swap.form.warning.output.fotFees.fallback": "Datorită taxelor de simbol, sumele swap pot fi introduse numai folosind câmpul de introducere", - "swap.form.warning.restore": "Restaurați-vă portofelul pentru a schimba", - "swap.frontrun.warning": "Tranzacția dvs. poate fi în avans și poate duce la o tranzacție nefavorabilă.", - "swap.header.viewOnly": "Doar vizualizare", - "swap.impactOfTrade": "Impactul pe care îl are tranzacția dvs. asupra prețului de piață al acestui pool.", - "swap.inputEstimated.atMost": "Intrarea este estimată. Veți vinde cel mult sau tranzacția va reveni.", - "swap.limit": "Limită", - "swap.limitedAssets.warning": "Unele active nu sunt disponibile prin această interfață, deoarece este posibil să nu funcționeze bine cu contractele inteligente sau nu putem permite tranzacționarea din motive legale.", - "swap.limitFilled": "Limită umplută!", - "swap.limitSubmitted": "Limită trimisă", - "swap.marketPrice.outsideRange.label": "Prețul de piață este în afara intervalului de preț specificat. Doar depozit pentru un singur activ.", - "swap.maxPriceSlip.revert": "Suma maximă pe care sunteți garantat să o cheltuiți. Dacă prețul scade și mai mult, tranzacția dvs. va reveni.", - "swap.minPriceSlip.revert": "Dacă prețul se mișcă astfel încât să primiți mai puțin de {{amount}}, tranzacția dvs. va reveni.", - "swap.networkCost.paidIn": "Costul rețelei este plătit în {{sym}} pe rețeaua {{chainName}} pentru a tranzacționa.", - "swap.orderRouting": "Dirijarea comenzilor", - "swap.outputEstimated.atLeast": "Ieșirea este estimată. Veți primi cel puțin sau tranzacția va reveni.", - "swap.payAnyway": "Plătește oricum", - "swap.payAtMost": "Plătește cel mult", - "swap.payWith": "Plateste cu", - "swap.placeOrder": "Plasați comanda", - "swap.priceImpact": "Impactul prețului", - "swap.receive.atLeast": "Primește cel puțin", - "swap.request.title.full": "Schimbați {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "Schimbați jetoane", - "swap.review": "Schimb de recenzii", - "swap.review.summary": "Schimbați", - "swap.reviewLimit": "Limita de revizuire", - "swap.route.optimizedGasCost": "Această rută ia în considerare rutele împărțite, hopurile multiple și costurile de rețea ale fiecărui pas.", - "swap.settings.deadline.tooltip": "Tranzacția dvs. va reveni dacă este în așteptare mai mult de această perioadă de timp. (Maximum: 3 zile).", - "swap.settings.deadline.warning": "Termen mare", - "swap.settings.protection.description": "Cu protecția swap activată, tranzacțiile dvs. Ethereum vor fi protejate de atacurile tip sandwich, cu șanse reduse de eșec.", - "swap.settings.protection.subtitle.supported": "{{chainName}} Rețea", - "swap.settings.protection.subtitle.unavailable": "Nu este disponibil pe {{chainName}}", - "swap.settings.protection.title": "Protecție la schimb", - "swap.settings.routingPreference.option.default.description": "Selectarea acestei opțiuni identifică cea mai eficientă rută pentru schimbul dvs.", - "swap.settings.routingPreference.option.default.description.preV4": "Clientul Uniswap selectează cea mai ieftină opțiune de tranzacționare luând în considerare prețul și costurile de rețea.", - "swap.settings.routingPreference.option.default.tooltip": "O rută este identificată luând în considerare v2, v3 și anumite grupuri v4, luând în considerare impactul estimat al prețului și costurile de rețea.", - "swap.settings.routingPreference.option.v2.title": "piscine v2", - "swap.settings.routingPreference.option.v3.title": "piscine v3", - "swap.settings.routingPreference.option.v4.title": "piscine v4", - "swap.settings.routingPreference.title": "Opțiuni comerciale", - "swap.settings.slippage.alert": "Alunecare mare", - "swap.settings.slippage.control.auto": "Auto", - "swap.settings.slippage.description": "Tranzacția dvs. va reveni dacă prețul se modifică mai mult decât procentul de alunecare.", - "swap.settings.slippage.input.message": "Dacă prețul scade și mai mult, tranzacția dvs. va reveni. Mai jos este suma minimă pe care sunteți garantat să o primiți.", - "swap.settings.slippage.input.receive.title": "Primește cel puțin", - "swap.settings.slippage.output.message": "Dacă prețul scade și mai mult, tranzacția dvs. va reveni. Mai jos este suma maximă pe care ar trebui să o cheltuiți.", - "swap.settings.slippage.output.spend.title": "Cheltuiește cel mult", - "swap.settings.slippage.warning": "Alunecare foarte mare", - "swap.settings.slippage.warning.description": "Alunecarea peste 20% este probabil să aibă ca rezultat o tranzacție nefavorabilă. Pentru a reduce riscul de a fi în avans, reduceți setările.", - "swap.settings.slippage.warning.hover": "Acest lucru poate duce la o tranzacție nefavorabilă. Încercați să reduceți setarea de alunecare.", - "swap.settings.slippage.warning.max": "Introduceți o valoare mai mică de {{maxSlippageTolerance}}", - "swap.settings.slippage.warning.message": "Alunecarea poate fi mai mare decât este necesar", - "swap.settings.slippage.warning.min": "Introduceți o valoare mai mare decât 0", - "swap.settings.title": "Schimbați setările", - "swap.settings.transactionRevertPrice": "Tranzacția dvs. va reveni dacă prețul se modifică nefavorabil cu mai mult de acest procent.", - "swap.signAndSwap": "Semnează și schimbă", - "swap.slippage.amt": "{{amt}} alunecare", - "swap.slippage.bridging": "Fără alunecare la schimbarea între rețele", - "swap.slippage.settings.title": "Setări de alunecare", - "swap.slippage.tooltip": "Mișcarea prețului maxim înainte de tranzacția dvs. se va reveni.", - "swap.slippageBelow.warning": "Alunecarea sub {{amt}} poate duce la o tranzacție eșuată", - "swap.submitted": "Schimb trimis", - "swap.success": "Schimbați succes!", - "swap.taxTooltip.label": "Doar intrare exactă", - "swap.taxTooltip.noTokenSelected": "Taxele pentru simbolul de ieșire selectat nu permit rezultate exacte exacte. Utilizați în schimb câmpul „Vânzare”.", - "swap.taxTooltip.tokenSelected": "Taxele {{tokenSymbol}} nu permit rezultate exacte exacte. Utilizați în schimb câmpul „Vânzare”.", - "swap.tokenOwnFees": "Unele jetoane percep o taxă atunci când sunt cumpărate sau vândute, care este stabilită de emitentul token-ului. Uniswap nu primește niciuna dintre aceste taxe.", - "swap.total": "Total", - "swap.tradeRoutes": "Rute comerciale", - "swap.transaction.deadline": "Termenul limită pentru tranzacție", - "swap.transaction.revertAfter": "Tranzacția dvs. va reveni dacă este în așteptare mai mult de această perioadă de timp.", - "swap.unsupportedAssets.readMore": "Citiți mai multe despre materialele neacceptate", - "swap.warning.enterLargerAmount.title": "Introduceți o sumă mai mare", - "swap.warning.expectedFailure.increaseSlippage": "Încercați să vă măriți alunecarea.", - "swap.warning.expectedFailure.titleMay": "Acest schimb poate eșua", - "swap.warning.insufficientBalance.title": "Nu ai suficient {{currencySymbol}}", - "swap.warning.insufficientGas.button": "Nu este suficient {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "Schimbați cu {{ tokenSymbol }} pe {{networkName}}", - "swap.warning.insufficientGas.button.buy": "Cumpărați {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "Cumpărați cu cardul", - "swap.warning.insufficientGas.message.withNetwork": "Nu este suficient {{currencySymbol}} pe {{networkName}} pentru a schimba", - "swap.warning.insufficientGas.message.withoutNetwork": "Nu este suficient {{currencySymbol}} pentru a schimba", - "swap.warning.insufficientGas.title": "Nu aveți suficient {{currencySymbol}} pentru a acoperi costul rețelei", - "swap.warning.networkFee.allow": "Permite {{ inputTokenSymbol }} (o singură dată)", - "swap.warning.networkFee.highRelativeToValue": "Costul rețelei depășește 10% din valoarea totală a tranzacției.", - "swap.warning.networkFee.highRelativeToValue.unichain": "Costul rețelei depășește 10% din valoarea totală a tranzacției.", - "swap.warning.networkFee.message": "Acesta este costul procesării tranzacției dvs. pe blockchain. Uniswap nu primește nicio parte din aceste taxe.", - "swap.warning.networkFee.message.unichain": "Acesta este costul procesării tranzacției dvs. pe blockchain.", - "swap.warning.networkFee.message.uniswapX": "Acesta este costul procesării tranzacției dvs. pe blockchain. Uniswap nu primește nicio parte din aceste taxe. UniswapX reunește sursele de lichiditate pentru prețuri mai bune și swap fără gaz.", - "swap.warning.networkFee.message.uniswapX.unichain": "Acesta este costul procesării tranzacției dvs. pe blockchain. UniswapX reunește sursele de lichiditate pentru prețuri mai bune și swap fără gaz.", - "swap.warning.networkFee.wrap": "Înfășurați ETH", - "swap.warning.noQuotesFound.bridging.message": "Nu s-au găsit citate de legătură. Încercați să utilizați bridge-ul oficial în acest moment.", - "swap.warning.noQuotesFound.title": "Nu s-au găsit ghilimele", - "swap.warning.noRoutesFound.message": "În prezent, nu există rute disponibile pentru jetoanele selectate. Vă rugăm să încercați o altă pereche sau verificați din nou mai târziu.", - "swap.warning.noRoutesFound.title": "Nu există rute disponibile", - "swap.warning.offline.message": "Este posibil să fi pierdut conexiunea la internet sau este posibil ca rețeaua să fie oprită. Vă rugăm să vă verificați conexiunea la internet și să încercați din nou.", - "swap.warning.offline.title": "Ești offline", - "swap.warning.priceImpact": "Această tranzacție va avea ca rezultat un impact asupra prețului de asupra prețului de piață al acestui pool. Vrei sa continui?", - "swap.warning.priceImpact.message": "Datorită cantității de lichiditate {{outputCurrencySymbol}} disponibilă în prezent, cu cât încercați să schimbați mai mult {{inputCurrencySymbol}} , cu atât veți primi mai puține {{outputCurrencySymbol}} .", - "swap.warning.priceImpact.message.veryHigh": "Această tranzacție va avea ca rezultat un impact al prețului de {{priceImpactValue}} asupra prețului de piață al acestui pool și va duce la o pierdere de fonduri.", - "swap.warning.priceImpact.title": "Impact ridicat asupra prețului ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "Impact foarte mare asupra prețului ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "Tranzacția dvs. nu a fost trimisă deoarece ați închis aplicația.", - "swap.warning.queuedOrder.approvalFailed": "Tranzacția dvs. nu a fost trimisă deoarece aprobarea simbolului nu a reușit.", - "swap.warning.queuedOrder.stale": "Tranzacția dvs. nu a fost trimisă deoarece ați închis aplicația sau aprobarea a durat prea mult.", - "swap.warning.queuedOrder.submissionFailed": "A apărut o problemă la trimiterea tranzacției dvs.", - "swap.warning.queuedOrder.title": "Schimbul a fost anulat", - "swap.warning.queuedOrder.wrap.message": "ETH-ul dvs. va rămâne împachetat ca WETH.", - "swap.warning.queuedOrder.wrapFailed": "Tranzacția dvs. nu a fost trimisă deoarece tranzacția de împachetare a eșuat.", - "swap.warning.rateLimit.message": "Vă rugăm să încercați din nou în câteva minute.", - "swap.warning.rateLimit.title": "Limita ratei a fost depășită", - "swap.warning.router.message": "Este posibil să fi pierdut conexiunea sau rețeaua poate fi oprită. Dacă problema persistă, încercați din nou mai târziu.", - "swap.warning.router.title": "Această tranzacție nu poate fi finalizată acum", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} este blocat", - "swap.warning.uniswapFee.message.default": "Se aplică taxe pentru a asigura cea mai bună experiență cu Uniswap. Nu există nicio taxă asociată cu acest swap.", - "swap.warning.uniswapFee.message.included": "Taxele sunt aplicate pentru a asigura cea mai bună experiență cu Uniswap și au fost deja luate în considerare în această cotație.", - "swap.warning.uniswapFee.title": "Taxa de schimb", - "swap.warning.viewOnly.message": "Trebuie să importați acest portofel prin expresia de recuperare pentru a schimba jetoane.", - "swap.wrap.token": "Înfășurați {{sym}}", - "tdp.balanceSummary.otherNetworks": "Pe alte rețele", - "tdp.balanceSummary.otherNetworksBalance": "Echilibrul pe alte rețele", - "tdp.balanceSummary.title": "Echilibrul tau", - "tdp.invalidTokenPage.switchChainPrompt": "Comutați la {{network}}", - "tdp.invalidTokenPage.title": "Acest simbol nu există", - "tdp.invalidTokenPage.titleWithChain": "Acest simbol nu există pe {{network}}", - "tdp.loading.title.default": "date indicative pentru ", - "tdp.loading.title.withChain": "date indicative pentru pe {{chainName}}", - "tdp.nameNotFound": "Numele nu a fost găsit", - "tdp.noInfoAvailable": "Nu există informații despre simboluri disponibile", - "tdp.noTestnetSupportDescription": "Unele rețele de testare nu acceptă schimbarea, trimiterea sau cumpărarea de jetoane.", - "tdp.stats.unsupportedChainDescription": "Statisticile și graficele pentru token pentru {{chain}} sunt disponibile pe {{infoLink}}", - "tdp.symbolNotFound": "Simbolul nu a fost găsit", - "testnet.modal.swapDeepLink.description.toProdMode": "Această acțiune necesită dezactivarea modului testnet. Modul Testnet poate fi reactivat oricând din setări.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "Această acțiune necesită activarea modului testnet. Tokenurile de pe rețelele de testare nu au nicio valoare reală. Modul Testnet poate fi dezactivat oricând din setări.", - "testnet.modal.swapDeepLink.title.toProdMode": "Dezactivați modul testnet", - "testnet.modal.swapDeepLink.title.toTestnetMode": "Activați modul testnet", - "testnet.unsupported": "Această funcționalitate nu este acceptată în modul testnet.", - "themeToggle.theme": "Temă", - "title.betterPricesMoreListings": "Preturi mai bune. Mai multe listări. Cumpărați, vindeți și tranzacționați NFT-uri pe piețele de top precum OpenSea. Explorați colecțiile la modă.", - "title.buySellTradeEthereum": "Cumpărați, vindeți și tranzacționați Ethereum și alte jetoane de top pe Uniswap", - "title.createGovernanceOn": "Creați o nouă propunere de guvernare pe Uniswap", - "title.createGovernanceTo": "Creați o nouă propunere de guvernare care să fie votată de către titularii UNI. Jetoanele UNI reprezintă acțiuni cu drept de vot în guvernanța Uniswap.", - "title.earnFees": "Câștigați comisioane atunci când alții schimbă pe Uniswap adăugând jetoane la fondurile de lichiditate.", - "title.easilyRemove": "Eliminați cu ușurință lichiditatea din Uniswap v2 și depuneți în Uniswap v3.", - "title.easilyRemoveV4": "Eliminați cu ușurință lichiditatea din Uniswap v2 și v3 pentru a depune în Uniswap v4.", - "title.explore": "Explorați NFT-urile pe Uniswap", - "title.exploreNFTs": "Explorați și cumpărați NFT pe piețele de top pe Uniswap", - "title.manageNFT": "Gestionați-vă colecția NFT. Vizualizați trăsăturile, activitatea de tranzacționare, descrierile și alte detalii despre NFT-urile dvs.", - "title.migratev2": "Migrați lichiditatea pool-ului v2 la Uniswap v3", - "title.migratev3": "Migrați lichiditatea pool-ului la Uniswap v4", - "title.placeLimit": "Plasați comenzi limită pe Uniswap", - "title.realTime": "Prețuri în timp real, diagrame, date despre tranzacții și multe altele.", - "title.removeLiquidityv2": "Eliminați lichiditatea pool-ului (v2) pe Uniswap", - "title.removePoolLiquidity": "Eliminați lichiditatea pool-ului pe Uniswap", - "title.removeTokensv2": "Eliminați-vă jetoanele din fondurile de lichiditate v2.", - "title.removev3Liquidity": "Eliminați-vă jetoanele din fondurile de lichiditate v3.", - "title.sendTokens": "Trimiteți jetoane pe Uniswap", - "title.swappingMadeSimple": "Schimbarea este simplă. Cumpărați și vindeți criptomonede pe Ethereum, Base, Arbitrum, Polygon și multe altele. De încredere de milioane.", - "title.tradeTokens": "Tranzacționează cu jetoane și oferă lichiditate. Prețuri în timp real, diagrame, date despre tranzacții și multe altele.", - "title.uniswapTradeCrypto": "Uniswap | Comercializați cripto și NFT în siguranță pe platforma DeFi de top", - "title.uniToken": "Tokenurile UNI reprezintă acțiuni cu drept de vot în guvernanța Uniswap. Puteți vota singur pentru fiecare propunere sau puteți delega voturile unei terțe părți.", - "title.voteOnGov": "Votați propunerile de guvernare pe Uniswap", - "token.balances.main": "Echilibrul tau", - "token.balances.other": "Solduri pe alte rețele", - "token.balances.viewOnly": "soldul lui {{ownerAddress}}", - "token.bridge": "{{label}} token bridge", - "token.chart.tooltip": "Taxe: {{amount}}", - "token.details.testnet.unsupported": "Detaliile tokenului nu sunt disponibile pentru tokenurile testnet.", - "token.error.unknown": "Jeton necunoscut", - "token.fee.buy.label": "taxa de cumparare", - "token.fee.label": "taxa", - "token.fee.sell.label": "taxa de vanzare", - "token.links.title": "Legături", - "token.links.twitter": "Stare de nervozitate", - "token.links.website": "Site-ul web", - "token.priceExplorer.error.description": "Ceva n-a mers bine.", - "token.priceExplorer.error.title": "Nu s-a putut încărca graficul de preț", - "token.priceExplorer.timeRangeLabel.all": "Tot timpul", - "token.priceExplorer.timeRangeLabel.day": "1D", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 zi", - "token.priceExplorer.timeRangeLabel.hour": "1H", - "token.priceExplorer.timeRangeLabel.month": "1M", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 lună", - "token.priceExplorer.timeRangeLabel.week": "1W", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 saptamana", - "token.priceExplorer.timeRangeLabel.year": "1Y", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 an", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} nu este disponibil", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} și {{tokenSymbol1}} nu sunt disponibile", - "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs nu primește niciuna dintre aceste taxe.", - "token.safety.warning.alwaysDoYourResearch": "Fă-ți întotdeauna cercetările", - "token.safety.warning.blocked.description.default_one": "Nu puteți tranzacționa acest token folosind aplicația Uniswap.", - "token.safety.warning.blocked.description.default_other": "Nu puteți tranzacționa aceste jetoane folosind aplicația Uniswap.", - "token.safety.warning.dontShowWarningAgain": "Nu-mi mai arăta acest avertisment", - "token.safety.warning.doYourOwnResearch": "Fă-ți întotdeauna propria cercetare înainte de a continua.", - "token.safety.warning.feeDescription": "Încarcă un când {{action}}", - "token.safety.warning.flaggedAsMalicious": "Semnalat ca rău intenționat", - "token.safety.warning.fotHigh.title": "Taxa mare detectata", - "token.safety.warning.fotLow.title": "Taxa detectată", - "token.safety.warning.fotVeryHigh.title": "A fost detectată o taxă foarte mare", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} a fost semnalat ca nevândubil. Schimbarea acestui token poate duce la pierderea fondurilor dumneavoastră.", - "token.safety.warning.honeypot.title": "Taxa de vânzare 100% detectată", - "token.safety.warning.impersonator": "Uzurpă identitatea unui alt simbol", - "token.safety.warning.impersonator.title": "A fost detectat un simbol de imitator", - "token.safety.warning.malicious.general.message": "{{tokenSymbol}} a fost semnalat ca fiind rău intenționat de Blockaid.", - "token.safety.warning.malicious.impersonator.message": "{{tokenSymbol}} a fost semnalat de Blockaid pentru că a încercat să copieze un alt simbol. Este posibil să nu fie simbolul pe care doriți să îl schimbați.", - "token.safety.warning.malicious.impersonator.message.short": "Este posibil ca {{tokenSymbol}} să nu fie simbolul pe care doriți să îl schimbați.", - "token.safety.warning.malicious.title": "A fost detectat un simbol rău intenționat", - "token.safety.warning.mayResultInLoss": "Schimbarea acestuia poate duce la o pierdere de fonduri.", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} nu este tranzacționat pe principalele burse centralizate din SUA.", - "token.safety.warning.notListedOnExchanges": "Nu este listat la bursele de top din SUA", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} a fost semnalat ca nevândubil.", - "token.safety.warning.sellFee100.title": "Taxa de vânzare 100% detectată", - "token.safety.warning.spam.message": "{{tokenSymbol}} a fost semnalat ca spam de Blockaid.", - "token.safety.warning.spam.title": "Indicativ de spam detectat", - "token.safety.warning.spamsUsers": "Spam utilizatorii", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} percepe o taxă de {{buyFeePercent}} când este cumpărat și {{sellFeePercent}} când este vândut.", - "token.safety.warning.tokenChargesFee.buy.message": "{{tokenSymbol}} percepe o taxă de {{feePercent}} atunci când este cumpărat.", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} percepe o taxă de {{feePercent}} la vânzare.", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} percepe o taxă atunci când este cumpărat sau vândut.", - "token.safetyLevel.blocked.message": "Nu puteți tranzacționa acest token utilizând portofelul Uniswap.", - "token.safetyLevel.medium.message.plural": "Aceste jetoane nu sunt tranzacționate pe principalele burse centralizate din SUA. Fă-ți întotdeauna propria cercetare înainte de a continua.", - "token.selector.search.error": "Nu s-au putut încărca rezultatele căutării", - "token.stats.fullyDilutedValuation": "Evaluare complet diluată", - "token.stats.marketCap": "Capitalizarea pieței", - "token.stats.priceHighYear": "52W ridicat", - "token.stats.priceLowYear": "52W scăzut", - "token.stats.section.about": "Despre {{token}}", - "token.stats.title": "Statistici", - "token.stats.translation.original": "Afișați originalul", - "token.stats.translation.translate": "Traduceți în {{language}}", - "token.stats.volume": "Volum 24h", - "token.symbol.input.fallback": "Jeton de intrare", - "token.symbol.output.fallback": "Jeton de ieșire", - "token.wrap.fail.message": "Schimburile pe protocolul Uniswap pot începe și se pot termina cu ETH. Cu toate acestea, în timpul schimbului, ETH este împachetat în WETH.", - "token.zeroNativeBalance.description": "Pentru a obține {{ tokenSymbol }}, mai întâi aveți nevoie de {{ nativeTokenSymbol }} pentru a plăti costul rețelei. Începeți prin a vă finanța portofelul cu {{ nativeTokenSymbol }}.", - "token.zeroNativeBalance.title": "Ai nevoie de {{ nativeTokenName }} ", - "tokens.action.hide": "Ascunde simbolul", - "tokens.action.unhide": "Afișează simbolul", - "tokens.nfts.action.viewOnExplorer": "Vizualizați pe {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "Nu s-a putut încărca colecția NFT", - "tokens.nfts.collection.label.items": "Articole", - "tokens.nfts.collection.label.owners": "Proprietarii", - "tokens.nfts.collection.label.priceFloor": "Podea", - "tokens.nfts.collection.label.swapVolume": "Volum", - "tokens.nfts.details.error.load.title": "Nu s-au putut încărca detaliile NFT", - "tokens.nfts.details.network": "Reţea", - "tokens.nfts.details.owner": "Detinut de", - "tokens.nfts.details.price": "Pretul curent", - "tokens.nfts.details.recentPrice": "Ultimul preț de vânzare", - "tokens.nfts.details.traits": "Trăsături", - "tokens.nfts.empty.description": "Nu s-au găsit NFT", - "tokens.nfts.error.unavailable": "Conținutul nu este disponibil", - "tokens.nfts.hidden.action.hide": "Ascunde NFT", - "tokens.nfts.hidden.action.unhide": "Afișează NFT", - "tokens.nfts.link.collection": "Site-ul de colecție", - "tokens.nfts.list.error.load.title": "Nu s-au putut încărca NFT-urile", - "tokens.nfts.list.none.button": "Primiți NFT-uri", - "tokens.nfts.list.none.description.default": "Transferați NFT-uri dintr-un alt portofel pentru a începe.", - "tokens.nfts.list.none.description.external": "Când acest portofel cumpără sau primește NFT, acestea vor apărea aici.", - "tokens.nfts.list.none.title": "Nu există încă NFT", - "tokens.noneFound": "Nu s-au găsit jetoane.", - "tokens.selector.button.choose": "Selectați jetonul", - "tokens.selector.button.clear": "Curata tot", - "tokens.selector.empty.buy.message": "Cumpărați cripto cu un card sau cu o bancă pentru a trimite jetoane.", - "tokens.selector.empty.buy.title": "Cumpărați cripto", - "tokens.selector.empty.receive.title": "Primiți jetoane", - "tokens.selector.empty.title": "Nu există încă jetoane", - "tokens.selector.error.load": "Nu s-au putut încărca jetoanele", - "tokens.selector.search.empty": "Nu s-au găsit rezultate pentru {{searchText}}", - "tokens.selector.search.placeholder": "Jetoane de căutare", - "tokens.selector.section.bridging": "Schimbați între rețele", - "tokens.selector.section.favorite": "Favorite", - "tokens.selector.section.otherSearchResults": "Alte jetoane pe {{network}}", - "tokens.selector.section.recent": "Căutări recente", - "tokens.selector.section.search": "Rezultatele cautarii", - "tokens.selector.section.trending": "Jetoane după volum 24 de ore", - "tokens.selector.section.yours": "Jetoanele tale", - "tokens.table.search.placeholder.pools": "Căutați piscine", - "tokens.table.search.placeholder.tokens": "Jetoane de căutare", - "transaction.action.cancel.button": "Anulați tranzacția", - "transaction.action.cancel.description": "Dacă anulați această tranzacție înainte ca aceasta să fie procesată de rețea, veți plăti un nou cost de rețea în locul celui inițial.", - "transaction.action.cancel.title": "Anulați această tranzacție?", - "transaction.action.copy": "Copiați ID-ul tranzacției", - "transaction.action.copyProvider": "Copiați {{providerName}} ID-ul tranzacției", - "transaction.amount.unlimited": "Nelimitat", - "transaction.confirmation.completionTime_one": "Tranzacție finalizată în {{count}} secunde 🎉", - "transaction.confirmation.completionTime_other": "Tranzacție finalizată în {{count}} secunde 🎉", - "transaction.confirmation.pending.wallet": "Confirmați tranzacția în portofel", - "transaction.confirmation.submitted.currency.add": "Adăugați {{currency}}", - "transaction.confirmation.submitted.currency.added": "S-a adăugat {{currency}}", - "transaction.confirmation.waiting": "Se așteaptă confirmarea", - "transaction.date": "Trimis pe {{date}}", - "transaction.details.dappName": "App", - "transaction.details.from": "Din", - "transaction.details.networkFee": "Costul rețelei", - "transaction.details.providerFee": "Taxa de furnizor", - "transaction.details.swapRate": "Rată", - "transaction.details.transaction": "Tranzacţie", - "transaction.details.uniswapFee": "Comision ({{ feePercent }}%)", - "transaction.insufficientLiquidity": "Lichiditate insuficientă pentru a finaliza tranzacția", - "transaction.network.all": "Toate rețelele", - "transaction.networkCost.label": "Costul rețelei", - "transaction.networkCost.maxNativeBalance.description": "O cantitate mică din soldul jetonului de rețea este rezervată pentru a acoperi costul rețelei al acestei tranzacții.", - "transaction.networkCost.maxNativeBalance.title": "De ce nu pot folosi soldul meu maxim?", - "transaction.networkCost.veryHigh.label": "Cost de rețea foarte mare", - "transaction.notification.error.cancel": "Nu se poate anula tranzacția", - "transaction.notification.error.replace": "Nu se poate înlocui tranzacția", - "transaction.status.approve.canceled": "Aprobare anulată", - "transaction.status.approve.canceling": "Se anulează aprobarea", - "transaction.status.approve.failed": "Nu s-a aprobat", - "transaction.status.approve.pending": "Aprobarea", - "transaction.status.approve.success": "Aprobat", - "transaction.status.approve.successDapp": "Aprobat pe {{externalDappName}}", - "transaction.status.buy.canceled": "Cumpărare anulată", - "transaction.status.buy.canceling": "Se anulează cumpărarea", - "transaction.status.buy.failed": "Nu s-a putut cumpăra", - "transaction.status.buy.pending": "Cumpărare", - "transaction.status.buy.success": "Cumparat", - "transaction.status.buy.successDapp": "Cumpărat pe {{externalDappName}}", - "transaction.status.confirm.canceled": "Confirmare anulată", - "transaction.status.confirm.canceling": "În așteptarea anulării", - "transaction.status.confirm.failed": "Nu s-a putut confirma", - "transaction.status.confirm.pending": "Tranzacție în curs", - "transaction.status.confirm.success": "Tranzacție confirmată", - "transaction.status.confirm.successDapp": "Tranzacție confirmată pe {{externalDappName}}", - "transaction.status.mint.canceled": "Mentă anulată", - "transaction.status.mint.canceling": "Anularea mentă", - "transaction.status.mint.failed": "Nu a reușit să bată", - "transaction.status.mint.pending": "Mint", - "transaction.status.mint.success": "Bateriat", - "transaction.status.mint.successDapp": "Banat pe {{externalDappName}}", - "transaction.status.purchase.canceled": "Achiziție anulată", - "transaction.status.purchase.canceling": "Anularea achiziției", - "transaction.status.purchase.failedOn": "Nu s-a putut cumpăra pe {{serviceProvider}}", - "transaction.status.purchase.pendingOn": "Cumpărare pe {{serviceProvider}}", - "transaction.status.purchase.successOn": "Achiziționat pe {{serviceProvider}}", - "transaction.status.receive.canceled": "Primire anulată", - "transaction.status.receive.canceling": "Se anulează primirea", - "transaction.status.receive.failedFrom": "Nu s-a putut primi de la {{serviceProvider}}", - "transaction.status.receive.pendingFrom": "Se primesc de la {{serviceProvider}}", - "transaction.status.receive.success": "Primit", - "transaction.status.receive.successDapp": "Primit pe {{externalDappName}}", - "transaction.status.receive.successFrom": "Primit de la {{serviceProvider}}", - "transaction.status.revoke.canceled": "Revocare anulată", - "transaction.status.revoke.canceling": "Anularea revocarii", - "transaction.status.revoke.failed": "Revocarea eșuată", - "transaction.status.revoke.pending": "Revocare", - "transaction.status.revoke.success": "Revocat", - "transaction.status.revoke.successDapp": "Revocat pe {{externalDappName}}", - "transaction.status.sale.canceled": "Vânzare anulată", - "transaction.status.sale.canceling": "Anularea vânzării", - "transaction.status.sale.failedOn": "Vânzarea eșuată prin {{serviceProvider}}", - "transaction.status.sale.pendingOn": "Se vinde prin {{serviceProvider}}", - "transaction.status.sale.successOn": "Vândut prin {{serviceProvider}}", - "transaction.status.sell.canceled": "Vânzare anulată", - "transaction.status.sell.canceling": "Anularea vânzării", - "transaction.status.sell.failed": "Nu s-a putut vinde", - "transaction.status.sell.pending": "De vânzare", - "transaction.status.sell.success": "Vândut", - "transaction.status.sell.successDapp": "Vândut pe {{externalDappName}}", - "transaction.status.send.canceled": "Trimitere anulată", - "transaction.status.send.canceling": "Se anulează trimiterea", - "transaction.status.send.failed": "Nu s-a putut trimite", - "transaction.status.send.pending": "Trimiterea", - "transaction.status.send.success": "Trimis", - "transaction.status.send.successDapp": "Trimis pe {{externalDappName}}", - "transaction.status.swap.canceled": "Schimb anulat", - "transaction.status.swap.canceling": "Se anulează schimbul", - "transaction.status.swap.expired": "Schimbul a expirat", - "transaction.status.swap.failed": "Schimbarea eșuată", - "transaction.status.swap.insufficientFunds": "Fonduri insuficiente", - "transaction.status.swap.pending": "Schimbarea", - "transaction.status.swap.success": "Schimbat", - "transaction.status.swap.successDapp": "Schimbat pe {{externalDappName}}", - "transaction.status.unwrap.canceled": "Desfacere anulată", - "transaction.status.unwrap.canceling": "Se anulează despachetarea", - "transaction.status.unwrap.failed": "Desfacerea eșuată", - "transaction.status.unwrap.pending": "Desfacerea", - "transaction.status.unwrap.success": "Desfăcut", - "transaction.status.unwrap.successDapp": "Desfăcut pe {{externalDappName}}", - "transaction.status.wrap.canceled": "Wrap anulat", - "transaction.status.wrap.canceling": "Se anulează împachetarea", - "transaction.status.wrap.failed": "Încheierea eșuată", - "transaction.status.wrap.pending": "Ambalaj", - "transaction.status.wrap.success": "Înfășurat", - "transaction.status.wrap.successDapp": "Înfășurat pe {{externalDappName}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} la {{recipientAddress}}", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} din {{senderAddress}}", - "transaction.warning.insufficientGas.modal.message": "Aveți nevoie de ~{{tokenAmount}} {{tokenSymbol}} () pe {{networkName}} pentru a acoperi costul rețelei acestei tranzacții.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "Nu este suficient {{tokenSymbol}} pe {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Nu este suficient {{tokenSymbol}}", - "transaction.warning.maxNative.message": "Sunteți pe cale să cheltuiți cea mai mare parte din soldul de simboluri de rețea. Acest lucru poate lăsa fonduri insuficiente pentru a acoperi costurile viitoare ale rețelei.", - "transaction.warning.maxNative.title": "Echilibrul jetoanelor de rețea scăzut", - "transaction.watcher.error.cancel": "Nu se poate anula tranzacția", - "transaction.watcher.error.status": "Eroare la verificarea stării tranzacției", - "unichain.promotion.bridging.description": "Schimbați la Unichain", - "unichain.promotion.bridging.tooltip.description": "Conectează-ți ETH pentru a începe pe Unichain.", - "unichain.promotion.cold.description": "Schimbări mai rapide. Taxe mai mici. Unichain este casa pentru DeFi.", - "unichain.promotion.cold.title": "Vă prezentăm Unichain", - "unichain.promotion.modal.description": "Schimbări mai rapide. Taxe mai mici. Unichain este casa pentru lichiditatea cross-chain.", - "unichain.promotion.modal.detail.costs": "Costuri mai mici pentru crearea grupurilor și gestionarea pozițiilor.", - "unichain.promotion.modal.detail.fees": "Economisiți 95% la comisioane comparativ cu Ethereum.", - "unichain.promotion.modal.detail.instant": "Schimbați instantaneu", - "unichain.promotion.tooltip.description": "Schimbări mai rapide. Taxe mai mici. Unichain este casa pentru lichiditatea cross-chain.", - "unichain.promotion.tooltip.switch": "Comutați la Unichain", - "unichain.promotion.tooltip.title": "Unichain este aici", - "unichain.promotion.warm.description": "Schimbați jetoanele preferate mai rapid și cu costuri mai mici de gaz.", - "unichain.promotion.warm.title": "Începeți să schimbați pe Unichain", - "uniswapX.aggregatesLiquidity": " reunește sursele de lichiditate pentru prețuri mai bune și swap fără gaz.", - "uniswapx.description": "UniswapX reunește sursele de lichiditate pentru prețuri mai bune și swap fără gaz.", - "uniswapx.included": "Include UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "Aflați mai multe despre schimbarea cu UniswapX", - "uniswapx.v2QuoteFailed": "Cotația hard UniswapX v2 a eșuat. Reîncercați cu schimbul clasic.", - "unitags.banner.button.claim": "Revendicați acum", - "unitags.banner.subtitle": "Creați un profil web3 personalizat și partajați-vă cu ușurință adresa prietenilor.", - "unitags.banner.title.compact": "Revendicați-vă numele de utilizator {{unitagDomain}} și construiți-vă profilul personalizabil.", - "unitags.banner.title.full": "Revendicați-vă numele de utilizator {{unitagDomain}}", - "unitags.choosePhoto.option.cameraRoll": "Alegeți din rola camerei", - "unitags.choosePhoto.option.computer": "Încărcați de pe computer", - "unitags.choosePhoto.option.nft": "Alegeți un NFT", - "unitags.choosePhoto.option.remove": "Eliminați fotografia de profil", - "unitags.claim.confirmation.customize": "Personalizați profilul", - "unitags.claim.confirmation.description": "{{unitagAddress}} este gata să trimită și să primească cripto. Continuați să vă construiți portofelul personalizându-vă profilul web3.", - "unitags.claim.confirmation.success.long": "Ai inteles!", - "unitags.claim.confirmation.success.short": "am înţeles!", - "unitags.claim.error.addressLimit": "Ați făcut deja numărul maxim de modificări la numele dvs. de utilizator pentru această adresă", - "unitags.claim.error.appCheck": "Nu s-a putut revendica numele de utilizator. Vă rugăm să încercați din nou mâine.", - "unitags.claim.error.avatar": "Nu s-a putut seta avatarul. Încercați mai târziu.", - "unitags.claim.error.default": "Nu s-a putut revendica numele de utilizator. Încercați mai târziu.", - "unitags.claim.error.deviceLimit": "Ați atins numărul maxim de nume de utilizator care pot fi active pentru acest dispozitiv", - "unitags.claim.error.general": "Nu se poate revendica numele de utilizator", - "unitags.claim.error.unavailable": "numele de utilizator nu este disponibil", - "unitags.claim.error.unknown": "Eroare necunoscută", - "unitags.claim.username.default": "Numele dumneavoastră", - "unitags.delete.confirm.subtitle": "Sunteți pe cale să vă ștergeți numele de utilizator și detaliile de profil personalizabile. Nu veți putea să-l revendicați.", - "unitags.delete.confirm.title": "Esti sigur?", - "unitags.editProfile.placeholder": "nume de utilizator", - "unitags.editUsername.confirm.subtitle": "Sunteți pe cale să vă schimbați numele de utilizator. Odată ce îl schimbați, nu îl mai puteți revendica niciodată.", - "unitags.editUsername.confirm.title": "Esti sigur?", - "unitags.editUsername.title": "Editează-ți numele de utilizator", - "unitags.editUsername.warning.default": "Odată ce îți schimbi numele de utilizator, nu-l mai poți revendica niciodată. Îl poți schimba doar de de 2 ori.", - "unitags.editUsername.warning.max": "Ați atins numărul maxim de 2 modificări de nume de utilizator.", - "unitags.extension.intro.buttton": "Revendicați un nume de utilizator", - "unitags.extension.intro.description": "Spune la revedere adreselor 0x. Numele de utilizator sunt nume lizibile care facilitează trimiterea și primirea cripto.", - "unitags.extension.intro.title": "Prezentarea numelor de utilizator", - "unitags.extension.intro.upsell.customizable": "Profiluri personalizabile", - "unitags.extension.intro.upsell.ens": "Produs de subdomenii ENS", - "unitags.extension.intro.upsell.free": "Liber să revendice", - "unitags.intro.features.ens": "Produs de subdomenii ENS", - "unitags.intro.features.free": "Liber să revendice", - "unitags.intro.features.profile": "Profiluri personalizabile", - "unitags.intro.subtitle": "Spune la revedere adreselor 0x. Numele de utilizator sunt nume lizibile care facilitează trimiterea și primirea cripto.", - "unitags.intro.title": "Prezentarea numelor de utilizator", - "unitags.notification.delete.error": "Nu s-a putut șterge numele de utilizator. Încercați mai târziu.", - "unitags.notification.delete.title": "Numele de utilizator a fost șters", - "unitags.notification.profile.error": "Nu s-a putut actualiza profilul. Încercați mai târziu.", - "unitags.notification.profile.title": "profil actualizat", - "unitags.notification.username.error": "Nu s-a putut schimba numele de utilizator. Încercați mai târziu.", - "unitags.notification.username.title": "Numele de utilizator a fost schimbat", - "unitags.onboarding.claim.subtitle": "Aceasta este adresa dvs. personalizată la care oamenii pot trimite crypto.", - "unitags.onboarding.claim.title.choose": "Creați-vă numele de utilizator", - "unitags.onboarding.claim.title.claim": "Revendicați-vă numele de utilizator", - "unitags.onboarding.info.description": "Numele de utilizator transformă adrese 0x complexe în nume care pot fi citite. Prin revendicarea unui nume de utilizator {{unitagDomain}} , puteți trimite și primi cu ușurință criptografii și puteți crea un profil web3 public.", - "unitags.onboarding.info.title": "O adresă simplificată", - "unitags.onboarding.profile.subtitle": "Încărcați-vă propria sau rămâneți cu Uniconul dvs. unic. Puteți schimba oricând acest lucru mai târziu.", - "unitags.onboarding.profile.title": "Alegeți o fotografie de profil", - "unitags.profile.action.delete": "Ștergeți numele de utilizator", - "unitags.profile.action.edit": "Editați numele de utilizator", - "unitags.profile.bio.label": "bio", - "unitags.profile.bio.placeholder": "Introdu o biografie pentru profilul tău", - "unitags.profile.links.twitter": "Stare de nervozitate", - "unitags.username.error.chars": "Numele de utilizator pot conține doar litere și cifre", - "unitags.username.error.max": "Numele de utilizator nu pot avea mai mult de {{number}} caractere", - "unitags.username.error.min": "Numele de utilizator trebuie să conțină cel puțin {{number}} caractere", - "unitags.username.error.uppercase": "Numele de utilizator pot conține doar litere mici și cifre", - "uwulink.error.insufficientTokens": "Nu este suficient {{tokenSymbol}} pe {{chain}}", - "v2.notAvailable": "Uniswap V2 nu este disponibil în această rețea.", - "v2.switchTo": "Comutați la v2", - "v3.blast.yield.usdbAndWeth": "Pe Blast, USDB și WETH sunt jetoane de rebazare care câștigă automat randament. Din cauza incompatibilității cu Uniswap v3, pozițiile LP cu USDB sau WETH nu vor câștiga randament de rebazare, dar vor avea în Uniswap v2.", - "v3.continue": "Continuați pe v3", - "v3.rebase.unavailable": "Rebazarea nu este disponibilă pe v3", - "wallet.appSignIn": "Conectați-vă cu aplicația", - "wallet.connectingAgreement": "Prin conectarea unui portofel, sunteți de acord cu Termenii și condițiile Uniswap Labs și sunteți de acord cu Politica de confidențialitate.", - "wallet.connectionFailed.message": "Încercarea de conectare a eșuat. Dați clic pe Încercați din nou și urmați pașii pentru a vă conecta în portofel.", - "wallet.other": "Alte portofele", - "wallet.scanToConnect": "Scanați codul QR pentru a vă conecta", - "wallet.wrongNet": "Portofelul dvs. este conectat la o rețea greșită.", - "walletConnect.dapps.connection": "Conectat la {{dappNameOrUrl}}", - "walletConnect.dapps.empty.description": "Conectați-vă la o aplicație prin scanarea unui cod prin WalletConnect", - "walletConnect.dapps.manage.empty.title": "Nicio aplicație conectată", - "walletConnect.dapps.manage.title": "Conexiuni", - "walletConnect.error.connection.message": "Uniswap Wallet acceptă în prezent {{chainNames}}. Vă rugăm să utilizați numai „{{dappName}}” pe aceste lanțuri", - "walletConnect.error.connection.title": "Eroare de conexiune", - "walletConnect.error.general.message": "A apărut o problemă cu WalletConnect. Vă rugăm să încercați din nou", - "walletConnect.error.general.title": "Eroare WalletConnect", - "walletConnect.error.scantastic.message": "A apărut o problemă cu codul dvs. QR. Vă rugăm să încercați din nou", - "walletConnect.error.scantastic.title": "Cod QR nevalid", - "walletConnect.error.unsupported.message": "Asigurați-vă că scanați un cod QR valid pentru WalletConnect, adresă Ethereum sau Uniswap Extension înainte de a încerca din nou.", - "walletConnect.error.unsupported.title": "Cod QR nevalid", - "walletConnect.error.unsupportedV1.message": "WalletConnect v1 nu mai este acceptat. Aplicația la care încercați să vă conectați trebuie să facă upgrade la WalletConnect v2.", - "walletConnect.error.unsupportedV1.title": "Cod QR nevalid", - "walletConnect.error.uwu.scan": "A apărut o problemă la scanarea acestui cod QR.", - "walletConnect.error.uwu.title": "Eroare de legătură UwU", - "walletConnect.error.uwu.unsupported": "Acest cod QR nu este acceptat.", - "walletConnect.pending.button.connect": "Conectați", - "walletConnect.pending.button.scrollDown": "Derulați în jos pentru a vă conecta", - "walletConnect.pending.switchAccount": "Schimba contul", - "walletConnect.pending.switchNetwork": "Schimbați rețeaua", - "walletConnect.pending.title": "Conectați-vă la {{dappName}}", - "walletConnect.permissions.option.transferAssets": "Transferați-vă bunurile fără consimțământ", - "walletConnect.permissions.option.viewTokenBalances": "Vedeți soldurile dvs. de simboluri", - "walletConnect.permissions.option.viewWalletAddress": "Vizualizați adresa portofelului dvs", - "walletConnect.permissions.title": "Permisiunile site-ului", - "walletConnect.request.button.scrollDown": "Derulați în jos pentru a semna", - "walletConnect.request.button.sign": "Semn", - "walletConnect.request.details.label.function": "Funcţie", - "walletConnect.request.details.label.sending": "Trimiterea", - "walletConnect.request.details.label.token": "Jeton", - "walletConnect.request.details.label.tokens": "Jetoane", - "walletConnect.request.error.insufficientFunds": "Nu aveți suficiente {{currencySymbol}} pentru a finaliza această tranzacție.", - "walletConnect.request.error.network": "Eroare de conexiune la internet sau la rețea", - "walletConnect.request.warning.general.message": "Fiți atenți: acest mesaj poate transfera active", - "walletConnect.request.warning.message": "Pentru a semna mesaje sau tranzacții, va trebui să importați fraza de recuperare a portofelului.", - "walletConnect.request.warning.title": "Acest portofel este în modul doar vizualizare", - "web.explore.description": "Descoperiți și cercetați jetoane pe {{network}}. Explorați piscinele de top. Vizualizați prețurile în timp real, volumul de tranzacționare, TVL, grafice și date despre tranzacții.", - "web.explore.title.pools": "Explorați cele mai bune piscine pe {{network}} pe Uniswap", - "web.explore.title.tokens": "Explorați jetoanele de top pe {{network}} pe Uniswap", - "web.explore.title.transactions": "Explorați tranzacțiile de top pe {{network}} pe Uniswap" -} diff --git a/packages/uniswap/src/i18n/locales/translations/ru-RU.json b/packages/uniswap/src/i18n/locales/translations/ru-RU.json index 0e9fe2c606c..465f060a210 100644 --- a/packages/uniswap/src/i18n/locales/translations/ru-RU.json +++ b/packages/uniswap/src/i18n/locales/translations/ru-RU.json @@ -30,7 +30,6 @@ "account.drawer.modal.body": "Безопасно храните токены и выполняйте их своп в приложении Uniswap. Доступно на устройствах iOS и Android.", "account.drawer.modal.dont": "Нет кошелька Uniswap?", "account.drawer.modal.scan": "Сканирование с помощью Uniswap Wallet", - "account.drawer.spamToggle": "Скрыть неизвестные токены и NFT", "account.passkey.delete.acknowledge": "Я создал(-а) резервную копию своей фразы восстановления и понимаю, что если я этого не сделаю, Uniswap Labs не сможет оказать мне помощь с возобновлением доступа к моему кошельку.", "account.passkey.delete.description": "Создайте резервную копию своей фразы восстановления с помощью мобильного приложения Uniswap или расширения для браузера.", "account.passkey.delete.descriptionEmphasized": "Вы не сможете получить доступ к своему кошельку без фразы восстановления.", @@ -115,6 +114,7 @@ "account.wallet.watch.placeholder": "ENS или адрес", "account.wallet.watch.title": "Введите адрес кошелька", "activity.pending": "Ожидается {{pendingActivityCount}}", + "activity.recentActivity": "Recent activity", "activity.transaction.lpRewards.descriptor": "Вознаграждения получены: {{symbol}}", "activity.transaction.send.descriptor": "{{amountWithSymbol}} в кошелек {{walletAddress}}", "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} на {{amountWithSymbolB}}", @@ -144,15 +144,15 @@ "bridgedAsset.send.warning.description": "Вы отправляете обернутую версию {{currencySymbol}} в {{chainName}}. Отправка на централизованную криптовалютную биржу приведет к безвозвратной потере средств.", "bridgedAsset.send.warning.title": "Убедитесь, что отправляете средства на совместимый адрес", "bridgedAsset.tdp.description": "Это подключенная версия {{currencySymbol}}, которая обеспечена нативным токеном {{currencySymbol}} в соответствии 1:1.", - "bridgedAsset.wormhole.button": "Перейти в Wormhole", - "bridgedAsset.wormhole.description": "Перейдите на портал Wormhole, чтобы подключить {{currencySymbol}} из {{chainName}} к {{nativeChainName}}.", + "bridgedAsset.wormhole.button": "Continue to {{provider}}", + "bridgedAsset.wormhole.description": "Continue to the {{provider}} portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", "bridgedAsset.wormhole.title": "Выведите {{currencySymbol}} в сеть {{nativeChainName}}", "bridgedAsset.wormhole.toNativeChain": "к {{nativeChainName}}", "bridgedAsset.wormhole.withdrawToNativeChain": "Вывести в сеть {{nativeChainName}}", "bridging.estimatedTime.minutesAndSeconds": "прибл. {{minutes}} мин. {{seconds}} с.", "bridging.estimatedTime.minutesOnly": "прибл. {{minutes}} мин.", "bridging.estimatedTime.secondsOnly": "прибл. {{seconds}} с.", - "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XPL, ZEC — now available on Unichain.", "chart.candlestick": "Свечной график", "chart.error.pools": "Невозможно отобразить исторические данные для текущего пула.", "chart.error.tokens": "Невозможно отобразить исторические данные для текущего токена.", @@ -257,6 +257,7 @@ "common.button.unlock": "Разблокировать", "common.button.view": "Просмотреть", "common.button.viewDetails": "Подробнее", + "common.button.viewMore": "View more", "common.button.yes": "Да", "common.buy.label": "Купить", "common.buyAndSell": "Покупка и продажа на Uniswap", @@ -370,6 +371,7 @@ "common.input.noRecipient.error": "Выберите получателя", "common.input.password.confirm": "Подтвердить пароль", "common.input.password.error.mismatch": "Пароли не совпадают", + "common.input.password.error.same": "New password must be different from current password", "common.input.password.error.weak": "Этот пароль слишком ненадежный", "common.input.password.new": "Новый пароль", "common.input.password.placeholder": "Пароль", @@ -503,6 +505,7 @@ "common.remove.liquidity.canceled": "Удаление ликвидности отменено", "common.remove.liquidity.failed": "Удалить ликвидность не удалось", "common.removing.liquidity": "Удаление ликвидности", + "common.reported": "Reported", "common.resetLimit": "Сбросить ограничение {{symbol}}", "common.resetLimitWallet": "Сбросить ограничение {{symbol}} в кошельке", "common.resettingLimit": "Сброс ограничения {{symbol}}…", @@ -532,6 +535,7 @@ "common.status": "Статус", "common.step.number": "Шаг {{number}}", "common.step.number.of": "Шаг {{current}} из {{total}}", + "common.submit": "Submit", "common.swap": "Своп", "common.swap.expired": "Срок действия свопа истек", "common.swap.failed": "Ошибка свопа", @@ -797,6 +801,7 @@ "fee.tier.create": "Создать уровень комиссии", "fee.tier.create.button": "Создать новый уровень комиссии", "fee.tier.create.description": "Создание нового уровня приведет к инициализации нового пула и к более высоким, чем обычно, комиссиям сети.", + "fee.tier.default": "-- fee tier", "fee.tier.description": "Сумма, заработанная за предоставление ликвидности. Выберите сумму, которая соответствует вашей стратегии и уровню устойчивости к рискам.", "fee.tier.description.v2": "Сумма, заработанная за предоставление ликвидности. Все пулы v2 имеют фиксированные комиссии в размере 0,3 %. Для получения дополнительных опций предоставьте ликвидность в v4.", "fee.tier.dynamic": "Динамический уровень комиссии", @@ -884,9 +889,9 @@ "hero.swap.title": "Своп в любое время,
где угодно", "hidden.nfts.info.banner.text": "Подробнее о скрытых NFT", "hidden.nfts.info.text.button": "Скрытые NFT ({{numHidden}})", - "hidden.nfts.info.text.extension": "Это потенциальные скрытые вами мошенничества и NFT. Чтобы отобразить NFT-токен, щелкните по нему правой кнопкой мыши.", "hidden.nfts.info.text.mobile": "Это потенциальные скрытые вами мошенничества и NFT. Чтобы отобразить NFT-токен, нажмите и удерживайте его.", "hidden.nfts.info.text.title": "Скрытые NFT", + "hidden.nfts.info.text.web": "These are potential scams and NFTs you’ve hidden. You can click on an NFT to unhide it.", "hidden.tokens.info.banner.text": "Узнайте больше о скрытых токенах", "hidden.tokens.info.text.button": "Скрытые токены ({{numHidden}})", "hidden.tokens.info.text.info": "Это потенциальные скрытые вами мошенничества, небольшие балансы и токены. Скрытые токены не учтены в общем балансе вашего кошелька.", @@ -957,32 +962,16 @@ "landing.uniswapX.subtitle": "Выполняйте свопы на новом уровне без лишних хлопот.", "landing.walletBody": "Надежный некастодиальный криптовалютный кошелек и расширение с миллионами загрузок, профессиональной поддержкой и рейтингом 4,8 балла .", "landing.walletSubtitle": "Выполняйте свопы, храните активы и открывайте для себя новые продукты.", - "language.afrikaans": "Африкаанс", - "language.arabic": "Арабский", - "language.catalan": "Каталонский", "language.chineseSimplified": "Китайский упрощенный", "language.chineseTraditional": "Китайский традиционный", - "language.czech": "Чешский", - "language.danish": "Датский", "language.dutch": "Голландский", "language.english": "Английский", - "language.finnish": "Финский", "language.french": "Французский", - "language.greek": "Греческий", - "language.hebrew": "Иврит", - "language.hindi": "Хинди", - "language.hungarian": "Венгерский", "language.indonesian": "Индонезийский", - "language.italian": "Итальянский", "language.japanese": "Японский", "language.korean": "Корейский", - "language.malay": "Малайский", - "language.norwegian": "Норвежский", - "language.polish": "Польский", "language.portuguese": "Португальский", - "language.romanian": "Румынский", "language.russian": "Русский", - "language.serbian": "Сербский", "language.spanishArgentina": "Испанский (Аргентина)", "language.spanishBelize": "Испанский (Белиз)", "language.spanishBolivia": "Испанский (Боливия)", @@ -1006,11 +995,7 @@ "language.spanishUruguay": "Испанский (Уругвай)", "language.spanishUs": "Испанский (США)", "language.spanishVenezuela": "Испанский (Венесуэла)", - "language.swahili": "Суахили", - "language.swedish": "Шведский", "language.turkish": "Турецкий", - "language.ukrainian": "Украинский", - "language.urdu": "Урду", "language.vietnamese": "Вьетнамский", "large.price.difference": "Большая разница в цене", "large.price.difference.tooltip": "Выполнение этой сделки приведет к потере средств. Такая разница, возможно, обусловлена большим объемом торговли или низкой ликвидностью.", @@ -1114,7 +1099,6 @@ "notification.smartWallet.disabled.all": "Умный кошелек отключен", "notification.smartWallet.disabled.plural": "Отключено в нескольких сетях ({{amount}})", "notification.spam.NFT.failed": "Не удалось пожаловаться на NFT. Попробуйте позже.", - "notification.spam.NFT.successful": "Сообщение отправлено", "notification.swap.network": "Выполняется своп в {{network}}", "notification.swap.pending.swap": "Своп в обработке", "notification.swap.pending.unwrap": "Развертывание в обработке", @@ -1214,6 +1198,7 @@ "onboarding.home.intro.backup.description.mobile": "Составьте план восстановления на случай потери телефона или покупки нового.", "onboarding.home.intro.backup.title": "Создайте резервную копию своего кошелька", "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK и JUP теперь доступны в Unichain", + "onboarding.home.intro.bridgedAssets.description.v2": "DOGE, XRP, XPL, ZEC — now available on Unichain", "onboarding.home.intro.bridgedAssets.title": "Торгуйте новыми токенами в Unichain", "onboarding.home.intro.fund.description": "Пополните свой кошелек, купив криптовалюту или переведя ее с другого счета.", "onboarding.home.intro.fund.title": "Получите свой первый токен", @@ -1438,15 +1423,18 @@ "poolFinder.availablePools.notFound.description": "Соответствующие пулы v2 не найдены. Еще раз проверьте выбранные токены и убедитесь, что подключились к правильному кошельку.", "pools.explore": "Исследование пулов", "portfolio.activity.filters.timePeriod.all": "Все время", - "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", + "portfolio.activity.filters.transactionType.addLiquidity": "Added liquidity", "portfolio.activity.filters.transactionType.all": "Все типы", "portfolio.activity.filters.transactionType.approvals": "Approvals", - "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", - "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.claimFees": "Claimed fees", + "portfolio.activity.filters.transactionType.createPool": "Pools created", "portfolio.activity.filters.transactionType.mints": "Mints", - "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", + "portfolio.activity.filters.transactionType.receives": "Receives", + "portfolio.activity.filters.transactionType.removeLiquidity": "Removed liquidity", + "portfolio.activity.filters.transactionType.sends": "Sends", "portfolio.activity.filters.transactionType.swaps": "Свопы", "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.search.placeholder": "Search activity", "portfolio.activity.table.column.address": "Address", "portfolio.activity.table.column.amount": "Amount", "portfolio.activity.table.column.time": "Time", @@ -1459,7 +1447,12 @@ "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", "portfolio.disconnected.demoWallet.title": "Demo wallet", "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", + "portfolio.nfts.search.placeholder": "Search your NFTs", "portfolio.nfts.title": "NFT", + "portfolio.overview.stats.averageSwapSize": "Average swap size", + "portfolio.overview.stats.swappedThisWeek": "Swapped this week", + "portfolio.overview.stats.swapsThisWeek": "Swaps this week", + "portfolio.overview.stats.totalSwapVolume": "Total swap volume", "portfolio.overview.title": "Обзор", "portfolio.title": "Портфель", "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", @@ -1471,6 +1464,7 @@ "portfolio.tokens.table.column.token": "Токен", "portfolio.tokens.table.column.value": "Стоимость", "portfolio.tokens.title": "Токены", + "portfolio.view": "View portfolio", "position.addHook": "Добавить хук", "position.addHook.tooltip": "Хуки — это расширенная функция, которая позволяет пулам взаимодействовать со смарт-контрактами, открывая различные возможности. Будьте осторожны при добавлении хуков, так как некоторые из них могут быть вредоносными или вызывать непреднамеренные последствия.", "position.addingHook": "Добавление хука", @@ -1588,6 +1582,33 @@ "qrScanner.wallet.networks": "Поддерживаемые сети", "range.outOfView": "Диапазон вне текущего отображения", "removeLiquidity.pooled": "Добавлено в пул {{symbol}}:", + "reporting.activity.unhide.action": "Unhide activity", + "reporting.pool.details.title": "Don’t recognize this position?", + "reporting.token.data.options.price.subtitle": "Token price is wrong or unavailable", + "reporting.token.data.options.price.title": "Price", + "reporting.token.data.options.priceChart.subtitle": "Data is wrong or incomplete", + "reporting.token.data.options.priceChart.title": "Price chart", + "reporting.token.data.options.tokenDetails.subtitle": "Token image, description, or link issue", + "reporting.token.data.options.tokenDetails.title": "Token details", + "reporting.token.data.options.volume.subtitle": "Token volume is wrong or unavailable", + "reporting.token.data.options.volume.title": "Volume", + "reporting.token.data.title": "Data issue", + "reporting.token.options.hiddenFees.subtitle": "Token has undisclosed fees when bought/sold", + "reporting.token.options.hiddenFees.title": "Hidden fees", + "reporting.token.options.imposter.subtitle": "Token seems fraudulent or misleading", + "reporting.token.options.imposter.title": "Imposter token", + "reporting.token.options.other.title": "Something else", + "reporting.token.options.spam.subtitle": "Token appeared in wallet unexpectedly", + "reporting.token.options.spam.title": "Spam token", + "reporting.token.report.button.disabled": "Select an issue", + "reporting.token.report.other.placeholder": "Describe the issue", + "reporting.token.report.title": "Report token", + "reporting.token.report.title.withSymbol": "Report {{symbol}}", + "reporting.token.warning.button": "This warning is incorrect", + "reporting.token.warning.report.placeholder": "Add details (optional)", + "reporting.token.warning.report.submit": "Report issue", + "reporting.token.warning.report.subtitle": "Report an issue if the warning below seems wrong. We’ll take a closer look.", + "reporting.token.warning.report.title": "Report an inaccurate warning", "revoke.failed.message": "Не удалось отменить. Вероятная причина: ошибка сети или проблема с подключением. Проверьте соединение и повторите попытку.", "routing.aggregateLiquidity": "Если доступно, объединяет источники ликвидности для более выгодных цен и свопов без газа.", "routing.aggregateLiquidity.uniswapx": "Протокол UniswapX объединяет источники ликвидности в блокчейне и за его пределами, чтобы вы имели доступ к самым выгодным ценам и выполняли свопы без комиссии за газ.", @@ -1735,6 +1756,7 @@ "settings.setting.backup.status.inProgress": "Резервное копирование в хранилище {{cloudProviderName}}…", "settings.setting.backup.status.recoveryPhrase.backed": "Создана резервная копия", "settings.setting.backup.status.title": "Резервное копирование в хранилище {{cloudProviderName}}", + "settings.setting.balancesActivity.title": "Balances and activity", "settings.setting.beta.tooltip": "Вскоре станет доступным", "settings.setting.biometrics.appAccess.subtitle.android": "Запрашивать распознавание лица или отпечатка пальца при открытии приложения.", "settings.setting.biometrics.appAccess.subtitle.ios": "Запрашивать {{biometricsMethod}} при открытии приложения.", @@ -1786,7 +1808,8 @@ "settings.setting.privacy.analytics.title": "Аналитика приложения", "settings.setting.privateKeys.title": "Закрытые ключи", "settings.setting.recoveryPhrase.title": "Фраза восстановления", - "settings.setting.smallBalances.title": "Баланс портфеля", + "settings.setting.reportedActivity.subtitle": "Transactions you’ve reported as spam will be hidden from your activity feed.", + "settings.setting.reportedActivity.title": "Hide reported activity", "settings.setting.smartWallet.action.enable": "Активировать", "settings.setting.smartWallet.action.smartWallet": "Умный кошелек", "settings.setting.smartWallet.notEligible": "Не соответствует критериям", @@ -2290,6 +2313,8 @@ "transaction.networkCost.label": "Комиссия сети", "transaction.networkCost.maxNativeBalance.description": "Небольшая часть баланса сетевых токенов резервируется для оплаты комиссии сети за эту транзакцию.", "transaction.networkCost.maxNativeBalance.title": "Почему я не могу использовать все средства на своем балансе?", + "transaction.networkCost.presetNativeBalance.description": "You don’t have enough balance to cover both this amount and the network cost of the transaction.", + "transaction.networkCost.presetNativeBalance.title": "Why can’t I use this amount?", "transaction.networkCost.veryHigh.label": "Очень высокая комиссия сети", "transaction.notification.error.cancel": "Невозможно отменить транзакцию", "transaction.notification.error.replace": "Невозможно заменить транзакцию", diff --git a/packages/uniswap/src/i18n/locales/translations/sl-SI.json b/packages/uniswap/src/i18n/locales/translations/sl-SI.json deleted file mode 100644 index 223da00c4b1..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/sl-SI.json +++ /dev/null @@ -1,2563 +0,0 @@ -{ - "account.authHeader.claimReward": "Zahtevajte {{amount}} nagrado", - "account.cloud.backup.subtitle": "Na vašem {{cloudProviderName}}je varnostno kopiranih več fraz za obnovitev.", - "account.cloud.backup.title": "Izberite varnostno kopijo za obnovitev", - "account.cloud.button.restore.android": "Obnovi iz Google Drive", - "account.cloud.button.restore.ios": "Obnovi iz iCloud", - "account.cloud.empty.description": "Videti je, da niste varnostno kopirali nobenega od svojih obnovitvenih stavkov v {{cloudProviderName}}.", - "account.cloud.empty.title": "Najdenih 0 varnostnih kopij", - "account.cloud.error.backup.message": "Uvoz varnostnih kopij ni uspel zaradi pomanjkanja dovoljenj, prekinitve avtorizacije ali zaradi napake v oblaku", - "account.cloud.error.backup.title": "Napaka pri uvozu varnostnih kopij", - "account.cloud.error.password.title": "Neveljavno geslo. Prosim poskusite ponovno.", - "account.cloud.error.unavailable.button.cancel": "Ne zdaj", - "account.cloud.error.unavailable.button.settings": "Pojdite na nastavitve", - "account.cloud.error.unavailable.message.android": "Preverite, ali ste prijavljeni v Google Račun z omogočenim Google Drive v tej napravi, in poskusite znova.", - "account.cloud.error.unavailable.message.ios": "Preverite, ali ste prijavljeni v Apple ID z omogočenim iCloud Drive v tej napravi, in poskusite znova.", - "account.cloud.error.unavailable.title.android": "Google Drive ni na voljo", - "account.cloud.error.unavailable.title.ios": "iCloud Drive ni na voljo", - "account.cloud.loading.title": "Iskanje varnostnih kopij ...", - "account.cloud.lockout.time.hours_one": "Preveč poskusov. Poskusite znova čez 1 uro.", - "account.cloud.lockout.time.hours_other": "Preveč poskusov. Poskusite znova čez {{count}} ur.", - "account.cloud.lockout.time.minutes_one": "Preveč poskusov. Poskusite znova čez 1 minuto.", - "account.cloud.lockout.time.minutes_other": "Preveč poskusov. Poskusite znova čez {{count}} minut.", - "account.cloud.password.input": "Vnesite geslo", - "account.cloud.password.recoveryPhrase": "Namesto tega vnesite obnovitveni izraz", - "account.cloud.password.subtitle": "To geslo je potrebno za obnovitev varnostne kopije obnovitvene fraze iz {{cloudProviderName}}.", - "account.cloud.password.title": "Vnesite varnostno geslo", - "account.downloadWallet.subtitle": "Varnostno kopirajte svojo denarnico, trgujte na poti, prejemajte opozorila o cenah v živo in še več.", - "account.drawer.gitHash": "Zgoščena vrednost Gita: ", - "account.drawer.gitVersion": "Različica: ", - "account.drawer.modal.body": "Varno shranite in zamenjajte žetone z aplikacijo Uniswap. Na voljo za iOS in Android.", - "account.drawer.modal.dont": "Nimate denarnice Uniswap?", - "account.drawer.modal.scan": "Skenirajte z denarnico Uniswap", - "account.drawer.spamToggle": "Skrij neznane žetone in NFT-je", - "account.passkey.delete.acknowledge": "Naredil sem varnostno kopijo obnovitvene fraze in razumem, da mi Uniswap Labs ne more pomagati obnoviti denarnice, če tega ne storim.", - "account.passkey.delete.description": "Prepričajte se, da ste varnostno kopirali obnovitveni stavek z uporabo mobilne aplikacije Uniswap ali razširitve brskalnika.", - "account.passkey.delete.descriptionEmphasized": "Brez fraze za obnovitev morda ne boste mogli dostopati do svoje denarnice.", - "account.passkey.delete.speedbump.description": "Preden nadaljujete, izvedite naslednje korake, da preprečite izgubo dostopa do denarnice in vseh sredstev.", - "account.passkey.delete.speedbump.step1": "Prenesite mobilno aplikacijo Uniswap ali razširitev brskalnika", - "account.passkey.delete.speedbump.step2": "Varnostno kopirajte obnovitveni stavek", - "account.passkey.delete.speedbump.title": "Ali si prepričan?", - "account.passkey.delete.title": "Izbrisati geslo?", - "account.passkey.log.in.title": "Prijava z geslom", - "account.passkey.type.crossplatform": "Telefon, tablica ali varnostni ključ", - "account.passkey.type.platform": "Brskalnik ali operacijski sistem", - "account.passkey.verify.button": "Preverite z geslom", - "account.passkey.verify.description": "Preden nadaljujete, uporabite geslo za potrditev identitete. To pomaga ohranjati varnost vašega računa.", - "account.passkey.verify.title": "Najprej preverimo, ali ste to res vi", - "account.portfolio.activity.canceledBelow": "To naročilo je bilo preklicano, ker je vaše stanje padlo pod vneseni znesek.", - "account.portfolio.activity.signLimit": "To naročilo ne bo izpolnjeno, ker je vaše stanje padlo pod vneseni znesek. Povečajte svoje stanje, da popravite.", - "account.recoveryPhrase.education.part1": "Fraza za obnovitev (ali semenska fraza) je nabor besed , potrebnih za dostop do vaše denarnice, kot geslo.", - "account.recoveryPhrase.education.part2": "Lahko vnesete vaš obnovitveni stavek v novi napravi , da obnovite svojo denarnico in njeno vsebino.", - "account.recoveryPhrase.education.part3": "Toda če izgubite obnovitveni stavek, boste izgubili dostop do svoje denarnice.", - "account.recoveryPhrase.education.part4": "Namesto da bi si zapomnili obnovitveni stavek, ga lahko varnostno kopirate na {{cloudProviderName}} in zaščitite z geslom.", - "account.recoveryPhrase.education.part5": "Svoj obnovitveni stavek lahko tudi ročno varnostno kopirate tako, da ga zapišete in shranite na varno mesto.", - "account.recoveryPhrase.education.part6": "Priporočamo uporabo obeh vrst varnostnih kopij, ker če izgubite stavek za obnovitev, ne boste mogli obnoviti svoje denarnice.", - "account.recoveryPhrase.error.invalid": "Neveljavna fraza", - "account.recoveryPhrase.error.invalidWord": "Neveljavna beseda: {{word}}", - "account.recoveryPhrase.error.phraseLength": "Fraza za obnovitev mora vsebovati 12–24 besed", - "account.recoveryPhrase.error.wordIsAddress": "Vnesli ste naslov, ne fraze za obnovitev", - "account.recoveryPhrase.error.wrong": "Napačen izraz za obnovitev", - "account.recoveryPhrase.helpText.import": "Kako najdem svojo frazo za obnovitev?", - "account.recoveryPhrase.helpText.restoring": "Poskusite znova iskati", - "account.recoveryPhrase.input": "Vnesite besedno zvezo za obnovitev", - "account.recoveryPhrase.remove.final.description": "Prepričajte se, da ste zapisali svojo obnovitveno frazo ali jo varnostno kopirali na {{cloudProviderName}}. Drugače ne boste mogli dostopati do svojih sredstev.", - "account.recoveryPhrase.remove.final.title": "Odstranjujete svoj obnovitveni stavek", - "account.recoveryPhrase.remove.import.description": "Naenkrat lahko shranite samo en obnovitveni stavek. Če želite nadaljevati z uvozom nove denarnice, boste morali iz te naprave odstraniti svojo trenutno obnovitveno frazo in vse povezane denarnice.", - "account.recoveryPhrase.remove.initial.description": "S tem boste iz te naprave odstranili vašo denarnico skupaj z obnovitveno frazo.", - "account.recoveryPhrase.remove.initial.title": "Odstranjujete {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "Vaša obnovitvena fraza bo ostala shranjena, dokler ne izbrišete vseh preostalih denarnic.", - "account.recoveryPhrase.subtitle.import": "Vaša fraza za obnovitev bo shranjena samo lokalno v vaši napravi.", - "account.recoveryPhrase.subtitle.restoring": "Spodaj vnesite besedno zvezo za obnovitev ali poskusite znova poiskati varnostne kopije.", - "account.recoveryPhrase.title.import": "Vnesite svojo frazo za obnovitev", - "account.recoveryPhrase.title.restoring": "Ni varnostnih kopij", - "account.wallet.action.copy": "Kopiraj naslov", - "account.wallet.action.manageConnections": "Upravljanje povezav", - "account.wallet.action.report": "Prijavi profil", - "account.wallet.action.viewExplorer": "Poglej na {{blockExplorerName}}", - "account.wallet.button.add": "Dodaj denarnico", - "account.wallet.button.addViewOnly": "Dodajte denarnico samo za ogled", - "account.wallet.button.create": "Ustvarite novo denarnico", - "account.wallet.button.import": "Uvozite novo denarnico", - "account.wallet.button.manage": "Nastavitve denarnice", - "account.wallet.button.remove": "Odstrani denarnico", - "account.wallet.button.watch": "Pazi na denarnico", - "account.wallet.create.placeholder": "Denarnica {{index}}", - "account.wallet.edit.label.input.placeholder": "Oznaka denarnice", - "account.wallet.header.button.disabled.title": "Uredi profil", - "account.wallet.header.button.title": "Uredi oznako", - "account.wallet.header.viewOnly": "Denarnice samo za ogled", - "account.wallet.menu.claimUsername": "Zahtevaj uporabniško ime", - "account.wallet.menu.copy.title": "Kopiraj naslov denarnice", - "account.wallet.menu.edit.title": "Uredi oznako", - "account.wallet.menu.manageConnections": "Upravljanje povezav", - "account.wallet.menu.remove.title": "Odstrani denarnico", - "account.wallet.remove.check": "Naredil sem varnostno kopijo svoje obnovitvene fraze in razumem, da mi Uniswap Labs ne more pomagati obnoviti mojih denarnic, če tega ne storim.", - "account.wallet.remove.title": "Odstrani {{name}}", - "account.wallet.remove.viewOnly": "Vedno lahko nazaj dodate denarnice samo za ogled, tako da vnesete naslov denarnice.", - "account.wallet.restore.new_device.description": "Ker uporabljate novo napravo, boste morali za nadaljevanje obnoviti geslo za obnovitev ali vnesti geslo za varnostno kopiranje v oblaku.", - "account.wallet.restore.new_device.title": "Obnovite svojo denarnico", - "account.wallet.restore.seed_phrase.description": "V vaši napravi manjka obnovitvena fraza. Da ne boste nikoli izgubili dostopa do svojih sredstev, boste morali obnoviti svojo denarnico.", - "account.wallet.restore.seed_phrase.title": "Obnovite svojo denarnico", - "account.wallet.select.error": "Naslovov ni bilo mogoče naložiti", - "account.wallet.select.loading.subtitle": "Vaše denarnice bodo prikazane spodaj.", - "account.wallet.select.loading.title": "Iskanje denarnic", - "account.wallet.select.smartWalletDisclaimer": "Privzeto bodo vse upravičene denarnice po uvozu uporabljale funkcije pametne denarnice. Kaj je pametna denarnica?", - "account.wallet.select.title_one_one": "Najdena ena denarnica", - "account.wallet.select.title_one_other": "Izberite denarnice za uvoz", - "account.wallet.viewOnly.button": "Uvoz denarnice", - "account.wallet.viewOnly.description": "Če želite zamenjati, kupiti, poslati in prejeti žetone, morate uvoziti obnovitveno frazo te denarnice.", - "account.wallet.viewOnly.title": "Ta denarnica je samo za ogled", - "account.wallet.watch.error.alreadyImported": "Ta naslov je že uvožen", - "account.wallet.watch.error.notFound": "Naslov ni bil najden", - "account.wallet.watch.error.smartContract": "Naslov je pametna pogodba", - "account.wallet.watch.message": "Če dodate denarnico samo za ogled, lahko preizkusite aplikacijo ali sledite denarnici. Ne boste mogli zamenjati ali poslati sredstev.", - "account.wallet.watch.placeholder": "ENS ali naslov", - "account.wallet.watch.title": "Vnesite naslov denarnice", - "activity.pending": "{{pendingActivityCount}} V teku", - "activity.transaction.lpRewards.descriptor": "Zbranih {{symbol}} nagrad", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} do {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} za {{amountWithSymbolB}}", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} in {{amountWithSymbolB}}", - "addLiquidity.shareOfPool": "Delež bazena", - "addressInput.recipient": "Prejemnik", - "analytics.allow": "Dovoli analitiko", - "analytics.allow.message": "Anonimizirane podatke uporabljamo za izboljšanje vaše izkušnje z izdelki Uniswap Labs.", - "appRating.button.notReally": "res ne", - "appRating.description": "Sporočite nam, če imate dobro izkušnjo s to aplikacijo", - "appRating.extension.review.description": "Izberite oceno z zvezdicami in pustite mnenje v spletni trgovini Chrome.", - "appRating.extension.review.title": "Ocenite razširitev Uniswap?", - "appRating.extension.title": "Uživate v razširitvi Uniswap?", - "appRating.feedback.button.send": "Pošlji povratno informacijo", - "appRating.feedback.description": "Sporočite nam, kako lahko izboljšamo vašo izkušnjo", - "appRating.feedback.title": "Žal nam je, da to slišimo.", - "appRating.mobile.title": "Uživate v denarnici Uniswap?", - "bridgedAsset.modal.button": "Nadaljujte z menjavo", - "bridgedAsset.modal.description": "To je {{chainName}} različica {{currencySymbol}} , ki jo podpira in ohranja enako ceno kot izvorna {{currencySymbol}}.", - "bridgedAsset.modal.feature.securelyBacked": "Varno podprto", - "bridgedAsset.modal.feature.securelyBacked.description": "1:1 podprto z izvornim {{currencySymbol}}.", - "bridgedAsset.modal.feature.tradeSeamlessly": "Trgujte brezhibno", - "bridgedAsset.modal.feature.tradeSeamlessly.description": "Kupujte in prodajajte {{currencySymbol}} , ne da bi zapustili Uniswap.", - "bridgedAsset.modal.feature.withdrawToNativeChain": "Dvignite na {{nativeChainName}}", - "bridgedAsset.modal.feature.withdrawToNativeChain.description": "Kadar koli se lahko povežete nazaj v izvorno omrežje.", - "bridgedAsset.modal.title": "Trgujte {{currencySymbol}} na {{chainName}}", - "bridgedAsset.send.warning.description": "Pošiljate zavito različico {{currencySymbol}} na {{chainName}}. Pošiljanje na centralizirano menjalnico bo povzročilo trajno izgubo sredstev.", - "bridgedAsset.send.warning.title": "Prepričajte se, da pošiljate na združljiv naslov", - "bridgedAsset.tdp.description": "To je premostitvena različica {{currencySymbol}} , ki je v razmerju 1:1 podprta z izvornim {{currencySymbol}}.", - "bridgedAsset.wormhole.button": "Nadaljujte do črvine", - "bridgedAsset.wormhole.description": "Nadaljujte do portala črvine, da premostite svojo {{currencySymbol}} iz {{chainName}} v {{nativeChainName}}.", - "bridgedAsset.wormhole.title": "Umaknite {{currencySymbol}} do {{nativeChainName}}", - "bridgedAsset.wormhole.toNativeChain": "do {{nativeChainName}}", - "bridgedAsset.wormhole.withdrawToNativeChain": "Dvignite na {{nativeChainName}}", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "chart.candlestick": "Svečnik", - "chart.error.pools": "Ni mogoče prikazati zgodovinskih podatkov za trenutno skupino.", - "chart.error.tokens": "Ni mogoče prikazati zgodovinskih podatkov za trenutni žeton.", - "chart.line": "Črtni grafikon", - "chart.missingData": "Manjkajo podatki grafikona", - "chart.price.label.close": "Zapri", - "chart.price.label.high": "visoko", - "chart.price.label.low": "Nizka", - "chart.price.label.open": "Odprto", - "chart.settings.unavailable.label": "Ta nastavitev ni na voljo za trenutni grafikon", - "claim.thanks": "Hvala, ker ste del skupnosti Uniswap ", - "claim.uni.arrived": "UNI je prišel", - "common.about": "O tem", - "common.accept": "Sprejmi", - "common.active": "Aktiven", - "common.activeNetworks": "Aktivna omrežja", - "common.activity": "dejavnost", - "common.add.label": "Dodaj", - "common.add.liquidity.canceled": "Dodajanje likvidnosti preklicano", - "common.addLiquidity": "Dodajte likvidnost", - "common.address": "Naslov", - "common.addressOrENS": "Naslov denarnice ali ime ENS", - "common.advanced": "Napredno", - "common.all": "Vse", - "common.allTime": "Ves čas", - "common.and": "in", - "common.app": "aplikacija", - "common.approved": "Odobreno", - "common.approvePending": "Odobritev v teku...", - "common.approvePermitTx": "Odobri zahtevo {{indexText}}", - "common.approvePermitTx.active": "Zahteva za odobritev{{indexText}} v denarnici", - "common.approvePermitTx.explainer": "Kaj so odobritve Permit2?", - "common.approvePermitTx.pending": "Odobritev zahteve {{indexText}}...", - "common.approveSpend": "Odobrite {{symbol}} porabo", - "common.approving": "Odobritev", - "common.approximatelyValue": "~{{value}}", - "common.areYouSure": "Ali si prepričan?", - "common.automatic": "Avto", - "common.availableIn": "Uniswap na voljo v: ", - "common.availableOnIOSAndroidChrome": "Na voljo v sistemih iOS, Android in Chrome", - "common.backToPositions": "Nazaj na položaje", - "common.bestRoute": "Pot", - "common.bestRoute.with": "Pot preko {{provider}}", - "common.biometrics.generic": "Biometrija", - "common.biometrics.touchId": "Dotik ID-ja", - "common.biometrics.windowsHello": "Pozdravljeni v sistemu Windows", - "common.blocked.ifError": "Če menite, da je to napaka, pošljite e-poštno sporočilo s svojim naslovom na ", - "common.blocked.reason": "Ta naslov je blokiran v vmesniku Uniswap Labs, ker je povezan z eno ali več blokiranimi dejavnostmi.", - "common.blockedAddress": "Blokiran naslov", - "common.blog": "Blog", - "common.bought": "kupljeno", - "common.brandAssets": "Sredstva blagovne znamke", - "common.button.accept": "Sprejmi", - "common.button.back": "Nazaj", - "common.button.buy": "Nakup", - "common.button.cancel": "Prekliči", - "common.button.checkin": "Prijava", - "common.button.close": "Zapri", - "common.button.confirm": "Potrdi", - "common.button.connect": "Povežite se", - "common.button.continue": "Nadaljuj", - "common.button.copied": "Kopirano", - "common.button.copy": "Kopirati", - "common.button.create": "Ustvari", - "common.button.delete": "Izbriši", - "common.button.disable": "Onemogoči", - "common.button.disabling": "Onemogočanje", - "common.button.disconnect": "Prekini povezavo", - "common.button.dismiss": "Odpusti", - "common.button.done": "Končano", - "common.button.edit": "Uredi", - "common.button.enable": "Omogoči", - "common.button.finish": "Končaj", - "common.button.goBack": "Pojdi nazaj", - "common.button.later": "Mogoče kasneje", - "common.button.learn": "Nauči se več", - "common.button.next": "Naslednji", - "common.button.notNow": "Ne zdaj", - "common.button.ok": "v redu", - "common.button.paste": "Prilepi", - "common.button.pay": "plačaj", - "common.button.proceed": "Nadaljuj", - "common.button.receive": "Prejeti", - "common.button.remove": "Odstrani", - "common.button.reset": "Ponastavi", - "common.button.retry": "Poskusite znova", - "common.button.reveal": "Razkrij", - "common.button.review": "Pregled", - "common.button.save": "Shrani", - "common.button.scrollDown": "Pomaknite navzdol", - "common.button.sell": "Prodaja", - "common.button.send": "Pošlji", - "common.button.setup": "Nastaviti", - "common.button.share": "Deliti", - "common.button.showLess": "Prikaži manj", - "common.button.showMore": "Pokaži več", - "common.button.sign": "Podpis", - "common.button.skip": "Preskoči", - "common.button.swap": "Zamenjaj", - "common.button.tryAgain": "Poskusi ponovno", - "common.button.understand": "razumem", - "common.button.unlock": "Odkleni", - "common.button.view": "Pogled", - "common.button.viewDetails": "Poglej podrobnosti", - "common.button.yes": "ja", - "common.buy.label": "Nakup", - "common.buyAndSell": "Kupujte in prodajajte na Uniswap", - "common.cancellationSubmitted": "Preklic oddan", - "common.cancellationSuccessful": "Preklic uspešen", - "common.cancelOrder": "Prekliči naročilo", - "common.card.error.description": "Nekaj je šlo narobe", - "common.card.error.title": "Ups! Nekaj je šlo narobe.", - "common.careers": "Kariere", - "common.chain.networkCost": "{{chain}} stroški omrežja", - "common.chart": "grafikon", - "common.checkNetwork": "Preverite stanje omrežja tukaj.", - "common.chromeExtension": "Razširitev", - "common.claim.failed": "Zahtevek ni uspel", - "common.claimed": "Zahtevano", - "common.claiming": "Zahtevanje", - "common.claimUnis": "Zahtevajte svoje žetone UNI", - "common.clear": "jasno", - "common.close": "Zapri", - "common.closed": "Zaprto", - "common.collect.button": "Zberite", - "common.company": "Podjetje", - "common.confirm": "Potrdi", - "common.confirmCancellation": "Potrdite preklic", - "common.confirmed": "Potrjeno", - "common.confirmSend.button": "Potrdi pošiljanje", - "common.confirmSwap": "Potrdite zamenjavo v denarnici", - "common.confirmTimedOut": "Čas potrditve je potekel. Poskusite znova.", - "common.confirmTransfer": "Potrdi prenos", - "common.confirmWallet": "Potrdi v denarnici", - "common.connect.button": "Povežite se", - "common.connectAWallet.button": "Povežite denarnico", - "common.connectAWallet.button.evm": "Povežite denarnico Ethereum", - "common.connectAWallet.button.evm.switch": "Preklopite denarnico Ethereum", - "common.connectAWallet.button.svm": "Povežite denarnico Solana", - "common.connectAWallet.button.svm.switch": "Denarnica Switch Solana", - "common.connectAWallet.button.switch": "Preklopi denarnico", - "common.connectTo": "Poveži se z {{platform}}", - "common.connectWallet.button": "Povežite denarnico", - "common.contactUs.button": "Kontaktiraj nas", - "common.copied": "Kopirano", - "common.copy.address": "Kopiraj naslov", - "common.copy.poolId": "Kopiraj ID skupine", - "common.copyLink.button": "Kopiraj povezavo", - "common.created.date": "Ustvarjeno {{date}}", - "common.currency": "Valuta", - "common.currentPrice": "Trenutna cena", - "common.custom": "Po meri", - "common.customRange": "Razpon po meri", - "common.dataOutdated": "Podatki so lahko zastareli", - "common.day": "dan", - "common.default": "Privzeto", - "common.defaultTradeOptions": "Privzete trgovalne možnosti", - "common.deposit.toNetwork": "Položite žetone v omrežje {{label}} .", - "common.depositing": "Deponiranje", - "common.depositTokens": "Depozitni žetoni", - "common.detected": "Zaznano", - "common.developers": "Razvijalci", - "common.device": "Ta naprava", - "common.device.other": "Druga naprava", - "common.dismiss": "Odpusti", - "common.docs": "Dokumenti", - "common.donate": "Donirajte", - "common.done": "Končano", - "common.dontShowAgain": "Ne pokaži več tega", - "common.download": "Prenesi", - "common.downloadAppStore": "Prenesite v App Store", - "common.downloadPlayStore": "Prenesite v Trgovini Play", - "common.downloadUniswapApp": "Prenesite aplikacijo Uniswap", - "common.downloadUniswapWallet": "Prenesite denarnico Uniswap", - "common.dynamic": "Dinamično", - "common.edit.button": "Uredi", - "common.ended": "Končano", - "common.error.details": "Podrobnosti o napaki", - "common.error.general": "Nekaj je šlo narobe", - "common.error.label": "Napaka", - "common.error.request": "Žal je med obdelavo vaše zahteve prišlo do napake. Če zahtevate podporo, ne pozabite kopirati podrobnosti te napake.", - "common.error.somethingWrong": "Nekaj je šlo narobe!", - "common.errorConnecting.error": "Napaka v povezavi", - "common.errorLoadingData.error": "Napaka pri nalaganju podatkov", - "common.etherscan": "Etherscan", - "common.expiry": "Iztek", - "common.explore": "Raziščite", - "common.explorer": "raziskovalec", - "common.exploreTokens": "Raziščite žetone", - "common.extension": "Razširitev Uniswap", - "common.failedSwitchNetwork": "Preklop omrežij ni uspel", - "common.fee": "Pristojbina", - "common.fees": "Pristojbine", - "common.feesEarned": "Zasluženi honorarji", - "common.feesEarnedPerBase": "{{symbolA}} na {{symbolB}}", - "common.for": "Za", - "common.free": "Brezplačno", - "common.fullRange": "Celoten obseg", - "common.getApp": "Prenesite aplikacijo", - "common.getHelp.button": "Poišči pomoč", - "common.getStarted": "Začnite", - "common.getSupport.button": "Pridobite podporo", - "common.getTheApp": "Prenesite aplikacijo", - "common.getUniswapWallet": "Pridobite denarnico Uniswap", - "common.getUniswapWallet.mobile": "Prenesite mobilno aplikacijo Uniswap", - "common.governance": "Upravljanje", - "common.happyHolidays": "Vesele praznike želi ekipa Uniswap!", - "common.help": "Pomoč", - "common.helpCenter": "Center pomoči", - "common.hidden": "Skrito", - "common.hide.button": "Skrij se", - "common.highPrice": "Visoka cena", - "common.includes": "Vključuje", - "common.info.label": "Informacije", - "common.input.noRecipient.error": "Izberite prejemnika", - "common.input.password.confirm": "Potrdi geslo", - "common.input.password.error.mismatch": "Gesli se ne ujemata", - "common.input.password.error.weak": "To geslo je prešibko", - "common.input.password.new": "Novo geslo", - "common.input.password.placeholder": "Geslo", - "common.input.password.strength.medium": "Srednje", - "common.input.password.strength.strong": "Močna", - "common.input.password.strength.weak": "Šibko", - "common.input.search": "Iskanje", - "common.insufficient.funds": "Nezadostna sredstva", - "common.insufficientBalance.error": "Nezadostno stanje", - "common.insufficientFundsForNetworkFee.error": "Premalo sredstev za pokritje stroškov omrežja", - "common.insufficientTokenBalance.error": "Nezadostno {{tokenSymbol}} stanje", - "common.insufficientTokenBalance.error.simple": "Ni dovolj {{tokenSymbol}}", - "common.invalidPair": "Neveljaven par", - "common.invalidRecipient.error": "Neveljaven prejemnik", - "common.iOSAndroid": "iOS in Android", - "common.language": "Jezik", - "common.learnMoreSwap": "Več o zamenjavah", - "common.legalAndPrivacy": "Pravno in zasebnost", - "common.less": "Manj", - "common.limit.cancel_one": "Prekliči omejitev", - "common.limit.cancel_other": "Prekliči {{count}} omejitve", - "common.limit.canceled": "Omejitev preklicana", - "common.limit.executed": "Omejitev izvršena", - "common.limit.expired": "Omejitev je potekla", - "common.limit.failed": "Omejitev ni uspela", - "common.limit.opened": "Limit odprt", - "common.limit.pending": "Omejitev v teku", - "common.limits": "Omejitve", - "common.limits.approachMax": "Približuje se omejitvi 100", - "common.limits.cancelProceed": "Za nadaljevanje prekličite omejitve", - "common.limits.expires": "Poteče {{timestamp}}", - "common.limits.open": "Odprte meje", - "common.limits.when": "ko {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "Povezave", - "common.liquidity": "Likvidnost", - "common.liquidity.provision": "Zagotavljanje likvidnosti", - "common.liquidity.removed": "Odstranjena likvidnost", - "common.loading": "nalaganje", - "common.longText.button.less": "Berite manj", - "common.longText.button.more": "Preberi več", - "common.lowPrice": "Nizka cena", - "common.manage": "Upravljaj", - "common.market.label": "trg", - "common.marketPrice": "Tržna cena", - "common.marketPrice.fetching": "Pridobivanje tržne cene ...", - "common.marketPrice.label": "Tržna cena:", - "common.marketPrice.unavailable": "Tržne cene ni mogoče najti. Opravite lastno raziskavo, da preprečite izgubo sredstev.", - "common.max": "maks", - "common.message": "Sporočilo", - "common.migrate": "preseliti", - "common.migrate.liquidity.failed": "Selitev likvidnosti ni uspela", - "common.migrate.position": "Preseliti položaj", - "common.migrated.liquidity": "Preseljena likvidnost", - "common.migrating.liquidity": "Selitev likvidnosti", - "common.min": "Min", - "common.more": "več", - "common.moreDetails": "Več podrobnosti", - "common.navigation.settings": "nastavitve", - "common.navigation.systemSettings": "nastavitve", - "common.navigationButton": "Navigacijski gumb", - "common.needHelp": "Rabim pomoč?", - "common.networkCost": "Stroški omrežja", - "common.neverMind": "Pozabi", - "common.new": "Novo", - "common.new.exclamation": "Novo!", - "common.nft": "NFT", - "common.nfts": "NFT-ji", - "common.noAmount.error": "Vnesite znesek", - "common.noData": "Ni podatkov", - "common.none": "Nobena", - "common.noResults": "Ni zadetkov.", - "common.notAvailableInRegion.error": "Ni na voljo v vaši regiji", - "common.notCreated.label": "Ni ustvarjeno", - "common.notSupported": "Ni podprto", - "common.oneDay": "1 dan", - "common.oneDay.short": "1D", - "common.oneHour.short": "1H", - "common.oneMonth": "1 mesec", - "common.oneWeek": "1 teden", - "common.oneYear": "1 leto", - "common.opensea.link": "Pogled na OpenSea", - "common.orderCanceled": "Naročilo preklicano", - "common.orderExecuted": "Naročilo izvršeno", - "common.orderExpired": "Naročilo je poteklo", - "common.orderPending": "Naročilo v teku", - "common.outOfRange": "Izven dosega", - "common.pageNotFound": "Stran ni najdena!", - "common.passkey.count": "Geslo {{number}}", - "common.passkeys": "Gesla", - "common.passkeys.add": "Dodajte geslo", - "common.passkeys.add.description": "Izberite, kam želite shraniti novo geslo.", - "common.pastDay": "Pretekli dan", - "common.pastFiveMinutes": "Zadnjih pet minut", - "common.pastHour": "Pretekla ura", - "common.pastMonth": "Prejšnji mesec", - "common.pastWeek": "Prejšnji teden", - "common.pastYear": "Preteklo leto", - "common.pending": "V teku", - "common.pending.cancellation": "Čaka na preklic", - "common.pendingEllipsis": "V teku...", - "common.permit": "Dovoljenje", - "common.plusMore": "+{{number}} več", - "common.pool": "Bazen", - "common.pools": "Bazeni", - "common.portfolio": "Portfolio", - "common.poweredBy": "Poganja ", - "common.price": "Cena", - "common.priceUpdated": "Cena posodobljena", - "common.privacyChoices": "Vaše izbire glede zasebnosti", - "common.privacyChoices.checkbox.description": "Ko je označeno, vaših podatkov ne bomo delili s partnerji tretjih oseb za prilagojeno oglaševanje. Skupno rabo lahko omogočite kadar koli, tako da počistite to polje.", - "common.privacyChoices.checkbox.label": "Ne deli mojih podatkov", - "common.privacyChoices.description": "Identifikatorje naprav lahko delimo z našimi oglaševalskimi partnerji za promocijo naših storitev na drugih spletnih mestih in platformah. Kadar se to po veljavni zakonodaji šteje za prodajo, skupno rabo ali ciljano oglaševanje, se lahko odjavite tako, da označite polje »ne deli mojih podatkov«. Za več informacij o naših praksah glede zasebnosti si oglejte naš pravilnik o zasebnosti.", - "common.privacyChoices.disclaimer": "Upoštevajte, da bo vaša izbira veljala samo za ta brskalnik v tej napravi. Prav tako se lahko odjavite tako, da omogočite nastavitev Global Privacy Control v brskalniku, ki ga uporabljate za dostop do naših storitev. Če želite videti več možnosti, pojdite v nastavitve.", - "common.privacyPolicy": "Politika zasebnosti", - "common.proceed": "Nadaljuj", - "common.proceedInWallet": "Nadaljujte v denarnici", - "common.products": "Izdelki", - "common.protocol": "Protokol", - "common.protocol.v2": "Uniswap v2", - "common.protocol.v3": "Uniswap v3", - "common.protocol.v4": "Uniswap v4", - "common.purchased": "Kupljeno", - "common.rate": "Oceniti", - "common.readMore": "Preberi več", - "common.receive": "Prejeti", - "common.received": "Prejeto", - "common.recent": "Nedavno", - "common.refresh": "Osveži", - "common.reload.label": "Ponovno naložite aplikacijo", - "common.remove.label": "Odstrani", - "common.remove.liquidity.canceled": "Odstranitev likvidnosti preklicana", - "common.remove.liquidity.failed": "Odstranjevanje likvidnosti ni uspelo", - "common.removing.liquidity": "Odstranjevanje likvidnosti", - "common.resetLimit": "Ponastavi omejitev {{symbol}}", - "common.resetLimitWallet": "Ponastavi omejitev {{symbol}} v denarnici", - "common.resettingLimit": "Ponastavitev omejitve {{symbol}}...", - "common.revoke.approval.failed": "Preklic odobritve ni uspel", - "common.revoked.approval": "Preklicana odobritev", - "common.revoking.approval": "Preklic odobritve", - "common.scanQRDownload": "Za prenos skenirajte kodo QR s telefonom", - "common.selectRegion.label": "Izberite svojo regijo", - "common.selectToken.label": "Izberite žeton", - "common.sell.label": "Prodaja", - "common.send.button": "Pošlji", - "common.send.failed": "Pošiljanje ni uspelo", - "common.sending": "Pošiljanje", - "common.sent": "Poslano", - "common.settings": "nastavitve", - "common.share": "Deliti", - "common.share.shareToTwitter": "Delite na Twitterju", - "common.show.button": "Prikaži", - "common.showLess.button": "Prikaži manj", - "common.showMore.button": "Pokaži več", - "common.signatureExpired": "Vaš podpis je potekel.", - "common.signMessage": "Podpišite sporočilo", - "common.signMessageWallet": "Podpišite sporočilo v denarnici", - "common.socials": "Družbena omrežja", - "common.sold": "prodano", - "common.stats": "Statistika", - "common.status": "Stanje", - "common.step.number": "Korak {{number}}", - "common.step.number.of": "Korak {{current}} od {{total}}", - "common.swap": "Zamenjaj", - "common.swap.expired": "Menjava je potekla", - "common.swap.failed": "Zamenjava ni uspela", - "common.swapPending": "Zamenjava v teku...", - "common.termsOfService": "Pogoji storitve", - "common.text.connected": "Povezan", - "common.text.contract": "Pogodba", - "common.text.disconnected": "Prekinjena povezava", - "common.text.error": "Napaka", - "common.text.notAvailable": "N/A", - "common.text.recipient": "Za", - "common.text.sender": "Od", - "common.text.unknown": "Neznano", - "common.thisAccount": "ta račun", - "common.thisMonth": "Ta mesec", - "common.thisToken": "Ta žeton", - "common.thisWeek": "Ta teden", - "common.thisYear": "To leto", - "common.time": "Čas", - "common.time.minute.amt": "{{time}}m", - "common.time.minutes": "minut", - "common.time.past.days": "{{days}} dni", - "common.time.past.days.short": "{{days}}d", - "common.time.past.hours": "{{hours}} ur", - "common.time.past.hours.short": "{{hours}}h", - "common.time.past.minutes.short": "{{minutes}}m", - "common.time.past.months.short": "{{months}}mes", - "common.time.past.seconds.short": "{{seconds}}s", - "common.to": "za", - "common.today": "Danes", - "common.tokenA": "Žeton A", - "common.tokenAmount": "Žetonski znesek", - "common.tokenB": "Žeton B", - "common.tokenName": "Ime žetona", - "common.tokens": "Žetoni", - "common.totalUniswapTVL": "Skupna Uniswap TVL", - "common.totalValueLocked": "TVL", - "common.trade": "Trgovina", - "common.trademarkPolicy": "Politika blagovnih znamk", - "common.transactionDetails": "Podrobnosti transakcije", - "common.transactionId": "Številka transakcije", - "common.transactionPending": "Transakcija v teku", - "common.transactions": "Transakcije", - "common.transactionSettings": "Nastavitve transakcije", - "common.transfer_one": "prenos", - "common.transfer_other": "prenosi", - "common.tryAgain.error": "Poskusi ponovno", - "common.twitter": "Twitter", - "common.type.label": "Vrsta", - "common.unavailable": "Ni na voljo", - "common.unhide": "Razkrij", - "common.unichain": "Unichain", - "common.uniswapMobile": "Uniswap Mobile", - "common.uniswapWallet": "Uniswap denarnica", - "common.uniswapX": "UniswapX", - "common.unknown": "Neznano", - "common.unknownError.error": "Neznana napaka", - "common.unwrap.button": "Odvij", - "common.unwrap.failed": "Odvijanje ni uspelo", - "common.unwrapped": "Odvito", - "common.unwrapping": "Odvijanje", - "common.view.profile": "Prikaži profil", - "common.viewOnExplorer": "Ogled v Raziskovalcu", - "common.volume": "Glasnost", - "common.vote": "Glasujte", - "common.wallet.approve": "Odobri v denarnici", - "common.wallet.label": "Denarnica", - "common.warning": "Opozorilo", - "common.webApp": "Spletna aplikacija", - "common.website": "Spletna stran", - "common.whyApprove": "Zakaj moram odobriti žeton?", - "common.whySign": "Zakaj so potrebni podpisi?", - "common.whyWrap": "Zakaj moram zaviti svoj {{symbol}}?", - "common.withdraw": "Umik", - "common.withdrawal.amount": "Znesek dviga", - "common.withinRange": "V dosegu", - "common.wrap": "Ovijte {{symbol}}", - "common.wrap.failed": "Ovijanje ni uspelo", - "common.wrapIn": "Zavij {{symbol}} v denarnico", - "common.wrapped": "Zavito", - "common.wrapping": "Zavijanje", - "common.wrappingToken": "Zavijanje {{symbol}}...", - "common.yesterday": "včeraj", - "common.your.account.had.insufficient.funds": "Na vašem računu ni bilo dovolj sredstev za dokončanje te zamenjave.", - "common.your.account.has.insufficient.funds": "Na vašem računu ni dovolj sredstev za dokončanje te zamenjave.", - "common.your.connected.wallet": "Vaša povezana denarnica", - "common.your.limit.could.not.be.fulfilled": "Vaše omejitve trenutno ni bilo mogoče doseči. Prosim poskusite ponovno.", - "common.your.swap.could.not.be.fulfilled": "Vaše zamenjave trenutno ni bilo mogoče izvesti. Prosim poskusite ponovno.", - "common.youreBuying": "Ti kupuješ", - "common.youReceive": "Ti prejmeš", - "common.youreSelling": "Prodajaš", - "currency.ars": "Argentinski peso", - "currency.aud": "avstralski dolar", - "currency.brl": "Brazilski Real", - "currency.cad": "kanadski dolar", - "currency.cny": "kitajski juan", - "currency.cop": "Kolumbijski peso", - "currency.eur": "Evro", - "currency.gbp": "britanski funt", - "currency.hkd": "hongkonški dolar", - "currency.idr": "indonezijska rupija", - "currency.inr": "Indijska rupija", - "currency.jpy": "Japonski jen", - "currency.krw": "južnokorejski Won", - "currency.mxn": "Mehiški peso", - "currency.ngn": "Nigerijska Naira", - "currency.pkr": "pakistanska rupija", - "currency.rub": "ruski rubelj", - "currency.sgd": "singapurski dolar", - "currency.try": "turška lira", - "currency.uah": "Ukrajinska grivna", - "currency.usd": "Ameriški dolar", - "currency.vnd": "vietnamski dong", - "dapp.request.actionCannotBeCompleted.description": "Nekatere funkcije niso na voljo, ker nastavitve pametne denarnice upravlja druga aplikacija za denarnico.", - "dapp.request.actionCannotBeCompleted.header": "Zahteva za podpis", - "dapp.request.actionCannotBeCompleted.title": "Dejanja ni mogoče dokončati", - "dapp.request.approve.action": "odobri", - "dapp.request.approve.fallbackTitle": "Odobrite to mesto za dostop do žetonov", - "dapp.request.approve.helptext": "Dovoli temu spletnemu mestu dostop do tega žetona in njegovo porabo za transakcije. Prepričajte se, da zaupate tej strani.", - "dapp.request.approve.label": "Denarnica", - "dapp.request.approve.title": "Odobri dostop do {{tokenSymbol}}", - "dapp.request.base.title": "Zahteva za transakcijo", - "dapp.request.bridge.description": "Premaknite ETH, USDC in več v {{numChains}}+ omrežjih.", - "dapp.request.bridge.title": "Poskušaš premostiti?", - "dapp.request.connect.helptext": "Dovolite temu mestu, da si ogleda vaš naslov denarnice, stanje in zahteva odobritve za transakcije.", - "dapp.request.connect.title": "Povežite se s spletnim mestom", - "dapp.request.fallback.calldata.label": "Surovi podatki", - "dapp.request.fallback.function.label": "funkcija", - "dapp.request.permit2.description": "Permit2 upravlja odobritve žetonov v več aplikacijah.", - "dapp.request.permit2.header": "Podpis dovoljenja 2", - "dapp.request.permit2approve.action": "odobri", - "dapp.request.permit2approve.helptext": "Permit2 upravlja odobritve žetonov v več aplikacijah.", - "dapp.request.permit2approve.title": "Odobritev dovoljenja2", - "dapp.request.reject.action": "Zavrni vse", - "dapp.request.reject.info": "Imate {{totalRequestCount}} zahteve za transakcije", - "dapp.request.revoke.action": "Prekliči", - "dapp.request.revoke.helptext": "Dovoli temu spletnemu mestu, da prekliče dostop za porabo tega žetona za transakcije. Prepričajte se, da zaupate tej strani.", - "dapp.request.revoke.title": "Prekliči dostop do {{tokenSymbol}}", - "dapp.request.signature.containsUnrenderableCharacters": "To sporočilo vsebuje znake, ki jih ni mogoče upodobiti. Prepričajte se, da zaupate tej strani.", - "dapp.request.signature.decodeError": "Sporočila ni bilo mogoče dekodirati", - "dapp.request.signature.header": "Zahteva za podpis", - "dapp.request.signature.irregular": "Nepravilna zahteva za podpis", - "dapp.request.signature.irregular.description": "Preden nadaljujete, se prepričajte, da zaupate temu mestu", - "dapp.request.signature.irregular.understand": "Razumem tveganja", - "dapp.request.signature.toggleDataView.raw": "Oglejte si neobdelane podatke", - "dapp.request.signature.toggleDataView.readable": "Oglejte si izvirne podatke", - "dapp.request.warning.notActive.message": "Prepričajte se, da je pravi", - "dapp.request.warning.notActive.title": "To ni vaša aktivna denarnica", - "delegation.upgradeModal.description": "Ta posodobitev denarnice uporablja pametne pogodbe za hitrejše in cenejše transakcije. Več o tem", - "delegation.upgradeModal.enableSmartWallet": "Omogočite pametno denarnico", - "delegation.upgradeModal.title": "Pametnejše menjave, nižji stroški", - "downloadApp.modal.connectExistingWallet": "Povežite obstoječo denarnico", - "downloadApp.modal.getStarted.description": "Takoj pridobite dostop do več tisoč žetonov prek največjega svetovnega trga onchain.", - "downloadApp.modal.getStarted.title": "Začnite z menjavo v nekaj sekundah", - "downloadApp.modal.getTheApp.title": "Začnite uporabljati Uniswap", - "downloadApp.modal.uniswapProducts.subtitle": "Izdelki Uniswap brezhibno delujejo skupaj in ustvarjajo najboljšo izkušnjo v verigi.", - "empty.swap.button.text": "Dodajte sredstva za zamenjavo", - "error.dataUnavailable": "Podatki trenutno niso na voljo; delamo na popravku", - "error.id": "ID napake: {{eventId}}", - "error.jupiterApi.execute.default.title": "Prišlo je do napake z Jupiter API-jem. Poskusite znova.", - "error.jupiterApi.failedToLand": "(Koda {{code}}: Transakcija ni uspela pristati v omrežju)", - "error.jupiterApi.invalidBlockHeight": "(Koda -1004: Neveljavna višina bloka)", - "error.jupiterApi.invalidMessageBytes": "(Koda -3: Neveljavni bajti sporočila)", - "error.jupiterApi.invalidPayload": "(Koda -2002: Neveljaven koristni paket)", - "error.jupiterApi.invalidSignedTransaction": "(Koda -2: Neveljavna podpisana transakcija)", - "error.jupiterApi.invalidTransaction": "(Koda -1002: Neveljavna transakcija)", - "error.jupiterApi.missingCachedOrder": "(Koda -1: Manjka predpomnjeno naročilo)", - "error.jupiterApi.notFullySigned": "(Koda -1003: Transakcija ni v celoti podpisana)", - "error.jupiterApi.quoteExpired": "Časovna omejitev za to ponudbo je potekla, poskusite znova. (Koda -2003)", - "error.jupiterApi.unknownErrorCode": "(Koda {{code}})", - "error.noData": "Ni podatkov", - "error.request.provideId": "Žal je med obdelavo vaše zahteve prišlo do napake. Če zahtevate podporo, navedite svoj ID napake.", - "error.tokenApproval": "Odobritev žetona ni uspela", - "error.tokenApproval.message": "Verjetno je bila vaša odobritev neuspešna zaradi težav z omrežjem ali povezavo. Preverite povezavo in poskusite znova.", - "error.tokenApprovalEdited": "Nezadosten znesek odobritve", - "error.tokenApprovalEdited.message": "Znesek odobritve, nastavljen v vaši denarnici, je prenizek za dokončanje te transakcije. Poskusite znova in povečajte znesek.", - "errors.crash.message": "Nekaj se je zrušilo.", - "errors.crash.restart": "Znova zaženite aplikacijo", - "errors.crash.title": "Ojoj!", - "explore.more.pools": "Raziščite več bazenov", - "explore.more.unichain": "Raziščite bazene Unichain", - "explore.search.label.ownedBy": "Lastnik {{ownerAddress}}", - "explore.search.placeholder": "Iskanje žetonov in denarnic", - "explore.search.section.nft": "Zbirke NFT", - "explore.search.section.popularNFT": "Priljubljene zbirke NFT", - "explore.search.section.wallets": "Denarnice", - "explore.tokens.error": "Ni bilo mogoče naložiti žetonov", - "explore.tokens.favorite.action.add": "Najljubši žeton", - "explore.tokens.favorite.action.edit": "Uredi priljubljene", - "explore.tokens.favorite.action.remove": "Odstrani priljubljeno", - "explore.tokens.favorite.title.default": "Priljubljeni žetoni", - "explore.tokens.favorite.title.edit": "Uredite priljubljene žetone", - "explore.tokens.metadata.marketCap": "{{number}} MCap", - "explore.tokens.metadata.totalValueLocked": "{{number}} TVL", - "explore.tokens.metadata.volume": "{{number}} Vol", - "explore.tokens.sort.label.marketCap": "Tržna kapitalizacija", - "explore.tokens.sort.label.priceDecrease": "Znižanje cene", - "explore.tokens.sort.label.priceIncrease": "Povišanje cene", - "explore.tokens.sort.label.totalValueLocked": "TVL", - "explore.tokens.sort.label.volume": "Glasnost", - "explore.tokens.sort.option.marketCap": "Tržna kapitalizacija", - "explore.tokens.sort.option.priceDecrease": "Znižanje cene (24H)", - "explore.tokens.sort.option.priceIncrease": "Zvišanje cene (24H)", - "explore.tokens.sort.option.totalValueLocked": "Uniswap TVL", - "explore.tokens.sort.option.volume": "Glasnost Uniswap (24H)", - "explore.tokens.top.title": "Vrhunski žetoni", - "explore.v2TVL": "v2 TVL", - "explore.v3TVL": "v3 TVL", - "explore.v4TVL": "v4 TVL", - "explore.wallets.favorite.action.add": "Najljubša denarnica", - "explore.wallets.favorite.action.edit": "Uredi priljubljene", - "explore.wallets.favorite.action.remove": "Odstrani priljubljeno", - "explore.wallets.favorite.action.remove.short": "Odstrani iz priljubljenih", - "explore.wallets.favorite.title.default": "Najljubše denarnice", - "explore.wallets.favorite.title.edit": "Uredite priljubljene denarnice", - "extension.connection.network": "Omrežje", - "extension.connection.networks": "Omrežja", - "extension.connection.popup.trouble": "Težave pri povezovanju?", - "extension.connection.titleConnected": "Povezan", - "extension.connection.titleNotConnected": "Brez povezave", - "extension.lock.button.forgot": "Ste pozabili geslo?", - "extension.lock.button.reset": "Ponastavi denarnico", - "extension.lock.button.submit": "Odkleni", - "extension.lock.password.error": "Napačno geslo. Poskusi ponovno", - "extension.lock.password.reset.initial.description": "Uniswap ne more pomagati obnoviti vašega gesla. Svojo denarnico morate ponastaviti tako, da znova vnesete obnovitveno besedno zvezo iz 12 besed.", - "extension.lock.password.reset.initial.help": "Kje najdem svojo frazo za obnovitev?", - "extension.lock.password.reset.initial.title": "Ste pozabili geslo", - "extension.lock.password.reset.speedbump.description": "Prepričajte se, da imate 12-besedno frazo za obnovitev, preden ponastavite denarnico. V nasprotnem primeru ne boste mogli izterjati svojih sredstev.", - "extension.lock.password.reset.speedbump.help": "Izgubil sem stavek za obnovitev", - "extension.lock.password.reset.speedbump.title": "Preden nadaljujete", - "extension.lock.subtitle": "Vnesite geslo za odklepanje", - "extension.lock.title": "Dobrodošel nazaj", - "extension.network.notSupported": "Nepodprto omrežje", - "extension.open": "Odprite razširitev Uniswap", - "extension.passwordPrompt.error.wrongPassword": "Napačno geslo. Poskusi ponovno", - "extension.passwordPrompt.title": "Vnesite vaše geslo", - "extension.popup.chrome.button": "Odprta razširitev", - "extension.popup.chrome.description": "To dejanje dokončajte tako, da odprete razširitev Uniswap.", - "extension.popup.chrome.title": "Nadaljujte v Uniswap", - "extension.settings.defaultWallet.message": "Pri povezovanju z aplikacijami dajte prednost razširitvi Uniswap.", - "extension.settings.defaultWallet.title": "Nastavi privzeto denarnico", - "extension.uninstall.reason.missingFeatures": "Uniswap Wallet nima določenih funkcij", - "extension.uninstall.reason.notUsingCrypto": "Ne želim več uporabljati kriptovalut", - "extension.uninstall.reason.other": "Drugi razlogi", - "extension.uninstall.reason.switchingWallet": "Prehajam na drugo denarnico", - "extension.uninstall.subtitle": "Če imate trenutek, bi radi slišali, zakaj ste odstranili denarnico Uniswap.", - "extension.uninstall.title": "Žal nam je, da odhajaš", - "extension.warning.storage.button": "Rezerva", - "extension.warning.storage.message": "Poskrbite, da boste naredili varnostno kopijo obnovitvene fraze, da preprečite izgubo dostopa do denarnice in sredstev.", - "extension.warning.storage.title": "Vašemu brskalniku zmanjkuje prostora za shranjevanje", - "extensionPasskeyLogInPopUp.description": "Uvozite svoj račun Uniswap tako, da se prijavite z obstoječim geslom.", - "extensionPasskeyLogInPopUp.invalidReferrer": "Prosim, zaprite to stran in poskusite znova.", - "fee.bestForCustomizability": "Najboljše za prilagodljivost.", - "fee.bestForExotic": "Najboljše za eksotične pare.", - "fee.bestForMost": "Najboljše za večino parov.", - "fee.bestForStablePairs": "Najboljše za stabilne pare.", - "fee.bestForVeryStable": "Najboljše za zelo stabilne pare.", - "fee.dynamic": "Dinamična pristojbina", - "fee.percentEarned": "%, ki ga boste zaslužili s honorarji.", - "fee.selectPercent": "{{pct}}% izberite", - "fee.selectPercentDescription": "{{pct}}% likvidnosti je izbral to stopnjo", - "fee.tier": "Stopnja plačila", - "fee.tier.create": "Ustvarite stopnjo provizije", - "fee.tier.create.button": "Ustvarite novo stopnjo provizije", - "fee.tier.create.description": "Ustvarjanje nove ravni se bo inicializiralo v novem bazenu in povzročilo višje stroške omrežja od običajnih.", - "fee.tier.description": "Zasluženi znesek, ki zagotavlja likvidnost. Izberite znesek, ki ustreza vaši toleranci tveganja in strategiji.", - "fee.tier.description.v2": "Zasluženi znesek, ki zagotavlja likvidnost. Vsa združenja v2 imajo fiksne 0,3-odstotne provizije. Za več možnosti zagotovite likvidnost na v4.", - "fee.tier.dynamic": "Dinamična stopnja provizije", - "fee.tier.dynamic.create": "Ustvarjanje dinamične stopnje nadomestil", - "fee.tier.dynamic.create.info": "Ustvarili boste skupino z dinamično stopnjo nadomestil. Preden nadaljujete, se prepričajte, da izbrani kavelj podpira dinamične provizije.", - "fee.tier.highestTvl": "Najvišji TVL", - "fee.tier.label": "%, ki ga boste zaslužili s honorarji", - "fee.tier.missing.description": "Ne najdete ravni, ki jo iščete?", - "fee.tier.new": "Nova stopnja", - "fee.tier.percent.select": "{{percentage}} izberite", - "fee.tier.recommended.description": "Priporočeno na podlagi najvišjega deleža likvidnosti za izbrani par žetonov.", - "fee.tier.search": "Poiščite ali ustvarite druge stopnje pristojbin", - "fee.tier.search.short": "Stopnje iskanja", - "fee.tier.select": "Izberite stopnjo pristojbine", - "fee.tier.select.existing.button": "Izberite obstoječo stopnjo nadomestila", - "fee.tierExact": "{{fee}} stopnja pristojbine", - "fee.unavailable": "Prislužena nadomestila niso vidna za pozicije v2, dokler ni odstranjena likvidnost.", - "fee.uncollected": "Vključuje nepobrane provizije:", - "fee.uniswap": "Pristojbina ({{percent}})", - "fee.uniswap.description": "Za zagotavljanje najboljše izkušnje z Uniswapom se zaračunavajo pristojbine.", - "fiatOffRamp.checkout.title": "Dvigni na", - "fiatOffRamp.connection.quote": "Prodam {{amount}} v vrednosti {{currencySymbol}}", - "fiatOffRamp.error.balance": "Presega ravnotežje", - "fiatOffRamp.error.populateSend.description": "Počakajte trenutek in poskusite znova.", - "fiatOffRamp.error.populateSend.title": "Transakcije ni mogoče naložiti", - "fiatOffRamp.summary.total": "{{cryptoAmount}} za {{fiatAmount}}", - "fiatOffRamp.unsupportedToken.back": "Pojdi nazaj", - "fiatOffRamp.unsupportedToken.divider": "Nepodprti žetoni", - "fiatOffRamp.unsupportedToken.message": "Ta žeton ni podprt za prodajo. Zamenjajte to sredstvo z enim od podprtih žetonov.", - "fiatOffRamp.unsupportedToken.swap": "Zamenjaj na podprt žeton", - "fiatOffRamp.unsupportedToken.title": "Nepodprt žeton", - "fiatOffRamp.welcome.tooltip": "Prodajte svojo kriptovaluto na svoj bančni račun ali debetno kartico.", - "fiatOnRamp.button.chooseToken": "Izberite žeton", - "fiatOnRamp.buy.info.description": "Potrebovali ga boste za plačilo omrežnih stroškov pri zamenjavi.", - "fiatOnRamp.buy.info.title": "Začnite z ETH", - "fiatOnRamp.cexTransferModal.description": "Nakup kriptovalut s kartico ni podprt v vaši regiji. Prenesite sredstva s centraliziranega menjalnega računa za financiranje denarnice.", - "fiatOnRamp.cexTransferModal.title": "Prenesite, da začnete", - "fiatOnRamp.checkout.title": "Blagajna", - "fiatOnRamp.chooseMultiPlatformProvider.chooseNetwork": "Izberite omrežje", - "fiatOnRamp.chooseMultiPlatformProvider.description": "To bo določilo naslov denarnice, na katero boste prejeli sredstva.", - "fiatOnRamp.chooseProvider.description": "Nadaljevali boste s portalom ponudnika, da si ogledate stroške, povezane z vašo transakcijo.", - "fiatOnRamp.completeTransactionHeader": "Dokončajte transakcijo z {{serviceProvider}}", - "fiatOnRamp.connection.error": "Povezava ni uspela", - "fiatOnRamp.connection.errorDescription": "Pri povezovanju z {{serviceProvider}}je šlo nekaj narobe.", - "fiatOnRamp.connection.message": "Povezujemo vas z {{serviceProvider}}", - "fiatOnRamp.connection.quote": "Nakup {{amount}} v vrednosti {{currencySymbol}}", - "fiatOnRamp.connection.terms": "Če nadaljujete, potrjujete, da boste za vas veljali pogoji storitve in pravilnik o zasebnosti z {{serviceProvider}}, kot je ustrezno.", - "fiatOnRamp.continueInTab": "Za nadaljevanje pojdite na zavihek {{serviceProvider}} . Zdaj je varno zapreti ta način.", - "fiatOnRamp.disclaimer": "Če nadaljujete, potrjujete, da boste za vas veljali pogoji storitve in pravilnik o zasebnosti z {{serviceProvider}}, kot je ustrezno.", - "fiatOnRamp.error.default": "Nekaj je šlo narobe.", - "fiatOnRamp.error.load": "Ni bilo mogoče naložiti žetonov za nakup", - "fiatOnRamp.error.max": "Največ {{amount}}", - "fiatOnRamp.error.min": "Najmanj {{amount}}", - "fiatOnRamp.error.noQuotes": "Ni narekovajev.", - "fiatOnRamp.error.unavailable": "Ta storitev ni na voljo v vaši regiji", - "fiatOnRamp.error.unsupported": "Ni podprto v regiji", - "fiatOnRamp.error.usd": "Na voljo samo za nakup v USD", - "fiatOnRamp.noQuotes.error": "Ni narekovajev", - "fiatOnRamp.paymentMethods.applePay": "Apple Pay", - "fiatOnRamp.paymentMethods.bank": "Banka", - "fiatOnRamp.paymentMethods.debit": "Debetna kartica", - "fiatOnRamp.paymentMethods.googlePay": "Google Pay", - "fiatOnRamp.paymentMethods.paypal": "PayPal", - "fiatOnRamp.paymentMethods.venmo": "Venmo", - "fiatOnRamp.quote.advice": "Nadaljevali boste s portalom ponudnika, da si ogledate stroške, povezane z vašo transakcijo.", - "fiatOnRamp.quote.type.list": "{{optionsList}}in druge možnosti", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "Iz računa", - "fiatOnRamp.receiveCrypto.title": "Prejemanje kripto", - "fiatOnRamp.receiveCrypto.transferFunds": "Financirajte svojo denarnico s prenosom kripto iz druge denarnice ali računa", - "fiatOnRamp.receiveCrypto.useThisAddress": "Uporabite ta naslov za prejemanje žetonov", - "fiatOnRamp.region.placeholder": "Iskanje po državi ali regiji", - "fiatOnRamp.region.title": "Izberite svojo regijo", - "fiatOnRamp.summary.total": "{{cryptoAmount}} za {{fiatAmount}}", - "forceUpgrade.action.backup": "Varnostno kopirajte svojo denarnico", - "forceUpgrade.action.confirm": "Posodobite zdaj", - "forceUpgrade.action.learn": "Naučite se posodobiti", - "forceUpgrade.description.extension": "Na voljo je nova različica aplikacije. Če želite še naprej uporabljati razširitev Uniswap, jo posodobite na najnovejšo različico.", - "forceUpgrade.description.wallet": "Na voljo je nova različica aplikacije. Če želite še naprej uporabljati denarnico Uniswap, jo posodobite na najnovejšo različico.", - "forceUpgrade.label.recoveryPhrase": "Fraza za obnovitev", - "forceUpgrade.title": "Posodobite na najnovejšo različico", - "forceUpgrade.title.recommendedStatus": "Na voljo je nova različica", - "globalPreferences.title": "Globalne nastavitve", - "hero.scroll": "Pomaknite se, če želite izvedeti več", - "hero.subtitle": "Kupujte in prodajajte kriptovalute na {{amount}}+ omrežjih, vključno z Ethereumom, Unichainom in Baseom.", - "hero.swap.title": "Zamenjajte kadarkoli,
kjer koli.", - "hidden.nfts.info.banner.text": "Izvedite več o skritih NFT-jih", - "hidden.nfts.info.text.button": "Skriti NFT ({{numHidden}})", - "hidden.nfts.info.text.extension": "To so potencialne prevare in NFT-ji, ki ste jih skrili. Lahko z desno miškino tipko kliknete NFT, da ga razkrijete.", - "hidden.nfts.info.text.mobile": "To so potencialne prevare in NFT-ji, ki ste jih skrili. Lahko dolgo pritisnete na NFT, da ga razkrijete.", - "hidden.nfts.info.text.title": "Skriti NFT-ji", - "hidden.tokens.info.banner.text": "Izvedite več o skritih žetonih", - "hidden.tokens.info.text.button": "Skriti žetoni ({{numHidden}})", - "hidden.tokens.info.text.info": "To so morebitne prevare, majhna stanja in žetoni, ki ste jih skrili. Skriti žetoni niso vključeni v vaše skupno stanje v denarnici.", - "hidden.tokens.info.text.title": "Skriti žetoni", - "home.activity.empty.button": "Prejmite žetone ali NFT", - "home.activity.empty.description.default": "Ko odobrite, trgujete ali prenesete žetone ali NFT, bodo vaše transakcije prikazane tukaj.", - "home.activity.empty.description.external": "Ko ta denarnica izvede transakcije, se prikažejo tukaj.", - "home.activity.empty.title": "Ni aktivnosti še", - "home.activity.error.load": "Dejavnosti ni bilo mogoče naložiti", - "home.activity.title": "dejavnost", - "home.banner.offline": "Ste v načinu brez povezave", - "home.banner.testnetMode": "Ste v načinu testnega omrežja", - "home.banner.testnetMode.nav": "Ste v načinu testnega omrežja. To izklopite v nastavitvah.", - "home.empty.cexTransfer": "Prenos", - "home.empty.cexTransfer.description": "Prenesite sredstva s platforme za trgovanje.", - "home.empty.transfer": "Prejemanje kripto", - "home.empty.transfer.description": "Prenesite sredstva iz druge denarnice.", - "home.explore.footer": "Tapnite tukaj, če želite raziskati na tisoče žetonov, NFT-jev in drugega", - "home.explore.title": "Raziščite žetone", - "home.extension.error": "Napaka pri nalaganju računov", - "home.label.buy": "Nakup", - "home.label.for": "Kupi/Prodaj", - "home.label.receive": "Prejeti", - "home.label.send": "Pošlji", - "home.label.swap": "Zamenjaj", - "home.nfts.title": "NFT-ji", - "home.tokens.empty.action.buy.description": "Nakup z debetno kartico ali bančnim računom.", - "home.tokens.empty.action.buy.title": "Kupi kripto", - "home.tokens.empty.action.import.description": "Vnesite frazo za obnovitev te denarnice, da začnete menjavo in pošiljanje.", - "home.tokens.empty.action.import.title": "Uvoz denarnice", - "home.tokens.empty.action.receive.description": "Prenos iz druge denarnice ali računa.", - "home.tokens.empty.action.receive.title": "Prejemanje kripto", - "home.tokens.empty.description": "Ko ta denarnica kupi ali prejme žetone, se ti prikažejo tukaj.", - "home.tokens.empty.title": "Ni še žetonov", - "home.tokens.empty.welcome.description": "Dodajte sredstva, da začnete trgovati", - "home.tokens.error.fetch": "Stanja žetonov ni bilo mogoče pridobiti", - "home.tokens.error.load": "Stanja žetonov ni bilo mogoče naložiti", - "home.tokens.title": "Žetoni", - "home.upsell.receive.cta": "Iz računa", - "home.upsell.receive.title": "Prejemanje kripto", - "home.warning.viewOnly": "To je denarnica samo za ogled", - "interface.metatags.description": "Zamenjajte kriptovalute na Ethereum, Base, Arbitrum, Polygon, Unichain in še več. Platforma DeFi, ki ji zaupajo milijoni.", - "interface.metatags.title": "Vmesnik Uniswap", - "landing.api": "API", - "landing.appsOverview": "Zasnovan za vse načine menjave", - "landing.blog.description": "Bodite na tekočem z najnovejšimi novicami podjetja, funkcijami izdelkov in še več", - "landing.docs.description": "Raziščite našo knjižnico dokumentov za razvijalce, da začnete graditi z Uniswapom", - "landing.exploreUniverse": "Raziščite VESOLJE", - "landing.getStarted": "Trgujte na največjem svetovnem DEX-u", - "landing.helpCenter.body": "Prebrskajte pogosta vprašanja in poiščite podporo naše ekipe za podporo s sedežem v ZDA", - "landing.protocolDescription": "Uniswap Labs poganja nekatere najpogosteje uporabljene izdelke v kriptovalutah. Izkusite dostop brez dovoljenj, preverjeno varnost in namensko podporo.", - "landing.protocolStats": "Statistika protokola Uniswap", - "landing.provideLiquidity.body": "Zagotovite likvidnost in pobirajte provizije z uporabo vmesnika Uniswap.", - "landing.provideLiquidity.subtitle": "Moč onchain trgov.", - "landing.socials": "Sledite Uniswap Labs na X, Farcaster, LinkedInin TikTok", - "landing.swapBody": "Dostopajte do globoke likvidnosti, raziščite žetone, nastavite omejena naročila in zagotovite likvidnost za tisoče žetonov v verigah {{amount}} .", - "landing.swapSubtitle": "Zamenjava brez dovoljenja.", - "landing.tradingApi": "API za trgovanje", - "landing.tradingApiBody": "Uporabite isti API, ki poganja spletno aplikacijo in denarnico Uniswap, ki jima zaupajo vodilne ekipe po vsem svetu.", - "landing.tradingApiButton": "Integrirajte API Uniswap", - "landing.tradingApiSubtitle": "DeFi, neposredno vašim uporabnikom.", - "landing.trusted": "Zaupajo milijoni", - "landing.unichain.body": "Pridružite se skupnosti, ki gradi na hitrem, decentraliziranem Ethereumu L2, zgrajenem kot dom za DeFi.", - "landing.unichain.button": "Začni graditi", - "landing.unichain.subtitle": "Veriga DeFi.", - "landing.uniswapX.body": "Transakcije brez plina in zaščita MEV, brez provizij za neuspešne zamenjave.", - "landing.uniswapX.button": "Izkusite UniswapX", - "landing.uniswapX.subtitle": "Pametnejše menjave, nič trenja.", - "landing.walletBody": "Zanesljiva kripto denarnica in razširitev za samostojno hrambo z milijoni prenosov, podporo resničnih ljudi in oceno 4,8 .", - "landing.walletSubtitle": "Zamenjaj, shrani, razišči.", - "language.afrikaans": "afrikanščina", - "language.arabic": "arabščina", - "language.catalan": "katalonski", - "language.chineseSimplified": "kitajščina, poenostavljena", - "language.chineseTraditional": "kitajski, tradicionalni", - "language.czech": "češki", - "language.danish": "danščina", - "language.dutch": "nizozemščina", - "language.english": "angleščina", - "language.finnish": "finščina", - "language.french": "francosko", - "language.greek": "grški", - "language.hebrew": "hebrejščina", - "language.hindi": "Hindi", - "language.hungarian": "madžarski", - "language.indonesian": "indonezijski", - "language.italian": "italijanščina", - "language.japanese": "japonska", - "language.korean": "korejščina", - "language.malay": "malajščina", - "language.norwegian": "norveški", - "language.polish": "poljski", - "language.portuguese": "portugalščina", - "language.romanian": "romunščina", - "language.russian": "ruski", - "language.serbian": "srbsko", - "language.spanishArgentina": "Španščina (Argentina)", - "language.spanishBelize": "Španščina (Belize)", - "language.spanishBolivia": "Španščina (Bolivija)", - "language.spanishChile": "Španščina (Čile)", - "language.spanishColombia": "Španščina (Kolumbija)", - "language.spanishCostaRica": "Španščina (Kostarika)", - "language.spanishCuba": "Španščina (Kuba)", - "language.spanishDominicanRepublic": "Španščina (Dominikanska republika)", - "language.spanishEcuador": "španščina (Ekvador)", - "language.spanishElSalvador": "španščina (Salvador)", - "language.spanishGuatemala": "Španščina (Gvatemala)", - "language.spanishHonduras": "Španščina (Honduras)", - "language.spanishLatam": "španščina (Latinska Amerika)", - "language.spanishMexico": "Španščina (Mehika)", - "language.spanishNicaragua": "Španščina (Nikaragva)", - "language.spanishPanama": "Španščina (Panama)", - "language.spanishParaguay": "Španščina (Paragvaj)", - "language.spanishPeru": "Španščina (Peru)", - "language.spanishPuertoRico": "Španščina (Portoriko)", - "language.spanishSpain": "španščina (Španija)", - "language.spanishUruguay": "Španščina (Urugvaj)", - "language.spanishUs": "španščina (ZDA)", - "language.spanishVenezuela": "Španščina (Venezuela)", - "language.swahili": "svahili", - "language.swedish": "švedščina", - "language.turkish": "turško", - "language.ukrainian": "ukrajinski", - "language.urdu": "urdu", - "language.vietnamese": "vietnamski", - "large.price.difference": "Velika razlika v ceni", - "large.price.difference.tooltip": "Nadaljevanje te trgovine bo povzročilo izgubo sredstev. Ta razlika je lahko posledica velikih poslov ali nizke likvidnosti.", - "limit.open.count_one": "1 odprta meja", - "limit.open.count_other": "{{count}} odprte meje", - "limitPrice.buyingAboveMarketPrice.error.description": "Vaša mejna cena je {{percentage}}% višja od tržne. Za nadaljevanje prilagodite svojo mejno ceno.", - "limitPrice.buyingAboveMarketPrice.error.title": "Nakup {{tokenSymbol}} nad tržno ceno", - "limitPrice.marketPriceNotAvailable.error.description": "Trenutne tržne cene ne moremo izračunati. Če se želite izogniti oddaji naročila pod tržno ceno, preverite omrežno povezavo in poskusite znova.", - "limitPrice.marketPriceNotAvailable.error.title": "Tržna cena ni na voljo", - "limitPrice.sellingBelowMarketPrice.error.description": "Vaša mejna cena je {{percentage}}% nižja od tržne. Za nadaljevanje prilagodite svojo mejno ceno.", - "limitPrice.sellingBelowMarketPrice.error.title": "Prodaja {{tokenSymbol}} pod tržno ceno", - "limits.form.disclaimer.mainnet": "Za omejitve so na voljo samo žetoni Ethereum mainnet. ", - "limits.form.disclaimer.mainnet.short": "Za omejitve so na voljo samo žetoni Mainnet.", - "limits.form.disclaimer.uniswapx": "Omejitve se morda ne bodo izvršile točno takrat, ko žetoni dosežejo določeno ceno. ", - "limits.learnMore": "Več o omejitvah", - "limits.price.input.label": "Ko je 1 vreden", - "limits.price.label": "Mejna cena", - "limits.selectSupportedTokens": "Izberite podprte žetone", - "liquidity.hooks": "Kljuke na v4", - "liquidity.hooks.address.input": "Vnesite naslov kljuke", - "liquidity.hooks.address.tooltip": "Naslov kavlja: {{address}}", - "liquidity.learnMoreLabel": "Poučite se o zagotavljanju likvidnosti", - "liquidity.notEnough.label": "Ni dovolj likvidnosti za prikaz natančne vrednosti v USD.", - "liquidity.provideOnProtocols": "Zagotavljanje likvidnosti na različnih protokolih", - "liquidityPool.page.title": "Dodajte likvidnost skladom{{version}} na Uniswap", - "liquidityPool.positions.closed.title": "Zaprte pozicije", - "liquidityPool.positions.loadingMore": "Nalaganje več položajev ...", - "liquidityPool.positions.page.title": "Upravljajte {{quoteSymbol}}/{{baseSymbol}} likvidnost združenja na Uniswap", - "liquidityPool.positions.page.version.description": "Oglejte si svoje aktivne {{version}} likvidnostne pozicije. Dodajte nove položaje.", - "liquidityPool.positions.page.version.title": "Upravljajte likvidnost bazena{{version}} na Uniswap", - "migrate.allowed": "Dovoljeno", - "migrate.allowLpMigration": "Dovoli selitev žetona LP", - "migrate.connectAccount": "Morate povezati račun, ki je lastnik tega položaja.", - "migrate.connectWallet": "Povežite se z denarnico in si oglejte svojo likvidnost V2.", - "migrate.contract": "Pogodba o migraciji Uniswap", - "migrate.firstLP": "Ste prvi ponudnik likvidnosti za to skupino Uniswap V3. Vaša likvidnost se bo preselila po trenutni ceni {{source}} .", - "migrate.highGasCost": "Vaš transakcijski strošek bo veliko višji, saj vključuje plin za ustvarjanje bazena.", - "migrate.invalidRange": "Izbran je neveljaven obseg. Najmanjša cena mora biti nižja od najvišje cene.", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} LP žetoni", - "migrate.migrating": "Selitev", - "migrate.missingV2Position": "Ne vidite enega od svojih položajev v2? Uvozi.", - "migrate.noV2Liquidity": "Likvidnost V2 ni bila najdena.", - "migrate.positionNoFees": "Dokler se tržna cena ne premakne v vaš razpon, vaša pozicija ne bo služila provizij ali se uporabljala pri trgovanju.", - "migrate.priceDifference": "Razlika v ceni: ", - "migrate.priceWarning": "Likvidnost v Uniswap V3 naložite samo po ceni, za katero menite, da je pravilna.
Če se cena zdi napačna, lahko naredite zamenjavo za spremembo cene ali počakate, da to stori nekdo drug.", - "migrate.refund": "Vsaj {{amtA}} {{symA}} in {{amtB}} {{symB}} bosta povrnjena v vašo denarnico zaradi izbranega cenovnega razreda.", - "migrate.selectFeeTier": "Izberite stopnjo pristojbine", - "migrate.setRange": "Nastavite cenovni razpon", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Cena:", - "migrate.v2Description": "To orodje bo vašo {{source}} likvidnost varno preselilo v V3. Postopek je popolnoma nezaupljiv zaradi <0>pogodbe o migraciji Uniswap ↗", - "migrate.v2Instruction": "Za vsak sklad, prikazan spodaj, kliknite preseli, da odstranite svojo likvidnost iz Uniswap V2 in jo položite v Uniswap V3.", - "migrate.v2Title": "Preseli likvidnost V2", - "migrate.v3Price": "V3 {{sym}} Cena:", - "mint.v3.input.invalidPrice.error": "Neveljaven vnos cene", - "mobileAppPromo.banner.getTheApp.link": "Prenesite aplikacijo Uniswap Wallet", - "mobileAppPromo.banner.title": "Uniswap: kripto in NFT denarnica", - "moonpay.poweredBy": "Fiat onramp, ki ga poganja MoonPay USA LLC", - "nav.createAccount.button": "Ustvari račun", - "nav.logIn.button": "Prijavite se", - "nav.logInOrConnect.title": "Prijava ali povezava", - "nav.products.tradingApi": "Integrirajte protokol", - "nav.products.unichain": "Veriga DeFi", - "nav.products.uniswapX": "Metaagregator", - "nav.products.wallet": "Zamenjaj, shrani, razišči", - "nav.signUp.button": "Prijavite se", - "nav.tabs.createPosition": "Ustvari položaj", - "nav.tabs.viewPositions": "Ogled položajev", - "network.lostConnection": "Morda ste izgubili omrežno povezavo.", - "network.mightBeDown": "{{network}} morda trenutno ne deluje ali pa ste izgubili omrežno povezavo.", - "network.warning": "Omrežno opozorilo", - "nft.noPools": "Ni še bazenov", - "nft.reportSpam": "Prijavi kot vsiljeno pošto", - "notFound.oops": "Ups, pelji me nazaj v Swap", - "notice.uk": "Ta spletna aplikacija je na voljo kot orodje za interakcijo uporabnikov s protokolom Uniswap na lastno pobudo, brez potrditve ali priporočila dejavnosti trgovanja s kriptovalutami. Pri tem Uniswap ne priporoča, da se uporabniki ali potencialni uporabniki ukvarjajo s trgovanjem s kriptosredstvi, prav tako uporabniki ali potencialni uporabniki spletne aplikacije ne bi smeli obravnavati te spletne strani ali njene vsebine, kot da vključuje kakršno koli obliko priporočila, vabila ali spodbujanja k trgovanju s kriptosredstvi. .", - "notice.uk.label": "Zavrnitev odgovornosti za Združeno kraljestvo:", - "notification.assetVisibility.hidden": "{{assetName}} skrito", - "notification.assetVisibility.unhidden": "{{assetName}} razkrito", - "notification.buy.network": "Nakup na {{network}}", - "notification.copied.address": "Naslov kopiran", - "notification.copied.calldata": "Podatki o klicu kopirani", - "notification.copied.contractAddress": "Naslov pogodbe je kopiran", - "notification.copied.failed": "Kopiranje v odložišče ni uspelo", - "notification.copied.image": "Slika je kopirana", - "notification.copied.linkUrl": "Povezava je bila kopirana", - "notification.copied.nftUrl": "URL NFT je kopiran", - "notification.copied.poolId": "ID bazena kopiran", - "notification.copied.tokenUrl": "URL žetona je kopiran", - "notification.copied.transactionId": "ID transakcije je kopiran", - "notification.copied.unitag": "Uporabniško ime je kopirano", - "notification.countryChange": "Preklopljeno na {{countryName}}", - "notification.limit.network": "Ustvarjanje limitnega naročila na {{network}}", - "notification.lp.network": "Zagotavljanje likvidnosti na {{network}}", - "notification.network.changed": "Preklopljeno na {{network}}", - "notification.passwordChanged": "Geslo spremenjeno", - "notification.poolFinder.network": "Iskanje bazena na {{network}}", - "notification.restore.success": "Denarnica obnovljena!", - "notification.sell.network": "Prodaja na {{network}}", - "notification.send.network": "Pošiljanje dne {{network}}", - "notification.smartWallet.disabled": "Onemogočeno v 1 omrežju", - "notification.smartWallet.disabled.all": "Pametna denarnica onemogočena", - "notification.smartWallet.disabled.plural": "Onemogočeno v omrežjih {{amount}}", - "notification.spam.NFT.failed": "Ni bilo mogoče prijaviti NFT. Poskusite znova pozneje.", - "notification.spam.NFT.successful": "Prijavljeno", - "notification.swap.network": "Menjava na {{network}}", - "notification.swap.pending.swap": "Menjava v teku", - "notification.swap.pending.unwrap": "Razvijanje čaka", - "notification.swap.pending.wrap": "Zaviti v teku", - "notification.transaction.approve.canceled": "Preklicano {{currencySymbol}} odobritev.", - "notification.transaction.approve.fail": "{{currencySymbol}} ni bilo mogoče odobriti za uporabo z {{address}}.", - "notification.transaction.approve.success": "Odobreno {{currencySymbol}} za uporabo z {{address}}.", - "notification.transaction.pending": "Transakcija v teku", - "notification.transaction.swap.canceled": "Preklicano {{inputCurrencySymbol}}-{{outputCurrencySymbol}} zamenjava.", - "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} za {{outputCurrencyAmountWithSymbol}} zamenjava je potekla.", - "notification.transaction.swap.fail": "Zamenjava {{inputCurrencyAmountWithSymbol}} za {{outputCurrencyAmountWithSymbol}}ni uspela.", - "notification.transaction.swap.success": "Zamenjal {{inputCurrencyAmountWithSymbol}} za {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.transfer.canceled": "Preklicano {{tokenNameOrAddress}} pošiljanje", - "notification.transaction.transfer.fail": "{{tokenNameOrAddress}} ni bilo mogoče poslati {{walletNameOrAddress}}", - "notification.transaction.transfer.received": "Prejeto {{tokenNameOrAddress}} od {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "Poslano {{tokenNameOrAddress}} na {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "Transakcija z {{addressOrEnsName}}ni uspela", - "notification.transaction.unknown.fail.short": "Transakcija ni uspela", - "notification.transaction.unknown.success.full": "Transakcija z {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "Transakcija potrjena", - "notification.transaction.unwrap.canceled": "Preklicano {{inputCurrencySymbol}} odvijanje.", - "notification.transaction.unwrap.fail": "Odvijanje {{inputCurrencyAmountWithSymbol}}ni uspelo.", - "notification.transaction.unwrap.success": "Odpakirano {{inputCurrencyAmountWithSymbol}} in prejeto {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.canceled": "Preklican {{inputCurrencySymbol}} ovoj.", - "notification.transaction.wrap.fail": "Previjanje {{inputCurrencyAmountWithSymbol}}ni uspelo.", - "notification.transaction.wrap.success": "Zavil {{inputCurrencyAmountWithSymbol}} in prejel {{outputCurrencyAmountWithSymbol}}.", - "notification.transfer.pending": "Pošiljanje čaka", - "notification.walletConnect.confirmed": "Transakcija potrjena z {{dappName}}", - "notification.walletConnect.connected": "Povezan", - "notification.walletConnect.disconnected": "Prekinjena povezava", - "notification.walletConnect.failed": "Transakcija ni uspela z {{dappName}}", - "notification.walletConnect.networkChanged.full": "Preklopljeno na {{networkName}}", - "notification.walletConnect.networkChanged.short": "Preklopna omrežja", - "notifications.scantastic.subtitle": "Nadaljujte z razširitvijo Uniswap", - "notifications.scantastic.title": "Uspeh!", - "onboarding.backup.manual.banner": "Predlagamo, da to napišete na list papirja in shranite na varno mesto, na primer v sef.", - "onboarding.backup.manual.displayWarning.description": "Pred nadaljevanjem natančno preberite naslednje.", - "onboarding.backup.manual.displayWarning.note.access": "Ta fraza za obnovitev vam omogoča popoln dostop do vaše denarnice in sredstev", - "onboarding.backup.manual.displayWarning.note.secure": "Oglejte si to zasebno in ne delite z nikomer", - "onboarding.backup.manual.displayWarning.note.storage": "Zapišite in shranite na varno mesto", - "onboarding.backup.manual.displayWarning.title": "Nekaj pomembnih stvari, ki jih morate vedeti", - "onboarding.backup.manual.error": "Neveljavna ali napačno črkovana beseda", - "onboarding.backup.manual.placeholder": "Skrita Beseda", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} končano", - "onboarding.backup.manual.selectedWordPlaceholder": "Izberite besedo", - "onboarding.backup.manual.subtitle_one": "Katera je {{count}}prva beseda v vašem obnovitvenem stavku?", - "onboarding.backup.manual.subtitle_two": "Katera je {{count}}druga beseda v vašem obnovitvenem stavku?", - "onboarding.backup.manual.subtitle_few": "Katera je {{count}}tretja beseda v vaši frazi za obnovitev?", - "onboarding.backup.manual.subtitle_other": "Katera je {{count}}beseda v vašem obnovitvenem stavku?", - "onboarding.backup.manual.title": "Prepričajmo se, da ste ga pravilno posneli", - "onboarding.backup.option.badge.quick": "hitro", - "onboarding.backup.option.cloud.description": "Varnostno kopirajte svojo denarnico prek {{cloudProviderName}}, zaščiteno z obnovitvenim geslom.", - "onboarding.backup.option.cloud.title": "Nastavite geslo za obnovitev", - "onboarding.backup.option.manual.description": "Zapišite svojih 12 skrivnih besed na kos papirja in ga shranite na varno mesto.", - "onboarding.backup.option.manual.title": "Zapišite stavek za obnovitev", - "onboarding.backup.reminder.backupNowButton": "Varnostno kopiraj zdaj", - "onboarding.backup.reminder.remindMeLaterButton": "Spomni me pozneje", - "onboarding.backup.reminder.title": "Varnostno kopirajte svojo denarnico", - "onboarding.backup.reminder.warning.description": "Varnostno kopirajte svojo denarnico, da boste lahko obnovili svoja sredstva, če izgubite telefon ali dobite novega.", - "onboarding.backup.reminder.warning.fundsLabel": "Ogroženi skladi", - "onboarding.backup.reminder.warning.title": "Lahko izgubite svoja sredstva", - "onboarding.backup.speedBump.cloud.description": "Če ga kdaj pozabite, ga namesto vas ne moremo ponastaviti. Zapišite ga na varno mesto ali varno shranite v upravitelju gesel.", - "onboarding.backup.speedBump.cloud.disclaimer": "Razumem, da Uniswap Labs ne more ponastaviti mojega obnovitvenega gesla.", - "onboarding.backup.speedBump.cloud.title": "Pomembno je, da shranite to geslo", - "onboarding.backup.speedBump.manual.description": "Prepričajte se, da ste pravilno zapisali svoj obnovitveni stavek in da imate varno mesto za shranjevanje.", - "onboarding.backup.speedBump.manual.disclaimer": "Razumem, da Uniswap Labs ne more obnoviti moje denarnice, če jo izgubim.", - "onboarding.backup.speedBump.manual.title": "Preden končaš ...", - "onboarding.backup.subtitle": "Tako boste obnovili svojo denarnico, če izbrišete aplikacijo ali izgubite napravo.", - "onboarding.backup.title.existing": "Varnostno kopirajte svojo denarnico", - "onboarding.backup.title.new": "Izberite način varnostnega kopiranja", - "onboarding.backup.view.subtitle.message1": "Pred nadaljevanjem natančno preberite naslednje", - "onboarding.backup.view.subtitle.message2": "Za obnovitev denarnice boste morali vnesti vseh 12 teh skrivnih besed.", - "onboarding.backup.view.title": "Zapišite svoj stavek za obnovitev", - "onboarding.backup.view.warning.message1": "Ta fraza za obnovitev vam omogoča popoln dostop do vaše denarnice in sredstev", - "onboarding.backup.view.warning.message2": "Zapišite in shranite na varno mesto", - "onboarding.backup.view.warning.message3": "Oglejte si to zasebno in tega ne delite z nikomer", - "onboarding.cloud.confirm.description": "To boste morali vnesti za povrnitev sredstev. Če ga kdaj pozabite, vam ga ne moremo povrniti.", - "onboarding.cloud.confirm.title": "Potrdite obnovitveno geslo", - "onboarding.cloud.createPassword.description": "To boste morali vnesti za povrnitev sredstev. Če ga kdaj pozabite, vam ga ne moremo povrniti.", - "onboarding.cloud.createPassword.title": "Ustvarite obnovitveno geslo", - "onboarding.complete.button": "Odprite razširitev Uniswap", - "onboarding.complete.description": "Vaša denarnica je pripravljena za pošiljanje in prejemanje kriptovalut. Odprite razširitev Uniswap s spodnjo bližnjico.", - "onboarding.complete.go_to_uniswap": "Pojdite na spletno aplikacijo Uniswap", - "onboarding.complete.pin.description": "Kliknite ikono žebljička, da dodate razširitev Uniswap v orodno vrstico.", - "onboarding.complete.pin.title": "Pin Uniswap razširitev", - "onboarding.complete.title": "Vse je pripravljeno", - "onboarding.extension.biometrics.subtitle.fingerprint": "Dostopajte do svoje denarnice hitro in varno samo s prstnim odtisom.", - "onboarding.extension.biometrics.title": "Omogoči {{biometricsMethod}}", - "onboarding.extension.password.subtitle": "To boste potrebovali za odklepanje denarnice in dostop do fraze za obnovitev", - "onboarding.extension.password.title.default": "Ustvari geslo", - "onboarding.extension.password.title.reset": "Ponastavi geslo", - "onboarding.extension.unsupported.android.description": "Razširitev Uniswap je združljiva samo s Chromom na namizju.", - "onboarding.extension.unsupported.android.title": "Chrome v mobilnih napravah (še) ni podprt", - "onboarding.extension.unsupported.description": "Razširitev Uniswap je trenutno združljiva samo s Chromom.", - "onboarding.extension.unsupported.title": "Ta brskalnik (še) ni podprt", - "onboarding.home.intro.backup.description.extension": "Shranite si frazo za obnovitev, da ne boste nikoli izgubili dostopa do denarnice.", - "onboarding.home.intro.backup.description.mobile": "Pripravite načrt za obnovitev, če kdaj izgubite telefon ali dobite novega.", - "onboarding.home.intro.backup.title": "Varnostno kopirajte svojo denarnico", - "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK in JUP – zdaj na voljo na Unichainu", - "onboarding.home.intro.bridgedAssets.title": "Trgujte z novimi žetoni na Unichainu", - "onboarding.home.intro.fund.description": "Napolnite svojo denarnico z nakupom kriptovalut ali prenosom z drugega računa.", - "onboarding.home.intro.fund.title": "Pridobite svoj prvi žeton", - "onboarding.home.intro.label.required": "Obvezno", - "onboarding.home.intro.label.swipe": "Povlecite", - "onboarding.home.intro.pushNotifications.description": "Prejemajte opozorila o cenah vaših najljubših žetonov, tržnih trendih in še več.", - "onboarding.home.intro.pushNotifications.title": "Bodite obveščeni", - "onboarding.home.intro.unitag.description": "Zgradite prilagojen profil web3 in preprosto delite svoj naslov s prijatelji.", - "onboarding.home.intro.unitag.title": "Zahtevajte svoje {{unitagDomain}} uporabniško ime", - "onboarding.import.error.invalidWords_one": "1 beseda je neveljavna ali napačno črkovana", - "onboarding.import.error.invalidWords_other": "{{count}} besede so neveljavne ali napačno črkovane", - "onboarding.import.method.restore.message.android": "Dodajte denarnice, ki ste jih varnostno kopirali v svoj račun Google Drive.", - "onboarding.import.method.restore.message.ios": "Dodajte denarnice, ki ste jih varnostno kopirali, v svoj račun iCloud.", - "onboarding.import.method.restore.title": "Obnovite denarnico", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.android": "Vnesite geslo za obnovitev, da obnovite denarnico prek varnostne kopije Google Drive.", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.ios": "Vnesite geslo za obnovitev, da obnovite denarnico prek varnostne kopije iCloud.", - "onboarding.import.method.restoreSeedPhrase.cloud.title.android": "Obnovi iz Google Drive", - "onboarding.import.method.restoreSeedPhrase.cloud.title.ios": "Obnovi iz iCloud", - "onboarding.import.method.restoreSeedPhrase.title": "Izberite, kako želite obnoviti denarnico", - "onboarding.import.method.restoreSeedPhrase.wallet.desc": "Vnesite svojih 12 skrivnih besed, ki ste jih prej shranili na varno mesto.", - "onboarding.import.method.restoreSeedPhrase.wallet.title": "Vnesite frazo za obnovitev", - "onboarding.import.method.viewPrivateKeys.button.desc": "Oglejte si svoj zasebni ključ", - "onboarding.import.method.viewPrivateKeys.title": "Nimate ničesar od naštetega? ", - "onboarding.import.onDeviceRecovery.other_options": "Ustvarite ali uvozite drugo denarnico", - "onboarding.import.onDeviceRecovery.other_options.label": "Ne želite ničesar od naštetega?", - "onboarding.import.onDeviceRecovery.subtitle": "Izberite, v katero denarnico se želite znova prijaviti.", - "onboarding.import.onDeviceRecovery.title": "Dobrodošli nazaj v Uniswap", - "onboarding.import.onDeviceRecovery.wallet.button": "Oglejte si frazo za obnovitev", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 druga denarnica", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} druge denarnice", - "onboarding.import.onDeviceRecovery.warning.caption": "Prepričajte se, da ste varnostno kopirali vse druge denarnice. Če jih boste kdaj želeli obnoviti, boste potrebovali njihove obnovitvene stavke ali ustrezne {{cloudProvider}} varnostne kopije.", - "onboarding.import.onDeviceRecovery.warning.title": "Ali si prepričan?", - "onboarding.import.selectMethod.errorMessage": "Prišlo je do nepričakovane napake. prosim poskusite znova", - "onboarding.import.selectMethod.mobileApp.subtitle": "Uvozite denarnico iz mobilne aplikacije prek kode QR.", - "onboarding.import.selectMethod.mobileApp.title": "Uporabite Uniswap Mobile", - "onboarding.import.selectMethod.passkey.subtitle": "Sinhronizirajte svojo denarnico Uniswap z obstoječim geslom.", - "onboarding.import.selectMethod.passkey.title": "Prijava z geslom", - "onboarding.import.selectMethod.recoveryPhrase.subtitle": "Uvoz iz druge kripto denarnice.", - "onboarding.import.selectMethod.recoveryPhrase.title": "Vnesite frazo za obnovitev", - "onboarding.import.selectMethod.title": "Prijava ali uvoz denarnice", - "onboarding.import.title": "Izberite, kako želite dodati svojo denarnico", - "onboarding.importMnemonic.button.default": "Moj stavek za obnovitev je 12 besed", - "onboarding.importMnemonic.button.importing": "Uvažanje ...", - "onboarding.importMnemonic.button.longPhrase": "Moj stavek za obnovitev je daljši", - "onboarding.importMnemonic.error.invalidPhrase": "Besedna zveza, ki ste jo vnesli, ni veljavna", - "onboarding.importMnemonic.subtitle": "Vnesite ali prilepite 12-besedno besedno zvezo za obnovitev", - "onboarding.importMnemonic.title": "Vnesite svojo frazo za obnovitev", - "onboarding.importPasskey.bringWindowToFront": "Postavite okno spredaj", - "onboarding.importPasskey.continueInSecureWindow": "Nadaljujte v oknu za varno prijavo.", - "onboarding.intro.button.alreadyHave": "Denarnico že imam", - "onboarding.intro.button.logInOrImport": "Prijava ali uvoz", - "onboarding.intro.mobileScan.button": "Za uvoz skenirajte kodo QR", - "onboarding.intro.mobileScan.title": "Ali imate aplikacijo Uniswap?", - "onboarding.landing.button.add": "Dodajte obstoječo denarnico", - "onboarding.landing.button.create": "Ustvarite denarnico", - "onboarding.landing.button.createAccount": "Ustvari račun", - "onboarding.name.choose": "Izberite uporabniško ime", - "onboarding.name.choose.subtitle": "To je javno ime, ki ga lahko vsakdo uporabi za pošiljanje kripto.", - "onboarding.notification.permission.message": "Če želite prejemati obvestila, vklopite obvestila za Uniswap Wallet v nastavitvah naprave.", - "onboarding.notification.permission.title": "Dovoljenje za obvestila", - "onboarding.notification.subtitle": "Bodite obveščeni o statusih transakcij in večjih spremembah cen za priljubljene žetone.", - "onboarding.notification.title": "Vklopi obvestila", - "onboarding.passkey.create": "Ustvarite svoje geslo", - "onboarding.passkey.loading.subtitle": "To bi moralo trajati le sekundo.", - "onboarding.passkey.loading.title": "Iskanje vaše denarnice ...", - "onboarding.passkey.secure": "Zavarujte svoj račun", - "onboarding.passkey.secure.description": "Gesla vam omogočajo hiter in varen dostop do vašega računa samo z obrazom ali prstnim odtisom.", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "Potrdimo, da ste razumeli prav. Če izgubite ali to nepravilno zapišete, ne boste mogli povrniti svojih sredstev.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "Če izgubite ali to nepravilno zapišete, ne boste mogli povrniti svojih sredstev.", - "onboarding.recoveryPhrase.confirm.title": "Potrdimo, da ste razumeli prav", - "onboarding.recoveryPhrase.view.subtitle": "Za obnovitev denarnice boste morali vnesti vseh 12 teh skrivnih besed.", - "onboarding.recoveryPhrase.view.title": "Zapišite svoj stavek za obnovitev", - "onboarding.recoveryPhrase.view.title.hasPassword": "Če kdaj pozabite geslo ...", - "onboarding.recoveryPhrase.warning.final.button": "pripravljen sem", - "onboarding.recoveryPhrase.warning.final.message": "Vaša obnovitvena fraza je tisto, kar vam (in vsem, ki jo imajo) omogoča dostop do vaših sredstev. Bodite prepričani, da to zadržite zase.", - "onboarding.recoveryPhrase.warning.final.title": "Ta korak naredite na zasebnem mestu", - "onboarding.recoveryPhrase.warning.screenshot.message": "Vsakdo, ki dobi dostop do vaših fotografij, lahko dostopa do vaše denarnice. Priporočamo, da svoje besede raje zapišete.", - "onboarding.recoveryPhrase.warning.screenshot.title": "Posnetki zaslona niso varni", - "onboarding.resetPassword.complete.safety": "Več o varnosti denarnice", - "onboarding.resetPassword.complete.subtitle": "Za odklepanje denarnice uporabite novo geslo.", - "onboarding.resetPassword.complete.title": "Resetiranje gesla", - "onboarding.scan.error": "Pri nalaganju kode QR je prišlo do napake", - "onboarding.scan.otp.error": "Koda, ki ste jo poslali, ni pravilna ali pa je pri pošiljanju prišlo do napake. Prosim poskusite ponovno.", - "onboarding.scan.otp.failed": "Neuspeli poskusi: {{number}}", - "onboarding.scan.otp.subtitle": "Preverite svojo mobilno aplikacijo Uniswap za 6-mestno kodo", - "onboarding.scan.otp.title": "Vnesite enkratno kodo", - "onboarding.scan.subtitle": "Skenirajte kodo QR z mobilno aplikacijo Uniswap, da začnete uvažati svojo denarnico.", - "onboarding.scan.title": "Uvozite denarnico iz aplikacije", - "onboarding.scan.troubleScanning.message": "Uvoz prek obnovitvene fraze", - "onboarding.scan.troubleScanning.title": "Imate težave pri skeniranju?", - "onboarding.scan.wifi": "Telefon povežite z istim omrežjem WiFi kot računalnik.", - "onboarding.security.alert.biometrics.message.android": "Če želite uporabljati biometrijo, jo najprej nastavite v nastavitvah.", - "onboarding.security.alert.biometrics.message.ios": "Za uporabo {{biometricsMethod}}dovolite dostop v sistemskih nastavitvah", - "onboarding.security.alert.biometrics.title.android": "Biometrija je onemogočena", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} je onemogočen", - "onboarding.security.button.confirm.android": "Omogoči biometrijo", - "onboarding.security.button.confirm.ios": "Omogoči {{biometricsMethod}}", - "onboarding.security.button.setup": "Nastaviti", - "onboarding.security.subtitle.android": "Dodajte dodatno raven varnosti tako, da za pošiljanje transakcij zahtevate biometrijo.", - "onboarding.security.subtitle.ios": "Dodajte dodatno raven varnosti tako, da za pošiljanje transakcij zahtevate {{biometricsMethod}} .", - "onboarding.security.title": "Zaščitite svojo denarnico", - "onboarding.selectWallets.error": "Naslovov ni bilo mogoče naložiti", - "onboarding.selectWallets.title.default": "Izberite denarnice za uvoz", - "onboarding.selectWallets.title.error": "Napaka pri uvozu denarnic", - "onboarding.termsOfService": "Z nadaljevanjem se strinjam s pogoji storitve in soglašam s pravilnikom o zasebnosti", - "onboarding.tooltip.recoveryPhrase.trigger": "Kaj je stavek za obnovitev?", - "onboarding.wallet.continue": "Poskrbimo za varno", - "onboarding.wallet.defaultName": "Denarnica {{number}}", - "onboarding.wallet.description.full": "To je vaš osebni prostor za žetone, NFT in vse vaše posle. Dokončajte nastavitev, da bodo vaša sredstva varna.", - "onboarding.wallet.title": "Dobrodošli v vaši novi denarnici", - "onboarding.welcome.subtitle": "Končajmo nastavitev vaše denarnice.", - "onboarding.welcome.title": "Dobrodošli!", - "outageBanner.message": "Podatki {{chainName}}{{versionDescription}} trenutno niso na voljo, vendar pričakujemo, da bo težava kmalu odpravljena.", - "outageBanner.message.sub": "Še vedno lahko zamenjate in zagotovite likvidnost v tej verigi brez težav.", - "outageBanner.title": "{{versionName}} bo kmalu nazaj", - "passkeys.help.modal.subtitle": "Če imate težave z geslom, za pomoč obiščite podporo Uniswap.", - "passkeys.help.modal.subtitle.invalidPasskey": "Vaše zahteve ni bilo mogoče dokončati. Poskusite znova z geslom, povezanim z ", - "passkeys.help.modal.subtitle.technicalError": "Vaše zahteve ni bilo mogoče dokončati zaradi nepričakovane tehnične napake. Vaša sredstva so na varnem. prosim poskusite znova", - "passkeys.help.modal.title": "Rabim pomoč?", - "passkeys.help.modal.title.invalidPasskey": "Neveljavno geslo", - "passkeys.help.modal.title.technicalError": "Tehnična napaka", - "passkeys.manage.modal.subtitle": "Če želite dodati ali odstraniti geslo, se prijavite v {{passkeyManagementUrl}}.", - "passkeys.manage.modal.title": "Upravljanje gesel", - "permit.approval.fail": "Odobritev dovoljenja ni uspela", - "permit.approval.fail.message": "Dovoljenje2 omogoča skupno rabo in upravljanje odobritev žetonov v različnih aplikacijah.", - "pool.activeRange": "Aktivni obseg kljukic", - "pool.addAs": "Dodaj kot {{nativeWrappedSymbol}}", - "pool.apr": "APR", - "pool.apr.base": "Osnovna APR", - "pool.apr.description": "Letno na podlagi enodnevnih pristojbin", - "pool.apr.reward": "Nagrada APR", - "pool.aprText": "APR bazena", - "pool.balances": "Bilanca bazena", - "pool.closedCTA.description": "Ogledate si jih lahko s filtrom na vrhu strani.", - "pool.closedCTA.title": "Iščete svoja zaprta delovna mesta?", - "pool.collectAs": "Zberite kot {{nativeWrappedSymbol}}", - "pool.collectFees": "Zbirajte pristojbine", - "pool.connectEthereumToView": "Za ogled svojih skladov povežite denarnico Ethereum", - "pool.create": "Ustvarjanje novega bazena", - "pool.create.info": "Vaše izbire bodo ustvarile nov likvidnostni sklad, kar lahko povzroči nižjo začetno likvidnost in povečano volatilnost. Razmislite o dodajanju k obstoječemu bazenu, da zmanjšate ta tveganja.", - "pool.createdPosition": "Ustvarjen položaj", - "pool.createdPosition.canceled": "Ustvarjanje položaja preklicano", - "pool.createdPosition.failed": "Ustvarjanje položaja ni uspelo", - "pool.dynamic": "Dinamični bazen", - "pool.earnings": "Zaslužek", - "pool.earnings.empty": "Nimate še nobenega zaslužka", - "pool.explorers": "Raziskovalci", - "pool.import": "Uvozni bazen", - "pool.import.link.description": "Nekateri položaji v2 niso prikazani samodejno.", - "pool.import.positions.v2": "Uvozi položaje V2", - "pool.import.positions.v2.selectPair.description": "Nekateri položaji v2 niso prikazani samodejno. Izberite par žetonov za uvoz in ogled svojih položajev.", - "pool.import.success": "Bazen uvožen", - "pool.incentives.administeredRewards": "Nagrade se delijo po avtonomni Merklovi distributerski pogodbi.", - "pool.incentives.collect": "Zberite", - "pool.incentives.collectedRewards": "Zbrane nagrade", - "pool.incentives.collectFailed": "Zbiranje ni uspelo, poskusite znova.", - "pool.incentives.collectFailedNoRetry": "Zbiranje nagrad ni uspelo.", - "pool.incentives.collectingRewards": "Zbiranje nagrad", - "pool.incentives.collectRewards": "Zbirajte nagrade", - "pool.incentives.collectRewardsCanceled": "Zbiranje nagrad preklicano", - "pool.incentives.daysLeft": "preostalih dni", - "pool.incentives.eligible": "Primerni skladi imajo žetonske nagrade, tako da lahko zaslužite več", - "pool.incentives.merklDocs": "Izračunal Merkl iz nagrad za emisije in združene TVL.", - "pool.incentives.rewardsDistribution": "Podelitev nagrad", - "pool.incentives.rewardsEarned": "Zaslužene nagrade", - "pool.incentives.similarPoolHasRewards": "Podoben sklad ima nagrade UNI", - "pool.incentives.switchPools": "Preklopite bazene", - "pool.incentives.timePeriod": "Časovno obdobje", - "pool.incentives.uni.findMore": "Poiščite skupine z nagradami UNI", - "pool.incentives.yourRewards.error": "Vaše nagrade trenutno niso na voljo", - "pool.incentives.yourRewards.error.description": "Nagrad ni bilo mogoče pridobiti. To je lahko posledica težave z omrežjem. Poskusite znova naložiti stran.", - "pool.info": "Informacije o bazenu", - "pool.limitFluctuation.warning": "Upoštevajte, da se lahko izvajanje omejitev razlikuje glede na nihanja trga v realnem času in prezasedenost omrežja Ethereum. Omejitve se morda ne bodo izvršile točno takrat, ko žetoni dosežejo določeno ceno.", - "pool.liquidity.data.error.message": "Pri pridobivanju podatkov, potrebnih za vašo transakcijo, je prišlo do napake.", - "pool.liquidity.outOfSync": "Neusklajenost skupne in tržne cene", - "pool.liquidity.outOfSync.message": "Cene v tem bazenu se razlikujejo od tržnih cen izbranih žetonov. Ustrezno prilagodite svoj cenovni razpon ali počakajte, da se sklad ponovno uravnoteži, da se izognete izgubam.", - "pool.maxPrice": "Max cena", - "pool.migrateLiquidity": "Preseli likvidnost", - "pool.migrateLiquidityDisabledTooltip": "Ta veriga ne podpira skladov likvidnosti v4.", - "pool.migrateToV4": "Preselite na v4", - "pool.minPrice": "Najmanjša cena", - "pool.newPosition.plus": "+ Nov položaj", - "pool.newPosition.title": "Nov položaj", - "pool.newSpecificPosition": "Nov {{symbol}} položaj", - "pool.notAvailableOnSolana": "Bazeni niso na voljo na Solani.", - "pool.notFound.description": "Žal ne moremo najti nobenih informacij za ta bazen. Preverite ime in naslov ter poskusite znova.", - "pool.notFound.title": "Bazena ni bilo mogoče najti", - "pool.openToStart.evmAndSolanaConnected": "Za začetek odprite novo delovno mesto ali ustvarite skupino. Skupine niso na voljo na Solani.", - "pool.openToStart.evmOnly": "Za začetek odprite nov položaj ali ustvarite skupino.", - "pool.percent": "{{pct}}% bazena", - "pool.pooled": "Združeno {{sym}}:", - "pool.position": "Položaj", - "pool.positions": "Položaji", - "pool.positions.title": "Vaši položaji", - "pool.positions.transaction.settings": "Nastavitve transakcije", - "pool.positions.usdValueUnavailable": "Vrednost v USD ni na voljo", - "pool.positions.usdValueUnavailable.tooltip": "Vrednost v USD trenutno ni na voljo za ta položaj. Oglejte si podrobnosti o položaju za zneske položenih žetonov.", - "pool.refresh.prices": "Osveži cene", - "pool.removeLiquidity": "Odstranite likvidnost", - "pool.rewardAPR": "APR nagrade (UNI)", - "pool.rewardAPR.percent": "{{pct}} nagrada APR", - "pool.rewards": "Nagrade", - "pool.rewardsPool.label": "Žetoni združenja v skladu nagrad:", - "pool.selectPair": "Izberite par", - "pool.share.label": "Vaš delež v bazenu:", - "pool.specificPosition": "{{symbol}} položaj", - "pool.tokenPair": "Par žetonov", - "pool.top.rewards": "Bazeni z nagradami", - "pool.top.tvl": "Top bazeni TVL", - "pool.top.volume": "Bazeni po 24-urni prostornini", - "pool.totalAPR": "Skupna APR", - "pool.totalTokens": "Vaši skupni žetoni skupine:", - "pool.v2": "bazeni v2", - "pool.v3": "v3 bazeni", - "pool.via": "{{tokenPair}} prek {{dex}}", - "pool.volOverTvl": "1D vol/TVL", - "pool.volume.thirtyDay": "30 dnevni volumen", - "pool.volume.thirtyDay.short": "30D vol", - "pool.withdrawAs": "Umakni kot {{nativeWrappedSymbol}}", - "poolFinder.availablePools": "Na voljo bazeni", - "poolFinder.availablePools.found.description": "v2 bazeni, ki ustrezajo vaši izbiri para.", - "poolFinder.availablePools.notFound.description": "Ni ujemajočih se bazenov v2. Še enkrat preverite izbiro žetona in se prepričajte, da ste povezani s pravo denarnico.", - "pools.explore": "Raziščite bazene", - "portfolio.activity.filters.timePeriod.all": "Ves čas", - "portfolio.activity.filters.transactionType.all": "Vse vrste", - "portfolio.activity.filters.transactionType.deposits": "Depoziti", - "portfolio.activity.filters.transactionType.staking": "Stavljanje", - "portfolio.activity.filters.transactionType.swaps": "Zamenjave", - "portfolio.activity.title": "dejavnost", - "portfolio.connectWallet.summary": "Sledite žetonom, skupinam in drugemu v {{amount}}+ omrežjih", - "portfolio.defi.title": "DeFi", - "portfolio.description": "Spremljajte svoj kripto portfelj v vseh verigah in protokolih", - "portfolio.nfts.title": "NFT-ji", - "portfolio.overview.title": "Pregled", - "portfolio.title": "Portfolio", - "portfolio.tokens.table.column.allocation": "Dodelitev", - "portfolio.tokens.table.column.balance": "Ravnovesje", - "portfolio.tokens.table.column.change1d": "1D sprememba", - "portfolio.tokens.table.column.price": "Cena", - "portfolio.tokens.table.column.token": "Žeton", - "portfolio.tokens.table.column.value": "Vrednost", - "portfolio.tokens.title": "Žetoni", - "position.addHook": "Dodajte kavelj", - "position.addHook.tooltip": "Kavlji so napredna funkcija, ki bazenom omogoča interakcijo s pametnimi pogodbami in odklepanje različnih zmogljivosti. Pri dodajanju kavljev bodite previdni, saj so nekateri lahko zlonamerni ali povzročijo neželene posledice.", - "position.addingHook": "Dodajanje kljuke", - "position.addingHook.disclaimer": "Dodajanje kavljev ima lahko neželene posledice. Raziščite in nadaljujte na lastno odgovornost.", - "position.addingHook.hideProperties": "Skrij lastnosti", - "position.addingHook.invalidAddress": "Vnesite veljaven naslov kljuke", - "position.addingHook.viewProperties": "Ogled lastnosti", - "position.create.confirm": "Potrdite položaj", - "position.create.invalidPrice": "Neveljavna cena", - "position.create.invalidRange": "Neveljaven obseg", - "position.create.modal.header": "Ustvarjanje položaja", - "position.create.unsupportedSolana": "Bazeni Solana niso podprti.", - "position.create.unsupportedSolana.description": "Če želite ustvariti bazen, preklopite na podprto verigo EVM.", - "position.create.unsupportedToken.description": "Poskusite ustvariti z drugo različico protokola.", - "position.create.v2unsupportedChain": "Ta veriga ni podprta za bazene v2.", - "position.currentValue": "Vrednost trenutne pozicije", - "position.default_price_strategies": "Cenovne strategije", - "position.default_price_strategies.error": "Cenovne strategije ni mogoče nastaviti", - "position.deposit.confirm.create.description.less": "Začetna vnesena cena je {{value}}% nižja od tržne cene in lahko povzroči izgubo sredstev. Ali želite nadaljevati?", - "position.deposit.confirm.create.description.more": "Začetna vnesena cena je {{value}}% višja od tržne cene in lahko povzroči izgubo sredstev. Ali želite nadaljevati?", - "position.deposit.confirm.create.title": "Velika razlika v ceni glede na trg", - "position.deposit.description": "Določite simbolične zneske za svoj likvidnostni prispevek.", - "position.depositedCurrency": "Deponirano {{currencySymbol}}", - "position.fot.warning": "{{token}} in druge žetone »Provizija ob prenosu« podpira samo Uniswap v2.", - "position.fot.warning.cta": "Ustvari položaj v2", - "position.hook.disclaimer": "Razumem morebitna tveganja, povezana z dodajanjem tega trnka.", - "position.hook.donateWarning": "Ta zastavica lahko povzroči spremembe zasluženih pristojbin.", - "position.hook.liquidityWarning": "Ta zastavica lahko povzroči, da združenje blokira dodajanje nove likvidnosti. Vaša transakcija se lahko povrne.", - "position.hook.removeWarning": "Lahko povzroči zaklepanje vaših sredstev ali blokiranje pobiranja pristojbin.", - "position.hook.swapWarning": "Ta zastavica lahko ponudnikom likvidnosti omogoči, da lažje izkoristijo pravočasno likvidnost, kar lahko povzroči nižje zaslužene provizije.", - "position.hook.warningHeader": "Pomembno: ugotovljena tveganja za kavelj", - "position.hook.warningInfo": "Prepoznali smo morebitna tveganja s to kljuko. Prepričajte se, da razumete, kako ta kavelj deluje, preden se odločite nadaljevati.", - "position.increase.fot": "Dodajanje likvidnosti za {{token}} in druge žetone »Provizija ob prenosu« ni podprto.", - "position.initialPrice": "Začetna cena", - "position.initialPrice.difference.negative": "{{ value }}% manj od tržne cene", - "position.initialPrice.difference.positive": "{{ value }}% več od tržne cene", - "position.initialPrice.info": "Ko ustvarjate nov sklad, morate nastaviti začetni menjalni tečaj za oba žetona. Ta tečaj bo odražal začetno tržno ceno.", - "position.initialPrice.set": "Določite začetno ceno", - "position.initialPrice.useMarketPrice": "Uporabite tržno ceno", - "position.migrate.liquidity": "Pri selitvi pozicij ne morete spremeniti svojega para žetonov, lahko pa dodate kavelj za izboljšanje funkcionalnosti.", - "position.migrate.v4unsupportedChain": "Ta veriga ni podprta za bazene v4.", - "position.new": "Nov položaj", - "position.new.protocol": "Nov {{protocol}} položaj", - "position.notFound": "Položaja ni mogoče najti", - "position.notFound.description": "Podrobnosti o tem položaju niso na voljo. Preverite, ali ste povezani s pravo denarnico.", - "position.one_sided_lower": "Enostransko nižje", - "position.one_sided_lower.description": "Likvidnost ponudbe, če cena pade", - "position.one_sided_upper": "Enostranski zgornji del", - "position.one_sided_upper.description": "Likvidnost ponudbe, če cena naraste", - "position.protocol": "{{protocol}} položaj", - "position.provide.liquidity": "Izberite žetone, za katere želite zagotoviti likvidnost. Žetone lahko izberete v vseh podprtih omrežjih.", - "position.provide.liquidityDescription": "Zagotavljanje celotnega obsega likvidnosti zagotavlja stalno udeležbo na trgu pri vseh možnih cenah, kar ponuja preprostost, vendar s potencialom večje trajne izgube.", - "position.provide.liquidityDescription.creatingPool": "Nastavitev celotnega razpona likvidnosti pri ustvarjanju skupine zagotavlja stalno udeležbo na trgu pri vseh možnih cenah, kar ponuja preprostost, vendar s potencialom večje trajne izgube.", - "position.provide.liquidityDescription.custom": "Razpon po meri vam omogoča, da koncentrirate svojo likvidnost znotraj določenih cenovnih meja, s čimer izboljšate kapitalsko učinkovitost in zaslužek od provizij, vendar zahtevate bolj aktivno upravljanje.", - "position.provide.outOfRange.closePosition": "Zapri položaj", - "position.provide.outOfRange.description": "Razpona tega položaja med selitvijo ni mogoče prilagoditi. Če želite nastaviti nov obseg, zaprite ta položaj in odprite nov položaj v4.", - "position.provide.outOfRange.title": "Premikate položaj izven dosega", - "position.removeHook": "Odstranite kavelj", - "position.resetDescription": "Vaši izbori žetonov, cene in obsega bodo ponastavljeni.", - "position.setRange": "Nastavite cenovni razpon", - "position.setRange.inputsBelow": "Za nastavitev obsega uporabite spodnje vnose.", - "position.stable": "Hlev", - "position.stable.description": "Dobro za stabilne kovance ali pare z nizko volatilnostjo", - "position.step.deposit": "Vnesite zneske depozita", - "position.step.price": "Določite začetno ceno in zneske depozita", - "position.step.range": "Nastavite cenovni razpon in zneske depozitov", - "position.step.select": "Izberite par žetonov in provizije", - "position.value": "Vrednost položaja", - "position.valueUnavailable": "Vrednost v USD trenutno ni na voljo za to pozicijo. Oglejte si podrobnosti položaja za zneske položenih žetonov.", - "position.wide": "Široko", - "position.wide.description": "Dobro za nestanovitne pare", - "position.wrapped.unwrap": "Odvij {{wrappedToken}}", - "position.wrapped.warning": "{{nativeToken}} je potrebno za bazene v4", - "position.wrapped.warning.info": "Odvijte svoj {{wrappedToken}} in položite {{nativeToken}} , da zagotovite stroškovno učinkovitejšo likvidnost.", - "positions.noPositions.description": "Nimate likvidnostnih pozicij. Ustvarite novo pozicijo, da začnete služiti provizije in nagrade v upravičenih skladih.", - "positions.noPositions.title": "Ni položajev", - "positions.welcome.connect.description": "Za ogled svojih položajev in nagrad morate povezati svojo denarnico.", - "positions.welcome.connect.wallet": "Povežite svojo denarnico", - "privacy.anonymizedLogs": "Aplikacija beleži anonimno statistiko uporabe, da se sčasoma izboljša.", - "privacy.autoRouter": "Aplikacija pridobi optimalno trgovinsko pot s strežnika Uniswap Labs.", - "privacy.infura": "Aplikacija pridobi podatke v verigi in ustvari pogodbene klice z API-jem Infura.", - "privacy.thirdPartyApis": "Ta aplikacija uporablja naslednje API-je tretjih oseb:", - "privacy.trm": "Aplikacija varno zbira vaš naslov denarnice in ga deli s TRM Labs Inc. zaradi tveganja in skladnosti.", - "privacy.uniswaptos": "Pogoji storitve Uniswap Labs", - "privateKeys.export.modal.speedbump.bullet1": "Oglejte si to zasebno", - "privateKeys.export.modal.speedbump.bullet2": "Ne delite z nikomer", - "privateKeys.export.modal.speedbump.bullet3": "Nikoli ga ne vnesite na nobeno spletno mesto ali aplikacijo", - "privateKeys.export.modal.speedbump.subtitle": "Vsakdo, ki pozna vaš zasebni ključ, lahko dostopa do vaše denarnice in sredstev.", - "privateKeys.export.modal.speedbump.title": "Preden nadaljujete", - "privateKeys.export.modal.subtitle": "Zdi se, da ne morete v celoti obnoviti svoje denarnice. Da ne boste nikoli izgubili dostopa do svojih sredstev, kopirajte svoj zasebni ključ.", - "privateKeys.export.modal.title": "Izvozite svoj zasebni ključ", - "privateKeys.export.modal.warning": "Če izgubite telefon ali izbrišete aplikacijo, boste morali ta ključ uvoziti v drugo denarnico.", - "privateKeys.view.button.continue": "Vse sem jih kopiral.", - "privateKeys.view.button.continue.single": "Kopiral sem ga.", - "privateKeys.view.subtitle": "Vaš zasebni ključ omogoča dostop do določene denarnice. Vsaka denarnica ima drugačen zasebni ključ.", - "privateKeys.view.title": "Zasebni ključ", - "qrScanner.button.connections_one": "Povezana je 1 aplikacija", - "qrScanner.button.connections_other": "{{count}} povezanih aplikacij", - "qrScanner.error.camera.message": "Če želite optično prebrati kodo, omogočite dostop do kamere v sistemskih nastavitvah", - "qrScanner.error.camera.title": "Kamera je onemogočena", - "qrScanner.error.none": "Ni kode QR", - "qrScanner.recipient.action.scan": "Skenirajte kodo QR", - "qrScanner.recipient.action.show": "Pokaži mojo kodo QR", - "qrScanner.recipient.error.message": "Prepričajte se, da skenirate veljavno kodo QR naslova Ethereum, preden poskusite znova.", - "qrScanner.recipient.error.title": "Neveljavna koda QR", - "qrScanner.request.message.unavailable": "Ni sporočila.", - "qrScanner.request.method.default": "Zahteva od {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "Zahteva za podpis od {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "Zahteva za transakcijo od {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "Dovoliti {{dappName}} uporabo do {{amount}} {{currencySymbol}}?", - "qrScanner.request.withoutAmount": "Dovoliti {{dappName}} uporabo vašega {{currencySymbol}}?", - "qrScanner.status.connecting": "Povezovanje ...", - "qrScanner.status.loading": "Nalaganje...", - "qrScanner.title": "Skenirajte kodo QR", - "qrScanner.wallet.networks": "Podprta omrežja", - "range.outOfView": "Razpon izven vidnega polja", - "removeLiquidity.pooled": "Združeno {{symbol}}:", - "revoke.failed.message": "Verjetno je preklic neuspešen zaradi težav z omrežjem ali povezavo. Preverite povezavo in poskusite znova.", - "routing.aggregateLiquidity": "Ko je na voljo, združuje vire likvidnosti za boljše cene in zamenjave brez plina.", - "routing.aggregateLiquidity.uniswapx": "UniswapX združuje vire likvidnosti v verigi in zunaj nje, kar vam prinaša najboljše razpoložljive cene in menjave brez plina.", - "routing.cheapest": "Odjemalec Uniswap izbere najcenejšo trgovinsko možnost, upoštevajoč ceno in stroške omrežja.", - "routing.cheapest.v4": "Odjemalec Uniswap izbere optimalno možnost trgovanja ob upoštevanju cene in stroškov omrežja.", - "scantastic.code.expired": "potekel", - "scantastic.code.subtitle": "Vnesite to kodo v razširitev Uniswap. Vaš obnovitveni stavek bo varno šifriran in prenesen.", - "scantastic.code.timeRemaining.shorthand.hours": "Nova koda čez {{hours}}h {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.minutes": "Nova koda čez {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.seconds": "Nova koda čez {{seconds}}s", - "scantastic.code.title": "Enkratna koda Uniswap", - "scantastic.confirmation.button.continue": "Da, nadaljuj", - "scantastic.confirmation.label.browser": "Brskalnik", - "scantastic.confirmation.label.device": "Naprava", - "scantastic.confirmation.subtitle": "Nadaljujte samo, če skenirate kodo QR iz razširitve Uniswap na zaupanja vredni napravi.", - "scantastic.confirmation.title": "Ali poskušate uvoziti svojo denarnico?", - "scantastic.confirmation.warning": "Pazite se spletnih mest in aplikacij, ki se predstavljajo kot Uniswap. V nasprotnem primeru je lahko vaša denarnica ogrožena.", - "scantastic.error.encryption": "Priprava semenske fraze ni uspela.", - "scantastic.error.noCode": "Prejeto ni bilo enkratno geslo. Prosim poskusite ponovno.", - "scantastic.error.timeout.message": "Ponovno skenirajte kodo QR na razširitvi Uniswap, da nadaljujete s sinhronizacijo denarnice.", - "scantastic.error.timeout.title": "Vaša povezava je potekla", - "scantastic.modal.ipMismatch.description": "Če želite optično prebrati to kodo QR, mora biti vaš telefon povezan z istim omrežjem WiFi kot vaš računalnik, vsa omrežja VPN pa morajo biti začasno izklopljena.", - "scantastic.modal.ipMismatch.title": "Preklopite omrežje WiFi", - "search.input.placeholder": "Iskanje žetonov in bazenov", - "search.ukDisclaimer": "Zavrnitev odgovornosti za prebivalce Združenega kraljestva", - "send.button.review": "Pregled prenosa", - "send.gas.error.title": "N/A", - "send.gas.networkCost.title": "Stroški omrežja", - "send.input.token.balance.title": "Stanje: {{balance}} {{symbol}}", - "send.recipient.header": "Izberite prejemnika", - "send.recipient.input.placeholder": "Iskanje ENS ali naslov", - "send.recipient.previous_one": "1 prejšnji prenos", - "send.recipient.previous_other": "{{count}} prejšnji prenosi", - "send.recipient.results.empty": "Ni zadetkov", - "send.recipient.results.error": "Naslov, ki ste ga vnesli, ne obstaja ali je napačno črkovan.", - "send.recipient.section.favorite": "Najljubše denarnice", - "send.recipient.section.recent": "Nedavno", - "send.recipient.section.search": "Rezultati iskanja", - "send.recipient.section.viewOnly": "Denarnice samo za ogled", - "send.recipient.section.yours": "Vaše denarnice", - "send.recipient.warning.viewOnly.message": "Sredstva pošljite v to denarnico le, če imate stavek za obnovitev ali poznate lastnika denarnice.", - "send.recipient.warning.viewOnly.title": "To imate kot denarnico samo za ogled", - "send.recipientSelect.search.empty.message": "Ko pošljete žetone na naslov denarnice, se bodo prikazali tukaj", - "send.recipientSelect.search.empty.title": "Nobena denarnica ni shranjena", - "send.review.modal.title": "Ti pošiljaš", - "send.review.summary.button.title": "Potrdi pošiljanje", - "send.search.empty.subtitle": "Naslov, ki ste ga vnesli, ne obstaja ali je napačno črkovan.", - "send.search.empty.title": "Ni zadetkov", - "send.search.placeholder": "Iskanje ENS ali naslov", - "send.solanaSendNotSupported": "Pošiljanje ni podprto na Solani", - "send.title": "Pošlji", - "send.unavailableOnSolana.message": "Pošiljanje ni na voljo v denarnicah Solana", - "send.warning.blocked.default": "Ta denarnica je blokirana", - "send.warning.blocked.modal.message": "Ta naslov je blokiran v denarnici Uniswap, ker je povezan z eno ali več blokiranimi dejavnostmi. Če menite, da je to napaka, pišite na compliance@uniswap.org.", - "send.warning.blocked.modal.title": "Blokiran naslov", - "send.warning.blocked.recipient": "Denarnica prejemnika je blokirana", - "send.warning.erc20.checkbox.description": "Poskušate poslati sredstva na žetonski naslov. To lahko povzroči trajno izgubo sredstev.", - "send.warning.erc20.checkbox.heading": "Zaznan naslov žetona", - "send.warning.erc20.message": "Poskušate poslati sredstva na žetonski naslov. Pošiljanje kripto na to vrsto naslova lahko povzroči trajno izgubo sredstev.", - "send.warning.erc20.title": "To je žetonski naslov", - "send.warning.insufficientFunds.message": "Vaše {{currencySymbol}} stanje se je zmanjšalo, odkar ste vnesli znesek, ki ga želite poslati", - "send.warning.insufficientFunds.title": "Ni dovolj {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "Ni dovolj {{currencySymbol}} na {{networkName}} za pošiljanje", - "send.warning.insufficientGas.message.withoutNetwork": "Ni dovolj {{currencySymbol}} za pošiljanje", - "send.warning.modal.button.cta.blocking": "v redu", - "send.warning.modal.button.cta.cancel": "Prekliči", - "send.warning.modal.button.cta.confirm": "Potrdi", - "send.warning.newAddress.details.ENS": "ENS", - "send.warning.newAddress.details.username": "Uporabniško ime", - "send.warning.newAddress.details.walletAddress": "Naslov denarnice", - "send.warning.newAddress.message": "S tem naslovom še niste opravili transakcije. Pred nadaljevanjem potrdite, da je naslov pravilen.", - "send.warning.newAddress.title": "Nov naslov", - "send.warning.self.message": "Poskušate poslati sredstva v svojo trenutno denarnico. Pošiljanje kripto na ta naslov bo povzročilo nepotrebne stroške omrežja.", - "send.warning.self.title": "To je vaša trenutna denarnica", - "send.warning.smartContract.message": "Sredstva boste poslali na naslov pametne pogodbe. Prepričajte se, da je to pravi naslov in da lahko prejme žetone. V nasprotnem primeru lahko to povzroči trajno izgubo sredstev.", - "send.warning.smartContract.title": "To je naslov pametne pogodbe", - "send.warning.viewOnly.message": "Za pošiljanje sredstev morate to denarnico uvoziti prek obnovitvene fraze.", - "send.warning.viewOnly.title": "Ta denarnica je samo za ogled", - "send.youAreSending": "Ti pošiljaš", - "sendRecipientForm.recentAddresses.label": "Nedavne", - "sendReviewModal.title": "Pregled pošlji", - "setting.recoveryPhrase.account.show": "Pokaži obnovitveni stavek", - "setting.recoveryPhrase.action.hide": "Skrij frazo za obnovitev", - "setting.recoveryPhrase.remove": "Odstranite stavek za obnovitev", - "setting.recoveryPhrase.remove.confirm.subtitle": "Razumem, da mi Uniswap Labs ne more pomagati obnoviti denarnice, če tega ne storim.", - "setting.recoveryPhrase.remove.confirm.title": "Shranil sem obnovitveni stavek", - "setting.recoveryPhrase.remove.initial.subtitle": "Prepričajte se, da ste shranili stavek za obnovitev. V nasprotnem primeru boste izgubili dostop do svojih denarnic", - "setting.recoveryPhrase.remove.initial.title": "Preden nadaljujete", - "setting.recoveryPhrase.remove.subtitle": "Za potrditev vnesite svoje geslo", - "setting.recoveryPhrase.remove.title": "Odstranjujete svoj obnovitveni stavek", - "setting.recoveryPhrase.view.warning.message1": "Vsakdo, ki pozna vašo frazo za obnovitev, lahko dostopa do vaše denarnice in sredstev", - "setting.recoveryPhrase.view.warning.message2": "Oglejte si to zasebno", - "setting.recoveryPhrase.view.warning.message3": "Ne delite z nikomer", - "setting.recoveryPhrase.view.warning.message4": "Nikoli ga ne vnesite na nobeno spletno mesto ali aplikacijo", - "setting.recoveryPhrase.view.warning.title": "Preden nadaljujete", - "setting.recoveryPhrase.warning.view.message": "Vsakdo, ki pozna vašo frazo za obnovitev, lahko dostopa do vaše denarnice in sredstev.", - "setting.recoveryPhrase.warning.view.title": "Oglejte si to na zasebnem mestu", - "settings.action.enableInSettings": "Omogoči v nastavitvah", - "settings.action.feedback": "Pošlji povratno informacijo", - "settings.action.help": "Poišči pomoč", - "settings.action.lock": "Zakleni denarnico", - "settings.action.privacy": "Politika zasebnosti", - "settings.action.terms": "Pogoji storitve", - "settings.connectWalletPlatform.warning": "Za uporabo Uniswapa na {{platform}}se povežite z denarnico, ki podpira {{platform}}.", - "settings.footer": "Narejeno z ljubeznijo, \nekipa Uniswap 🦄", - "settings.hideSmallBalances": "Skrij majhna stanja", - "settings.hideSmallBalances.subtitle": "Stanja pod 1 USD bodo skrita v vašem portfelju.", - "settings.maxSlippage": "Maks. zdrs", - "settings.maxSlippage.amount": "{{amount}} maks. zdrs", - "settings.section.about": "O tem", - "settings.section.preferences": "Nastavitve", - "settings.section.privacyAndSecurity": "Zasebnost in varnost", - "settings.section.support": "Podpora", - "settings.section.wallet.hidden.row.title": "{{numHidden}} druge denarnice", - "settings.setting.advanced.title": "Napredno", - "settings.setting.advancedSettings": "Advanced settings", - "settings.setting.appearance.option.auto": "Avto", - "settings.setting.appearance.option.dark.subtitle": "Vedno uporabite temno temo.", - "settings.setting.appearance.option.dark.title": "Temno", - "settings.setting.appearance.option.device.subtitle": "Prilagodi se nastavitvam vaše naprave.", - "settings.setting.appearance.option.device.title": "Avto", - "settings.setting.appearance.option.light.subtitle": "Vedno uporabljajte svetlo temo.", - "settings.setting.appearance.option.light.title": "Svetloba", - "settings.setting.appearance.title": "Tema", - "settings.setting.backup.create.description": "Če nastavite geslo, boste šifrirali varnostno kopijo obnovitvene fraze in dodali dodatno raven zaščite, če bo vaš {{cloudProviderName}} račun kdaj ogrožen.", - "settings.setting.backup.create.title": "Varnostno kopiraj na {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "Ker si te denarnice delijo stavek za obnovitev, bodo izbrisane tudi varnostne kopije za te denarnice spodaj", - "settings.setting.backup.delete.confirm.title": "Ali si prepričan?", - "settings.setting.backup.delete.warning": "Če izbrišete varnostno kopijo {{cloudProviderName}} , boste denarnico lahko obnovili le z ročno varnostno kopijo obnovitvene fraze. Uniswap Labs ne more obnoviti vaših sredstev, če izgubite obnovitveno frazo.", - "settings.setting.backup.error.message.full": "Ni mogoče varnostno kopirati fraze za obnovitev v {{cloudProviderName}}. Prepričajte se, da imate {{cloudProviderName}} omogočeno z razpoložljivim prostorom za shranjevanje in poskusite znova.", - "settings.setting.backup.error.message.short": "Varnostne kopije ni mogoče izbrisati", - "settings.setting.backup.error.title": "{{cloudProviderName}} napaka", - "settings.setting.backup.modal.description": "Svoje fraze za obnovitev še niste varnostno kopirali v {{cloudProviderName}} . S tem lahko obnovite svojo denarnico tako, da ste prijavljeni v {{cloudProviderName}} v kateri koli napravi.", - "settings.setting.backup.modal.title": "Varnostno kopirajte frazo za obnovitev na {{cloudProviderName}}?", - "settings.setting.backup.password.error.mismatch": "geslo se ne ujema", - "settings.setting.backup.password.medium": "To je srednje geslo", - "settings.setting.backup.password.placeholder.confirm": "Potrdi geslo", - "settings.setting.backup.password.placeholder.create": "Ustvari geslo", - "settings.setting.backup.password.strong": "To je močno geslo", - "settings.setting.backup.password.weak": "To je šibko geslo", - "settings.setting.backup.recoveryPhrase.label": "Fraza za obnovitev", - "settings.setting.backup.selected": "{{cloudProviderName}} varnostna kopija", - "settings.setting.backup.status.action.delete": "Izbriši varnostno kopijo", - "settings.setting.backup.status.complete": "Varnostno kopirano v {{cloudProviderName}}", - "settings.setting.backup.status.description": "Če imate varnostno kopijo obnovitvene fraze na {{cloudProviderName}}, lahko obnovite svojo denarnico tako, da ste prijavljeni v svoj {{cloudProviderName}} račun v kateri koli napravi.", - "settings.setting.backup.status.inProgress": "Varnostno kopiranje v {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "Varnostno kopirano", - "settings.setting.backup.status.title": "{{cloudProviderName}} varnostna kopija", - "settings.setting.beta.tooltip": "Prihaja kmalu", - "settings.setting.biometrics.appAccess.subtitle.android": "Za odpiranje aplikacije zahtevajte obraz/prstni odtis.", - "settings.setting.biometrics.appAccess.subtitle.ios": "Za odpiranje aplikacije zahtevajte {{biometricsMethod}} .", - "settings.setting.biometrics.appAccess.title": "Dostop do aplikacije", - "settings.setting.biometrics.auth": "Prosimo za preverjanje pristnosti", - "settings.setting.biometrics.extension.waitingForBiometricsModal.content": "Za nadaljevanje omogočite {{biometricsMethod}} v nastavitvah brskalnika ali sistema.", - "settings.setting.biometrics.extension.waitingForBiometricsModal.title": "Čakanje na {{biometricsMethod}}", - "settings.setting.biometrics.off.message.android": "Biometrija je trenutno izklopljena za Uniswap Wallet – vklopite jo lahko v sistemskih nastavitvah.", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} je trenutno izklopljen za Uniswap Wallet – vklopite ga lahko v sistemskih nastavitvah.", - "settings.setting.biometrics.off.title.android": "Biometrija je izklopljena", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} je izklopljen", - "settings.setting.biometrics.title": "Odklepanje z obrazom/prstnim odtisom", - "settings.setting.biometrics.transactions.subtitle.android": "Za transakcijo zahtevajte obraz/prstni odtis.", - "settings.setting.biometrics.transactions.subtitle.ios": "Za transakcijo zahtevajte {{biometricsMethod}} .", - "settings.setting.biometrics.transactions.title": "Transakcije", - "settings.setting.biometrics.unavailable.message.android": "Biometrija ni nastavljena v vaši napravi. Če želite uporabljati biometrijo, jo najprej nastavite v nastavitvah.", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} ni nastavljen v vaši napravi. Če želite uporabljati {{biometricsMethod}}, ga najprej nastavite v nastavitvah.", - "settings.setting.biometrics.unavailable.title.android": "Biometrija ni nastavljena", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} ni nastavljen", - "settings.setting.biometrics.warning.message.android": "Če ne vklopite biometrije, lahko vsakdo, ki pridobi dostop do vaše naprave, odpre denarnico Uniswap in izvede transakcije.", - "settings.setting.biometrics.warning.message.ios": "Če ne vklopite {{biometricsMethod}}, lahko vsakdo, ki pridobi dostop do vaše naprave, odpre denarnico Uniswap in izvede transakcije.", - "settings.setting.biometrics.warning.title": "Ali si prepričan?", - "settings.setting.connections.disconnectAll": "Odklopi vse", - "settings.setting.connections.noConnectionsDescription": "Povežite se z aplikacijo tako, da poiščete gumb »Poveži denarnico« ali »Prijava«.", - "settings.setting.currency.title": "Lokalna valuta", - "settings.setting.deviceAccess.reset.title": "Ponastavite svoj {{biometricsMethod}}", - "settings.setting.deviceAccess.title": "Dostop do naprav", - "settings.setting.deviceAccessTimeout.1hour": "1 ura", - "settings.setting.deviceAccessTimeout.24hours": "24 ur", - "settings.setting.deviceAccessTimeout.30minutes": "30 minut", - "settings.setting.deviceAccessTimeout.5minutes": "5 minut", - "settings.setting.deviceAccessTimeout.never": "Nikoli", - "settings.setting.deviceAccessTimeout.title": "Časovna omejitev samodejnega zaklepanja", - "settings.setting.hapticTouch.title": "Haptični dotik", - "settings.setting.helpCenter.title": "Center pomoči", - "settings.setting.language.button.navigate": "Pojdite na nastavitve", - "settings.setting.language.description.extension": "Uniswap privzeto nastavi sistemske jezikovne nastavitve. Če želite spremeniti želeni jezik, pojdite v sistemske nastavitve.", - "settings.setting.language.description.mobile": "Uniswap privzeto nastavi jezikovne nastavitve vaše naprave. Če želite spremeniti želeni jezik, pojdite na »Uniswap« v nastavitvah naprave in tapnite »Jezik«.", - "settings.setting.language.title": "Jezik", - "settings.setting.notifications.row.activity.description": "Prenosi, zahteve in druge dejavnosti", - "settings.setting.notifications.row.activity.title": "Dejavnost denarnice", - "settings.setting.notifications.row.updates.description": "Priporočila in nove funkcije", - "settings.setting.notifications.row.updates.title": "Posodobitve podjetja Uniswap", - "settings.setting.notifications.title": "Obvestila", - "settings.setting.password.change.title": "Ustvari novo geslo", - "settings.setting.password.title": "Spremeni geslo", - "settings.setting.permissions.title": "Dovoljenja", - "settings.setting.privacy.analytics.description": "Anonimne podatke o uporabi uporabljamo za izboljšanje vaše izkušnje z izdelki Uniswap Labs. Ko je onemogočeno, sledimo samo napakam in osnovni uporabi.", - "settings.setting.privacy.analytics.title": "Analitika aplikacij", - "settings.setting.privateKeys.title": "Zasebni ključi", - "settings.setting.recoveryPhrase.title": "Fraza za obnovitev", - "settings.setting.smallBalances.title": "Stanje portfelja", - "settings.setting.smartWallet.action.enable": "Omogoči", - "settings.setting.smartWallet.action.smartWallet": "Smart wallet", - "settings.setting.smartWallet.notEligible": "Ni upravičeno", - "settings.setting.smartWallet.status.actionRequired": "Potrebno dejanje", - "settings.setting.smartWallet.status.active": "Aktiven", - "settings.setting.smartWallet.status.inactive": "Neaktivno", - "settings.setting.smartWallet.status.unavailable": "Ni na voljo", - "settings.setting.unknownTokens.subtitle": "Potencialni prevarantski žetoni bodo skriti v vašem portfelju.", - "settings.setting.unknownTokens.title": "Skrij neznane žetone", - "settings.setting.wallet.action.editLabel": "Uredi oznako", - "settings.setting.wallet.action.editProfile": "Uredi profil", - "settings.setting.wallet.action.remove": "Odstrani denarnico", - "settings.setting.wallet.connection.banner.description": "Upravljajte povezave prek nastavitev denarnice, tako da kliknete svojo profilno sliko.", - "settings.setting.wallet.connection.banner.title": "Povezave so se premaknile", - "settings.setting.wallet.connections.title": "Povezave", - "settings.setting.wallet.editLabel.description": "Oznake niso javne. Shranjeni so lokalno in vidni samo vam.", - "settings.setting.wallet.editLabel.save": "Shrani spremembe", - "settings.setting.wallet.label": "Vzdevek", - "settings.setting.wallet.testnetMode.description": "To vklopi testne mreže za razvijalce, da preizkusijo funkcije in transakcije brez uporabe resničnih sredstev. Žetoni v testnih omrežjih nimajo prave vrednosti.", - "settings.setting.wallet.testnetMode.title": "Način Testnet", - "settings.switchNetwork.warning": "Če želite uporabljati Uniswap na {{label}}, preklopite omrežje v nastavitvah denarnice.", - "settings.title": "nastavitve", - "settings.version": "Različica {{appVersion}}", - "smartWallet.actionRequired.cta": "Onemogoči v 1 omrežju", - "smartWallet.actionRequired.cta.plural": "Onemogoči v omrežjih {{amount}}", - "smartWallet.actionRequired.description": "Onemogočanje pametne denarnice je dejanje v verigi, ki zahteva majhne omrežne stroške.", - "smartWallet.actionRequired.insufficientFunds": "Nezadostna sredstva", - "smartWallet.actionRequired.reactivate": "Nadaljujte z uporabo pametne denarnice", - "smartWallet.actionRequired.title": "Pametna denarnica je aktivna v 1 omrežju", - "smartWallet.actionRequired.title.plural": "Pametna denarnica je aktivna v {{amount}} omrežjih", - "smartWallet.activeNetworks.title": "Pametna denarnica je aktivna v 1 omrežju", - "smartWallet.activeNetworks.title.plural": "Pametna denarnica je aktivna v {{amount}} omrežjih", - "smartWallet.banner.networkCost": "Includes a one-time cost to activate your smart wallet on {{chainName}}.", - "smartWallet.banner.text": "Omogočite pametno denarnico , da prihranite do 50 % pri stroških omrežja.", - "smartWallet.confirmDisableSmartWallet.description": "Zamudili boste hitrejše menjave, znižane stroške omrežja in druge prihajajoče izboljšave.", - "smartWallet.confirmDisableSmartWallet.title": "Ali si prepričan?", - "smartWallet.insufficient.description": "Pametne denarnice v teh omrežjih ni mogoče onemogočiti, dokler nimate sredstev za kritje stroškov omrežja.", - "smartWallet.insufficient.title": "Nezadostna sredstva v 1 omrežju", - "smartWallet.insufficient.title.plural": "Nezadostna sredstva na {{amount}} omrežjih", - "smartWallet.InsufficientFunds.button.continue.text": "Vseeno nadaljuj", - "smartWallet.insufficientFunds.network.banner.description": "Onemogočanje ni mogoče zaradi nezadostnih sredstev.", - "smartWallet.insufficientFunds.network.banner.title_one": "{{count}} omrežje izključeno", - "smartWallet.insufficientFunds.network.banner.title_other": "{{count}} omrežje izključeno", - "smartWallet.insufficientFunds.network.disable.text": "Pripravljeno za onemogočanje", - "smartWallet.insufficientFunds.network.text": "Potrebujete {{nativeCurrency}}", - "smartWallet.insufficientFunds.single.network.banner.title": "{{chain}} izključeno", - "smartWallet.modal.description.block1": "Pametne denarnice uporabljajo pametne pogodbe za hitrejše in cenejše transakcije.", - "smartWallet.modal.description.block2": "Denarnice, ki že uporabljajo funkcije pametne denarnice iz druge aplikacije, ne bodo prizadete.", - "smartWallet.modal.title": "Pametna denarnica", - "smartWallets": "Pametne denarnice", - "smartWallets.activeNetworks.description": "Vaša pametna denarnica se samodejno aktivira v vsakem novem omrežju, ki ga preklopite.", - "smartWallets.createdModal.description": "You’re getting faster transactions and lower network costs on every swap.", - "smartWallets.createdModal.title": "Ustvarjena pametna denarnica", - "smartWallets.delegation.limitedSupport": "Vaša denarnica ima omejeno podporo", - "smartWallets.delegationMismatchModal.description": "{{walletName}} ne podpira najnovejših standardov Ethereuma, ki jih uporablja {{displayName}}, zato nekatere funkcije niso na voljo.", - "smartWallets.delegationMismatchModal.features.1ClickSwaps": "Zamenjave z enim klikom", - "smartWallets.delegationMismatchModal.features.gasFreeSwaps": "Zamenjave brez plina", - "smartWallets.delegationMismatchModal.features.limitOrders": "Omejena naročila", - "smartWallets.delegationMismatchModal.limitOrders.unsupported": "Vaša denarnica ne podpira omejenih naročil.", - "smartWallets.delegationMismatchModal.title": "Omejena podpora za denarnice", - "smartWallets.disable.failed": "Prišlo je do napake. Pametna denarnica je še vedno aktivna v enem ali več omrežjih. Poskusite znova.", - "smartWallets.disable.modal.description": "To dejanje v verigi zahteva omrežne stroške.", - "smartWallets.disable.modal.title": "Onemogoči pametno denarnico", - "smartWallets.educationalModal.description": "Pametne denarnice omogočajo hitrejše in cenejše transakcije z uporabo pametnih pogodb.", - "smartWallets.educationalModal.info": "To ne bo vplivalo na denarnice, ki že uporabljajo funkcije pametne denarnice iz druge aplikacije.", - "smartWallets.enabledModal.description": "Posodobitve bodo začele veljati ob vaši naslednji zamenjavi.", - "smartWallets.enabledModal.description.dapp": "Posodobitve bodo začele veljati pri vaši naslednji transakciji.", - "smartWallets.enabledModal.description.dapp.line2": "Ponovno povežite svojo denarnico, da takoj začnete uporabljati funkcije pametne denarnice v aplikacijah.", - "smartWallets.enabledModal.title": "Pametna denarnica omogočena", - "smartWallets.postSwapNudge.enable": "Omogoči pametno denarnico", - "smartWallets.postSwapNudge.title": "Prihranite pri naslednji zamenjavi", - "smartWallets.postSwapNudge.title.dapp": "Ta aplikacija podpira pametne denarnice", - "smartWallets.unavailableModal.description": "Nastavitve pametne denarnice za {{displayName}}zdaj upravlja drug ponudnik denarnic. Uniswap lahko še naprej uporabljate kot običajno.", - "smartWallets.unavailableModal.title": "Funkcije pametne denarnice niso na voljo", - "solanaPromo.banner.description": "Trgujte z žetoni Solana neposredno na Uniswapu.", - "solanaPromo.banner.title": "Solana je zdaj na voljo", - "solanaPromo.modal.connectWallet": "Povežite svojo najljubšo denarnico Solana", - "solanaPromo.modal.startSwapping.button": "Začnite menjati na Solani", - "solanaPromo.modal.swapInstantly": "Takoj zamenjajte na tisoče trendovskih žetonov", - "solanaPromo.modal.viewTokenData": "Oglejte si podatke in cene žetonov na enem mestu", - "speedBump.newAddress.warning.description": "S tem naslovom še niste opravili transakcije. Preden nadaljujete, se prepričajte, da je naslov pravilen.", - "speedBump.newAddress.warning.title": "Nov naslov", - "speedBump.smartContractAddress.warning.description": "Žetone boste poslali na posebno vrsto naslova – pametno pogodbo. Še enkrat preverite, ali gre za naslov, na katerega ste nameravali poslati. Če je napačno, so lahko vaši žetoni za vedno izgubljeni.", - "speedBump.smartContractAddress.warning.title": "Je to naslov denarnice?", - "stats.24fees": "24H pristojbine", - "stats.24swapVolume": "24-urni obseg zamenjav", - "stats.24volume": "24H prostornina", - "stats.allTimeSwappers": "Zamenjalci vseh časov", - "stats.allTimeVolume": "Glasnost vseh časov", - "stats.fdv": "FDV", - "stats.fdv.description": "Popolnoma razredčeno vrednotenje (FDV) izračuna skupno tržno vrednost ob predpostavki, da so vsi žetoni v obtoku.", - "stats.marketCap": "Tržna kapitalizacija", - "stats.marketCap.description": "Tržna kapitalizacija je skupna tržna vrednost zaloge sredstva v obtoku.", - "stats.noStatsAvailable": "Ni na voljo statističnih podatkov", - "stats.tvl": "Skupna vrednost je zaklenjena", - "stats.tvl.description": "Skupna zaklenjena vrednost (TVL) je skupni znesek sredstva, ki je na voljo v vseh likvidnostnih skladih Uniswap.", - "stats.volume.1d": "1 dnevni volumen", - "stats.volume.1d.description": "1-dnevni obseg je znesek sredstva, s katerim se je trgovalo na Uniswap v zadnjih 24 urah.", - "stats.volume.1d.long": "1D volumen", - "stats.volume.1d.short": "1D vol", - "stats.volume.description": "Obseg je znesek sredstva, s katerim se je trgovalo na Uniswap v izbranem časovnem okviru.", - "swap.allow.oneTime": "Dovoli {{sym}} (enkrat)", - "swap.approveAndSubmit": "Odobri in oddaj", - "swap.approveAndSwap": "Odobri in zamenjaj", - "swap.balance.amount": "Stanje: {{amount}}", - "swap.bestPrice.through": "Pot preko {{provider}}", - "swap.bestRoute.cost": "Ocenjuje se, da najučinkovitejša pot stane ~{{gasPrice}} stroškov omrežja. ", - "swap.bridging.title": "Zamenjava med omrežji", - "swap.bridging.warning.description": "Zamenjavate iz {{fromNetwork}} v {{toNetwork}}. To je znano tudi kot \"premostitev\", ki premakne vaše žetone iz enega omrežja v drugo.", - "swap.button.confirmSignAndSwap": "Potrdi podpis in zamenjaj", - "swap.button.confirmSwapAnyways": "Vseeno potrdi zamenjavo", - "swap.button.confirmUnwrap": "Potrdi razpakiranje", - "swap.button.max": "maks", - "swap.button.review": "Pregled", - "swap.button.submitting": "Pošiljanje zamenjave ...", - "swap.button.submitting.keep.open": "Imej odprto denarnico...", - "swap.button.submitting.passkey": "Potrdi z geslom", - "swap.button.swap": "Zamenjaj", - "swap.button.swapAnyways": "Vseeno zamenjaj", - "swap.button.unwrap": "Odvij", - "swap.button.wrap": "Ovitek", - "swap.buy.countryModal.placeholder": "Iskanje po državi ali regiji", - "swap.cancel.cannotExecute_one": "Vaša zamenjava se lahko izvede pred obdelavo preklica. Vaših stroškov omrežja ni mogoče povrniti. Ali želite nadaljevati?", - "swap.cancel.cannotExecute_other": "Vaše zamenjave bi se lahko izvedle pred obdelavo preklica. Vaših omrežnih stroškov ni mogoče povrniti. Ali želite nadaljevati?", - "swap.confirmApproveAndSwap": "Potrdi odobritev in zamenjaj", - "swap.confirmLimit": "Potrdite omejitev", - "swap.confirmSwap": "Potrdite zamenjavo", - "swap.confirmWrap": "Potrdi zavijanje", - "swap.deadline.settings.title": "Rok zamenjave", - "swap.deadline.settings.title.short": "Tx. rok", - "swap.details.completed": "Zamenjava končana", - "swap.details.estimatedTime": "Predvideni čas", - "swap.details.fasterUnichainSwaps": "Hitrejše menjave, ki jih poganja Unichain", - "swap.details.feeOnTransfer": "{{tokenSymbol}} pristojbina", - "swap.details.feeOnTransfer.symbol": "{{tokenSymbol}} provizija za žeton", - "swap.details.instant": "Takojšnje", - "swap.details.newQuote.input": "Nov vnos", - "swap.details.newQuote.output": "Nov rezultat", - "swap.details.orderRouting": "Usmerjanje naročil", - "swap.details.orderRoutingInfo": "Ta zamenjava je usmerjena prek Across, decentraliziranega protokola, ki premika sredstva po omrežjih, pri čemer daje prednost varnosti, hitri izvedbi in nizkim cenam.", - "swap.details.poweredBy": "Poganja", - "swap.details.rate": "Oceniti", - "swap.details.slippage": "Največji zdrs", - "swap.details.slippage.uniswap": "Uniswap Zaščiteno zdrsavanje", - "swap.details.swappedIn.unichain": "Dokončano v {{time}}s na Unichainu", - "swap.details.uniswapFee": "Pristojbina", - "swap.error.default": "Morda boste morali povečati toleranco proti zdrsu. Opomba: žetoni za plačilo ob prenosu in rebase niso združljivi z Uniswap V3.", - "swap.error.expectedToFail": "Pričakuje se, da vaša zamenjava ne bo uspela.", - "swap.error.fiatInputUnavailable": "{{fiatCurrencyCode}} vnos ni na voljo", - "swap.error.modifiedByWallet": "Vaša zamenjava je bila spremenjena prek vaše denarnice. Če je bila to napaka, takoj prekličite ali tvegate izgubo sredstev.", - "swap.error.rejected": "Transakcija zavrnjena", - "swap.error.undefinedObject": "Pri poskusu izvedbe te zamenjave je prišlo do napake. Morda boste morali povečati toleranco proti zdrsu. Če to ne deluje, je morda nezdružljivost z žetonom, s katerim trgujete. Opomba: žetoni za plačilo ob prenosu in rebase niso združljivi z Uniswap V3.", - "swap.error.unknown": "Neznana napaka.", - "swap.error.v2.expired": "Te transakcije ni bilo mogoče poslati, ker je rok potekel. Prosimo, preverite, ali vaš rok transakcije ni prekratek.", - "swap.error.v2.k": "Zamenjava ni izpolnila invariante Uniswap x*y=k. To običajno pomeni, da eden od žetonov, ki jih zamenjujete, vključuje vedenje po meri pri prenosu.", - "swap.error.v2.slippage": "Ta transakcija ne bo uspela zaradi gibanja cene ali provizije pri prenosu. Poskusite povečati toleranco proti zdrsu", - "swap.error.v2.transferInput": "Vhodnega žetona ni mogoče prenesti. Morda je težava z vnosnim žetonom.", - "swap.error.v2.transferOutput": "Izhodnega žetona ni mogoče prenesti. Morda je težava z izhodnim žetonom.", - "swap.error.v3.slippage": "Ta transakcija ne bo uspela zaradi gibanja cene. Poskusite povečati toleranco proti zdrsu. Opomba: provizija za prenos in ponovna osnova žetonov ni združljiva z Uniswap V3.", - "swap.error.v3.transferOutput": "Izhodnega žetona ni mogoče prenesti. Morda je težava z izhodnim žetonom. Opomba: provizija za prenos in ponovna osnova žetonov ni združljiva z Uniswap V3.", - "swap.estimatedDifference.label": "Med vašimi vhodnimi in izhodnimi vrednostmi bo velika razlika zaradi trenutne likvidnosti.", - "swap.expected.price": "Pričakovana cena", - "swap.fail.batched": "Vaša povezana denarnica morda ne podpira zamenjav z enim klikom. Poskusite s standardno zamenjavo.", - "swap.fail.batched.retry": "Poskusite standardno zamenjavo", - "swap.fail.batched.title": "Zamenjava z enim klikom ni uspela", - "swap.fail.message": "Poskusite prilagoditi zdrs na višjo vrednost.", - "swap.fail.uniswapX": "Zamenjave ni bilo mogoče dokončati z UniswapX. Poskusite zamenjavo znova, da jo usmerite prek klasičnega API-ja Uniswap.", - "swap.fees.experience": "Ta provizija se uporablja za nekatere pare žetonov, da se zagotovi najboljša izkušnja z Uniswap. Plača se v izhodnem žetonu in je že vključen v ponudbo.", - "swap.fees.jupiter.label": "Jupitrova pristojbina", - "swap.fees.jupiter.message": "Pristojbine za Solano zaračunava Jupiter API. Uniswap Labs teh pristojbin ne prejema.", - "swap.fees.noFee": "Provizije se uporabljajo za izbrane pare žetonov, da se zagotovi najboljša izkušnja z Uniswap. S to zamenjavo ni nobene provizije.", - "swap.finalizingQuote": "Zaključevanje ponudbe ...", - "swap.form.header": "Zamenjaj", - "swap.form.warning.output.fotFees": "Zaradi žetonske provizije {{fotCurrencySymbol}}lahko zneske zamenjave vnesete le z uporabo vnosnega polja", - "swap.form.warning.output.fotFees.fallback": "Zaradi provizij za žetone je mogoče zneske zamenjav vnesti le z uporabo vnosnega polja", - "swap.form.warning.output.solana": "Natančen izhod ni podprt na Solani", - "swap.form.warning.restore": "Obnovite svojo denarnico za zamenjavo", - "swap.frontrun.warning": "Vaša transakcija je lahko prva in povzroči neugodno trgovanje.", - "swap.header.viewOnly": "Samo ogled", - "swap.impactOfTrade": "Vpliv, ki ga ima vaše trgovanje na tržno ceno tega bazena.", - "swap.impactOfTrade.uniswapx": "Razlika med tržno ceno in ceno izvršitve, upoštevajoč prihranek plina UniswapX.", - "swap.impactOfTrade.uniswapx.missing": "Izračuni vpliva na ceno morda niso na voljo za pare z nizko likvidnostjo.", - "swap.inputEstimated.atMost": "Vnos je ocenjen. Prodali boste največ ali pa se bo transakcija razveljavila.", - "swap.limit": "Omejitev", - "swap.limitFilled": "Limit izpolnjen!", - "swap.limitSubmitted": "Omejitev poslana", - "swap.marketPrice.outsideRange.label": "Tržna cena je zunaj vašega določenega cenovnega razpona. Samo depozit za eno sredstvo.", - "swap.min.price": "Minimalna cena", - "swap.networkCost.paidIn": "Stroški omrežja se plačajo v {{sym}} v omrežju {{chainName}} za izvedbo transakcije.", - "swap.orderRouting": "Usmerjanje naročil", - "swap.outputEstimated.atLeast": "Izhod je ocenjen. Prejeli boste vsaj ali pa bo transakcija razveljavljena.", - "swap.placeOrder": "Naročiti", - "swap.priceImpact": "Vpliv na ceno", - "swap.request.title.full": "Zamenjaj {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "Zamenjaj žetone", - "swap.review": "Pregled zamenjave", - "swap.review.summary": "Menjaš se", - "swap.reviewLimit": "Omejitev pregleda", - "swap.route.optimizedGasCost": "Ta pot upošteva razdeljene poti, več skokov in omrežne stroške vsakega koraka.", - "swap.routing.jupiter.description": "Jupiter združuje likvidnost iz več virov, da vam zagotovi najboljše cene.", - "swap.routing.uniswapAutoRouter.description": "Uniswap Auto Router upošteva optimalne poti in stroške omrežja, da vam zagotovi najboljše cene.", - "swap.settings.deadline.tooltip": "Vaša transakcija bo razveljavljena, če je na čakanju dlje od tega časa. (Največ: 3 dni).", - "swap.settings.deadline.warning": "Visok rok", - "swap.settings.oneClickSwap.title": "Zamenjave z enim klikom", - "swap.settings.oneClickSwap.tooltip": "Združuje standardne trgovalne akcije za hitrejše in cenejše menjave.", - "swap.settings.protection.description": "Z vklopljeno zaščito pred zamenjavo bodo vaše transakcije Ethereum zaščitene pred sendvič napadi z zmanjšanimi možnostmi neuspeha.", - "swap.settings.protection.subtitle.supported": "{{chainName}} Omrežje", - "swap.settings.protection.subtitle.unavailable": "Ni na voljo na {{chainName}}", - "swap.settings.protection.title": "Zaščita pred zamenjavo", - "swap.settings.routingPreference.option.default.description": "Če izberete to možnost, določite najučinkovitejšo pot za vašo zamenjavo.", - "swap.settings.routingPreference.option.default.description.preV4": "Odjemalec Uniswap izbere najcenejšo možnost trgovanja ob upoštevanju cene in stroškov omrežja.", - "swap.settings.routingPreference.option.default.description.uniswapXUnavailable": "UniswapX ni na voljo za vašo denarnico", - "swap.settings.routingPreference.option.default.tooltip": "Pot je identificirana ob upoštevanju skupin v2, v3 in nekaterih v4, pri čemer je upoštevan ocenjen vpliv na ceno in stroške omrežja.", - "swap.settings.routingPreference.option.v2.title": "Omogoči bazene v2", - "swap.settings.routingPreference.option.v3.title": "Omogoči bazene v3", - "swap.settings.routingPreference.option.v4.hooks.title": "Omogoči skupine kavljev v4", - "swap.settings.routingPreference.option.v4.hooks.tooltip": "Kavlji V4 usmerjajo zamenjave prek nabora vnaprej odobrenih kavljev.", - "swap.settings.routingPreference.option.v4.title": "Omogoči bazene v4", - "swap.settings.routingPreference.title": "Možnosti trgovanja", - "swap.settings.slippage.alert": "Visok zdrs", - "swap.settings.slippage.control.auto": "Avto", - "swap.settings.slippage.description": "Vaša transakcija se bo razveljavila, če se cena spremeni bolj kot odstotek zdrsa.", - "swap.settings.slippage.input.message": "Če cena še naprej pade, se bo vaša transakcija razveljavila. Spodaj je minimalni znesek, ki ga boste zagotovo prejeli.", - "swap.settings.slippage.input.receive.title": "Prejmi vsaj", - "swap.settings.slippage.output.message": "Če cena še naprej pade, se bo vaša transakcija razveljavila. Spodaj je najvišji znesek, ki bi ga morali porabiti.", - "swap.settings.slippage.output.spend.title": "Porabite največ", - "swap.settings.slippage.warning": "Zelo visok zdrs", - "swap.settings.slippage.warning.description": "Zdrs nad 20 % bo verjetno povzročil neugodno trgovanje. Če želite zmanjšati tveganje, da bi bili prvi, znižajte nastavitve.", - "swap.settings.slippage.warning.hover": "To lahko povzroči neugodno trgovanje. Poskusite znižati nastavitev zdrsa.", - "swap.settings.slippage.warning.max": "Vnesite vrednost, manjšo od {{maxSlippageTolerance}}", - "swap.settings.slippage.warning.message": "Zdrs je lahko večji, kot je potrebno", - "swap.settings.slippage.warning.min": "Vnesite vrednost, večjo od 0", - "swap.settings.title": "Zamenjaj nastavitve", - "swap.settings.transactionRevertPrice": "Vaša transakcija bo razveljavljena, če se cena neugodno spremeni za več kot ta odstotek.", - "swap.signAndSwap": "Podpiši in zamenjaj", - "swap.slippage.amt": "{{amt}} zdrs", - "swap.slippage.bridging": "Brez zdrsa pri zamenjavi med omrežji", - "swap.slippage.description": "Razlika med pričakovano in izvršeno ceno pri swapu. Razlike lahko nastanejo zaradi nizke likvidnosti, nestanovitnosti trga ali botov. \n\nUniswap Protection ščiti pred boti, ki se izkažejo za prednostne, in MEV.", - "swap.slippage.settings.title": "Nastavitve zdrsa", - "swap.slippage.tooltip": "Največje gibanje cene pred vašo transakcijo se bo razveljavilo.", - "swap.slippageBelow.warning": "Zdrs pod {{amt}} lahko povzroči neuspešno transakcijo", - "swap.submitted": "Zamenjava poslana", - "swap.success": "Uspešna menjava!", - "swap.tokenOwnFees": "Nekateri žetoni ob nakupu ali prodaji zaračunajo provizijo, ki jo določi izdajatelj žetona. Uniswap ne prejme nobene od teh pristojbin.", - "swap.tradeRoutes": "Trgovske poti", - "swap.transaction.deadline": "Rok transakcije", - "swap.transaction.revertAfter": "Vaša transakcija bo razveljavljena, če je na čakanju dlje od tega časa.", - "swap.warning.enterLargerAmount.title": "Vnesite večji znesek", - "swap.warning.expectedFailure.increaseSlippage": "Poskusite povečati zdrs.", - "swap.warning.expectedFailure.titleMay": "Ta zamenjava morda ne uspe", - "swap.warning.insufficientBalance.title": "Nimate dovolj {{currencySymbol}}", - "swap.warning.insufficientGas.button": "Ni dovolj {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "Zamenjaj za {{ tokenSymbol }} na {{networkName}}", - "swap.warning.insufficientGas.button.buy": "Kupi {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "Nakup s kartico", - "swap.warning.insufficientGas.message.withNetwork": "Ni dovolj {{currencySymbol}} na {{networkName}} za zamenjavo", - "swap.warning.insufficientGas.message.withoutNetwork": "Ni dovolj {{currencySymbol}} za zamenjavo", - "swap.warning.insufficientGas.title": "Nimate dovolj {{currencySymbol}} za kritje stroškov omrežja", - "swap.warning.networkFee.allow": "Dovoli {{ inputTokenSymbol }} (enkrat)", - "swap.warning.networkFee.delegation.message": "To so stroški obdelave vaše transakcije in aktivacije vaše pametne denarnice na Unichainu. Uniswap Labs ne prejme nobenega deleža teh provizij.", - "swap.warning.networkFee.highRelativeToValue": "Stroški omrežja presegajo 10 % vaše skupne vrednosti transakcije. To je strošek obdelave vaše transakcije v verigi blokov. Uniswap ne prejme nobenega deleža teh nadomestil.", - "swap.warning.networkFee.highRelativeToValue.unichain": "Stroški omrežja presegajo 10 % vaše skupne vrednosti transakcije. To je strošek obdelave vaše transakcije v verigi blokov.", - "swap.warning.networkFee.includesDelegation": "Vključuje aktivacijo pametne denarnice", - "swap.warning.networkFee.message": "To je strošek obdelave vaše transakcije v verigi blokov. Uniswap ne prejme nobenega deleža teh nadomestil.", - "swap.warning.networkFee.message.unichain": "To je strošek obdelave vaše transakcije v verigi blokov.", - "swap.warning.networkFee.message.uniswapX": "To je strošek obdelave vaše transakcije v verigi blokov. Uniswap ne prejme nobenega deleža teh nadomestil. UniswapX združuje vire likvidnosti za boljše cene in zamenjave brez plina.", - "swap.warning.networkFee.message.uniswapX.title": "Brez omrežnih stroškov z UniswapX", - "swap.warning.networkFee.message.uniswapX.unichain": "To je strošek obdelave vaše transakcije v verigi blokov. UniswapX združuje vire likvidnosti za boljše cene in zamenjave brez plina.", - "swap.warning.noQuotesFound.bridging.message": "Ni premostitvenih citatov. Poskusite uporabiti uradni most v tem trenutku.", - "swap.warning.noQuotesFound.title": "Ni narekovajev", - "swap.warning.noRoutesFound.message": "Trenutno ni na voljo nobenih poti za izbrane žetone. Poskusite z drugim parom ali preverite znova pozneje.", - "swap.warning.noRoutesFound.title": "Ni na voljo poti", - "swap.warning.offline.message": "Morda ste izgubili internetno povezavo ali pa omrežje ne deluje. Preverite internetno povezavo in poskusite znova.", - "swap.warning.offline.title": "Nisi povezan", - "swap.warning.priceImpact.message": "Zaradi količine {{outputCurrencySymbol}} likvidnosti, ki je trenutno na voljo, več {{inputCurrencySymbol}} poskusite zamenjati, manj {{outputCurrencySymbol}} boste prejeli.", - "swap.warning.priceImpact.message.veryHigh": "Ta transakcija bo povzročila {{priceImpactValue}} vpliv cene na tržno ceno tega sklada in bo povzročila izgubo sredstev.", - "swap.warning.priceImpact.title": "Visok vpliv na ceno ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "Zelo visok vpliv na ceno ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "Vaša transakcija ni bila poslana, ker ste zaprli aplikacijo.", - "swap.warning.queuedOrder.approvalFailed": "Vaša transakcija ni bila poslana, ker odobritev žetona ni uspela.", - "swap.warning.queuedOrder.stale": "Vaša transakcija ni bila poslana, ker ste zaprli aplikacijo ali pa je odobritev trajala predolgo.", - "swap.warning.queuedOrder.submissionFailed": "Pri predložitvi transakcije je prišlo do težave.", - "swap.warning.queuedOrder.title": "Zamenjava preklicana", - "swap.warning.rateLimit.message": "Poskusite znova čez nekaj minut.", - "swap.warning.rateLimit.title": "Omejitev stopnje je presežena", - "swap.warning.router.message": "Morda ste izgubili povezavo ali pa je omrežje prekinjeno. Če težave ne odpravite, poskusite znova pozneje.", - "swap.warning.router.title": "Te trgovine trenutno ni mogoče zaključiti", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} je blokiran", - "swap.warning.tokenBlockedFallback.button": "Žeton je blokiran", - "swap.warning.uniswapFee.message": "Za zagotavljanje najboljše izkušnje z Uniswapom se zaračunavajo pristojbine.", - "swap.warning.uniswapFee.message.default": "Za zagotovitev najboljše izkušnje z Uniswap se uporabljajo pristojbine. S to zamenjavo ni nobene provizije.", - "swap.warning.uniswapFee.message.included": "Provizije se uporabljajo za zagotovitev najboljše izkušnje z Uniswap in so že vključene v to ponudbo.", - "swap.warning.uniswapFee.title": "Provizija za zamenjavo", - "swap.warning.viewOnly.message": "Za zamenjavo žetonov morate to denarnico uvoziti prek obnovitvene fraze.", - "swap.wrap.token": "Ovijte {{sym}}", - "tdp.balanceSummary.otherNetworks": "Na drugih omrežjih", - "tdp.balanceSummary.otherNetworksBalance": "Stanje na drugih omrežjih", - "tdp.balanceSummary.title": "Vaše stanje", - "tdp.button.getToken": "Pridobite {{ tokenSymbol }}", - "tdp.button.getTokenFallback": "Pridobite žeton", - "tdp.loading.title.default": "podatki žetona za ", - "tdp.loading.title.withChain": "podatki žetona za na {{chainName}}", - "tdp.nameNotFound": "Ime ni bilo mogoče najti", - "tdp.noInfoAvailable": "Informacije o žetonu niso na voljo", - "tdp.noTestnetSupportDescription": "Nekatera testna omrežja ne podpirajo zamenjave, pošiljanja ali nakupa žetonov.", - "tdp.symbolNotFound": "Simbola ni mogoče najti", - "testnet.modal.swapDeepLink.description.toProdMode": "To dejanje zahteva, da je način testnega omrežja onemogočen. Način Testnet lahko kadar koli znova omogočite v nastavitvah.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "To dejanje zahteva, da je omogočen način testnega omrežja. Žetoni v testnih omrežjih nimajo prave vrednosti. Način Testnet lahko kadar koli onemogočite v nastavitvah.", - "testnet.modal.swapDeepLink.title.toProdMode": "Onemogoči način testnega omrežja", - "testnet.modal.swapDeepLink.title.toTestnetMode": "Omogoči način testnega omrežja", - "testnet.unsupported": "Ta funkcija ni podprta v načinu testnega omrežja.", - "themeToggle.theme": "Tema", - "title.buySellTradeEthereum": "Kupujte, prodajajte in trgovajte z Ethereumom in drugimi vrhunskimi žetoni na Uniswapu", - "title.createGovernanceOn": "Ustvarite nov predlog upravljanja na Uniswap", - "title.createGovernanceTo": "Ustvarite nov predlog upravljanja, o katerem bodo glasovali imetniki UNI. Žetoni UNI predstavljajo deleže z glasovalno pravico v upravljanju Uniswap.", - "title.earnFees": "Zaslužite provizije, ko drugi zamenjajo na Uniswap z dodajanjem žetonov v sklade likvidnosti.", - "title.easilyRemove": "Preprosto odstranite svojo likvidnost iz Uniswap v2 in položite v Uniswap v3.", - "title.easilyRemoveV4": "Preprosto odstranite svojo likvidnost iz Uniswap v2 in v3, da položite v Uniswap v4.", - "title.extension.uninstall": "Razširitev odstranjena", - "title.extensionPasskeyLogIn": "Prijava z geslom", - "title.managePasskeys": "Uniswap | Upravljajte svoja gesla", - "title.migratev2": "Preseli likvidnost bazena v2 v Uniswap v3", - "title.migratev3": "Preseli likvidnost bazena na Uniswap v4", - "title.placeLimit": "Oddajte omejena naročila na Uniswap", - "title.realTime": "Cene v realnem času, grafikoni, podatki o transakcijah in drugo.", - "title.removeLiquidityv2": "Odstranite likvidnost bazena (v2) na Uniswap", - "title.removePoolLiquidity": "Odstranite likvidnost bazena na Uniswap", - "title.removeTokensv2": "Odstranite svoje žetone iz likvidnostnih skladov v2.", - "title.removev3Liquidity": "Odstranite svoje žetone iz likvidnostnih skladov v3.", - "title.sendCrypto": "Pošlji kriptovaluto", - "title.sendTokens": "Pošljite žetone na Uniswap", - "title.swappingMadeSimple": "Takoj kupujte in prodajajte kriptovalute na Ethereum, Base, Arbitrum, Polygon, Unichain in drugih platformah. Platforma DeFi, ki ji zaupajo milijoni.", - "title.tradeTokens": "Trgujte z žetoni in zagotavljajte likvidnost. Cene v realnem času, grafikoni, podatki o transakcijah in drugo.", - "title.uniswapTradeCrypto": "Uniswap | Trgujte s kriptovalutami na vodilni borzi DeFi ", - "title.uniToken": "Žetoni UNI predstavljajo deleže z glasovalno pravico v upravljanju Uniswap. O vsakem predlogu lahko glasujete sami ali pa svoje glasove prenesete na tretjo osebo.", - "title.voteOnGov": "Glasujte o predlogih upravljanja na Uniswap", - "token.balances.main": "Vaše stanje", - "token.balances.other": "Stanja v drugih omrežjih", - "token.balances.viewOnly": "{{ownerAddress}}stanje", - "token.bridge": "{{label}} žetonski most", - "token.chart.candlestick.unavailable": "Grafikoni svečnikov za ta žeton niso na voljo", - "token.chart.tooltip": "Pristojbine: {{amount}}", - "token.details": "Podrobnosti žetona", - "token.error.unknown": "Neznan žeton", - "token.fee.buy.label": "pristojbina za nakup", - "token.fee.label": "pristojbina", - "token.fee.sell.label": "provizija za prodajo", - "token.links.title": "Povezave", - "token.links.twitter": "Twitter", - "token.links.website": "Spletna stran", - "token.notFound.description": "Žal ne moremo najti nobenih informacij za ta žeton. Preverite ime in naslov ter poskusite znova.", - "token.notFound.title": "Žetona ni bilo mogoče najti", - "token.priceExplorer.error.description": "Nekaj je šlo narobe.", - "token.priceExplorer.error.title": "Grafa cene ni bilo mogoče naložiti", - "token.priceExplorer.timeRangeLabel.all": "Ves čas", - "token.priceExplorer.timeRangeLabel.day": "1D", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 dan", - "token.priceExplorer.timeRangeLabel.hour": "1H", - "token.priceExplorer.timeRangeLabel.month": "1M", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 mesec", - "token.priceExplorer.timeRangeLabel.week": "1W", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 teden", - "token.priceExplorer.timeRangeLabel.year": "1Y", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 leto", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} ni na voljo", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} in {{tokenSymbol1}} nista na voljo", - "token.safety.fee.detected": "Zaznana provizija za žeton", - "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs ne prejme nobene od teh pristojbin.", - "token.safety.warning.alwaysDoYourResearch": "Vedno opravite svoje raziskave", - "token.safety.warning.blocked.description.default_one": "S tem žetonom ne morete trgovati z aplikacijo Uniswap.", - "token.safety.warning.blocked.description.default_other": "S temi žetoni ne morete trgovati z aplikacijo Uniswap.", - "token.safety.warning.copyContractAddress.message": "To je pogodbeni naslov, ki deluje kot enolični identifikator za žetone v verigi blokov. Vse kriptovalute, ki jih pošljete na ta naslov, bodo izgubljene.", - "token.safety.warning.copyContractAddress.title": "Ne pošiljajte kriptovalut na ta naslov", - "token.safety.warning.dontShowWarningAgain": "Ne pokaži mi več tega opozorila", - "token.safety.warning.dontShowWarningAgainShort": "Ne prikazuj več", - "token.safety.warning.doYourOwnResearch": "Preden nadaljujete, vedno opravite lastno raziskavo.", - "token.safety.warning.feeDescription": "Polni , ko {{action}}", - "token.safety.warning.flaggedAsMalicious": "Označeno kot zlonamerno", - "token.safety.warning.flaggedAsSuspicious": "Označeno kot sumljivo", - "token.safety.warning.fotHigh.title": "Zaznana visoka provizija", - "token.safety.warning.fotLow.title": "Zaznana pristojbina", - "token.safety.warning.fotVeryHigh.title": "Zaznana zelo visoka pristojbina", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} je bilo označeno kot neprodajno. Zamenjava tega žetona lahko povzroči izgubo vaših sredstev.", - "token.safety.warning.honeypot.title": "Zaznana 100-odstotna provizija za prodajo", - "token.safety.warning.impersonator": "Pooseblja drug žeton", - "token.safety.warning.impersonator.title": "Zaznan žeton imitatorja", - "token.safety.warning.malicious.general.message": "Blockaid je {{tokenSymbol}} označil kot zlonamerno.", - "token.safety.warning.malicious.impersonator.message": "Blockaid je označil {{tokenSymbol}} zaradi poskusa kopiranja drugega žetona. Morda to ni žeton, ki ga želite zamenjati.", - "token.safety.warning.malicious.impersonator.message.short": "{{tokenSymbol}} morda ni žeton, ki ga želite zamenjati.", - "token.safety.warning.malicious.title": "Zaznan zlonamerni žeton", - "token.safety.warning.mayResultInLoss": "Zamenjava lahko povzroči izgubo sredstev.", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} se ne trguje na vodilnih centraliziranih borzah v ZDA.", - "token.safety.warning.notListedOnExchanges": "Ni uvrščen na vodilne ameriške borze", - "token.safety.warning.potentialHoneypot.card.message": "Blockaid je {{tokenSymbol}} označil kot sumljivo.", - "token.safety.warning.potentialHoneypot.modal.message": "Blockaid je {{tokenSymbol}} označil kot potencialni medenjak. Preden nadaljujete, vedno opravite lastno raziskavo.", - "token.safety.warning.potentialHoneypot.title": "Zaznan potencialni honeypot", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} je bilo označeno kot neprodajno.", - "token.safety.warning.sellFee100.title": "Zaznana 100-odstotna provizija za prodajo", - "token.safety.warning.spam.message": "Blockaid je {{tokenSymbol}} označil kot vsiljeno pošto.", - "token.safety.warning.spam.title": "Zaznan žeton neželene pošte", - "token.safety.warning.spamsUsers": "Spam uporabnikom", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} zaračuna {{buyFeePercent}} pristojbino ob nakupu in {{sellFeePercent}} ob prodaji.", - "token.safety.warning.tokenChargesFee.buy.message": "{{tokenSymbol}} ob nakupu zaračuna pristojbino {{feePercent}} .", - "token.safety.warning.tokenChargesFee.buy.message.descriptive": "{{tokenSymbol}} ob nakupu zaračuna provizijo v višini {{feePercent}} . Zamenjava lahko povzroči izgubo sredstev. Uniswap Labs ne prejme nobene od teh provizij.", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} ob prodaji zaračuna pristojbino {{feePercent}} .", - "token.safety.warning.tokenChargesFee.sell.message.descriptive": "{{tokenSymbol}} ob prodaji zaračuna provizijo v višini {{feePercent}} . Zamenjava lahko povzroči izgubo sredstev. Uniswap Labs ne prejme nobene od teh provizij.", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} zaračuna provizijo ob nakupu ali prodaji.", - "token.safetyLevel.blocked.message": "S tem žetonom ne morete trgovati z denarnico Uniswap.", - "token.safetyLevel.medium.message.plural": "S temi žetoni se ne trguje na vodilnih centraliziranih borzah v ZDA. Preden nadaljujete, vedno opravite lastno raziskavo.", - "token.selector.search.error": "Rezultatov iskanja ni bilo mogoče naložiti", - "token.stats.fullyDilutedValuation": "Popolnoma razredčeno vrednotenje", - "token.stats.marketCap": "Tržna kapitalizacija", - "token.stats.priceHighYear": "52 W visoko", - "token.stats.priceLowYear": "52 W Nizka", - "token.stats.section.about": "Približno {{token}}", - "token.stats.title": "Statistika", - "token.stats.translation.original": "Prikaži original", - "token.stats.translation.translate": "Prevedi v {{language}}", - "token.stats.volume": "24-urna glasnost", - "token.symbol.input.fallback": "Vhodni žeton", - "token.symbol.output.fallback": "Izhodni žeton", - "token.wrap.fail.message": "Zamenjave na protokolu Uniswap se lahko začnejo in končajo z ETH. Vendar se med zamenjavo ETH zavije v WETH.", - "token.zeroNativeBalance.description.mainnet": "Če želite pridobiti {{ tokenSymbol }}, boste morali zamenjati žeton v Ethereumu. Zamenjava zahteva ETH za stroške omrežja.", - "token.zeroNativeBalance.description.otherChains": "Morali boste zamenjati žeton na {{ chainName }} , da dobite {{ tokenSymbol }}. Zamenjava zahteva {{ chainName }} {{ nativeTokenSymbol }} za stroške omrežja.", - "token.zeroNativeBalance.subtitle": "{{ tokenSymbol }} ni na voljo za neposredni nakup.", - "token.zeroNativeBalance.title.mainnet": "Potrebujete {{ nativeTokenName }}", - "token.zeroNativeBalance.title.otherChains": "Potrebujete {{ nativeTokenName }} na {{ chainName }}", - "tokens.action.hide": "Skrij žeton", - "tokens.action.unhide": "Razkrij žeton", - "tokens.nfts.action.viewOnExplorer": "Poglej na {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "Zbirke NFT ni bilo mogoče naložiti", - "tokens.nfts.collection.label.items": "Predmeti", - "tokens.nfts.collection.label.owners": "Lastniki", - "tokens.nfts.collection.label.priceFloor": "Nadstropje", - "tokens.nfts.collection.label.swapVolume": "Glasnost", - "tokens.nfts.connectEthereumToView": "Povežite denarnico Ethereum za ogled svojih NFT-jev", - "tokens.nfts.details.contract.address": "Pogodbeni naslov", - "tokens.nfts.details.error.load.title": "Ni bilo mogoče naložiti podrobnosti NFT", - "tokens.nfts.details.network": "Omrežje", - "tokens.nfts.details.owner": "Lasti", - "tokens.nfts.details.price": "Trenutna cena", - "tokens.nfts.details.recentPrice": "Zadnja prodajna cena", - "tokens.nfts.details.traits": "Lastnosti", - "tokens.nfts.empty.description": "Ni najdenih NFT-jev", - "tokens.nfts.error.unavailable": "Vsebina ni na voljo", - "tokens.nfts.hidden.action.hide": "Skrij NFT", - "tokens.nfts.hidden.action.unhide": "Razkrij NFT", - "tokens.nfts.link.collection": "Spletna stran zbirke", - "tokens.nfts.list.error.load.title": "NFT-jev ni bilo mogoče naložiti", - "tokens.nfts.list.none.button": "Prejmite NFT-je", - "tokens.nfts.list.none.description.default": "Za začetek prenesite NFT-je iz druge denarnice.", - "tokens.nfts.list.none.description.external": "Ko ta denarnica kupi ali prejme NFT-je, se prikažejo tukaj.", - "tokens.nfts.list.none.title": "NFT še ni", - "tokens.nfts.notAvailableOnSolana": "NFT-ji niso na voljo na Solani", - "tokens.selector.button.choose": "Izberite žeton", - "tokens.selector.empty.buy.message": "Kupite kripto s kartico ali banko za pošiljanje žetonov.", - "tokens.selector.empty.buy.title": "Kupi kripto", - "tokens.selector.empty.receive.title": "Prejemanje žetonov", - "tokens.selector.empty.title": "Ni še žetonov", - "tokens.selector.error.load": "Ni bilo mogoče naložiti žetonov", - "tokens.selector.search.empty": "Ni rezultatov za {{searchText}}", - "tokens.selector.search.placeholder": "Iskanje žetonov", - "tokens.selector.section.bridging": "Zamenjava med omrežji", - "tokens.selector.section.favorite": "Priljubljene", - "tokens.selector.section.otherNetworksSearchResults": "Žetoni, najdeni v drugih omrežjih", - "tokens.selector.section.otherSearchResults": "Drugi žetoni na {{network}}", - "tokens.selector.section.recent": "Nedavna iskanja", - "tokens.selector.section.search": "Rezultati iskanja", - "tokens.selector.section.trending": "Žetoni po volumnu 24H", - "tokens.selector.section.yours": "Vaši žetoni", - "tokens.table.search.placeholder.pools": "Iskanje bazenov", - "tokens.table.search.placeholder.tokens": "Iskanje žetonov", - "tokens.table.search.placeholder.transactions": "Iskanje transakcij", - "toucan.auction.bidConcentration": "Koncentracija tukanov", - "toucan.auction.bidConcentration.tooltip.description": "Opis orodja Tukan", - "toucan.auction.bidConcentration.tooltip.title": "Naslov opisa za tukana", - "toucan.auctions": "Dražbe", - "toucan.bidForm.maxBudget": "Največji proračun", - "toucan.bidForm.placeBid": "Oddajte svojo ponudbo", - "toucan.displayMode.tokenPrice": "Cena žetona", - "toucan.displayMode.valuation": "Vrednotenje", - "transaction.action.cancel.button": "Prekliči transakcijo", - "transaction.action.cancel.description": "Če prekličete to transakcijo, preden jo obdela omrežje, boste plačali nove stroške omrežja namesto prvotnih.", - "transaction.action.cancel.title": "Želite preklicati to transakcijo?", - "transaction.action.clear": "Počisti v teku", - "transaction.action.copy": "Kopiraj ID transakcije", - "transaction.action.copyProvider": "Kopirajte {{providerName}} ID transakcije", - "transaction.amount.unlimited": "Neomejeno", - "transaction.callData": "Klicni podatki", - "transaction.details.dappName": "aplikacija", - "transaction.details.from": "Od", - "transaction.details.networkFee": "Stroški omrežja", - "transaction.details.networkFee.swap": "Stroški zamenjave omrežja", - "transaction.details.providerFee": "Provizija ponudnika", - "transaction.details.swapRate": "Oceniti", - "transaction.details.transaction": "Transakcija", - "transaction.details.uniswapFee": "Provizija ({{ feePercent }}%)", - "transaction.network.all": "Vsa omrežja", - "transaction.networkCost.description": "Stroški obdelave vaše transakcije na verigi blokov. Uniswap je optimiziran za minimalne stroške omrežja.", - "transaction.networkCost.includesSmartWalletActivation": "Vključuje aktivacijo pametne denarnice", - "transaction.networkCost.label": "Stroški omrežja", - "transaction.networkCost.maxNativeBalance.description": "Majhen znesek stanja omrežnega žetona je rezerviran za kritje omrežnih stroškov te transakcije.", - "transaction.networkCost.maxNativeBalance.title": "Zakaj ne morem uporabiti svojega največjega stanja?", - "transaction.networkCost.veryHigh.label": "Zelo visoki stroški omrežja", - "transaction.notification.error.cancel": "Transakcije ni mogoče preklicati", - "transaction.notification.error.replace": "Transakcije ni mogoče zamenjati", - "transaction.status.approval.canceled": "Odobritev preklicana", - "transaction.status.approval.failed": "Odobritev ni uspela", - "transaction.status.approve.canceled": "Odobritev preklicana", - "transaction.status.approve.canceling": "Preklic odobritve", - "transaction.status.approve.failed": "Odobritev ni uspela", - "transaction.status.approve.pending": "Odobritev", - "transaction.status.approve.success": "Odobreno", - "transaction.status.approve.successDapp": "Odobreno {{externalDappName}}", - "transaction.status.buy.canceled": "Preklican nakup", - "transaction.status.buy.canceling": "Preklic nakupa", - "transaction.status.buy.failed": "Nakup ni uspel", - "transaction.status.buy.pending": "Nakupovanje", - "transaction.status.buy.success": "kupljeno", - "transaction.status.buy.successDapp": "Kupljeno {{externalDappName}}", - "transaction.status.claim.canceled": "Pobiranje pristojbin preklicano", - "transaction.status.claim.canceling": "Preklic pobiranja pristojbin", - "transaction.status.claim.failed": "Pobiranje pristojbin ni uspelo", - "transaction.status.claim.pending": "Pobiranje pristojbin", - "transaction.status.claim.success": "Zbrane pristojbine", - "transaction.status.collect.fees.canceled": "Pobiranje pristojbin preklicano", - "transaction.status.collect.fees.failed": "Zbiranje pristojbin ni uspelo", - "transaction.status.collected.fees": "Pobrane pristojbine", - "transaction.status.collecting.fees": "Pobiranje pristojbin", - "transaction.status.confirm.canceled": "Potrditev preklicana", - "transaction.status.confirm.canceling": "Čaka na preklic", - "transaction.status.confirm.failed": "Potrditev ni uspela", - "transaction.status.confirm.pending": "Transakcija v teku", - "transaction.status.confirm.success": "Transakcija potrjena", - "transaction.status.confirm.successDapp": "Transakcija potrjena {{externalDappName}}", - "transaction.status.createPair.canceled": "Preklicano ustvarjanje para", - "transaction.status.createPair.canceling": "Preklic ustvarjanja para", - "transaction.status.createPair.failed": "Ustvarjanje para ni uspelo", - "transaction.status.createPair.pending": "Ustvarjanje para", - "transaction.status.createPair.success": "Ustvarjen par", - "transaction.status.createPool.canceled": "Preklicano ustvarjanje skupine", - "transaction.status.createPool.canceling": "Preklic ustvarjanja skupine", - "transaction.status.createPool.failed": "Ustvarjanje bazena ni uspelo", - "transaction.status.createPool.pending": "Ustvarjanje bazena", - "transaction.status.createPool.success": "Ustvarjen bazen", - "transaction.status.liquidityDecrease.canceled": "Odstranitev likvidnosti preklicana", - "transaction.status.liquidityDecrease.canceling": "Preklic odstranitve likvidnosti", - "transaction.status.liquidityDecrease.failed": "Odstranjevanje likvidnosti ni uspelo", - "transaction.status.liquidityDecrease.pending": "Odstranjevanje likvidnosti", - "transaction.status.liquidityDecrease.success": "Odstranjena likvidnost", - "transaction.status.liquidityIncrease.canceled": "Dodajanje likvidnosti preklicano", - "transaction.status.liquidityIncrease.canceling": "Preklic dodajanja likvidnosti", - "transaction.status.liquidityIncrease.failed": "Dodajanje likvidnosti ni uspelo", - "transaction.status.liquidityIncrease.pending": "Dodajanje likvidnosti", - "transaction.status.liquidityIncrease.success": "Dodana likvidnost", - "transaction.status.lpIncentivesClaim.canceled": "Preklican zahtevek za nagrade LP", - "transaction.status.lpIncentivesClaim.canceling": "Preklic zahtevka za nagrade LP", - "transaction.status.lpIncentivesClaim.failed": "Zahteva za LP nagrade ni uspela", - "transaction.status.lpIncentivesClaim.pending": "Zahtevanje nagrad LP", - "transaction.status.lpIncentivesClaim.success": "Zahtevane nagrade LP", - "transaction.status.migrateLiquidity.canceled": "Preselitev likvidnosti preklicana", - "transaction.status.mint.canceled": "Preklicana kovnica", - "transaction.status.mint.canceling": "Preklic kovnice", - "transaction.status.mint.failed": "Kovanje ni uspelo", - "transaction.status.mint.pending": "Kovanje", - "transaction.status.mint.success": "Kovano", - "transaction.status.mint.successDapp": "Kovano {{externalDappName}}", - "transaction.status.offramp.canceled": "Izvoz odpovedan", - "transaction.status.offramp.failed": "Izstop ni uspel", - "transaction.status.offramp.pending": "Izstop iz rampe", - "transaction.status.offramp.success": "Izven klančine", - "transaction.status.onramp.canceled": "Vstop odpovedan", - "transaction.status.onramp.failed": "Priklop ni uspel", - "transaction.status.onramp.pending": "Vzpenja se", - "transaction.status.onramp.success": "Na klančini", - "transaction.status.permit.approved": "Dovoljenje odobreno", - "transaction.status.permit.canceled": "Dovoljenje za prenos preklicano", - "transaction.status.permit.failed": "Dovoljenje ni uspelo", - "transaction.status.purchase.canceled": "Preklican nakup", - "transaction.status.purchase.canceling": "Preklic nakupa", - "transaction.status.purchase.failed": "Nakup ni uspel", - "transaction.status.purchase.failedOn": "Nakup {{serviceProvider}}ni uspel", - "transaction.status.purchase.pending": "Nakupovanje", - "transaction.status.purchase.pendingOn": "Nakup na {{serviceProvider}}", - "transaction.status.purchase.successOn": "Kupljeno {{serviceProvider}}", - "transaction.status.receive.canceled": "Prejemanje preklicano", - "transaction.status.receive.canceling": "Preklic prejemanja", - "transaction.status.receive.failed": "Prejemanje ni uspelo", - "transaction.status.receive.failedFrom": "Prejem od {{serviceProvider}}ni uspel", - "transaction.status.receive.pending": "Prejemanje", - "transaction.status.receive.pendingFrom": "Prejemanje od {{serviceProvider}}", - "transaction.status.receive.success": "Prejeto", - "transaction.status.receive.successDapp": "Prejeto {{externalDappName}}", - "transaction.status.receive.successFrom": "Prejeto od {{serviceProvider}}", - "transaction.status.removeDelegation.canceled": "Odstranitev pooblastila preklicana", - "transaction.status.removeDelegation.failed": "Odstranitev pooblastila ni uspela", - "transaction.status.removeDelegation.pending": "Odstranitev pooblastila", - "transaction.status.removeDelegation.success": "Odstranjena pooblastitev", - "transaction.status.revoke.canceled": "Preklican preklic", - "transaction.status.revoke.canceling": "Preklic preklica", - "transaction.status.revoke.failed": "Preklic ni uspel", - "transaction.status.revoke.pending": "Preklic", - "transaction.status.revoke.success": "Preklicano", - "transaction.status.revoke.successDapp": "Preklicano {{externalDappName}}", - "transaction.status.sale.canceled": "Preklicana prodaja", - "transaction.status.sale.canceling": "Preklic prodaje", - "transaction.status.sale.failedOn": "Prodaja ni uspela prek {{serviceProvider}}", - "transaction.status.sale.pendingCard.msg": "Izvedite več o prodaji kriptovalut.", - "transaction.status.sale.pendingCard.title": "Zakaj je moja prodaja še v teku?", - "transaction.status.sale.pendingOn": "Prodaja preko {{serviceProvider}}", - "transaction.status.sale.successOn": "Prodano prek {{serviceProvider}}", - "transaction.status.sell.canceled": "Preklicana prodaja", - "transaction.status.sell.canceling": "Preklic prodaje", - "transaction.status.sell.failed": "Prodaja ni uspela", - "transaction.status.sell.pending": "Prodaja", - "transaction.status.sell.success": "prodano", - "transaction.status.sell.successDapp": "Prodano {{externalDappName}}", - "transaction.status.send.canceled": "Pošiljanje preklicano", - "transaction.status.send.canceling": "Preklic pošiljanja", - "transaction.status.send.failed": "pošiljanje ni uspelo", - "transaction.status.send.pending": "Pošiljanje", - "transaction.status.send.success": "Poslano", - "transaction.status.send.successDapp": "Poslano {{externalDappName}}", - "transaction.status.swap.canceled": "Zamenjava preklicana", - "transaction.status.swap.canceling": "Preklic zamenjave", - "transaction.status.swap.expired": "Menjava je potekla", - "transaction.status.swap.failed": "Zamenjava ni uspela", - "transaction.status.swap.insufficientFunds": "Nezadostna sredstva", - "transaction.status.swap.pending": "Zamenjava", - "transaction.status.swap.success": "Zamenjal", - "transaction.status.swap.successDapp": "Zamenjano na {{externalDappName}}", - "transaction.status.unwrap.canceled": "Razvijanje preklicano", - "transaction.status.unwrap.canceling": "Preklic odvijanja", - "transaction.status.unwrap.failed": "Odvijanje ni uspelo", - "transaction.status.unwrap.pending": "Odvijanje", - "transaction.status.unwrap.success": "Odvito", - "transaction.status.unwrap.successDapp": "Odvito na {{externalDappName}}", - "transaction.status.wrap.canceled": "Preklican ovoj", - "transaction.status.wrap.canceling": "Preklic zavijanja", - "transaction.status.wrap.failed": "Previjanje ni uspelo", - "transaction.status.wrap.pending": "Zavijanje", - "transaction.status.wrap.success": "Zavito", - "transaction.status.wrap.successDapp": "Zavito na {{externalDappName}}", - "transaction.submittedOn": "Oddano dne", - "transaction.summary.liquidity": "{{firstAmountWithSymbol}} in {{secondAmountWithSymbol}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} do {{recipientAddress}}", - "transaction.summary.received.noAmount": "Prejeto od {{name}}", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} od {{senderAddress}}", - "transaction.summary.sent.noAmount": "Poslano uporabniku {{name}}", - "transaction.warning.insufficientGas.modal.message": "Za kritje omrežnih stroškov te transakcije potrebujete ~{{tokenAmount}} {{tokenSymbol}} () na {{networkName}} . Če želite nadaljevati, zamenjajte {{tokenSymbol}} iz druge verige ali kupite s svojo kartico.", - "transaction.warning.insufficientGas.modal.message.noAction": "Za kritje omrežnih stroškov te transakcije potrebujete ~{{tokenAmount}} {{tokenSymbol}} () na {{networkName}} .", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount": "Za kritje omrežnih stroškov te transakcije potrebujete ~{{tokenAmount}} {{tokenSymbol}} () na {{networkName}} .", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount.noAction": "Če želite zamenjati za ta žeton, potrebujete več {{tokenSymbol}} na {{networkName}}.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "Ni dovolj {{tokenSymbol}} na {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Ni dovolj {{tokenSymbol}}", - "transaction.warning.maxNative.message": "Porabili boste večino stanja žetonov v omrežju. Zaradi tega morda ne bo dovolj sredstev za kritje prihodnjih stroškov omrežja.", - "transaction.warning.maxNative.title": "Nizko stanje omrežnih žetonov", - "transaction.watcher.error.cancel": "Transakcije ni mogoče preklicati", - "transaction.watcher.error.status": "Napaka pri preverjanju stanja transakcije", - "uniswapX.aggregatesLiquidity": " združuje vire likvidnosti za boljše cene in zamenjave brez plina.", - "uniswapX.cost": "UniswapX odpravlja tipične stroške transakcij na verigi blokov.", - "uniswapx.description": "UniswapX združuje vire likvidnosti za boljše cene in zamenjave brez plina.", - "uniswapx.description.unsupported": "UniswapX trenutno ni na voljo, ker nastavitve pametne denarnice upravlja druga aplikacija za denarnico.", - "uniswapx.included": "Vključuje UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "Izvedite več o zamenjavi z UniswapX", - "uniswapx.unavailable.title": "UniswapX ni na voljo", - "uniswapx.v2QuoteFailed": "UniswapX v2 trdi citat ni uspel. Poskusite znova s klasično zamenjavo.", - "unitags.banner.button.claim": "Zahtevajte zdaj", - "unitags.banner.subtitle": "Zgradite prilagojen profil web3 in preprosto delite svoj naslov s prijatelji.", - "unitags.banner.title.compact": "Zahtevajte svoje {{unitagDomain}} uporabniško ime in ustvarite svoj prilagodljiv profil.", - "unitags.banner.title.full": "Zahtevajte svoje {{unitagDomain}} uporabniško ime", - "unitags.choosePhoto.option.cameraRoll": "Izberite med zvitki kamere", - "unitags.choosePhoto.option.computer": "Nalaganje iz računalnika", - "unitags.choosePhoto.option.nft": "Izberite NFT", - "unitags.choosePhoto.option.remove": "Odstrani profilno sliko", - "unitags.claim.available": "Na voljo", - "unitags.claim.confirmation.customize": "Prilagodite profil", - "unitags.claim.confirmation.description": "{{unitagAddress}} je pripravljen za pošiljanje in prejemanje kripto. Nadaljujte z gradnjo svoje denarnice s prilagoditvijo svojega profila web3.", - "unitags.claim.confirmation.success.long": "Dobil si!", - "unitags.claim.confirmation.success.short": "razumem!", - "unitags.claim.error.addressLimit": "Svoje uporabniško ime za ta naslov ste že spremenili", - "unitags.claim.error.avatar": "Ni bilo mogoče nastaviti avatarja. Poskusi znova kasneje.", - "unitags.claim.error.default": "Ni bilo mogoče zahtevati uporabniškega imena. Poskusi znova kasneje.", - "unitags.claim.error.deviceLimit": "Dosegli ste največje število uporabniških imen, ki so lahko aktivna za to napravo", - "unitags.claim.error.general": "Ni mogoče zahtevati uporabniškega imena", - "unitags.claim.error.unavailable": "To uporabniško ime ni na voljo", - "unitags.claim.error.unknown": "Neznana napaka", - "unitags.claim.username.default": "tvoje ime", - "unitags.delete.confirm.subtitle": "Izbrisali boste svoje uporabniško ime in podrobnosti profila, ki jih je mogoče prilagoditi. Ne boste ga mogli zahtevati nazaj.", - "unitags.delete.confirm.title": "Ali si prepričan?", - "unitags.editProfile.placeholder": "uporabniško ime", - "unitags.editUsername.confirm.subtitle": "Spremenili boste uporabniško ime. Ko ga spremenite, ga ne morete nikoli več zahtevati.", - "unitags.editUsername.confirm.title": "Ali si prepričan?", - "unitags.editUsername.title": "Uredite svoje uporabniško ime", - "unitags.editUsername.warning.default": "Ko enkrat spremenite uporabniško ime, ga ne morete nikoli več zahtevati. Spremenite ga lahko samo 2 -krat.", - "unitags.editUsername.warning.max": "Dosegli ste največje število 2 sprememb uporabniškega imena.", - "unitags.extension.intro.buttton": "Zahtevajte uporabniško ime", - "unitags.extension.intro.description": "Poslovite se od naslovov 0x. Uporabniška imena so berljiva imena, ki olajšajo pošiljanje in prejemanje kriptovalut.", - "unitags.extension.intro.title": "Predstavljamo uporabniška imena", - "unitags.extension.intro.upsell.customizable": "Prilagodljivi profili", - "unitags.extension.intro.upsell.ens": "Poganjajo poddomene ENS", - "unitags.extension.intro.upsell.free": "Brezplačno zahtevati", - "unitags.intro.features.ens": "Poganjajo poddomene ENS", - "unitags.intro.features.free": "Brezplačno zahtevati", - "unitags.intro.features.profile": "Prilagodljivi profili", - "unitags.intro.subtitle": "Poslovite se od naslovov 0x. Uporabniška imena so berljiva imena, ki olajšajo pošiljanje in prejemanje kriptovalut.", - "unitags.intro.title": "Predstavljamo uporabniška imena", - "unitags.notification.delete.error": "Uporabniškega imena ni bilo mogoče izbrisati. Poskusi znova kasneje.", - "unitags.notification.delete.title": "Uporabniško ime izbrisano", - "unitags.notification.profile.error": "Profila ni bilo mogoče posodobiti. Poskusi znova kasneje.", - "unitags.notification.profile.title": "Profil posodobljen", - "unitags.notification.username.error": "Uporabniškega imena ni bilo mogoče spremeniti. Poskusi znova kasneje.", - "unitags.notification.username.title": "Uporabniško ime spremenjeno", - "unitags.onboarding.claim.subtitle": "To je vaš osebni naslov, na katerega lahko ljudje pošljejo kripto.", - "unitags.onboarding.claim.title.choose": "Ustvarite svoje uporabniško ime", - "unitags.onboarding.claim.title.claim": "Zahtevajte svoje uporabniško ime", - "unitags.onboarding.info.description": "Uporabniška imena pretvorijo kompleksne naslove 0x v berljiva imena. Če zahtevate uporabniško ime {{unitagDomain}} , lahko preprosto pošiljate in prejemate kriptovalute ter ustvarite javni profil web3.", - "unitags.onboarding.info.title": "Poenostavljen naslov", - "unitags.onboarding.profile.subtitle": "Naložite svojega ali se držite svojega edinstvenega Unicona. To lahko kadar koli spremenite pozneje.", - "unitags.onboarding.profile.title": "Izberite profilno fotografijo", - "unitags.profile.action.delete": "Izbriši uporabniško ime", - "unitags.profile.action.edit": "Uredi uporabniško ime", - "unitags.profile.bio.label": "Bio", - "unitags.profile.bio.placeholder": "Vnesite življenjepis za svoj profil", - "unitags.profile.links.twitter": "Twitter", - "unitags.username.error.chars": "Uporabniška imena lahko vsebujejo le črke in številke", - "unitags.username.error.max": "Uporabniška imena ne smejo biti daljša od {{number}} znakov", - "unitags.username.error.min": "Uporabniška imena morajo vsebovati vsaj {{number}} znakov", - "unitags.username.error.uppercase": "Uporabniška imena lahko vsebujejo samo male črke in številke", - "uwulink.error.insufficientTokens": "Ni dovolj {{tokenSymbol}} na {{chain}}", - "v2.notAvailable": "Uniswap V2 ni na voljo v tem omrežju.", - "wallet.appSignIn": "Prijavite se z aplikacijo", - "wallet.connectingAgreement": "S povezavo denarnice se strinjate s pogoji storitve Uniswap Labs in soglašate z njegovim pravilnikom o zasebnosti.", - "wallet.connectionFailed.message": "Poskus povezave ni uspel. Poskusite znova in sledite korakom za povezavo v denarnici.", - "wallet.mismatch.popup.description": "Nekaterih funkcij vaša povezana denarnica ne podpira.", - "wallet.mismatch.popup.title": "Omejena podpora za denarnice", - "wallet.other": "Druge denarnice", - "wallet.scanToConnect": "Za povezavo skenirajte kodo QR", - "wallet.wrongNet": "Vaša denarnica je povezana z napačnim omrežjem.", - "walletConnect.dapps.empty.description": "Povežite se z aplikacijo tako, da skenirate kodo prek WalletConnect", - "walletConnect.dapps.manage.empty.title": "Ni povezanih aplikacij", - "walletConnect.dapps.manage.title": "Povezave", - "walletConnect.error.connection.message": "Denarnica Uniswap trenutno podpira {{chainNames}}. Na teh verigah uporabite samo \"{{dappName}}\"", - "walletConnect.error.connection.title": "Napaka v povezavi", - "walletConnect.error.general.message": "Prišlo je do težave z WalletConnect. Prosim poskusite ponovno", - "walletConnect.error.general.title": "Napaka WalletConnect", - "walletConnect.error.scantastic.message": "Prišlo je do težave z vašo kodo QR. Prosim poskusite ponovno", - "walletConnect.error.scantastic.title": "Neveljavna koda QR", - "walletConnect.error.unsupported.message": "Prepričajte se, da skenirate veljavno kodo QR WalletConnect, Ethereum ali Uniswap Extension, preden poskusite znova.", - "walletConnect.error.unsupported.title": "Neveljavna koda QR", - "walletConnect.error.unsupportedV1.message": "WalletConnect v1 ni več podprt. Aplikacijo, s katero se poskušate povezati, je treba nadgraditi na WalletConnect v2.", - "walletConnect.error.unsupportedV1.title": "Neveljavna koda QR", - "walletConnect.error.uwu.scan": "Pri skeniranju te kode QR je prišlo do težave.", - "walletConnect.error.uwu.title": "Napaka povezave UwU", - "walletConnect.error.uwu.unsupported": "Ta koda QR ni podprta.", - "walletConnect.pending.button.connect": "Povežite se", - "walletConnect.pending.button.reject": "Zavrni", - "walletConnect.pending.button.scrollDown": "Za povezavo se pomaknite navzdol", - "walletConnect.pending.threat.confirmationText": "Razumem tveganja", - "walletConnect.pending.threat.description": "Podpisovanje sporočil ali transakcij iz te aplikacije lahko povzroči izgubo sredstev.", - "walletConnect.pending.threat.title": "Zaznana zlonamerna aplikacija", - "walletConnect.pending.title": "Povežite se z {{dappName}}", - "walletConnect.pending.unverified.description": "Preden nadaljujete, se prepričajte, da zaupate tej strani. ", - "walletConnect.pending.unverified.title": "Nepreverjena aplikacija", - "walletConnect.permissions.option.requestApprovals": "Zahtevajte odobritve transakcij", - "walletConnect.permissions.option.transferAssets": "Move funds without permission", - "walletConnect.permissions.option.viewTokenBalances": "View your balance and activity", - "walletConnect.permissions.title": "App permissions", - "walletConnect.request.bundledTransactions.label_one": "Ena transakcija v paketu", - "walletConnect.request.bundledTransactions.label_other": "{{count}} povezane transakcije", - "walletConnect.request.button.scrollDown": "Pomaknite se navzdol za podpis", - "walletConnect.request.button.sign": "Podpis", - "walletConnect.request.details.label.function": "funkcija", - "walletConnect.request.details.label.sending": "Pošiljanje", - "walletConnect.request.details.label.token": "Žeton", - "walletConnect.request.details.label.tokens": "Žetoni", - "walletConnect.request.error.insufficientFunds": "Nimate dovolj {{currencySymbol}} za dokončanje te transakcije.", - "walletConnect.request.error.network": "Napaka internetne ali omrežne povezave", - "walletConnect.request.warning.batch.message": "Bodite previdni: ta zahteva vsebuje več transakcij in lahko prenese sredstva", - "walletConnect.request.warning.general.message": "Bodite previdni: to sporočilo lahko prenese sredstva", - "walletConnect.request.warning.message": "Če želite podpisati sporočila ali transakcije, boste morali uvoziti frazo za obnovitev denarnice.", - "walletConnect.request.warning.title": "Ta denarnica je v načinu samo za ogled", - "web.explore.description": "Odkrijte in raziščite žetone na {{network}}. Raziščite vrhunske bazene. Oglejte si cene v realnem času, obseg trgovanja, TVL, grafikone in podatke o transakcijah.", - "web.explore.title.pools": "Raziščite najboljša združenja na {{network}} na Uniswap", - "web.explore.title.tokens": "Raziščite najboljše žetone na {{network}} na Uniswap", - "web.explore.title.transactions": "Raziščite najboljše transakcije na {{network}} na Uniswap" -} diff --git a/packages/uniswap/src/i18n/locales/translations/sr-SP.json b/packages/uniswap/src/i18n/locales/translations/sr-SP.json deleted file mode 100644 index afaef20798b..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/sr-SP.json +++ /dev/null @@ -1,2563 +0,0 @@ -{ - "account.authHeader.claimReward": "Преузми {{amount}} награду", - "account.cloud.backup.subtitle": "На вашем {{cloudProviderName}}постоји више фраза за опоравак.", - "account.cloud.backup.title": "Изаберите резервну копију за враћање", - "account.cloud.button.restore.android": "Вратите са Гоогле диска", - "account.cloud.button.restore.ios": "Вратите са иЦлоуд-а", - "account.cloud.empty.description": "Изгледа да нисте направили резервну копију ниједног од ваших фраза за опоравак на {{cloudProviderName}}.", - "account.cloud.empty.title": "0 пронађених резервних копија", - "account.cloud.error.backup.message": "Увоз резервних копија није успео због недостатка дозвола, прекида ауторизације или због грешке у облаку", - "account.cloud.error.backup.title": "Грешка при увозу резервних копија", - "account.cloud.error.password.title": "Неважећа лозинка. Молим вас, покушајте поново.", - "account.cloud.error.unavailable.button.cancel": "Не сада", - "account.cloud.error.unavailable.button.settings": "Идите на Подешавања", - "account.cloud.error.unavailable.message.android": "Проверите да ли сте пријављени на Гоогле налог са омогућеним Гоогле диском на овом уређају и покушајте поново.", - "account.cloud.error.unavailable.message.ios": "Проверите да ли сте пријављени на Аппле ИД са омогућеним иЦлоуд Дриве-ом на овом уређају и покушајте поново.", - "account.cloud.error.unavailable.title.android": "Гоогле диск није доступан", - "account.cloud.error.unavailable.title.ios": "иЦлоуд Дриве није доступан", - "account.cloud.loading.title": "Тражење резервних копија...", - "account.cloud.lockout.time.hours_one": "Превише покушаја. Покушајте поново за 1 сат.", - "account.cloud.lockout.time.hours_other": "Превише покушаја. Покушајте поново за {{count}} сати.", - "account.cloud.lockout.time.minutes_one": "Превише покушаја. Покушајте поново за 1 минут.", - "account.cloud.lockout.time.minutes_other": "Превише покушаја. Покушајте поново за {{count}} минута.", - "account.cloud.password.input": "Унесите лозинку", - "account.cloud.password.recoveryPhrase": "Уместо тога унесите фразу за опоравак", - "account.cloud.password.subtitle": "Ова лозинка је потребна за опоравак резервне копије фразе за опоравак са {{cloudProviderName}}.", - "account.cloud.password.title": "Унесите лозинку за резервну копију", - "account.downloadWallet.subtitle": "Back up your wallet, trade on the go, get live price alerts, and more.", - "account.drawer.gitHash": "Git hash: ", - "account.drawer.gitVersion": "верзија: ", - "account.drawer.modal.body": "Безбедно чувајте и мењајте токене помоћу апликације Унисвап. Доступно на иОС-у и Андроид-у.", - "account.drawer.modal.dont": "Немате Унисвап новчаник?", - "account.drawer.modal.scan": "Скенирајте помоћу Унисвап новчаника", - "account.drawer.spamToggle": "Сакриј непознате токене и НФТ", - "account.passkey.delete.acknowledge": "I’ve backed up my recovery phrase and understand that Uniswap Labs can’t help me recover my wallet if I failed to do so.", - "account.passkey.delete.description": "Make sure you’ve backed up your recovery phrase using the Uniswap mobile app or browser extension.", - "account.passkey.delete.descriptionEmphasized": "Without your recovery phrase, you may be unable to access your wallet.", - "account.passkey.delete.speedbump.description": "Before continuing, complete the following steps to avoid losing access to your wallet and all funds.", - "account.passkey.delete.speedbump.step1": "Download the Uniswap mobile app or browser extension", - "account.passkey.delete.speedbump.step2": "Back up your recovery phrase", - "account.passkey.delete.speedbump.title": "Јеси ли сигуран?", - "account.passkey.delete.title": "Delete passkey?", - "account.passkey.log.in.title": "Log in with passkey", - "account.passkey.type.crossplatform": "Phone, tablet, or security key", - "account.passkey.type.platform": "Browser or operating system", - "account.passkey.verify.button": "Verify with passkey", - "account.passkey.verify.description": "Before you continue, please use your passkey to verify your identity. This helps keep your account secure.", - "account.passkey.verify.title": "First, let’s verify it’s you", - "account.portfolio.activity.canceledBelow": "Ова поруџбина је отказана јер је ваше стање било испод улазног износа.", - "account.portfolio.activity.signLimit": "Ова поруџбина се неће испунити јер је ваше стање било испод износа који сте унели. Повећајте свој баланс да бисте га поправили.", - "account.recoveryPhrase.education.part1": "Фраза за опоравак (или сеед фраза) је скуп речи потребних за приступ вашем новчанику, као лозинка.", - "account.recoveryPhrase.education.part2": "Можете унети своју фразу за опоравак на новом уређају да бисте вратили свој новчаник и његов садржај.", - "account.recoveryPhrase.education.part3": "Али, ако изгубите фразу за опоравак, изгубићете приступ свом новчанику.", - "account.recoveryPhrase.education.part4": "Уместо да запамтите своју фразу за опоравак, можете направити резервну копију на {{cloudProviderName}} и заштитити је лозинком.", - "account.recoveryPhrase.education.part5": "Такође можете ручно да направите резервну копију фразе за опоравак тако што ћете је записати и сачувати на безбедном месту.", - "account.recoveryPhrase.education.part6": "Препоручујемо да користите обе врсте резервних копија, јер ако изгубите фразу за опоравак, нећете моћи да вратите новчаник.", - "account.recoveryPhrase.error.invalid": "Неважећа фраза", - "account.recoveryPhrase.error.invalidWord": "Неважећа реч: {{word}}", - "account.recoveryPhrase.error.phraseLength": "Фраза за опоравак мора да има 12-24 речи", - "account.recoveryPhrase.error.wordIsAddress": "You’ve entered an address, not a recovery phrase", - "account.recoveryPhrase.error.wrong": "Погрешна фраза за опоравак", - "account.recoveryPhrase.helpText.import": "Како да пронађем своју фразу за опоравак?", - "account.recoveryPhrase.helpText.restoring": "Покушајте поново да тражите", - "account.recoveryPhrase.input": "Унесите фразу за опоравак", - "account.recoveryPhrase.remove.final.description": "Уверите се да сте записали фразу за опоравак или сте направили резервну копију на {{cloudProviderName}}. У супротном нећете моћи да приступите својим средствима.", - "account.recoveryPhrase.remove.final.title": "Уклањате своју фразу за опоравак", - "account.recoveryPhrase.remove.import.description": "Можете сачувати само једну фразу за опоравак одједном. Да бисте наставили да увозите нови, мораћете да уклоните тренутну фразу за опоравак и све повезане новчанике са овог уређаја.", - "account.recoveryPhrase.remove.initial.description": "Ово ће уклонити ваш новчаник са овог уређаја заједно са фразом за опоравак.", - "account.recoveryPhrase.remove.initial.title": "Уклањате {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "Your recovery phrase will remain stored until you delete all remaining wallets.", - "account.recoveryPhrase.subtitle.import": "Ваша фраза за опоравак биће сачувана само локално на вашем уређају.", - "account.recoveryPhrase.subtitle.restoring": "Унесите своју фразу за опоравак испод или покушајте поново да потражите резервне копије.", - "account.recoveryPhrase.title.import": "Унесите своју фразу за опоравак", - "account.recoveryPhrase.title.restoring": "Нису пронађене резервне копије", - "account.wallet.action.copy": "Copy address", - "account.wallet.action.manageConnections": "Manage Connections", - "account.wallet.action.report": "Пријави профил", - "account.wallet.action.viewExplorer": "Погледај на {{blockExplorerName}}", - "account.wallet.button.add": "Додајте новчаник", - "account.wallet.button.addViewOnly": "Додајте новчаник само за преглед", - "account.wallet.button.create": "Направите нови новчаник", - "account.wallet.button.import": "Увезите нови новчаник", - "account.wallet.button.manage": "Подешавања новчаника", - "account.wallet.button.remove": "Уклоните новчаник", - "account.wallet.button.watch": "Пази на новчаник", - "account.wallet.create.placeholder": "Новчаник {{index}}", - "account.wallet.edit.label.input.placeholder": "Ознака новчаника", - "account.wallet.header.button.disabled.title": "Уреди профил", - "account.wallet.header.button.title": "Уреди ознаку", - "account.wallet.header.viewOnly": "Новчаници само за гледање", - "account.wallet.menu.claimUsername": "Claim username", - "account.wallet.menu.copy.title": "Копирајте адресу новчаника", - "account.wallet.menu.edit.title": "Уреди ознаку", - "account.wallet.menu.manageConnections": "Управљајте везама", - "account.wallet.menu.remove.title": "Уклоните новчаник", - "account.wallet.remove.check": "Направио сам резервну копију своје фразе за опоравак и разумем да Унисвап Лабс не може да ми помогне да повратим своје новчанике ако то не урадим.", - "account.wallet.remove.title": "Уклоните {{name}}", - "account.wallet.remove.viewOnly": "Увек можете додати новчанике само за преглед уназад тако што ћете унети адресу новчаника.", - "account.wallet.restore.new_device.description": "Because you’re on a new device, you’ll need to restore your recovery phrase or enter your cloud backup password to continue.", - "account.wallet.restore.new_device.title": "Recover your wallet", - "account.wallet.restore.seed_phrase.description": "Your recovery phrase is missing from your device. To ensure you’ll never lose access to your funds, we’ll need you to restore your wallet.", - "account.wallet.restore.seed_phrase.title": "Restore your wallet", - "account.wallet.select.error": "Учитавање адреса није успело", - "account.wallet.select.loading.subtitle": "Ваши новчаници ће се појавити испод.", - "account.wallet.select.loading.title": "У потрази за новчаницима", - "account.wallet.select.smartWalletDisclaimer": "By default, all eligible wallets will use smart wallet features once imported. What’s a smart wallet?", - "account.wallet.select.title_one_one": "Пронађен један новчаник", - "account.wallet.select.title_one_other": "Изаберите новчанике за увоз", - "account.wallet.viewOnly.button": "Увезите новчаник", - "account.wallet.viewOnly.description": "Да бисте заменили, купили, послали и примили токене, потребно је да увезете фразу за опоравак овог новчаника.", - "account.wallet.viewOnly.title": "Овај новчаник је само за преглед", - "account.wallet.watch.error.alreadyImported": "Ова адреса је већ увезена", - "account.wallet.watch.error.notFound": "Адреса није пронађена", - "account.wallet.watch.error.smartContract": "Адреса је паметан уговор", - "account.wallet.watch.message": "Додавање новчаника само за преглед омогућава вам да испробате апликацију или пратите новчаник. Нећете моћи да мењате или шаљете средства.", - "account.wallet.watch.placeholder": "ЕНС или адреса", - "account.wallet.watch.title": "Унесите адресу новчаника", - "activity.pending": "{{pendingActivityCount}} На чекању", - "activity.transaction.lpRewards.descriptor": "{{symbol}} rewards collected", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} до {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} за {{amountWithSymbolB}}", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} и {{amountWithSymbolB}}", - "addLiquidity.shareOfPool": "Удео у базену", - "addressInput.recipient": "Прималац", - "analytics.allow": "Дозволи аналитику", - "analytics.allow.message": "Користимо анонимне податке да побољшамо ваше искуство са Унисвап Лабс производима.", - "appRating.button.notReally": "Не баш", - "appRating.description": "Јавите нам ако имате добро искуство са овом апликацијом", - "appRating.extension.review.description": "Pick a star rating and leave a review on the Chrome Web Store.", - "appRating.extension.review.title": "Review Uniswap Extension?", - "appRating.extension.title": "Enjoying Uniswap Extension?", - "appRating.feedback.button.send": "Пошаљи повратне информације", - "appRating.feedback.description": "Јавите нам како можемо да побољшамо ваше искуство", - "appRating.feedback.title": "Жао нам је што то чујемо.", - "appRating.mobile.title": "Уживате у Унисвап новчанику?", - "bridgedAsset.modal.button": "Continue to swap", - "bridgedAsset.modal.description": "This is a {{chainName}} version of {{currencySymbol}} that is backed by and maintains the same price as native {{currencySymbol}}.", - "bridgedAsset.modal.feature.securelyBacked": "Securely backed", - "bridgedAsset.modal.feature.securelyBacked.description": "1:1 backed by native {{currencySymbol}}.", - "bridgedAsset.modal.feature.tradeSeamlessly": "Trade seamlessly", - "bridgedAsset.modal.feature.tradeSeamlessly.description": "Buy and sell {{currencySymbol}} without leaving Uniswap.", - "bridgedAsset.modal.feature.withdrawToNativeChain": "Withdraw to {{nativeChainName}}", - "bridgedAsset.modal.feature.withdrawToNativeChain.description": "Bridge back to the native network anytime.", - "bridgedAsset.modal.title": "Trade {{currencySymbol}} on {{chainName}}", - "bridgedAsset.send.warning.description": "You’re sending a wrapped version of {{currencySymbol}} on {{chainName}}. Sending it to a centralized exchange will result in a permanent loss of funds.", - "bridgedAsset.send.warning.title": "Make sure you’re sending to a compatible address", - "bridgedAsset.tdp.description": "This is a bridged version of {{currencySymbol}} that is 1:1 backed by native {{currencySymbol}}.", - "bridgedAsset.wormhole.button": "Continue to Wormhole", - "bridgedAsset.wormhole.description": "Continue to the Wormhole portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", - "bridgedAsset.wormhole.title": "Withdraw {{currencySymbol}} to {{nativeChainName}}", - "bridgedAsset.wormhole.toNativeChain": "to {{nativeChainName}}", - "bridgedAsset.wormhole.withdrawToNativeChain": "Withdraw to {{nativeChainName}}", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}мин {{seconds}}с", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}мин", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}с", - "chart.candlestick": "Свећњак", - "chart.error.pools": "Није могуће приказати историјске податке за тренутни скуп.", - "chart.error.tokens": "Није могуће приказати историјске податке за тренутни токен.", - "chart.line": "Линијски графикон", - "chart.missingData": "Недостају подаци графикона", - "chart.price.label.close": "Близу", - "chart.price.label.high": "Високо", - "chart.price.label.low": "Ниско", - "chart.price.label.open": "Отвори", - "chart.settings.unavailable.label": "Ово подешавање није доступно за тренутни графикон", - "claim.thanks": "Хвала што сте део Унисвап заједнице ", - "claim.uni.arrived": "УНИ је стигао", - "common.about": "О томе", - "common.accept": "Прихвати", - "common.active": "Ацтиве", - "common.activeNetworks": "Active networks", - "common.activity": "Активност", - "common.add.label": "Додати", - "common.add.liquidity.canceled": "Add liquidity canceled", - "common.addLiquidity": "Додајте ликвидност", - "common.address": "Address", - "common.addressOrENS": "Адреса новчаника или ЕНС назив", - "common.advanced": "Напредно", - "common.all": "Сви", - "common.allTime": "Све време", - "common.and": "и", - "common.app": "Апликација", - "common.approved": "Одобрено", - "common.approvePending": "Одобрење чекању...", - "common.approvePermitTx": "Approve request {{indexText}}", - "common.approvePermitTx.active": "Approve request{{indexText}} in wallet", - "common.approvePermitTx.explainer": "What are Permit2 approvals?", - "common.approvePermitTx.pending": "Approving request {{indexText}}...", - "common.approveSpend": "Одобрите {{symbol}} потрошњу", - "common.approving": "Одобравање", - "common.approximatelyValue": "~{{value}}", - "common.areYouSure": "Јеси ли сигуран?", - "common.automatic": "Ауто", - "common.availableIn": "Унисвап доступан у: ", - "common.availableOnIOSAndroidChrome": "Доступно на иОС-у, Андроид-у и Цхроме-у", - "common.backToPositions": "Назад на позиције", - "common.bestRoute": "Route", - "common.bestRoute.with": "Route via {{provider}}", - "common.biometrics.generic": "Биометрија", - "common.biometrics.touchId": "Touch ID", - "common.biometrics.windowsHello": "Windows Hello", - "common.blocked.ifError": "Ако верујете да је ово грешка, пошаљите е-поруку укључујући вашу адресу на ", - "common.blocked.reason": "Ова адреса је блокирана на интерфејсу Унисвап Лабс јер је повезана са једном или више блокираних активности.", - "common.blockedAddress": "Блокирана адреса", - "common.blog": "Блог", - "common.bought": "Купљено", - "common.brandAssets": "Средства бренда", - "common.button.accept": "Прихвати", - "common.button.back": "Назад", - "common.button.buy": "Купи", - "common.button.cancel": "Поништити, отказати", - "common.button.checkin": "Пријавити", - "common.button.close": "Близу", - "common.button.confirm": "Потврди", - "common.button.connect": "Повежите се", - "common.button.continue": "Настави", - "common.button.copied": "Копирано", - "common.button.copy": "Копирај", - "common.button.create": "Креирај", - "common.button.delete": "Избриши", - "common.button.disable": "Disable", - "common.button.disabling": "Disabling", - "common.button.disconnect": "Прекини везу", - "common.button.dismiss": "Одбаци", - "common.button.done": "Готово", - "common.button.edit": "Уредити", - "common.button.enable": "Омогући", - "common.button.finish": "Заврши", - "common.button.goBack": "Вратити се", - "common.button.later": "Можда касније", - "common.button.learn": "Сазнајте више", - "common.button.next": "Следећи", - "common.button.notNow": "Не сада", - "common.button.ok": "У реду", - "common.button.paste": "Залепите", - "common.button.pay": "Плати", - "common.button.proceed": "Настави", - "common.button.receive": "Примите", - "common.button.remove": "Уклони", - "common.button.reset": "Ресетуј", - "common.button.retry": "Покушај поново", - "common.button.reveal": "Откриј", - "common.button.review": "Преглед", - "common.button.save": "сачувати", - "common.button.scrollDown": "Померите се надоле", - "common.button.sell": "Селл", - "common.button.send": "Пошаљи", - "common.button.setup": "Подесити", - "common.button.share": "Објави", - "common.button.showLess": "Прикажи мање", - "common.button.showMore": "Прикажи више", - "common.button.sign": "Сигн", - "common.button.skip": "Скип", - "common.button.swap": "Свап", - "common.button.tryAgain": "Покушајте поново", - "common.button.understand": "разумем", - "common.button.unlock": "Откључај", - "common.button.view": "Поглед", - "common.button.viewDetails": "View details", - "common.button.yes": "да", - "common.buy.label": "Купи", - "common.buyAndSell": "Купујте и продајте на Унисвап-у", - "common.cancellationSubmitted": "Отказивање је послато", - "common.cancellationSuccessful": "Отказивање је успешно", - "common.cancelOrder": "Откажите наруџбу", - "common.card.error.description": "Нешто није у реду", - "common.card.error.title": "Упс! Нешто није у реду.", - "common.careers": "Каријере", - "common.chain.networkCost": "{{chain}} network cost", - "common.chart": "Chart", - "common.checkNetwork": "Проверите статус мреже овде.", - "common.chromeExtension": "Продужетак", - "common.claim.failed": "Захтев није успео", - "common.claimed": "Захтевано", - "common.claiming": "Тражење", - "common.claimUnis": "Преузмите своје УНИ токене", - "common.clear": "Clear", - "common.close": "Близу", - "common.closed": "Затворено", - "common.collect.button": "Цоллецт", - "common.company": "Компанија", - "common.confirm": "Потврди", - "common.confirmCancellation": "Потврдите отказивање", - "common.confirmed": "Confirmed", - "common.confirmSend.button": "Потврдите слање", - "common.confirmSwap": "Потврдите замену у новчанику", - "common.confirmTimedOut": "Истекло је време за потврду. Покушајте поново.", - "common.confirmTransfer": "Confirm transfer", - "common.confirmWallet": "Потврдите у новчанику", - "common.connect.button": "Повежите се", - "common.connectAWallet.button": "Повежите новчаник", - "common.connectAWallet.button.evm": "Connect Ethereum wallet", - "common.connectAWallet.button.evm.switch": "Switch Ethereum wallet", - "common.connectAWallet.button.svm": "Connect Solana wallet", - "common.connectAWallet.button.svm.switch": "Switch Solana wallet", - "common.connectAWallet.button.switch": "Switch wallet", - "common.connectTo": "Connect to {{platform}}", - "common.connectWallet.button": "Повежите новчаник", - "common.contactUs.button": "Контактирајте нас", - "common.copied": "Копирано", - "common.copy.address": "Copy address", - "common.copy.poolId": "Copy pool ID", - "common.copyLink.button": "Копирај везу", - "common.created.date": "Created {{date}}", - "common.currency": "Валута", - "common.currentPrice": "Тренутна цена", - "common.custom": "Обичај", - "common.customRange": "Прилагођени домет", - "common.dataOutdated": "Подаци су можда застарели", - "common.day": "дан", - "common.default": "Уобичајено", - "common.defaultTradeOptions": "Подразумеване опције трговине", - "common.deposit.toNetwork": "Депонујте токене на {{label}} мрежу.", - "common.depositing": "Депоновање", - "common.depositTokens": "Положи токене", - "common.detected": "Откривен", - "common.developers": "Девелоперс", - "common.device": "This device", - "common.device.other": "Other device", - "common.dismiss": "Одбаци", - "common.docs": "Docs", - "common.donate": "Donate", - "common.done": "Готово", - "common.dontShowAgain": "Не приказуј ово поново", - "common.download": "Преузимање", - "common.downloadAppStore": "Преузмите на App Store", - "common.downloadPlayStore": "Преузмите на Play Store", - "common.downloadUniswapApp": "Преузмите апликацију Унисвап", - "common.downloadUniswapWallet": "Download Uniswap Wallet", - "common.dynamic": "Dynamic", - "common.edit.button": "Уредити", - "common.ended": "Ended", - "common.error.details": "Error details", - "common.error.general": "Нешто није у реду", - "common.error.label": "Грешка", - "common.error.request": "Жао нам је, дошло је до грешке при обради вашег захтева. Ако затражите подршку, обавезно копирајте детаље ове грешке.", - "common.error.somethingWrong": "Нешто није у реду!", - "common.errorConnecting.error": "Грешка везе", - "common.errorLoadingData.error": "Грешка при учитавању података", - "common.etherscan": "Етхерсцан", - "common.expiry": "Екпири", - "common.explore": "Истражите", - "common.explorer": "Екплорер", - "common.exploreTokens": "Истражите токене", - "common.extension": "Унисвап Ектенсион", - "common.failedSwitchNetwork": "Промена мреже није успела", - "common.fee": "Надокнада", - "common.fees": "Накнаде", - "common.feesEarned": "Fees earned", - "common.feesEarnedPerBase": "{{symbolA}} по {{symbolB}}", - "common.for": "За", - "common.free": "Free", - "common.fullRange": "Пун Опсег", - "common.getApp": "Преузмите апликацију", - "common.getHelp.button": "Нађи помоћ", - "common.getStarted": "Започните", - "common.getSupport.button": "Добити подршку", - "common.getTheApp": "Преузмите апликацију", - "common.getUniswapWallet": "Набавите Унисвап новчаник", - "common.getUniswapWallet.mobile": "Get the Uniswap mobile app", - "common.governance": "Управљање", - "common.happyHolidays": "Срећне празнике жели Унисвап тим!", - "common.help": "Help", - "common.helpCenter": "Центар за помоћ", - "common.hidden": "Сакривен", - "common.hide.button": "Сакрити", - "common.highPrice": "Висока цена", - "common.includes": "Укључује", - "common.info.label": "Инфо", - "common.input.noRecipient.error": "Изаберите примаоца", - "common.input.password.confirm": "Потврди лозинку", - "common.input.password.error.mismatch": "Лозинке се не поклапају", - "common.input.password.error.weak": "Ова лозинка је преслаба", - "common.input.password.new": "Нова лозинка", - "common.input.password.placeholder": "Лозинка", - "common.input.password.strength.medium": "Средње", - "common.input.password.strength.strong": "Јака", - "common.input.password.strength.weak": "Слабо", - "common.input.search": "Претрага", - "common.insufficient.funds": "Недовољно средстава", - "common.insufficientBalance.error": "Недовољна равнотежа", - "common.insufficientFundsForNetworkFee.error": "Недовољна средства за покривање трошкова мреже", - "common.insufficientTokenBalance.error": "Недовољан баланс {{tokenSymbol}}", - "common.insufficientTokenBalance.error.simple": "Није довољно {{tokenSymbol}}", - "common.invalidPair": "Неважећи пар", - "common.invalidRecipient.error": "Неважећи прималац", - "common.iOSAndroid": "иОС и Андроид", - "common.language": "Језик", - "common.learnMoreSwap": "Сазнајте више о заменама", - "common.legalAndPrivacy": "Право и приватност", - "common.less": "Мање", - "common.limit.cancel_one": "Ограничење отказивања", - "common.limit.cancel_other": "Откажите {{count}} ограничења", - "common.limit.canceled": "Limit canceled", - "common.limit.executed": "Лимит је извршен", - "common.limit.expired": "Лимит је истекао", - "common.limit.failed": "Ограничење није успело", - "common.limit.opened": "Лимит је отворен", - "common.limit.pending": "Ограничење је на чекању", - "common.limits": "Ограничења", - "common.limits.approachMax": "Приближава се максимуму од 100", - "common.limits.cancelProceed": "Откажите ограничења да бисте наставили", - "common.limits.expires": "Истиче {{timestamp}}", - "common.limits.open": "Отворене границе", - "common.limits.when": "када {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "Линкови", - "common.liquidity": "Ликвидност", - "common.liquidity.provision": "Liquidity Provision", - "common.liquidity.removed": "Ликвидност уклоњена", - "common.loading": "Лоадинг", - "common.longText.button.less": "Читај мање", - "common.longText.button.more": "Опширније", - "common.lowPrice": "Ниска цена", - "common.manage": "Управљати", - "common.market.label": "Маркет", - "common.marketPrice": "Market price", - "common.marketPrice.fetching": "Fetching market price...", - "common.marketPrice.label": "Market price:", - "common.marketPrice.unavailable": "Market price not found. Please do your own research to avoid loss of funds.", - "common.max": "Макс", - "common.message": "Message", - "common.migrate": "Миграција", - "common.migrate.liquidity.failed": "Миграција ликвидности није успела", - "common.migrate.position": "Мигрирај позицију", - "common.migrated.liquidity": "Мигрирана ликвидност", - "common.migrating.liquidity": "Миграција ликвидности", - "common.min": "Мин", - "common.more": "Више", - "common.moreDetails": "More details", - "common.navigation.settings": "Подешавања", - "common.navigation.systemSettings": "Подешавања", - "common.navigationButton": "Дугме за навигацију", - "common.needHelp": "Потребна помоћ?", - "common.networkCost": "Трошкови мреже", - "common.neverMind": "Нема везе", - "common.new": "Нови", - "common.new.exclamation": "New!", - "common.nft": "NFT", - "common.nfts": "НФТс", - "common.noAmount.error": "Унесите износ", - "common.noData": "Нема података", - "common.none": "None", - "common.noResults": "Нема резултата.", - "common.notAvailableInRegion.error": "Није доступно у вашем региону", - "common.notCreated.label": "Није креирано", - "common.notSupported": "Није подржано", - "common.oneDay": "1 дан", - "common.oneDay.short": "1Д", - "common.oneHour.short": "1Х", - "common.oneMonth": "1 месец", - "common.oneWeek": "1 недеља", - "common.oneYear": "1 година", - "common.opensea.link": "View on OpenSea", - "common.orderCanceled": "Order canceled", - "common.orderExecuted": "Налог извршен", - "common.orderExpired": "Наруџба је истекла", - "common.orderPending": "Наруџба је на чекању", - "common.outOfRange": "Ван домета", - "common.pageNotFound": "Страница није пронађена!", - "common.passkey.count": "Passkey {{number}}", - "common.passkeys": "Passkeys", - "common.passkeys.add": "Add a passkey", - "common.passkeys.add.description": "Choose where to save your new passkey.", - "common.pastDay": "Прошли дан", - "common.pastFiveMinutes": "Протеклих пет минута", - "common.pastHour": "Прошли сат", - "common.pastMonth": "Прошли месец", - "common.pastWeek": "Прошле недеље", - "common.pastYear": "Прошла година", - "common.pending": "нерешен", - "common.pending.cancellation": "Чека се отказивање", - "common.pendingEllipsis": "Нерешен...", - "common.permit": "Permit", - "common.plusMore": "+{{number}} more", - "common.pool": "Поол", - "common.pools": "Базени", - "common.portfolio": "Portfolio", - "common.poweredBy": "Покреће ", - "common.price": "Цена", - "common.priceUpdated": "Цена је ажурирана", - "common.privacyChoices": "Your Privacy Choices", - "common.privacyChoices.checkbox.description": "When checked, we will not share your data with third-party partners for personalized advertising. You can enable sharing anytime by unchecking this box.", - "common.privacyChoices.checkbox.label": "Do not share my information", - "common.privacyChoices.description": "We may share device identifiers with our advertising partners to promote our services on other websites and platforms. Where this qualifies as selling, sharing or targeted advertising under applicable laws, you can opt out by checking the \"do not share my information\" box. For more information about our privacy practices please review our Privacy Policy.", - "common.privacyChoices.disclaimer": "Please note that your selection will apply only to this browser on this device. You can also opt out by enabling the Global Privacy Control setting within the browser that you use to access our services. To see more options, go to your settings.", - "common.privacyPolicy": "Правила о приватности", - "common.proceed": "Настави", - "common.proceedInWallet": "Наставите у свом новчанику", - "common.products": "Products", - "common.protocol": "Протокол", - "common.protocol.v2": "Uniswap v2", - "common.protocol.v3": "Uniswap v3", - "common.protocol.v4": "Uniswap v4", - "common.purchased": "Купио", - "common.rate": "Рате", - "common.readMore": "Опширније", - "common.receive": "Примите", - "common.received": "Примљен", - "common.recent": "Скорашњи", - "common.refresh": "Refresh", - "common.reload.label": "Поново учитајте апликацију", - "common.remove.label": "Уклони", - "common.remove.liquidity.canceled": "Remove liquidity canceled", - "common.remove.liquidity.failed": "Уклањање ликвидности није успело", - "common.removing.liquidity": "Уклањање ликвидности", - "common.resetLimit": "Ресетујте {{symbol}} ограничење", - "common.resetLimitWallet": "Ресетујте {{symbol}} ограничење у новчанику", - "common.resettingLimit": "Ресетовање границе {{symbol}} ...", - "common.revoke.approval.failed": "Опозив одобрења није успео", - "common.revoked.approval": "Опозвано одобрење", - "common.revoking.approval": "Укидање одобрења", - "common.scanQRDownload": "Скенирајте КР код телефоном да бисте га преузели", - "common.selectRegion.label": "Изаберите свој регион", - "common.selectToken.label": "Изаберите токен", - "common.sell.label": "Селл", - "common.send.button": "Пошаљи", - "common.send.failed": "Слање није успело", - "common.sending": "Слање", - "common.sent": "Послано", - "common.settings": "Подешавања", - "common.share": "Објави", - "common.share.shareToTwitter": "Делите на Твитеру", - "common.show.button": "Прикажи", - "common.showLess.button": "Прикажи мање", - "common.showMore.button": "Прикажи више", - "common.signatureExpired": "Ваш потпис је истекао.", - "common.signMessage": "Потпишите поруку", - "common.signMessageWallet": "Потпишите поруку у новчанику", - "common.socials": "Socials", - "common.sold": "Продат", - "common.stats": "Статс", - "common.status": "Статус", - "common.step.number": "Корак {{number}}", - "common.step.number.of": "Step {{current}} of {{total}}", - "common.swap": "Свап", - "common.swap.expired": "Замена је истекла", - "common.swap.failed": "Замена није успела", - "common.swapPending": "Замена је на чекању...", - "common.termsOfService": "Услови коришћења", - "common.text.connected": "Повезан", - "common.text.contract": "Уговор", - "common.text.disconnected": "Дисцоннецтед", - "common.text.error": "Грешка", - "common.text.notAvailable": "Н/А", - "common.text.recipient": "До", - "common.text.sender": "Од", - "common.text.unknown": "Непознат", - "common.thisAccount": "this account", - "common.thisMonth": "Овог месеца", - "common.thisToken": "This token", - "common.thisWeek": "Ове недеље", - "common.thisYear": "Ове године", - "common.time": "време", - "common.time.minute.amt": "{{time}}м", - "common.time.minutes": "минута", - "common.time.past.days": "{{days}} days", - "common.time.past.days.short": "{{days}}d", - "common.time.past.hours": "{{hours}} hours", - "common.time.past.hours.short": "{{hours}}h", - "common.time.past.minutes.short": "{{minutes}}m", - "common.time.past.months.short": "{{months}}mo", - "common.time.past.seconds.short": "{{seconds}}s", - "common.to": "до", - "common.today": "Данас", - "common.tokenA": "Токен А", - "common.tokenAmount": "Износ токена", - "common.tokenB": "Токен Б", - "common.tokenName": "Име токена", - "common.tokens": "Токенс", - "common.totalUniswapTVL": "Total Uniswap TVL", - "common.totalValueLocked": "ТВЛ", - "common.trade": "Траде", - "common.trademarkPolicy": "Политика жигова", - "common.transactionDetails": "Детаљи трансакције", - "common.transactionId": "ИД трансакције", - "common.transactionPending": "Трансакција је на чекању", - "common.transactions": "Трансакције", - "common.transactionSettings": "Подешавања трансакције", - "common.transfer_one": "трансфер", - "common.transfer_other": "трансфери", - "common.tryAgain.error": "Покушајте поново", - "common.twitter": "Твиттер", - "common.type.label": "Тип", - "common.unavailable": "Недоступно", - "common.unhide": "Unhide", - "common.unichain": "Unichain", - "common.uniswapMobile": "Унисвап Мобиле", - "common.uniswapWallet": "Унисвап валлет", - "common.uniswapX": "УнисвапКс", - "common.unknown": "Непознат", - "common.unknownError.error": "Непозната грешка", - "common.unwrap.button": "Унврап", - "common.unwrap.failed": "Одмотавање није успело", - "common.unwrapped": "Унвраппед", - "common.unwrapping": "Унвраппинг", - "common.view.profile": "View profile", - "common.viewOnExplorer": "Поглед на Екплорер", - "common.volume": "Волуме", - "common.vote": "Гласање", - "common.wallet.approve": "Одобри у новчанику", - "common.wallet.label": "Новчаник", - "common.warning": "Упозорење", - "common.webApp": "Веб апликација", - "common.website": "Веб сајт", - "common.whyApprove": "Зашто морам да одобрим токен?", - "common.whySign": "Зашто су потребни потписи?", - "common.whyWrap": "Зашто морам да умотам свој {{symbol}}?", - "common.withdraw": "Withdraw", - "common.withdrawal.amount": "Износ повлачења", - "common.withinRange": "У распону", - "common.wrap": "Замотајте {{symbol}}", - "common.wrap.failed": "Премотавање није успело", - "common.wrapIn": "Замотајте {{symbol}} у новчаник", - "common.wrapped": "Умотано", - "common.wrapping": "Враппинг", - "common.wrappingToken": "Умотавање {{symbol}}...", - "common.yesterday": "Yesterday", - "common.your.account.had.insufficient.funds": "Ваш налог није имао довољно средстава за довршетак ове замене.", - "common.your.account.has.insufficient.funds": "На вашем налогу нема довољно средстава за завршетак ове замене.", - "common.your.connected.wallet": "Your connected wallet", - "common.your.limit.could.not.be.fulfilled": "Ваше ограничење тренутно није могуће испунити. Молим вас, покушајте поново.", - "common.your.swap.could.not.be.fulfilled": "Ваша замена није могла да буде испуњена у овом тренутку. Молим вас, покушајте поново.", - "common.youreBuying": "Ти купујеш", - "common.youReceive": "Ти добијаш", - "common.youreSelling": "You’re selling", - "currency.ars": "Argentine Peso", - "currency.aud": "аустралијски долар", - "currency.brl": "Бразилски Реал", - "currency.cad": "канадски долар", - "currency.cny": "кинески јуан", - "currency.cop": "Colombian Peso", - "currency.eur": "евро", - "currency.gbp": "Британска фунта", - "currency.hkd": "Хонг Конг Доллар", - "currency.idr": "индонежанска рупија", - "currency.inr": "индијска рупија", - "currency.jpy": "јапански јен", - "currency.krw": "Јужнокорејски вон", - "currency.mxn": "Mexican Peso", - "currency.ngn": "нигеријска наира", - "currency.pkr": "пакистанска рупија", - "currency.rub": "руска рубља", - "currency.sgd": "Сингапурски долар", - "currency.try": "турска лира", - "currency.uah": "украјинска гривна", - "currency.usd": "Амерички долар", - "currency.vnd": "Вијетнамски Донг", - "dapp.request.actionCannotBeCompleted.description": "Some functionality is unavailable because your smart wallet settings are being managed by a different wallet app.", - "dapp.request.actionCannotBeCompleted.header": "Захтев за потпис", - "dapp.request.actionCannotBeCompleted.title": "Action cannot be completed", - "dapp.request.approve.action": "Одобре", - "dapp.request.approve.fallbackTitle": "Одобрите овом сајту приступ токенима", - "dapp.request.approve.helptext": "Дозволите овој веб локацији да приступи и потроши овај токен за трансакције. Уверите се да верујете овом сајту.", - "dapp.request.approve.label": "Новчаник", - "dapp.request.approve.title": "Одобри приступ {{tokenSymbol}}", - "dapp.request.base.title": "Захтев за трансакцију", - "dapp.request.bridge.description": "Преместите ETH, USDC и више преко {{numChains}}+ мрежа.", - "dapp.request.bridge.title": "Покушавате да повежете?", - "dapp.request.connect.helptext": "Дозволите овом сајту да види адресу вашег новчаника, стање и захтева одобрења за трансакције.", - "dapp.request.connect.title": "Повежите се са сајтом", - "dapp.request.fallback.calldata.label": "Сирове информације", - "dapp.request.fallback.function.label": "Функција", - "dapp.request.permit2.description": "Пермит2 управља одобрењима токена у више дапп-ова.", - "dapp.request.permit2.header": "Потпишите дозволу 2", - "dapp.request.permit2approve.action": "Одобре", - "dapp.request.permit2approve.helptext": "Пермит2 управља одобрењима токена у више дапп-ова.", - "dapp.request.permit2approve.title": "Approve Permit2", - "dapp.request.reject.action": "Одбаци све", - "dapp.request.reject.info": "Имате {{totalRequestCount}} захтеве за трансакције", - "dapp.request.revoke.action": "Опозови", - "dapp.request.revoke.helptext": "Дозволите овом сајту да опозове приступ за трошење овог токена за трансакције. Уверите се да верујете овом сајту.", - "dapp.request.revoke.title": "Опозови приступ {{tokenSymbol}}", - "dapp.request.signature.containsUnrenderableCharacters": "Ова порука садржи знакове који се не могу приказати. Уверите се да верујете овом сајту.", - "dapp.request.signature.decodeError": "Failed to decode message", - "dapp.request.signature.header": "Захтев за потпис", - "dapp.request.signature.irregular": "Irregular signature request", - "dapp.request.signature.irregular.description": "Make sure you trust this site before proceeding", - "dapp.request.signature.irregular.understand": "I understand the risks", - "dapp.request.signature.toggleDataView.raw": "Погледајте необрађене податке", - "dapp.request.signature.toggleDataView.readable": "Погледајте оригиналне податке", - "dapp.request.warning.notActive.message": "Уверите се да је прави", - "dapp.request.warning.notActive.title": "Ово није ваш активни новчаник", - "delegation.upgradeModal.description": "This wallet update uses smart contracts for faster, lower-cost transactions. Learn more", - "delegation.upgradeModal.enableSmartWallet": "Enable smart wallet", - "delegation.upgradeModal.title": "Smarter swaps, lower costs", - "downloadApp.modal.connectExistingWallet": "Connect existing wallet", - "downloadApp.modal.getStarted.description": "Get access to thousands of tokens instantly through the world’s largest onchain marketplace.", - "downloadApp.modal.getStarted.title": "Start swapping in seconds", - "downloadApp.modal.getTheApp.title": "Започните са Унисвап-ом", - "downloadApp.modal.uniswapProducts.subtitle": "Унисвап производи беспрекорно раде заједно како би створили најбоље ончаин искуство.", - "empty.swap.button.text": "Add funds to swap", - "error.dataUnavailable": "Подаци су тренутно недоступни; радимо на поправци", - "error.id": "ИД грешке: {{eventId}}", - "error.jupiterApi.execute.default.title": "Something went wrong with Jupiter API. Please try again.", - "error.jupiterApi.failedToLand": "(Code {{code}}: Transaction failed to land on the network)", - "error.jupiterApi.invalidBlockHeight": "(Code -1004: Invalid block height)", - "error.jupiterApi.invalidMessageBytes": "(Code -3: Invalid message bytes)", - "error.jupiterApi.invalidPayload": "(Code -2002: Invalid payload)", - "error.jupiterApi.invalidSignedTransaction": "(Code -2: Invalid signed transaction)", - "error.jupiterApi.invalidTransaction": "(Code -1002: Invalid transaction)", - "error.jupiterApi.missingCachedOrder": "(Code -1: Missing cached order)", - "error.jupiterApi.notFullySigned": "(Code -1003: Transaction not fully signed)", - "error.jupiterApi.quoteExpired": "This quote timed out, please try again. (Code -2003)", - "error.jupiterApi.unknownErrorCode": "(Code {{code}})", - "error.noData": "Није пронађен ниједан Подаци", - "error.request.provideId": "Жао нам је, дошло је до грешке при обради вашег захтева. Ако затражите подршку, обавезно наведите свој ИД грешке.", - "error.tokenApproval": "Одобрење токена није успело", - "error.tokenApproval.message": "A network or connection issue likely caused your approval to fail. Check your connection and try again.", - "error.tokenApprovalEdited": "Недовољна одобрена количина", - "error.tokenApprovalEdited.message": "Количина одобрења постављена у вашем новчанику је прениска да би се ова трансакција завршила. Покушајте поново и повећајте количину.", - "errors.crash.message": "Нешто се срушило.", - "errors.crash.restart": "Поново покрените апликацију", - "errors.crash.title": "Ух Ох!", - "explore.more.pools": "Explore more pools", - "explore.more.unichain": "Explore Unichain pools", - "explore.search.label.ownedBy": "Власништво {{ownerAddress}}", - "explore.search.placeholder": "Претражите токене и новчанике", - "explore.search.section.nft": "НФТ Цоллецтионс", - "explore.search.section.popularNFT": "Популарне НФТ колекције", - "explore.search.section.wallets": "Новчаници", - "explore.tokens.error": "Учитавање токена није успело", - "explore.tokens.favorite.action.add": "Омиљени токен", - "explore.tokens.favorite.action.edit": "Уредите фаворите", - "explore.tokens.favorite.action.remove": "Уклоните фаворита", - "explore.tokens.favorite.title.default": "Омиљени токени", - "explore.tokens.favorite.title.edit": "Уредите омиљене токене", - "explore.tokens.metadata.marketCap": "{{number}} МЦап", - "explore.tokens.metadata.totalValueLocked": "{{number}} ТВЛ", - "explore.tokens.metadata.volume": "{{number}} Вол", - "explore.tokens.sort.label.marketCap": "Тржишна капитализација", - "explore.tokens.sort.label.priceDecrease": "Пад цене", - "explore.tokens.sort.label.priceIncrease": "Раст цена", - "explore.tokens.sort.label.totalValueLocked": "ТВЛ", - "explore.tokens.sort.label.volume": "Волуме", - "explore.tokens.sort.option.marketCap": "Тржишна капитализација", - "explore.tokens.sort.option.priceDecrease": "Смањење цене (24 сата)", - "explore.tokens.sort.option.priceIncrease": "Повећање цене (24 сата)", - "explore.tokens.sort.option.totalValueLocked": "Унисвап ТВЛ", - "explore.tokens.sort.option.volume": "Замена запремине (24 х)", - "explore.tokens.top.title": "Топ токенс", - "explore.v2TVL": "v2 TVL", - "explore.v3TVL": "v3 TVL", - "explore.v4TVL": "v4 TVL", - "explore.wallets.favorite.action.add": "Омиљени новчаник", - "explore.wallets.favorite.action.edit": "Уредите фаворите", - "explore.wallets.favorite.action.remove": "Уклоните фаворита", - "explore.wallets.favorite.action.remove.short": "Unfavorite", - "explore.wallets.favorite.title.default": "Омиљени новчаници", - "explore.wallets.favorite.title.edit": "Уредите омиљене новчанике", - "extension.connection.network": "Мрежа", - "extension.connection.networks": "Мреже", - "extension.connection.popup.trouble": "Проблем са повезивањем?", - "extension.connection.titleConnected": "Повезан", - "extension.connection.titleNotConnected": "Није повезан", - "extension.lock.button.forgot": "Заборавили сте лозинку?", - "extension.lock.button.reset": "Ресетујте новчаник", - "extension.lock.button.submit": "Откључај", - "extension.lock.password.error": "Погрешна лозинка. Покушајте поново", - "extension.lock.password.reset.initial.description": "Унисвап не може помоћи у опоравку ваше лозинке. Морате да ресетујете новчаник тако што ћете поново унети своју фразу за опоравак од 12 речи.", - "extension.lock.password.reset.initial.help": "Где да пронађем фразу за опоравак?", - "extension.lock.password.reset.initial.title": "Заборавили сте лозинку", - "extension.lock.password.reset.speedbump.description": "Уверите се да имате фразу за опоравак од 12 речи пре него што ресетујете новчаник. У супротном нећете моћи да повратите своја средства.", - "extension.lock.password.reset.speedbump.help": "Изгубио сам фразу за опоравак", - "extension.lock.password.reset.speedbump.title": "Пре него што наставите", - "extension.lock.subtitle": "Унесите лозинку за откључавање", - "extension.lock.title": "Добродошли назад", - "extension.network.notSupported": "Неподржана мрежа", - "extension.open": "Отворите Унисвап Ектенсион", - "extension.passwordPrompt.error.wrongPassword": "Погрешна лозинка. Покушајте поново", - "extension.passwordPrompt.title": "Унесите лозинку", - "extension.popup.chrome.button": "Отвори екстензију", - "extension.popup.chrome.description": "Завршите ову радњу отварањем Унисвап екстензије.", - "extension.popup.chrome.title": "Наставите у Унисвап-у", - "extension.settings.defaultWallet.message": "Prioritize Uniswap Extension when connecting to apps.", - "extension.settings.defaultWallet.title": "Make default wallet", - "extension.uninstall.reason.missingFeatures": "Uniswap Wallet lacks certain features", - "extension.uninstall.reason.notUsingCrypto": "I no longer want to use crypto", - "extension.uninstall.reason.other": "Other reasons", - "extension.uninstall.reason.switchingWallet": "I’m switching to a different wallet", - "extension.uninstall.subtitle": "If you have a moment, we’d love to hear why you uninstalled Uniswap Wallet", - "extension.uninstall.title": "We’re sad to see you go", - "extension.warning.storage.button": "Направи резервну копију", - "extension.warning.storage.message": "Обавезно направите резервну копију фразе за опоравак да бисте спречили губитак приступа новчанику и средствима.", - "extension.warning.storage.title": "Вашем претраживачу понестаје меморијског простора", - "extensionPasskeyLogInPopUp.description": "Import your Uniswap account by logging in with an existing passkey.", - "extensionPasskeyLogInPopUp.invalidReferrer": "Please close this page and try again.", - "fee.bestForCustomizability": "Best for customizability.", - "fee.bestForExotic": "Најбоље за егзотичне парове.", - "fee.bestForMost": "Најбоље за већину парова.", - "fee.bestForStablePairs": "Најбоље за стабилне парове.", - "fee.bestForVeryStable": "Најбоље за веома стабилне парове.", - "fee.dynamic": "Dynamic fee", - "fee.percentEarned": "% који ћете зарадити у накнадама.", - "fee.selectPercent": "{{pct}}% изаберите", - "fee.selectPercentDescription": "{{pct}}% of liquidity selected this tier", - "fee.tier": "Ниво накнаде", - "fee.tier.create": "Креирајте ниво накнаде", - "fee.tier.create.button": "Креирајте нови ниво накнаде", - "fee.tier.create.description": "Креирање новог нивоа ће иницијализовати у новом базену и резултовати вишим од уобичајених трошковима мреже.", - "fee.tier.description": "The amount earned providing liquidity. Choose an amount that suits your risk tolerance and strategy.", - "fee.tier.description.v2": "The amount earned providing liquidity. All v2 pools have fixed 0.3% fees. For more options, provide liquidity on v4.", - "fee.tier.dynamic": "Dynamic fee tier", - "fee.tier.dynamic.create": "Creating dynamic fee tier", - "fee.tier.dynamic.create.info": "You are about to create a pool with a dynamic fee tier. Before proceeding, please ensure that the selected hook supports dynamic fees.", - "fee.tier.highestTvl": "Highest TVL", - "fee.tier.label": "% који ћете зарадити у накнадама", - "fee.tier.missing.description": "Не можете пронаћи ниво који тражите?", - "fee.tier.new": "Нови ниво", - "fee.tier.percent.select": "{{percentage}} select", - "fee.tier.recommended.description": "Recommended based on having the highest share of liquidity for the selected token pair.", - "fee.tier.search": "Search or create other fee tiers", - "fee.tier.search.short": "Претражи нивое", - "fee.tier.select": "Изаберите ниво накнаде", - "fee.tier.select.existing.button": "Изаберите постојећи ниво накнаде", - "fee.tierExact": "{{fee}} ниво накнаде", - "fee.unavailable": "Earned fees are not visible for v2 positions until liquidity is removed.", - "fee.uncollected": "Includes uncollected fees:", - "fee.uniswap": "Fee ({{percent}})", - "fee.uniswap.description": "Fees are applied to ensure the best experience with Uniswap.", - "fiatOffRamp.checkout.title": "Withdraw to", - "fiatOffRamp.connection.quote": "Продаја {{amount}} у вредности од {{currencySymbol}}", - "fiatOffRamp.error.balance": "Exceeds balance", - "fiatOffRamp.error.populateSend.description": "Please wait a moment and try again.", - "fiatOffRamp.error.populateSend.title": "Cannot load transaction", - "fiatOffRamp.summary.total": "{{cryptoAmount}} за {{fiatAmount}}", - "fiatOffRamp.unsupportedToken.back": "Вратити се", - "fiatOffRamp.unsupportedToken.divider": "Неподржани токени", - "fiatOffRamp.unsupportedToken.message": "Овај токен није подржан за продају. Замените ову активу за један од подржаних токена.", - "fiatOffRamp.unsupportedToken.swap": "Замените за подржани токен", - "fiatOffRamp.unsupportedToken.title": "Неподржани токен", - "fiatOffRamp.welcome.tooltip": "Продате своју крипто валуту на ваш банковни рачун или дебитну картицу.", - "fiatOnRamp.button.chooseToken": "Изаберите токен", - "fiatOnRamp.buy.info.description": "You’ll need it to pay for network costs when swapping.", - "fiatOnRamp.buy.info.title": "Start with ETH", - "fiatOnRamp.cexTransferModal.description": "Куповина криптовалуте са картицом није подржана у вашем региону. Пребаците средства са рачуна у централизованој берзи да финансирате свој новчаник.", - "fiatOnRamp.cexTransferModal.title": "Пребаците да бисте започели", - "fiatOnRamp.checkout.title": "Checkout", - "fiatOnRamp.chooseMultiPlatformProvider.chooseNetwork": "Choose network", - "fiatOnRamp.chooseMultiPlatformProvider.description": "This will determine the wallet address you’ll receive the funds on.", - "fiatOnRamp.chooseProvider.description": "Наставићете на портал провајдера да бисте видели накнаде повезане са вашом трансакцијом.", - "fiatOnRamp.completeTransactionHeader": "Завршите трансакцију са {{serviceProvider}}", - "fiatOnRamp.connection.error": "Веза није успостављена", - "fiatOnRamp.connection.errorDescription": "Нешто је пошло по злу при повезивању са {{serviceProvider}}.", - "fiatOnRamp.connection.message": "Повезивање са {{serviceProvider}}", - "fiatOnRamp.connection.quote": "Куповина {{amount}} у вредности од {{currencySymbol}}", - "fiatOnRamp.connection.terms": "Ако наставите, потврђујете да ћете бити подложни Условима коришћења услуге и Политици приватности са {{serviceProvider}}, према потреби.", - "fiatOnRamp.continueInTab": "Идите на картицу {{serviceProvider}} да бисте наставили. Сада је безбедно затворити овај модал.", - "fiatOnRamp.disclaimer": "Ако наставите, потврђујете да ћете бити предмет Услова коришћења услуге и Политике приватности са {{serviceProvider}}, према потреби.", - "fiatOnRamp.error.default": "Нешто није у реду.", - "fiatOnRamp.error.load": "Није могуће учитати токене за куповину", - "fiatOnRamp.error.max": "Максимално {{amount}}", - "fiatOnRamp.error.min": "Минимално {{amount}}", - "fiatOnRamp.error.noQuotes": "No quotes found.", - "fiatOnRamp.error.unavailable": "Ова услуга није доступна у вашем региону", - "fiatOnRamp.error.unsupported": "Није подржано у региону", - "fiatOnRamp.error.usd": "Доступно само за куповину у УСД", - "fiatOnRamp.noQuotes.error": "No quotes found", - "fiatOnRamp.paymentMethods.applePay": "Apple Pay", - "fiatOnRamp.paymentMethods.bank": "Bank", - "fiatOnRamp.paymentMethods.debit": "Debit", - "fiatOnRamp.paymentMethods.googlePay": "Google Pay", - "fiatOnRamp.paymentMethods.paypal": "PayPal", - "fiatOnRamp.paymentMethods.venmo": "Venmo", - "fiatOnRamp.quote.advice": "Наставићете на портал провајдера да бисте видели накнаде повезане са вашом трансакцијом.", - "fiatOnRamp.quote.type.list": "{{optionsList}}и друге опције", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "Са налога", - "fiatOnRamp.receiveCrypto.title": "Примите криптовалуте", - "fiatOnRamp.receiveCrypto.transferFunds": "Финансирајте свој новчаник преносом криптовалута из другог новчаника или налога", - "fiatOnRamp.receiveCrypto.useThisAddress": "Use this address to receive tokens on", - "fiatOnRamp.region.placeholder": "Претражујте по земљи или региону", - "fiatOnRamp.region.title": "Изаберите свој регион", - "fiatOnRamp.summary.total": "{{cryptoAmount}} за {{fiatAmount}}", - "forceUpgrade.action.backup": "Направите резервну копију свог новчаника", - "forceUpgrade.action.confirm": "Update now", - "forceUpgrade.action.learn": "Learn how to update", - "forceUpgrade.description.extension": "A new version of the app is available. To continue using the Uniswap Extension, please update it to the latest version.", - "forceUpgrade.description.wallet": "A new version of the app is available. To continue using the Uniswap Wallet, please update it to the latest version.", - "forceUpgrade.label.recoveryPhrase": "Фраза за опоравак", - "forceUpgrade.title": "Update to the latest version", - "forceUpgrade.title.recommendedStatus": "A new version is available", - "globalPreferences.title": "Глобалне преференције", - "hero.scroll": "Померите се да бисте сазнали више", - "hero.subtitle": "Buy and sell crypto on {{amount}}+ networks including Ethereum, Unichain, and Base.", - "hero.swap.title": "Замените било када,
било где.", - "hidden.nfts.info.banner.text": "Сазнајте више о скривеним НФТ-овима", - "hidden.nfts.info.text.button": "Скривени НФТ-ови ({{numHidden}})", - "hidden.nfts.info.text.extension": "Ово су потенцијалне преваре и НФТ-ови које сте сакрили. Можете кликнути десним тастером миша на НФТ да бисте га открили.", - "hidden.nfts.info.text.mobile": "Ово су потенцијалне преваре и НФТ-ови које сте сакрили. Можете дуго притиснути на НФТ да бисте га открили.", - "hidden.nfts.info.text.title": "Скривени НФТ-ови", - "hidden.tokens.info.banner.text": "Сазнајте више о скривеним токенима", - "hidden.tokens.info.text.button": "Скривени токени ({{numHidden}})", - "hidden.tokens.info.text.info": "Ово су потенцијалне преваре, мали биланси и токени које сте сакрили. Сакривени токени нису укључени у укупан биланс вашег новчаника.", - "hidden.tokens.info.text.title": "Сакривени токени", - "home.activity.empty.button": "Примите токене или НФТ", - "home.activity.empty.description.default": "Када одобрите, тргујете или пренесете токене или НФТ, ваше трансакције ће се појавити овде.", - "home.activity.empty.description.external": "Када овај новчаник обави трансакције, они ће се појавити овде.", - "home.activity.empty.title": "Још нема активности", - "home.activity.error.load": "Учитавање активности није успело", - "home.activity.title": "Активност", - "home.banner.offline": "Налазите се у офлајн режиму", - "home.banner.testnetMode": "Налазите се у тестнет режиму", - "home.banner.testnetMode.nav": "Налазите се у тестнет режиму. Искључите ово у подешавањима.", - "home.empty.cexTransfer": "Transfer", - "home.empty.cexTransfer.description": "Move funds from a trading platform.", - "home.empty.transfer": "Примите криптовалуте", - "home.empty.transfer.description": "Move funds from another wallet.", - "home.explore.footer": "Додирните овде да истражите хиљаде токена, НФТ-ова и још много тога", - "home.explore.title": "Истражите токене", - "home.extension.error": "Грешка при учитавању налога", - "home.label.buy": "Купи", - "home.label.for": "Buy/Sell", - "home.label.receive": "Примите", - "home.label.send": "Пошаљи", - "home.label.swap": "Свап", - "home.nfts.title": "НФТс", - "home.tokens.empty.action.buy.description": "Purchase with a debit card or bank account.", - "home.tokens.empty.action.buy.title": "Купите криптовалуте", - "home.tokens.empty.action.import.description": "Унесите фразу за опоравак овог новчаника да бисте започели замену и слање.", - "home.tokens.empty.action.import.title": "Увезите новчаник", - "home.tokens.empty.action.receive.description": "Transfer from another wallet or account.", - "home.tokens.empty.action.receive.title": "Примите криптовалуте", - "home.tokens.empty.description": "Када овај новчаник купи или прими токене, они ће се појавити овде.", - "home.tokens.empty.title": "Још нема токена", - "home.tokens.empty.welcome.description": "Add funds to start trading", - "home.tokens.error.fetch": "Преузимање стања токена није успело", - "home.tokens.error.load": "Није могуће учитати стање токена", - "home.tokens.title": "Токенс", - "home.upsell.receive.cta": "Са налога", - "home.upsell.receive.title": "Примите криптовалуте", - "home.warning.viewOnly": "Ово је новчаник само за преглед", - "interface.metatags.description": "Swap crypto on Ethereum, Base, Arbitrum, Polygon, Unichain and more. The DeFi platform trusted by millions.", - "interface.metatags.title": "Унисвап Интерфаце", - "landing.api": "API", - "landing.appsOverview": "Built for all the ways you swap", - "landing.blog.description": "Catch up on the latest company news, product features and more", - "landing.docs.description": "Explore our library of developer docs to get started building with Uniswap", - "landing.exploreUniverse": "Explore the UNIverse", - "landing.getStarted": "Trade on the world’s largest DEX", - "landing.helpCenter.body": "Browse FAQs and get support from our US-based support team", - "landing.protocolDescription": "Uniswap Labs powers some of the most used products in crypto. Experience permissionless access, proven security, and dedicated support.", - "landing.protocolStats": "Uniswap Protocol stats", - "landing.provideLiquidity.body": "Provide liquidity and collect fees using the Uniswap Interface.", - "landing.provideLiquidity.subtitle": "Power onchain markets.", - "landing.socials": "Follow Uniswap Labs on X, Farcaster, LinkedIn, and TikTok", - "landing.swapBody": "Access deep liquidity, explore tokens, set limit orders, and provide liquidity for thousands of tokens across {{amount}} chains.", - "landing.swapSubtitle": "Permissionless swapping.", - "landing.tradingApi": "Trading API", - "landing.tradingApiBody": "Use the same API that powers the Uniswap Web App and Wallet, trusted by leading teams around the world.", - "landing.tradingApiButton": "Integrate the Uniswap API", - "landing.tradingApiSubtitle": "DeFi, direct to your users.", - "landing.trusted": "Верују милиони", - "landing.unichain.body": "Join the community building on the fast, decentralized Ethereum L2 built to be the home for DeFi.", - "landing.unichain.button": "Start building", - "landing.unichain.subtitle": "The DeFi chain.", - "landing.uniswapX.body": "Gasless transactions and MEV protection, with zero fees for failed swaps.", - "landing.uniswapX.button": "Experience UniswapX", - "landing.uniswapX.subtitle": "Smarter swaps, zero friction.", - "landing.walletBody": "The trusted self-custody crypto wallet and extension with millions of downloads, support from real humans, and a 4.8 rating.", - "landing.walletSubtitle": "Swap, store, explore.", - "language.afrikaans": "Африканс", - "language.arabic": "Арапски", - "language.catalan": "Каталонски", - "language.chineseSimplified": "кинески, поједностављени", - "language.chineseTraditional": "Традиционални кинески", - "language.czech": "Чешки", - "language.danish": "Дански", - "language.dutch": "холандски", - "language.english": "енглески језик", - "language.finnish": "Фински", - "language.french": "Француски", - "language.greek": "Грчки", - "language.hebrew": "Хебрејски", - "language.hindi": "Хинди", - "language.hungarian": "Мађарски", - "language.indonesian": "индонезијски", - "language.italian": "Италијански", - "language.japanese": "јапански", - "language.korean": "Корејски", - "language.malay": "малајски", - "language.norwegian": "Норвешки", - "language.polish": "Пољски", - "language.portuguese": "португалски", - "language.romanian": "Румунски", - "language.russian": "Руски", - "language.serbian": "Српски", - "language.spanishArgentina": "Spanish (Argentina)", - "language.spanishBelize": "Spanish (Belize)", - "language.spanishBolivia": "Spanish (Bolivia)", - "language.spanishChile": "Spanish (Chile)", - "language.spanishColombia": "Spanish (Colombia)", - "language.spanishCostaRica": "Spanish (Costa Rica)", - "language.spanishCuba": "Spanish (Cuba)", - "language.spanishDominicanRepublic": "Spanish (Dominican Republic)", - "language.spanishEcuador": "Spanish (Ecuador)", - "language.spanishElSalvador": "Spanish (El Salvador)", - "language.spanishGuatemala": "Spanish (Guatemala)", - "language.spanishHonduras": "Spanish (Honduras)", - "language.spanishLatam": "шпански (Латинска Америка)", - "language.spanishMexico": "Spanish (Mexico)", - "language.spanishNicaragua": "Spanish (Nicaragua)", - "language.spanishPanama": "Spanish (Panama)", - "language.spanishParaguay": "Spanish (Paraguay)", - "language.spanishPeru": "Spanish (Peru)", - "language.spanishPuertoRico": "Spanish (Puerto Rico)", - "language.spanishSpain": "шпански (Шпанија)", - "language.spanishUruguay": "Spanish (Uruguay)", - "language.spanishUs": "шпански (САД)", - "language.spanishVenezuela": "Spanish (Venezuela)", - "language.swahili": "Свахили", - "language.swedish": "Шведски", - "language.turkish": "турски", - "language.ukrainian": "украјински", - "language.urdu": "Урду", - "language.vietnamese": "вијетнамски", - "large.price.difference": "Large price difference", - "large.price.difference.tooltip": "Proceeding with this trade will result in a loss of funds. This difference can be due to large trades or low liquidity.", - "limit.open.count_one": "1 отворен лимит", - "limit.open.count_other": "{{count}} отворене границе", - "limitPrice.buyingAboveMarketPrice.error.description": "Ваша лимитирана цена је {{percentage}}% виша од тржишне. Прилагодите своју ограничену цену да бисте наставили.", - "limitPrice.buyingAboveMarketPrice.error.title": "Куповина {{tokenSymbol}} изнад тржишне цене", - "limitPrice.marketPriceNotAvailable.error.description": "Нисмо у могућности да израчунамо тренутну тржишну цену. Да бисте избегли слање поруџбине испод тржишне цене, проверите мрежну везу и покушајте поново.", - "limitPrice.marketPriceNotAvailable.error.title": "Тржишна цена није доступна", - "limitPrice.sellingBelowMarketPrice.error.description": "Ваша гранична цена је {{percentage}}% нижа од тржишне. Прилагодите своју ограничену цену да бисте наставили.", - "limitPrice.sellingBelowMarketPrice.error.title": "Продајем {{tokenSymbol}} испод тржишне цене", - "limits.form.disclaimer.mainnet": "Само Етхереум токени главне мреже су доступни за ограничења. ", - "limits.form.disclaimer.mainnet.short": "Само токени главне мреже су доступни за ограничења.", - "limits.form.disclaimer.uniswapx": "Ограничења се можда неће извршити тачно када токени достигну наведену цену. ", - "limits.learnMore": "Сазнајте више о ограничењима", - "limits.price.input.label": "Када вреди 1 ", - "limits.price.label": "Ограничена цена", - "limits.selectSupportedTokens": "Изаберите подржане токене", - "liquidity.hooks": "Куке на в4", - "liquidity.hooks.address.input": "Enter hook address", - "liquidity.hooks.address.tooltip": "Hook address: {{address}}", - "liquidity.learnMoreLabel": "Сазнајте о обезбеђивању ликвидности", - "liquidity.notEnough.label": "Нема довољно ликвидности да прикаже тачну вредност у УСД.", - "liquidity.provideOnProtocols": "Обезбеђивање ликвидности на различитим протоколима", - "liquidityPool.page.title": "Додајте ликвидност у пулове{{version}} на Унисвап-у", - "liquidityPool.positions.closed.title": "Closed positions", - "liquidityPool.positions.loadingMore": "Loading more positions...", - "liquidityPool.positions.page.title": "Управљајте {{quoteSymbol}}/{{baseSymbol}} ликвидношћу пула на Унисвап-у", - "liquidityPool.positions.page.version.description": "Погледајте своје активне {{version}} позиције ликвидности. Додајте нове позиције.", - "liquidityPool.positions.page.version.title": "Управљајте ликвидношћу пула{{version}} на Унисвап-у", - "migrate.allowed": "Дозвољен", - "migrate.allowLpMigration": "Дозволи миграцију ЛП токена", - "migrate.connectAccount": "You must connect an account that owns this position.", - "migrate.connectWallet": "Повежите се са новчаником да бисте видели своју В2 ликвидност.", - "migrate.contract": "Унисвап уговор о миграцији", - "migrate.firstLP": "Ви сте први пружалац ликвидности за овај Унисвап В3 базен. Ваша ликвидност ће мигрирати по тренутној цени {{source}} .", - "migrate.highGasCost": "Ваша трансакција ће бити много већа јер укључује гас за стварање базена.", - "migrate.invalidRange": "Изабран је неважећи опсег. Минимална цена мора бити нижа од максималне цене.", - "migrate.lpNFT": "{{symA}}/{{symB}} ЛП НФТ", - "migrate.lpTokens": "{{symA}}/{{symB}} ЛП токени", - "migrate.migrating": "Миграција", - "migrate.missingV2Position": "Не видите једну од својих позиција в2? Увезите га.", - "migrate.noV2Liquidity": "Није пронађена В2 ликвидност.", - "migrate.positionNoFees": "Ваша позиција неће зарадити накнаде нити ће се користити у трговини док се тржишна цена не помери у ваш опсег.", - "migrate.priceDifference": "Разлика у цени: ", - "migrate.priceWarning": "Требало би да депонујете ликвидност у Унисвап В3 само по цени за коју верујете да је тачна.
Ако се чини да је цена нетачна, можете или да извршите замену да бисте померили цену или да сачекате да неко други то уради.", - "migrate.refund": "Најмање {{amtA}} {{symA}} и {{amtB}} {{symB}} ће бити враћено у ваш новчаник због изабраног распона цена.", - "migrate.selectFeeTier": "Изаберите ниво накнаде", - "migrate.setRange": "Поставите распон цена", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Цена:", - "migrate.v2Description": "Овај алат ће безбедно пренети вашу {{source}} ликвидност на В3. Процес је потпуно неповерљив захваљујући <0>Унисвап уговору о миграцији ↗", - "migrate.v2Instruction": "За сваки базен приказан испод, кликните на мигрира да бисте уклонили своју ликвидност из Унисвап В2 и депоновали је у Унисвап В3.", - "migrate.v2Title": "Пренесите В2 ликвидност", - "migrate.v3Price": "В3 {{sym}} Цена:", - "mint.v3.input.invalidPrice.error": "Неважећи унос цене", - "mobileAppPromo.banner.getTheApp.link": "Преузмите апликацију Унисвап Валлет", - "mobileAppPromo.banner.title": "Унисвап: Црипто & НФТ Валлет", - "moonpay.poweredBy": "Фиат онрамп поверед би МоонПаи УСА ЛЛЦ", - "nav.createAccount.button": "Креирајте налог", - "nav.logIn.button": "Пријавите се", - "nav.logInOrConnect.title": "Log in or connect", - "nav.products.tradingApi": "Integrate the protocol", - "nav.products.unichain": "The DeFi chain", - "nav.products.uniswapX": "The meta-aggregator", - "nav.products.wallet": "Swap, store, explore", - "nav.signUp.button": "Региструјте се", - "nav.tabs.createPosition": "Креирајте позицију", - "nav.tabs.viewPositions": "View positions", - "network.lostConnection": "Можда сте изгубили мрежну везу.", - "network.mightBeDown": "{{network}} можда тренутно не ради или сте можда изгубили мрежну везу.", - "network.warning": "Мрежно упозорење", - "nft.noPools": "Још нема базена", - "nft.reportSpam": "Пријави као спам", - "notFound.oops": "Упс, врати ме у Свап", - "notice.uk": "Ова веб апликација је обезбеђена као алат за интеракцију корисника са Унисвап протоколом на сопствену иницијативу, без одобрења или препоруке активности трговања криптовалутама. Чинећи то, Унисвап не препоручује корисницима или потенцијалним корисницима да се баве трговином криптоактивом, а корисници или потенцијални корисници веб апликације не би требало да сматрају ову веб страницу или њен садржај као било какав облик препоруке, позива или подстицања да се баве криптоактивом .", - "notice.uk.label": "УК одрицање одговорности:", - "notification.assetVisibility.hidden": "{{assetName}} скривено", - "notification.assetVisibility.unhidden": "{{assetName}} нескривено", - "notification.buy.network": "Buying on {{network}}", - "notification.copied.address": "Адреса је копирана", - "notification.copied.calldata": "Подаци о позиву су копирани", - "notification.copied.contractAddress": "Адреса уговора је копирана", - "notification.copied.failed": "Копирање у међуспремник није успело", - "notification.copied.image": "Слика је копирана", - "notification.copied.linkUrl": "Link copied", - "notification.copied.nftUrl": "НФТ УРЛ је копиран", - "notification.copied.poolId": "Pool ID copied", - "notification.copied.tokenUrl": "УРЛ токена је копиран", - "notification.copied.transactionId": "ИД трансакције је копиран", - "notification.copied.unitag": "Корисничко име копирано", - "notification.countryChange": "Пребачено на {{countryName}}", - "notification.limit.network": "Creating limit order on {{network}}", - "notification.lp.network": "Providing liquidity on {{network}}", - "notification.network.changed": "Пребачено на {{network}}", - "notification.passwordChanged": "лозинка промењена", - "notification.poolFinder.network": "Search for pool on {{network}}", - "notification.restore.success": "Новчаник обновљен!", - "notification.sell.network": "Selling on {{network}}", - "notification.send.network": "Слање на {{network}}", - "notification.smartWallet.disabled": "Disabled on 1 network", - "notification.smartWallet.disabled.all": "Smart wallet disabled", - "notification.smartWallet.disabled.plural": "Disabled on {{amount}} networks", - "notification.spam.NFT.failed": "Could not report NFT. Try again later.", - "notification.spam.NFT.successful": "Пријављено", - "notification.swap.network": "Замена на {{network}}", - "notification.swap.pending.swap": "Замена је на чекању", - "notification.swap.pending.unwrap": "Одмотавање је на чекању", - "notification.swap.pending.wrap": "Замотавање на чекању", - "notification.transaction.approve.canceled": "Отказано {{currencySymbol}} одобрење.", - "notification.transaction.approve.fail": "Одобрење {{currencySymbol}} за коришћење са {{address}}није успело.", - "notification.transaction.approve.success": "Одобрено {{currencySymbol}} за употребу са {{address}}.", - "notification.transaction.pending": "Трансакција је на чекању", - "notification.transaction.swap.canceled": "Отказано {{inputCurrencySymbol}}-{{outputCurrencySymbol}} замена.", - "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} за {{outputCurrencyAmountWithSymbol}} замена је истекла.", - "notification.transaction.swap.fail": "Замена {{inputCurrencyAmountWithSymbol}} за {{outputCurrencyAmountWithSymbol}}није успела.", - "notification.transaction.swap.success": "Замењено {{inputCurrencyAmountWithSymbol}} за {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.transfer.canceled": "Отказано {{tokenNameOrAddress}} слање", - "notification.transaction.transfer.fail": "Слање {{tokenNameOrAddress}} на {{walletNameOrAddress}} није успело", - "notification.transaction.transfer.received": "Примљено {{tokenNameOrAddress}} од {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "Послато {{tokenNameOrAddress}} на {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "Трансакција са {{addressOrEnsName}}није успела", - "notification.transaction.unknown.fail.short": "трансакција није успела", - "notification.transaction.unknown.success.full": "Трансакција са {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "Трансакција потврђена", - "notification.transaction.unwrap.canceled": "Отказано {{inputCurrencySymbol}} одмотавање.", - "notification.transaction.unwrap.fail": "Отмотавање {{inputCurrencyAmountWithSymbol}}није успело.", - "notification.transaction.unwrap.success": "Отпакован {{inputCurrencyAmountWithSymbol}} и примљен {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.canceled": "Отказано {{inputCurrencySymbol}} премотавање.", - "notification.transaction.wrap.fail": "Премотавање {{inputCurrencyAmountWithSymbol}}није успело.", - "notification.transaction.wrap.success": "Умотао {{inputCurrencyAmountWithSymbol}} и примио {{outputCurrencyAmountWithSymbol}}.", - "notification.transfer.pending": "Слање на чекању", - "notification.walletConnect.confirmed": "Трансакција је потврђена са {{dappName}}", - "notification.walletConnect.connected": "Повезан", - "notification.walletConnect.disconnected": "Дисцоннецтед", - "notification.walletConnect.failed": "Трансакција није успела са {{dappName}}", - "notification.walletConnect.networkChanged.full": "Пребачено на {{networkName}}", - "notification.walletConnect.networkChanged.short": "Комутиране мреже", - "notifications.scantastic.subtitle": "Наставите на Унисвап Ектенсион", - "notifications.scantastic.title": "Успех!", - "onboarding.backup.manual.banner": "Предлажемо да ово напишете на папир и складиштите га на сигурном месту, попут сефа.", - "onboarding.backup.manual.displayWarning.description": "Пажљиво прочитајте следеће пре него што наставите.", - "onboarding.backup.manual.displayWarning.note.access": "Ова фраза за опоравак вам даје потпуни приступ вашем новчанику и средствима", - "onboarding.backup.manual.displayWarning.note.secure": "Погледајте ово приватно и не делите ни са ким", - "onboarding.backup.manual.displayWarning.note.storage": "Запишите га и чувајте на сигурном месту", - "onboarding.backup.manual.displayWarning.title": "Неке важне ствари које треба знати", - "onboarding.backup.manual.error": "Неважећа или погрешно написана реч", - "onboarding.backup.manual.placeholder": "Тајна реч", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} завршено", - "onboarding.backup.manual.selectedWordPlaceholder": "Изаберите реч", - "onboarding.backup.manual.subtitle_one": "Која је {{count}}прва реч у вашој фрази за опоравак?", - "onboarding.backup.manual.subtitle_two": "Која је {{count}}нд реч у вашој фрази за опоравак?", - "onboarding.backup.manual.subtitle_few": "Која је {{count}}рд реч у вашој фрази за опоравак?", - "onboarding.backup.manual.subtitle_other": "Која је {{count}}та реч у вашој фрази за опоравак?", - "onboarding.backup.manual.title": "Хајде да се уверимо да сте то исправно снимили", - "onboarding.backup.option.badge.quick": "Брзо", - "onboarding.backup.option.cloud.description": "Направите резервну копију свог новчаника путем {{cloudProviderName}}, заштићено лозинком за опоравак.", - "onboarding.backup.option.cloud.title": "Поставите лозинку за опоравак", - "onboarding.backup.option.manual.description": "Запишите својих 12 тајних речи на папир и чувајте их на сигурном месту.", - "onboarding.backup.option.manual.title": "Запишите своју фразу за опоравак", - "onboarding.backup.reminder.backupNowButton": "Back up now", - "onboarding.backup.reminder.remindMeLaterButton": "Remind me later", - "onboarding.backup.reminder.title": "Направите резервну копију свог новчаника", - "onboarding.backup.reminder.warning.description": "Back up your wallet so you can recover your assets if you ever lose your phone or get a new one.", - "onboarding.backup.reminder.warning.fundsLabel": "Funds at risk", - "onboarding.backup.reminder.warning.title": "Можете изгубити своја средства", - "onboarding.backup.speedBump.cloud.description": "Ако га икада заборавите, не можемо га ресетовати за вас. Запишите га на сигурном месту или га чувајте безбедно у менаџеру лозинки.", - "onboarding.backup.speedBump.cloud.disclaimer": "Разумем да Унисвап Лабс не може да ресетује моју лозинку за опоравак.", - "onboarding.backup.speedBump.cloud.title": "Важно је сачувати ову лозинку", - "onboarding.backup.speedBump.manual.description": "Уверите се да сте тачно записали фразу за опоравак и имате безбедно место за њено чување.", - "onboarding.backup.speedBump.manual.disclaimer": "Разумем да Унисвап Лабс не може да врати мој новчаник ако изгубим ово.", - "onboarding.backup.speedBump.manual.title": "Пре него што завршите...", - "onboarding.backup.subtitle": "Овако ћете вратити свој новчаник ако обришете апликацију или изгубите уређај.", - "onboarding.backup.title.existing": "Направите резервну копију свог новчаника", - "onboarding.backup.title.new": "Изаберите метод резервне копије", - "onboarding.backup.view.subtitle.message1": "Пажљиво прочитајте следеће пре него што наставите", - "onboarding.backup.view.subtitle.message2": "Мораћете да унесете свих 12 ових тајних речи да бисте повратили новчаник.", - "onboarding.backup.view.title": "Запишите своју фразу за опоравак", - "onboarding.backup.view.warning.message1": "Ова фраза за опоравак вам даје потпуни приступ вашем новчанику и средствима", - "onboarding.backup.view.warning.message2": "Запишите га и чувајте на сигурном месту", - "onboarding.backup.view.warning.message3": "Погледајте ово приватно и не делите ни са ким", - "onboarding.cloud.confirm.description": "Биће вам потребно да унесете ово да бисте вратили своја средства. Ако икада заборавите, не можемо га вратити за вас.", - "onboarding.cloud.confirm.title": "Потврдите своју лозинку за опоравак", - "onboarding.cloud.createPassword.description": "Биће вам потребно да унесете ово да бисте вратили своја средства. Ако икада заборавите, не можемо га вратити за вас.", - "onboarding.cloud.createPassword.title": "Креирајте своју лозинку за опоравак", - "onboarding.complete.button": "Отворите Унисвап Ектенсион", - "onboarding.complete.description": "Ваш новчаник је спреман за слање и примање криптовалута. Отворите Унисвап проширење помоћу пречице испод.", - "onboarding.complete.go_to_uniswap": "Идите на Унисвап Веб Апп", - "onboarding.complete.pin.description": "Кликните на икону чиоде да бисте додали Унисвап Ектенсион на своју траку са алаткама.", - "onboarding.complete.pin.title": "Пин Унисвап Ектенсион", - "onboarding.complete.title": "Све је спремно", - "onboarding.extension.biometrics.subtitle.fingerprint": "Access your wallet quickly and securely using just your fingerprint.", - "onboarding.extension.biometrics.title": "Омогући {{biometricsMethod}}", - "onboarding.extension.password.subtitle": "Ово ће вам требати да бисте откључали новчаник и приступили фрази за опоравак", - "onboarding.extension.password.title.default": "Направите лозинку", - "onboarding.extension.password.title.reset": "Ресетујте вашу лозинку", - "onboarding.extension.unsupported.android.description": "Унисвап Ектенсион је компатибилан само са Цхроме-ом на рачунару.", - "onboarding.extension.unsupported.android.title": "Цхроме на мобилном уређају није подржан (још)", - "onboarding.extension.unsupported.description": "Унисвап Ектенсион је тренутно компатибилан само са Цхроме-ом.", - "onboarding.extension.unsupported.title": "Овај прегледач није подржан (још)", - "onboarding.home.intro.backup.description.extension": "Save your recovery phrase to ensure you never lose access to your wallet.", - "onboarding.home.intro.backup.description.mobile": "Set up a recovery plan if you ever lose your phone or get a new one.", - "onboarding.home.intro.backup.title": "Направите резервну копију свог новчаника", - "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK, and JUP — now available on Unichain", - "onboarding.home.intro.bridgedAssets.title": "Trade new tokens on Unichain", - "onboarding.home.intro.fund.description": "Финансирајте свој новчаник куповином криптовалута или трансфером са другог налога.", - "onboarding.home.intro.fund.title": "Узмите свој први токен", - "onboarding.home.intro.label.required": "Обавезно", - "onboarding.home.intro.label.swipe": "Превуците", - "onboarding.home.intro.pushNotifications.description": "Get price alerts on your favorite tokens, market trends, and more.", - "onboarding.home.intro.pushNotifications.title": "Stay in the know", - "onboarding.home.intro.unitag.description": "Направите персонализовани веб3 профил и лако поделите своју адресу са пријатељима.", - "onboarding.home.intro.unitag.title": "Затражите своје {{unitagDomain}} корисничко име", - "onboarding.import.error.invalidWords_one": "1 реч је неважећа или погрешно написана", - "onboarding.import.error.invalidWords_other": "{{count}} речи су неважеће или погрешно написане", - "onboarding.import.method.restore.message.android": "Add wallets you’ve backed up to your Google Drive account.", - "onboarding.import.method.restore.message.ios": "Add wallets you’ve backed up to your iCloud account.", - "onboarding.import.method.restore.title": "Вратите новчаник", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.android": "Input your recovery password to restore your wallet via Google Drive backup.", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.ios": "Input your recovery password to restore your wallet via iCloud backup.", - "onboarding.import.method.restoreSeedPhrase.cloud.title.android": "Вратите са Гоогле диска", - "onboarding.import.method.restoreSeedPhrase.cloud.title.ios": "Вратите са иЦлоуд-а", - "onboarding.import.method.restoreSeedPhrase.title": "Select how to restore your wallet", - "onboarding.import.method.restoreSeedPhrase.wallet.desc": "Input your 12 secret words that you previously stored in a safe place.", - "onboarding.import.method.restoreSeedPhrase.wallet.title": "Enter recovery phrase", - "onboarding.import.method.viewPrivateKeys.button.desc": "View your private key", - "onboarding.import.method.viewPrivateKeys.title": "Don’t have any of the above? ", - "onboarding.import.onDeviceRecovery.other_options": "Направите или увезите други новчаник", - "onboarding.import.onDeviceRecovery.other_options.label": "Не желите ништа од горе наведеног?", - "onboarding.import.onDeviceRecovery.subtitle": "Изаберите у који новчаник желите да се поново пријавите.", - "onboarding.import.onDeviceRecovery.title": "Добродошли назад у Унисвап", - "onboarding.import.onDeviceRecovery.wallet.button": "Прикажи фразу за опоравак", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 други новчаник", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} други новчаници", - "onboarding.import.onDeviceRecovery.warning.caption": "Please ensure you have backed up all of the other wallets. If you ever want to restore them, you’ll need their recovery phrases or corresponding {{cloudProvider}} backups.", - "onboarding.import.onDeviceRecovery.warning.title": "Јеси ли сигуран?", - "onboarding.import.selectMethod.errorMessage": "An unexpected error occurred. Please try again.", - "onboarding.import.selectMethod.mobileApp.subtitle": "Import a wallet from the mobile app via QR code.", - "onboarding.import.selectMethod.mobileApp.title": "Use Uniswap Mobile", - "onboarding.import.selectMethod.passkey.subtitle": "Sync your Uniswap wallet using an existing passkey.", - "onboarding.import.selectMethod.passkey.title": "Log in with passkey", - "onboarding.import.selectMethod.recoveryPhrase.subtitle": "Import from another crypto wallet.", - "onboarding.import.selectMethod.recoveryPhrase.title": "Enter recovery phrase", - "onboarding.import.selectMethod.title": "Log in or import a wallet", - "onboarding.import.title": "Изаберите како желите да додате свој новчаник", - "onboarding.importMnemonic.button.default": "Моја фраза за опоравак је 12 речи", - "onboarding.importMnemonic.button.importing": "Увоз у току...", - "onboarding.importMnemonic.button.longPhrase": "Моја фраза за опоравак је дужа", - "onboarding.importMnemonic.error.invalidPhrase": "Фраза коју сте унели је неважећа", - "onboarding.importMnemonic.subtitle": "Унесите или налепите фразу за опоравак од 12 речи", - "onboarding.importMnemonic.title": "Унесите своју фразу за опоравак", - "onboarding.importPasskey.bringWindowToFront": "Bring window to front", - "onboarding.importPasskey.continueInSecureWindow": "Continue in the secure sign-in window.", - "onboarding.intro.button.alreadyHave": "Већ имам новчаник", - "onboarding.intro.button.logInOrImport": "Log in or import", - "onboarding.intro.mobileScan.button": "Скенирајте КР код за увоз", - "onboarding.intro.mobileScan.title": "Имате Унисвап апликацију?", - "onboarding.landing.button.add": "Додајте постојећи новчаник", - "onboarding.landing.button.create": "Направите новчаник", - "onboarding.landing.button.createAccount": "Create an account", - "onboarding.name.choose": "Choose a username", - "onboarding.name.choose.subtitle": "This is a public name anyone can use to send you crypto.", - "onboarding.notification.permission.message": "Да бисте примали обавештења, укључите обавештења за Унисвап новчаник у подешавањима уређаја.", - "onboarding.notification.permission.title": "Дозвола за обавештења", - "onboarding.notification.subtitle": "Stay updated on transaction statuses and major price changes for favorite tokens.", - "onboarding.notification.title": "Turn on notifications", - "onboarding.passkey.create": "Create your passkey", - "onboarding.passkey.loading.subtitle": "This should take just a sec.", - "onboarding.passkey.loading.title": "Finding your wallet...", - "onboarding.passkey.secure": "Secure your account", - "onboarding.passkey.secure.description": "Passkeys allow you to quickly and securely access your account using just your face or fingerprint.", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "Хајде да потврдимо да је тачно. Ако изгубите или запишете погрешно, нећете моћи да вратите своја средства.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "Ако изгубите или запишете погрешно, нећете моћи да вратите своја средства.", - "onboarding.recoveryPhrase.confirm.title": "Хајде да потврдимо да је тачно", - "onboarding.recoveryPhrase.view.subtitle": "Мораћете да унесете свих 12 ових тајних речи да бисте повратили новчаник.", - "onboarding.recoveryPhrase.view.title": "Запишите своју фразу за опоравак", - "onboarding.recoveryPhrase.view.title.hasPassword": "Ако икада заборавите своју лозинку...", - "onboarding.recoveryPhrase.warning.final.button": "спреман сам", - "onboarding.recoveryPhrase.warning.final.message": "Ваша фраза за опоравак је оно што вама (и свима који га имају) даје приступ вашим средствима. Обавезно га задржите за себе.", - "onboarding.recoveryPhrase.warning.final.title": "Урадите овај корак на приватном месту", - "onboarding.recoveryPhrase.warning.screenshot.message": "Свако ко добије приступ вашим фотографијама може приступити вашем новчанику. Препоручујемо да уместо тога запишете своје речи.", - "onboarding.recoveryPhrase.warning.screenshot.title": "Снимци екрана нису безбедни", - "onboarding.resetPassword.complete.safety": "Сазнајте више о безбедности новчаника", - "onboarding.resetPassword.complete.subtitle": "Користите своју нову лозинку за откључавање новчаника.", - "onboarding.resetPassword.complete.title": "Ресетовање лозинке", - "onboarding.scan.error": "There was an error loading the QR code", - "onboarding.scan.otp.error": "Код који сте послали је нетачан или је дошло до грешке при слању. Молим вас, покушајте поново.", - "onboarding.scan.otp.failed": "Неуспели покушаји: {{number}}", - "onboarding.scan.otp.subtitle": "Проверите у својој Унисвап мобилној апликацији код од 6 знакова", - "onboarding.scan.otp.title": "Унесите једнократни код", - "onboarding.scan.subtitle": "Скенирајте КР код помоћу мобилне апликације Унисвап да бисте почели да увозите новчаник.", - "onboarding.scan.title": "Увезите новчаник из апликације", - "onboarding.scan.troubleScanning.message": "Import via recovery phrase", - "onboarding.scan.troubleScanning.title": "Trouble scanning?", - "onboarding.scan.wifi": "Повежите телефон на исту ВиФи мрежу као и рачунар.", - "onboarding.security.alert.biometrics.message.android": "To use biometrics, set it up first in settings", - "onboarding.security.alert.biometrics.message.ios": "Да бисте користили {{biometricsMethod}}, дозволите приступ у системским поставкама", - "onboarding.security.alert.biometrics.title.android": "Биометрија је онемогућена", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} је онемогућен", - "onboarding.security.button.confirm.android": "Омогући биометрију", - "onboarding.security.button.confirm.ios": "Омогући {{biometricsMethod}}", - "onboarding.security.button.setup": "Подесити", - "onboarding.security.subtitle.android": "Додајте додатни ниво сигурности тако што ћете захтевати биометрију за слање трансакција.", - "onboarding.security.subtitle.ios": "Додајте додатни ниво сигурности тако што ћете захтевати {{biometricsMethod}} за слање трансакција.", - "onboarding.security.title": "Заштитите свој новчаник", - "onboarding.selectWallets.error": "Учитавање адреса није успело", - "onboarding.selectWallets.title.default": "Изаберите новчанике за увоз", - "onboarding.selectWallets.title.error": "Грешка при увозу новчаника", - "onboarding.termsOfService": "Ако наставим, прихватам Услове коришћења услуге и сагласан сам са Политиком приватности", - "onboarding.tooltip.recoveryPhrase.trigger": "Шта је фраза за опоравак?", - "onboarding.wallet.continue": "Чувајмо га", - "onboarding.wallet.defaultName": "Новчаник {{number}}", - "onboarding.wallet.description.full": "Ово је ваш лични простор за токене, НФТ и све ваше трговине. Завршите подешавање да бисте заштитили своја средства.", - "onboarding.wallet.title": "Добродошли у свој нови новчаник", - "onboarding.welcome.subtitle": "Let’s finish setting up your wallet.", - "onboarding.welcome.title": "Welcome!", - "outageBanner.message": "{{chainName}}{{versionDescription}} data is unavailable right now, but we expect the issue to be resolved shortly.", - "outageBanner.message.sub": "И даље можете без проблема заменити и обезбедити ликвидност у овом ланцу.", - "outageBanner.title": "{{versionName}} ће се ускоро вратити", - "passkeys.help.modal.subtitle": "If you’re having trouble with passkeys, visit Uniswap Support for help.", - "passkeys.help.modal.subtitle.invalidPasskey": "Your request could not be completed. Please try again using a passkey associated with ", - "passkeys.help.modal.subtitle.technicalError": "Your request could not be completed due to an unexpected technical error. Your funds are safe. Please try again.", - "passkeys.help.modal.title": "Потребна помоћ?", - "passkeys.help.modal.title.invalidPasskey": "Invalid passkey", - "passkeys.help.modal.title.technicalError": "Technical error", - "passkeys.manage.modal.subtitle": "To add or remove passkeys, please sign in to {{passkeyManagementUrl}}.", - "passkeys.manage.modal.title": "Manage passkeys", - "permit.approval.fail": "Одобрење дозволе није успело", - "permit.approval.fail.message": "Пермит2 омогућава да се одобрења токена деле и управљају у различитим апликацијама.", - "pool.activeRange": "Активни опсег крпеља", - "pool.addAs": "Add as {{nativeWrappedSymbol}}", - "pool.apr": "АПР", - "pool.apr.base": "Base APR", - "pool.apr.description": "Годишње на основу дневних накнада", - "pool.apr.reward": "Reward APR", - "pool.aprText": "Pool APR", - "pool.balances": "Поол биланси", - "pool.closedCTA.description": "You can see them by using the filter at the top of the page.", - "pool.closedCTA.title": "Looking for your closed positions?", - "pool.collectAs": "Сакупите као {{nativeWrappedSymbol}}", - "pool.collectFees": "Прикупите накнаде", - "pool.connectEthereumToView": "Connect an Ethereum wallet to view your pools", - "pool.create": "Креирање новог базена", - "pool.create.info": "Ваши избори створиће нови базен ликвидности што може резултирати нижом почетном ликвидношћу и повећаном волатилношћу. Размислите о додавању у постојећи базен да бисте смањили ове ризике.", - "pool.createdPosition": "Created position", - "pool.createdPosition.canceled": "Create position canceled", - "pool.createdPosition.failed": "Create position failed", - "pool.dynamic": "Dynamic pool", - "pool.earnings": "Earnings", - "pool.earnings.empty": "You have no earnings yet", - "pool.explorers": "Истраживачи", - "pool.import": "Увозни базен", - "pool.import.link.description": "Some v2 positions aren’t displayed automatically.", - "pool.import.positions.v2": "Import V2 positions", - "pool.import.positions.v2.selectPair.description": "Some v2 positions aren’t displayed automatically. Select a token pair to import and view your positions.", - "pool.import.success": "Pool imported", - "pool.incentives.administeredRewards": "Rewards are distributed by the autonomous Merkl Distributor contract.", - "pool.incentives.collect": "Цоллецт", - "pool.incentives.collectedRewards": "Collected rewards", - "pool.incentives.collectFailed": "Collect failed, please try again.", - "pool.incentives.collectFailedNoRetry": "Collecting rewards failed.", - "pool.incentives.collectingRewards": "Collecting rewards", - "pool.incentives.collectRewards": "Collect rewards", - "pool.incentives.collectRewardsCanceled": "Collect rewards canceled", - "pool.incentives.daysLeft": "days left", - "pool.incentives.eligible": "Eligible pools have token rewards so you can earn more", - "pool.incentives.merklDocs": "Calculated by Merkl from emission rewards and pool TVL.", - "pool.incentives.rewardsDistribution": "Rewards distribution", - "pool.incentives.rewardsEarned": "Rewards earned", - "pool.incentives.similarPoolHasRewards": "A similar pool has UNI rewards", - "pool.incentives.switchPools": "Switch pools", - "pool.incentives.timePeriod": "Time period", - "pool.incentives.uni.findMore": "Find pools with UNI rewards", - "pool.incentives.yourRewards.error": "Your rewards are unavailable right now", - "pool.incentives.yourRewards.error.description": "Rewards couldn’t be retrieved. This might be due to a network issue. Try reloading the page.", - "pool.info": "Pool info", - "pool.limitFluctuation.warning": "Имајте на уму да се извршење ограничења може разликовати у зависности од флуктуација тржишта у реалном времену и загушења Етхереум мреже. Ограничења се можда неће извршити тачно када токени достигну наведену цену.", - "pool.liquidity.data.error.message": "There was an error fetching data required for your transaction.", - "pool.liquidity.outOfSync": "Pool and market price mismatch", - "pool.liquidity.outOfSync.message": "The prices in this pool differ with the market prices of the selected tokens. Adjust your price range accordingly or wait for the pool to rebalance to avoid losses.", - "pool.maxPrice": "Мак цена", - "pool.migrateLiquidity": "Мигрисање ликвидности", - "pool.migrateLiquidityDisabledTooltip": "This chain does not support v4 liquidity pools.", - "pool.migrateToV4": "Migrate to v4", - "pool.minPrice": "Мин цена", - "pool.newPosition.plus": "+ Нова позиција", - "pool.newPosition.title": "Нова позиција", - "pool.newSpecificPosition": "Нова {{symbol}} позиција", - "pool.notAvailableOnSolana": "Pools aren’t available on Solana", - "pool.notFound.description": "Sorry, we can’t find any information for this pool. Check the name and address and try again.", - "pool.notFound.title": "Pool not found", - "pool.openToStart.evmAndSolanaConnected": "Open a new position or create a pool to get started. Pools aren’t available on Solana.", - "pool.openToStart.evmOnly": "Отворите нову позицију или креирајте групу да бисте започели.", - "pool.percent": "{{pct}}% базена", - "pool.pooled": "Обједињено {{sym}}:", - "pool.position": "Позиција", - "pool.positions": "Позиције", - "pool.positions.title": "Ваше позиције", - "pool.positions.transaction.settings": "Transaction settings", - "pool.positions.usdValueUnavailable": "USD value unavailable", - "pool.positions.usdValueUnavailable.tooltip": "USD value is currently unavailable for this position. See position details for deposited token amounts.", - "pool.refresh.prices": "Refresh prices", - "pool.removeLiquidity": "Уклоните ликвидност", - "pool.rewardAPR": "Reward APR (UNI)", - "pool.rewardAPR.percent": "{{pct}} reward APR", - "pool.rewards": "Rewards", - "pool.rewardsPool.label": "Токени скупа у фонду награда:", - "pool.selectPair": "Изаберите пар", - "pool.share.label": "Ваш удео у базену:", - "pool.specificPosition": "{{symbol}} позиција", - "pool.tokenPair": "Пар токена", - "pool.top.rewards": "Pools with rewards", - "pool.top.tvl": "Top pools by TVL", - "pool.top.volume": "Pools by 24H volume", - "pool.totalAPR": "Total APR", - "pool.totalTokens": "Ваши укупни токени базена:", - "pool.v2": "в2 базени", - "pool.v3": "в3 базени", - "pool.via": "{{tokenPair}} via {{dex}}", - "pool.volOverTvl": "1Д вол/ТВЛ", - "pool.volume.thirtyDay": "30 day volume", - "pool.volume.thirtyDay.short": "30D vol", - "pool.withdrawAs": "Withdraw as {{nativeWrappedSymbol}}", - "poolFinder.availablePools": "Available pools", - "poolFinder.availablePools.found.description": "v2 pools matching your pair selection.", - "poolFinder.availablePools.notFound.description": "No matching v2 pools found. Double-check your token selection and ensure you’re connected to the correct wallet.", - "pools.explore": "Истражите базене", - "portfolio.activity.filters.timePeriod.all": "Све време", - "portfolio.activity.filters.transactionType.all": "All types", - "portfolio.activity.filters.transactionType.deposits": "Deposits", - "portfolio.activity.filters.transactionType.staking": "Staking", - "portfolio.activity.filters.transactionType.swaps": "Swaps", - "portfolio.activity.title": "Активност", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", - "portfolio.defi.title": "DeFi", - "portfolio.description": "Track your crypto portfolio across all chains and protocols", - "portfolio.nfts.title": "НФТс", - "portfolio.overview.title": "Overview", - "portfolio.title": "Portfolio", - "portfolio.tokens.table.column.allocation": "Allocation", - "portfolio.tokens.table.column.balance": "Balance", - "portfolio.tokens.table.column.change1d": "1D Change", - "portfolio.tokens.table.column.price": "Цена", - "portfolio.tokens.table.column.token": "Токен", - "portfolio.tokens.table.column.value": "Value", - "portfolio.tokens.title": "Токенс", - "position.addHook": "Додајте Хук", - "position.addHook.tooltip": "Хукови су напредна функција која омогућава базенима да интергују са паметним уговорима, отварајући различите могућности. Будите опрезни при додавању хукова, јер неки могу бити злоћудни или изазвати нежељене последице.", - "position.addingHook": "Adding hook", - "position.addingHook.disclaimer": "Adding hooks may have unintended consequences. Do your research and proceed at your own risk.", - "position.addingHook.hideProperties": "Hide properties", - "position.addingHook.invalidAddress": "Enter a valid hook address", - "position.addingHook.viewProperties": "View properties", - "position.create.confirm": "Confirm position", - "position.create.invalidPrice": "Invalid price", - "position.create.invalidRange": "Invalid range", - "position.create.modal.header": "Креирање позиције", - "position.create.unsupportedSolana": "Solana pools are not supported.", - "position.create.unsupportedSolana.description": "To create a pool, switch to a supported EVM chain.", - "position.create.unsupportedToken.description": "Try creating with a different protocol version.", - "position.create.v2unsupportedChain": "This chain is not supported for v2 pools.", - "position.currentValue": "Тренутна вредност позиције", - "position.default_price_strategies": "Price strategies", - "position.default_price_strategies.error": "Unable to set price strategy", - "position.deposit.confirm.create.description.less": "The initial price entered is {{value}}% less than the market price and may result in a loss of funds. Do you wish to proceed?", - "position.deposit.confirm.create.description.more": "The initial price entered is {{value}}% more than the market price and may result in a loss of funds. Do you wish to proceed?", - "position.deposit.confirm.create.title": "Large price difference with market", - "position.deposit.description": "Наведите количине токена за ваш допринос ликвидности.", - "position.depositedCurrency": "Депозитован {{currencySymbol}}", - "position.fot.warning": "{{token}} and other “Fee on transfer” tokens are only supported by Uniswap v2.", - "position.fot.warning.cta": "Create a v2 position", - "position.hook.disclaimer": "I understand the potential risks involved in adding this hook.", - "position.hook.donateWarning": "This flag may result in changes to fees earned.", - "position.hook.liquidityWarning": "This flag can cause the pool to block the addition of new liquidity. Your transaction may revert.", - "position.hook.removeWarning": "May cause your funds to be locked or block you from collecting fees.", - "position.hook.swapWarning": "This flag may allow liquidity providers to more easily leverage Just-In-Time liquidity, which may result in lower fees earned.", - "position.hook.warningHeader": "Important: hook risks identified", - "position.hook.warningInfo": "We’ve identified potential risks with this hook. Please make sure that you understand how this hook works before deciding to proceed.", - "position.increase.fot": "Adding liquidity for {{token}} and other “Fee on Transfer” tokens is not supported.", - "position.initialPrice": "Почетна цена", - "position.initialPrice.difference.negative": "{{ value }}% less than market price", - "position.initialPrice.difference.positive": "{{ value }}% more than market price", - "position.initialPrice.info": "When creating a new pool, you must set the starting exchange rate for both tokens. This rate will reflect the initial market price.", - "position.initialPrice.set": "Set initial price", - "position.initialPrice.useMarketPrice": "Use market price", - "position.migrate.liquidity": "Када мигрирате позиције, не можете променити свој пар токена, али можете додати хук за бољу функционалност.", - "position.migrate.v4unsupportedChain": "This chain is not supported for v4 pools.", - "position.new": "Нова позиција", - "position.new.protocol": "Нова {{protocol}} позиција", - "position.notFound": "Позиција није пронађена", - "position.notFound.description": "Детаљи о овој позицији нису доступни. Проверите да ли сте повезани са тачним новчаником.", - "position.one_sided_lower": "One-sided lower", - "position.one_sided_lower.description": "Supply liquidity if price goes down", - "position.one_sided_upper": "One-sided upper", - "position.one_sided_upper.description": "Supply liquidity if price goes up", - "position.protocol": "{{protocol}} позиција", - "position.provide.liquidity": "Изаберите токене за које желите да обезбедите ликвидност. Можете изабрати токене на свим подржаним мрежама.", - "position.provide.liquidityDescription": "Обезбеђивање ликвидности у пуном опсегу осигурава континуирано учешће на тржишту преко свих могућих цена, нуди једноставност, али и потенцијал за већи привремени губитак.", - "position.provide.liquidityDescription.creatingPool": "Setting full range liquidity when creating a pool ensures continuous market participation across all possible prices, offering simplicity but with potential for higher impermanent loss.", - "position.provide.liquidityDescription.custom": "Custom range allows you to concentrate your liquidity within specific price bounds, enhancing capital efficiency and fee earnings but requiring more active management.", - "position.provide.outOfRange.closePosition": "Close position", - "position.provide.outOfRange.description": "This position’s range cannot be adjusted during migration. To set a new range, close this position and open a new v4 position.", - "position.provide.outOfRange.title": "You’re migrating an out-of range position", - "position.removeHook": "Remove hook", - "position.resetDescription": "Your tokens, price, and range selections will be reset.", - "position.setRange": "Поставите распон цена", - "position.setRange.inputsBelow": "Use the inputs below to set your range.", - "position.stable": "Stable", - "position.stable.description": "Good for stablecoins or low volatility pairs", - "position.step.deposit": "Унесите износе депозита", - "position.step.price": "Set initial price and deposit amounts", - "position.step.range": "Set price range and deposit amounts", - "position.step.select": "Изаберите пар токена и накнаде", - "position.value": "Position value", - "position.valueUnavailable": "USD value is currently unavailable for this position. See position details for deposited token amounts.", - "position.wide": "Wide", - "position.wide.description": "Good for volatile pairs", - "position.wrapped.unwrap": "Unwrap {{wrappedToken}}", - "position.wrapped.warning": "{{nativeToken}} required for v4 pools", - "position.wrapped.warning.info": "Unwrap your {{wrappedToken}} and deposit {{nativeToken}} to provide more cost effective and efficient liquidity.", - "positions.noPositions.description": "You don’t have any liquidity positions. Create a new position to start earning fees and rewards on eligible pools.", - "positions.noPositions.title": "No positions", - "positions.welcome.connect.description": "To view your positions and rewards you must connect your wallet.", - "positions.welcome.connect.wallet": "Connect your wallet", - "privacy.anonymizedLogs": "Апликација бележи анонимну статистику коришћења како би се временом побољшала.", - "privacy.autoRouter": "Апликација преузима оптимални трговачки пут са сервера Унисвап Лабс.", - "privacy.infura": "Апликација преузима податке на ланцу и конструише уговорне позиве помоћу Инфура АПИ-ја.", - "privacy.thirdPartyApis": "Ова апликација користи следеће АПИ-је треће стране:", - "privacy.trm": "Апликација безбедно прикупља адресу вашег новчаника и дели је са ТРМ Лабс Инц. из разлога ризика и усклађености.", - "privacy.uniswaptos": "Услови коришћења услуге Унисвап Лабс", - "privateKeys.export.modal.speedbump.bullet1": "Погледајте ово приватно", - "privateKeys.export.modal.speedbump.bullet2": "Не делите ни са ким", - "privateKeys.export.modal.speedbump.bullet3": "Никада га немојте уносити на било коју веб локацију или апликацију", - "privateKeys.export.modal.speedbump.subtitle": "Anyone who knows your private key can access your wallet and funds.", - "privateKeys.export.modal.speedbump.title": "Пре него што наставите", - "privateKeys.export.modal.subtitle": "It looks like you’re not able to fully restore your wallet. To make sure you never lose access to your funds, copy your private key.", - "privateKeys.export.modal.title": "Export your private key", - "privateKeys.export.modal.warning": "If you lose your phone or delete the app, you’ll need to import this key into a different wallet.", - "privateKeys.view.button.continue": "I copied all of them.", - "privateKeys.view.button.continue.single": "I copied it.", - "privateKeys.view.subtitle": "Your private key grants access to a specific wallet. Each wallet has a different private key.", - "privateKeys.view.title": "Private Key", - "qrScanner.button.connections_one": "Повезана је 1 апликација", - "qrScanner.button.connections_other": "{{count}} апликације повезане", - "qrScanner.error.camera.message": "Да бисте скенирали код, дозволите приступ камери у системским подешавањима", - "qrScanner.error.camera.title": "Камера је онемогућена", - "qrScanner.error.none": "КР код није пронађен", - "qrScanner.recipient.action.scan": "Скенирајте КР код", - "qrScanner.recipient.action.show": "Покажи мој КР код", - "qrScanner.recipient.error.message": "Уверите се да скенирате важећи КР код Етхереум адресе пре него што покушате поново.", - "qrScanner.recipient.error.title": "Неважећи КР код", - "qrScanner.request.message.unavailable": "Није пронађена ниједна порука.", - "qrScanner.request.method.default": "Захтев од {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "Захтев за потпис од {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "Захтев за трансакцију од {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "Дозволити {{dappName}} да користи до {{amount}} {{currencySymbol}}?", - "qrScanner.request.withoutAmount": "Дозволити {{dappName}} да користи ваш {{currencySymbol}}?", - "qrScanner.status.connecting": "Повезивање...", - "qrScanner.status.loading": "Учитавање...", - "qrScanner.title": "Скенирајте КР код", - "qrScanner.wallet.networks": "Supported networks", - "range.outOfView": "Range out of view", - "removeLiquidity.pooled": "Обједињено {{symbol}}:", - "revoke.failed.message": "A network or connection issue likely caused your revoke to fail. Check your connection and try again.", - "routing.aggregateLiquidity": "Када су доступни, обједињује изворе ликвидности за боље цене и размену без гаса.", - "routing.aggregateLiquidity.uniswapx": "UniswapX aggregates liquidity sources on and off-chain, bringing you the best available prices and gas free swaps.", - "routing.cheapest": "Унисвап клијент бира најјефтинију трговинску опцију факторинг цене и мрежних трошкова.", - "routing.cheapest.v4": "The Uniswap client selects the optimal trade option factoring in price and network costs.", - "scantastic.code.expired": "Истекао", - "scantastic.code.subtitle": "Унесите овај код у Унисвап екстензију. Ваша фраза за опоравак ће бити безбедно шифрована и пренета.", - "scantastic.code.timeRemaining.shorthand.hours": "Нови код за {{hours}}х {{minutes}}м {{seconds}}с", - "scantastic.code.timeRemaining.shorthand.minutes": "Нови код за {{minutes}}м {{seconds}}с", - "scantastic.code.timeRemaining.shorthand.seconds": "Нови код за {{seconds}}с", - "scantastic.code.title": "Унисвап једнократни код", - "scantastic.confirmation.button.continue": "Да, настави", - "scantastic.confirmation.label.browser": "Прегледач", - "scantastic.confirmation.label.device": "Уређај", - "scantastic.confirmation.subtitle": "Наставите само ако скенирате КР код са Унисвап Ектенсион-а на поузданом уређају.", - "scantastic.confirmation.title": "Да ли покушавате да увезете новчаник?", - "scantastic.confirmation.warning": "Чувајте се сајтова и апликација које се лажно представљају за Унисвап. У супротном ваш новчаник може бити угрожен.", - "scantastic.error.encryption": "Неуспешно припремање основне фразе.", - "scantastic.error.noCode": "ОТП није примљен. Молим вас, покушајте поново.", - "scantastic.error.timeout.message": "Поново скенирајте КР код на Унисвап екстензију да бисте наставили да синхронизујете новчаник.", - "scantastic.error.timeout.title": "Ваша веза је истекла", - "scantastic.modal.ipMismatch.description": "Да бисте скенирали овај КР код, ваш телефон мора бити повезан на исту ВиФи мрежу као и рачунар и све ВПН-ове треба привремено искључити.", - "scantastic.modal.ipMismatch.title": "Промените своју ВиФи мрежу", - "search.input.placeholder": "Search tokens and pools", - "search.ukDisclaimer": "Одрицање одговорности за становнике Велике Британије", - "send.button.review": "Прегледајте трансфер", - "send.gas.error.title": "Н/А", - "send.gas.networkCost.title": "Трошкови мреже", - "send.input.token.balance.title": "Баланс: {{balance}} {{symbol}}", - "send.recipient.header": "Изаберите примаоца", - "send.recipient.input.placeholder": "Претражите ЕНС или адресу", - "send.recipient.previous_one": "1 претходни трансфер", - "send.recipient.previous_other": "{{count}} претходни трансфери", - "send.recipient.results.empty": "Нема резултата", - "send.recipient.results.error": "Адреса коју сте унели или не постоји или је погрешно написана.", - "send.recipient.section.favorite": "Омиљени новчаници", - "send.recipient.section.recent": "Скорашњи", - "send.recipient.section.search": "Резултати претраге", - "send.recipient.section.viewOnly": "Новчаници само за гледање", - "send.recipient.section.yours": "Ваши новчаници", - "send.recipient.warning.viewOnly.message": "Шаљите средства у овај новчаник само ако имате фразу за опоравак или знате власника новчаника.", - "send.recipient.warning.viewOnly.title": "Ово имате као новчаник само за преглед", - "send.recipientSelect.search.empty.message": "Када пошаљете токене на адресу новчаника, они ће се појавити овде", - "send.recipientSelect.search.empty.title": "Нема сачуваних новчаника", - "send.review.modal.title": "Ви шаљете", - "send.review.summary.button.title": "Потврдите слање", - "send.search.empty.subtitle": "Адреса коју сте унели или не постоји или је погрешно написана.", - "send.search.empty.title": "Нема резултата", - "send.search.placeholder": "Претражите ЕНС или адресу", - "send.solanaSendNotSupported": "Send is not supported on Solana", - "send.title": "Пошаљи", - "send.unavailableOnSolana.message": "Sending is not available on Solana wallets", - "send.warning.blocked.default": "Овај новчаник је блокиран", - "send.warning.blocked.modal.message": "Ова адреса је блокирана на Унисвап новчанику јер је повезана са једном или више блокираних активности. Ако сматрате да је ово грешка, пошаљите емаил на цомплианце@унисвап.орг.", - "send.warning.blocked.modal.title": "Блокирана адреса", - "send.warning.blocked.recipient": "Новчаник примаоца је блокиран", - "send.warning.erc20.checkbox.description": "You are attempting to send funds to a token address. This may result in a permanent loss of funds.", - "send.warning.erc20.checkbox.heading": "Token address detected", - "send.warning.erc20.message": "Покушавате да пошаљете средства на адресу токена. Слање криптовалута на ову врсту адресе може довести до трајног губитка средстава.", - "send.warning.erc20.title": "Ово је токен адреса", - "send.warning.insufficientFunds.message": "Ваше {{currencySymbol}} стање се смањило откако сте унели износ који желите да пошаљете", - "send.warning.insufficientFunds.title": "Није довољно {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "Нема довољно {{currencySymbol}} на {{networkName}} за слање", - "send.warning.insufficientGas.message.withoutNetwork": "Није довољно {{currencySymbol}} за слање", - "send.warning.modal.button.cta.blocking": "У реду", - "send.warning.modal.button.cta.cancel": "Поништити, отказати", - "send.warning.modal.button.cta.confirm": "Потврди", - "send.warning.newAddress.details.ENS": "ЕНС", - "send.warning.newAddress.details.username": "Корисничко име", - "send.warning.newAddress.details.walletAddress": "Адреса новчаника", - "send.warning.newAddress.message": "Нисте раније обављали трансакције са овом адресом. Потврдите да је адреса тачна пре него што наставите.", - "send.warning.newAddress.title": "Нова адреса", - "send.warning.self.message": "Покушавате да пошаљете средства у свој тренутни новчаник. Слање криптовалута на ову адресу ће изазвати непотребне мрежне трошкове.", - "send.warning.self.title": "Ово је ваш тренутни новчаник", - "send.warning.smartContract.message": "You’re about to send funds to a smart contract address. Make sure this is the correct address and that it can receive tokens. If not, this may result in a permanent loss of funds.", - "send.warning.smartContract.title": "This is a smart contract address", - "send.warning.viewOnly.message": "Морате да увезете овај новчаник преко фразе за опоравак да бисте послали средства.", - "send.warning.viewOnly.title": "Овај новчаник је само за преглед", - "send.youAreSending": "Ви шаљете", - "sendRecipientForm.recentAddresses.label": "Недавно", - "sendReviewModal.title": "Пошаљите преглед", - "setting.recoveryPhrase.account.show": "Прикажи фразу за опоравак", - "setting.recoveryPhrase.action.hide": "Сакриј фразу за опоравак", - "setting.recoveryPhrase.remove": "Уклони фразу за опоравак", - "setting.recoveryPhrase.remove.confirm.subtitle": "Разумем да Унисвап Лабс не може да ми помогне да повратим новчаник ако то не учиним.", - "setting.recoveryPhrase.remove.confirm.title": "Сачувао сам своју фразу за опоравак", - "setting.recoveryPhrase.remove.initial.subtitle": "Уверите се да сте сачували фразу за опоравак. У супротном ћете изгубити приступ својим новчаницима", - "setting.recoveryPhrase.remove.initial.title": "Пре него што наставите", - "setting.recoveryPhrase.remove.subtitle": "Унесите лозинку за потврду", - "setting.recoveryPhrase.remove.title": "Уклањате своју фразу за опоравак", - "setting.recoveryPhrase.view.warning.message1": "Свако ко зна вашу фразу за опоравак може приступити вашем новчанику и средствима", - "setting.recoveryPhrase.view.warning.message2": "Погледајте ово приватно", - "setting.recoveryPhrase.view.warning.message3": "Не делите ни са ким", - "setting.recoveryPhrase.view.warning.message4": "Никада га немојте уносити на било коју веб локацију или апликацију", - "setting.recoveryPhrase.view.warning.title": "Пре него што наставите", - "setting.recoveryPhrase.warning.view.message": "Свако ко зна вашу фразу за опоравак може приступити вашем новчанику и средствима.", - "setting.recoveryPhrase.warning.view.title": "Погледајте ово на приватном месту", - "settings.action.enableInSettings": "Enable in Settings", - "settings.action.feedback": "Пошаљи повратне информације", - "settings.action.help": "Нађи помоћ", - "settings.action.lock": "Закључајте новчаник", - "settings.action.privacy": "Правила о приватности", - "settings.action.terms": "Услови коришћења", - "settings.connectWalletPlatform.warning": "To use Uniswap on {{platform}}, connect to a wallet that supports {{platform}}.", - "settings.footer": "Направљен с љубављу, \nУнисвап тим 🦄", - "settings.hideSmallBalances": "Сакријте мале биланце", - "settings.hideSmallBalances.subtitle": "Balances under 1 USD will be hidden from your portfolio.", - "settings.maxSlippage": "Макс. проклизавање", - "settings.maxSlippage.amount": "{{amount}} max. slippage", - "settings.section.about": "О томе", - "settings.section.preferences": "Преференцес", - "settings.section.privacyAndSecurity": "Privacy and security", - "settings.section.support": "Подршка", - "settings.section.wallet.hidden.row.title": "{{numHidden}} other wallets", - "settings.setting.advanced.title": "Advanced", - "settings.setting.advancedSettings": "Advanced settings", - "settings.setting.appearance.option.auto": "Ауто", - "settings.setting.appearance.option.dark.subtitle": "Always use dark theme.", - "settings.setting.appearance.option.dark.title": "Dark", - "settings.setting.appearance.option.device.subtitle": "Adapts to your device’s settings.", - "settings.setting.appearance.option.device.title": "Ауто", - "settings.setting.appearance.option.light.subtitle": "Always use light theme.", - "settings.setting.appearance.option.light.title": "Light", - "settings.setting.appearance.title": "Тема", - "settings.setting.backup.create.description": "Постављање лозинке ће шифровати резервну копију фразе за опоравак, додајући додатни ниво заштите ако ваш {{cloudProviderName}} налог икада буде компромитован.", - "settings.setting.backup.create.title": "Направите резервну копију на {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "Пошто ови новчаници деле фразу за опоравак, такође ће избрисати резервне копије за ове новчанике испод", - "settings.setting.backup.delete.confirm.title": "Јеси ли сигуран?", - "settings.setting.backup.delete.warning": "Ако избришете резервну копију {{cloudProviderName}} , моћи ћете да опоравите свој новчаник само помоћу ручне резервне копије фразе за опоравак. Унисвап Лабс не може да поврати ваша средства ако изгубите фразу за опоравак.", - "settings.setting.backup.error.message.full": "Није могуће направити резервну копију фразе за опоравак на {{cloudProviderName}}. Уверите се да сте омогућили {{cloudProviderName}} са доступним меморијским простором и покушајте поново.", - "settings.setting.backup.error.message.short": "Није могуће избрисати резервну копију", - "settings.setting.backup.error.title": "{{cloudProviderName}} грешка", - "settings.setting.backup.modal.description": "Још увек нисте направили резервну копију фразе за опоравак на {{cloudProviderName}} . На тај начин можете опоравити свој новчаник тако што ћете бити пријављени на {{cloudProviderName}} на било ком уређају.", - "settings.setting.backup.modal.title": "Направите резервну копију фразе за опоравак на {{cloudProviderName}}?", - "settings.setting.backup.password.error.mismatch": "Лозинке се не поклапају", - "settings.setting.backup.password.medium": "Ово је средња лозинка", - "settings.setting.backup.password.placeholder.confirm": "Потврди лозинку", - "settings.setting.backup.password.placeholder.create": "Направите лозинку", - "settings.setting.backup.password.strong": "Ово је јака лозинка", - "settings.setting.backup.password.weak": "Ово је слаба лозинка", - "settings.setting.backup.recoveryPhrase.label": "Фраза за опоравак", - "settings.setting.backup.selected": "{{cloudProviderName}} резервна копија", - "settings.setting.backup.status.action.delete": "Избришите резервну копију", - "settings.setting.backup.status.complete": "Направљена је резервна копија на {{cloudProviderName}}", - "settings.setting.backup.status.description": "Ако направите резервну копију ваше фразе за опоравак на {{cloudProviderName}}, можете опоравити свој новчаник тако што ћете бити пријављени на свој {{cloudProviderName}} налог на било ком уређају.", - "settings.setting.backup.status.inProgress": "Прави се резервна копија на {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "Подржано", - "settings.setting.backup.status.title": "{{cloudProviderName}} резервна копија", - "settings.setting.beta.tooltip": "Долази ускоро", - "settings.setting.biometrics.appAccess.subtitle.android": "Require face/fingerprint to open the app.", - "settings.setting.biometrics.appAccess.subtitle.ios": "Require {{biometricsMethod}} to open app.", - "settings.setting.biometrics.appAccess.title": "Приступ апликацији", - "settings.setting.biometrics.auth": "Молимо потврдите аутентичност", - "settings.setting.biometrics.extension.waitingForBiometricsModal.content": "Enable {{biometricsMethod}} in your browser or system settings to continue.", - "settings.setting.biometrics.extension.waitingForBiometricsModal.title": "Waiting for {{biometricsMethod}}", - "settings.setting.biometrics.off.message.android": "Биометрија је тренутно искључена за Унисвап новчаник—можете да је укључите у подешавањима система.", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} је тренутно искључен за Унисвап новчаник—можете га укључити у подешавањима система.", - "settings.setting.biometrics.off.title.android": "Биометрија је искључена", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} је искључено", - "settings.setting.biometrics.title": "Face/Fingerprint unlock", - "settings.setting.biometrics.transactions.subtitle.android": "Require face/fingerprint to transact.", - "settings.setting.biometrics.transactions.subtitle.ios": "Require {{biometricsMethod}} to transact.", - "settings.setting.biometrics.transactions.title": "Трансакције", - "settings.setting.biometrics.unavailable.message.android": "Биометрија није подешена на вашем уређају. Да бисте користили биометрију, прво је подесите у подешавањима.", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} није подешен на вашем уређају. Да бисте користили {{biometricsMethod}}, прво га подесите у подешавањима.", - "settings.setting.biometrics.unavailable.title.android": "Биометрија није подешена", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} није подешен", - "settings.setting.biometrics.warning.message.android": "Ако не укључите биометрију, свако ко добије приступ вашем уређају може да отвори Унисвап новчаник и изврши трансакције.", - "settings.setting.biometrics.warning.message.ios": "Ако не укључите {{biometricsMethod}}, свако ко добије приступ вашем уређају може да отвори Унисвап новчаник и изврши трансакције.", - "settings.setting.biometrics.warning.title": "Јеси ли сигуран?", - "settings.setting.connections.disconnectAll": "Одвежи све", - "settings.setting.connections.noConnectionsDescription": "Повежите се са апликацијом тако што ћете потражити дугме „Повежи новчаник“ или „Пријави се“.", - "settings.setting.currency.title": "Домаћа валута", - "settings.setting.deviceAccess.reset.title": "Reset your {{biometricsMethod}}", - "settings.setting.deviceAccess.title": "Device access", - "settings.setting.deviceAccessTimeout.1hour": "1 hr", - "settings.setting.deviceAccessTimeout.24hours": "24 hr", - "settings.setting.deviceAccessTimeout.30minutes": "30 min", - "settings.setting.deviceAccessTimeout.5minutes": "5 min", - "settings.setting.deviceAccessTimeout.never": "Never", - "settings.setting.deviceAccessTimeout.title": "Auto-lock timeout", - "settings.setting.hapticTouch.title": "Хаптички додир", - "settings.setting.helpCenter.title": "Центар за помоћ", - "settings.setting.language.button.navigate": "Идите на Подешавања", - "settings.setting.language.description.extension": "Унисвап подразумевана подешавања језика вашег система. Да бисте променили жељени језик, идите на подешавања система.", - "settings.setting.language.description.mobile": "Uniswap defaults to your device’s language settings. To change your preferred language, go to “Uniswap” in your device settings and tap on “Language”.", - "settings.setting.language.title": "Језик", - "settings.setting.notifications.row.activity.description": "Transfers, requests, and other activity", - "settings.setting.notifications.row.activity.title": "Wallet activity", - "settings.setting.notifications.row.updates.description": "Recommendations and new features", - "settings.setting.notifications.row.updates.title": "Updates from Uniswap", - "settings.setting.notifications.title": "Обавештења", - "settings.setting.password.change.title": "Create a new password", - "settings.setting.password.title": "Промени лозинку", - "settings.setting.permissions.title": "Permissions", - "settings.setting.privacy.analytics.description": "Користимо анонимне податке о коришћењу да бисмо побољшали ваше искуство са производима Унисвап Лабс. Када је онемогућено, пратимо само грешке и суштинску употребу.", - "settings.setting.privacy.analytics.title": "App analytics", - "settings.setting.privateKeys.title": "Private keys", - "settings.setting.recoveryPhrase.title": "Фраза за опоравак", - "settings.setting.smallBalances.title": "Portfolio balance", - "settings.setting.smartWallet.action.enable": "Омогући", - "settings.setting.smartWallet.action.smartWallet": "Smart wallet", - "settings.setting.smartWallet.notEligible": "Not eligible", - "settings.setting.smartWallet.status.actionRequired": "Action required", - "settings.setting.smartWallet.status.active": "Ацтиве", - "settings.setting.smartWallet.status.inactive": "Inactive", - "settings.setting.smartWallet.status.unavailable": "Недоступно", - "settings.setting.unknownTokens.subtitle": "Potential scam tokens will be hidden from your portfolio.", - "settings.setting.unknownTokens.title": "Сакриј непознате токене", - "settings.setting.wallet.action.editLabel": "Уреди ознаку", - "settings.setting.wallet.action.editProfile": "Уреди профил", - "settings.setting.wallet.action.remove": "Уклоните новчаник", - "settings.setting.wallet.connection.banner.description": "Manage connections via wallet settings, by clicking your profile image.", - "settings.setting.wallet.connection.banner.title": "Connections have moved", - "settings.setting.wallet.connections.title": "Connections", - "settings.setting.wallet.editLabel.description": "Ознаке нису јавне. Они се чувају локално и видљиви су само вама.", - "settings.setting.wallet.editLabel.save": "Сачувај измене", - "settings.setting.wallet.label": "Надимак", - "settings.setting.wallet.testnetMode.description": "Ово укључује тестне мреже за програмере како би тестирали функције и трансакције без коришћења стварних средстава. Токени на тестним мрежама немају стварну вредност.", - "settings.setting.wallet.testnetMode.title": "Тестна мрежа режим", - "settings.switchNetwork.warning": "Да бисте користили Унисвап на {{label}}, промените мрежу у подешавањима новчаника.", - "settings.title": "Подешавања", - "settings.version": "Верзија {{appVersion}}", - "smartWallet.actionRequired.cta": "Disable on 1 network", - "smartWallet.actionRequired.cta.plural": "Disable on {{amount}} networks", - "smartWallet.actionRequired.description": "Disabling smart wallet is an onchain action that requires a small network cost.", - "smartWallet.actionRequired.insufficientFunds": "Недовољно средстава", - "smartWallet.actionRequired.reactivate": "Keep using smart wallet", - "smartWallet.actionRequired.title": "Smart wallet is active on 1 network", - "smartWallet.actionRequired.title.plural": "Smart wallet is active on {{amount}} networks", - "smartWallet.activeNetworks.title": "Smart wallet is active on 1 network", - "smartWallet.activeNetworks.title.plural": "Smart wallet is active on {{amount}} networks", - "smartWallet.banner.networkCost": "Includes a one-time cost to activate your smart wallet on {{chainName}}.", - "smartWallet.banner.text": "Enable smart wallet to save up to 50% on network costs.", - "smartWallet.confirmDisableSmartWallet.description": "You’ll miss out on faster swaps, discounted network costs, and other upcoming improvements.", - "smartWallet.confirmDisableSmartWallet.title": "Јеси ли сигуран?", - "smartWallet.insufficient.description": "Smart wallet cannot be disabled on these networks until you have funds to cover network costs.", - "smartWallet.insufficient.title": "Insufficient funds on 1 network", - "smartWallet.insufficient.title.plural": "Insufficient funds on {{amount}} networks", - "smartWallet.InsufficientFunds.button.continue.text": "Continue anyway", - "smartWallet.insufficientFunds.network.banner.description": "Cannot disable due to insufficient funds.", - "smartWallet.insufficientFunds.network.banner.title_one": "{{count}} network excluded", - "smartWallet.insufficientFunds.network.banner.title_other": "{{count}} network excluded", - "smartWallet.insufficientFunds.network.disable.text": "Ready to disable", - "smartWallet.insufficientFunds.network.text": "You need {{nativeCurrency}}", - "smartWallet.insufficientFunds.single.network.banner.title": "{{chain}} excluded", - "smartWallet.modal.description.block1": "Smart wallets use smart contracts for faster, lower-cost transactions.", - "smartWallet.modal.description.block2": "Wallets already using smart wallet features from another app will not be affected.", - "smartWallet.modal.title": "Smart Wallet", - "smartWallets": "Smart Wallets", - "smartWallets.activeNetworks.description": "Your smart wallet is automatically activated across each new network you swap on.", - "smartWallets.createdModal.description": "You’re getting faster transactions and lower network costs on every swap.", - "smartWallets.createdModal.title": "Smart wallet created", - "smartWallets.delegation.limitedSupport": "Your wallet has limited support", - "smartWallets.delegationMismatchModal.description": "{{walletName}} doesn’t support the latest Ethereum standards used by {{displayName}}, so some features are unavailable.", - "smartWallets.delegationMismatchModal.features.1ClickSwaps": "1-click swaps", - "smartWallets.delegationMismatchModal.features.gasFreeSwaps": "Gas-free swaps", - "smartWallets.delegationMismatchModal.features.limitOrders": "Limit orders", - "smartWallets.delegationMismatchModal.limitOrders.unsupported": "Limit orders are not supported by your wallet.", - "smartWallets.delegationMismatchModal.title": "Limited wallet support", - "smartWallets.disable.failed": "An error occurred. Smart wallet is still active on 1 or more networks. Please try again.", - "smartWallets.disable.modal.description": "This onchain action requires a network cost.", - "smartWallets.disable.modal.title": "Disable smart wallet", - "smartWallets.educationalModal.description": "Smart wallets provide faster, low-cost transactions using smart contracts.", - "smartWallets.educationalModal.info": "Wallets already using smart wallet features from another app will not be affected.", - "smartWallets.enabledModal.description": "Updates will take effect on your next swap.", - "smartWallets.enabledModal.description.dapp": "Updates will take effect on your next transaction.", - "smartWallets.enabledModal.description.dapp.line2": "Reconnect your wallet to start using smart wallet features on apps immediately.", - "smartWallets.enabledModal.title": "Smart wallet enabled", - "smartWallets.postSwapNudge.enable": "Enable smart wallet", - "smartWallets.postSwapNudge.title": "Save on your next swap", - "smartWallets.postSwapNudge.title.dapp": "This app supports smart wallets", - "smartWallets.unavailableModal.description": "A different wallet provider is now managing smart wallet settings for {{displayName}}. You can continue using Uniswap as normal.", - "smartWallets.unavailableModal.title": "Smart wallet features unavailable", - "solanaPromo.banner.description": "Trade Solana tokens directly on Uniswap.", - "solanaPromo.banner.title": "Solana is now available", - "solanaPromo.modal.connectWallet": "Connect your favorite Solana wallet", - "solanaPromo.modal.startSwapping.button": "Start swapping on Solana", - "solanaPromo.modal.swapInstantly": "Swap thousands of trending tokens instantly", - "solanaPromo.modal.viewTokenData": "View token data and prices in one place", - "speedBump.newAddress.warning.description": "Нисте раније обављали трансакције са овом адресом. Уверите се да је то тачна адреса пре него што наставите.", - "speedBump.newAddress.warning.title": "Нова адреса", - "speedBump.smartContractAddress.warning.description": "Управо ћете послати токене на посебну врсту адресе - паметни уговор. Још једном проверите да ли је то адреса на коју сте намеравали да пошаљете. Ако је погрешно, ваши токени могу бити изгубљени заувек.", - "speedBump.smartContractAddress.warning.title": "Да ли је ово адреса новчаника?", - "stats.24fees": "24Х накнаде", - "stats.24swapVolume": "24H swap volume", - "stats.24volume": "24Х волуме", - "stats.allTimeSwappers": "Замена за сва времена", - "stats.allTimeVolume": "Обим за све време", - "stats.fdv": "ФДВ", - "stats.fdv.description": "Потпуно разводњена вредност (ФДВ) израчунава укупну тржишну вредност под претпоставком да су сви токени у оптицају.", - "stats.marketCap": "Тржишна капитализација", - "stats.marketCap.description": "Тржишна капитализација је укупна тржишна вредност оптицајне понуде неког средства.", - "stats.noStatsAvailable": "No stats available", - "stats.tvl": "Total value locked", - "stats.tvl.description": "Total value locked (TVL) is the aggregate amount of the asset available across all Uniswap liquidity pools.", - "stats.volume.1d": "1 дан запремине", - "stats.volume.1d.description": "1 day volume is the amount of the asset that has been traded on Uniswap during the past 24 hours.", - "stats.volume.1d.long": "1D volume", - "stats.volume.1d.short": "Запремина 1Д", - "stats.volume.description": "Volume is the amount of the asset that has been traded on Uniswap during the selected time frame.", - "swap.allow.oneTime": "Дозволи {{sym}} (једном)", - "swap.approveAndSubmit": "Одобрите и пошаљите", - "swap.approveAndSwap": "Одобрите и замените", - "swap.balance.amount": "Стање: {{amount}}", - "swap.bestPrice.through": "Route via {{provider}}", - "swap.bestRoute.cost": "Most efficient route is estimated to cost ~{{gasPrice}} in network costs. ", - "swap.bridging.title": "Замена преко мрежа", - "swap.bridging.warning.description": "Мењате са {{fromNetwork}} на {{toNetwork}}. Ово је такође познато као „повезивање“, што премешта ваше токене са једне мреже на другу.", - "swap.button.confirmSignAndSwap": "Confirm sign and swap", - "swap.button.confirmSwapAnyways": "Confirm swap anyways", - "swap.button.confirmUnwrap": "Confirm unwrap", - "swap.button.max": "Макс", - "swap.button.review": "Преглед", - "swap.button.submitting": "Слање замене...", - "swap.button.submitting.keep.open": "Држите новчаник отворен...", - "swap.button.submitting.passkey": "Confirm with passkey", - "swap.button.swap": "Свап", - "swap.button.swapAnyways": "Замени у сваком случају", - "swap.button.unwrap": "Унврап", - "swap.button.wrap": "Замотајте", - "swap.buy.countryModal.placeholder": "Претражујте по земљи или региону", - "swap.cancel.cannotExecute_one": "Ваша замена би могла да се изврши пре него што се отказивање обради. Ваши мрежни трошкови се не могу рефундирати. Да ли желите да наставите?", - "swap.cancel.cannotExecute_other": "Ваше замене могу да се изврше пре него што се отказивање обради. Ваши мрежни трошкови се не могу рефундирати. Да ли желите да наставите?", - "swap.confirmApproveAndSwap": "Confirm approve and swap", - "swap.confirmLimit": "Потврдите ограничење", - "swap.confirmSwap": "Потврдите замену", - "swap.confirmWrap": "Confirm wrap", - "swap.deadline.settings.title": "Swap deadline", - "swap.deadline.settings.title.short": "Tx. deadline", - "swap.details.completed": "Swap complete", - "swap.details.estimatedTime": "Est. time", - "swap.details.fasterUnichainSwaps": "Faster swaps powered by Unichain", - "swap.details.feeOnTransfer": "{{tokenSymbol}} накнада", - "swap.details.feeOnTransfer.symbol": "{{tokenSymbol}} token fee", - "swap.details.instant": "Instant", - "swap.details.newQuote.input": "Нови унос", - "swap.details.newQuote.output": "Нови излаз", - "swap.details.orderRouting": "Рутирање налога", - "swap.details.orderRoutingInfo": "Ова замена се усмерава преко Across, децентрализованог протокола који премешта средства преко мрежа, приоритетом стављајући сигурност, брзо извршавање и ниске цене.", - "swap.details.poweredBy": "Покреће", - "swap.details.rate": "Рате", - "swap.details.slippage": "Максимално клизање", - "swap.details.slippage.uniswap": "Uniswap Protected slippage", - "swap.details.swappedIn.unichain": "Completed in {{time}}s on Unichain", - "swap.details.uniswapFee": "Надокнада", - "swap.error.default": "Можда ћете морати да повећате толеранцију на клизање. Напомена: токени са накнадом за трансфер и ребасе нису компатибилни са Унисвап В3.", - "swap.error.expectedToFail": "Очекује се да ваша замена не успе.", - "swap.error.fiatInputUnavailable": "{{fiatCurrencyCode}} input unavailable", - "swap.error.modifiedByWallet": "Ваша замена је измењена преко вашег новчаника. Ако је ово била грешка, откажите одмах или ризикујете да изгубите средства.", - "swap.error.rejected": "Трансакција је одбијена", - "swap.error.undefinedObject": "Дошло је до грешке при покушају извршења ове замене. Можда ћете морати да повећате толеранцију на клизање. Ако то не успије, можда постоји некомпатибилност са токеном којим тргујете. Напомена: токени са накнадом за трансфер и ребасе нису компатибилни са Унисвап В3.", - "swap.error.unknown": "Непозната грешка.", - "swap.error.v2.expired": "Ова трансакција није могла бити послата јер је рок прошао. Проверите да рок ваше трансакције није пренизак.", - "swap.error.v2.k": "Унисвап инваријанта к*и=к није била задовољена заменом. То обично значи да један од токена које замењујете укључује прилагођено понашање при преносу.", - "swap.error.v2.slippage": "Ова трансакција неће успети због кретања цене или накнаде за пренос. Покушајте да повећате толеранцију на клизање", - "swap.error.v2.transferInput": "Улазни токен се не може пренети. Можда постоји проблем са токеном за унос.", - "swap.error.v2.transferOutput": "Излазни токен се не може пренети. Можда постоји проблем са излазним токеном.", - "swap.error.v3.slippage": "Ова трансакција неће успети због кретања цене. Покушајте да повећате толеранцију на клизање. Напомена: накнада за токене за пренос и ребазовање није компатибилна са Унисвап В3.", - "swap.error.v3.transferOutput": "Излазни токен се не може пренети. Можда постоји проблем са излазним токеном. Напомена: накнада за токене за пренос и ребазовање није компатибилна са Унисвап В3.", - "swap.estimatedDifference.label": "Биће велика разлика између ваших улазних и излазних вредности због тренутне ликвидности.", - "swap.expected.price": "Expected price", - "swap.fail.batched": "Your connected wallet may not support 1-click swaps. Try a standard swap instead.", - "swap.fail.batched.retry": "Try standard swap", - "swap.fail.batched.title": "1-click swap failed", - "swap.fail.message": "Покушајте да подесите клизање на већу вредност.", - "swap.fail.uniswapX": "Замена није могла да се заврши са УнисвапКс. Покушајте поново да га усмерите кроз класични Унисвап АПИ.", - "swap.fees.experience": "Ова накнада се примењује на неким паровима токена како би се обезбедило најбоље искуство са Унисвап-ом. Плаћа се у излазном токену и већ је урачуната у понуду.", - "swap.fees.jupiter.label": "Jupiter fee", - "swap.fees.jupiter.message": "Fees on Solana are charged by the Jupiter API. Uniswap Labs does not receive these fees.", - "swap.fees.noFee": "Накнаде се примењују на одабране парове токена како би се обезбедило најбоље искуство са Унисвап-ом. Нема накнаде за ову замену.", - "swap.finalizingQuote": "Завршавање понуде...", - "swap.form.header": "Свап", - "swap.form.warning.output.fotFees": "Због накнаде за токен од {{fotCurrencySymbol}}, износи размене се могу унети само помоћу поља за унос", - "swap.form.warning.output.fotFees.fallback": "Због накнада за токене, износе размене можете унети само помоћу поља за унос", - "swap.form.warning.output.solana": "Exact output is not supported on Solana", - "swap.form.warning.restore": "Вратите новчаник за замену", - "swap.frontrun.warning": "Ваша трансакција може бити напредна и резултирати неповољном трговином.", - "swap.header.viewOnly": "Поглед само", - "swap.impactOfTrade": "Утицај ваше трговине на тржишну цену овог базена.", - "swap.impactOfTrade.uniswapx": "The difference between market price and execution price, factoring in UniswapX gas savings.", - "swap.impactOfTrade.uniswapx.missing": "Price impact calculations may be unavailable for pairs with low liquidity.", - "swap.inputEstimated.atMost": "Улаз је процењен. Продаћете највише или ће се трансакција вратити.", - "swap.limit": "Лимит", - "swap.limitFilled": "Лимит испуњен!", - "swap.limitSubmitted": "Ограничење је послато", - "swap.marketPrice.outsideRange.label": "Тржишна цена је ван вашег наведеног распона цена. Само депозит за једно средство.", - "swap.min.price": "Minimum price", - "swap.networkCost.paidIn": "Мрежни трошак се плаћа у {{sym}} на мрежи {{chainName}} да би се извршила трансакција.", - "swap.orderRouting": "Рутирање налога", - "swap.outputEstimated.atLeast": "Излаз је процењен. Добићете најмање или ће се трансакција вратити.", - "swap.placeOrder": "Наручите", - "swap.priceImpact": "Утицај на цену", - "swap.request.title.full": "Заменити {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "Замените токене", - "swap.review": "Замена прегледа", - "swap.review.summary": "Мењате се", - "swap.reviewLimit": "Ограничење прегледа", - "swap.route.optimizedGasCost": "This route considers split routes, multiple hops, and network costs of each step.", - "swap.routing.jupiter.description": "Jupiter aggregates liquidity from multiple sources to provide you with the best prices.", - "swap.routing.uniswapAutoRouter.description": "The Uniswap Auto Router considers optimal routes and network costs to provide you with the best prices.", - "swap.settings.deadline.tooltip": "Your transaction will revert if it is pending for more than this period of time. (Maximum: 3 days).", - "swap.settings.deadline.warning": "High deadline", - "swap.settings.oneClickSwap.title": "1-click swaps", - "swap.settings.oneClickSwap.tooltip": "Bundles standard trade actions together for faster, lower-cost swaps.", - "swap.settings.protection.description": "Са укљученом заштитом замене, ваше Етхереум трансакције ће бити заштићене од сендвич напада, са смањеним шансама за неуспех.", - "swap.settings.protection.subtitle.supported": "{{chainName}} Мрежа", - "swap.settings.protection.subtitle.unavailable": "Није доступно на {{chainName}}", - "swap.settings.protection.title": "Свап Протецтион", - "swap.settings.routingPreference.option.default.description": "Selecting this option identifies the most efficient route for your swap.", - "swap.settings.routingPreference.option.default.description.preV4": "The Uniswap client selects the cheapest trade option factoring in price and network costs.", - "swap.settings.routingPreference.option.default.description.uniswapXUnavailable": "UniswapX unavailable for your wallet", - "swap.settings.routingPreference.option.default.tooltip": "A route is identified considering v2, v3, and certain v4 pools, factoring in estimated price impact and network costs.", - "swap.settings.routingPreference.option.v2.title": "Enable v2 pools", - "swap.settings.routingPreference.option.v3.title": "Enable v3 pools", - "swap.settings.routingPreference.option.v4.hooks.title": "Enable v4 hook pools", - "swap.settings.routingPreference.option.v4.hooks.tooltip": "V4 hooks routes swaps through a set of pre-approved hooks.", - "swap.settings.routingPreference.option.v4.title": "Enable v4 pools", - "swap.settings.routingPreference.title": "Опције трговине", - "swap.settings.slippage.alert": "High slippage", - "swap.settings.slippage.control.auto": "Ауто", - "swap.settings.slippage.description": "Ваша трансакција ће се вратити ако се цена промени више од процента клизања.", - "swap.settings.slippage.input.message": "Ако цена још више падне, ваша трансакција ће се вратити. Испод је минимални износ који ћете гарантовано примити.", - "swap.settings.slippage.input.receive.title": "Примите барем", - "swap.settings.slippage.output.message": "Ако цена још више падне, ваша трансакција ће се вратити. Испод је максимални износ који би требало да потрошите.", - "swap.settings.slippage.output.spend.title": "Потрошите највише", - "swap.settings.slippage.warning": "Very high slippage", - "swap.settings.slippage.warning.description": "Slippage above 20% is likely to result in an unfavorable trade. To reduce the risk being front-run, lower your settings.", - "swap.settings.slippage.warning.hover": "This may result in an unfavorable trade. Try lowering your slippage setting.", - "swap.settings.slippage.warning.max": "Унесите вредност мању од {{maxSlippageTolerance}}", - "swap.settings.slippage.warning.message": "Клизање може бити веће него што је потребно", - "swap.settings.slippage.warning.min": "Унесите вредност већу од 0", - "swap.settings.title": "Замени подешавања", - "swap.settings.transactionRevertPrice": "Ваша трансакција ће се вратити ако се цена неповољно промени за више од овог процента.", - "swap.signAndSwap": "Потпишите и замените", - "swap.slippage.amt": "{{amt}} проклизавање", - "swap.slippage.bridging": "Нема клизања при замени преко мрежа", - "swap.slippage.description": "Difference between expected and executed price on a swap. Differences can occur due to low liquidity, market volatility, or bots. \n\nUniswap Protection guards against frontrunning bots and MEV.", - "swap.slippage.settings.title": "Подешавања клизања", - "swap.slippage.tooltip": "Максимално кретање цене пре ваше трансакције ће се вратити.", - "swap.slippageBelow.warning": "Проклизавање испод {{amt}} може довести до неуспешне трансакције", - "swap.submitted": "Замена послата", - "swap.success": "Успех замене!", - "swap.tokenOwnFees": "Неки токени узимају накнаду када се купују или продају, коју поставља издавалац токена. Унисвап не прима ниједну од ових накнада.", - "swap.tradeRoutes": "Trade routes", - "swap.transaction.deadline": "Рок за трансакцију", - "swap.transaction.revertAfter": "Ваша трансакција ће бити враћена ако је на чекању дуже од овог временског периода.", - "swap.warning.enterLargerAmount.title": "Унесите већи износ", - "swap.warning.expectedFailure.increaseSlippage": "Try increasing your slippage.", - "swap.warning.expectedFailure.titleMay": "This swap may fail", - "swap.warning.insufficientBalance.title": "Немате довољно {{currencySymbol}}", - "swap.warning.insufficientGas.button": "Није довољно {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "Замена за {{ tokenSymbol }} на {{networkName}}", - "swap.warning.insufficientGas.button.buy": "Купи {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "Купите картицом", - "swap.warning.insufficientGas.message.withNetwork": "Нема довољно {{currencySymbol}} на {{networkName}} за замену", - "swap.warning.insufficientGas.message.withoutNetwork": "Није довољно {{currencySymbol}} за замену", - "swap.warning.insufficientGas.title": "Немате довољно {{currencySymbol}} да покријете трошкове мреже", - "swap.warning.networkFee.allow": "Дозволи {{ inputTokenSymbol }} (једном)", - "swap.warning.networkFee.delegation.message": "This is the cost to process your transaction and activate your smart wallet on Unichain. Uniswap Labs does not receive any share of these fees.", - "swap.warning.networkFee.highRelativeToValue": "The network cost exceeds 10% of your total transaction value. This is the cost to process your transaction on the blockchain. Uniswap does not receive any share of these fees.", - "swap.warning.networkFee.highRelativeToValue.unichain": "The network cost exceeds 10% of your total transaction value. This is the cost to process your transaction on the blockchain.", - "swap.warning.networkFee.includesDelegation": "Includes smart wallet activation", - "swap.warning.networkFee.message": "Ово је трошак обраде ваше трансакције на блокчејну. Унисвап не прима никакав део ових накнада.", - "swap.warning.networkFee.message.unichain": "This is the cost to process your transaction on the blockchain.", - "swap.warning.networkFee.message.uniswapX": "Ово је трошак обраде ваше трансакције на блокчејну. Унисвап не прима никакав део ових накнада. УнисвапКс агрегира изворе ликвидности за боље цене и свопове без гаса.", - "swap.warning.networkFee.message.uniswapX.title": "No network costs with UniswapX", - "swap.warning.networkFee.message.uniswapX.unichain": "This is the cost to process your transaction on the blockchain. UniswapX aggregates liquidity sources for better prices and gas free swaps.", - "swap.warning.noQuotesFound.bridging.message": "No bridging quotes found. Try using the official bridge at this time.", - "swap.warning.noQuotesFound.title": "No quotes found", - "swap.warning.noRoutesFound.message": "There are currently no routes available for your selected tokens. Please try a different pair or check again later.", - "swap.warning.noRoutesFound.title": "No routes available", - "swap.warning.offline.message": "Можда сте изгубили интернет везу или мрежа можда не ради. Проверите интернет везу и покушајте поново.", - "swap.warning.offline.title": "Ви сте ван мреже", - "swap.warning.priceImpact.message": "Због количине {{outputCurrencySymbol}} ликвидности која је тренутно доступна, што више {{inputCurrencySymbol}} покушате да замените, мање ћете {{outputCurrencySymbol}} добити.", - "swap.warning.priceImpact.message.veryHigh": "Ова трансакција ће резултирати {{priceImpactValue}} утицајем цене на тржишну цену овог базена и резултоваће губитком средстава.", - "swap.warning.priceImpact.title": "Висок утицај на цену ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "Веома висок утицај на цену ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "Ваша трансакција није послата јер сте затворили апликацију.", - "swap.warning.queuedOrder.approvalFailed": "Ваша трансакција није послата јер одобрење токена није успело.", - "swap.warning.queuedOrder.stale": "Ваша трансакција није послата јер сте затворили апликацију или је одобрење трајало предуго.", - "swap.warning.queuedOrder.submissionFailed": "Дошло је до проблема при слању ваше трансакције.", - "swap.warning.queuedOrder.title": "Swap canceled", - "swap.warning.rateLimit.message": "Молим покушајте поново за неколико минута.", - "swap.warning.rateLimit.title": "Ограничење стопа премашила", - "swap.warning.router.message": "Можда сте изгубили везу или је мрежа можда прекинута. Ако проблем и даље постоји, покушајте поново касније.", - "swap.warning.router.title": "Ова трговина се тренутно не може завршити", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} is blocked", - "swap.warning.tokenBlockedFallback.button": "Token is blocked", - "swap.warning.uniswapFee.message": "Fees are applied to ensure the best experience with Uniswap.", - "swap.warning.uniswapFee.message.default": "Накнаде се примењују да би се обезбедило најбоље искуство са Унисвап-ом. Нема накнаде за ову замену.", - "swap.warning.uniswapFee.message.included": "Накнаде се примењују да би се обезбедило најбоље искуство са Унисвап-ом и већ су урачунате у ову понуду.", - "swap.warning.uniswapFee.title": "Свап накнада", - "swap.warning.viewOnly.message": "Морате да увезете овај новчаник преко фразе за опоравак да бисте заменили токене.", - "swap.wrap.token": "Замотајте {{sym}}", - "tdp.balanceSummary.otherNetworks": "На другим мрежама", - "tdp.balanceSummary.otherNetworksBalance": "Стање на другим мрежама", - "tdp.balanceSummary.title": "Стање", - "tdp.button.getToken": "Get {{ tokenSymbol }}", - "tdp.button.getTokenFallback": "Get Token", - "tdp.loading.title.default": "подаци о токену за ", - "tdp.loading.title.withChain": "подаци о токену за на {{chainName}}", - "tdp.nameNotFound": "Име није пронађено", - "tdp.noInfoAvailable": "Нема доступних информација о токену", - "tdp.noTestnetSupportDescription": "Неке тестне мреже не подржавају замену, слање или куповину токена.", - "tdp.symbolNotFound": "Симбол није пронађен", - "testnet.modal.swapDeepLink.description.toProdMode": "This action requires testnet mode to be disabled. Testnet mode can be reenabled at anytime within settings.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "This action requires testnet mode to be enabled. Tokens on testnets do not hold any real value. Testnet mode can be disabled at anytime within settings.", - "testnet.modal.swapDeepLink.title.toProdMode": "Disable testnet mode", - "testnet.modal.swapDeepLink.title.toTestnetMode": "Enable testnet mode", - "testnet.unsupported": "Ова функционалност није подржана у режиму тестне мреже.", - "themeToggle.theme": "Тема", - "title.buySellTradeEthereum": "Купујте, продајте и тргујте Етхереумом и другим врхунским токенима на Унисвап-у", - "title.createGovernanceOn": "Направите нови предлог управљања на Унисвап-у", - "title.createGovernanceTo": "Направите нови предлог управљања о коме ће гласати носиоци УНИ. УНИ токени представљају акције са правом гласа у Унисвап управљању.", - "title.earnFees": "Зарадите накнаде када други мењају Унисвап додавањем токена у фондове ликвидности.", - "title.easilyRemove": "Лако уклоните своју ликвидност из Унисвап в2 и депонујте у Унисвап в3.", - "title.easilyRemoveV4": "Лако уклоните своју ликвидност из Унисвап в2 и в3 да депонујете у Унисвап в4.", - "title.extension.uninstall": "Extension Uninstalled", - "title.extensionPasskeyLogIn": "Log in with Passkey", - "title.managePasskeys": "Uniswap | Manage your passkeys", - "title.migratev2": "Пренесите ликвидност в2 пула на Унисвап в3", - "title.migratev3": "Пренесите ликвидност базена на Унисвап в4", - "title.placeLimit": "Поставите ограничене налоге на Унисвап", - "title.realTime": "Цене у реалном времену, графикони, подаци о трансакцијама и још много тога.", - "title.removeLiquidityv2": "Уклоните ликвидност пула (в2) на Унисвап-у", - "title.removePoolLiquidity": "Уклоните ликвидност фонда на Унисвап-у", - "title.removeTokensv2": "Уклоните своје токене из в2 базена ликвидности.", - "title.removev3Liquidity": "Уклоните своје токене из в3 базена ликвидности.", - "title.sendCrypto": "Send crypto", - "title.sendTokens": "Пошаљите токене на Унисвап", - "title.swappingMadeSimple": "Instantly buy and sell crypto on Ethereum, Base, Arbitrum, Polygon, Unichain and more. The DeFi platform trusted by millions.", - "title.tradeTokens": "Тргујте токенима и обезбедите ликвидност. Цене у реалном времену, графикони, подаци о трансакцијама и још много тога.", - "title.uniswapTradeCrypto": "Uniswap | Trade Crypto on DeFi’s Leading Exchange ", - "title.uniToken": "УНИ токени представљају акције са правом гласа у Унисвап управљању. Можете сами гласати за сваки предлог или своје гласове делегирати трећој страни.", - "title.voteOnGov": "Гласајте о предлозима управљања Унисвап-ом", - "token.balances.main": "Стање", - "token.balances.other": "Стање на другим мрежама", - "token.balances.viewOnly": "{{ownerAddress}}'с баланс", - "token.bridge": "{{label}} токен бридге", - "token.chart.candlestick.unavailable": "Candlestick charts are unavailable for this token", - "token.chart.tooltip": "Накнаде: {{amount}}", - "token.details": "Token details", - "token.error.unknown": "Непознати токен", - "token.fee.buy.label": "накнада за куповину", - "token.fee.label": "надокнада", - "token.fee.sell.label": "накнада за продају", - "token.links.title": "Линкови", - "token.links.twitter": "Твиттер", - "token.links.website": "Веб сајт", - "token.notFound.description": "Sorry, we can’t find any information for this token. Check the name and address and try again.", - "token.notFound.title": "Token not found", - "token.priceExplorer.error.description": "Нешто није у реду.", - "token.priceExplorer.error.title": "Учитавање графикона цена није успело", - "token.priceExplorer.timeRangeLabel.all": "Све време", - "token.priceExplorer.timeRangeLabel.day": "1Д", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 Day", - "token.priceExplorer.timeRangeLabel.hour": "1Х", - "token.priceExplorer.timeRangeLabel.month": "1М", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 Month", - "token.priceExplorer.timeRangeLabel.week": "1В", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 Week", - "token.priceExplorer.timeRangeLabel.year": "1И", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 Year", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} није доступан", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} и {{tokenSymbol1}} нису доступни", - "token.safety.fee.detected": "Token fee detected", - "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs не прима ниједну од ових накнада.", - "token.safety.warning.alwaysDoYourResearch": "Увек спроведите сопствено истраживање", - "token.safety.warning.blocked.description.default_one": "Не можете трговати овим токеном користећи Унисвап апликацију.", - "token.safety.warning.blocked.description.default_other": "Не можете трговати овим токенима користећи Унисвап апликацију.", - "token.safety.warning.copyContractAddress.message": "This is a contract address, which acts as a unique identifier for tokens on the blockchain. Any crypto you send to this address will be lost.", - "token.safety.warning.copyContractAddress.title": "Do not send crypto to this address", - "token.safety.warning.dontShowWarningAgain": "Не показуј ми поново ово упозорење", - "token.safety.warning.dontShowWarningAgainShort": "Don’t show again", - "token.safety.warning.doYourOwnResearch": "Увек спроведите сопствено истраживање пре наставка.", - "token.safety.warning.feeDescription": "Charges a when {{action}}", - "token.safety.warning.flaggedAsMalicious": "Flagged as malicious", - "token.safety.warning.flaggedAsSuspicious": "Flagged as suspicious", - "token.safety.warning.fotHigh.title": "High fee detected", - "token.safety.warning.fotLow.title": "Fee detected", - "token.safety.warning.fotVeryHigh.title": "Very high fee detected", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} је означен као непродајан. Замена овог токена може резултирати губитком ваших средстава.", - "token.safety.warning.honeypot.title": "100% sell fee detected", - "token.safety.warning.impersonator": "Impersonates another token", - "token.safety.warning.impersonator.title": "Impersonator token detected", - "token.safety.warning.malicious.general.message": "{{tokenSymbol}} has been flagged as malicious by Blockaid.", - "token.safety.warning.malicious.impersonator.message": "{{tokenSymbol}} has been flagged by Blockaid for attempting to copy a different token. It may not be the token you are looking to swap.", - "token.safety.warning.malicious.impersonator.message.short": "{{tokenSymbol}} may not be the token you are looking to swap.", - "token.safety.warning.malicious.title": "Откривен злонамерни токен", - "token.safety.warning.mayResultInLoss": "Swapping it may result in a loss of funds.", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} се не тргује на водећим америчким централизованим берзама.", - "token.safety.warning.notListedOnExchanges": "Not listed on leading U.S. exchanges", - "token.safety.warning.potentialHoneypot.card.message": "{{tokenSymbol}} has been flagged as suspicious by Blockaid.", - "token.safety.warning.potentialHoneypot.modal.message": "{{tokenSymbol}} has been flagged as a potential honeypot by Blockaid. Always do your own research before proceeding.", - "token.safety.warning.potentialHoneypot.title": "Potential honeypot detected", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} has been flagged as unsellable.", - "token.safety.warning.sellFee100.title": "100% sell fee detected", - "token.safety.warning.spam.message": "{{tokenSymbol}} has been flagged as spam by Blockaid.", - "token.safety.warning.spam.title": "Детектован спам токен", - "token.safety.warning.spamsUsers": "Spams users", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} charges a {{buyFeePercent}} fee when bought and {{sellFeePercent}} when sold.", - "token.safety.warning.tokenChargesFee.buy.message": "{{tokenSymbol}} charges a {{feePercent}} fee when bought.", - "token.safety.warning.tokenChargesFee.buy.message.descriptive": "{{tokenSymbol}} charges a {{feePercent}} fee when bought. Swapping it may result in a loss of funds. Uniswap Labs does not receive any of these fees.", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} charges a {{feePercent}} fee when sold.", - "token.safety.warning.tokenChargesFee.sell.message.descriptive": "{{tokenSymbol}} charges a {{feePercent}} fee when sold. Swapping it may result in a loss of funds. Uniswap Labs does not receive any of these fees.", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} charges a fee when bought or sold.", - "token.safetyLevel.blocked.message": "Не можете трговати овим токеном користећи Унисвап новчаник.", - "token.safetyLevel.medium.message.plural": "Овим токенима се не тргује на водећим америчким централизованим берзама. Увек спроведите сопствено истраживање пре поступања.", - "token.selector.search.error": "Учитавање резултата претраге није успело", - "token.stats.fullyDilutedValuation": "Потпуно разводњена процена", - "token.stats.marketCap": "Тржишна капитализација", - "token.stats.priceHighYear": "52В Хигх", - "token.stats.priceLowYear": "52В Лов", - "token.stats.section.about": "О {{token}}", - "token.stats.title": "Статс", - "token.stats.translation.original": "Прикажи оригинал", - "token.stats.translation.translate": "Преведи на {{language}}", - "token.stats.volume": "24х Волуме", - "token.symbol.input.fallback": "Улазни токен", - "token.symbol.output.fallback": "Излазни токен", - "token.wrap.fail.message": "Замене на Унисвап протоколу могу да почну и да се заврше са ЕТХ. Међутим, током размене, ЕТХ је умотан у ВЕТХ.", - "token.zeroNativeBalance.description.mainnet": "You’ll need to swap a token on Ethereum to get {{ tokenSymbol }}. Swapping requires ETH for network costs.", - "token.zeroNativeBalance.description.otherChains": "You’ll need to swap a token on {{ chainName }} to get {{ tokenSymbol }}. Swapping requires {{ chainName }} {{ nativeTokenSymbol }} for network costs.", - "token.zeroNativeBalance.subtitle": "{{ tokenSymbol }} is not available for direct purchase.", - "token.zeroNativeBalance.title.mainnet": "You need {{ nativeTokenName }}", - "token.zeroNativeBalance.title.otherChains": "You need {{ nativeTokenName }} on {{ chainName }}", - "tokens.action.hide": "Hide token", - "tokens.action.unhide": "Unhide token", - "tokens.nfts.action.viewOnExplorer": "Погледај на {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "Није могуће учитати НФТ колекцију", - "tokens.nfts.collection.label.items": "Предмети", - "tokens.nfts.collection.label.owners": "Власници", - "tokens.nfts.collection.label.priceFloor": "Под", - "tokens.nfts.collection.label.swapVolume": "Волуме", - "tokens.nfts.connectEthereumToView": "Connect an Ethereum wallet to view your NFTs", - "tokens.nfts.details.contract.address": "Contract address", - "tokens.nfts.details.error.load.title": "Није могуће учитати НФТ детаље", - "tokens.nfts.details.network": "Мрежа", - "tokens.nfts.details.owner": "У власништву", - "tokens.nfts.details.price": "Тренутна цена", - "tokens.nfts.details.recentPrice": "Последња продајна цена", - "tokens.nfts.details.traits": "Особине", - "tokens.nfts.empty.description": "Није пронађен ниједан НФТ", - "tokens.nfts.error.unavailable": "Садржај није доступан", - "tokens.nfts.hidden.action.hide": "Сакриј НФТ", - "tokens.nfts.hidden.action.unhide": "Откриј НФТ", - "tokens.nfts.link.collection": "Веб страница за колекцију", - "tokens.nfts.list.error.load.title": "Није могуће учитати НФТ", - "tokens.nfts.list.none.button": "Примите НФТ", - "tokens.nfts.list.none.description.default": "Пренесите НФТ-ове из другог новчаника да бисте започели.", - "tokens.nfts.list.none.description.external": "Када овај новчаник купи или прими НФТ, они ће се појавити овде.", - "tokens.nfts.list.none.title": "Још нема НФТ-а", - "tokens.nfts.notAvailableOnSolana": "NFTs aren’t available on Solana", - "tokens.selector.button.choose": "Изаберите токен", - "tokens.selector.empty.buy.message": "Купите криптовалуте картицом или банком за слање токена.", - "tokens.selector.empty.buy.title": "Купите криптовалуте", - "tokens.selector.empty.receive.title": "Примите токене", - "tokens.selector.empty.title": "Још нема токена", - "tokens.selector.error.load": "Учитавање токена није успело", - "tokens.selector.search.empty": "Нису пронађени резултати за {{searchText}}", - "tokens.selector.search.placeholder": "Претражи токене", - "tokens.selector.section.bridging": "Своп мрежама", - "tokens.selector.section.favorite": "Фаворитес", - "tokens.selector.section.otherNetworksSearchResults": "Tokens found on other networks", - "tokens.selector.section.otherSearchResults": "Остали токени на {{network}}", - "tokens.selector.section.recent": "Недавне претраге", - "tokens.selector.section.search": "Резултати претраге", - "tokens.selector.section.trending": "Tokens by 24H volume", - "tokens.selector.section.yours": "Ваши жетони", - "tokens.table.search.placeholder.pools": "Сеарцх поолс", - "tokens.table.search.placeholder.tokens": "Претражи токене", - "tokens.table.search.placeholder.transactions": "Search transactions", - "toucan.auction.bidConcentration": "Toucan concentration", - "toucan.auction.bidConcentration.tooltip.description": "Toucan tooltip description", - "toucan.auction.bidConcentration.tooltip.title": "Toucan tooltip title", - "toucan.auctions": "Auctions", - "toucan.bidForm.maxBudget": "Max budget", - "toucan.bidForm.placeBid": "Place your bid", - "toucan.displayMode.tokenPrice": "Token Price", - "toucan.displayMode.valuation": "Valuation", - "transaction.action.cancel.button": "Откажите трансакцију", - "transaction.action.cancel.description": "Ако откажете ову трансакцију пре него што је мрежа обради, платићете нови мрежни трошак уместо оригиналног.", - "transaction.action.cancel.title": "Желите ли да откажете ову трансакцију?", - "transaction.action.clear": "Clear pending", - "transaction.action.copy": "Копирајте ИД трансакције", - "transaction.action.copyProvider": "Копирајте {{providerName}} ИД трансакције", - "transaction.amount.unlimited": "Неограничено", - "transaction.callData": "Call data", - "transaction.details.dappName": "Апликација", - "transaction.details.from": "Од", - "transaction.details.networkFee": "Трошкови мреже", - "transaction.details.networkFee.swap": "Swap network cost", - "transaction.details.providerFee": "Provider fee", - "transaction.details.swapRate": "Рате", - "transaction.details.transaction": "Трансакција", - "transaction.details.uniswapFee": "Накнада ({{ feePercent }}%)", - "transaction.network.all": "Све мреже", - "transaction.networkCost.description": "The cost to process your transaction on the blockchain. Uniswap is optimized for minimal network costs.", - "transaction.networkCost.includesSmartWalletActivation": "Includes smart wallet activation", - "transaction.networkCost.label": "Трошкови мреже", - "transaction.networkCost.maxNativeBalance.description": "A small amount of the network token balance is reserved to cover the network cost of this transaction.", - "transaction.networkCost.maxNativeBalance.title": "Why can’t I use my max balance?", - "transaction.networkCost.veryHigh.label": "Врло висок трошак мреже", - "transaction.notification.error.cancel": "Није могуће отказати трансакцију", - "transaction.notification.error.replace": "Није могуће заменити трансакцију", - "transaction.status.approval.canceled": "Approval canceled", - "transaction.status.approval.failed": "Одобрење није успело", - "transaction.status.approve.canceled": "Отказано одобрење", - "transaction.status.approve.canceling": "Отказивање одобрења", - "transaction.status.approve.failed": "Одобрење није успело", - "transaction.status.approve.pending": "Одобравање", - "transaction.status.approve.success": "Одобрено", - "transaction.status.approve.successDapp": "Одобрено {{externalDappName}}", - "transaction.status.buy.canceled": "Отказано куповина", - "transaction.status.buy.canceling": "Отказивање куповине", - "transaction.status.buy.failed": "Куповина није успела", - "transaction.status.buy.pending": "Куповина", - "transaction.status.buy.success": "Купљено", - "transaction.status.buy.successDapp": "Купљено {{externalDappName}}", - "transaction.status.claim.canceled": "Fee collection canceled", - "transaction.status.claim.canceling": "Canceling fee collection", - "transaction.status.claim.failed": "Fee collection failed", - "transaction.status.claim.pending": "Прикупљање накнада", - "transaction.status.claim.success": "Fees collected", - "transaction.status.collect.fees.canceled": "Collect fees canceled", - "transaction.status.collect.fees.failed": "Прикупљање накнада није успело", - "transaction.status.collected.fees": "Прикупљене накнаде", - "transaction.status.collecting.fees": "Прикупљање накнада", - "transaction.status.confirm.canceled": "Отказано потврдити", - "transaction.status.confirm.canceling": "Чека се отказивање", - "transaction.status.confirm.failed": "Потврда није успела", - "transaction.status.confirm.pending": "Трансакција је у току", - "transaction.status.confirm.success": "Трансакција потврђена", - "transaction.status.confirm.successDapp": "Трансакција је потврђена {{externalDappName}}", - "transaction.status.createPair.canceled": "Canceled create pair", - "transaction.status.createPair.canceling": "Canceling create pair", - "transaction.status.createPair.failed": "Failed to create pair", - "transaction.status.createPair.pending": "Creating pair", - "transaction.status.createPair.success": "Created pair", - "transaction.status.createPool.canceled": "Canceled create pool", - "transaction.status.createPool.canceling": "Canceling create pool", - "transaction.status.createPool.failed": "Failed to create pool", - "transaction.status.createPool.pending": "Креирање базена", - "transaction.status.createPool.success": "Креиран базен", - "transaction.status.liquidityDecrease.canceled": "Remove liquidity canceled", - "transaction.status.liquidityDecrease.canceling": "Canceling remove liquidity", - "transaction.status.liquidityDecrease.failed": "Уклањање ликвидности није успело", - "transaction.status.liquidityDecrease.pending": "Уклањање ликвидности", - "transaction.status.liquidityDecrease.success": "Уклоњена ликвидност", - "transaction.status.liquidityIncrease.canceled": "Add liquidity canceled", - "transaction.status.liquidityIncrease.canceling": "Canceling add liquidity", - "transaction.status.liquidityIncrease.failed": "Додавање ликвидности није успело", - "transaction.status.liquidityIncrease.pending": "Додавање ликвидности", - "transaction.status.liquidityIncrease.success": "Додата ликвидност", - "transaction.status.lpIncentivesClaim.canceled": "Canceled LP rewards claim", - "transaction.status.lpIncentivesClaim.canceling": "Canceling LP rewards claim", - "transaction.status.lpIncentivesClaim.failed": "Failed to claim LP rewards", - "transaction.status.lpIncentivesClaim.pending": "Claiming LP rewards", - "transaction.status.lpIncentivesClaim.success": "Claimed LP rewards", - "transaction.status.migrateLiquidity.canceled": "Migrate liquidity canceled", - "transaction.status.mint.canceled": "Отказана ковница", - "transaction.status.mint.canceling": "Отказивање менте", - "transaction.status.mint.failed": "Ковање није успело", - "transaction.status.mint.pending": "Ковање", - "transaction.status.mint.success": "Кован", - "transaction.status.mint.successDapp": "Исковано на {{externalDappName}}", - "transaction.status.offramp.canceled": "Offramp canceled", - "transaction.status.offramp.failed": "Offramp failed", - "transaction.status.offramp.pending": "Offramping", - "transaction.status.offramp.success": "Offramped", - "transaction.status.onramp.canceled": "Onramp canceled", - "transaction.status.onramp.failed": "Onramp failed", - "transaction.status.onramp.pending": "Onramping", - "transaction.status.onramp.success": "Onramped", - "transaction.status.permit.approved": "Permit approved", - "transaction.status.permit.canceled": "Permit tx canceled", - "transaction.status.permit.failed": "Permit failed", - "transaction.status.purchase.canceled": "Отказано куповина", - "transaction.status.purchase.canceling": "Отказивање куповине", - "transaction.status.purchase.failed": "Purchase failed", - "transaction.status.purchase.failedOn": "Куповина на {{serviceProvider}}није успела", - "transaction.status.purchase.pending": "Куповина", - "transaction.status.purchase.pendingOn": "Куповина на {{serviceProvider}}", - "transaction.status.purchase.successOn": "Купљено {{serviceProvider}}", - "transaction.status.receive.canceled": "Отказано примање", - "transaction.status.receive.canceling": "Отказивање примања", - "transaction.status.receive.failed": "Пријем није успео", - "transaction.status.receive.failedFrom": "Примање од {{serviceProvider}}није успело", - "transaction.status.receive.pending": "Примање", - "transaction.status.receive.pendingFrom": "Пријем од {{serviceProvider}}", - "transaction.status.receive.success": "Примљен", - "transaction.status.receive.successDapp": "Примљено {{externalDappName}}", - "transaction.status.receive.successFrom": "Примљено од {{serviceProvider}}", - "transaction.status.removeDelegation.canceled": "Remove delegation canceled", - "transaction.status.removeDelegation.failed": "Remove delegation failed", - "transaction.status.removeDelegation.pending": "Removing delegation", - "transaction.status.removeDelegation.success": "Removed delegation", - "transaction.status.revoke.canceled": "Отказано опозив", - "transaction.status.revoke.canceling": "Отказивање опозива", - "transaction.status.revoke.failed": "Опозив није успео", - "transaction.status.revoke.pending": "Опозив", - "transaction.status.revoke.success": "Опозвано", - "transaction.status.revoke.successDapp": "Опозван {{externalDappName}}", - "transaction.status.sale.canceled": "Canceled sale", - "transaction.status.sale.canceling": "Canceling sale", - "transaction.status.sale.failedOn": "Sale Failed via {{serviceProvider}}", - "transaction.status.sale.pendingCard.msg": "Learn more about selling crypto.", - "transaction.status.sale.pendingCard.title": "Why is my sale still pending?", - "transaction.status.sale.pendingOn": "Selling via {{serviceProvider}}", - "transaction.status.sale.successOn": "Sold via {{serviceProvider}}", - "transaction.status.sell.canceled": "Отказана продаја", - "transaction.status.sell.canceling": "Отказивање продаје", - "transaction.status.sell.failed": "Продаја није успела", - "transaction.status.sell.pending": "Селлинг", - "transaction.status.sell.success": "Продат", - "transaction.status.sell.successDapp": "Продато на {{externalDappName}}", - "transaction.status.send.canceled": "Отказано слање", - "transaction.status.send.canceling": "Отказивање слања", - "transaction.status.send.failed": "Слање није успело", - "transaction.status.send.pending": "Слање", - "transaction.status.send.success": "Послано", - "transaction.status.send.successDapp": "Послато {{externalDappName}}", - "transaction.status.swap.canceled": "Swap canceled", - "transaction.status.swap.canceling": "Отказивање замене", - "transaction.status.swap.expired": "Замена је истекла", - "transaction.status.swap.failed": "Замена није успела", - "transaction.status.swap.insufficientFunds": "Недовољно средстава", - "transaction.status.swap.pending": "Замена", - "transaction.status.swap.success": "Замењено", - "transaction.status.swap.successDapp": "Замењено на {{externalDappName}}", - "transaction.status.unwrap.canceled": "Отказано одмотавање", - "transaction.status.unwrap.canceling": "Отказивање одмотавања", - "transaction.status.unwrap.failed": "Одмотавање није успело", - "transaction.status.unwrap.pending": "Унвраппинг", - "transaction.status.unwrap.success": "Унвраппед", - "transaction.status.unwrap.successDapp": "Отпакован на {{externalDappName}}", - "transaction.status.wrap.canceled": "Отказано превијање", - "transaction.status.wrap.canceling": "Отказивање омота", - "transaction.status.wrap.failed": "Умотавање није успело", - "transaction.status.wrap.pending": "Враппинг", - "transaction.status.wrap.success": "Умотано", - "transaction.status.wrap.successDapp": "Умотано на {{externalDappName}}", - "transaction.submittedOn": "Submitted on", - "transaction.summary.liquidity": "{{firstAmountWithSymbol}} and {{secondAmountWithSymbol}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} до {{recipientAddress}}", - "transaction.summary.received.noAmount": "Received from {{name}}", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} од {{senderAddress}}", - "transaction.summary.sent.noAmount": "Sent to {{name}}", - "transaction.warning.insufficientGas.modal.message": "You need ~{{tokenAmount}} {{tokenSymbol}} () on {{networkName}} to cover this transaction’s network cost. Swap {{tokenSymbol}} from another chain or buy with your card to proceed.", - "transaction.warning.insufficientGas.modal.message.noAction": "Треба вам ~{{tokenAmount}} {{tokenSymbol}} () на {{networkName}} да покријете мрежне трошкове ове трансакције.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount": "Треба вам ~{{tokenAmount}} {{tokenSymbol}} () на {{networkName}} да покријете мрежне трошкове ове трансакције.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount.noAction": "To swap for this token, you need more {{tokenSymbol}} on {{networkName}}.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "Није довољно {{tokenSymbol}} на {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Није довољно {{tokenSymbol}}", - "transaction.warning.maxNative.message": "You’re about to spend most of your network token balance. This may leave insufficient funds to cover future network costs.", - "transaction.warning.maxNative.title": "Low network token balance", - "transaction.watcher.error.cancel": "Није могуће отказати трансакцију", - "transaction.watcher.error.status": "Грешка приликом провере статуса трансакције", - "uniswapX.aggregatesLiquidity": " обједињује изворе ликвидности за боље цене и размену без гаса.", - "uniswapX.cost": "UniswapX removes the typical costs to transact on the blockchain.", - "uniswapx.description": "УнисвапКс обједињује изворе ликвидности за боље цене и свопове без гаса.", - "uniswapx.description.unsupported": "UniswapX is currently unavailable because your smart wallet settings are managed by a different wallet app.", - "uniswapx.included": "Includes UniswapX", - "uniswapx.item": " УнисвапКс ", - "uniswapx.label": "УнисвапКс", - "uniswapX.learnMore": "Сазнајте више о размени са УнисвапКс", - "uniswapx.unavailable.title": "UniswapX is unavailable", - "uniswapx.v2QuoteFailed": "УнисвапКс в2 тврди цитат није успео. Покушајте поново са класичном заменом.", - "unitags.banner.button.claim": "Захтевај сада", - "unitags.banner.subtitle": "Направите персонализовани веб3 профил и лако поделите своју адресу са пријатељима.", - "unitags.banner.title.compact": "Узмите своје {{unitagDomain}} корисничко име и направите свој прилагодљиви профил.", - "unitags.banner.title.full": "Затражите своје {{unitagDomain}} корисничко име", - "unitags.choosePhoto.option.cameraRoll": "Изаберите неку од камера", - "unitags.choosePhoto.option.computer": "Отпреми са рачунара", - "unitags.choosePhoto.option.nft": "Изаберите НФТ", - "unitags.choosePhoto.option.remove": "Уклони слику профила", - "unitags.claim.available": "Available", - "unitags.claim.confirmation.customize": "Прилагодите профил", - "unitags.claim.confirmation.description": "{{unitagAddress}} је спреман за слање и примање криптовалута. Наставите да градите свој новчаник прилагођавањем свог веб3 профила.", - "unitags.claim.confirmation.success.long": "Договорено!", - "unitags.claim.confirmation.success.short": "разумем!", - "unitags.claim.error.addressLimit": "Већ сте направили максималан број промена у корисничком имену за ову адресу", - "unitags.claim.error.avatar": "Није могуће поставити аватар. Покушајте поново касније.", - "unitags.claim.error.default": "Није могуће затражити корисничко име. Покушајте поново касније.", - "unitags.claim.error.deviceLimit": "Достигли сте максималан број корисничких имена која могу бити активна за овај уређај", - "unitags.claim.error.general": "Није могуће затражити корисничко име", - "unitags.claim.error.unavailable": "Ово корисничко име није доступно", - "unitags.claim.error.unknown": "Непозната грешка", - "unitags.claim.username.default": "твоје име", - "unitags.delete.confirm.subtitle": "Спремате се да избришете своје корисничко име и прилагодљиве детаље профила. Нећете моћи да га повратите.", - "unitags.delete.confirm.title": "Јеси ли сигуран?", - "unitags.editProfile.placeholder": "корисничко име", - "unitags.editUsername.confirm.subtitle": "Управо ћете променити своје корисничко име. Једном када га промените, више га никада не можете захтевати.", - "unitags.editUsername.confirm.title": "Јеси ли сигуран?", - "unitags.editUsername.title": "Уредите своје корисничко име", - "unitags.editUsername.warning.default": "Једном када промените своје корисничко име, више никада нећете моћи да га захтевате. Можете га променити само 2 пута.", - "unitags.editUsername.warning.max": "Достигли сте максималан број од 2 промене корисничког имена.", - "unitags.extension.intro.buttton": "Затражите корисничко име", - "unitags.extension.intro.description": "Реците збогом адресама 0к. Корисничка имена су читљива имена која олакшавају слање и примање криптовалута.", - "unitags.extension.intro.title": "Представљамо корисничка имена", - "unitags.extension.intro.upsell.customizable": "Прилагодљиви профили", - "unitags.extension.intro.upsell.ens": "Покреће ЕНС поддомени", - "unitags.extension.intro.upsell.free": "Слободно тражити", - "unitags.intro.features.ens": "Покреће ЕНС поддомени", - "unitags.intro.features.free": "Слободно тражити", - "unitags.intro.features.profile": "Прилагодљиви профили", - "unitags.intro.subtitle": "Реците збогом адресама 0к. Корисничка имена су читљива имена која олакшавају слање и примање криптовалута.", - "unitags.intro.title": "Представљамо корисничка имена", - "unitags.notification.delete.error": "Није могуће избрисати корисничко име. Покушајте поново касније.", - "unitags.notification.delete.title": "Корисничко име је избрисано", - "unitags.notification.profile.error": "Ажурирање профила није успело. Покушајте поново касније.", - "unitags.notification.profile.title": "профил ажуриран", - "unitags.notification.username.error": "Није могуће променити корисничко име. Покушајте поново касније.", - "unitags.notification.username.title": "Корисничко име је промењено", - "unitags.onboarding.claim.subtitle": "Ово је ваша персонализована адреса на коју људи могу да пошаљу криптовалуте.", - "unitags.onboarding.claim.title.choose": "Креирајте своје корисничко име", - "unitags.onboarding.claim.title.claim": "Затражите своје корисничко име", - "unitags.onboarding.info.description": "Корисничка имена трансформишу сложене 0к адресе у читљива имена. Полагањем {{unitagDomain}} корисничког имена, можете лако да шаљете и примате криптовалуте и да направите јавни веб3 профил.", - "unitags.onboarding.info.title": "Поједностављена адреса", - "unitags.onboarding.profile.subtitle": "Отпремите своје или држите свој јединствени Уницон. Ово увек можете променити касније.", - "unitags.onboarding.profile.title": "Изаберите слику профила", - "unitags.profile.action.delete": "Избришите корисничко име", - "unitags.profile.action.edit": "Уредите корисничко име", - "unitags.profile.bio.label": "Био", - "unitags.profile.bio.placeholder": "Унесите биографију за свој профил", - "unitags.profile.links.twitter": "Твиттер", - "unitags.username.error.chars": "Корисничка имена могу да садрже само слова и бројеве", - "unitags.username.error.max": "Корисничка имена не могу имати више од {{number}} знакова", - "unitags.username.error.min": "Корисничка имена морају имати најмање {{number}} знакова", - "unitags.username.error.uppercase": "Корисничка имена могу да садрже само мала слова и бројеве", - "uwulink.error.insufficientTokens": "Није довољно {{tokenSymbol}} на {{chain}}", - "v2.notAvailable": "Унисвап В2 није доступан на овој мрежи.", - "wallet.appSignIn": "Пријавите се са апликацијом", - "wallet.connectingAgreement": "Повезивањем новчаника, прихватате Услове коришћења услуге
~⌇ Лабс-а и прихватате његову Политику приватности.", - "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", - "wallet.mismatch.popup.description": "Some features are not supported by your connected wallet.", - "wallet.mismatch.popup.title": "Limited wallet support", - "wallet.other": "Други новчаници", - "wallet.scanToConnect": "Скенирајте КР код да бисте се повезали", - "wallet.wrongNet": "Ваш новчаник је повезан на погрешну мрежу.", - "walletConnect.dapps.empty.description": "Повежите се са апликацијом скенирањем кода преко ВаллетЦоннецт-а", - "walletConnect.dapps.manage.empty.title": "Нема повезаних апликација", - "walletConnect.dapps.manage.title": "Connections", - "walletConnect.error.connection.message": "Унисвап новчаник тренутно подржава {{chainNames}}. Молимо користите само \"{{dappName}}\" на овим ланцима", - "walletConnect.error.connection.title": "Грешка везе", - "walletConnect.error.general.message": "Дошло је до проблема са ВаллетЦоннецт-ом. Молим вас, покушајте поново", - "walletConnect.error.general.title": "ВаллетЦоннецт Грешка", - "walletConnect.error.scantastic.message": "Дошло је до проблема са вашим КР кодом. Молим вас, покушајте поново", - "walletConnect.error.scantastic.title": "Неважећи КР код", - "walletConnect.error.unsupported.message": "Уверите се да скенирате важећи ВаллетЦоннецт, Етхереум адресу или КР код Унисвап екстензије пре него што покушате поново.", - "walletConnect.error.unsupported.title": "Неважећи КР код", - "walletConnect.error.unsupportedV1.message": "ВаллетЦоннецт в1 више није подржан. Апликација са којом покушавате да се повежете мора да се надогради на ВаллетЦоннецт в2.", - "walletConnect.error.unsupportedV1.title": "Неважећи КР код", - "walletConnect.error.uwu.scan": "Дошло је до проблема приликом скенирања овог КР кода.", - "walletConnect.error.uwu.title": "УвУ Линк грешка", - "walletConnect.error.uwu.unsupported": "Овај КР код није подржан.", - "walletConnect.pending.button.connect": "Повежите се", - "walletConnect.pending.button.reject": "Reject", - "walletConnect.pending.button.scrollDown": "Померите се надоле да бисте се повезали", - "walletConnect.pending.threat.confirmationText": "I understand the risks", - "walletConnect.pending.threat.description": "Signing messages or transactions from this app could result in a loss of funds.", - "walletConnect.pending.threat.title": "Malicious app detected", - "walletConnect.pending.title": "Повежите се са {{dappName}}", - "walletConnect.pending.unverified.description": "Make sure you trust this site before proceeding. ", - "walletConnect.pending.unverified.title": "Unverified app", - "walletConnect.permissions.option.requestApprovals": "Request transaction approvals", - "walletConnect.permissions.option.transferAssets": "Move funds without permission", - "walletConnect.permissions.option.viewTokenBalances": "View your balance and activity", - "walletConnect.permissions.title": "App permissions", - "walletConnect.request.bundledTransactions.label_one": "Single bundled transaction", - "walletConnect.request.bundledTransactions.label_other": "{{count}} bundled transactions", - "walletConnect.request.button.scrollDown": "Померите се надоле да бисте потписали", - "walletConnect.request.button.sign": "Сигн", - "walletConnect.request.details.label.function": "Функција", - "walletConnect.request.details.label.sending": "Слање", - "walletConnect.request.details.label.token": "Токен", - "walletConnect.request.details.label.tokens": "Токенс", - "walletConnect.request.error.insufficientFunds": "Немате довољно {{currencySymbol}} да довршите ову трансакцију.", - "walletConnect.request.error.network": "Грешка интернет или мрежне везе", - "walletConnect.request.warning.batch.message": "Be careful: this request contains multiple transactions and could transfer assets", - "walletConnect.request.warning.general.message": "Будите опрезни: ова порука може пренети средства", - "walletConnect.request.warning.message": "Да бисте потписали поруке или трансакције, мораћете да увезете фразу за опоравак новчаника.", - "walletConnect.request.warning.title": "Овај новчаник је у режиму само за преглед", - "web.explore.description": "Откријте и истражите токене на {{network}}. Истражите врхунске базене. Погледајте цене у реалном времену, обим трговања, ТВЛ, графиконе и податке о трансакцијама.", - "web.explore.title.pools": "Истражите врхунске базене на {{network}} на Унисвап-у", - "web.explore.title.tokens": "Истражите најбоље токене на {{network}} на Унисвап-у", - "web.explore.title.transactions": "Истражите најбоље трансакције на {{network}} на Унисвап-у" -} diff --git a/packages/uniswap/src/i18n/locales/translations/sv-SE.json b/packages/uniswap/src/i18n/locales/translations/sv-SE.json deleted file mode 100644 index dd01404d9fc..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/sv-SE.json +++ /dev/null @@ -1,2563 +0,0 @@ -{ - "account.authHeader.claimReward": "Gör anspråk på {{amount}} belöning", - "account.cloud.backup.subtitle": "Det finns flera återställningsfraser säkerhetskopierade till din {{cloudProviderName}}.", - "account.cloud.backup.title": "Välj en säkerhetskopia att återställa", - "account.cloud.button.restore.android": "Återställ från Google Drive", - "account.cloud.button.restore.ios": "Återställ från iCloud", - "account.cloud.empty.description": "Det verkar som att du inte har säkerhetskopierat några av dina återställningsfraser till {{cloudProviderName}}.", - "account.cloud.empty.title": "0 säkerhetskopior hittades", - "account.cloud.error.backup.message": "Det gick inte att importera säkerhetskopior på grund av brist på behörigheter, avbrott i auktorisering eller på grund av ett molnfel", - "account.cloud.error.backup.title": "Fel vid import av säkerhetskopior", - "account.cloud.error.password.title": "Felaktigt lösenord. Var god försök igen.", - "account.cloud.error.unavailable.button.cancel": "Inte nu", - "account.cloud.error.unavailable.button.settings": "Gå till Inställningar", - "account.cloud.error.unavailable.message.android": "Verifiera att du är inloggad på ett Google-konto med Google Drive aktiverat på den här enheten och försök igen.", - "account.cloud.error.unavailable.message.ios": "Kontrollera att du är inloggad på ett Apple-ID med iCloud Drive aktiverat på den här enheten och försök igen.", - "account.cloud.error.unavailable.title.android": "Google Drive är inte tillgängligt", - "account.cloud.error.unavailable.title.ios": "iCloud Drive är inte tillgängligt", - "account.cloud.loading.title": "Söker efter säkerhetskopior...", - "account.cloud.lockout.time.hours_one": "För många försök. Försök igen om 1 timme.", - "account.cloud.lockout.time.hours_other": "För många försök. Försök igen om {{count}} timmar.", - "account.cloud.lockout.time.minutes_one": "För många försök. Försök igen om 1 minut.", - "account.cloud.lockout.time.minutes_other": "För många försök. Försök igen om {{count}} minuter.", - "account.cloud.password.input": "Skriv in lösenord", - "account.cloud.password.recoveryPhrase": "Ange din återställningsfras istället", - "account.cloud.password.subtitle": "Detta lösenord krävs för att återställa säkerhetskopian av din återställningsfras från {{cloudProviderName}}.", - "account.cloud.password.title": "Ange säkerhetskopieringslösenord", - "account.downloadWallet.subtitle": "Säkerhetskopiera din plånbok, handla när du är på språng, få liveprisaviseringar och mer.", - "account.drawer.gitHash": "Git-hash: ", - "account.drawer.gitVersion": "Version: ", - "account.drawer.modal.body": "Förvara och byt ut tokens på ett säkert sätt med Uniswap-appen. Tillgänglig på iOS och Android.", - "account.drawer.modal.dont": "Har du ingen Uniswap-plånbok?", - "account.drawer.modal.scan": "Skanna med Uniswap Wallet", - "account.drawer.spamToggle": "Dölj okända tokens och NFT:er", - "account.passkey.delete.acknowledge": "Jag har säkerhetskopierat min återställningsfras och förstår att Uniswap Labs inte kan hjälpa mig att återställa min plånbok om jag inte gjorde det.", - "account.passkey.delete.description": "Se till att du har säkerhetskopierat din återställningsfras med Uniswap-mobilappen eller webbläsartillägget.", - "account.passkey.delete.descriptionEmphasized": "Utan din återställningsfras kanske du inte kan komma åt din plånbok.", - "account.passkey.delete.speedbump.description": "Innan du fortsätter, slutför följande steg för att undvika att förlora åtkomst till din plånbok och alla pengar.", - "account.passkey.delete.speedbump.step1": "Ladda ner Uniswap-mobilappen eller webbläsartillägget", - "account.passkey.delete.speedbump.step2": "Säkerhetskopiera din återställningsfras", - "account.passkey.delete.speedbump.title": "Är du säker?", - "account.passkey.delete.title": "Radera lösenord?", - "account.passkey.log.in.title": "Logga in med lösenord", - "account.passkey.type.crossplatform": "Telefon, surfplatta eller säkerhetsnyckel", - "account.passkey.type.platform": "Webbläsare eller operativsystem", - "account.passkey.verify.button": "Verifiera med lösenord", - "account.passkey.verify.description": "Innan du fortsätter, använd din lösenordsnyckel för att verifiera din identitet. Detta hjälper till att skydda ditt konto.", - "account.passkey.verify.title": "Låt oss först verifiera att det är du", - "account.portfolio.activity.canceledBelow": "Den här beställningen avbröts eftersom ditt saldo understeg det inmatade beloppet.", - "account.portfolio.activity.signLimit": "Den här beställningen kommer inte att fyllas eftersom ditt saldo gick under det inmatade beloppet. Öka ditt saldo för att fixa.", - "account.recoveryPhrase.education.part1": "En återställningsfras (eller fröfras) är en uppsättning ord som krävs för att komma åt din plånbok, som ett lösenord.", - "account.recoveryPhrase.education.part2": "Du kan ange din återställningsfras på en ny enhet för att återställa din plånbok och dess innehåll.", - "account.recoveryPhrase.education.part3": "Men om du tappar din återställningsfras, kommer du att förlora åtkomst till din plånbok.", - "account.recoveryPhrase.education.part4": "Istället för att memorera din återställningsfras kan du säkerhetskopiera den till {{cloudProviderName}} och skydda den med ett lösenord.", - "account.recoveryPhrase.education.part5": "Du kan också manuellt säkerhetskopiera din återställningsfras genom att skriva ner den och förvara den på ett säkert ställe.", - "account.recoveryPhrase.education.part6": "Vi rekommenderar att du använder båda typerna av säkerhetskopior, för om du tappar din återställningsfras kommer du inte att kunna återställa din plånbok.", - "account.recoveryPhrase.error.invalid": "Ogiltig fras", - "account.recoveryPhrase.error.invalidWord": "Ogiltigt ord: {{word}}", - "account.recoveryPhrase.error.phraseLength": "Återställningsfrasen måste bestå av 12-24 ord", - "account.recoveryPhrase.error.wordIsAddress": "Du har angett en adress, inte en återställningsfras", - "account.recoveryPhrase.error.wrong": "Fel återställningsfras", - "account.recoveryPhrase.helpText.import": "Hur hittar jag min återhämtningsfras?", - "account.recoveryPhrase.helpText.restoring": "Försök att söka igen", - "account.recoveryPhrase.input": "Skriv din återställningsfras", - "account.recoveryPhrase.remove.final.description": "Se till att du har skrivit ner din återställningsfras eller säkerhetskopierat den på {{cloudProviderName}}. Du kommer inte att kunna komma åt dina pengar annars.", - "account.recoveryPhrase.remove.final.title": "Du tar bort din återställningsfras", - "account.recoveryPhrase.remove.import.description": "Du kan bara lagra en återställningsfras åt gången. För att fortsätta importera en ny måste du ta bort din nuvarande återställningsfras och eventuella tillhörande plånböcker från den här enheten.", - "account.recoveryPhrase.remove.initial.description": "Detta tar bort din plånbok från den här enheten tillsammans med din återställningsfras.", - "account.recoveryPhrase.remove.initial.title": "Du tar bort {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "Din återställningsfras förblir lagrad tills du tar bort alla återstående plånböcker.", - "account.recoveryPhrase.subtitle.import": "Din återställningsfras kommer endast att lagras lokalt på din enhet.", - "account.recoveryPhrase.subtitle.restoring": "Ange din återställningsfras nedan eller försök att söka efter säkerhetskopior igen.", - "account.recoveryPhrase.title.import": "Ange din återställningsfras", - "account.recoveryPhrase.title.restoring": "Inga säkerhetskopior hittades", - "account.wallet.action.copy": "Kopiera adress", - "account.wallet.action.manageConnections": "Hantera anslutningar", - "account.wallet.action.report": "Rapportera profil", - "account.wallet.action.viewExplorer": "Visa på {{blockExplorerName}}", - "account.wallet.button.add": "Lägg till plånbok", - "account.wallet.button.addViewOnly": "Lägg till en skrivskyddad plånbok", - "account.wallet.button.create": "Skapa en ny plånbok", - "account.wallet.button.import": "Importera en ny plånbok", - "account.wallet.button.manage": "Plånboksinställningar", - "account.wallet.button.remove": "Ta bort plånboken", - "account.wallet.button.watch": "Titta på en plånbok", - "account.wallet.create.placeholder": "Plånbok {{index}}", - "account.wallet.edit.label.input.placeholder": "Plånboksetikett", - "account.wallet.header.button.disabled.title": "Redigera profil", - "account.wallet.header.button.title": "Redigera etikett", - "account.wallet.header.viewOnly": "View-only plånböcker", - "account.wallet.menu.claimUsername": "Gör anspråk på användarnamn", - "account.wallet.menu.copy.title": "Kopiera plånboksadress", - "account.wallet.menu.edit.title": "Redigera etikett", - "account.wallet.menu.manageConnections": "Hantera anslutningar", - "account.wallet.menu.remove.title": "Ta bort plånboken", - "account.wallet.remove.check": "Jag säkerhetskopierade min återställningsfras och förstår att Uniswap Labs inte kan hjälpa mig att återställa mina plånböcker om jag inte gjorde det.", - "account.wallet.remove.title": "Ta bort {{name}}", - "account.wallet.remove.viewOnly": "Du kan alltid lägga till skrivskyddade plånböcker bakifrån genom att ange plånbokens adress.", - "account.wallet.restore.new_device.description": "Eftersom du använder en ny enhet måste du återställa din återställningsfras eller ange ditt lösenord för molnsäkerhetskopiering för att fortsätta.", - "account.wallet.restore.new_device.title": "Återställ din plånbok", - "account.wallet.restore.seed_phrase.description": "Din återställningsfras saknas på din enhet. För att du aldrig ska förlora åtkomst till dina pengar behöver vi att du återställer din plånbok.", - "account.wallet.restore.seed_phrase.title": "Återställ din plånbok", - "account.wallet.select.error": "Det gick inte att läsa in adresser", - "account.wallet.select.loading.subtitle": "Dina plånböcker visas nedan.", - "account.wallet.select.loading.title": "Letar efter plånböcker", - "account.wallet.select.smartWalletDisclaimer": "Som standard använder alla kvalificerade plånböcker smarta plånboksfunktioner när de har importerats. Vad är en smart plånbok?", - "account.wallet.select.title_one_one": "En plånbok hittad", - "account.wallet.select.title_one_other": "Välj plånböcker att importera", - "account.wallet.viewOnly.button": "Importera plånbok", - "account.wallet.viewOnly.description": "För att byta, köpa, skicka och ta emot tokens måste du importera plånbokens återställningsfras.", - "account.wallet.viewOnly.title": "Denna plånbok är endast visningsbar", - "account.wallet.watch.error.alreadyImported": "Den här adressen är redan importerad", - "account.wallet.watch.error.notFound": "Adressen hittades inte", - "account.wallet.watch.error.smartContract": "Adress är ett smart kontrakt", - "account.wallet.watch.message": "Genom att lägga till en skrivskyddad plånbok kan du prova appen eller spåra en plånbok. Du kommer inte att kunna byta eller skicka pengar.", - "account.wallet.watch.placeholder": "ENS eller adress", - "account.wallet.watch.title": "Ange en plånboksadress", - "activity.pending": "{{pendingActivityCount}} Väntar", - "activity.transaction.lpRewards.descriptor": "{{symbol}} insamlade belöningar", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} till {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} för {{amountWithSymbolB}}", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} och {{amountWithSymbolB}}", - "addLiquidity.shareOfPool": "Andel av pool", - "addressInput.recipient": "Mottagare", - "analytics.allow": "Tillåt analys", - "analytics.allow.message": "Vi använder anonymiserad data för att förbättra din upplevelse av Uniswap Labs produkter.", - "appRating.button.notReally": "Inte riktigt", - "appRating.description": "Låt oss veta om du har en bra upplevelse av den här appen", - "appRating.extension.review.description": "Välj ett stjärnbetyg och lämna en recension i Chrome Web Store.", - "appRating.extension.review.title": "Granska Uniswap Extension?", - "appRating.extension.title": "Gillar du Uniswap Extension?", - "appRating.feedback.button.send": "Skicka synpunkter", - "appRating.feedback.description": "Låt oss veta hur vi kan förbättra din upplevelse", - "appRating.feedback.title": "Vi är ledsna att höra det.", - "appRating.mobile.title": "Gillar du Uniswap Wallet?", - "bridgedAsset.modal.button": "Fortsätt att byta", - "bridgedAsset.modal.description": "Detta är en {{chainName}} version av {{currencySymbol}} som stöds av och bibehåller samma pris som den ursprungliga {{currencySymbol}}.", - "bridgedAsset.modal.feature.securelyBacked": "Säkert backat", - "bridgedAsset.modal.feature.securelyBacked.description": "1:1 backas upp av inbyggt {{currencySymbol}}.", - "bridgedAsset.modal.feature.tradeSeamlessly": "Handla sömlöst", - "bridgedAsset.modal.feature.tradeSeamlessly.description": "Köp och sälj {{currencySymbol}} utan att lämna Uniswap.", - "bridgedAsset.modal.feature.withdrawToNativeChain": "Uttag till {{nativeChainName}}", - "bridgedAsset.modal.feature.withdrawToNativeChain.description": "Brygga tillbaka till det ursprungliga nätverket när som helst.", - "bridgedAsset.modal.title": "Handla {{currencySymbol}} på {{chainName}}", - "bridgedAsset.send.warning.description": "Du skickar en inpackad version av {{currencySymbol}} på {{chainName}}. Att skicka den till en centraliserad börs kommer att resultera i en permanent förlust av pengar.", - "bridgedAsset.send.warning.title": "Se till att du skickar till en kompatibel adress", - "bridgedAsset.tdp.description": "Detta är en bryggad version av {{currencySymbol}} som stöds 1:1 av det inbyggda {{currencySymbol}}.", - "bridgedAsset.wormhole.button": "Fortsätt till Maskhålet", - "bridgedAsset.wormhole.description": "Fortsätt till Maskhålsportalen för att överbrygga din {{currencySymbol}} från {{chainName}} till {{nativeChainName}}.", - "bridgedAsset.wormhole.title": "Uttag {{currencySymbol}} till {{nativeChainName}}", - "bridgedAsset.wormhole.toNativeChain": "till {{nativeChainName}}", - "bridgedAsset.wormhole.withdrawToNativeChain": "Uttag till {{nativeChainName}}", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "chart.candlestick": "Ljusstake", - "chart.error.pools": "Det går inte att visa historisk data för den aktuella poolen.", - "chart.error.tokens": "Det går inte att visa historisk data för den aktuella token.", - "chart.line": "Linjediagram", - "chart.missingData": "Sjökortsdata saknas", - "chart.price.label.close": "Stänga", - "chart.price.label.high": "Hög", - "chart.price.label.low": "Låg", - "chart.price.label.open": "Öppen", - "chart.settings.unavailable.label": "Den här inställningen är inte tillgänglig för det aktuella diagrammet", - "claim.thanks": "Tack för att du är en del av Uniswap-communityt ", - "claim.uni.arrived": "UNI har anlänt", - "common.about": "Handla om", - "common.accept": "Acceptera", - "common.active": "Aktiva", - "common.activeNetworks": "Aktiva nätverk", - "common.activity": "Aktivitet", - "common.add.label": "Lägg till", - "common.add.liquidity.canceled": "Lägg till likviditet avbruten", - "common.addLiquidity": "Lägg till likviditet", - "common.address": "Adress", - "common.addressOrENS": "Plånboksadress eller ENS-namn", - "common.advanced": "Avancerad", - "common.all": "Alla", - "common.allTime": "Hela tiden", - "common.and": "och", - "common.app": "App", - "common.approved": "Godkänd", - "common.approvePending": "Godkännande väntar...", - "common.approvePermitTx": "Godkänn begäran {{indexText}}", - "common.approvePermitTx.active": "Godkänn begäran{{indexText}} i plånboken", - "common.approvePermitTx.explainer": "Vad är Permit2-godkännanden?", - "common.approvePermitTx.pending": "Godkänner begäran {{indexText}}...", - "common.approveSpend": "Godkänn {{symbol}} utgifter", - "common.approving": "Godkännande", - "common.approximatelyValue": "~{{value}}", - "common.areYouSure": "Är du säker?", - "common.automatic": "Bil", - "common.availableIn": "Uniswap tillgängligt i: ", - "common.availableOnIOSAndroidChrome": "Tillgänglig på iOS, Android och Chrome", - "common.backToPositions": "Tillbaka till positionerna", - "common.bestRoute": "Rutt", - "common.bestRoute.with": "Rutt via {{provider}}", - "common.biometrics.generic": "Biometri", - "common.biometrics.touchId": "Touch-ID", - "common.biometrics.windowsHello": "Windows Hello", - "common.blocked.ifError": "Om du tror att detta är ett fel, skicka ett e-postmeddelande med din adress till ", - "common.blocked.reason": "Den här adressen är blockerad i Uniswap Labs-gränssnittet eftersom den är associerad med en eller flera blockerade aktiviteter.", - "common.blockedAddress": "Blockerad adress", - "common.blog": "Blogg", - "common.bought": "Köpt", - "common.brandAssets": "Varumärkestillgångar", - "common.button.accept": "Acceptera", - "common.button.back": "Tillbaka", - "common.button.buy": "köpa", - "common.button.cancel": "Annullera", - "common.button.checkin": "Checka in", - "common.button.close": "Stänga", - "common.button.confirm": "Bekräfta", - "common.button.connect": "Ansluta", - "common.button.continue": "Fortsätta", - "common.button.copied": "Kopierade", - "common.button.copy": "Kopiera", - "common.button.create": "Skapa", - "common.button.delete": "Radera", - "common.button.disable": "Inaktivera", - "common.button.disabling": "Inaktivering", - "common.button.disconnect": "Koppla ifrån", - "common.button.dismiss": "Avfärda", - "common.button.done": "Gjort", - "common.button.edit": "Redigera", - "common.button.enable": "Gör det möjligt", - "common.button.finish": "Avsluta", - "common.button.goBack": "Gå tillbaka", - "common.button.later": "Kanske senare", - "common.button.learn": "Läs mer", - "common.button.next": "Nästa", - "common.button.notNow": "Inte nu", - "common.button.ok": "OK", - "common.button.paste": "Klistra", - "common.button.pay": "Betala", - "common.button.proceed": "Fortsätt", - "common.button.receive": "Motta", - "common.button.remove": "Avlägsna", - "common.button.reset": "Återställa", - "common.button.retry": "Försök igen", - "common.button.reveal": "Avslöja", - "common.button.review": "Recension", - "common.button.save": "Spara", - "common.button.scrollDown": "Scrolla ner", - "common.button.sell": "Sälja", - "common.button.send": "Skicka", - "common.button.setup": "Uppstart", - "common.button.share": "Dela med sig", - "common.button.showLess": "Visa mindre", - "common.button.showMore": "Visa mer", - "common.button.sign": "Skylt", - "common.button.skip": "Hoppa", - "common.button.swap": "Byta", - "common.button.tryAgain": "Försök igen", - "common.button.understand": "jag förstår", - "common.button.unlock": "Låsa upp", - "common.button.view": "Se", - "common.button.viewDetails": "Visa detaljer", - "common.button.yes": "Ja", - "common.buy.label": "köpa", - "common.buyAndSell": "Köp och sälj på Uniswap", - "common.cancellationSubmitted": "Uppsägning skickad", - "common.cancellationSuccessful": "Avbokningen lyckades", - "common.cancelOrder": "Avbryt beställning", - "common.card.error.description": "Något gick fel", - "common.card.error.title": "hoppsan! Något gick fel.", - "common.careers": "Karriärer", - "common.chain.networkCost": "{{chain}} nätverkskostnad", - "common.chart": "Diagram", - "common.checkNetwork": "Kontrollera nätverksstatus här.", - "common.chromeExtension": "Förlängning", - "common.claim.failed": "Anspråket misslyckades", - "common.claimed": "Påstod", - "common.claiming": "Anspråk", - "common.claimUnis": "Gör anspråk på dina UNI-tokens", - "common.clear": "Rensa", - "common.close": "Stänga", - "common.closed": "Stängd", - "common.collect.button": "Samla", - "common.company": "Företag", - "common.confirm": "Bekräfta", - "common.confirmCancellation": "Bekräfta avbokningen", - "common.confirmed": "Bekräftad", - "common.confirmSend.button": "Bekräfta skicka", - "common.confirmSwap": "Bekräfta bytet i plånboken", - "common.confirmTimedOut": "Bekräftelsen tog timeout. Försök igen.", - "common.confirmTransfer": "Bekräfta överföring", - "common.confirmWallet": "Bekräfta i plånboken", - "common.connect.button": "Ansluta", - "common.connectAWallet.button": "Anslut en plånbok", - "common.connectAWallet.button.evm": "Anslut Ethereum-plånboken", - "common.connectAWallet.button.evm.switch": "Byt Ethereum-plånbok", - "common.connectAWallet.button.svm": "Anslut Solana-plånboken", - "common.connectAWallet.button.svm.switch": "Byt Solana-plånbok", - "common.connectAWallet.button.switch": "Byt plånbok", - "common.connectTo": "Anslut till {{platform}}", - "common.connectWallet.button": "Anslut plånbok", - "common.contactUs.button": "Kontakta oss", - "common.copied": "Kopierade", - "common.copy.address": "Kopiera adress", - "common.copy.poolId": "Kopiera pool-ID", - "common.copyLink.button": "Kopiera länk", - "common.created.date": "Skapade {{date}}", - "common.currency": "Valuta", - "common.currentPrice": "Nuvarande pris", - "common.custom": "Beställnings", - "common.customRange": "Anpassat sortiment", - "common.dataOutdated": "Data kan vara inaktuella", - "common.day": "dag", - "common.default": "Standard", - "common.defaultTradeOptions": "Standard handelsalternativ", - "common.deposit.toNetwork": "Sätt in tokens till {{label}} -nätverket.", - "common.depositing": "Insättning", - "common.depositTokens": "Insättningspoletter", - "common.detected": "Upptäckt", - "common.developers": "Utvecklare", - "common.device": "Den här enheten", - "common.device.other": "Annan enhet", - "common.dismiss": "Avfärda", - "common.docs": "Dokument", - "common.donate": "Donera", - "common.done": "Gjort", - "common.dontShowAgain": "Visa inte detta igen", - "common.download": "Ladda ner", - "common.downloadAppStore": "Ladda ner i App Store", - "common.downloadPlayStore": "Ladda ner i Play Butik", - "common.downloadUniswapApp": "Ladda ner Uniswap-appen", - "common.downloadUniswapWallet": "Ladda ner Uniswap-plånboken", - "common.dynamic": "Dynamisk", - "common.edit.button": "Redigera", - "common.ended": "Avslutade", - "common.error.details": "Feldetaljer", - "common.error.general": "Något gick fel", - "common.error.label": "Fel", - "common.error.request": "Tyvärr uppstod ett fel när din begäran bearbetades. Om du begär support, se till att kopiera informationen om detta fel.", - "common.error.somethingWrong": "Något gick fel!", - "common.errorConnecting.error": "Anslutningsfel", - "common.errorLoadingData.error": "Det gick inte att ladda data", - "common.etherscan": "Etherscan", - "common.expiry": "Upphörande", - "common.explore": "Utforska", - "common.explorer": "Utforskare", - "common.exploreTokens": "Utforska tokens", - "common.extension": "Uniswap-förlängning", - "common.failedSwitchNetwork": "Det gick inte att byta nätverk", - "common.fee": "Avgift", - "common.fees": "Avgifter", - "common.feesEarned": "Intjänade avgifter", - "common.feesEarnedPerBase": "{{symbolA}} per {{symbolB}}", - "common.for": "För", - "common.free": "Gratis", - "common.fullRange": "Komplett utbud", - "common.getApp": "Skaffa app", - "common.getHelp.button": "Få hjälp", - "common.getStarted": "Kom igång", - "common.getSupport.button": "Få stöd", - "common.getTheApp": "Skaffa appen", - "common.getUniswapWallet": "Skaffa Uniswap Wallet", - "common.getUniswapWallet.mobile": "Skaffa Uniswap-mobilappen", - "common.governance": "Styrning", - "common.happyHolidays": "Glad helg från Uniswap-teamet!", - "common.help": "Hjälp", - "common.helpCenter": "Hjälpcenter", - "common.hidden": "Dold", - "common.hide.button": "Dölj", - "common.highPrice": "Högt pris", - "common.includes": "Inkluderar", - "common.info.label": "Info", - "common.input.noRecipient.error": "Välj mottagare", - "common.input.password.confirm": "Bekräfta lösenord", - "common.input.password.error.mismatch": "Lösenord matchar inte", - "common.input.password.error.weak": "Detta lösenord är för svagt", - "common.input.password.new": "Nytt lösenord", - "common.input.password.placeholder": "Lösenord", - "common.input.password.strength.medium": "Medium", - "common.input.password.strength.strong": "Stark", - "common.input.password.strength.weak": "Svag", - "common.input.search": "Sök", - "common.insufficient.funds": "Otillräckliga medel", - "common.insufficientBalance.error": "Otillräcklig balans", - "common.insufficientFundsForNetworkFee.error": "Otillräckliga medel för att täcka nätverkskostnader", - "common.insufficientTokenBalance.error": "Otillräckligt {{tokenSymbol}} balans", - "common.insufficientTokenBalance.error.simple": "Inte tillräckligt {{tokenSymbol}}", - "common.invalidPair": "Ogiltigt par", - "common.invalidRecipient.error": "Ogiltig mottagare", - "common.iOSAndroid": "iOS och Android", - "common.language": "Språk", - "common.learnMoreSwap": "Läs mer om byten", - "common.legalAndPrivacy": "Juridik och integritet", - "common.less": "Mindre", - "common.limit.cancel_one": "Avbryt gräns", - "common.limit.cancel_other": "Avbryt {{count}} gränser", - "common.limit.canceled": "Gränsen avbruten", - "common.limit.executed": "Begränsning utförd", - "common.limit.expired": "Gränsen har löpt ut", - "common.limit.failed": "Gränsen misslyckades", - "common.limit.opened": "Gränsen öppnad", - "common.limit.pending": "Begränsning väntar", - "common.limits": "Gränser", - "common.limits.approachMax": "Närmar sig maxgränsen 100", - "common.limits.cancelProceed": "Avbryt gränserna för att fortsätta", - "common.limits.expires": "Upphör att gälla {{timestamp}}", - "common.limits.open": "Öppna gränser", - "common.limits.when": "när {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "Länkar", - "common.liquidity": "Likviditet", - "common.liquidity.provision": "Likviditetsavsättning", - "common.liquidity.removed": "Likviditet borttagen", - "common.loading": "Läser in", - "common.longText.button.less": "Läs mindre", - "common.longText.button.more": "Läs mer", - "common.lowPrice": "Lågt pris", - "common.manage": "Hantera", - "common.market.label": "Marknadsföra", - "common.marketPrice": "Marknadspris", - "common.marketPrice.fetching": "Hämtar marknadspris...", - "common.marketPrice.label": "Marknadspris:", - "common.marketPrice.unavailable": "Marknadspriset hittades inte. Gör din egen forskning för att undvika förlust av pengar.", - "common.max": "Max", - "common.message": "Meddelande", - "common.migrate": "Flytta", - "common.migrate.liquidity.failed": "Migrera likviditet misslyckades", - "common.migrate.position": "Migrera position", - "common.migrated.liquidity": "Migrerad likviditet", - "common.migrating.liquidity": "Migrerar likviditet", - "common.min": "Min", - "common.more": "Mer", - "common.moreDetails": "Mer information", - "common.navigation.settings": "inställningar", - "common.navigation.systemSettings": "inställningar", - "common.navigationButton": "Navigeringsknapp", - "common.needHelp": "Behövs hjälp?", - "common.networkCost": "Nätverkskostnad", - "common.neverMind": "Glöm det", - "common.new": "Ny", - "common.new.exclamation": "Ny!", - "common.nft": "NFT", - "common.nfts": "NFTs", - "common.noAmount.error": "Ange ett belopp", - "common.noData": "Inga data", - "common.none": "Ingen", - "common.noResults": "Inga resultat funna.", - "common.notAvailableInRegion.error": "Ej tillgängligt i din region", - "common.notCreated.label": "Inte skapad", - "common.notSupported": "Stöds inte", - "common.oneDay": "1 dag", - "common.oneDay.short": "1D", - "common.oneHour.short": "1H", - "common.oneMonth": "1 månad", - "common.oneWeek": "1 vecka", - "common.oneYear": "1 år", - "common.opensea.link": "Visa på OpenSea", - "common.orderCanceled": "Beställningen annullerad", - "common.orderExecuted": "Order utförd", - "common.orderExpired": "Beställningen har löpt ut", - "common.orderPending": "Beställning väntar", - "common.outOfRange": "Utom räckhåll", - "common.pageNotFound": "Sidan hittas inte!", - "common.passkey.count": "Nyckel {{number}}", - "common.passkeys": "Nyckelnycklar", - "common.passkeys.add": "Lägg till ett lösenord", - "common.passkeys.add.description": "Välj var du vill spara ditt nya lösenord.", - "common.pastDay": "Senaste dagen", - "common.pastFiveMinutes": "Senaste fem minuterna", - "common.pastHour": "Senaste timmen", - "common.pastMonth": "Senaste månaden", - "common.pastWeek": "Förra veckan", - "common.pastYear": "Förra året", - "common.pending": "I väntan på", - "common.pending.cancellation": "Väntar på avbokning", - "common.pendingEllipsis": "I väntan på...", - "common.permit": "Tillåta", - "common.plusMore": "+{{number}} mer", - "common.pool": "Slå samman", - "common.pools": "Pooler", - "common.portfolio": "Portfölj", - "common.poweredBy": "Drivs av ", - "common.price": "Pris", - "common.priceUpdated": "Pris uppdaterat", - "common.privacyChoices": "Dina integritetsval", - "common.privacyChoices.checkbox.description": "När markerad kommer vi inte att dela dina uppgifter med tredjepartspartners för personlig reklam. Du kan aktivera delning när som helst genom att avmarkera den här rutan.", - "common.privacyChoices.checkbox.label": "Dela inte min information", - "common.privacyChoices.description": "Vi kan komma att dela enhetsidentifierare med våra annonspartners för att marknadsföra våra tjänster på andra webbplatser och plattformar. Om detta kvalificeras som försäljning, delning eller riktad reklam enligt tillämpliga lagar, kan du välja bort det genom att markera rutan \"dela inte min information\". För mer information om vår sekretesspraxis, läs vår Sekretesspolicy.", - "common.privacyChoices.disclaimer": "Observera att ditt val endast kommer att gälla för den här webbläsaren på den här enheten. Du kan också välja bort det genom att aktivera inställningen Global Privacy Control i webbläsaren som du använder för att komma åt våra tjänster. Gå till dina inställningar för att se fler alternativ.", - "common.privacyPolicy": "Integritetspolicy", - "common.proceed": "Fortsätt", - "common.proceedInWallet": "Fortsätt i din plånbok", - "common.products": "Produkter", - "common.protocol": "Protokoll", - "common.protocol.v2": "Uniswap v2", - "common.protocol.v3": "Uniswap v3", - "common.protocol.v4": "Uniswap v4", - "common.purchased": "Köpt", - "common.rate": "Betygsätta", - "common.readMore": "Läs mer", - "common.receive": "Motta", - "common.received": "Mottagen", - "common.recent": "Nyligen", - "common.refresh": "Uppdatera", - "common.reload.label": "Ladda om appen", - "common.remove.label": "Avlägsna", - "common.remove.liquidity.canceled": "Borttagning av likviditet avbröts", - "common.remove.liquidity.failed": "Det gick inte att ta bort likviditet", - "common.removing.liquidity": "Ta bort likviditet", - "common.resetLimit": "Återställ {{symbol}} gränsen", - "common.resetLimitWallet": "Återställ {{symbol}} -gränsen i plånboken", - "common.resettingLimit": "Återställer {{symbol}} gräns...", - "common.revoke.approval.failed": "Återkalla godkännande misslyckades", - "common.revoked.approval": "Återkallat godkännande", - "common.revoking.approval": "Återkalla godkännande", - "common.scanQRDownload": "Skanna QR-koden med din telefon för att ladda ner", - "common.selectRegion.label": "Välj din region", - "common.selectToken.label": "Välj en token", - "common.sell.label": "Sälja", - "common.send.button": "Skicka", - "common.send.failed": "Skicka misslyckades", - "common.sending": "Sändning", - "common.sent": "Skickat", - "common.settings": "inställningar", - "common.share": "Dela med sig", - "common.share.shareToTwitter": "Dela på Twitter", - "common.show.button": "Visa", - "common.showLess.button": "Visa mindre", - "common.showMore.button": "Visa mer", - "common.signatureExpired": "Din signatur har upphört att gälla.", - "common.signMessage": "Signera meddelande", - "common.signMessageWallet": "Signera meddelande i plånboken", - "common.socials": "Sociala medier", - "common.sold": "Såld", - "common.stats": "Statistik", - "common.status": "Status", - "common.step.number": "Steg {{number}}", - "common.step.number.of": "Steg {{current}} av {{total}}", - "common.swap": "Byta", - "common.swap.expired": "Bytet har löpt ut", - "common.swap.failed": "Byte misslyckades", - "common.swapPending": "Byte väntar...", - "common.termsOfService": "Användarvillkor", - "common.text.connected": "Ansluten", - "common.text.contract": "Avtal", - "common.text.disconnected": "Osammanhängande", - "common.text.error": "Fel", - "common.text.notAvailable": "N/A", - "common.text.recipient": "Till", - "common.text.sender": "Från", - "common.text.unknown": "Okänd", - "common.thisAccount": "detta konto", - "common.thisMonth": "Den här månaden", - "common.thisToken": "Denna token", - "common.thisWeek": "Denna vecka", - "common.thisYear": "Det här året", - "common.time": "Tid", - "common.time.minute.amt": "{{time}}m", - "common.time.minutes": "minuter", - "common.time.past.days": "{{days}} dagar", - "common.time.past.days.short": "{{days}}d", - "common.time.past.hours": "{{hours}} timmar", - "common.time.past.hours.short": "{{hours}}h", - "common.time.past.minutes.short": "{{minutes}}m", - "common.time.past.months.short": "{{months}}mån", - "common.time.past.seconds.short": "{{seconds}}s", - "common.to": "till", - "common.today": "I dag", - "common.tokenA": "Token A", - "common.tokenAmount": "Tokent belopp", - "common.tokenB": "Token B", - "common.tokenName": "Tokennamn", - "common.tokens": "Polletter", - "common.totalUniswapTVL": "Totalt Uniswap TVL", - "common.totalValueLocked": "TVL", - "common.trade": "Handel", - "common.trademarkPolicy": "Varumärkespolicy", - "common.transactionDetails": "Transaktions Detaljer", - "common.transactionId": "Transaktions ID", - "common.transactionPending": "Transaktion väntar", - "common.transactions": "Transaktioner", - "common.transactionSettings": "Transaktionsinställningar", - "common.transfer_one": "överföra", - "common.transfer_other": "överföringar", - "common.tryAgain.error": "Försök igen", - "common.twitter": "Kvittra", - "common.type.label": "Typ", - "common.unavailable": "Inte tillgänglig", - "common.unhide": "Visa upp", - "common.unichain": "Unichain", - "common.uniswapMobile": "Uniswap mobil", - "common.uniswapWallet": "Uniswap plånbok", - "common.uniswapX": "UniswapX", - "common.unknown": "Okänd", - "common.unknownError.error": "Okänt fel", - "common.unwrap.button": "Packa upp", - "common.unwrap.failed": "Uppackning misslyckades", - "common.unwrapped": "Oinpackad", - "common.unwrapping": "Packar upp", - "common.view.profile": "Visa profil", - "common.viewOnExplorer": "Visa på Explorer", - "common.volume": "Volym", - "common.vote": "Rösta", - "common.wallet.approve": "Godkänn i plånbok", - "common.wallet.label": "Plånbok", - "common.warning": "Varning", - "common.webApp": "Webbapp", - "common.website": "Hemsida", - "common.whyApprove": "Varför måste jag godkänna en token?", - "common.whySign": "Varför krävs underskrifter?", - "common.whyWrap": "Varför måste jag slå in min {{symbol}}?", - "common.withdraw": "Dra tillbaka", - "common.withdrawal.amount": "Uttagsbelopp", - "common.withinRange": "Inom räckhåll", - "common.wrap": "Wrap {{symbol}}", - "common.wrap.failed": "Wrap misslyckades", - "common.wrapIn": "Slå in {{symbol}} i plånboken", - "common.wrapped": "Inslagna", - "common.wrapping": "Omslag", - "common.wrappingToken": "Inslagning {{symbol}}...", - "common.yesterday": "I går", - "common.your.account.had.insufficient.funds": "Ditt konto hade inte tillräckligt med pengar för att genomföra bytet.", - "common.your.account.has.insufficient.funds": "Ditt konto har inte tillräckligt med pengar för att genomföra bytet.", - "common.your.connected.wallet": "Din uppkopplade plånbok", - "common.your.limit.could.not.be.fulfilled": "Din gräns kunde inte uppfyllas för närvarande. Var god försök igen.", - "common.your.swap.could.not.be.fulfilled": "Ditt byte kunde inte genomföras just nu. Var god försök igen.", - "common.youreBuying": "Du köper", - "common.youReceive": "Du får", - "common.youreSelling": "Du säljer", - "currency.ars": "Argentinsk peso", - "currency.aud": "australiensisk dollar", - "currency.brl": "brasilianska real", - "currency.cad": "Kanadensisk dollar", - "currency.cny": "kinesiska yuan", - "currency.cop": "Colombiansk peso", - "currency.eur": "Euro", - "currency.gbp": "Brittiskt pund", - "currency.hkd": "Hongkong-dollar", - "currency.idr": "indonesisk rupiah", - "currency.inr": "indiska rupier", - "currency.jpy": "Japanska yen", - "currency.krw": "Sydkoreanska won", - "currency.mxn": "Mexikansk peso", - "currency.ngn": "nigerianska Naira", - "currency.pkr": "pakistanska rupier", - "currency.rub": "rysk rubel", - "currency.sgd": "Singapore dollar", - "currency.try": "turkisk lira", - "currency.uah": "ukrainska hryvnia", - "currency.usd": "Amerikansk dollar", - "currency.vnd": "vietnamesisk dong", - "dapp.request.actionCannotBeCompleted.description": "Vissa funktioner är inte tillgängliga eftersom dina smarta plånboksinställningar hanteras av en annan plånboksapp.", - "dapp.request.actionCannotBeCompleted.header": "Signaturbegäran", - "dapp.request.actionCannotBeCompleted.title": "Åtgärden kan inte slutföras", - "dapp.request.approve.action": "Godkänna", - "dapp.request.approve.fallbackTitle": "Godkänn den här webbplatsen för att få åtkomst till tokens", - "dapp.request.approve.helptext": "Tillåt den här webbplatsen att komma åt och spendera denna token för transaktioner. Se till att du litar på den här webbplatsen.", - "dapp.request.approve.label": "Plånbok", - "dapp.request.approve.title": "Godkänn åtkomst till {{tokenSymbol}}", - "dapp.request.base.title": "Transaktionsbegäran", - "dapp.request.bridge.description": "Flytta ETH, USDC och mer över {{numChains}}+ nätverk.", - "dapp.request.bridge.title": "Försöker du överbrygga?", - "dapp.request.connect.helptext": "Tillåt den här webbplatsen att se din plånboksadress, ditt saldo och begära godkännanden för transaktioner.", - "dapp.request.connect.title": "Anslut till webbplatsen", - "dapp.request.fallback.calldata.label": "Rådata", - "dapp.request.fallback.function.label": "Fungera", - "dapp.request.permit2.description": "Permit2 hanterar tokengodkännanden över flera dapps.", - "dapp.request.permit2.header": "Skriv tillstånd 2", - "dapp.request.permit2approve.action": "Godkänna", - "dapp.request.permit2approve.helptext": "Permit2 hanterar tokengodkännanden över flera dapps.", - "dapp.request.permit2approve.title": "Godkänn tillstånd2", - "dapp.request.reject.action": "Avvisa alla", - "dapp.request.reject.info": "Du har {{totalRequestCount}} transaktionsförfrågningar", - "dapp.request.revoke.action": "Återkalla", - "dapp.request.revoke.helptext": "Tillåt den här webbplatsen att återkalla åtkomsten för att spendera denna token för transaktioner. Se till att du litar på den här webbplatsen.", - "dapp.request.revoke.title": "Återkalla åtkomst till {{tokenSymbol}}", - "dapp.request.signature.containsUnrenderableCharacters": "Det här meddelandet innehåller tecken som inte går att rendera. Se till att du litar på den här webbplatsen.", - "dapp.request.signature.decodeError": "Det gick inte att avkoda meddelandet", - "dapp.request.signature.header": "Signaturbegäran", - "dapp.request.signature.irregular": "Oregelbunden underskriftsbegäran", - "dapp.request.signature.irregular.description": "Se till att du litar på den här webbplatsen innan du fortsätter", - "dapp.request.signature.irregular.understand": "Jag förstår riskerna", - "dapp.request.signature.toggleDataView.raw": "Visa rådata", - "dapp.request.signature.toggleDataView.readable": "Visa originaldata", - "dapp.request.warning.notActive.message": "Se till att det är rätt", - "dapp.request.warning.notActive.title": "Det här är inte din aktiva plånbok", - "delegation.upgradeModal.description": "Den här plånboksuppdateringen använder smarta kontrakt för snabbare och billigare transaktioner. Läs mer", - "delegation.upgradeModal.enableSmartWallet": "Aktivera smart plånbok", - "delegation.upgradeModal.title": "Smartare byten, lägre kostnader", - "downloadApp.modal.connectExistingWallet": "Anslut befintlig plånbok", - "downloadApp.modal.getStarted.description": "Få tillgång till tusentals tokens direkt genom världens största onchain-marknadsplats.", - "downloadApp.modal.getStarted.title": "Börja byta på några sekunder", - "downloadApp.modal.getTheApp.title": "Kom igång med Uniswap", - "downloadApp.modal.uniswapProducts.subtitle": "Uniswap-produkter fungerar sömlöst tillsammans för att skapa den bästa onchain-upplevelsen.", - "empty.swap.button.text": "Lägg till pengar för att byta", - "error.dataUnavailable": "Data är inte tillgänglig för tillfället; vi jobbar på en fix", - "error.id": "Fel-ID: {{eventId}}", - "error.jupiterApi.execute.default.title": "Något gick fel med Jupiters API. Försök igen.", - "error.jupiterApi.failedToLand": "(Kod {{code}}: Transaktionen misslyckades med att landa på nätverket)", - "error.jupiterApi.invalidBlockHeight": "(Kod -1004: Ogiltig blockhöjd)", - "error.jupiterApi.invalidMessageBytes": "(Kod -3: Ogiltiga meddelandebyte)", - "error.jupiterApi.invalidPayload": "(Kod -2002: Ogiltig nyttolast)", - "error.jupiterApi.invalidSignedTransaction": "(Kod -2: Ogiltig signerad transaktion)", - "error.jupiterApi.invalidTransaction": "(Kod -1002: Ogiltig transaktion)", - "error.jupiterApi.missingCachedOrder": "(Kod -1: Saknar cachad beställning)", - "error.jupiterApi.notFullySigned": "(Kod -1003: Transaktionen är inte helt signerad)", - "error.jupiterApi.quoteExpired": "Denna offert har gått ut på tiden, försök igen. (Kod -2003)", - "error.jupiterApi.unknownErrorCode": "(Kod {{code}})", - "error.noData": "Ingen information hittad", - "error.request.provideId": "Tyvärr uppstod ett fel när din begäran bearbetades. Om du begär support, se till att ange ditt fel-ID.", - "error.tokenApproval": "Tokengodkännande misslyckades", - "error.tokenApproval.message": "Ett nätverks- eller anslutningsproblem orsakade troligen att ditt godkännande misslyckades. Kontrollera din anslutning och försök igen.", - "error.tokenApprovalEdited": "Otillräckligt godkännandebelopp", - "error.tokenApprovalEdited.message": "Godkännandebeloppet i din plånbok är för lågt för att slutföra den här transaktionen. Försök igen och öka beloppet.", - "errors.crash.message": "Något kraschade.", - "errors.crash.restart": "Starta om appen", - "errors.crash.title": "Hoppsan!", - "explore.more.pools": "Utforska fler pooler", - "explore.more.unichain": "Utforska Unichain-pooler", - "explore.search.label.ownedBy": "Ägs av {{ownerAddress}}", - "explore.search.placeholder": "Sök tokens och plånböcker", - "explore.search.section.nft": "NFT-samlingar", - "explore.search.section.popularNFT": "Populära NFT-samlingar", - "explore.search.section.wallets": "Plånböcker", - "explore.tokens.error": "Det gick inte att ladda tokens", - "explore.tokens.favorite.action.add": "Favoritpolett", - "explore.tokens.favorite.action.edit": "Redigera favoriter", - "explore.tokens.favorite.action.remove": "Ta bort favorit", - "explore.tokens.favorite.title.default": "Favoritpoletter", - "explore.tokens.favorite.title.edit": "Redigera favoritpoletter", - "explore.tokens.metadata.marketCap": "{{number}} MCap", - "explore.tokens.metadata.totalValueLocked": "{{number}} TVL", - "explore.tokens.metadata.volume": "{{number}} Vol", - "explore.tokens.sort.label.marketCap": "Börsvärde", - "explore.tokens.sort.label.priceDecrease": "Prissänkning", - "explore.tokens.sort.label.priceIncrease": "Prisökning", - "explore.tokens.sort.label.totalValueLocked": "TVL", - "explore.tokens.sort.label.volume": "Volym", - "explore.tokens.sort.option.marketCap": "Börsvärde", - "explore.tokens.sort.option.priceDecrease": "Prissänkning (24h)", - "explore.tokens.sort.option.priceIncrease": "Prisökning (24h)", - "explore.tokens.sort.option.totalValueLocked": "Uniswap TVL", - "explore.tokens.sort.option.volume": "Uniswap volym (24H)", - "explore.tokens.top.title": "Topppoletter", - "explore.v2TVL": "v2 TVL", - "explore.v3TVL": "v3 TVL", - "explore.v4TVL": "v4 TVL", - "explore.wallets.favorite.action.add": "Favorit plånbok", - "explore.wallets.favorite.action.edit": "Redigera favoriter", - "explore.wallets.favorite.action.remove": "Ta bort favorit", - "explore.wallets.favorite.action.remove.short": "Ta bort favoriter", - "explore.wallets.favorite.title.default": "Favoritplånböcker", - "explore.wallets.favorite.title.edit": "Redigera favoritplånböcker", - "extension.connection.network": "Nätverk", - "extension.connection.networks": "Nätverk", - "extension.connection.popup.trouble": "Problem med att ansluta?", - "extension.connection.titleConnected": "Ansluten", - "extension.connection.titleNotConnected": "Ej ansluten", - "extension.lock.button.forgot": "glömt ditt lösenord?", - "extension.lock.button.reset": "Återställ plånboken", - "extension.lock.button.submit": "Låsa upp", - "extension.lock.password.error": "Fel lösenord. Försök igen", - "extension.lock.password.reset.initial.description": "Uniswap kan inte hjälpa till att återställa ditt lösenord. Du måste återställa din plånbok genom att ange din återställningsfras på 12 ord.", - "extension.lock.password.reset.initial.help": "Var hittar jag min återhämtningsfras?", - "extension.lock.password.reset.initial.title": "Glömt ditt lösenord", - "extension.lock.password.reset.speedbump.description": "Se till att du har din 12-ords återställningsfras innan du återställer din plånbok. Annars kommer du inte att kunna återfå dina pengar.", - "extension.lock.password.reset.speedbump.help": "Jag tappade min återhämtningsfras", - "extension.lock.password.reset.speedbump.title": "Innan du fortsätter", - "extension.lock.subtitle": "Ange ditt lösenord för att låsa upp", - "extension.lock.title": "Välkommen tillbaka", - "extension.network.notSupported": "Nätverk som inte stöds", - "extension.open": "Öppna Uniswap Extension", - "extension.passwordPrompt.error.wrongPassword": "Fel lösenord. Försök igen", - "extension.passwordPrompt.title": "Ange ditt lösenord", - "extension.popup.chrome.button": "Öppna tillägget", - "extension.popup.chrome.description": "Slutför denna åtgärd genom att öppna Uniswap-tillägget.", - "extension.popup.chrome.title": "Fortsätt i Uniswap", - "extension.settings.defaultWallet.message": "Prioritera Uniswap Extension när du ansluter till appar.", - "extension.settings.defaultWallet.title": "Gör standardplånbok", - "extension.uninstall.reason.missingFeatures": "Uniswap Wallet saknar vissa funktioner", - "extension.uninstall.reason.notUsingCrypto": "Jag vill inte längre använda kryptovaluta", - "extension.uninstall.reason.other": "Andra skäl", - "extension.uninstall.reason.switchingWallet": "Jag byter till en annan plånbok", - "extension.uninstall.subtitle": "Om du har en stund över vill vi gärna höra varför du avinstallerade Uniswap Wallet.", - "extension.uninstall.title": "Vi är ledsna att se dig gå", - "extension.warning.storage.button": "Backa upp", - "extension.warning.storage.message": "Se till att säkerhetskopiera din återställningsfras för att förhindra att du förlorar åtkomst till din plånbok och pengar.", - "extension.warning.storage.title": "Din webbläsare håller på att ta slut", - "extensionPasskeyLogInPopUp.description": "Importera ditt Uniswap-konto genom att logga in med en befintlig lösenordsnyckel.", - "extensionPasskeyLogInPopUp.invalidReferrer": "Stäng den här sidan och försök igen.", - "fee.bestForCustomizability": "Bäst för anpassningsbarhet.", - "fee.bestForExotic": "Bäst för exotiska par.", - "fee.bestForMost": "Bäst för de flesta par.", - "fee.bestForStablePairs": "Bäst för stabila par.", - "fee.bestForVeryStable": "Bäst för mycket stabila par.", - "fee.dynamic": "Dynamisk avgift", - "fee.percentEarned": "% du kommer att tjäna i avgifter.", - "fee.selectPercent": "{{pct}}% välj", - "fee.selectPercentDescription": "{{pct}}% av likviditeten valde denna nivå", - "fee.tier": "Avgiftsnivå", - "fee.tier.create": "Skapa avgiftsnivå", - "fee.tier.create.button": "Skapa en ny avgiftsnivå", - "fee.tier.create.description": "Att skapa en ny nivå kommer att initialiseras i en ny pool och resultera i högre nätverkskostnader än vanligt.", - "fee.tier.description": "Det intjänade beloppet ger likviditet. Välj ett belopp som passar din risktolerans och strategi.", - "fee.tier.description.v2": "Det intjänade beloppet ger likviditet. Alla v2-pooler har fasta avgifter på 0,3 %. För fler alternativ, tillhandahåll likviditet på v4.", - "fee.tier.dynamic": "Dynamisk avgiftsnivå", - "fee.tier.dynamic.create": "Skapa dynamisk avgiftsnivå", - "fee.tier.dynamic.create.info": "Du är på väg att skapa en pool med en dynamisk avgiftsnivå. Innan du fortsätter, se till att den valda kroken stöder dynamiska avgifter.", - "fee.tier.highestTvl": "Högsta TVL", - "fee.tier.label": "% du kommer att tjäna i avgifter", - "fee.tier.missing.description": "Hittar du inte den nivå du letar efter?", - "fee.tier.new": "Ny nivå", - "fee.tier.percent.select": "{{percentage}} välj", - "fee.tier.recommended.description": "Rekommenderas baserat på att ha den högsta andelen likviditet för det valda tokenparet.", - "fee.tier.search": "Sök eller skapa andra avgiftsnivåer", - "fee.tier.search.short": "Sök nivåer", - "fee.tier.select": "Välj avgiftsnivå", - "fee.tier.select.existing.button": "Välj befintlig avgiftsnivå", - "fee.tierExact": "{{fee}} avgiftsnivå", - "fee.unavailable": "Intjänade avgifter är inte synliga för v2-positioner förrän likviditeten tas bort.", - "fee.uncollected": "Inkluderar ej indrivna avgifter:", - "fee.uniswap": "Avgift ({{percent}})", - "fee.uniswap.description": "Avgifter tillkommer för att säkerställa bästa möjliga upplevelse med Uniswap.", - "fiatOffRamp.checkout.title": "Uttag till", - "fiatOffRamp.connection.quote": "Säljer {{amount}} till ett värde av {{currencySymbol}}", - "fiatOffRamp.error.balance": "Överskrider balansen", - "fiatOffRamp.error.populateSend.description": "Vänta en stund och försök igen.", - "fiatOffRamp.error.populateSend.title": "Kan inte ladda transaktionen", - "fiatOffRamp.summary.total": "{{cryptoAmount}} för {{fiatAmount}}", - "fiatOffRamp.unsupportedToken.back": "Gå tillbaka", - "fiatOffRamp.unsupportedToken.divider": "Tokens som inte stöds", - "fiatOffRamp.unsupportedToken.message": "Denna token stöds inte för försäljning. Byt ut denna tillgång till en av de token som stöds.", - "fiatOffRamp.unsupportedToken.swap": "Byt till en token som stöds", - "fiatOffRamp.unsupportedToken.title": "Token som inte stöds", - "fiatOffRamp.welcome.tooltip": "Sälj din krypto till ditt bankkonto eller bankkort.", - "fiatOnRamp.button.chooseToken": "Välj token", - "fiatOnRamp.buy.info.description": "Du behöver den för att betala nätverkskostnaderna vid bytet.", - "fiatOnRamp.buy.info.title": "Börja med ETH", - "fiatOnRamp.cexTransferModal.description": "Att köpa krypto med ett kort stöds inte i din region. Överför tillgångar från ett centraliserat utbyteskonto för att finansiera din plånbok.", - "fiatOnRamp.cexTransferModal.title": "Överför för att komma igång", - "fiatOnRamp.checkout.title": "Kassa", - "fiatOnRamp.chooseMultiPlatformProvider.chooseNetwork": "Välj nätverk", - "fiatOnRamp.chooseMultiPlatformProvider.description": "Detta avgör vilken plånboksadress du kommer att ta emot pengarna på.", - "fiatOnRamp.chooseProvider.description": "Du fortsätter till leverantörens portal för att se de avgifter som är kopplade till din transaktion.", - "fiatOnRamp.completeTransactionHeader": "Slutför transaktionen med {{serviceProvider}}", - "fiatOnRamp.connection.error": "Anslutningen misslyckades", - "fiatOnRamp.connection.errorDescription": "Något gick fel vid anslutningen till {{serviceProvider}}.", - "fiatOnRamp.connection.message": "Ansluter dig till {{serviceProvider}}", - "fiatOnRamp.connection.quote": "Köper {{amount}} till ett värde av {{currencySymbol}}", - "fiatOnRamp.connection.terms": "Genom att fortsätta godkänner du att du kommer att omfattas av Användarvillkoren och Sekretesspolicyn med {{serviceProvider}}, i tillämpliga fall.", - "fiatOnRamp.continueInTab": "Gå till fliken {{serviceProvider}} för att fortsätta. Det är säkert att stänga denna modal nu.", - "fiatOnRamp.disclaimer": "Genom att fortsätta godkänner du att du kommer att omfattas av Användarvillkoren och Sekretesspolicyn med {{serviceProvider}}, i tillämpliga fall.", - "fiatOnRamp.error.default": "Något gick fel.", - "fiatOnRamp.error.load": "Det gick inte att ladda tokens för att köpa", - "fiatOnRamp.error.max": "Högst {{amount}}", - "fiatOnRamp.error.min": "Minst {{amount}}", - "fiatOnRamp.error.noQuotes": "Inga citat hittades.", - "fiatOnRamp.error.unavailable": "Den här tjänsten är inte tillgänglig i din region", - "fiatOnRamp.error.unsupported": "Stöds inte i regionen", - "fiatOnRamp.error.usd": "Endast tillgänglig att köpa i USD", - "fiatOnRamp.noQuotes.error": "Inga citat hittades", - "fiatOnRamp.paymentMethods.applePay": "Apple Pay", - "fiatOnRamp.paymentMethods.bank": "Bank", - "fiatOnRamp.paymentMethods.debit": "Debitera", - "fiatOnRamp.paymentMethods.googlePay": "Google Pay", - "fiatOnRamp.paymentMethods.paypal": "PayPal", - "fiatOnRamp.paymentMethods.venmo": "Venmo", - "fiatOnRamp.quote.advice": "Du fortsätter till leverantörens portal för att se de avgifter som är kopplade till din transaktion.", - "fiatOnRamp.quote.type.list": "{{optionsList}}och andra alternativ", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "Från ett konto", - "fiatOnRamp.receiveCrypto.title": "Ta emot krypto", - "fiatOnRamp.receiveCrypto.transferFunds": "Finansiera din plånbok genom att överföra krypto från en annan plånbok eller ett annat konto", - "fiatOnRamp.receiveCrypto.useThisAddress": "Använd den här adressen för att ta emot tokens på", - "fiatOnRamp.region.placeholder": "Sök efter land eller region", - "fiatOnRamp.region.title": "Välj din region", - "fiatOnRamp.summary.total": "{{cryptoAmount}} för {{fiatAmount}}", - "forceUpgrade.action.backup": "Säkerhetskopiera din plånbok", - "forceUpgrade.action.confirm": "Uppdatera nu", - "forceUpgrade.action.learn": "Lär dig hur du uppdaterar", - "forceUpgrade.description.extension": "En ny version av appen är tillgänglig. För att fortsätta använda Uniswap-tillägget, uppdatera det till den senaste versionen.", - "forceUpgrade.description.wallet": "En ny version av appen är tillgänglig. För att fortsätta använda Uniswap Wallet, uppdatera den till den senaste versionen.", - "forceUpgrade.label.recoveryPhrase": "Återställningsfras", - "forceUpgrade.title": "Uppdatera till den senaste versionen", - "forceUpgrade.title.recommendedStatus": "En ny version finns tillgänglig", - "globalPreferences.title": "Globala preferenser", - "hero.scroll": "Bläddra för att lära dig mer", - "hero.subtitle": "Köp och sälj krypto på {{amount}}+ nätverk inklusive Ethereum, Unichain och Base.", - "hero.swap.title": "Byt när som helst,
var som helst.", - "hidden.nfts.info.banner.text": "Läs mer om dolda NFT:er", - "hidden.nfts.info.text.button": "Dolda NFT ({{numHidden}})", - "hidden.nfts.info.text.extension": "Det här är potentiella bedrägerier och NFT:er som du har gömt. Du kan högerklicka på en NFT för att visa den.", - "hidden.nfts.info.text.mobile": "Det här är potentiella bedrägerier och NFT:er som du har gömt. Du kan trycka länge på en NFT för att visa den.", - "hidden.nfts.info.text.title": "Dolda NFT:er", - "hidden.tokens.info.banner.text": "Lär dig mer om dolda tokens", - "hidden.tokens.info.text.button": "Dolda tokens ({{numHidden}})", - "hidden.tokens.info.text.info": "Dessa är potentiella bedrägerier, små saldon och tokens som du har gömt. Dolda tokens ingår inte i ditt totala plånbokssaldo.", - "hidden.tokens.info.text.title": "Dolda tokens", - "home.activity.empty.button": "Ta emot tokens eller NFT:er", - "home.activity.empty.description.default": "När du godkänner, handlar eller överför tokens eller NFT:s, kommer dina transaktioner att visas här.", - "home.activity.empty.description.external": "När den här plånboken gör transaktioner visas de här.", - "home.activity.empty.title": "Ingen aktivitet ännu", - "home.activity.error.load": "Det gick inte att ladda aktiviteten", - "home.activity.title": "Aktivitet", - "home.banner.offline": "Du är i offlineläge", - "home.banner.testnetMode": "Du är i testnet-läge", - "home.banner.testnetMode.nav": "Du är i testnet-läge. Stäng av detta i inställningarna.", - "home.empty.cexTransfer": "Överföra", - "home.empty.cexTransfer.description": "Flytta pengar från en handelsplattform.", - "home.empty.transfer": "Ta emot krypto", - "home.empty.transfer.description": "Flytta pengar från en annan plånbok.", - "home.explore.footer": "Tryck här för att utforska tusentals tokens, NFT:er och mer", - "home.explore.title": "Utforska tokens", - "home.extension.error": "Det gick inte att läsa in konton", - "home.label.buy": "köpa", - "home.label.for": "Köp/sälj", - "home.label.receive": "Motta", - "home.label.send": "Skicka", - "home.label.swap": "Byta", - "home.nfts.title": "NFTs", - "home.tokens.empty.action.buy.description": "Köp med betalkort eller bankkonto.", - "home.tokens.empty.action.buy.title": "Köp krypto", - "home.tokens.empty.action.import.description": "Ange plånbokens återställningsfras för att börja byta och skicka.", - "home.tokens.empty.action.import.title": "Importera plånbok", - "home.tokens.empty.action.receive.description": "Överför från en annan plånbok eller konto.", - "home.tokens.empty.action.receive.title": "Ta emot krypto", - "home.tokens.empty.description": "När den här plånboken köper eller tar emot tokens visas de här.", - "home.tokens.empty.title": "Inga tokens ännu", - "home.tokens.empty.welcome.description": "Lägg till pengar för att börja handla", - "home.tokens.error.fetch": "Det gick inte att hämta tokensaldon", - "home.tokens.error.load": "Det gick inte att ladda tokensaldon", - "home.tokens.title": "Polletter", - "home.upsell.receive.cta": "Från ett konto", - "home.upsell.receive.title": "Ta emot krypto", - "home.warning.viewOnly": "Det här är en plånbok för visning", - "interface.metatags.description": "Växla kryptovaluta mot Ethereum, Base, Arbitrum, Polygon, Unichain och fler. DeFi-plattformen som miljontals människor litar på.", - "interface.metatags.title": "Uniswap-gränssnitt", - "landing.api": "API", - "landing.appsOverview": "Byggd för alla sätt du byter", - "landing.blog.description": "Håll dig uppdaterad om de senaste företagsnyheterna, produktfunktionerna och mer", - "landing.docs.description": "Utforska vårt bibliotek med utvecklardokumentation för att komma igång med att bygga med Uniswap", - "landing.exploreUniverse": "Utforska UNIVERSUM", - "landing.getStarted": "Handla på världens största DEX", - "landing.helpCenter.body": "Bläddra bland vanliga frågor och få support från vårt supportteam i USA", - "landing.protocolDescription": "Uniswap Labs driver några av de mest använda produkterna inom krypto. Upplev behörighetsfri åtkomst, beprövad säkerhet och dedikerad support.", - "landing.protocolStats": "Uniswap-protokollets statistik", - "landing.provideLiquidity.body": "Tillhandahåll likviditet och samla in avgifter med hjälp av Uniswap-gränssnittet.", - "landing.provideLiquidity.subtitle": "Kraftkedjans marknader.", - "landing.socials": "Följ Uniswap Labs på X, Farcaster, LinkedIn, och TikTok", - "landing.swapBody": "Få tillgång till djup likviditet, utforska tokens, sätt limitordrar och tillhandahåll likviditet för tusentals tokens över {{amount}} kedjor.", - "landing.swapSubtitle": "Tillståndslöst byte.", - "landing.tradingApi": "Handels-API", - "landing.tradingApiBody": "Använd samma API som driver Uniswap Web App och Wallet, betrott av ledande team runt om i världen.", - "landing.tradingApiButton": "Integrera Uniswap API:et", - "landing.tradingApiSubtitle": "DeFi, direkt till dina användare.", - "landing.trusted": "Betrodd av miljoner", - "landing.unichain.body": "Gå med i att bygga community på det snabba, decentraliserade Ethereum L2 som är byggt för att vara hemmet för DeFi.", - "landing.unichain.button": "Börja bygga", - "landing.unichain.subtitle": "DeFi-kedjan.", - "landing.uniswapX.body": "Gaslösa transaktioner och MEV-skydd, med noll avgifter för misslyckade swappar.", - "landing.uniswapX.button": "Upplev UniswapX", - "landing.uniswapX.subtitle": "Smartare byten, noll friktion.", - "landing.walletBody": "Den pålitliga kryptoplånboken och tillägget för självförvaring med miljontals nedladdningar, support från riktiga människor och ett betyg på 4,8 .", - "landing.walletSubtitle": "Byt, förvara, utforska.", - "language.afrikaans": "afrikaans", - "language.arabic": "arabiska", - "language.catalan": "katalanska", - "language.chineseSimplified": "Förenklad kinesiska", - "language.chineseTraditional": "Traditionell Kinesisk", - "language.czech": "tjeckiska", - "language.danish": "danska", - "language.dutch": "holländska", - "language.english": "engelsk", - "language.finnish": "finska", - "language.french": "franska", - "language.greek": "grekiska", - "language.hebrew": "hebreiska", - "language.hindi": "hindi", - "language.hungarian": "Ungerska", - "language.indonesian": "indonesiska", - "language.italian": "italienska", - "language.japanese": "japanska", - "language.korean": "koreanska", - "language.malay": "malajiska", - "language.norwegian": "norska", - "language.polish": "polska", - "language.portuguese": "portugisiska", - "language.romanian": "rumänska", - "language.russian": "ryska", - "language.serbian": "serbiska", - "language.spanishArgentina": "Spanska (Argentina)", - "language.spanishBelize": "Spanska (Belize)", - "language.spanishBolivia": "Spanska (Bolivia)", - "language.spanishChile": "Spanska (Chile)", - "language.spanishColombia": "Spanska (Colombia)", - "language.spanishCostaRica": "Spanska (Costa Rica)", - "language.spanishCuba": "Spanska (Kuba)", - "language.spanishDominicanRepublic": "Spanska (Dominikanska republiken)", - "language.spanishEcuador": "Spanska (Ecuador)", - "language.spanishElSalvador": "Spanska (El Salvador)", - "language.spanishGuatemala": "Spanska (Guatemala)", - "language.spanishHonduras": "Spanska (Honduras)", - "language.spanishLatam": "Spanska (Latinamerika)", - "language.spanishMexico": "Spanska (Mexiko)", - "language.spanishNicaragua": "Spanska (Nicaragua)", - "language.spanishPanama": "Spanska (Panama)", - "language.spanishParaguay": "Spanska (Paraguay)", - "language.spanishPeru": "Spanska (Peru)", - "language.spanishPuertoRico": "Spanska (Puerto Rico)", - "language.spanishSpain": "Spanska (Spanien)", - "language.spanishUruguay": "Spanska (Uruguay)", - "language.spanishUs": "spanska (USA)", - "language.spanishVenezuela": "Spanska (Venezuela)", - "language.swahili": "Swahili", - "language.swedish": "svenska", - "language.turkish": "turkiska", - "language.ukrainian": "ukrainska", - "language.urdu": "Urdu", - "language.vietnamese": "vietnamesiska", - "large.price.difference": "Stor prisskillnad", - "large.price.difference.tooltip": "Att fortsätta med denna handel kommer att resultera i en förlust av medel. Denna skillnad kan bero på stora affärer eller låg likviditet.", - "limit.open.count_one": "1 öppen gräns", - "limit.open.count_other": "{{count}} öppna gränser", - "limitPrice.buyingAboveMarketPrice.error.description": "Ditt gränspris är {{percentage}}% högre än marknaden. Justera ditt gränspris för att fortsätta.", - "limitPrice.buyingAboveMarketPrice.error.title": "Köper {{tokenSymbol}} över marknadspriset", - "limitPrice.marketPriceNotAvailable.error.description": "Vi kan inte beräkna det aktuella marknadspriset. För att undvika att skicka en beställning under marknadspriset, kontrollera din nätverksanslutning och försök igen.", - "limitPrice.marketPriceNotAvailable.error.title": "Marknadspris ej tillgängligt", - "limitPrice.sellingBelowMarketPrice.error.description": "Ditt gränspris är {{percentage}}% lägre än marknaden. Justera ditt gränspris för att fortsätta.", - "limitPrice.sellingBelowMarketPrice.error.title": "Säljer {{tokenSymbol}} under marknadspriset", - "limits.form.disclaimer.mainnet": "Endast Ethereum mainnet tokens är tillgängliga för limits. ", - "limits.form.disclaimer.mainnet.short": "Endast Mainnet-tokens är tillgängliga för limits.", - "limits.form.disclaimer.uniswapx": "Gränser kanske inte exekveras exakt när tokens når det angivna priset. ", - "limits.learnMore": "Läs mer om gränser", - "limits.price.input.label": "När 1 är värt", - "limits.price.label": "Begränsat pris", - "limits.selectSupportedTokens": "Välj tokens som stöds", - "liquidity.hooks": "Hakar på v4", - "liquidity.hooks.address.input": "Ange hook-adress", - "liquidity.hooks.address.tooltip": "Hook-adress: {{address}}", - "liquidity.learnMoreLabel": "Lär dig mer om likviditetsförsörjning", - "liquidity.notEnough.label": "Inte tillräckligt med likviditet för att visa korrekt USD-värde.", - "liquidity.provideOnProtocols": "Tillhandahålla likviditet på olika protokoll", - "liquidityPool.page.title": "Lägg till likviditet till pooler{{version}} på Uniswap", - "liquidityPool.positions.closed.title": "Stängda positioner", - "liquidityPool.positions.loadingMore": "Laddar fler positioner...", - "liquidityPool.positions.page.title": "Hantera {{quoteSymbol}}/{{baseSymbol}} pool likviditet på Uniswap", - "liquidityPool.positions.page.version.description": "Se dina aktiva {{version}} likviditetspositioner. Lägg till nya positioner.", - "liquidityPool.positions.page.version.title": "Hantera poollikviditet{{version}} på Uniswap", - "migrate.allowed": "Tillåten", - "migrate.allowLpMigration": "Tillåt migrering av LP-token", - "migrate.connectAccount": "Du måste ansluta ett konto som äger denna position.", - "migrate.connectWallet": "Anslut till en plånbok för att se din V2-likviditet.", - "migrate.contract": "Uniswap migreringskontrakt", - "migrate.firstLP": "Du är den första likviditetsleverantören för denna Uniswap V3-pool. Din likviditet kommer att migrera till det aktuella priset på {{source}} .", - "migrate.highGasCost": "Din transaktionskostnad kommer att bli mycket högre eftersom den inkluderar gasen för att skapa poolen.", - "migrate.invalidRange": "Ogiltigt intervall valt. Minsta pris måste vara lägre än maxpris.", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} LP-tokens", - "migrate.migrating": "Migrerar", - "migrate.missingV2Position": "Ser du inte en av dina v2-positioner? Importera det.", - "migrate.noV2Liquidity": "Ingen V2-likviditet hittades.", - "migrate.positionNoFees": "Din position kommer inte att tjäna avgifter eller användas i affärer förrän marknadspriset går in i ditt intervall.", - "migrate.priceDifference": "Prisskillnad: ", - "migrate.priceWarning": "Du bör endast sätta in likviditet i Uniswap V3 till ett pris som du anser är korrekt.
Om priset verkar felaktigt kan du antingen göra ett byte för att flytta priset eller vänta på att någon annan gör det.", - "migrate.refund": "Minst {{amtA}} {{symA}} och {{amtB}} {{symB}} kommer att återbetalas till din plånbok på grund av vald prisklass.", - "migrate.selectFeeTier": "Välj avgiftsnivå", - "migrate.setRange": "Ställ in prisklass", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Pris:", - "migrate.v2Description": "Detta verktyg kommer säkert att migrera din {{source}} likviditet till V3. Processen är helt tillförlitlig tack vare migreringskontraktet <0>Uniswap ↗", - "migrate.v2Instruction": "För varje pool som visas nedan, klicka på migrera för att ta bort din likviditet från Uniswap V2 och sätta in den i Uniswap V3.", - "migrate.v2Title": "Migrera V2-likviditet", - "migrate.v3Price": "V3 {{sym}} Pris:", - "mint.v3.input.invalidPrice.error": "Ogiltig prisinmatning", - "mobileAppPromo.banner.getTheApp.link": "Skaffa Uniswap Wallet-appen", - "mobileAppPromo.banner.title": "Uniswap: Krypto- och NFT-plånbok", - "moonpay.poweredBy": "Fiat onramp drivs av MoonPay USA LLC", - "nav.createAccount.button": "Skapa konto", - "nav.logIn.button": "Logga in", - "nav.logInOrConnect.title": "Logga in eller anslut", - "nav.products.tradingApi": "Integrera protokollet", - "nav.products.unichain": "DeFi-kedjan", - "nav.products.uniswapX": "Metaaggregatorn", - "nav.products.wallet": "Byt, förvara, utforska", - "nav.signUp.button": "Anmäl dig", - "nav.tabs.createPosition": "Skapa position", - "nav.tabs.viewPositions": "Visa positioner", - "network.lostConnection": "Du kan ha tappat nätverksanslutningen.", - "network.mightBeDown": "{{network}} kan vara nere just nu, eller så kan du ha tappat nätverksanslutningen.", - "network.warning": "Nätverksvarning", - "nft.noPools": "Inga pooler än", - "nft.reportSpam": "Rapportera som spam", - "notFound.oops": "Hoppsan, ta mig tillbaka till Swap", - "notice.uk": "Denna webbapplikation tillhandahålls som ett verktyg för användare att interagera med Uniswap-protokollet på eget initiativ, utan stöd eller rekommendation av kryptovalutahandelsaktiviteter. Genom att göra detta rekommenderar Uniswap inte användare eller potentiella användare att ägna sig åt handel med kryptotillgångar, och användare eller potentiella användare av webbapplikationen bör inte anse denna webbsida eller dess innehåll som involverar någon form av rekommendation, inbjudan eller uppmuntran att handla med kryptotillgångar .", - "notice.uk.label": "Storbritanniens ansvarsfriskrivning:", - "notification.assetVisibility.hidden": "{{assetName}} dold", - "notification.assetVisibility.unhidden": "{{assetName}} dold", - "notification.buy.network": "Köper på {{network}}", - "notification.copied.address": "Adress kopierad", - "notification.copied.calldata": "Samtalsdata har kopierats", - "notification.copied.contractAddress": "Avtalsadress kopierad", - "notification.copied.failed": "Det gick inte att kopiera till urklipp", - "notification.copied.image": "Bilden kopierad", - "notification.copied.linkUrl": "Länk kopierad", - "notification.copied.nftUrl": "NFT URL kopierad", - "notification.copied.poolId": "Pool-ID kopierat", - "notification.copied.tokenUrl": "Token URL kopierad", - "notification.copied.transactionId": "Transaktions-ID kopierat", - "notification.copied.unitag": "Användarnamnet har kopierats", - "notification.countryChange": "Bytte till {{countryName}}", - "notification.limit.network": "Skapar limitorder på {{network}}", - "notification.lp.network": "Tillhandahåller likviditet på {{network}}", - "notification.network.changed": "Bytte till {{network}}", - "notification.passwordChanged": "lösenordet ändrat", - "notification.poolFinder.network": "Sök efter pool på {{network}}", - "notification.restore.success": "Plånboken återställd!", - "notification.sell.network": "Säljer på {{network}}", - "notification.send.network": "Skickar den {{network}}", - "notification.smartWallet.disabled": "Inaktiverat på 1 nätverk", - "notification.smartWallet.disabled.all": "Smart plånbok inaktiverad", - "notification.smartWallet.disabled.plural": "Inaktiverad på {{amount}} nätverk", - "notification.spam.NFT.failed": "Kunde inte rapportera NFT. Försök igen senare.", - "notification.spam.NFT.successful": "Rapporterad", - "notification.swap.network": "Byter på {{network}}", - "notification.swap.pending.swap": "Byte väntar", - "notification.swap.pending.unwrap": "Packa upp väntar", - "notification.swap.pending.wrap": "Wrap väntar", - "notification.transaction.approve.canceled": "Avbruten {{currencySymbol}} godkänn.", - "notification.transaction.approve.fail": "Det gick inte att godkänna {{currencySymbol}} för användning med {{address}}.", - "notification.transaction.approve.success": "Godkänd {{currencySymbol}} för användning med {{address}}.", - "notification.transaction.pending": "Transaktion väntar", - "notification.transaction.swap.canceled": "Avbrutit byte av {{inputCurrencySymbol}}-{{outputCurrencySymbol}} .", - "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} för {{outputCurrencyAmountWithSymbol}} byte har löpt ut.", - "notification.transaction.swap.fail": "Det gick inte att byta {{inputCurrencyAmountWithSymbol}} mot {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.swap.success": "Bytte {{inputCurrencyAmountWithSymbol}} mot {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.transfer.canceled": "Avbruten {{tokenNameOrAddress}} skicka", - "notification.transaction.transfer.fail": "Det gick inte att skicka {{tokenNameOrAddress}} till {{walletNameOrAddress}}", - "notification.transaction.transfer.received": "Fick {{tokenNameOrAddress}} från {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "Skickade {{tokenNameOrAddress}} till {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "Det gick inte att göra transaktioner med {{addressOrEnsName}}", - "notification.transaction.unknown.fail.short": "Transaktionen misslyckades", - "notification.transaction.unknown.success.full": "Handlade med {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "Transaktionen bekräftad", - "notification.transaction.unwrap.canceled": "Avbruten {{inputCurrencySymbol}} packa upp.", - "notification.transaction.unwrap.fail": "Det gick inte att packa upp {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.unwrap.success": "Packade upp {{inputCurrencyAmountWithSymbol}} och fick {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.canceled": "Avbruten {{inputCurrencySymbol}} wrap.", - "notification.transaction.wrap.fail": "Det gick inte att radbryta {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.success": "Slådde in {{inputCurrencyAmountWithSymbol}} och fick {{outputCurrencyAmountWithSymbol}}.", - "notification.transfer.pending": "Skicka väntar", - "notification.walletConnect.confirmed": "Transaktionen bekräftad med {{dappName}}", - "notification.walletConnect.connected": "Ansluten", - "notification.walletConnect.disconnected": "Osammanhängande", - "notification.walletConnect.failed": "Transaktionen misslyckades med {{dappName}}", - "notification.walletConnect.networkChanged.full": "Bytte till {{networkName}}", - "notification.walletConnect.networkChanged.short": "Bytte nätverk", - "notifications.scantastic.subtitle": "Fortsätt på Uniswap Extension", - "notifications.scantastic.title": "Framgång!", - "onboarding.backup.manual.banner": "Vi föreslår att du skriver detta på ett papper och förvarar det på en säker plats, som ett kassaskåp.", - "onboarding.backup.manual.displayWarning.description": "Läs följande noggrant innan du fortsätter.", - "onboarding.backup.manual.displayWarning.note.access": "Denna återställningsfras ger dig full tillgång till din plånbok och pengar", - "onboarding.backup.manual.displayWarning.note.secure": "Se detta privat och dela det inte med någon", - "onboarding.backup.manual.displayWarning.note.storage": "Skriv ner det och förvara det på ett säkert ställe", - "onboarding.backup.manual.displayWarning.title": "Några viktiga saker att veta", - "onboarding.backup.manual.error": "Ogiltigt eller felstavat ord", - "onboarding.backup.manual.placeholder": "Hemligt ord", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} klar", - "onboarding.backup.manual.selectedWordPlaceholder": "Välj ord", - "onboarding.backup.manual.subtitle_one": "Vad är det {{count}}första ordet i din återställningsfras?", - "onboarding.backup.manual.subtitle_two": "Vilket är det {{count}}andra ordet i din återställningsfras?", - "onboarding.backup.manual.subtitle_few": "Vilket är det {{count}}ordet i din återställningsfras?", - "onboarding.backup.manual.subtitle_other": "Vilket är det {{count}}:e ordet i din återställningsfras?", - "onboarding.backup.manual.title": "Låt oss se till att du har spelat in det korrekt", - "onboarding.backup.option.badge.quick": "Snabbt", - "onboarding.backup.option.cloud.description": "Säkerhetskopiera din plånbok via {{cloudProviderName}}, skyddad av ett återställningslösenord.", - "onboarding.backup.option.cloud.title": "Ange ett återställningslösenord", - "onboarding.backup.option.manual.description": "Anteckna dina 12 hemliga ord på ett papper och förvara det på ett säkert ställe.", - "onboarding.backup.option.manual.title": "Skriv ner återhämtningsfras", - "onboarding.backup.reminder.backupNowButton": "Säkerhetskopiera nu", - "onboarding.backup.reminder.remindMeLaterButton": "Påminn mig senare", - "onboarding.backup.reminder.title": "Säkerhetskopiera din plånbok", - "onboarding.backup.reminder.warning.description": "Säkerhetskopiera din plånbok så att du kan återställa dina tillgångar om du någonsin tappar bort din telefon eller skaffar en ny.", - "onboarding.backup.reminder.warning.fundsLabel": "Riskkapital", - "onboarding.backup.reminder.warning.title": "Du kan förlora dina pengar", - "onboarding.backup.speedBump.cloud.description": "Om du någonsin glömmer det kan vi inte återställa det åt dig. Skriv ner det på ett säkert ställe eller förvara det säkert i en lösenordshanterare.", - "onboarding.backup.speedBump.cloud.disclaimer": "Jag förstår att Uniswap Labs inte kan återställa mitt återställningslösenord.", - "onboarding.backup.speedBump.cloud.title": "Det är viktigt att spara detta lösenord", - "onboarding.backup.speedBump.manual.description": "Se till att du skrev ner din återställningsfras korrekt och att du har en säker plats att förvara den.", - "onboarding.backup.speedBump.manual.disclaimer": "Jag förstår att Uniswap Labs inte kan återställa min plånbok om jag tappar bort denna.", - "onboarding.backup.speedBump.manual.title": "Innan du slutar...", - "onboarding.backup.subtitle": "Så här återställer du din plånbok om du tar bort appen eller tappar din enhet.", - "onboarding.backup.title.existing": "Säkerhetskopiera din plånbok", - "onboarding.backup.title.new": "Välj din säkerhetskopieringsmetod", - "onboarding.backup.view.subtitle.message1": "Läs följande noggrant innan du fortsätter", - "onboarding.backup.view.subtitle.message2": "Du måste ange alla 12 av dessa hemliga ord för att återställa din plånbok.", - "onboarding.backup.view.title": "Skriv ner din återhämtningsfras", - "onboarding.backup.view.warning.message1": "Denna återställningsfras ger dig full tillgång till din plånbok och pengar", - "onboarding.backup.view.warning.message2": "Skriv ner det och förvara det på ett säkert ställe", - "onboarding.backup.view.warning.message3": "Se detta privat och dela det inte med någon", - "onboarding.cloud.confirm.description": "Du måste ange detta för att få tillbaka dina pengar. Om du någonsin glömmer det kan vi inte hämta det åt dig.", - "onboarding.cloud.confirm.title": "Bekräfta ditt återställningslösenord", - "onboarding.cloud.createPassword.description": "Du måste ange detta för att få tillbaka dina pengar. Om du någonsin glömmer det kan vi inte hämta det åt dig.", - "onboarding.cloud.createPassword.title": "Skapa ditt återställningslösenord", - "onboarding.complete.button": "Öppna Uniswap Extension", - "onboarding.complete.description": "Din plånbok är redo att skicka och ta emot krypto. Öppna Uniswap Extension med genvägen nedan.", - "onboarding.complete.go_to_uniswap": "Gå till Uniswap Web App", - "onboarding.complete.pin.description": "Klicka på nålikonen för att lägga till Uniswap Extension till ditt verktygsfält.", - "onboarding.complete.pin.title": "Pin Uniswap Extension", - "onboarding.complete.title": "Du är redo", - "onboarding.extension.biometrics.subtitle.fingerprint": "Få snabb och säker åtkomst till din plånbok med bara ditt fingeravtryck.", - "onboarding.extension.biometrics.title": "Aktivera {{biometricsMethod}}", - "onboarding.extension.password.subtitle": "Du behöver detta för att låsa upp din plånbok och komma åt din återställningsfras", - "onboarding.extension.password.title.default": "Skapa lösenord", - "onboarding.extension.password.title.reset": "Återställ ditt lösenord", - "onboarding.extension.unsupported.android.description": "Uniswap Extension är endast kompatibel med Chrome på skrivbordet.", - "onboarding.extension.unsupported.android.title": "Chrome på mobilen stöds inte (ännu)", - "onboarding.extension.unsupported.description": "Uniswap Extension är bara kompatibel med Chrome just nu.", - "onboarding.extension.unsupported.title": "Denna webbläsare stöds inte (ännu)", - "onboarding.home.intro.backup.description.extension": "Spara din återställningsfras för att säkerställa att du aldrig förlorar åtkomst till din plånbok.", - "onboarding.home.intro.backup.description.mobile": "Skapa en återställningsplan om du någonsin tappar bort din telefon eller skaffar en ny.", - "onboarding.home.intro.backup.title": "Säkerhetskopiera din plånbok", - "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK och JUP — nu tillgängliga på Unichain", - "onboarding.home.intro.bridgedAssets.title": "Handla nya tokens på Unichain", - "onboarding.home.intro.fund.description": "Finansiera din plånbok genom att köpa krypto eller överföra från ett annat konto.", - "onboarding.home.intro.fund.title": "Få din första token", - "onboarding.home.intro.label.required": "Nödvändig", - "onboarding.home.intro.label.swipe": "Hårt slag", - "onboarding.home.intro.pushNotifications.description": "Få prisaviseringar om dina favoritpoletter, marknadstrender och mer.", - "onboarding.home.intro.pushNotifications.title": "Håll dig uppdaterad", - "onboarding.home.intro.unitag.description": "Bygg en personlig web3-profil och dela enkelt din adress med vänner.", - "onboarding.home.intro.unitag.title": "Gör anspråk på ditt {{unitagDomain}} användarnamn", - "onboarding.import.error.invalidWords_one": "1 ord är ogiltigt eller felstavat", - "onboarding.import.error.invalidWords_other": "{{count}} ord är ogiltiga eller felstavade", - "onboarding.import.method.restore.message.android": "Lägg till plånböcker som du har säkerhetskopierat till ditt Google Drive-konto.", - "onboarding.import.method.restore.message.ios": "Lägg till plånböcker som du har säkerhetskopierat till ditt iCloud-konto.", - "onboarding.import.method.restore.title": "Återställ en plånbok", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.android": "Ange ditt återställningslösenord för att återställa din plånbok via Google Drive-säkerhetskopia.", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.ios": "Ange ditt återställningslösenord för att återställa din plånbok via iCloud-säkerhetskopia.", - "onboarding.import.method.restoreSeedPhrase.cloud.title.android": "Återställ från Google Drive", - "onboarding.import.method.restoreSeedPhrase.cloud.title.ios": "Återställ från iCloud", - "onboarding.import.method.restoreSeedPhrase.title": "Välj hur du vill återställa din plånbok", - "onboarding.import.method.restoreSeedPhrase.wallet.desc": "Skriv in dina 12 hemliga ord som du tidigare sparat på ett säkert ställe.", - "onboarding.import.method.restoreSeedPhrase.wallet.title": "Ange återställningsfras", - "onboarding.import.method.viewPrivateKeys.button.desc": "Visa din privata nyckel", - "onboarding.import.method.viewPrivateKeys.title": "Har du inget av ovanstående? ", - "onboarding.import.onDeviceRecovery.other_options": "Skapa eller importera en annan plånbok", - "onboarding.import.onDeviceRecovery.other_options.label": "Vill du inte ha något av ovanstående?", - "onboarding.import.onDeviceRecovery.subtitle": "Välj vilken plånbok du vill logga in på igen.", - "onboarding.import.onDeviceRecovery.title": "Välkommen tillbaka till Uniswap", - "onboarding.import.onDeviceRecovery.wallet.button": "Visa återställningsfras", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 annan plånbok", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} andra plånböcker", - "onboarding.import.onDeviceRecovery.warning.caption": "Se till att du har säkerhetskopierat alla andra plånböcker. Om du någonsin vill återställa dem behöver du deras återställningsfraser eller motsvarande {{cloudProvider}} säkerhetskopior.", - "onboarding.import.onDeviceRecovery.warning.title": "Är du säker?", - "onboarding.import.selectMethod.errorMessage": "Ett oväntat fel inträffade. Försök igen.", - "onboarding.import.selectMethod.mobileApp.subtitle": "Importera en plånbok från mobilappen via QR-kod.", - "onboarding.import.selectMethod.mobileApp.title": "Använd Uniswap Mobile", - "onboarding.import.selectMethod.passkey.subtitle": "Synkronisera din Uniswap-plånbok med ett befintligt lösenord.", - "onboarding.import.selectMethod.passkey.title": "Logga in med lösenord", - "onboarding.import.selectMethod.recoveryPhrase.subtitle": "Importera från en annan kryptoplånbok.", - "onboarding.import.selectMethod.recoveryPhrase.title": "Ange återställningsfras", - "onboarding.import.selectMethod.title": "Logga in eller importera en plånbok", - "onboarding.import.title": "Välj hur du vill lägga till din plånbok", - "onboarding.importMnemonic.button.default": "Min återhämtningsfras är 12 ord", - "onboarding.importMnemonic.button.importing": "Importerar...", - "onboarding.importMnemonic.button.longPhrase": "Min återhämtningsfras är längre", - "onboarding.importMnemonic.error.invalidPhrase": "Frasen du angav är ogiltig", - "onboarding.importMnemonic.subtitle": "Skriv eller klistra in din återställningsfras på 12 ord", - "onboarding.importMnemonic.title": "Ange din återställningsfras", - "onboarding.importPasskey.bringWindowToFront": "Ta fram fönstret", - "onboarding.importPasskey.continueInSecureWindow": "Fortsätt i det säkra inloggningsfönstret.", - "onboarding.intro.button.alreadyHave": "Jag har redan en plånbok", - "onboarding.intro.button.logInOrImport": "Logga in eller importera", - "onboarding.intro.mobileScan.button": "Skanna QR-koden för att importera", - "onboarding.intro.mobileScan.title": "Har du Uniswap-appen?", - "onboarding.landing.button.add": "Lägg till en befintlig plånbok", - "onboarding.landing.button.create": "Skapa en plånbok", - "onboarding.landing.button.createAccount": "Skapa ett konto", - "onboarding.name.choose": "Välj ett användarnamn", - "onboarding.name.choose.subtitle": "Detta är ett offentligt namn som alla kan använda för att skicka krypto till dig.", - "onboarding.notification.permission.message": "För att få aviseringar, aktivera aviseringar för Uniswap Wallet i enhetens inställningar.", - "onboarding.notification.permission.title": "Aviseringsbehörighet", - "onboarding.notification.subtitle": "Håll dig uppdaterad om transaktionsstatus och större prisändringar för favoritpoletter.", - "onboarding.notification.title": "Slå på aviseringar", - "onboarding.passkey.create": "Skapa ditt lösenord", - "onboarding.passkey.loading.subtitle": "Detta bör ta bara en sekund.", - "onboarding.passkey.loading.title": "Hittar din plånbok...", - "onboarding.passkey.secure": "Säkra ditt konto", - "onboarding.passkey.secure.description": "Nyckeln låter dig snabbt och säkert komma åt ditt konto med bara ditt ansikte eller fingeravtryck.", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "Låt oss bekräfta att du har rätt. Om du förlorar eller skriver ner detta felaktigt kommer du inte att kunna återfå dina pengar.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "Om du förlorar eller skriver ner detta felaktigt kommer du inte att kunna återfå dina pengar.", - "onboarding.recoveryPhrase.confirm.title": "Låt oss bekräfta att du har rätt", - "onboarding.recoveryPhrase.view.subtitle": "Du måste ange alla 12 av dessa hemliga ord för att återställa din plånbok.", - "onboarding.recoveryPhrase.view.title": "Skriv ner din återhämtningsfras", - "onboarding.recoveryPhrase.view.title.hasPassword": "Om du någonsin glömmer ditt lösenord...", - "onboarding.recoveryPhrase.warning.final.button": "jag är redo", - "onboarding.recoveryPhrase.warning.final.message": "Din återställningsfras är det som ger dig (och alla som har det) tillgång till dina pengar. Se till att hålla det för dig själv.", - "onboarding.recoveryPhrase.warning.final.title": "Gör detta steg på en privat plats", - "onboarding.recoveryPhrase.warning.screenshot.message": "Alla som får tillgång till dina bilder kan komma åt din plånbok. Vi rekommenderar att du istället skriver ner dina ord.", - "onboarding.recoveryPhrase.warning.screenshot.title": "Skärmdumpar är inte säkra", - "onboarding.resetPassword.complete.safety": "Lär dig mer om plånbokssäkerhet", - "onboarding.resetPassword.complete.subtitle": "Använd ditt nya lösenord för att låsa upp din plånbok.", - "onboarding.resetPassword.complete.title": "Lösenordsåterställning", - "onboarding.scan.error": "Det gick inte att läsa in QR-koden", - "onboarding.scan.otp.error": "Koden du skickade är felaktig eller så uppstod ett fel när du skickade in. Var god försök igen.", - "onboarding.scan.otp.failed": "Misslyckade försök: {{number}}", - "onboarding.scan.otp.subtitle": "Kontrollera din Uniswap-mobilapp för koden på 6 tecken", - "onboarding.scan.otp.title": "Ange engångskod", - "onboarding.scan.subtitle": "Skanna QR-koden med Uniswap-mobilappen för att börja importera din plånbok.", - "onboarding.scan.title": "Importera plånbok från appen", - "onboarding.scan.troubleScanning.message": "Importera via återställningsfras", - "onboarding.scan.troubleScanning.title": "Problem med att skanna?", - "onboarding.scan.wifi": "Anslut din telefon till samma WiFi-nätverk som din dator.", - "onboarding.security.alert.biometrics.message.android": "För att använda biometri, konfigurera det först i inställningarna", - "onboarding.security.alert.biometrics.message.ios": "För att använda {{biometricsMethod}}, tillåt åtkomst i systeminställningarna", - "onboarding.security.alert.biometrics.title.android": "Biometri är inaktiverat", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} är inaktiverad", - "onboarding.security.button.confirm.android": "Aktivera biometri", - "onboarding.security.button.confirm.ios": "Aktivera {{biometricsMethod}}", - "onboarding.security.button.setup": "Uppstart", - "onboarding.security.subtitle.android": "Lägg till ett extra lager av säkerhet genom att kräva biometri för att skicka transaktioner.", - "onboarding.security.subtitle.ios": "Lägg till ett extra lager av säkerhet genom att kräva att {{biometricsMethod}} skickar transaktioner.", - "onboarding.security.title": "Skydda din plånbok", - "onboarding.selectWallets.error": "Det gick inte att läsa in adresser", - "onboarding.selectWallets.title.default": "Välj plånböcker att importera", - "onboarding.selectWallets.title.error": "Fel vid import av plånböcker", - "onboarding.termsOfService": "Genom att fortsätta godkänner jag Användarvillkoren och samtycker till Sekretesspolicyn", - "onboarding.tooltip.recoveryPhrase.trigger": "Vad är en återställningsfras?", - "onboarding.wallet.continue": "Låt oss hålla det säkert", - "onboarding.wallet.defaultName": "Plånbok {{number}}", - "onboarding.wallet.description.full": "Detta är ditt personliga utrymme för tokens, NFT:er och alla dina affärer. Slutför konfigureringen för att hålla dina pengar säkra.", - "onboarding.wallet.title": "Välkommen till din nya plånbok", - "onboarding.welcome.subtitle": "Låt oss slutföra konfigureringen av din plånbok.", - "onboarding.welcome.title": "Välkomna!", - "outageBanner.message": "{{chainName}}{{versionDescription}} data är inte tillgänglig just nu, men vi förväntar oss att problemet kommer att lösas inom kort.", - "outageBanner.message.sub": "Du kan fortfarande byta och tillhandahålla likviditet i denna kedja utan problem.", - "outageBanner.title": "{{versionName}} kommer snart tillbaka", - "passkeys.help.modal.subtitle": "Om du har problem med lösenord, besök Uniswap Support för hjälp.", - "passkeys.help.modal.subtitle.invalidPasskey": "Din begäran kunde inte slutföras. Försök igen med en lösenordsnyckel som är kopplad till ", - "passkeys.help.modal.subtitle.technicalError": "Din begäran kunde inte slutföras på grund av ett oväntat tekniskt fel. Dina pengar är säkra. Försök igen.", - "passkeys.help.modal.title": "Behövs hjälp?", - "passkeys.help.modal.title.invalidPasskey": "Ogiltigt lösenord", - "passkeys.help.modal.title.technicalError": "Tekniskt fel", - "passkeys.manage.modal.subtitle": "För att lägga till eller ta bort lösenord, vänligen logga in på {{passkeyManagementUrl}}.", - "passkeys.manage.modal.title": "Hantera lösenord", - "permit.approval.fail": "Tillståndsgodkännande misslyckades", - "permit.approval.fail.message": "Permit2 tillåter att tokengodkännanden delas och hanteras över olika applikationer.", - "pool.activeRange": "Aktivt fästingområde", - "pool.addAs": "Lägg till som {{nativeWrappedSymbol}}", - "pool.apr": "APR", - "pool.apr.base": "Bas APR", - "pool.apr.description": "Annualiserat baserat på 1 dags avgifter", - "pool.apr.reward": "Belöning APR", - "pool.aprText": "Pool APR", - "pool.balances": "Poolsaldon", - "pool.closedCTA.description": "Du kan se dem genom att använda filtret högst upp på sidan.", - "pool.closedCTA.title": "Letar du efter dina stängda positioner?", - "pool.collectAs": "Samla som {{nativeWrappedSymbol}}", - "pool.collectFees": "Samla in avgifter", - "pool.connectEthereumToView": "Anslut en Ethereum-plånbok för att se dina pooler", - "pool.create": "Skapar ny pool", - "pool.create.info": "Dina val kommer att skapa en ny likviditetspool som kan resultera i lägre initial likviditet och ökad volatilitet. Överväg att lägga till en befintlig pool för att minimera dessa risker.", - "pool.createdPosition": "Skapad position", - "pool.createdPosition.canceled": "Skapande av position avbröts", - "pool.createdPosition.failed": "Det gick inte att skapa position", - "pool.dynamic": "Dynamisk pool", - "pool.earnings": "Förtjänst", - "pool.earnings.empty": "Du har inga intäkter ännu", - "pool.explorers": "Utforskare", - "pool.import": "Import pool", - "pool.import.link.description": "Vissa v2-positioner visas inte automatiskt.", - "pool.import.positions.v2": "Importera V2-positioner", - "pool.import.positions.v2.selectPair.description": "Vissa v2-positioner visas inte automatiskt. Välj ett tokenpar för att importera och se dina positioner.", - "pool.import.success": "Pool importerad", - "pool.incentives.administeredRewards": "Belöningar delas ut genom det autonoma Merkl-distributörskontraktet.", - "pool.incentives.collect": "Samla", - "pool.incentives.collectedRewards": "Samlade belöningar", - "pool.incentives.collectFailed": "Insamlingen misslyckades, försök igen.", - "pool.incentives.collectFailedNoRetry": "Det gick inte att samla in belöningar.", - "pool.incentives.collectingRewards": "Samla belöningar", - "pool.incentives.collectRewards": "Samla belöningar", - "pool.incentives.collectRewardsCanceled": "Insamling av belöningar avbruten", - "pool.incentives.daysLeft": "dagar kvar", - "pool.incentives.eligible": "Kvalificerade pooler har symboliska belöningar så att du kan tjäna mer", - "pool.incentives.merklDocs": "Beräknat av Merkl från utsläppsbelöningar och pool TVL.", - "pool.incentives.rewardsDistribution": "Belöningsfördelning", - "pool.incentives.rewardsEarned": "Intjänade belöningar", - "pool.incentives.similarPoolHasRewards": "En liknande pool har UNI-belöningar", - "pool.incentives.switchPools": "Byt pool", - "pool.incentives.timePeriod": "Tidsperiod", - "pool.incentives.uni.findMore": "Hitta pooler med UNI-belöningar", - "pool.incentives.yourRewards.error": "Dina belöningar är inte tillgängliga just nu", - "pool.incentives.yourRewards.error.description": "Det gick inte att hämta belöningar. Detta kan bero på ett nätverksproblem. Testa att ladda om sidan.", - "pool.info": "Poolinformation", - "pool.limitFluctuation.warning": "Var medveten om att utförandet av limiter kan variera baserat på marknadsfluktuationer i realtid och överbelastning av Ethereum-nätverket. Gränser kanske inte exekveras exakt när tokens når det angivna priset.", - "pool.liquidity.data.error.message": "Det gick inte att hämta data som krävs för din transaktion.", - "pool.liquidity.outOfSync": "Pool- och marknadsprisfel överensstämmer", - "pool.liquidity.outOfSync.message": "Priserna i denna pool skiljer sig med marknadspriserna för de utvalda tokens. Justera din prisklass därefter eller vänta tills poolen återbalanseras för att undvika förluster.", - "pool.maxPrice": "Maxpris", - "pool.migrateLiquidity": "Migrera likviditet", - "pool.migrateLiquidityDisabledTooltip": "Denna kedja stöder inte v4 likviditetspooler.", - "pool.migrateToV4": "Migrera till v4", - "pool.minPrice": "Minsta pris", - "pool.newPosition.plus": "+ Ny position", - "pool.newPosition.title": "Ny position", - "pool.newSpecificPosition": "Ny {{symbol}} position", - "pool.notAvailableOnSolana": "Pooler finns inte tillgängliga på Solana", - "pool.notFound.description": "Tyvärr, vi kan inte hitta någon information om denna pool. Kontrollera namnet och adressen och försök igen.", - "pool.notFound.title": "Poolen hittades inte", - "pool.openToStart.evmAndSolanaConnected": "Öppna en ny position eller skapa en pool för att komma igång. Pooler är inte tillgängliga på Solana.", - "pool.openToStart.evmOnly": "Öppna en ny position eller skapa en pool för att komma igång.", - "pool.percent": "{{pct}}% pool", - "pool.pooled": "Poolat {{sym}}:", - "pool.position": "Placera", - "pool.positions": "Positioner", - "pool.positions.title": "Dina positioner", - "pool.positions.transaction.settings": "Transaktionsinställningar", - "pool.positions.usdValueUnavailable": "USD-värde inte tillgängligt", - "pool.positions.usdValueUnavailable.tooltip": "USD-värdet är för närvarande inte tillgängligt för denna position. Se positionsdetaljer för insatta tokenbelopp.", - "pool.refresh.prices": "Uppdatera priserna", - "pool.removeLiquidity": "Ta bort likviditeten", - "pool.rewardAPR": "Belöning APR (UNI)", - "pool.rewardAPR.percent": "{{pct}} belöning APR", - "pool.rewards": "Belöningar", - "pool.rewardsPool.label": "Poolpoletter i belöningspoolen:", - "pool.selectPair": "Välj par", - "pool.share.label": "Din poolandel:", - "pool.specificPosition": "{{symbol}} position", - "pool.tokenPair": "Tokenpar", - "pool.top.rewards": "Pooler med belöningar", - "pool.top.tvl": "Topppooler av TVL", - "pool.top.volume": "Pooler efter 24-timmarsvolym", - "pool.totalAPR": "Total APR", - "pool.totalTokens": "Dina totala pooltokens:", - "pool.v2": "v2 pooler", - "pool.v3": "v3 pooler", - "pool.via": "{{tokenPair}} via {{dex}}", - "pool.volOverTvl": "1D vol/TVL", - "pool.volume.thirtyDay": "30 dagars volym", - "pool.volume.thirtyDay.short": "30D vol", - "pool.withdrawAs": "Dra tillbaka som {{nativeWrappedSymbol}}", - "poolFinder.availablePools": "Tillgängliga pooler", - "poolFinder.availablePools.found.description": "v2-pooler som matchar ditt parval.", - "poolFinder.availablePools.notFound.description": "Inga matchande v2-pooler hittades. Dubbelkolla ditt val av token och se till att du är ansluten till rätt plånbok.", - "pools.explore": "Utforska pooler", - "portfolio.activity.filters.timePeriod.all": "Hela tiden", - "portfolio.activity.filters.transactionType.all": "Alla typer", - "portfolio.activity.filters.transactionType.deposits": "Insättningar", - "portfolio.activity.filters.transactionType.staking": "Insats", - "portfolio.activity.filters.transactionType.swaps": "Byten", - "portfolio.activity.title": "Aktivitet", - "portfolio.connectWallet.summary": "Spåra tokens, pooler och mer över {{amount}}+ nätverk", - "portfolio.defi.title": "DeFi", - "portfolio.description": "Spåra din kryptoportfölj över alla kedjor och protokoll", - "portfolio.nfts.title": "NFT:er", - "portfolio.overview.title": "Översikt", - "portfolio.title": "Portfölj", - "portfolio.tokens.table.column.allocation": "Tilldelning", - "portfolio.tokens.table.column.balance": "Balans", - "portfolio.tokens.table.column.change1d": "1D-ändring", - "portfolio.tokens.table.column.price": "Pris", - "portfolio.tokens.table.column.token": "Tecken", - "portfolio.tokens.table.column.value": "Värde", - "portfolio.tokens.title": "Polletter", - "position.addHook": "Lägg till en krok", - "position.addHook.tooltip": "Hooks är en avancerad funktion som gör det möjligt för pooler att interagera med smarta kontrakt, vilket låser upp olika funktioner. Var försiktig när du lägger till krokar, eftersom vissa kan vara skadliga eller orsaka oavsiktliga konsekvenser.", - "position.addingHook": "Lägger till krok", - "position.addingHook.disclaimer": "Att lägga till krokar kan få oavsiktliga konsekvenser. Gör din forskning och fortsätt på egen risk.", - "position.addingHook.hideProperties": "Dölj egenskaper", - "position.addingHook.invalidAddress": "Ange en giltig hook-adress", - "position.addingHook.viewProperties": "Visa fastigheter", - "position.create.confirm": "Bekräfta position", - "position.create.invalidPrice": "Ogiltigt pris", - "position.create.invalidRange": "Ogiltigt intervall", - "position.create.modal.header": "Skapa position", - "position.create.unsupportedSolana": "Solana-pooler stöds inte.", - "position.create.unsupportedSolana.description": "För att skapa en pool, växla till en EVM-kedja som stöds.", - "position.create.unsupportedToken.description": "Försök att skapa med en annan protokollversion.", - "position.create.v2unsupportedChain": "Den här kedjan stöds inte för v2-pooler.", - "position.currentValue": "Aktuellt positionsvärde", - "position.default_price_strategies": "Prisstrategier", - "position.default_price_strategies.error": "Det gick inte att ställa in prisstrategi", - "position.deposit.confirm.create.description.less": "Det initiala priset som anges är {{value}}% lägre än marknadspriset och kan resultera i förlust av pengar. Vill du fortsätta?", - "position.deposit.confirm.create.description.more": "Det angivna initiala priset är {{value}}% högre än marknadspriset och kan resultera i förlust av pengar. Vill du fortsätta?", - "position.deposit.confirm.create.title": "Stor prisskillnad mot marknaden", - "position.deposit.description": "Ange symbolbeloppen för ditt likviditetsbidrag.", - "position.depositedCurrency": "Deponerade {{currencySymbol}}", - "position.fot.warning": "{{token}} och andra \"Avgift vid överföring\"-tokens stöds endast av Uniswap v2.", - "position.fot.warning.cta": "Skapa en v2-position", - "position.hook.disclaimer": "Jag förstår de potentiella riskerna med att lägga till denna krok.", - "position.hook.donateWarning": "Denna flagga kan leda till ändringar av intjänade avgifter.", - "position.hook.liquidityWarning": "Denna flagga kan få poolen att blockera tillskottet av ny likviditet. Din transaktion kan återgå.", - "position.hook.removeWarning": "Kan göra att dina pengar låses eller blockera dig från att ta ut avgifter.", - "position.hook.swapWarning": "Denna flagga kan göra det möjligt för likviditetsleverantörer att lättare utnyttja Just-In-Time-likviditet, vilket kan resultera i lägre intjänade avgifter.", - "position.hook.warningHeader": "Viktigt: krokrisker identifierade", - "position.hook.warningInfo": "Vi har identifierat potentiella risker med denna krok. Se till att du förstår hur denna krok fungerar innan du bestämmer dig för att fortsätta.", - "position.increase.fot": "Att lägga till likviditet för {{token}} och andra \"Fee on Transfer\"-tokens stöds inte.", - "position.initialPrice": "Ursprungligt pris", - "position.initialPrice.difference.negative": "{{ value }}% lägre än marknadspriset", - "position.initialPrice.difference.positive": "{{ value }}% mer än marknadspriset", - "position.initialPrice.info": "När du skapar en ny pool måste du ställa in startväxelkursen för båda tokens. Denna kurs kommer att återspegla det ursprungliga marknadspriset.", - "position.initialPrice.set": "Sätt initialt pris", - "position.initialPrice.useMarketPrice": "Använd marknadspris", - "position.migrate.liquidity": "När du migrerar positioner kan du inte ändra ditt tokenpar, men du kan lägga till en krok för att förbättra funktionaliteten.", - "position.migrate.v4unsupportedChain": "Den här kedjan stöds inte för v4-pooler.", - "position.new": "Ny position", - "position.new.protocol": "Ny {{protocol}} position", - "position.notFound": "Position hittades inte", - "position.notFound.description": "Detaljer om denna position är inte tillgängliga. Kontrollera att du är ansluten med rätt plånbok.", - "position.one_sided_lower": "Ensidig nedre", - "position.one_sided_lower.description": "Tillför likviditet om priset sjunker", - "position.one_sided_upper": "Ensidig ovandel", - "position.one_sided_upper.description": "Tillför likviditet om priset går upp", - "position.protocol": "{{protocol}} position", - "position.provide.liquidity": "Välj de tokens du vill ge likviditet till. Du kan välja tokens på alla nätverk som stöds.", - "position.provide.liquidityDescription": "Att tillhandahålla likviditet i hela sortimentet säkerställer ett kontinuerligt marknadsdeltagande över alla möjliga priser, vilket erbjuder enkelhet men med potential för högre impermanent förlust.", - "position.provide.liquidityDescription.creatingPool": "Att ställa in full likviditet när du skapar en pool säkerställer kontinuerligt marknadsdeltagande över alla möjliga priser, vilket erbjuder enkelhet men med potential för högre permanenta förluster.", - "position.provide.liquidityDescription.custom": "Anpassat sortiment gör att du kan koncentrera din likviditet inom specifika prisgränser, vilket förbättrar kapitaleffektiviteten och avgiftsintäkterna men kräver mer aktiv förvaltning.", - "position.provide.outOfRange.closePosition": "Stängt läge", - "position.provide.outOfRange.description": "Denna positions intervall kan inte justeras under migreringen. För att ställa in ett nytt intervall, stäng denna position och öppna en ny v4-position.", - "position.provide.outOfRange.title": "Du migrerar en position utanför räckvidden", - "position.removeHook": "Ta bort kroken", - "position.resetDescription": "Dina tokens, pris och intervall kommer att återställas.", - "position.setRange": "Ställ in prisklass", - "position.setRange.inputsBelow": "Använd ingångarna nedan för att ställa in ditt räckvidd.", - "position.stable": "Stabil", - "position.stable.description": "Bra för stablecoins eller par med låg volatilitet", - "position.step.deposit": "Ange insättningsbelopp", - "position.step.price": "Ställ in initialpris och insättningsbelopp", - "position.step.range": "Ställ in prisintervall och insättningsbelopp", - "position.step.select": "Välj tokenpar och avgifter", - "position.value": "Positionsvärde", - "position.valueUnavailable": "USD-värdet är för närvarande inte tillgängligt för denna position. Se positionsdetaljer för insatta tokenbelopp.", - "position.wide": "Bred", - "position.wide.description": "Bra för volatila par", - "position.wrapped.unwrap": "Packa upp {{wrappedToken}}", - "position.wrapped.warning": "{{nativeToken}} krävs för v4-pooler", - "position.wrapped.warning.info": "Packa upp din {{wrappedToken}} och sätt in {{nativeToken}} för att ge mer kostnadseffektiv och effektiv likviditet.", - "positions.noPositions.description": "Du har inga likviditetspositioner. Skapa en ny position för att börja tjäna avgifter och belöningar på kvalificerade pooler.", - "positions.noPositions.title": "Inga positioner", - "positions.welcome.connect.description": "För att se dina positioner och belöningar måste du ansluta din plånbok.", - "positions.welcome.connect.wallet": "Anslut din plånbok", - "privacy.anonymizedLogs": "Appen loggar anonymiserad användningsstatistik för att förbättras över tid.", - "privacy.autoRouter": "Appen hämtar den optimala handelsvägen från en Uniswap Labs-server.", - "privacy.infura": "Appen hämtar data i kedjan och konstruerar kontraktsanrop med ett Infura API.", - "privacy.thirdPartyApis": "Den här appen använder följande API:er från tredje part:", - "privacy.trm": "Appen samlar säkert in din plånboksadress och delar den med TRM Labs Inc. av risk- och efterlevnadsskäl.", - "privacy.uniswaptos": "Uniswap Labs användarvillkor", - "privateKeys.export.modal.speedbump.bullet1": "Se detta privat", - "privateKeys.export.modal.speedbump.bullet2": "Dela inte med någon", - "privateKeys.export.modal.speedbump.bullet3": "Ange det aldrig på några webbplatser eller applikationer", - "privateKeys.export.modal.speedbump.subtitle": "Alla som känner till din privata nyckel kan komma åt din plånbok och dina pengar.", - "privateKeys.export.modal.speedbump.title": "Innan du fortsätter", - "privateKeys.export.modal.subtitle": "Det verkar som att du inte kan återställa din plånbok helt. För att se till att du aldrig förlorar åtkomst till dina pengar, kopiera din privata nyckel.", - "privateKeys.export.modal.title": "Exportera din privata nyckel", - "privateKeys.export.modal.warning": "Om du tappar bort din telefon eller tar bort appen måste du importera den här nyckeln till en annan plånbok.", - "privateKeys.view.button.continue": "Jag kopierade allihop.", - "privateKeys.view.button.continue.single": "Jag kopierade det.", - "privateKeys.view.subtitle": "Din privata nyckel ger åtkomst till en specifik plånbok. Varje plånbok har en unik privat nyckel.", - "privateKeys.view.title": "Privat nyckel", - "qrScanner.button.connections_one": "1 app ansluten", - "qrScanner.button.connections_other": "{{count}} appar anslutna", - "qrScanner.error.camera.message": "För att skanna en kod, tillåt kameraåtkomst i systeminställningarna", - "qrScanner.error.camera.title": "Kameran är inaktiverad", - "qrScanner.error.none": "Ingen QR-kod hittades", - "qrScanner.recipient.action.scan": "Skanna en QR-kod", - "qrScanner.recipient.action.show": "Visa min QR-kod", - "qrScanner.recipient.error.message": "Se till att du skannar en giltig QR-kod för Ethereum-adress innan du försöker igen.", - "qrScanner.recipient.error.title": "Ogiltig QR-kod", - "qrScanner.request.message.unavailable": "Inget meddelande hittades.", - "qrScanner.request.method.default": "Begäran från {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "Signaturbegäran från {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "Transaktionsbegäran från {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "Tillåt {{dappName}} att använda upp till {{amount}} {{currencySymbol}}?", - "qrScanner.request.withoutAmount": "Tillåt {{dappName}} att använda din {{currencySymbol}}?", - "qrScanner.status.connecting": "Ansluter...", - "qrScanner.status.loading": "Läser in...", - "qrScanner.title": "Skanna en QR-kod", - "qrScanner.wallet.networks": "Nätverk som stöds", - "range.outOfView": "Räckvidd utom synhåll", - "removeLiquidity.pooled": "Poolat {{symbol}}:", - "revoke.failed.message": "Ett nätverks- eller anslutningsproblem orsakade troligen att din återkallning misslyckades. Kontrollera din anslutning och försök igen.", - "routing.aggregateLiquidity": "När tillgängligt, aggregerar likviditetskällor för bättre priser och gasfria swappar.", - "routing.aggregateLiquidity.uniswapx": "UniswapX aggregerar likviditetskällor på och utanför kedjan, vilket ger dig de bästa tillgängliga priserna och gasfria swappar.", - "routing.cheapest": "Uniswap-klienten väljer det billigaste handelsalternativet med hänsyn till pris och nätverkskostnader.", - "routing.cheapest.v4": "Uniswap-klienten väljer det optimala handelsalternativet med hänsyn till pris och nätverkskostnader.", - "scantastic.code.expired": "Utgånget", - "scantastic.code.subtitle": "Ange denna kod i Uniswap-tillägget. Din återställningsfras kommer att krypteras och överföras säkert.", - "scantastic.code.timeRemaining.shorthand.hours": "Ny kod i {{hours}}h {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.minutes": "Ny kod i {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.seconds": "Ny kod i {{seconds}}s", - "scantastic.code.title": "Uniswap engångskod", - "scantastic.confirmation.button.continue": "Ja, fortsätt", - "scantastic.confirmation.label.browser": "Webbläsare", - "scantastic.confirmation.label.device": "Enhet", - "scantastic.confirmation.subtitle": "Fortsätt bara om du skannar en QR-kod från Uniswap Extension på en betrodd enhet.", - "scantastic.confirmation.title": "Försöker du importera din plånbok?", - "scantastic.confirmation.warning": "Se upp för webbplatser och appar som utger sig för att vara Uniswap. Annars kan din plånbok äventyras.", - "scantastic.error.encryption": "Det gick inte att förbereda fröfrasen.", - "scantastic.error.noCode": "Ingen OTP mottagen. Var god försök igen.", - "scantastic.error.timeout.message": "Skanna QR-koden på Uniswap-tillägget igen för att fortsätta synkronisera din plånbok.", - "scantastic.error.timeout.title": "Din anslutning tog timeout", - "scantastic.modal.ipMismatch.description": "För att skanna den här QR-koden måste din telefon vara ansluten till samma WiFi-nätverk som din dator och eventuella VPN ska stängas av tillfälligt.", - "scantastic.modal.ipMismatch.title": "Byt ditt WiFi-nätverk", - "search.input.placeholder": "Sök polletter och pooler", - "search.ukDisclaimer": "Ansvarsfriskrivning för invånare i Storbritannien", - "send.button.review": "Granska överföringen", - "send.gas.error.title": "N/A", - "send.gas.networkCost.title": "Nätverkskostnad", - "send.input.token.balance.title": "Saldo: {{balance}} {{symbol}}", - "send.recipient.header": "Välj mottagare", - "send.recipient.input.placeholder": "Sök ENS eller adress", - "send.recipient.previous_one": "1 tidigare överföring", - "send.recipient.previous_other": "{{count}} tidigare överföringar", - "send.recipient.results.empty": "Inga resultat funna", - "send.recipient.results.error": "Adressen du skrev finns antingen inte eller är felstavad.", - "send.recipient.section.favorite": "Favoritplånböcker", - "send.recipient.section.recent": "Nyligen", - "send.recipient.section.search": "Sökresultat", - "send.recipient.section.viewOnly": "View-only plånböcker", - "send.recipient.section.yours": "Dina plånböcker", - "send.recipient.warning.viewOnly.message": "Skicka bara pengar till den här plånboken om du har återställningsfrasen eller känner ägaren till plånboken.", - "send.recipient.warning.viewOnly.title": "Du har detta som en visningsbart plånbok", - "send.recipientSelect.search.empty.message": "När du skickar tokens till en plånboksadress kommer de att dyka upp här", - "send.recipientSelect.search.empty.title": "Inga plånböcker sparade", - "send.review.modal.title": "Du skickar", - "send.review.summary.button.title": "Bekräfta skicka", - "send.search.empty.subtitle": "Adressen du skrev finns antingen inte eller är felstavad.", - "send.search.empty.title": "Inga resultat funna", - "send.search.placeholder": "Sök ENS eller adress", - "send.solanaSendNotSupported": "Skicka stöds inte på Solana", - "send.title": "Skicka", - "send.unavailableOnSolana.message": "Skicka är inte tillgängligt på Solana-plånböcker", - "send.warning.blocked.default": "Denna plånbok är blockerad", - "send.warning.blocked.modal.message": "Den här adressen är blockerad på Uniswap Wallet eftersom den är kopplad till en eller flera blockerade aktiviteter. Om du tror att detta är ett fel, skicka ett e-postmeddelande till compliance@uniswap.org.", - "send.warning.blocked.modal.title": "Blockerad adress", - "send.warning.blocked.recipient": "Mottagarens plånbok är blockerad", - "send.warning.erc20.checkbox.description": "Du försöker skicka pengar till en token-adress. Detta kan resultera i en permanent förlust av medel.", - "send.warning.erc20.checkbox.heading": "Tokenadress upptäcktes", - "send.warning.erc20.message": "Du försöker skicka pengar till en token-adress. Att skicka krypto till denna typ av adress kan resultera i en permanent förlust av pengar.", - "send.warning.erc20.title": "Detta är en symbolisk adress", - "send.warning.insufficientFunds.message": "Ditt saldo {{currencySymbol}} har minskat sedan du angav beloppet du vill skicka", - "send.warning.insufficientFunds.title": "Inte tillräckligt {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "Inte tillräckligt med {{currencySymbol}} på {{networkName}} för att skicka", - "send.warning.insufficientGas.message.withoutNetwork": "Inte tillräckligt med {{currencySymbol}} för att skicka", - "send.warning.modal.button.cta.blocking": "OK", - "send.warning.modal.button.cta.cancel": "Annullera", - "send.warning.modal.button.cta.confirm": "Bekräfta", - "send.warning.newAddress.details.ENS": "ENS", - "send.warning.newAddress.details.username": "Användarnamn", - "send.warning.newAddress.details.walletAddress": "Plånboksadress", - "send.warning.newAddress.message": "Du har inte gjort transaktioner med den här adressen tidigare. Bekräfta att adressen är korrekt innan du fortsätter.", - "send.warning.newAddress.title": "Ny adress", - "send.warning.self.message": "Du försöker skicka pengar till din nuvarande plånbok. Att skicka krypto till denna adress kommer att medföra onödiga nätverkskostnader.", - "send.warning.self.title": "Det här är din nuvarande plånbok", - "send.warning.smartContract.message": "Du är på väg att skicka pengar till en smart kontraktsadress. Se till att detta är rätt adress och att den kan ta emot tokens. Om inte, kan detta resultera i en permanent förlust av medel.", - "send.warning.smartContract.title": "Detta är en smart kontraktsadress", - "send.warning.viewOnly.message": "Du måste importera den här plånboken via återställningsfras för att skicka tillgångar.", - "send.warning.viewOnly.title": "Denna plånbok är endast visningsbar", - "send.youAreSending": "Du skickar", - "sendRecipientForm.recentAddresses.label": "Senaste", - "sendReviewModal.title": "Recension skicka", - "setting.recoveryPhrase.account.show": "Visa återställningsfras", - "setting.recoveryPhrase.action.hide": "Dölj återställningsfras", - "setting.recoveryPhrase.remove": "Ta bort återställningsfrasen", - "setting.recoveryPhrase.remove.confirm.subtitle": "Jag förstår att Uniswap Labs inte kan hjälpa mig att återställa min plånbok om jag misslyckades med det.", - "setting.recoveryPhrase.remove.confirm.title": "Jag sparade min återställningsfras", - "setting.recoveryPhrase.remove.initial.subtitle": "Se till att du har sparat din återställningsfras. Annars förlorar du tillgång till dina plånböcker", - "setting.recoveryPhrase.remove.initial.title": "Innan du fortsätter", - "setting.recoveryPhrase.remove.subtitle": "Ange ditt lösenord för att bekräfta", - "setting.recoveryPhrase.remove.title": "Du tar bort din återställningsfras", - "setting.recoveryPhrase.view.warning.message1": "Alla som kan din återställningsfras kan komma åt din plånbok och pengar", - "setting.recoveryPhrase.view.warning.message2": "Se detta privat", - "setting.recoveryPhrase.view.warning.message3": "Dela inte med någon", - "setting.recoveryPhrase.view.warning.message4": "Ange det aldrig på några webbplatser eller applikationer", - "setting.recoveryPhrase.view.warning.title": "Innan du fortsätter", - "setting.recoveryPhrase.warning.view.message": "Alla som kan din återställningsfras kan komma åt din plånbok och pengar.", - "setting.recoveryPhrase.warning.view.title": "Se detta på en privat plats", - "settings.action.enableInSettings": "Aktivera i Inställningar", - "settings.action.feedback": "Skicka synpunkter", - "settings.action.help": "Få hjälp", - "settings.action.lock": "Lås plånbok", - "settings.action.privacy": "Integritetspolicy", - "settings.action.terms": "Användarvillkor", - "settings.connectWalletPlatform.warning": "För att använda Uniswap på {{platform}}, anslut till en plånbok som stöder {{platform}}.", - "settings.footer": "Tillverkad med kärlek, \nUniswap Team 🦄", - "settings.hideSmallBalances": "Dölj små saldon", - "settings.hideSmallBalances.subtitle": "Saldon under 1 USD kommer att döljas från din portfölj.", - "settings.maxSlippage": "Max. glidning", - "settings.maxSlippage.amount": "{{amount}} max. glidning", - "settings.section.about": "Handla om", - "settings.section.preferences": "Inställningar", - "settings.section.privacyAndSecurity": "Sekretess och säkerhet", - "settings.section.support": "Stöd", - "settings.section.wallet.hidden.row.title": "{{numHidden}} andra plånböcker", - "settings.setting.advanced.title": "Avancerad", - "settings.setting.advancedSettings": "Advanced settings", - "settings.setting.appearance.option.auto": "Bil", - "settings.setting.appearance.option.dark.subtitle": "Använd alltid mörkt tema.", - "settings.setting.appearance.option.dark.title": "Mörk", - "settings.setting.appearance.option.device.subtitle": "Anpassar sig till din enhets inställningar.", - "settings.setting.appearance.option.device.title": "Bil", - "settings.setting.appearance.option.light.subtitle": "Använd alltid lätta tema.", - "settings.setting.appearance.option.light.title": "Ljus", - "settings.setting.appearance.title": "Tema", - "settings.setting.backup.create.description": "Om du ställer in ett lösenord krypterar du säkerhetskopian av din återställningsfras, vilket ger en extra skyddsnivå om ditt {{cloudProviderName}} -konto någonsin äventyras.", - "settings.setting.backup.create.title": "Säkerhetskopiera till {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "Eftersom dessa plånböcker delar en återställningsfras kommer den också att ta bort säkerhetskopiorna för dessa plånböcker nedan", - "settings.setting.backup.delete.confirm.title": "Är du säker?", - "settings.setting.backup.delete.warning": "Om du tar bort din {{cloudProviderName}} säkerhetskopia kommer du bara att kunna återställa din plånbok med en manuell säkerhetskopia av din återställningsfras. Uniswap Labs kan inte återställa dina tillgångar om du tappar din återställningsfras.", - "settings.setting.backup.error.message.full": "Det går inte att säkerhetskopiera återställningsfrasen till {{cloudProviderName}}. Se till att du har {{cloudProviderName}} aktiverat med tillgängligt lagringsutrymme och försök igen.", - "settings.setting.backup.error.message.short": "Det gick inte att ta bort säkerhetskopian", - "settings.setting.backup.error.title": "{{cloudProviderName}} fel", - "settings.setting.backup.modal.description": "Du har inte säkerhetskopierat din återställningsfras till {{cloudProviderName}} än. Genom att göra det kan du återställa din plånbok bara genom att vara inloggad på {{cloudProviderName}} på vilken enhet som helst.", - "settings.setting.backup.modal.title": "Säkerhetskopiera återställningsfrasen till {{cloudProviderName}}?", - "settings.setting.backup.password.error.mismatch": "Lösenorden matchar inte", - "settings.setting.backup.password.medium": "Detta är ett medelstort lösenord", - "settings.setting.backup.password.placeholder.confirm": "Bekräfta lösenord", - "settings.setting.backup.password.placeholder.create": "Skapa lösenord", - "settings.setting.backup.password.strong": "Detta är ett starkt lösenord", - "settings.setting.backup.password.weak": "Detta är ett svagt lösenord", - "settings.setting.backup.recoveryPhrase.label": "Återställningsfras", - "settings.setting.backup.selected": "{{cloudProviderName}} backup", - "settings.setting.backup.status.action.delete": "Ta bort säkerhetskopia", - "settings.setting.backup.status.complete": "Säkerhetskopierat till {{cloudProviderName}}", - "settings.setting.backup.status.description": "Genom att säkerhetskopiera din återställningsfras till {{cloudProviderName}}kan du återställa din plånbok bara genom att vara inloggad på ditt {{cloudProviderName}} -konto på vilken enhet som helst.", - "settings.setting.backup.status.inProgress": "Säkerhetskopierar till {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "Backade upp", - "settings.setting.backup.status.title": "{{cloudProviderName}} backup", - "settings.setting.beta.tooltip": "Kommer snart", - "settings.setting.biometrics.appAccess.subtitle.android": "Kräv ansikte/fingeravtryck för att öppna appen.", - "settings.setting.biometrics.appAccess.subtitle.ios": "Kräv {{biometricsMethod}} för att öppna appen.", - "settings.setting.biometrics.appAccess.title": "Appåtkomst", - "settings.setting.biometrics.auth": "Vänligen autentisera", - "settings.setting.biometrics.extension.waitingForBiometricsModal.content": "Aktivera {{biometricsMethod}} i din webbläsare eller systeminställningar för att fortsätta.", - "settings.setting.biometrics.extension.waitingForBiometricsModal.title": "Väntar på {{biometricsMethod}}", - "settings.setting.biometrics.off.message.android": "Biometri är för närvarande avstängd för Uniswap Wallet – du kan aktivera den i dina systeminställningar.", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} är för närvarande avstängd för Uniswap Wallet—du kan aktivera den i dina systeminställningar.", - "settings.setting.biometrics.off.title.android": "Biometrin är avstängd", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} är avstängd", - "settings.setting.biometrics.title": "Lås upp ansikte/fingeravtryck", - "settings.setting.biometrics.transactions.subtitle.android": "Kräv ansikte/fingeravtryck för att handla.", - "settings.setting.biometrics.transactions.subtitle.ios": "Kräv {{biometricsMethod}} för att handla.", - "settings.setting.biometrics.transactions.title": "Transaktioner", - "settings.setting.biometrics.unavailable.message.android": "Biometri är inte konfigurerat på din enhet. För att använda biometri, ställ in det först i Inställningar.", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} är inte konfigurerat på din enhet. För att använda {{biometricsMethod}}, ställ in det först i Inställningar.", - "settings.setting.biometrics.unavailable.title.android": "Biometri är inte inställt", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} är inte inställd", - "settings.setting.biometrics.warning.message.android": "Om du inte aktiverar biometri kan alla som får tillgång till din enhet öppna Uniswap Wallet och göra transaktioner.", - "settings.setting.biometrics.warning.message.ios": "Om du inte slår på {{biometricsMethod}}kan alla som får tillgång till din enhet öppna Uniswap Wallet och göra transaktioner.", - "settings.setting.biometrics.warning.title": "Är du säker?", - "settings.setting.connections.disconnectAll": "Koppla bort alla", - "settings.setting.connections.noConnectionsDescription": "Anslut till en app genom att leta efter en \"Anslut plånbok\" eller \"Logga in\"-knapp.", - "settings.setting.currency.title": "Lokal valuta", - "settings.setting.deviceAccess.reset.title": "Återställ din {{biometricsMethod}}", - "settings.setting.deviceAccess.title": "Enhetsåtkomst", - "settings.setting.deviceAccessTimeout.1hour": "1 timme", - "settings.setting.deviceAccessTimeout.24hours": "24 timmar", - "settings.setting.deviceAccessTimeout.30minutes": "30 minuter", - "settings.setting.deviceAccessTimeout.5minutes": "5 minuter", - "settings.setting.deviceAccessTimeout.never": "Aldrig", - "settings.setting.deviceAccessTimeout.title": "Timeout för automatisk låsning", - "settings.setting.hapticTouch.title": "Haptisk beröring", - "settings.setting.helpCenter.title": "Hjälpcenter", - "settings.setting.language.button.navigate": "Gå till Inställningar", - "settings.setting.language.description.extension": "Uniswap standardinställningar för dina systemspråkinställningar. För att ändra ditt föredragna språk, gå till dina systeminställningar.", - "settings.setting.language.description.mobile": "Uniswap är standard för din enhets språkinställningar. För att ändra ditt föredragna språk, gå till \"Uniswap\" i dina enhetsinställningar och tryck på \"Språk\".", - "settings.setting.language.title": "Språk", - "settings.setting.notifications.row.activity.description": "Överföringar, förfrågningar och annan aktivitet", - "settings.setting.notifications.row.activity.title": "Plånboksaktivitet", - "settings.setting.notifications.row.updates.description": "Rekommendationer och nya funktioner", - "settings.setting.notifications.row.updates.title": "Uppdateringar från Uniswap", - "settings.setting.notifications.title": "Aviseringar", - "settings.setting.password.change.title": "Skapa ett nytt lösenord", - "settings.setting.password.title": "ändra lösenord", - "settings.setting.permissions.title": "Behörigheter", - "settings.setting.privacy.analytics.description": "Vi använder anonym användningsdata för att förbättra din upplevelse i Uniswap Labs produkter. När den är inaktiverad spårar vi bara fel och väsentlig användning.", - "settings.setting.privacy.analytics.title": "Appanalys", - "settings.setting.privateKeys.title": "Privata nycklar", - "settings.setting.recoveryPhrase.title": "Återställningsfras", - "settings.setting.smallBalances.title": "Portföljbalans", - "settings.setting.smartWallet.action.enable": "Gör det möjligt", - "settings.setting.smartWallet.action.smartWallet": "Smart wallet", - "settings.setting.smartWallet.notEligible": "Inte berättigad", - "settings.setting.smartWallet.status.actionRequired": "Åtgärd krävs", - "settings.setting.smartWallet.status.active": "Aktiva", - "settings.setting.smartWallet.status.inactive": "Inaktiv", - "settings.setting.smartWallet.status.unavailable": "Inte tillgänglig", - "settings.setting.unknownTokens.subtitle": "Potentiella blufftokens kommer att döljas från din portfölj.", - "settings.setting.unknownTokens.title": "Dölj okända tokens", - "settings.setting.wallet.action.editLabel": "Redigera etikett", - "settings.setting.wallet.action.editProfile": "Redigera profil", - "settings.setting.wallet.action.remove": "Ta bort plånboken", - "settings.setting.wallet.connection.banner.description": "Hantera anslutningar via plånboksinställningar genom att klicka på din profilbild.", - "settings.setting.wallet.connection.banner.title": "Anslutningarna har flyttats", - "settings.setting.wallet.connections.title": "Anslutningar", - "settings.setting.wallet.editLabel.description": "Etiketter är inte offentliga. De lagras lokalt och endast synliga för dig.", - "settings.setting.wallet.editLabel.save": "Spara ändringar", - "settings.setting.wallet.label": "Smeknamn", - "settings.setting.wallet.testnetMode.description": "Detta aktiverar testnät för utvecklare att testa funktioner och transaktioner utan att använda riktiga tillgångar. Tokens på testnät har inget verkligt värde.", - "settings.setting.wallet.testnetMode.title": "Testnet-läge", - "settings.switchNetwork.warning": "För att använda Uniswap på {{label}}byter du nätverk i plånbokens inställningar.", - "settings.title": "inställningar", - "settings.version": "Version {{appVersion}}", - "smartWallet.actionRequired.cta": "Inaktivera på 1 nätverk", - "smartWallet.actionRequired.cta.plural": "Inaktivera på {{amount}} nätverk", - "smartWallet.actionRequired.description": "Att inaktivera smart plånbok är en onchain-åtgärd som kräver en liten nätverkskostnad.", - "smartWallet.actionRequired.insufficientFunds": "Otillräckliga medel", - "smartWallet.actionRequired.reactivate": "Fortsätt använda smart plånbok", - "smartWallet.actionRequired.title": "Smart plånbok är aktiv på 1 nätverk", - "smartWallet.actionRequired.title.plural": "Smart plånbok är aktiv på {{amount}} nätverk", - "smartWallet.activeNetworks.title": "Smart plånbok är aktiv på 1 nätverk", - "smartWallet.activeNetworks.title.plural": "Smart plånbok är aktiv på {{amount}} nätverk", - "smartWallet.banner.networkCost": "Includes a one-time cost to activate your smart wallet on {{chainName}}.", - "smartWallet.banner.text": "Aktivera smart plånbok för att spara upp till 50 % på nätverkskostnader.", - "smartWallet.confirmDisableSmartWallet.description": "Du går miste om snabbare byten, rabatterade nätverkskostnader och andra kommande förbättringar.", - "smartWallet.confirmDisableSmartWallet.title": "Är du säker?", - "smartWallet.insufficient.description": "Smart plånbok kan inte inaktiveras på dessa nätverk förrän du har pengar för att täcka nätverkskostnaderna.", - "smartWallet.insufficient.title": "Otillräckliga medel på 1 nätverk", - "smartWallet.insufficient.title.plural": "Otillräckliga medel på {{amount}} nätverk", - "smartWallet.InsufficientFunds.button.continue.text": "Fortsätt ändå", - "smartWallet.insufficientFunds.network.banner.description": "Kan inte inaktiveras på grund av otillräckliga medel.", - "smartWallet.insufficientFunds.network.banner.title_one": "{{count}} nätverk uteslutet", - "smartWallet.insufficientFunds.network.banner.title_other": "{{count}} nätverk uteslutet", - "smartWallet.insufficientFunds.network.disable.text": "Klar att inaktivera", - "smartWallet.insufficientFunds.network.text": "Du behöver {{nativeCurrency}}", - "smartWallet.insufficientFunds.single.network.banner.title": "{{chain}} utesluten", - "smartWallet.modal.description.block1": "Smarta plånböcker använder smarta kontrakt för snabbare och billigare transaktioner.", - "smartWallet.modal.description.block2": "Plånböcker som redan använder smarta plånboksfunktioner från en annan app kommer inte att påverkas.", - "smartWallet.modal.title": "Smart plånbok", - "smartWallets": "Smarta plånböcker", - "smartWallets.activeNetworks.description": "Din smarta plånbok aktiveras automatiskt i varje nytt nätverk du byter till.", - "smartWallets.createdModal.description": "You’re getting faster transactions and lower network costs on every swap.", - "smartWallets.createdModal.title": "Smart plånbok skapad", - "smartWallets.delegation.limitedSupport": "Din plånbok har begränsat stöd", - "smartWallets.delegationMismatchModal.description": "{{walletName}} stöder inte de senaste Ethereum-standarderna som används av {{displayName}}, så vissa funktioner är inte tillgängliga.", - "smartWallets.delegationMismatchModal.features.1ClickSwaps": "1-klicksbyten", - "smartWallets.delegationMismatchModal.features.gasFreeSwaps": "Gasfria byten", - "smartWallets.delegationMismatchModal.features.limitOrders": "Limiterade ordrar", - "smartWallets.delegationMismatchModal.limitOrders.unsupported": "Limit orders stöds inte av din plånbok.", - "smartWallets.delegationMismatchModal.title": "Begränsat plånboksstöd", - "smartWallets.disable.failed": "Ett fel uppstod. Smart plånbok är fortfarande aktiv på ett eller flera nätverk. Försök igen.", - "smartWallets.disable.modal.description": "Denna onchain-åtgärd kräver en nätverkskostnad.", - "smartWallets.disable.modal.title": "Inaktivera smart plånbok", - "smartWallets.educationalModal.description": "Smarta plånböcker erbjuder snabbare och billigare transaktioner med hjälp av smarta kontrakt.", - "smartWallets.educationalModal.info": "Plånböcker som redan använder smarta plånboksfunktioner från en annan app kommer inte att påverkas.", - "smartWallets.enabledModal.description": "Uppdateringar träder i kraft vid ditt nästa byte.", - "smartWallets.enabledModal.description.dapp": "Uppdateringarna träder i kraft vid din nästa transaktion.", - "smartWallets.enabledModal.description.dapp.line2": "Återanslut din plånbok för att börja använda smarta plånboksfunktioner i appar direkt.", - "smartWallets.enabledModal.title": "Smart plånbok aktiverad", - "smartWallets.postSwapNudge.enable": "Aktivera smart plånbok", - "smartWallets.postSwapNudge.title": "Spara på ditt nästa byte", - "smartWallets.postSwapNudge.title.dapp": "Den här appen stöder smarta plånböcker", - "smartWallets.unavailableModal.description": "En annan plånboksleverantör hanterar nu smarta plånboksinställningar för {{displayName}}. Du kan fortsätta använda Uniswap som vanligt.", - "smartWallets.unavailableModal.title": "Smarta plånboksfunktioner är inte tillgängliga", - "solanaPromo.banner.description": "Handla Solana-tokens direkt på Uniswap.", - "solanaPromo.banner.title": "Solana är nu tillgänglig", - "solanaPromo.modal.connectWallet": "Anslut din favorit Solana-plånbok", - "solanaPromo.modal.startSwapping.button": "Börja byta på Solana", - "solanaPromo.modal.swapInstantly": "Byt tusentals trendiga tokens direkt", - "solanaPromo.modal.viewTokenData": "Visa tokendata och priser på ett ställe", - "speedBump.newAddress.warning.description": "Du har inte gjort transaktioner med den här adressen tidigare. Se till att det är rätt adress innan du fortsätter.", - "speedBump.newAddress.warning.title": "Ny adress", - "speedBump.smartContractAddress.warning.description": "Du är på väg att skicka tokens till en speciell typ av adress - ett smart kontrakt. Dubbelkolla att det är adressen du tänkt skicka till. Om det är fel kan dina tokens gå förlorade för alltid.", - "speedBump.smartContractAddress.warning.title": "Är detta en plånboksadress?", - "stats.24fees": "24h avgifter", - "stats.24swapVolume": "24H swapvolym", - "stats.24volume": "24H volym", - "stats.allTimeSwappers": "All time swappers", - "stats.allTimeVolume": "Hela tidens volym", - "stats.fdv": "FDV", - "stats.fdv.description": "Fullt utspädd värdering (FDV) beräknar det totala marknadsvärdet förutsatt att alla tokens är i omlopp.", - "stats.marketCap": "Börsvärde", - "stats.marketCap.description": "Börsvärde är det totala marknadsvärdet av en tillgångs cirkulerande utbud.", - "stats.noStatsAvailable": "Ingen statistik tillgänglig", - "stats.tvl": "Totalt värde låst", - "stats.tvl.description": "Totalt värde låst (TVL) är det sammanlagda beloppet av tillgången som är tillgänglig för alla Uniswap-likviditetspooler.", - "stats.volume.1d": "1 dagars volym", - "stats.volume.1d.description": "1 dag volym är beloppet av tillgången som har handlats på Uniswap under de senaste 24 timmarna.", - "stats.volume.1d.long": "1D volym", - "stats.volume.1d.short": "1D vol", - "stats.volume.description": "Volym är summan av tillgången som har handlats på Uniswap under den valda tidsramen.", - "swap.allow.oneTime": "Tillåt {{sym}} (en gång)", - "swap.approveAndSubmit": "Godkänn och skicka in", - "swap.approveAndSwap": "Godkänn och byt", - "swap.balance.amount": "Saldo: {{amount}}", - "swap.bestPrice.through": "Rutt via {{provider}}", - "swap.bestRoute.cost": "Den mest effektiva vägen beräknas kosta ~{{gasPrice}} i nätverkskostnader. ", - "swap.bridging.title": "Byte mellan nätverk", - "swap.bridging.warning.description": "Du byter från {{fromNetwork}} till {{toNetwork}}. Detta är också känt som \"bridging\", som flyttar dina tokens från ett nätverk till ett annat.", - "swap.button.confirmSignAndSwap": "Bekräfta signera och byt", - "swap.button.confirmSwapAnyways": "Bekräfta bytet ändå", - "swap.button.confirmUnwrap": "Bekräfta uppackning", - "swap.button.max": "Max", - "swap.button.review": "Recension", - "swap.button.submitting": "Skickar byte...", - "swap.button.submitting.keep.open": "Håll plånboken öppen...", - "swap.button.submitting.passkey": "Bekräfta med lösenord", - "swap.button.swap": "Byta", - "swap.button.swapAnyways": "Byt ändå", - "swap.button.unwrap": "Packa upp", - "swap.button.wrap": "Slå in", - "swap.buy.countryModal.placeholder": "Sök efter land eller region", - "swap.cancel.cannotExecute_one": "Ditt byte kan köras innan avbokningen behandlas. Dina nätverkskostnader kan inte återbetalas. Vill du fortsätta?", - "swap.cancel.cannotExecute_other": "Dina byten kan köras innan avbokningen behandlas. Dina nätverkskostnader kan inte återbetalas. Vill du fortsätta?", - "swap.confirmApproveAndSwap": "Bekräfta godkännande och byte", - "swap.confirmLimit": "Bekräfta gränsen", - "swap.confirmSwap": "Bekräfta bytet", - "swap.confirmWrap": "Bekräfta omslag", - "swap.deadline.settings.title": "Deadline för byte", - "swap.deadline.settings.title.short": "Tx. tidsfrist", - "swap.details.completed": "Byte slutfört", - "swap.details.estimatedTime": "Uppskattad tid", - "swap.details.fasterUnichainSwaps": "Snabbare swappar drivna av Unichain", - "swap.details.feeOnTransfer": "{{tokenSymbol}} avgift", - "swap.details.feeOnTransfer.symbol": "{{tokenSymbol}} tokenavgift", - "swap.details.instant": "Omedelbar", - "swap.details.newQuote.input": "Ny ingång", - "swap.details.newQuote.output": "Ny utgång", - "swap.details.orderRouting": "Beställningsdirigering", - "swap.details.orderRoutingInfo": "Denna swap dirigeras via Across, ett decentraliserat protokoll som flyttar tillgångar över nätverk samtidigt som säkerhet, snabb utförande och låga priser prioriteras.", - "swap.details.poweredBy": "Drivs av", - "swap.details.rate": "Betygsätta", - "swap.details.slippage": "Max glidning", - "swap.details.slippage.uniswap": "Uniswap-skyddad glidning", - "swap.details.swappedIn.unichain": "Avslutad på {{time}}s på Unichain", - "swap.details.uniswapFee": "Avgift", - "swap.error.default": "Du kan behöva öka din glidtolerans. Notera: avgifts-vid-överföring och rebase-tokens är inkompatibla med Uniswap V3.", - "swap.error.expectedToFail": "Ditt byte förväntas misslyckas.", - "swap.error.fiatInputUnavailable": "{{fiatCurrencyCode}} ingång inte tillgänglig", - "swap.error.modifiedByWallet": "Ditt byte har ändrats via din plånbok. Om detta var ett misstag, vänligen avbryt omedelbart eller riskera att förlora dina pengar.", - "swap.error.rejected": "Transaktionen avvisad", - "swap.error.undefinedObject": "Ett fel uppstod när du försökte utföra detta byte. Du kan behöva öka din glidtolerans. Om det inte fungerar kan det finnas en inkompatibilitet med token du handlar. Notera: avgifts-vid-överföring och rebase-tokens är inkompatibla med Uniswap V3.", - "swap.error.unknown": "Okänt fel.", - "swap.error.v2.expired": "Den här transaktionen kunde inte skickas eftersom tidsfristen har passerat. Kontrollera att din transaktionstid inte är för låg.", - "swap.error.v2.k": "Uniswap-invarianten x*y=k uppfylldes inte av bytet. Detta innebär vanligtvis att en av tokens du byter innehåller anpassat beteende vid överföring.", - "swap.error.v2.slippage": "Denna transaktion kommer inte att lyckas antingen på grund av prisrörelse eller avgift vid överföring. Försök att öka din glidtolerans", - "swap.error.v2.transferInput": "Inmatningstoken kan inte överföras. Det kan vara ett problem med inmatningstoken.", - "swap.error.v2.transferOutput": "Utdatatoken kan inte överföras. Det kan vara ett problem med utdatatoken.", - "swap.error.v3.slippage": "Denna transaktion kommer inte att lyckas på grund av prisrörelser. Försök att öka din glidtolerans. Obs: avgift på överföring och rebase-tokens är inkompatibla med Uniswap V3.", - "swap.error.v3.transferOutput": "Utdatatoken kan inte överföras. Det kan vara ett problem med utdatatoken. Obs: avgift på överföring och rebase-tokens är inkompatibla med Uniswap V3.", - "swap.estimatedDifference.label": "Det kommer att vara en stor skillnad mellan dina in- och utdatavärden på grund av nuvarande likviditet.", - "swap.expected.price": "Förväntat pris", - "swap.fail.batched": "Din anslutna plånbok kanske inte stöder 1-klicksbyten. Försök med ett vanligt byte istället.", - "swap.fail.batched.retry": "Försök med standardbyte", - "swap.fail.batched.title": "1-klicksväxling misslyckades", - "swap.fail.message": "Prova att justera glidningen till ett högre värde.", - "swap.fail.uniswapX": "Byte kunde inte slutföras med UniswapX. Prova ditt byte igen för att dirigera det genom det klassiska Uniswap API.", - "swap.fees.experience": "Denna avgift tillämpas på vissa tokenpar för att säkerställa den bästa upplevelsen med Uniswap. Den betalas i output-token och har redan inkluderats i offerten.", - "swap.fees.jupiter.label": "Jupiter-avgift", - "swap.fees.jupiter.message": "Avgifter på Solana debiteras av Jupiters API. Uniswap Labs tar inte emot dessa avgifter.", - "swap.fees.noFee": "Avgifter tillkommer på utvalda tokenpar för att säkerställa den bästa upplevelsen med Uniswap. Det tillkommer ingen avgift för detta byte.", - "swap.finalizingQuote": "Avslutar offert...", - "swap.form.header": "Byta", - "swap.form.warning.output.fotFees": "På grund av tokenavgiften på {{fotCurrencySymbol}}kan swapbelopp endast anges med inmatningsfältet", - "swap.form.warning.output.fotFees.fallback": "På grund av tokenavgifter kan swapbelopp endast anges med inmatningsfältet", - "swap.form.warning.output.solana": "Exakt utdata stöds inte på Solana", - "swap.form.warning.restore": "Återställ din plånbok för att byta", - "swap.frontrun.warning": "Din transaktion kan vara frontrun och resultera i en ogynnsam handel.", - "swap.header.viewOnly": "Titta enbart", - "swap.impactOfTrade": "Inverkan din handel har på marknadspriset för denna pool.", - "swap.impactOfTrade.uniswapx": "Skillnaden mellan marknadspris och utförandepris, med hänsyn tagen till UniswapX-gasbesparingar.", - "swap.impactOfTrade.uniswapx.missing": "Priseffektberäkningar kan vara otillgängliga för par med låg likviditet.", - "swap.inputEstimated.atMost": "Ingången är uppskattad. Du kommer att sälja högst eller så återgår transaktionen.", - "swap.limit": "Begränsa", - "swap.limitFilled": "Gränsen fylld!", - "swap.limitSubmitted": "Gräns inlämnad", - "swap.marketPrice.outsideRange.label": "Marknadspriset ligger utanför ditt angivna prisintervall. Endast insättning av en enskild tillgång.", - "swap.min.price": "Minimipris", - "swap.networkCost.paidIn": "Nätverkskostnaden betalas i {{sym}} på {{chainName}} -nätverket för att handla.", - "swap.orderRouting": "Beställningsdirigering", - "swap.outputEstimated.atLeast": "Utgången är uppskattad. Du kommer att få minst eller så återgår transaktionen.", - "swap.placeOrder": "Beställa", - "swap.priceImpact": "Prispåverkan", - "swap.request.title.full": "Byt {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "Byt ut tokens", - "swap.review": "Recensionsbyte", - "swap.review.summary": "Du byter", - "swap.reviewLimit": "Granskningsgräns", - "swap.route.optimizedGasCost": "Den här rutten tar hänsyn till delade rutter, flera hopp och nätverkskostnader för varje steg.", - "swap.routing.jupiter.description": "Jupiter aggregerar likviditet från flera källor för att ge dig de bästa priserna.", - "swap.routing.uniswapAutoRouter.description": "Uniswap Auto Router tar hänsyn till optimala rutter och nätverkskostnader för att ge dig de bästa priserna.", - "swap.settings.deadline.tooltip": "Din transaktion kommer att återställas om den väntar längre än denna tidsperiod. (Max: 3 dagar).", - "swap.settings.deadline.warning": "Hög deadline", - "swap.settings.oneClickSwap.title": "1-klicksbyten", - "swap.settings.oneClickSwap.tooltip": "Buntar ihop standardhandelsåtgärder för snabbare och billigare swappar.", - "swap.settings.protection.description": "Med swap-skydd på kommer dina Ethereum-transaktioner att skyddas från sandwichattacker, med minskade chanser att misslyckas.", - "swap.settings.protection.subtitle.supported": "{{chainName}} Nätverk", - "swap.settings.protection.subtitle.unavailable": "Ej tillgängligt på {{chainName}}", - "swap.settings.protection.title": "Bytesskydd", - "swap.settings.routingPreference.option.default.description": "Om du väljer det här alternativet identifieras den mest effektiva rutten för ditt byte.", - "swap.settings.routingPreference.option.default.description.preV4": "Uniswap-klienten väljer det billigaste handelsalternativet med hänsyn till pris och nätverkskostnader.", - "swap.settings.routingPreference.option.default.description.uniswapXUnavailable": "UniswapX är inte tillgängligt för din plånbok", - "swap.settings.routingPreference.option.default.tooltip": "En rutt identifieras med hänsyn till v2, v3 och vissa v4-pooler, med beaktande av uppskattad prispåverkan och nätverkskostnader.", - "swap.settings.routingPreference.option.v2.title": "Aktivera v2-pooler", - "swap.settings.routingPreference.option.v3.title": "Aktivera v3-pooler", - "swap.settings.routingPreference.option.v4.hooks.title": "Aktivera v4-hookpooler", - "swap.settings.routingPreference.option.v4.hooks.tooltip": "V4-krokar dirigerar swappar genom en uppsättning förgodkända krokar.", - "swap.settings.routingPreference.option.v4.title": "Aktivera v4-pooler", - "swap.settings.routingPreference.title": "Handel med alternativ", - "swap.settings.slippage.alert": "Hög glidning", - "swap.settings.slippage.control.auto": "Bil", - "swap.settings.slippage.description": "Din transaktion kommer att återgå om priset ändras mer än glidningsprocenten.", - "swap.settings.slippage.input.message": "Om priset sjunker ytterligare kommer din transaktion att återgå. Nedan är det lägsta belopp som du garanterat får.", - "swap.settings.slippage.input.receive.title": "Ta emot åtminstone", - "swap.settings.slippage.output.message": "Om priset sjunker ytterligare kommer din transaktion att återgå. Nedan är det maximala belopp du skulle behöva spendera.", - "swap.settings.slippage.output.spend.title": "Spendera högst", - "swap.settings.slippage.warning": "Mycket hög glidning", - "swap.settings.slippage.warning.description": "En glidning över 20 % kommer sannolikt att resultera i en ogynnsam handel. Sänk dina inställningar för att minska risken för att vara i framkant.", - "swap.settings.slippage.warning.hover": "Detta kan resultera i en ogynnsam handel. Prova att sänka din glidningsinställning.", - "swap.settings.slippage.warning.max": "Ange ett värde som är mindre än {{maxSlippageTolerance}}", - "swap.settings.slippage.warning.message": "Slirningen kan vara högre än nödvändigt", - "swap.settings.slippage.warning.min": "Ange ett värde som är större än 0", - "swap.settings.title": "Byt inställningar", - "swap.settings.transactionRevertPrice": "Din transaktion kommer att återgå om priset ändras ogynnsamt med mer än denna procentsats.", - "swap.signAndSwap": "Signera och byt", - "swap.slippage.amt": "{{amt}} glidning", - "swap.slippage.bridging": "Ingen glidning när du byter över nätverk", - "swap.slippage.description": "Skillnad mellan förväntat och exekverat pris på en swap. Skillnader kan uppstå på grund av låg likviditet, marknadsvolatilitet eller bottar. \n\nUniswap-skydd skyddar mot frontrunning-bottar och MEV.", - "swap.slippage.settings.title": "Slipage-inställningar", - "swap.slippage.tooltip": "Den maximala prisrörelsen före din transaktion kommer att återgå.", - "swap.slippageBelow.warning": "En glidning under {{amt}} kan resultera i en misslyckad transaktion", - "swap.submitted": "Byte har skickats", - "swap.success": "Byt framgång!", - "swap.tokenOwnFees": "Vissa tokens tar en avgift när de köps eller säljs, vilket bestäms av tokenutgivaren. Uniswap tar inte emot några av dessa avgifter.", - "swap.tradeRoutes": "Handelsvägar", - "swap.transaction.deadline": "Transaktionens deadline", - "swap.transaction.revertAfter": "Din transaktion kommer att återställas om den väntar längre än denna tidsperiod.", - "swap.warning.enterLargerAmount.title": "Ange ett större belopp", - "swap.warning.expectedFailure.increaseSlippage": "Försök att öka din glidning.", - "swap.warning.expectedFailure.titleMay": "Detta byte kan misslyckas", - "swap.warning.insufficientBalance.title": "Du har inte tillräckligt med {{currencySymbol}}", - "swap.warning.insufficientGas.button": "Inte tillräckligt {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "Byt mot {{ tokenSymbol }} på {{networkName}}", - "swap.warning.insufficientGas.button.buy": "Köp {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "Köp med kort", - "swap.warning.insufficientGas.message.withNetwork": "Inte tillräckligt med {{currencySymbol}} på {{networkName}} för att byta", - "swap.warning.insufficientGas.message.withoutNetwork": "Inte tillräckligt med {{currencySymbol}} för att byta", - "swap.warning.insufficientGas.title": "Du har inte tillräckligt med {{currencySymbol}} för att täcka nätverkskostnaden", - "swap.warning.networkFee.allow": "Tillåt {{ inputTokenSymbol }} (en gång)", - "swap.warning.networkFee.delegation.message": "Detta är kostnaden för att behandla din transaktion och aktivera din smarta plånbok på Unichain. Uniswap Labs får ingen andel av dessa avgifter.", - "swap.warning.networkFee.highRelativeToValue": "Nätverkskostnaden överstiger 10 % av ditt totala transaktionsvärde. Detta är kostnaden för att bearbeta din transaktion på blockchain. Uniswap erhåller ingen andel av dessa avgifter.", - "swap.warning.networkFee.highRelativeToValue.unichain": "Nätverkskostnaden överstiger 10 % av ditt totala transaktionsvärde. Detta är kostnaden för att bearbeta din transaktion på blockchain.", - "swap.warning.networkFee.includesDelegation": "Inkluderar aktivering av smart plånbok", - "swap.warning.networkFee.message": "Detta är kostnaden för att bearbeta din transaktion på blockchain. Uniswap erhåller ingen andel av dessa avgifter.", - "swap.warning.networkFee.message.unichain": "Detta är kostnaden för att bearbeta din transaktion på blockchain.", - "swap.warning.networkFee.message.uniswapX": "Detta är kostnaden för att bearbeta din transaktion på blockchain. Uniswap erhåller ingen andel av dessa avgifter. UniswapX samlar likviditetskällor för bättre priser och gasfria swappar.", - "swap.warning.networkFee.message.uniswapX.title": "Inga nätverkskostnader med UniswapX", - "swap.warning.networkFee.message.uniswapX.unichain": "Detta är kostnaden för att bearbeta din transaktion på blockchain. UniswapX samlar likviditetskällor för bättre priser och gasfria swappar.", - "swap.warning.noQuotesFound.bridging.message": "Inga överbryggande offerter hittades. Försök att använda den officiella bryggan just nu.", - "swap.warning.noQuotesFound.title": "Inga citat hittades", - "swap.warning.noRoutesFound.message": "Det finns för närvarande inga rutter tillgängliga för dina valda tokens. Försök med ett annat par eller kolla igen senare.", - "swap.warning.noRoutesFound.title": "Inga rutter tillgängliga", - "swap.warning.offline.message": "Du kan ha tappat internetanslutningen eller så kan nätverket vara nere. Kontrollera din internetanslutning och försök igen.", - "swap.warning.offline.title": "Du är offline", - "swap.warning.priceImpact.message": "På grund av mängden {{outputCurrencySymbol}} tillgänglig likviditet för närvarande, ju mer {{inputCurrencySymbol}} du försöker byta, desto mindre {{outputCurrencySymbol}} får du.", - "swap.warning.priceImpact.message.veryHigh": "Denna transaktion kommer att resultera i en {{priceImpactValue}} prispåverkan på marknadspriset för denna pool och kommer att resultera i en förlust av medel.", - "swap.warning.priceImpact.title": "Hög prispåverkan ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "Mycket hög prispåverkan ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "Din transaktion skickades inte eftersom du stängde appen.", - "swap.warning.queuedOrder.approvalFailed": "Din transaktion skickades inte eftersom tokengodkännande misslyckades.", - "swap.warning.queuedOrder.stale": "Din transaktion skickades inte eftersom du stängde appen eller att godkännandet tog för lång tid.", - "swap.warning.queuedOrder.submissionFailed": "Det uppstod ett problem när din transaktion skulle skickas.", - "swap.warning.queuedOrder.title": "Bytet avbrutet", - "swap.warning.rateLimit.message": "Försök igen om några minuter.", - "swap.warning.rateLimit.title": "Prisgränsen har överskridits", - "swap.warning.router.message": "Du kan ha tappat anslutningen eller så kan nätverket vara nere. Om problemet kvarstår, försök igen senare.", - "swap.warning.router.title": "Denna handel kan inte slutföras just nu", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} är blockerad", - "swap.warning.tokenBlockedFallback.button": "Token är blockerad", - "swap.warning.uniswapFee.message": "Avgifter tillkommer för att säkerställa bästa möjliga upplevelse med Uniswap.", - "swap.warning.uniswapFee.message.default": "Avgifter tillkommer för att säkerställa den bästa upplevelsen med Uniswap. Det tillkommer ingen avgift för detta byte.", - "swap.warning.uniswapFee.message.included": "Avgifter tillkommer för att säkerställa den bästa upplevelsen med Uniswap och har redan tagits med i denna offert.", - "swap.warning.uniswapFee.title": "Bytesavgift", - "swap.warning.viewOnly.message": "Du måste importera den här plånboken via återställningsfras för att byta tokens.", - "swap.wrap.token": "Wrap {{sym}}", - "tdp.balanceSummary.otherNetworks": "På andra nätverk", - "tdp.balanceSummary.otherNetworksBalance": "Balans på andra nätverk", - "tdp.balanceSummary.title": "Din balans", - "tdp.button.getToken": "Få {{ tokenSymbol }}", - "tdp.button.getTokenFallback": "Skaffa token", - "tdp.loading.title.default": "tokendata för ", - "tdp.loading.title.withChain": "tokendata för på {{chainName}}", - "tdp.nameNotFound": "Namnet hittades inte", - "tdp.noInfoAvailable": "Ingen tokeninformation tillgänglig", - "tdp.noTestnetSupportDescription": "Vissa testnät stöder inte att byta, skicka eller köpa tokens.", - "tdp.symbolNotFound": "Symbolen hittades inte", - "testnet.modal.swapDeepLink.description.toProdMode": "Den här åtgärden kräver att testnätläget är inaktiverat. Testnet-läget kan återaktiveras när som helst inom inställningarna.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "Denna åtgärd kräver att testnätläget är aktiverat. Tokens på testnät har inget verkligt värde. Testnet-läget kan inaktiveras när som helst inom inställningarna.", - "testnet.modal.swapDeepLink.title.toProdMode": "Inaktivera testnätläge", - "testnet.modal.swapDeepLink.title.toTestnetMode": "Aktivera testnätläge", - "testnet.unsupported": "Den här funktionen stöds inte i testnätläge.", - "themeToggle.theme": "Tema", - "title.buySellTradeEthereum": "Köp, sälj och byt Ethereum och andra topptokens på Uniswap", - "title.createGovernanceOn": "Skapa ett nytt styrningsförslag på Uniswap", - "title.createGovernanceTo": "Skapa ett nytt styrningsförslag som UNI-innehavarna ska rösta om. UNI-tokens representerar röstandelar i Uniswaps styrning.", - "title.earnFees": "Tjäna avgifter när andra byter på Uniswap genom att lägga till tokens till likviditetspooler.", - "title.easilyRemove": "Ta enkelt bort din likviditet från Uniswap v2 och sätt in i Uniswap v3.", - "title.easilyRemoveV4": "Ta enkelt bort din likviditet från Uniswap v2 och v3 för att sätta in i Uniswap v4.", - "title.extension.uninstall": "Tillägg avinstallerat", - "title.extensionPasskeyLogIn": "Logga in med lösenord", - "title.managePasskeys": "Uniswap | Hantera dina lösenord", - "title.migratev2": "Migrera v2-poollikviditet till Uniswap v3", - "title.migratev3": "Migrera poollikviditet till Uniswap v4", - "title.placeLimit": "Lägg limiterade beställningar på Uniswap", - "title.realTime": "Realtidspriser, diagram, transaktionsdata och mer.", - "title.removeLiquidityv2": "Ta bort poollikviditet (v2) på Uniswap", - "title.removePoolLiquidity": "Ta bort poollikviditet på Uniswap", - "title.removeTokensv2": "Ta bort dina tokens från v2 likviditetspooler.", - "title.removev3Liquidity": "Ta bort dina tokens från v3 likviditetspooler.", - "title.sendCrypto": "Skicka krypto", - "title.sendTokens": "Skicka tokens på Uniswap", - "title.swappingMadeSimple": "Köp och sälj krypto direkt på Ethereum, Base, Arbitrum, Polygon, Unichain och fler. DeFi-plattformen som miljontals människor litar på.", - "title.tradeTokens": "Handla tokens och ge likviditet. Realtidspriser, diagram, transaktionsdata och mer.", - "title.uniswapTradeCrypto": "Uniswap | Handla krypto på DeFis ledande börs ", - "title.uniToken": "UNI-tokens representerar röstberättigade andelar i Uniswaps styrning. Du kan själv rösta på varje förslag eller delegera dina röster till en tredje part.", - "title.voteOnGov": "Rösta om styrningsförslag på Uniswap", - "token.balances.main": "Din balans", - "token.balances.other": "Saldon på andra nätverk", - "token.balances.viewOnly": "{{ownerAddress}}s saldo", - "token.bridge": "{{label}} symbolbro", - "token.chart.candlestick.unavailable": "Ljusstakediagram är inte tillgängliga för denna token", - "token.chart.tooltip": "Avgifter: {{amount}}", - "token.details": "Token detaljer", - "token.error.unknown": "Okänd token", - "token.fee.buy.label": "köpavgift", - "token.fee.label": "avgift", - "token.fee.sell.label": "säljavgift", - "token.links.title": "Länkar", - "token.links.twitter": "Kvittra", - "token.links.website": "Hemsida", - "token.notFound.description": "Vi kan tyvärr inte hitta någon information om denna token. Kontrollera namnet och adressen och försök igen.", - "token.notFound.title": "Token hittades inte", - "token.priceExplorer.error.description": "Något gick fel.", - "token.priceExplorer.error.title": "Det gick inte att ladda prisdiagrammet", - "token.priceExplorer.timeRangeLabel.all": "Hela tiden", - "token.priceExplorer.timeRangeLabel.day": "1D", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 dag", - "token.priceExplorer.timeRangeLabel.hour": "1H", - "token.priceExplorer.timeRangeLabel.month": "1M", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 månad", - "token.priceExplorer.timeRangeLabel.week": "1W", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 vecka", - "token.priceExplorer.timeRangeLabel.year": "1Y", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 år", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} är inte tillgänglig", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} och {{tokenSymbol1}} är inte tillgängliga", - "token.safety.fee.detected": "Tokenavgift upptäckt", - "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs tar inte emot några av dessa avgifter.", - "token.safety.warning.alwaysDoYourResearch": "Gör alltid din research", - "token.safety.warning.blocked.description.default_one": "Du kan inte byta denna token med Uniswap-appen.", - "token.safety.warning.blocked.description.default_other": "Du kan inte byta dessa tokens med Uniswap-appen.", - "token.safety.warning.copyContractAddress.message": "Detta är en kontraktsadress, som fungerar som en unik identifierare för tokens på blockkedjan. Allt krypto du skickar till den här adressen kommer att gå förlorat.", - "token.safety.warning.copyContractAddress.title": "Skicka inte krypto till den här adressen", - "token.safety.warning.dontShowWarningAgain": "Visa mig inte denna varning igen", - "token.safety.warning.dontShowWarningAgainShort": "Visa inte igen", - "token.safety.warning.doYourOwnResearch": "Gör alltid din egen forskning innan du fortsätter.", - "token.safety.warning.feeDescription": "Laddar en när {{action}}", - "token.safety.warning.flaggedAsMalicious": "Flaggat som skadligt", - "token.safety.warning.flaggedAsSuspicious": "Flaggas som misstänkt", - "token.safety.warning.fotHigh.title": "Hög avgift upptäckt", - "token.safety.warning.fotLow.title": "Avgift upptäckt", - "token.safety.warning.fotVeryHigh.title": "Mycket hög avgift upptäckt", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} har flaggats som osäljbar. Att byta denna token kan resultera i att dina pengar går förlorade.", - "token.safety.warning.honeypot.title": "100 % försäljningsavgift upptäckt", - "token.safety.warning.impersonator": "Imiterar en annan token", - "token.safety.warning.impersonator.title": "Imitatortoken har upptäckts", - "token.safety.warning.malicious.general.message": "{{tokenSymbol}} har flaggats som skadlig av Blockaid.", - "token.safety.warning.malicious.impersonator.message": "{{tokenSymbol}} har flaggats av Blockaid för att ha försökt kopiera en annan token. Det kanske inte är token du vill byta.", - "token.safety.warning.malicious.impersonator.message.short": "{{tokenSymbol}} kanske inte är den token du vill byta.", - "token.safety.warning.malicious.title": "Skadlig token har upptäckts", - "token.safety.warning.mayResultInLoss": "Att byta det kan resultera i förlust av pengar.", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} handlas inte på ledande amerikanska centraliserade börser.", - "token.safety.warning.notListedOnExchanges": "Ej noterat på ledande amerikanska börser", - "token.safety.warning.potentialHoneypot.card.message": "{{tokenSymbol}} har flaggats som misstänkt av Blockaid.", - "token.safety.warning.potentialHoneypot.modal.message": "{{tokenSymbol}} har flaggats som en potentiell honungskruka av Blockaid. Gör alltid din egen forskning innan du fortsätter.", - "token.safety.warning.potentialHoneypot.title": "Potentiell honungskruka upptäckt", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} har flaggats som osäljbar.", - "token.safety.warning.sellFee100.title": "100 % försäljningsavgift upptäckt", - "token.safety.warning.spam.message": "{{tokenSymbol}} har flaggats som spam av Blockaid.", - "token.safety.warning.spam.title": "Spam-token har upptäckts", - "token.safety.warning.spamsUsers": "Spam användare", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} tar ut en {{buyFeePercent}} avgift vid köp och {{sellFeePercent}} vid försäljning.", - "token.safety.warning.tokenChargesFee.buy.message": "{{tokenSymbol}} tar ut en {{feePercent}} avgift vid köp.", - "token.safety.warning.tokenChargesFee.buy.message.descriptive": "{{tokenSymbol}} tar ut en avgift på {{feePercent}} vid köp. Byte kan leda till förlust av pengar. Uniswap Labs tar inte emot några av dessa avgifter.", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} tar ut en {{feePercent}} avgift vid försäljning.", - "token.safety.warning.tokenChargesFee.sell.message.descriptive": "{{tokenSymbol}} tar ut en avgift på {{feePercent}} vid försäljning. Byte kan resultera i förlust av pengar. Uniswap Labs erhåller inga av dessa avgifter.", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} tar ut en avgift vid köp eller försäljning.", - "token.safetyLevel.blocked.message": "Du kan inte byta denna token med Uniswap Wallet.", - "token.safetyLevel.medium.message.plural": "Dessa tokens handlas inte på ledande amerikanska centraliserade börser. Gör alltid din egen forskning innan du fortsätter.", - "token.selector.search.error": "Det gick inte att läsa in sökresultat", - "token.stats.fullyDilutedValuation": "Fullt utspädd värdering", - "token.stats.marketCap": "Börsvärde", - "token.stats.priceHighYear": "52W hög", - "token.stats.priceLowYear": "52W låg", - "token.stats.section.about": "Om {{token}}", - "token.stats.title": "Statistik", - "token.stats.translation.original": "Visa original", - "token.stats.translation.translate": "Översätt till {{language}}", - "token.stats.volume": "24h volym", - "token.symbol.input.fallback": "Inmatningstoken", - "token.symbol.output.fallback": "Utdatatoken", - "token.wrap.fail.message": "Byten på Uniswap-protokollet kan börja och sluta med ETH. Men under bytet lindas ETH in i WETH.", - "token.zeroNativeBalance.description.mainnet": "Du måste byta en token på Ethereum för att få {{ tokenSymbol }}. Byte kräver ETH för nätverkskostnader.", - "token.zeroNativeBalance.description.otherChains": "Du måste byta en token på {{ chainName }} för att få {{ tokenSymbol }}. Byte kräver {{ chainName }} {{ nativeTokenSymbol }} för nätverkskostnader.", - "token.zeroNativeBalance.subtitle": "{{ tokenSymbol }} går inte att köpa direkt.", - "token.zeroNativeBalance.title.mainnet": "Du behöver {{ nativeTokenName }}", - "token.zeroNativeBalance.title.otherChains": "Du behöver {{ nativeTokenName }} på {{ chainName }}", - "tokens.action.hide": "Dölj token", - "tokens.action.unhide": "Visa token", - "tokens.nfts.action.viewOnExplorer": "Visa på {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "Det gick inte att ladda NFT-samlingen", - "tokens.nfts.collection.label.items": "Föremål", - "tokens.nfts.collection.label.owners": "Ägare", - "tokens.nfts.collection.label.priceFloor": "Golv", - "tokens.nfts.collection.label.swapVolume": "Volym", - "tokens.nfts.connectEthereumToView": "Anslut en Ethereum-plånbok för att se dina NFT:er", - "tokens.nfts.details.contract.address": "Avtalsadress", - "tokens.nfts.details.error.load.title": "Det gick inte att läsa in NFT-detaljer", - "tokens.nfts.details.network": "Nätverk", - "tokens.nfts.details.owner": "Ägd av", - "tokens.nfts.details.price": "Nuvarande pris", - "tokens.nfts.details.recentPrice": "Sista försäljningspriset", - "tokens.nfts.details.traits": "Egenskaper", - "tokens.nfts.empty.description": "Inga NFT:er hittades", - "tokens.nfts.error.unavailable": "Innehåll inte tillgängligt", - "tokens.nfts.hidden.action.hide": "Dölj NFT", - "tokens.nfts.hidden.action.unhide": "Visa NFT", - "tokens.nfts.link.collection": "Samlingswebbplats", - "tokens.nfts.list.error.load.title": "Det gick inte att ladda NFT:er", - "tokens.nfts.list.none.button": "Ta emot NFT", - "tokens.nfts.list.none.description.default": "Överför NFT:er från en annan plånbok för att komma igång.", - "tokens.nfts.list.none.description.external": "När den här plånboken köper eller tar emot NFT:er visas de här.", - "tokens.nfts.list.none.title": "Inga NFT än", - "tokens.nfts.notAvailableOnSolana": "NFT:er är inte tillgängliga på Solana", - "tokens.selector.button.choose": "Välj token", - "tokens.selector.empty.buy.message": "Köp krypto med ett kort eller bank för att skicka tokens.", - "tokens.selector.empty.buy.title": "Köp krypto", - "tokens.selector.empty.receive.title": "Ta emot tokens", - "tokens.selector.empty.title": "Inga tokens ännu", - "tokens.selector.error.load": "Det gick inte att ladda tokens", - "tokens.selector.search.empty": "Inga resultat hittades för {{searchText}}", - "tokens.selector.search.placeholder": "Sök tokens", - "tokens.selector.section.bridging": "Byt mellan nätverk", - "tokens.selector.section.favorite": "Favoriter", - "tokens.selector.section.otherNetworksSearchResults": "Tokens hittade på andra nätverk", - "tokens.selector.section.otherSearchResults": "Andra tokens på {{network}}", - "tokens.selector.section.recent": "Senaste sökningar", - "tokens.selector.section.search": "Sökresultat", - "tokens.selector.section.trending": "Tokens med 24H volym", - "tokens.selector.section.yours": "Dina tokens", - "tokens.table.search.placeholder.pools": "Sök pooler", - "tokens.table.search.placeholder.tokens": "Sök tokens", - "tokens.table.search.placeholder.transactions": "Sök transaktioner", - "toucan.auction.bidConcentration": "Tukankoncentration", - "toucan.auction.bidConcentration.tooltip.description": "Beskrivning av verktygstips för Toucan", - "toucan.auction.bidConcentration.tooltip.title": "Rubrik för verktygstips för toucan", - "toucan.auctions": "Auktioner", - "toucan.bidForm.maxBudget": "Maxbudget", - "toucan.bidForm.placeBid": "Lägg ditt bud", - "toucan.displayMode.tokenPrice": "Tokenpris", - "toucan.displayMode.valuation": "Värdering", - "transaction.action.cancel.button": "Avbryt transaktionen", - "transaction.action.cancel.description": "Om du avbryter den här transaktionen innan den har behandlats av nätverket, betalar du en ny nätverkskostnad istället för den ursprungliga.", - "transaction.action.cancel.title": "Vill du avbryta den här transaktionen?", - "transaction.action.clear": "Rensa väntar", - "transaction.action.copy": "Kopiera transaktions-ID", - "transaction.action.copyProvider": "Kopiera {{providerName}} transaktions-ID", - "transaction.amount.unlimited": "Obegränsat", - "transaction.callData": "Samtalsdata", - "transaction.details.dappName": "App", - "transaction.details.from": "Från", - "transaction.details.networkFee": "Nätverkskostnad", - "transaction.details.networkFee.swap": "Kostnad för bytesnätverk", - "transaction.details.providerFee": "Leverantörsavgift", - "transaction.details.swapRate": "Betygsätta", - "transaction.details.transaction": "Transaktion", - "transaction.details.uniswapFee": "Avgift ({{ feePercent }}%)", - "transaction.network.all": "Alla nätverk", - "transaction.networkCost.description": "Kostnaden för att behandla din transaktion på blockkedjan. Uniswap är optimerad för minimala nätverkskostnader.", - "transaction.networkCost.includesSmartWalletActivation": "Inkluderar aktivering av smart plånbok", - "transaction.networkCost.label": "Nätverkskostnad", - "transaction.networkCost.maxNativeBalance.description": "En liten del av nätverkstokens saldo är reserverad för att täcka nätverkskostnaden för denna transaktion.", - "transaction.networkCost.maxNativeBalance.title": "Varför kan jag inte använda mitt maxsaldo?", - "transaction.networkCost.veryHigh.label": "Mycket hög nätkostnad", - "transaction.notification.error.cancel": "Det gick inte att avbryta transaktionen", - "transaction.notification.error.replace": "Det går inte att ersätta transaktionen", - "transaction.status.approval.canceled": "Godkännande avbrutet", - "transaction.status.approval.failed": "Godkännandet misslyckades", - "transaction.status.approve.canceled": "Avbröt godkännande", - "transaction.status.approve.canceling": "Avbryter godkännande", - "transaction.status.approve.failed": "Det gick inte att godkänna", - "transaction.status.approve.pending": "Godkännande", - "transaction.status.approve.success": "Godkänd", - "transaction.status.approve.successDapp": "Godkänd den {{externalDappName}}", - "transaction.status.buy.canceled": "Avbrutet köp", - "transaction.status.buy.canceling": "Avbryter köp", - "transaction.status.buy.failed": "Det gick inte att köpa", - "transaction.status.buy.pending": "Uppköp", - "transaction.status.buy.success": "Köpt", - "transaction.status.buy.successDapp": "Köpt på {{externalDappName}}", - "transaction.status.claim.canceled": "Avgiftsuttag avbrutet", - "transaction.status.claim.canceling": "Avbokningsavgiftsindrivning", - "transaction.status.claim.failed": "Avgiftsinsamling misslyckades", - "transaction.status.claim.pending": "Samla in avgifter", - "transaction.status.claim.success": "Insamlade avgifter", - "transaction.status.collect.fees.canceled": "Insamlingsavgifter avbrutna", - "transaction.status.collect.fees.failed": "Det gick inte att samla in avgifter", - "transaction.status.collected.fees": "Insamlade avgifter", - "transaction.status.collecting.fees": "Samla in avgifter", - "transaction.status.confirm.canceled": "Avbruten bekräfta", - "transaction.status.confirm.canceling": "Väntar på avbokning", - "transaction.status.confirm.failed": "Det gick inte att bekräfta", - "transaction.status.confirm.pending": "Transaktion pågår", - "transaction.status.confirm.success": "Transaktionen bekräftad", - "transaction.status.confirm.successDapp": "Transaktionen bekräftad den {{externalDappName}}", - "transaction.status.createPair.canceled": "Avbröt skapande av par", - "transaction.status.createPair.canceling": "Avbryter skapande av par", - "transaction.status.createPair.failed": "Misslyckades med att skapa paret", - "transaction.status.createPair.pending": "Skapar par", - "transaction.status.createPair.success": "Skapat par", - "transaction.status.createPool.canceled": "Avbröt skapande av pool", - "transaction.status.createPool.canceling": "Avbryter skapandet av poolen", - "transaction.status.createPool.failed": "Misslyckades med att skapa poolen", - "transaction.status.createPool.pending": "Skapar pool", - "transaction.status.createPool.success": "Skapade pool", - "transaction.status.liquidityDecrease.canceled": "Borttagning av likviditet avbröts", - "transaction.status.liquidityDecrease.canceling": "Avbryt borttagning av likviditet", - "transaction.status.liquidityDecrease.failed": "Det gick inte att ta bort likviditet", - "transaction.status.liquidityDecrease.pending": "Ta bort likviditet", - "transaction.status.liquidityDecrease.success": "Borttagen likviditet", - "transaction.status.liquidityIncrease.canceled": "Lägg till likviditet avbruten", - "transaction.status.liquidityIncrease.canceling": "Avbryta tillförsel av likviditet", - "transaction.status.liquidityIncrease.failed": "Det gick inte att lägga till likviditet", - "transaction.status.liquidityIncrease.pending": "Tillför likviditet", - "transaction.status.liquidityIncrease.success": "Tillförd likviditet", - "transaction.status.lpIncentivesClaim.canceled": "Avbruten LP-belöningsansökan", - "transaction.status.lpIncentivesClaim.canceling": "Avbryter LP-belöningsanspråk", - "transaction.status.lpIncentivesClaim.failed": "Misslyckades med att hämta LP-belöningar", - "transaction.status.lpIncentivesClaim.pending": "Ansöka om LP-belöningar", - "transaction.status.lpIncentivesClaim.success": "Hämtade LP-belöningar", - "transaction.status.migrateLiquidity.canceled": "Migrering av likviditet avbröts", - "transaction.status.mint.canceled": "Inställd mint", - "transaction.status.mint.canceling": "Avbryter mint", - "transaction.status.mint.failed": "Det gick inte att prägla", - "transaction.status.mint.pending": "Myntning", - "transaction.status.mint.success": "Präglat", - "transaction.status.mint.successDapp": "Präglade den {{externalDappName}}", - "transaction.status.offramp.canceled": "Avfarten avbruten", - "transaction.status.offramp.failed": "Avfarten misslyckades", - "transaction.status.offramp.pending": "Avramping", - "transaction.status.offramp.success": "Utrampad", - "transaction.status.onramp.canceled": "Påfarten avbruten", - "transaction.status.onramp.failed": "Onramp misslyckades", - "transaction.status.onramp.pending": "Påfart", - "transaction.status.onramp.success": "Pårampad", - "transaction.status.permit.approved": "Tillstånd godkänt", - "transaction.status.permit.canceled": "Tillstånd sändning avbrutet", - "transaction.status.permit.failed": "Tillstånd misslyckades", - "transaction.status.purchase.canceled": "Annullerat köp", - "transaction.status.purchase.canceling": "Avbryter köp", - "transaction.status.purchase.failed": "Köpet misslyckades", - "transaction.status.purchase.failedOn": "Det gick inte att köpa på {{serviceProvider}}", - "transaction.status.purchase.pending": "Köp av", - "transaction.status.purchase.pendingOn": "Köper på {{serviceProvider}}", - "transaction.status.purchase.successOn": "Köpt på {{serviceProvider}}", - "transaction.status.receive.canceled": "Avbruten mottagning", - "transaction.status.receive.canceling": "Avbryter mottagning", - "transaction.status.receive.failed": "Mottagning misslyckades", - "transaction.status.receive.failedFrom": "Det gick inte att ta emot från {{serviceProvider}}", - "transaction.status.receive.pending": "Tar emot", - "transaction.status.receive.pendingFrom": "Tar emot från {{serviceProvider}}", - "transaction.status.receive.success": "Mottagen", - "transaction.status.receive.successDapp": "Mottaget den {{externalDappName}}", - "transaction.status.receive.successFrom": "Mottaget från {{serviceProvider}}", - "transaction.status.removeDelegation.canceled": "Ta bort delegering avbröts", - "transaction.status.removeDelegation.failed": "Misslyckades med att ta bort delegeringen", - "transaction.status.removeDelegation.pending": "Tar bort delegering", - "transaction.status.removeDelegation.success": "Borttagen delegering", - "transaction.status.revoke.canceled": "Avbruten återkallelse", - "transaction.status.revoke.canceling": "Avbryter återkalla", - "transaction.status.revoke.failed": "Det gick inte att återkalla", - "transaction.status.revoke.pending": "Återkallar", - "transaction.status.revoke.success": "Återkallad", - "transaction.status.revoke.successDapp": "Återkallades den {{externalDappName}}", - "transaction.status.sale.canceled": "Inställd försäljning", - "transaction.status.sale.canceling": "Avbryter försäljning", - "transaction.status.sale.failedOn": "Försäljningen misslyckades via {{serviceProvider}}", - "transaction.status.sale.pendingCard.msg": "Läs mer om att sälja krypto.", - "transaction.status.sale.pendingCard.title": "Varför pågår min försäljning fortfarande?", - "transaction.status.sale.pendingOn": "Säljer via {{serviceProvider}}", - "transaction.status.sale.successOn": "Säljes via {{serviceProvider}}", - "transaction.status.sell.canceled": "Avbruten försäljning", - "transaction.status.sell.canceling": "Avbryter försäljning", - "transaction.status.sell.failed": "Det gick inte att sälja", - "transaction.status.sell.pending": "Försäljning", - "transaction.status.sell.success": "Såld", - "transaction.status.sell.successDapp": "Såld på {{externalDappName}}", - "transaction.status.send.canceled": "Avbruten sändning", - "transaction.status.send.canceling": "Avbryter sändningen", - "transaction.status.send.failed": "Misslyckades att skicka", - "transaction.status.send.pending": "Sändning", - "transaction.status.send.success": "Skickat", - "transaction.status.send.successDapp": "Skickat den {{externalDappName}}", - "transaction.status.swap.canceled": "Bytet avbrutet", - "transaction.status.swap.canceling": "Avbryter byte", - "transaction.status.swap.expired": "Bytet har löpt ut", - "transaction.status.swap.failed": "Det gick inte att byta", - "transaction.status.swap.insufficientFunds": "Otillräckliga medel", - "transaction.status.swap.pending": "Byte", - "transaction.status.swap.success": "Bytt", - "transaction.status.swap.successDapp": "Byttes på {{externalDappName}}", - "transaction.status.unwrap.canceled": "Avbröt uppackningen", - "transaction.status.unwrap.canceling": "Avbryter uppackning", - "transaction.status.unwrap.failed": "Det gick inte att packa upp", - "transaction.status.unwrap.pending": "Packar upp", - "transaction.status.unwrap.success": "Oinpackad", - "transaction.status.unwrap.successDapp": "Oinpackad på {{externalDappName}}", - "transaction.status.wrap.canceled": "Avbruten inpackning", - "transaction.status.wrap.canceling": "Avbryter omslag", - "transaction.status.wrap.failed": "Det gick inte att linda", - "transaction.status.wrap.pending": "Omslag", - "transaction.status.wrap.success": "Inslagna", - "transaction.status.wrap.successDapp": "Inslagen på {{externalDappName}}", - "transaction.submittedOn": "Inskickad den", - "transaction.summary.liquidity": "{{firstAmountWithSymbol}} och {{secondAmountWithSymbol}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} till {{recipientAddress}}", - "transaction.summary.received.noAmount": "Mottaget från {{name}}", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} från {{senderAddress}}", - "transaction.summary.sent.noAmount": "Skickat till {{name}}", - "transaction.warning.insufficientGas.modal.message": "Du behöver ~{{tokenAmount}} {{tokenSymbol}} () på {{networkName}} för att täcka denna transaktions nätverkskostnad. Byt {{tokenSymbol}} från en annan kedja eller köp med ditt kort för att fortsätta.", - "transaction.warning.insufficientGas.modal.message.noAction": "Du behöver ~{{tokenAmount}} {{tokenSymbol}} () på {{networkName}} för att täcka denna transaktions nätverkskostnad.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount": "Du behöver ~{{tokenAmount}} {{tokenSymbol}} () på {{networkName}} för att täcka denna transaktions nätverkskostnad.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount.noAction": "För att byta mot denna token behöver du mer {{tokenSymbol}} på {{networkName}}.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "Inte tillräckligt {{tokenSymbol}} på {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Inte tillräckligt {{tokenSymbol}}", - "transaction.warning.maxNative.message": "Du är på väg att spendera det mesta av ditt nätverkstokensaldo. Detta kan lämna otillräckliga medel för att täcka framtida nätverkskostnader.", - "transaction.warning.maxNative.title": "Lågt saldo för nätverkstoken", - "transaction.watcher.error.cancel": "Det gick inte att avbryta transaktionen", - "transaction.watcher.error.status": "Fel vid kontroll av transaktionsstatus", - "uniswapX.aggregatesLiquidity": " samlar likviditetskällor för bättre priser och gasfria swappar.", - "uniswapX.cost": "UniswapX tar bort de typiska kostnaderna för att genomföra transaktioner på blockkedjan.", - "uniswapx.description": "UniswapX samlar likviditetskällor för bättre priser och gasfria swappar.", - "uniswapx.description.unsupported": "UniswapX är för närvarande inte tillgängligt eftersom dina smarta plånboksinställningar hanteras av en annan plånboksapp.", - "uniswapx.included": "Inkluderar UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "Läs mer om att byta med UniswapX", - "uniswapx.unavailable.title": "UniswapX är inte tillgängligt", - "uniswapx.v2QuoteFailed": "UniswapX v2 hård offert misslyckades. Försök igen med klassiskt byte.", - "unitags.banner.button.claim": "Gör anspråk nu", - "unitags.banner.subtitle": "Bygg en personlig web3-profil och dela enkelt din adress med vänner.", - "unitags.banner.title.compact": "Gör anspråk på ditt {{unitagDomain}} användarnamn och bygg ut din anpassningsbara profil.", - "unitags.banner.title.full": "Gör anspråk på ditt {{unitagDomain}} användarnamn", - "unitags.choosePhoto.option.cameraRoll": "Välj från kamerarulle", - "unitags.choosePhoto.option.computer": "Ladda upp från datorn", - "unitags.choosePhoto.option.nft": "Välj en NFT", - "unitags.choosePhoto.option.remove": "Ta bort profilbild", - "unitags.claim.available": "Tillgänglig", - "unitags.claim.confirmation.customize": "Anpassa profilen", - "unitags.claim.confirmation.description": "{{unitagAddress}} är redo att skicka och ta emot krypto. Fortsätt att bygga ut din plånbok genom att anpassa din web3-profil.", - "unitags.claim.confirmation.success.long": "Du har det!", - "unitags.claim.confirmation.success.short": "jag fattar!", - "unitags.claim.error.addressLimit": "Du har redan gjort det maximala antalet ändringar av ditt användarnamn för den här adressen", - "unitags.claim.error.avatar": "Det gick inte att ställa in avatar. Försök igen senare.", - "unitags.claim.error.default": "Kunde inte göra anspråk på användarnamn. Försök igen senare.", - "unitags.claim.error.deviceLimit": "Du har nått det maximala antalet användarnamn som kan vara aktiva för den här enheten", - "unitags.claim.error.general": "Det går inte att göra anspråk på användarnamn", - "unitags.claim.error.unavailable": "Detta användarnamn är inte tillgängligt", - "unitags.claim.error.unknown": "Okänt fel", - "unitags.claim.username.default": "ditt namn", - "unitags.delete.confirm.subtitle": "Du är på väg att radera ditt användarnamn och anpassningsbara profildetaljer. Du kommer inte att kunna ta tillbaka den.", - "unitags.delete.confirm.title": "Är du säker?", - "unitags.editProfile.placeholder": "användarnamn", - "unitags.editUsername.confirm.subtitle": "Du håller på att ändra ditt användarnamn. När du har ändrat det kan du aldrig göra anspråk på det igen.", - "unitags.editUsername.confirm.title": "Är du säker?", - "unitags.editUsername.title": "Redigera ditt användarnamn", - "unitags.editUsername.warning.default": "När du har ändrat ditt användarnamn kan du aldrig göra anspråk på det igen. Du kan bara ändra 2 gånger.", - "unitags.editUsername.warning.max": "Du har nått det maximala antalet ändringar av 2 användarnamn.", - "unitags.extension.intro.buttton": "Gör anspråk på ett användarnamn", - "unitags.extension.intro.description": "Säg adjö till 0x-adresser. Användarnamn är läsbara namn som gör det lättare att skicka och ta emot krypto.", - "unitags.extension.intro.title": "Introducerar användarnamn", - "unitags.extension.intro.upsell.customizable": "Anpassningsbara profiler", - "unitags.extension.intro.upsell.ens": "Drivs av ENS underdomäner", - "unitags.extension.intro.upsell.free": "Fritt att göra anspråk på", - "unitags.intro.features.ens": "Drivs av ENS underdomäner", - "unitags.intro.features.free": "Fritt att göra anspråk på", - "unitags.intro.features.profile": "Anpassningsbara profiler", - "unitags.intro.subtitle": "Säg adjö till 0x-adresser. Användarnamn är läsbara namn som gör det lättare att skicka och ta emot krypto.", - "unitags.intro.title": "Introducerar användarnamn", - "unitags.notification.delete.error": "Kunde inte ta bort användarnamn. Försök igen senare.", - "unitags.notification.delete.title": "Användarnamn raderat", - "unitags.notification.profile.error": "Kunde inte uppdatera profilen. Försök igen senare.", - "unitags.notification.profile.title": "Profil uppdaterad", - "unitags.notification.username.error": "Kunde inte ändra användarnamn. Försök igen senare.", - "unitags.notification.username.title": "Användarnamn ändrat", - "unitags.onboarding.claim.subtitle": "Det här är din personliga adress som folk kan skicka krypto till.", - "unitags.onboarding.claim.title.choose": "Skapa ditt användarnamn", - "unitags.onboarding.claim.title.claim": "Gör anspråk på ditt användarnamn", - "unitags.onboarding.info.description": "Användarnamn omvandlar komplexa 0x-adresser till läsbara namn. Genom att göra anspråk på ett {{unitagDomain}} användarnamn kan du enkelt skicka och ta emot krypto och bygga ut en offentlig web3-profil.", - "unitags.onboarding.info.title": "En förenklad adress", - "unitags.onboarding.profile.subtitle": "Ladda upp din egen eller håll dig till din unika Unicon. Du kan alltid ändra detta senare.", - "unitags.onboarding.profile.title": "Välj ett profilfoto", - "unitags.profile.action.delete": "Ta bort användarnamn", - "unitags.profile.action.edit": "Redigera användarnamn", - "unitags.profile.bio.label": "Bio", - "unitags.profile.bio.placeholder": "Skriv en bio för din profil", - "unitags.profile.links.twitter": "Kvittra", - "unitags.username.error.chars": "Användarnamn får bara innehålla bokstäver och siffror", - "unitags.username.error.max": "Användarnamn får inte vara mer än {{number}} tecken", - "unitags.username.error.min": "Användarnamn måste bestå av minst {{number}} tecken", - "unitags.username.error.uppercase": "Användarnamn får bara innehålla gemener och siffror", - "uwulink.error.insufficientTokens": "Inte tillräckligt {{tokenSymbol}} på {{chain}}", - "v2.notAvailable": "Uniswap V2 är inte tillgängligt på detta nätverk.", - "wallet.appSignIn": "Logga in med appen", - "wallet.connectingAgreement": "Genom att ansluta en plånbok godkänner du Uniswap Labs Användarvillkor och samtycker till dess Sekretesspolicy.", - "wallet.connectionFailed.message": "Anslutningsförsöket misslyckades. Försök igen och följ stegen för att ansluta i din plånbok.", - "wallet.mismatch.popup.description": "Vissa funktioner stöds inte av din anslutna plånbok.", - "wallet.mismatch.popup.title": "Begränsat plånboksstöd", - "wallet.other": "Andra plånböcker", - "wallet.scanToConnect": "Skanna QR-koden för att ansluta", - "wallet.wrongNet": "Din plånbok är ansluten till fel nätverk.", - "walletConnect.dapps.empty.description": "Anslut till en app genom att skanna en kod via WalletConnect", - "walletConnect.dapps.manage.empty.title": "Inga appar anslutna", - "walletConnect.dapps.manage.title": "Anslutningar", - "walletConnect.error.connection.message": "Uniswap Wallet stöder för närvarande {{chainNames}}. Använd endast \"{{dappName}}\" på dessa kedjor", - "walletConnect.error.connection.title": "Anslutningsfel", - "walletConnect.error.general.message": "Det uppstod ett problem med WalletConnect. Var god försök igen", - "walletConnect.error.general.title": "WalletConnect-fel", - "walletConnect.error.scantastic.message": "Det uppstod ett problem med din QR-kod. Var god försök igen", - "walletConnect.error.scantastic.title": "Ogiltig QR-kod", - "walletConnect.error.unsupported.message": "Se till att du skannar en giltig WalletConnect-, Ethereum-adress eller Uniswap Extension QR-kod innan du försöker igen.", - "walletConnect.error.unsupported.title": "Ogiltig QR-kod", - "walletConnect.error.unsupportedV1.message": "WalletConnect v1 stöds inte längre. Appen du försöker ansluta till måste uppgraderas till WalletConnect v2.", - "walletConnect.error.unsupportedV1.title": "Ogiltig QR-kod", - "walletConnect.error.uwu.scan": "Det uppstod ett problem med att skanna den här QR-koden.", - "walletConnect.error.uwu.title": "UwU länkfel", - "walletConnect.error.uwu.unsupported": "Denna QR-kod stöds inte.", - "walletConnect.pending.button.connect": "Ansluta", - "walletConnect.pending.button.reject": "Avvisa", - "walletConnect.pending.button.scrollDown": "Rulla ned för att ansluta", - "walletConnect.pending.threat.confirmationText": "Jag förstår riskerna", - "walletConnect.pending.threat.description": "Att signera meddelanden eller transaktioner från den här appen kan leda till förlust av pengar.", - "walletConnect.pending.threat.title": "Skadlig app upptäckt", - "walletConnect.pending.title": "Anslut till {{dappName}}", - "walletConnect.pending.unverified.description": "Se till att du litar på den här webbplatsen innan du fortsätter. ", - "walletConnect.pending.unverified.title": "Overifierad app", - "walletConnect.permissions.option.requestApprovals": "Begär godkännande av transaktioner", - "walletConnect.permissions.option.transferAssets": "Move funds without permission", - "walletConnect.permissions.option.viewTokenBalances": "View your balance and activity", - "walletConnect.permissions.title": "App permissions", - "walletConnect.request.bundledTransactions.label_one": "En paketerad transaktion", - "walletConnect.request.bundledTransactions.label_other": "{{count}} kombinerade transaktioner", - "walletConnect.request.button.scrollDown": "Scrolla ner för att signera", - "walletConnect.request.button.sign": "Skylt", - "walletConnect.request.details.label.function": "Fungera", - "walletConnect.request.details.label.sending": "Sändning", - "walletConnect.request.details.label.token": "Tecken", - "walletConnect.request.details.label.tokens": "Polletter", - "walletConnect.request.error.insufficientFunds": "Du har inte tillräckligt med {{currencySymbol}} för att slutföra den här transaktionen.", - "walletConnect.request.error.network": "Internet- eller nätverksanslutningsfel", - "walletConnect.request.warning.batch.message": "Var försiktig: denna begäran innehåller flera transaktioner och kan överföra tillgångar", - "walletConnect.request.warning.general.message": "Var försiktig: det här meddelandet kan överföra tillgångar", - "walletConnect.request.warning.message": "För att signera meddelanden eller transaktioner måste du importera plånbokens återställningsfras.", - "walletConnect.request.warning.title": "Den här plånboken är i visningsläge", - "web.explore.description": "Upptäck och undersök tokens på {{network}}. Utforska topppooler. Se realtidspriser, handelsvolym, TVL, diagram och transaktionsdata.", - "web.explore.title.pools": "Utforska de bästa poolerna på {{network}} på Uniswap", - "web.explore.title.tokens": "Utforska de bästa tokens på {{network}} på Uniswap", - "web.explore.title.transactions": "Utforska de bästa transaktionerna på {{network}} på Uniswap" -} diff --git a/packages/uniswap/src/i18n/locales/translations/sw-TZ.json b/packages/uniswap/src/i18n/locales/translations/sw-TZ.json deleted file mode 100644 index 7e2958541b6..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/sw-TZ.json +++ /dev/null @@ -1,2563 +0,0 @@ -{ - "account.authHeader.claimReward": "Dai {{amount}} zawadi", - "account.cloud.backup.subtitle": "Kuna misemo mingi ya urejeshi iliyochelezwa kwa yako {{cloudProviderName}}.", - "account.cloud.backup.title": "Chagua nakala ya kurejesha", - "account.cloud.button.restore.android": "Rejesha kutoka Hifadhi ya Google", - "account.cloud.button.restore.ios": "Rejesha kutoka iCloud", - "account.cloud.empty.description": "Inaonekana hujaweka nakala rudufu za vifungu vyako vyovyote vya urejeshi {{cloudProviderName}}.", - "account.cloud.empty.title": "nakala 0 zimepatikana", - "account.cloud.error.backup.message": "Imeshindwa kuleta nakala rudufu kwa sababu ya ukosefu wa ruhusa, kukatizwa kwa uidhinishaji, au kwa sababu ya hitilafu ya wingu", - "account.cloud.error.backup.title": "Hitilafu wakati wa kuleta nakala rudufu", - "account.cloud.error.password.title": "Nenosiri batili. Tafadhali jaribu tena.", - "account.cloud.error.unavailable.button.cancel": "Sio kwa sasa", - "account.cloud.error.unavailable.button.settings": "Nenda kwa mipangilio", - "account.cloud.error.unavailable.message.android": "Tafadhali thibitisha kuwa umeingia kwenye akaunti ya Google huku Hifadhi ya Google ikiwa imewashwa kwenye kifaa hiki na ujaribu tena.", - "account.cloud.error.unavailable.message.ios": "Tafadhali thibitisha kuwa umeingia kwenye Kitambulisho cha Apple ambacho iCloud Drive imewashwa kwenye kifaa hiki na ujaribu tena.", - "account.cloud.error.unavailable.title.android": "Hifadhi ya Google haipatikani", - "account.cloud.error.unavailable.title.ios": "Hifadhi ya iCloud haipatikani", - "account.cloud.loading.title": "Inatafuta hifadhi rudufu...", - "account.cloud.lockout.time.hours_one": "Majaribio mengi sana. Jaribu tena baada ya saa 1.", - "account.cloud.lockout.time.hours_other": "Majaribio mengi sana. Jaribu tena baada ya masaa {{count}} .", - "account.cloud.lockout.time.minutes_one": "Majaribio mengi sana. Jaribu tena baada ya dakika 1.", - "account.cloud.lockout.time.minutes_other": "Majaribio mengi sana. Jaribu tena baada ya dakika {{count}} .", - "account.cloud.password.input": "Weka nenosiri", - "account.cloud.password.recoveryPhrase": "Weka maneno yako ya kurejesha akaunti badala yake", - "account.cloud.password.subtitle": "Nenosiri hili linahitajika ili kurejesha hifadhi rudufu ya maneno yako kutoka {{cloudProviderName}}.", - "account.cloud.password.title": "Weka nenosiri mbadala", - "account.downloadWallet.subtitle": "Back up your wallet, trade on the go, get live price alerts, and more.", - "account.drawer.gitHash": "Git hash: ", - "account.drawer.gitVersion": "Toleo: ", - "account.drawer.modal.body": "Hifadhi na ubadilishane tokeni kwa usalama ukitumia programu ya Uniswap. Inapatikana kwenye iOS na Android.", - "account.drawer.modal.dont": "Je, huna pochi ya Uniswap?", - "account.drawer.modal.scan": "Changanua kwa Uniswap Wallet", - "account.drawer.spamToggle": "Ficha tokeni zisizojulikana na NFTs", - "account.passkey.delete.acknowledge": "I’ve backed up my recovery phrase and understand that Uniswap Labs can’t help me recover my wallet if I failed to do so.", - "account.passkey.delete.description": "Make sure you’ve backed up your recovery phrase using the Uniswap mobile app or browser extension.", - "account.passkey.delete.descriptionEmphasized": "Without your recovery phrase, you may be unable to access your wallet.", - "account.passkey.delete.speedbump.description": "Before continuing, complete the following steps to avoid losing access to your wallet and all funds.", - "account.passkey.delete.speedbump.step1": "Download the Uniswap mobile app or browser extension", - "account.passkey.delete.speedbump.step2": "Back up your recovery phrase", - "account.passkey.delete.speedbump.title": "Una uhakika?", - "account.passkey.delete.title": "Delete passkey?", - "account.passkey.log.in.title": "Log in with passkey", - "account.passkey.type.crossplatform": "Phone, tablet, or security key", - "account.passkey.type.platform": "Browser or operating system", - "account.passkey.verify.button": "Verify with passkey", - "account.passkey.verify.description": "Before you continue, please use your passkey to verify your identity. This helps keep your account secure.", - "account.passkey.verify.title": "First, let’s verify it’s you", - "account.portfolio.activity.canceledBelow": "Agizo hili lilighairiwa kwa sababu salio lako lilipungua kiasi cha ingizo.", - "account.portfolio.activity.signLimit": "Agizo hili halitajaza kwa sababu salio lako lilipungua kiasi cha ingizo. Ongeza salio lako ili kurekebisha.", - "account.recoveryPhrase.education.part1": "Kishazi cha kurejesha (au fungu la maneno) ni seti ya maneno inayohitajika kufikia pochi yako, kama nenosiri.", - "account.recoveryPhrase.education.part2": "Unaweza kuingiza kifungu chako cha urejeshi kwenye kifaa kipya ili kurejesha pochi yako na yaliyomo.", - "account.recoveryPhrase.education.part3": "Lakini, ikiwa utapoteza maneno yako ya kurejesha akaunti, utapoteza ufikiaji kwenye pochi yako.", - "account.recoveryPhrase.education.part4": "Badala ya kukariri kifungu chako cha urejeshi, unaweza kukihifadhi hadi {{cloudProviderName}} na kukilinda kwa nenosiri.", - "account.recoveryPhrase.education.part5": "Unaweza pia kuweka nakala ya maneno yako ya urejeshi kwa kuyaandika na kuyahifadhi mahali salama.", - "account.recoveryPhrase.education.part6": "Tunapendekeza utumie aina zote mbili za hifadhi rudufu, kwa sababu ukipoteza maneno yako ya kurejesha akaunti, hutaweza kurejesha pochi yako.", - "account.recoveryPhrase.error.invalid": "Kishazi batili", - "account.recoveryPhrase.error.invalidWord": "Neno batili: {{word}}", - "account.recoveryPhrase.error.phraseLength": "Kishazi cha urejeshaji lazima kiwe na maneno 12-24", - "account.recoveryPhrase.error.wordIsAddress": "You’ve entered an address, not a recovery phrase", - "account.recoveryPhrase.error.wrong": "Maneno ya kurejesha makosa", - "account.recoveryPhrase.helpText.import": "Je, nitapataje kifungu changu cha urejeshi?", - "account.recoveryPhrase.helpText.restoring": "Jaribu kutafuta tena", - "account.recoveryPhrase.input": "Andika maneno yako ya kurejesha akaunti", - "account.recoveryPhrase.remove.final.description": "Hakikisha kuwa umeandika kifungu chako cha maneno cha urejeshaji au umeihifadhi kwenye {{cloudProviderName}}. Hutaweza kufikia pesa zako vinginevyo.", - "account.recoveryPhrase.remove.final.title": "Unaondoa kishazi chako cha ahueni", - "account.recoveryPhrase.remove.import.description": "Unaweza tu kuhifadhi kifungu kimoja cha urejeshi kwa wakati mmoja. Ili kuendelea kuleta jipya, utahitaji kuondoa maneno yako ya sasa ya urejeshi na pochi zozote zinazohusiana kwenye kifaa hiki.", - "account.recoveryPhrase.remove.initial.description": "Hii itaondoa pochi yako kutoka kwa kifaa hiki pamoja na maneno yako ya kurejesha akaunti.", - "account.recoveryPhrase.remove.initial.title": "Unaondoa {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "Your recovery phrase will remain stored until you delete all remaining wallets.", - "account.recoveryPhrase.subtitle.import": "Maneno yako ya kurejesha akaunti yatahifadhiwa kwenye kifaa chako pekee.", - "account.recoveryPhrase.subtitle.restoring": "Ingiza kifungu chako cha maneno cha urejeshi hapa chini, au jaribu kutafuta hifadhi rudufu tena.", - "account.recoveryPhrase.title.import": "Weka maneno yako ya kurejesha akaunti", - "account.recoveryPhrase.title.restoring": "Hakuna chelezo zilizopatikana", - "account.wallet.action.copy": "Copy address", - "account.wallet.action.manageConnections": "Manage Connections", - "account.wallet.action.report": "Ripoti wasifu", - "account.wallet.action.viewExplorer": "Tazama kwenye {{blockExplorerName}}", - "account.wallet.button.add": "Ongeza mkoba", - "account.wallet.button.addViewOnly": "Ongeza pochi ya kutazama tu", - "account.wallet.button.create": "Unda mkoba mpya", - "account.wallet.button.import": "Ingiza pochi mpya", - "account.wallet.button.manage": "Mipangilio ya Wallet", - "account.wallet.button.remove": "Ondoa mkoba", - "account.wallet.button.watch": "Tazama pochi", - "account.wallet.create.placeholder": "Akaunti ya {{index}}", - "account.wallet.edit.label.input.placeholder": "Lebo ya Wallet", - "account.wallet.header.button.disabled.title": "Hariri wasifu", - "account.wallet.header.button.title": "Badilisha lebo", - "account.wallet.header.viewOnly": "Pochi za kutazama tu", - "account.wallet.menu.claimUsername": "Claim username", - "account.wallet.menu.copy.title": "Nakili anwani ya mkoba", - "account.wallet.menu.edit.title": "Badilisha lebo", - "account.wallet.menu.manageConnections": "Dhibiti miunganisho", - "account.wallet.menu.remove.title": "Ondoa mkoba", - "account.wallet.remove.check": "Nilihifadhi nakala ya maneno yangu ya urejeshi na kuelewa kwamba Uniswap Labs haiwezi kunisaidia kurejesha pochi zangu ikiwa ningekosa kufanya hivyo.", - "account.wallet.remove.title": "Ondoa {{name}}", - "account.wallet.remove.viewOnly": "Unaweza kuongeza pochi za kuangalia tu nyuma kwa kuweka anwani ya pochi.", - "account.wallet.restore.new_device.description": "Because you’re on a new device, you’ll need to restore your recovery phrase or enter your cloud backup password to continue.", - "account.wallet.restore.new_device.title": "Recover your wallet", - "account.wallet.restore.seed_phrase.description": "Your recovery phrase is missing from your device. To ensure you’ll never lose access to your funds, we’ll need you to restore your wallet.", - "account.wallet.restore.seed_phrase.title": "Restore your wallet", - "account.wallet.select.error": "Haikuweza kupakia anwani", - "account.wallet.select.loading.subtitle": "Pochi zako zitaonekana hapa chini.", - "account.wallet.select.loading.title": "Inatafuta pochi", - "account.wallet.select.smartWalletDisclaimer": "By default, all eligible wallets will use smart wallet features once imported. What’s a smart wallet?", - "account.wallet.select.title_one_one": "Pochi moja imepatikana", - "account.wallet.select.title_one_other": "Chagua pochi za kuingiza", - "account.wallet.viewOnly.button": "Ingiza pochi", - "account.wallet.viewOnly.description": "Ili kubadilishana, kununua, kutuma na kupokea tokeni, unahitaji kuleta kifungu cha urejeshaji cha pochi hii.", - "account.wallet.viewOnly.title": "Mkoba huu ni wa kutazama tu", - "account.wallet.watch.error.alreadyImported": "Anwani hii tayari imeingizwa", - "account.wallet.watch.error.notFound": "Anwani haijapatikana", - "account.wallet.watch.error.smartContract": "Anwani ni mkataba mzuri", - "account.wallet.watch.message": "Kuongeza pochi ya kutazama pekee hukuruhusu kujaribu programu au kufuatilia pochi. Hutaweza kubadilisha au kutuma pesa.", - "account.wallet.watch.placeholder": "ENS au anwani", - "account.wallet.watch.title": "Weka anwani ya mkoba", - "activity.pending": "{{pendingActivityCount}} Inasubiri", - "activity.transaction.lpRewards.descriptor": "{{symbol}} rewards collected", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} hadi {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} kwa {{amountWithSymbolB}}", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} na {{amountWithSymbolB}}", - "addLiquidity.shareOfPool": "Sehemu ya bwawa", - "addressInput.recipient": "Mpokeaji", - "analytics.allow": "Ruhusu uchanganuzi", - "analytics.allow.message": "Tunatumia data isiyojulikana ili kuboresha matumizi yako na bidhaa za Uniswap Labs.", - "appRating.button.notReally": "Si kweli", - "appRating.description": "Tujulishe ikiwa una uzoefu mzuri na programu hii", - "appRating.extension.review.description": "Pick a star rating and leave a review on the Chrome Web Store.", - "appRating.extension.review.title": "Review Uniswap Extension?", - "appRating.extension.title": "Enjoying Uniswap Extension?", - "appRating.feedback.button.send": "Tuma maoni", - "appRating.feedback.description": "Tufahamishe jinsi tunavyoweza kuboresha matumizi yako", - "appRating.feedback.title": "Tunasikitika kusikia hivyo.", - "appRating.mobile.title": "Je, unafurahia Uniswap Wallet?", - "bridgedAsset.modal.button": "Continue to swap", - "bridgedAsset.modal.description": "This is a {{chainName}} version of {{currencySymbol}} that is backed by and maintains the same price as native {{currencySymbol}}.", - "bridgedAsset.modal.feature.securelyBacked": "Securely backed", - "bridgedAsset.modal.feature.securelyBacked.description": "1:1 backed by native {{currencySymbol}}.", - "bridgedAsset.modal.feature.tradeSeamlessly": "Trade seamlessly", - "bridgedAsset.modal.feature.tradeSeamlessly.description": "Buy and sell {{currencySymbol}} without leaving Uniswap.", - "bridgedAsset.modal.feature.withdrawToNativeChain": "Withdraw to {{nativeChainName}}", - "bridgedAsset.modal.feature.withdrawToNativeChain.description": "Bridge back to the native network anytime.", - "bridgedAsset.modal.title": "Trade {{currencySymbol}} on {{chainName}}", - "bridgedAsset.send.warning.description": "You’re sending a wrapped version of {{currencySymbol}} on {{chainName}}. Sending it to a centralized exchange will result in a permanent loss of funds.", - "bridgedAsset.send.warning.title": "Make sure you’re sending to a compatible address", - "bridgedAsset.tdp.description": "This is a bridged version of {{currencySymbol}} that is 1:1 backed by native {{currencySymbol}}.", - "bridgedAsset.wormhole.button": "Continue to Wormhole", - "bridgedAsset.wormhole.description": "Continue to the Wormhole portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", - "bridgedAsset.wormhole.title": "Withdraw {{currencySymbol}} to {{nativeChainName}}", - "bridgedAsset.wormhole.toNativeChain": "to {{nativeChainName}}", - "bridgedAsset.wormhole.withdrawToNativeChain": "Withdraw to {{nativeChainName}}", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}dk {{seconds}}s", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}dk", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", - "chart.candlestick": "Kinara", - "chart.error.pools": "Haiwezi kuonyesha data ya kihistoria ya bwawa la sasa.", - "chart.error.tokens": "Haiwezi kuonyesha data ya kihistoria kwa tokeni ya sasa.", - "chart.line": "Chati ya mstari", - "chart.missingData": "Data ya chati haipo", - "chart.price.label.close": "Funga", - "chart.price.label.high": "Juu", - "chart.price.label.low": "Chini", - "chart.price.label.open": "Fungua", - "chart.settings.unavailable.label": "Mpangilio huu haupatikani kwa chati ya sasa", - "claim.thanks": "Asante kwa kuwa sehemu ya jumuiya ya Uniswap ", - "claim.uni.arrived": "UNI imefika", - "common.about": "Kuhusu", - "common.accept": "Kubali", - "common.active": "Inayotumika", - "common.activeNetworks": "Active networks", - "common.activity": "Shughuli", - "common.add.label": "Ongeza", - "common.add.liquidity.canceled": "Add liquidity canceled", - "common.addLiquidity": "Ongeza ukwasi", - "common.address": "Address", - "common.addressOrENS": "Anwani ya Wallet au jina la ENS", - "common.advanced": "Tayari", - "common.all": "Zote", - "common.allTime": "Muda wote", - "common.and": "na", - "common.app": "Programu", - "common.approved": "Imeidhinishwa", - "common.approvePending": "Idhini inasubiri...", - "common.approvePermitTx": "Approve request {{indexText}}", - "common.approvePermitTx.active": "Approve request{{indexText}} in wallet", - "common.approvePermitTx.explainer": "What are Permit2 approvals?", - "common.approvePermitTx.pending": "Approving request {{indexText}}...", - "common.approveSpend": "Idhinisha {{symbol}} matumizi", - "common.approving": "Kuidhinisha", - "common.approximatelyValue": "~{{value}}", - "common.areYouSure": "Una uhakika?", - "common.automatic": "Otomatiki", - "common.availableIn": "Uniswap inapatikana katika: ", - "common.availableOnIOSAndroidChrome": "Inapatikana kwenye iOS, Android, na Chrome", - "common.backToPositions": "Rudi kwenye nafasi", - "common.bestRoute": "Route", - "common.bestRoute.with": "Route via {{provider}}", - "common.biometrics.generic": "Biometriska", - "common.biometrics.touchId": "Touch ID", - "common.biometrics.windowsHello": "Windows Hello", - "common.blocked.ifError": "Ikiwa unaamini kuwa hili ni kosa, tafadhali tuma barua pepe ikijumuisha anwani yako kwa ", - "common.blocked.reason": "Anwani hii imezuiwa kwenye kiolesura cha Uniswap Labs kwa sababu inahusishwa na shughuli moja au zaidi iliyozuiwa.", - "common.blockedAddress": "Anwani iliyozuiwa", - "common.blog": "Blogu", - "common.bought": "Imenunuliwa", - "common.brandAssets": "Mali ya chapa", - "common.button.accept": "Kubali", - "common.button.back": "Nyuma", - "common.button.buy": "Nunua", - "common.button.cancel": "Ghairi", - "common.button.checkin": "Ingia", - "common.button.close": "Funga", - "common.button.confirm": "Thibitisha", - "common.button.connect": "Unganisha", - "common.button.continue": "Endelea", - "common.button.copied": "Imenakiliwa", - "common.button.copy": "Nakili", - "common.button.create": "Unda", - "common.button.delete": "Futa", - "common.button.disable": "Disable", - "common.button.disabling": "Disabling", - "common.button.disconnect": "Tenganisha", - "common.button.dismiss": "Ondoa", - "common.button.done": "Imekamilika", - "common.button.edit": "Hariri", - "common.button.enable": "Wezesha", - "common.button.finish": "Maliza", - "common.button.goBack": "Rudi nyuma", - "common.button.later": "Labda baadae", - "common.button.learn": "Jifunze zaidi", - "common.button.next": "Inayofuata", - "common.button.notNow": "Sio kwa sasa", - "common.button.ok": "sawa", - "common.button.paste": "Bandika", - "common.button.pay": "Lipa", - "common.button.proceed": "Endelea", - "common.button.receive": "Pokea", - "common.button.remove": "Ondoa", - "common.button.reset": "Weka upya", - "common.button.retry": "Jaribu tena", - "common.button.reveal": "Fichua", - "common.button.review": "Kagua", - "common.button.save": "Hifadhi", - "common.button.scrollDown": "Shuka chini", - "common.button.sell": "Uza", - "common.button.send": "Tuma", - "common.button.setup": "Sanidi", - "common.button.share": "Shiriki", - "common.button.showLess": "Onyesha kidogo", - "common.button.showMore": "Onyesha zaidi", - "common.button.sign": "Ishara", - "common.button.skip": "Ruka", - "common.button.swap": "Badili", - "common.button.tryAgain": "Jaribu tena", - "common.button.understand": "Naelewa", - "common.button.unlock": "Fungua", - "common.button.view": "Tazama", - "common.button.viewDetails": "View details", - "common.button.yes": "Ndiyo", - "common.buy.label": "Nunua", - "common.buyAndSell": "Nunua na uuze kwenye Uniswap", - "common.cancellationSubmitted": "Ughairi umewasilishwa", - "common.cancellationSuccessful": "Imeghairiwa", - "common.cancelOrder": "Ghairi agizo", - "common.card.error.description": "Hitilafu fulani imetokea", - "common.card.error.title": "Lo! Hitilafu fulani imetokea.", - "common.careers": "Ajira", - "common.chain.networkCost": "{{chain}} network cost", - "common.chart": "Chart", - "common.checkNetwork": "Angalia hali ya mtandao hapa.", - "common.chromeExtension": "Ugani", - "common.claim.failed": "Dai limeshindwa", - "common.claimed": "Alidai", - "common.claiming": "Kudai", - "common.claimUnis": "Dai tokeni zako za UNI", - "common.clear": "Clear", - "common.close": "Funga", - "common.closed": "Imefungwa", - "common.collect.button": "Kusanya", - "common.company": "Kampuni", - "common.confirm": "Thibitisha", - "common.confirmCancellation": "Thibitisha kughairi", - "common.confirmed": "Confirmed", - "common.confirmSend.button": "Thibitisha kutuma", - "common.confirmSwap": "Thibitisha kubadilishana kwa pochi", - "common.confirmTimedOut": "Muda wa uthibitishaji umekwisha. Tafadhali jaribu tena.", - "common.confirmTransfer": "Confirm transfer", - "common.confirmWallet": "Thibitisha kwenye mkoba", - "common.connect.button": "Unganisha", - "common.connectAWallet.button": "Unganisha mkoba", - "common.connectAWallet.button.evm": "Connect Ethereum wallet", - "common.connectAWallet.button.evm.switch": "Switch Ethereum wallet", - "common.connectAWallet.button.svm": "Connect Solana wallet", - "common.connectAWallet.button.svm.switch": "Switch Solana wallet", - "common.connectAWallet.button.switch": "Switch wallet", - "common.connectTo": "Connect to {{platform}}", - "common.connectWallet.button": "Unganisha mkoba", - "common.contactUs.button": "Wasiliana nasi", - "common.copied": "Imenakiliwa", - "common.copy.address": "Copy address", - "common.copy.poolId": "Copy pool ID", - "common.copyLink.button": "Nakili kiungo", - "common.created.date": "Created {{date}}", - "common.currency": "Sarafu", - "common.currentPrice": "Bei ya sasa", - "common.custom": "Desturi", - "common.customRange": "Anuwai maalum", - "common.dataOutdated": "Data inaweza kuwa ya zamani", - "common.day": "siku", - "common.default": "Chaguomsingi", - "common.defaultTradeOptions": "Chaguo-msingi za biashara", - "common.deposit.toNetwork": "Weka tokeni kwenye mtandao wa {{label}} .", - "common.depositing": "Kuweka amana", - "common.depositTokens": "Weka amana tokeni", - "common.detected": "Imegunduliwa", - "common.developers": "Watengenezaji", - "common.device": "This device", - "common.device.other": "Other device", - "common.dismiss": "Ondoa", - "common.docs": "Docs", - "common.donate": "Donate", - "common.done": "Imekamilika", - "common.dontShowAgain": "Usionyeshe tena", - "common.download": "Pakua", - "common.downloadAppStore": "Pakua kwenye Duka la Programu", - "common.downloadPlayStore": "Pakua kwenye Duka la Michezo", - "common.downloadUniswapApp": "Pakua programu ya Uniswap", - "common.downloadUniswapWallet": "Download Uniswap Wallet", - "common.dynamic": "Dynamic", - "common.edit.button": "Hariri", - "common.ended": "Ended", - "common.error.details": "Error details", - "common.error.general": "Hitilafu fulani imetokea", - "common.error.label": "Hitilafu", - "common.error.request": "Samahani, hitilafu ilitokea wakati wa kuchakata ombi lako. Ukiomba usaidizi, hakikisha unakili maelezo ya hitilafu hii.", - "common.error.somethingWrong": "Hitilafu fulani imetokea!", - "common.errorConnecting.error": "Hitilafu ya Muunganisho", - "common.errorLoadingData.error": "Hitilafu katika kupakia data", - "common.etherscan": "Etherscan", - "common.expiry": "Muda wake unaisha", - "common.explore": "Chunguza", - "common.explorer": "Mchunguzi", - "common.exploreTokens": "Chunguza tokeni", - "common.extension": "Kiendelezi cha Uniswap", - "common.failedSwitchNetwork": "Imeshindwa kubadilisha mitandao", - "common.fee": "Ada", - "common.fees": "Ada", - "common.feesEarned": "Fees earned", - "common.feesEarnedPerBase": "{{symbolA}} kwa {{symbolB}}", - "common.for": "Kwa", - "common.free": "Free", - "common.fullRange": "Masafa kamili", - "common.getApp": "Pata programu", - "common.getHelp.button": "Pata msaada", - "common.getStarted": "Anza", - "common.getSupport.button": "Pata usaidizi", - "common.getTheApp": "Pata programu", - "common.getUniswapWallet": "Pata Mkoba wa Uniswap", - "common.getUniswapWallet.mobile": "Get the Uniswap mobile app", - "common.governance": "Utawala", - "common.happyHolidays": "Likizo njema kutoka kwa timu ya Uniswap!", - "common.help": "Help", - "common.helpCenter": "Kituo cha usaidizi", - "common.hidden": "Imefichwa", - "common.hide.button": "Ficha", - "common.highPrice": "Bei ya juu", - "common.includes": "Inajumuisha", - "common.info.label": "Habari", - "common.input.noRecipient.error": "Chagua mpokeaji", - "common.input.password.confirm": "Thibitisha nenosiri", - "common.input.password.error.mismatch": "Manenosiri hayalingani", - "common.input.password.error.weak": "Nenosiri hili ni dhaifu sana", - "common.input.password.new": "Nenosiri mpya", - "common.input.password.placeholder": "Nenosiri", - "common.input.password.strength.medium": "Kati", - "common.input.password.strength.strong": "Nguvu", - "common.input.password.strength.weak": "Dhaifu", - "common.input.search": "Tafuta", - "common.insufficient.funds": "Hela hazitoshi", - "common.insufficientBalance.error": "Usawa usiotosha", - "common.insufficientFundsForNetworkFee.error": "Pesa haitoshi kulipia gharama ya mtandao", - "common.insufficientTokenBalance.error": "Haitoshi {{tokenSymbol}} salio", - "common.insufficientTokenBalance.error.simple": "Haitoshi {{tokenSymbol}}", - "common.invalidPair": "Jozi batili", - "common.invalidRecipient.error": "Mpokeaji batili", - "common.iOSAndroid": "iOS na Android", - "common.language": "Lugha", - "common.learnMoreSwap": "Pata maelezo zaidi kuhusu swaps", - "common.legalAndPrivacy": "Kisheria na Faragha", - "common.less": "Chini", - "common.limit.cancel_one": "Ghairi kikomo", - "common.limit.cancel_other": "Ghairi {{count}} mipaka", - "common.limit.canceled": "Limit canceled", - "common.limit.executed": "Kikomo kimetekelezwa", - "common.limit.expired": "Kikomo kimekwisha muda", - "common.limit.failed": "Kikomo kimeshindwa", - "common.limit.opened": "Kikomo kimefunguliwa", - "common.limit.pending": "Kikomo kinasubiri", - "common.limits": "Mipaka", - "common.limits.approachMax": "Inakaribia upeo wa juu wa 100", - "common.limits.cancelProceed": "Ghairi mipaka ili kuendelea", - "common.limits.expires": "Muda wake unaisha {{timestamp}}", - "common.limits.open": "Fungua mipaka", - "common.limits.when": "wakati {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "Viungo", - "common.liquidity": "Ukwasi", - "common.liquidity.provision": "Liquidity Provision", - "common.liquidity.removed": "Uondoaji wa udalali", - "common.loading": "Inapakia", - "common.longText.button.less": "Soma kidogo", - "common.longText.button.more": "Soma zaidi", - "common.lowPrice": "Bei ya chini", - "common.manage": "Dhibiti", - "common.market.label": "Soko", - "common.marketPrice": "Market price", - "common.marketPrice.fetching": "Fetching market price...", - "common.marketPrice.label": "Market price:", - "common.marketPrice.unavailable": "Market price not found. Please do your own research to avoid loss of funds.", - "common.max": "Upeo", - "common.message": "Message", - "common.migrate": "Hamisha", - "common.migrate.liquidity.failed": "Malipo ya kuhama yameshindwa", - "common.migrate.position": "Hamisha nafasi", - "common.migrated.liquidity": "Ukwasi uliohama", - "common.migrating.liquidity": "Kuhama ukwasi", - "common.min": "Dak", - "common.more": "Zaidi", - "common.moreDetails": "More details", - "common.navigation.settings": "Mipangilio", - "common.navigation.systemSettings": "Mipangilio", - "common.navigationButton": "Kitufe cha kusogeza", - "common.needHelp": "Je, unahitaji usaidizi?", - "common.networkCost": "Gharama ya mtandao", - "common.neverMind": "Usijali", - "common.new": "Mpya", - "common.new.exclamation": "New!", - "common.nft": "NFT", - "common.nfts": "NFTs", - "common.noAmount.error": "Weka kiasi", - "common.noData": "Hakuna data", - "common.none": "None", - "common.noResults": "Hakuna matokeo yaliyopatikana.", - "common.notAvailableInRegion.error": "Haipatikani katika eneo lako", - "common.notCreated.label": "Haijaundwa", - "common.notSupported": "Haijaungwa mkono", - "common.oneDay": "siku 1", - "common.oneDay.short": "1S", - "common.oneHour.short": "1Saa", - "common.oneMonth": "mwezi 1", - "common.oneWeek": "Wiki 1", - "common.oneYear": "1 mwaka", - "common.opensea.link": "View on OpenSea", - "common.orderCanceled": "Order canceled", - "common.orderExecuted": "Agizo limetekelezwa", - "common.orderExpired": "Muda wa agizo umekwisha", - "common.orderPending": "Agizo linasubiri", - "common.outOfRange": "Nje ya anuwai", - "common.pageNotFound": "Ukurasa haujapatikana!", - "common.passkey.count": "Passkey {{number}}", - "common.passkeys": "Passkeys", - "common.passkeys.add": "Add a passkey", - "common.passkeys.add.description": "Choose where to save your new passkey.", - "common.pastDay": "Siku iliyopita", - "common.pastFiveMinutes": "Dakika tano zilizopita", - "common.pastHour": "Saa iliyopita", - "common.pastMonth": "Mwezi uliopita", - "common.pastWeek": "Wiki iliyopita", - "common.pastYear": "Mwaka uliopita", - "common.pending": "Inasubiri", - "common.pending.cancellation": "Inasubiri kughairiwa", - "common.pendingEllipsis": "Inasubiri...", - "common.permit": "Permit", - "common.plusMore": "+{{number}} more", - "common.pool": "Bwawa", - "common.pools": "Mabwawa", - "common.portfolio": "Portfolio", - "common.poweredBy": "Imewezeshwa na ", - "common.price": "Bei", - "common.priceUpdated": "Bei imesasishwa", - "common.privacyChoices": "Your Privacy Choices", - "common.privacyChoices.checkbox.description": "When checked, we will not share your data with third-party partners for personalized advertising. You can enable sharing anytime by unchecking this box.", - "common.privacyChoices.checkbox.label": "Do not share my information", - "common.privacyChoices.description": "We may share device identifiers with our advertising partners to promote our services on other websites and platforms. Where this qualifies as selling, sharing or targeted advertising under applicable laws, you can opt out by checking the \"do not share my information\" box. For more information about our privacy practices please review our Privacy Policy.", - "common.privacyChoices.disclaimer": "Please note that your selection will apply only to this browser on this device. You can also opt out by enabling the Global Privacy Control setting within the browser that you use to access our services. To see more options, go to your settings.", - "common.privacyPolicy": "Sera ya Faragha", - "common.proceed": "Endelea", - "common.proceedInWallet": "Endelea kwenye mkoba wako", - "common.products": "Products", - "common.protocol": "Itifaki", - "common.protocol.v2": "Uniswap v2", - "common.protocol.v3": "Uniswap v3", - "common.protocol.v4": "Uniswap v4", - "common.purchased": "Imenunuliwa", - "common.rate": "Kiwango", - "common.readMore": "Soma zaidi", - "common.receive": "Pokea", - "common.received": "Imepokelewa", - "common.recent": "Hivi karibuni", - "common.refresh": "Refresh", - "common.reload.label": "Pakia upya programu", - "common.remove.label": "Ondoa", - "common.remove.liquidity.canceled": "Remove liquidity canceled", - "common.remove.liquidity.failed": "Imeshindwa kuondoa ukwasi", - "common.removing.liquidity": "Kuondoa ukwasi", - "common.resetLimit": "Weka upya {{symbol}} kikomo", - "common.resetLimitWallet": "Weka upya {{symbol}} kikomo kwenye pochi", - "common.resettingLimit": "Inaweka upya {{symbol}} kikomo...", - "common.revoke.approval.failed": "Imeshindwa kubatilisha idhini", - "common.revoked.approval": "Uidhinishaji uliobatilishwa", - "common.revoking.approval": "Inabatilisha idhini", - "common.scanQRDownload": "Changanua msimbo wa QR kwa simu yako ili kupakua", - "common.selectRegion.label": "Chagua eneo lako", - "common.selectToken.label": "Chagua ishara", - "common.sell.label": "Uza", - "common.send.button": "Tuma", - "common.send.failed": "Imeshindwa kutuma", - "common.sending": "Inatuma", - "common.sent": "Imetumwa", - "common.settings": "Mipangilio", - "common.share": "Shiriki", - "common.share.shareToTwitter": "Shiriki kwenye Twitter", - "common.show.button": "Onyesha", - "common.showLess.button": "Onyesha kidogo", - "common.showMore.button": "Onyesha zaidi", - "common.signatureExpired": "Sahihi yako imeisha muda.", - "common.signMessage": "Saini ujumbe", - "common.signMessageWallet": "Ingia ujumbe kwenye pochi", - "common.socials": "Socials", - "common.sold": "Inauzwa", - "common.stats": "Takwimu", - "common.status": "Hali", - "common.step.number": "Hatua {{number}}", - "common.step.number.of": "Step {{current}} of {{total}}", - "common.swap": "Badili", - "common.swap.expired": "Ubadilishanaji umekwisha", - "common.swap.failed": "Kubadilishana kumeshindwa", - "common.swapPending": "Kubadilishana kunasubiri...", - "common.termsOfService": "Masharti ya Huduma", - "common.text.connected": "Imeunganishwa", - "common.text.contract": "Mkataba", - "common.text.disconnected": "Imetenganishwa", - "common.text.error": "Hitilafu", - "common.text.notAvailable": "Haipatikani", - "common.text.recipient": "Kwa", - "common.text.sender": "Kutoka", - "common.text.unknown": "Haijulikani", - "common.thisAccount": "this account", - "common.thisMonth": "Mwezi huu", - "common.thisToken": "This token", - "common.thisWeek": "Wiki hii", - "common.thisYear": "Mwaka huu", - "common.time": "Wakati", - "common.time.minute.amt": "{{time}}d", - "common.time.minutes": "dakika", - "common.time.past.days": "{{days}} days", - "common.time.past.days.short": "{{days}}d", - "common.time.past.hours": "{{hours}} hours", - "common.time.past.hours.short": "{{hours}}h", - "common.time.past.minutes.short": "{{minutes}}m", - "common.time.past.months.short": "{{months}}mo", - "common.time.past.seconds.short": "{{seconds}}s", - "common.to": "kwa", - "common.today": "Leo", - "common.tokenA": "Ishara A", - "common.tokenAmount": "Kiasi cha ishara", - "common.tokenB": "Ishara B", - "common.tokenName": "Jina la ishara", - "common.tokens": "Ishara", - "common.totalUniswapTVL": "Total Uniswap TVL", - "common.totalValueLocked": "TVL", - "common.trade": "Biashara", - "common.trademarkPolicy": "Sera ya Alama ya Biashara", - "common.transactionDetails": "Maelezo ya muamala", - "common.transactionId": "Kitambulisho cha muamala", - "common.transactionPending": "Muamala unasubiri", - "common.transactions": "Shughuli", - "common.transactionSettings": "Mipangilio ya Muamala", - "common.transfer_one": "uhamisho", - "common.transfer_other": "uhamisho", - "common.tryAgain.error": "Jaribu tena", - "common.twitter": "Twitter", - "common.type.label": "Aina", - "common.unavailable": "Haipatikani", - "common.unhide": "Unhide", - "common.unichain": "Unichain", - "common.uniswapMobile": "Uniswap Mobile", - "common.uniswapWallet": "Mkoba wa Uniswap", - "common.uniswapX": "UniswapX", - "common.unknown": "Haijulikani", - "common.unknownError.error": "Hitilafu Isiyojulikana", - "common.unwrap.button": "Fungua", - "common.unwrap.failed": "Imeshindwa kufuta", - "common.unwrapped": "Imefunuliwa", - "common.unwrapping": "Kufungua", - "common.view.profile": "View profile", - "common.viewOnExplorer": "Tazama kwenye Explorer", - "common.volume": "Kiasi", - "common.vote": "Piga kura", - "common.wallet.approve": "Idhinisha kwenye mkoba", - "common.wallet.label": "Mkoba", - "common.warning": "Onyo", - "common.webApp": "Programu ya wavuti", - "common.website": "Tovuti", - "common.whyApprove": "Kwa nini ni lazima niidhinishe ishara?", - "common.whySign": "Kwa nini saini zinahitajika?", - "common.whyWrap": "Kwa nini lazima nifunge yangu {{symbol}}?", - "common.withdraw": "Withdraw", - "common.withdrawal.amount": "Kiasi cha Uondoaji", - "common.withinRange": "Katika safu", - "common.wrap": "Funga {{symbol}}", - "common.wrap.failed": "Kufunga kumeshindwa", - "common.wrapIn": "Funga {{symbol}} kwenye pochi", - "common.wrapped": "Imefungwa", - "common.wrapping": "Kufunga", - "common.wrappingToken": "Kufunga {{symbol}}...", - "common.yesterday": "Yesterday", - "common.your.account.had.insufficient.funds": "Akaunti yako haikuwa na fedha za kutosha kukamilisha ubadilishanaji huu.", - "common.your.account.has.insufficient.funds": "Akaunti yako haina fedha za kutosha kukamilisha ubadilishanaji huu.", - "common.your.connected.wallet": "Your connected wallet", - "common.your.limit.could.not.be.fulfilled": "Kikomo chako hakijaweza kutimizwa kwa wakati huu. Tafadhali jaribu tena.", - "common.your.swap.could.not.be.fulfilled": "Ubadilishanaji wako haukuweza kutimizwa kwa wakati huu. Tafadhali jaribu tena.", - "common.youreBuying": "Unanunua", - "common.youReceive": "Unapokea", - "common.youreSelling": "You’re selling", - "currency.ars": "Argentine Peso", - "currency.aud": "Dola ya Australia", - "currency.brl": "Real ya Brazil", - "currency.cad": "Dola ya Kanada", - "currency.cny": "Yuan ya Kichina", - "currency.cop": "Colombian Peso", - "currency.eur": "Euro", - "currency.gbp": "Pauni ya Uingereza", - "currency.hkd": "Dola ya Hong Kong", - "currency.idr": "Rupiah ya Indonesia", - "currency.inr": "Rupia ya India", - "currency.jpy": "Yen ya Kijapani", - "currency.krw": "Won ya Korea Kusini", - "currency.mxn": "Mexican Peso", - "currency.ngn": "Naira ya Nigeria", - "currency.pkr": "Rupia ya Pakistani", - "currency.rub": "Ruble ya Kirusi", - "currency.sgd": "Dola ya Singapore", - "currency.try": "Lira ya Uturuki", - "currency.uah": "Hryvnia ya Kiukreni", - "currency.usd": "Dola ya Marekani", - "currency.vnd": "Dong ya Kivietinamu", - "dapp.request.actionCannotBeCompleted.description": "Some functionality is unavailable because your smart wallet settings are being managed by a different wallet app.", - "dapp.request.actionCannotBeCompleted.header": "Ombi la saini", - "dapp.request.actionCannotBeCompleted.title": "Action cannot be completed", - "dapp.request.approve.action": "Idhinisha", - "dapp.request.approve.fallbackTitle": "Idhinisha tovuti hii ili kufikia tokeni", - "dapp.request.approve.helptext": "Ruhusu tovuti hii kufikia na kutumia tokeni hii kwa miamala. Hakikisha unaamini tovuti hii.", - "dapp.request.approve.label": "Mkoba", - "dapp.request.approve.title": "Idhinisha ufikiaji wa {{tokenSymbol}}", - "dapp.request.base.title": "Ombi la muamala", - "dapp.request.bridge.description": "Sogeza ETH, USDC, na zaidi kwenye {{numChains}}+ mitandao.", - "dapp.request.bridge.title": "Unajaribu kuunganisha?", - "dapp.request.connect.helptext": "Ruhusu tovuti hii ione anwani ya mkoba wako, salio, na uombe idhini za miamala.", - "dapp.request.connect.title": "Unganisha kwenye tovuti", - "dapp.request.fallback.calldata.label": "Takwimu ghafi", - "dapp.request.fallback.function.label": "Kazi", - "dapp.request.permit2.description": "Permit2 inadhibiti uidhinishaji wa tokeni kwenye dapp nyingi.", - "dapp.request.permit2.header": "Kibali cha Saini2", - "dapp.request.permit2approve.action": "Idhinisha", - "dapp.request.permit2approve.helptext": "Permit2 inadhibiti uidhinishaji wa tokeni kwenye dapp nyingi.", - "dapp.request.permit2approve.title": "Approve Permit2", - "dapp.request.reject.action": "Kataa yote", - "dapp.request.reject.info": "Una {{totalRequestCount}} maombi ya muamala", - "dapp.request.revoke.action": "Batilisha", - "dapp.request.revoke.helptext": "Ruhusu tovuti hii kubatilisha ufikiaji wa kutumia tokeni hii kwa miamala. Hakikisha unaamini tovuti hii.", - "dapp.request.revoke.title": "Batilisha ufikiaji wa {{tokenSymbol}}", - "dapp.request.signature.containsUnrenderableCharacters": "Ujumbe huu una herufi zisizoweza kutamkwa. Hakikisha unaamini tovuti hii.", - "dapp.request.signature.decodeError": "Failed to decode message", - "dapp.request.signature.header": "Ombi la saini", - "dapp.request.signature.irregular": "Irregular signature request", - "dapp.request.signature.irregular.description": "Make sure you trust this site before proceeding", - "dapp.request.signature.irregular.understand": "I understand the risks", - "dapp.request.signature.toggleDataView.raw": "Tazama data ghafi", - "dapp.request.signature.toggleDataView.readable": "Tazama data asili", - "dapp.request.warning.notActive.message": "Hakikisha ni sahihi", - "dapp.request.warning.notActive.title": "Hii si pochi yako inayotumika", - "delegation.upgradeModal.description": "This wallet update uses smart contracts for faster, lower-cost transactions. Learn more", - "delegation.upgradeModal.enableSmartWallet": "Enable smart wallet", - "delegation.upgradeModal.title": "Smarter swaps, lower costs", - "downloadApp.modal.connectExistingWallet": "Connect existing wallet", - "downloadApp.modal.getStarted.description": "Get access to thousands of tokens instantly through the world’s largest onchain marketplace.", - "downloadApp.modal.getStarted.title": "Start swapping in seconds", - "downloadApp.modal.getTheApp.title": "Anza na Uniswap", - "downloadApp.modal.uniswapProducts.subtitle": "Bidhaa za Uniswap hufanya kazi pamoja kwa urahisi ili kuunda hali bora zaidi ya kubadilishana.", - "empty.swap.button.text": "Add funds to swap", - "error.dataUnavailable": "Data haipatikani kwa sasa; tunafanya kazi ya kurekebisha", - "error.id": "Kitambulisho cha hitilafu: {{eventId}}", - "error.jupiterApi.execute.default.title": "Something went wrong with Jupiter API. Please try again.", - "error.jupiterApi.failedToLand": "(Code {{code}}: Transaction failed to land on the network)", - "error.jupiterApi.invalidBlockHeight": "(Code -1004: Invalid block height)", - "error.jupiterApi.invalidMessageBytes": "(Code -3: Invalid message bytes)", - "error.jupiterApi.invalidPayload": "(Code -2002: Invalid payload)", - "error.jupiterApi.invalidSignedTransaction": "(Code -2: Invalid signed transaction)", - "error.jupiterApi.invalidTransaction": "(Code -1002: Invalid transaction)", - "error.jupiterApi.missingCachedOrder": "(Code -1: Missing cached order)", - "error.jupiterApi.notFullySigned": "(Code -1003: Transaction not fully signed)", - "error.jupiterApi.quoteExpired": "This quote timed out, please try again. (Code -2003)", - "error.jupiterApi.unknownErrorCode": "(Code {{code}})", - "error.noData": "Hakuna data iliyopatikana", - "error.request.provideId": "Samahani, hitilafu ilitokea wakati wa kuchakata ombi lako. Ukiomba usaidizi, hakikisha umetoa kitambulisho chako cha hitilafu.", - "error.tokenApproval": "Uidhinishaji wa ishara umeshindwa", - "error.tokenApproval.message": "A network or connection issue likely caused your approval to fail. Check your connection and try again.", - "error.tokenApprovalEdited": "Kiasi cha idhini hakitoshi", - "error.tokenApprovalEdited.message": "Kiasi cha idhini kilichowekwa kwenye mkoba wako ni kidogo sana kukamilisha shughuli hii. Tafadhali jaribu tena na ongeza kiasi.", - "errors.crash.message": "Kitu kilianguka.", - "errors.crash.restart": "Anzisha tena programu", - "errors.crash.title": "Lo!", - "explore.more.pools": "Explore more pools", - "explore.more.unichain": "Explore Unichain pools", - "explore.search.label.ownedBy": "Inamilikiwa na {{ownerAddress}}", - "explore.search.placeholder": "Tafuta tokeni na pochi", - "explore.search.section.nft": "Mikusanyiko ya NFT", - "explore.search.section.popularNFT": "Mikusanyiko maarufu ya NFT", - "explore.search.section.wallets": "Pochi", - "explore.tokens.error": "Haikuweza kupakia tokeni", - "explore.tokens.favorite.action.add": "ishara inayopendelewa", - "explore.tokens.favorite.action.edit": "Hariri vipendwa", - "explore.tokens.favorite.action.remove": "Ondoa favorite", - "explore.tokens.favorite.title.default": "Ishara zinazopendwa", - "explore.tokens.favorite.title.edit": "Hariri tokeni unazopenda", - "explore.tokens.metadata.marketCap": "{{number}} MCap", - "explore.tokens.metadata.totalValueLocked": "{{number}} TVL", - "explore.tokens.metadata.volume": "{{number}} Juz", - "explore.tokens.sort.label.marketCap": "Kofia ya soko", - "explore.tokens.sort.label.priceDecrease": "Kupungua kwa bei", - "explore.tokens.sort.label.priceIncrease": "Ongezeko la bei", - "explore.tokens.sort.label.totalValueLocked": "TVL", - "explore.tokens.sort.label.volume": "Kiasi", - "explore.tokens.sort.option.marketCap": "Kofia ya soko", - "explore.tokens.sort.option.priceDecrease": "Kupungua kwa bei (24H)", - "explore.tokens.sort.option.priceIncrease": "Ongezeko la bei (H24)", - "explore.tokens.sort.option.totalValueLocked": "Uniswap TVL", - "explore.tokens.sort.option.volume": "sauti ya uniswap (24H)", - "explore.tokens.top.title": "Ishara za juu", - "explore.v2TVL": "v2 TVL", - "explore.v3TVL": "v3 TVL", - "explore.v4TVL": "v4 TVL", - "explore.wallets.favorite.action.add": "Mkoba unaopenda", - "explore.wallets.favorite.action.edit": "Hariri vipendwa", - "explore.wallets.favorite.action.remove": "Ondoa favorite", - "explore.wallets.favorite.action.remove.short": "Unfavorite", - "explore.wallets.favorite.title.default": "Pochi zinazopendwa", - "explore.wallets.favorite.title.edit": "Hariri pochi uzipendazo", - "extension.connection.network": "Mtandao", - "extension.connection.networks": "Mitandao", - "extension.connection.popup.trouble": "Je, una tatizo la kuunganisha?", - "extension.connection.titleConnected": "Imeunganishwa", - "extension.connection.titleNotConnected": "Haijaunganishwa", - "extension.lock.button.forgot": "Umesahau nywila?", - "extension.lock.button.reset": "Weka upya mkoba", - "extension.lock.button.submit": "Fungua", - "extension.lock.password.error": "Nenosiri si sahihi. Jaribu tena", - "extension.lock.password.reset.initial.description": "Uniswap haiwezi kusaidia kurejesha nenosiri lako. Unahitaji kuweka upya pochi yako kwa kuweka tena kifungu chako cha maneno 12 cha urejeshaji.", - "extension.lock.password.reset.initial.help": "Nitapata wapi maneno yangu ya urejeshi?", - "extension.lock.password.reset.initial.title": "Umesahau nywila", - "extension.lock.password.reset.speedbump.description": "Hakikisha kuwa una maneno 12 ya kurejesha uwezo wako kabla ya kuweka upya pochi yako. Vinginevyo hutaweza kurejesha pesa zako.", - "extension.lock.password.reset.speedbump.help": "Nilipoteza neno langu la kupona", - "extension.lock.password.reset.speedbump.title": "Kabla ya kuendelea", - "extension.lock.subtitle": "Weka nenosiri lako ili kufungua", - "extension.lock.title": "Karibu tena", - "extension.network.notSupported": "Mtandao usiotumika", - "extension.open": "Fungua Kiendelezi cha Uniswap", - "extension.passwordPrompt.error.wrongPassword": "Nenosiri si sahihi. Jaribu tena", - "extension.passwordPrompt.title": "Weka nenosiri lako", - "extension.popup.chrome.button": "Fungua kiendelezi", - "extension.popup.chrome.description": "Kamilisha kitendo hiki kwa kufungua kiendelezi cha Uniswap.", - "extension.popup.chrome.title": "Endelea katika Uniswap", - "extension.settings.defaultWallet.message": "Prioritize Uniswap Extension when connecting to apps.", - "extension.settings.defaultWallet.title": "Make default wallet", - "extension.uninstall.reason.missingFeatures": "Uniswap Wallet lacks certain features", - "extension.uninstall.reason.notUsingCrypto": "I no longer want to use crypto", - "extension.uninstall.reason.other": "Other reasons", - "extension.uninstall.reason.switchingWallet": "I’m switching to a different wallet", - "extension.uninstall.subtitle": "If you have a moment, we’d love to hear why you uninstalled Uniswap Wallet", - "extension.uninstall.title": "We’re sad to see you go", - "extension.warning.storage.button": "Hifadhi nakala rudufu", - "extension.warning.storage.message": "Hakikisha kuwa umehifadhi nakala ya maneno yako ya kurejesha akaunti ili kuzuia kupoteza ufikiaji wa pochi na pesa zako.", - "extension.warning.storage.title": "Kivinjari chako kinaishiwa na hifadhi", - "extensionPasskeyLogInPopUp.description": "Import your Uniswap account by logging in with an existing passkey.", - "extensionPasskeyLogInPopUp.invalidReferrer": "Please close this page and try again.", - "fee.bestForCustomizability": "Best for customizability.", - "fee.bestForExotic": "Bora kwa jozi za kigeni.", - "fee.bestForMost": "Bora kwa jozi nyingi.", - "fee.bestForStablePairs": "Bora kwa jozi imara.", - "fee.bestForVeryStable": "Bora kwa jozi imara sana.", - "fee.dynamic": "Dynamic fee", - "fee.percentEarned": "% utakayopata kwa ada.", - "fee.selectPercent": "{{pct}}% chagua", - "fee.selectPercentDescription": "{{pct}}% of liquidity selected this tier", - "fee.tier": "Kiwango cha ada", - "fee.tier.create": "Unda daraja la ada", - "fee.tier.create.button": "Unda daraja jipya la ada", - "fee.tier.create.description": "Kuunda daraja jipya kutaanzisha katika bwawa jipya na kutaongeza gharama za mtandao kuliko kawaida.", - "fee.tier.description": "The amount earned providing liquidity. Choose an amount that suits your risk tolerance and strategy.", - "fee.tier.description.v2": "The amount earned providing liquidity. All v2 pools have fixed 0.3% fees. For more options, provide liquidity on v4.", - "fee.tier.dynamic": "Dynamic fee tier", - "fee.tier.dynamic.create": "Creating dynamic fee tier", - "fee.tier.dynamic.create.info": "You are about to create a pool with a dynamic fee tier. Before proceeding, please ensure that the selected hook supports dynamic fees.", - "fee.tier.highestTvl": "Highest TVL", - "fee.tier.label": "% utakayopata kwa ada", - "fee.tier.missing.description": "Huwezi kupata daraja unalotafuta?", - "fee.tier.new": "Daraja jipya", - "fee.tier.percent.select": "{{percentage}} select", - "fee.tier.recommended.description": "Recommended based on having the highest share of liquidity for the selected token pair.", - "fee.tier.search": "Search or create other fee tiers", - "fee.tier.search.short": "Tafuta madaraja", - "fee.tier.select": "Chagua daraja la ada", - "fee.tier.select.existing.button": "Chagua kiwango cha ada kilichopo", - "fee.tierExact": "{{fee}} daraja la ada", - "fee.unavailable": "Earned fees are not visible for v2 positions until liquidity is removed.", - "fee.uncollected": "Includes uncollected fees:", - "fee.uniswap": "Fee ({{percent}})", - "fee.uniswap.description": "Fees are applied to ensure the best experience with Uniswap.", - "fiatOffRamp.checkout.title": "Withdraw to", - "fiatOffRamp.connection.quote": "Kuuza thamani ya {{amount}} ya {{currencySymbol}}", - "fiatOffRamp.error.balance": "Exceeds balance", - "fiatOffRamp.error.populateSend.description": "Please wait a moment and try again.", - "fiatOffRamp.error.populateSend.title": "Cannot load transaction", - "fiatOffRamp.summary.total": "{{cryptoAmount}} kwa {{fiatAmount}}", - "fiatOffRamp.unsupportedToken.back": "Rudi nyuma", - "fiatOffRamp.unsupportedToken.divider": "Ishara zisizotumika", - "fiatOffRamp.unsupportedToken.message": "Ishara hii haiwezi kuuzwa. Badilisha kipengee hiki na moja ya ishara zinazotumika.", - "fiatOffRamp.unsupportedToken.swap": "Badilisha na ishara inayotumika", - "fiatOffRamp.unsupportedToken.title": "Ishara isiyotumika", - "fiatOffRamp.welcome.tooltip": "Uza crypto yako kwa akaunti ya benki au kadi ya debit.", - "fiatOnRamp.button.chooseToken": "Chagua ishara", - "fiatOnRamp.buy.info.description": "You’ll need it to pay for network costs when swapping.", - "fiatOnRamp.buy.info.title": "Start with ETH", - "fiatOnRamp.cexTransferModal.description": "Kununua crypto kwa kadi haijawezeshwa katika eneo lako. Hamisha vipengee kutoka akaunti ya uhamishaji wa kubadilisha ili kufadhili pochi yako.", - "fiatOnRamp.cexTransferModal.title": "Hamisha kuanza", - "fiatOnRamp.checkout.title": "Checkout", - "fiatOnRamp.chooseMultiPlatformProvider.chooseNetwork": "Choose network", - "fiatOnRamp.chooseMultiPlatformProvider.description": "This will determine the wallet address you’ll receive the funds on.", - "fiatOnRamp.chooseProvider.description": "Utaenda kwenye tovuti ya mtoa huduma ili kuona ada zinazohusiana na muamala wako.", - "fiatOnRamp.completeTransactionHeader": "Kamilisha muamala kwa {{serviceProvider}}", - "fiatOnRamp.connection.error": "Muunganisho haukufaulu", - "fiatOnRamp.connection.errorDescription": "Hitilafu imetokea wakati wa kuunganisha na {{serviceProvider}}.", - "fiatOnRamp.connection.message": "Inakuunganisha kwa {{serviceProvider}}", - "fiatOnRamp.connection.quote": "Kununua {{amount}} thamani ya {{currencySymbol}}", - "fiatOnRamp.connection.terms": "Kwa kuendelea, unakubali kwamba utakuwa chini ya Sheria na Masharti na Sera ya Faragha na {{serviceProvider}}, kama inavyotumika.", - "fiatOnRamp.continueInTab": "Nenda kwenye kichupo cha {{serviceProvider}} ili kuendelea. Ni salama kufunga modali hii sasa.", - "fiatOnRamp.disclaimer": "Kwa kuendelea, unakubali kwamba utakuwa chini ya Sheria na Masharti na Sera ya Faragha na {{serviceProvider}}, kama inavyotumika.", - "fiatOnRamp.error.default": "Hitilafu fulani imetokea.", - "fiatOnRamp.error.load": "Haikuweza kupakia tokeni ili kununua", - "fiatOnRamp.error.max": "Upeo {{amount}}", - "fiatOnRamp.error.min": "Kiwango cha chini {{amount}}", - "fiatOnRamp.error.noQuotes": "No quotes found.", - "fiatOnRamp.error.unavailable": "Huduma hii haipatikani katika eneo lako", - "fiatOnRamp.error.unsupported": "Haitumiki katika eneo", - "fiatOnRamp.error.usd": "Inapatikana tu kwa kununua kwa USD", - "fiatOnRamp.noQuotes.error": "No quotes found", - "fiatOnRamp.paymentMethods.applePay": "Apple Pay", - "fiatOnRamp.paymentMethods.bank": "Bank", - "fiatOnRamp.paymentMethods.debit": "Debit", - "fiatOnRamp.paymentMethods.googlePay": "Google Pay", - "fiatOnRamp.paymentMethods.paypal": "PayPal", - "fiatOnRamp.paymentMethods.venmo": "Venmo", - "fiatOnRamp.quote.advice": "Utaenda kwenye tovuti ya mtoa huduma ili kuona ada zinazohusiana na muamala wako.", - "fiatOnRamp.quote.type.list": "{{optionsList}}, na chaguzi zingine", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "Kutoka kwa akaunti", - "fiatOnRamp.receiveCrypto.title": "Pokea crypto", - "fiatOnRamp.receiveCrypto.transferFunds": "Fanya mkoba wako kwa kuhamisha crypto kutoka kwa pochi au akaunti nyingine", - "fiatOnRamp.receiveCrypto.useThisAddress": "Use this address to receive tokens on", - "fiatOnRamp.region.placeholder": "Tafuta kulingana na nchi au eneo", - "fiatOnRamp.region.title": "Chagua eneo lako", - "fiatOnRamp.summary.total": "{{cryptoAmount}} kwa {{fiatAmount}}", - "forceUpgrade.action.backup": "Hifadhi nakala ya pochi yako", - "forceUpgrade.action.confirm": "Update now", - "forceUpgrade.action.learn": "Learn how to update", - "forceUpgrade.description.extension": "A new version of the app is available. To continue using the Uniswap Extension, please update it to the latest version.", - "forceUpgrade.description.wallet": "A new version of the app is available. To continue using the Uniswap Wallet, please update it to the latest version.", - "forceUpgrade.label.recoveryPhrase": "Maneno ya kurejesha", - "forceUpgrade.title": "Update to the latest version", - "forceUpgrade.title.recommendedStatus": "A new version is available", - "globalPreferences.title": "Mapendeleo ya kimataifa", - "hero.scroll": "Sogeza ili upate maelezo zaidi", - "hero.subtitle": "Buy and sell crypto on {{amount}}+ networks including Ethereum, Unichain, and Base.", - "hero.swap.title": "Badili wakati wowote,
popote.", - "hidden.nfts.info.banner.text": "Jifunze zaidi kuhusu NFT zilizo hifadhiwa", - "hidden.nfts.info.text.button": "NFT zilizo hifadhiwa ({{numHidden}})", - "hidden.nfts.info.text.extension": "Hizi ni kashfa za uwezekano na NFT ulizohifadhi. Unaweza kubofya kulia kwenye NFT kufichua.", - "hidden.nfts.info.text.mobile": "Hizi ni kashfa za uwezekano na NFT ulizohifadhi. Unaweza kushinikiza kwa muda mrefu kwenye NFT kufichua.", - "hidden.nfts.info.text.title": "NFT zilizo hifadhiwa", - "hidden.tokens.info.banner.text": "Jifunze zaidi kuhusu ishara zilizofichwa", - "hidden.tokens.info.text.button": "Ishara zilizofichwa ({{numHidden}})", - "hidden.tokens.info.text.info": "Hizi zinazoonekana ni ulaghai, salio ndogo, na tokeni ulizoficha. Tokeni zilizofichwa hazijumuishwi katika jumla ya salio lako la pochi.", - "hidden.tokens.info.text.title": "Tokeni zilizofichwa", - "home.activity.empty.button": "Pokea tokeni au NFTs", - "home.activity.empty.description.default": "Unapoidhinisha, kufanya biashara au kuhamisha tokeni au NFTs, miamala yako itaonekana hapa.", - "home.activity.empty.description.external": "Wakati pochi hii inafanya miamala, yataonekana hapa.", - "home.activity.empty.title": "Hakuna shughuli bado", - "home.activity.error.load": "Haikuweza kupakia shughuli", - "home.activity.title": "Shughuli", - "home.banner.offline": "Uko katika hali ya nje ya mtandao", - "home.banner.testnetMode": "Uko kwenye hali ya testnet", - "home.banner.testnetMode.nav": "Uko kwenye hali ya testnet. Zima hii katika mipangilio.", - "home.empty.cexTransfer": "Transfer", - "home.empty.cexTransfer.description": "Move funds from a trading platform.", - "home.empty.transfer": "Pokea crypto", - "home.empty.transfer.description": "Move funds from another wallet.", - "home.explore.footer": "Gusa hapa ili kuchunguza maelfu ya tokeni, NFTs, na zaidi", - "home.explore.title": "Chunguza tokeni", - "home.extension.error": "Hitilafu katika kupakia akaunti", - "home.label.buy": "Nunua", - "home.label.for": "Buy/Sell", - "home.label.receive": "Pokea", - "home.label.send": "Tuma", - "home.label.swap": "Badili", - "home.nfts.title": "NFTs", - "home.tokens.empty.action.buy.description": "Purchase with a debit card or bank account.", - "home.tokens.empty.action.buy.title": "Nunua crypto", - "home.tokens.empty.action.import.description": "Ingiza kifungu cha urejeshaji cha pochi hii ili kuanza kubadilishana na kutuma.", - "home.tokens.empty.action.import.title": "Ingiza pochi", - "home.tokens.empty.action.receive.description": "Transfer from another wallet or account.", - "home.tokens.empty.action.receive.title": "Pokea crypto", - "home.tokens.empty.description": "Mkoba huu unaponunua au kupokea tokeni, zitaonekana hapa.", - "home.tokens.empty.title": "Bado hakuna tokeni", - "home.tokens.empty.welcome.description": "Add funds to start trading", - "home.tokens.error.fetch": "Imeshindwa kuleta salio la tokeni", - "home.tokens.error.load": "Haikuweza kupakia salio la tokeni", - "home.tokens.title": "Ishara", - "home.upsell.receive.cta": "Kutoka kwa akaunti", - "home.upsell.receive.title": "Pokea crypto", - "home.warning.viewOnly": "Hii ni pochi ya kutazama tu", - "interface.metatags.description": "Swap crypto on Ethereum, Base, Arbitrum, Polygon, Unichain and more. The DeFi platform trusted by millions.", - "interface.metatags.title": "Kiolesura cha Uniswap", - "landing.api": "API", - "landing.appsOverview": "Built for all the ways you swap", - "landing.blog.description": "Catch up on the latest company news, product features and more", - "landing.docs.description": "Explore our library of developer docs to get started building with Uniswap", - "landing.exploreUniverse": "Explore the UNIverse", - "landing.getStarted": "Trade on the world’s largest DEX", - "landing.helpCenter.body": "Browse FAQs and get support from our US-based support team", - "landing.protocolDescription": "Uniswap Labs powers some of the most used products in crypto. Experience permissionless access, proven security, and dedicated support.", - "landing.protocolStats": "Uniswap Protocol stats", - "landing.provideLiquidity.body": "Provide liquidity and collect fees using the Uniswap Interface.", - "landing.provideLiquidity.subtitle": "Power onchain markets.", - "landing.socials": "Follow Uniswap Labs on X, Farcaster, LinkedIn, and TikTok", - "landing.swapBody": "Access deep liquidity, explore tokens, set limit orders, and provide liquidity for thousands of tokens across {{amount}} chains.", - "landing.swapSubtitle": "Permissionless swapping.", - "landing.tradingApi": "Trading API", - "landing.tradingApiBody": "Use the same API that powers the Uniswap Web App and Wallet, trusted by leading teams around the world.", - "landing.tradingApiButton": "Integrate the Uniswap API", - "landing.tradingApiSubtitle": "DeFi, direct to your users.", - "landing.trusted": "Inaaminiwa na mamilioni", - "landing.unichain.body": "Join the community building on the fast, decentralized Ethereum L2 built to be the home for DeFi.", - "landing.unichain.button": "Start building", - "landing.unichain.subtitle": "The DeFi chain.", - "landing.uniswapX.body": "Gasless transactions and MEV protection, with zero fees for failed swaps.", - "landing.uniswapX.button": "Experience UniswapX", - "landing.uniswapX.subtitle": "Smarter swaps, zero friction.", - "landing.walletBody": "The trusted self-custody crypto wallet and extension with millions of downloads, support from real humans, and a 4.8 rating.", - "landing.walletSubtitle": "Swap, store, explore.", - "language.afrikaans": "Afrikaans", - "language.arabic": "Kiarabu", - "language.catalan": "Kikatalani", - "language.chineseSimplified": "Kichina, Kilichorahisishwa", - "language.chineseTraditional": "Kichina, Jadi", - "language.czech": "Kicheki", - "language.danish": "Kidenishi", - "language.dutch": "Kiholanzi", - "language.english": "Kiingereza", - "language.finnish": "Kifini", - "language.french": "Kifaransa", - "language.greek": "Kigiriki", - "language.hebrew": "Kiebrania", - "language.hindi": "Kihindi", - "language.hungarian": "Kihungaria", - "language.indonesian": "Kiindonesia", - "language.italian": "Kiitaliano", - "language.japanese": "Kijapani", - "language.korean": "Kikorea", - "language.malay": "Kimalei", - "language.norwegian": "Kinorwe", - "language.polish": "Kipolandi", - "language.portuguese": "Kireno", - "language.romanian": "Kiromania", - "language.russian": "Kirusi", - "language.serbian": "Kiserbia", - "language.spanishArgentina": "Spanish (Argentina)", - "language.spanishBelize": "Spanish (Belize)", - "language.spanishBolivia": "Spanish (Bolivia)", - "language.spanishChile": "Spanish (Chile)", - "language.spanishColombia": "Spanish (Colombia)", - "language.spanishCostaRica": "Spanish (Costa Rica)", - "language.spanishCuba": "Spanish (Cuba)", - "language.spanishDominicanRepublic": "Spanish (Dominican Republic)", - "language.spanishEcuador": "Spanish (Ecuador)", - "language.spanishElSalvador": "Spanish (El Salvador)", - "language.spanishGuatemala": "Spanish (Guatemala)", - "language.spanishHonduras": "Spanish (Honduras)", - "language.spanishLatam": "Kihispania (Amerika ya Kusini)", - "language.spanishMexico": "Spanish (Mexico)", - "language.spanishNicaragua": "Spanish (Nicaragua)", - "language.spanishPanama": "Spanish (Panama)", - "language.spanishParaguay": "Spanish (Paraguay)", - "language.spanishPeru": "Spanish (Peru)", - "language.spanishPuertoRico": "Spanish (Puerto Rico)", - "language.spanishSpain": "Kihispania (Uhispania)", - "language.spanishUruguay": "Spanish (Uruguay)", - "language.spanishUs": "Kihispania (Marekani)", - "language.spanishVenezuela": "Spanish (Venezuela)", - "language.swahili": "Kiswahili", - "language.swedish": "Kiswidi", - "language.turkish": "Kituruki", - "language.ukrainian": "Kiukreni", - "language.urdu": "Kiurdu", - "language.vietnamese": "Kivietinamu", - "large.price.difference": "Large price difference", - "large.price.difference.tooltip": "Proceeding with this trade will result in a loss of funds. This difference can be due to large trades or low liquidity.", - "limit.open.count_one": "1 kikomo wazi", - "limit.open.count_other": "{{count}} fungua mipaka", - "limitPrice.buyingAboveMarketPrice.error.description": "Bei yako ya kikomo ni {{percentage}}% juu kuliko soko. Rekebisha bei yako ya kikomo ili kuendelea.", - "limitPrice.buyingAboveMarketPrice.error.title": "Kununua {{tokenSymbol}} juu ya bei ya soko", - "limitPrice.marketPriceNotAvailable.error.description": "Hatuwezi kukokotoa bei ya sasa ya soko. Ili kuepuka kuwasilisha agizo chini ya bei ya soko, tafadhali angalia muunganisho wako wa mtandao na ujaribu tena.", - "limitPrice.marketPriceNotAvailable.error.title": "Bei ya soko haipatikani", - "limitPrice.sellingBelowMarketPrice.error.description": "Bei yako ya kikomo ni {{percentage}}% chini ya soko. Rekebisha bei yako ya kikomo ili kuendelea.", - "limitPrice.sellingBelowMarketPrice.error.title": "Kuuza {{tokenSymbol}} chini ya bei ya soko", - "limits.form.disclaimer.mainnet": "Tokeni za mainnet za Ethereum pekee ndizo zinazopatikana kwa kikomo. ", - "limits.form.disclaimer.mainnet.short": "Tokeni za Mainnet pekee ndizo zinazopatikana kwa vikomo.", - "limits.form.disclaimer.uniswapx": "Vikomo huenda visitekelezwe haswa wakati tokeni zinafikia bei iliyobainishwa. ", - "limits.learnMore": "Jifunze zaidi kuhusu mipaka", - "limits.price.input.label": "Wakati 1 inastahili", - "limits.price.label": "Bei ya kikomo", - "limits.selectSupportedTokens": "Chagua tokeni zinazotumika", - "liquidity.hooks": "Vibonzo kwenye v4", - "liquidity.hooks.address.input": "Enter hook address", - "liquidity.hooks.address.tooltip": "Hook address: {{address}}", - "liquidity.learnMoreLabel": "Jifunze kuhusu utoaji wa ukwasi", - "liquidity.notEnough.label": "Hakuna ukwasi wa kutosha kuonyesha thamani sahihi ya USD.", - "liquidity.provideOnProtocols": "Kutoa ukwasi kwenye itifaki tofauti", - "liquidityPool.page.title": "Ongeza ukwasi kwenye madimbwi{{version}} kwenye Uniswap", - "liquidityPool.positions.closed.title": "Closed positions", - "liquidityPool.positions.loadingMore": "Loading more positions...", - "liquidityPool.positions.page.title": "Dhibiti {{quoteSymbol}}/{{baseSymbol}} ukwasi wa bwawa kwenye Uniswap", - "liquidityPool.positions.page.version.description": "Tazama nafasi zako za ukwasi {{version}} zinazotumika. Ongeza nafasi mpya.", - "liquidityPool.positions.page.version.title": "Dhibiti ukwasi wa bwawa{{version}} kwenye Uniswap", - "migrate.allowed": "Ruhusiwa", - "migrate.allowLpMigration": "Ruhusu uhamishaji wa tokeni za LP", - "migrate.connectAccount": "You must connect an account that owns this position.", - "migrate.connectWallet": "Unganisha kwenye pochi ili kuona ukwasi wako wa V2.", - "migrate.contract": "Mkataba wa uhamiaji wa Uniswap", - "migrate.firstLP": "Wewe ndiye mtoaji huduma wa kwanza wa ukwasi kwa bwawa hili la Uniswap V3. Ukwasi wako utahamia kwa bei ya sasa {{source}} .", - "migrate.highGasCost": "Gharama yako ya muamala itakuwa kubwa zaidi kwani inajumuisha gesi kuunda bwawa.", - "migrate.invalidRange": "Masafa batili yamechaguliwa. Bei ya chini lazima iwe chini kuliko bei ya juu.", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} tokeni za LP", - "migrate.migrating": "Kuhama", - "migrate.missingV2Position": "Je, huoni mojawapo ya nafasi zako za v2? Ingiza.", - "migrate.noV2Liquidity": "Hakuna ukwasi wa V2 uliopatikana.", - "migrate.positionNoFees": "Nafasi yako haitapata ada au kutumika katika biashara hadi bei ya soko ihamishwe katika anuwai yako.", - "migrate.priceDifference": "Tofauti ya bei: ", - "migrate.priceWarning": "Unapaswa tu kuweka ukwasi kwenye Uniswap V3 kwa bei ambayo unaamini ni sahihi.
Iwapo bei inaonekana si sahihi, unaweza kubadilishana ili kuhamisha bei au kusubiri mtu mwingine afanye hivyo.", - "migrate.refund": "Angalau {{amtA}} {{symA}} na {{amtB}} {{symB}} itarejeshwa kwenye mkoba wako kutokana na anuwai ya bei iliyochaguliwa.", - "migrate.selectFeeTier": "Chagua kiwango cha ada", - "migrate.setRange": "Weka anuwai ya bei", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Bei:", - "migrate.v2Description": "Zana hii itahamisha {{source}} ukwasi wako kwa usalama hadi V3. Mchakato huo hauaminiki kabisa kutokana na <0>mkataba wa uhamiaji wa Uniswap ↗", - "migrate.v2Instruction": "Kwa kila kundi lililoonyeshwa hapa chini, bofya hamisha ili kuondoa ukwasi wako kutoka Uniswap V2 na uiweke kwenye Uniswap V3.", - "migrate.v2Title": "Hamisha ukwasi wa V2", - "migrate.v3Price": "V3 {{sym}} Bei:", - "mint.v3.input.invalidPrice.error": "Ingizo la bei si sahihi", - "mobileAppPromo.banner.getTheApp.link": "Pata programu ya Uniswap Wallet", - "mobileAppPromo.banner.title": "Uniswap: Crypto & NFT Wallet", - "moonpay.poweredBy": "Fiat onramp inayoendeshwa na MoonPay USA LLC", - "nav.createAccount.button": "Unda akaunti", - "nav.logIn.button": "Ingia", - "nav.logInOrConnect.title": "Log in or connect", - "nav.products.tradingApi": "Integrate the protocol", - "nav.products.unichain": "The DeFi chain", - "nav.products.uniswapX": "The meta-aggregator", - "nav.products.wallet": "Swap, store, explore", - "nav.signUp.button": "Jisajili", - "nav.tabs.createPosition": "Unda msimamo", - "nav.tabs.viewPositions": "View positions", - "network.lostConnection": "Huenda umepoteza muunganisho wako wa mtandao.", - "network.mightBeDown": "{{network}} huenda iko chini kwa sasa, au umepoteza muunganisho wako wa mtandao.", - "network.warning": "Onyo la mtandao", - "nft.noPools": "Hakuna mabwawa bado", - "nft.reportSpam": "Ripoti kama barua taka", - "notFound.oops": "Lo, nirudishe kwa Wabadilishane", - "notice.uk": "Programu hii ya wavuti imetolewa kama zana kwa watumiaji kuingiliana na Itifaki ya Uniswap kwa hiari yao wenyewe, bila uidhinishaji au mapendekezo ya shughuli za biashara ya cryptocurrency. Kwa kufanya hivyo, Uniswap haipendekezi kwamba watumiaji au watumiaji watarajiwa wajihusishe na shughuli ya biashara ya cryptoasset, na watumiaji au watumiaji wanaotarajiwa wa programu ya wavuti hawapaswi kuzingatia ukurasa huu wa tovuti au yaliyomo kama yanayohusisha aina yoyote ya mapendekezo, mwaliko au ushawishi wa kushughulikia cryptoassets. .", - "notice.uk.label": "Kanusho la Uingereza:", - "notification.assetVisibility.hidden": "{{assetName}} siri", - "notification.assetVisibility.unhidden": "{{assetName}} isiyofichwa", - "notification.buy.network": "Buying on {{network}}", - "notification.copied.address": "Anwani imenakiliwa", - "notification.copied.calldata": "Data ya simu imenakiliwa", - "notification.copied.contractAddress": "Anwani ya mkataba imenakiliwa", - "notification.copied.failed": "Imeshindwa kunakili kwenye ubao wa kunakili", - "notification.copied.image": "Picha imenakiliwa", - "notification.copied.linkUrl": "Link copied", - "notification.copied.nftUrl": "URL ya NFT imenakiliwa", - "notification.copied.poolId": "Pool ID copied", - "notification.copied.tokenUrl": "URL ya ishara imenakiliwa", - "notification.copied.transactionId": "Kitambulisho cha muamala kimenakiliwa", - "notification.copied.unitag": "Jina la mtumiaji limenakiliwa", - "notification.countryChange": "Imebadilishwa hadi {{countryName}}", - "notification.limit.network": "Creating limit order on {{network}}", - "notification.lp.network": "Providing liquidity on {{network}}", - "notification.network.changed": "Imebadilishwa hadi {{network}}", - "notification.passwordChanged": "Nenosiri limebadilishwa", - "notification.poolFinder.network": "Search for pool on {{network}}", - "notification.restore.success": "Wallet imerejeshwa!", - "notification.sell.network": "Selling on {{network}}", - "notification.send.network": "Inatuma kwa {{network}}", - "notification.smartWallet.disabled": "Disabled on 1 network", - "notification.smartWallet.disabled.all": "Smart wallet disabled", - "notification.smartWallet.disabled.plural": "Disabled on {{amount}} networks", - "notification.spam.NFT.failed": "Could not report NFT. Try again later.", - "notification.spam.NFT.successful": "Imearifiwa", - "notification.swap.network": "Kubadilishana kwa {{network}}", - "notification.swap.pending.swap": "Badili inasubiri", - "notification.swap.pending.unwrap": "Inasubiri kufunguliwa", - "notification.swap.pending.wrap": "Funga inasubiri", - "notification.transaction.approve.canceled": "Imeghairiwa {{currencySymbol}} pitisha.", - "notification.transaction.approve.fail": "Imeshindwa kuidhinisha {{currencySymbol}} kwa matumizi na {{address}}.", - "notification.transaction.approve.success": "Imeidhinishwa {{currencySymbol}} kwa matumizi na {{address}}.", - "notification.transaction.pending": "Muamala unasubiri", - "notification.transaction.swap.canceled": "Imeghairiwa {{inputCurrencySymbol}}-{{outputCurrencySymbol}} kubadilishana.", - "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} kwa {{outputCurrencyAmountWithSymbol}} ubadilishaji umekwisha.", - "notification.transaction.swap.fail": "Imeshindwa kubadilisha {{inputCurrencyAmountWithSymbol}} kwa {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.swap.success": "Imebadilishwa {{inputCurrencyAmountWithSymbol}} kwa {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.transfer.canceled": "Imeghairiwa {{tokenNameOrAddress}} tuma", - "notification.transaction.transfer.fail": "Imeshindwa kutuma {{tokenNameOrAddress}} kwa {{walletNameOrAddress}}", - "notification.transaction.transfer.received": "Imepokelewa {{tokenNameOrAddress}} kutoka {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "Imetumwa {{tokenNameOrAddress}} kwa {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "Imeshindwa kufanya kazi na {{addressOrEnsName}}", - "notification.transaction.unknown.fail.short": "Muamala haukufaulu", - "notification.transaction.unknown.success.full": "Imeshughulikiwa na {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "Muamala umethibitishwa", - "notification.transaction.unwrap.canceled": "Imeghairiwa {{inputCurrencySymbol}} fungua.", - "notification.transaction.unwrap.fail": "Imeshindwa kufunua {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.unwrap.success": "Imefunuliwa {{inputCurrencyAmountWithSymbol}} na kupokelewa {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.canceled": "Imeghairiwa {{inputCurrencySymbol}} wrap.", - "notification.transaction.wrap.fail": "Imeshindwa kufunga {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.success": "Imefungwa {{inputCurrencyAmountWithSymbol}} na kupokelewa {{outputCurrencyAmountWithSymbol}}.", - "notification.transfer.pending": "Tuma inasubiri", - "notification.walletConnect.confirmed": "Muamala umethibitishwa na {{dappName}}", - "notification.walletConnect.connected": "Imeunganishwa", - "notification.walletConnect.disconnected": "Imetenganishwa", - "notification.walletConnect.failed": "Muamala umeshindwa na {{dappName}}", - "notification.walletConnect.networkChanged.full": "Imebadilishwa hadi {{networkName}}", - "notification.walletConnect.networkChanged.short": "Mitandao iliyobadilishwa", - "notifications.scantastic.subtitle": "Endelea kwenye Kiendelezi cha Uniswap", - "notifications.scantastic.title": "Mafanikio!", - "onboarding.backup.manual.banner": "Tunapendekeza kuandika hii kwenye kipande cha karatasi na kuihifadhi mahali salama, kama vile kwenye sanduku la ulinzi.", - "onboarding.backup.manual.displayWarning.description": "Soma yafuatayo kwa makini kabla ya kuendelea.", - "onboarding.backup.manual.displayWarning.note.access": "Fungu hili la urejeshi hukupa ufikiaji kamili wa pochi na pesa zako", - "onboarding.backup.manual.displayWarning.note.secure": "Tazama hii kwa faragha na usiishiriki na mtu yeyote", - "onboarding.backup.manual.displayWarning.note.storage": "Andika na uiweke mahali salama", - "onboarding.backup.manual.displayWarning.title": "Vitu muhimu vya kujua", - "onboarding.backup.manual.error": "Neno batili au lililoandikwa vibaya", - "onboarding.backup.manual.placeholder": "Neno la siri", - "onboarding.backup.manual.progress": "{{completedStepsCount}}/{{totalStepsCount}} imekamilika", - "onboarding.backup.manual.selectedWordPlaceholder": "Chagua neno", - "onboarding.backup.manual.subtitle_one": "{{count}}neno gani katika kifungu chako cha maneno cha kurejesha akaunti?", - "onboarding.backup.manual.subtitle_two": "{{count}}neno gani katika maneno yako ya urejeshi?", - "onboarding.backup.manual.subtitle_few": "Neno {{count}}rd ni lipi katika kifungu chako cha maneno cha kurejesha akaunti?", - "onboarding.backup.manual.subtitle_other": "{{count}}neno gani katika kifungu chako cha maneno cha kurejesha akaunti?", - "onboarding.backup.manual.title": "Hebu tuhakikishe kuwa umeirekodi kwa usahihi", - "onboarding.backup.option.badge.quick": "Haraka", - "onboarding.backup.option.cloud.description": "Hifadhi nakala ya mkoba wako kupitia {{cloudProviderName}}, inalindwa na nenosiri la urejeshi.", - "onboarding.backup.option.cloud.title": "Weka nenosiri la urejeshi", - "onboarding.backup.option.manual.description": "Rekodi maneno yako 12 ya siri kwenye kipande cha karatasi na uyahifadhi mahali salama.", - "onboarding.backup.option.manual.title": "Andika kifungu chako cha urejeshi", - "onboarding.backup.reminder.backupNowButton": "Back up now", - "onboarding.backup.reminder.remindMeLaterButton": "Remind me later", - "onboarding.backup.reminder.title": "Hifadhi nakala ya pochi yako", - "onboarding.backup.reminder.warning.description": "Back up your wallet so you can recover your assets if you ever lose your phone or get a new one.", - "onboarding.backup.reminder.warning.fundsLabel": "Funds at risk", - "onboarding.backup.reminder.warning.title": "Unaweza kupoteza fedha zako", - "onboarding.backup.speedBump.cloud.description": "Ukisahau, hatuwezi kuchukua tena. Andika mahali salama au ihifadhi kifungoni salama na meneja wa nenosiri.", - "onboarding.backup.speedBump.cloud.disclaimer": "Ninaelewa kuwa Uniswap Labs haiwezi kuweka upya nenosiri langu la urejeshi.", - "onboarding.backup.speedBump.cloud.title": "Ni muhimu kuhifadhi nenosiri hili", - "onboarding.backup.speedBump.manual.description": "Hakikisha umeandika vifungu vyako vya urejeshi kwa usahihi na una mahali salama pa kuvihifadhi.", - "onboarding.backup.speedBump.manual.disclaimer": "Ninaelewa kuwa Uniswap Labs haiwezi kurejesha mkoba wangu kama nitapoteza hili.", - "onboarding.backup.speedBump.manual.title": "Kabla hujamaliza...", - "onboarding.backup.subtitle": "Hivi ndivyo utavyorejesha mkoba wako ikiwa utafuta app au kupoteza kifaa chako.", - "onboarding.backup.title.existing": "Hifadhi nakala ya pochi yako", - "onboarding.backup.title.new": "Chagua mbinu yako ya kuhifadhi nakala", - "onboarding.backup.view.subtitle.message1": "Soma yafuatayo kwa makini kabla ya kuendelea", - "onboarding.backup.view.subtitle.message2": "Utahitaji kuingiza maneno haya yote 12 ya siri ili kurejesha pochi yako.", - "onboarding.backup.view.title": "Andika kifungu chako cha urejeshi", - "onboarding.backup.view.warning.message1": "Fungu hili la urejeshi hukupa ufikiaji kamili wa pochi na pesa zako", - "onboarding.backup.view.warning.message2": "Andika na uiweke mahali salama", - "onboarding.backup.view.warning.message3": "Tazama hii kwa faragha na usiishiriki na mtu yeyote", - "onboarding.cloud.confirm.description": "Utahitaji kuingia hii ili kurejesha fedha zako. Ukisahau, hatuwezi kuchukua tena.", - "onboarding.cloud.confirm.title": "Thibitisha nenosiri lako la urejeshi", - "onboarding.cloud.createPassword.description": "Utahitaji kuingia hii ili kurejesha fedha zako. Ukisahau, hatuwezi kuchukua tena.", - "onboarding.cloud.createPassword.title": "Unda nenosiri lako la urejeshi", - "onboarding.complete.button": "Fungua Kiendelezi cha Uniswap", - "onboarding.complete.description": "Pochi yako iko tayari kutuma na kupokea crypto. Fungua Kiendelezi cha Uniswap kwa njia ya mkato iliyo hapa chini.", - "onboarding.complete.go_to_uniswap": "Nenda kwa Uniswap Web App", - "onboarding.complete.pin.description": "Bofya ikoni ya kipini ili kuongeza Kiendelezi cha Uniswap kwenye upau wako wa vidhibiti.", - "onboarding.complete.pin.title": "Bandika Kiendelezi cha Uniswap", - "onboarding.complete.title": "Uko tayari", - "onboarding.extension.biometrics.subtitle.fingerprint": "Access your wallet quickly and securely using just your fingerprint.", - "onboarding.extension.biometrics.title": "Washa {{biometricsMethod}}", - "onboarding.extension.password.subtitle": "Utahitaji hii ili kufungua pochi yako na kufikia maneno yako ya kurejesha akaunti", - "onboarding.extension.password.title.default": "Unda nenosiri", - "onboarding.extension.password.title.reset": "Weka upya nenosiri lako", - "onboarding.extension.unsupported.android.description": "Kiendelezi cha Uniswap kinaweza kutumika tu na Chrome kwenye eneo-kazi.", - "onboarding.extension.unsupported.android.title": "Chrome kwenye simu ya mkononi haitumiki (bado)", - "onboarding.extension.unsupported.description": "Kiendelezi cha Uniswap kinaweza kutumika tu na Chrome hivi sasa.", - "onboarding.extension.unsupported.title": "Kivinjari hiki hakitumiki (bado)", - "onboarding.home.intro.backup.description.extension": "Save your recovery phrase to ensure you never lose access to your wallet.", - "onboarding.home.intro.backup.description.mobile": "Set up a recovery plan if you ever lose your phone or get a new one.", - "onboarding.home.intro.backup.title": "Hifadhi nakala ya pochi yako", - "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK, and JUP — now available on Unichain", - "onboarding.home.intro.bridgedAssets.title": "Trade new tokens on Unichain", - "onboarding.home.intro.fund.description": "Weka pesa kwa mkoba wako kwa kununua crypto au kuhamisha kutoka akaunti nyingine.", - "onboarding.home.intro.fund.title": "Pata tokeni yako ya kwanza", - "onboarding.home.intro.label.required": "Inahitajika", - "onboarding.home.intro.label.swipe": "Telezesha kidole", - "onboarding.home.intro.pushNotifications.description": "Get price alerts on your favorite tokens, market trends, and more.", - "onboarding.home.intro.pushNotifications.title": "Stay in the know", - "onboarding.home.intro.unitag.description": "Unda wasifu wa web3 uliobinafsishwa na ushiriki kwa urahisi anwani yako na marafiki.", - "onboarding.home.intro.unitag.title": "Dai jina lako la mtumiaji {{unitagDomain}}", - "onboarding.import.error.invalidWords_one": "Neno 1 ni batili au limeandikwa vibaya", - "onboarding.import.error.invalidWords_other": "{{count}} maneno ni batili au yameandikwa vibaya", - "onboarding.import.method.restore.message.android": "Add wallets you’ve backed up to your Google Drive account.", - "onboarding.import.method.restore.message.ios": "Add wallets you’ve backed up to your iCloud account.", - "onboarding.import.method.restore.title": "Rejesha mkoba", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.android": "Input your recovery password to restore your wallet via Google Drive backup.", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.ios": "Input your recovery password to restore your wallet via iCloud backup.", - "onboarding.import.method.restoreSeedPhrase.cloud.title.android": "Rejesha kutoka Hifadhi ya Google", - "onboarding.import.method.restoreSeedPhrase.cloud.title.ios": "Rejesha kutoka iCloud", - "onboarding.import.method.restoreSeedPhrase.title": "Select how to restore your wallet", - "onboarding.import.method.restoreSeedPhrase.wallet.desc": "Input your 12 secret words that you previously stored in a safe place.", - "onboarding.import.method.restoreSeedPhrase.wallet.title": "Enter recovery phrase", - "onboarding.import.method.viewPrivateKeys.button.desc": "View your private key", - "onboarding.import.method.viewPrivateKeys.title": "Don’t have any of the above? ", - "onboarding.import.onDeviceRecovery.other_options": "Unda au leta pochi tofauti", - "onboarding.import.onDeviceRecovery.other_options.label": "Je, hutaki yoyote kati ya hayo hapo juu?", - "onboarding.import.onDeviceRecovery.subtitle": "Chagua ni mkoba gani unataka kuingia tena.", - "onboarding.import.onDeviceRecovery.title": "Karibu tena kwa Uniswap", - "onboarding.import.onDeviceRecovery.wallet.button": "Tazama maneno ya kurejesha", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 pochi nyingine", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} pochi zingine", - "onboarding.import.onDeviceRecovery.warning.caption": "Please ensure you have backed up all of the other wallets. If you ever want to restore them, you’ll need their recovery phrases or corresponding {{cloudProvider}} backups.", - "onboarding.import.onDeviceRecovery.warning.title": "Una uhakika?", - "onboarding.import.selectMethod.errorMessage": "An unexpected error occurred. Please try again.", - "onboarding.import.selectMethod.mobileApp.subtitle": "Import a wallet from the mobile app via QR code.", - "onboarding.import.selectMethod.mobileApp.title": "Use Uniswap Mobile", - "onboarding.import.selectMethod.passkey.subtitle": "Sync your Uniswap wallet using an existing passkey.", - "onboarding.import.selectMethod.passkey.title": "Log in with passkey", - "onboarding.import.selectMethod.recoveryPhrase.subtitle": "Import from another crypto wallet.", - "onboarding.import.selectMethod.recoveryPhrase.title": "Enter recovery phrase", - "onboarding.import.selectMethod.title": "Log in or import a wallet", - "onboarding.import.title": "Chagua jinsi ungependa kuongeza pochi yako", - "onboarding.importMnemonic.button.default": "Maneno yangu ya kurejesha ni maneno 12", - "onboarding.importMnemonic.button.importing": "Inaleta...", - "onboarding.importMnemonic.button.longPhrase": "Maneno yangu ya kurejesha ni marefu", - "onboarding.importMnemonic.error.invalidPhrase": "Maneno uliyoweka si sahihi", - "onboarding.importMnemonic.subtitle": "Andika au ubandike kifungu chako cha maneno 12 cha uokoaji", - "onboarding.importMnemonic.title": "Weka maneno yako ya kurejesha akaunti", - "onboarding.importPasskey.bringWindowToFront": "Bring window to front", - "onboarding.importPasskey.continueInSecureWindow": "Continue in the secure sign-in window.", - "onboarding.intro.button.alreadyHave": "Tayari nina pochi", - "onboarding.intro.button.logInOrImport": "Log in or import", - "onboarding.intro.mobileScan.button": "Changanua msimbo wa QR ili kuleta", - "onboarding.intro.mobileScan.title": "Je, una programu ya Uniswap?", - "onboarding.landing.button.add": "Ongeza pochi iliyopo", - "onboarding.landing.button.create": "Unda mkoba", - "onboarding.landing.button.createAccount": "Create an account", - "onboarding.name.choose": "Choose a username", - "onboarding.name.choose.subtitle": "This is a public name anyone can use to send you crypto.", - "onboarding.notification.permission.message": "Ili kupokea arifa, washa arifa za Uniswap Wallet katika mipangilio ya kifaa chako.", - "onboarding.notification.permission.title": "Ruhusa ya arifa", - "onboarding.notification.subtitle": "Stay updated on transaction statuses and major price changes for favorite tokens.", - "onboarding.notification.title": "Turn on notifications", - "onboarding.passkey.create": "Create your passkey", - "onboarding.passkey.loading.subtitle": "This should take just a sec.", - "onboarding.passkey.loading.title": "Finding your wallet...", - "onboarding.passkey.secure": "Secure your account", - "onboarding.passkey.secure.description": "Passkeys allow you to quickly and securely access your account using just your face or fingerprint.", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "Hebu tuhakikishe umeelewa. Kama ukikosea au kupoteza haya maandishi, hutaweza kurejesha fedha zako.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "Kama ukikosea au kupoteza haya maandishi, hutaweza kurejesha fedha zako.", - "onboarding.recoveryPhrase.confirm.title": "Hebu tuhakikishe umeelewa", - "onboarding.recoveryPhrase.view.subtitle": "Utahitaji kuingiza maneno haya yote 12 ya siri ili kurejesha pochi yako.", - "onboarding.recoveryPhrase.view.title": "Andika kifungu chako cha urejeshi", - "onboarding.recoveryPhrase.view.title.hasPassword": "Ikiwa utasahau nenosiri lako...", - "onboarding.recoveryPhrase.warning.final.button": "Niko tayari", - "onboarding.recoveryPhrase.warning.final.message": "Maneno yako ya kurejesha akaunti ndiyo yanayokupa wewe (na mtu yeyote aliye nayo) ufikiaji wa pesa zako. Hakikisha kuiweka kwako mwenyewe.", - "onboarding.recoveryPhrase.warning.final.title": "Fanya hatua hii mahali pa faragha", - "onboarding.recoveryPhrase.warning.screenshot.message": "Mtu yeyote anayepata ufikiaji wa picha zako anaweza kufikia pochi yako. Tunapendekeza uandike maneno yako badala yake.", - "onboarding.recoveryPhrase.warning.screenshot.title": "Picha za skrini si salama", - "onboarding.resetPassword.complete.safety": "Pata maelezo zaidi kuhusu usalama wa pochi", - "onboarding.resetPassword.complete.subtitle": "Tumia nenosiri lako jipya kufungua pochi yako.", - "onboarding.resetPassword.complete.title": "Weka upya nenosiri", - "onboarding.scan.error": "There was an error loading the QR code", - "onboarding.scan.otp.error": "Nambari ya kuthibitisha uliyotuma si sahihi, au kulikuwa na hitilafu katika kuwasilisha. Tafadhali jaribu tena.", - "onboarding.scan.otp.failed": "Majaribio yaliyoshindikana: {{number}}", - "onboarding.scan.otp.subtitle": "Angalia programu yako ya simu ya Uniswap ili upate msimbo wa herufi 6", - "onboarding.scan.otp.title": "Weka msimbo wa mara moja", - "onboarding.scan.subtitle": "Changanua msimbo wa QR ukitumia programu ya simu ya Uniswap ili uanze kuleta pochi yako.", - "onboarding.scan.title": "Ingiza pochi kutoka kwa programu", - "onboarding.scan.troubleScanning.message": "Import via recovery phrase", - "onboarding.scan.troubleScanning.title": "Trouble scanning?", - "onboarding.scan.wifi": "Unganisha simu yako kwenye mtandao wa WiFi sawa na kompyuta yako.", - "onboarding.security.alert.biometrics.message.android": "To use biometrics, set it up first in settings", - "onboarding.security.alert.biometrics.message.ios": "Ili kutumia {{biometricsMethod}}, ruhusu ufikiaji katika mipangilio ya mfumo", - "onboarding.security.alert.biometrics.title.android": "Biometriska imezimwa", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} imezimwa", - "onboarding.security.button.confirm.android": "Washa kibayometriki", - "onboarding.security.button.confirm.ios": "Washa {{biometricsMethod}}", - "onboarding.security.button.setup": "Sanidi", - "onboarding.security.subtitle.android": "Ongeza safu ya ziada ya usalama kwa kuhitaji bayometriki ili kutuma miamala.", - "onboarding.security.subtitle.ios": "Ongeza safu ya ziada ya usalama kwa kuhitaji {{biometricsMethod}} kutuma miamala.", - "onboarding.security.title": "Linda mkoba wako", - "onboarding.selectWallets.error": "Haikuweza kupakia anwani", - "onboarding.selectWallets.title.default": "Chagua pochi za kuingiza", - "onboarding.selectWallets.title.error": "Hitilafu katika kuleta pochi", - "onboarding.termsOfService": "Kwa kuendelea, ninakubali Sheria na Masharti na kukubali Sera ya Faragha", - "onboarding.tooltip.recoveryPhrase.trigger": "Neno la kurejesha ni nini?", - "onboarding.wallet.continue": "Tuiweke salama", - "onboarding.wallet.defaultName": "Wallet {{number}}", - "onboarding.wallet.description.full": "Hii ni nafasi yako ya kibinafsi ya tokeni, NFTs, na biashara zako zote. Maliza kuisanidi ili kuweka pesa zako salama.", - "onboarding.wallet.title": "Karibu kwenye pochi yako mpya", - "onboarding.welcome.subtitle": "Let’s finish setting up your wallet.", - "onboarding.welcome.title": "Welcome!", - "outageBanner.message": "{{chainName}}{{versionDescription}} data is unavailable right now, but we expect the issue to be resolved shortly.", - "outageBanner.message.sub": "Bado unaweza kubadilishana na kutoa ukwasi kwenye msururu huu bila suala.", - "outageBanner.title": "{{versionName}} itarudi hivi karibuni", - "passkeys.help.modal.subtitle": "If you’re having trouble with passkeys, visit Uniswap Support for help.", - "passkeys.help.modal.subtitle.invalidPasskey": "Your request could not be completed. Please try again using a passkey associated with ", - "passkeys.help.modal.subtitle.technicalError": "Your request could not be completed due to an unexpected technical error. Your funds are safe. Please try again.", - "passkeys.help.modal.title": "Je, unahitaji usaidizi?", - "passkeys.help.modal.title.invalidPasskey": "Invalid passkey", - "passkeys.help.modal.title.technicalError": "Technical error", - "passkeys.manage.modal.subtitle": "To add or remove passkeys, please sign in to {{passkeyManagementUrl}}.", - "passkeys.manage.modal.title": "Manage passkeys", - "permit.approval.fail": "Uidhinishaji wa kibali umeshindwa", - "permit.approval.fail.message": "Permit2 inaruhusu uidhinishaji wa tokeni kushirikiwa na kudhibitiwa katika programu mbalimbali.", - "pool.activeRange": "Safu inayotumika ya tiki", - "pool.addAs": "Add as {{nativeWrappedSymbol}}", - "pool.apr": "APR", - "pool.apr.base": "Base APR", - "pool.apr.description": "Kwa mwaka ikilinganishwa na ada ya siku moja", - "pool.apr.reward": "Reward APR", - "pool.aprText": "Pool APR", - "pool.balances": "Mizani ya bwawa", - "pool.closedCTA.description": "You can see them by using the filter at the top of the page.", - "pool.closedCTA.title": "Looking for your closed positions?", - "pool.collectAs": "Kusanya kama {{nativeWrappedSymbol}}", - "pool.collectFees": "Kusanya ada", - "pool.connectEthereumToView": "Connect an Ethereum wallet to view your pools", - "pool.create": "Kuunda bwawa jipya", - "pool.create.info": "Chaguo zako zitaunda bwawa jipya la ukwasi ambalo linaweza kusababisha ukwasi wa awali kuwa chini na kuongezeka kwa kuyumba. Fikiria kuongeza kwenye bwawa lililopo ili kupunguza hatari hizi.", - "pool.createdPosition": "Created position", - "pool.createdPosition.canceled": "Create position canceled", - "pool.createdPosition.failed": "Create position failed", - "pool.dynamic": "Dynamic pool", - "pool.earnings": "Earnings", - "pool.earnings.empty": "You have no earnings yet", - "pool.explorers": "Wachunguzi", - "pool.import": "Bwawa la kuagiza", - "pool.import.link.description": "Some v2 positions aren’t displayed automatically.", - "pool.import.positions.v2": "Import V2 positions", - "pool.import.positions.v2.selectPair.description": "Some v2 positions aren’t displayed automatically. Select a token pair to import and view your positions.", - "pool.import.success": "Pool imported", - "pool.incentives.administeredRewards": "Rewards are distributed by the autonomous Merkl Distributor contract.", - "pool.incentives.collect": "Kusanya", - "pool.incentives.collectedRewards": "Collected rewards", - "pool.incentives.collectFailed": "Collect failed, please try again.", - "pool.incentives.collectFailedNoRetry": "Collecting rewards failed.", - "pool.incentives.collectingRewards": "Collecting rewards", - "pool.incentives.collectRewards": "Collect rewards", - "pool.incentives.collectRewardsCanceled": "Collect rewards canceled", - "pool.incentives.daysLeft": "days left", - "pool.incentives.eligible": "Eligible pools have token rewards so you can earn more", - "pool.incentives.merklDocs": "Calculated by Merkl from emission rewards and pool TVL.", - "pool.incentives.rewardsDistribution": "Rewards distribution", - "pool.incentives.rewardsEarned": "Rewards earned", - "pool.incentives.similarPoolHasRewards": "A similar pool has UNI rewards", - "pool.incentives.switchPools": "Switch pools", - "pool.incentives.timePeriod": "Time period", - "pool.incentives.uni.findMore": "Find pools with UNI rewards", - "pool.incentives.yourRewards.error": "Your rewards are unavailable right now", - "pool.incentives.yourRewards.error.description": "Rewards couldn’t be retrieved. This might be due to a network issue. Try reloading the page.", - "pool.info": "Pool info", - "pool.limitFluctuation.warning": "Tafadhali fahamu kuwa utekelezaji wa vikomo unaweza kutofautiana kulingana na mabadiliko ya wakati halisi ya soko na msongamano wa mtandao wa Ethereum. Vikomo huenda visitekelezwe haswa wakati tokeni zinafikia bei iliyobainishwa.", - "pool.liquidity.data.error.message": "There was an error fetching data required for your transaction.", - "pool.liquidity.outOfSync": "Pool and market price mismatch", - "pool.liquidity.outOfSync.message": "The prices in this pool differ with the market prices of the selected tokens. Adjust your price range accordingly or wait for the pool to rebalance to avoid losses.", - "pool.maxPrice": "Bei ya juu", - "pool.migrateLiquidity": "Hamisha ukwasi", - "pool.migrateLiquidityDisabledTooltip": "This chain does not support v4 liquidity pools.", - "pool.migrateToV4": "Migrate to v4", - "pool.minPrice": "Bei ndogo", - "pool.newPosition.plus": "+ Nafasi mpya", - "pool.newPosition.title": "Nafasi mpya", - "pool.newSpecificPosition": "Nafasi mpya ya {{symbol}}", - "pool.notAvailableOnSolana": "Pools aren’t available on Solana", - "pool.notFound.description": "Sorry, we can’t find any information for this pool. Check the name and address and try again.", - "pool.notFound.title": "Pool not found", - "pool.openToStart.evmAndSolanaConnected": "Open a new position or create a pool to get started. Pools aren’t available on Solana.", - "pool.openToStart.evmOnly": "Fungua nafasi mpya au uunde bwawa ili kuanza.", - "pool.percent": "{{pct}}% bwawa", - "pool.pooled": "Imeunganishwa {{sym}}:", - "pool.position": "Nafasi", - "pool.positions": "Vyeo", - "pool.positions.title": "Nafasi zako", - "pool.positions.transaction.settings": "Transaction settings", - "pool.positions.usdValueUnavailable": "USD value unavailable", - "pool.positions.usdValueUnavailable.tooltip": "USD value is currently unavailable for this position. See position details for deposited token amounts.", - "pool.refresh.prices": "Refresh prices", - "pool.removeLiquidity": "Ondoa ukwasi", - "pool.rewardAPR": "Reward APR (UNI)", - "pool.rewardAPR.percent": "{{pct}} reward APR", - "pool.rewards": "Rewards", - "pool.rewardsPool.label": "Ishara za bwawa katika bwawa la zawadi:", - "pool.selectPair": "Chagua jozi", - "pool.share.label": "Sehemu yako ya bwawa:", - "pool.specificPosition": "Nafasi ya {{symbol}}", - "pool.tokenPair": "Jozi ya tokeni", - "pool.top.rewards": "Pools with rewards", - "pool.top.tvl": "Top pools by TVL", - "pool.top.volume": "Pools by 24H volume", - "pool.totalAPR": "Total APR", - "pool.totalTokens": "Jumla ya tokeni zako za bwawa:", - "pool.v2": "v2 mabwawa", - "pool.v3": "v3 mabwawa", - "pool.via": "{{tokenPair}} via {{dex}}", - "pool.volOverTvl": "1D vol/TVL", - "pool.volume.thirtyDay": "30 day volume", - "pool.volume.thirtyDay.short": "30D vol", - "pool.withdrawAs": "Withdraw as {{nativeWrappedSymbol}}", - "poolFinder.availablePools": "Available pools", - "poolFinder.availablePools.found.description": "v2 pools matching your pair selection.", - "poolFinder.availablePools.notFound.description": "No matching v2 pools found. Double-check your token selection and ensure you’re connected to the correct wallet.", - "pools.explore": "Gundua mabwawa", - "portfolio.activity.filters.timePeriod.all": "Muda wote", - "portfolio.activity.filters.transactionType.all": "All types", - "portfolio.activity.filters.transactionType.deposits": "Deposits", - "portfolio.activity.filters.transactionType.staking": "Staking", - "portfolio.activity.filters.transactionType.swaps": "Swaps", - "portfolio.activity.title": "Shughuli", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", - "portfolio.defi.title": "DeFi", - "portfolio.description": "Track your crypto portfolio across all chains and protocols", - "portfolio.nfts.title": "NFTs", - "portfolio.overview.title": "Overview", - "portfolio.title": "Portfolio", - "portfolio.tokens.table.column.allocation": "Allocation", - "portfolio.tokens.table.column.balance": "Mizani", - "portfolio.tokens.table.column.change1d": "1D Change", - "portfolio.tokens.table.column.price": "Bei", - "portfolio.tokens.table.column.token": "Ishara", - "portfolio.tokens.table.column.value": "Value", - "portfolio.tokens.title": "Ishara", - "position.addHook": "Ongeza Hook", - "position.addHook.tooltip": "Viunganishi ni kipengele kilichoendelezwa kinacho wezesha mabwawa kufanya kazi na mikataba ya kielektroniki, kufungua uwezo mbalimbali. Chukua tahadhari wakati wa kuongeza viunganishi, kwani vingine vinaweza kuwa hatari au kusababisha madhara yasiyotarajiwa.", - "position.addingHook": "Adding hook", - "position.addingHook.disclaimer": "Adding hooks may have unintended consequences. Do your research and proceed at your own risk.", - "position.addingHook.hideProperties": "Hide properties", - "position.addingHook.invalidAddress": "Enter a valid hook address", - "position.addingHook.viewProperties": "View properties", - "position.create.confirm": "Confirm position", - "position.create.invalidPrice": "Invalid price", - "position.create.invalidRange": "Invalid range", - "position.create.modal.header": "Kuunda nafasi", - "position.create.unsupportedSolana": "Solana pools are not supported.", - "position.create.unsupportedSolana.description": "To create a pool, switch to a supported EVM chain.", - "position.create.unsupportedToken.description": "Try creating with a different protocol version.", - "position.create.v2unsupportedChain": "This chain is not supported for v2 pools.", - "position.currentValue": "Thamani ya sasa ya nafasi", - "position.default_price_strategies": "Price strategies", - "position.default_price_strategies.error": "Unable to set price strategy", - "position.deposit.confirm.create.description.less": "The initial price entered is {{value}}% less than the market price and may result in a loss of funds. Do you wish to proceed?", - "position.deposit.confirm.create.description.more": "The initial price entered is {{value}}% more than the market price and may result in a loss of funds. Do you wish to proceed?", - "position.deposit.confirm.create.title": "Large price difference with market", - "position.deposit.description": "Taja kiasi cha tokeni kwa mchango wako wa uliyoweka.", - "position.depositedCurrency": "Imewekwa {{currencySymbol}}", - "position.fot.warning": "{{token}} and other “Fee on transfer” tokens are only supported by Uniswap v2.", - "position.fot.warning.cta": "Create a v2 position", - "position.hook.disclaimer": "I understand the potential risks involved in adding this hook.", - "position.hook.donateWarning": "This flag may result in changes to fees earned.", - "position.hook.liquidityWarning": "This flag can cause the pool to block the addition of new liquidity. Your transaction may revert.", - "position.hook.removeWarning": "May cause your funds to be locked or block you from collecting fees.", - "position.hook.swapWarning": "This flag may allow liquidity providers to more easily leverage Just-In-Time liquidity, which may result in lower fees earned.", - "position.hook.warningHeader": "Important: hook risks identified", - "position.hook.warningInfo": "We’ve identified potential risks with this hook. Please make sure that you understand how this hook works before deciding to proceed.", - "position.increase.fot": "Adding liquidity for {{token}} and other “Fee on Transfer” tokens is not supported.", - "position.initialPrice": "Bei ya awali", - "position.initialPrice.difference.negative": "{{ value }}% less than market price", - "position.initialPrice.difference.positive": "{{ value }}% more than market price", - "position.initialPrice.info": "When creating a new pool, you must set the starting exchange rate for both tokens. This rate will reflect the initial market price.", - "position.initialPrice.set": "Set initial price", - "position.initialPrice.useMarketPrice": "Use market price", - "position.migrate.liquidity": "Unapohamisha nafasi, huwezi kubadilisha jozi ya tokeni yako, lakini unaweza kuongeza kiunganishi ili kuboresha utendaji.", - "position.migrate.v4unsupportedChain": "This chain is not supported for v4 pools.", - "position.new": "Nafasi mpya", - "position.new.protocol": "Nafasi mpya ya {{protocol}}", - "position.notFound": "Nafasi haikupatikana", - "position.notFound.description": "Maelezo kuhusu nafasi hii hayapatikani. Tafadhali hakikisha umeunganishwa na mkoba sahihi.", - "position.one_sided_lower": "One-sided lower", - "position.one_sided_lower.description": "Supply liquidity if price goes down", - "position.one_sided_upper": "One-sided upper", - "position.one_sided_upper.description": "Supply liquidity if price goes up", - "position.protocol": "Nafasi ya {{protocol}}", - "position.provide.liquidity": "Chagua tokeni unazotaka kutoa kwa uliyoweka. Unaweza kuchagua tokeni katika mitandao yote inayoungwa mkono.", - "position.provide.liquidityDescription": "Kutoa uwekaji kamili wa uliyoweka kunahakikisha kushiriki kwenye soko kwa bei zote zinazowezekana, kutoa urahisi lakini kwa uwezekano wa hasara ya muda mfupi.", - "position.provide.liquidityDescription.creatingPool": "Setting full range liquidity when creating a pool ensures continuous market participation across all possible prices, offering simplicity but with potential for higher impermanent loss.", - "position.provide.liquidityDescription.custom": "Custom range allows you to concentrate your liquidity within specific price bounds, enhancing capital efficiency and fee earnings but requiring more active management.", - "position.provide.outOfRange.closePosition": "Close position", - "position.provide.outOfRange.description": "This position’s range cannot be adjusted during migration. To set a new range, close this position and open a new v4 position.", - "position.provide.outOfRange.title": "You’re migrating an out-of range position", - "position.removeHook": "Remove hook", - "position.resetDescription": "Your tokens, price, and range selections will be reset.", - "position.setRange": "Weka anuwai ya bei", - "position.setRange.inputsBelow": "Use the inputs below to set your range.", - "position.stable": "Stable", - "position.stable.description": "Good for stablecoins or low volatility pairs", - "position.step.deposit": "Weka kiasi cha amana", - "position.step.price": "Set initial price and deposit amounts", - "position.step.range": "Set price range and deposit amounts", - "position.step.select": "Chagua jozi ya tokeni na ada", - "position.value": "Position value", - "position.valueUnavailable": "USD value is currently unavailable for this position. See position details for deposited token amounts.", - "position.wide": "Wide", - "position.wide.description": "Good for volatile pairs", - "position.wrapped.unwrap": "Unwrap {{wrappedToken}}", - "position.wrapped.warning": "{{nativeToken}} required for v4 pools", - "position.wrapped.warning.info": "Unwrap your {{wrappedToken}} and deposit {{nativeToken}} to provide more cost effective and efficient liquidity.", - "positions.noPositions.description": "You don’t have any liquidity positions. Create a new position to start earning fees and rewards on eligible pools.", - "positions.noPositions.title": "No positions", - "positions.welcome.connect.description": "To view your positions and rewards you must connect your wallet.", - "positions.welcome.connect.wallet": "Connect your wallet", - "privacy.anonymizedLogs": "Programu huweka takwimu za matumizi bila utambulisho ili kuboreshwa kadri muda unavyopita.", - "privacy.autoRouter": "Programu hutafuta njia bora zaidi ya biashara kutoka kwa seva ya Uniswap Labs.", - "privacy.infura": "Programu huchota data ya mtandaoni na kuunda simu za mkataba kwa kutumia API ya Infura.", - "privacy.thirdPartyApis": "Programu hii hutumia API za wahusika wengine zifuatazo:", - "privacy.trm": "Programu hukusanya kwa usalama anwani ya mkoba wako na kuishiriki na TRM Labs Inc. kwa sababu za hatari na kufuata.", - "privacy.uniswaptos": "Sheria na Masharti ya Uniswap Labs", - "privateKeys.export.modal.speedbump.bullet1": "Tazama hii kwa faragha", - "privateKeys.export.modal.speedbump.bullet2": "Usishiriki na mtu yeyote", - "privateKeys.export.modal.speedbump.bullet3": "Usiwahi kuiingiza kwenye tovuti au programu zozote", - "privateKeys.export.modal.speedbump.subtitle": "Anyone who knows your private key can access your wallet and funds.", - "privateKeys.export.modal.speedbump.title": "Kabla ya kuendelea", - "privateKeys.export.modal.subtitle": "It looks like you’re not able to fully restore your wallet. To make sure you never lose access to your funds, copy your private key.", - "privateKeys.export.modal.title": "Export your private key", - "privateKeys.export.modal.warning": "If you lose your phone or delete the app, you’ll need to import this key into a different wallet.", - "privateKeys.view.button.continue": "I copied all of them.", - "privateKeys.view.button.continue.single": "I copied it.", - "privateKeys.view.subtitle": "Your private key grants access to a specific wallet. Each wallet has a different private key.", - "privateKeys.view.title": "Private Key", - "qrScanner.button.connections_one": "Programu 1 imeunganishwa", - "qrScanner.button.connections_other": "{{count}} programu zimeunganishwa", - "qrScanner.error.camera.message": "Ili kuchanganua msimbo, ruhusu ufikiaji wa Kamera katika mipangilio ya mfumo", - "qrScanner.error.camera.title": "Kamera imezimwa", - "qrScanner.error.none": "Hakuna msimbo wa QR uliopatikana", - "qrScanner.recipient.action.scan": "Changanua msimbo wa QR", - "qrScanner.recipient.action.show": "Onyesha msimbo wangu wa QR", - "qrScanner.recipient.error.message": "Hakikisha kuwa unachanganua msimbo sahihi wa anwani ya Ethereum kabla ya kujaribu tena.", - "qrScanner.recipient.error.title": "Msimbo wa QR si Sahihi", - "qrScanner.request.message.unavailable": "Hakuna ujumbe uliopatikana.", - "qrScanner.request.method.default": "Ombi kutoka {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "Ombi la saini kutoka {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "Ombi la muamala kutoka {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "Ruhusu {{dappName}} kutumia hadi {{amount}} {{currencySymbol}}?", - "qrScanner.request.withoutAmount": "Ruhusu {{dappName}} kutumia {{currencySymbol}}yako?", - "qrScanner.status.connecting": "Inaunganisha...", - "qrScanner.status.loading": "Inapakia...", - "qrScanner.title": "Changanua msimbo wa QR", - "qrScanner.wallet.networks": "Supported networks", - "range.outOfView": "Range out of view", - "removeLiquidity.pooled": "Imeunganishwa {{symbol}}:", - "revoke.failed.message": "A network or connection issue likely caused your revoke to fail. Check your connection and try again.", - "routing.aggregateLiquidity": "Inapopatikana, hujumlisha vyanzo vya ukwasi kwa bei bora na ubadilishaji usio na gesi.", - "routing.aggregateLiquidity.uniswapx": "UniswapX aggregates liquidity sources on and off-chain, bringing you the best available prices and gas free swaps.", - "routing.cheapest": "Mteja wa Uniswap huchagua chaguo la biashara la bei rahisi zaidi la kuweka alama na gharama za mtandao.", - "routing.cheapest.v4": "The Uniswap client selects the optimal trade option factoring in price and network costs.", - "scantastic.code.expired": "Muda wake umeisha", - "scantastic.code.subtitle": "Ingiza msimbo huu katika Kiendelezi cha Uniswap. Maneno yako ya kurejesha akaunti yatasimbwa kwa njia fiche na kuhamishwa kwa usalama.", - "scantastic.code.timeRemaining.shorthand.hours": "Msimbo mpya katika {{hours}}h {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.minutes": "Msimbo mpya katika {{minutes}}m {{seconds}}s", - "scantastic.code.timeRemaining.shorthand.seconds": "Msimbo mpya katika {{seconds}}s", - "scantastic.code.title": "Uniswap msimbo wa mara moja", - "scantastic.confirmation.button.continue": "Ndiyo, endelea", - "scantastic.confirmation.label.browser": "Kivinjari", - "scantastic.confirmation.label.device": "Kifaa", - "scantastic.confirmation.subtitle": "Endelea tu ikiwa unachanganua msimbo wa QR kutoka Kiendelezi cha Uniswap kwenye kifaa unachokiamini.", - "scantastic.confirmation.title": "Je, unajaribu kuleta mkoba wako?", - "scantastic.confirmation.warning": "Jihadhari na tovuti na programu zinazoiga Uniswap. Vinginevyo mkoba wako unaweza kuathirika.", - "scantastic.error.encryption": "Imeshindwa kuandaa maneno ya mbegu.", - "scantastic.error.noCode": "Hakuna OTP iliyopokelewa. Tafadhali jaribu tena.", - "scantastic.error.timeout.message": "Changanua tena msimbo wa QR kwenye Kiendelezi cha Uniswap ili kuendelea kusawazisha pochi yako.", - "scantastic.error.timeout.title": "Muda wa muunganisho wako umekwisha", - "scantastic.modal.ipMismatch.description": "Ili kuchanganua msimbo huu wa QR, simu yako lazima iunganishwe kwenye mtandao wa WiFi sawa na kompyuta yako na VPN zozote zinapaswa kuzimwa kwa muda.", - "scantastic.modal.ipMismatch.title": "Badili mtandao wako wa WiFi", - "search.input.placeholder": "Search tokens and pools", - "search.ukDisclaimer": "Kanusho kwa wakazi wa Uingereza", - "send.button.review": "Kagua uhamishaji", - "send.gas.error.title": "Haipatikani", - "send.gas.networkCost.title": "Gharama ya mtandao", - "send.input.token.balance.title": "Mizani: {{balance}} {{symbol}}", - "send.recipient.header": "Chagua mpokeaji", - "send.recipient.input.placeholder": "Tafuta ENS au anwani", - "send.recipient.previous_one": "Uhamisho 1 uliopita", - "send.recipient.previous_other": "{{count}} uhamisho uliopita", - "send.recipient.results.empty": "Hakuna matokeo yaliyopatikana", - "send.recipient.results.error": "Anwani uliyoandika haipo au imeandikwa vibaya.", - "send.recipient.section.favorite": "Pochi zinazopendwa", - "send.recipient.section.recent": "Hivi karibuni", - "send.recipient.section.search": "Matokeo ya utafutaji", - "send.recipient.section.viewOnly": "Pochi za kutazama tu", - "send.recipient.section.yours": "Pochi zako", - "send.recipient.warning.viewOnly.message": "Tuma pesa kwa mkoba huu ikiwa una kifungu cha maneno cha kurejesha akaunti au unamfahamu mmiliki wa pochi.", - "send.recipient.warning.viewOnly.title": "Una hii kama pochi ya kutazama pekee", - "send.recipientSelect.search.empty.message": "Unapotuma tokeni kwenye anwani ya pochi, zitaonekana hapa", - "send.recipientSelect.search.empty.title": "Hakuna pochi zilizohifadhiwa", - "send.review.modal.title": "Unatuma", - "send.review.summary.button.title": "Thibitisha kutuma", - "send.search.empty.subtitle": "Anwani uliyoandika haipo au imeandikwa vibaya.", - "send.search.empty.title": "Hakuna matokeo yaliyopatikana", - "send.search.placeholder": "Tafuta ENS au anwani", - "send.solanaSendNotSupported": "Send is not supported on Solana", - "send.title": "Tuma", - "send.unavailableOnSolana.message": "Sending is not available on Solana wallets", - "send.warning.blocked.default": "Mkoba huu umezuiwa", - "send.warning.blocked.modal.message": "Anwani hii imezuiwa kwenye Uniswap Wallet kwa sababu inahusishwa na shughuli moja au zaidi zilizozuiwa. Iwapo unaamini kuwa hili ni kosa, tafadhali tuma barua pepe kwa compliance@uniswap.org.", - "send.warning.blocked.modal.title": "Anwani iliyozuiwa", - "send.warning.blocked.recipient": "Pochi ya mpokeaji imezuiwa", - "send.warning.erc20.checkbox.description": "You are attempting to send funds to a token address. This may result in a permanent loss of funds.", - "send.warning.erc20.checkbox.heading": "Token address detected", - "send.warning.erc20.message": "Unajaribu kutuma pesa kwa anwani ya tokeni. Kutuma crypto kwa aina hii ya anwani kunaweza kusababisha upotevu wa kudumu wa pesa.", - "send.warning.erc20.title": "Hii ni anwani ya ishara", - "send.warning.insufficientFunds.message": "Salio lako {{currencySymbol}} limepungua tangu ulipoweka kiasi ambacho ungependa kutuma", - "send.warning.insufficientFunds.title": "Haitoshi {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "Haitoshi {{currencySymbol}} on {{networkName}} kutuma", - "send.warning.insufficientGas.message.withoutNetwork": "Haitoshi {{currencySymbol}} kutuma", - "send.warning.modal.button.cta.blocking": "sawa", - "send.warning.modal.button.cta.cancel": "Ghairi", - "send.warning.modal.button.cta.confirm": "Thibitisha", - "send.warning.newAddress.details.ENS": "ENS", - "send.warning.newAddress.details.username": "Jina la mtumiaji", - "send.warning.newAddress.details.walletAddress": "Anwani ya Wallet", - "send.warning.newAddress.message": "Hujafanya muamala na anwani hii hapo awali. Tafadhali thibitisha kuwa anwani ni sahihi kabla ya kuendelea.", - "send.warning.newAddress.title": "Anwani mpya", - "send.warning.self.message": "Unajaribu kutuma pesa kwenye pochi yako ya sasa. Kutuma crypto kwa anwani hii kutaingiza gharama zisizo za lazima za mtandao.", - "send.warning.self.title": "Hii ndio pochi yako ya sasa", - "send.warning.smartContract.message": "You’re about to send funds to a smart contract address. Make sure this is the correct address and that it can receive tokens. If not, this may result in a permanent loss of funds.", - "send.warning.smartContract.title": "This is a smart contract address", - "send.warning.viewOnly.message": "Unahitaji kuleta pochi hii kupitia maneno ya kurejesha akaunti ili kutuma mali.", - "send.warning.viewOnly.title": "Mkoba huu ni wa kutazama tu", - "send.youAreSending": "Unatuma", - "sendRecipientForm.recentAddresses.label": "Hivi karibuni", - "sendReviewModal.title": "Kagua kutuma", - "setting.recoveryPhrase.account.show": "Onyesha maneno ya kurejesha akaunti", - "setting.recoveryPhrase.action.hide": "Ficha maneno ya kurejesha", - "setting.recoveryPhrase.remove": "Ondoa maneno ya kurejesha", - "setting.recoveryPhrase.remove.confirm.subtitle": "Ninaelewa kuwa Uniswap Labs haiwezi kunisaidia kurejesha pochi yangu ikiwa ningekosa kufanya hivyo.", - "setting.recoveryPhrase.remove.confirm.title": "Nilihifadhi kifungu changu cha kurejesha", - "setting.recoveryPhrase.remove.initial.subtitle": "Hakikisha kuwa umehifadhi maneno yako ya kurejesha akaunti. Utapoteza ufikiaji wa pochi zako vinginevyo", - "setting.recoveryPhrase.remove.initial.title": "Kabla ya kuendelea", - "setting.recoveryPhrase.remove.subtitle": "Weka nenosiri lako ili kuthibitisha", - "setting.recoveryPhrase.remove.title": "Unaondoa kishazi chako cha ahueni", - "setting.recoveryPhrase.view.warning.message1": "Mtu yeyote anayejua maneno yako ya kurejesha akaunti anaweza kufikia pochi na pesa zako", - "setting.recoveryPhrase.view.warning.message2": "Tazama hii kwa faragha", - "setting.recoveryPhrase.view.warning.message3": "Usishiriki na mtu yeyote", - "setting.recoveryPhrase.view.warning.message4": "Usiwahi kuiingiza kwenye tovuti au programu zozote", - "setting.recoveryPhrase.view.warning.title": "Kabla ya kuendelea", - "setting.recoveryPhrase.warning.view.message": "Mtu yeyote anayejua maneno yako ya kurejesha akaunti anaweza kufikia pochi na pesa zako.", - "setting.recoveryPhrase.warning.view.title": "Tazama hii mahali pa faragha", - "settings.action.enableInSettings": "Enable in Settings", - "settings.action.feedback": "Tuma maoni", - "settings.action.help": "Pata msaada", - "settings.action.lock": "Funga mkoba", - "settings.action.privacy": "Sera ya faragha", - "settings.action.terms": "Masharti ya huduma", - "settings.connectWalletPlatform.warning": "To use Uniswap on {{platform}}, connect to a wallet that supports {{platform}}.", - "settings.footer": "Imetengenezwa kwa upendo, \nTimu ya Uniswap 🦄", - "settings.hideSmallBalances": "Ficha mizani ndogo", - "settings.hideSmallBalances.subtitle": "Balances under 1 USD will be hidden from your portfolio.", - "settings.maxSlippage": "Max. kuteleza", - "settings.maxSlippage.amount": "{{amount}} max. slippage", - "settings.section.about": "Kuhusu", - "settings.section.preferences": "Mapendeleo", - "settings.section.privacyAndSecurity": "Privacy and security", - "settings.section.support": "Msaada", - "settings.section.wallet.hidden.row.title": "{{numHidden}} other wallets", - "settings.setting.advanced.title": "Advanced", - "settings.setting.advancedSettings": "Advanced settings", - "settings.setting.appearance.option.auto": "Otomatiki", - "settings.setting.appearance.option.dark.subtitle": "Always use dark theme.", - "settings.setting.appearance.option.dark.title": "Dark", - "settings.setting.appearance.option.device.subtitle": "Adapts to your device’s settings.", - "settings.setting.appearance.option.device.title": "Otomatiki", - "settings.setting.appearance.option.light.subtitle": "Always use light theme.", - "settings.setting.appearance.option.light.title": "Light", - "settings.setting.appearance.title": "Mandhari", - "settings.setting.backup.create.description": "Kuweka nenosiri kutasimba nakala rudufu ya maneno yako ya urejeshaji kwa njia fiche, na kuongeza kiwango cha ziada cha ulinzi ikiwa akaunti yako {{cloudProviderName}} itawahi kuathirika.", - "settings.setting.backup.create.title": "Hifadhi nakala hadi {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "Kwa sababu pochi hizi hushiriki kifungu cha urejeshi, pia itafuta hifadhi rudufu za pochi hizi hapa chini", - "settings.setting.backup.delete.confirm.title": "Una uhakika?", - "settings.setting.backup.delete.warning": "Ukifuta hifadhi rudufu yako ya {{cloudProviderName}} , utaweza tu kurejesha pochi yako kwa kutumia nakala rudufu ya maneno yako ya kurejesha akaunti. Maabara ya Uniswap haiwezi kurejesha vipengee vyako ukipoteza maneno yako ya kurejesha akaunti.", - "settings.setting.backup.error.message.full": "Imeshindwa kuhifadhi kifungu cha urejeshi kwa {{cloudProviderName}}. Tafadhali hakikisha umewasha {{cloudProviderName}} na nafasi inayopatikana ya kuhifadhi na ujaribu tena.", - "settings.setting.backup.error.message.short": "Imeshindwa kufuta nakala rudufu", - "settings.setting.backup.error.title": "{{cloudProviderName}} kosa", - "settings.setting.backup.modal.description": "Bado hujacheleza kifungu chako cha maneno cha urejeshi {{cloudProviderName}} . Kwa kufanya hivyo, unaweza kurejesha pochi yako kwa kuingia tu {{cloudProviderName}} kwenye kifaa chochote.", - "settings.setting.backup.modal.title": "Je, ungependa kuhifadhi nakala ya maneno ya kurejesha akaunti hadi {{cloudProviderName}}?", - "settings.setting.backup.password.error.mismatch": "Manenosiri hayalingani", - "settings.setting.backup.password.medium": "Hili ni nenosiri la wastani", - "settings.setting.backup.password.placeholder.confirm": "Thibitisha nenosiri", - "settings.setting.backup.password.placeholder.create": "Unda nenosiri", - "settings.setting.backup.password.strong": "Hili ni nenosiri kali", - "settings.setting.backup.password.weak": "Hili ni nenosiri dhaifu", - "settings.setting.backup.recoveryPhrase.label": "Maneno ya kurejesha", - "settings.setting.backup.selected": "{{cloudProviderName}} chelezo", - "settings.setting.backup.status.action.delete": "Futa chelezo", - "settings.setting.backup.status.complete": "Imechelezwa hadi {{cloudProviderName}}", - "settings.setting.backup.status.description": "Kwa kuwa na nakala ya maneno yako ya kurejesha akaunti hadi {{cloudProviderName}}, unaweza kurejesha pochi yako kwa kuingia kwenye akaunti yako ya {{cloudProviderName}} kwenye kifaa chochote.", - "settings.setting.backup.status.inProgress": "Inahifadhi nakala hadi {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "Imechelezwa", - "settings.setting.backup.status.title": "{{cloudProviderName}} chelezo", - "settings.setting.beta.tooltip": "Inakuja hivi karibuni", - "settings.setting.biometrics.appAccess.subtitle.android": "Require face/fingerprint to open the app.", - "settings.setting.biometrics.appAccess.subtitle.ios": "Require {{biometricsMethod}} to open app.", - "settings.setting.biometrics.appAccess.title": "Ufikiaji wa programu", - "settings.setting.biometrics.auth": "Tafadhali thibitisha", - "settings.setting.biometrics.extension.waitingForBiometricsModal.content": "Enable {{biometricsMethod}} in your browser or system settings to continue.", - "settings.setting.biometrics.extension.waitingForBiometricsModal.title": "Waiting for {{biometricsMethod}}", - "settings.setting.biometrics.off.message.android": "Biometriska kwa sasa imezimwa kwa Uniswap Wallet—unaweza kuiwasha katika mipangilio ya mfumo wako.", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} kwa sasa imezimwa kwa Uniswap Wallet—unaweza kuiwasha katika mipangilio ya mfumo wako.", - "settings.setting.biometrics.off.title.android": "Biometriska imezimwa", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} imezimwa", - "settings.setting.biometrics.title": "Face/Fingerprint unlock", - "settings.setting.biometrics.transactions.subtitle.android": "Require face/fingerprint to transact.", - "settings.setting.biometrics.transactions.subtitle.ios": "Require {{biometricsMethod}} to transact.", - "settings.setting.biometrics.transactions.title": "Shughuli", - "settings.setting.biometrics.unavailable.message.android": "Biometriska haijasanidiwa kwenye kifaa chako. Ili kutumia bayometriki, isanidi kwanza kwenye Mipangilio.", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} haijasanidiwa kwenye kifaa chako. Ili kutumia {{biometricsMethod}}, isanidi kwanza katika Mipangilio.", - "settings.setting.biometrics.unavailable.title.android": "Biometriska haijawekwa", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} haijasanidiwa", - "settings.setting.biometrics.warning.message.android": "Usipowasha bayometriki, mtu yeyote anayepata ufikiaji wa kifaa chako anaweza kufungua Uniswap Wallet na kufanya miamala.", - "settings.setting.biometrics.warning.message.ios": "Usipowasha {{biometricsMethod}}, mtu yeyote anayepata ufikiaji wa kifaa chako anaweza kufungua Uniswap Wallet na kufanya miamala.", - "settings.setting.biometrics.warning.title": "Una uhakika?", - "settings.setting.connections.disconnectAll": "Tenganisha zote", - "settings.setting.connections.noConnectionsDescription": "Unganisha na app kwa kutafuta kitufe cha \"Unganisha Wallet\" au \"Ingia\".", - "settings.setting.currency.title": "Sarafu ya nyumbani", - "settings.setting.deviceAccess.reset.title": "Reset your {{biometricsMethod}}", - "settings.setting.deviceAccess.title": "Device access", - "settings.setting.deviceAccessTimeout.1hour": "1 hr", - "settings.setting.deviceAccessTimeout.24hours": "24 hr", - "settings.setting.deviceAccessTimeout.30minutes": "30 min", - "settings.setting.deviceAccessTimeout.5minutes": "5 min", - "settings.setting.deviceAccessTimeout.never": "Never", - "settings.setting.deviceAccessTimeout.title": "Auto-lock timeout", - "settings.setting.hapticTouch.title": "Mguso wa haptic", - "settings.setting.helpCenter.title": "Kituo cha usaidizi", - "settings.setting.language.button.navigate": "Nenda kwa mipangilio", - "settings.setting.language.description.extension": "Uniswap chaguomsingi kwa mipangilio ya lugha ya mfumo wako. Ili kubadilisha lugha unayopendelea, nenda kwenye mipangilio ya mfumo wako.", - "settings.setting.language.description.mobile": "Uniswap defaults to your device’s language settings. To change your preferred language, go to “Uniswap” in your device settings and tap on “Language”.", - "settings.setting.language.title": "Lugha", - "settings.setting.notifications.row.activity.description": "Transfers, requests, and other activity", - "settings.setting.notifications.row.activity.title": "Wallet activity", - "settings.setting.notifications.row.updates.description": "Recommendations and new features", - "settings.setting.notifications.row.updates.title": "Updates from Uniswap", - "settings.setting.notifications.title": "Arifa", - "settings.setting.password.change.title": "Create a new password", - "settings.setting.password.title": "Badilisha neno la siri", - "settings.setting.permissions.title": "Permissions", - "settings.setting.privacy.analytics.description": "Tunatumia data ya matumizi bila kukutambulisha ili kuboresha matumizi yako kwenye bidhaa za Uniswap Labs. Inapozimwa, tunafuatilia tu makosa na matumizi muhimu.", - "settings.setting.privacy.analytics.title": "App analytics", - "settings.setting.privateKeys.title": "Private keys", - "settings.setting.recoveryPhrase.title": "Maneno ya kurejesha", - "settings.setting.smallBalances.title": "Portfolio balance", - "settings.setting.smartWallet.action.enable": "Wezesha", - "settings.setting.smartWallet.action.smartWallet": "Smart wallet", - "settings.setting.smartWallet.notEligible": "Not eligible", - "settings.setting.smartWallet.status.actionRequired": "Action required", - "settings.setting.smartWallet.status.active": "Inayotumika", - "settings.setting.smartWallet.status.inactive": "Inactive", - "settings.setting.smartWallet.status.unavailable": "Haipatikani", - "settings.setting.unknownTokens.subtitle": "Potential scam tokens will be hidden from your portfolio.", - "settings.setting.unknownTokens.title": "Ficha tokeni zisizojulikana", - "settings.setting.wallet.action.editLabel": "Badilisha lebo", - "settings.setting.wallet.action.editProfile": "Hariri wasifu", - "settings.setting.wallet.action.remove": "Ondoa mkoba", - "settings.setting.wallet.connection.banner.description": "Manage connections via wallet settings, by clicking your profile image.", - "settings.setting.wallet.connection.banner.title": "Connections have moved", - "settings.setting.wallet.connections.title": "Connections", - "settings.setting.wallet.editLabel.description": "Lebo sio za umma. Zimehifadhiwa ndani na zinaonekana kwako pekee.", - "settings.setting.wallet.editLabel.save": "Hifadhi mabadiliko", - "settings.setting.wallet.label": "Jina la utani", - "settings.setting.wallet.testnetMode.description": "Hii inawasha mitandao ya majaribio kwa ajili ya watengenezaji kujaribu vipengele na miamala bila kutumia mali halisi. Tokeni kwenye mitandao ya majaribio haina thamani halisi.", - "settings.setting.wallet.testnetMode.title": "Hali ya testnet", - "settings.switchNetwork.warning": "Ili kutumia Uniswap kwenye {{label}}, badilisha mtandao katika mipangilio ya mkoba wako.", - "settings.title": "Mipangilio", - "settings.version": "Toleo {{appVersion}}", - "smartWallet.actionRequired.cta": "Disable on 1 network", - "smartWallet.actionRequired.cta.plural": "Disable on {{amount}} networks", - "smartWallet.actionRequired.description": "Disabling smart wallet is an onchain action that requires a small network cost.", - "smartWallet.actionRequired.insufficientFunds": "Hela hazitoshi", - "smartWallet.actionRequired.reactivate": "Keep using smart wallet", - "smartWallet.actionRequired.title": "Smart wallet is active on 1 network", - "smartWallet.actionRequired.title.plural": "Smart wallet is active on {{amount}} networks", - "smartWallet.activeNetworks.title": "Smart wallet is active on 1 network", - "smartWallet.activeNetworks.title.plural": "Smart wallet is active on {{amount}} networks", - "smartWallet.banner.networkCost": "Includes a one-time cost to activate your smart wallet on {{chainName}}.", - "smartWallet.banner.text": "Enable smart wallet to save up to 50% on network costs.", - "smartWallet.confirmDisableSmartWallet.description": "You’ll miss out on faster swaps, discounted network costs, and other upcoming improvements.", - "smartWallet.confirmDisableSmartWallet.title": "Una uhakika?", - "smartWallet.insufficient.description": "Smart wallet cannot be disabled on these networks until you have funds to cover network costs.", - "smartWallet.insufficient.title": "Insufficient funds on 1 network", - "smartWallet.insufficient.title.plural": "Insufficient funds on {{amount}} networks", - "smartWallet.InsufficientFunds.button.continue.text": "Continue anyway", - "smartWallet.insufficientFunds.network.banner.description": "Cannot disable due to insufficient funds.", - "smartWallet.insufficientFunds.network.banner.title_one": "{{count}} network excluded", - "smartWallet.insufficientFunds.network.banner.title_other": "{{count}} network excluded", - "smartWallet.insufficientFunds.network.disable.text": "Ready to disable", - "smartWallet.insufficientFunds.network.text": "You need {{nativeCurrency}}", - "smartWallet.insufficientFunds.single.network.banner.title": "{{chain}} excluded", - "smartWallet.modal.description.block1": "Smart wallets use smart contracts for faster, lower-cost transactions.", - "smartWallet.modal.description.block2": "Wallets already using smart wallet features from another app will not be affected.", - "smartWallet.modal.title": "Smart Wallet", - "smartWallets": "Smart Wallets", - "smartWallets.activeNetworks.description": "Your smart wallet is automatically activated across each new network you swap on.", - "smartWallets.createdModal.description": "You’re getting faster transactions and lower network costs on every swap.", - "smartWallets.createdModal.title": "Smart wallet created", - "smartWallets.delegation.limitedSupport": "Your wallet has limited support", - "smartWallets.delegationMismatchModal.description": "{{walletName}} doesn’t support the latest Ethereum standards used by {{displayName}}, so some features are unavailable.", - "smartWallets.delegationMismatchModal.features.1ClickSwaps": "1-click swaps", - "smartWallets.delegationMismatchModal.features.gasFreeSwaps": "Gas-free swaps", - "smartWallets.delegationMismatchModal.features.limitOrders": "Limit orders", - "smartWallets.delegationMismatchModal.limitOrders.unsupported": "Limit orders are not supported by your wallet.", - "smartWallets.delegationMismatchModal.title": "Limited wallet support", - "smartWallets.disable.failed": "An error occurred. Smart wallet is still active on 1 or more networks. Please try again.", - "smartWallets.disable.modal.description": "This onchain action requires a network cost.", - "smartWallets.disable.modal.title": "Disable smart wallet", - "smartWallets.educationalModal.description": "Smart wallets provide faster, low-cost transactions using smart contracts.", - "smartWallets.educationalModal.info": "Wallets already using smart wallet features from another app will not be affected.", - "smartWallets.enabledModal.description": "Updates will take effect on your next swap.", - "smartWallets.enabledModal.description.dapp": "Updates will take effect on your next transaction.", - "smartWallets.enabledModal.description.dapp.line2": "Reconnect your wallet to start using smart wallet features on apps immediately.", - "smartWallets.enabledModal.title": "Smart wallet enabled", - "smartWallets.postSwapNudge.enable": "Enable smart wallet", - "smartWallets.postSwapNudge.title": "Save on your next swap", - "smartWallets.postSwapNudge.title.dapp": "This app supports smart wallets", - "smartWallets.unavailableModal.description": "A different wallet provider is now managing smart wallet settings for {{displayName}}. You can continue using Uniswap as normal.", - "smartWallets.unavailableModal.title": "Smart wallet features unavailable", - "solanaPromo.banner.description": "Trade Solana tokens directly on Uniswap.", - "solanaPromo.banner.title": "Solana is now available", - "solanaPromo.modal.connectWallet": "Connect your favorite Solana wallet", - "solanaPromo.modal.startSwapping.button": "Start swapping on Solana", - "solanaPromo.modal.swapInstantly": "Swap thousands of trending tokens instantly", - "solanaPromo.modal.viewTokenData": "View token data and prices in one place", - "speedBump.newAddress.warning.description": "Hujafanya muamala na anwani hii hapo awali. Hakikisha ni anwani sahihi kabla ya kuendelea.", - "speedBump.newAddress.warning.title": "Anwani mpya", - "speedBump.smartContractAddress.warning.description": "Unakaribia kutuma tokeni kwa aina maalum ya anwani - mkataba mzuri. Angalia mara mbili ni anwani uliyokusudia kutuma. Ikiwa si sahihi, tokeni zako zinaweza kupotea milele.", - "speedBump.smartContractAddress.warning.title": "Je, hii ni anwani ya pochi?", - "stats.24fees": "Ada ya 24H", - "stats.24swapVolume": "24H swap volume", - "stats.24volume": "Kiasi cha 24H", - "stats.allTimeSwappers": "Wabadilishaji wa wakati wote", - "stats.allTimeVolume": "Kiasi cha wakati wote", - "stats.fdv": "FDV", - "stats.fdv.description": "Uthamini uliochanganywa kikamilifu (FDV) hukokotoa jumla ya thamani ya soko ikizingatiwa kuwa tokeni zote ziko kwenye mzunguko.", - "stats.marketCap": "Kofia ya soko", - "stats.marketCap.description": "Mtaji wa soko ni jumla ya thamani ya soko ya usambazaji wa mali inayozunguka.", - "stats.noStatsAvailable": "No stats available", - "stats.tvl": "Total value locked", - "stats.tvl.description": "Total value locked (TVL) is the aggregate amount of the asset available across all Uniswap liquidity pools.", - "stats.volume.1d": "Kiasi cha siku 1", - "stats.volume.1d.description": "1 day volume is the amount of the asset that has been traded on Uniswap during the past 24 hours.", - "stats.volume.1d.long": "1D volume", - "stats.volume.1d.short": "Kiasi cha siku 1", - "stats.volume.description": "Volume is the amount of the asset that has been traded on Uniswap during the selected time frame.", - "swap.allow.oneTime": "Ruhusu {{sym}} (mara moja)", - "swap.approveAndSubmit": "Idhinisha na uwasilishe", - "swap.approveAndSwap": "Idhinisha na ubadilishane", - "swap.balance.amount": "Mizani: {{amount}}", - "swap.bestPrice.through": "Route via {{provider}}", - "swap.bestRoute.cost": "Most efficient route is estimated to cost ~{{gasPrice}} in network costs. ", - "swap.bridging.title": "Kubadilishana kwenye mitandao", - "swap.bridging.warning.description": "Unabadilisha kutoka {{fromNetwork}} kwenda {{toNetwork}}. Hii pia inajulikana kama \"kuaunganisha\", ambayo inahamisha tokeni zako kutoka mtandao mmoja hadi mwingine.", - "swap.button.confirmSignAndSwap": "Confirm sign and swap", - "swap.button.confirmSwapAnyways": "Confirm swap anyways", - "swap.button.confirmUnwrap": "Confirm unwrap", - "swap.button.max": "Upeo", - "swap.button.review": "Kagua", - "swap.button.submitting": "Inawasilisha ubadilishaji...", - "swap.button.submitting.keep.open": "Weka pochi yako wazi...", - "swap.button.submitting.passkey": "Confirm with passkey", - "swap.button.swap": "Badili", - "swap.button.swapAnyways": "Badili hata hivyo", - "swap.button.unwrap": "Fungua", - "swap.button.wrap": "Funga", - "swap.buy.countryModal.placeholder": "Tafuta kulingana na nchi au eneo", - "swap.cancel.cannotExecute_one": "Ubadilishanaji wako unaweza kutekeleza kabla ya kughairi kuchakatwa. Gharama za mtandao wako haziwezi kurejeshwa. Je, ungependa kuendelea?", - "swap.cancel.cannotExecute_other": "Ubadilishanaji wako unaweza kutekelezwa kabla ya kughairi kuchakatwa. Gharama za mtandao wako haziwezi kurejeshwa. Je, ungependa kuendelea?", - "swap.confirmApproveAndSwap": "Confirm approve and swap", - "swap.confirmLimit": "Thibitisha kikomo", - "swap.confirmSwap": "Thibitisha ubadilishaji", - "swap.confirmWrap": "Confirm wrap", - "swap.deadline.settings.title": "Swap deadline", - "swap.deadline.settings.title.short": "Tx. deadline", - "swap.details.completed": "Swap complete", - "swap.details.estimatedTime": "Est. time", - "swap.details.fasterUnichainSwaps": "Faster swaps powered by Unichain", - "swap.details.feeOnTransfer": "{{tokenSymbol}} ada", - "swap.details.feeOnTransfer.symbol": "{{tokenSymbol}} token fee", - "swap.details.instant": "Instant", - "swap.details.newQuote.input": "Ingizo mpya", - "swap.details.newQuote.output": "Toleo jipya", - "swap.details.orderRouting": "Uelekezaji wa agizo", - "swap.details.orderRoutingInfo": "Ubunifu huu umefanywa kupitia Across, itifaki ya desentralized ambayo inahamisha mali kwenye mitandao huku ikipa kipaumbele usalama, utekelezaji wa haraka, na bei za chini.", - "swap.details.poweredBy": "Inaendeshwa na", - "swap.details.rate": "Kiwango", - "swap.details.slippage": "Utelezi mkubwa zaidi", - "swap.details.slippage.uniswap": "Uniswap Protected slippage", - "swap.details.swappedIn.unichain": "Completed in {{time}}s on Unichain", - "swap.details.uniswapFee": "Ada", - "swap.error.default": "Huenda ukahitaji kuongeza uvumilivu wako wa kuteleza. Kumbuka: tokeni za ada-on-hamisha na kuweka upya hazioani na Uniswap V3.", - "swap.error.expectedToFail": "Ubadilishanaji wako unatarajiwa kutofaulu.", - "swap.error.fiatInputUnavailable": "{{fiatCurrencyCode}} input unavailable", - "swap.error.modifiedByWallet": "Ubadilishanaji wako ulirekebishwa kupitia pochi yako. Ikiwa hili lilikuwa kosa, tafadhali ghairi mara moja au ujihatarishe kupoteza pesa zako.", - "swap.error.rejected": "Muamala umekataliwa", - "swap.error.undefinedObject": "Hitilafu ilitokea wakati wa kujaribu kutekeleza ubadilishanaji huu. Huenda ukahitaji kuongeza uvumilivu wako wa kuteleza. Ikiwa hiyo haifanyi kazi, kunaweza kuwa na kutopatana na tokeni unayofanya biashara. Kumbuka: tokeni za ada-on-hamisha na kuweka upya hazioani na Uniswap V3.", - "swap.error.unknown": "Hitilafu isiyojulikana.", - "swap.error.v2.expired": "Muamala huu haukuweza kutumwa kwa sababu tarehe ya mwisho imepita. Tafadhali hakikisha kwamba tarehe ya mwisho ya muamala wako si ya chini sana.", - "swap.error.v2.k": "Tofauti ya Uniswap x*y=k haikuridhika na ubadilishaji. Kwa kawaida hii inamaanisha kuwa moja ya ishara unazobadilisha inajumuisha tabia maalum wakati wa kuhamisha.", - "swap.error.v2.slippage": "Muamala huu hautafaulu kutokana na harakati za bei au ada ya uhamisho. Jaribu kuongeza uvumilivu wako wa kuteleza", - "swap.error.v2.transferInput": "Tokeni ya ingizo haiwezi kuhamishwa. Kunaweza kuwa na tatizo na tokeni ya ingizo.", - "swap.error.v2.transferOutput": "Tokeni ya towe haiwezi kuhamishwa. Kunaweza kuwa na tatizo na tokeni ya kutoa.", - "swap.error.v3.slippage": "Muamala huu hautafaulu kutokana na harakati za bei. Jaribu kuongeza uvumilivu wako wa kuteleza. Kumbuka: ada ya uhamisho na tokeni za kuweka upya hazioani na Uniswap V3.", - "swap.error.v3.transferOutput": "Tokeni ya towe haiwezi kuhamishwa. Kunaweza kuwa na tatizo na tokeni ya kutoa. Kumbuka: ada ya uhamisho na tokeni za kuweka upya hazioani na Uniswap V3.", - "swap.estimatedDifference.label": "Kutakuwa na tofauti kubwa kati ya thamani zako za pembejeo na pato kutokana na ukwasi wa sasa.", - "swap.expected.price": "Expected price", - "swap.fail.batched": "Your connected wallet may not support 1-click swaps. Try a standard swap instead.", - "swap.fail.batched.retry": "Try standard swap", - "swap.fail.batched.title": "1-click swap failed", - "swap.fail.message": "Jaribu kurekebisha utelezi kwa thamani ya juu.", - "swap.fail.uniswapX": "Ubadilishanaji haukuweza kukamilika kwa UniswapX. Jaribu kubadilishana kwako tena ili kupitia API ya kawaida ya Uniswap.", - "swap.fees.experience": "Ada hii inatumika kwa jozi za tokeni fulani ili kuhakikisha matumizi bora na Uniswap. Inalipwa katika ishara ya kutoka na tayari imejumuishwa kwenye nukuu.", - "swap.fees.jupiter.label": "Jupiter fee", - "swap.fees.jupiter.message": "Fees on Solana are charged by the Jupiter API. Uniswap Labs does not receive these fees.", - "swap.fees.noFee": "Ada hutozwa kwa jozi za tokeni zilizochaguliwa ili kuhakikisha matumizi bora ya Uniswap. Hakuna ada inayohusishwa na ubadilishaji huu.", - "swap.finalizingQuote": "Inamalizia kunukuu...", - "swap.form.header": "Badili", - "swap.form.warning.output.fotFees": "Kwa sababu ya ada ya tokeni ya {{fotCurrencySymbol}}, kiasi cha kubadilishana kinaweza tu kuingizwa kwa kutumia sehemu ya ingizo.", - "swap.form.warning.output.fotFees.fallback": "Kutokana na ada za tokeni, kiasi cha kubadilishana kinaweza tu kuingizwa kwa kutumia sehemu ya ingizo", - "swap.form.warning.output.solana": "Exact output is not supported on Solana", - "swap.form.warning.restore": "Rejesha mkoba wako ili ubadilishane", - "swap.frontrun.warning": "Muamala wako unaweza kuwa wa mbele na kusababisha biashara isiyofaa.", - "swap.header.viewOnly": "Mtazamo pekee", - "swap.impactOfTrade": "Athari za biashara yako kwenye bei ya soko ya bwawa hili.", - "swap.impactOfTrade.uniswapx": "The difference between market price and execution price, factoring in UniswapX gas savings.", - "swap.impactOfTrade.uniswapx.missing": "Price impact calculations may be unavailable for pairs with low liquidity.", - "swap.inputEstimated.atMost": "Ingizo linakadiriwa. Utauza zaidi au muamala utarejea.", - "swap.limit": "Kikomo", - "swap.limitFilled": "Kikomo kimejaa!", - "swap.limitSubmitted": "Kikomo kimewasilishwa", - "swap.marketPrice.outsideRange.label": "Bei ya soko iko nje ya masafa uliyobainisha. Amana ya mali moja pekee.", - "swap.min.price": "Minimum price", - "swap.networkCost.paidIn": "Gharama ya mtandao hulipwa kwa {{sym}} kwenye mtandao wa {{chainName}} ili kufanya shughuli.", - "swap.orderRouting": "Uelekezaji wa agizo", - "swap.outputEstimated.atLeast": "Pato linakadiriwa. Utapokea angalau au muamala utarejeshwa.", - "swap.placeOrder": "Agiza", - "swap.priceImpact": "Athari ya bei", - "swap.request.title.full": "Badilisha {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "Badilisha Tokeni", - "swap.review": "Kagua ubadilishaji", - "swap.review.summary": "Unabadilishana", - "swap.reviewLimit": "Kagua kikomo", - "swap.route.optimizedGasCost": "This route considers split routes, multiple hops, and network costs of each step.", - "swap.routing.jupiter.description": "Jupiter aggregates liquidity from multiple sources to provide you with the best prices.", - "swap.routing.uniswapAutoRouter.description": "The Uniswap Auto Router considers optimal routes and network costs to provide you with the best prices.", - "swap.settings.deadline.tooltip": "Your transaction will revert if it is pending for more than this period of time. (Maximum: 3 days).", - "swap.settings.deadline.warning": "High deadline", - "swap.settings.oneClickSwap.title": "1-click swaps", - "swap.settings.oneClickSwap.tooltip": "Bundles standard trade actions together for faster, lower-cost swaps.", - "swap.settings.protection.description": "Ulinzi wa kubadilishana ukiwa umewashwa, miamala yako ya Ethereum italindwa dhidi ya mashambulizi ya sandwich, na uwezekano mdogo wa kushindwa.", - "swap.settings.protection.subtitle.supported": "{{chainName}} Mtandao", - "swap.settings.protection.subtitle.unavailable": "Haipatikani kwenye {{chainName}}", - "swap.settings.protection.title": "Badili Ulinzi", - "swap.settings.routingPreference.option.default.description": "Selecting this option identifies the most efficient route for your swap.", - "swap.settings.routingPreference.option.default.description.preV4": "The Uniswap client selects the cheapest trade option factoring in price and network costs.", - "swap.settings.routingPreference.option.default.description.uniswapXUnavailable": "UniswapX unavailable for your wallet", - "swap.settings.routingPreference.option.default.tooltip": "A route is identified considering v2, v3, and certain v4 pools, factoring in estimated price impact and network costs.", - "swap.settings.routingPreference.option.v2.title": "Enable v2 pools", - "swap.settings.routingPreference.option.v3.title": "Enable v3 pools", - "swap.settings.routingPreference.option.v4.hooks.title": "Enable v4 hook pools", - "swap.settings.routingPreference.option.v4.hooks.tooltip": "V4 hooks routes swaps through a set of pre-approved hooks.", - "swap.settings.routingPreference.option.v4.title": "Enable v4 pools", - "swap.settings.routingPreference.title": "Chaguzi za biashara", - "swap.settings.slippage.alert": "High slippage", - "swap.settings.slippage.control.auto": "Otomatiki", - "swap.settings.slippage.description": "Muamala wako utarejeshwa ikiwa bei itabadilika zaidi ya asilimia ya utelezi.", - "swap.settings.slippage.input.message": "Ikiwa bei itapungua zaidi, muamala wako utarejeshwa. Chini ni kiwango cha chini ambacho umehakikishiwa kupokea.", - "swap.settings.slippage.input.receive.title": "Pokea angalau", - "swap.settings.slippage.output.message": "Ikiwa bei itapungua zaidi, muamala wako utarejeshwa. Chini ni kiwango cha juu ambacho ungehitaji kutumia.", - "swap.settings.slippage.output.spend.title": "Tumia zaidi", - "swap.settings.slippage.warning": "Very high slippage", - "swap.settings.slippage.warning.description": "Slippage above 20% is likely to result in an unfavorable trade. To reduce the risk being front-run, lower your settings.", - "swap.settings.slippage.warning.hover": "This may result in an unfavorable trade. Try lowering your slippage setting.", - "swap.settings.slippage.warning.max": "Weka thamani chini ya {{maxSlippageTolerance}}", - "swap.settings.slippage.warning.message": "Kuteleza kunaweza kuwa juu kuliko inavyohitajika", - "swap.settings.slippage.warning.min": "Weka thamani kubwa kuliko 0", - "swap.settings.title": "Badilisha mipangilio", - "swap.settings.transactionRevertPrice": "Muamala wako utarejeshwa ikiwa bei itabadilika isivyofaa kwa zaidi ya asilimia hii.", - "swap.signAndSwap": "Saini na ubadilishane", - "swap.slippage.amt": "{{amt}} kuteleza", - "swap.slippage.bridging": "Hakuna kuteleza wakati wa kubadilisha kwenye mitandao", - "swap.slippage.description": "Difference between expected and executed price on a swap. Differences can occur due to low liquidity, market volatility, or bots. \n\nUniswap Protection guards against frontrunning bots and MEV.", - "swap.slippage.settings.title": "Mipangilio ya utelezi", - "swap.slippage.tooltip": "Uhamisho wa bei ya juu zaidi kabla ya muamala utarejeshwa.", - "swap.slippageBelow.warning": "Kuteleza hapa chini {{amt}} kunaweza kusababisha shughuli iliyofeli", - "swap.submitted": "Badiliko limewasilishwa", - "swap.success": "Badili mafanikio!", - "swap.tokenOwnFees": "Ishara zingine huchukua ada wakati zinunuliwa au kuuzwa, ambayo imewekwa na mtoaji wa ishara. Uniswap haipokei yoyote ya ada hizi.", - "swap.tradeRoutes": "Trade routes", - "swap.transaction.deadline": "Tarehe ya mwisho ya muamala", - "swap.transaction.revertAfter": "Muamala wako utarejeshwa ikiwa unasubiri kwa zaidi ya kipindi hiki.", - "swap.warning.enterLargerAmount.title": "Weka kiasi kikubwa zaidi", - "swap.warning.expectedFailure.increaseSlippage": "Try increasing your slippage.", - "swap.warning.expectedFailure.titleMay": "This swap may fail", - "swap.warning.insufficientBalance.title": "Huna vya kutosha {{currencySymbol}}", - "swap.warning.insufficientGas.button": "Haitoshi {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "Badilisha kwa {{ tokenSymbol }} kwenye {{networkName}}", - "swap.warning.insufficientGas.button.buy": "Nunua {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "Nunua na kadi", - "swap.warning.insufficientGas.message.withNetwork": "Haitoshi {{currencySymbol}} kwenye {{networkName}} kubadilishana", - "swap.warning.insufficientGas.message.withoutNetwork": "Haitoshi {{currencySymbol}} kubadilishana", - "swap.warning.insufficientGas.title": "Huna {{currencySymbol}} ya kutosha kulipia gharama ya mtandao", - "swap.warning.networkFee.allow": "Ruhusu {{ inputTokenSymbol }} (mara moja)", - "swap.warning.networkFee.delegation.message": "This is the cost to process your transaction and activate your smart wallet on Unichain. Uniswap Labs does not receive any share of these fees.", - "swap.warning.networkFee.highRelativeToValue": "The network cost exceeds 10% of your total transaction value. This is the cost to process your transaction on the blockchain. Uniswap does not receive any share of these fees.", - "swap.warning.networkFee.highRelativeToValue.unichain": "The network cost exceeds 10% of your total transaction value. This is the cost to process your transaction on the blockchain.", - "swap.warning.networkFee.includesDelegation": "Includes smart wallet activation", - "swap.warning.networkFee.message": "Hii ndio gharama ya kushughulikia muamala wako kwenye blockchain. Uniswap haipokei sehemu yoyote ya ada hizi.", - "swap.warning.networkFee.message.unichain": "This is the cost to process your transaction on the blockchain.", - "swap.warning.networkFee.message.uniswapX": "Hii ndio gharama ya kushughulikia muamala wako kwenye blockchain. Uniswap haipokei sehemu yoyote ya ada hizi. UniswapX hujumlisha vyanzo vya ukwasi kwa bei bora na ubadilishaji usio na gesi.", - "swap.warning.networkFee.message.uniswapX.title": "No network costs with UniswapX", - "swap.warning.networkFee.message.uniswapX.unichain": "This is the cost to process your transaction on the blockchain. UniswapX aggregates liquidity sources for better prices and gas free swaps.", - "swap.warning.noQuotesFound.bridging.message": "No bridging quotes found. Try using the official bridge at this time.", - "swap.warning.noQuotesFound.title": "No quotes found", - "swap.warning.noRoutesFound.message": "There are currently no routes available for your selected tokens. Please try a different pair or check again later.", - "swap.warning.noRoutesFound.title": "No routes available", - "swap.warning.offline.message": "Huenda umepoteza muunganisho wa intaneti au mtandao umekatika. Tafadhali angalia muunganisho wako wa intaneti na ujaribu tena.", - "swap.warning.offline.title": "Hauko mtandaoni", - "swap.warning.priceImpact.message": "Kutokana na kiasi cha {{outputCurrencySymbol}} ukwasi unaopatikana kwa sasa, kadiri {{inputCurrencySymbol}} unavyojaribu kubadilisha, ndivyo utakavyopokea kidogo {{outputCurrencySymbol}} .", - "swap.warning.priceImpact.message.veryHigh": "Muamala huu utasababisha athari ya bei ya {{priceImpactValue}} kwenye bei ya soko ya dimbwi hili na itasababisha hasara ya fedha.", - "swap.warning.priceImpact.title": "Athari ya bei ya juu ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "Athari kubwa ya bei ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "Muamala wako haukuwasilishwa kwa sababu ulifunga programu.", - "swap.warning.queuedOrder.approvalFailed": "Muamala wako haukuwasilishwa kwa sababu uidhinishaji wa tokeni umeshindwa.", - "swap.warning.queuedOrder.stale": "Muamala wako haukuwasilishwa kwa sababu ulifunga programu au uidhinishaji ulichukua muda mrefu sana.", - "swap.warning.queuedOrder.submissionFailed": "Kulikuwa na tatizo wakati wa kuwasilisha muamala wako.", - "swap.warning.queuedOrder.title": "Swap canceled", - "swap.warning.rateLimit.message": "Tafadhali jaribu tena baada ya dakika chache.", - "swap.warning.rateLimit.title": "Kiwango cha juu cha bei kimepitwa", - "swap.warning.router.message": "Huenda umepoteza muunganisho au mtandao umekatika. Tatizo likiendelea, tafadhali jaribu tena baadaye.", - "swap.warning.router.title": "Biashara hii haiwezi kukamilika kwa sasa", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} is blocked", - "swap.warning.tokenBlockedFallback.button": "Token is blocked", - "swap.warning.uniswapFee.message": "Fees are applied to ensure the best experience with Uniswap.", - "swap.warning.uniswapFee.message.default": "Ada hutumika ili kuhakikisha matumizi bora ya Uniswap. Hakuna ada inayohusishwa na ubadilishaji huu.", - "swap.warning.uniswapFee.message.included": "Ada hutumika ili kuhakikisha matumizi bora ya Uniswap, na tayari yamejumuishwa katika nukuu hii.", - "swap.warning.uniswapFee.title": "Ada ya kubadilishana", - "swap.warning.viewOnly.message": "Unahitaji kuleta pochi hii kupitia maneno ya kurejesha akaunti ili kubadilishana tokeni.", - "swap.wrap.token": "Funga {{sym}}", - "tdp.balanceSummary.otherNetworks": "Kwenye mitandao mingine", - "tdp.balanceSummary.otherNetworksBalance": "Salio kwenye mitandao mingine", - "tdp.balanceSummary.title": "Mizani yako", - "tdp.button.getToken": "Get {{ tokenSymbol }}", - "tdp.button.getTokenFallback": "Get Token", - "tdp.loading.title.default": "data ya ishara ya ", - "tdp.loading.title.withChain": "data ya ishara ya on {{chainName}}", - "tdp.nameNotFound": "Jina halijapatikana", - "tdp.noInfoAvailable": "Hakuna maelezo ya tokeni yanayopatikana", - "tdp.noTestnetSupportDescription": "Baadhi ya mitandao ya majaribio haiungi mkono kubadilisha, kutuma, au kununua tokeni.", - "tdp.symbolNotFound": "Alama haijapatikana", - "testnet.modal.swapDeepLink.description.toProdMode": "This action requires testnet mode to be disabled. Testnet mode can be reenabled at anytime within settings.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "This action requires testnet mode to be enabled. Tokens on testnets do not hold any real value. Testnet mode can be disabled at anytime within settings.", - "testnet.modal.swapDeepLink.title.toProdMode": "Disable testnet mode", - "testnet.modal.swapDeepLink.title.toTestnetMode": "Enable testnet mode", - "testnet.unsupported": "Kipengele hiki hakiungwi mkono katika hali ya testnet.", - "themeToggle.theme": "Mandhari", - "title.buySellTradeEthereum": "Nunua, uza na ufanye biashara ya Ethereum na tokeni zingine kuu kwenye Uniswap", - "title.createGovernanceOn": "Unda pendekezo jipya la utawala kwenye Uniswap", - "title.createGovernanceTo": "Unda pendekezo jipya la utawala litakalopigiwa kura na wamiliki wa UNI. Tokeni za UNI zinawakilisha hisa za kupiga kura katika utawala wa Uniswap.", - "title.earnFees": "Pata ada wengine wanapobadilishana na Uniswap kwa kuongeza tokeni kwenye hifadhi za ukwasi.", - "title.easilyRemove": "Ondoa ukwasi wako kwa urahisi kutoka Uniswap v2 na uweke kwenye Uniswap v3.", - "title.easilyRemoveV4": "Ondoa ukwasi wako kwa urahisi kutoka Uniswap v2 na v3 ili kuwekeza katika Uniswap v4.", - "title.extension.uninstall": "Extension Uninstalled", - "title.extensionPasskeyLogIn": "Log in with Passkey", - "title.managePasskeys": "Uniswap | Manage your passkeys", - "title.migratev2": "Hamisha ukwasi wa dimbwi la v2 hadi Uniswap v3", - "title.migratev3": "Hamisha ukwasi wa dimbwi kwenye Uniswap v4", - "title.placeLimit": "Weka maagizo ya kikomo kwenye Uniswap", - "title.realTime": "Bei za wakati halisi, chati, data ya muamala na zaidi.", - "title.removeLiquidityv2": "Ondoa ukwasi wa dimbwi (v2) kwenye Uniswap", - "title.removePoolLiquidity": "Ondoa ukwasi wa dimbwi kwenye Uniswap", - "title.removeTokensv2": "Ondoa tokeni zako kwenye vidimbwi vya ukwasi v2.", - "title.removev3Liquidity": "Ondoa tokeni zako kwenye vidimbwi vya ukwasi v3.", - "title.sendCrypto": "Send crypto", - "title.sendTokens": "Tuma tokeni kwenye Uniswap", - "title.swappingMadeSimple": "Instantly buy and sell crypto on Ethereum, Base, Arbitrum, Polygon, Unichain and more. The DeFi platform trusted by millions.", - "title.tradeTokens": "Biashara tokeni na kutoa ukwasi. Bei za wakati halisi, chati, data ya muamala na zaidi.", - "title.uniswapTradeCrypto": "Uniswap | Trade Crypto on DeFi’s Leading Exchange ", - "title.uniToken": "Tokeni za UNI zinawakilisha hisa za kupiga kura katika utawala wa Uniswap. Unaweza kupigia kura kila pendekezo wewe mwenyewe au ukakabidhi kura zako kwa mhusika mwingine.", - "title.voteOnGov": "Pigia kura mapendekezo ya utawala kwenye Uniswap", - "token.balances.main": "Mizani yako", - "token.balances.other": "Mizani kwenye mitandao mingine", - "token.balances.viewOnly": "{{ownerAddress}}salio", - "token.bridge": "{{label}} daraja la ishara", - "token.chart.candlestick.unavailable": "Candlestick charts are unavailable for this token", - "token.chart.tooltip": "Ada: {{amount}}", - "token.details": "Token details", - "token.error.unknown": "Tokeni isiyojulikana", - "token.fee.buy.label": "ada ya kununua", - "token.fee.label": "ada", - "token.fee.sell.label": "ada ya kuuza", - "token.links.title": "Viungo", - "token.links.twitter": "Twitter", - "token.links.website": "Tovuti", - "token.notFound.description": "Sorry, we can’t find any information for this token. Check the name and address and try again.", - "token.notFound.title": "Token not found", - "token.priceExplorer.error.description": "Hitilafu fulani imetokea.", - "token.priceExplorer.error.title": "Haikuweza kupakia chati ya bei", - "token.priceExplorer.timeRangeLabel.all": "Muda wote", - "token.priceExplorer.timeRangeLabel.day": "1S", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 Day", - "token.priceExplorer.timeRangeLabel.hour": "1Saa", - "token.priceExplorer.timeRangeLabel.month": "1Mwezi", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 Month", - "token.priceExplorer.timeRangeLabel.week": "1Wiki", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 Week", - "token.priceExplorer.timeRangeLabel.year": "1Mwaka", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 Year", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} haipatikani", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} na {{tokenSymbol1}} hazipatikani", - "token.safety.fee.detected": "Token fee detected", - "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs haipokei ada yoyote kati ya hizi.", - "token.safety.warning.alwaysDoYourResearch": "Daima fanya utafiti wako mwenyewe", - "token.safety.warning.blocked.description.default_one": "Huwezi kufanya biashara ya tokeni hii kwa kutumia Programu ya Uniswap.", - "token.safety.warning.blocked.description.default_other": "Huwezi kufanya biashara ya tokeni hizi kwa kutumia Programu ya Uniswap.", - "token.safety.warning.copyContractAddress.message": "This is a contract address, which acts as a unique identifier for tokens on the blockchain. Any crypto you send to this address will be lost.", - "token.safety.warning.copyContractAddress.title": "Do not send crypto to this address", - "token.safety.warning.dontShowWarningAgain": "Usinionyeshe onyo hili tena", - "token.safety.warning.dontShowWarningAgainShort": "Don’t show again", - "token.safety.warning.doYourOwnResearch": "Daima fanya utafiti wako mwenyewe kabla ya kuendelea.", - "token.safety.warning.feeDescription": "Charges a when {{action}}", - "token.safety.warning.flaggedAsMalicious": "Flagged as malicious", - "token.safety.warning.flaggedAsSuspicious": "Flagged as suspicious", - "token.safety.warning.fotHigh.title": "High fee detected", - "token.safety.warning.fotLow.title": "Fee detected", - "token.safety.warning.fotVeryHigh.title": "Very high fee detected", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} imewekwa alama kama isiyouzwa. Kubadilisha tokeni hii kunaweza kusababisha hasara ya fedha zako.", - "token.safety.warning.honeypot.title": "100% sell fee detected", - "token.safety.warning.impersonator": "Impersonates another token", - "token.safety.warning.impersonator.title": "Impersonator token detected", - "token.safety.warning.malicious.general.message": "{{tokenSymbol}} has been flagged as malicious by Blockaid.", - "token.safety.warning.malicious.impersonator.message": "{{tokenSymbol}} has been flagged by Blockaid for attempting to copy a different token. It may not be the token you are looking to swap.", - "token.safety.warning.malicious.impersonator.message.short": "{{tokenSymbol}} may not be the token you are looking to swap.", - "token.safety.warning.malicious.title": "Token ya uharibifu imegunduliwa", - "token.safety.warning.mayResultInLoss": "Swapping it may result in a loss of funds.", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} haiuzwi kwa masoko ya kati ya Marekani yanayoongoza.", - "token.safety.warning.notListedOnExchanges": "Not listed on leading U.S. exchanges", - "token.safety.warning.potentialHoneypot.card.message": "{{tokenSymbol}} has been flagged as suspicious by Blockaid.", - "token.safety.warning.potentialHoneypot.modal.message": "{{tokenSymbol}} has been flagged as a potential honeypot by Blockaid. Always do your own research before proceeding.", - "token.safety.warning.potentialHoneypot.title": "Potential honeypot detected", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} has been flagged as unsellable.", - "token.safety.warning.sellFee100.title": "100% sell fee detected", - "token.safety.warning.spam.message": "{{tokenSymbol}} has been flagged as spam by Blockaid.", - "token.safety.warning.spam.title": "Tokeni ya ulaghai imetambulika", - "token.safety.warning.spamsUsers": "Spams users", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} charges a {{buyFeePercent}} fee when bought and {{sellFeePercent}} when sold.", - "token.safety.warning.tokenChargesFee.buy.message": "{{tokenSymbol}} charges a {{feePercent}} fee when bought.", - "token.safety.warning.tokenChargesFee.buy.message.descriptive": "{{tokenSymbol}} charges a {{feePercent}} fee when bought. Swapping it may result in a loss of funds. Uniswap Labs does not receive any of these fees.", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} charges a {{feePercent}} fee when sold.", - "token.safety.warning.tokenChargesFee.sell.message.descriptive": "{{tokenSymbol}} charges a {{feePercent}} fee when sold. Swapping it may result in a loss of funds. Uniswap Labs does not receive any of these fees.", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} charges a fee when bought or sold.", - "token.safetyLevel.blocked.message": "Huwezi kubadilisha tokeni hii kwa kutumia Uniswap Wallet.", - "token.safetyLevel.medium.message.plural": "Tokeni hizi haziuzwi kwenye masoko ya kati ya Marekani yanayoongoza. Daima fanya utafiti wako mwenyewe kabla ya kuendelea.", - "token.selector.search.error": "Haikuweza kupakia matokeo ya utafutaji", - "token.stats.fullyDilutedValuation": "Uthamini uliopunguzwa kikamilifu", - "token.stats.marketCap": "Sura ya Soko", - "token.stats.priceHighYear": "52W juu", - "token.stats.priceLowYear": "52W Chini", - "token.stats.section.about": "Kuhusu {{token}}", - "token.stats.title": "Takwimu", - "token.stats.translation.original": "Onyesha asili", - "token.stats.translation.translate": "Tafsiri hadi {{language}}", - "token.stats.volume": "Sauti ya 24h", - "token.symbol.input.fallback": "Ingiza tokeni", - "token.symbol.output.fallback": "Tokeni ya kutoka", - "token.wrap.fail.message": "Mabadilishano kwenye Itifaki ya Uniswap yanaweza kuanza na kumalizika na ETH. Walakini, wakati wa kubadilishana, ETH imefungwa kwa WETH.", - "token.zeroNativeBalance.description.mainnet": "You’ll need to swap a token on Ethereum to get {{ tokenSymbol }}. Swapping requires ETH for network costs.", - "token.zeroNativeBalance.description.otherChains": "You’ll need to swap a token on {{ chainName }} to get {{ tokenSymbol }}. Swapping requires {{ chainName }} {{ nativeTokenSymbol }} for network costs.", - "token.zeroNativeBalance.subtitle": "{{ tokenSymbol }} is not available for direct purchase.", - "token.zeroNativeBalance.title.mainnet": "You need {{ nativeTokenName }}", - "token.zeroNativeBalance.title.otherChains": "You need {{ nativeTokenName }} on {{ chainName }}", - "tokens.action.hide": "Hide token", - "tokens.action.unhide": "Unhide token", - "tokens.nfts.action.viewOnExplorer": "Tazama kwenye {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "Haikuweza kupakia mkusanyiko wa NFT", - "tokens.nfts.collection.label.items": "Vipengee", - "tokens.nfts.collection.label.owners": "Wamiliki", - "tokens.nfts.collection.label.priceFloor": "Sakafu", - "tokens.nfts.collection.label.swapVolume": "Kiasi", - "tokens.nfts.connectEthereumToView": "Connect an Ethereum wallet to view your NFTs", - "tokens.nfts.details.contract.address": "Contract address", - "tokens.nfts.details.error.load.title": "Haikuweza kupakia maelezo ya NFT", - "tokens.nfts.details.network": "Mtandao", - "tokens.nfts.details.owner": "Inamilikiwa na", - "tokens.nfts.details.price": "Bei ya sasa", - "tokens.nfts.details.recentPrice": "Bei ya mwisho ya mauzo", - "tokens.nfts.details.traits": "Sifa", - "tokens.nfts.empty.description": "Hakuna NFT zilizopatikana", - "tokens.nfts.error.unavailable": "Maudhui hayapatikani", - "tokens.nfts.hidden.action.hide": "Ficha NFT", - "tokens.nfts.hidden.action.unhide": "Onyesha NFT", - "tokens.nfts.link.collection": "Tovuti ya mkusanyiko", - "tokens.nfts.list.error.load.title": "Haikuweza kupakia NFTs", - "tokens.nfts.list.none.button": "Pokea NFTs", - "tokens.nfts.list.none.description.default": "Hamisha NFTs kutoka kwa pochi nyingine ili kuanza.", - "tokens.nfts.list.none.description.external": "Mkoba huu unaponunua au kupokea NFTs, zitaonekana hapa.", - "tokens.nfts.list.none.title": "Bado hakuna NFTs", - "tokens.nfts.notAvailableOnSolana": "NFTs aren’t available on Solana", - "tokens.selector.button.choose": "Chagua tokeni", - "tokens.selector.empty.buy.message": "Nunua crypto na kadi au benki ili kutuma tokeni.", - "tokens.selector.empty.buy.title": "Nunua crypto", - "tokens.selector.empty.receive.title": "Pokea ishara", - "tokens.selector.empty.title": "Bado hakuna tokeni", - "tokens.selector.error.load": "Haikuweza kupakia tokeni", - "tokens.selector.search.empty": "Hakuna matokeo yaliyopatikana ya {{searchText}}", - "tokens.selector.search.placeholder": "Tafuta ishara", - "tokens.selector.section.bridging": "Badilisha kwenye mitandao tofauti", - "tokens.selector.section.favorite": "Vipendwa", - "tokens.selector.section.otherNetworksSearchResults": "Tokens found on other networks", - "tokens.selector.section.otherSearchResults": "Tokeni zingine kwenye {{network}}", - "tokens.selector.section.recent": "Utafutaji wa hivi majuzi", - "tokens.selector.section.search": "Matokeo ya utafutaji", - "tokens.selector.section.trending": "Tokens by 24H volume", - "tokens.selector.section.yours": "Ishara zako", - "tokens.table.search.placeholder.pools": "Tafuta mabwawa", - "tokens.table.search.placeholder.tokens": "Tafuta ishara", - "tokens.table.search.placeholder.transactions": "Search transactions", - "toucan.auction.bidConcentration": "Toucan concentration", - "toucan.auction.bidConcentration.tooltip.description": "Toucan tooltip description", - "toucan.auction.bidConcentration.tooltip.title": "Toucan tooltip title", - "toucan.auctions": "Auctions", - "toucan.bidForm.maxBudget": "Max budget", - "toucan.bidForm.placeBid": "Place your bid", - "toucan.displayMode.tokenPrice": "Token Price", - "toucan.displayMode.valuation": "Valuation", - "transaction.action.cancel.button": "Ghairi muamala", - "transaction.action.cancel.description": "Ukighairi muamala huu kabla haujachakatwa na mtandao, utalipa gharama mpya ya mtandao badala ya ile ya awali.", - "transaction.action.cancel.title": "Ungependa kughairi muamala huu?", - "transaction.action.clear": "Clear pending", - "transaction.action.copy": "Nakili kitambulisho cha muamala", - "transaction.action.copyProvider": "Nakili {{providerName}} kitambulisho cha muamala", - "transaction.amount.unlimited": "Bila kikomo", - "transaction.callData": "Call data", - "transaction.details.dappName": "Programu", - "transaction.details.from": "Kutoka", - "transaction.details.networkFee": "Gharama ya mtandao", - "transaction.details.networkFee.swap": "Swap network cost", - "transaction.details.providerFee": "Provider fee", - "transaction.details.swapRate": "Kiwango", - "transaction.details.transaction": "Shughuli", - "transaction.details.uniswapFee": "Ada ({{ feePercent }}%)", - "transaction.network.all": "Mitandao yote", - "transaction.networkCost.description": "The cost to process your transaction on the blockchain. Uniswap is optimized for minimal network costs.", - "transaction.networkCost.includesSmartWalletActivation": "Includes smart wallet activation", - "transaction.networkCost.label": "Gharama ya mtandao", - "transaction.networkCost.maxNativeBalance.description": "A small amount of the network token balance is reserved to cover the network cost of this transaction.", - "transaction.networkCost.maxNativeBalance.title": "Why can’t I use my max balance?", - "transaction.networkCost.veryHigh.label": "Gharama ya mtandao ya juu sana", - "transaction.notification.error.cancel": "Imeshindwa kughairi muamala", - "transaction.notification.error.replace": "Imeshindwa kubadilisha muamala", - "transaction.status.approval.canceled": "Approval canceled", - "transaction.status.approval.failed": "Uidhinishaji haukufaulu", - "transaction.status.approve.canceled": "Kuidhinisha kughairiwa", - "transaction.status.approve.canceling": "Kughairi kuidhinisha", - "transaction.status.approve.failed": "Imeshindwa kuidhinisha", - "transaction.status.approve.pending": "Kuidhinisha", - "transaction.status.approve.success": "Imeidhinishwa", - "transaction.status.approve.successDapp": "Imeidhinishwa mnamo {{externalDappName}}", - "transaction.status.buy.canceled": "Umeghairi ununuzi", - "transaction.status.buy.canceling": "Inaghairi ununuzi", - "transaction.status.buy.failed": "Imeshindwa kununua", - "transaction.status.buy.pending": "Kununua", - "transaction.status.buy.success": "Imenunuliwa", - "transaction.status.buy.successDapp": "Ilinunuliwa mnamo {{externalDappName}}", - "transaction.status.claim.canceled": "Fee collection canceled", - "transaction.status.claim.canceling": "Canceling fee collection", - "transaction.status.claim.failed": "Fee collection failed", - "transaction.status.claim.pending": "Ada za kukusanya", - "transaction.status.claim.success": "Fees collected", - "transaction.status.collect.fees.canceled": "Collect fees canceled", - "transaction.status.collect.fees.failed": "Imeshindwa kukusanya ada", - "transaction.status.collected.fees": "Ada zilizokusanywa", - "transaction.status.collecting.fees": "Ada za kukusanya", - "transaction.status.confirm.canceled": "Uthibitishaji ulioghairiwa", - "transaction.status.confirm.canceling": "Inasubiri kughairiwa", - "transaction.status.confirm.failed": "Imeshindwa kuthibitisha", - "transaction.status.confirm.pending": "Muamala unaendelea", - "transaction.status.confirm.success": "Muamala umethibitishwa", - "transaction.status.confirm.successDapp": "Muamala umethibitishwa mnamo {{externalDappName}}", - "transaction.status.createPair.canceled": "Canceled create pair", - "transaction.status.createPair.canceling": "Canceling create pair", - "transaction.status.createPair.failed": "Failed to create pair", - "transaction.status.createPair.pending": "Creating pair", - "transaction.status.createPair.success": "Created pair", - "transaction.status.createPool.canceled": "Canceled create pool", - "transaction.status.createPool.canceling": "Canceling create pool", - "transaction.status.createPool.failed": "Failed to create pool", - "transaction.status.createPool.pending": "Kujenga bwawa", - "transaction.status.createPool.success": "Bwawa lililoundwa", - "transaction.status.liquidityDecrease.canceled": "Remove liquidity canceled", - "transaction.status.liquidityDecrease.canceling": "Canceling remove liquidity", - "transaction.status.liquidityDecrease.failed": "Imeshindwa kuondoa ukwasi", - "transaction.status.liquidityDecrease.pending": "Kuondoa ukwasi", - "transaction.status.liquidityDecrease.success": "Kuondolewa kwa ukwasi", - "transaction.status.liquidityIncrease.canceled": "Add liquidity canceled", - "transaction.status.liquidityIncrease.canceling": "Canceling add liquidity", - "transaction.status.liquidityIncrease.failed": "Imeshindwa kuongeza ukwasi", - "transaction.status.liquidityIncrease.pending": "Kuongeza ukwasi", - "transaction.status.liquidityIncrease.success": "Aliongeza ukwasi", - "transaction.status.lpIncentivesClaim.canceled": "Canceled LP rewards claim", - "transaction.status.lpIncentivesClaim.canceling": "Canceling LP rewards claim", - "transaction.status.lpIncentivesClaim.failed": "Failed to claim LP rewards", - "transaction.status.lpIncentivesClaim.pending": "Claiming LP rewards", - "transaction.status.lpIncentivesClaim.success": "Claimed LP rewards", - "transaction.status.migrateLiquidity.canceled": "Migrate liquidity canceled", - "transaction.status.mint.canceled": "Minti iliyoghairiwa", - "transaction.status.mint.canceling": "Kughairi mint", - "transaction.status.mint.failed": "Imeshindwa kutengeneza", - "transaction.status.mint.pending": "Uchimbaji", - "transaction.status.mint.success": "Imeandaliwa", - "transaction.status.mint.successDapp": "Imeandikwa {{externalDappName}}", - "transaction.status.offramp.canceled": "Offramp canceled", - "transaction.status.offramp.failed": "Offramp failed", - "transaction.status.offramp.pending": "Offramping", - "transaction.status.offramp.success": "Offramped", - "transaction.status.onramp.canceled": "Onramp canceled", - "transaction.status.onramp.failed": "Onramp failed", - "transaction.status.onramp.pending": "Onramping", - "transaction.status.onramp.success": "Onramped", - "transaction.status.permit.approved": "Permit approved", - "transaction.status.permit.canceled": "Permit tx canceled", - "transaction.status.permit.failed": "Permit failed", - "transaction.status.purchase.canceled": "Umeghairi ununuzi", - "transaction.status.purchase.canceling": "Inaghairi ununuzi", - "transaction.status.purchase.failed": "Purchase failed", - "transaction.status.purchase.failedOn": "Imeshindwa kununua mnamo {{serviceProvider}}", - "transaction.status.purchase.pending": "Ununuzi", - "transaction.status.purchase.pendingOn": "Ununuzi kwenye {{serviceProvider}}", - "transaction.status.purchase.successOn": "Imenunuliwa kwa {{serviceProvider}}", - "transaction.status.receive.canceled": "Imeghairiwa kupokea", - "transaction.status.receive.canceling": "Inaghairi kupokea", - "transaction.status.receive.failed": "Imeshindwa kupokea", - "transaction.status.receive.failedFrom": "Imeshindwa kupokea kutoka {{serviceProvider}}", - "transaction.status.receive.pending": "Kupokea", - "transaction.status.receive.pendingFrom": "Inapokea kutoka {{serviceProvider}}", - "transaction.status.receive.success": "Imepokelewa", - "transaction.status.receive.successDapp": "Imepokelewa mnamo {{externalDappName}}", - "transaction.status.receive.successFrom": "Imepokelewa kutoka {{serviceProvider}}", - "transaction.status.removeDelegation.canceled": "Remove delegation canceled", - "transaction.status.removeDelegation.failed": "Remove delegation failed", - "transaction.status.removeDelegation.pending": "Removing delegation", - "transaction.status.removeDelegation.success": "Removed delegation", - "transaction.status.revoke.canceled": "Umeghairi ubatilishaji", - "transaction.status.revoke.canceling": "Kughairi kubatilisha", - "transaction.status.revoke.failed": "Imeshindwa kubatilisha", - "transaction.status.revoke.pending": "Kubatilisha", - "transaction.status.revoke.success": "Imebatilishwa", - "transaction.status.revoke.successDapp": "Imebatilishwa kwenye {{externalDappName}}", - "transaction.status.sale.canceled": "Canceled sale", - "transaction.status.sale.canceling": "Canceling sale", - "transaction.status.sale.failedOn": "Sale Failed via {{serviceProvider}}", - "transaction.status.sale.pendingCard.msg": "Learn more about selling crypto.", - "transaction.status.sale.pendingCard.title": "Why is my sale still pending?", - "transaction.status.sale.pendingOn": "Selling via {{serviceProvider}}", - "transaction.status.sale.successOn": "Sold via {{serviceProvider}}", - "transaction.status.sell.canceled": "Imeghairiwa kuuza", - "transaction.status.sell.canceling": "Kughairi kuuza", - "transaction.status.sell.failed": "Imeshindwa kuuza", - "transaction.status.sell.pending": "Kuuza", - "transaction.status.sell.success": "Inauzwa", - "transaction.status.sell.successDapp": "Inauzwa kwa {{externalDappName}}", - "transaction.status.send.canceled": "Umeghairi kutuma", - "transaction.status.send.canceling": "Inaghairi kutuma", - "transaction.status.send.failed": "imeshindwa kutuma", - "transaction.status.send.pending": "Inatuma", - "transaction.status.send.success": "Imetumwa", - "transaction.status.send.successDapp": "Imetumwa kwa {{externalDappName}}", - "transaction.status.swap.canceled": "Swap canceled", - "transaction.status.swap.canceling": "Inaghairi ubadilishaji", - "transaction.status.swap.expired": "Ubadilishanaji umekwisha", - "transaction.status.swap.failed": "Imeshindwa kubadilisha", - "transaction.status.swap.insufficientFunds": "Hela hazitoshi", - "transaction.status.swap.pending": "BADILISHA", - "transaction.status.swap.success": "Imebadilishwa", - "transaction.status.swap.successDapp": "Imebadilishwa kwa {{externalDappName}}", - "transaction.status.unwrap.canceled": "Imeghairiwa kufungua", - "transaction.status.unwrap.canceling": "Inaghairi kufunua", - "transaction.status.unwrap.failed": "Imeshindwa kufunua", - "transaction.status.unwrap.pending": "Kufungua", - "transaction.status.unwrap.success": "Imefunuliwa", - "transaction.status.unwrap.successDapp": "Imefunuliwa kwenye {{externalDappName}}", - "transaction.status.wrap.canceled": "Ufungaji ulioghairiwa", - "transaction.status.wrap.canceling": "Inaghairi kanga", - "transaction.status.wrap.failed": "Imeshindwa kufunga", - "transaction.status.wrap.pending": "Kufunga", - "transaction.status.wrap.success": "Imefungwa", - "transaction.status.wrap.successDapp": "Imefungwa kwa {{externalDappName}}", - "transaction.submittedOn": "Submitted on", - "transaction.summary.liquidity": "{{firstAmountWithSymbol}} and {{secondAmountWithSymbol}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} hadi {{recipientAddress}}", - "transaction.summary.received.noAmount": "Received from {{name}}", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} kutoka {{senderAddress}}", - "transaction.summary.sent.noAmount": "Sent to {{name}}", - "transaction.warning.insufficientGas.modal.message": "You need ~{{tokenAmount}} {{tokenSymbol}} () on {{networkName}} to cover this transaction’s network cost. Swap {{tokenSymbol}} from another chain or buy with your card to proceed.", - "transaction.warning.insufficientGas.modal.message.noAction": "Unahitaji ~{{tokenAmount}} {{tokenSymbol}} () kwenye {{networkName}} ili kulipia gharama ya mtandao wa muamala huu.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount": "Unahitaji ~{{tokenAmount}} {{tokenSymbol}} () kwenye {{networkName}} ili kulipia gharama ya mtandao wa muamala huu.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount.noAction": "To swap for this token, you need more {{tokenSymbol}} on {{networkName}}.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "Haitoshi {{tokenSymbol}} on {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Haitoshi {{tokenSymbol}}", - "transaction.warning.maxNative.message": "You’re about to spend most of your network token balance. This may leave insufficient funds to cover future network costs.", - "transaction.warning.maxNative.title": "Low network token balance", - "transaction.watcher.error.cancel": "Imeshindwa kughairi muamala", - "transaction.watcher.error.status": "Hitilafu wakati wa kuangalia hali ya muamala", - "uniswapX.aggregatesLiquidity": " hujumlisha vyanzo vya ukwasi kwa bei bora na ubadilishaji usio na gesi.", - "uniswapX.cost": "UniswapX removes the typical costs to transact on the blockchain.", - "uniswapx.description": "UniswapX hujumlisha vyanzo vya ukwasi kwa bei bora na ubadilishaji usio na gesi.", - "uniswapx.description.unsupported": "UniswapX is currently unavailable because your smart wallet settings are managed by a different wallet app.", - "uniswapx.included": "Includes UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "Pata maelezo zaidi kuhusu kubadilishana na UniswapX", - "uniswapx.unavailable.title": "UniswapX is unavailable", - "uniswapx.v2QuoteFailed": "Nukuu ngumu ya UniswapX v2 imeshindwa. Jaribu tena na ubadilishaji wa kawaida.", - "unitags.banner.button.claim": "Dai sasa", - "unitags.banner.subtitle": "Unda wasifu wa web3 uliobinafsishwa na ushiriki kwa urahisi anwani yako na marafiki.", - "unitags.banner.title.compact": "Dai {{unitagDomain}} jina lako la mtumiaji na uunde wasifu wako unaoweza kugeuzwa kukufaa.", - "unitags.banner.title.full": "Dai jina lako la mtumiaji {{unitagDomain}}", - "unitags.choosePhoto.option.cameraRoll": "Chagua kutoka kwa safu ya kamera", - "unitags.choosePhoto.option.computer": "Pakia kutoka kompyuta", - "unitags.choosePhoto.option.nft": "Chagua NFT", - "unitags.choosePhoto.option.remove": "Ondoa picha ya wasifu", - "unitags.claim.available": "Available", - "unitags.claim.confirmation.customize": "Binafsisha wasifu", - "unitags.claim.confirmation.description": "{{unitagAddress}} iko tayari kutuma na kupokea cryptocurrency. Endelea kutengeneza pochi yako kwa kubinafsisha wasifu wako wa web3.", - "unitags.claim.confirmation.success.long": "Umeipata!", - "unitags.claim.confirmation.success.short": "nimeelewa!", - "unitags.claim.error.addressLimit": "Tayari umefanya idadi ya juu zaidi ya mabadiliko kwenye jina lako la mtumiaji kwa anwani hii", - "unitags.claim.error.avatar": "Haikuweza kuweka avatar. Jaribu tena baadae.", - "unitags.claim.error.default": "Haikuweza kudai jina la mtumiaji. Jaribu tena baadae.", - "unitags.claim.error.deviceLimit": "Umefikia idadi ya juu zaidi ya majina ya watumiaji ambayo yanaweza kutumika kwa kifaa hiki", - "unitags.claim.error.general": "Haiwezi kudai jina la mtumiaji", - "unitags.claim.error.unavailable": "Jina hili la mtumiaji halipatikani", - "unitags.claim.error.unknown": "Hitilafu isiyojulikana", - "unitags.claim.username.default": "jina lako", - "unitags.delete.confirm.subtitle": "Unakaribia kufuta jina lako la mtumiaji na maelezo ya wasifu unaoweza kubinafsishwa. Hutaweza kuidai tena.", - "unitags.delete.confirm.title": "Una uhakika?", - "unitags.editProfile.placeholder": "jina la mtumiaji", - "unitags.editUsername.confirm.subtitle": "Unakaribia kubadilisha jina lako la mtumiaji. Ukishaibadilisha, huwezi kuidai tena.", - "unitags.editUsername.confirm.title": "Una uhakika?", - "unitags.editUsername.title": "Hariri jina lako la mtumiaji", - "unitags.editUsername.warning.default": "Ukibadilisha jina lako la mtumiaji, huwezi kulidai tena. Unaweza kuibadilisha mara 2 pekee.", - "unitags.editUsername.warning.max": "Umefikia idadi ya juu zaidi ya mabadiliko 2 ya majina ya watumiaji.", - "unitags.extension.intro.buttton": "Dai jina la mtumiaji", - "unitags.extension.intro.description": "Sema kwaheri kwa anwani 0x. Majina ya watumiaji ni majina yanayosomeka ambayo hurahisisha kutuma na kupokea crypto.", - "unitags.extension.intro.title": "Tunakuletea majina ya watumiaji", - "unitags.extension.intro.upsell.customizable": "Profaili zinazoweza kubinafsishwa", - "unitags.extension.intro.upsell.ens": "Inaendeshwa na vikoa vidogo vya ENS", - "unitags.extension.intro.upsell.free": "Huru kudai", - "unitags.intro.features.ens": "Inaendeshwa na vikoa vidogo vya ENS", - "unitags.intro.features.free": "Huru kudai", - "unitags.intro.features.profile": "Profaili zinazoweza kubinafsishwa", - "unitags.intro.subtitle": "Sema kwaheri kwa anwani 0x. Majina ya watumiaji ni majina yanayosomeka ambayo hurahisisha kutuma na kupokea crypto.", - "unitags.intro.title": "Tunakuletea majina ya watumiaji", - "unitags.notification.delete.error": "Haikuweza kufuta jina la mtumiaji. Jaribu tena baadae.", - "unitags.notification.delete.title": "Jina la mtumiaji limefutwa", - "unitags.notification.profile.error": "Haikuweza kusasisha wasifu. Jaribu tena baadae.", - "unitags.notification.profile.title": "Wasifu umesasishwa", - "unitags.notification.username.error": "Haikuweza kubadilisha jina la mtumiaji. Jaribu tena baadae.", - "unitags.notification.username.title": "Jina la mtumiaji limebadilishwa", - "unitags.onboarding.claim.subtitle": "Hii ni anuani yako iliyobinafsishwa ambayo watu wanaweza kutuma crypto.", - "unitags.onboarding.claim.title.choose": "Unda jina lako la mtumiaji", - "unitags.onboarding.claim.title.claim": "Dai jina lako la mtumiaji", - "unitags.onboarding.info.description": "Majina ya watumiaji hubadilisha anwani changamano 0x kuwa majina yanayosomeka. Kwa kudai {{unitagDomain}} jina la mtumiaji, unaweza kutuma na kupokea crypto kwa urahisi na kuunda wasifu wa umma wa web3.", - "unitags.onboarding.info.title": "Anwani iliyorahisishwa", - "unitags.onboarding.profile.subtitle": "Pakia yako mwenyewe au ushikamane na Unicon yako ya kipekee. Unaweza kubadilisha hii wakati wowote baadaye.", - "unitags.onboarding.profile.title": "Chagua picha ya wasifu", - "unitags.profile.action.delete": "Futa jina la mtumiaji", - "unitags.profile.action.edit": "Hariri jina la mtumiaji", - "unitags.profile.bio.label": "Wasifu", - "unitags.profile.bio.placeholder": "Andika wasifu kwa wasifu wako", - "unitags.profile.links.twitter": "Twitter", - "unitags.username.error.chars": "Majina ya watumiaji yanaweza kuwa na herufi na nambari pekee", - "unitags.username.error.max": "Majina ya mtumiaji hayawezi kuwa zaidi ya vibambo {{number}}", - "unitags.username.error.min": "Majina ya watumiaji lazima yawe na angalau vibambo {{number}}", - "unitags.username.error.uppercase": "Majina ya watumiaji yanaweza tu kuwa na herufi ndogo na nambari", - "uwulink.error.insufficientTokens": "Haitoshi {{tokenSymbol}} on {{chain}}", - "v2.notAvailable": "Uniswap V2 haipatikani kwenye mtandao huu.", - "wallet.appSignIn": "Ingia na app", - "wallet.connectingAgreement": "Kwa kuunganisha pochi, unakubali Sheria na Masharti ya Uniswap Labs' na kukubali Sera yake ya Faragha.", - "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", - "wallet.mismatch.popup.description": "Some features are not supported by your connected wallet.", - "wallet.mismatch.popup.title": "Limited wallet support", - "wallet.other": "Pochi zingine", - "wallet.scanToConnect": "Changanua msimbo wa QR ili kuunganisha", - "wallet.wrongNet": "Mkoba wako umeunganishwa kwenye mtandao usio sahihi.", - "walletConnect.dapps.empty.description": "Unganisha kwenye programu kwa kuchanganua msimbo kupitia WalletConnect", - "walletConnect.dapps.manage.empty.title": "Hakuna programu zilizounganishwa", - "walletConnect.dapps.manage.title": "Connections", - "walletConnect.error.connection.message": "Uniswap Wallet kwa sasa inasaidia {{chainNames}}. Tafadhali tumia tu \"{{dappName}}\" kwenye minyororo hii", - "walletConnect.error.connection.title": "Hitilafu ya Muunganisho", - "walletConnect.error.general.message": "Kulikuwa na tatizo na WalletConnect. Tafadhali jaribu tena", - "walletConnect.error.general.title": "Hitilafu ya WalletConnect", - "walletConnect.error.scantastic.message": "Kulikuwa na tatizo na msimbo wako wa QR. Tafadhali jaribu tena", - "walletConnect.error.scantastic.title": "Msimbo wa QR si Sahihi", - "walletConnect.error.unsupported.message": "Hakikisha kuwa unachanganua msimbo sahihi wa WalletConnect, Ethereum au Uniswap Extension QR kabla ya kujaribu tena.", - "walletConnect.error.unsupported.title": "Msimbo wa QR si Sahihi", - "walletConnect.error.unsupportedV1.message": "WalletConnect v1 haitumiki tena. Programu unayojaribu kuunganisha inahitaji kusasishwa hadi WalletConnect v2.", - "walletConnect.error.unsupportedV1.title": "Msimbo wa QR si Sahihi", - "walletConnect.error.uwu.scan": "Kulikuwa na tatizo katika kuchanganua msimbo huu wa QR.", - "walletConnect.error.uwu.title": "Hitilafu ya Kiungo cha UWU", - "walletConnect.error.uwu.unsupported": "Msimbo huu wa QR hautumiki.", - "walletConnect.pending.button.connect": "Unganisha", - "walletConnect.pending.button.reject": "Reject", - "walletConnect.pending.button.scrollDown": "Tembeza chini ili kuunganisha", - "walletConnect.pending.threat.confirmationText": "I understand the risks", - "walletConnect.pending.threat.description": "Signing messages or transactions from this app could result in a loss of funds.", - "walletConnect.pending.threat.title": "Malicious app detected", - "walletConnect.pending.title": "Unganisha kwa {{dappName}}", - "walletConnect.pending.unverified.description": "Make sure you trust this site before proceeding. ", - "walletConnect.pending.unverified.title": "Unverified app", - "walletConnect.permissions.option.requestApprovals": "Request transaction approvals", - "walletConnect.permissions.option.transferAssets": "Move funds without permission", - "walletConnect.permissions.option.viewTokenBalances": "View your balance and activity", - "walletConnect.permissions.title": "App permissions", - "walletConnect.request.bundledTransactions.label_one": "Single bundled transaction", - "walletConnect.request.bundledTransactions.label_other": "{{count}} bundled transactions", - "walletConnect.request.button.scrollDown": "Tembeza chini ili kusaini", - "walletConnect.request.button.sign": "Ishara", - "walletConnect.request.details.label.function": "Kazi", - "walletConnect.request.details.label.sending": "Inatuma", - "walletConnect.request.details.label.token": "Ishara", - "walletConnect.request.details.label.tokens": "Ishara", - "walletConnect.request.error.insufficientFunds": "Huna {{currencySymbol}} ya kutosha kukamilisha muamala huu.", - "walletConnect.request.error.network": "Hitilafu ya muunganisho wa mtandao au mtandao", - "walletConnect.request.warning.batch.message": "Be careful: this request contains multiple transactions and could transfer assets", - "walletConnect.request.warning.general.message": "Kuwa mwangalifu: ujumbe huu unaweza kuhamisha mali", - "walletConnect.request.warning.message": "Ili kutia sahihi barua pepe au miamala, utahitaji kuleta maneno ya kurejesha akaunti.", - "walletConnect.request.warning.title": "Pochi hii iko katika hali ya kutazama tu", - "web.explore.description": "Gundua na utafute tokeni kwenye {{network}}. Chunguza mabwawa ya juu. Tazama bei za wakati halisi, kiasi cha biashara, TVL, chati na data ya muamala.", - "web.explore.title.pools": "Gundua madimbwi bora kwenye {{network}} kwenye Uniswap", - "web.explore.title.tokens": "Gundua tokeni kuu kwenye {{network}} kwenye Uniswap", - "web.explore.title.transactions": "Gundua miamala ya juu kwenye {{network}} kwenye Uniswap" -} diff --git a/packages/uniswap/src/i18n/locales/translations/tr-TR.json b/packages/uniswap/src/i18n/locales/translations/tr-TR.json index 8282c8779ad..14390df54b8 100644 --- a/packages/uniswap/src/i18n/locales/translations/tr-TR.json +++ b/packages/uniswap/src/i18n/locales/translations/tr-TR.json @@ -30,7 +30,6 @@ "account.drawer.modal.body": "Uniswap uygulamasıyla token'ları güvenle sakla ve swap et. iOS ve Android'de mevcuttur.", "account.drawer.modal.dont": "Uniswap Wallet'ın yok mu?", "account.drawer.modal.scan": "Uniswap Wallet ile tara", - "account.drawer.spamToggle": "Bilinmeyen token'ları ve NFT'leri gizle", "account.passkey.delete.acknowledge": "Kurtarma cümlemi yedekledim ve bunu yapmadığım takdirde Uniswap Labs'ın cüzdanımı kurtarmama yardımcı olamayacağını anlıyorum.", "account.passkey.delete.description": "Uniswap mobil uygulamasını veya tarayıcı uzantısını kullanarak kurtarma cümleni yedeklediğinden emin ol.", "account.passkey.delete.descriptionEmphasized": "Kurtarma cümlen olmadan cüzdanına erişemeyebilirsin.", @@ -115,6 +114,7 @@ "account.wallet.watch.placeholder": "ENS veya adres", "account.wallet.watch.title": "Bir cüzdan adresi gir", "activity.pending": "{{pendingActivityCount}} Beklemede", + "activity.recentActivity": "Recent activity", "activity.transaction.lpRewards.descriptor": "{{symbol}} getirileri tahsil edildi", "activity.transaction.send.descriptor": "{{walletAddress}} adresine {{amountWithSymbol}}", "activity.transaction.swap.descriptor": "{{amountWithSymbolB}} için {{amountWithSymbolA}}", @@ -144,15 +144,15 @@ "bridgedAsset.send.warning.description": "{{chainName}} üzerinde sarılı bir {{currencySymbol}} sürümü gönderiyorsun. Bunu merkezi borsaya gönderirsen fonlarını kalıcı olarak kaybedersin.", "bridgedAsset.send.warning.title": "Uyumlu bir adrese gönderdiğinden emin ol", "bridgedAsset.tdp.description": "Bu, yerel {{currencySymbol}} ile 1:1 oranında desteklenen, köprülenmiş bir {{currencySymbol}} sürümüdür.", - "bridgedAsset.wormhole.button": "Wormhole ile devam et", - "bridgedAsset.wormhole.description": "{{currencySymbol}} varlığını {{chainName}} üzerinden {{nativeChainName}} zincirine köprülemek için Wormhole portalıyla devam et.", + "bridgedAsset.wormhole.button": "Continue to {{provider}}", + "bridgedAsset.wormhole.description": "Continue to the {{provider}} portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", "bridgedAsset.wormhole.title": "Şuraya {{currencySymbol}} çek: {{nativeChainName}}", "bridgedAsset.wormhole.toNativeChain": "Şuraya: {{nativeChainName}}", "bridgedAsset.wormhole.withdrawToNativeChain": "Şuraya çek: {{nativeChainName}}", "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} dk {{seconds}} sn", "bridging.estimatedTime.minutesOnly": "~{{minutes}} dk", "bridging.estimatedTime.secondsOnly": "~{{seconds}} sn", - "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XPL, ZEC — now available on Unichain.", "chart.candlestick": "Mum grafiği", "chart.error.pools": "Geçerli havuza ilişkin geçmiş veriler görüntülenemiyor.", "chart.error.tokens": "Geçerli token'ın geçmiş verileri görüntülenemiyor.", @@ -257,6 +257,7 @@ "common.button.unlock": "Kilidini aç", "common.button.view": "Görüntüle", "common.button.viewDetails": "Ayrıntıları görüntüle", + "common.button.viewMore": "View more", "common.button.yes": "Evet", "common.buy.label": "Al", "common.buyAndSell": "Uniswap'ta al ve sat", @@ -370,6 +371,7 @@ "common.input.noRecipient.error": "Alıcı seç", "common.input.password.confirm": "Şifreyi onayla", "common.input.password.error.mismatch": "Şifreler eşleşmiyor", + "common.input.password.error.same": "New password must be different from current password", "common.input.password.error.weak": "Bu şifre çok zayıf", "common.input.password.new": "Yeni şifre", "common.input.password.placeholder": "Şifre", @@ -503,6 +505,7 @@ "common.remove.liquidity.canceled": "Likidite kaldırma iptal edildi", "common.remove.liquidity.failed": "Likidite kaldırılamadı", "common.removing.liquidity": "Likidite kaldırılıyor", + "common.reported": "Reported", "common.resetLimit": "{{symbol}} limitini sıfırla", "common.resetLimitWallet": "Cüzdandaki {{symbol}} limitini sıfırla", "common.resettingLimit": "{{symbol}} limiti sıfırlanıyor...", @@ -532,6 +535,7 @@ "common.status": "Durum", "common.step.number": "Adım {{number}}", "common.step.number.of": "Adım {{current}}/{{total}}", + "common.submit": "Submit", "common.swap": "Swap", "common.swap.expired": "Swap süresi doldu", "common.swap.failed": "Swap başarısız oldu", @@ -797,6 +801,7 @@ "fee.tier.create": "Ücret kademesi oluştur", "fee.tier.create.button": "Yeni ücret kademesi oluştur", "fee.tier.create.description": "Yeni bir kademe oluşturmak yeni bir havuzda başlatmaya neden olur ve normalden daha yüksek ağ maliyetlerine yol açar.", + "fee.tier.default": "-- fee tier", "fee.tier.description": "Likidite sağlayarak kazanılan tutar. Risk toleransınıza ve stratejinize uygun bir tutar seçin.", "fee.tier.description.v2": "Likidite sağlayarak kazanılan tutar. Tüm v2 havuzlarının sabit %0,3 ücreti vardır. Daha fazla seçenek için v4'te likidite sağlayın.", "fee.tier.dynamic": "Dinamik ücret kademesi", @@ -884,9 +889,9 @@ "hero.swap.title": "Dilediğin zaman,
dilediğin yerde swap yap.", "hidden.nfts.info.banner.text": "Gizli NFT'ler hakkında daha fazla bilgi edin", "hidden.nfts.info.text.button": "Gizli NFT'ler ({{numHidden}})", - "hidden.nfts.info.text.extension": "Bunlar potansiyel dolandırıcılıklar ve gizlediğin NFT'lerdir. Bir NFT'yi gizlemek için üzerine sağ tıklayabilirsin.", "hidden.nfts.info.text.mobile": "Bunlar potansiyel dolandırıcılıklar ve gizlediğin NFT'lerdir. Bir NFT'yi göstermek için üzerine uzun süre basabilirsin.", "hidden.nfts.info.text.title": "Gizli NFT'ler", + "hidden.nfts.info.text.web": "These are potential scams and NFTs you’ve hidden. You can click on an NFT to unhide it.", "hidden.tokens.info.banner.text": "Gizli token'lar hakkında daha fazla bilgi edin", "hidden.tokens.info.text.button": "Gizli token'lar ({{numHidden}})", "hidden.tokens.info.text.info": "Bunlar potansiyel dolandırıcılıklar, küçük bakiyeler ve gizlediğin token'lardır. Gizli token'lar toplam cüzdan bakiyene dâhil değildir.", @@ -957,32 +962,16 @@ "landing.uniswapX.subtitle": "Sorunsuz ve daha akıllı swap işlemleri.", "landing.walletBody": "Milyonlarca kişi tarafından indirilen, gerçek insanlar tarafından desteklenen ve 4,8 puan alan, güvenilir kendi kendine emanet kripto cüzdanı ve uzantısı.", "landing.walletSubtitle": "Swap yapın, saklayın, keşfedin.", - "language.afrikaans": "Afrikanca", - "language.arabic": "Arapça", - "language.catalan": "Katalanca", "language.chineseSimplified": "Basitleştirilmiş Çince", "language.chineseTraditional": "Geleneksel Çince", - "language.czech": "Çekçe", - "language.danish": "Danca", "language.dutch": "Felemenkçe", "language.english": "İngilizce", - "language.finnish": "Fince", "language.french": "Fransızca", - "language.greek": "Yunanca", - "language.hebrew": "İbranice", - "language.hindi": "Hintçe", - "language.hungarian": "Macarca", "language.indonesian": "Endonezya dili", - "language.italian": "İtalyanca", "language.japanese": "Japonca", "language.korean": "Korece", - "language.malay": "Malayca", - "language.norwegian": "Norveççe", - "language.polish": "Lehçe", "language.portuguese": "Portekizce", - "language.romanian": "Romence", "language.russian": "Rusça", - "language.serbian": "Sırpça", "language.spanishArgentina": "İspanyolca (Arjantin)", "language.spanishBelize": "İspanyolca (Belize)", "language.spanishBolivia": "İspanyolca (Bolivya)", @@ -1006,11 +995,7 @@ "language.spanishUruguay": "İspanyolca (Uruguay)", "language.spanishUs": "İspanyolca (ABD)", "language.spanishVenezuela": "İspanyolca (Venezuela)", - "language.swahili": "Svahili", - "language.swedish": "İsveççe", "language.turkish": "Türkçe", - "language.ukrainian": "Ukraynaca", - "language.urdu": "Urduca", "language.vietnamese": "Vietnamca", "large.price.difference": "Büyük fiyat farkı", "large.price.difference.tooltip": "Bu alım satıma devam etmek fon kaybıyla sonuçlanır. Bu fark, büyük alım satımlardan veya düşük likiditeden kaynaklanıyor olabilir.", @@ -1114,7 +1099,6 @@ "notification.smartWallet.disabled.all": "Akıllı cüzdan devre dışı bırakıldı", "notification.smartWallet.disabled.plural": "{{amount}} ağda devre dışı bırakıldı", "notification.spam.NFT.failed": "NFT bildirilemedi. Daha sonra tekrar dene.", - "notification.spam.NFT.successful": "Bildirildi", "notification.swap.network": "{{network}} ağında swap işlemi yapılıyor", "notification.swap.pending.swap": "Swap beklemede", "notification.swap.pending.unwrap": "Açma beklemede", @@ -1214,6 +1198,7 @@ "onboarding.home.intro.backup.description.mobile": "Telefonunu kaybetmen veya yeni bir telefon alman ihtimaline karşı bir kurtarma planı oluştur.", "onboarding.home.intro.backup.title": "Cüzdanını yedekle", "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK ve JUP artık Unichain'de kullanılabiliyor", + "onboarding.home.intro.bridgedAssets.description.v2": "DOGE, XRP, XPL, ZEC — now available on Unichain", "onboarding.home.intro.bridgedAssets.title": "Unichain'de yeni token'lar al sat", "onboarding.home.intro.fund.description": "Kripto para alarak veya başka bir hesaptan transfer yaparak cüzdanını fonla.", "onboarding.home.intro.fund.title": "İlk token'ını al", @@ -1438,15 +1423,18 @@ "poolFinder.availablePools.notFound.description": "Eşleşen v2 havuzları bulunamadı. Token seçimini bir kez daha kontrol et ve doğru cüzdana bağlı olduğundan emin ol.", "pools.explore": "Havuzları keşfet", "portfolio.activity.filters.timePeriod.all": "Her zaman", - "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", + "portfolio.activity.filters.transactionType.addLiquidity": "Added liquidity", "portfolio.activity.filters.transactionType.all": "Tüm türler", "portfolio.activity.filters.transactionType.approvals": "Approvals", - "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", - "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.claimFees": "Claimed fees", + "portfolio.activity.filters.transactionType.createPool": "Pools created", "portfolio.activity.filters.transactionType.mints": "Mints", - "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", + "portfolio.activity.filters.transactionType.receives": "Receives", + "portfolio.activity.filters.transactionType.removeLiquidity": "Removed liquidity", + "portfolio.activity.filters.transactionType.sends": "Sends", "portfolio.activity.filters.transactionType.swaps": "Swap'lar", "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.search.placeholder": "Search activity", "portfolio.activity.table.column.address": "Address", "portfolio.activity.table.column.amount": "Amount", "portfolio.activity.table.column.time": "Time", @@ -1459,7 +1447,12 @@ "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", "portfolio.disconnected.demoWallet.title": "Demo wallet", "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", + "portfolio.nfts.search.placeholder": "Search your NFTs", "portfolio.nfts.title": "NFT'ler", + "portfolio.overview.stats.averageSwapSize": "Average swap size", + "portfolio.overview.stats.swappedThisWeek": "Swapped this week", + "portfolio.overview.stats.swapsThisWeek": "Swaps this week", + "portfolio.overview.stats.totalSwapVolume": "Total swap volume", "portfolio.overview.title": "Genel Bakış", "portfolio.title": "Portföy", "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", @@ -1471,6 +1464,7 @@ "portfolio.tokens.table.column.token": "Token", "portfolio.tokens.table.column.value": "Değer", "portfolio.tokens.title": "Token'lar", + "portfolio.view": "View portfolio", "position.addHook": "Kanca Ekle", "position.addHook.tooltip": "Kancalar, havuzların akıllı sözleşmelerle etkileşime girmesini sağlayan ve çeşitli olanakların kilidini açan gelişmiş bir özelliktir. Bazıları kötü amaçlı olabileceğinden veya beklenmeyen sonuçlara yol açabileceğinden kanca eklerken dikkatli ol.", "position.addingHook": "Kanca ekleniyor", @@ -1588,6 +1582,33 @@ "qrScanner.wallet.networks": "Desteklenen ağlar", "range.outOfView": "Görünüm dışı aralık", "removeLiquidity.pooled": "{{symbol}} havuza alındı:", + "reporting.activity.unhide.action": "Unhide activity", + "reporting.pool.details.title": "Don’t recognize this position?", + "reporting.token.data.options.price.subtitle": "Token price is wrong or unavailable", + "reporting.token.data.options.price.title": "Price", + "reporting.token.data.options.priceChart.subtitle": "Data is wrong or incomplete", + "reporting.token.data.options.priceChart.title": "Price chart", + "reporting.token.data.options.tokenDetails.subtitle": "Token image, description, or link issue", + "reporting.token.data.options.tokenDetails.title": "Token details", + "reporting.token.data.options.volume.subtitle": "Token volume is wrong or unavailable", + "reporting.token.data.options.volume.title": "Volume", + "reporting.token.data.title": "Data issue", + "reporting.token.options.hiddenFees.subtitle": "Token has undisclosed fees when bought/sold", + "reporting.token.options.hiddenFees.title": "Hidden fees", + "reporting.token.options.imposter.subtitle": "Token seems fraudulent or misleading", + "reporting.token.options.imposter.title": "Imposter token", + "reporting.token.options.other.title": "Something else", + "reporting.token.options.spam.subtitle": "Token appeared in wallet unexpectedly", + "reporting.token.options.spam.title": "Spam token", + "reporting.token.report.button.disabled": "Select an issue", + "reporting.token.report.other.placeholder": "Describe the issue", + "reporting.token.report.title": "Report token", + "reporting.token.report.title.withSymbol": "Report {{symbol}}", + "reporting.token.warning.button": "This warning is incorrect", + "reporting.token.warning.report.placeholder": "Add details (optional)", + "reporting.token.warning.report.submit": "Report issue", + "reporting.token.warning.report.subtitle": "Report an issue if the warning below seems wrong. We’ll take a closer look.", + "reporting.token.warning.report.title": "Report an inaccurate warning", "revoke.failed.message": "Muhtemelen bir ağ veya bağlantı sorunu nedeniyle iptal işlemi başarısız oldu. Bağlantını kontrol edip tekrar dene.", "routing.aggregateLiquidity": "Mümkün olduğunda daha iyi fiyatlar ve Gas ücreti alınmayan swap işlemleri için likidite kaynaklarını bir araya getirir.", "routing.aggregateLiquidity.uniswapx": "UniswapX, zincir üzerinde ve zincir dışında likidite kaynaklarını bir araya getirerek sana mevcut en iyi fiyatları ve Gas ücreti alınmayan swap imkanını sunar.", @@ -1735,6 +1756,7 @@ "settings.setting.backup.status.inProgress": "{{cloudProviderName}} konumuna yedekleniyor...", "settings.setting.backup.status.recoveryPhrase.backed": "Yedeklendi", "settings.setting.backup.status.title": "{{cloudProviderName}} yedeği", + "settings.setting.balancesActivity.title": "Balances and activity", "settings.setting.beta.tooltip": "Çok yakında", "settings.setting.biometrics.appAccess.subtitle.android": "Uygulamayı açmak için yüz tanıma/parmak izi iste.", "settings.setting.biometrics.appAccess.subtitle.ios": "Uygulamayı açmak için {{biometricsMethod}} iste.", @@ -1786,7 +1808,8 @@ "settings.setting.privacy.analytics.title": "Uygulama analizleri", "settings.setting.privateKeys.title": "Özel anahtarlar", "settings.setting.recoveryPhrase.title": "Kurtarma cümlesi", - "settings.setting.smallBalances.title": "Portföy bakiyesi", + "settings.setting.reportedActivity.subtitle": "Transactions you’ve reported as spam will be hidden from your activity feed.", + "settings.setting.reportedActivity.title": "Hide reported activity", "settings.setting.smartWallet.action.enable": "Etkinleştir", "settings.setting.smartWallet.action.smartWallet": "Akıllı cüzdan", "settings.setting.smartWallet.notEligible": "Uygun değil", @@ -2290,6 +2313,8 @@ "transaction.networkCost.label": "Ağ maliyeti", "transaction.networkCost.maxNativeBalance.description": "Bu işlemin ağ maliyetini karşılamak için düşük tutarda bir ağ token'ı bakiyesi rezerve edildi.", "transaction.networkCost.maxNativeBalance.title": "Maksimum bakiyemi neden kullanamıyorum?", + "transaction.networkCost.presetNativeBalance.description": "You don’t have enough balance to cover both this amount and the network cost of the transaction.", + "transaction.networkCost.presetNativeBalance.title": "Why can’t I use this amount?", "transaction.networkCost.veryHigh.label": "Çok yüksek ağ maliyeti", "transaction.notification.error.cancel": "İşlem iptal edilemiyor", "transaction.notification.error.replace": "İşlem değiştirilemiyor", diff --git a/packages/uniswap/src/i18n/locales/translations/uk-UA.json b/packages/uniswap/src/i18n/locales/translations/uk-UA.json deleted file mode 100644 index 2cd48cba7bb..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/uk-UA.json +++ /dev/null @@ -1,2563 +0,0 @@ -{ - "account.authHeader.claimReward": "Отримайте {{amount}} нагороду", - "account.cloud.backup.subtitle": "На вашому {{cloudProviderName}}є кілька резервних копій фраз відновлення.", - "account.cloud.backup.title": "Виберіть резервну копію для відновлення", - "account.cloud.button.restore.android": "Відновити з Google Drive", - "account.cloud.button.restore.ios": "Відновити з iCloud", - "account.cloud.empty.description": "Схоже, ви не створили резервну копію жодної фрази відновлення на {{cloudProviderName}}.", - "account.cloud.empty.title": "Знайдено 0 резервних копій", - "account.cloud.error.backup.message": "Не вдалося імпортувати резервні копії через відсутність дозволів, переривання авторизації або помилку хмари", - "account.cloud.error.backup.title": "Помилка під час імпорту резервних копій", - "account.cloud.error.password.title": "Недійсний пароль. Будь ласка спробуйте ще раз.", - "account.cloud.error.unavailable.button.cancel": "Не зараз", - "account.cloud.error.unavailable.button.settings": "Перейдіть до налаштувань", - "account.cloud.error.unavailable.message.android": "Переконайтеся, що ви ввійшли в обліковий запис Google із увімкненим Google Диском на цьому пристрої, і повторіть спробу.", - "account.cloud.error.unavailable.message.ios": "Переконайтеся, що ви ввійшли в обліковий запис Apple ID з увімкненим iCloud Drive на цьому пристрої, і повторіть спробу.", - "account.cloud.error.unavailable.title.android": "Диск Google недоступний", - "account.cloud.error.unavailable.title.ios": "iCloud Drive недоступний", - "account.cloud.loading.title": "Пошук резервних копій...", - "account.cloud.lockout.time.hours_one": "Забагато спроб. Повторіть спробу через 1 годину.", - "account.cloud.lockout.time.hours_other": "Забагато спроб. Повторіть спробу через {{count}} годин.", - "account.cloud.lockout.time.minutes_one": "Забагато спроб. Повторіть спробу через 1 хвилину.", - "account.cloud.lockout.time.minutes_other": "Забагато спроб. Повторіть спробу через {{count}} хвилин.", - "account.cloud.password.input": "Введіть пароль", - "account.cloud.password.recoveryPhrase": "Натомість введіть фразу відновлення", - "account.cloud.password.subtitle": "Цей пароль потрібен для відновлення резервної копії фрази відновлення з {{cloudProviderName}}.", - "account.cloud.password.title": "Введіть резервний пароль", - "account.downloadWallet.subtitle": "Створюйте резервні копії свого гаманця, торгуйте на ходу, отримуйте сповіщення про ціни в реальному часі та багато іншого.", - "account.drawer.gitHash": "Хеш Git: ", - "account.drawer.gitVersion": "Версія: ", - "account.drawer.modal.body": "Безпечно зберігайте та обмінюйте токени за допомогою програми Uniswap. Доступно на iOS і Android.", - "account.drawer.modal.dont": "У вас немає гаманця Uniswap?", - "account.drawer.modal.scan": "Сканування за допомогою гаманця Uniswap", - "account.drawer.spamToggle": "Приховайте невідомі токени та NFT", - "account.passkey.delete.acknowledge": "Я зробив резервну копію своєї фрази відновлення та розумію, що Uniswap Labs не зможе допомогти мені відновити мій гаманець, якщо я цього не зроблю.", - "account.passkey.delete.description": "Переконайтеся, що ви створили резервну копію фрази відновлення за допомогою мобільного додатка Uniswap або розширення для браузера.", - "account.passkey.delete.descriptionEmphasized": "Без вашої фрази відновлення ви, можливо, не зможете отримати доступ до свого гаманця.", - "account.passkey.delete.speedbump.description": "Перш ніж продовжити, виконайте наведені нижче дії, щоб не втратити доступ до свого гаманця та всіх коштів.", - "account.passkey.delete.speedbump.step1": "Завантажте мобільну програму Uniswap або розширення для браузера", - "account.passkey.delete.speedbump.step2": "Створіть резервну копію фрази відновлення", - "account.passkey.delete.speedbump.title": "Ти впевнений?", - "account.passkey.delete.title": "Видалити ключ доступу?", - "account.passkey.log.in.title": "Увійти за допомогою ключа доступу", - "account.passkey.type.crossplatform": "Телефон, планшет або ключ безпеки", - "account.passkey.type.platform": "Браузер або операційна система", - "account.passkey.verify.button": "Підтвердити за допомогою ключа доступу", - "account.passkey.verify.description": "Перш ніж продовжити, будь ласка, скористайтеся своїм ключем доступу для підтвердження своєї особи. Це допоможе захистити ваш обліковий запис.", - "account.passkey.verify.title": "Спочатку підтвердимо, що це ви", - "account.portfolio.activity.canceledBelow": "Це замовлення скасовано, оскільки ваш баланс був меншим за введену суму.", - "account.portfolio.activity.signLimit": "Це замовлення не буде виконано, оскільки ваш баланс був меншим за введену суму. Збільште свій баланс, щоб виправити.", - "account.recoveryPhrase.education.part1": "Фраза відновлення (або вихідна фраза) — це набір слів , необхідних для доступу до вашого гаманця, як пароль.", - "account.recoveryPhrase.education.part2": "Ви можете ввести свою фразу відновлення на новому пристрої , щоб відновити свій гаманець та його вміст.", - "account.recoveryPhrase.education.part3": "Але якщо ви втратите фразу відновлення, ви втратите доступ до свого гаманця.", - "account.recoveryPhrase.education.part4": "Замість того, щоб запам’ятовувати фразу відновлення, ви можете створити її резервну копію на {{cloudProviderName}} і захистити паролем.", - "account.recoveryPhrase.education.part5": "Ви також можете вручну створити резервну копію фрази відновлення, записавши її і зберігши в безпечному місці.", - "account.recoveryPhrase.education.part6": "Ми рекомендуємо використовувати обидва типи резервних копій, оскільки, якщо ви втратите фразу відновлення, ви не зможете відновити свій гаманець.", - "account.recoveryPhrase.error.invalid": "Недійсна фраза", - "account.recoveryPhrase.error.invalidWord": "Недійсне слово: {{word}}", - "account.recoveryPhrase.error.phraseLength": "Фраза для відновлення має складатися з 12-24 слів", - "account.recoveryPhrase.error.wordIsAddress": "Ви ввели адресу, а не фразу для відновлення", - "account.recoveryPhrase.error.wrong": "Неправильна фраза відновлення", - "account.recoveryPhrase.helpText.import": "Як знайти фразу відновлення?", - "account.recoveryPhrase.helpText.restoring": "Спробуйте пошукати знову", - "account.recoveryPhrase.input": "Введіть фразу відновлення", - "account.recoveryPhrase.remove.final.description": "Переконайтеся, що ви записали свою фразу відновлення або зробили її резервну копію на {{cloudProviderName}}. Інакше ви не зможете отримати доступ до своїх коштів.", - "account.recoveryPhrase.remove.final.title": "Ви видаляєте свою фразу відновлення", - "account.recoveryPhrase.remove.import.description": "Одночасно можна зберігати лише одну фразу відновлення. Щоб продовжити імпорт нового, вам потрібно буде видалити поточну фразу відновлення та всі пов’язані гаманці з цього пристрою.", - "account.recoveryPhrase.remove.initial.description": "Ваш гаманець буде видалено з цього пристрою разом із фразою для відновлення.", - "account.recoveryPhrase.remove.initial.title": "Ви видаляєте {{walletName}}", - "account.recoveryPhrase.remove.mnemonic.description": "Ваша фраза відновлення зберігатиметься, доки ви не видалите всі гаманці, що залишилися.", - "account.recoveryPhrase.subtitle.import": "Ваша фраза відновлення зберігатиметься лише локально на вашому пристрої.", - "account.recoveryPhrase.subtitle.restoring": "Введіть фразу для відновлення нижче або спробуйте знову знайти резервні копії.", - "account.recoveryPhrase.title.import": "Введіть фразу відновлення", - "account.recoveryPhrase.title.restoring": "Резервні копії не знайдено", - "account.wallet.action.copy": "Скопіюйте адресу", - "account.wallet.action.manageConnections": "Керування підключеннями", - "account.wallet.action.report": "Повідомити про профіль", - "account.wallet.action.viewExplorer": "Переглянути на {{blockExplorerName}}", - "account.wallet.button.add": "Додати гаманець", - "account.wallet.button.addViewOnly": "Додайте гаманець лише для перегляду", - "account.wallet.button.create": "Створіть новий гаманець", - "account.wallet.button.import": "Імпортуйте новий гаманець", - "account.wallet.button.manage": "Налаштування гаманця", - "account.wallet.button.remove": "Видаліть гаманець", - "account.wallet.button.watch": "Слідкуйте за гаманцем", - "account.wallet.create.placeholder": "Гаманець {{index}}", - "account.wallet.edit.label.input.placeholder": "Етикетка гаманця", - "account.wallet.header.button.disabled.title": "Редагувати профіль", - "account.wallet.header.button.title": "Редагувати мітку", - "account.wallet.header.viewOnly": "Гаманці лише для перегляду", - "account.wallet.menu.claimUsername": "Вимагати ім'я користувача", - "account.wallet.menu.copy.title": "Копіювати адресу гаманця", - "account.wallet.menu.edit.title": "Редагувати мітку", - "account.wallet.menu.manageConnections": "Керуйте підключеннями", - "account.wallet.menu.remove.title": "Видаліть гаманець", - "account.wallet.remove.check": "Я зробив резервну копію своєї фрази відновлення та розумію, що Uniswap Labs не може допомогти мені відновити мої гаманці, якщо я цього не зроблю.", - "account.wallet.remove.title": "Видалити {{name}}", - "account.wallet.remove.viewOnly": "Ви завжди можете додати назад гаманці лише для перегляду, ввівши адресу гаманця.", - "account.wallet.restore.new_device.description": "Оскільки ви користуєтеся новим пристроєм, вам потрібно буде відновити фразу відновлення або ввести пароль для резервного копіювання в хмару, щоб продовжити.", - "account.wallet.restore.new_device.title": "Відновіть свій гаманець", - "account.wallet.restore.seed_phrase.description": "Ваша фраза відновлення відсутня на вашому пристрої. Щоб ви ніколи не втратили доступ до своїх коштів, нам потрібно, щоб ви відновили свій гаманець.", - "account.wallet.restore.seed_phrase.title": "Відновіть свій гаманець", - "account.wallet.select.error": "Не вдалося завантажити адреси", - "account.wallet.select.loading.subtitle": "Ваші гаманці з’являться нижче.", - "account.wallet.select.loading.title": "Пошук гаманців", - "account.wallet.select.smartWalletDisclaimer": "За замовчуванням усі відповідні гаманці використовуватимуть функції розумного гаманця після імпорту. Що таке розумний гаманець?", - "account.wallet.select.title_one_one": "Знайдено один гаманець", - "account.wallet.select.title_one_other": "Виберіть гаманці для імпорту", - "account.wallet.viewOnly.button": "Імпортний гаманець", - "account.wallet.viewOnly.description": "Щоб обмінюватися, купувати, надсилати та отримувати токени, вам потрібно імпортувати фразу відновлення цього гаманця.", - "account.wallet.viewOnly.title": "Цей гаманець доступний лише для перегляду", - "account.wallet.watch.error.alreadyImported": "Ця адреса вже імпортована", - "account.wallet.watch.error.notFound": "Адреса не знайдена", - "account.wallet.watch.error.smartContract": "Адреса - це розумний контракт", - "account.wallet.watch.message": "Додавання гаманця лише для перегляду дає змогу випробувати програму або відстежувати гаманець. Ви не зможете обміняти або відправити кошти.", - "account.wallet.watch.placeholder": "ENS або адреса", - "account.wallet.watch.title": "Введіть адресу гаманця", - "activity.pending": "{{pendingActivityCount}} Очікує", - "activity.transaction.lpRewards.descriptor": "Зібрано {{symbol}} нагород", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} до {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} за {{amountWithSymbolB}}", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} і {{amountWithSymbolB}}", - "addLiquidity.shareOfPool": "Частка пулу", - "addressInput.recipient": "одержувач", - "analytics.allow": "Дозволити аналітику", - "analytics.allow.message": "Ми використовуємо анонімні дані, щоб покращити ваш досвід роботи з продуктами Uniswap Labs.", - "appRating.button.notReally": "Не зовсім", - "appRating.description": "Повідомте нас, якщо вам подобається цей додаток", - "appRating.extension.review.description": "Виберіть оцінку та залиште відгук у веб-магазині Chrome.", - "appRating.extension.review.title": "Переглянути розширення Uniswap?", - "appRating.extension.title": "Подобається розширення Uniswap?", - "appRating.feedback.button.send": "Надіслати відгук", - "appRating.feedback.description": "Повідомте нам, як ми можемо покращити ваш досвід", - "appRating.feedback.title": "Нам прикро це чути.", - "appRating.mobile.title": "Подобається гаманець Uniswap?", - "bridgedAsset.modal.button": "Продовжуйте обмінюватися", - "bridgedAsset.modal.description": "Це {{chainName}} версія {{currencySymbol}} , яка підтримується та має ту саму ціну, що й нативна {{currencySymbol}}.", - "bridgedAsset.modal.feature.securelyBacked": "Надійно підкріплено", - "bridgedAsset.modal.feature.securelyBacked.description": "1:1 з підтримкою рідного {{currencySymbol}}.", - "bridgedAsset.modal.feature.tradeSeamlessly": "Торгуйте безперешкодно", - "bridgedAsset.modal.feature.tradeSeamlessly.description": "Купуйте та продавайте {{currencySymbol}} , не виходячи з Uniswap.", - "bridgedAsset.modal.feature.withdrawToNativeChain": "Вивести до {{nativeChainName}}", - "bridgedAsset.modal.feature.withdrawToNativeChain.description": "Підключіться до рідної мережі будь-коли.", - "bridgedAsset.modal.title": "Торгівля {{currencySymbol}} на {{chainName}}", - "bridgedAsset.send.warning.description": "Ви надсилаєте загорнуту версію {{currencySymbol}} на {{chainName}}. Надсилання її на централізовану біржу призведе до безповоротної втрати коштів.", - "bridgedAsset.send.warning.title": "Переконайтеся, що ви надсилаєте на сумісну адресу", - "bridgedAsset.tdp.description": "Це мостова версія {{currencySymbol}} , що підтримується власним {{currencySymbol}}у співвідношенні 1:1.", - "bridgedAsset.wormhole.button": "Продовжити до червоточини", - "bridgedAsset.wormhole.description": "Продовжуйте до порталу червоточини, щоб подолати {{currencySymbol}} з {{chainName}} до {{nativeChainName}}.", - "bridgedAsset.wormhole.title": "Вивести з {{currencySymbol}} до {{nativeChainName}}", - "bridgedAsset.wormhole.toNativeChain": "до {{nativeChainName}}", - "bridgedAsset.wormhole.withdrawToNativeChain": "Вивести до {{nativeChainName}}", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}хв {{seconds}}с", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}хв", - "bridging.estimatedTime.secondsOnly": "~{{seconds}}с", - "chart.candlestick": "Свічник", - "chart.error.pools": "Не вдалося відобразити історичні дані для поточного пулу.", - "chart.error.tokens": "Не вдалося відобразити історичні дані для поточного маркера.", - "chart.line": "Лінійна діаграма", - "chart.missingData": "Відсутні дані діаграми", - "chart.price.label.close": "Закрити", - "chart.price.label.high": "Високий", - "chart.price.label.low": "Низький", - "chart.price.label.open": "ВІДЧИНЕНО", - "chart.settings.unavailable.label": "Цей параметр недоступний для поточної діаграми", - "claim.thanks": "Дякуємо, що є частиною спільноти Uniswap ", - "claim.uni.arrived": "УНІ прибув", - "common.about": "про", - "common.accept": "прийняти", - "common.active": "Активний", - "common.activeNetworks": "Активні мережі", - "common.activity": "діяльність", - "common.add.label": "додати", - "common.add.liquidity.canceled": "Додавання ліквідності скасовано", - "common.addLiquidity": "Додати ліквідність", - "common.address": "Адреса", - "common.addressOrENS": "Адреса гаманця або ім’я ENS", - "common.advanced": "Просунутий", - "common.all": "всі", - "common.allTime": "Весь час", - "common.and": "і", - "common.app": "додаток", - "common.approved": "Затверджено", - "common.approvePending": "Очікується на схвалення...", - "common.approvePermitTx": "Схвалити запит {{indexText}}", - "common.approvePermitTx.active": "Схвалити запит{{indexText}} у гаманці", - "common.approvePermitTx.explainer": "Що таке схвалення Permit2?", - "common.approvePermitTx.pending": "Схвалення запиту {{indexText}}...", - "common.approveSpend": "Затвердити {{symbol}} витрати", - "common.approving": "Схвалення", - "common.approximatelyValue": "~{{value}}", - "common.areYouSure": "Ти впевнений?", - "common.automatic": "Авто", - "common.availableIn": "Uniswap доступний у: ", - "common.availableOnIOSAndroidChrome": "Доступно для iOS, Android і Chrome", - "common.backToPositions": "Назад на позиції", - "common.bestRoute": "Маршрут", - "common.bestRoute.with": "Маршрут через {{provider}}", - "common.biometrics.generic": "Біометрія", - "common.biometrics.touchId": "Сенсорний ідентифікатор", - "common.biometrics.windowsHello": "Привіт Windows", - "common.blocked.ifError": "Якщо ви вважаєте, що це помилка, надішліть електронний лист із вашою адресою на адресу ", - "common.blocked.reason": "Ця адреса заблокована в інтерфейсі Uniswap Labs, оскільки вона пов’язана з однією або кількома заблокованими діями.", - "common.blockedAddress": "Заблокована адреса", - "common.blog": "Блог", - "common.bought": "Купив", - "common.brandAssets": "Активи бренду", - "common.button.accept": "прийняти", - "common.button.back": "Назад", - "common.button.buy": "купити", - "common.button.cancel": "Скасувати", - "common.button.checkin": "Перевірь", - "common.button.close": "Закрити", - "common.button.confirm": "Підтвердити", - "common.button.connect": "Підключитися", - "common.button.continue": "Продовжити", - "common.button.copied": "Скопійовано", - "common.button.copy": "Копія", - "common.button.create": "Створити", - "common.button.delete": "Видалити", - "common.button.disable": "Вимкнути", - "common.button.disabling": "Вимкнення", - "common.button.disconnect": "Відключити", - "common.button.dismiss": "Відхилити", - "common.button.done": "Готово", - "common.button.edit": "Редагувати", - "common.button.enable": "Увімкнути", - "common.button.finish": "Закінчити", - "common.button.goBack": "Повертайся", - "common.button.later": "Можливо пізніше", - "common.button.learn": "Вивчайте більше", - "common.button.next": "Далі", - "common.button.notNow": "Не зараз", - "common.button.ok": "в порядку", - "common.button.paste": "Вставити", - "common.button.pay": "платити", - "common.button.proceed": "Продовжуйте", - "common.button.receive": "Отримати", - "common.button.remove": "видалити", - "common.button.reset": "Скинути", - "common.button.retry": "Повторіть спробу", - "common.button.reveal": "Розкрити", - "common.button.review": "огляд", - "common.button.save": "зберегти", - "common.button.scrollDown": "Прокрути вниз", - "common.button.sell": "Продати", - "common.button.send": "Надіслати", - "common.button.setup": "Налаштувати", - "common.button.share": "Поділіться", - "common.button.showLess": "Показувати менше", - "common.button.showMore": "Показати більше", - "common.button.sign": "Знак", - "common.button.skip": "Пропустити", - "common.button.swap": "Обмін", - "common.button.tryAgain": "Спробуйте знову", - "common.button.understand": "Я розумію", - "common.button.unlock": "Розблокувати", - "common.button.view": "Переглянути", - "common.button.viewDetails": "Переглянути деталі", - "common.button.yes": "Так", - "common.buy.label": "купити", - "common.buyAndSell": "Купуйте та продавайте на Uniswap", - "common.cancellationSubmitted": "Скасування подано", - "common.cancellationSuccessful": "Скасування успішно", - "common.cancelOrder": "Відмінити замовлення", - "common.card.error.description": "Щось пішло не так", - "common.card.error.title": "Ой! Щось пішло не так.", - "common.careers": "Кар'єра", - "common.chain.networkCost": "{{chain}} вартість мережі", - "common.chart": "Діаграма", - "common.checkNetwork": "Перевірте стан мережі тут.", - "common.chromeExtension": "Розширення", - "common.claim.failed": "Претензія не вдалася", - "common.claimed": "Заявлено", - "common.claiming": "Вимагаючи", - "common.claimUnis": "Вимагайте свої токени UNI", - "common.clear": "ясно", - "common.close": "Закрити", - "common.closed": "ЗАЧИНЕНО", - "common.collect.button": "Збирати", - "common.company": "Компанія", - "common.confirm": "Підтвердити", - "common.confirmCancellation": "Підтвердити скасування", - "common.confirmed": "Підтверджено", - "common.confirmSend.button": "Підтвердити відправку", - "common.confirmSwap": "Підтвердити обмін у гаманці", - "common.confirmTimedOut": "Час підтвердження минув. Будь ласка, повторіть спробу.", - "common.confirmTransfer": "Підтвердити переказ", - "common.confirmWallet": "Підтвердити в гаманці", - "common.connect.button": "Підключитися", - "common.connectAWallet.button": "Підключіть гаманець", - "common.connectAWallet.button.evm": "Підключіть гаманець Ethereum", - "common.connectAWallet.button.evm.switch": "Переключити гаманець Ethereum", - "common.connectAWallet.button.svm": "Підключіть гаманець Solana", - "common.connectAWallet.button.svm.switch": "Гаманець Switch Solana", - "common.connectAWallet.button.switch": "Змінити гаманець", - "common.connectTo": "Підключитися до {{platform}}", - "common.connectWallet.button": "Підключити гаманець", - "common.contactUs.button": "Зв'яжіться з нами", - "common.copied": "Скопійовано", - "common.copy.address": "Скопіюйте адресу", - "common.copy.poolId": "Копіювати ідентифікатор пулу", - "common.copyLink.button": "Копіювати посилання", - "common.created.date": "Створено {{date}}", - "common.currency": "Валюта", - "common.currentPrice": "Поточна ціна", - "common.custom": "Custom", - "common.customRange": "Спеціальний діапазон", - "common.dataOutdated": "Дані можуть бути застарілими", - "common.day": "день", - "common.default": "За замовчуванням", - "common.defaultTradeOptions": "Опції торгівлі за замовчуванням", - "common.deposit.toNetwork": "Внесіть токени в мережу {{label}} .", - "common.depositing": "Депонування", - "common.depositTokens": "Депозитні жетони", - "common.detected": "Виявлено", - "common.developers": "Розробники", - "common.device": "Цей пристрій", - "common.device.other": "Інший пристрій", - "common.dismiss": "Відхилити", - "common.docs": "Документи", - "common.donate": "Пожертвуйте", - "common.done": "Готово", - "common.dontShowAgain": "Не показувати це знову", - "common.download": "Завантажити", - "common.downloadAppStore": "Завантажте в App Store", - "common.downloadPlayStore": "Завантажити в магазині Play", - "common.downloadUniswapApp": "Завантажте програму Uniswap", - "common.downloadUniswapWallet": "Завантажити гаманець Uniswap", - "common.dynamic": "Динамічний", - "common.edit.button": "Редагувати", - "common.ended": "Завершено", - "common.error.details": "Деталі помилки", - "common.error.general": "Щось пішло не так", - "common.error.label": "Помилка", - "common.error.request": "На жаль, під час обробки вашого запиту сталася помилка. Якщо ви запитуєте підтримку, обов’язково скопіюйте деталі цієї помилки.", - "common.error.somethingWrong": "Щось пішло не так!", - "common.errorConnecting.error": "Помилка з'єднання", - "common.errorLoadingData.error": "Помилка завантаження даних", - "common.etherscan": "Etherscan", - "common.expiry": "Термін дії", - "common.explore": "Досліджуйте", - "common.explorer": "Провідник", - "common.exploreTokens": "Дослідіть жетони", - "common.extension": "Розширення Uniswap", - "common.failedSwitchNetwork": "Не вдалося змінити мережу", - "common.fee": "Комісія", - "common.fees": "Збори", - "common.feesEarned": "Зароблені гонорари", - "common.feesEarnedPerBase": "{{symbolA}} на {{symbolB}}", - "common.for": "для", - "common.free": "Безкоштовно", - "common.fullRange": "Повний діапазон", - "common.getApp": "Отримати додаток", - "common.getHelp.button": "Отримати допомогу", - "common.getStarted": "Почніть роботу", - "common.getSupport.button": "Отримати підтримку", - "common.getTheApp": "Отримати програму", - "common.getUniswapWallet": "Отримайте гаманець Uniswap", - "common.getUniswapWallet.mobile": "Завантажте мобільний додаток Uniswap", - "common.governance": "Управління", - "common.happyHolidays": "Веселих свят від команди Uniswap!", - "common.help": "Допомога", - "common.helpCenter": "Центр допомоги", - "common.hidden": "Прихований", - "common.hide.button": "Сховати", - "common.highPrice": "Висока ціна", - "common.includes": "Включає в себе", - "common.info.label": "Інформація", - "common.input.noRecipient.error": "Виберіть одержувача", - "common.input.password.confirm": "Підтвердьте пароль", - "common.input.password.error.mismatch": "Паролі не збігаються", - "common.input.password.error.weak": "Цей пароль надто слабкий", - "common.input.password.new": "Новий пароль", - "common.input.password.placeholder": "Пароль", - "common.input.password.strength.medium": "Медіум", - "common.input.password.strength.strong": "Сильний", - "common.input.password.strength.weak": "Слабкий", - "common.input.search": "Пошук", - "common.insufficient.funds": "Недостатньо коштів", - "common.insufficientBalance.error": "Недостатній баланс", - "common.insufficientFundsForNetworkFee.error": "Недостатньо коштів для покриття витрат на мережу", - "common.insufficientTokenBalance.error": "Недостатній баланс {{tokenSymbol}}", - "common.insufficientTokenBalance.error.simple": "Недостатньо {{tokenSymbol}}", - "common.invalidPair": "Недійсна пара", - "common.invalidRecipient.error": "Недійсний одержувач", - "common.iOSAndroid": "iOS і Android", - "common.language": "Мова", - "common.learnMoreSwap": "Дізнайтеся більше про свопи", - "common.legalAndPrivacy": "Юридична інформація та конфіденційність", - "common.less": "менше", - "common.limit.cancel_one": "Скасувати ліміт", - "common.limit.cancel_other": "Скасувати ліміти {{count}}", - "common.limit.canceled": "Ліміт скасовано", - "common.limit.executed": "Ліміт виконано", - "common.limit.expired": "Ліміт закінчився", - "common.limit.failed": "Помилка обмеження", - "common.limit.opened": "Ліміт відкрито", - "common.limit.pending": "Очікується ліміт", - "common.limits": "Межі", - "common.limits.approachMax": "Наближається максимум до 100", - "common.limits.cancelProceed": "Щоб продовжити, скасуйте обмеження", - "common.limits.expires": "Термін дії закінчується {{timestamp}}", - "common.limits.open": "Відкриті ліміти", - "common.limits.when": "коли {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "Посилання", - "common.liquidity": "Ліквідність", - "common.liquidity.provision": "Забезпечення ліквідності", - "common.liquidity.removed": "Вилучено ліквідність", - "common.loading": "Завантаження", - "common.longText.button.less": "Читайте менше", - "common.longText.button.more": "Читати далі", - "common.lowPrice": "Низька ціна", - "common.manage": "Керувати", - "common.market.label": "Ринок", - "common.marketPrice": "Ринкова ціна", - "common.marketPrice.fetching": "Отримання ринкової ціни...", - "common.marketPrice.label": "Ринкова ціна:", - "common.marketPrice.unavailable": "Ринкова ціна не знайдена. Проведіть власне дослідження, щоб уникнути втрати коштів.", - "common.max": "Макс", - "common.message": "повідомлення", - "common.migrate": "Мігрувати", - "common.migrate.liquidity.failed": "Не вдалося перенести ліквідність", - "common.migrate.position": "Мігрувати позицію", - "common.migrated.liquidity": "Перенесена ліквідність", - "common.migrating.liquidity": "Мігруюча ліквідність", - "common.min": "Хв", - "common.more": "більше", - "common.moreDetails": "Більше деталей", - "common.navigation.settings": "Налаштування", - "common.navigation.systemSettings": "Налаштування", - "common.navigationButton": "Кнопка навігації", - "common.needHelp": "Потрібна допомога?", - "common.networkCost": "Вартість мережі", - "common.neverMind": "Не зважай", - "common.new": "новий", - "common.new.exclamation": "Новинка!", - "common.nft": "NFT", - "common.nfts": "NFT", - "common.noAmount.error": "Введіть суму", - "common.noData": "Немає даних", - "common.none": "Жоден", - "common.noResults": "Нічого не знайдено.", - "common.notAvailableInRegion.error": "Недоступно у вашому регіоні", - "common.notCreated.label": "Не створений", - "common.notSupported": "Не підтримується", - "common.oneDay": "1 день", - "common.oneDay.short": "1D", - "common.oneHour.short": "1H", - "common.oneMonth": "1 місяць", - "common.oneWeek": "1 тиждень", - "common.oneYear": "1 рік", - "common.opensea.link": "Переглянути на OpenSea", - "common.orderCanceled": "Замовлення скасовано", - "common.orderExecuted": "Замовлення виконано", - "common.orderExpired": "Термін дії замовлення минув", - "common.orderPending": "Замовлення очікує на розгляд", - "common.outOfRange": "За межою", - "common.pageNotFound": "Сторінку не знайдено!", - "common.passkey.count": "Ключ доступу {{number}}", - "common.passkeys": "Ключі доступу", - "common.passkeys.add": "Додайте ключ доступу", - "common.passkeys.add.description": "Виберіть місце для збереження нового пароля.", - "common.pastDay": "Минулий день", - "common.pastFiveMinutes": "Останні п'ять хвилин", - "common.pastHour": "Минула година", - "common.pastMonth": "Минулий місяць", - "common.pastWeek": "Минулий тиждень", - "common.pastYear": "Минулий рік", - "common.pending": "В очікуванні", - "common.pending.cancellation": "Очікує скасування", - "common.pendingEllipsis": "В очікуванні...", - "common.permit": "Дозвіл", - "common.plusMore": "+{{number}} більше", - "common.pool": "Басейн", - "common.pools": "Басейни", - "common.portfolio": "Портфоліо", - "common.poweredBy": "Працює на ", - "common.price": "Ціна", - "common.priceUpdated": "Ціна оновлена", - "common.privacyChoices": "Ваш вибір конфіденційності", - "common.privacyChoices.checkbox.description": "Якщо позначено, ми не передаємо ваші дані стороннім партнерам для персоналізованої реклами. Ви можете будь-коли ввімкнути спільний доступ, знявши цей прапорець.", - "common.privacyChoices.checkbox.label": "Не передавайте мою інформацію", - "common.privacyChoices.description": "Ми можемо надавати ідентифікатори пристроїв нашим рекламним партнерам для просування наших послуг на інших веб-сайтах і платформах. Якщо відповідно до чинного законодавства це кваліфікується як продаж, розповсюдження чи цільова реклама, ви можете відмовитися, встановивши прапорець «Не передавати мою інформацію». Щоб дізнатися більше про нашу політику конфіденційності, перегляньте нашу Політику конфіденційності.", - "common.privacyChoices.disclaimer": "Зверніть увагу, що ваш вибір буде застосовано лише до цього браузера на цьому пристрої. Ви також можете відмовитися, увімкнувши налаштування Global Privacy Control у веб-переглядачі, який ви використовуєте для доступу до наших служб. Щоб побачити більше параметрів, перейдіть до налаштувань.", - "common.privacyPolicy": "Політика конфіденційності", - "common.proceed": "Продовжуйте", - "common.proceedInWallet": "Продовжуйте в своєму гаманці", - "common.products": "Продукти", - "common.protocol": "Протокол", - "common.protocol.v2": "Uniswap v2", - "common.protocol.v3": "Uniswap v3", - "common.protocol.v4": "Uniswap v4", - "common.purchased": "Придбаний", - "common.rate": "Оцінка", - "common.readMore": "Читати далі", - "common.receive": "Отримати", - "common.received": "Отримано", - "common.recent": "Останні", - "common.refresh": "Оновити", - "common.reload.label": "Перезавантажте програму", - "common.remove.label": "видалити", - "common.remove.liquidity.canceled": "Видалення ліквідності скасовано", - "common.remove.liquidity.failed": "Не вдалося видалити ліквідність", - "common.removing.liquidity": "Зняття ліквідності", - "common.resetLimit": "Скинути ліміт {{symbol}}", - "common.resetLimitWallet": "Скиньте {{symbol}} ліміт у гаманці", - "common.resettingLimit": "Скидання ліміту {{symbol}} ...", - "common.revoke.approval.failed": "Не вдалося скасувати схвалення", - "common.revoked.approval": "Відкликане затвердження", - "common.revoking.approval": "Скасування схвалення", - "common.scanQRDownload": "Відскануйте QR-код телефоном, щоб завантажити", - "common.selectRegion.label": "Виберіть свій регіон", - "common.selectToken.label": "Виберіть маркер", - "common.sell.label": "Продати", - "common.send.button": "Надіслати", - "common.send.failed": "Не вдалося надіслати", - "common.sending": "Відправка", - "common.sent": "Надісланий", - "common.settings": "Налаштування", - "common.share": "Поділіться", - "common.share.shareToTwitter": "Поділитися в Twitter", - "common.show.button": "Показати", - "common.showLess.button": "Показувати менше", - "common.showMore.button": "Показати більше", - "common.signatureExpired": "Термін дії вашого підпису минув.", - "common.signMessage": "Підписати повідомлення", - "common.signMessageWallet": "Підписати повідомлення в гаманці", - "common.socials": "Соціальні мережі", - "common.sold": "Продано", - "common.stats": "статистика", - "common.status": "Статус", - "common.step.number": "Крок {{number}}", - "common.step.number.of": "Крок {{current}} від {{total}}", - "common.swap": "Обмін", - "common.swap.expired": "Термін обміну минув", - "common.swap.failed": "Помилка обміну", - "common.swapPending": "Очікується обмін...", - "common.termsOfService": "Умови використання", - "common.text.connected": "Підключено", - "common.text.contract": "Договір", - "common.text.disconnected": "Відключено", - "common.text.error": "Помилка", - "common.text.notAvailable": "N/A", - "common.text.recipient": "до", - "common.text.sender": "Від", - "common.text.unknown": "Невідомий", - "common.thisAccount": "цей рахунок", - "common.thisMonth": "Цього місяця", - "common.thisToken": "Цей маркер", - "common.thisWeek": "Цього тижня", - "common.thisYear": "Цього року", - "common.time": "час", - "common.time.minute.amt": "{{time}}м", - "common.time.minutes": "хвилин", - "common.time.past.days": "{{days}} днів", - "common.time.past.days.short": "{{days}}d", - "common.time.past.hours": "{{hours}} годин", - "common.time.past.hours.short": "{{hours}}год", - "common.time.past.minutes.short": "{{minutes}}м", - "common.time.past.months.short": "{{months}}міс", - "common.time.past.seconds.short": "{{seconds}}с", - "common.to": "до", - "common.today": "Сьогодні", - "common.tokenA": "Токен А", - "common.tokenAmount": "Символічна сума", - "common.tokenB": "Токен Б", - "common.tokenName": "Назва токена", - "common.tokens": "Жетони", - "common.totalUniswapTVL": "Загальний TVL Uniswap", - "common.totalValueLocked": "TVL", - "common.trade": "Торгівля", - "common.trademarkPolicy": "Політика щодо торгових марок", - "common.transactionDetails": "Деталі транзакції", - "common.transactionId": "ID транзакції", - "common.transactionPending": "Трансакція очікує на розгляд", - "common.transactions": "транзакції", - "common.transactionSettings": "Налаштування транзакцій", - "common.transfer_one": "передача", - "common.transfer_other": "перекази", - "common.tryAgain.error": "Спробуйте знову", - "common.twitter": "Twitter", - "common.type.label": "Тип", - "common.unavailable": "Недоступний", - "common.unhide": "Показати", - "common.unichain": "Юнічейн", - "common.uniswapMobile": "Uniswap Mobile", - "common.uniswapWallet": "Гаманець Uniswap", - "common.uniswapX": "UniswapX", - "common.unknown": "Невідомий", - "common.unknownError.error": "Невідома помилка", - "common.unwrap.button": "Розгорніть", - "common.unwrap.failed": "Не вдалося розгорнути", - "common.unwrapped": "Розгорнутий", - "common.unwrapping": "Розгортання", - "common.view.profile": "Переглянути профіль", - "common.viewOnExplorer": "Переглянути в Провіднику", - "common.volume": "Обсяг", - "common.vote": "Голосуйте", - "common.wallet.approve": "Підтвердити в гаманці", - "common.wallet.label": "Гаманець", - "common.warning": "УВАГА", - "common.webApp": "Веб-додаток", - "common.website": "Веб-сайт", - "common.whyApprove": "Чому я маю схвалити маркер?", - "common.whySign": "Чому потрібні підписи?", - "common.whyWrap": "Чому я маю загортати свій {{symbol}}?", - "common.withdraw": "Зняти", - "common.withdrawal.amount": "Сума зняття", - "common.withinRange": "В діапазоні", - "common.wrap": "Оберніть {{symbol}}", - "common.wrap.failed": "Помилка перегортання", - "common.wrapIn": "Загорніть {{symbol}} в гаманець", - "common.wrapped": "Загорнутий", - "common.wrapping": "обгортання", - "common.wrappingToken": "Обгортання {{symbol}}...", - "common.yesterday": "вчора", - "common.your.account.had.insufficient.funds": "На вашому рахунку недостатньо коштів для завершення цього обміну.", - "common.your.account.has.insufficient.funds": "На вашому рахунку недостатньо коштів для завершення цього обміну.", - "common.your.connected.wallet": "Ваш підключений гаманець", - "common.your.limit.could.not.be.fulfilled": "Ваш ліміт наразі неможливо виконати. Будь ласка спробуйте ще раз.", - "common.your.swap.could.not.be.fulfilled": "Зараз не вдалося здійснити обмін. Будь ласка спробуйте ще раз.", - "common.youreBuying": "Ви купуєте", - "common.youReceive": "Ви отримуєте", - "common.youreSelling": "Ви продаєте", - "currency.ars": "Аргентинський песо", - "currency.aud": "Австралійський долар", - "currency.brl": "бразильський реал", - "currency.cad": "канадський долар", - "currency.cny": "Китайський юань", - "currency.cop": "Колумбійський песо", - "currency.eur": "євро", - "currency.gbp": "Британський фунт", - "currency.hkd": "Гонконгський долар", - "currency.idr": "індонезійська рупія", - "currency.inr": "Індійська рупія", - "currency.jpy": "Японська ієна", - "currency.krw": "південнокорейська вона", - "currency.mxn": "Мексиканське песо", - "currency.ngn": "Нігерійська Найра", - "currency.pkr": "Пакистанська рупія", - "currency.rub": "російський рубль", - "currency.sgd": "Сінгапурський долар", - "currency.try": "Турецька ліра", - "currency.uah": "українська гривня", - "currency.usd": "Долар США", - "currency.vnd": "В'єтнамський донг", - "dapp.request.actionCannotBeCompleted.description": "Деякі функції недоступні, оскільки налаштуваннями вашого смарт-гаманця керує інший додаток-гаманець.", - "dapp.request.actionCannotBeCompleted.header": "Запит на підпис", - "dapp.request.actionCannotBeCompleted.title": "Дію неможливо завершити", - "dapp.request.approve.action": "Затвердити", - "dapp.request.approve.fallbackTitle": "Затвердити маркери витрат", - "dapp.request.approve.helptext": "Дозвольте цьому сайту отримати доступ і витратити цей маркер із вашого гаманця.", - "dapp.request.approve.label": "Гаманець", - "dapp.request.approve.title": "Затвердити витрати {{tokenSymbol}}", - "dapp.request.base.title": "Запит на транзакцію", - "dapp.request.bridge.description": "Переміщуйте ETH, USDC тощо в {{numChains}}+ мережах.", - "dapp.request.bridge.title": "Намагаєтеся подолати?", - "dapp.request.connect.helptext": "Дозвольте цьому сайту переглядати адресу вашого гаманця, баланс і запитувати схвалення транзакцій.", - "dapp.request.connect.title": "Підключитися до сайту", - "dapp.request.fallback.calldata.label": "Необроблені дані", - "dapp.request.fallback.function.label": "функція", - "dapp.request.permit2.description": "Permit2 керує схваленням токенів у кількох прикладних програмах.", - "dapp.request.permit2.header": "Підписати дозвіл 2", - "dapp.request.permit2approve.action": "Затвердити", - "dapp.request.permit2approve.helptext": "Permit2 керує схваленням токенів у кількох прикладних програмах.", - "dapp.request.permit2approve.title": "Затвердити дозвіл2", - "dapp.request.reject.action": "Відкинути всі", - "dapp.request.reject.info": "У вас {{totalRequestCount}} запити на транзакції", - "dapp.request.revoke.action": "Відкликати", - "dapp.request.revoke.helptext": "Дозвольте цьому сайту скасувати доступ, щоб витрачати цей маркер на транзакції. Переконайтеся, що ви довіряєте цьому сайту.", - "dapp.request.revoke.title": "Скасувати доступ до {{tokenSymbol}}", - "dapp.request.signature.containsUnrenderableCharacters": "Це повідомлення містить символи, які неможливо відобразити. Переконайтеся, що ви довіряєте цьому сайту.", - "dapp.request.signature.decodeError": "Не вдалося декодувати повідомлення", - "dapp.request.signature.header": "Запит на підпис", - "dapp.request.signature.irregular": "Нерегулярний запит на підпис", - "dapp.request.signature.irregular.description": "Перш ніж продовжити, переконайтеся, що ви довіряєте цьому сайту", - "dapp.request.signature.irregular.understand": "Я розумію ризики", - "dapp.request.signature.toggleDataView.raw": "Переглянути необроблені дані", - "dapp.request.signature.toggleDataView.readable": "Переглянути вихідні дані", - "dapp.request.warning.notActive.message": "Переконайтеся, що він правильний", - "dapp.request.warning.notActive.title": "Це не ваш активний гаманець", - "delegation.upgradeModal.description": "Це оновлення гаманця використовує смарт-контракти для швидших та дешевших транзакцій. Дізнатися більше", - "delegation.upgradeModal.enableSmartWallet": "Увімкнути розумний гаманець", - "delegation.upgradeModal.title": "Розумніші обміни, нижчі витрати", - "downloadApp.modal.connectExistingWallet": "Підключіть існуючий гаманець", - "downloadApp.modal.getStarted.description": "Миттєво отримуйте доступ до тисяч токенів через найбільший у світі ончейн-маркетплейс.", - "downloadApp.modal.getStarted.title": "Почніть обмін за лічені секунди", - "downloadApp.modal.getTheApp.title": "Почніть роботу з Uniswap", - "downloadApp.modal.uniswapProducts.subtitle": "Продукти Uniswap бездоганно працюють разом, щоб створити найкращий досвід роботи в мережі.", - "empty.swap.button.text": "Додати кошти до обміну", - "error.dataUnavailable": "Дані наразі недоступні; ми працюємо над виправленням", - "error.id": "Ідентифікатор помилки: {{eventId}}", - "error.jupiterApi.execute.default.title": "Щось пішло не так з API Jupiter. Спробуйте ще раз.", - "error.jupiterApi.failedToLand": "(Код {{code}}: Транзакцію не вдалося здійснити в мережі)", - "error.jupiterApi.invalidBlockHeight": "(Код -1004: Недійсна висота блоку)", - "error.jupiterApi.invalidMessageBytes": "(Код -3: Недійсні байти повідомлення)", - "error.jupiterApi.invalidPayload": "(Код -2002: Недійсне корисне навантаження)", - "error.jupiterApi.invalidSignedTransaction": "(Код -2: Недійсна підписана транзакція)", - "error.jupiterApi.invalidTransaction": "(Код -1002: Недійсна транзакція)", - "error.jupiterApi.missingCachedOrder": "(Код -1: Відсутнє кешоване замовлення)", - "error.jupiterApi.notFullySigned": "(Код -1003: Транзакція не повністю підписана)", - "error.jupiterApi.quoteExpired": "Час очікування цієї цитати минув, спробуйте ще раз. (Код -2003)", - "error.jupiterApi.unknownErrorCode": "(Код {{code}})", - "error.noData": "Даних не знайдено", - "error.request.provideId": "На жаль, під час обробки вашого запиту сталася помилка. Якщо ви запитуєте підтримку, обов’язково вкажіть свій ідентифікатор помилки.", - "error.tokenApproval": "Не вдалося затвердити маркер", - "error.tokenApproval.message": "Ймовірно, проблема з мережею або підключенням спричинила невдачу схвалення. Перевірте підключення та повторіть спробу.", - "error.tokenApprovalEdited": "Недостатня сума схвалення", - "error.tokenApprovalEdited.message": "Сума схвалення, встановлена у вашому гаманці, занизька для завершення цієї транзакції. Спробуйте ще раз і збільште суму.", - "errors.crash.message": "Щось розбилося.", - "errors.crash.restart": "Перезапустіть програму", - "errors.crash.title": "Ой-ой!", - "explore.more.pools": "Дослідіть більше басейнів", - "explore.more.unichain": "Досліджуйте пули Unichain", - "explore.search.label.ownedBy": "Належить {{ownerAddress}}", - "explore.search.placeholder": "Пошук жетонів і гаманців", - "explore.search.section.nft": "Колекції NFT", - "explore.search.section.popularNFT": "Популярні колекції NFT", - "explore.search.section.wallets": "Гаманці", - "explore.tokens.error": "Не вдалося завантажити маркери", - "explore.tokens.favorite.action.add": "Улюблений жетон", - "explore.tokens.favorite.action.edit": "Редагувати вибране", - "explore.tokens.favorite.action.remove": "Видалити улюблене", - "explore.tokens.favorite.title.default": "Улюблені жетони", - "explore.tokens.favorite.title.edit": "Редагувати улюблені маркери", - "explore.tokens.metadata.marketCap": "{{number}} Мкап", - "explore.tokens.metadata.totalValueLocked": "{{number}} ТВЛ", - "explore.tokens.metadata.volume": "{{number}} Том", - "explore.tokens.sort.label.marketCap": "Ринкова капіталізація", - "explore.tokens.sort.label.priceDecrease": "Зниження ціни", - "explore.tokens.sort.label.priceIncrease": "Підвищення ціни", - "explore.tokens.sort.label.totalValueLocked": "TVL", - "explore.tokens.sort.label.volume": "Обсяг", - "explore.tokens.sort.option.marketCap": "Ринкова капіталізація", - "explore.tokens.sort.option.priceDecrease": "Зниження ціни (24H)", - "explore.tokens.sort.option.priceIncrease": "Підвищення ціни (24H)", - "explore.tokens.sort.option.totalValueLocked": "Uniswap TVL", - "explore.tokens.sort.option.volume": "Обсяг Uniswap (24 години)", - "explore.tokens.top.title": "Топ жетонів", - "explore.v2TVL": "v2 TVL", - "explore.v3TVL": "v3 TVL", - "explore.v4TVL": "v4 TVL", - "explore.wallets.favorite.action.add": "Улюблений гаманець", - "explore.wallets.favorite.action.edit": "Редагувати вибране", - "explore.wallets.favorite.action.remove": "Видалити улюблене", - "explore.wallets.favorite.action.remove.short": "Видалити з обраного", - "explore.wallets.favorite.title.default": "Улюблені гаманці", - "explore.wallets.favorite.title.edit": "Редагувати улюблені гаманці", - "extension.connection.network": "Мережа", - "extension.connection.networks": "мережі", - "extension.connection.popup.trouble": "Проблеми з підключенням?", - "extension.connection.titleConnected": "Підключено", - "extension.connection.titleNotConnected": "Не з'єднано", - "extension.lock.button.forgot": "Забули пароль?", - "extension.lock.button.reset": "Скинути гаманець", - "extension.lock.button.submit": "Розблокувати", - "extension.lock.password.error": "Неправильний пароль. Спробуйте знову", - "extension.lock.password.reset.initial.description": "Uniswap не може допомогти відновити ваш пароль. Вам потрібно скинути налаштування гаманця, повторно ввівши фразу відновлення з 12 слів.", - "extension.lock.password.reset.initial.help": "Де я можу знайти фразу для відновлення?", - "extension.lock.password.reset.initial.title": "Забули пароль", - "extension.lock.password.reset.speedbump.description": "Переконайтеся, що у вас є фраза для відновлення з 12 слів, перш ніж скинути налаштування гаманця. Інакше ви не зможете повернути свої кошти.", - "extension.lock.password.reset.speedbump.help": "Я втратив фразу для відновлення", - "extension.lock.password.reset.speedbump.title": "Перш ніж продовжити", - "extension.lock.subtitle": "Введіть свій пароль, щоб розблокувати", - "extension.lock.title": "З поверненням", - "extension.network.notSupported": "Непідтримувана мережа", - "extension.open": "Відкрийте розширення Uniswap", - "extension.passwordPrompt.error.wrongPassword": "Неправильний пароль. Спробуйте знову", - "extension.passwordPrompt.title": "Введіть ваш пароль", - "extension.popup.chrome.button": "Відкрити розширення", - "extension.popup.chrome.description": "Завершіть цю дію, відкривши розширення Uniswap.", - "extension.popup.chrome.title": "Продовжте в Uniswap", - "extension.settings.defaultWallet.message": "Надайте пріоритет розширенню Uniswap під час підключення до програм.", - "extension.settings.defaultWallet.title": "Зробити гаманець за умовчанням", - "extension.uninstall.reason.missingFeatures": "Гаманцю Uniswap бракує певних функцій", - "extension.uninstall.reason.notUsingCrypto": "Я більше не хочу використовувати криптовалюту", - "extension.uninstall.reason.other": "Інші причини", - "extension.uninstall.reason.switchingWallet": "Я переходжу на інший гаманець", - "extension.uninstall.subtitle": "Якщо у вас є хвилинка, ми хотіли б почути, чому ви видалили Uniswap Wallet", - "extension.uninstall.title": "Нам сумно бачити, що ти йдеш", - "extension.warning.storage.button": "Резервне копіювання", - "extension.warning.storage.message": "Обов’язково створіть резервну копію фрази відновлення, щоб запобігти втраті доступу до гаманця та коштів.", - "extension.warning.storage.title": "У вашому браузері закінчується пам’ять", - "extensionPasskeyLogInPopUp.description": "Імпортуйте свій обліковий запис Uniswap, увійшовши за допомогою існуючого ключа доступу.", - "extensionPasskeyLogInPopUp.invalidReferrer": "Будь ласка, закрийте цю сторінку та спробуйте ще раз.", - "fee.bestForCustomizability": "Найкраще для налаштування.", - "fee.bestForExotic": "Найкраще для екзотичних пар.", - "fee.bestForMost": "Найкраще підходить для більшості пар.", - "fee.bestForStablePairs": "Найкраще для стабільних пар.", - "fee.bestForVeryStable": "Найкраще підходить для дуже стабільних пар.", - "fee.dynamic": "Динамічна плата", - "fee.percentEarned": "%, який ви заробите на комісії.", - "fee.selectPercent": "{{pct}}% вибрати", - "fee.selectPercentDescription": "{{pct}}% ліквідності вибрано цей рівень", - "fee.tier": "Рівень гонорару", - "fee.tier.create": "Створіть рівень комісії", - "fee.tier.create.button": "Створіть новий рівень комісії", - "fee.tier.create.description": "Створення нового рівня ініціалізується в новому пулі та призведе до вищих, ніж зазвичай, мережевих витрат.", - "fee.tier.description": "Зароблена сума, що забезпечує ліквідність. Виберіть суму, яка відповідає вашій толерантності до ризику та стратегії.", - "fee.tier.description.v2": "Зароблена сума, що забезпечує ліквідність. Усі пули v2 мають фіксовану комісію 0,3%. Щоб отримати більше можливостей, надайте ліквідність на v4.", - "fee.tier.dynamic": "Динамічний рівень комісії", - "fee.tier.dynamic.create": "Створення динамічного рівня комісії", - "fee.tier.dynamic.create.info": "Ви збираєтеся створити пул із динамічним рівнем комісії. Перш ніж продовжити, переконайтеся, що вибраний хук підтримує динамічні комісії.", - "fee.tier.highestTvl": "Найвищий TVL", - "fee.tier.label": "%, який ви заробите на комісії", - "fee.tier.missing.description": "Не можете знайти потрібний рівень?", - "fee.tier.new": "Новий рівень", - "fee.tier.percent.select": "{{percentage}} вибрати", - "fee.tier.recommended.description": "Рекомендується на основі найвищої частки ліквідності для вибраної пари токенів.", - "fee.tier.search": "Знайдіть або створіть інші рівні комісії", - "fee.tier.search.short": "Рівні пошуку", - "fee.tier.select": "Виберіть рівень комісії", - "fee.tier.select.existing.button": "Виберіть існуючий рівень комісії", - "fee.tierExact": "{{fee}} рівень комісії", - "fee.unavailable": "Зароблені комісії не відображаються для позицій v2, доки ліквідність не буде вилучено.", - "fee.uncollected": "Включає неотримані збори:", - "fee.uniswap": "Плата ({{percent}})", - "fee.uniswap.description": "Застосовуються комісії для забезпечення найкращого досвіду роботи з Uniswap.", - "fiatOffRamp.checkout.title": "Вивести на", - "fiatOffRamp.connection.quote": "Продам {{amount}} на суму {{currencySymbol}}", - "fiatOffRamp.error.balance": "Перевищує баланс", - "fiatOffRamp.error.populateSend.description": "Будь ласка, зачекайте хвилинку та спробуйте ще раз.", - "fiatOffRamp.error.populateSend.title": "Не вдається завантажити транзакцію", - "fiatOffRamp.summary.total": "{{cryptoAmount}} за {{fiatAmount}}", - "fiatOffRamp.unsupportedToken.back": "Повертайся", - "fiatOffRamp.unsupportedToken.divider": "Непідтримувані токени", - "fiatOffRamp.unsupportedToken.message": "Цей маркер не підтримується для продажу. Замініть цей ресурс на один із підтримуваних токенів.", - "fiatOffRamp.unsupportedToken.swap": "Перейти на підтримуваний маркер", - "fiatOffRamp.unsupportedToken.title": "Непідтримуваний маркер", - "fiatOffRamp.welcome.tooltip": "Продайте свою криптовалюту на свій банківський рахунок або дебетову картку.", - "fiatOnRamp.button.chooseToken": "Виберіть токен", - "fiatOnRamp.buy.info.description": "Він знадобиться вам для оплати мережевих витрат під час заміни.", - "fiatOnRamp.buy.info.title": "Почніть з ETH", - "fiatOnRamp.cexTransferModal.description": "Купівля криптовалюти за допомогою картки не підтримується у вашому регіоні. Переказуйте активи з централізованого біржового рахунку для поповнення свого гаманця.", - "fiatOnRamp.cexTransferModal.title": "Передайте, щоб почати", - "fiatOnRamp.checkout.title": "Перевірити", - "fiatOnRamp.chooseMultiPlatformProvider.chooseNetwork": "Виберіть мережу", - "fiatOnRamp.chooseMultiPlatformProvider.description": "Це визначить адресу гаманця, на який ви отримаєте кошти.", - "fiatOnRamp.chooseProvider.description": "Ви перейдете на портал постачальника, щоб побачити комісії, пов’язані з вашою транзакцією.", - "fiatOnRamp.completeTransactionHeader": "Завершіть транзакцію за допомогою {{serviceProvider}}", - "fiatOnRamp.connection.error": "Підключення не вдалося", - "fiatOnRamp.connection.errorDescription": "Під час підключення до {{serviceProvider}}сталася помилка.", - "fiatOnRamp.connection.message": "Підключення до {{serviceProvider}}", - "fiatOnRamp.connection.quote": "Купівля {{amount}} коштує {{currencySymbol}}", - "fiatOnRamp.connection.terms": "Продовжуючи, ви підтверджуєте, що на вас поширюватимуться Загальні положення та умови та Політика конфіденційності з {{serviceProvider}}, залежно від обставин.", - "fiatOnRamp.continueInTab": "Щоб продовжити, перейдіть на вкладку {{serviceProvider}} . Зараз можна безпечно закрити цей режим.", - "fiatOnRamp.disclaimer": "Продовжуючи, ви підтверджуєте, що на вас поширюватимуться Умови надання послуг і Політика конфіденційності з {{serviceProvider}}, якщо це застосовно.", - "fiatOnRamp.error.default": "Щось пішло не так.", - "fiatOnRamp.error.load": "Не вдалося завантажити токени для покупки", - "fiatOnRamp.error.max": "Максимум {{amount}}", - "fiatOnRamp.error.min": "Мінімум {{amount}}", - "fiatOnRamp.error.noQuotes": "Цитати не знайдено.", - "fiatOnRamp.error.unavailable": "Ця послуга недоступна у вашому регіоні", - "fiatOnRamp.error.unsupported": "Не підтримується в регіоні", - "fiatOnRamp.error.usd": "Доступно лише для покупки в доларах США", - "fiatOnRamp.noQuotes.error": "Цитати не знайдено", - "fiatOnRamp.paymentMethods.applePay": "Apple Pay", - "fiatOnRamp.paymentMethods.bank": "Банк", - "fiatOnRamp.paymentMethods.debit": "Дебет", - "fiatOnRamp.paymentMethods.googlePay": "Google Pay", - "fiatOnRamp.paymentMethods.paypal": "PayPal", - "fiatOnRamp.paymentMethods.venmo": "Венмо", - "fiatOnRamp.quote.advice": "Ви перейдете на портал постачальника, щоб побачити комісії, пов’язані з вашою транзакцією.", - "fiatOnRamp.quote.type.list": "{{optionsList}}та інші параметри", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "З облікового запису", - "fiatOnRamp.receiveCrypto.title": "Отримайте криптовалюту", - "fiatOnRamp.receiveCrypto.transferFunds": "Поповніть свій гаманець за переказом крипто з іншого гаманця або рахунку", - "fiatOnRamp.receiveCrypto.useThisAddress": "Використовуйте цю адресу для отримання токенів", - "fiatOnRamp.region.placeholder": "Пошук за країною чи регіоном", - "fiatOnRamp.region.title": "Виберіть свій регіон", - "fiatOnRamp.summary.total": "{{cryptoAmount}} за {{fiatAmount}}", - "forceUpgrade.action.backup": "Зробіть резервну копію свого гаманця", - "forceUpgrade.action.confirm": "Оновіть зараз", - "forceUpgrade.action.learn": "Дізнайтеся, як оновити", - "forceUpgrade.description.extension": "Доступна нова версія програми. Щоб продовжити використовувати розширення Uniswap, оновіть його до останньої версії.", - "forceUpgrade.description.wallet": "Доступна нова версія програми. Щоб продовжити використовувати гаманець Uniswap, оновіть його до останньої версії.", - "forceUpgrade.label.recoveryPhrase": "Фраза відновлення", - "forceUpgrade.title": "Оновіть до останньої версії", - "forceUpgrade.title.recommendedStatus": "Доступна нова версія", - "globalPreferences.title": "Глобальні переваги", - "hero.scroll": "Прокрутіть, щоб дізнатися більше", - "hero.subtitle": "Купуйте та продавайте криптовалюту в {{amount}}+ мережах, включаючи Ethereum, Unichain та Base.", - "hero.swap.title": "Обмінюйтеся будь-коли,
будь-де.", - "hidden.nfts.info.banner.text": "Дізнайтеся більше про приховані NFT", - "hidden.nfts.info.text.button": "Приховані NFT ({{numHidden}})", - "hidden.nfts.info.text.extension": "Це потенційні шахрайства та NFT, які ви приховали. Ви можете клацнути правою кнопкою миші на NFT, щоб показати його.", - "hidden.nfts.info.text.mobile": "Це потенційні шахрайства та NFT, які ви приховали. Ви можете довго натискати на NFT, щоб показати його.", - "hidden.nfts.info.text.title": "Приховані NFT", - "hidden.tokens.info.banner.text": "Дізнайтеся більше про приховані токени", - "hidden.tokens.info.text.button": "Приховані токени ({{numHidden}})", - "hidden.tokens.info.text.info": "Це потенційне шахрайство, невеликі баланси та приховані вами токени. Приховані токени не входять до загального балансу вашого гаманця.", - "hidden.tokens.info.text.title": "Приховані жетони", - "home.activity.empty.button": "Отримуйте токени або NFT", - "home.activity.empty.description.default": "Коли ви схвалюєте, обмінюєте або передаєте токени чи NFT, ваші транзакції відображатимуться тут.", - "home.activity.empty.description.external": "Коли цей гаманець здійснюватиме трансакції, вони з’являтимуться тут.", - "home.activity.empty.title": "Активності ще немає", - "home.activity.error.load": "Не вдалося завантажити активність", - "home.activity.title": "діяльність", - "home.banner.offline": "Ви в автономному режимі", - "home.banner.testnetMode": "Ви в режимі тестової мережі", - "home.banner.testnetMode.nav": "Ви в режимі тестової мережі. Вимкніть це в налаштуваннях.", - "home.empty.cexTransfer": "Переказ", - "home.empty.cexTransfer.description": "Переміщення коштів із торгової платформи.", - "home.empty.transfer": "Отримайте криптовалюту", - "home.empty.transfer.description": "Перемістіть кошти з іншого гаманця.", - "home.explore.footer": "Торкніться тут, щоб ознайомитися з тисячами токенів, NFT тощо", - "home.explore.title": "Дослідіть жетони", - "home.extension.error": "Помилка завантаження облікових записів", - "home.label.buy": "купити", - "home.label.for": "Купити/Продати", - "home.label.receive": "Отримати", - "home.label.send": "Надіслати", - "home.label.swap": "Обмін", - "home.nfts.title": "NFT", - "home.tokens.empty.action.buy.description": "Купуйте за допомогою дебетової картки або банківського рахунку.", - "home.tokens.empty.action.buy.title": "Купуйте криптовалюту", - "home.tokens.empty.action.import.description": "Введіть фразу відновлення цього гаманця, щоб почати обмін і надсилання.", - "home.tokens.empty.action.import.title": "Імпортний гаманець", - "home.tokens.empty.action.receive.description": "Переказ з іншого гаманця або облікового запису.", - "home.tokens.empty.action.receive.title": "Отримайте криптовалюту", - "home.tokens.empty.description": "Коли цей гаманець купує або отримує токени, вони з’являтимуться тут.", - "home.tokens.empty.title": "Жетонів ще немає", - "home.tokens.empty.welcome.description": "Додайте кошти, щоб розпочати торгівлю", - "home.tokens.error.fetch": "Не вдалося отримати баланс токенів", - "home.tokens.error.load": "Не вдалося завантажити баланси маркерів", - "home.tokens.title": "Жетони", - "home.upsell.receive.cta": "З облікового запису", - "home.upsell.receive.title": "Отримайте криптовалюту", - "home.warning.viewOnly": "Це гаманець лише для перегляду", - "interface.metatags.description": "Обміняйте криптовалюту на Ethereum, Base, Arbitrum, Polygon, Unichain та інші. Платформа DeFi, якій довіряють мільйони.", - "interface.metatags.title": "Інтерфейс Uniswap", - "landing.api": "API", - "landing.appsOverview": "Створено для всіх способів обміну", - "landing.blog.description": "Будьте в курсі останніх новин компанії, особливостей продуктів та іншого", - "landing.docs.description": "Перегляньте нашу бібліотеку документації для розробників, щоб розпочати роботу з Uniswap", - "landing.exploreUniverse": "Дослідіть ВСЕСВІТ", - "landing.getStarted": "Торгуйте на найбільшій у світі біржі DEX", - "landing.helpCenter.body": "Перегляньте поширені запитання та отримайте підтримку від нашої команди підтримки, що базується в США", - "landing.protocolDescription": "Uniswap Labs працює на деяких найпопулярніших криптовалютних продуктах. Відчуйте доступ без дозволів, перевірену безпеку та спеціалізовану підтримку.", - "landing.protocolStats": "Статистика протоколу Uniswap", - "landing.provideLiquidity.body": "Забезпечте ліквідність та зберіть комісії за допомогою інтерфейсу Uniswap.", - "landing.provideLiquidity.subtitle": "Потужні ончейн-ринки.", - "landing.socials": "Підпишіться на Uniswap Labs на X, Farcaster, LinkedInта TikTok", - "landing.swapBody": "Отримайте доступ до глибокої ліквідності, досліджуйте токени, встановлюйте лімітні ордери та забезпечте ліквідність для тисяч токенів у ланцюжках {{amount}} .", - "landing.swapSubtitle": "Обмін без дозволу.", - "landing.tradingApi": "Торговий API", - "landing.tradingApiBody": "Використовуйте той самий API, що й веб-додаток та гаманець Uniswap, яким довіряють провідні команди по всьому світу.", - "landing.tradingApiButton": "Інтегруйте API Uniswap", - "landing.tradingApiSubtitle": "DeFi, безпосередньо для ваших користувачів.", - "landing.trusted": "Довіряють мільйони", - "landing.unichain.body": "Приєднуйтесь до спільноти, яка будує швидкий, децентралізований Ethereum L2, створений для DeFi.", - "landing.unichain.button": "Почати будівництво", - "landing.unichain.subtitle": "Ланцюг DeFi.", - "landing.uniswapX.body": "Безгазові транзакції та захист MEV, з нульовою комісією за невдалі свопи.", - "landing.uniswapX.button": "Досвід UniswapX", - "landing.uniswapX.subtitle": "Розумніші обміни, нульові труднощі.", - "landing.walletBody": "Надійний криптогаманець та розширення для самостійного зберігання з мільйонами завантажень, підтримкою від реальних людей та рейтингом 4.8 .", - "landing.walletSubtitle": "Обмінюйтесь, зберігайте, досліджуйте.", - "language.afrikaans": "африкаанс", - "language.arabic": "арабська", - "language.catalan": "каталонська", - "language.chineseSimplified": "китайська, спрощена", - "language.chineseTraditional": "Китайський традиційний", - "language.czech": "чеська", - "language.danish": "датська", - "language.dutch": "голландська", - "language.english": "англійська", - "language.finnish": "фінська", - "language.french": "французька", - "language.greek": "грецька", - "language.hebrew": "іврит", - "language.hindi": "Хінді", - "language.hungarian": "угорська", - "language.indonesian": "індонезійська", - "language.italian": "італійська", - "language.japanese": "Японський", - "language.korean": "корейська", - "language.malay": "малайська", - "language.norwegian": "норвезька", - "language.polish": "польський", - "language.portuguese": "португальська", - "language.romanian": "румунська", - "language.russian": "російський", - "language.serbian": "сербська", - "language.spanishArgentina": "Іспанська (Аргентина)", - "language.spanishBelize": "Іспанська (Беліз)", - "language.spanishBolivia": "Іспанська (Болівія)", - "language.spanishChile": "Іспанська (Чилі)", - "language.spanishColombia": "Іспанська (Колумбія)", - "language.spanishCostaRica": "Іспанська (Коста-Рика)", - "language.spanishCuba": "Іспанська (Куба)", - "language.spanishDominicanRepublic": "Іспанська (Домініканська Республіка)", - "language.spanishEcuador": "Іспанська (Еквадор)", - "language.spanishElSalvador": "Іспанська (Сальвадор)", - "language.spanishGuatemala": "Іспанська (Гватемала)", - "language.spanishHonduras": "Іспанська (Гондурас)", - "language.spanishLatam": "Іспанська (Латинська Америка)", - "language.spanishMexico": "Іспанська (Мексика)", - "language.spanishNicaragua": "Іспанська (Нікарагуа)", - "language.spanishPanama": "Іспанська (Панама)", - "language.spanishParaguay": "Іспанська (Парагвай)", - "language.spanishPeru": "Іспанська (Перу)", - "language.spanishPuertoRico": "Іспанська (Пуерто-Рико)", - "language.spanishSpain": "Іспанська (Іспанія)", - "language.spanishUruguay": "Іспанська (Уругвай)", - "language.spanishUs": "Іспанська (США)", - "language.spanishVenezuela": "Іспанська (Венесуела)", - "language.swahili": "Суахілі", - "language.swedish": "шведська", - "language.turkish": "турецька", - "language.ukrainian": "українська", - "language.urdu": "урду", - "language.vietnamese": "в'єтнамська", - "large.price.difference": "Велика різниця в ціні", - "large.price.difference.tooltip": "Продовження цієї угоди призведе до втрати коштів. Ця різниця може бути пов'язана з великими угодами або низькою ліквідністю.", - "limit.open.count_one": "1 відкритий ліміт", - "limit.open.count_other": "{{count}} відкриті ліміти", - "limitPrice.buyingAboveMarketPrice.error.description": "Ваша лімітна ціна {{percentage}}% вища за ринкову. Відкоригуйте лімітну ціну, щоб продовжити.", - "limitPrice.buyingAboveMarketPrice.error.title": "Купівля {{tokenSymbol}} вище ринкової ціни", - "limitPrice.marketPriceNotAvailable.error.description": "Ми не можемо розрахувати поточну ринкову ціну. Щоб не надсилати замовлення за ціною, нижчою від ринкової, перевірте підключення до мережі та повторіть спробу.", - "limitPrice.marketPriceNotAvailable.error.title": "Ринкова ціна недоступна", - "limitPrice.sellingBelowMarketPrice.error.description": "Ваша лімітна ціна {{percentage}}% нижча за ринкову. Відкоригуйте лімітну ціну, щоб продовжити.", - "limitPrice.sellingBelowMarketPrice.error.title": "Продаж {{tokenSymbol}} нижче ринкової ціни", - "limits.form.disclaimer.mainnet": "Для обмежень доступні лише токени основної мережі Ethereum. ", - "limits.form.disclaimer.mainnet.short": "Для обмежень доступні лише токени Mainnet.", - "limits.form.disclaimer.uniswapx": "Обмеження можуть не виконуватися точно тоді, коли токени досягають зазначеної ціни. ", - "limits.learnMore": "Докладніше про обмеження", - "limits.price.input.label": "Коли 1 коштує", - "limits.price.label": "Гранична ціна", - "limits.selectSupportedTokens": "Виберіть підтримувані токени", - "liquidity.hooks": "Хуки на v4", - "liquidity.hooks.address.input": "Введіть адресу гачка", - "liquidity.hooks.address.tooltip": "Адреса хука: {{address}}", - "liquidity.learnMoreLabel": "Дізнайтеся про забезпечення ліквідності", - "liquidity.notEnough.label": "Недостатньо ліквідності, щоб показати точну вартість у доларах США.", - "liquidity.provideOnProtocols": "Надання ліквідності за різними протоколами", - "liquidityPool.page.title": "Додайте ліквідність до пулів{{version}} на Uniswap", - "liquidityPool.positions.closed.title": "Закриті позиції", - "liquidityPool.positions.loadingMore": "Завантаження додаткових позицій...", - "liquidityPool.positions.page.title": "Керуйте ліквідністю пулу {{quoteSymbol}}/{{baseSymbol}} на Uniswap", - "liquidityPool.positions.page.version.description": "Перегляньте свої активні {{version}} позиції ліквідності. Додайте нові посади.", - "liquidityPool.positions.page.version.title": "Керуйте ліквідністю пулу{{version}} на Uniswap", - "migrate.allowed": "Дозволено", - "migrate.allowLpMigration": "Дозволити міграцію маркера LP", - "migrate.connectAccount": "Ви повинні підключити обліковий запис, якому належить ця позиція.", - "migrate.connectWallet": "Підключіться до гаманця, щоб переглянути свою ліквідність V2.", - "migrate.contract": "Договір міграції Uniswap", - "migrate.firstLP": "Ви перший постачальник ліквідності для цього пулу Uniswap V3. Ваша ліквідність переміститься за поточною ціною {{source}} .", - "migrate.highGasCost": "Вартість транзакції буде набагато вищою, оскільки вона включає газ для створення пулу.", - "migrate.invalidRange": "Вибрано недійсний діапазон. Мінімальна ціна має бути нижчою за максимальну.", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} жетони LP", - "migrate.migrating": "Міграція", - "migrate.missingV2Position": "Не бачите жодної з ваших позицій v2? Імпортуйте його.", - "migrate.noV2Liquidity": "Ліквідність V2 не знайдено.", - "migrate.positionNoFees": "Ваша позиція не буде отримувати комісію або використовуватися в угодах, доки ринкова ціна не переміститься у ваш діапазон.", - "migrate.priceDifference": "Різниця в ціні: ", - "migrate.priceWarning": "Ви повинні вносити ліквідність в Uniswap V3 лише за ціною, яку ви вважаєте правильною.
Якщо ціна здається неправильною, ви можете зробити обмін, щоб змінити ціну, або почекати, поки це зробить хтось інший.", - "migrate.refund": "Принаймні {{amtA}} {{symA}} та {{amtB}} {{symB}} буде повернено на ваш гаманець через вибраний діапазон цін.", - "migrate.selectFeeTier": "Виберіть рівень комісії", - "migrate.setRange": "Встановити діапазон цін", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} Ціна:", - "migrate.v2Description": "Цей інструмент безпечно перенесе вашу {{source}} ліквідність у V3. Завдяки <0>контракту міграції Uniswap процес абсолютно ненадійний ↗", - "migrate.v2Instruction": "Для кожного пулу, наведеного нижче, натисніть «Перенести», щоб видалити свою ліквідність із Uniswap V2 і внести її в Uniswap V3.", - "migrate.v2Title": "Перенесіть ліквідність V2", - "migrate.v3Price": "V3 {{sym}} Ціна:", - "mint.v3.input.invalidPrice.error": "Введена недійсна ціна", - "mobileAppPromo.banner.getTheApp.link": "Отримайте програму Uniswap Wallet", - "mobileAppPromo.banner.title": "Uniswap: крипто та NFT гаманець", - "moonpay.poweredBy": "Fiat onramp на базі MoonPay USA LLC", - "nav.createAccount.button": "Створити акаунт", - "nav.logIn.button": "авторизуватися", - "nav.logInOrConnect.title": "Увійти або підключитися", - "nav.products.tradingApi": "Інтегруйте протокол", - "nav.products.unichain": "Мережа DeFi", - "nav.products.uniswapX": "Метаагрегатор", - "nav.products.wallet": "Обмінюй, зберігай, досліджуй", - "nav.signUp.button": "Зареєструватися", - "nav.tabs.createPosition": "Створити позицію", - "nav.tabs.viewPositions": "Переглянути позиції", - "network.lostConnection": "Можливо, ви втратили підключення до мережі.", - "network.mightBeDown": "Можливо, {{network}} зараз не працює, або ви втратили з’єднання з мережею.", - "network.warning": "Попередження мережі", - "nft.noPools": "Басейнів ще немає", - "nft.reportSpam": "Повідомити про спам", - "notFound.oops": "Ой, поверни мене до Swap", - "notice.uk": "Ця веб-програма надається як інструмент для взаємодії користувачів із протоколом Uniswap за власною ініціативою, без схвалення чи рекомендацій щодо торгівлі криптовалютою. При цьому Uniswap не рекомендує користувачам або потенційним користувачам брати участь у торгівлі криптовалютами, і користувачі або потенційні користувачі веб-додатку не повинні розглядати цю веб-сторінку або її вміст як такі, що включають будь-яку форму рекомендації, запрошення або спонукання до операції з криптовалютою. .", - "notice.uk.label": "Застереження Великобританії:", - "notification.assetVisibility.hidden": "{{assetName}} приховано", - "notification.assetVisibility.unhidden": "{{assetName}} відкритих", - "notification.buy.network": "Купівля на {{network}}", - "notification.copied.address": "Адресу скопійовано", - "notification.copied.calldata": "Дані виклику скопійовано", - "notification.copied.contractAddress": "Адресу договору скопійовано", - "notification.copied.failed": "Не вдалося скопіювати в буфер обміну", - "notification.copied.image": "Зображення скопійовано", - "notification.copied.linkUrl": "Посилання скопійовано", - "notification.copied.nftUrl": "URL-адресу NFT скопійовано", - "notification.copied.poolId": "Ідентифікатор пулу скопійовано", - "notification.copied.tokenUrl": "URL маркера скопійовано", - "notification.copied.transactionId": "Ідентифікатор транзакції скопійовано", - "notification.copied.unitag": "Ім'я користувача скопійовано", - "notification.countryChange": "Переключено на {{countryName}}", - "notification.limit.network": "Створення лімітного ордера на {{network}}", - "notification.lp.network": "Забезпечення ліквідності на {{network}}", - "notification.network.changed": "Переключено на {{network}}", - "notification.passwordChanged": "Пароль змінено", - "notification.poolFinder.network": "Пошук за запитом \"пул\" на {{network}}", - "notification.restore.success": "Гаманець відновлено!", - "notification.sell.network": "Продається на {{network}}", - "notification.send.network": "Відправка {{network}}", - "notification.smartWallet.disabled": "Вимкнено в 1 мережі", - "notification.smartWallet.disabled.all": "Розумний гаманець вимкнено", - "notification.smartWallet.disabled.plural": "Вимкнено в мережах {{amount}}", - "notification.spam.NFT.failed": "Не вдалося повідомити про NFT. Повторіть спробу пізніше.", - "notification.spam.NFT.successful": "Повідомлено", - "notification.swap.network": "Обмін на {{network}}", - "notification.swap.pending.swap": "Очікується обмін", - "notification.swap.pending.unwrap": "Очікується розгортання", - "notification.swap.pending.wrap": "Обгортка очікує", - "notification.transaction.approve.canceled": "Скасовано {{currencySymbol}} схвалити.", - "notification.transaction.approve.fail": "Не вдалося затвердити {{currencySymbol}} для використання з {{address}}.", - "notification.transaction.approve.success": "Схвалено {{currencySymbol}} для використання з {{address}}.", - "notification.transaction.pending": "Трансакція очікує на розгляд", - "notification.transaction.swap.canceled": "Скасовано обмін {{inputCurrencySymbol}}-{{outputCurrencySymbol}}.", - "notification.transaction.swap.expired": "Термін дії обміну {{inputCurrencyAmountWithSymbol}} на {{outputCurrencyAmountWithSymbol}} минув.", - "notification.transaction.swap.fail": "Не вдалося поміняти {{inputCurrencyAmountWithSymbol}} на {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.swap.success": "Поміняно {{inputCurrencyAmountWithSymbol}} на {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.transfer.canceled": "Надсилання скасовано {{tokenNameOrAddress}}", - "notification.transaction.transfer.fail": "Не вдалося надіслати {{tokenNameOrAddress}} до {{walletNameOrAddress}}", - "notification.transaction.transfer.received": "Отримано {{tokenNameOrAddress}} від {{walletNameOrAddress}}", - "notification.transaction.transfer.success": "Надіслано {{tokenNameOrAddress}} до {{walletNameOrAddress}}", - "notification.transaction.unknown.fail.full": "Не вдалося здійснити транзакцію з {{addressOrEnsName}}", - "notification.transaction.unknown.fail.short": "Помилка транзакції", - "notification.transaction.unknown.success.full": "Здійснено транзакцію з {{addressOrEnsName}}", - "notification.transaction.unknown.success.short": "Трансакцію підтверджено", - "notification.transaction.unwrap.canceled": "Скасовано {{inputCurrencySymbol}} розгорнути.", - "notification.transaction.unwrap.fail": "Не вдалося розгорнути {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.unwrap.success": "Розгорнув {{inputCurrencyAmountWithSymbol}} і отримав {{outputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.canceled": "Скасовано {{inputCurrencySymbol}} обгорток.", - "notification.transaction.wrap.fail": "Не вдалося обернути {{inputCurrencyAmountWithSymbol}}.", - "notification.transaction.wrap.success": "Загорнув {{inputCurrencyAmountWithSymbol}} і отримав {{outputCurrencyAmountWithSymbol}}.", - "notification.transfer.pending": "Надсилання очікує на розгляд", - "notification.walletConnect.confirmed": "Трансакція підтверджена {{dappName}}", - "notification.walletConnect.connected": "Підключено", - "notification.walletConnect.disconnected": "Відключено", - "notification.walletConnect.failed": "Трансакція не виконана з {{dappName}}", - "notification.walletConnect.networkChanged.full": "Переключено на {{networkName}}", - "notification.walletConnect.networkChanged.short": "Комутовані мережі", - "notifications.scantastic.subtitle": "Продовжте використовувати розширення Uniswap", - "notifications.scantastic.title": "Успіх!", - "onboarding.backup.manual.banner": "Радимо написати це на аркуші паперу та зберігати в надійному місці, наприклад у сейфі.", - "onboarding.backup.manual.displayWarning.description": "Перш ніж продовжити, уважно прочитайте наступне.", - "onboarding.backup.manual.displayWarning.note.access": "Ця фраза відновлення дає вам повний доступ до вашого гаманця та коштів", - "onboarding.backup.manual.displayWarning.note.secure": "Перегляньте це приватно та нікому не діліться", - "onboarding.backup.manual.displayWarning.note.storage": "Запишіть і збережіть у надійному місці", - "onboarding.backup.manual.displayWarning.title": "Деякі важливі речі, які варто знати", - "onboarding.backup.manual.error": "Недійсне або неправильно написане слово", - "onboarding.backup.manual.placeholder": "Таємне слово", - "onboarding.backup.manual.progress": "{{completedStepsCount}}{{totalStepsCount}}", - "onboarding.backup.manual.selectedWordPlaceholder": "Виберіть слово", - "onboarding.backup.manual.subtitle_one": "Яке {{count}}st слово у вашій фразі відновлення?", - "onboarding.backup.manual.subtitle_two": "Яке {{count}}і слово у вашій фразі відновлення?", - "onboarding.backup.manual.subtitle_few": "Яке {{count}}rd слово у вашій фразі відновлення?", - "onboarding.backup.manual.subtitle_other": "Яке {{count}}й слово у вашій фразі відновлення?", - "onboarding.backup.manual.title": "Давайте переконаємося, що ви записали його правильно", - "onboarding.backup.option.badge.quick": "швидко", - "onboarding.backup.option.cloud.description": "Створіть резервну копію свого гаманця через {{cloudProviderName}}, захищену паролем для відновлення.", - "onboarding.backup.option.cloud.title": "Встановіть пароль відновлення", - "onboarding.backup.option.manual.description": "Запишіть свої 12 секретних слів на аркуші паперу та зберігайте його в надійному місці.", - "onboarding.backup.option.manual.title": "Запишіть фразу відновлення", - "onboarding.backup.reminder.backupNowButton": "Створити резервну копію зараз", - "onboarding.backup.reminder.remindMeLaterButton": "Нагадати мені пізніше", - "onboarding.backup.reminder.title": "Зробіть резервну копію свого гаманця", - "onboarding.backup.reminder.warning.description": "Зробіть резервну копію свого гаманця, щоб мати змогу відновити свої активи, якщо ви коли-небудь втратите телефон або отримаєте новий.", - "onboarding.backup.reminder.warning.fundsLabel": "Кошти під загрозою", - "onboarding.backup.reminder.warning.title": "Ви можете втратити свої кошти", - "onboarding.backup.speedBump.cloud.description": "Якщо ви забудете його, ми не зможемо скинути його замість вас. Запишіть його в безпечному місці або надійно зберігайте в менеджері паролів.", - "onboarding.backup.speedBump.cloud.disclaimer": "Я розумію, що Uniswap Labs не може скинути мій пароль відновлення.", - "onboarding.backup.speedBump.cloud.title": "Важливо зберегти цей пароль", - "onboarding.backup.speedBump.manual.description": "Переконайтеся, що ви правильно написали фразу для відновлення та маєте безпечне місце для її зберігання.", - "onboarding.backup.speedBump.manual.disclaimer": "Я розумію, що Uniswap Labs не зможе відновити мій гаманець, якщо я його втрачу.", - "onboarding.backup.speedBump.manual.title": "Перш ніж закінчити...", - "onboarding.backup.subtitle": "Таким чином ви відновите свій гаманець, якщо видалите програму або втратите пристрій.", - "onboarding.backup.title.existing": "Зробіть резервну копію свого гаманця", - "onboarding.backup.title.new": "Виберіть метод резервного копіювання", - "onboarding.backup.view.subtitle.message1": "Перш ніж продовжити, уважно прочитайте наступне", - "onboarding.backup.view.subtitle.message2": "Вам потрібно буде ввести всі 12 цих секретних слів, щоб відновити свій гаманець.", - "onboarding.backup.view.title": "Запишіть фразу відновлення", - "onboarding.backup.view.warning.message1": "Ця фраза відновлення дає вам повний доступ до вашого гаманця та коштів", - "onboarding.backup.view.warning.message2": "Запишіть і збережіть у надійному місці", - "onboarding.backup.view.warning.message3": "Перегляньте це приватно та не діліться ніким", - "onboarding.cloud.confirm.description": "Вам потрібно буде ввести це, щоб відновити свої кошти. Якщо ви колись забудете його, ми не зможемо відновити його для вас.", - "onboarding.cloud.confirm.title": "Підтвердьте свій пароль відновлення", - "onboarding.cloud.createPassword.description": "Вам потрібно буде ввести це, щоб відновити свої кошти. Якщо ви колись забудете його, ми не зможемо відновити його для вас.", - "onboarding.cloud.createPassword.title": "Створіть свій пароль відновлення", - "onboarding.complete.button": "Відкрийте розширення Uniswap", - "onboarding.complete.description": "Ваш гаманець готовий надсилати та отримувати криптовалюту. Відкрийте розширення Uniswap за допомогою ярлика нижче.", - "onboarding.complete.go_to_uniswap": "Перейдіть до Uniswap Web App", - "onboarding.complete.pin.description": "Натисніть значок шпильки, щоб додати розширення Uniswap на панель інструментів.", - "onboarding.complete.pin.title": "Pin Uniswap Extension", - "onboarding.complete.title": "Ви готові", - "onboarding.extension.biometrics.subtitle.fingerprint": "Швидкий та безпечний доступ до вашого гаманця за допомогою лише відбитка пальця.", - "onboarding.extension.biometrics.title": "Увімкнути {{biometricsMethod}}", - "onboarding.extension.password.subtitle": "Це знадобиться, щоб розблокувати гаманець і отримати доступ до фрази відновлення", - "onboarding.extension.password.title.default": "Створити пароль", - "onboarding.extension.password.title.reset": "Скинути пароль", - "onboarding.extension.unsupported.android.description": "Розширення Uniswap сумісне лише з Chrome на комп’ютері.", - "onboarding.extension.unsupported.android.title": "Chrome на мобільних пристроях не підтримується (поки що)", - "onboarding.extension.unsupported.description": "Розширення Uniswap зараз сумісне лише з Chrome.", - "onboarding.extension.unsupported.title": "Цей браузер (поки що) не підтримується", - "onboarding.home.intro.backup.description.extension": "Збережіть свою фразу відновлення, щоб ніколи не втратити доступ до свого гаманця.", - "onboarding.home.intro.backup.description.mobile": "Складіть план відновлення, якщо ви коли-небудь втратите свій телефон або отримаєте новий.", - "onboarding.home.intro.backup.title": "Зробіть резервну копію свого гаманця", - "onboarding.home.intro.bridgedAssets.description": "SOL, WIF, BONK та JUP — тепер доступні на Unichain", - "onboarding.home.intro.bridgedAssets.title": "Торгуйте новими токенами на Unichain", - "onboarding.home.intro.fund.description": "Поповнюйте свій гаманець, купуючи криптовалюту або переказуючи з іншого рахунку.", - "onboarding.home.intro.fund.title": "Отримайте свій перший жетон", - "onboarding.home.intro.label.required": "Обов'язковий", - "onboarding.home.intro.label.swipe": "Проведіть пальцем", - "onboarding.home.intro.pushNotifications.description": "Отримуйте сповіщення про ціни на ваші улюблені токени, ринкові тенденції тощо.", - "onboarding.home.intro.pushNotifications.title": "Будьте в курсі", - "onboarding.home.intro.unitag.description": "Створіть персоналізований профіль web3 і легко діліться своєю адресою з друзями.", - "onboarding.home.intro.unitag.title": "Отримайте ім'я користувача {{unitagDomain}}", - "onboarding.import.error.invalidWords_one": "1 слово недійсне або написане з помилкою", - "onboarding.import.error.invalidWords_other": "{{count}} слова недійсні або написані з помилками", - "onboarding.import.method.restore.message.android": "Додайте гаманці, резервні копії яких ви створили, до свого облікового запису Диска Google.", - "onboarding.import.method.restore.message.ios": "Додайте гаманці, резервні копії яких ви створили, до свого облікового запису iCloud.", - "onboarding.import.method.restore.title": "Відновити гаманець", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.android": "Введіть свій пароль відновлення, щоб відновити гаманець через резервну копію Google Диска.", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.ios": "Введіть свій пароль відновлення, щоб відновити гаманець через резервну копію iCloud.", - "onboarding.import.method.restoreSeedPhrase.cloud.title.android": "Відновити з Google Drive", - "onboarding.import.method.restoreSeedPhrase.cloud.title.ios": "Відновити з iCloud", - "onboarding.import.method.restoreSeedPhrase.title": "Виберіть, як відновити свій гаманець", - "onboarding.import.method.restoreSeedPhrase.wallet.desc": "Введіть свої 12 секретних слів, які ви раніше зберігали в безпечному місці.", - "onboarding.import.method.restoreSeedPhrase.wallet.title": "Введіть фразу відновлення", - "onboarding.import.method.viewPrivateKeys.button.desc": "Перегляньте свій закритий ключ", - "onboarding.import.method.viewPrivateKeys.title": "Немає нічого з перерахованого вище? ", - "onboarding.import.onDeviceRecovery.other_options": "Створіть або імпортуйте інший гаманець", - "onboarding.import.onDeviceRecovery.other_options.label": "Не хочете нічого з перерахованого вище?", - "onboarding.import.onDeviceRecovery.subtitle": "Виберіть гаманець, до якого ви хочете знову ввійти.", - "onboarding.import.onDeviceRecovery.title": "Ласкаво просимо назад до Uniswap", - "onboarding.import.onDeviceRecovery.wallet.button": "Переглянути фразу відновлення", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 інший гаманець", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} інші гаманці", - "onboarding.import.onDeviceRecovery.warning.caption": "Переконайтеся, що ви створили резервні копії всіх інших гаманців. Якщо ви захочете відновити їх, вам знадобляться їхні фрази відновлення або відповідні {{cloudProvider}} резервні копії.", - "onboarding.import.onDeviceRecovery.warning.title": "Ти впевнений?", - "onboarding.import.selectMethod.errorMessage": "Сталася неочікувана помилка. Спробуйте ще раз.", - "onboarding.import.selectMethod.mobileApp.subtitle": "Імпортуйте гаманець із мобільного додатку за допомогою QR-коду.", - "onboarding.import.selectMethod.mobileApp.title": "Використовуйте Uniswap Mobile", - "onboarding.import.selectMethod.passkey.subtitle": "Синхронізуйте свій гаманець Uniswap за допомогою наявного ключа доступу.", - "onboarding.import.selectMethod.passkey.title": "Увійти за допомогою ключа доступу", - "onboarding.import.selectMethod.recoveryPhrase.subtitle": "Імпортувати з іншого криптогаманця.", - "onboarding.import.selectMethod.recoveryPhrase.title": "Введіть фразу відновлення", - "onboarding.import.selectMethod.title": "Увійти або імпортувати гаманець", - "onboarding.import.title": "Виберіть, як ви хочете додати свій гаманець", - "onboarding.importMnemonic.button.default": "Моя фраза відновлення складається з 12 слів", - "onboarding.importMnemonic.button.importing": "Імпорт...", - "onboarding.importMnemonic.button.longPhrase": "Моя фраза відновлення довша", - "onboarding.importMnemonic.error.invalidPhrase": "Введена фраза недійсна", - "onboarding.importMnemonic.subtitle": "Введіть або вставте фразу відновлення з 12 слів", - "onboarding.importMnemonic.title": "Введіть фразу відновлення", - "onboarding.importPasskey.bringWindowToFront": "Виведіть вікно вперед", - "onboarding.importPasskey.continueInSecureWindow": "Продовжте у вікні безпечного входу.", - "onboarding.intro.button.alreadyHave": "У мене вже є гаманець", - "onboarding.intro.button.logInOrImport": "Увійти або імпортувати", - "onboarding.intro.mobileScan.button": "Відскануйте QR-код, щоб імпортувати", - "onboarding.intro.mobileScan.title": "У вас є програма Uniswap?", - "onboarding.landing.button.add": "Додайте наявний гаманець", - "onboarding.landing.button.create": "Створіть новий гаманець", - "onboarding.landing.button.createAccount": "Створіть обліковий запис", - "onboarding.name.choose": "Виберіть ім'я користувача", - "onboarding.name.choose.subtitle": "Це публічне ім’я, яке будь-хто може використовувати для надсилання вам криптовалюти.", - "onboarding.notification.permission.message": "Щоб отримувати сповіщення, увімкніть сповіщення для Uniswap Wallet у налаштуваннях свого пристрою.", - "onboarding.notification.permission.title": "Дозвіл на сповіщення", - "onboarding.notification.subtitle": "Будьте в курсі статусів транзакцій і основних змін цін на улюблені токени.", - "onboarding.notification.title": "Увімкніть сповіщення", - "onboarding.passkey.create": "Створіть свій ключ доступу", - "onboarding.passkey.loading.subtitle": "Це займе лише секунду.", - "onboarding.passkey.loading.title": "Пошук вашого гаманця...", - "onboarding.passkey.secure": "Захистіть свій обліковий запис", - "onboarding.passkey.secure.description": "Ключі доступу дозволяють швидко та безпечно отримати доступ до вашого облікового запису, використовуючи лише своє обличчя або відбиток пальця.", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "Давайте підтвердимо, що ви все правильно зрозуміли. Якщо ви втратите або запишете це неправильно, ви не зможете повернути свої кошти.", - "onboarding.recoveryPhrase.confirm.subtitle.default": "Якщо ви втратите або запишете це неправильно, ви не зможете повернути свої кошти.", - "onboarding.recoveryPhrase.confirm.title": "Давайте підтвердимо, що ви все правильно зрозуміли", - "onboarding.recoveryPhrase.view.subtitle": "Вам потрібно буде ввести всі 12 цих секретних слів, щоб відновити свій гаманець.", - "onboarding.recoveryPhrase.view.title": "Запишіть фразу відновлення", - "onboarding.recoveryPhrase.view.title.hasPassword": "Якщо ви коли-небудь забудете свій пароль...", - "onboarding.recoveryPhrase.warning.final.button": "я готовий", - "onboarding.recoveryPhrase.warning.final.message": "Ваша фраза відновлення – це те, що надає вам (і будь-кому, хто її має) доступ до ваших коштів. Обов’язково тримайте це при собі.", - "onboarding.recoveryPhrase.warning.final.title": "Зробіть цей крок у приватному місці", - "onboarding.recoveryPhrase.warning.screenshot.message": "Кожен, хто отримує доступ до ваших фотографій, може отримати доступ до вашого гаманця. Радимо замість цього записати свої слова.", - "onboarding.recoveryPhrase.warning.screenshot.title": "Скріншоти незахищені", - "onboarding.resetPassword.complete.safety": "Дізнайтеся більше про безпеку гаманця", - "onboarding.resetPassword.complete.subtitle": "Використовуйте свій новий пароль, щоб розблокувати свій гаманець.", - "onboarding.resetPassword.complete.title": "Скидання пароля", - "onboarding.scan.error": "Під час завантаження QR-коду сталася помилка", - "onboarding.scan.otp.error": "Код, який ви надіслали, неправильний, або під час надсилання сталася помилка. Будь ласка спробуйте ще раз.", - "onboarding.scan.otp.failed": "Невдалі спроби: {{number}}", - "onboarding.scan.otp.subtitle": "Перевірте свій 6-значний код у мобільному додатку Uniswap", - "onboarding.scan.otp.title": "Введіть одноразовий код", - "onboarding.scan.subtitle": "Відскануйте QR-код за допомогою мобільного додатку Uniswap, щоб почати імпорт вашого гаманця.", - "onboarding.scan.title": "Імпорт гаманця з програми", - "onboarding.scan.troubleScanning.message": "Імпорт через фразу відновлення", - "onboarding.scan.troubleScanning.title": "Проблеми зі скануванням?", - "onboarding.scan.wifi": "Підключіть телефон до тієї ж мережі WiFi, що й комп’ютер.", - "onboarding.security.alert.biometrics.message.android": "Щоб використовувати біометричні дані, спочатку налаштуйте їх у налаштуваннях", - "onboarding.security.alert.biometrics.message.ios": "Щоб використовувати {{biometricsMethod}}, дозвольте доступ у налаштуваннях системи", - "onboarding.security.alert.biometrics.title.android": "Біометрія вимкнена", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} вимкнено", - "onboarding.security.button.confirm.android": "Увімкнути біометрію", - "onboarding.security.button.confirm.ios": "Увімкнути {{biometricsMethod}}", - "onboarding.security.button.setup": "Налаштувати", - "onboarding.security.subtitle.android": "Додайте додатковий рівень безпеки, вимагаючи біометричних даних для надсилання транзакцій.", - "onboarding.security.subtitle.ios": "Додайте додатковий рівень безпеки, вимагаючи {{biometricsMethod}} для надсилання транзакцій.", - "onboarding.security.title": "Захистіть свій гаманець", - "onboarding.selectWallets.error": "Не вдалося завантажити адреси", - "onboarding.selectWallets.title.default": "Виберіть гаманці для імпорту", - "onboarding.selectWallets.title.error": "Помилка імпорту гаманців", - "onboarding.termsOfService": "Продовжуючи, я приймаю Умови використання і погоджуюся з Політикою конфіденційності", - "onboarding.tooltip.recoveryPhrase.trigger": "Що таке фраза відновлення?", - "onboarding.wallet.continue": "Бережімо його", - "onboarding.wallet.defaultName": "Гаманець {{number}}", - "onboarding.wallet.description.full": "Це ваш особистий простір для токенів, NFT та всіх ваших угод. Завершіть налаштування, щоб зберегти свої кошти.", - "onboarding.wallet.title": "Ласкаво просимо до вашого нового гаманця", - "onboarding.welcome.subtitle": "Давайте завершимо налаштування вашого гаманця.", - "onboarding.welcome.title": "Ласкаво просимо!", - "outageBanner.message": "Дані {{chainName}}{{versionDescription}} зараз недоступні, але ми очікуємо, що проблема буде вирішена найближчим часом.", - "outageBanner.message.sub": "Ви все ще можете обмінюватися та надавати ліквідність у цьому ланцюжку без проблем.", - "outageBanner.title": "{{versionName}} скоро повернеться", - "passkeys.help.modal.subtitle": "Якщо у вас виникли проблеми з ключами доступу, відвідайте службу підтримки Uniswap, щоб отримати допомогу.", - "passkeys.help.modal.subtitle.invalidPasskey": "Не вдалося виконати ваш запит. Спробуйте ще раз, використовуючи ключ доступу, пов’язаний із ", - "passkeys.help.modal.subtitle.technicalError": "Ваш запит не може бути виконано через неочікувану технічну помилку. Ваші кошти в безпеці. Спробуйте ще раз.", - "passkeys.help.modal.title": "Потрібна допомога?", - "passkeys.help.modal.title.invalidPasskey": "Недійсний ключ доступу", - "passkeys.help.modal.title.technicalError": "Технічна помилка", - "passkeys.manage.modal.subtitle": "Щоб додати або видалити ключі доступу, увійдіть до {{passkeyManagementUrl}}.", - "passkeys.manage.modal.title": "Керуйте ключами доступу", - "permit.approval.fail": "Помилка погодження дозволу", - "permit.approval.fail.message": "Permit2 дозволяє спільно використовувати схвалення маркерів і керувати ними в різних програмах.", - "pool.activeRange": "Активний тиковий діапазон", - "pool.addAs": "Додати як {{nativeWrappedSymbol}}", - "pool.apr": "APR", - "pool.apr.base": "Базовий APR", - "pool.apr.description": "Розраховано на основі плати за 1 день", - "pool.apr.reward": "Винагорода річних", - "pool.aprText": "Басейн річних", - "pool.balances": "Баланс пулу", - "pool.closedCTA.description": "Ви можете переглянути їх, скориставшись фільтром у верхній частині сторінки.", - "pool.closedCTA.title": "Шукаєте закриті вакансії?", - "pool.collectAs": "Збирайте як {{nativeWrappedSymbol}}", - "pool.collectFees": "Збирайте гонорари", - "pool.connectEthereumToView": "Підключіть гаманець Ethereum, щоб переглядати свої пули", - "pool.create": "Створення нового пулу", - "pool.create.info": "Ваш вибір створить новий пул ліквідності, що може призвести до зниження початкової ліквідності та підвищення волатильності. Розгляньте можливість додавання до існуючого пулу, щоб мінімізувати ці ризики.", - "pool.createdPosition": "Створена позиція", - "pool.createdPosition.canceled": "Створення позиції скасовано", - "pool.createdPosition.failed": "Не вдалося створити позицію", - "pool.dynamic": "Динамічний пул", - "pool.earnings": "Заробіток", - "pool.earnings.empty": "У вас ще немає заробітку", - "pool.explorers": "дослідники", - "pool.import": "Імпортний пул", - "pool.import.link.description": "Деякі позиції версії 2 не відображаються автоматично.", - "pool.import.positions.v2": "Імпортувати позиції V2", - "pool.import.positions.v2.selectPair.description": "Деякі позиції версії 2 не відображаються автоматично. Виберіть пару токенів для імпорту та перегляду своїх позицій.", - "pool.import.success": "Басейн імпортний", - "pool.incentives.administeredRewards": "Винагороди розподіляються за автономним контрактом Merkl Distributor.", - "pool.incentives.collect": "Збирати", - "pool.incentives.collectedRewards": "Зібрані нагороди", - "pool.incentives.collectFailed": "Не вдалося зібрати, спробуйте ще раз.", - "pool.incentives.collectFailedNoRetry": "Не вдалося зібрати нагороди.", - "pool.incentives.collectingRewards": "Збір нагород", - "pool.incentives.collectRewards": "Збирайте нагороди", - "pool.incentives.collectRewardsCanceled": "Збір винагород скасовано", - "pool.incentives.daysLeft": "залишилося днів", - "pool.incentives.eligible": "Відповідні пули мають символічні винагороди, тож ви можете заробляти більше", - "pool.incentives.merklDocs": "Розраховано Merkl на основі винагород за викиди та TVL пулу.", - "pool.incentives.rewardsDistribution": "Роздача винагород", - "pool.incentives.rewardsEarned": "Отримано нагороди", - "pool.incentives.similarPoolHasRewards": "Подібний пул має нагороди UNI", - "pool.incentives.switchPools": "Перемикання пулів", - "pool.incentives.timePeriod": "Період часу", - "pool.incentives.uni.findMore": "Знайдіть пули з нагородами UNI", - "pool.incentives.yourRewards.error": "Ваші винагороди зараз недоступні", - "pool.incentives.yourRewards.error.description": "Не вдалося отримати нагороди. Це може бути через проблему з мережею. Спробуйте перезавантажити сторінку.", - "pool.info": "Інформація про басейн", - "pool.limitFluctuation.warning": "Майте на увазі, що виконання лімітів може відрізнятися залежно від коливань ринку в реальному часі та перевантаженості мережі Ethereum. Обмеження можуть не виконуватися точно тоді, коли токени досягають зазначеної ціни.", - "pool.liquidity.data.error.message": "Під час отримання даних, необхідних для транзакції, сталася помилка.", - "pool.liquidity.outOfSync": "Невідповідність пулу та ринкової ціни", - "pool.liquidity.outOfSync.message": "Ціни в цьому пулі відрізняються від ринкових цін вибраних токенів. Відповідно відкоригуйте свій ціновий діапазон або зачекайте, поки пул відновить баланс, щоб уникнути втрат.", - "pool.maxPrice": "Максимальна ціна", - "pool.migrateLiquidity": "Перенести ліквідність", - "pool.migrateLiquidityDisabledTooltip": "Цей ланцюжок не підтримує пули ліквідності v4.", - "pool.migrateToV4": "Перейти на v4", - "pool.minPrice": "Мінімальна ціна", - "pool.newPosition.plus": "+ Нова посада", - "pool.newPosition.title": "Нова посада", - "pool.newSpecificPosition": "Нова {{symbol}} позиція", - "pool.notAvailableOnSolana": "Басейни на Солані недоступні", - "pool.notFound.description": "На жаль, ми не можемо знайти жодної інформації для цього пулу. Перевірте ім’я та адресу та повторіть спробу.", - "pool.notFound.title": "Пул не знайдено", - "pool.openToStart.evmAndSolanaConnected": "Відкрийте нову посаду або створіть пул, щоб розпочати. Пули недоступні на Solana.", - "pool.openToStart.evmOnly": "Щоб почати, відкрийте нову позицію або створіть пул.", - "pool.percent": "{{pct}}% пулу", - "pool.pooled": "Об'єднані {{sym}}:", - "pool.position": "Позиція", - "pool.positions": "посади", - "pool.positions.title": "Ваші позиції", - "pool.positions.transaction.settings": "Налаштування транзакцій", - "pool.positions.usdValueUnavailable": "Вартість у доларах США недоступна", - "pool.positions.usdValueUnavailable.tooltip": "Вартість у доларах США наразі недоступна для цієї позиції. Перегляньте деталі позиції щодо суми внесених токенів.", - "pool.refresh.prices": "Оновити ціни", - "pool.removeLiquidity": "Видалити ліквідність", - "pool.rewardAPR": "Винагорода APR (UNI)", - "pool.rewardAPR.percent": "{{pct}} річна винагорода", - "pool.rewards": "Нагороди", - "pool.rewardsPool.label": "Токени пулу в пулі винагород:", - "pool.selectPair": "Виберіть пару", - "pool.share.label": "Ваша частка пулу:", - "pool.specificPosition": "{{symbol}} положення", - "pool.tokenPair": "Пара маркерів", - "pool.top.rewards": "Пули з винагородами", - "pool.top.tvl": "Кращі пули від TVL", - "pool.top.volume": "Пули за обсягом за 24 години", - "pool.totalAPR": "Загальна річна процентна ставка", - "pool.totalTokens": "Ваш загальний пул токенів:", - "pool.v2": "v2 пули", - "pool.v3": "v3 пули", - "pool.via": "{{tokenPair}} через {{dex}}", - "pool.volOverTvl": "1D об'єм/TVL", - "pool.volume.thirtyDay": "30-денний обсяг", - "pool.volume.thirtyDay.short": "30D об", - "pool.withdrawAs": "Зняти як {{nativeWrappedSymbol}}", - "poolFinder.availablePools": "Наявні басейни", - "poolFinder.availablePools.found.description": "пули v2, що відповідають вибраній вами парі.", - "poolFinder.availablePools.notFound.description": "Не знайдено відповідних пулів v2. Ще раз перевірте свій вибір маркера та переконайтеся, що ви підключені до правильного гаманця.", - "pools.explore": "Досліджуйте басейни", - "portfolio.activity.filters.timePeriod.all": "Весь час", - "portfolio.activity.filters.transactionType.all": "Усі типи", - "portfolio.activity.filters.transactionType.deposits": "Депозити", - "portfolio.activity.filters.transactionType.staking": "Ставки", - "portfolio.activity.filters.transactionType.swaps": "Обміни", - "portfolio.activity.title": "діяльність", - "portfolio.connectWallet.summary": "Відстежуйте токени, пули та багато іншого в мережах {{amount}}+", - "portfolio.defi.title": "Децентралізований фінансовий інструмент (DeFi)", - "portfolio.description": "Відстежуйте свій крипто-портфель у всіх ланцюжках та протоколах", - "portfolio.nfts.title": "NFT", - "portfolio.overview.title": "Огляд", - "portfolio.title": "Портфоліо", - "portfolio.tokens.table.column.allocation": "Розподіл", - "portfolio.tokens.table.column.balance": "Баланс", - "portfolio.tokens.table.column.change1d": "1D Зміна", - "portfolio.tokens.table.column.price": "Ціна", - "portfolio.tokens.table.column.token": "Токен", - "portfolio.tokens.table.column.value": "Значення", - "portfolio.tokens.title": "Жетони", - "position.addHook": "Додайте гачок", - "position.addHook.tooltip": "Хуки — це розширена функція, яка дозволяє пулам взаємодіяти зі смарт-контрактами, розблоковуючи різні можливості. Будьте обережні, додаючи хуки, оскільки деякі з них можуть бути зловмисними або викликати небажані наслідки.", - "position.addingHook": "Додавання гачка", - "position.addingHook.disclaimer": "Додавання хуків може мати непередбачені наслідки. Проведіть дослідження та продовжуйте на свій страх і ризик.", - "position.addingHook.hideProperties": "Приховати властивості", - "position.addingHook.invalidAddress": "Введіть дійсну адресу гака", - "position.addingHook.viewProperties": "Переглянути властивості", - "position.create.confirm": "Підтвердити позицію", - "position.create.invalidPrice": "Недійсна ціна", - "position.create.invalidRange": "Недійсний діапазон", - "position.create.modal.header": "Створення позиції", - "position.create.unsupportedSolana": "Басейни Solana не підтримуються.", - "position.create.unsupportedSolana.description": "Щоб створити пул, перейдіть на підтримуваний ланцюжок EVM.", - "position.create.unsupportedToken.description": "Спробуйте створити з іншою версією протоколу.", - "position.create.v2unsupportedChain": "Цей ланцюжок не підтримується для пулів версії 2.", - "position.currentValue": "Поточне значення позиції", - "position.default_price_strategies": "Цінові стратегії", - "position.default_price_strategies.error": "Не вдалося встановити цінову стратегію", - "position.deposit.confirm.create.description.less": "Введена початкова ціна {{value}}% нижча за ринкову ціну та може призвести до втрати коштів. Ви бажаєте продовжити?", - "position.deposit.confirm.create.description.more": "Введена початкова ціна на {{value}}% перевищує ринкову ціну та може призвести до втрати коштів. Ви бажаєте продовжити?", - "position.deposit.confirm.create.title": "Велика різниця в ціні з ринковою", - "position.deposit.description": "Вкажіть символічні суми вашого внеску ліквідності.", - "position.depositedCurrency": "Депоновано {{currencySymbol}}", - "position.fot.warning": "{{token}} та інші токени «Комісія за переказ» підтримуються лише Uniswap v2.", - "position.fot.warning.cta": "Створіть посаду v2", - "position.hook.disclaimer": "Я розумію потенційні ризики, пов’язані з додаванням цього гачка.", - "position.hook.donateWarning": "Ця позначка може призвести до змін отриманих комісій.", - "position.hook.liquidityWarning": "Цей прапорець може змусити пул блокувати додавання нової ліквідності. Ваша транзакція може бути скасована.", - "position.hook.removeWarning": "Може призвести до блокування ваших коштів або блокування збору комісії.", - "position.hook.swapWarning": "Цей прапорець може дозволити постачальникам ліквідності легше використовувати ліквідність Just-In-Time, що може призвести до зниження зароблених комісій.", - "position.hook.warningHeader": "Важливо: виявлені ризики підключення", - "position.hook.warningInfo": "Ми визначили потенційні ризики за допомогою цього гачка. Будь ласка, переконайтеся, що ви розумієте, як працює цей хук, перш ніж вирішити продовжити.", - "position.increase.fot": "Додавання ліквідності для {{token}} та інших токенів «Комісія за переказ» не підтримується.", - "position.initialPrice": "Початкова ціна", - "position.initialPrice.difference.negative": "{{ value }}% менше ринкової ціни", - "position.initialPrice.difference.positive": "{{ value }}% більше ринкової ціни", - "position.initialPrice.info": "Створюючи новий пул, ви повинні встановити початковий обмінний курс для обох токенів. Цей курс відображатиме початкову ринкову ціну.", - "position.initialPrice.set": "Встановити початкову ціну", - "position.initialPrice.useMarketPrice": "Використовуйте ринкову ціну", - "position.migrate.liquidity": "Під час міграції позицій ви не можете змінити свою пару токенів, але ви можете додати гачок для покращення функціональності.", - "position.migrate.v4unsupportedChain": "Цей ланцюжок не підтримується для пулів v4.", - "position.new": "Нова посада", - "position.new.protocol": "Нова {{protocol}} позиція", - "position.notFound": "Позиція не знайдена", - "position.notFound.description": "Подробиці про цю посаду недоступні. Будь ласка, переконайтеся, що ви підключені до правильного гаманця.", - "position.one_sided_lower": "Односторонній нижній", - "position.one_sided_lower.description": "Ліквідність пропозиції, якщо ціна падає", - "position.one_sided_upper": "Односторонній верх", - "position.one_sided_upper.description": "Ліквідність пропозиції, якщо ціна зросте", - "position.protocol": "{{protocol}} положення", - "position.provide.liquidity": "Виберіть токени, для яких ви хочете забезпечити ліквідність. Ви можете вибрати токени в усіх підтримуваних мережах.", - "position.provide.liquidityDescription": "Забезпечення повної ліквідності забезпечує безперервну участь у ринку за всіма можливими цінами, пропонуючи простоту, але з потенційними значними непостійними втратами.", - "position.provide.liquidityDescription.creatingPool": "Встановлення повної ліквідності під час створення пулу забезпечує безперервну участь у ринку за всіма можливими цінами, пропонуючи простоту, але з потенційними вищими непостійними втратами.", - "position.provide.liquidityDescription.custom": "Спеціальний діапазон дозволяє зосередити вашу ліквідність у певних цінових межах, підвищуючи ефективність капіталу та прибутки від комісій, але вимагаючи більш активного управління.", - "position.provide.outOfRange.closePosition": "Близька позиція", - "position.provide.outOfRange.description": "Діапазон цієї позиції не можна змінити під час міграції. Щоб встановити новий діапазон, закрийте цю позицію та відкрийте нову позицію v4.", - "position.provide.outOfRange.title": "Ви переміщуєте позицію поза діапазоном", - "position.removeHook": "Зняти гачок", - "position.resetDescription": "Вибрані токени, ціну та діапазон буде скинуто.", - "position.setRange": "Встановити діапазон цін", - "position.setRange.inputsBelow": "Використовуйте дані нижче, щоб установити свій діапазон.", - "position.stable": "Стабільний", - "position.stable.description": "Добре підходить для стейблкоїнів або пар з низькою волатильністю", - "position.step.deposit": "Введіть суму депозиту", - "position.step.price": "Встановіть початкову ціну та суму депозиту", - "position.step.range": "Встановіть ціновий діапазон і суму депозиту", - "position.step.select": "Виберіть пару токенів і комісію", - "position.value": "Значення позиції", - "position.valueUnavailable": "Вартість у доларах США наразі недоступна для цієї позиції. Перегляньте деталі позиції щодо суми внесених токенів.", - "position.wide": "Широкий", - "position.wide.description": "Добре підходить для волатильних пар", - "position.wrapped.unwrap": "Розгорніть {{wrappedToken}}", - "position.wrapped.warning": "{{nativeToken}} потрібно для пулів v4", - "position.wrapped.warning.info": "Розгорніть {{wrappedToken}} і внесіть {{nativeToken}} , щоб забезпечити економічно ефективнішу ліквідність.", - "positions.noPositions.description": "У вас немає ліквідних позицій. Створіть нову позицію, щоб почати отримувати комісії та винагороди за відповідні пули.", - "positions.noPositions.title": "Без позицій", - "positions.welcome.connect.description": "Щоб переглянути свої позиції та винагороди, вам потрібно підключити свій гаманець.", - "positions.welcome.connect.wallet": "Підключіть свій гаманець", - "privacy.anonymizedLogs": "Додаток веде анонімну статистику використання, щоб з часом покращувати її.", - "privacy.autoRouter": "Додаток отримує оптимальний торговий маршрут із сервера Uniswap Labs.", - "privacy.infura": "Додаток отримує дані в мережі та створює контрактні виклики за допомогою API Infura.", - "privacy.thirdPartyApis": "Ця програма використовує такі API сторонніх розробників:", - "privacy.trm": "Програма безпечно збирає адресу вашого гаманця та передає її TRM Labs Inc. з міркувань ризику та дотримання вимог.", - "privacy.uniswaptos": "Умови використання Uniswap Labs", - "privateKeys.export.modal.speedbump.bullet1": "Перегляньте це приватно", - "privateKeys.export.modal.speedbump.bullet2": "Нікому не діліться цим", - "privateKeys.export.modal.speedbump.bullet3": "Ніколи не вводьте його на будь-які веб-сайти чи додатки", - "privateKeys.export.modal.speedbump.subtitle": "Будь-хто, хто знає ваш закритий ключ, може отримати доступ до вашого гаманця та коштів.", - "privateKeys.export.modal.speedbump.title": "Перш ніж продовжити", - "privateKeys.export.modal.subtitle": "Схоже, ви не можете повністю відновити свій гаманець. Щоб ніколи не втратити доступ до своїх коштів, скопіюйте свій закритий ключ.", - "privateKeys.export.modal.title": "Експортуйте свій закритий ключ", - "privateKeys.export.modal.warning": "Якщо ви втратите телефон або видалите застосунок, вам потрібно буде імпортувати цей ключ в інший гаманець.", - "privateKeys.view.button.continue": "Я скопіював їх усі.", - "privateKeys.view.button.continue.single": "Я скопіював це.", - "privateKeys.view.subtitle": "Ваш закритий ключ надає доступ до певного гаманця. Кожен гаманець має різний закритий ключ.", - "privateKeys.view.title": "Закритий ключ", - "qrScanner.button.connections_one": "Підключено 1 програму", - "qrScanner.button.connections_other": "Підключено {{count}} програм", - "qrScanner.error.camera.message": "Щоб відсканувати код, надайте доступ до камери в налаштуваннях системи", - "qrScanner.error.camera.title": "Камера вимкнена", - "qrScanner.error.none": "QR-код не знайдено", - "qrScanner.recipient.action.scan": "Відскануйте QR-код", - "qrScanner.recipient.action.show": "Показати мій QR-код", - "qrScanner.recipient.error.message": "Перш ніж повторити спробу, переконайтеся, що ви скануєте дійсний QR-код адреси Ethereum.", - "qrScanner.recipient.error.title": "Недійсний QR-код", - "qrScanner.request.message.unavailable": "Повідомлення не знайдено.", - "qrScanner.request.method.default": "Запит від {{dappNameOrUrl}}", - "qrScanner.request.method.signature": "Запит на підпис від {{dappNameOrUrl}}", - "qrScanner.request.method.transaction": "Запит на трансакцію від {{dappNameOrUrl}}", - "qrScanner.request.withAmount": "Дозволити {{dappName}} використовувати до {{amount}} {{currencySymbol}}?", - "qrScanner.request.withoutAmount": "Дозволити {{dappName}} використовувати ваш {{currencySymbol}}?", - "qrScanner.status.connecting": "Підключення...", - "qrScanner.status.loading": "Завантаження...", - "qrScanner.title": "Відскануйте QR-код", - "qrScanner.wallet.networks": "Підтримувані мережі", - "range.outOfView": "Діапазон поза полем зору", - "removeLiquidity.pooled": "Об'єднані {{symbol}}:", - "revoke.failed.message": "Ймовірно, проблема з мережею або підключенням спричинила невдалу операцію з відкликанням. Перевірте підключення та повторіть спробу.", - "routing.aggregateLiquidity": "Якщо доступно, агрегує джерела ліквідності для кращих цін і свопів без газу.", - "routing.aggregateLiquidity.uniswapx": "UniswapX об'єднує джерела ліквідності в мережі та поза нею, пропонуючи вам найкращі доступні ціни та безгазові свопи.", - "routing.cheapest": "Клієнт Uniswap вибирає найдешевший варіант торгівлі з урахуванням ціни та вартості мережі.", - "routing.cheapest.v4": "Клієнт Uniswap вибирає оптимальний варіант торгівлі з урахуванням ціни та вартості мережі.", - "scantastic.code.expired": "Термін дії минув", - "scantastic.code.subtitle": "Введіть цей код у розширення Uniswap. Ваша фраза відновлення буде безпечно зашифрована та передана.", - "scantastic.code.timeRemaining.shorthand.hours": "Новий код через {{hours}}год {{minutes}}м {{seconds}}с", - "scantastic.code.timeRemaining.shorthand.minutes": "Новий код через {{minutes}}хв {{seconds}}с", - "scantastic.code.timeRemaining.shorthand.seconds": "Новий код через {{seconds}}с", - "scantastic.code.title": "Uniswap одноразовий код", - "scantastic.confirmation.button.continue": "Так, продовжувати", - "scantastic.confirmation.label.browser": "Браузер", - "scantastic.confirmation.label.device": "пристрій", - "scantastic.confirmation.subtitle": "Продовжуйте, лише якщо ви скануєте QR-код із розширення Uniswap на надійному пристрої.", - "scantastic.confirmation.title": "Ви намагаєтеся імпортувати свій гаманець?", - "scantastic.confirmation.warning": "Остерігайтеся сайтів і програм, які видають себе за Uniswap. Інакше ваш гаманець може бути скомпрометований.", - "scantastic.error.encryption": "Не вдалося підготувати початкову фразу.", - "scantastic.error.noCode": "OTP не отримано. Будь ласка спробуйте ще раз.", - "scantastic.error.timeout.message": "Ще раз відскануйте QR-код розширення Uniswap, щоб продовжити синхронізацію вашого гаманця.", - "scantastic.error.timeout.title": "Час очікування підключення минув", - "scantastic.modal.ipMismatch.description": "Щоб відсканувати цей QR-код, ваш телефон має бути під’єднано до тієї ж мережі Wi-Fi, що й комп’ютер, і будь-які мережі VPN мають бути тимчасово вимкнені.", - "scantastic.modal.ipMismatch.title": "Змініть мережу WiFi", - "search.input.placeholder": "Пошук токенів і пулів", - "search.ukDisclaimer": "Застереження для жителів Великобританії", - "send.button.review": "Огляд передачі", - "send.gas.error.title": "N/A", - "send.gas.networkCost.title": "Вартість мережі", - "send.input.token.balance.title": "Баланс: {{balance}} {{symbol}}", - "send.recipient.header": "Виберіть одержувача", - "send.recipient.input.placeholder": "Шукайте ENS або адресу", - "send.recipient.previous_one": "1 попередня передача", - "send.recipient.previous_other": "{{count}} попередні перекази", - "send.recipient.results.empty": "Нічого не знайдено", - "send.recipient.results.error": "Адреса, яку ви ввели, або не існує, або написана неправильно.", - "send.recipient.section.favorite": "Улюблені гаманці", - "send.recipient.section.recent": "Останні", - "send.recipient.section.search": "Результати пошуку", - "send.recipient.section.viewOnly": "Гаманці лише для перегляду", - "send.recipient.section.yours": "Ваші гаманці", - "send.recipient.warning.viewOnly.message": "Надсилайте кошти на цей гаманець, лише якщо у вас є фраза для відновлення або ви знаєте власника гаманця.", - "send.recipient.warning.viewOnly.title": "Ви маєте це як гаманець лише для перегляду", - "send.recipientSelect.search.empty.message": "Коли ви надсилаєте токени на адресу гаманця, вони відображатимуться тут", - "send.recipientSelect.search.empty.title": "Гаманці не збережено", - "send.review.modal.title": "Ви надсилаєте", - "send.review.summary.button.title": "Підтвердити відправку", - "send.search.empty.subtitle": "Адреса, яку ви ввели, або не існує, або написана неправильно.", - "send.search.empty.title": "Нічого не знайдено", - "send.search.placeholder": "Шукайте ENS або адресу", - "send.solanaSendNotSupported": "Надсилання не підтримується на Solana", - "send.title": "Надіслати", - "send.unavailableOnSolana.message": "Надсилання коштів недоступне на гаманцях Solana", - "send.warning.blocked.default": "Цей гаманець заблоковано", - "send.warning.blocked.modal.message": "Цю адресу заблоковано в Uniswap Wallet, оскільки вона пов’язана з однією чи кількома заблокованими діями. Якщо ви вважаєте, що це помилка, надішліть електронний лист на compliance@uniswap.org.", - "send.warning.blocked.modal.title": "Заблокована адреса", - "send.warning.blocked.recipient": "Гаманець одержувача заблоковано", - "send.warning.erc20.checkbox.description": "Ви намагаєтеся надіслати кошти на маркерну адресу. Це може призвести до остаточної втрати коштів.", - "send.warning.erc20.checkbox.heading": "Виявлено адресу маркера", - "send.warning.erc20.message": "Ви намагаєтеся надіслати кошти на маркерну адресу. Надсилання криптовалюти на цей тип адреси може призвести до постійної втрати коштів.", - "send.warning.erc20.title": "Це символічна адреса", - "send.warning.insufficientFunds.message": "Ваш баланс на {{currencySymbol}} зменшився, оскільки ви ввели суму, яку хочете надіслати", - "send.warning.insufficientFunds.title": "Недостатньо {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "Недостатньо {{currencySymbol}} на {{networkName}} для надсилання", - "send.warning.insufficientGas.message.withoutNetwork": "Недостатньо {{currencySymbol}} для надсилання", - "send.warning.modal.button.cta.blocking": "в порядку", - "send.warning.modal.button.cta.cancel": "Скасувати", - "send.warning.modal.button.cta.confirm": "Підтвердити", - "send.warning.newAddress.details.ENS": "ENS", - "send.warning.newAddress.details.username": "Ім'я користувача", - "send.warning.newAddress.details.walletAddress": "Адреса гаманця", - "send.warning.newAddress.message": "Ви раніше не здійснювали операції з цією адресою. Перш ніж продовжити, переконайтеся, що адреса правильна.", - "send.warning.newAddress.title": "Нова адреса", - "send.warning.self.message": "Ви намагаєтеся надіслати кошти на поточний гаманець. Надсилання криптовалюти на цю адресу призведе до непотрібних мережевих витрат.", - "send.warning.self.title": "Це ваш поточний гаманець", - "send.warning.smartContract.message": "Ви збираєтеся надіслати кошти на адресу смарт-контракту. Переконайтеся, що це правильна адреса та що вона може отримувати маркери. Якщо ні, це може призвести до остаточної втрати коштів.", - "send.warning.smartContract.title": "Це адреса смарт-контракту", - "send.warning.viewOnly.message": "Вам потрібно імпортувати цей гаманець за допомогою фрази відновлення, щоб надіслати активи.", - "send.warning.viewOnly.title": "Цей гаманець доступний лише для перегляду", - "send.youAreSending": "Ви надсилаєте", - "sendRecipientForm.recentAddresses.label": "Останні", - "sendReviewModal.title": "Відгук відправити", - "setting.recoveryPhrase.account.show": "Показати фразу відновлення", - "setting.recoveryPhrase.action.hide": "Приховати фразу відновлення", - "setting.recoveryPhrase.remove": "Видалити фразу відновлення", - "setting.recoveryPhrase.remove.confirm.subtitle": "Я розумію, що Uniswap Labs не зможе допомогти мені відновити мій гаманець, якщо я цього не зроблю", - "setting.recoveryPhrase.remove.confirm.title": "Я зберіг фразу відновлення", - "setting.recoveryPhrase.remove.initial.subtitle": "Переконайтеся, що ви зберегли фразу відновлення. В іншому випадку ви втратите доступ до своїх коштів", - "setting.recoveryPhrase.remove.initial.title": "Перш ніж продовжити", - "setting.recoveryPhrase.remove.subtitle": "Введіть свій пароль, щоб продовжити", - "setting.recoveryPhrase.remove.title": "Ви видаляєте свою фразу відновлення", - "setting.recoveryPhrase.view.warning.message1": "Кожен, хто знає вашу фразу відновлення, може отримати доступ до вашого гаманця та коштів", - "setting.recoveryPhrase.view.warning.message2": "Перегляньте це приватно", - "setting.recoveryPhrase.view.warning.message3": "Нікому не діліться цим", - "setting.recoveryPhrase.view.warning.message4": "Ніколи не вводьте його на будь-які веб-сайти чи додатки", - "setting.recoveryPhrase.view.warning.title": "Перш ніж продовжити", - "setting.recoveryPhrase.warning.view.message": "Кожен, хто знає вашу фразу відновлення, може отримати доступ до вашого гаманця та коштів.", - "setting.recoveryPhrase.warning.view.title": "Перегляньте це в приватному місці", - "settings.action.enableInSettings": "Увімкнути в налаштуваннях", - "settings.action.feedback": "Надіслати відгук", - "settings.action.help": "Отримати допомогу", - "settings.action.lock": "Заблокувати гаманець", - "settings.action.privacy": "Політика конфіденційності", - "settings.action.terms": "Умови використання", - "settings.connectWalletPlatform.warning": "Щоб використовувати Uniswap на {{platform}}, підключіться до гаманця, який підтримує {{platform}}.", - "settings.footer": "Зроблено з любов’ю, \nкоманда Uniswap 🦄", - "settings.hideSmallBalances": "Приховайте невеликі залишки", - "settings.hideSmallBalances.subtitle": "Залишки менше 1 долара США будуть приховані з вашого портфеля.", - "settings.maxSlippage": "Макс. ковзання", - "settings.maxSlippage.amount": "{{amount}} макс. прослизання", - "settings.section.about": "про", - "settings.section.preferences": "Уподобання", - "settings.section.privacyAndSecurity": "Конфіденційність і безпека", - "settings.section.support": "Підтримка", - "settings.section.wallet.hidden.row.title": "{{numHidden}} інші гаманці", - "settings.setting.advanced.title": "Просунутий", - "settings.setting.advancedSettings": "Advanced settings", - "settings.setting.appearance.option.auto": "Авто", - "settings.setting.appearance.option.dark.subtitle": "Завжди використовуйте темну тему.", - "settings.setting.appearance.option.dark.title": "Темний", - "settings.setting.appearance.option.device.subtitle": "Адаптується до налаштувань вашого пристрою.", - "settings.setting.appearance.option.device.title": "Авто", - "settings.setting.appearance.option.light.subtitle": "Завжди використовуйте світлу тему.", - "settings.setting.appearance.option.light.title": "світло", - "settings.setting.appearance.title": "Тема", - "settings.setting.backup.create.description": "Встановлення пароля зашифрує вашу резервну копію фрази відновлення, додавши додатковий рівень захисту, якщо ваш обліковий запис {{cloudProviderName}} коли-небудь буде зламано.", - "settings.setting.backup.create.title": "Резервне копіювання до {{cloudProviderName}}", - "settings.setting.backup.delete.confirm.message": "Оскільки ці гаманці мають спільну фразу відновлення, резервні копії цих гаманців також буде видалено нижче", - "settings.setting.backup.delete.confirm.title": "Ти впевнений?", - "settings.setting.backup.delete.warning": "Якщо ви видалите свою резервну копію {{cloudProviderName}} , ви зможете відновити свій гаманець лише за допомогою резервної копії фрази відновлення вручну. Uniswap Labs не може відновити ваші активи, якщо ви втратите фразу відновлення.", - "settings.setting.backup.error.message.full": "Не вдається створити резервну копію фрази відновлення на {{cloudProviderName}}. Будь ласка, переконайтеся, що {{cloudProviderName}} увімкнено з доступним місцем для зберігання, і повторіть спробу.", - "settings.setting.backup.error.message.short": "Не вдалося видалити резервну копію", - "settings.setting.backup.error.title": "{{cloudProviderName}} помилка", - "settings.setting.backup.modal.description": "Ви ще не створили резервну копію своєї фрази відновлення на {{cloudProviderName}} . Роблячи це, ви можете відновити свій гаманець, просто увійшовши в {{cloudProviderName}} на будь-якому пристрої.", - "settings.setting.backup.modal.title": "Резервне копіювання фрази відновлення до {{cloudProviderName}}?", - "settings.setting.backup.password.error.mismatch": "Паролі не збігаються", - "settings.setting.backup.password.medium": "Це середній пароль", - "settings.setting.backup.password.placeholder.confirm": "Підтвердьте пароль", - "settings.setting.backup.password.placeholder.create": "Створити пароль", - "settings.setting.backup.password.strong": "Це надійний пароль", - "settings.setting.backup.password.weak": "Це слабкий пароль", - "settings.setting.backup.recoveryPhrase.label": "Фраза відновлення", - "settings.setting.backup.selected": "{{cloudProviderName}} резервне копіювання", - "settings.setting.backup.status.action.delete": "Видалити резервну копію", - "settings.setting.backup.status.complete": "Резервну копію створено до {{cloudProviderName}}", - "settings.setting.backup.status.description": "Зробивши резервну копію фрази відновлення до {{cloudProviderName}}, ви можете відновити свій гаманець, просто увійшовши у свій обліковий запис {{cloudProviderName}} на будь-якому пристрої.", - "settings.setting.backup.status.inProgress": "Резервне копіювання до {{cloudProviderName}}...", - "settings.setting.backup.status.recoveryPhrase.backed": "Резервне копіювання", - "settings.setting.backup.status.title": "{{cloudProviderName}} резервна копія", - "settings.setting.beta.tooltip": "Незабаром", - "settings.setting.biometrics.appAccess.subtitle.android": "Вимагати обличчя/відбиток пальця, щоб відкрити програму.", - "settings.setting.biometrics.appAccess.subtitle.ios": "Вимагати {{biometricsMethod}} для відкриття програми.", - "settings.setting.biometrics.appAccess.title": "Доступ до програми", - "settings.setting.biometrics.auth": "Будь ласка, авторизуйтеся", - "settings.setting.biometrics.extension.waitingForBiometricsModal.content": "Щоб продовжити, увімкніть {{biometricsMethod}} у налаштуваннях браузера або системи.", - "settings.setting.biometrics.extension.waitingForBiometricsModal.title": "Очікування {{biometricsMethod}}", - "settings.setting.biometrics.off.message.android": "Біометричні дані наразі вимкнено для Uniswap Wallet — ви можете ввімкнути їх у налаштуваннях системи.", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} наразі вимкнено для Uniswap Wallet — ви можете ввімкнути його в налаштуваннях системи.", - "settings.setting.biometrics.off.title.android": "Біометрія вимкнена", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} вимкнено", - "settings.setting.biometrics.title": "Розблокування обличчям/відбитком пальця", - "settings.setting.biometrics.transactions.subtitle.android": "Вимагати обличчя/відбиток пальця для транзакції.", - "settings.setting.biometrics.transactions.subtitle.ios": "Вимагати {{biometricsMethod}} для транзакції.", - "settings.setting.biometrics.transactions.title": "транзакції", - "settings.setting.biometrics.unavailable.message.android": "Біометрія не налаштована на вашому пристрої. Щоб використовувати біометрію, спочатку налаштуйте її в налаштуваннях.", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} не встановлено на вашому пристрої. Щоб використовувати {{biometricsMethod}}, спочатку встановіть його в налаштуваннях.", - "settings.setting.biometrics.unavailable.title.android": "Біометрія не налаштована", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} не встановлено", - "settings.setting.biometrics.warning.message.android": "Якщо ви не ввімкнете біометрію, кожен, хто отримає доступ до вашого пристрою, зможе відкрити Uniswap Wallet і здійснювати транзакції.", - "settings.setting.biometrics.warning.message.ios": "Якщо ви не ввімкнете {{biometricsMethod}}, кожен, хто отримає доступ до вашого пристрою, зможе відкрити Uniswap Wallet і здійснювати транзакції.", - "settings.setting.biometrics.warning.title": "Ти впевнений?", - "settings.setting.connections.disconnectAll": "Відключити все", - "settings.setting.connections.noConnectionsDescription": "Підключіться до програми, знайшовши кнопку «Підключити гаманець» або «Увійти».", - "settings.setting.currency.title": "Місцева валюта", - "settings.setting.deviceAccess.reset.title": "Скиньте {{biometricsMethod}}", - "settings.setting.deviceAccess.title": "Доступ до пристроїв", - "settings.setting.deviceAccessTimeout.1hour": "1 год.", - "settings.setting.deviceAccessTimeout.24hours": "24 години", - "settings.setting.deviceAccessTimeout.30minutes": "30 хв", - "settings.setting.deviceAccessTimeout.5minutes": "5 хв", - "settings.setting.deviceAccessTimeout.never": "Ніколи", - "settings.setting.deviceAccessTimeout.title": "Тайм-аут автоматичного блокування", - "settings.setting.hapticTouch.title": "Тактильний дотик", - "settings.setting.helpCenter.title": "Центр допомоги", - "settings.setting.language.button.navigate": "Перейдіть до налаштувань", - "settings.setting.language.description.extension": "У Uniswap за замовчуванням використовуються налаштування мови системи. Щоб змінити бажану мову, перейдіть до налаштувань системи.", - "settings.setting.language.description.mobile": "Uniswap за замовчуванням використовує мовні налаштування вашого пристрою. Щоб змінити бажану мову, перейдіть до «Uniswap» у налаштуваннях свого пристрою та натисніть «Language».", - "settings.setting.language.title": "Мова", - "settings.setting.notifications.row.activity.description": "Перекази, запити та інша діяльність", - "settings.setting.notifications.row.activity.title": "Активність гаманця", - "settings.setting.notifications.row.updates.description": "Рекомендації та нові функції", - "settings.setting.notifications.row.updates.title": "Оновлення від Uniswap", - "settings.setting.notifications.title": "Сповіщення", - "settings.setting.password.change.title": "Створіть новий пароль", - "settings.setting.password.title": "Змінити пароль", - "settings.setting.permissions.title": "Дозволи", - "settings.setting.privacy.analytics.description": "Ми використовуємо анонімні дані про використання, щоб покращити ваш досвід використання продуктів Uniswap Labs. Якщо вимкнено, ми відстежуємо лише помилки та важливі використання.", - "settings.setting.privacy.analytics.title": "Аналітика додатків", - "settings.setting.privateKeys.title": "Приватні ключі", - "settings.setting.recoveryPhrase.title": "Фраза відновлення", - "settings.setting.smallBalances.title": "Баланс портфеля", - "settings.setting.smartWallet.action.enable": "Увімкнути", - "settings.setting.smartWallet.action.smartWallet": "Smart wallet", - "settings.setting.smartWallet.notEligible": "Не відповідає вимогам", - "settings.setting.smartWallet.status.actionRequired": "Потрібна дія", - "settings.setting.smartWallet.status.active": "Активний", - "settings.setting.smartWallet.status.inactive": "Неактивний", - "settings.setting.smartWallet.status.unavailable": "Недоступний", - "settings.setting.unknownTokens.subtitle": "Потенційні маркери шахрайства будуть приховані у вашому портфоліо.", - "settings.setting.unknownTokens.title": "Приховати невідомі маркери", - "settings.setting.wallet.action.editLabel": "Редагувати мітку", - "settings.setting.wallet.action.editProfile": "Редагувати профіль", - "settings.setting.wallet.action.remove": "Видаліть гаманець", - "settings.setting.wallet.connection.banner.description": "Керуйте з’єднаннями через налаштування гаманця, натиснувши зображення свого профілю.", - "settings.setting.wallet.connection.banner.title": "З’єднання переїхали", - "settings.setting.wallet.connections.title": "Зв'язки", - "settings.setting.wallet.editLabel.description": "Мітки не є публічними. Вони зберігаються локально й видимі лише вам.", - "settings.setting.wallet.editLabel.save": "Зберегти зміни", - "settings.setting.wallet.label": "псевдонім", - "settings.setting.wallet.testnetMode.description": "Це вмикає тестові мережі для розробників, щоб випробувати функції та транзакції без використання реальних ресурсів. Токени в тестових мережах не мають реальної цінності.", - "settings.setting.wallet.testnetMode.title": "Режим Testnet", - "settings.switchNetwork.warning": "Щоб використовувати Uniswap на {{label}}, перемкніть мережу в налаштуваннях свого гаманця.", - "settings.title": "Налаштування", - "settings.version": "Версія {{appVersion}}", - "smartWallet.actionRequired.cta": "Вимкнути в 1 мережі", - "smartWallet.actionRequired.cta.plural": "Вимкнути в мережах {{amount}}", - "smartWallet.actionRequired.description": "Вимкнення смарт-гаманця – це дія в мережі, яка вимагає невеликих витрат на мережу.", - "smartWallet.actionRequired.insufficientFunds": "Недостатньо коштів", - "smartWallet.actionRequired.reactivate": "Продовжуйте користуватися розумним гаманцем", - "smartWallet.actionRequired.title": "Розумний гаманець активний в 1 мережі", - "smartWallet.actionRequired.title.plural": "Розумний гаманець активний у {{amount}} мережах", - "smartWallet.activeNetworks.title": "Розумний гаманець активний в 1 мережі", - "smartWallet.activeNetworks.title.plural": "Розумний гаманець активний у {{amount}} мережах", - "smartWallet.banner.networkCost": "Includes a one-time cost to activate your smart wallet on {{chainName}}.", - "smartWallet.banner.text": "Увімкніть розумний гаманець , щоб заощадити до 50% витрат на мережу.", - "smartWallet.confirmDisableSmartWallet.description": "Ви втратите можливість швидше обмінюватися, отримувати знижки на мережеві тарифи та інші майбутні покращення.", - "smartWallet.confirmDisableSmartWallet.title": "Ти впевнений?", - "smartWallet.insufficient.description": "Розумний гаманець не можна вимкнути в цих мережах, доки у вас не з’являться кошти для покриття витрат на мережу.", - "smartWallet.insufficient.title": "Недостатньо коштів в 1 мережі", - "smartWallet.insufficient.title.plural": "Недостатньо коштів у мережах {{amount}}", - "smartWallet.InsufficientFunds.button.continue.text": "Продовжити все одно", - "smartWallet.insufficientFunds.network.banner.description": "Неможливо вимкнути через недостатню кількість коштів.", - "smartWallet.insufficientFunds.network.banner.title_one": "{{count}} мережа виключена", - "smartWallet.insufficientFunds.network.banner.title_other": "{{count}} мережа виключена", - "smartWallet.insufficientFunds.network.disable.text": "Готовий до відключення", - "smartWallet.insufficientFunds.network.text": "Вам потрібно {{nativeCurrency}}", - "smartWallet.insufficientFunds.single.network.banner.title": "{{chain}} виключено", - "smartWallet.modal.description.block1": "Розумні гаманці використовують смарт-контракти для швидших і дешевших транзакцій.", - "smartWallet.modal.description.block2": "Гаманці, які вже використовують функції смарт-гаманця з іншого додатка, не будуть вплинуті.", - "smartWallet.modal.title": "Розумний гаманець", - "smartWallets": "Розумні гаманці", - "smartWallets.activeNetworks.description": "Ваш розумний гаманець автоматично активується в кожній новій мережі, до якої ви переходите.", - "smartWallets.createdModal.description": "You’re getting faster transactions and lower network costs on every swap.", - "smartWallets.createdModal.title": "Розумний гаманець створено", - "smartWallets.delegation.limitedSupport": "Ваш гаманець має обмежену підтримку", - "smartWallets.delegationMismatchModal.description": "{{walletName}} не підтримує найновіші стандарти Ethereum, що використовуються {{displayName}}, тому деякі функції недоступні.", - "smartWallets.delegationMismatchModal.features.1ClickSwaps": "Обміни одним кліком", - "smartWallets.delegationMismatchModal.features.gasFreeSwaps": "Безгазові обміни", - "smartWallets.delegationMismatchModal.features.limitOrders": "Лімітні ордери", - "smartWallets.delegationMismatchModal.limitOrders.unsupported": "Лімітні ордери не підтримуються вашим гаманцем.", - "smartWallets.delegationMismatchModal.title": "Обмежена підтримка гаманців", - "smartWallets.disable.failed": "Сталася помилка. Розумний гаманець все ще активний в одній або кількох мережах. Спробуйте ще раз.", - "smartWallets.disable.modal.description": "Ця дія в мережі вимагає мережевих витрат.", - "smartWallets.disable.modal.title": "Вимкнути розумний гаманець", - "smartWallets.educationalModal.description": "Розумні гаманці забезпечують швидші та недорогі транзакції за допомогою смарт-контрактів.", - "smartWallets.educationalModal.info": "Це не вплине на гаманці, які вже використовують функції розумного гаманця з іншої програми.", - "smartWallets.enabledModal.description": "Оновлення набудуть чинності під час наступної заміни.", - "smartWallets.enabledModal.description.dapp": "Оновлення набудуть чинності під час вашої наступної транзакції.", - "smartWallets.enabledModal.description.dapp.line2": "Підключіть свій гаманець знову, щоб одразу почати користуватися функціями розумного гаманця в додатках.", - "smartWallets.enabledModal.title": "Розумний гаманець увімкнено", - "smartWallets.postSwapNudge.enable": "Увімкнути розумний гаманець", - "smartWallets.postSwapNudge.title": "Заощаджуйте на наступному обміні", - "smartWallets.postSwapNudge.title.dapp": "Цей додаток підтримує розумні гаманці", - "smartWallets.unavailableModal.description": "Інший постачальник гаманців тепер керує налаштуваннями смарт-гаманця для {{displayName}}. Ви можете продовжувати користуватися Uniswap як завжди.", - "smartWallets.unavailableModal.title": "Функції розумного гаманця недоступні", - "solanaPromo.banner.description": "Торгуйте токенами Solana безпосередньо на Uniswap.", - "solanaPromo.banner.title": "Солана вже доступна", - "solanaPromo.modal.connectWallet": "Підключіть свій улюблений гаманець Solana", - "solanaPromo.modal.startSwapping.button": "Почніть обмін на Solana", - "solanaPromo.modal.swapInstantly": "Миттєво обмінюйте тисячі трендових токенів", - "solanaPromo.modal.viewTokenData": "Переглядайте дані та ціни токенів в одному місці", - "speedBump.newAddress.warning.description": "Ви раніше не здійснювали операції з цією адресою. Перш ніж продовжити, переконайтеся, що це правильна адреса.", - "speedBump.newAddress.warning.title": "Нова адреса", - "speedBump.smartContractAddress.warning.description": "Ви збираєтеся надіслати токени на особливий тип адреси – смарт-контракт. Ще раз переконайтеся, що це адреса, на яку ви збиралися надіслати. Якщо це не так, ваші жетони можуть бути втрачені назавжди.", - "speedBump.smartContractAddress.warning.title": "Це адреса гаманця?", - "stats.24fees": "Цілодобові збори", - "stats.24swapVolume": "24-годинний обсяг свопу", - "stats.24volume": "24H обсяг", - "stats.allTimeSwappers": "Обмінники всіх часів", - "stats.allTimeVolume": "Обсяг за весь час", - "stats.fdv": "FDV", - "stats.fdv.description": "Повністю розбавлена оцінка (FDV) обчислює загальну ринкову вартість за умови, що всі токени знаходяться в обігу.", - "stats.marketCap": "Ринкова капіталізація", - "stats.marketCap.description": "Ринкова капіталізація — це загальна ринкова вартість обігу активу.", - "stats.noStatsAvailable": "Статистика недоступна", - "stats.tvl": "Загальне значення заблоковано", - "stats.tvl.description": "Загальна заблокована вартість (TVL) — це загальна сума активу, доступна для всіх пулів ліквідності Uniswap.", - "stats.volume.1d": "Обсяг на 1 днів", - "stats.volume.1d.description": "Обсяг за 1 день — це кількість активу, який торгувався на Uniswap протягом останніх 24 годин.", - "stats.volume.1d.long": "1D обсяг", - "stats.volume.1d.short": "1D том", - "stats.volume.description": "Обсяг — це кількість активу, який торгувався на Uniswap протягом вибраного періоду часу.", - "swap.allow.oneTime": "Дозволити {{sym}} (один раз)", - "swap.approveAndSubmit": "Підтвердьте та надішліть", - "swap.approveAndSwap": "Затвердити та поміняти", - "swap.balance.amount": "Баланс: {{amount}}", - "swap.bestPrice.through": "Маршрут через {{provider}}", - "swap.bestRoute.cost": "За оцінками, найефективніший маршрут коштує ~{{gasPrice}} витрат на мережу. ", - "swap.bridging.title": "Перемикання між мережами", - "swap.bridging.warning.description": "Ви міняєтеся з {{fromNetwork}} на {{toNetwork}}. Це також відоме як «перемикання», яке переміщує ваші токени з однієї мережі в іншу.", - "swap.button.confirmSignAndSwap": "Підтвердити підпис та обмін", - "swap.button.confirmSwapAnyways": "Все одно підтвердити обмін", - "swap.button.confirmUnwrap": "Підтвердити розгортання", - "swap.button.max": "Макс", - "swap.button.review": "огляд", - "swap.button.submitting": "Надсилання обміну...", - "swap.button.submitting.keep.open": "Тримайте гаманець відкритим...", - "swap.button.submitting.passkey": "Підтвердити за допомогою ключа доступу", - "swap.button.swap": "Обмін", - "swap.button.swapAnyways": "Все одно поміняти", - "swap.button.unwrap": "Розгорніть", - "swap.button.wrap": "Обгортка", - "swap.buy.countryModal.placeholder": "Пошук за країною чи регіоном", - "swap.cancel.cannotExecute_one": "Ваш обмін може бути виконано до того, як буде оброблено скасування. Ваші витрати на мережу не можуть бути відшкодовані. Ви бажаєте продовжити?", - "swap.cancel.cannotExecute_other": "Ваші обміни можуть бути виконані до того, як буде оброблено скасування. Ваші витрати на мережу не можуть бути відшкодовані. Ви бажаєте продовжити?", - "swap.confirmApproveAndSwap": "Підтвердити схвалення та обміняти", - "swap.confirmLimit": "Підтвердити ліміт", - "swap.confirmSwap": "Підтвердити обмін", - "swap.confirmWrap": "Підтвердити перенесення", - "swap.deadline.settings.title": "Термін обміну", - "swap.deadline.settings.title.short": "Tx. крайній термін", - "swap.details.completed": "Обмін завершено", - "swap.details.estimatedTime": "Орієнтовний час", - "swap.details.fasterUnichainSwaps": "Швидші свопи завдяки Unichain", - "swap.details.feeOnTransfer": "{{tokenSymbol}} комісія", - "swap.details.feeOnTransfer.symbol": "{{tokenSymbol}} комісія за токен", - "swap.details.instant": "Миттєвий", - "swap.details.newQuote.input": "Новий вхід", - "swap.details.newQuote.output": "Новий вихід", - "swap.details.orderRouting": "Маршрутизація замовлень", - "swap.details.orderRoutingInfo": "Цей своп маршрутизується через Across, децентралізований протокол, який переміщує активи між мережами, надаючи пріоритет безпеці, швидкому виконанню та низьким цінам.", - "swap.details.poweredBy": "Працює на", - "swap.details.rate": "Оцінка", - "swap.details.slippage": "Максимальне ковзання", - "swap.details.slippage.uniswap": "Захищене прослизання Uniswap", - "swap.details.swappedIn.unichain": "Завершено за {{time}}с на Unichain", - "swap.details.uniswapFee": "Комісія", - "swap.error.default": "Можливо, вам знадобиться збільшити стійкість до ковзання. Примітка: токени з платою за переказ і перебазування несумісні з Uniswap V3.", - "swap.error.expectedToFail": "Очікується, що ваш обмін не вдасться.", - "swap.error.fiatInputUnavailable": "{{fiatCurrencyCode}} вхід недоступний", - "swap.error.modifiedByWallet": "Ваш обмін було змінено через ваш гаманець. Якщо це була помилка, негайно скасуйте підписку, інакше ризикуєте втратити кошти.", - "swap.error.rejected": "Трансакцію відхилено", - "swap.error.undefinedObject": "Під час спроби виконати цю заміну сталася помилка. Можливо, вам знадобиться збільшити стійкість до ковзання. Якщо це не спрацює, можливо, виникла несумісність з токеном, яким ви торгуєте. Примітка: токени з платою за переказ і перебазування несумісні з Uniswap V3.", - "swap.error.unknown": "Невідома помилка.", - "swap.error.v2.expired": "Цю транзакцію не вдалося надіслати, оскільки кінцевий термін минув. Будь ласка, переконайтеся, що кінцевий термін транзакції не надто короткий.", - "swap.error.v2.k": "Інваріант Uniswap x*y=k не був задоволений свопом. Зазвичай це означає, що один із токенів, які ви обмінюєте, включає спеціальну поведінку під час передачі.", - "swap.error.v2.slippage": "Ця трансакція не буде виконана через зміну ціни або комісію за переказ. Спробуйте підвищити стійкість до ковзання", - "swap.error.v2.transferInput": "Вхідний маркер не можна передати. Можливо, виникла проблема з маркером введення.", - "swap.error.v2.transferOutput": "Виведений токен неможливо передати. Можливо, виникла проблема з вихідним маркером.", - "swap.error.v3.slippage": "Ця трансакція не буде виконана через коливання ціни. Спробуйте підвищити стійкість до ковзання. Примітка: плата за передачу та перебазування токенів несумісна з Uniswap V3.", - "swap.error.v3.transferOutput": "Виведений токен неможливо передати. Можливо, виникла проблема з вихідним маркером. Примітка: плата за передачу та перебазування токенів несумісна з Uniswap V3.", - "swap.estimatedDifference.label": "Між вашими вхідними та вихідними значеннями буде велика різниця через поточну ліквідність.", - "swap.expected.price": "Очікувана ціна", - "swap.fail.batched": "Ваш підключений гаманець може не підтримувати обмін в один клік. Спробуйте натомість стандартний обмін.", - "swap.fail.batched.retry": "Спробуйте стандартну заміну", - "swap.fail.batched.title": "Не вдалося замінити одним клацанням", - "swap.fail.message": "Спробуйте налаштувати ковзання до більшого значення.", - "swap.fail.uniswapX": "Не вдалося завершити обмін за допомогою UniswapX. Спробуйте обміняти ще раз, щоб направити його через класичний API Uniswap.", - "swap.fees.experience": "Ця комісія застосовується до деяких пар токенів, щоб забезпечити найкращий досвід роботи з Uniswap. Він оплачується вихідним токеном і вже врахований у котируванні.", - "swap.fees.jupiter.label": "Плата за Юпітер", - "swap.fees.jupiter.message": "Комісії за Solana стягуються через API Jupiter. Uniswap Labs не отримує цих комісій.", - "swap.fees.noFee": "Комісії застосовуються до обраних пар токенів, щоб забезпечити найкращий досвід роботи з Uniswap. За цей обмін не стягується комісія.", - "swap.finalizingQuote": "Завершення цитати...", - "swap.form.header": "Обмін", - "swap.form.warning.output.fotFees": "Через символічну комісію {{fotCurrencySymbol}}суми обміну можна вводити лише за допомогою поля введення", - "swap.form.warning.output.fotFees.fallback": "Через символічні комісії суми обміну можна вводити лише за допомогою поля введення", - "swap.form.warning.output.solana": "Точний вивід не підтримується на Solana", - "swap.form.warning.restore": "Відновіть свій гаманець для обміну", - "swap.frontrun.warning": "Ваша трансакція може бути першою та призвести до несприятливої торгівлі.", - "swap.header.viewOnly": "Лише перегляд", - "swap.impactOfTrade": "Вплив вашої торгівлі на ринкову ціну цього пулу.", - "swap.impactOfTrade.uniswapx": "Різниця між ринковою ціною та ціною виконання з урахуванням економії газу UniswapX.", - "swap.impactOfTrade.uniswapx.missing": "Розрахунок впливу на ціну може бути недоступним для пар із низькою ліквідністю.", - "swap.inputEstimated.atMost": "Вхід оцінюється. Ви продасте щонайбільше або транзакцію буде скасовано.", - "swap.limit": "Ліміт", - "swap.limitFilled": "Ліміт заповнено!", - "swap.limitSubmitted": "Ліміт подано", - "swap.marketPrice.outsideRange.label": "Ринкова ціна виходить за межі вказаного вами цінового діапазону. Депозит лише для одного активу.", - "swap.min.price": "Мінімальна ціна", - "swap.networkCost.paidIn": "Вартість мережі сплачується {{sym}} у мережі {{chainName}} для здійснення транзакцій.", - "swap.orderRouting": "Маршрутизація замовлень", - "swap.outputEstimated.atLeast": "Вихід оцінюється. Ви отримаєте принаймні або транзакцію буде скасовано.", - "swap.placeOrder": "Зробити замовлення", - "swap.priceImpact": "Вплив ціни", - "swap.request.title.full": "Поміняти місцями {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "Обміняти токени", - "swap.review": "Огляд обміну", - "swap.review.summary": "Ви міняєтеся", - "swap.reviewLimit": "Ліміт огляду", - "swap.route.optimizedGasCost": "Цей маршрут враховує розділені маршрути, кілька переходів і мережеві витрати на кожному кроці.", - "swap.routing.jupiter.description": "Jupiter збирає ліквідність з кількох джерел, щоб запропонувати вам найкращі ціни.", - "swap.routing.uniswapAutoRouter.description": "Автоматичний маршрутизатор Uniswap враховує оптимальні маршрути та витрати мережі, щоб запропонувати вам найкращі ціни.", - "swap.settings.deadline.tooltip": "Ваша трансакція буде скасована, якщо вона очікує на розгляд більше цього періоду часу. (Максимум: 3 дні).", - "swap.settings.deadline.warning": "Високий термін", - "swap.settings.oneClickSwap.title": "Обміни одним кліком", - "swap.settings.oneClickSwap.tooltip": "Об'єднує стандартні торговельні дії для швидших та дешевших обмінів.", - "swap.settings.protection.description": "Якщо захист від обміну ввімкнено, ваші транзакції Ethereum будуть захищені від сендвіч-атак із меншими ймовірністю збою.", - "swap.settings.protection.subtitle.supported": "{{chainName}} Мережа", - "swap.settings.protection.subtitle.unavailable": "Недоступно на {{chainName}}", - "swap.settings.protection.title": "Захист від обміну", - "swap.settings.routingPreference.option.default.description": "Вибір цього параметра визначає найефективніший маршрут для вашого обміну.", - "swap.settings.routingPreference.option.default.description.preV4": "Клієнт Uniswap вибирає найдешевший варіант торгівлі з урахуванням ціни та вартості мережі.", - "swap.settings.routingPreference.option.default.description.uniswapXUnavailable": "UniswapX недоступний для вашого гаманця", - "swap.settings.routingPreference.option.default.tooltip": "Маршрут визначається з урахуванням версії 2, версії 3 і деяких пулів версії 4, враховуючи прогнозований вплив на ціну та вартість мережі.", - "swap.settings.routingPreference.option.v2.title": "Увімкнути пули версії 2", - "swap.settings.routingPreference.option.v3.title": "Увімкнути пули версії 3", - "swap.settings.routingPreference.option.v4.hooks.title": "Увімкнути пули перехоплювачів v4", - "swap.settings.routingPreference.option.v4.hooks.tooltip": "Гачки V4 маршрутизують свопи через набір попередньо схвалених гачків.", - "swap.settings.routingPreference.option.v4.title": "Увімкнути пули версії 4", - "swap.settings.routingPreference.title": "Варіанти торгівлі", - "swap.settings.slippage.alert": "Високе ковзання", - "swap.settings.slippage.control.auto": "Авто", - "swap.settings.slippage.description": "Ваша трансакція буде скасована, якщо ціна зміниться більше, ніж відсоток ковзання.", - "swap.settings.slippage.input.message": "Якщо ціна знизиться далі, вашу транзакцію буде скасовано. Нижче наведено мінімальну суму, яку ви гарантовано отримаєте.", - "swap.settings.slippage.input.receive.title": "Отримайте хоча б", - "swap.settings.slippage.output.message": "Якщо ціна знизиться далі, вашу транзакцію буде скасовано. Нижче наведено максимальну суму, яку вам потрібно буде витратити.", - "swap.settings.slippage.output.spend.title": "Витрати максимум", - "swap.settings.slippage.warning": "Дуже високе ковзання", - "swap.settings.slippage.warning.description": "Пробуксовування вище 20%, ймовірно, призведе до несприятливої торгівлі. Щоб зменшити ризик бути лідером, зменште налаштування.", - "swap.settings.slippage.warning.hover": "Це може призвести до несприятливої торгівлі. Спробуйте зменшити налаштування ковзання.", - "swap.settings.slippage.warning.max": "Введіть значення менше {{maxSlippageTolerance}}", - "swap.settings.slippage.warning.message": "Ковзання може бути вищим, ніж необхідно", - "swap.settings.slippage.warning.min": "Введіть значення більше 0", - "swap.settings.title": "Поміняти налаштування", - "swap.settings.transactionRevertPrice": "Ваша трансакція буде скасована, якщо ціна зміниться несприятливо більш ніж на цей відсоток.", - "swap.signAndSwap": "Підписати і поміняти місцями", - "swap.slippage.amt": "{{amt}} прослизання", - "swap.slippage.bridging": "Відсутність прослизання під час перемикання між мережами", - "swap.slippage.description": "Різниця між очікуваною та виконаною ціною свопу. Різниці можуть виникати через низьку ліквідність, волатильність ринку або ботів. \n\nЗахист Uniswap захищає від ботів-випереджаючих операцій та MEV.", - "swap.slippage.settings.title": "Налаштування ковзання", - "swap.slippage.tooltip": "Максимальний рух ціни до повернення вашої транзакції.", - "swap.slippageBelow.warning": "Зниження нижче {{amt}} може призвести до невдалої транзакції", - "swap.submitted": "Обмін подано", - "swap.success": "Обмін успіхів!", - "swap.tokenOwnFees": "Деякі токени беруть комісію під час їх купівлі або продажу, яка встановлюється емітентом токенів. Uniswap не отримує жодної з цих комісій.", - "swap.tradeRoutes": "Торгові шляхи", - "swap.transaction.deadline": "Кінцевий термін транзакції", - "swap.transaction.revertAfter": "Ваша трансакція буде скасована, якщо вона очікує на розгляд більше цього періоду часу.", - "swap.warning.enterLargerAmount.title": "Введіть більшу суму", - "swap.warning.expectedFailure.increaseSlippage": "Спробуйте збільшити ковзання.", - "swap.warning.expectedFailure.titleMay": "Цей обмін може не вдатися", - "swap.warning.insufficientBalance.title": "Вам не вистачає {{currencySymbol}}", - "swap.warning.insufficientGas.button": "Недостатньо {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "Поміняти {{ tokenSymbol }} на {{networkName}}", - "swap.warning.insufficientGas.button.buy": "Придбати {{ tokenSymbol }}", - "swap.warning.insufficientGas.button.buyWithCard": "Купуйте на картку", - "swap.warning.insufficientGas.message.withNetwork": "Недостатньо {{currencySymbol}} на {{networkName}} для заміни", - "swap.warning.insufficientGas.message.withoutNetwork": "Недостатньо {{currencySymbol}} для обміну", - "swap.warning.insufficientGas.title": "У вас недостатньо {{currencySymbol}} , щоб покрити витрати на мережу", - "swap.warning.networkFee.allow": "Дозволити {{ inputTokenSymbol }} (один раз)", - "swap.warning.networkFee.delegation.message": "Це вартість обробки вашої транзакції та активації вашого смарт-гаманця на Unichain. Uniswap Labs не отримує жодної частки цих комісій.", - "swap.warning.networkFee.highRelativeToValue": "Вартість мережі перевищує 10% від загальної вартості транзакції. Це вартість обробки вашої транзакції в блокчейні. Uniswap не отримує жодної частки цих зборів.", - "swap.warning.networkFee.highRelativeToValue.unichain": "Вартість мережі перевищує 10% від загальної вартості транзакції. Це вартість обробки вашої транзакції в блокчейні.", - "swap.warning.networkFee.includesDelegation": "Включає активацію смарт-гаманця", - "swap.warning.networkFee.message": "Це вартість обробки вашої транзакції в блокчейні. Uniswap не отримує жодної частки цих зборів.", - "swap.warning.networkFee.message.unichain": "Це вартість обробки вашої транзакції в блокчейні.", - "swap.warning.networkFee.message.uniswapX": "Це вартість обробки вашої транзакції в блокчейні. Uniswap не отримує жодної частки цих зборів. UniswapX об’єднує джерела ліквідності для кращих цін і свопів без газу.", - "swap.warning.networkFee.message.uniswapX.title": "Без витрат на мережу з UniswapX", - "swap.warning.networkFee.message.uniswapX.unichain": "Це вартість обробки вашої транзакції в блокчейні. UniswapX об’єднує джерела ліквідності для кращих цін і свопів без газу.", - "swap.warning.noQuotesFound.bridging.message": "Перехідних лапок не знайдено. У цей час спробуйте використовувати офіційний міст.", - "swap.warning.noQuotesFound.title": "Цитати не знайдено", - "swap.warning.noRoutesFound.message": "Наразі немає доступних маршрутів для вибраних токенів. Спробуйте іншу пару або перевірте пізніше.", - "swap.warning.noRoutesFound.title": "Немає доступних маршрутів", - "swap.warning.offline.message": "Можливо, ви втратили з’єднання з Інтернетом або мережа не працює. Перевірте підключення до Інтернету та повторіть спробу.", - "swap.warning.offline.title": "Ви офлайн", - "swap.warning.priceImpact.message": "Через обсяг {{outputCurrencySymbol}} ліквідності, який зараз доступний, чим більше {{inputCurrencySymbol}} ви спробуєте обміняти, тим менше {{outputCurrencySymbol}} ви отримаєте.", - "swap.warning.priceImpact.message.veryHigh": "Ця транзакція призведе до {{priceImpactValue}} впливу ціни на ринкову ціну цього пулу та призведе до втрати коштів.", - "swap.warning.priceImpact.title": "Високий вплив на ціну ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "Дуже високий вплив на ціну ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "Вашу трансакцію не надіслано, оскільки ви закрили програму.", - "swap.warning.queuedOrder.approvalFailed": "Вашу транзакцію не надіслано, оскільки не вдалося схвалити маркер.", - "swap.warning.queuedOrder.stale": "Вашу трансакцію не було надіслано, оскільки ви закрили програму або затвердження тривало занадто довго.", - "swap.warning.queuedOrder.submissionFailed": "Під час надсилання транзакції виникла проблема.", - "swap.warning.queuedOrder.title": "Обмін скасовано", - "swap.warning.rateLimit.message": "Повторіть спробу через кілька хвилин.", - "swap.warning.rateLimit.title": "Ліміт швидкості перевищено", - "swap.warning.router.message": "Можливо, ви втратили з’єднання або мережа не працює. Якщо проблема не зникає, спробуйте пізніше.", - "swap.warning.router.title": "Цю торгівлю зараз неможливо завершити", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} заблоковано", - "swap.warning.tokenBlockedFallback.button": "Токен заблоковано", - "swap.warning.uniswapFee.message": "Застосовуються комісії для забезпечення найкращого досвіду роботи з Uniswap.", - "swap.warning.uniswapFee.message.default": "Комісія стягується, щоб забезпечити найкращий досвід використання Uniswap. За цей обмін не стягується комісія.", - "swap.warning.uniswapFee.message.included": "Комісії застосовуються для забезпечення найкращого досвіду використання Uniswap і вже враховані в цій пропозиції.", - "swap.warning.uniswapFee.title": "Комісія за обмін", - "swap.warning.viewOnly.message": "Вам потрібно імпортувати цей гаманець за допомогою фрази відновлення, щоб поміняти токени.", - "swap.wrap.token": "Оберніть {{sym}}", - "tdp.balanceSummary.otherNetworks": "В інших мережах", - "tdp.balanceSummary.otherNetworksBalance": "Баланс в інших мережах", - "tdp.balanceSummary.title": "Ваш баланс", - "tdp.button.getToken": "Отримайте {{ tokenSymbol }}", - "tdp.button.getTokenFallback": "Отримати жетон", - "tdp.loading.title.default": "дані маркерів для ", - "tdp.loading.title.withChain": "дані маркерів для на {{chainName}}", - "tdp.nameNotFound": "Ім'я не знайдено", - "tdp.noInfoAvailable": "Інформація про маркери недоступна", - "tdp.noTestnetSupportDescription": "Деякі тестові мережі не підтримують обмін, надсилання або купівлю токенів.", - "tdp.symbolNotFound": "Символ не знайдено", - "testnet.modal.swapDeepLink.description.toProdMode": "Для цієї дії потрібно вимкнути режим тестової мережі. Режим тестової мережі можна будь-коли повторно ввімкнути в налаштуваннях.", - "testnet.modal.swapDeepLink.description.toTestnetMode": "Для цієї дії потрібно ввімкнути режим тестової мережі. Токени в тестових мережах не мають реальної цінності. Режим тестової мережі можна будь-коли вимкнути в налаштуваннях.", - "testnet.modal.swapDeepLink.title.toProdMode": "Вимкніть режим testnet", - "testnet.modal.swapDeepLink.title.toTestnetMode": "Увімкніть режим тестової мережі", - "testnet.unsupported": "Ця функція не підтримується в режимі тестової мережі.", - "themeToggle.theme": "Тема", - "title.buySellTradeEthereum": "Купуйте, продавайте та торгуйте Ethereum та іншими найкращими токенами на Uniswap", - "title.createGovernanceOn": "Створіть нову пропозицію щодо управління на Uniswap", - "title.createGovernanceTo": "Створіть нову пропозицію щодо управління, за яку будуть голосувати власники UNI. Токени UNI представляють акції з правом голосу в управлінні Uniswap.", - "title.earnFees": "Заробляйте комісію, коли інші обмінюються на Uniswap, додаючи токени до пулів ліквідності.", - "title.easilyRemove": "Легко видаліть свою ліквідність із Uniswap v2 і внесіть на Uniswap v3.", - "title.easilyRemoveV4": "Легко видаліть свою ліквідність із Uniswap v2 і v3, щоб внести кошти в Uniswap v4.", - "title.extension.uninstall": "Розширення видалено", - "title.extensionPasskeyLogIn": "Увійти за допомогою пароля", - "title.managePasskeys": "Uniswap | Керуйте своїми паролями", - "title.migratev2": "Перенесіть ліквідність пулу v2 на Uniswap v3", - "title.migratev3": "Перенесіть ліквідність пулу на Uniswap v4", - "title.placeLimit": "Розміщуйте лімітовані замовлення на Uniswap", - "title.realTime": "Ціни в реальному часі, графіки, дані про транзакції тощо.", - "title.removeLiquidityv2": "Видалити ліквідність пулу (v2) на Uniswap", - "title.removePoolLiquidity": "Видалити ліквідність пулу на Uniswap", - "title.removeTokensv2": "Вилучіть свої токени з пулів ліквідності v2.", - "title.removev3Liquidity": "Вилучіть свої токени з пулів ліквідності v3.", - "title.sendCrypto": "Надіслати криптовалюту", - "title.sendTokens": "Надсилайте токени на Uniswap", - "title.swappingMadeSimple": "Миттєво купуйте та продавайте криптовалюту на Ethereum, Base, Arbitrum, Polygon, Unichain та інших платформах. DeFi-платформа, якій довіряють мільйони.", - "title.tradeTokens": "Торгуйте токенами та забезпечуйте ліквідність. Ціни в реальному часі, графіки, дані про транзакції тощо.", - "title.uniswapTradeCrypto": "Uniswap | Торгуйте криптовалютою на провідній біржі DeFi ", - "title.uniToken": "Токени UNI представляють акції з правом голосу в управлінні Uniswap. Ви можете голосувати за кожну пропозицію самостійно або передати свої голоси третій стороні.", - "title.voteOnGov": "Голосуйте за пропозиції щодо управління на Uniswap", - "token.balances.main": "Ваш баланс", - "token.balances.other": "Залишки в інших мережах", - "token.balances.viewOnly": "{{ownerAddress}}балансу", - "token.bridge": "{{label}} маркерний міст", - "token.chart.candlestick.unavailable": "Свічкові діаграми недоступні для цього токена", - "token.chart.tooltip": "Комісії: {{amount}}", - "token.details": "Деталі жетона", - "token.error.unknown": "Невідомий маркер", - "token.fee.buy.label": "плата за покупку", - "token.fee.label": "гонорар", - "token.fee.sell.label": "плата за продаж", - "token.links.title": "Посилання", - "token.links.twitter": "Twitter", - "token.links.website": "Веб-сайт", - "token.notFound.description": "На жаль, ми не можемо знайти жодної інформації для цього маркера. Перевірте ім’я та адресу та повторіть спробу.", - "token.notFound.title": "Маркер не знайдено", - "token.priceExplorer.error.description": "Щось пішло не так.", - "token.priceExplorer.error.title": "Не вдалося завантажити графік цін", - "token.priceExplorer.timeRangeLabel.all": "Весь час", - "token.priceExplorer.timeRangeLabel.day": "1D", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 день", - "token.priceExplorer.timeRangeLabel.hour": "1H", - "token.priceExplorer.timeRangeLabel.month": "1М", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 місяць", - "token.priceExplorer.timeRangeLabel.week": "1 Вт", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 тиждень", - "token.priceExplorer.timeRangeLabel.year": "1 рік", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 рік", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} недоступний", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} і {{tokenSymbol1}} недоступні", - "token.safety.fee.detected": "Виявлено плату за токен", - "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs не отримує жодної з цих комісій.", - "token.safety.warning.alwaysDoYourResearch": "Завжди проводите дослідження", - "token.safety.warning.blocked.description.default_one": "Ви не можете торгувати цим токеном за допомогою програми Uniswap.", - "token.safety.warning.blocked.description.default_other": "Ви не можете торгувати цими токенами за допомогою програми Uniswap.", - "token.safety.warning.copyContractAddress.message": "Це адреса контракту, яка діє як унікальний ідентифікатор для токенів у блокчейні. Усі криптовалюти, які ви надішлете на цю адресу, буде втрачено.", - "token.safety.warning.copyContractAddress.title": "Не надсилайте криптовалюту на цю адресу", - "token.safety.warning.dontShowWarningAgain": "Більше не показувати це попередження", - "token.safety.warning.dontShowWarningAgainShort": "Більше не показувати", - "token.safety.warning.doYourOwnResearch": "Завжди проводите власне дослідження, перш ніж продовжити.", - "token.safety.warning.feeDescription": "Заряджає , коли {{action}}", - "token.safety.warning.flaggedAsMalicious": "Позначено як шкідливий", - "token.safety.warning.flaggedAsSuspicious": "Позначено як підозрілий", - "token.safety.warning.fotHigh.title": "Виявлено високу комісію", - "token.safety.warning.fotLow.title": "Виявлено плату", - "token.safety.warning.fotVeryHigh.title": "Виявлено дуже високу комісію", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} позначено як непридатний для продажу. Обмін цього токена може призвести до втрати ваших коштів.", - "token.safety.warning.honeypot.title": "Виявлено 100% комісію за продаж", - "token.safety.warning.impersonator": "Видає себе за інший маркер", - "token.safety.warning.impersonator.title": "Виявлено маркер імітатора", - "token.safety.warning.malicious.general.message": "Blockaid позначив {{tokenSymbol}} як шкідливий.", - "token.safety.warning.malicious.impersonator.message": "{{tokenSymbol}} було позначено Blockaid за спробу скопіювати інший маркер. Можливо, це не той маркер, який ви хочете обміняти.", - "token.safety.warning.malicious.impersonator.message.short": "{{tokenSymbol}} може бути не тим токеном, який ви хочете обміняти.", - "token.safety.warning.malicious.title": "Виявлено шкідливий маркер", - "token.safety.warning.mayResultInLoss": "Його заміна може призвести до втрати коштів.", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} не торгується на провідних централізованих біржах США.", - "token.safety.warning.notListedOnExchanges": "Не котирується на провідних біржах США", - "token.safety.warning.potentialHoneypot.card.message": "Blockaid позначив {{tokenSymbol}} як підозрілий.", - "token.safety.warning.potentialHoneypot.modal.message": "Blockaid позначив {{tokenSymbol}} як потенційну приманку. Завжди проводите власне дослідження, перш ніж продовжити.", - "token.safety.warning.potentialHoneypot.title": "Виявлено потенційну приманку", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} позначено як непридатний для продажу.", - "token.safety.warning.sellFee100.title": "Виявлено 100% комісію за продаж", - "token.safety.warning.spam.message": "Blockaid позначив {{tokenSymbol}} як спам.", - "token.safety.warning.spam.title": "Виявлено маркер спаму", - "token.safety.warning.spamsUsers": "Спам користувачів", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} стягує комісію {{buyFeePercent}} за купівлю та {{sellFeePercent}} за продаж.", - "token.safety.warning.tokenChargesFee.buy.message": "При покупці {{tokenSymbol}} стягує комісію {{feePercent}} .", - "token.safety.warning.tokenChargesFee.buy.message.descriptive": "{{tokenSymbol}} стягує комісію у розмірі {{feePercent}} під час покупки. Обмін може призвести до втрати коштів. Uniswap Labs не отримує жодної з цих комісій.", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} стягує комісію {{feePercent}} під час продажу.", - "token.safety.warning.tokenChargesFee.sell.message.descriptive": "{{tokenSymbol}} стягує комісію у розмірі {{feePercent}} під час продажу. Обмін може призвести до втрати коштів. Uniswap Labs не отримує жодної з цих комісій.", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} стягує комісію під час купівлі чи продажу.", - "token.safetyLevel.blocked.message": "Ви не можете торгувати цим токеном за допомогою гаманця Uniswap.", - "token.safetyLevel.medium.message.plural": "Ці токени не торгуються на провідних централізованих біржах США. Завжди проводите власне дослідження, перш ніж продовжити.", - "token.selector.search.error": "Не вдалося завантажити результати пошуку", - "token.stats.fullyDilutedValuation": "Повністю розведена оцінка", - "token.stats.marketCap": "Ринкова капіталізація", - "token.stats.priceHighYear": "Висока 52 Вт", - "token.stats.priceLowYear": "52 Вт Низька", - "token.stats.section.about": "Про {{token}}", - "token.stats.title": "статистика", - "token.stats.translation.original": "Показати оригінал", - "token.stats.translation.translate": "Перекласти на {{language}}", - "token.stats.volume": "24-годинний обсяг", - "token.symbol.input.fallback": "Вхідний маркер", - "token.symbol.output.fallback": "Вихідний маркер", - "token.wrap.fail.message": "Свопи на протоколі Uniswap можуть починатися і закінчуватися ETH. Однак під час свопу ETH загортається в WETH.", - "token.zeroNativeBalance.description.mainnet": "Щоб отримати {{ tokenSymbol }}, вам потрібно буде обміняти токен на Ethereum. Для обміну потрібен ETH для витрат на мережу.", - "token.zeroNativeBalance.description.otherChains": "Вам потрібно буде поміняти маркер на {{ chainName }} , щоб отримати {{ tokenSymbol }}. Заміна вимагає {{ chainName }} {{ nativeTokenSymbol }} для витрат на мережу.", - "token.zeroNativeBalance.subtitle": "{{ tokenSymbol }} недоступний для прямої покупки.", - "token.zeroNativeBalance.title.mainnet": "Вам потрібно {{ nativeTokenName }}", - "token.zeroNativeBalance.title.otherChains": "Вам потрібно {{ nativeTokenName }} на {{ chainName }}", - "tokens.action.hide": "Сховати маркер", - "tokens.action.unhide": "Показати маркер", - "tokens.nfts.action.viewOnExplorer": "Переглянути на {{blockExplorerName}}", - "tokens.nfts.collection.error.load.title": "Не вдалося завантажити колекцію NFT", - "tokens.nfts.collection.label.items": "Предмети", - "tokens.nfts.collection.label.owners": "Власники", - "tokens.nfts.collection.label.priceFloor": "Поверх", - "tokens.nfts.collection.label.swapVolume": "Обсяг", - "tokens.nfts.connectEthereumToView": "Підключіть гаманець Ethereum, щоб переглядати свої NFT", - "tokens.nfts.details.contract.address": "Адреса договору", - "tokens.nfts.details.error.load.title": "Не вдалося завантажити деталі NFT", - "tokens.nfts.details.network": "Мережа", - "tokens.nfts.details.owner": "Належить", - "tokens.nfts.details.price": "Поточна ціна", - "tokens.nfts.details.recentPrice": "Ціна останнього продажу", - "tokens.nfts.details.traits": "Риси", - "tokens.nfts.empty.description": "NFT не знайдено", - "tokens.nfts.error.unavailable": "Вміст недоступний", - "tokens.nfts.hidden.action.hide": "Сховати NFT", - "tokens.nfts.hidden.action.unhide": "Показати NFT", - "tokens.nfts.link.collection": "Сайт колекції", - "tokens.nfts.list.error.load.title": "Не вдалося завантажити NFT", - "tokens.nfts.list.none.button": "Отримуйте NFT", - "tokens.nfts.list.none.description.default": "Щоб почати, перенесіть NFT з іншого гаманця.", - "tokens.nfts.list.none.description.external": "Коли цей гаманець купує або отримує NFT, вони з’являться тут.", - "tokens.nfts.list.none.title": "NFT ще немає", - "tokens.nfts.notAvailableOnSolana": "NFT недоступні на Solana", - "tokens.selector.button.choose": "Виберіть маркер", - "tokens.selector.empty.buy.message": "Купуйте криптовалюту за допомогою картки або банку, щоб надсилати токени.", - "tokens.selector.empty.buy.title": "Купуйте криптовалюту", - "tokens.selector.empty.receive.title": "Отримувати жетони", - "tokens.selector.empty.title": "Жетонів ще немає", - "tokens.selector.error.load": "Не вдалося завантажити маркери", - "tokens.selector.search.empty": "Немає результатів для {{searchText}}", - "tokens.selector.search.placeholder": "Пошук токенів", - "tokens.selector.section.bridging": "Перемикатися між мережами", - "tokens.selector.section.favorite": "Вибране", - "tokens.selector.section.otherNetworksSearchResults": "Токени, знайдені в інших мережах", - "tokens.selector.section.otherSearchResults": "Інші токени на {{network}}", - "tokens.selector.section.recent": "Останні пошуки", - "tokens.selector.section.search": "Результати пошуку", - "tokens.selector.section.trending": "Токени за обсягом 24 години", - "tokens.selector.section.yours": "Ваші жетони", - "tokens.table.search.placeholder.pools": "Пошукові пули", - "tokens.table.search.placeholder.tokens": "Пошук токенів", - "tokens.table.search.placeholder.transactions": "Пошук транзакцій", - "toucan.auction.bidConcentration": "Концентрація туканів", - "toucan.auction.bidConcentration.tooltip.description": "Опис підказки про тукана", - "toucan.auction.bidConcentration.tooltip.title": "Заголовок підказки \"Тукан\"", - "toucan.auctions": "Аукціони", - "toucan.bidForm.maxBudget": "Максимальний бюджет", - "toucan.bidForm.placeBid": "Зробіть свою ставку", - "toucan.displayMode.tokenPrice": "Ціна токена", - "toucan.displayMode.valuation": "Оцінка", - "transaction.action.cancel.button": "Скасувати транзакцію", - "transaction.action.cancel.description": "Якщо ви скасуєте цю трансакцію до того, як її обробить мережа, ви сплатите нову мережеву вартість замість початкової.", - "transaction.action.cancel.title": "Скасувати цю операцію?", - "transaction.action.clear": "Очистити очікує", - "transaction.action.copy": "Копіювати ідентифікатор транзакції", - "transaction.action.copyProvider": "Скопіюйте {{providerName}} ідентифікатор транзакції", - "transaction.amount.unlimited": "Необмежений", - "transaction.callData": "Дані про виклик", - "transaction.details.dappName": "додаток", - "transaction.details.from": "Від", - "transaction.details.networkFee": "Вартість мережі", - "transaction.details.networkFee.swap": "Вартість мережі обміну", - "transaction.details.providerFee": "Комісія провайдера", - "transaction.details.swapRate": "Оцінка", - "transaction.details.transaction": "Транзакція", - "transaction.details.uniswapFee": "Комісія ({{ feePercent }}%)", - "transaction.network.all": "Всі мережі", - "transaction.networkCost.description": "Вартість обробки вашої транзакції в блокчейні. Uniswap оптимізовано для мінімальних мережевих витрат.", - "transaction.networkCost.includesSmartWalletActivation": "Включає активацію смарт-гаманця", - "transaction.networkCost.label": "Вартість мережі", - "transaction.networkCost.maxNativeBalance.description": "Невелика сума балансу мережевого токена зарезервована для покриття витрат мережі на цю транзакцію.", - "transaction.networkCost.maxNativeBalance.title": "Чому я не можу використати свій максимальний баланс?", - "transaction.networkCost.veryHigh.label": "Дуже висока вартість мережі", - "transaction.notification.error.cancel": "Не вдалося скасувати трансакцію", - "transaction.notification.error.replace": "Не вдалося замінити транзакцію", - "transaction.status.approval.canceled": "Схвалення скасовано", - "transaction.status.approval.failed": "Помилка схвалення", - "transaction.status.approve.canceled": "Скасовано затвердження", - "transaction.status.approve.canceling": "Скасування схвалення", - "transaction.status.approve.failed": "Не вдалося схвалити", - "transaction.status.approve.pending": "Схвалення", - "transaction.status.approve.success": "Затверджено", - "transaction.status.approve.successDapp": "Схвалено {{externalDappName}}", - "transaction.status.buy.canceled": "Скасована покупка", - "transaction.status.buy.canceling": "Скасування покупки", - "transaction.status.buy.failed": "Не вдалося купити", - "transaction.status.buy.pending": "Купівля", - "transaction.status.buy.success": "Купив", - "transaction.status.buy.successDapp": "Куплено {{externalDappName}}", - "transaction.status.claim.canceled": "Збір зборів скасовано", - "transaction.status.claim.canceling": "Скасування стягнення плати", - "transaction.status.claim.failed": "Не вдалося зібрати плату", - "transaction.status.claim.pending": "Збір зборів", - "transaction.status.claim.success": "Стягнуті збори", - "transaction.status.collect.fees.canceled": "Збір комісій скасовано", - "transaction.status.collect.fees.failed": "Помилка збору", - "transaction.status.collected.fees": "Зібрані збори", - "transaction.status.collecting.fees": "Збір зборів", - "transaction.status.confirm.canceled": "Скасовано підтвердження", - "transaction.status.confirm.canceling": "Очікує скасування", - "transaction.status.confirm.failed": "Не вдалося підтвердити", - "transaction.status.confirm.pending": "Транзакція виконується", - "transaction.status.confirm.success": "Трансакцію підтверджено", - "transaction.status.confirm.successDapp": "Трансакцію підтверджено {{externalDappName}}", - "transaction.status.createPair.canceled": "Скасовано створення пари", - "transaction.status.createPair.canceling": "Скасування створення пари", - "transaction.status.createPair.failed": "Не вдалося створити пару", - "transaction.status.createPair.pending": "Створення пари", - "transaction.status.createPair.success": "Створено пару", - "transaction.status.createPool.canceled": "Скасовано створення пулу", - "transaction.status.createPool.canceling": "Скасування створення пулу", - "transaction.status.createPool.failed": "Не вдалося створити пул", - "transaction.status.createPool.pending": "Створення пулу", - "transaction.status.createPool.success": "Створений пул", - "transaction.status.liquidityDecrease.canceled": "Видалення ліквідності скасовано", - "transaction.status.liquidityDecrease.canceling": "Скасування видалення ліквідності", - "transaction.status.liquidityDecrease.failed": "Не вдалося видалити ліквідність", - "transaction.status.liquidityDecrease.pending": "Зняття ліквідності", - "transaction.status.liquidityDecrease.success": "Вилучена ліквідність", - "transaction.status.liquidityIncrease.canceled": "Додавання ліквідності скасовано", - "transaction.status.liquidityIncrease.canceling": "Скасування додавання ліквідності", - "transaction.status.liquidityIncrease.failed": "Не вдалося додати ліквідність", - "transaction.status.liquidityIncrease.pending": "Додавання ліквідності", - "transaction.status.liquidityIncrease.success": "Додана ліквідність", - "transaction.status.lpIncentivesClaim.canceled": "Скасовано заявку на винагороду LP", - "transaction.status.lpIncentivesClaim.canceling": "Скасування заявки на винагороду LP", - "transaction.status.lpIncentivesClaim.failed": "Не вдалося отримати винагороди LP", - "transaction.status.lpIncentivesClaim.pending": "Отримання винагород LP", - "transaction.status.lpIncentivesClaim.success": "Отримані винагороди LP", - "transaction.status.migrateLiquidity.canceled": "Міграцію ліквідності скасовано", - "transaction.status.mint.canceled": "Скасований монетний двір", - "transaction.status.mint.canceling": "Скасування монетного двору", - "transaction.status.mint.failed": "Не вдалося карбувати", - "transaction.status.mint.pending": "Карбування", - "transaction.status.mint.success": "Карбувати", - "transaction.status.mint.successDapp": "Дата карбування {{externalDappName}}", - "transaction.status.offramp.canceled": "З'їзд скасовано", - "transaction.status.offramp.failed": "З'їзд не вдався", - "transaction.status.offramp.pending": "З'їзд з рампи", - "transaction.status.offramp.success": "З'їзд з рампи", - "transaction.status.onramp.canceled": "В'їзд скасовано", - "transaction.status.onramp.failed": "Не вдалося піднятися на рампу", - "transaction.status.onramp.pending": "Набираючи обертів", - "transaction.status.onramp.success": "З рампи", - "transaction.status.permit.approved": "Дозвіл схвалено", - "transaction.status.permit.canceled": "Дозвіл на передачу скасовано", - "transaction.status.permit.failed": "Дозвіл не отримано", - "transaction.status.purchase.canceled": "Скасована покупка", - "transaction.status.purchase.canceling": "Скасування покупки", - "transaction.status.purchase.failed": "Покупка не вдалася", - "transaction.status.purchase.failedOn": "Не вдалося купити {{serviceProvider}}", - "transaction.status.purchase.pending": "Закупівля", - "transaction.status.purchase.pendingOn": "Купівля {{serviceProvider}}", - "transaction.status.purchase.successOn": "Придбано {{serviceProvider}}", - "transaction.status.receive.canceled": "Отримання скасовано", - "transaction.status.receive.canceling": "Скасування отримання", - "transaction.status.receive.failed": "Не вдалося отримати", - "transaction.status.receive.failedFrom": "Не вдалося отримати від {{serviceProvider}}", - "transaction.status.receive.pending": "Отримання", - "transaction.status.receive.pendingFrom": "Отримання від {{serviceProvider}}", - "transaction.status.receive.success": "Отримано", - "transaction.status.receive.successDapp": "Отримано {{externalDappName}}", - "transaction.status.receive.successFrom": "Отримано від {{serviceProvider}}", - "transaction.status.removeDelegation.canceled": "Видалення делегування скасовано", - "transaction.status.removeDelegation.failed": "Не вдалося видалити делегування", - "transaction.status.removeDelegation.pending": "Видалення делегування", - "transaction.status.removeDelegation.success": "Делегування скасовано", - "transaction.status.revoke.canceled": "Відкликання скасовано", - "transaction.status.revoke.canceling": "Скасування відкликання", - "transaction.status.revoke.failed": "Не вдалося відкликати", - "transaction.status.revoke.pending": "Відкликання", - "transaction.status.revoke.success": "Відкликано", - "transaction.status.revoke.successDapp": "Відкликано {{externalDappName}}", - "transaction.status.sale.canceled": "Скасовано продаж", - "transaction.status.sale.canceling": "Скасування продажу", - "transaction.status.sale.failedOn": "Помилка продажу через {{serviceProvider}}", - "transaction.status.sale.pendingCard.msg": "Дізнайтеся більше про продаж криптовалюти.", - "transaction.status.sale.pendingCard.title": "Чому мій продаж все ще очікує на розгляд?", - "transaction.status.sale.pendingOn": "Продаж через {{serviceProvider}}", - "transaction.status.sale.successOn": "Продається через {{serviceProvider}}", - "transaction.status.sell.canceled": "Скасовано продаж", - "transaction.status.sell.canceling": "Скасування продажу", - "transaction.status.sell.failed": "Не вдалося продати", - "transaction.status.sell.pending": "продаж", - "transaction.status.sell.success": "Продано", - "transaction.status.sell.successDapp": "Продано {{externalDappName}}", - "transaction.status.send.canceled": "Надсилання скасовано", - "transaction.status.send.canceling": "Скасування надсилання", - "transaction.status.send.failed": "Не вдалося надіслати", - "transaction.status.send.pending": "Відправка", - "transaction.status.send.success": "Надісланий", - "transaction.status.send.successDapp": "Надіслано {{externalDappName}}", - "transaction.status.swap.canceled": "Обмін скасовано", - "transaction.status.swap.canceling": "Скасування обміну", - "transaction.status.swap.expired": "Термін обміну минув", - "transaction.status.swap.failed": "Не вдалося поміняти", - "transaction.status.swap.insufficientFunds": "Недостатньо коштів", - "transaction.status.swap.pending": "Обмін", - "transaction.status.swap.success": "Поміняно місцями", - "transaction.status.swap.successDapp": "Поміняно на {{externalDappName}}", - "transaction.status.unwrap.canceled": "Розгортання скасовано", - "transaction.status.unwrap.canceling": "Скасування розгортання", - "transaction.status.unwrap.failed": "Не вдалося розгорнути", - "transaction.status.unwrap.pending": "Розгортання", - "transaction.status.unwrap.success": "Розгорнутий", - "transaction.status.unwrap.successDapp": "Розгорнуто {{externalDappName}}", - "transaction.status.wrap.canceled": "Скасовано обгортання", - "transaction.status.wrap.canceling": "Скасування обгортання", - "transaction.status.wrap.failed": "Не вдалося обернути", - "transaction.status.wrap.pending": "обгортання", - "transaction.status.wrap.success": "Загорнутий", - "transaction.status.wrap.successDapp": "Загорнуто на {{externalDappName}}", - "transaction.submittedOn": "Подано на", - "transaction.summary.liquidity": "{{firstAmountWithSymbol}} та {{secondAmountWithSymbol}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} до {{recipientAddress}}", - "transaction.summary.received.noAmount": "Отримано від {{name}}", - "transaction.summary.sent": "{{tokenAmountWithSymbol}} з {{senderAddress}}", - "transaction.summary.sent.noAmount": "Надіслано до {{name}}", - "transaction.warning.insufficientGas.modal.message": "Вам потрібно ~{{tokenAmount}} {{tokenSymbol}} () на {{networkName}} , щоб покрити мережеву вартість цієї транзакції. Щоб продовжити, обміняйте {{tokenSymbol}} в іншій мережі або купіть за допомогою своєї картки.", - "transaction.warning.insufficientGas.modal.message.noAction": "Вам потрібно ~{{tokenAmount}} {{tokenSymbol}} () на {{networkName}} , щоб покрити мережеву вартість цієї транзакції.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount": "Вам потрібно ~{{tokenAmount}} {{tokenSymbol}} () на {{networkName}} , щоб покрити мережеву вартість цієї транзакції.", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount.noAction": "Щоб обміняти цей маркер, вам потрібно більше {{tokenSymbol}} на {{networkName}}.", - "transaction.warning.insufficientGas.modal.title.withNetwork": "Недостатньо {{tokenSymbol}} на {{networkName}}", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "Недостатньо {{tokenSymbol}}", - "transaction.warning.maxNative.message": "Ви збираєтеся витратити більшу частину свого мережевого балансу токенів. Це може залишити недостатньо коштів для покриття майбутніх мережевих витрат.", - "transaction.warning.maxNative.title": "Низький баланс токенів мережі", - "transaction.watcher.error.cancel": "Не вдалося скасувати трансакцію", - "transaction.watcher.error.status": "Помилка під час перевірки статусу трансакції", - "uniswapX.aggregatesLiquidity": " об’єднує джерела ліквідності для кращих цін і свопів без газу.", - "uniswapX.cost": "UniswapX усуває типові витрати на транзакції в блокчейні.", - "uniswapx.description": "UniswapX об’єднує джерела ліквідності для кращих цін і свопів без газу.", - "uniswapx.description.unsupported": "UniswapX наразі недоступний, оскільки налаштуваннями вашого смарт-гаманця керує інший додаток-гаманець.", - "uniswapx.included": "Включає UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "Дізнайтеся більше про обмін за допомогою UniswapX", - "uniswapx.unavailable.title": "UniswapX недоступний", - "uniswapx.v2QuoteFailed": "Помилка твердої цитати UniswapX v2. Повторіть спробу з класичним свопом.", - "unitags.banner.button.claim": "Вимагайте зараз", - "unitags.banner.subtitle": "Створіть персоналізований профіль web3 і легко діліться своєю адресою з друзями.", - "unitags.banner.title.compact": "Отримайте своє {{unitagDomain}} ім’я користувача та створіть свій настроюваний профіль.", - "unitags.banner.title.full": "Отримайте ім'я користувача {{unitagDomain}}", - "unitags.choosePhoto.option.cameraRoll": "Виберіть із фотоплівки", - "unitags.choosePhoto.option.computer": "Завантажити з комп'ютера", - "unitags.choosePhoto.option.nft": "Виберіть NFT", - "unitags.choosePhoto.option.remove": "Видалити зображення профілю", - "unitags.claim.available": "в наявності", - "unitags.claim.confirmation.customize": "Налаштувати профіль", - "unitags.claim.confirmation.description": "{{unitagAddress}} готовий надсилати та отримувати крипто. Продовжуйте розвивати свій гаманець, налаштувавши свій профіль web3.", - "unitags.claim.confirmation.success.long": "Ти зрозумів!", - "unitags.claim.confirmation.success.short": "зрозумів!", - "unitags.claim.error.addressLimit": "Ви вже внесли максимальну кількість змін у своє ім’я користувача для цієї адреси", - "unitags.claim.error.avatar": "Не вдалося встановити аватар. Спробуйте ще раз пізніше.", - "unitags.claim.error.default": "Не вдалося отримати ім'я користувача. Спробуйте ще раз пізніше.", - "unitags.claim.error.deviceLimit": "Ви досягли максимальної кількості імен користувачів, які можуть бути активними для цього пристрою", - "unitags.claim.error.general": "Не вдалося отримати ім'я користувача", - "unitags.claim.error.unavailable": "Це ім'я користувача недоступне", - "unitags.claim.error.unknown": "Невідома помилка", - "unitags.claim.username.default": "ваше ім'я", - "unitags.delete.confirm.subtitle": "Ви збираєтеся видалити своє ім’я користувача та настроювані дані профілю. Ви не зможете повернути його.", - "unitags.delete.confirm.title": "Ти впевнений?", - "unitags.editProfile.placeholder": "ім'я користувача", - "unitags.editUsername.confirm.subtitle": "Ви збираєтеся змінити своє ім'я користувача. Змінивши його, ви більше ніколи не зможете вимагати його.", - "unitags.editUsername.confirm.title": "Ти впевнений?", - "unitags.editUsername.title": "Відредагуйте своє ім'я користувача", - "unitags.editUsername.warning.default": "Змінивши своє ім’я користувача, ви більше ніколи не зможете претендувати на нього. Ви можете змінити його лише 2 рази.", - "unitags.editUsername.warning.max": "Ви досягли максимальної кількості 2 змін імен користувачів.", - "unitags.extension.intro.buttton": "Вимагайте ім'я користувача", - "unitags.extension.intro.description": "Попрощайтесь з 0x адресою. Ім'я користувача - це розбірливі імена, що полегшують надсилання та отримання крипто.", - "unitags.extension.intro.title": "Знайомство з іменами користувачів", - "unitags.extension.intro.upsell.customizable": "Настроювані профілі", - "unitags.extension.intro.upsell.ens": "На основі субдоменів ENS", - "unitags.extension.intro.upsell.free": "Вимагати безкоштовно", - "unitags.intro.features.ens": "На основі субдоменів ENS", - "unitags.intro.features.free": "Вимагати безкоштовно", - "unitags.intro.features.profile": "Настроювані профілі", - "unitags.intro.subtitle": "Попрощайтесь з 0x адресою. Ім'я користувача - це розбірливі імена, що полегшують надсилання та отримання крипто.", - "unitags.intro.title": "Знайомство з іменами користувачів", - "unitags.notification.delete.error": "Не вдалося видалити ім'я користувача. Спробуйте ще раз пізніше.", - "unitags.notification.delete.title": "Ім'я користувача видалено", - "unitags.notification.profile.error": "Не вдалося оновити профіль. Спробуйте ще раз пізніше.", - "unitags.notification.profile.title": "Профіль оновлено", - "unitags.notification.username.error": "Не вдалося змінити ім'я користувача. Спробуйте ще раз пізніше.", - "unitags.notification.username.title": "Ім'я користувача змінено", - "unitags.onboarding.claim.subtitle": "Це ваша персональна адреса, на яку люди можуть надсилати криптовалюту.", - "unitags.onboarding.claim.title.choose": "Створіть своє ім'я користувача", - "unitags.onboarding.claim.title.claim": "Вимагайте своє ім'я користувача", - "unitags.onboarding.info.description": "Імена користувачів перетворюють складні 0x адреси у розбірливі імена. Звертаючись до імені користувача {{unitagDomain}} , ви можете легко надсилати та отримувати крипто та створювати публічний профіль web3.", - "unitags.onboarding.info.title": "Спрощена адреса", - "unitags.onboarding.profile.subtitle": "Завантажте свій власний або додайте свій унікальний Unicon. Ви завжди можете змінити це пізніше.", - "unitags.onboarding.profile.title": "Виберіть фотографію профілю", - "unitags.profile.action.delete": "Видалити ім'я користувача", - "unitags.profile.action.edit": "Редагувати ім'я користувача", - "unitags.profile.bio.label": "біографія", - "unitags.profile.bio.placeholder": "Введіть біографію для свого профілю", - "unitags.profile.links.twitter": "Twitter", - "unitags.username.error.chars": "Імена користувачів можуть містити лише літери та цифри", - "unitags.username.error.max": "Імена користувачів не можуть містити більше {{number}} символів", - "unitags.username.error.min": "Імена користувачів мають містити принаймні {{number}} символів", - "unitags.username.error.uppercase": "Імена користувачів можуть містити лише малі літери та цифри", - "uwulink.error.insufficientTokens": "Недостатньо {{tokenSymbol}} на {{chain}}", - "v2.notAvailable": "Uniswap V2 недоступний у цій мережі.", - "wallet.appSignIn": "Увійдіть за допомогою програми", - "wallet.connectingAgreement": "Підключаючи гаманець, ви погоджуєтеся з Умовами обслуговування Uniswap Labs і погоджуєтеся з її Політикою конфіденційності.", - "wallet.connectionFailed.message": "Спроба підключення не вдалася. Будь ласка, спробуйте ще раз, виконавши кроки для підключення у вашому гаманці.", - "wallet.mismatch.popup.description": "Деякі функції не підтримуються вашим підключеним гаманцем.", - "wallet.mismatch.popup.title": "Обмежена підтримка гаманців", - "wallet.other": "Інші гаманці", - "wallet.scanToConnect": "Щоб підключитися, відскануйте QR-код", - "wallet.wrongNet": "Ваш гаманець підключено до неправильної мережі.", - "walletConnect.dapps.empty.description": "Підключіться до програми, відсканувавши код через WalletConnect", - "walletConnect.dapps.manage.empty.title": "Немає підключених програм", - "walletConnect.dapps.manage.title": "Зв'язки", - "walletConnect.error.connection.message": "Наразі гаманець Uniswap підтримує {{chainNames}}. У цих ланцюжках використовуйте лише \"{{dappName}}\"", - "walletConnect.error.connection.title": "Помилка з'єднання", - "walletConnect.error.general.message": "Виникла проблема з WalletConnect. Будь ласка спробуйте ще раз", - "walletConnect.error.general.title": "Помилка WalletConnect", - "walletConnect.error.scantastic.message": "Виникла проблема з вашим QR-кодом. Будь ласка спробуйте ще раз", - "walletConnect.error.scantastic.title": "Недійсний QR-код", - "walletConnect.error.unsupported.message": "Перш ніж повторити спробу, переконайтеся, що ви скануєте дійсну адресу WalletConnect, Ethereum або QR-код розширення Uniswap.", - "walletConnect.error.unsupported.title": "Недійсний QR-код", - "walletConnect.error.unsupportedV1.message": "WalletConnect v1 більше не підтримується. Програму, до якої ви намагаєтеся підключитися, потрібно оновити до WalletConnect v2.", - "walletConnect.error.unsupportedV1.title": "Недійсний QR-код", - "walletConnect.error.uwu.scan": "Під час сканування цього QR-коду виникла проблема.", - "walletConnect.error.uwu.title": "Помилка посилання UwU", - "walletConnect.error.uwu.unsupported": "Цей QR-код не підтримується.", - "walletConnect.pending.button.connect": "Підключитися", - "walletConnect.pending.button.reject": "Відхилити", - "walletConnect.pending.button.scrollDown": "Прокрутіть вниз, щоб підключитися", - "walletConnect.pending.threat.confirmationText": "Я розумію ризики", - "walletConnect.pending.threat.description": "Підписання повідомлень або транзакцій з цієї програми може призвести до втрати коштів.", - "walletConnect.pending.threat.title": "Виявлено шкідливий додаток", - "walletConnect.pending.title": "Підключіться до {{dappName}}", - "walletConnect.pending.unverified.description": "Перш ніж продовжити, переконайтеся, що ви довіряєте цьому сайту. ", - "walletConnect.pending.unverified.title": "Неперевірений додаток", - "walletConnect.permissions.option.requestApprovals": "Запит на схвалення транзакцій", - "walletConnect.permissions.option.transferAssets": "Move funds without permission", - "walletConnect.permissions.option.viewTokenBalances": "View your balance and activity", - "walletConnect.permissions.title": "App permissions", - "walletConnect.request.bundledTransactions.label_one": "Одна пакетна транзакція", - "walletConnect.request.bundledTransactions.label_other": "{{count}} пакетні транзакції", - "walletConnect.request.button.scrollDown": "Прокрутіть вниз, щоб підписати", - "walletConnect.request.button.sign": "Знак", - "walletConnect.request.details.label.function": "функція", - "walletConnect.request.details.label.sending": "Відправка", - "walletConnect.request.details.label.token": "Токен", - "walletConnect.request.details.label.tokens": "Жетони", - "walletConnect.request.error.insufficientFunds": "У вас недостатньо {{currencySymbol}} , щоб завершити цю трансакцію.", - "walletConnect.request.error.network": "Помилка підключення до Інтернету або мережі", - "walletConnect.request.warning.batch.message": "Будьте обережні: цей запит містить кілька транзакцій і може передати активи", - "walletConnect.request.warning.general.message": "Будьте обережні: це повідомлення може передати активи", - "walletConnect.request.warning.message": "Щоб підписувати повідомлення або транзакції, вам потрібно буде імпортувати фразу відновлення гаманця.", - "walletConnect.request.warning.title": "Цей гаманець знаходиться в режимі лише перегляду", - "web.explore.description": "Знаходьте та досліджуйте токени на {{network}}. Дослідіть найкращі басейни. Переглядайте ціни в реальному часі, обсяг торгів, TVL, діаграми та дані про транзакції.", - "web.explore.title.pools": "Досліджуйте найпопулярніші пули на {{network}} на Uniswap", - "web.explore.title.tokens": "Перегляньте найпопулярніші токени на {{network}} на Uniswap", - "web.explore.title.transactions": "Перегляньте найпопулярніші транзакції на {{network}} на Uniswap" -} diff --git a/packages/uniswap/src/i18n/locales/translations/ur-PK.json b/packages/uniswap/src/i18n/locales/translations/ur-PK.json deleted file mode 100644 index 184ada9065d..00000000000 --- a/packages/uniswap/src/i18n/locales/translations/ur-PK.json +++ /dev/null @@ -1,2563 +0,0 @@ -{ - "account.authHeader.claimReward": "{{amount}} انعام کا دعوی کریں۔", - "account.cloud.backup.subtitle": "آپ کے {{cloudProviderName}}میں بیک اپ کے متعدد ریکوری جملے ہیں۔", - "account.cloud.backup.title": "بحال کرنے کے لیے بیک اپ منتخب کریں۔", - "account.cloud.button.restore.android": "گوگل ڈرائیو سے بحال کریں۔", - "account.cloud.button.restore.ios": "iCloud سے بحال کریں۔", - "account.cloud.empty.description": "ایسا لگتا ہے کہ آپ نے {{cloudProviderName}}میں اپنے کسی بھی بازیابی کے جملے کا بیک اپ نہیں لیا ہے۔", - "account.cloud.empty.title": "0 بیک اپ ملے", - "account.cloud.error.backup.message": "اجازتوں کی کمی، اجازت میں رکاوٹ، یا بادل کی خرابی کی وجہ سے بیک اپ درآمد کرنے میں ناکام", - "account.cloud.error.backup.title": "بیک اپ درآمد کرتے وقت خرابی۔", - "account.cloud.error.password.title": "غلط پاسورڈ. دوبارہ کوشش کریں.", - "account.cloud.error.unavailable.button.cancel": "ابھی نہیں", - "account.cloud.error.unavailable.button.settings": "ترتیبات پر جائیں۔", - "account.cloud.error.unavailable.message.android": "براہ کرم توثیق کریں کہ آپ اس ڈیوائس پر Google Drive کے فعال کردہ Google اکاؤنٹ میں لاگ ان ہیں اور دوبارہ کوشش کریں۔", - "account.cloud.error.unavailable.message.ios": "براہ کرم تصدیق کریں کہ آپ ایپل آئی ڈی میں لاگ ان ہیں جس میں اس ڈیوائس پر iCloud Drive فعال ہے اور دوبارہ کوشش کریں۔", - "account.cloud.error.unavailable.title.android": "Google Drive دستیاب نہیں ہے۔", - "account.cloud.error.unavailable.title.ios": "iCloud Drive دستیاب نہیں ہے۔", - "account.cloud.loading.title": "بیک اپس تلاش کر رہا ہے...", - "account.cloud.lockout.time.hours_one": "بہت زیادہ کوششیں 1 گھنٹے میں دوبارہ کوشش کریں۔", - "account.cloud.lockout.time.hours_other": "بہت زیادہ کوششیں {{count}} گھنٹے میں دوبارہ کوشش کریں۔", - "account.cloud.lockout.time.minutes_one": "بہت زیادہ کوششیں 1 منٹ میں دوبارہ کوشش کریں۔", - "account.cloud.lockout.time.minutes_other": "بہت زیادہ کوششیں {{count}} منٹ میں دوبارہ کوشش کریں۔", - "account.cloud.password.input": "پاس ورڈ درج کریں", - "account.cloud.password.recoveryPhrase": "اس کے بجائے اپنا بازیابی کا جملہ درج کریں۔", - "account.cloud.password.subtitle": "یہ پاس ورڈ {{cloudProviderName}}سے آپ کی بازیابی کے جملے کا بیک اپ بازیافت کرنے کے لیے درکار ہے۔", - "account.cloud.password.title": "بیک اپ پاس ورڈ درج کریں۔", - "account.downloadWallet.subtitle": "اپنے بٹوے کا بیک اپ لیں، چلتے پھرتے تجارت کریں، لائیو قیمت کے الرٹس حاصل کریں، اور مزید بہت کچھ۔", - "account.drawer.gitHash": "گٹ ہیش: ", - "account.drawer.gitVersion": "ورژن: ", - "account.drawer.modal.body": "Uniswap ایپ کے ساتھ ٹوکنز کو محفوظ طریقے سے اسٹور اور تبدیل کریں۔ iOS اور Android پر دستیاب ہے۔", - "account.drawer.modal.dont": "کیا آپ کے پاس یونیسیاپ والیٹ نہیں ہے؟", - "account.drawer.modal.scan": "Unswap Wallet کے ساتھ اسکین کریں۔", - "account.drawer.spamToggle": "نامعلوم ٹوکنز اور NFTs چھپائیں۔", - "account.passkey.delete.acknowledge": "میں نے اپنے بازیابی کے جملے کا بیک اپ لیا ہے اور یہ سمجھتا ہوں کہ اگر میں ایسا کرنے میں ناکام ہو گیا ہوں تو Uniswap Labs مجھے اپنے بٹوے کی بازیابی میں مدد نہیں کر سکتی۔", - "account.passkey.delete.description": "یقینی بنائیں کہ آپ نے Uniswap موبائل ایپ یا براؤزر ایکسٹینشن کا استعمال کرتے ہوئے اپنے بازیابی کے جملے کا بیک اپ لیا ہے۔", - "account.passkey.delete.descriptionEmphasized": "آپ کی بازیابی کے فقرے کے بغیر، آپ اپنے بٹوے تک رسائی حاصل کرنے سے قاصر ہو سکتے ہیں۔", - "account.passkey.delete.speedbump.description": "جاری رکھنے سے پہلے، اپنے بٹوے اور تمام فنڈز تک رسائی سے محروم ہونے سے بچنے کے لیے درج ذیل اقدامات کو مکمل کریں۔", - "account.passkey.delete.speedbump.step1": "Unswap موبائل ایپ یا براؤزر ایکسٹینشن ڈاؤن لوڈ کریں۔", - "account.passkey.delete.speedbump.step2": "اپنے بازیابی کے جملے کا بیک اپ لیں۔", - "account.passkey.delete.speedbump.title": "کیا تمہیں یقین ہے؟", - "account.passkey.delete.title": "پاس کلید کو حذف کریں؟", - "account.passkey.log.in.title": "پاس کی کے ساتھ لاگ ان کریں۔", - "account.passkey.type.crossplatform": "فون، ٹیبلیٹ یا سیکیورٹی کلید", - "account.passkey.type.platform": "براؤزر یا آپریٹنگ سسٹم", - "account.passkey.verify.button": "پاسکی سے تصدیق کریں۔", - "account.passkey.verify.description": "اس سے پہلے کہ آپ جاری رکھیں، براہ کرم اپنی شناخت کی تصدیق کے لیے اپنی پاس کی کا استعمال کریں۔ یہ آپ کے اکاؤنٹ کو محفوظ رکھنے میں مدد کرتا ہے۔", - "account.passkey.verify.title": "پہلے، آئیے تصدیق کریں کہ یہ آپ ہی ہیں۔", - "account.portfolio.activity.canceledBelow": "یہ آرڈر منسوخ کر دیا گیا کیونکہ آپ کا بیلنس ان پٹ رقم سے کم ہو گیا تھا۔", - "account.portfolio.activity.signLimit": "یہ آرڈر نہیں بھرے گا کیونکہ آپ کا بیلنس ان پٹ کی رقم سے کم ہے۔ ٹھیک کرنے کے لیے اپنا بیلنس بڑھائیں۔", - "account.recoveryPhrase.education.part1": "بازیافت کا جملہ (یا بیج کا جملہ) الفاظ کا مجموعہ ہے آپ کے بٹوے تک رسائی کے لیے درکار ہے، جیسے پاس ورڈ۔", - "account.recoveryPhrase.education.part2": "آپ اپنے بٹوے
اور اس کے مواد کو بحال کرنے کے لیے ایک نئے آلے پر اپنا بازیابی کا جملہ درج کر سکتے ہیں۔", - "account.recoveryPhrase.education.part3": "لیکن، اگر آپ اپنا بازیابی کا جملہ کھو دیتے ہیں، تو آپ اپنے بٹوے تک رسائی سے محروم ہو جائیں گے۔", - "account.recoveryPhrase.education.part4": "اپنے بازیابی کے جملے کو یاد رکھنے کے بجائے، آپ اس کا بیک اپ {{cloudProviderName}} میں لے سکتے ہیں اور پاس ورڈ کے ساتھ اس کی حفاظت کر سکتے ہیں۔", - "account.recoveryPhrase.education.part5": "آپ اسے لکھ کر اور اسے محفوظ جگہ پر اسٹور کر کے بھی دستی طور پر بیک اپ لے سکتے ہیں۔", - "account.recoveryPhrase.education.part6": "ہم دونوں قسم کے بیک اپ استعمال کرنے کی تجویز کرتے ہیںکیونکہ اگر آپ اپنا بازیابی کا جملہ کھو دیتے ہیں، تو آپ اپنے بٹوے کو بحال نہیں کر پائیں گے۔", - "account.recoveryPhrase.error.invalid": "غلط جملہ", - "account.recoveryPhrase.error.invalidWord": "غلط لفظ: {{word}}", - "account.recoveryPhrase.error.phraseLength": "بازیافت کا جملہ 12-24 الفاظ کا ہونا چاہیے۔", - "account.recoveryPhrase.error.wordIsAddress": "آپ نے ایک پتہ درج کیا ہے، بازیابی کا جملہ نہیں۔", - "account.recoveryPhrase.error.wrong": "غلط بازیابی کا جملہ", - "account.recoveryPhrase.helpText.import": "میں اپنے بحالی کا جملہ کیسے تلاش کروں؟", - "account.recoveryPhrase.helpText.restoring": "دوبارہ تلاش کرنے کی کوشش کریں۔", - "account.recoveryPhrase.input": "اپنا بازیابی کا جملہ ٹائپ کریں۔", - "account.recoveryPhrase.remove.final.description": "یقینی بنائیں کہ آپ نے اپنا بازیابی کا جملہ لکھا ہے یا {{cloudProviderName}}پر اس کا بیک اپ لیا ہے۔ دوسری صورت میں آپ اپنے فنڈز تک رسائی حاصل نہیں کر سکیں گے۔", - "account.recoveryPhrase.remove.final.title": "آپ اپنا بازیابی کا جملہہٹا رہے ہیں", - "account.recoveryPhrase.remove.import.description": "آپ ایک وقت میں صرف ایک بازیابی کا جملہ ذخیرہ کر سکتے ہیں۔ ایک نیا درآمد کرنا جاری رکھنے کے لیے، آپ کو اس آلہ سے اپنے موجودہ بازیابی کے فقرے اور کسی بھی متعلقہ بٹوے کو ہٹانے کی ضرورت ہوگی۔", - "account.recoveryPhrase.remove.initial.description": "یہ آپ کے بازیابی کے جملے کے ساتھ اس آلہ سے آپ کے بٹوے کو ہٹا دے گا۔", - "account.recoveryPhrase.remove.initial.title": "آپ {{walletName}}کو ہٹا رہے ہیں", - "account.recoveryPhrase.remove.mnemonic.description": "آپ کا بازیابی کا جملہ اس وقت تک محفوظ رہے گا جب تک آپ باقی تمام بٹوے حذف نہیں کر دیتے۔", - "account.recoveryPhrase.subtitle.import": "آپ کی بازیابی کا جملہ صرف مقامی طور پر آپ کے آلے پر اسٹور کیا جائے گا۔", - "account.recoveryPhrase.subtitle.restoring": "نیچے اپنا بازیابی کا جملہ درج کریں، یا بیک اپس کو دوبارہ تلاش کرنے کی کوشش کریں۔", - "account.recoveryPhrase.title.import": "اپنی بازیابی کا جملہ درج کریں۔", - "account.recoveryPhrase.title.restoring": "کوئی بیک اپ نہیں ملا", - "account.wallet.action.copy": "ایڈریس کاپی کریں۔", - "account.wallet.action.manageConnections": "رابطوں کا نظم کریں۔", - "account.wallet.action.report": "پروفائل کی اطلاع دیں۔", - "account.wallet.action.viewExplorer": "{{blockExplorerName}}پر دیکھیں", - "account.wallet.button.add": "پرس شامل کریں۔", - "account.wallet.button.addViewOnly": "صرف دیکھنے کے لیے والیٹ شامل کریں۔", - "account.wallet.button.create": "ایک نیا پرس بنائیں", - "account.wallet.button.import": "ایک نیا پرس درآمد کریں۔", - "account.wallet.button.manage": "والیٹ کی ترتیبات", - "account.wallet.button.remove": "پرس کو ہٹا دیں۔", - "account.wallet.button.watch": "ایک پرس دیکھیں", - "account.wallet.create.placeholder": "والیٹ {{index}}", - "account.wallet.edit.label.input.placeholder": "بٹوے کا لیبل", - "account.wallet.header.button.disabled.title": "پروفائل میں ترمیم کریں", - "account.wallet.header.button.title": "لیبل میں ترمیم کریں۔", - "account.wallet.header.viewOnly": "صرف دیکھنے کے بٹوے", - "account.wallet.menu.claimUsername": "صارف نام کا دعوی کریں۔", - "account.wallet.menu.copy.title": "پرس کا پتہ کاپی کریں۔", - "account.wallet.menu.edit.title": "لیبل میں ترمیم کریں۔", - "account.wallet.menu.manageConnections": "رابطوں کا انتظام کریں۔", - "account.wallet.menu.remove.title": "پرس کو ہٹا دیں۔", - "account.wallet.remove.check": "میں نے اپنے بازیابی کے جملے کا بیک اپ لیا اور سمجھ گیا کہ اگر میں ایسا کرنے میں ناکام ہو گیا تو یونی سویپ لیبز میرے بٹوے کی بازیافت میں میری مدد نہیں کر سکتی۔", - "account.wallet.remove.title": "{{name}}کو ہٹا دیں۔", - "account.wallet.remove.viewOnly": "آپ ہمیشہ والیٹ کا پتہ درج کر کے صرف دیکھنے کے لیے بٹوے واپس شامل کر سکتے ہیں۔", - "account.wallet.restore.new_device.description": "چونکہ آپ ایک نئے آلے پر ہیں، آپ کو اپنا بازیابی کا جملہ بحال کرنا ہوگا یا جاری رکھنے کے لیے اپنا کلاؤڈ بیک اپ پاس ورڈ درج کرنا ہوگا۔", - "account.wallet.restore.new_device.title": "اپنا پرس بازیافت کریں۔", - "account.wallet.restore.seed_phrase.description": "آپ کی بازیابی کا جملہ آپ کے آلہ سے غائب ہے۔ اس بات کو یقینی بنانے کے لیے کہ آپ کبھی بھی اپنے فنڈز تک رسائی سے محروم نہیں ہوں گے، ہمیں آپ سے اپنا بٹوہ بحال کرنے کی ضرورت ہوگی۔", - "account.wallet.restore.seed_phrase.title": "اپنا بٹوہ بحال کریں۔", - "account.wallet.select.error": "پتے لوڈ نہیں ہو سکے۔", - "account.wallet.select.loading.subtitle": "آپ کے بٹوے نیچے ظاہر ہوں گے۔", - "account.wallet.select.loading.title": "بٹوے تلاش کر رہے ہیں۔", - "account.wallet.select.smartWalletDisclaimer": "پہلے سے طے شدہ طور پر، تمام اہل بٹوے درآمد ہونے کے بعد سمارٹ والیٹ کی خصوصیات استعمال کریں گے۔ سمارٹ پرس کیا ہے؟", - "account.wallet.select.title_one_one": "ایک پرس ملا", - "account.wallet.select.title_one_other": "درآمد کرنے کے لیے بٹوے منتخب کریں۔", - "account.wallet.viewOnly.button": "پرس درآمد کریں۔", - "account.wallet.viewOnly.description": "ٹوکنز کو تبدیل کرنے، خریدنے، بھیجنے اور وصول کرنے کے لیے، آپ کو اس والیٹ کی بازیابی کا جملہ درآمد کرنا ہوگا۔", - "account.wallet.viewOnly.title": "یہ پرس صرف دیکھنے کے لیے ہے۔", - "account.wallet.watch.error.alreadyImported": "یہ پتہ پہلے سے درآمد شدہ ہے۔", - "account.wallet.watch.error.notFound": "پتہ نہیں ملا", - "account.wallet.watch.error.smartContract": "پتہ ایک سمارٹ معاہدہ ہے۔", - "account.wallet.watch.message": "صرف دیکھنے کے لیے والیٹ شامل کرنا آپ کو ایپ آزمانے یا بٹوے کو ٹریک کرنے کی اجازت دیتا ہے۔ آپ فنڈز تبدیل یا بھیجنے کے قابل نہیں ہوں گے۔", - "account.wallet.watch.placeholder": "ENS یا پتہ", - "account.wallet.watch.title": "بٹوے کا پتہ درج کریں۔", - "activity.pending": "{{pendingActivityCount}} زیر التواء", - "activity.transaction.lpRewards.descriptor": "{{symbol}} انعامات جمع ہوئے۔", - "activity.transaction.send.descriptor": "{{amountWithSymbol}} سے {{walletAddress}}", - "activity.transaction.swap.descriptor": "{{amountWithSymbolB}}کے لیے {{amountWithSymbolA}}", - "activity.transaction.tokens.descriptor": "{{amountWithSymbolA}} اور {{amountWithSymbolB}}", - "addLiquidity.shareOfPool": "پول کا حصہ", - "addressInput.recipient": "وصول کنندہ", - "analytics.allow": "تجزیات کی اجازت دیں۔", - "analytics.allow.message": "ہم Unswap Labs مصنوعات کے ساتھ آپ کے تجربے کو بڑھانے کے لیے گمنام ڈیٹا استعمال کرتے ہیں۔", - "appRating.button.notReally": "واقعی نہیں۔", - "appRating.description": "ہمیں بتائیں کہ کیا آپ کو اس ایپ کے ساتھ اچھا تجربہ ہے۔", - "appRating.extension.review.description": "ایک ستارہ کی درجہ بندی منتخب کریں اور Chrome ویب اسٹور پر ایک جائزہ چھوڑیں۔", - "appRating.extension.review.title": "Unswap ایکسٹینشن کا جائزہ لیں؟", - "appRating.extension.title": "Uniswap ایکسٹینشن سے لطف اندوز ہو رہے ہیں؟", - "appRating.feedback.button.send": "رائے بھیجیں", - "appRating.feedback.description": "ہمیں بتائیں کہ ہم آپ کے تجربے کو کیسے بہتر بنا سکتے ہیں۔", - "appRating.feedback.title": "ہمیں یہ سن کر افسوس ہوا۔", - "appRating.mobile.title": "Unswap والیٹ سے لطف اندوز ہو رہے ہیں؟", - "bridgedAsset.modal.button": "تبادلہ کرنا جاری رکھیں", - "bridgedAsset.modal.description": "یہ {{currencySymbol}} کا {{chainName}} ورژن ہے جس کی حمایت حاصل ہے اور وہی قیمت برقرار رکھتی ہے جو مقامی {{currencySymbol}}ہے۔", - "bridgedAsset.modal.feature.securelyBacked": "محفوظ طریقے سے حمایت یافتہ", - "bridgedAsset.modal.feature.securelyBacked.description": "1:1 مقامی {{currencySymbol}}کے ذریعے حمایت یافتہ۔", - "bridgedAsset.modal.feature.tradeSeamlessly": "بغیر کسی رکاوٹ کے تجارت کریں۔", - "bridgedAsset.modal.feature.tradeSeamlessly.description": "Unswap چھوڑے بغیر {{currencySymbol}} خریدیں اور بیچیں۔", - "bridgedAsset.modal.feature.withdrawToNativeChain": "{{nativeChainName}}پر واپس جائیں۔", - "bridgedAsset.modal.feature.withdrawToNativeChain.description": "کسی بھی وقت مقامی نیٹ ورک پر واپس پل جائیں۔", - "bridgedAsset.modal.title": "{{chainName}}پر {{currencySymbol}} تجارت کریں۔", - "bridgedAsset.send.warning.description": "آپ {{chainName}}پر {{currencySymbol}} کا لپیٹے ہوئے ورژن بھیج رہے ہیں۔ اسے سنٹرلائزڈ ایکسچینج میں بھیجنے کے نتیجے میں فنڈز کا مستقل نقصان ہو گا۔", - "bridgedAsset.send.warning.title": "یقینی بنائیں کہ آپ مطابقت پذیر پتے پر بھیج رہے ہیں۔", - "bridgedAsset.tdp.description": "یہ {{currencySymbol}} کا ایک برجڈ ورژن ہے جسے 1:1 مقامی {{currencySymbol}}کی حمایت حاصل ہے۔", - "bridgedAsset.wormhole.button": "ورم ہول پر جاری رکھیں", - "bridgedAsset.wormhole.description": "اپنے {{currencySymbol}} کو {{chainName}} سے {{nativeChainName}}پر کرنے کے لیے ورم ہول پورٹل پر جاری رکھیں۔", - "bridgedAsset.wormhole.title": "{{currencySymbol}} کو {{nativeChainName}}سے واپس لیں۔", - "bridgedAsset.wormhole.toNativeChain": "{{nativeChainName}}تک", - "bridgedAsset.wormhole.withdrawToNativeChain": "{{nativeChainName}}پر واپس جائیں۔", - "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}منٹ {{seconds}}s", - "bridging.estimatedTime.minutesOnly": "~{{minutes}}منٹ", - "bridging.estimatedTime.secondsOnly": "{{seconds}}s", - "chart.candlestick": "موم بتی", - "chart.error.pools": "موجودہ پول کے لیے تاریخی ڈیٹا ڈسپلے کرنے سے قاصر ہے۔", - "chart.error.tokens": "موجودہ ٹوکن کے لیے تاریخی ڈیٹا ظاہر کرنے سے قاصر ہے۔", - "chart.line": "لائن چارٹ", - "chart.missingData": "چارٹ ڈیٹا غائب ہے۔", - "chart.price.label.close": "بند کریں", - "chart.price.label.high": "اعلی", - "chart.price.label.low": "کم", - "chart.price.label.open": "کھولیں۔", - "chart.settings.unavailable.label": "یہ ترتیب موجودہ چارٹ کے لیے دستیاب نہیں ہے۔", - "claim.thanks": "Unswap کمیونٹی کا حصہ بننے کا شکریہ ", - "claim.uni.arrived": "یو این آئی آچکی ہے۔", - "common.about": "کے بارے میں", - "common.accept": "قبول کریں۔", - "common.active": "فعال", - "common.activeNetworks": "فعال نیٹ ورکس", - "common.activity": "سرگرمی", - "common.add.label": "شامل کریں۔", - "common.add.liquidity.canceled": "لیکویڈیٹی شامل کریں منسوخ کر دی گئیں۔", - "common.addLiquidity": "لیکویڈیٹی شامل کریں۔", - "common.address": "پتہ", - "common.addressOrENS": "والیٹ کا پتہ یا ENS نام", - "common.advanced": "اعلی درجے کی", - "common.all": "تمام", - "common.allTime": "تمام وقت", - "common.and": "اور", - "common.app": "ایپ", - "common.approved": "منظورشدہ", - "common.approvePending": "ابھی منظور نہیں ہوا...", - "common.approvePermitTx": "درخواست منظور کریں {{indexText}}", - "common.approvePermitTx.active": "پرس میں درخواست{{indexText}} کو منظور کریں۔", - "common.approvePermitTx.explainer": "Permit2 کی منظوری کیا ہیں؟", - "common.approvePermitTx.pending": "درخواست کی منظوری {{indexText}}...", - "common.approveSpend": "{{symbol}} خرچ کی منظوری دیں۔", - "common.approving": "منظور کرنا", - "common.approximatelyValue": "{{value}}", - "common.areYouSure": "کیا تمہیں یقین ہے؟", - "common.automatic": "آٹو", - "common.availableIn": "ان کی تبدیلی دستیاب ہے اس میں: ", - "common.availableOnIOSAndroidChrome": "iOS، Android اور Chrome پر دستیاب ہے۔", - "common.backToPositions": "واپس عہدوں پر", - "common.bestRoute": "راستہ", - "common.bestRoute.with": "روٹ بذریعہ {{provider}}", - "common.biometrics.generic": "بایومیٹرکس", - "common.biometrics.touchId": "ٹچ آئی ڈی", - "common.biometrics.windowsHello": "ونڈوز ہیلو", - "common.blocked.ifError": "اگر آپ کو لگتا ہے کہ یہ ایک غلطی ہے، تو براہ کرم پر اپنے ایڈریس سمیت ایک ای میل بھیجیں۔", - "common.blocked.reason": "یہ پتہ Uniswap Labs انٹرفیس پر بلاک ہے کیونکہ یہ ایک یا زیادہ بلاک شدہ سرگرمیوں سے وابستہ ہے۔", - "common.blockedAddress": "بلاک شدہ پتہ", - "common.blog": "بلاگ", - "common.bought": "خریدا", - "common.brandAssets": "برانڈ اثاثے", - "common.button.accept": "قبول کریں۔", - "common.button.back": "پیچھے", - "common.button.buy": "خریدنے", - "common.button.cancel": "منسوخ کریں۔", - "common.button.checkin": "چیک ان", - "common.button.close": "بند کریں", - "common.button.confirm": "تصدیق کریں۔", - "common.button.connect": "جڑیں۔", - "common.button.continue": "جاری رہے", - "common.button.copied": "کاپی", - "common.button.copy": "کاپی", - "common.button.create": "بنانا", - "common.button.delete": "حذف کریں۔", - "common.button.disable": "غیر فعال کریں۔", - "common.button.disabling": "غیر فعال کرنا", - "common.button.disconnect": "منقطع کرنا", - "common.button.dismiss": "برطرف کرنا", - "common.button.done": "ہو گیا", - "common.button.edit": "ترمیم", - "common.button.enable": "فعال", - "common.button.finish": "ختم کرنا", - "common.button.goBack": "واپس جاو", - "common.button.later": "شاید بعد میں", - "common.button.learn": "اورجانیے", - "common.button.next": "اگلے", - "common.button.notNow": "ابھی نہیں", - "common.button.ok": "ٹھیک ہے", - "common.button.paste": "چسپاں کریں۔", - "common.button.pay": "ادا کریں۔", - "common.button.proceed": "آگے بڑھو", - "common.button.receive": "وصول کریں۔", - "common.button.remove": "دور", - "common.button.reset": "دوبارہ ترتیب دیں۔", - "common.button.retry": "دوبارہ کوشش کریں۔", - "common.button.reveal": "ظاہر کرنا", - "common.button.review": "جائزہ لیں", - "common.button.save": "محفوظ کریں۔", - "common.button.scrollDown": "نیچے سکرول کریں", - "common.button.sell": "بیچنا", - "common.button.send": "بھیجیں", - "common.button.setup": "سیٹ اپ", - "common.button.share": "بانٹیں", - "common.button.showLess": "کم دکھائیں۔", - "common.button.showMore": "مزید دکھائیں", - "common.button.sign": "دستخط", - "common.button.skip": "چھوڑ دو", - "common.button.swap": "تبادلہ", - "common.button.tryAgain": "دوبارہ کوشش کریں", - "common.button.understand": "میں سمجھتا ہوں۔", - "common.button.unlock": "غیر مقفل کریں۔", - "common.button.view": "دیکھیں", - "common.button.viewDetails": "تفصیلات دیکھیں", - "common.button.yes": "جی ہاں", - "common.buy.label": "خریدنے", - "common.buyAndSell": "Uniswap پر خریدیں اور فروخت کریں۔", - "common.cancellationSubmitted": "منسوخی جمع کرائی گئی۔", - "common.cancellationSuccessful": "منسوخی کامیاب", - "common.cancelOrder": "آرڈر منسوخ کر دیں", - "common.card.error.description": "کچھ غلط ہو گیا", - "common.card.error.title": "افوہ! کچھ غلط ہو گیا.", - "common.careers": "کیریئرز", - "common.chain.networkCost": "{{chain}} نیٹ ورک کی قیمت", - "common.chart": "چارٹ", - "common.checkNetwork": "نیٹ ورک کی حیثیت یہاں چیک کریں۔", - "common.chromeExtension": "توسیع", - "common.claim.failed": "دعویٰ ناکام ہو گیا۔", - "common.claimed": "دعویٰ کیا۔", - "common.claiming": "دعویٰ کرنا", - "common.claimUnis": "اپنے UNI ٹوکن کا دعوی کریں۔", - "common.clear": "صاف", - "common.close": "بند کریں", - "common.closed": "بند", - "common.collect.button": "جمع کرنا", - "common.company": "کمپنی", - "common.confirm": "تصدیق کریں۔", - "common.confirmCancellation": "منسوخی کی تصدیق کریں۔", - "common.confirmed": "تصدیق شدہ", - "common.confirmSend.button": "بھیجنے کی تصدیق کریں۔", - "common.confirmSwap": "بٹوے میں تبادلہ کی تصدیق کریں۔", - "common.confirmTimedOut": "تصدیق کا وقت ختم ہو گیا۔ براہ کرم دوبارہ کوشش کریں۔", - "common.confirmTransfer": "منتقلی کی تصدیق کریں۔", - "common.confirmWallet": "بٹوے میں تصدیق کریں۔", - "common.connect.button": "جڑیں۔", - "common.connectAWallet.button": "بٹوے کو جوڑیں۔", - "common.connectAWallet.button.evm": "Ethereum والیٹ کو جوڑیں۔", - "common.connectAWallet.button.evm.switch": "Ethereum والیٹ سوئچ کریں۔", - "common.connectAWallet.button.svm": "سولانا والیٹ کو جوڑیں۔", - "common.connectAWallet.button.svm.switch": "سولانا والیٹ سوئچ کریں۔", - "common.connectAWallet.button.switch": "پرس سوئچ کریں۔", - "common.connectTo": "{{platform}}سے جڑیں۔", - "common.connectWallet.button": "بٹوے کو جوڑیں۔", - "common.contactUs.button": "ہم سے رابطہ کریں۔", - "common.copied": "کاپی", - "common.copy.address": "ایڈریس کاپی کریں۔", - "common.copy.poolId": "پول آئی ڈی کاپی کریں۔", - "common.copyLink.button": "لنک کاپی کریں۔", - "common.created.date": "{{date}}بنایا گیا۔", - "common.currency": "کرنسی", - "common.currentPrice": "موجودہ قیمت", - "common.custom": "اپنی مرضی کے مطابق", - "common.customRange": "اپنی مرضی کی حد", - "common.dataOutdated": "ڈیٹا پرانا ہو سکتا ہے۔", - "common.day": "دن", - "common.default": "طے شدہ", - "common.defaultTradeOptions": "پہلے سے طے شدہ تجارتی اختیارات", - "common.deposit.toNetwork": "ٹوکنز {{label}} نیٹ ورک پر جمع کریں۔", - "common.depositing": "جمع کرنا", - "common.depositTokens": "ٹوکن جمع کروائیں۔", - "common.detected": "پتہ چلا", - "common.developers": "ڈویلپرز", - "common.device": "یہ ڈیوائس", - "common.device.other": "دوسرا آلہ", - "common.dismiss": "برطرف کرنا", - "common.docs": "دستاویزات", - "common.donate": "عطیہ کریں۔", - "common.done": "ہو گیا", - "common.dontShowAgain": "اسے دوبارہ مت دکھائیں۔", - "common.download": "ڈاؤن لوڈ کریں", - "common.downloadAppStore": "ایپ اسٹور میں ڈاؤن لوڈ کریں۔", - "common.downloadPlayStore": "پلے اسٹور میں ڈاؤن لوڈ کریں۔", - "common.downloadUniswapApp": "Uniswap ایپ ڈاؤن لوڈ کریں۔", - "common.downloadUniswapWallet": "Unswap Wallet ڈاؤن لوڈ کریں۔", - "common.dynamic": "متحرک", - "common.edit.button": "ترمیم", - "common.ended": "ختم ہوا۔", - "common.error.details": "خرابی کی تفصیلات", - "common.error.general": "کچھ غلط ہو گیا", - "common.error.label": "خرابی", - "common.error.request": "معذرت، آپ کی درخواست پر کارروائی کرتے وقت ایک خرابی پیش آگئی۔ اگر آپ تعاون کی درخواست کرتے ہیں، تو اس غلطی کی تفصیلات کو کاپی کرنا یقینی بنائیں۔", - "common.error.somethingWrong": "کچھ غلط ہو گیا!", - "common.errorConnecting.error": "رابطے میں خرابی", - "common.errorLoadingData.error": "ڈیٹا لوڈ کرنے میں خرابی۔", - "common.etherscan": "ایتھرسکین", - "common.expiry": "ختم", - "common.explore": "دریافت کریں۔", - "common.explorer": "ایکسپلورر", - "common.exploreTokens": "ٹوکن دریافت کریں۔", - "common.extension": "یونی اَیپ ایکسٹینشن", - "common.failedSwitchNetwork": "نیٹ ورکس کو سوئچ کرنے میں ناکام", - "common.fee": "فیس", - "common.fees": "فیس", - "common.feesEarned": "فیس کمائی", - "common.feesEarnedPerBase": "{{symbolA}} فی {{symbolB}}", - "common.for": "کے لیے", - "common.free": "مفت", - "common.fullRange": "مکمل رینج", - "common.getApp": "ایپ حاصل کریں۔", - "common.getHelp.button": "مدد حاصل کرو", - "common.getStarted": "شروع کرو", - "common.getSupport.button": "مدد حاصل کریں", - "common.getTheApp": "اپلی کیشن حاصل", - "common.getUniswapWallet": "Unswap والیٹ حاصل کریں۔", - "common.getUniswapWallet.mobile": "Unswap موبائل ایپ حاصل کریں۔", - "common.governance": "گورننس", - "common.happyHolidays": "Unswap ٹیم کی طرف سے تعطیلات مبارک ہو!", - "common.help": "مدد", - "common.helpCenter": "مدداور تعاون کا مرکز", - "common.hidden": "پوشیدہ", - "common.hide.button": "چھپائیں", - "common.highPrice": "اعلی قیمت", - "common.includes": "شامل", - "common.info.label": "معلومات", - "common.input.noRecipient.error": "وصول کنندہ کو منتخب کریں۔", - "common.input.password.confirm": "پاس ورڈ کی تصدیق کریں۔", - "common.input.password.error.mismatch": "پاس ورڈز مماثل نہیں ہیں۔", - "common.input.password.error.weak": "یہ پاس ورڈ بہت کمزور ہے۔", - "common.input.password.new": "نیا پاس ورڈ", - "common.input.password.placeholder": "پاس ورڈ", - "common.input.password.strength.medium": "درمیانہ", - "common.input.password.strength.strong": "مضبوط", - "common.input.password.strength.weak": "کمزور", - "common.input.search": "تلاش کریں۔", - "common.insufficient.funds": "ناکافی فنڈز", - "common.insufficientBalance.error": "ناکافی توازن", - "common.insufficientFundsForNetworkFee.error": "نیٹ ورک کی لاگت کو پورا کرنے کے لیے ناکافی فنڈز", - "common.insufficientTokenBalance.error": "ناکافی {{tokenSymbol}} بیلنس", - "common.insufficientTokenBalance.error.simple": "کافی نہیں {{tokenSymbol}}", - "common.invalidPair": "غلط جوڑا", - "common.invalidRecipient.error": "غلط وصول کنندہ", - "common.iOSAndroid": "iOS اور Android", - "common.language": "زبان", - "common.learnMoreSwap": "تبادلہ کے بارے میں مزید جانیں۔", - "common.legalAndPrivacy": "قانونی اور رازداری", - "common.less": "کم", - "common.limit.cancel_one": "حد منسوخ کریں۔", - "common.limit.cancel_other": "{{count}} حدود کو منسوخ کریں۔", - "common.limit.canceled": "حد منسوخ کر دی گئی۔", - "common.limit.executed": "حد لگائی گئی۔", - "common.limit.expired": "حد ختم ہو گئی۔", - "common.limit.failed": "حد ناکام ہوگئی", - "common.limit.opened": "حد کھل گئی۔", - "common.limit.pending": "زیر التواء حد", - "common.limits": "حدود", - "common.limits.approachMax": "100 کی زیادہ سے زیادہ حد کے قریب", - "common.limits.cancelProceed": "آگے بڑھنے کے لیے حدود کو منسوخ کریں۔", - "common.limits.expires": "میعاد ختم ہو جائے گی {{timestamp}}", - "common.limits.open": "کھلی حدود", - "common.limits.when": "جب {{price}} {{outSymbol}}/{{inSymbol}}", - "common.links": "لنکس", - "common.liquidity": "لیکویڈیٹی", - "common.liquidity.provision": "لیکویڈیٹی پروویژن", - "common.liquidity.removed": "لیکویڈیٹی ہٹا دی گئی۔", - "common.loading": "لوڈ ہو رہا ہے۔", - "common.longText.button.less": "کم پڑھیں", - "common.longText.button.more": "مزید پڑھ", - "common.lowPrice": "کم قیمت", - "common.manage": "انتظام کریں۔", - "common.market.label": "مارکیٹ", - "common.marketPrice": "مارکیٹ کی قیمت", - "common.marketPrice.fetching": "مارکیٹ کی قیمت حاصل کی جا رہی ہے...", - "common.marketPrice.label": "مارکیٹ کی قیمت:", - "common.marketPrice.unavailable": "بازار کی قیمت نہیں ملی۔ فنڈز کے نقصان سے بچنے کے لیے براہِ کرم خود تحقیق کریں۔", - "common.max": "زیادہ سے زیادہ", - "common.message": "پیغام", - "common.migrate": "ہجرت کرنا", - "common.migrate.liquidity.failed": "منتقلی لیکویڈیٹی ناکام ہوگئی", - "common.migrate.position": "ہجرت کی پوزیشن", - "common.migrated.liquidity": "منتقلی لیکویڈیٹی", - "common.migrating.liquidity": "منتقلی لیکویڈیٹی", - "common.min": "کم از کم", - "common.more": "مزید", - "common.moreDetails": "مزید تفصیلات", - "common.navigation.settings": "ترتیبات", - "common.navigation.systemSettings": "ترتیبات", - "common.navigationButton": "نیویگیشن بٹن", - "common.needHelp": "مدد چاہیے؟", - "common.networkCost": "نیٹ ورک کی قیمت", - "common.neverMind": "کوئی بات نہیں", - "common.new": "نیا", - "common.new.exclamation": "نیا!", - "common.nft": "این ایف ٹی", - "common.nfts": "NFTs", - "common.noAmount.error": "ایک رقم درج کریں۔", - "common.noData": "کوئی مواد نہیں", - "common.none": "کوئی نہیں۔", - "common.noResults": "کوئی نتیجہ نہیں.", - "common.notAvailableInRegion.error": "آپ کے علاقے میں دستیاب نہیں ہے۔", - "common.notCreated.label": "پیدا نہیں کیا گیا۔", - "common.notSupported": "تعاون یافتہ نہیں۔", - "common.oneDay": "1 دن", - "common.oneDay.short": "1D", - "common.oneHour.short": "1 ایچ", - "common.oneMonth": "1 مہینہ", - "common.oneWeek": "1 ہفتہ", - "common.oneYear": "1 سال", - "common.opensea.link": "OpenSea پر دیکھیں", - "common.orderCanceled": "آرڈر منسوخ کر دیا گیا۔", - "common.orderExecuted": "حکم پر عمل ہوا۔", - "common.orderExpired": "آرڈر کی میعاد ختم ہوگئی", - "common.orderPending": "آرڈر زیر التواء", - "common.outOfRange": "پہنچ سے دور", - "common.pageNotFound": "صفحہ نہیں ملا!", - "common.passkey.count": "پاسکی {{number}}", - "common.passkeys": "پاسکیز", - "common.passkeys.add": "ایک پاسکی شامل کریں۔", - "common.passkeys.add.description": "منتخب کریں کہ اپنی نئی پاسکی کو کہاں محفوظ کرنا ہے۔", - "common.pastDay": "گزشتہ دن", - "common.pastFiveMinutes": "پچھلے پانچ منٹ", - "common.pastHour": "گزشتہ گھنٹے", - "common.pastMonth": "پچھلے مہینے", - "common.pastWeek": "گزشتہ ہفتہ", - "common.pastYear": "پچھلے سال", - "common.pending": "زیر التواء", - "common.pending.cancellation": "زیر التواء منسوخی", - "common.pendingEllipsis": "زیر التواء...", - "common.permit": "اجازت", - "common.plusMore": "+{{number}} مزید", - "common.pool": "پول", - "common.pools": "تالاب", - "common.portfolio": "پورٹ فولیو", - "common.poweredBy": "کے ذریعے تقویت یافتہ", - "common.price": "قیمت", - "common.priceUpdated": "قیمت اپ ڈیٹ کر دی گئی۔", - "common.privacyChoices": "آپ کی رازداری کے انتخاب", - "common.privacyChoices.checkbox.description": "چیک کیے جانے پر، ہم آپ کے ڈیٹا کو ذاتی نوعیت کے اشتہارات کے لیے فریق ثالث کے شراکت داروں کے ساتھ شیئر نہیں کریں گے۔ آپ اس باکس کو غیر نشان زد کر کے کسی بھی وقت اشتراک کو فعال کر سکتے ہیں۔", - "common.privacyChoices.checkbox.label": "میری معلومات کا اشتراک نہ کریں۔", - "common.privacyChoices.description": "ہم دیگر ویب سائٹس اور پلیٹ فارمز پر اپنی خدمات کو فروغ دینے کے لیے اپنے اشتہاری شراکت داروں کے ساتھ ڈیوائس شناخت کنندگان کا اشتراک کر سکتے ہیں۔ جہاں یہ قابل اطلاق قوانین کے تحت فروخت، اشتراک یا ٹارگٹ ایڈورٹائزنگ کے طور پر اہل ہے، آپ \"میری معلومات کا اشتراک نہ کریں\" باکس کو نشان زد کر کے آپٹ آؤٹ کر سکتے ہیں۔ ہمارے رازداری کے طریقوں کے بارے میں مزید معلومات کے لیے براہ کرم ہماری رازداری کی پالیسیکا جائزہ لیں۔", - "common.privacyChoices.disclaimer": "براہ کرم نوٹ کریں کہ آپ کا انتخاب صرف اس ڈیوائس پر اس براؤزر پر لاگو ہوگا۔ آپ اس براؤزر کے اندر گلوبل پرائیویسی کنٹرول سیٹنگ کو فعال کر کے بھی آپٹ آؤٹ کر سکتے ہیں جسے آپ ہماری خدمات تک رسائی کے لیے استعمال کرتے ہیں۔ مزید اختیارات دیکھنے کے لیے، اپنی ترتیبات پر جائیں۔", - "common.privacyPolicy": "رازداری کی پالیسی", - "common.proceed": "آگے بڑھو", - "common.proceedInWallet": "اپنے بٹوے میں آگے بڑھیں۔", - "common.products": "مصنوعات", - "common.protocol": "پروٹوکول", - "common.protocol.v2": "Unswap v2", - "common.protocol.v3": "Unswap v3", - "common.protocol.v4": "Unswap v4", - "common.purchased": "خریدا گیا۔", - "common.rate": "شرح", - "common.readMore": "مزید پڑھ", - "common.receive": "وصول کریں۔", - "common.received": "موصول ہوا۔", - "common.recent": "حالیہ", - "common.refresh": "ریفریش کریں۔", - "common.reload.label": "ایپ کو دوبارہ لوڈ کریں۔", - "common.remove.label": "دور", - "common.remove.liquidity.canceled": "لیکویڈیٹی کو ہٹانا منسوخ کر دیا گیا۔", - "common.remove.liquidity.failed": "لیکویڈیٹی کو ہٹانا ناکام ہو گیا۔", - "common.removing.liquidity": "لیکویڈیٹی کو ہٹانا", - "common.resetLimit": "{{symbol}} کی حد کو دوبارہ ترتیب دیں۔", - "common.resetLimitWallet": "والیٹ میں {{symbol}} کی حد کو دوبارہ ترتیب دیں۔", - "common.resettingLimit": "{{symbol}} کی حد کو دوبارہ ترتیب دیا جا رہا ہے...", - "common.revoke.approval.failed": "منظوری منسوخ کرنا ناکام ہو گیا۔", - "common.revoked.approval": "منظوری منسوخ کر دی گئی۔", - "common.revoking.approval": "منظوری منسوخ کرنا", - "common.scanQRDownload": "ڈاؤن لوڈ کرنے کے لیے اپنے فون سے QR کوڈ اسکین کریں۔", - "common.selectRegion.label": "اپنا علاقہ منتخب کریں۔", - "common.selectToken.label": "ایک ٹوکن منتخب کریں۔", - "common.sell.label": "بیچنا", - "common.send.button": "بھیجیں", - "common.send.failed": "بھیجنا ناکام ہو گیا۔", - "common.sending": "بھیج رہا ہے۔", - "common.sent": "بھیجا", - "common.settings": "ترتیبات", - "common.share": "بانٹیں", - "common.share.shareToTwitter": "ٹویٹر پر شیئر کریں۔", - "common.show.button": "دکھائیں۔", - "common.showLess.button": "کم دکھائیں۔", - "common.showMore.button": "مزید دکھائیں", - "common.signatureExpired": "آپ کے دستخط کی میعاد ختم ہو گئی ہے۔", - "common.signMessage": "پیغام پر دستخط کریں۔", - "common.signMessageWallet": "بٹوے میں پیغام پر دستخط کریں۔", - "common.socials": "سوشلز", - "common.sold": "فروخت", - "common.stats": "اعدادوشمار", - "common.status": "حیثیت", - "common.step.number": "مرحلہ {{number}}", - "common.step.number.of": "{{total}}کا مرحلہ {{current}}", - "common.swap": "تبادلہ", - "common.swap.expired": "تبادلہ کی میعاد ختم ہوگئی", - "common.swap.failed": "تبادلہ ناکام ہو گیا۔", - "common.swapPending": "تبادلہ زیر التواء...", - "common.termsOfService": "سروس کی شرائط", - "common.text.connected": "جڑا ہوا", - "common.text.contract": "معاہدہ", - "common.text.disconnected": "منقطع", - "common.text.error": "خرابی", - "common.text.notAvailable": "N / A", - "common.text.recipient": "کو", - "common.text.sender": "سے", - "common.text.unknown": "نامعلوم", - "common.thisAccount": "یہ اکاؤنٹ", - "common.thisMonth": "اس مہینے", - "common.thisToken": "یہ ٹوکن", - "common.thisWeek": "اس ہفتے", - "common.thisYear": "اس سال", - "common.time": "وقت", - "common.time.minute.amt": "{{time}}m", - "common.time.minutes": "منٹ", - "common.time.past.days": "{{days}} دن", - "common.time.past.days.short": "{{days}}d", - "common.time.past.hours": "{{hours}} گھنٹے", - "common.time.past.hours.short": "{{hours}}h", - "common.time.past.minutes.short": "{{minutes}}میٹر", - "common.time.past.months.short": "{{months}}mo", - "common.time.past.seconds.short": "{{seconds}}s", - "common.to": "کو", - "common.today": "آج", - "common.tokenA": "ٹوکن اے", - "common.tokenAmount": "ٹوکن کی رقم", - "common.tokenB": "ٹوکن بی", - "common.tokenName": "ٹوکن کا نام", - "common.tokens": "ٹوکنز", - "common.totalUniswapTVL": "ٹوٹل یونیسیاپ TVL", - "common.totalValueLocked": "ٹی وی ایل", - "common.trade": "تجارت", - "common.trademarkPolicy": "ٹریڈ مارک پالیسی", - "common.transactionDetails": "لین دین کی تفصیلات", - "common.transactionId": "ٹرانزیکشن ID", - "common.transactionPending": "لین دین زیر التواء ہے۔", - "common.transactions": "لین دین", - "common.transactionSettings": "لین دین کی ترتیبات", - "common.transfer_one": "منتقلی", - "common.transfer_other": "منتقلی", - "common.tryAgain.error": "دوبارہ کوشش کریں", - "common.twitter": "ٹویٹر", - "common.type.label": "قسم", - "common.unavailable": "دستیاب نہیں۔", - "common.unhide": "چھپائیں", - "common.unichain": "یونچین", - "common.uniswapMobile": "موبائل کو تبدیل کریں۔", - "common.uniswapWallet": "بٹوے کو تبدیل کریں۔", - "common.uniswapX": "UniswapX", - "common.unknown": "نامعلوم", - "common.unknownError.error": "نامعلوم خامی", - "common.unwrap.button": "کھولنا", - "common.unwrap.failed": "کھولنا ناکام ہو گیا۔", - "common.unwrapped": "لپیٹے ہوئے ۔", - "common.unwrapping": "کھولنا", - "common.view.profile": "پروفائل دیکھیں", - "common.viewOnExplorer": "ایکسپلورر پر دیکھیں", - "common.volume": "حجم", - "common.vote": "ووٹ", - "common.wallet.approve": "بٹوے میں منظور کریں۔", - "common.wallet.label": "پرس", - "common.warning": "وارننگ", - "common.webApp": "ویب ایپ", - "common.website": "ویب سائٹ", - "common.whyApprove": "مجھے ٹوکن منظور کرنے کی کیا ضرورت ہے؟", - "common.whySign": "دستخط کیوں ضروری ہیں؟", - "common.whyWrap": "مجھے اپنا {{symbol}}لپیٹنا کیوں ہے؟", - "common.withdraw": "واپس لینا", - "common.withdrawal.amount": "واپسی کی رقم", - "common.withinRange": "رینج میں", - "common.wrap": "لپیٹیں {{symbol}}", - "common.wrap.failed": "لپیٹنا ناکام ہوگیا۔", - "common.wrapIn": "بٹوے میں {{symbol}} لپیٹیں۔", - "common.wrapped": "لپیٹے ہوئے", - "common.wrapping": "ریپنگ", - "common.wrappingToken": "ریپنگ {{symbol}}...", - "common.yesterday": "کل", - "common.your.account.had.insufficient.funds": "اس تبادلہ کو مکمل کرنے کے لیے آپ کے اکاؤنٹ میں ناکافی فنڈز تھے۔", - "common.your.account.has.insufficient.funds": "اس تبادلہ کو مکمل کرنے کے لیے آپ کے اکاؤنٹ میں ناکافی فنڈز ہیں۔", - "common.your.connected.wallet": "آپ کا منسلک بٹوہ", - "common.your.limit.could.not.be.fulfilled": "آپ کی حد اس وقت پوری نہیں ہو سکی۔ دوبارہ کوشش کریں۔", - "common.your.swap.could.not.be.fulfilled": "آپ کا تبادلہ اس وقت پورا نہیں ہو سکا۔ دوبارہ کوشش کریں۔", - "common.youreBuying": "آپ خرید رہے ہیں۔", - "common.youReceive": "آپ وصول کرتے ہیں۔", - "common.youreSelling": "آپ بیچ رہے ہیں۔", - "currency.ars": "ارجنٹائن پیسو", - "currency.aud": "آسٹریلوی ڈالر", - "currency.brl": "برازیلین ریال", - "currency.cad": "کینیڈین ڈالر", - "currency.cny": "چینی یوآن", - "currency.cop": "کولمبیا پیسو", - "currency.eur": "یورو", - "currency.gbp": "برطانوی پاؤنڈ", - "currency.hkd": "ہانگ کانگ ڈالر", - "currency.idr": "انڈونیشین روپیہ", - "currency.inr": "ہندوستانی روپیہ", - "currency.jpy": "جاپانی ین", - "currency.krw": "جنوبی کوریائی وون", - "currency.mxn": "میکسیکن پیسو", - "currency.ngn": "نائجیرین نائرا", - "currency.pkr": "پاکستانی روپیہ", - "currency.rub": "روسی روبل", - "currency.sgd": "سنگاپور ڈالر", - "currency.try": "ترک لیرا", - "currency.uah": "یوکرین ہریونیا", - "currency.usd": "امریکی ڈالر", - "currency.vnd": "ویتنامی ڈونگ", - "dapp.request.actionCannotBeCompleted.description": "کچھ فعالیت دستیاب نہیں ہے کیونکہ آپ کے اسمارٹ والیٹ کی ترتیبات کا نظم ایک مختلف والیٹ ایپ کے ذریعے کیا جا رہا ہے۔", - "dapp.request.actionCannotBeCompleted.header": "دستخط کی درخواست", - "dapp.request.actionCannotBeCompleted.title": "کارروائی مکمل نہیں ہو سکتی", - "dapp.request.approve.action": "منظور کرو", - "dapp.request.approve.fallbackTitle": "اخراجات کے ٹوکن کو منظور کریں۔", - "dapp.request.approve.helptext": "اس سائٹ کو اپنے بٹوے سے اس ٹوکن تک رسائی اور خرچ کرنے کی اجازت دیں۔", - "dapp.request.approve.label": "پرس", - "dapp.request.approve.title": "{{tokenSymbol}}خرچ کی منظوری دیں۔", - "dapp.request.base.title": "لین دین کی درخواست", - "dapp.request.bridge.description": "ETH، USDC اور مزید کو {{numChains}}+ نیٹ ورکس میں منتقل کریں۔", - "dapp.request.bridge.title": "پل کرنے کی کوشش کر رہے ہیں؟", - "dapp.request.connect.helptext": "اس سائٹ کو آپ کے بٹوے کا پتہ، بیلنس دیکھنے اور لین دین کے لیے منظوری کی درخواست کرنے کی اجازت دیں۔", - "dapp.request.connect.title": "سائٹ سے جڑیں۔", - "dapp.request.fallback.calldata.label": "خام ڈیٹا", - "dapp.request.fallback.function.label": "فنکشن", - "dapp.request.permit2.description": "Permit2 متعدد ڈیپ میں ٹوکن منظوریوں کا انتظام کرتا ہے۔", - "dapp.request.permit2.header": "پرمٹ 2 پر دستخط کریں۔", - "dapp.request.permit2approve.action": "منظور کرو", - "dapp.request.permit2approve.helptext": "Permit2 متعدد ڈیپ میں ٹوکن منظوریوں کا انتظام کرتا ہے۔", - "dapp.request.permit2approve.title": "اجازت نامہ منظور کریں2", - "dapp.request.reject.action": "سب کو مسترد کریں۔", - "dapp.request.reject.info": "آپ کے پاس {{totalRequestCount}} ٹرانزیکشن کی درخواستیں ہیں", - "dapp.request.revoke.action": "منسوخ کریں۔", - "dapp.request.revoke.helptext": "لین دین کے لیے اس ٹوکن کو خرچ کرنے کے لیے اس سائٹ کو رسائی منسوخ کرنے کی اجازت دیں۔ یقینی بنائیں کہ آپ اس سائٹ پر بھروسہ کرتے ہیں۔", - "dapp.request.revoke.title": "{{tokenSymbol}}تک رسائی منسوخ کریں۔", - "dapp.request.signature.containsUnrenderableCharacters": "اس پیغام میں ناقابل تجدید حروف شامل ہیں۔ یقینی بنائیں کہ آپ اس سائٹ پر بھروسہ کرتے ہیں۔", - "dapp.request.signature.decodeError": "پیغام کو ڈی کوڈ کرنے میں ناکام", - "dapp.request.signature.header": "دستخط کی درخواست", - "dapp.request.signature.irregular": "غیر قانونی دستخط کی درخواست", - "dapp.request.signature.irregular.description": "آگے بڑھنے سے پہلے یقینی بنائیں کہ آپ اس سائٹ پر بھروسہ کرتے ہیں۔", - "dapp.request.signature.irregular.understand": "میں خطرات کو سمجھتا ہوں۔", - "dapp.request.signature.toggleDataView.raw": "خام ڈیٹا دیکھیں", - "dapp.request.signature.toggleDataView.readable": "اصل ڈیٹا دیکھیں", - "dapp.request.warning.notActive.message": "یقینی بنائیں کہ یہ صحیح ہے۔", - "dapp.request.warning.notActive.title": "یہ آپ کا فعال بٹوہ نہیں ہے۔", - "delegation.upgradeModal.description": "یہ والیٹ اپ ڈیٹ تیز، کم لاگت والے لین دین کے لیے سمارٹ کنٹریکٹس کا استعمال کرتی ہے۔ مزید جانیں", - "delegation.upgradeModal.enableSmartWallet": "سمارٹ والیٹ کو فعال کریں۔", - "delegation.upgradeModal.title": "ہوشیار تبادلہ، کم لاگت", - "downloadApp.modal.connectExistingWallet": "موجودہ پرس کو جوڑیں۔", - "downloadApp.modal.getStarted.description": "دنیا کے سب سے بڑے آنچین مارکیٹ پلیس کے ذریعے ہزاروں ٹوکنز تک فوری رسائی حاصل کریں۔", - "downloadApp.modal.getStarted.title": "سیکنڈوں میں تبادلہ کرنا شروع کریں۔", - "downloadApp.modal.getTheApp.title": "Unswap کے ساتھ شروع کریں۔", - "downloadApp.modal.uniswapProducts.subtitle": "Unswap مصنوعات بہترین onchain تجربہ تخلیق کرنے کے لیے بغیر کسی رکاوٹ کے ایک ساتھ کام کرتی ہیں۔", - "empty.swap.button.text": "تبادلہ کرنے کے لیے فنڈز شامل کریں۔", - "error.dataUnavailable": "اس وقت ڈیٹا دستیاب نہیں ہے۔ ہم ٹھیک کرنے پر کام کر رہے ہیں۔", - "error.id": "خرابی کی شناخت: {{eventId}}", - "error.jupiterApi.execute.default.title": "Jupiter API میں کچھ غلط ہو گیا۔ براہ کرم دوبارہ کوشش کریں۔", - "error.jupiterApi.failedToLand": "(کوڈ {{code}}: نیٹ ورک پر لین دین ناکام ہو گیا)", - "error.jupiterApi.invalidBlockHeight": "(کوڈ -1004: بلاک کی غلط اونچائی)", - "error.jupiterApi.invalidMessageBytes": "(کوڈ -3: غلط میسج بائٹس)", - "error.jupiterApi.invalidPayload": "(کوڈ -2002: غلط پے لوڈ)", - "error.jupiterApi.invalidSignedTransaction": "(کوڈ -2: غلط دستخط شدہ لین دین)", - "error.jupiterApi.invalidTransaction": "(کوڈ -1002: غلط لین دین)", - "error.jupiterApi.missingCachedOrder": "(کوڈ -1: کیشڈ آرڈر غائب)", - "error.jupiterApi.notFullySigned": "(کوڈ -1003: لین دین مکمل طور پر دستخط شدہ نہیں ہے)", - "error.jupiterApi.quoteExpired": "اس اقتباس کا وقت ختم ہو گیا، براہ کرم دوبارہ کوشش کریں۔ (کوڈ -2003)", - "error.jupiterApi.unknownErrorCode": "(کوڈ {{code}})", - "error.noData": "کوئی ڈیٹا نہیں ملا", - "error.request.provideId": "معذرت، آپ کی درخواست پر کارروائی کرتے وقت ایک خرابی پیش آگئی۔ اگر آپ سپورٹ کی درخواست کرتے ہیں تو اپنی ایرر آئی ڈی فراہم کرنا یقینی بنائیں۔", - "error.tokenApproval": "ٹوکن کی منظوری ناکام ہو گئی۔", - "error.tokenApproval.message": "نیٹ ورک یا کنکشن کا مسئلہ ممکنہ طور پر آپ کی منظوری کے ناکام ہونے کا سبب بنتا ہے۔ اپنا کنکشن چیک کریں اور دوبارہ کوشش کریں۔", - "error.tokenApprovalEdited": "منظوری کی رقم ناکافی ہے۔", - "error.tokenApprovalEdited.message": "اس لین دین کو مکمل کرنے کے لیے آپ کے بٹوے میں منظور کی گئی رقم بہت کم ہے۔ براہ کرم دوبارہ کوشش کریں اور رقم بڑھائیں۔", - "errors.crash.message": "کچھ کریش ہو گیا۔", - "errors.crash.restart": "ایپ کو دوبارہ شروع کریں۔", - "errors.crash.title": "اوہ!", - "explore.more.pools": "مزید پول دریافت کریں۔", - "explore.more.unichain": "یونچین پولز کو دریافت کریں۔", - "explore.search.label.ownedBy": "{{ownerAddress}}کی ملکیت ہے۔", - "explore.search.placeholder": "ٹوکن اور بٹوے تلاش کریں۔", - "explore.search.section.nft": "NFT مجموعہ", - "explore.search.section.popularNFT": "NFT کے مقبول مجموعے۔", - "explore.search.section.wallets": "بٹوے", - "explore.tokens.error": "ٹوکن لوڈ نہیں ہو سکے۔", - "explore.tokens.favorite.action.add": "پسندیدہ ٹوکن", - "explore.tokens.favorite.action.edit": "پسندیدہ میں ترمیم کریں۔", - "explore.tokens.favorite.action.remove": "پسندیدہ کو ہٹا دیں۔", - "explore.tokens.favorite.title.default": "پسندیدہ ٹوکن", - "explore.tokens.favorite.title.edit": "پسندیدہ ٹوکن میں ترمیم کریں۔", - "explore.tokens.metadata.marketCap": "{{number}} ایم سی کیپ", - "explore.tokens.metadata.totalValueLocked": "{{number}} TVL", - "explore.tokens.metadata.volume": "{{number}} والیوم", - "explore.tokens.sort.label.marketCap": "مارکیٹ کیپ", - "explore.tokens.sort.label.priceDecrease": "قیمت میں کمی", - "explore.tokens.sort.label.priceIncrease": "قیمت میں اضافہ", - "explore.tokens.sort.label.totalValueLocked": "ٹی وی ایل", - "explore.tokens.sort.label.volume": "حجم", - "explore.tokens.sort.option.marketCap": "مارکیٹ کیپ", - "explore.tokens.sort.option.priceDecrease": "قیمت میں کمی (24H)", - "explore.tokens.sort.option.priceIncrease": "قیمت میں اضافہ (24H)", - "explore.tokens.sort.option.totalValueLocked": "ٹی وی ایل کو تبدیل کریں۔", - "explore.tokens.sort.option.volume": "غیر تبدیل شدہ والیوم (24H)", - "explore.tokens.top.title": "ٹاپ ٹوکنز", - "explore.v2TVL": "v2 TVL", - "explore.v3TVL": "v3 TVL", - "explore.v4TVL": "v4 TVL", - "explore.wallets.favorite.action.add": "پسندیدہ پرس", - "explore.wallets.favorite.action.edit": "پسندیدہ میں ترمیم کریں۔", - "explore.wallets.favorite.action.remove": "پسندیدہ کو ہٹا دیں۔", - "explore.wallets.favorite.action.remove.short": "ناپسندیدہ", - "explore.wallets.favorite.title.default": "پسندیدہ بٹوے", - "explore.wallets.favorite.title.edit": "پسندیدہ بٹوے میں ترمیم کریں۔", - "extension.connection.network": "نیٹ ورک", - "extension.connection.networks": "نیٹ ورکس", - "extension.connection.popup.trouble": "جڑنے میں دشواری؟", - "extension.connection.titleConnected": "جڑا ہوا", - "extension.connection.titleNotConnected": "منسلک نہیں", - "extension.lock.button.forgot": "پاسورڈ بھول گے؟", - "extension.lock.button.reset": "بٹوے کو دوبارہ ترتیب دیں۔", - "extension.lock.button.submit": "غیر مقفل کریں۔", - "extension.lock.password.error": "غلط پاس ورڈ. دوبارہ کوشش کریں", - "extension.lock.password.reset.initial.description": "Uniswap آپ کے پاس ورڈ کی بازیافت میں مدد نہیں کر سکتا۔ آپ کو اپنا 12 الفاظ پر مشتمل ریکوری جملہ دوبارہ درج کرکے اپنے بٹوے کو دوبارہ ترتیب دینے کی ضرورت ہے۔", - "extension.lock.password.reset.initial.help": "میں اپنا بازیابی کا جملہ کہاں سے تلاش کروں؟", - "extension.lock.password.reset.initial.title": "پاسورڈ بھول گے", - "extension.lock.password.reset.speedbump.description": "اپنے بٹوے کو دوبارہ ترتیب دینے سے پہلے یقینی بنائیں کہ آپ کے پاس 12 الفاظ پر مشتمل ریکوری جملہ ہے۔ بصورت دیگر آپ اپنے فنڈز کی وصولی نہیں کر سکیں گے۔", - "extension.lock.password.reset.speedbump.help": "میں نے اپنی بازیابی کا جملہ کھو دیا۔", - "extension.lock.password.reset.speedbump.title": "اس سے پہلے کہ آپ جاری رکھیں", - "extension.lock.subtitle": "غیر مقفل کرنے کے لیے اپنا پاس ورڈ درج کریں۔", - "extension.lock.title": "خوش آمدید", - "extension.network.notSupported": "غیر تعاون یافتہ نیٹ ورک", - "extension.open": "Unswap ایکسٹینشن کھولیں۔", - "extension.passwordPrompt.error.wrongPassword": "غلط پاس ورڈ. دوبارہ کوشش کریں", - "extension.passwordPrompt.title": "اپنا پاس ورڈ درج کریں", - "extension.popup.chrome.button": "ایکسٹینشن کھولیں۔", - "extension.popup.chrome.description": "یونی سویپ ایکسٹینشن کھول کر اس عمل کو مکمل کریں۔", - "extension.popup.chrome.title": "Unswap میں جاری رکھیں", - "extension.settings.defaultWallet.message": "ایپس سے منسلک ہوتے وقت یونی سویپ ایکسٹینشن کو ترجیح دیں۔", - "extension.settings.defaultWallet.title": "ڈیفالٹ والیٹ بنائیں", - "extension.uninstall.reason.missingFeatures": "Unswap Wallet میں کچھ خصوصیات کی کمی ہے۔", - "extension.uninstall.reason.notUsingCrypto": "میں اب کرپٹو استعمال نہیں کرنا چاہتا", - "extension.uninstall.reason.other": "دیگر وجوہات", - "extension.uninstall.reason.switchingWallet": "میں ایک مختلف بٹوے پر جا رہا ہوں۔", - "extension.uninstall.subtitle": "اگر آپ کے پاس ایک لمحہ ہے، تو ہم یہ جاننا پسند کریں گے کہ آپ نے یونی سویپ والیٹ کو کیوں ان انسٹال کیا۔", - "extension.uninstall.title": "آپ کو جاتے دیکھ کر ہمیں دکھ ہوا۔", - "extension.warning.storage.button": "بیک اپ", - "extension.warning.storage.message": "اپنے بٹوے اور فنڈز تک رسائی سے محروم ہونے سے بچنے کے لیے اپنے بازیابی کے جملے کا بیک اپ لینا یقینی بنائیں۔", - "extension.warning.storage.title": "آپ کے براؤزر کی اسٹوریج ختم ہو رہی ہے۔", - "extensionPasskeyLogInPopUp.description": "موجودہ پاس کی کے ساتھ لاگ ان کرکے اپنا یونی سویپ اکاؤنٹ درآمد کریں۔", - "extensionPasskeyLogInPopUp.invalidReferrer": "براہ کرم یہ صفحہ بند کریں اور دوبارہ کوشش کریں۔", - "fee.bestForCustomizability": "حسب ضرورت کے لیے بہترین۔", - "fee.bestForExotic": "غیر ملکی جوڑوں کے لیے بہترین۔", - "fee.bestForMost": "زیادہ تر جوڑوں کے لیے بہترین۔", - "fee.bestForStablePairs": "مستحکم جوڑوں کے لیے بہترین۔", - "fee.bestForVeryStable": "بہت مستحکم جوڑوں کے لیے بہترین۔", - "fee.dynamic": "متحرک فیس", - "fee.percentEarned": "% جو آپ فیس میں کمائیں گے۔", - "fee.selectPercent": "{{pct}}% منتخب کریں۔", - "fee.selectPercentDescription": "{{pct}}% لیکویڈیٹی نے اس درجے کو منتخب کیا۔", - "fee.tier": "فیس کا درجہ", - "fee.tier.create": "فیس کی سطح بنائیں", - "fee.tier.create.button": "فیس کا نیا درجہ بنائیں", - "fee.tier.create.description": "ایک نئے درجے کی تخلیق ایک نئے پول میں شروع ہوگی اور اس کے نتیجے میں نیٹ ورک کے معمول کے اخراجات سے زیادہ ہوں گے۔", - "fee.tier.description": "رقم جو لیکویڈیٹی فراہم کرتی ہے۔ ایسی رقم کا انتخاب کریں جو آپ کے خطرے کی برداشت اور حکمت عملی کے مطابق ہو۔", - "fee.tier.description.v2": "رقم جو لیکویڈیٹی فراہم کرتی ہے۔ تمام v2 پولز نے 0.3% فیس مقرر کی ہے۔ مزید اختیارات کے لیے، v4 پر لیکویڈیٹی فراہم کریں۔", - "fee.tier.dynamic": "متحرک فیس کا درجہ", - "fee.tier.dynamic.create": "متحرک فیس ٹائر بنانا", - "fee.tier.dynamic.create.info": "آپ متحرک فیس ٹائر کے ساتھ ایک پول بنانے والے ہیں۔ آگے بڑھنے سے پہلے، براہ کرم یقینی بنائیں کہ منتخب کردہ ہک متحرک فیس کو سپورٹ کرتا ہے۔", - "fee.tier.highestTvl": "اعلی ترین TVL", - "fee.tier.label": "% جو آپ فیس میں کمائیں گے۔", - "fee.tier.missing.description": "آپ جس درجے کی تلاش کر رہے ہیں اسے نہیں مل سکتا؟", - "fee.tier.new": "نیا درجہ", - "fee.tier.percent.select": "{{percentage}} منتخب کریں۔", - "fee.tier.recommended.description": "منتخب ٹوکن جوڑے کے لیے لیکویڈیٹی کا سب سے زیادہ حصہ رکھنے کی بنیاد پر تجویز کردہ۔", - "fee.tier.search": "تلاش کریں یا فیس کے دوسرے درجے بنائیں", - "fee.tier.search.short": "تلاش کے درجات", - "fee.tier.select": "فیس کا درجہ منتخب کریں۔", - "fee.tier.select.existing.button": "موجودہ فیس ٹائر منتخب کریں۔", - "fee.tierExact": "{{fee}} فیس کا درجہ", - "fee.unavailable": "کمائی ہوئی فیس v2 پوزیشنز کے لیے اس وقت تک نظر نہیں آتی جب تک لیکویڈیٹی کو ہٹا نہیں دیا جاتا۔", - "fee.uncollected": "غیر جمع شدہ فیسیں شامل ہیں:", - "fee.uniswap": "فیس ({{percent}})", - "fee.uniswap.description": "Uniswap کے ساتھ بہترین تجربہ کو یقینی بنانے کے لیے فیس کا اطلاق ہوتا ہے۔", - "fiatOffRamp.checkout.title": "واپس لے لیں۔", - "fiatOffRamp.connection.quote": "{{currencySymbol}}کی قیمت {{amount}} فروخت کرنا", - "fiatOffRamp.error.balance": "توازن سے زیادہ", - "fiatOffRamp.error.populateSend.description": "براہ کرم ایک لمحہ انتظار کریں اور دوبارہ کوشش کریں۔", - "fiatOffRamp.error.populateSend.title": "لین دین لوڈ نہیں ہو سکتا", - "fiatOffRamp.summary.total": "{{fiatAmount}}کے لیے {{cryptoAmount}}", - "fiatOffRamp.unsupportedToken.back": "واپس جاو", - "fiatOffRamp.unsupportedToken.divider": "غیر تعاون یافتہ ٹوکنز", - "fiatOffRamp.unsupportedToken.message": "یہ ٹوکن فروخت کے لیے تعاون یافتہ نہیں ہے۔ اس اثاثے کو تعاون یافتہ ٹوکنز میں سے ایک میں تبدیل کریں۔", - "fiatOffRamp.unsupportedToken.swap": "ایک معاون ٹوکن میں تبدیل کریں۔", - "fiatOffRamp.unsupportedToken.title": "غیر تعاون یافتہ ٹوکن", - "fiatOffRamp.welcome.tooltip": "اپنے کرپٹو کو اپنے بینک اکاؤنٹ یا ڈیبٹ کارڈ میں بیچیں۔", - "fiatOnRamp.button.chooseToken": "ٹوکن کا انتخاب کریں۔", - "fiatOnRamp.buy.info.description": "تبادلہ کرتے وقت آپ کو نیٹ ورک کے اخراجات کی ادائیگی کے لیے اس کی ضرورت ہوگی۔", - "fiatOnRamp.buy.info.title": "ETH کے ساتھ شروع کریں۔", - "fiatOnRamp.cexTransferModal.description": "کارڈ کے ساتھ کرپٹو خریدنا آپ کے علاقے میں تعاون یافتہ نہیں ہے۔ اپنے بٹوے کو فنڈ دینے کے لیے سینٹرلائزڈ ایکسچینج اکاؤنٹ سے اثاثے منتقل کریں۔", - "fiatOnRamp.cexTransferModal.title": "شروع کرنے کے لیے منتقل کریں۔", - "fiatOnRamp.checkout.title": "اس کو دیکھو", - "fiatOnRamp.chooseMultiPlatformProvider.chooseNetwork": "نیٹ ورک کا انتخاب کریں۔", - "fiatOnRamp.chooseMultiPlatformProvider.description": "یہ بٹوے کے اس پتے کا تعین کرے گا جس پر آپ کو فنڈز موصول ہوں گے۔", - "fiatOnRamp.chooseProvider.description": "آپ اپنے لین دین سے وابستہ فیس دیکھنے کے لیے فراہم کنندہ کے پورٹل پر جائیں گے۔", - "fiatOnRamp.completeTransactionHeader": "{{serviceProvider}}کے ساتھ لین دین مکمل کریں۔", - "fiatOnRamp.connection.error": "رابطہ ناکام", - "fiatOnRamp.connection.errorDescription": "{{serviceProvider}}کے ساتھ جڑنے میں کچھ غلط ہو گیا۔", - "fiatOnRamp.connection.message": "آپ کو {{serviceProvider}}سے جوڑ رہا ہے۔", - "fiatOnRamp.connection.quote": "{{currencySymbol}}کی قیمت {{amount}} خریدنا", - "fiatOnRamp.connection.terms": "جاری رکھ کر، آپ تسلیم کرتے ہیں کہ آپ {{serviceProvider}}کے ساتھ سروس کی شرائط اور رازداری کی پالیسی کے تابع ہوں گے، جیسا کہ قابل اطلاق ہے۔", - "fiatOnRamp.continueInTab": "جاری رکھنے کے لیے {{serviceProvider}} ٹیب پر جائیں۔ اب اس موڈل کو بند کرنا محفوظ ہے۔", - "fiatOnRamp.disclaimer": "جاری رکھ کر، آپ تسلیم کرتے ہیں کہ آپ سروس کی شرائط اور رازداری کی پالیسی کے ساتھ {{serviceProvider}}کے ساتھ مشروط ہوں گے، جیسا کہ قابل اطلاق ہے۔", - "fiatOnRamp.error.default": "کچھ غلط ہو گیا.", - "fiatOnRamp.error.load": "خریدنے کے لیے ٹوکن لوڈ نہیں ہو سکے۔", - "fiatOnRamp.error.max": "زیادہ سے زیادہ {{amount}}", - "fiatOnRamp.error.min": "کم از کم {{amount}}", - "fiatOnRamp.error.noQuotes": "کوئی اقتباسات نہیں ملے۔", - "fiatOnRamp.error.unavailable": "یہ سروس آپ کے علاقے میں دستیاب نہیں ہے۔", - "fiatOnRamp.error.unsupported": "خطے میں تعاون یافتہ نہیں ہے۔", - "fiatOnRamp.error.usd": "صرف USD میں خریدنے کے لیے دستیاب ہے۔", - "fiatOnRamp.noQuotes.error": "کوئی اقتباسات نہیں ملے", - "fiatOnRamp.paymentMethods.applePay": "ایپل پے", - "fiatOnRamp.paymentMethods.bank": "بینک", - "fiatOnRamp.paymentMethods.debit": "ڈیبٹ", - "fiatOnRamp.paymentMethods.googlePay": "گوگل پے", - "fiatOnRamp.paymentMethods.paypal": "پے پال", - "fiatOnRamp.paymentMethods.venmo": "وینمو", - "fiatOnRamp.quote.advice": "آپ اپنے لین دین سے وابستہ فیس دیکھنے کے لیے فراہم کنندہ کے پورٹل پر جائیں گے۔", - "fiatOnRamp.quote.type.list": "{{optionsList}}، اور دیگر اختیارات", - "fiatOnRamp.receiveCrypto.modal.sectionTitle.fromAccount": "اکاؤنٹ سے", - "fiatOnRamp.receiveCrypto.title": "کرپٹو وصول کریں۔", - "fiatOnRamp.receiveCrypto.transferFunds": "دوسرے بٹوے یا اکاؤنٹ سے کریپٹو منتقل کر کے اپنے بٹوے کو فنڈ دیں۔", - "fiatOnRamp.receiveCrypto.useThisAddress": "ٹوکن حاصل کرنے کے لیے اس ایڈریس کا استعمال کریں۔", - "fiatOnRamp.region.placeholder": "ملک یا علاقے کے لحاظ سے تلاش کریں۔", - "fiatOnRamp.region.title": "اپنا علاقہ منتخب کریں۔", - "fiatOnRamp.summary.total": "{{fiatAmount}}کے لیے {{cryptoAmount}}", - "forceUpgrade.action.backup": "اپنے بٹوے کا بیک اپ لیں۔", - "forceUpgrade.action.confirm": "ابھی اپ ڈیٹ کریں۔", - "forceUpgrade.action.learn": "اپ ڈیٹ کرنے کا طریقہ سیکھیں۔", - "forceUpgrade.description.extension": "ایپ کا نیا ورژن دستیاب ہے۔ Uniswap ایکسٹینشن کا استعمال جاری رکھنے کے لیے، براہ کرم اسے تازہ ترین ورژن میں اپ ڈیٹ کریں۔", - "forceUpgrade.description.wallet": "ایپ کا نیا ورژن دستیاب ہے۔ Uniswap Wallet کا استعمال جاری رکھنے کے لیے، براہ کرم اسے تازہ ترین ورژن میں اپ ڈیٹ کریں۔", - "forceUpgrade.label.recoveryPhrase": "بازیابی کا جملہ", - "forceUpgrade.title": "تازہ ترین ورژن میں اپ ڈیٹ کریں۔", - "forceUpgrade.title.recommendedStatus": "ایک نیا ورژن دستیاب ہے۔", - "globalPreferences.title": "عالمی ترجیحات", - "hero.scroll": "مزید جاننے کے لیے سکرول کریں۔", - "hero.subtitle": "{{amount}}+ نیٹ ورکس بشمول Ethereum، Unichain، اور Base پر کرپٹو خریدیں اور بیچیں۔", - "hero.swap.title": "کسی بھی وقت،
کہیں بھی تبدیل کریں۔", - "hidden.nfts.info.banner.text": "پوشیدہ NFTs کے بارے میں مزید جانیں۔", - "hidden.nfts.info.text.button": "پوشیدہ NFTs ({{numHidden}})", - "hidden.nfts.info.text.extension": "یہ ممکنہ گھوٹالے اور NFTs ہیں جنہیں آپ نے چھپایا ہے۔ آپ اسے چھپانے کے لیے NFT پر دائیں کلک کر سکتے ہیں۔", - "hidden.nfts.info.text.mobile": "یہ ممکنہ گھوٹالے اور NFTs ہیں جنہیں آپ نے چھپایا ہے۔ آپ اسے چھپانے کے لیے NFT پر دیر تک دبا سکتے ہیں۔", - "hidden.nfts.info.text.title": "پوشیدہ NFTs", - "hidden.tokens.info.banner.text": "پوشیدہ ٹوکنز کے بارے میں مزید جانیں۔", - "hidden.tokens.info.text.button": "پوشیدہ ٹوکنز ({{numHidden}})", - "hidden.tokens.info.text.info": "یہ ممکنہ گھپلے، چھوٹے بیلنس، اور ٹوکنز ہیں جنہیں آپ نے چھپایا ہے۔ پوشیدہ ٹوکنز آپ کے بٹوے کے کل بیلنس میں شامل نہیں ہیں۔", - "hidden.tokens.info.text.title": "پوشیدہ ٹوکن", - "home.activity.empty.button": "ٹوکن یا NFTs وصول کریں۔", - "home.activity.empty.description.default": "جب آپ ٹوکنز یا NFTs کو منظور کرتے ہیں، تجارت کرتے ہیں یا ٹرانسفر کرتے ہیں تو آپ کے لین دین یہاں ظاہر ہوں گے۔", - "home.activity.empty.description.external": "جب یہ پرس لین دین کرتا ہے تو وہ یہاں ظاہر ہوں گے۔", - "home.activity.empty.title": "ابھی تک کوئی سرگرمی نہیں ہے۔", - "home.activity.error.load": "سرگرمی لوڈ نہیں ہو سکی", - "home.activity.title": "سرگرمی", - "home.banner.offline": "آپ آف لائن موڈ میں ہیں۔", - "home.banner.testnetMode": "آپ ٹیسٹ نیٹ موڈ میں ہیں۔", - "home.banner.testnetMode.nav": "آپ ٹیسٹ نیٹ موڈ میں ہیں۔ اسے ترتیبات میں ٹوگل کریں۔", - "home.empty.cexTransfer": "منتقلی", - "home.empty.cexTransfer.description": "تجارتی پلیٹ فارم سے فنڈز منتقل کریں۔", - "home.empty.transfer": "کرپٹو وصول کریں۔", - "home.empty.transfer.description": "دوسرے بٹوے سے فنڈز منتقل کریں۔", - "home.explore.footer": "ہزاروں ٹوکنز، NFTs، اور مزید دریافت کرنے کے لیے یہاں تھپتھپائیں۔", - "home.explore.title": "ٹوکن دریافت کریں۔", - "home.extension.error": "اکاؤنٹس لوڈ کرنے میں خرابی۔", - "home.label.buy": "خریدنے", - "home.label.for": "خریدیں/فروخت کریں۔", - "home.label.receive": "وصول کریں۔", - "home.label.send": "بھیجیں", - "home.label.swap": "تبادلہ", - "home.nfts.title": "NFTs", - "home.tokens.empty.action.buy.description": "ڈیبٹ کارڈ یا بینک اکاؤنٹ سے خریداری کریں۔", - "home.tokens.empty.action.buy.title": "کریپٹو لیں", - "home.tokens.empty.action.import.description": "تبادلہ اور بھیجنا شروع کرنے کے لیے اس بٹوے کی بازیابی کا جملہ درج کریں۔", - "home.tokens.empty.action.import.title": "پرس درآمد کریں۔", - "home.tokens.empty.action.receive.description": "دوسرے بٹوے یا اکاؤنٹ سے ٹرانسفر کریں۔", - "home.tokens.empty.action.receive.title": "کرپٹو وصول کریں۔", - "home.tokens.empty.description": "جب یہ پرس ٹوکن خریدتا یا وصول کرتا ہے، تو وہ یہاں ظاہر ہوں گے۔", - "home.tokens.empty.title": "ابھی تک کوئی ٹوکن نہیں ہے۔", - "home.tokens.empty.welcome.description": "تجارت شروع کرنے کے لیے فنڈز شامل کریں۔", - "home.tokens.error.fetch": "ٹوکن بیلنس حاصل کرنے میں ناکام", - "home.tokens.error.load": "ٹوکن بیلنس لوڈ نہیں ہو سکے۔", - "home.tokens.title": "ٹوکنز", - "home.upsell.receive.cta": "اکاؤنٹ سے", - "home.upsell.receive.title": "کرپٹو وصول کریں۔", - "home.warning.viewOnly": "یہ صرف دیکھنے والا پرس ہے۔", - "interface.metatags.description": "Ethereum، Base، Arbitrum، Polygon، Unichain اور مزید پر کرپٹو کو تبدیل کریں۔ DeFi پلیٹ فارم جس پر لاکھوں لوگوں کا بھروسہ ہے۔", - "interface.metatags.title": "Unswap انٹرفیس", - "landing.api": "API", - "landing.appsOverview": "ان تمام طریقوں کے لیے بنایا گیا ہے جنہیں آپ تبدیل کرتے ہیں۔", - "landing.blog.description": "کمپنی کی تازہ ترین خبروں، پروڈکٹ کی خصوصیات اور مزید کے بارے میں جانیں۔", - "landing.docs.description": "Uniswap کے ساتھ تعمیر شروع کرنے کے لیے ہماری ڈویلپر دستاویزات کی لائبریری کو دریافت کریں۔", - "landing.exploreUniverse": "یونیورس کو دریافت کریں۔", - "landing.getStarted": "دنیا کے سب سے بڑے DEX پر تجارت کریں۔", - "landing.helpCenter.body": "اکثر پوچھے گئے سوالات کو براؤز کریں اور امریکہ میں مقیم ہماری سپورٹ ٹیم سے تعاون حاصل کریں۔", - "landing.protocolDescription": "Unswap Labs کرپٹو میں سب سے زیادہ استعمال ہونے والی مصنوعات میں سے کچھ کو طاقت دیتا ہے۔ بغیر اجازت رسائی، ثابت شدہ سیکورٹی، اور سرشار تعاون کا تجربہ کریں۔", - "landing.protocolStats": "پروٹوکول کے اعدادوشمار کو تبدیل کریں۔", - "landing.provideLiquidity.body": "یونی سویپ انٹرفیس کا استعمال کرتے ہوئے لیکویڈیٹی فراہم کریں اور فیس جمع کریں۔", - "landing.provideLiquidity.subtitle": "پاور آنچین مارکیٹس۔", - "landing.socials": "Follow Uniswap Labs on X, Farcaster, LinkedIn, and TikTok", - "landing.swapBody": "گہری لیکویڈیٹی تک رسائی حاصل کریں، ٹوکن دریافت کریں، حد کے آرڈرز مقرر کریں، اور {{amount}} چینز میں ہزاروں ٹوکنز کے لیے لیکویڈیٹی فراہم کریں۔", - "landing.swapSubtitle": "اجازت کے بغیر تبادلہ۔", - "landing.tradingApi": "ٹریڈنگ API", - "landing.tradingApiBody": "وہی API استعمال کریں جو Uniswap Web App اور Wallet کو طاقت دیتا ہے، جس پر دنیا بھر کی سرکردہ ٹیمیں بھروسہ کرتی ہیں۔", - "landing.tradingApiButton": "Uniswap API کو مربوط کریں۔", - "landing.tradingApiSubtitle": "ڈی فائی، اپنے صارفین کو براہ راست۔", - "landing.trusted": "لاکھوں کا بھروسہ", - "landing.unichain.body": "DeFi کے لیے گھر بننے کے لیے بنائے گئے تیز رفتار، ڈی سینٹرلائزڈ Ethereum L2 پر کمیونٹی بلڈنگ میں شامل ہوں۔", - "landing.unichain.button": "تعمیر شروع کریں۔", - "landing.unichain.subtitle": "ڈی فائی چین۔", - "landing.uniswapX.body": "بغیر گیس کے لین دین اور MEV تحفظ، ناکام سویپ کے لیے صفر فیس کے ساتھ۔", - "landing.uniswapX.button": "UniswapX کا تجربہ کریں۔", - "landing.uniswapX.subtitle": "ہوشیار تبادلہ، صفر رگڑ۔", - "landing.walletBody": "لاکھوں ڈاؤن لوڈز، حقیقی انسانوں کی مدد، اور 4.8 درجہ بندی کے ساتھ قابل اعتماد سیلف-کسٹڈی کرپٹو والیٹ اور توسیع۔", - "landing.walletSubtitle": "تبادلہ کریں، اسٹور کریں، دریافت کریں۔", - "language.afrikaans": "افریقی", - "language.arabic": "عربی", - "language.catalan": "کاتالان", - "language.chineseSimplified": "آسان چینی زبان", - "language.chineseTraditional": "چینی، روایتی", - "language.czech": "چیک", - "language.danish": "ڈینش", - "language.dutch": "ڈچ", - "language.english": "انگریزی", - "language.finnish": "فنش", - "language.french": "فرانسیسی", - "language.greek": "یونانی", - "language.hebrew": "عبرانی", - "language.hindi": "ہندی", - "language.hungarian": "ہنگری", - "language.indonesian": "انڈونیشین", - "language.italian": "اطالوی", - "language.japanese": "جاپانی", - "language.korean": "کورین", - "language.malay": "مالائی", - "language.norwegian": "ناروے", - "language.polish": "پولش", - "language.portuguese": "پرتگالی", - "language.romanian": "رومانیہ", - "language.russian": "روسی", - "language.serbian": "سربیائی", - "language.spanishArgentina": "ہسپانوی (ارجنٹینا)", - "language.spanishBelize": "ہسپانوی (بیلیز)", - "language.spanishBolivia": "ہسپانوی (بولیویا)", - "language.spanishChile": "ہسپانوی (چلی)", - "language.spanishColombia": "ہسپانوی (کولمبیا)", - "language.spanishCostaRica": "ہسپانوی (کوسٹا ریکا)", - "language.spanishCuba": "ہسپانوی (کیوبا)", - "language.spanishDominicanRepublic": "ہسپانوی (ڈومینیکن ریپبلک)", - "language.spanishEcuador": "ہسپانوی (ایکواڈور)", - "language.spanishElSalvador": "ہسپانوی (ایل سلواڈور)", - "language.spanishGuatemala": "ہسپانوی (گوئٹے مالا)", - "language.spanishHonduras": "ہسپانوی (ہنڈراس)", - "language.spanishLatam": "ہسپانوی (لاطینی امریکہ)", - "language.spanishMexico": "ہسپانوی (میکسیکو)", - "language.spanishNicaragua": "ہسپانوی (نکاراگوا)", - "language.spanishPanama": "ہسپانوی (پاناما)", - "language.spanishParaguay": "ہسپانوی (پیراگوئے)", - "language.spanishPeru": "ہسپانوی (پیرو)", - "language.spanishPuertoRico": "ہسپانوی (پورٹو ریکو)", - "language.spanishSpain": "ہسپانوی (اسپین)", - "language.spanishUruguay": "ہسپانوی (یوروگوئے)", - "language.spanishUs": "ہسپانوی (امریکی)", - "language.spanishVenezuela": "ہسپانوی (وینزویلا)", - "language.swahili": "سواحلی", - "language.swedish": "سویڈش", - "language.turkish": "ترکی", - "language.ukrainian": "یوکرینی", - "language.urdu": "اردو", - "language.vietnamese": "ویتنامی", - "large.price.difference": "قیمت میں بڑا فرق", - "large.price.difference.tooltip": "اس تجارت کے ساتھ آگے بڑھنے کے نتیجے میں فنڈز کا نقصان ہوگا۔ یہ فرق بڑی تجارت یا کم لیکویڈیٹی کی وجہ سے ہو سکتا ہے۔", - "limit.open.count_one": "1 کھلی حد", - "limit.open.count_other": "{{count}} کھلی حدود", - "limitPrice.buyingAboveMarketPrice.error.description": "آپ کی حد قیمت مارکیٹ سے {{percentage}}% زیادہ ہے۔ آگے بڑھنے کے لیے اپنی حد کی قیمت کو ایڈجسٹ کریں۔", - "limitPrice.buyingAboveMarketPrice.error.title": "{{tokenSymbol}} مارکیٹ کی قیمت سے زیادہ خریدنا", - "limitPrice.marketPriceNotAvailable.error.description": "ہم موجودہ مارکیٹ قیمت کا حساب لگانے سے قاصر ہیں۔ مارکیٹ کی قیمت سے کم آرڈر جمع کرانے سے بچنے کے لیے، براہ کرم اپنا نیٹ ورک کنکشن چیک کریں اور دوبارہ کوشش کریں۔", - "limitPrice.marketPriceNotAvailable.error.title": "مارکیٹ قیمت دستیاب نہیں ہے۔", - "limitPrice.sellingBelowMarketPrice.error.description": "آپ کی حد قیمت مارکیٹ سے {{percentage}}% کم ہے۔ آگے بڑھنے کے لیے اپنی حد کی قیمت کو ایڈجسٹ کریں۔", - "limitPrice.sellingBelowMarketPrice.error.title": "مارکیٹ کی قیمت سے نیچے {{tokenSymbol}} فروخت کرنا", - "limits.form.disclaimer.mainnet": "صرف Ethereum مینیٹ ٹوکن حدود کے لیے دستیاب ہیں۔ ", - "limits.form.disclaimer.mainnet.short": "صرف مینیٹ ٹوکن حدود کے لیے دستیاب ہیں۔", - "limits.form.disclaimer.uniswapx": "جب ٹوکن متعین قیمت تک پہنچ جائیں تو حدیں بالکل ٹھیک نہیں ہو سکتی ہیں۔ ", - "limits.learnMore": "حدود کے بارے میں مزید جانیں۔", - "limits.price.input.label": "جب 1 کی قیمت ہوتی ہے۔", - "limits.price.label": "قیمت کو محدود کریں۔", - "limits.selectSupportedTokens": "تعاون یافتہ ٹوکن منتخب کریں۔", - "liquidity.hooks": "v4 پر ہکس", - "liquidity.hooks.address.input": "ہک ایڈریس درج کریں۔", - "liquidity.hooks.address.tooltip": "ہک ایڈریس: {{address}}", - "liquidity.learnMoreLabel": "لیکویڈیٹی کی فراہمی کے بارے میں جانیں۔", - "liquidity.notEnough.label": "درست USD قدر دکھانے کے لیے کافی لیکویڈیٹی نہیں ہے۔", - "liquidity.provideOnProtocols": "مختلف پروٹوکولز پر لیکویڈیٹی فراہم کرنا", - "liquidityPool.page.title": "یونی سویپ پر{{version}} پولز میں لیکویڈیٹی شامل کریں۔", - "liquidityPool.positions.closed.title": "بند پوزیشنز", - "liquidityPool.positions.loadingMore": "مزید پوزیشنیں لوڈ ہو رہی ہیں...", - "liquidityPool.positions.page.title": "Uniswap پر {{quoteSymbol}}/{{baseSymbol}} پول لیکویڈیٹی کا نظم کریں", - "liquidityPool.positions.page.version.description": "اپنی فعال {{version}} لیکویڈیٹی پوزیشنز دیکھیں۔ نئی پوزیشنیں شامل کریں۔", - "liquidityPool.positions.page.version.title": "یونی سویپ پر پول لیکویڈیٹی{{version}} کا نظم کریں۔", - "migrate.allowed": "اجازت ہے۔", - "migrate.allowLpMigration": "ایل پی ٹوکن کی منتقلی کی اجازت دیں۔", - "migrate.connectAccount": "آپ کو ایک اکاؤنٹ جوڑنا چاہیے جو اس پوزیشن کا مالک ہو۔", - "migrate.connectWallet": "اپنی V2 لیکویڈیٹی دیکھنے کے لیے بٹوے سے جڑیں۔", - "migrate.contract": "ہجرت کا معاہدہ تبدیل کریں۔", - "migrate.firstLP": "آپ اس Uniswap V3 پول کے لیے پہلے لیکویڈیٹی فراہم کنندہ ہیں۔ آپ کی لیکویڈیٹی موجودہ {{source}} قیمت پر منتقل ہو جائے گی۔", - "migrate.highGasCost": "آپ کے لین دین کی لاگت بہت زیادہ ہوگی کیونکہ اس میں پول بنانے کے لیے گیس شامل ہے۔", - "migrate.invalidRange": "غلط رینج منتخب کی گئی۔ کم از کم قیمت زیادہ سے زیادہ قیمت سے کم ہونی چاہیے۔", - "migrate.lpNFT": "{{symA}}/{{symB}} LP NFT", - "migrate.lpTokens": "{{symA}}/{{symB}} LP ٹوکنز", - "migrate.migrating": "ہجرت کرنا", - "migrate.missingV2Position": "آپ کی v2 پوزیشنوں میں سے ایک نظر نہیں آرہی ہے؟ اسے درآمد کریں۔", - "migrate.noV2Liquidity": "کوئی V2 لیکویڈیٹی نہیں ملی۔", - "migrate.positionNoFees": "آپ کی پوزیشن فیس حاصل نہیں کرے گی یا تجارت میں اس وقت تک استعمال نہیں ہوگی جب تک کہ مارکیٹ کی قیمت آپ کی حد میں نہ آجائے۔", - "migrate.priceDifference": "قیمت کا فرق: ", - "migrate.priceWarning": "آپ کو صرف اس قیمت پر Uniswap V3 میں لیکویڈیٹی جمع کرنی چاہیے جو آپ کے خیال میں درست ہے۔
اگر قیمت غلط معلوم ہوتی ہے، تو آپ قیمت کو منتقل کرنے کے لیے یا تو تبادلہ کر سکتے ہیں یا کسی اور کے ایسا کرنے کا انتظار کر سکتے ہیں۔", - "migrate.refund": "کم از کم {{amtA}} {{symA}} اور {{amtB}} {{symB}} منتخب کردہ قیمت کی حد کی وجہ سے آپ کے بٹوے میں واپس کر دیے جائیں گے۔", - "migrate.selectFeeTier": "فیس کا درجہ منتخب کریں۔", - "migrate.setRange": "قیمت کی حد مقرر کریں۔", - "migrate.symbolPrice": "{{protocolName}} {{tokenSymbol}} قیمت:", - "migrate.v2Description": "یہ ٹول محفوظ طریقے سے آپ کی {{source}} لیکویڈیٹی کو V3 میں منتقل کر دے گا۔ <0>Uniswap منتقلی کے معاہدے کی بدولت یہ عمل مکمل طور پر بے اعتبار ہے۔ ↗", - "migrate.v2Instruction": "ذیل میں دکھائے گئے ہر پول کے لیے، Uniswap V2 سے اپنی لیکویڈیٹی کو ہٹانے اور اسے Uniswap V3 میں جمع کرنے کے لیے منتقلی پر کلک کریں۔", - "migrate.v2Title": "V2 لیکویڈیٹی کو منتقل کریں۔", - "migrate.v3Price": "V3 {{sym}} قیمت:", - "mint.v3.input.invalidPrice.error": "غلط قیمت ان پٹ", - "mobileAppPromo.banner.getTheApp.link": "Unswap Wallet ایپ حاصل کریں۔", - "mobileAppPromo.banner.title": "بدلاؤ: کرپٹو اور این ایف ٹی والیٹ", - "moonpay.poweredBy": "MoonPay USA LLC کے ذریعے تقویت یافتہ Fiat onramp", - "nav.createAccount.button": "اکاؤنٹ بنائیں", - "nav.logIn.button": "لاگ ان کریں۔", - "nav.logInOrConnect.title": "لاگ ان کریں یا جڑیں۔", - "nav.products.tradingApi": "پروٹوکول کو مربوط کریں۔", - "nav.products.unichain": "ڈی فائی چین", - "nav.products.uniswapX": "میٹا ایگریگیٹر", - "nav.products.wallet": "تبادلہ کریں، اسٹور کریں، دریافت کریں۔", - "nav.signUp.button": "سائن اپ کریں۔", - "nav.tabs.createPosition": "پوزیشن بنائیں", - "nav.tabs.viewPositions": "پوزیشنیں دیکھیں", - "network.lostConnection": "ہو سکتا ہے آپ کا نیٹ ورک کنکشن ختم ہو گیا ہو۔", - "network.mightBeDown": "{{network}} ہو سکتا ہے ابھی بند ہو، یا آپ کا نیٹ ورک کنکشن ختم ہو گیا ہو۔", - "network.warning": "نیٹ ورک وارننگ", - "nft.noPools": "ابھی تک کوئی پول نہیں ہے۔", - "nft.reportSpam": "سپیم کے بطور رپورٹ کریں۔", - "notFound.oops": "افوہ، مجھے تبادلہ پر واپس لے جائیں۔", - "notice.uk": "یہ ویب ایپلیکیشن صارفین کے لیے ایک ٹول کے طور پر فراہم کی گئی ہے تاکہ وہ اپنی پہل پر یونی سویپ پروٹوکول کے ساتھ تعامل کر سکیں، بغیر کسی کریپٹو کرنسی کی تجارتی سرگرمیوں کی توثیق یا سفارش کے۔ ایسا کرتے ہوئے، Uniswap یہ سفارش نہیں کر رہا ہے کہ صارفین یا ممکنہ صارفین کرپٹو اثاثے کی تجارتی سرگرمی میں مشغول ہوں، اور ویب ایپلیکیشن کے صارفین یا ممکنہ صارفین کو اس ویب صفحہ یا اس کے مواد کو کسی بھی قسم کی سفارش، دعوت یا کرپٹو اثاثہ جات میں ڈیل کرنے کی ترغیب کے طور پر نہیں ماننا چاہیے۔ .", - "notice.uk.label": "یوکے ڈس کلیمر:", - "notification.assetVisibility.hidden": "{{assetName}} پوشیدہ", - "notification.assetVisibility.unhidden": "{{assetName}} چھپا ہوا ہے۔", - "notification.buy.network": "{{network}}پر خریدنا", - "notification.copied.address": "پتہ کاپی ہو گیا۔", - "notification.copied.calldata": "کالڈیٹا کاپی ہو گیا۔", - "notification.copied.contractAddress": "کنٹریکٹ ایڈریس کاپی ہو گیا۔", - "notification.copied.failed": "کلپ بورڈ پر کاپی کرنے میں ناکام", - "notification.copied.image": "تصویر کاپی ہو گئی۔", - "notification.copied.linkUrl": "لنک کاپی ہو گیا۔", - "notification.copied.nftUrl": "NFT URL کاپی ہو گیا۔", - "notification.copied.poolId": "پول آئی ڈی کاپی ہو گئی۔", - "notification.copied.tokenUrl": "ٹوکن URL کاپی ہو گیا۔", - "notification.copied.transactionId": "ٹرانزیکشن ID کاپی ہو گئی۔", - "notification.copied.unitag": "صارف نام کاپی ہو گیا۔", - "notification.countryChange": "{{countryName}}پر تبدیل ہو گیا۔", - "notification.limit.network": "{{network}}پر حد ترتیب بنانا", - "notification.lp.network": "{{network}}پر لیکویڈیٹی فراہم کرنا", - "notification.network.changed": "{{network}}پر تبدیل ہو گیا۔", - "notification.passwordChanged": "پاس ورڈ بدل گیا۔", - "notification.poolFinder.network": "{{network}}پر پول تلاش کریں۔", - "notification.restore.success": "پرس بحال ہو گیا!", - "notification.sell.network": "{{network}}پر فروخت ہو رہا ہے۔", - "notification.send.network": "{{network}}پر بھیج رہا ہے۔", - "notification.smartWallet.disabled": "1 نیٹ ورک پر غیر فعال", - "notification.smartWallet.disabled.all": "اسمارٹ والیٹ غیر فعال ہے۔", - "notification.smartWallet.disabled.plural": "{{amount}} نیٹ ورکس پر غیر فعال", - "notification.spam.NFT.failed": "NFT کی اطلاع نہیں دی جا سکی۔ بعد میں دوبارہ کوشش کریں۔", - "notification.spam.NFT.successful": "رپورٹ کیا", - "notification.swap.network": "{{network}}پر تبادلہ", - "notification.swap.pending.swap": "تبادلہ زیر التواء ہے۔", - "notification.swap.pending.unwrap": "کھولنا زیر التواء ہے۔", - "notification.swap.pending.wrap": "ریپ زیر التواء", - "notification.transaction.approve.canceled": "{{currencySymbol}} منظوری منسوخ کر دی گئی۔", - "notification.transaction.approve.fail": "{{address}}کے ساتھ استعمال کے لیے {{currencySymbol}} منظور کرنے میں ناکام۔", - "notification.transaction.approve.success": "{{address}}کے ساتھ استعمال کے لیے {{currencySymbol}} کی منظوری دی گئی۔", - "notification.transaction.pending": "لین دین زیر التواء ہے۔", - "notification.transaction.swap.canceled": "{{inputCurrencySymbol}}-{{outputCurrencySymbol}} تبادلہ منسوخ کر دیا گیا۔", - "notification.transaction.swap.expired": "{{inputCurrencyAmountWithSymbol}} برائے {{outputCurrencyAmountWithSymbol}} سویپ کی میعاد ختم ہو گئی۔", - "notification.transaction.swap.fail": "{{outputCurrencyAmountWithSymbol}}کے لیے {{inputCurrencyAmountWithSymbol}} تبدیل کرنے میں ناکام۔", - "notification.transaction.swap.success": "{{outputCurrencyAmountWithSymbol}}کے بدلے {{inputCurrencyAmountWithSymbol}} تبدیل کیا۔", - "notification.transaction.transfer.canceled": "منسوخ {{tokenNameOrAddress}} بھیجیں۔", - "notification.transaction.transfer.fail": "{{tokenNameOrAddress}} کو {{walletNameOrAddress}}کو بھیجنے میں ناکام", - "notification.transaction.transfer.received": "{{walletNameOrAddress}}سے {{tokenNameOrAddress}} موصول ہوا۔", - "notification.transaction.transfer.success": "{{tokenNameOrAddress}} کو {{walletNameOrAddress}}کو بھیجا گیا۔", - "notification.transaction.unknown.fail.full": "{{addressOrEnsName}}کے ساتھ لین دین کرنے میں ناکام", - "notification.transaction.unknown.fail.short": "لین دین ناکام ہو گیا۔", - "notification.transaction.unknown.success.full": "{{addressOrEnsName}}کے ساتھ لین دین کیا گیا۔", - "notification.transaction.unknown.success.short": "لین دین کی تصدیق ہو گئی۔", - "notification.transaction.unwrap.canceled": "{{inputCurrencySymbol}} کھولنا منسوخ کر دیا گیا۔", - "notification.transaction.unwrap.fail": "{{inputCurrencyAmountWithSymbol}}کھولنے میں ناکام۔", - "notification.transaction.unwrap.success": "{{inputCurrencyAmountWithSymbol}} کو کھولا اور {{outputCurrencyAmountWithSymbol}}موصول ہوا۔", - "notification.transaction.wrap.canceled": "{{inputCurrencySymbol}} ریپ منسوخ کر دیا گیا۔", - "notification.transaction.wrap.fail": "{{inputCurrencyAmountWithSymbol}}کو لپیٹنے میں ناکام۔", - "notification.transaction.wrap.success": "{{inputCurrencyAmountWithSymbol}} لپیٹ کر {{outputCurrencyAmountWithSymbol}}موصول ہوا۔", - "notification.transfer.pending": "زیر التواء بھیجیں۔", - "notification.walletConnect.confirmed": "{{dappName}}کے ساتھ لین دین کی تصدیق ہو گئی۔", - "notification.walletConnect.connected": "جڑا ہوا", - "notification.walletConnect.disconnected": "منقطع", - "notification.walletConnect.failed": "{{dappName}}کے ساتھ لین دین ناکام ہو گیا۔", - "notification.walletConnect.networkChanged.full": "{{networkName}}پر تبدیل ہو گیا۔", - "notification.walletConnect.networkChanged.short": "سوئچ کردہ نیٹ ورکس", - "notifications.scantastic.subtitle": "یونی سویپ ایکسٹینشن پر جاری رکھیں", - "notifications.scantastic.title": "کامیابی!", - "onboarding.backup.manual.banner": "ہم تجویز کرتے ہیں کہ اسے کاغذ کے ٹکڑے پر لکھیں اور اسے محفوظ جگہ پر محفوظ کریں، جیسے کہ محفوظ۔", - "onboarding.backup.manual.displayWarning.description": "جاری رکھنے سے پہلے درج ذیل کو غور سے پڑھیں۔", - "onboarding.backup.manual.displayWarning.note.access": "یہ بازیافت جملہ آپ کو اپنے بٹوے اور فنڈز تک مکمل رسائی فراہم کرتا ہے۔", - "onboarding.backup.manual.displayWarning.note.secure": "اسے نجی طور پر دیکھیں اور کسی کے ساتھ اس کا اشتراک نہ کریں۔", - "onboarding.backup.manual.displayWarning.note.storage": "اسے لکھ کر محفوظ جگہ پر رکھیں", - "onboarding.backup.manual.displayWarning.title": "جاننے کے لیے کچھ ضروری باتیں", - "onboarding.backup.manual.error": "غلط یا غلط ہجے والا لفظ", - "onboarding.backup.manual.placeholder": "خفیہ لفظ", - "onboarding.backup.manual.progress": "{{completedStepsCount}}مکمل ہوا{{totalStepsCount}}", - "onboarding.backup.manual.selectedWordPlaceholder": "لفظ منتخب کریں۔", - "onboarding.backup.manual.subtitle_one": "آپ کے بازیافت کے فقرے میں {{count}}st لفظ کیا ہے؟", - "onboarding.backup.manual.subtitle_two": "آپ کے بازیافت کے فقرے میں {{count}}nd لفظ کیا ہے؟", - "onboarding.backup.manual.subtitle_few": "آپ کے بازیافت کے فقرے میں {{count}}rd لفظ کیا ہے؟", - "onboarding.backup.manual.subtitle_other": "آپ کے بازیافت کے فقرے میں {{count}}واں لفظ کیا ہے؟", - "onboarding.backup.manual.title": "آئیے یقینی بنائیں کہ آپ نے اسے صحیح طریقے سے ریکارڈ کیا ہے۔", - "onboarding.backup.option.badge.quick": "جلدی", - "onboarding.backup.option.cloud.description": "{{cloudProviderName}}کے ذریعے اپنے بٹوے کا بیک اپ لیں، ریکوری پاس ورڈ سے محفوظ ہے۔", - "onboarding.backup.option.cloud.title": "ریکوری پاس ورڈ سیٹ کریں۔", - "onboarding.backup.option.manual.description": "اپنے 12 خفیہ الفاظ کو کاغذ کے ٹکڑے پر ریکارڈ کریں اور اسے محفوظ جگہ پر محفوظ کریں۔", - "onboarding.backup.option.manual.title": "بازیافت کا جملہ لکھیں۔", - "onboarding.backup.reminder.backupNowButton": "ابھی بیک اپ لیں۔", - "onboarding.backup.reminder.remindMeLaterButton": "مجھے بعد میں یاد دلائیں۔", - "onboarding.backup.reminder.title": "اپنے بٹوے کا بیک اپ لیں۔", - "onboarding.backup.reminder.warning.description": "اپنے بٹوے کا بیک اپ لیں تاکہ اگر آپ کبھی اپنا فون کھو دیں یا نیا حاصل کریں تو آپ اپنے اثاثوں کی بازیابی کر سکیں۔", - "onboarding.backup.reminder.warning.fundsLabel": "فنڈز خطرے میں ہیں۔", - "onboarding.backup.reminder.warning.title": "آپ اپنے فنڈز کھو سکتے ہیں۔", - "onboarding.backup.speedBump.cloud.description": "اگر آپ اسے کبھی بھول جاتے ہیں، تو ہم آپ کے لیے اسے دوبارہ ترتیب نہیں دے سکتے۔ اسے محفوظ جگہ پر لکھیں یا پاس ورڈ مینیجر میں محفوظ طریقے سے اسٹور کریں۔", - "onboarding.backup.speedBump.cloud.disclaimer": "میں سمجھتا ہوں کہ Uniswap Labs میرا ریکوری پاس ورڈ دوبارہ ترتیب نہیں دے سکتا۔", - "onboarding.backup.speedBump.cloud.title": "اس پاس ورڈ کو محفوظ کرنا ضروری ہے۔", - "onboarding.backup.speedBump.manual.description": "اس بات کو یقینی بنائیں کہ آپ نے اپنا بازیابی کا جملہ صحیح لکھا ہے اور اسے ذخیرہ کرنے کے لیے ایک محفوظ جگہ ہے۔", - "onboarding.backup.speedBump.manual.disclaimer": "میں سمجھتا ہوں کہ اگر میں اسے کھو دیتا ہوں تو Uniswap Labs میرا پرس بازیافت نہیں کر سکتا۔", - "onboarding.backup.speedBump.manual.title": "ختم ہونے سے پہلے...", - "onboarding.backup.subtitle": "اگر آپ ایپ کو حذف کرتے ہیں یا اپنا آلہ کھو دیتے ہیں تو اس طرح آپ اپنا بٹوہ بازیافت کریں گے۔", - "onboarding.backup.title.existing": "اپنے بٹوے کا بیک اپ لیں۔", - "onboarding.backup.title.new": "اپنا بیک اپ طریقہ منتخب کریں۔", - "onboarding.backup.view.subtitle.message1": "جاری رکھنے سے پہلے درج ذیل کو غور سے پڑھیں", - "onboarding.backup.view.subtitle.message2": "اپنے بٹوے کو بازیافت کرنے کے لیے آپ کو ان تمام 12 خفیہ الفاظ درج کرنے ہوں گے۔", - "onboarding.backup.view.title": "اپنی بازیابی کا جملہ لکھیں۔", - "onboarding.backup.view.warning.message1": "یہ بازیافت جملہ آپ کو اپنے بٹوے اور فنڈز تک مکمل رسائی فراہم کرتا ہے۔", - "onboarding.backup.view.warning.message2": "اسے لکھ کر محفوظ جگہ پر رکھیں", - "onboarding.backup.view.warning.message3": "اسے نجی طور پر دیکھیں اور کسی کے ساتھ اس کا اشتراک نہ کریں", - "onboarding.cloud.confirm.description": "آپ کو اپنے فنڈز کی وصولی کے لیے اسے درج کرنے کی ضرورت ہوگی۔ اگر آپ اسے کبھی بھول جاتے ہیں، تو ہم آپ کے لیے اسے دوبارہ حاصل نہیں کر سکتے۔", - "onboarding.cloud.confirm.title": "اپنے ریکوری پاس ورڈ کی تصدیق کریں۔", - "onboarding.cloud.createPassword.description": "آپ کو اپنے فنڈز کی وصولی کے لیے اسے درج کرنے کی ضرورت ہوگی۔ اگر آپ اسے کبھی بھول جاتے ہیں، تو ہم آپ کے لیے اسے دوبارہ حاصل نہیں کر سکتے۔", - "onboarding.cloud.createPassword.title": "اپنا ریکوری پاس ورڈ بنائیں", - "onboarding.complete.button": "Unswap ایکسٹینشن کھولیں۔", - "onboarding.complete.description": "آپ کا بٹوہ کرپٹو بھیجنے اور وصول کرنے کے لیے تیار ہے۔ نیچے دیے گئے شارٹ کٹ کے ساتھ Unswap ایکسٹینشن کھولیں۔", - "onboarding.complete.go_to_uniswap": "Unswap ویب ایپ پر جائیں۔", - "onboarding.complete.pin.description": "اپنے ٹول بار میں یونی سویپ ایکسٹینشن شامل کرنے کے لیے پن آئیکن پر کلک کریں۔", - "onboarding.complete.pin.title": "پن یونی سویپ ایکسٹینشن", - "onboarding.complete.title": "آپ بالکل تیار ہیں۔", - "onboarding.extension.biometrics.subtitle.fingerprint": "صرف اپنے فنگر پرنٹ کا استعمال کرتے ہوئے اپنے بٹوے تک جلدی اور محفوظ طریقے سے رسائی حاصل کریں۔", - "onboarding.extension.biometrics.title": "{{biometricsMethod}}کو فعال کریں۔", - "onboarding.extension.password.subtitle": "آپ کو اپنے بٹوے کو غیر مقفل کرنے اور اپنے بازیابی کے جملہ تک رسائی حاصل کرنے کے لیے اس کی ضرورت ہوگی۔", - "onboarding.extension.password.title.default": "پاسورڈ بنائیں", - "onboarding.extension.password.title.reset": "آپ کا پاس ورڈ دوبارہ ترتیب دیں", - "onboarding.extension.unsupported.android.description": "Uniswap ایکسٹینشن صرف ڈیسک ٹاپ پر Chrome کے ساتھ مطابقت رکھتا ہے۔", - "onboarding.extension.unsupported.android.title": "موبائل پر کروم تعاون یافتہ نہیں ہے (ابھی تک)", - "onboarding.extension.unsupported.description": "Unswap ایکسٹینشن ابھی صرف کروم کے ساتھ مطابقت رکھتا ہے۔", - "onboarding.extension.unsupported.title": "یہ براؤزر تعاون یافتہ نہیں ہے (ابھی تک)", - "onboarding.home.intro.backup.description.extension": "اپنے بازیابی کے جملے کو محفوظ کریں تاکہ یہ یقینی بنایا جا سکے کہ آپ کبھی بھی اپنے بٹوے تک رسائی سے محروم نہ ہوں۔", - "onboarding.home.intro.backup.description.mobile": "اگر آپ کبھی اپنا فون کھو دیتے ہیں یا نیا حاصل کرتے ہیں تو بازیابی کا منصوبہ ترتیب دیں۔", - "onboarding.home.intro.backup.title": "اپنے بٹوے کا بیک اپ لیں۔", - "onboarding.home.intro.bridgedAssets.description": "SOL، WIF، BONK، اور JUP — اب Unichain پر دستیاب ہے۔", - "onboarding.home.intro.bridgedAssets.title": "Unichain پر نئے ٹوکن کی تجارت کریں۔", - "onboarding.home.intro.fund.description": "کرپٹو خرید کر یا دوسرے اکاؤنٹ سے ٹرانسفر کر کے اپنے بٹوے کو فنڈ دیں۔", - "onboarding.home.intro.fund.title": "اپنا پہلا ٹوکن حاصل کریں۔", - "onboarding.home.intro.label.required": "درکار ہے۔", - "onboarding.home.intro.label.swipe": "سوائپ کریں۔", - "onboarding.home.intro.pushNotifications.description": "اپنے پسندیدہ ٹوکنز، مارکیٹ کے رجحانات، اور مزید پر قیمت کے انتباہات حاصل کریں۔", - "onboarding.home.intro.pushNotifications.title": "باخبر رہیں", - "onboarding.home.intro.unitag.description": "ایک ذاتی ویب 3 پروفائل بنائیں اور آسانی سے اپنے ایڈریس کو دوستوں کے ساتھ شیئر کریں۔", - "onboarding.home.intro.unitag.title": "اپنے {{unitagDomain}} صارف نام کا دعوی کریں۔", - "onboarding.import.error.invalidWords_one": "1 لفظ غلط یا غلط ہجے والا ہے۔", - "onboarding.import.error.invalidWords_other": "{{count}} الفاظ غلط یا غلط ہجے ہیں۔", - "onboarding.import.method.restore.message.android": "بٹوے شامل کریں جن کا آپ نے اپنے Google Drive اکاؤنٹ میں بیک اپ لیا ہے۔", - "onboarding.import.method.restore.message.ios": "بٹوے شامل کریں جن کا آپ نے اپنے iCloud اکاؤنٹ میں بیک اپ لیا ہے۔", - "onboarding.import.method.restore.title": "پرس بحال کریں۔", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.android": "Google Drive بیک اپ کے ذریعے اپنے بٹوے کو بحال کرنے کے لیے اپنا ریکوری پاس ورڈ درج کریں۔", - "onboarding.import.method.restoreSeedPhrase.cloud.desc.ios": "iCloud بیک اپ کے ذریعے اپنے بٹوے کو بحال کرنے کے لیے اپنا ریکوری پاس ورڈ درج کریں۔", - "onboarding.import.method.restoreSeedPhrase.cloud.title.android": "گوگل ڈرائیو سے بحال کریں۔", - "onboarding.import.method.restoreSeedPhrase.cloud.title.ios": "iCloud سے بحال کریں۔", - "onboarding.import.method.restoreSeedPhrase.title": "اپنے بٹوے کو بحال کرنے کا طریقہ منتخب کریں۔", - "onboarding.import.method.restoreSeedPhrase.wallet.desc": "اپنے 12 خفیہ الفاظ درج کریں جو آپ نے پہلے محفوظ جگہ پر رکھے تھے۔", - "onboarding.import.method.restoreSeedPhrase.wallet.title": "بازیابی کا جملہ درج کریں۔", - "onboarding.import.method.viewPrivateKeys.button.desc": "اپنی نجی کلید دیکھیں", - "onboarding.import.method.viewPrivateKeys.title": "مندرجہ بالا میں سے کوئی نہیں ہے؟ ", - "onboarding.import.onDeviceRecovery.other_options": "ایک مختلف پرس بنائیں یا درآمد کریں۔", - "onboarding.import.onDeviceRecovery.other_options.label": "مندرجہ بالا میں سے کوئی نہیں چاہتے؟", - "onboarding.import.onDeviceRecovery.subtitle": "منتخب کریں کہ آپ کس پرس میں دوبارہ لاگ ان کرنا چاہتے ہیں۔", - "onboarding.import.onDeviceRecovery.title": "Unswap میں دوبارہ خوش آمدید", - "onboarding.import.onDeviceRecovery.wallet.button": "بحالی کا جملہ دیکھیں", - "onboarding.import.onDeviceRecovery.wallet.count_one": "+1 دوسرا بٹوہ", - "onboarding.import.onDeviceRecovery.wallet.count_other": "+{{count}} دوسرے بٹوے", - "onboarding.import.onDeviceRecovery.warning.caption": "براہ کرم یقینی بنائیں کہ آپ نے دیگر تمام بٹوے کا بیک اپ لیا ہے۔ اگر آپ کبھی بھی انہیں بحال کرنا چاہتے ہیں، تو آپ کو ان کے بازیابی کے فقرے یا متعلقہ {{cloudProvider}} بیک اپس کی ضرورت ہوگی۔", - "onboarding.import.onDeviceRecovery.warning.title": "کیا تمہیں یقین ہے؟", - "onboarding.import.selectMethod.errorMessage": "ایک غیر متوقع خرابی پیش آگئی۔ براہ کرم دوبارہ کوشش کریں۔", - "onboarding.import.selectMethod.mobileApp.subtitle": "موبائل ایپ سے QR کوڈ کے ذریعے پرس درآمد کریں۔", - "onboarding.import.selectMethod.mobileApp.title": "Unswap موبائل استعمال کریں۔", - "onboarding.import.selectMethod.passkey.subtitle": "موجودہ پاسکی کا استعمال کرتے ہوئے اپنے یونی سویپ والیٹ کو سنک کریں۔", - "onboarding.import.selectMethod.passkey.title": "پاس کی کے ساتھ لاگ ان کریں۔", - "onboarding.import.selectMethod.recoveryPhrase.subtitle": "دوسرے کرپٹو والیٹ سے درآمد کریں۔", - "onboarding.import.selectMethod.recoveryPhrase.title": "بازیابی کا جملہ درج کریں۔", - "onboarding.import.selectMethod.title": "لاگ ان کریں یا پرس درآمد کریں۔", - "onboarding.import.title": "منتخب کریں کہ آپ اپنا بٹوہ کیسے شامل کرنا چاہتے ہیں۔", - "onboarding.importMnemonic.button.default": "میرا بازیافت جملہ 12 الفاظ کا ہے۔", - "onboarding.importMnemonic.button.importing": "درآمد کر رہا ہے...", - "onboarding.importMnemonic.button.longPhrase": "میرا بازیابی کا جملہ لمبا ہے۔", - "onboarding.importMnemonic.error.invalidPhrase": "آپ کا درج کردہ جملہ غلط ہے۔", - "onboarding.importMnemonic.subtitle": "اپنے 12 الفاظ پر مشتمل ریکوری کا جملہ ٹائپ یا پیسٹ کریں۔", - "onboarding.importMnemonic.title": "اپنی بازیابی کا جملہ درج کریں۔", - "onboarding.importPasskey.bringWindowToFront": "کھڑکی کو سامنے لاؤ", - "onboarding.importPasskey.continueInSecureWindow": "محفوظ سائن ان ونڈو میں جاری رکھیں۔", - "onboarding.intro.button.alreadyHave": "میرے پاس پہلے سے ہی پرس ہے۔", - "onboarding.intro.button.logInOrImport": "لاگ ان کریں یا درآمد کریں۔", - "onboarding.intro.mobileScan.button": "درآمد کرنے کے لیے QR کوڈ اسکین کریں۔", - "onboarding.intro.mobileScan.title": "Uniswap ایپ ہے؟", - "onboarding.landing.button.add": "ایک موجودہ پرس شامل کریں۔", - "onboarding.landing.button.create": "ایک نیا پرس بنائیں", - "onboarding.landing.button.createAccount": "ایک اکاؤنٹ بنائیں", - "onboarding.name.choose": "ایک صارف نام منتخب کریں۔", - "onboarding.name.choose.subtitle": "یہ ایک عوامی نام ہے جسے کوئی بھی آپ کو کرپٹو بھیجنے کے لیے استعمال کر سکتا ہے۔", - "onboarding.notification.permission.message": "اطلاعات موصول کرنے کے لیے، اپنے آلے کی ترتیبات میں Unswap Wallet کے لیے اطلاعات کو آن کریں۔", - "onboarding.notification.permission.title": "اطلاعات کی اجازت", - "onboarding.notification.subtitle": "لین دین کے حالات اور پسندیدہ ٹوکنز کی قیمتوں میں اہم تبدیلیوں کے بارے میں اپ ڈیٹ رہیں۔", - "onboarding.notification.title": "اطلاعات کو آن کریں۔", - "onboarding.passkey.create": "اپنی پاسکی بنائیں", - "onboarding.passkey.loading.subtitle": "اس میں صرف ایک سیکنڈ لگنا چاہیے۔", - "onboarding.passkey.loading.title": "آپ کا پرس تلاش کیا جا رہا ہے...", - "onboarding.passkey.secure": "اپنے اکاؤنٹ کو محفوظ بنائیں", - "onboarding.passkey.secure.description": "پاسکیز آپ کو صرف اپنے چہرے یا فنگر پرنٹ کا استعمال کرکے اپنے اکاؤنٹ تک فوری اور محفوظ طریقے سے رسائی کی اجازت دیتی ہیں۔", - "onboarding.recoveryPhrase.confirm.subtitle.combined": "آئیے تصدیق کرتے ہیں کہ آپ نے اسے صحیح سمجھا۔ اگر آپ اسے کھو دیتے ہیں یا اسے غلط طریقے سے لکھ دیتے ہیں، تو آپ اپنے فنڈز واپس نہیں کر پائیں گے۔", - "onboarding.recoveryPhrase.confirm.subtitle.default": "اگر آپ اسے کھو دیتے ہیں یا اسے غلط طریقے سے لکھ دیتے ہیں، تو آپ اپنے فنڈز واپس نہیں کر پائیں گے۔", - "onboarding.recoveryPhrase.confirm.title": "آئیے تصدیق کرتے ہیں کہ آپ نے اسے صحیح سمجھا", - "onboarding.recoveryPhrase.view.subtitle": "اپنے بٹوے کو بازیافت کرنے کے لیے آپ کو ان تمام 12 خفیہ الفاظ درج کرنے ہوں گے۔", - "onboarding.recoveryPhrase.view.title": "اپنی بازیابی کا جملہ لکھیں۔", - "onboarding.recoveryPhrase.view.title.hasPassword": "اگر آپ کبھی اپنا پاس ورڈ بھول جاتے ہیں...", - "onboarding.recoveryPhrase.warning.final.button": "میں تیار ہوں", - "onboarding.recoveryPhrase.warning.final.message": "آپ کی بازیابی کا جملہ وہی ہے جو آپ کو (اور جس کے پاس ہے) آپ کے فنڈز تک رسائی فراہم کرتا ہے۔ اسے اپنے پاس ضرور رکھیں۔", - "onboarding.recoveryPhrase.warning.final.title": "یہ قدم کسی نجی جگہ پر کریں۔", - "onboarding.recoveryPhrase.warning.screenshot.message": "آپ کی تصاویر تک رسائی حاصل کرنے والا کوئی بھی شخص آپ کے بٹوے تک رسائی حاصل کر سکتا ہے۔ ہمارا مشورہ ہے کہ آپ اس کے بجائے اپنے الفاظ لکھ لیں۔", - "onboarding.recoveryPhrase.warning.screenshot.title": "اسکرین شاٹس محفوظ نہیں ہیں۔", - "onboarding.resetPassword.complete.safety": "بٹوے کی حفاظت کے بارے میں مزید جانیں۔", - "onboarding.resetPassword.complete.subtitle": "اپنے بٹوے کو غیر مقفل کرنے کے لیے اپنا نیا پاس ورڈ استعمال کریں۔", - "onboarding.resetPassword.complete.title": "پاس ورڈ ری سیٹ", - "onboarding.scan.error": "QR کوڈ لوڈ کرنے میں ایک خرابی تھی۔", - "onboarding.scan.otp.error": "آپ کا جمع کردہ کوڈ غلط ہے، یا جمع کرانے میں ایک خامی تھی۔ دوبارہ کوشش کریں.", - "onboarding.scan.otp.failed": "ناکام کوششیں: {{number}}", - "onboarding.scan.otp.subtitle": "6-حروف کے کوڈ کے لیے اپنا یونیسیاپ موبائل ایپ چیک کریں۔", - "onboarding.scan.otp.title": "ایک بار کا کوڈ درج کریں۔", - "onboarding.scan.subtitle": "اپنے بٹوے کی درآمد شروع کرنے کے لیے یونی سویپ موبائل ایپ سے QR کوڈ اسکین کریں۔", - "onboarding.scan.title": "ایپ سے پرس درآمد کریں۔", - "onboarding.scan.troubleScanning.message": "بازیافت کے فقرے کے ذریعے درآمد کریں۔", - "onboarding.scan.troubleScanning.title": "سکین کرنے میں دشواری؟", - "onboarding.scan.wifi": "اپنے فون کو اسی WiFi نیٹ ورک سے جوڑیں جس میں آپ کا کمپیوٹر ہے۔", - "onboarding.security.alert.biometrics.message.android": "بائیو میٹرکس استعمال کرنے کے لیے، اسے پہلے سیٹنگز میں سیٹ کریں۔", - "onboarding.security.alert.biometrics.message.ios": "{{biometricsMethod}}استعمال کرنے کے لیے، سسٹم سیٹنگز میں رسائی کی اجازت دیں۔", - "onboarding.security.alert.biometrics.title.android": "بائیو میٹرکس غیر فعال ہے۔", - "onboarding.security.alert.biometrics.title.ios": "{{biometricsMethod}} غیر فعال ہے۔", - "onboarding.security.button.confirm.android": "بایومیٹرکس کو فعال کریں۔", - "onboarding.security.button.confirm.ios": "{{biometricsMethod}}کو فعال کریں۔", - "onboarding.security.button.setup": "سیٹ اپ", - "onboarding.security.subtitle.android": "لین دین بھیجنے کے لیے بائیو میٹرکس کی ضرورت کے ذریعے سیکیورٹی کی ایک اضافی پرت شامل کریں۔", - "onboarding.security.subtitle.ios": "لین دین بھیجنے کے لیے {{biometricsMethod}} کی ضرورت کے ذریعے سیکیورٹی کی ایک اضافی پرت شامل کریں۔", - "onboarding.security.title": "اپنے بٹوے کی حفاظت کریں۔", - "onboarding.selectWallets.error": "پتے لوڈ نہیں ہو سکے۔", - "onboarding.selectWallets.title.default": "درآمد کرنے کے لیے بٹوے کا انتخاب کریں۔", - "onboarding.selectWallets.title.error": "بٹوے درآمد کرنے میں خرابی۔", - "onboarding.termsOfService": "جاری رکھ کر، میں سروس کی شرائط سے اتفاق کرتا ہوں اور رازداری کی پالیسیسے اتفاق کرتا ہوں", - "onboarding.tooltip.recoveryPhrase.trigger": "بازیابی کا جملہ کیا ہے؟", - "onboarding.wallet.continue": "آئیے اسے محفوظ رکھیں", - "onboarding.wallet.defaultName": "والیٹ {{number}}", - "onboarding.wallet.description.full": "ٹوکنز، NFTs، اور آپ کی تمام تجارتوں کے لیے یہ آپ کی ذاتی جگہ ہے۔ اپنے فنڈز کو محفوظ رکھنے کے لیے اسے ترتیب دینا مکمل کریں۔", - "onboarding.wallet.title": "آپ کے نئے بٹوے میں خوش آمدید", - "onboarding.welcome.subtitle": "آئیے آپ کے بٹوے کا سیٹ اپ مکمل کریں۔", - "onboarding.welcome.title": "خوش آمدید!", - "outageBanner.message": "{{chainName}}{{versionDescription}} ڈیٹا ابھی دستیاب نہیں ہے، لیکن ہم امید کرتے ہیں کہ مسئلہ جلد ہی حل ہو جائے گا۔", - "outageBanner.message.sub": "آپ اب بھی بغیر کسی مسئلے کے اس چین پر لیکویڈیٹی کو تبدیل اور فراہم کر سکتے ہیں۔", - "outageBanner.title": "{{versionName}} جلد ہی واپس آجائے گا۔", - "passkeys.help.modal.subtitle": "اگر آپ کو پاس کیز کے ساتھ پریشانی ہو رہی ہے تو مدد کے لیے یونی سویپ سپورٹ پر جائیں۔", - "passkeys.help.modal.subtitle.invalidPasskey": "آپ کی درخواست مکمل نہیں ہو سکی۔ براہ کرم اس سے وابستہ پاس کی کو استعمال کرکے دوبارہ کوشش کریں۔ ", - "passkeys.help.modal.subtitle.technicalError": "آپ کی درخواست ایک غیر متوقع تکنیکی خرابی کی وجہ سے مکمل نہیں ہو سکی۔ آپ کے فنڈز محفوظ ہیں۔ براہ کرم دوبارہ کوشش کریں۔", - "passkeys.help.modal.title": "مدد چاہیے؟", - "passkeys.help.modal.title.invalidPasskey": "غلط پاسکی", - "passkeys.help.modal.title.technicalError": "تکنیکی خرابی۔", - "passkeys.manage.modal.subtitle": "پاس کیز کو شامل کرنے یا ہٹانے کے لیے، براہ کرم {{passkeyManagementUrl}}میں سائن ان کریں۔", - "passkeys.manage.modal.title": "پاسکیز کا نظم کریں۔", - "permit.approval.fail": "اجازت نامے کی منظوری ناکام ہو گئی۔", - "permit.approval.fail.message": "پرمٹ 2 ٹوکن منظوریوں کو مختلف ایپلی کیشنز میں شیئر کرنے اور ان کا نظم کرنے کی اجازت دیتا ہے۔", - "pool.activeRange": "فعال ٹک رینج", - "pool.addAs": "{{nativeWrappedSymbol}}کے بطور شامل کریں۔", - "pool.apr": "اپریل", - "pool.apr.base": "بیس اپریل", - "pool.apr.description": "1 دن کی فیس پر مبنی سالانہ", - "pool.apr.reward": "انعام اپریل", - "pool.aprText": "پول اے پی آر", - "pool.balances": "پول بیلنس", - "pool.closedCTA.description": "آپ صفحہ کے اوپری حصے میں فلٹر کا استعمال کرکے انہیں دیکھ سکتے ہیں۔", - "pool.closedCTA.title": "اپنی بند پوزیشنوں کی تلاش ہے؟", - "pool.collectAs": "{{nativeWrappedSymbol}}کے بطور جمع کریں۔", - "pool.collectFees": "فیس جمع کریں۔", - "pool.connectEthereumToView": "اپنے پولز کو دیکھنے کے لیے Ethereum والیٹ کو جوڑیں۔", - "pool.create": "نیا پول بنانا", - "pool.create.info": "آپ کے انتخاب ایک نیا لیکویڈیٹی پول بنائیں گے جس کے نتیجے میں ابتدائی لیکویڈیٹی کم ہو سکتی ہے اور اتار چڑھاؤ میں اضافہ ہو سکتا ہے۔ ان خطرات کو کم کرنے کے لیے موجودہ پول میں شامل کرنے پر غور کریں۔", - "pool.createdPosition": "پوزیشن بنائی", - "pool.createdPosition.canceled": "پوزیشن بنائیں منسوخ کر دی گئی۔", - "pool.createdPosition.failed": "پوزیشن بنانا ناکام ہو گیا۔", - "pool.dynamic": "متحرک پول", - "pool.earnings": "کمائی", - "pool.earnings.empty": "آپ کی ابھی تک کوئی کمائی نہیں ہے۔", - "pool.explorers": "متلاشی", - "pool.import": "پول درآمد کریں۔", - "pool.import.link.description": "کچھ v2 پوزیشنز خود بخود ظاہر نہیں ہوتی ہیں۔", - "pool.import.positions.v2": "V2 پوزیشنیں درآمد کریں۔", - "pool.import.positions.v2.selectPair.description": "کچھ v2 پوزیشنز خود بخود ظاہر نہیں ہوتی ہیں۔ درآمد کرنے اور اپنی پوزیشن دیکھنے کے لیے ایک ٹوکن جوڑا منتخب کریں۔", - "pool.import.success": "پول درآمد شدہ", - "pool.incentives.administeredRewards": "انعامات خود مختار مرکل ڈسٹری بیوٹر کے معاہدے کے ذریعے تقسیم کیے جاتے ہیں۔", - "pool.incentives.collect": "جمع کرنا", - "pool.incentives.collectedRewards": "جمع شدہ انعامات", - "pool.incentives.collectFailed": "جمع کرنا ناکام ہوگیا، براہ کرم دوبارہ کوشش کریں۔", - "pool.incentives.collectFailedNoRetry": "انعامات جمع کرنے میں ناکام۔", - "pool.incentives.collectingRewards": "انعامات جمع کرنا", - "pool.incentives.collectRewards": "انعامات جمع کریں۔", - "pool.incentives.collectRewardsCanceled": "منسوخ شدہ انعامات جمع کریں۔", - "pool.incentives.daysLeft": "دن رہ گئے", - "pool.incentives.eligible": "اہل پولز کے پاس ٹوکن انعامات ہیں تاکہ آپ مزید کما سکیں", - "pool.incentives.merklDocs": "مرکل کی طرف سے اخراج انعامات اور پول TVL سے شمار کیا جاتا ہے۔", - "pool.incentives.rewardsDistribution": "انعامات کی تقسیم", - "pool.incentives.rewardsEarned": "انعامات حاصل کئے", - "pool.incentives.similarPoolHasRewards": "اسی طرح کے پول میں UNI کے انعامات ہیں۔", - "pool.incentives.switchPools": "تالابوں کو سوئچ کریں۔", - "pool.incentives.timePeriod": "وقت کی مدت", - "pool.incentives.uni.findMore": "UNI انعامات کے ساتھ پول تلاش کریں۔", - "pool.incentives.yourRewards.error": "آپ کے انعامات ابھی دستیاب نہیں ہیں۔", - "pool.incentives.yourRewards.error.description": "انعامات حاصل نہیں کیے جا سکے۔ یہ نیٹ ورک کے مسئلے کی وجہ سے ہو سکتا ہے۔ صفحہ کو دوبارہ لوڈ کرنے کی کوشش کریں۔", - "pool.info": "پول کی معلومات", - "pool.limitFluctuation.warning": "براہ کرم آگاہ رہیں کہ ریئل ٹائم مارکیٹ کے اتار چڑھاو اور Ethereum نیٹ ورک کی بھیڑ کی بنیاد پر حدوں کا نفاذ مختلف ہو سکتا ہے۔ جب ٹوکن متعین قیمت تک پہنچ جائیں تو حدیں بالکل ٹھیک نہیں ہوسکتی ہیں۔", - "pool.liquidity.data.error.message": "آپ کے لین دین کے لیے درکار ڈیٹا حاصل کرنے میں ایک خرابی تھی۔", - "pool.liquidity.outOfSync": "پول اور مارکیٹ کی قیمت میں مماثلت نہیں ہے۔", - "pool.liquidity.outOfSync.message": "اس پول میں قیمتیں منتخب ٹوکنز کی مارکیٹ کی قیمتوں سے مختلف ہوتی ہیں۔ اس کے مطابق اپنی قیمت کی حد کو ایڈجسٹ کریں یا نقصان سے بچنے کے لیے پول کے دوبارہ توازن کا انتظار کریں۔", - "pool.maxPrice": "زیادہ سے زیادہ قیمت", - "pool.migrateLiquidity": "لیکویڈیٹی کو منتقل کریں۔", - "pool.migrateLiquidityDisabledTooltip": "یہ سلسلہ v4 لیکویڈیٹی پولز کو سپورٹ نہیں کرتا ہے۔", - "pool.migrateToV4": "v4 پر منتقل کریں۔", - "pool.minPrice": "کم از کم قیمت", - "pool.newPosition.plus": "+ نئی پوزیشن", - "pool.newPosition.title": "نئی پوزیشن", - "pool.newSpecificPosition": "نئی {{symbol}} پوزیشن", - "pool.notAvailableOnSolana": "سولانا پر پول دستیاب نہیں ہیں۔", - "pool.notFound.description": "معذرت، ہمیں اس پول کے لیے کوئی معلومات نہیں مل سکیں۔ نام اور پتہ چیک کریں اور دوبارہ کوشش کریں۔", - "pool.notFound.title": "پول نہیں ملا", - "pool.openToStart.evmAndSolanaConnected": "شروع کرنے کے لیے ایک نئی پوزیشن کھولیں یا ایک پول بنائیں۔ سولانا پر پول دستیاب نہیں ہیں۔", - "pool.openToStart.evmOnly": "شروع کرنے کے لیے ایک نئی پوزیشن کھولیں یا ایک پول بنائیں۔", - "pool.percent": "{{pct}}% پول", - "pool.pooled": "جمع شدہ {{sym}}:", - "pool.position": "پوزیشن", - "pool.positions": "عہدے", - "pool.positions.title": "آپ کے عہدے", - "pool.positions.transaction.settings": "لین دین کی ترتیبات", - "pool.positions.usdValueUnavailable": "USD قدر دستیاب نہیں ہے۔", - "pool.positions.usdValueUnavailable.tooltip": "USD قدر فی الحال اس پوزیشن کے لیے دستیاب نہیں ہے۔ جمع شدہ ٹوکن رقوم کے لیے پوزیشن کی تفصیلات دیکھیں۔", - "pool.refresh.prices": "قیمتیں تازہ کریں۔", - "pool.removeLiquidity": "لیکویڈیٹی کو ہٹا دیں۔", - "pool.rewardAPR": "انعام اپریل (یو این آئی)", - "pool.rewardAPR.percent": "{{pct}} انعام APR", - "pool.rewards": "انعامات", - "pool.rewardsPool.label": "انعامات کے تالاب میں پول ٹوکن:", - "pool.selectPair": "جوڑا منتخب کریں۔", - "pool.share.label": "آپ کا پول شیئر:", - "pool.specificPosition": "{{symbol}} پوزیشن", - "pool.tokenPair": "ٹوکن جوڑا", - "pool.top.rewards": "انعامات کے ساتھ پول", - "pool.top.tvl": "TVL کے ذریعہ ٹاپ پولز", - "pool.top.volume": "24H والیوم کے حساب سے پول", - "pool.totalAPR": "کل اپریل", - "pool.totalTokens": "آپ کے کل پول ٹوکنز:", - "pool.v2": "v2 تالاب", - "pool.v3": "v3 تالاب", - "pool.via": "{{tokenPair}} بذریعہ {{dex}}", - "pool.volOverTvl": "1D والیوم/TVL", - "pool.volume.thirtyDay": "30 دن کا حجم", - "pool.volume.thirtyDay.short": "30D والیوم", - "pool.withdrawAs": "{{nativeWrappedSymbol}}کے بطور واپس لیں۔", - "poolFinder.availablePools": "دستیاب تالاب", - "poolFinder.availablePools.found.description": "آپ کے جوڑے کے انتخاب سے مماثل v2 پول۔", - "poolFinder.availablePools.notFound.description": "کوئی مماثل v2 پول نہیں ملا۔ اپنے ٹوکن کے انتخاب کو دو بار چیک کریں اور یقینی بنائیں کہ آپ صحیح بٹوے سے جڑے ہوئے ہیں۔", - "pools.explore": "تالابوں کو دریافت کریں۔", - "portfolio.activity.filters.timePeriod.all": "تمام وقت", - "portfolio.activity.filters.transactionType.all": "تمام اقسام", - "portfolio.activity.filters.transactionType.deposits": "جمع", - "portfolio.activity.filters.transactionType.staking": "سٹیکنگ", - "portfolio.activity.filters.transactionType.swaps": "ادل بدل", - "portfolio.activity.title": "سرگرمی", - "portfolio.connectWallet.summary": "{{amount}}+ نیٹ ورکس میں ٹوکنز، پولز اور مزید کو ٹریک کریں۔", - "portfolio.defi.title": "ڈی فائی", - "portfolio.description": "تمام زنجیروں اور پروٹوکولز میں اپنے کریپٹو پورٹ فولیو کو ٹریک کریں۔", - "portfolio.nfts.title": "NFTs", - "portfolio.overview.title": "جائزہ", - "portfolio.title": "پورٹ فولیو", - "portfolio.tokens.table.column.allocation": "مختص", - "portfolio.tokens.table.column.balance": "بقیہ", - "portfolio.tokens.table.column.change1d": "1D تبدیلی", - "portfolio.tokens.table.column.price": "قیمت", - "portfolio.tokens.table.column.token": "ٹوکن", - "portfolio.tokens.table.column.value": "قدر", - "portfolio.tokens.title": "ٹوکنز", - "position.addHook": "ایک ہک شامل کریں۔", - "position.addHook.tooltip": "ہکس ایک جدید خصوصیت ہے جو پولز کو سمارٹ کنٹریکٹس کے ساتھ تعامل کرنے کے قابل بناتی ہے، مختلف صلاحیتوں کو کھول کر۔ ہکس شامل کرتے وقت احتیاط برتیں، کیونکہ کچھ نقصان دہ ہو سکتے ہیں یا غیر ارادی نتائج کا سبب بن سکتے ہیں۔", - "position.addingHook": "ہک شامل کرنا", - "position.addingHook.disclaimer": "ہکس شامل کرنے کے غیر ارادی نتائج ہو سکتے ہیں۔ اپنی تحقیق کریں اور اپنی ذمہ داری پر آگے بڑھیں۔", - "position.addingHook.hideProperties": "پراپرٹیز چھپائیں۔", - "position.addingHook.invalidAddress": "ایک درست ہک ایڈریس درج کریں۔", - "position.addingHook.viewProperties": "پراپرٹیز دیکھیں", - "position.create.confirm": "پوزیشن کی تصدیق کریں۔", - "position.create.invalidPrice": "غلط قیمت", - "position.create.invalidRange": "غلط رینج", - "position.create.modal.header": "پوزیشن بنانا", - "position.create.unsupportedSolana": "سولانا پولز کی حمایت نہیں کی جاتی ہے۔", - "position.create.unsupportedSolana.description": "ایک پول بنانے کے لیے، معاون EVM چین پر سوئچ کریں۔", - "position.create.unsupportedToken.description": "ایک مختلف پروٹوکول ورژن کے ساتھ بنانے کی کوشش کریں۔", - "position.create.v2unsupportedChain": "یہ سلسلہ v2 پولز کے لیے تعاون یافتہ نہیں ہے۔", - "position.currentValue": "موجودہ پوزیشن کی قیمت", - "position.default_price_strategies": "قیمت کی حکمت عملی", - "position.default_price_strategies.error": "قیمت کی حکمت عملی ترتیب دینے سے قاصر", - "position.deposit.confirm.create.description.less": "درج کردہ ابتدائی قیمت {{value}}% مارکیٹ کی قیمت سے کم ہے اور اس کے نتیجے میں فنڈز کا نقصان ہو سکتا ہے۔ کیا آپ آگے بڑھنا چاہتے ہیں؟", - "position.deposit.confirm.create.description.more": "درج کی گئی ابتدائی قیمت {{value}}% مارکیٹ قیمت سے زیادہ ہے اور اس کے نتیجے میں فنڈز کا نقصان ہو سکتا ہے۔ کیا آپ آگے بڑھنا چاہتے ہیں؟", - "position.deposit.confirm.create.title": "مارکیٹ کے ساتھ قیمت کا بڑا فرق", - "position.deposit.description": "اپنی لیکویڈیٹی شراکت کے لیے ٹوکن کی رقم کی وضاحت کریں۔", - "position.depositedCurrency": "جمع شدہ {{currencySymbol}}", - "position.fot.warning": "{{token}} اور دیگر \"منتقلی پر فیس\" ٹوکنز صرف Uniswap v2 کے ذریعے تعاون یافتہ ہیں۔", - "position.fot.warning.cta": "v2 پوزیشن بنائیں", - "position.hook.disclaimer": "میں اس ہک کو شامل کرنے میں شامل ممکنہ خطرات کو سمجھتا ہوں۔", - "position.hook.donateWarning": "اس جھنڈے کے نتیجے میں کمائی گئی فیسوں میں تبدیلی ہو سکتی ہے۔", - "position.hook.liquidityWarning": "یہ جھنڈا پول کو نئی لیکویڈیٹی کے اضافے کو روکنے کا سبب بن سکتا ہے۔ آپ کا لین دین واپس ہو سکتا ہے۔", - "position.hook.removeWarning": "آپ کے فنڈز کو لاک کرنے یا آپ کو فیس جمع کرنے سے روک سکتا ہے۔", - "position.hook.swapWarning": "یہ جھنڈا لیکویڈیٹی فراہم کرنے والوں کو جسٹ ان ٹائم لیکویڈیٹی سے زیادہ آسانی سے فائدہ اٹھانے کی اجازت دے سکتا ہے، جس کے نتیجے میں کم فیس کمائی جا سکتی ہے۔", - "position.hook.warningHeader": "اہم: ہک کے خطرات کی نشاندہی کی گئی۔", - "position.hook.warningInfo": "ہم نے اس ہک کے ساتھ ممکنہ خطرات کی نشاندہی کی ہے۔ آگے بڑھنے کا فیصلہ کرنے سے پہلے براہ کرم یقینی بنائیں کہ آپ سمجھتے ہیں کہ یہ ہک کیسے کام کرتا ہے۔", - "position.increase.fot": "{{token}} اور دیگر \"ٹرانسفر پر فیس\" ٹوکنز کے لیے لیکویڈیٹی شامل کرنا تعاون یافتہ نہیں ہے۔", - "position.initialPrice": "ابتدائی قیمت", - "position.initialPrice.difference.negative": "{{ value }}% مارکیٹ قیمت سے کم", - "position.initialPrice.difference.positive": "{{ value }}% مارکیٹ قیمت سے زیادہ", - "position.initialPrice.info": "نیا پول بناتے وقت، آپ کو دونوں ٹوکنز کے لیے ابتدائی زر مبادلہ کی شرح مقرر کرنی چاہیے۔ یہ شرح مارکیٹ کی ابتدائی قیمت کی عکاسی کرے گی۔", - "position.initialPrice.set": "ابتدائی قیمت مقرر کریں۔", - "position.initialPrice.useMarketPrice": "مارکیٹ کی قیمت استعمال کریں۔", - "position.migrate.liquidity": "پوزیشنز کو منتقل کرتے وقت، آپ اپنے ٹوکن جوڑے کو تبدیل نہیں کر سکتے، لیکن آپ فعالیت کو بڑھانے کے لیے ایک ہک شامل کر سکتے ہیں۔", - "position.migrate.v4unsupportedChain": "یہ سلسلہ v4 پولز کے لیے تعاون یافتہ نہیں ہے۔", - "position.new": "نئی پوزیشن", - "position.new.protocol": "نئی {{protocol}} پوزیشن", - "position.notFound": "پوزیشن نہیں ملی", - "position.notFound.description": "اس پوزیشن کی تفصیلات دستیاب نہیں ہیں۔ براہ کرم چیک کریں کہ آپ صحیح بٹوے سے جڑے ہوئے ہیں۔", - "position.one_sided_lower": "یک طرفہ کم", - "position.one_sided_lower.description": "قیمت کم ہونے پر لیکویڈیٹی فراہم کریں۔", - "position.one_sided_upper": "یک طرفہ بالائی", - "position.one_sided_upper.description": "قیمت بڑھنے پر لیکویڈیٹی فراہم کریں۔", - "position.protocol": "{{protocol}} پوزیشن", - "position.provide.liquidity": "وہ ٹوکن منتخب کریں جن کے لیے آپ لیکویڈیٹی فراہم کرنا چاہتے ہیں۔ آپ تمام تعاون یافتہ نیٹ ورکس پر ٹوکن منتخب کر سکتے ہیں۔", - "position.provide.liquidityDescription": "مکمل رینج لیکویڈیٹی فراہم کرنا تمام ممکنہ قیمتوں میں مسلسل مارکیٹ کی شرکت کو یقینی بناتا ہے، سادگی کی پیشکش کرتا ہے لیکن زیادہ غیر مستقل نقصان کے امکانات کے ساتھ۔", - "position.provide.liquidityDescription.creatingPool": "پول بناتے وقت پوری رینج کی لیکویڈیٹی کا تعین کرنا تمام ممکنہ قیمتوں میں مارکیٹ کی مسلسل شرکت کو یقینی بناتا ہے، جو کہ سادگی کی پیشکش کرتا ہے لیکن زیادہ غیر مستقل نقصان کا امکان رکھتا ہے۔", - "position.provide.liquidityDescription.custom": "کسٹم رینج آپ کو اپنی لیکویڈیٹی کو مخصوص قیمت کی حدود کے اندر مرکوز کرنے کی اجازت دیتی ہے، جس سے سرمائے کی کارکردگی اور فیس کی آمدنی میں اضافہ ہوتا ہے لیکن زیادہ فعال انتظام کی ضرورت ہوتی ہے۔", - "position.provide.outOfRange.closePosition": "قریبی پوزیشن", - "position.provide.outOfRange.description": "منتقلی کے دوران اس پوزیشن کی حد کو ایڈجسٹ نہیں کیا جا سکتا۔ نئی رینج سیٹ کرنے کے لیے، اس پوزیشن کو بند کریں اور ایک نئی v4 پوزیشن کھولیں۔", - "position.provide.outOfRange.title": "آپ حد سے باہر کی پوزیشن کو منتقل کر رہے ہیں۔", - "position.removeHook": "ہک کو ہٹا دیں۔", - "position.resetDescription": "آپ کے ٹوکن، قیمت، اور رینج کے انتخاب کو دوبارہ ترتیب دیا جائے گا۔", - "position.setRange": "قیمت کی حد مقرر کریں۔", - "position.setRange.inputsBelow": "اپنی رینج سیٹ کرنے کے لیے نیچے دیے گئے ان پٹس کا استعمال کریں۔", - "position.stable": "مستحکم", - "position.stable.description": "stablecoins یا کم اتار چڑھاؤ والے جوڑوں کے لیے اچھا ہے۔", - "position.step.deposit": "ڈپازٹ کی رقم درج کریں۔", - "position.step.price": "ابتدائی قیمت اور جمع کی رقم مقرر کریں۔", - "position.step.range": "قیمت کی حد اور جمع کی رقم مقرر کریں۔", - "position.step.select": "ٹوکن جوڑا اور فیس منتخب کریں۔", - "position.value": "پوزیشن کی قدر", - "position.valueUnavailable": "USD قدر فی الحال اس پوزیشن کے لیے دستیاب نہیں ہے۔ جمع شدہ ٹوکن رقوم کے لیے پوزیشن کی تفصیلات دیکھیں۔", - "position.wide": "چوڑا", - "position.wide.description": "غیر مستحکم جوڑوں کے لیے اچھا ہے۔", - "position.wrapped.unwrap": "کھولیں {{wrappedToken}}", - "position.wrapped.warning": "{{nativeToken}} v4 پولز کے لیے درکار ہے۔", - "position.wrapped.warning.info": "اپنا {{wrappedToken}} کھولیں اور {{nativeToken}} جمع کریں تاکہ زیادہ لاگت سے موثر اور موثر لیکویڈیٹی فراہم کی جا سکے۔", - "positions.noPositions.description": "آپ کے پاس کوئی لیکویڈیٹی پوزیشنز نہیں ہیں۔ اہل پولز پر فیس اور انعامات کمانا شروع کرنے کے لیے ایک نئی پوزیشن بنائیں۔", - "positions.noPositions.title": "کوئی عہدہ نہیں۔", - "positions.welcome.connect.description": "اپنی پوزیشنز اور انعامات دیکھنے کے لیے آپ کو اپنا بٹوہ جوڑنا ہوگا۔", - "positions.welcome.connect.wallet": "اپنا بٹوہ جوڑیں۔", - "privacy.anonymizedLogs": "ایپ وقت کے ساتھ ساتھ بہتر بنانے کے لیے گمنام استعمال کے اعدادوشمار کو لاگ کرتی ہے۔", - "privacy.autoRouter": "ایپ یونی سویپ لیبز سرور سے بہترین تجارتی راستہ حاصل کرتی ہے۔", - "privacy.infura": "ایپ آن چین ڈیٹا حاصل کرتی ہے اور ایک Infura API کے ساتھ معاہدہ کالیں بناتی ہے۔", - "privacy.thirdPartyApis": "یہ ایپ درج ذیل تھرڈ پارٹی APIs استعمال کرتی ہے:", - "privacy.trm": "ایپ محفوظ طریقے سے آپ کے بٹوے کا پتہ جمع کرتی ہے اور اسے خطرے اور تعمیل کی وجوہات کی بنا پر TRM Labs Inc. کے ساتھ شیئر کرتی ہے۔", - "privacy.uniswaptos": "لیبز کی سروس کی شرائط کو تبدیل کریں۔", - "privateKeys.export.modal.speedbump.bullet1": "اسے نجی طور پر دیکھیں", - "privateKeys.export.modal.speedbump.bullet2": "اسے کسی کے ساتھ شیئر نہ کریں۔", - "privateKeys.export.modal.speedbump.bullet3": "اسے کبھی بھی کسی ویب سائٹ یا ایپس میں داخل نہ کریں۔", - "privateKeys.export.modal.speedbump.subtitle": "کوئی بھی جو آپ کی نجی کلید کو جانتا ہے وہ آپ کے بٹوے اور فنڈز تک رسائی حاصل کر سکتا ہے۔", - "privateKeys.export.modal.speedbump.title": "اس سے پہلے کہ آپ جاری رکھیں", - "privateKeys.export.modal.subtitle": "ایسا لگتا ہے کہ آپ اپنے بٹوے کو مکمل طور پر بحال نہیں کر پا رہے ہیں۔ اس بات کو یقینی بنانے کے لیے کہ آپ اپنے فنڈز تک رسائی سے محروم نہ ہوں، اپنی نجی کلید کاپی کریں۔", - "privateKeys.export.modal.title": "اپنی نجی کلید برآمد کریں۔", - "privateKeys.export.modal.warning": "اگر آپ اپنا فون کھو دیتے ہیں یا ایپ کو حذف کر دیتے ہیں، تو آپ کو یہ کلید کسی دوسرے بٹوے میں درآمد کرنے کی ضرورت ہوگی۔", - "privateKeys.view.button.continue": "میں نے ان سب کو کاپی کیا۔", - "privateKeys.view.button.continue.single": "میں نے اسے کاپی کیا۔", - "privateKeys.view.subtitle": "آپ کی نجی کلید ایک مخصوص بٹوے تک رسائی فراہم کرتی ہے۔ ہر بٹوے کی ایک الگ نجی کلید ہوتی ہے۔", - "privateKeys.view.title": "نجی کلید", - "qrScanner.button.connections_one": "1 ایپ منسلک ہے۔", - "qrScanner.button.connections_other": "{{count}} ایپس منسلک ہیں۔", - "qrScanner.error.camera.message": "کوڈ اسکین کرنے کے لیے، سسٹم کی ترتیبات میں کیمرے تک رسائی کی اجازت دیں۔", - "qrScanner.error.camera.title": "کیمرہ غیر فعال ہے۔", - "qrScanner.error.none": "کوئی QR کوڈ نہیں ملا", - "qrScanner.recipient.action.scan": "QR کوڈ اسکین کریں۔", - "qrScanner.recipient.action.show": "میرا QR کوڈ دکھائیں۔", - "qrScanner.recipient.error.message": "دوبارہ کوشش کرنے سے پہلے یقینی بنائیں کہ آپ درست Ethereum ایڈریس QR کوڈ اسکین کر رہے ہیں۔", - "qrScanner.recipient.error.title": "غلط QR کوڈ", - "qrScanner.request.message.unavailable": "کوئی پیغام نہیں ملا۔", - "qrScanner.request.method.default": "{{dappNameOrUrl}}سے درخواست", - "qrScanner.request.method.signature": "{{dappNameOrUrl}}سے دستخط کی درخواست", - "qrScanner.request.method.transaction": "{{dappNameOrUrl}}سے لین دین کی درخواست", - "qrScanner.request.withAmount": "{{dappName}} کو {{amount}} {{currencySymbol}}تک استعمال کرنے کی اجازت دیں؟", - "qrScanner.request.withoutAmount": "{{dappName}} کو اپنا {{currencySymbol}}استعمال کرنے کی اجازت دیں؟", - "qrScanner.status.connecting": "منسلک ہو رہا ہے...", - "qrScanner.status.loading": "لوڈ ہو رہا ہے...", - "qrScanner.title": "QR کوڈ اسکین کریں۔", - "qrScanner.wallet.networks": "تعاون یافتہ نیٹ ورکس", - "range.outOfView": "حد نگاہ سے باہر", - "removeLiquidity.pooled": "جمع شدہ {{symbol}}:", - "revoke.failed.message": "نیٹ ورک یا کنکشن کا مسئلہ ممکنہ طور پر آپ کی منسوخی کے ناکام ہونے کا سبب بنتا ہے۔ اپنا کنکشن چیک کریں اور دوبارہ کوشش کریں۔", - "routing.aggregateLiquidity": "دستیاب ہونے پر، بہتر قیمتوں اور گیس سے پاک تبادلہ کے لیے لیکویڈیٹی ذرائع کو جمع کرتا ہے۔", - "routing.aggregateLiquidity.uniswapx": "UniswapX لیکویڈیٹی ذرائع کو آن اور آف چین کو اکٹھا کرتا ہے، جو آپ کو بہترین دستیاب قیمتیں اور گیس سے پاک تبادلہ لاتا ہے۔", - "routing.cheapest": "Uniswap کلائنٹ سب سے سستا تجارتی آپشن فیکٹرنگ قیمت اور نیٹ ورک کے اخراجات کا انتخاب کرتا ہے۔", - "routing.cheapest.v4": "Uniswap کلائنٹ قیمت اور نیٹ ورک کی لاگت کے لحاظ سے بہترین تجارتی آپشن کا انتخاب کرتا ہے۔", - "scantastic.code.expired": "میعاد ختم", - "scantastic.code.subtitle": "یونی سویپ ایکسٹینشن میں یہ کوڈ درج کریں۔ آپ کی بازیابی کے جملہ کو محفوظ طریقے سے خفیہ اور منتقل کیا جائے گا۔", - "scantastic.code.timeRemaining.shorthand.hours": "نیا کوڈ {{hours}}h {{minutes}}m {{seconds}}s میں", - "scantastic.code.timeRemaining.shorthand.minutes": "{{minutes}}m {{seconds}}s میں نیا کوڈ", - "scantastic.code.timeRemaining.shorthand.seconds": "{{seconds}}s میں نیا کوڈ", - "scantastic.code.title": "ایک بار کا کوڈ تبدیل کریں۔", - "scantastic.confirmation.button.continue": "ہاں، جاری رکھیں", - "scantastic.confirmation.label.browser": "براؤزر", - "scantastic.confirmation.label.device": "ڈیوائس", - "scantastic.confirmation.subtitle": "صرف اس صورت میں جاری رکھیں جب آپ ایک قابل اعتماد ڈیوائس پر یونی سویپ ایکسٹینشن سے QR کوڈ اسکین کر رہے ہوں۔", - "scantastic.confirmation.title": "کیا آپ اپنا پرس درآمد کرنے کی کوشش کر رہے ہیں؟", - "scantastic.confirmation.warning": "Unswap کی نقالی کرنے والی سائٹس اور ایپس سے ہوشیار رہیں۔ بصورت دیگر آپ کے بٹوے سے سمجھوتہ کیا جا سکتا ہے۔", - "scantastic.error.encryption": "بیج کا جملہ تیار کرنے میں ناکام۔", - "scantastic.error.noCode": "کوئی OTP موصول نہیں ہوا۔ دوبارہ کوشش کریں.", - "scantastic.error.timeout.message": "اپنے بٹوے کی مطابقت پذیری جاری رکھنے کے لیے یونی سویپ ایکسٹینشن پر QR کوڈ دوبارہ اسکین کریں۔", - "scantastic.error.timeout.title": "آپ کے کنکشن کا وقت ختم ہو گیا۔", - "scantastic.modal.ipMismatch.description": "اس QR کوڈ کو اسکین کرنے کے لیے، آپ کا فون اسی وائی فائی نیٹ ورک سے منسلک ہونا چاہیے جس میں آپ کا کمپیوٹر ہے اور کسی بھی VPN کو عارضی طور پر بند کر دیا جانا چاہیے۔", - "scantastic.modal.ipMismatch.title": "اپنا وائی فائی نیٹ ورک سوئچ کریں۔", - "search.input.placeholder": "ٹوکن اور پول تلاش کریں۔", - "search.ukDisclaimer": "برطانیہ کے رہائشیوں کے لیے دستبرداری", - "send.button.review": "منتقلی کا جائزہ لیں۔", - "send.gas.error.title": "N / A", - "send.gas.networkCost.title": "نیٹ ورک کی قیمت", - "send.input.token.balance.title": "بیلنس: {{balance}} {{symbol}}", - "send.recipient.header": "وصول کنندہ کو منتخب کریں۔", - "send.recipient.input.placeholder": "ENS یا پتہ تلاش کریں۔", - "send.recipient.previous_one": "1 پچھلی منتقلی۔", - "send.recipient.previous_other": "{{count}} پچھلی منتقلیاں", - "send.recipient.results.empty": "کوئی نتیجہ نہیں", - "send.recipient.results.error": "آپ نے جو ایڈریس ٹائپ کیا ہے وہ یا تو موجود نہیں ہے یا ہجے غلط ہے۔", - "send.recipient.section.favorite": "پسندیدہ بٹوے", - "send.recipient.section.recent": "حالیہ", - "send.recipient.section.search": "تلاش کے نتائج", - "send.recipient.section.viewOnly": "صرف دیکھنے کے بٹوے", - "send.recipient.section.yours": "آپ کے بٹوے", - "send.recipient.warning.viewOnly.message": "صرف اس بٹوے میں فنڈز بھیجیں اگر آپ کے پاس بازیابی کا جملہ ہے یا آپ کے پاس بٹوے کے مالک کو جانتے ہیں۔", - "send.recipient.warning.viewOnly.title": "آپ کے پاس یہ صرف دیکھنے کے لیے والیٹ کے طور پر ہے۔", - "send.recipientSelect.search.empty.message": "جب آپ بٹوے کے پتے پر ٹوکن بھیجتے ہیں، تو وہ یہاں نظر آئیں گے۔", - "send.recipientSelect.search.empty.title": "کوئی بٹوہ محفوظ نہیں ہوا۔", - "send.review.modal.title": "آپ بھیج رہے ہیں۔", - "send.review.summary.button.title": "بھیجنے کی تصدیق کریں۔", - "send.search.empty.subtitle": "آپ نے جو ایڈریس ٹائپ کیا ہے وہ یا تو موجود نہیں ہے یا ہجے غلط ہے۔", - "send.search.empty.title": "کوئی نتیجہ نہیں", - "send.search.placeholder": "ENS یا پتہ تلاش کریں۔", - "send.solanaSendNotSupported": "سولانا پر بھیجنا تعاون یافتہ نہیں ہے۔", - "send.title": "بھیجیں", - "send.unavailableOnSolana.message": "سولانا بٹوے پر بھیجنا دستیاب نہیں ہے۔", - "send.warning.blocked.default": "یہ پرس مسدود ہے۔", - "send.warning.blocked.modal.message": "یہ پتہ Unswap Wallet پر مسدود ہے کیونکہ یہ ایک یا زیادہ مسدود سرگرمیوں سے وابستہ ہے۔ اگر آپ کو لگتا ہے کہ یہ ایک غلطی ہے، تو براہ کرم compliance@uniswap.org پر ای میل کریں۔", - "send.warning.blocked.modal.title": "بلاک شدہ پتہ", - "send.warning.blocked.recipient": "وصول کنندہ کا پرس مسدود ہے۔", - "send.warning.erc20.checkbox.description": "آپ ٹوکن ایڈریس پر فنڈز بھیجنے کی کوشش کر رہے ہیں۔ اس کے نتیجے میں فنڈز کا مستقل نقصان ہو سکتا ہے۔", - "send.warning.erc20.checkbox.heading": "ٹوکن ایڈریس کا پتہ چلا", - "send.warning.erc20.message": "آپ ٹوکن ایڈریس پر فنڈز بھیجنے کی کوشش کر رہے ہیں۔ اس قسم کے پتے پر کرپٹو بھیجنے کے نتیجے میں فنڈز کا مستقل نقصان ہو سکتا ہے۔", - "send.warning.erc20.title": "یہ ایک ٹوکن ایڈریس ہے۔", - "send.warning.insufficientFunds.message": "آپ کے {{currencySymbol}} بیلنس میں کمی آئی ہے جب سے آپ نے وہ رقم داخل کی ہے جو آپ بھیجنا چاہتے ہیں۔", - "send.warning.insufficientFunds.title": "کافی نہیں {{currencySymbol}}", - "send.warning.insufficientGas.message.withNetwork": "بھیجنے کے لیے {{currencySymbol}} {{networkName}} پر کافی نہیں", - "send.warning.insufficientGas.message.withoutNetwork": "بھیجنے کے لیے کافی {{currencySymbol}}", - "send.warning.modal.button.cta.blocking": "ٹھیک ہے", - "send.warning.modal.button.cta.cancel": "منسوخ کریں۔", - "send.warning.modal.button.cta.confirm": "تصدیق کریں۔", - "send.warning.newAddress.details.ENS": "ای این ایس", - "send.warning.newAddress.details.username": "صارف نام", - "send.warning.newAddress.details.walletAddress": "بٹوے کا پتہ", - "send.warning.newAddress.message": "آپ نے پہلے اس ایڈریس سے لین دین نہیں کیا ہے۔ جاری رکھنے سے پہلے براہ کرم تصدیق کریں کہ پتہ درست ہے۔", - "send.warning.newAddress.title": "نیا پتہ", - "send.warning.self.message": "آپ اپنے موجودہ بٹوے میں فنڈز بھیجنے کی کوشش کر رہے ہیں۔ اس ایڈریس پر کرپٹو بھیجنے سے نیٹ ورک کے غیر ضروری اخراجات اٹھیں گے۔", - "send.warning.self.title": "یہ آپ کا موجودہ پرس ہے۔", - "send.warning.smartContract.message": "آپ سمارٹ کنٹریکٹ ایڈریس پر فنڈز بھیجنے والے ہیں۔ یقینی بنائیں کہ یہ درست پتہ ہے اور یہ ٹوکن وصول کر سکتا ہے۔ اگر نہیں، تو اس کے نتیجے میں فنڈز کا مستقل نقصان ہو سکتا ہے۔", - "send.warning.smartContract.title": "یہ ایک سمارٹ کنٹریکٹ ایڈریس ہے۔", - "send.warning.viewOnly.message": "اثاثے بھیجنے کے لیے آپ کو اس بٹوے کو بازیابی کے فقرے کے ذریعے درآمد کرنے کی ضرورت ہے۔", - "send.warning.viewOnly.title": "یہ پرس صرف دیکھنے کے لیے ہے۔", - "send.youAreSending": "آپ بھیج رہے ہیں۔", - "sendRecipientForm.recentAddresses.label": "حالیہ", - "sendReviewModal.title": "جائزہ بھیجیں۔", - "setting.recoveryPhrase.account.show": "بازیابی کا جملہ دکھائیں۔", - "setting.recoveryPhrase.action.hide": "بازیابی کا جملہ چھپائیں۔", - "setting.recoveryPhrase.remove": "بازیافت کا جملہ ہٹا دیں۔", - "setting.recoveryPhrase.remove.confirm.subtitle": "میں سمجھتا ہوں کہ اگر میں ایسا کرنے میں ناکام ہو گیا تو Uniswap Labs میرے بٹوے کو بازیافت کرنے میں میری مدد نہیں کر سکتی", - "setting.recoveryPhrase.remove.confirm.title": "میں نے اپنا ریکوری جملہ محفوظ کر لیا۔", - "setting.recoveryPhrase.remove.initial.subtitle": "یقینی بنائیں کہ آپ نے اپنا بازیابی جملہ محفوظ کر لیا ہے۔ دوسری صورت میں آپ اپنے فنڈز تک رسائی کھو دیں گے۔", - "setting.recoveryPhrase.remove.initial.title": "اس سے پہلے کہ آپ جاری رکھیں", - "setting.recoveryPhrase.remove.subtitle": "جاری رکھنے کے لیے اپنا پاس ورڈ درج کریں۔", - "setting.recoveryPhrase.remove.title": "آپ اپنا بازیابی کا جملہ ہٹا رہے ہیں۔", - "setting.recoveryPhrase.view.warning.message1": "کوئی بھی جو آپ کی بازیابی کے فقرے کو جانتا ہے وہ آپ کے بٹوے اور فنڈز تک رسائی حاصل کر سکتا ہے۔", - "setting.recoveryPhrase.view.warning.message2": "اسے نجی طور پر دیکھیں", - "setting.recoveryPhrase.view.warning.message3": "اسے کسی کے ساتھ شیئر نہ کریں۔", - "setting.recoveryPhrase.view.warning.message4": "اسے کبھی بھی کسی ویب سائٹ یا ایپس میں داخل نہ کریں۔", - "setting.recoveryPhrase.view.warning.title": "اس سے پہلے کہ آپ جاری رکھیں", - "setting.recoveryPhrase.warning.view.message": "کوئی بھی جو آپ کی بازیابی کے جملے کو جانتا ہے وہ آپ کے بٹوے اور فنڈز تک رسائی حاصل کر سکتا ہے۔", - "setting.recoveryPhrase.warning.view.title": "اسے کسی نجی جگہ پر دیکھیں", - "settings.action.enableInSettings": "ترتیبات میں فعال کریں۔", - "settings.action.feedback": "رائے بھیجیں", - "settings.action.help": "مدد حاصل کرو", - "settings.action.lock": "پرس مقفل کریں۔", - "settings.action.privacy": "رازداری کی پالیسی", - "settings.action.terms": "سروس کی شرائط", - "settings.connectWalletPlatform.warning": "{{platform}}پر Uniswap استعمال کرنے کے لیے، ایک ایسے والیٹ سے جڑیں جو {{platform}}کو سپورٹ کرتا ہو۔", - "settings.footer": "محبت کے ساتھ بنایا گیا، \nUnswap ٹیم 🦄", - "settings.hideSmallBalances": "چھوٹے بیلنس چھپائیں۔", - "settings.hideSmallBalances.subtitle": "1 USD سے کم بیلنس آپ کے پورٹ فولیو سے چھپائے جائیں گے۔", - "settings.maxSlippage": "زیادہ سے زیادہ پھسلنا", - "settings.maxSlippage.amount": "{{amount}} زیادہ سے زیادہ پھسلنا", - "settings.section.about": "کے بارے میں", - "settings.section.preferences": "ترجیحات", - "settings.section.privacyAndSecurity": "رازداری اور سلامتی", - "settings.section.support": "حمایت", - "settings.section.wallet.hidden.row.title": "{{numHidden}} دوسرے بٹوے", - "settings.setting.advanced.title": "اعلی درجے کی", - "settings.setting.advancedSettings": "Advanced settings", - "settings.setting.appearance.option.auto": "آٹو", - "settings.setting.appearance.option.dark.subtitle": "ہمیشہ ڈارک تھیم استعمال کریں۔", - "settings.setting.appearance.option.dark.title": "اندھیرا", - "settings.setting.appearance.option.device.subtitle": "آپ کے آلے کی سیٹنگز کو اپناتا ہے۔", - "settings.setting.appearance.option.device.title": "آٹو", - "settings.setting.appearance.option.light.subtitle": "ہمیشہ ہلکی تھیم استعمال کریں۔", - "settings.setting.appearance.option.light.title": "روشنی", - "settings.setting.appearance.title": "خیالیہ", - "settings.setting.backup.create.description": "پاس ورڈ ترتیب دینے سے آپ کی بازیابی کے فقرے کا بیک اپ انکرپٹ ہو جائے گا، اگر آپ کے {{cloudProviderName}} اکاؤنٹ سے کبھی سمجھوتہ کیا جاتا ہے تو تحفظ کی ایک اضافی سطح کا اضافہ ہو گا۔", - "settings.setting.backup.create.title": "{{cloudProviderName}}تک بیک اپ کریں۔", - "settings.setting.backup.delete.confirm.message": "چونکہ یہ بٹوے بازیابی کے فقرے کا اشتراک کرتے ہیں، اس لیے یہ ذیل میں ان بٹوے کے بیک اپ کو بھی حذف کر دے گا۔", - "settings.setting.backup.delete.confirm.title": "کیا تمہیں یقین ہے؟", - "settings.setting.backup.delete.warning": "اگر آپ اپنا {{cloudProviderName}} بیک اپ حذف کرتے ہیں، تو آپ صرف اپنے بازیابی کے جملے کے دستی بیک اپ کے ساتھ ہی اپنے بٹوے کو بازیافت کر سکیں گے۔ اگر آپ اپنا بازیابی کا جملہ کھو دیتے ہیں تو Uniswap Labs آپ کے اثاثوں کو بازیافت نہیں کر سکتی۔", - "settings.setting.backup.error.message.full": "{{cloudProviderName}}میں بازیافت کے جملے کا بیک اپ لینے سے قاصر ہے۔ براہ کرم یقینی بنائیں کہ آپ نے دستیاب اسٹوریج کی جگہ کے ساتھ {{cloudProviderName}} کو فعال کیا ہے اور دوبارہ کوشش کریں۔", - "settings.setting.backup.error.message.short": "بیک اپ کو حذف کرنے سے قاصر", - "settings.setting.backup.error.title": "{{cloudProviderName}} غلطی", - "settings.setting.backup.modal.description": "آپ نے ابھی تک اپنے بازیابی کے جملے کا {{cloudProviderName}} میں بیک اپ نہیں لیا ہے۔ ایسا کرنے سے، آپ کسی بھی ڈیوائس پر {{cloudProviderName}} میں لاگ ان ہو کر اپنا پرس بازیافت کر سکتے ہیں۔", - "settings.setting.backup.modal.title": "{{cloudProviderName}}پر بحالی کے جملے کا بیک اپ لیں؟", - "settings.setting.backup.password.error.mismatch": "پاس ورڈ میچ نہیں کرتے", - "settings.setting.backup.password.medium": "یہ درمیانے درجے کا پاس ورڈ ہے۔", - "settings.setting.backup.password.placeholder.confirm": "پاس ورڈ کی تصدیق کریں۔", - "settings.setting.backup.password.placeholder.create": "پاسورڈ بنائیں", - "settings.setting.backup.password.strong": "یہ ایک مضبوط پاس ورڈ ہے۔", - "settings.setting.backup.password.weak": "یہ ایک کمزور پاس ورڈ ہے۔", - "settings.setting.backup.recoveryPhrase.label": "بازیابی کا جملہ", - "settings.setting.backup.selected": "{{cloudProviderName}} بیک اپ", - "settings.setting.backup.status.action.delete": "بیک اپ کو حذف کریں۔", - "settings.setting.backup.status.complete": "{{cloudProviderName}}تک بیک اپ لیا گیا۔", - "settings.setting.backup.status.description": "{{cloudProviderName}}میں آپ کے بازیابی کے جملے کا بیک اپ لے کر، آپ کسی بھی ڈیوائس پر اپنے {{cloudProviderName}} اکاؤنٹ میں لاگ ان ہو کر اپنا پرس بازیافت کر سکتے ہیں۔", - "settings.setting.backup.status.inProgress": "{{cloudProviderName}}تک بیک اپ لیا جا رہا ہے...", - "settings.setting.backup.status.recoveryPhrase.backed": "بیک اپ لیا گیا۔", - "settings.setting.backup.status.title": "{{cloudProviderName}} بیک اپ", - "settings.setting.beta.tooltip": "جلد آرہا ہے۔", - "settings.setting.biometrics.appAccess.subtitle.android": "ایپ کھولنے کے لیے چہرے/فنگر پرنٹ کی ضرورت ہے۔", - "settings.setting.biometrics.appAccess.subtitle.ios": "ایپ کھولنے کے لیے {{biometricsMethod}} کی ضرورت ہے۔", - "settings.setting.biometrics.appAccess.title": "ایپ تک رسائی", - "settings.setting.biometrics.auth": "براہ کرم تصدیق کریں۔", - "settings.setting.biometrics.extension.waitingForBiometricsModal.content": "جاری رکھنے کے لیے اپنے براؤزر یا سسٹم سیٹنگز میں {{biometricsMethod}} کو فعال کریں۔", - "settings.setting.biometrics.extension.waitingForBiometricsModal.title": "{{biometricsMethod}}کا انتظار کر رہا ہے۔", - "settings.setting.biometrics.off.message.android": "بایومیٹرکس فی الحال Uniswap Wallet کے لیے بند ہے — آپ اسے اپنے سسٹم کی ترتیبات میں آن کر سکتے ہیں۔", - "settings.setting.biometrics.off.message.ios": "{{biometricsMethod}} فی الحال Unswap Wallet کے لیے بند ہے — آپ اسے اپنے سسٹم کی ترتیبات میں آن کر سکتے ہیں۔", - "settings.setting.biometrics.off.title.android": "بائیو میٹرکس بند ہے۔", - "settings.setting.biometrics.off.title.ios": "{{biometricsMethod}} بند ہے۔", - "settings.setting.biometrics.title": "چہرہ/فنگر پرنٹ انلاک", - "settings.setting.biometrics.transactions.subtitle.android": "لین دین کے لیے چہرے/فنگر پرنٹ کی ضرورت ہے۔", - "settings.setting.biometrics.transactions.subtitle.ios": "لین دین کے لیے {{biometricsMethod}} کی ضرورت ہے۔", - "settings.setting.biometrics.transactions.title": "لین دین", - "settings.setting.biometrics.unavailable.message.android": "آپ کے آلے پر بایومیٹرکس سیٹ اپ نہیں ہے۔ بائیو میٹرکس استعمال کرنے کے لیے، اسے پہلے سیٹنگز میں سیٹ کریں۔", - "settings.setting.biometrics.unavailable.message.ios": "{{biometricsMethod}} آپ کے آلے پر سیٹ اپ نہیں ہے۔ {{biometricsMethod}}استعمال کرنے کے لیے، اسے پہلے سیٹنگز میں سیٹ کریں۔", - "settings.setting.biometrics.unavailable.title.android": "بائیو میٹرکس سیٹ اپ نہیں ہے۔", - "settings.setting.biometrics.unavailable.title.ios": "{{biometricsMethod}} سیٹ اپ نہیں ہے۔", - "settings.setting.biometrics.warning.message.android": "اگر آپ بایومیٹرکس کو آن نہیں کرتے ہیں، تو کوئی بھی جو آپ کے آلے تک رسائی حاصل کرتا ہے وہ Unswap Wallet کھول سکتا ہے اور لین دین کرسکتا ہے۔", - "settings.setting.biometrics.warning.message.ios": "اگر آپ {{biometricsMethod}}کو آن نہیں کرتے ہیں، تو کوئی بھی جو آپ کے آلے تک رسائی حاصل کرتا ہے وہ Unswap Wallet کھول سکتا ہے اور لین دین کرسکتا ہے۔", - "settings.setting.biometrics.warning.title": "کیا تمہیں یقین ہے؟", - "settings.setting.connections.disconnectAll": "سب کو منقطع کریں۔", - "settings.setting.connections.noConnectionsDescription": "\"کنیکٹ والیٹ\" یا \"لاگ ان\" بٹن تلاش کرکے ایپ سے جڑیں۔", - "settings.setting.currency.title": "مقامی کرنسی", - "settings.setting.deviceAccess.reset.title": "اپنے {{biometricsMethod}}کو دوبارہ ترتیب دیں۔", - "settings.setting.deviceAccess.title": "ڈیوائس تک رسائی", - "settings.setting.deviceAccessTimeout.1hour": "1 گھنٹہ", - "settings.setting.deviceAccessTimeout.24hours": "24 گھنٹے", - "settings.setting.deviceAccessTimeout.30minutes": "30 منٹ", - "settings.setting.deviceAccessTimeout.5minutes": "5 منٹ", - "settings.setting.deviceAccessTimeout.never": "کبھی نہیں", - "settings.setting.deviceAccessTimeout.title": "آٹو لاک ٹائم آؤٹ", - "settings.setting.hapticTouch.title": "ہیپٹک ٹچ", - "settings.setting.helpCenter.title": "مدداور تعاون کا مرکز", - "settings.setting.language.button.navigate": "ترتیبات پر جائیں۔", - "settings.setting.language.description.extension": "آپ کے سسٹم لینگویج سیٹنگز میں ڈیفالٹس کو تبدیل کریں۔ اپنی ترجیحی زبان کو تبدیل کرنے کے لیے، اپنے سسٹم کی ترتیبات پر جائیں۔", - "settings.setting.language.description.mobile": "اپنے آلے کی لینگویج سیٹنگز میں ڈیفالٹس کو تبدیل کریں۔ اپنی ترجیحی زبان کو تبدیل کرنے کے لیے، اپنے آلے کی ترتیبات میں \"Uniswap\" پر جائیں اور \"Language\" پر ٹیپ کریں۔", - "settings.setting.language.title": "زبان", - "settings.setting.notifications.row.activity.description": "منتقلی، درخواستیں، اور دیگر سرگرمیاں", - "settings.setting.notifications.row.activity.title": "بٹوے کی سرگرمی", - "settings.setting.notifications.row.updates.description": "سفارشات اور نئی خصوصیات", - "settings.setting.notifications.row.updates.title": "Uniswap سے اپ ڈیٹس", - "settings.setting.notifications.title": "اطلاعات", - "settings.setting.password.change.title": "نیا پاس ورڈ بنائیں", - "settings.setting.password.title": "پاس ورڈ تبدیل کریں", - "settings.setting.permissions.title": "اجازتیں", - "settings.setting.privacy.analytics.description": "ہم Unswap Labs پروڈکٹس میں آپ کے تجربے کو بڑھانے کے لیے گمنام استعمال کا ڈیٹا استعمال کرتے ہیں۔ غیر فعال ہونے پر، ہم صرف غلطیوں اور ضروری استعمال کو ٹریک کرتے ہیں۔", - "settings.setting.privacy.analytics.title": "ایپ کے تجزیات", - "settings.setting.privateKeys.title": "نجی چابیاں", - "settings.setting.recoveryPhrase.title": "بازیابی کا جملہ", - "settings.setting.smallBalances.title": "پورٹ فولیو بیلنس", - "settings.setting.smartWallet.action.enable": "فعال", - "settings.setting.smartWallet.action.smartWallet": "Smart wallet", - "settings.setting.smartWallet.notEligible": "اہل نہیں۔", - "settings.setting.smartWallet.status.actionRequired": "کارروائی درکار ہے۔", - "settings.setting.smartWallet.status.active": "فعال", - "settings.setting.smartWallet.status.inactive": "غیر فعال", - "settings.setting.smartWallet.status.unavailable": "دستیاب نہیں۔", - "settings.setting.unknownTokens.subtitle": "ممکنہ اسکام ٹوکنز آپ کے پورٹ فولیو سے چھپائے جائیں گے۔", - "settings.setting.unknownTokens.title": "نامعلوم ٹوکنز چھپائیں۔", - "settings.setting.wallet.action.editLabel": "لیبل میں ترمیم کریں۔", - "settings.setting.wallet.action.editProfile": "پروفائل میں ترمیم کریں", - "settings.setting.wallet.action.remove": "پرس کو ہٹا دیں۔", - "settings.setting.wallet.connection.banner.description": "اپنی پروفائل امیج پر کلک کرکے والیٹ سیٹنگز کے ذریعے کنکشنز کا نظم کریں۔", - "settings.setting.wallet.connection.banner.title": "رابطے منتقل ہو گئے ہیں۔", - "settings.setting.wallet.connections.title": "کنکشنز", - "settings.setting.wallet.editLabel.description": "لیبل عوامی نہیں ہیں۔ وہ مقامی طور پر ذخیرہ کیے جاتے ہیں اور صرف آپ کو دکھائی دیتے ہیں۔", - "settings.setting.wallet.editLabel.save": "تبدیلیاں محفوظ کرو", - "settings.setting.wallet.label": "عرفی نام", - "settings.setting.wallet.testnetMode.description": "یہ ڈیولپرز کے لیے ٹیسٹ نیٹ کو آن کر دیتا ہے تاکہ وہ اصلی اثاثے استعمال کیے بغیر خصوصیات اور لین دین کو آزما سکیں۔ testnets پر ٹوکن کی کوئی حقیقی قدر نہیں ہوتی۔", - "settings.setting.wallet.testnetMode.title": "ٹیسٹ نیٹ موڈ", - "settings.switchNetwork.warning": "{{label}}پر Uniswap استعمال کرنے کے لیے، اپنے بٹوے کی ترتیبات میں نیٹ ورک کو تبدیل کریں۔", - "settings.title": "ترتیبات", - "settings.version": "ورژن {{appVersion}}", - "smartWallet.actionRequired.cta": "1 نیٹ ورک پر غیر فعال کریں۔", - "smartWallet.actionRequired.cta.plural": "{{amount}} نیٹ ورکس پر غیر فعال کریں۔", - "smartWallet.actionRequired.description": "سمارٹ والیٹ کو غیر فعال کرنا ایک آنچین ایکشن ہے جس کے لیے ایک چھوٹی نیٹ ورک لاگت کی ضرورت ہوتی ہے۔", - "smartWallet.actionRequired.insufficientFunds": "ناکافی فنڈز", - "smartWallet.actionRequired.reactivate": "سمارٹ پرس استعمال کرتے رہیں", - "smartWallet.actionRequired.title": "اسمارٹ والیٹ 1 نیٹ ورک پر فعال ہے۔", - "smartWallet.actionRequired.title.plural": "اسمارٹ والیٹ {{amount}} نیٹ ورکس پر فعال ہے۔", - "smartWallet.activeNetworks.title": "اسمارٹ والیٹ 1 نیٹ ورک پر فعال ہے۔", - "smartWallet.activeNetworks.title.plural": "اسمارٹ والیٹ {{amount}} نیٹ ورکس پر فعال ہے۔", - "smartWallet.banner.networkCost": "Includes a one-time cost to activate your smart wallet on {{chainName}}.", - "smartWallet.banner.text": "سمارٹ والیٹ کو فعال کریں نیٹ ورک کے اخراجات پر 50% تک بچت کرنے کے لیے۔", - "smartWallet.confirmDisableSmartWallet.description": "آپ تیز تر تبادلہ، رعایتی نیٹ ورک کے اخراجات، اور آنے والی دیگر بہتریوں سے محروم رہیں گے۔", - "smartWallet.confirmDisableSmartWallet.title": "کیا تمہیں یقین ہے؟", - "smartWallet.insufficient.description": "اسمارٹ والیٹ کو ان نیٹ ورکس پر اس وقت تک غیر فعال نہیں کیا جا سکتا جب تک کہ آپ کے پاس نیٹ ورک کے اخراجات پورے کرنے کے لیے فنڈز نہ ہوں۔", - "smartWallet.insufficient.title": "1 نیٹ ورک پر ناکافی فنڈز", - "smartWallet.insufficient.title.plural": "{{amount}} نیٹ ورکس پر ناکافی فنڈز", - "smartWallet.InsufficientFunds.button.continue.text": "بہرحال جاری رکھیں", - "smartWallet.insufficientFunds.network.banner.description": "ناکافی فنڈز کی وجہ سے غیر فعال نہیں کیا جا سکتا۔", - "smartWallet.insufficientFunds.network.banner.title_one": "{{count}} نیٹ ورک خارج کر دیا گیا۔", - "smartWallet.insufficientFunds.network.banner.title_other": "{{count}} نیٹ ورک خارج کر دیا گیا۔", - "smartWallet.insufficientFunds.network.disable.text": "غیر فعال کرنے کے لیے تیار ہے۔", - "smartWallet.insufficientFunds.network.text": "آپ کو {{nativeCurrency}}کی ضرورت ہے۔", - "smartWallet.insufficientFunds.single.network.banner.title": "{{chain}} خارج کر دیا گیا۔", - "smartWallet.modal.description.block1": "سمارٹ بٹوے تیز، کم لاگت والے لین دین کے لیے سمارٹ کنٹریکٹس کا استعمال کرتے ہیں۔", - "smartWallet.modal.description.block2": "پہلے سے کسی دوسری ایپ سے اسمارٹ والیٹ کی خصوصیات استعمال کرنے والے والٹس متاثر نہیں ہوں گے۔", - "smartWallet.modal.title": "اسمارٹ والیٹ", - "smartWallets": "سمارٹ بٹوے", - "smartWallets.activeNetworks.description": "آپ کا سمارٹ والیٹ ہر نئے نیٹ ورک پر خود بخود چالو ہوجاتا ہے جس پر آپ تبادلہ کرتے ہیں۔", - "smartWallets.createdModal.description": "You’re getting faster transactions and lower network costs on every swap.", - "smartWallets.createdModal.title": "اسمارٹ پرس بنایا گیا۔", - "smartWallets.delegation.limitedSupport": "آپ کے بٹوے کو محدود حمایت حاصل ہے۔", - "smartWallets.delegationMismatchModal.description": "{{walletName}} {{displayName}}کے ذریعہ استعمال ہونے والے تازہ ترین ایتھریم معیارات کی حمایت نہیں کرتا ہے، لہذا کچھ خصوصیات دستیاب نہیں ہیں۔", - "smartWallets.delegationMismatchModal.features.1ClickSwaps": "1-کلک سویپس", - "smartWallets.delegationMismatchModal.features.gasFreeSwaps": "گیس سے پاک تبادلہ", - "smartWallets.delegationMismatchModal.features.limitOrders": "احکامات کو محدود کریں۔", - "smartWallets.delegationMismatchModal.limitOrders.unsupported": "آپ کے بٹوے کے ذریعہ محدود آرڈرز کی حمایت نہیں کی جاتی ہے۔", - "smartWallets.delegationMismatchModal.title": "پرس کی محدود حمایت", - "smartWallets.disable.failed": "ایک خرابی پیش آگئی۔ اسمارٹ والیٹ اب بھی 1 یا زیادہ نیٹ ورکس پر فعال ہے۔ براہ کرم دوبارہ کوشش کریں۔", - "smartWallets.disable.modal.description": "اس onchain کارروائی کے لیے نیٹ ورک کی لاگت درکار ہے۔", - "smartWallets.disable.modal.title": "سمارٹ والیٹ کو غیر فعال کریں۔", - "smartWallets.educationalModal.description": "سمارٹ بٹوے سمارٹ معاہدوں کا استعمال کرتے ہوئے تیز، کم لاگت کے لین دین فراہم کرتے ہیں۔", - "smartWallets.educationalModal.info": "پہلے سے کسی دوسری ایپ سے اسمارٹ والیٹ کی خصوصیات استعمال کرنے والے والٹس متاثر نہیں ہوں گے۔", - "smartWallets.enabledModal.description": "اپ ڈیٹس آپ کے اگلے سویپ پر لاگو ہوں گی۔", - "smartWallets.enabledModal.description.dapp": "اپ ڈیٹس آپ کے اگلے لین دین پر لاگو ہوں گی۔", - "smartWallets.enabledModal.description.dapp.line2": "فوری طور پر ایپس پر سمارٹ والیٹ کی خصوصیات کا استعمال شروع کرنے کے لیے اپنے بٹوے کو دوبارہ جوڑیں۔", - "smartWallets.enabledModal.title": "اسمارٹ والیٹ فعال ہے۔", - "smartWallets.postSwapNudge.enable": "سمارٹ والیٹ کو فعال کریں۔", - "smartWallets.postSwapNudge.title": "اپنے اگلے تبادلہ پر محفوظ کریں۔", - "smartWallets.postSwapNudge.title.dapp": "یہ ایپ سمارٹ بٹوے کو سپورٹ کرتی ہے۔", - "smartWallets.unavailableModal.description": "ایک مختلف والیٹ فراہم کنندہ اب {{displayName}}کے لیے سمارٹ والیٹ کی ترتیبات کا انتظام کر رہا ہے۔ آپ یونی سویپ کا استعمال معمول کے مطابق جاری رکھ سکتے ہیں۔", - "smartWallets.unavailableModal.title": "اسمارٹ والیٹ کی خصوصیات دستیاب نہیں ہیں۔", - "solanaPromo.banner.description": "سولانا ٹوکنز کو براہ راست Uniswap پر تجارت کریں۔", - "solanaPromo.banner.title": "سولانا اب دستیاب ہے۔", - "solanaPromo.modal.connectWallet": "اپنے پسندیدہ سولانا والیٹ کو جوڑیں۔", - "solanaPromo.modal.startSwapping.button": "سولانا پر تبادلہ کرنا شروع کریں۔", - "solanaPromo.modal.swapInstantly": "ہزاروں ٹرینڈنگ ٹوکنز کو فوری طور پر تبدیل کریں۔", - "solanaPromo.modal.viewTokenData": "ٹوکن ڈیٹا اور قیمتیں ایک جگہ پر دیکھیں", - "speedBump.newAddress.warning.description": "آپ نے پہلے اس ایڈریس سے لین دین نہیں کیا ہے۔ جاری رکھنے سے پہلے یقینی بنائیں کہ یہ درست پتہ ہے۔", - "speedBump.newAddress.warning.title": "نیا پتہ", - "speedBump.smartContractAddress.warning.description": "آپ ایک خاص قسم کے پتے پر ٹوکن بھیجنے والے ہیں - ایک سمارٹ معاہدہ۔ دو بار چیک کریں کہ یہ وہ پتہ ہے جس پر آپ بھیجنا چاہتے ہیں۔ اگر یہ غلط ہے تو، آپ کے ٹوکن ہمیشہ کے لیے ضائع ہو سکتے ہیں۔", - "speedBump.smartContractAddress.warning.title": "کیا یہ بٹوے کا پتہ ہے؟", - "stats.24fees": "24H فیس", - "stats.24swapVolume": "24H سویپ والیوم", - "stats.24volume": "24H والیوم", - "stats.allTimeSwappers": "ہر وقت بدلنے والے", - "stats.allTimeVolume": "تمام وقت کا حجم", - "stats.fdv": "ایف ڈی وی", - "stats.fdv.description": "مکمل طور پر گھٹا ہوا ویلیوایشن (FDV) کل مارکیٹ ویلیو کا حساب لگاتا ہے یہ فرض کرتے ہوئے کہ تمام ٹوکن گردش میں ہیں۔", - "stats.marketCap": "مارکیٹ کیپ", - "stats.marketCap.description": "مارکیٹ کیپٹلائزیشن کسی اثاثے کی گردش کرنے والی سپلائی کی کل مارکیٹ ویلیو ہے۔", - "stats.noStatsAvailable": "کوئی اعدادوشمار دستیاب نہیں ہیں۔", - "stats.tvl": "کل قدر مقفل ہے۔", - "stats.tvl.description": "ٹوٹل ویلیو لاکڈ (TVL) تمام Uniswap لیکویڈیٹی پولز میں دستیاب اثاثہ کی مجموعی رقم ہے۔", - "stats.volume.1d": "1 دن کا حجم", - "stats.volume.1d.description": "1 دن کا حجم اس اثاثہ کی رقم ہے جس کی گزشتہ 24 گھنٹوں کے دوران یونی سویپ پر تجارت کی گئی ہے۔", - "stats.volume.1d.long": "1D والیوم", - "stats.volume.1d.short": "1D والیوم", - "stats.volume.description": "حجم اس اثاثہ کی رقم ہے جس کی تجارت منتخب وقت کے فریم کے دوران Uniswap پر کی گئی ہے۔", - "swap.allow.oneTime": "{{sym}} کی اجازت دیں (ایک بار)", - "swap.approveAndSubmit": "منظور کریں اور جمع کرائیں۔", - "swap.approveAndSwap": "منظور کریں اور تبادلہ کریں۔", - "swap.balance.amount": "بیلنس: {{amount}}", - "swap.bestPrice.through": "روٹ بذریعہ {{provider}}", - "swap.bestRoute.cost": "نیٹ ورک کی لاگت میں سب سے زیادہ موثر راستے کا تخمینہ ~{{gasPrice}} لاگت کا ہے۔ ", - "swap.bridging.title": "نیٹ ورکس میں تبادلہ", - "swap.bridging.warning.description": "آپ {{fromNetwork}} سے {{toNetwork}}میں تبدیل ہو رہے ہیں۔ اسے \"برجنگ\" کے نام سے بھی جانا جاتا ہے، جو آپ کے ٹوکنز کو ایک نیٹ ورک سے دوسرے نیٹ ورک میں منتقل کرتا ہے۔", - "swap.button.confirmSignAndSwap": "دستخط اور تبادلہ کی تصدیق کریں۔", - "swap.button.confirmSwapAnyways": "بہرحال تبادلہ کی تصدیق کریں۔", - "swap.button.confirmUnwrap": "کھولنے کی تصدیق کریں۔", - "swap.button.max": "زیادہ سے زیادہ", - "swap.button.review": "جائزہ لیں", - "swap.button.submitting": "تبادلہ جمع کرایا جا رہا ہے...", - "swap.button.submitting.keep.open": "اپنا بٹوہ کھلا رکھیں...", - "swap.button.submitting.passkey": "پاسکی سے تصدیق کریں۔", - "swap.button.swap": "تبادلہ", - "swap.button.swapAnyways": "بہرحال تبادلہ کریں۔", - "swap.button.unwrap": "کھولنا", - "swap.button.wrap": "لپیٹنا", - "swap.buy.countryModal.placeholder": "ملک یا علاقے کے لحاظ سے تلاش کریں۔", - "swap.cancel.cannotExecute_one": "منسوخی پر کارروائی سے پہلے آپ کا تبادلہ عمل میں آ سکتا ہے۔ آپ کے نیٹ ورک کے اخراجات واپس نہیں کیے جا سکتے۔ کیا آپ آگے بڑھنا چاہتے ہیں؟", - "swap.cancel.cannotExecute_other": "منسوخی پر کارروائی سے پہلے آپ کی تبدیلیاں عمل میں آ سکتی ہیں۔ آپ کے نیٹ ورک کے اخراجات واپس نہیں کیے جا سکتے۔ کیا آپ آگے بڑھنا چاہتے ہیں؟", - "swap.confirmApproveAndSwap": "منظوری اور تبادلہ کی تصدیق کریں۔", - "swap.confirmLimit": "حد کی تصدیق کریں۔", - "swap.confirmSwap": "تبادلہ کی تصدیق کریں۔", - "swap.confirmWrap": "لپیٹ کی تصدیق کریں۔", - "swap.deadline.settings.title": "تبدیل کرنے کی آخری تاریخ", - "swap.deadline.settings.title.short": "Tx. آخری تاریخ", - "swap.details.completed": "تبادلہ مکمل", - "swap.details.estimatedTime": "تخمینہ وقت", - "swap.details.fasterUnichainSwaps": "یونیچین کے ذریعے چلنے والے تیز تر تبادلہ", - "swap.details.feeOnTransfer": "{{tokenSymbol}} فیس", - "swap.details.feeOnTransfer.symbol": "{{tokenSymbol}} ٹوکن فیس", - "swap.details.instant": "فوری", - "swap.details.newQuote.input": "نیا ان پٹ", - "swap.details.newQuote.output": "نیا آؤٹ پٹ", - "swap.details.orderRouting": "آرڈر روٹنگ", - "swap.details.orderRoutingInfo": "اس سویپ کو اکروس کے ذریعے روٹ کیا جاتا ہے، ایک وکندریقرت پروٹوکول جو حفاظت، تیز رفتار عمل درآمد، اور کم قیمتوں کو ترجیح دیتے ہوئے نیٹ ورکس میں اثاثوں کو منتقل کرتا ہے۔", - "swap.details.poweredBy": "کی طرف سے طاقت", - "swap.details.rate": "شرح", - "swap.details.slippage": "زیادہ سے زیادہ پھسلنا", - "swap.details.slippage.uniswap": "غیر تبدیل شدہ محفوظ slippage", - "swap.details.swappedIn.unichain": "Unichain پر {{time}}s میں مکمل ہوا۔", - "swap.details.uniswapFee": "فیس", - "swap.error.default": "آپ کو اپنی پھسلن کی رواداری کو بڑھانے کی ضرورت پڑسکتی ہے۔ نوٹ: فیس آن ٹرانسفر اور ری بیس ٹوکن یونی سویپ V3 کے ساتھ مطابقت نہیں رکھتے۔", - "swap.error.expectedToFail": "آپ کا تبادلہ ناکام ہونے کی توقع ہے۔", - "swap.error.fiatInputUnavailable": "{{fiatCurrencyCode}} ان پٹ دستیاب نہیں ہے۔", - "swap.error.modifiedByWallet": "آپ کے بدلے میں آپ کے بٹوے کے ذریعے ترمیم کی گئی تھی۔ اگر یہ غلطی تھی، تو براہ کرم فوری طور پر منسوخ کریں یا اپنے فنڈز کھونے کا خطرہ مول لیں۔", - "swap.error.rejected": "لین دین مسترد کر دیا گیا۔", - "swap.error.undefinedObject": "اس سویپ کو انجام دینے کی کوشش کرتے وقت ایک خرابی پیش آگئی۔ آپ کو اپنی پھسلن کی رواداری کو بڑھانے کی ضرورت پڑسکتی ہے۔ اگر یہ کام نہیں کرتا ہے، تو ہو سکتا ہے کہ آپ جس ٹوکن کی تجارت کر رہے ہیں اس کے ساتھ عدم مطابقت ہو۔ نوٹ: فیس آن ٹرانسفر اور ری بیس ٹوکن یونی سویپ V3 کے ساتھ مطابقت نہیں رکھتے۔", - "swap.error.unknown": "نامعلوم خامی.", - "swap.error.v2.expired": "یہ لین دین نہیں بھیجا جا سکا کیونکہ آخری تاریخ گزر چکی ہے۔ براہ کرم چیک کریں کہ آپ کی لین دین کی آخری تاریخ بہت کم نہیں ہے۔", - "swap.error.v2.k": "Unswap invariant x*y=k سویپ سے مطمئن نہیں تھا۔ اس کا عام طور پر مطلب ہے کہ آپ جن ٹوکنز کو تبدیل کر رہے ہیں ان میں سے ایک منتقلی پر حسب ضرورت رویے کو شامل کرتا ہے۔", - "swap.error.v2.slippage": "یہ لین دین یا تو قیمت کی نقل و حرکت یا منتقلی پر فیس کی وجہ سے کامیاب نہیں ہوگا۔ اپنی پھسلن برداشت کو بڑھانے کی کوشش کریں۔", - "swap.error.v2.transferInput": "ان پٹ ٹوکن کو منتقل نہیں کیا جا سکتا۔ ان پٹ ٹوکن میں کوئی مسئلہ ہو سکتا ہے۔", - "swap.error.v2.transferOutput": "آؤٹ پٹ ٹوکن کو منتقل نہیں کیا جا سکتا۔ آؤٹ پٹ ٹوکن میں کوئی مسئلہ ہو سکتا ہے۔", - "swap.error.v3.slippage": "قیمت کی حرکت کی وجہ سے یہ لین دین کامیاب نہیں ہوگا۔ اپنی پھسلن برداشت کو بڑھانے کی کوشش کریں۔ نوٹ: ٹرانسفر اور ریبیس ٹوکنز پر فیس Uniswap V3 کے ساتھ مطابقت نہیں رکھتی۔", - "swap.error.v3.transferOutput": "آؤٹ پٹ ٹوکن کو منتقل نہیں کیا جا سکتا۔ آؤٹ پٹ ٹوکن میں کوئی مسئلہ ہو سکتا ہے۔ نوٹ: ٹرانسفر اور ریبیس ٹوکنز پر فیس Uniswap V3 کے ساتھ مطابقت نہیں رکھتی۔", - "swap.estimatedDifference.label": "موجودہ لیکویڈیٹی کی وجہ سے آپ کے ان پٹ اور آؤٹ پٹ کی قدروں میں بڑا فرق ہوگا۔", - "swap.expected.price": "متوقع قیمت", - "swap.fail.batched": "ہو سکتا ہے آپ کا منسلک بٹوہ 1-کلک سویپ کو سپورٹ نہ کرے۔ اس کے بجائے معیاری تبادلہ آزمائیں۔", - "swap.fail.batched.retry": "معیاری تبادلہ آزمائیں۔", - "swap.fail.batched.title": "1-کلک سویپ ناکام ہو گیا۔", - "swap.fail.message": "پھسلن کو زیادہ قدر میں ایڈجسٹ کرنے کی کوشش کریں۔", - "swap.fail.uniswapX": "تبادلہ کو UniswapX کے ساتھ مکمل نہیں کیا جا سکا۔ کلاسک Uniswap API کے ذریعے اسے روٹ کرنے کے لیے اپنے سویپ کو دوبارہ آزمائیں۔", - "swap.fees.experience": "یہ فیس کچھ ٹوکن جوڑوں پر لاگو ہوتی ہے تاکہ Uniswap کے ساتھ بہترین تجربہ کو یقینی بنایا جا سکے۔ اس کی ادائیگی آؤٹ پٹ ٹوکن میں کی جاتی ہے اور اسے پہلے ہی اقتباس میں شامل کیا جا چکا ہے۔", - "swap.fees.jupiter.label": "مشتری کی فیس", - "swap.fees.jupiter.message": "سولانا پر فیس Jupiter API کے ذریعہ وصول کی جاتی ہے۔ Uniswap Labs یہ فیس وصول نہیں کرتی ہے۔", - "swap.fees.noFee": "Uniswap کے ساتھ بہترین تجربہ کو یقینی بنانے کے لیے منتخب ٹوکن جوڑوں پر فیس لاگو کی جاتی ہے۔ اس تبادلہ سے وابستہ کوئی فیس نہیں ہے۔", - "swap.finalizingQuote": "اقتباس کو حتمی شکل دی جا رہی ہے...", - "swap.form.header": "تبادلہ", - "swap.form.warning.output.fotFees": "{{fotCurrencySymbol}}کی ٹوکن فیس کی وجہ سے، ادل بدل کی رقم صرف ان پٹ فیلڈ کا استعمال کرتے ہوئے درج کی جا سکتی ہے", - "swap.form.warning.output.fotFees.fallback": "ٹوکن فیس کی وجہ سے، ادل بدل کی رقم صرف ان پٹ فیلڈ کا استعمال کرتے ہوئے درج کی جا سکتی ہے۔", - "swap.form.warning.output.solana": "سولانا پر قطعی آؤٹ پٹ تعاون یافتہ نہیں ہے۔", - "swap.form.warning.restore": "اپنے بٹوے کو تبدیل کرنے کے لیے بحال کریں۔", - "swap.frontrun.warning": "آپ کا لین دین سب سے آگے ہو سکتا ہے اور اس کے نتیجے میں ناگوار تجارت ہو سکتی ہے۔", - "swap.header.viewOnly": "صرف دیکھنے کے لیے", - "swap.impactOfTrade": "اس پول کی مارکیٹ قیمت پر آپ کی تجارت کا اثر۔", - "swap.impactOfTrade.uniswapx": "مارکیٹ کی قیمت اور عمل درآمد کی قیمت کے درمیان فرق، UniswapX گیس کی بچت میں فیکٹرنگ۔", - "swap.impactOfTrade.uniswapx.missing": "قیمت کے اثرات کے حساب کتاب کم لیکویڈیٹی والے جوڑوں کے لیے دستیاب نہیں ہو سکتے ہیں۔", - "swap.inputEstimated.atMost": "ان پٹ کا تخمینہ لگایا گیا ہے۔ آپ زیادہ سے زیادہ پر فروخت کریں گے یا لین دین واپس ہو جائے گا۔", - "swap.limit": "حد", - "swap.limitFilled": "حد ہو گئی!", - "swap.limitSubmitted": "حد جمع کر دی گئی۔", - "swap.marketPrice.outsideRange.label": "مارکیٹ کی قیمت آپ کی مخصوص قیمت کی حد سے باہر ہے۔ صرف واحد اثاثہ جمع۔", - "swap.min.price": "کم از کم قیمت", - "swap.networkCost.paidIn": "لین دین کرنے کے لیے نیٹ ورک کی قیمت {{chainName}} نیٹ ورک پر {{sym}} میں ادا کی جاتی ہے۔", - "swap.orderRouting": "آرڈر روٹنگ", - "swap.outputEstimated.atLeast": "آؤٹ پٹ کا تخمینہ لگایا گیا ہے۔ آپ کو کم از کم ملے گا یا لین دین واپس ہو جائے گا۔", - "swap.placeOrder": "حکم صادر کریں", - "swap.priceImpact": "قیمت کا اثر", - "swap.request.title.full": "تبادلہ {{inputCurrencySymbol}} → {{outputCurrencySymbol}}", - "swap.request.title.short": "ٹوکن تبدیل کریں۔", - "swap.review": "تبادلہ کا جائزہ لیں۔", - "swap.review.summary": "آپ تبادلہ کر رہے ہیں۔", - "swap.reviewLimit": "جائزہ کی حد", - "swap.route.optimizedGasCost": "یہ راستہ تقسیم راستوں، متعدد ہاپس، اور ہر قدم کے نیٹ ورک کے اخراجات پر غور کرتا ہے۔", - "swap.routing.jupiter.description": "مشتری آپ کو بہترین قیمتیں فراہم کرنے کے لیے متعدد ذرائع سے لیکویڈیٹی کو جمع کرتا ہے۔", - "swap.routing.uniswapAutoRouter.description": "Uniswap آٹو راؤٹر آپ کو بہترین قیمتیں فراہم کرنے کے لیے بہترین راستوں اور نیٹ ورک کے اخراجات پر غور کرتا ہے۔", - "swap.settings.deadline.tooltip": "اگر آپ کا لین دین اس مدت سے زیادہ زیر التوا ہے تو وہ واپس آجائے گا۔ (زیادہ سے زیادہ: 3 دن)۔", - "swap.settings.deadline.warning": "ہائی ڈیڈ لائن", - "swap.settings.oneClickSwap.title": "1-کلک سویپس", - "swap.settings.oneClickSwap.tooltip": "تیز، کم لاگت والے تبادلہ کے لیے معیاری تجارتی کارروائیوں کو ایک ساتھ بنڈل کرتا ہے۔", - "swap.settings.protection.description": "سویپ پروٹیکشن آن کے ساتھ، آپ کے ایتھریم ٹرانزیکشنز کو سینڈوچ حملوں سے محفوظ رکھا جائے گا، ناکامی کے کم امکانات کے ساتھ۔", - "swap.settings.protection.subtitle.supported": "{{chainName}} نیٹ ورک", - "swap.settings.protection.subtitle.unavailable": "{{chainName}}پر دستیاب نہیں ہے۔", - "swap.settings.protection.title": "تبادلہ تحفظ", - "swap.settings.routingPreference.option.default.description": "اس اختیار کو منتخب کرنے سے آپ کے سویپ کے لیے سب سے زیادہ موثر راستے کی نشاندہی ہوتی ہے۔", - "swap.settings.routingPreference.option.default.description.preV4": "Uniswap کلائنٹ قیمت اور نیٹ ورک کی لاگت کے لحاظ سے سب سے سستے تجارتی آپشن کا انتخاب کرتا ہے۔", - "swap.settings.routingPreference.option.default.description.uniswapXUnavailable": "UniswapX آپ کے بٹوے کے لیے دستیاب نہیں ہے۔", - "swap.settings.routingPreference.option.default.tooltip": "ایک راستے کی شناخت v2، v3، اور کچھ v4 پولز کو مدنظر رکھتے ہوئے کی جاتی ہے، تخمینہ قیمت کے اثرات اور نیٹ ورک کی لاگت میں فیکٹرنگ۔", - "swap.settings.routingPreference.option.v2.title": "v2 پولز کو فعال کریں۔", - "swap.settings.routingPreference.option.v3.title": "v3 پولز کو فعال کریں۔", - "swap.settings.routingPreference.option.v4.hooks.title": "v4 ہک پولز کو فعال کریں۔", - "swap.settings.routingPreference.option.v4.hooks.tooltip": "V4 ہکس کے راستے پہلے سے منظور شدہ ہکس کے سیٹ کے ذریعے تبدیل ہوتے ہیں۔", - "swap.settings.routingPreference.option.v4.title": "v4 پولز کو فعال کریں۔", - "swap.settings.routingPreference.title": "تجارت کے اختیارات", - "swap.settings.slippage.alert": "اونچی پھسلن", - "swap.settings.slippage.control.auto": "آٹو", - "swap.settings.slippage.description": "اگر قیمت slippage فیصد سے زیادہ تبدیل ہوتی ہے تو آپ کا لین دین واپس آجائے گا۔", - "swap.settings.slippage.input.message": "اگر قیمت مزید کم ہو جاتی ہے، تو آپ کا لین دین واپس ہو جائے گا۔ ذیل میں وہ کم از کم رقم ہے جو آپ کو وصول کرنے کی ضمانت ہے۔", - "swap.settings.slippage.input.receive.title": "کم از کم وصول کریں۔", - "swap.settings.slippage.output.message": "اگر قیمت مزید کم ہو جاتی ہے، تو آپ کا لین دین واپس ہو جائے گا۔ ذیل میں آپ کو زیادہ سے زیادہ رقم خرچ کرنے کی ضرورت ہوگی۔", - "swap.settings.slippage.output.spend.title": "زیادہ سے زیادہ خرچ کریں۔", - "swap.settings.slippage.warning": "بہت زیادہ پھسلن", - "swap.settings.slippage.warning.description": "20% سے اوپر کی پھسلن کے نتیجے میں ایک ناموافق تجارت کا امکان ہے۔ فرنٹ رن ہونے کے خطرے کو کم کرنے کے لیے، اپنی سیٹنگز کو کم کریں۔", - "swap.settings.slippage.warning.hover": "اس کے نتیجے میں ناگوار تجارت ہو سکتی ہے۔ اپنی slippage ترتیب کو کم کرنے کی کوشش کریں۔", - "swap.settings.slippage.warning.max": "{{maxSlippageTolerance}}سے کم قدر درج کریں۔", - "swap.settings.slippage.warning.message": "پھسلنا ضرورت سے زیادہ ہو سکتا ہے۔", - "swap.settings.slippage.warning.min": "0 سے بڑی قدر درج کریں۔", - "swap.settings.title": "تبدیلی کی ترتیبات", - "swap.settings.transactionRevertPrice": "اگر قیمت اس فیصد سے زیادہ ناموافق طور پر تبدیل ہوتی ہے تو آپ کا لین دین واپس آجائے گا۔", - "swap.signAndSwap": "دستخط کریں اور تبادلہ کریں۔", - "swap.slippage.amt": "{{amt}} پھسلنا", - "swap.slippage.bridging": "نیٹ ورکس میں تبادلہ کرتے وقت کوئی پھسلن نہیں ہوتی", - "swap.slippage.description": "تبادلہ پر متوقع اور لاگو قیمت کے درمیان فرق۔ کم لیکویڈیٹی، مارکیٹ میں اتار چڑھاؤ، یا بوٹس کی وجہ سے اختلافات ہو سکتے ہیں۔ \n\nسامنے آنے والے بوٹس اور MEV کے خلاف یونیسیاپ پروٹیکشن گارڈز۔", - "swap.slippage.settings.title": "پھسلن کی ترتیبات", - "swap.slippage.tooltip": "آپ کے لین دین سے پہلے قیمت کی زیادہ سے زیادہ حرکت واپس آجائے گی۔", - "swap.slippageBelow.warning": "{{amt}} کے نیچے پھسلنے کے نتیجے میں ٹرانزیکشن ناکام ہو سکتی ہے۔", - "swap.submitted": "تبادلہ جمع کرایا", - "swap.success": "تبدیلی کامیابی!", - "swap.tokenOwnFees": "کچھ ٹوکن جب خریدے یا بیچے جاتے ہیں تو فیس لیتے ہیں، جو ٹوکن جاری کرنے والے کی طرف سے مقرر کیا جاتا ہے۔ Uniswap ان میں سے کوئی فیس وصول نہیں کرتا ہے۔", - "swap.tradeRoutes": "تجارتی راستے", - "swap.transaction.deadline": "لین دین کی آخری تاریخ", - "swap.transaction.revertAfter": "اگر آپ کا لین دین اس مدت سے زیادہ عرصے سے زیر التوا ہے تو وہ واپس آجائے گا۔", - "swap.warning.enterLargerAmount.title": "ایک بڑی رقم درج کریں۔", - "swap.warning.expectedFailure.increaseSlippage": "اپنی پھسلن کو بڑھانے کی کوشش کریں۔", - "swap.warning.expectedFailure.titleMay": "یہ تبادلہ ناکام ہو سکتا ہے۔", - "swap.warning.insufficientBalance.title": "آپ کے پاس کافی {{currencySymbol}}نہیں ہے۔", - "swap.warning.insufficientGas.button": "کافی نہیں {{currencySymbol}}", - "swap.warning.insufficientGas.button.bridge": "{{networkName}}پر {{ tokenSymbol }} کے لیے تبادلہ کریں۔", - "swap.warning.insufficientGas.button.buy": "{{ tokenSymbol }}خریدیں۔", - "swap.warning.insufficientGas.button.buyWithCard": "کارڈ کے ساتھ خریدیں۔", - "swap.warning.insufficientGas.message.withNetwork": "تبدیل کرنے کے لیے کافی {{currencySymbol}} پر {{networkName}}", - "swap.warning.insufficientGas.message.withoutNetwork": "تبدیل کرنے کے لیے کافی نہیں {{currencySymbol}}", - "swap.warning.insufficientGas.title": "آپ کے پاس نیٹ ورک کی لاگت کو پورا کرنے کے لیے کافی {{currencySymbol}} نہیں ہے۔", - "swap.warning.networkFee.allow": "{{ inputTokenSymbol }} کی اجازت دیں (ایک بار)", - "swap.warning.networkFee.delegation.message": "یہ آپ کے لین دین پر کارروائی کرنے اور یونیچین پر اپنے سمارٹ والیٹ کو فعال کرنے کی لاگت ہے۔ Uniswap Labs ان فیسوں کا کوئی حصہ وصول نہیں کرتی ہے۔", - "swap.warning.networkFee.highRelativeToValue": "نیٹ ورک کی لاگت آپ کے لین دین کی کل قیمت کے 10% سے زیادہ ہے۔ یہ بلاکچین پر آپ کے لین دین پر کارروائی کرنے کی لاگت ہے۔ Uniswap ان فیسوں کا کوئی حصہ وصول نہیں کرتا ہے۔", - "swap.warning.networkFee.highRelativeToValue.unichain": "نیٹ ورک کی لاگت آپ کے لین دین کی کل قیمت کے 10% سے زیادہ ہے۔ یہ بلاکچین پر آپ کے لین دین پر کارروائی کرنے کی لاگت ہے۔", - "swap.warning.networkFee.includesDelegation": "سمارٹ والیٹ ایکٹیویشن پر مشتمل ہے۔", - "swap.warning.networkFee.message": "یہ بلاکچین پر آپ کے لین دین پر کارروائی کرنے کی لاگت ہے۔ Uniswap ان فیسوں کا کوئی حصہ وصول نہیں کرتا ہے۔", - "swap.warning.networkFee.message.unichain": "یہ بلاکچین پر آپ کے لین دین پر کارروائی کرنے کی لاگت ہے۔", - "swap.warning.networkFee.message.uniswapX": "یہ بلاکچین پر آپ کے لین دین پر کارروائی کرنے کی لاگت ہے۔ Uniswap ان فیسوں کا کوئی حصہ وصول نہیں کرتا ہے۔ UniswapX بہتر قیمتوں اور گیس سے پاک تبادلہ کے لیے لیکویڈیٹی ذرائع کو جمع کرتا ہے۔", - "swap.warning.networkFee.message.uniswapX.title": "UniswapX کے ساتھ نیٹ ورک کی کوئی قیمت نہیں ہے۔", - "swap.warning.networkFee.message.uniswapX.unichain": "یہ بلاکچین پر آپ کے لین دین پر کارروائی کرنے کی لاگت ہے۔ UniswapX بہتر قیمتوں اور گیس سے پاک تبادلہ کے لیے لیکویڈیٹی ذرائع کو جمع کرتا ہے۔", - "swap.warning.noQuotesFound.bridging.message": "کوئی برجنگ کوٹس نہیں ملے۔ اس وقت سرکاری پل استعمال کرنے کی کوشش کریں۔", - "swap.warning.noQuotesFound.title": "کوئی اقتباسات نہیں ملے", - "swap.warning.noRoutesFound.message": "آپ کے منتخب کردہ ٹوکنز کے لیے فی الحال کوئی راستہ دستیاب نہیں ہے۔ براہ کرم ایک مختلف جوڑا آزمائیں یا بعد میں دوبارہ چیک کریں۔", - "swap.warning.noRoutesFound.title": "کوئی راستہ دستیاب نہیں ہے۔", - "swap.warning.offline.message": "ہو سکتا ہے آپ کا انٹرنیٹ کنکشن ختم ہو گیا ہو یا نیٹ ورک بند ہو جائے۔ براہ کرم اپنا انٹرنیٹ کنکشن چیک کریں اور دوبارہ کوشش کریں۔", - "swap.warning.offline.title": "آپ آف لائن ہیں۔", - "swap.warning.priceImpact.message": "فی الحال دستیاب {{outputCurrencySymbol}} لیکویڈیٹی کی مقدار کی وجہ سے، آپ جتنا زیادہ {{inputCurrencySymbol}} تبادلہ کرنے کی کوشش کریں گے، آپ کو اتنا ہی کم {{outputCurrencySymbol}} ملے گا۔", - "swap.warning.priceImpact.message.veryHigh": "اس لین دین کے نتیجے میں اس پول کی مارکیٹ قیمت پر {{priceImpactValue}} قیمت کا اثر پڑے گا اور اس کے نتیجے میں فنڈز کا نقصان ہوگا۔", - "swap.warning.priceImpact.title": "زیادہ قیمت کا اثر ({{priceImpactValue}})", - "swap.warning.priceImpact.title.veryHigh": "بہت زیادہ قیمت کا اثر ({{priceImpactValue}})", - "swap.warning.queuedOrder.appClosed": "آپ کا ٹرانزیکشن جمع نہیں ہو سکا کیونکہ آپ نے ایپ بند کر دی تھی۔", - "swap.warning.queuedOrder.approvalFailed": "ٹوکن کی منظوری ناکام ہونے کی وجہ سے آپ کا لین دین جمع نہیں ہو سکا۔", - "swap.warning.queuedOrder.stale": "آپ کا ٹرانزیکشن جمع نہیں ہو سکا کیونکہ آپ نے ایپ بند کر دی تھی یا منظوری میں کافی وقت لگا تھا۔", - "swap.warning.queuedOrder.submissionFailed": "آپ کی ٹرانزیکشن جمع کرانے میں ایک مسئلہ تھا۔", - "swap.warning.queuedOrder.title": "تبادلہ منسوخ کر دیا گیا۔", - "swap.warning.rateLimit.message": "براہ کرم چند منٹوں میں دوبارہ کوشش کریں۔", - "swap.warning.rateLimit.title": "شرح کی حد سے تجاوز کر گیا۔", - "swap.warning.router.message": "ہو سکتا ہے آپ کا کنکشن ختم ہو گیا ہو یا نیٹ ورک بند ہو جائے۔ اگر مسئلہ برقرار رہتا ہے، تو براہ کرم بعد میں دوبارہ کوشش کریں۔", - "swap.warning.router.title": "یہ تجارت ابھی مکمل نہیں ہو سکتی", - "swap.warning.tokenBlocked.button": "{{tokenSymbol}} مسدود ہے۔", - "swap.warning.tokenBlockedFallback.button": "ٹوکن مسدود ہے۔", - "swap.warning.uniswapFee.message": "Uniswap کے ساتھ بہترین تجربہ کو یقینی بنانے کے لیے فیس کا اطلاق ہوتا ہے۔", - "swap.warning.uniswapFee.message.default": "Uniswap کے ساتھ بہترین تجربہ کو یقینی بنانے کے لیے فیس کا اطلاق ہوتا ہے۔ اس تبادلہ کے ساتھ کوئی فیس وابستہ نہیں ہے۔", - "swap.warning.uniswapFee.message.included": "Uniswap کے ساتھ بہترین تجربہ کو یقینی بنانے کے لیے فیس کا اطلاق کیا جاتا ہے، اور اس اقتباس میں پہلے ہی شامل کیا جا چکا ہے۔", - "swap.warning.uniswapFee.title": "تبادلہ فیس", - "swap.warning.viewOnly.message": "ٹوکنز کو تبدیل کرنے کے لیے آپ کو ریکوری فقرے کے ذریعے یہ پرس درآمد کرنا ہوگا۔", - "swap.wrap.token": "لپیٹیں {{sym}}", - "tdp.balanceSummary.otherNetworks": "دوسرے نیٹ ورکس پر", - "tdp.balanceSummary.otherNetworksBalance": "دوسرے نیٹ ورکس پر بیلنس", - "tdp.balanceSummary.title": "آپ کا بیلنس", - "tdp.button.getToken": "{{ tokenSymbol }}حاصل کریں۔", - "tdp.button.getTokenFallback": "ٹوکن حاصل کریں۔", - "tdp.loading.title.default": "کے لیے ٹوکن ڈیٹا", - "tdp.loading.title.withChain": "{{chainName}}پر کے لیے ٹوکن ڈیٹا", - "tdp.nameNotFound": "نام نہیں ملا", - "tdp.noInfoAvailable": "کوئی ٹوکن معلومات دستیاب نہیں ہے۔", - "tdp.noTestnetSupportDescription": "کچھ ٹیسٹ نیٹ ٹوکن تبدیل کرنے، بھیجنے یا خریدنے کی حمایت نہیں کرتے ہیں۔", - "tdp.symbolNotFound": "علامت نہیں ملی", - "testnet.modal.swapDeepLink.description.toProdMode": "اس کارروائی کے لیے ٹیسٹ نیٹ موڈ کو غیر فعال کرنے کی ضرورت ہے۔ ٹیسٹ نیٹ موڈ کو ترتیبات کے اندر کسی بھی وقت دوبارہ فعال کیا جا سکتا ہے۔", - "testnet.modal.swapDeepLink.description.toTestnetMode": "اس کارروائی کے لیے ٹیسٹ نیٹ وضع کو فعال کرنے کی ضرورت ہے۔ testnets پر ٹوکن کی کوئی حقیقی قدر نہیں ہوتی۔ ٹیسٹ نیٹ موڈ کو ترتیبات کے اندر کسی بھی وقت غیر فعال کیا جا سکتا ہے۔", - "testnet.modal.swapDeepLink.title.toProdMode": "ٹیسٹ نیٹ موڈ کو غیر فعال کریں۔", - "testnet.modal.swapDeepLink.title.toTestnetMode": "ٹیسٹ نیٹ موڈ کو فعال کریں۔", - "testnet.unsupported": "یہ فعالیت ٹیسٹ نیٹ موڈ میں تعاون یافتہ نہیں ہے۔", - "themeToggle.theme": "خیالیہ", - "title.buySellTradeEthereum": "Uniswap پر Ethereum اور دیگر ٹاپ ٹوکن خریدیں، بیچیں اور تجارت کریں۔", - "title.createGovernanceOn": "Uniswap پر گورننس کی ایک نئی تجویز بنائیں", - "title.createGovernanceTo": "گورننس کی ایک نئی تجویز بنائیں جس پر UNI ہولڈرز ووٹ ڈالیں۔ UNI ٹوکن یونی سویپ گورننس میں ووٹنگ شیئرز کی نمائندگی کرتے ہیں۔", - "title.earnFees": "جب دوسرے یونی سویپ پر لیکویڈیٹی پولز میں ٹوکن شامل کر کے بدلتے ہیں تو فیس کمائیں۔", - "title.easilyRemove": "اپنی لیکویڈیٹی کو آسانی سے Uniswap v2 سے ہٹائیں اور Uniswap v3 میں جمع کریں۔", - "title.easilyRemoveV4": "Uniswap v2 اور v3 سے اپنی لیکویڈیٹی کو آسانی سے ہٹا کر Uniswap v4 میں جمع کریں۔", - "title.extension.uninstall": "ایکسٹینشن ان انسٹال ہو گئی۔", - "title.extensionPasskeyLogIn": "پاسکی کے ساتھ لاگ ان کریں۔", - "title.managePasskeys": "یون بدل | اپنی پاسکیز کا نظم کریں۔", - "title.migratev2": "v2 پول لیکویڈیٹی کو Uniswap v3 میں منتقل کریں۔", - "title.migratev3": "پول لیکویڈیٹی کو Uniswap v4 میں منتقل کریں۔", - "title.placeLimit": "Unswap پر حد کے آرڈر دیں۔", - "title.realTime": "ریئل ٹائم قیمتیں، چارٹس، لین دین کا ڈیٹا، اور بہت کچھ۔", - "title.removeLiquidityv2": "Uniswap پر پول لیکویڈیٹی (v2) کو ہٹا دیں۔", - "title.removePoolLiquidity": "Uniswap پر پول لیکویڈیٹی کو ہٹا دیں۔", - "title.removeTokensv2": "v2 لیکویڈیٹی پولز سے اپنے ٹوکنز کو ہٹا دیں۔", - "title.removev3Liquidity": "v3 لیکویڈیٹی پولز سے اپنے ٹوکنز کو ہٹا دیں۔", - "title.sendCrypto": "کرپٹو بھیجیں۔", - "title.sendTokens": "Uniswap پر ٹوکن بھیجیں۔", - "title.swappingMadeSimple": "Ethereum، Base، Arbitrum، Polygon، Unichain اور مزید پر فوری طور پر کرپٹو خریدیں اور فروخت کریں۔ DeFi پلیٹ فارم جس پر لاکھوں لوگوں کا بھروسہ ہے۔", - "title.tradeTokens": "ٹریڈ ٹوکنز اور لیکویڈیٹی فراہم کرتے ہیں۔ ریئل ٹائم قیمتیں، چارٹس، لین دین کا ڈیٹا، اور بہت کچھ۔", - "title.uniswapTradeCrypto": "یون بدل | DeFi کے معروف ایکسچینج پر کرپٹو کی تجارت کریں۔ ", - "title.uniToken": "UNI ٹوکن یونی سویپ گورننس میں ووٹنگ شیئرز کی نمائندگی کرتے ہیں۔ آپ ہر تجویز پر خود ووٹ دے سکتے ہیں یا اپنے ووٹ کسی تیسرے فریق کو دے سکتے ہیں۔", - "title.voteOnGov": "Uniswap پر گورننس کی تجاویز پر ووٹ دیں۔", - "token.balances.main": "آپ کا بیلنس", - "token.balances.other": "دوسرے نیٹ ورکس پر بیلنس", - "token.balances.viewOnly": "{{ownerAddress}}کا بیلنس", - "token.bridge": "{{label}} ٹوکن پل", - "token.chart.candlestick.unavailable": "کینڈل سٹک چارٹس اس ٹوکن کے لیے دستیاب نہیں ہیں۔", - "token.chart.tooltip": "فیس: {{amount}}", - "token.details": "ٹوکن کی تفصیلات", - "token.error.unknown": "نامعلوم ٹوکن", - "token.fee.buy.label": "خریدنے کی فیس", - "token.fee.label": "فیس", - "token.fee.sell.label": "فروخت کی فیس", - "token.links.title": "لنکس", - "token.links.twitter": "ٹویٹر", - "token.links.website": "ویب سائٹ", - "token.notFound.description": "معذرت، ہمیں اس ٹوکن کے لیے کوئی معلومات نہیں مل سکیں۔ نام اور پتہ چیک کریں اور دوبارہ کوشش کریں۔", - "token.notFound.title": "ٹوکن نہیں ملا", - "token.priceExplorer.error.description": "کچھ غلط ہو گیا.", - "token.priceExplorer.error.title": "قیمت کا چارٹ لوڈ نہیں ہو سکا", - "token.priceExplorer.timeRangeLabel.all": "تمام وقت", - "token.priceExplorer.timeRangeLabel.day": "1D", - "token.priceExplorer.timeRangeLabel.day.verbose": "1 دن", - "token.priceExplorer.timeRangeLabel.hour": "1 ایچ", - "token.priceExplorer.timeRangeLabel.month": "1M", - "token.priceExplorer.timeRangeLabel.month.verbose": "1 مہینہ", - "token.priceExplorer.timeRangeLabel.week": "1W", - "token.priceExplorer.timeRangeLabel.week.verbose": "1 ہفتہ", - "token.priceExplorer.timeRangeLabel.year": "1Y", - "token.priceExplorer.timeRangeLabel.year.verbose": "1 سال", - "token.safety.blocked.title.tokenNotAvailable": "{{tokenSymbol}} دستیاب نہیں ہے۔", - "token.safety.blocked.title.tokensNotAvailable": "{{tokenSymbol0}} اور {{tokenSymbol1}} دستیاب نہیں ہیں۔", - "token.safety.fee.detected": "ٹوکن فیس کا پتہ چلا", - "token.safety.fees.uniswapLabsDoesNotReceive": "Uniswap Labs ان میں سے کوئی فیس وصول نہیں کرتی ہے۔", - "token.safety.warning.alwaysDoYourResearch": "ہمیشہ اپنی تحقیق کریں۔", - "token.safety.warning.blocked.description.default_one": "آپ Uniswap ایپ کا استعمال کر کے اس ٹوکن کی تجارت نہیں کر سکتے۔", - "token.safety.warning.blocked.description.default_other": "آپ ان ٹوکنز کی تجارت Uniswap ایپ کا استعمال نہیں کر سکتے۔", - "token.safety.warning.copyContractAddress.message": "یہ ایک کنٹریکٹ ایڈریس ہے، جو بلاکچین پر ٹوکنز کے لیے ایک منفرد شناخت کنندہ کے طور پر کام کرتا ہے۔ آپ جو بھی کرپٹو اس ایڈریس پر بھیجیں گے وہ ضائع ہو جائے گا۔", - "token.safety.warning.copyContractAddress.title": "اس ایڈریس پر کرپٹو مت بھیجیں۔", - "token.safety.warning.dontShowWarningAgain": "مجھے یہ وارننگ دوبارہ مت دکھائیں۔", - "token.safety.warning.dontShowWarningAgainShort": "دوبارہ مت دکھانا", - "token.safety.warning.doYourOwnResearch": "آگے بڑھنے سے پہلے ہمیشہ اپنی تحقیق کریں۔", - "token.safety.warning.feeDescription": " چارج کرتا ہے جب {{action}}", - "token.safety.warning.flaggedAsMalicious": "نقصان دہ کے طور پر نشان زد کیا گیا۔", - "token.safety.warning.flaggedAsSuspicious": "مشکوک کے طور پر جھنڈا لگایا گیا۔", - "token.safety.warning.fotHigh.title": "زیادہ فیس کا پتہ چلا", - "token.safety.warning.fotLow.title": "فیس کا پتہ چلا", - "token.safety.warning.fotVeryHigh.title": "بہت زیادہ فیس کا پتہ چلا", - "token.safety.warning.honeypot.message": "{{tokenSymbol}} کو ناقابل فروخت کے طور پر جھنڈا لگایا گیا ہے۔ اس ٹوکن کو تبدیل کرنے سے آپ کے فنڈز ضائع ہو سکتے ہیں۔", - "token.safety.warning.honeypot.title": "100% سیل فیس کا پتہ چلا", - "token.safety.warning.impersonator": "دوسرے ٹوکن کی نقالی کرتا ہے۔", - "token.safety.warning.impersonator.title": "نقالی ٹوکن کا پتہ چلا", - "token.safety.warning.malicious.general.message": "{{tokenSymbol}} کو بلاک ایڈ کے ذریعہ نقصان دہ کے طور پر جھنڈا لگایا گیا ہے۔", - "token.safety.warning.malicious.impersonator.message": "{{tokenSymbol}} کو بلاک ایڈ نے ایک مختلف ٹوکن کاپی کرنے کی کوشش کرنے پر جھنڈا لگایا ہے۔ یہ وہ ٹوکن نہیں ہوسکتا ہے جسے آپ تبدیل کرنا چاہتے ہیں۔", - "token.safety.warning.malicious.impersonator.message.short": "{{tokenSymbol}} وہ ٹوکن نہیں ہو سکتا جسے آپ تبدیل کرنا چاہتے ہیں۔", - "token.safety.warning.malicious.title": "نقصان دہ ٹوکن کا پتہ چلا", - "token.safety.warning.mayResultInLoss": "اسے تبدیل کرنے سے فنڈز کا نقصان ہو سکتا ہے۔", - "token.safety.warning.medium.heading.named": "{{tokenSymbol}} معروف امریکی مرکزی تبادلے پر تجارت نہیں کی جاتی ہے۔", - "token.safety.warning.notListedOnExchanges": "معروف امریکی تبادلے میں درج نہیں ہے۔", - "token.safety.warning.potentialHoneypot.card.message": "بلاک ایڈ کے ذریعہ {{tokenSymbol}} کو مشکوک کے طور پر نشان زد کیا گیا ہے۔", - "token.safety.warning.potentialHoneypot.modal.message": "بلاک ایڈ کے ذریعہ {{tokenSymbol}} کو ایک ممکنہ ہنی پاٹ کے طور پر نشان زد کیا گیا ہے۔ آگے بڑھنے سے پہلے ہمیشہ اپنی تحقیق کریں۔", - "token.safety.warning.potentialHoneypot.title": "ممکنہ ہنی پاٹ کا پتہ چلا", - "token.safety.warning.sellFee100.message": "{{ tokenSymbol }} کو ناقابل فروخت کے طور پر جھنڈا لگایا گیا ہے۔", - "token.safety.warning.sellFee100.title": "100% سیل فیس کا پتہ چلا", - "token.safety.warning.spam.message": "{{tokenSymbol}} کو بلاک ایڈ کے ذریعہ اسپام کے طور پر جھنڈا لگایا گیا ہے۔", - "token.safety.warning.spam.title": "اسپام ٹوکن کا پتہ چلا", - "token.safety.warning.spamsUsers": "سپیم صارفین", - "token.safety.warning.tokenChargesFee.both.message": "{{tokenSymbol}} خریدے جانے پر {{buyFeePercent}} اور بیچنے پر {{sellFeePercent}} فیس لیتا ہے۔", - "token.safety.warning.tokenChargesFee.buy.message": "{{tokenSymbol}} خریدنے پر {{feePercent}} فیس لیتا ہے۔", - "token.safety.warning.tokenChargesFee.buy.message.descriptive": "{{tokenSymbol}} خریدنے پر {{feePercent}} فیس لیتا ہے۔ اسے تبدیل کرنے سے فنڈز کا نقصان ہو سکتا ہے۔ Uniswap Labs ان میں سے کوئی فیس وصول نہیں کرتی ہے۔", - "token.safety.warning.tokenChargesFee.sell.message": "{{tokenSymbol}} فروخت ہونے پر {{feePercent}} فیس لیتا ہے۔", - "token.safety.warning.tokenChargesFee.sell.message.descriptive": "{{tokenSymbol}} فروخت ہونے پر {{feePercent}} فیس لیتا ہے۔ اسے تبدیل کرنے سے فنڈز کا نقصان ہو سکتا ہے۔ Uniswap Labs ان میں سے کوئی فیس وصول نہیں کرتی ہے۔", - "token.safety.warning.tokenChargesFee.unknownFee.message": "{{tokenSymbol}} خریدنے یا بیچنے پر فیس لیتا ہے۔", - "token.safetyLevel.blocked.message": "آپ Unswap Wallet کا استعمال کرتے ہوئے اس ٹوکن کی تجارت نہیں کر سکتے۔", - "token.safetyLevel.medium.message.plural": "ان ٹوکنز کی تجارت امریکہ کے معروف مرکزی تبادلے پر نہیں کی جاتی ہے۔ آگے بڑھنے سے پہلے ہمیشہ اپنی تحقیق کریں۔", - "token.selector.search.error": "تلاش کے نتائج لوڈ نہیں ہو سکے۔", - "token.stats.fullyDilutedValuation": "مکمل طور پر کمزور تشخیص", - "token.stats.marketCap": "مارکیٹ کیپ", - "token.stats.priceHighYear": "52W ہائی", - "token.stats.priceLowYear": "52W کم", - "token.stats.section.about": "{{token}}کے بارے میں", - "token.stats.title": "اعدادوشمار", - "token.stats.translation.original": "اصل دکھائیں۔", - "token.stats.translation.translate": "{{language}}میں ترجمہ کریں۔", - "token.stats.volume": "24h والیوم", - "token.symbol.input.fallback": "ان پٹ ٹوکن", - "token.symbol.output.fallback": "آؤٹ پٹ ٹوکن", - "token.wrap.fail.message": "Uniswap پروٹوکول پر تبدیلیاں ETH کے ساتھ شروع اور ختم ہو سکتی ہیں۔ تاہم، تبادلہ کے دوران، ETH کو WETH میں لپیٹ دیا جاتا ہے۔", - "token.zeroNativeBalance.description.mainnet": "{{ tokenSymbol }}حاصل کرنے کے لیے آپ کو Ethereum پر ایک ٹوکن تبدیل کرنے کی ضرورت ہوگی۔ تبادلہ کرنے کے لیے نیٹ ورک کے اخراجات کے لیے ETH کی ضرورت ہوتی ہے۔", - "token.zeroNativeBalance.description.otherChains": "{{ tokenSymbol }}حاصل کرنے کے لیے آپ کو {{ chainName }} پر ایک ٹوکن تبدیل کرنا ہو گا۔ تبادلہ کرنے کے لیے نیٹ ورک کے اخراجات کے لیے {{ chainName }} {{ nativeTokenSymbol }} کی ضرورت ہوتی ہے۔", - "token.zeroNativeBalance.subtitle": "{{ tokenSymbol }} براہ راست خریداری کے لیے دستیاب نہیں ہے۔", - "token.zeroNativeBalance.title.mainnet": "آپ کو {{ nativeTokenName }}کی ضرورت ہے۔", - "token.zeroNativeBalance.title.otherChains": "آپ کو {{ chainName }}پر {{ nativeTokenName }} کی ضرورت ہے۔", - "tokens.action.hide": "ٹوکن چھپائیں۔", - "tokens.action.unhide": "ٹوکن چھپائیں", - "tokens.nfts.action.viewOnExplorer": "{{blockExplorerName}}پر دیکھیں", - "tokens.nfts.collection.error.load.title": "NFT مجموعہ لوڈ نہیں ہو سکا", - "tokens.nfts.collection.label.items": "اشیاء", - "tokens.nfts.collection.label.owners": "مالکان", - "tokens.nfts.collection.label.priceFloor": "فرش", - "tokens.nfts.collection.label.swapVolume": "حجم", - "tokens.nfts.connectEthereumToView": "اپنے NFTs دیکھنے کے لیے Ethereum والیٹ کو جوڑیں۔", - "tokens.nfts.details.contract.address": "معاہدہ کا پتہ", - "tokens.nfts.details.error.load.title": "NFT تفصیلات لوڈ نہیں کی جا سکیں", - "tokens.nfts.details.network": "نیٹ ورک", - "tokens.nfts.details.owner": "کی ملکیت", - "tokens.nfts.details.price": "موجودہ قیمت", - "tokens.nfts.details.recentPrice": "آخری فروخت کی قیمت", - "tokens.nfts.details.traits": "خصلتیں", - "tokens.nfts.empty.description": "کوئی NFTs نہیں ملے", - "tokens.nfts.error.unavailable": "مواد دستیاب نہیں ہے۔", - "tokens.nfts.hidden.action.hide": "NFT چھپائیں۔", - "tokens.nfts.hidden.action.unhide": "NFT ظاہر کریں۔", - "tokens.nfts.link.collection": "جمع کرنے کی ویب سائٹ", - "tokens.nfts.list.error.load.title": "NFTs لوڈ نہیں ہو سکے۔", - "tokens.nfts.list.none.button": "NFTs وصول کریں۔", - "tokens.nfts.list.none.description.default": "شروع کرنے کے لیے دوسرے بٹوے سے NFTs منتقل کریں۔", - "tokens.nfts.list.none.description.external": "جب یہ والیٹ NFTs خریدتا یا وصول کرتا ہے، تو وہ یہاں ظاہر ہوں گے۔", - "tokens.nfts.list.none.title": "ابھی تک کوئی NFTs نہیں ہیں۔", - "tokens.nfts.notAvailableOnSolana": "سولانا پر NFTs دستیاب نہیں ہیں۔", - "tokens.selector.button.choose": "ٹوکن منتخب کریں۔", - "tokens.selector.empty.buy.message": "ٹوکن بھیجنے کے لیے کارڈ یا بینک سے کرپٹو خریدیں۔", - "tokens.selector.empty.buy.title": "کریپٹو لیں", - "tokens.selector.empty.receive.title": "ٹوکن وصول کریں۔", - "tokens.selector.empty.title": "ابھی تک کوئی ٹوکن نہیں ہے۔", - "tokens.selector.error.load": "ٹوکن لوڈ نہیں ہو سکے۔", - "tokens.selector.search.empty": "{{searchText}}کے لیے کوئی نتیجہ نہیں ملا", - "tokens.selector.search.placeholder": "ٹوکن تلاش کریں۔", - "tokens.selector.section.bridging": "نیٹ ورکس میں تبادلہ کریں۔", - "tokens.selector.section.favorite": "پسندیدہ", - "tokens.selector.section.otherNetworksSearchResults": "ٹوکن دوسرے نیٹ ورکس پر ملے", - "tokens.selector.section.otherSearchResults": "{{network}}پر دیگر ٹوکن", - "tokens.selector.section.recent": "حالیہ تلاشیں۔", - "tokens.selector.section.search": "تلاش کے نتائج", - "tokens.selector.section.trending": "ٹوکنز بذریعہ 24H والیوم", - "tokens.selector.section.yours": "آپ کے ٹوکنز", - "tokens.table.search.placeholder.pools": "تالاب تلاش کریں۔", - "tokens.table.search.placeholder.tokens": "ٹوکن تلاش کریں۔", - "tokens.table.search.placeholder.transactions": "لین دین تلاش کریں۔", - "toucan.auction.bidConcentration": "ٹوکن ارتکاز", - "toucan.auction.bidConcentration.tooltip.description": "ٹوکن ٹول ٹپ کی تفصیل", - "toucan.auction.bidConcentration.tooltip.title": "ٹوکن ٹول ٹپ ٹائٹل", - "toucan.auctions": "نیلامی", - "toucan.bidForm.maxBudget": "زیادہ سے زیادہ بجٹ", - "toucan.bidForm.placeBid": "اپنی بولی لگائیں۔", - "toucan.displayMode.tokenPrice": "ٹوکن کی قیمت", - "toucan.displayMode.valuation": "قدر", - "transaction.action.cancel.button": "لین دین منسوخ کریں۔", - "transaction.action.cancel.description": "اگر آپ اس ٹرانزیکشن کو نیٹ ورک کے ذریعے کارروائی کرنے سے پہلے منسوخ کر دیتے ہیں، تو آپ اصل کی بجائے ایک نئی نیٹ ورک لاگت ادا کریں گے۔", - "transaction.action.cancel.title": "اس لین دین کو منسوخ کریں؟", - "transaction.action.clear": "زیر التواء صاف کریں۔", - "transaction.action.copy": "ٹرانزیکشن ID کاپی کریں۔", - "transaction.action.copyProvider": "{{providerName}} ٹرانزیکشن ID کاپی کریں۔", - "transaction.amount.unlimited": "لا محدود", - "transaction.callData": "کال ڈیٹا", - "transaction.details.dappName": "ایپ", - "transaction.details.from": "سے", - "transaction.details.networkFee": "نیٹ ورک کی قیمت", - "transaction.details.networkFee.swap": "تبادلہ نیٹ ورک کی قیمت", - "transaction.details.providerFee": "فراہم کنندہ کی فیس", - "transaction.details.swapRate": "شرح", - "transaction.details.transaction": "لین دین", - "transaction.details.uniswapFee": "فیس ({{ feePercent }}%)", - "transaction.network.all": "تمام نیٹ ورکس", - "transaction.networkCost.description": "بلاکچین پر آپ کے لین دین پر کارروائی کرنے کی لاگت۔ Uniswap کو کم سے کم نیٹ ورک کے اخراجات کے لیے بہتر بنایا گیا ہے۔", - "transaction.networkCost.includesSmartWalletActivation": "سمارٹ والیٹ ایکٹیویشن پر مشتمل ہے۔", - "transaction.networkCost.label": "نیٹ ورک کی قیمت", - "transaction.networkCost.maxNativeBalance.description": "نیٹ ورک ٹوکن بیلنس کی تھوڑی سی رقم اس لین دین کی نیٹ ورک لاگت کو پورا کرنے کے لیے محفوظ ہے۔", - "transaction.networkCost.maxNativeBalance.title": "میں اپنا زیادہ سے زیادہ بیلنس کیوں استعمال نہیں کر سکتا؟", - "transaction.networkCost.veryHigh.label": "بہت زیادہ نیٹ ورک کی قیمت", - "transaction.notification.error.cancel": "لین دین منسوخ کرنے سے قاصر", - "transaction.notification.error.replace": "لین دین کو تبدیل کرنے سے قاصر ہے۔", - "transaction.status.approval.canceled": "منظوری منسوخ کر دی گئی۔", - "transaction.status.approval.failed": "منظوری ناکام ہو گئی۔", - "transaction.status.approve.canceled": "منظوری منسوخ کر دی گئی۔", - "transaction.status.approve.canceling": "منظوری منسوخ کر رہا ہے۔", - "transaction.status.approve.failed": "منظور کرنے میں ناکام", - "transaction.status.approve.pending": "منظور کرنا", - "transaction.status.approve.success": "منظورشدہ", - "transaction.status.approve.successDapp": "{{externalDappName}}کو منظور ہوا۔", - "transaction.status.buy.canceled": "خریداری منسوخ کر دی گئی۔", - "transaction.status.buy.canceling": "خریداری منسوخ کر رہا ہے۔", - "transaction.status.buy.failed": "خریدنے میں ناکام", - "transaction.status.buy.pending": "خریدنا", - "transaction.status.buy.success": "خریدا", - "transaction.status.buy.successDapp": "{{externalDappName}}پر خریدا گیا۔", - "transaction.status.claim.canceled": "فیس وصولی منسوخ کر دی گئی۔", - "transaction.status.claim.canceling": "فیس وصولی منسوخ کرنا", - "transaction.status.claim.failed": "فیس جمع کرنے میں ناکام", - "transaction.status.claim.pending": "فیس جمع کرنا", - "transaction.status.claim.success": "فیس جمع کر لی", - "transaction.status.collect.fees.canceled": "منسوخ شدہ فیس جمع کریں۔", - "transaction.status.collect.fees.failed": "فیس جمع کرنے میں ناکام", - "transaction.status.collected.fees": "جمع شدہ فیس", - "transaction.status.collecting.fees": "فیس جمع کرنا", - "transaction.status.confirm.canceled": "تصدیق منسوخ کر دی گئی۔", - "transaction.status.confirm.canceling": "زیر التواء منسوخی", - "transaction.status.confirm.failed": "تصدیق کرنے میں ناکام", - "transaction.status.confirm.pending": "لین دین جاری ہے۔", - "transaction.status.confirm.success": "لین دین کی تصدیق ہو گئی۔", - "transaction.status.confirm.successDapp": "{{externalDappName}}پر لین دین کی تصدیق ہو گئی۔", - "transaction.status.createPair.canceled": "جوڑا بنانا منسوخ کر دیا گیا۔", - "transaction.status.createPair.canceling": "جوڑا بنانا منسوخ کر رہا ہے۔", - "transaction.status.createPair.failed": "جوڑا بنانے میں ناکام", - "transaction.status.createPair.pending": "جوڑا بنانا", - "transaction.status.createPair.success": "جوڑا بنایا", - "transaction.status.createPool.canceled": "منسوخ پول بنائیں", - "transaction.status.createPool.canceling": "تخلیق پول منسوخ کر رہا ہے۔", - "transaction.status.createPool.failed": "پول بنانے میں ناکام", - "transaction.status.createPool.pending": "پول بنانا", - "transaction.status.createPool.success": "پول بنایا", - "transaction.status.liquidityDecrease.canceled": "لیکویڈیٹی کو ہٹانا منسوخ کر دیا گیا۔", - "transaction.status.liquidityDecrease.canceling": "لیکویڈیٹی کو ہٹانا منسوخ کرنا", - "transaction.status.liquidityDecrease.failed": "لیکویڈیٹی کو ہٹانا ناکام ہو گیا۔", - "transaction.status.liquidityDecrease.pending": "لیکویڈیٹی کو ہٹانا", - "transaction.status.liquidityDecrease.success": "لیکویڈیٹی کو ہٹا دیا گیا۔", - "transaction.status.liquidityIncrease.canceled": "لیکویڈیٹی شامل کریں منسوخ کر دی گئیں۔", - "transaction.status.liquidityIncrease.canceling": "لیکویڈیٹی کو منسوخ کرنا", - "transaction.status.liquidityIncrease.failed": "لیکویڈیٹی شامل کرنا ناکام ہو گیا۔", - "transaction.status.liquidityIncrease.pending": "لیکویڈیٹی شامل کرنا", - "transaction.status.liquidityIncrease.success": "اضافی لیکویڈیٹی", - "transaction.status.lpIncentivesClaim.canceled": "منسوخ شدہ LP انعامات کا دعوی", - "transaction.status.lpIncentivesClaim.canceling": "LP انعامات کا دعوی منسوخ کرنا", - "transaction.status.lpIncentivesClaim.failed": "LP انعامات کا دعوی کرنے میں ناکام", - "transaction.status.lpIncentivesClaim.pending": "LP انعامات کا دعوی کرنا", - "transaction.status.lpIncentivesClaim.success": "LP انعامات کا دعوی کیا۔", - "transaction.status.migrateLiquidity.canceled": "منتقلی لیکویڈیٹی منسوخ کر دی گئی۔", - "transaction.status.mint.canceled": "منسوخ شدہ ٹکسال", - "transaction.status.mint.canceling": "ٹکسال منسوخ کرنا", - "transaction.status.mint.failed": "ٹکسال میں ناکام", - "transaction.status.mint.pending": "ٹکسال", - "transaction.status.mint.success": "ٹکسال", - "transaction.status.mint.successDapp": "{{externalDappName}}پر ٹکسال کیا گیا۔", - "transaction.status.offramp.canceled": "آفرامپ منسوخ کر دیا گیا۔", - "transaction.status.offramp.failed": "آفرامپ ناکام ہوگیا۔", - "transaction.status.offramp.pending": "آفرمپنگ", - "transaction.status.offramp.success": "آف فریمپڈ", - "transaction.status.onramp.canceled": "Onramp منسوخ کر دیا گیا۔", - "transaction.status.onramp.failed": "Onramp ناکام ہوگیا۔", - "transaction.status.onramp.pending": "آن ریمپنگ", - "transaction.status.onramp.success": "آن ریمپڈ", - "transaction.status.permit.approved": "اجازت نامہ منظور", - "transaction.status.permit.canceled": "پرمٹ tx منسوخ کر دیا گیا۔", - "transaction.status.permit.failed": "اجازت نامہ ناکام ہو گیا۔", - "transaction.status.purchase.canceled": "خریداری منسوخ کر دی گئی۔", - "transaction.status.purchase.canceling": "خریداری منسوخ کر رہا ہے۔", - "transaction.status.purchase.failed": "خریداری ناکام ہو گئی۔", - "transaction.status.purchase.failedOn": "{{serviceProvider}}پر خریداری میں ناکام", - "transaction.status.purchase.pending": "خریداری", - "transaction.status.purchase.pendingOn": "{{serviceProvider}}پر خریداری", - "transaction.status.purchase.successOn": "{{serviceProvider}}پر خریدا گیا۔", - "transaction.status.receive.canceled": "وصولی منسوخ کر دی گئی۔", - "transaction.status.receive.canceling": "وصول کرنا منسوخ کرنا", - "transaction.status.receive.failed": "وصول کرنا ناکام ہو گیا۔", - "transaction.status.receive.failedFrom": "{{serviceProvider}}سے وصول کرنے میں ناکام", - "transaction.status.receive.pending": "وصول کرنا", - "transaction.status.receive.pendingFrom": "{{serviceProvider}}سے وصول کیا جا رہا ہے۔", - "transaction.status.receive.success": "موصول ہوا۔", - "transaction.status.receive.successDapp": "{{externalDappName}}پر موصول ہوا۔", - "transaction.status.receive.successFrom": "{{serviceProvider}}سے موصول ہوا۔", - "transaction.status.removeDelegation.canceled": "وفود کو ہٹا دیں منسوخ کر دیا گیا۔", - "transaction.status.removeDelegation.failed": "وفد کو ہٹانا ناکام ہو گیا۔", - "transaction.status.removeDelegation.pending": "وفد کو ہٹانا", - "transaction.status.removeDelegation.success": "وفد کو ہٹا دیا گیا۔", - "transaction.status.revoke.canceled": "منسوخ کر دیا گیا۔", - "transaction.status.revoke.canceling": "منسوخی منسوخ کر رہا ہے۔", - "transaction.status.revoke.failed": "منسوخ کرنے میں ناکام", - "transaction.status.revoke.pending": "منسوخ کرنا", - "transaction.status.revoke.success": "منسوخ کر دیا گیا۔", - "transaction.status.revoke.successDapp": "{{externalDappName}}کو منسوخ کر دیا گیا۔", - "transaction.status.sale.canceled": "منسوخ شدہ فروخت", - "transaction.status.sale.canceling": "فروخت منسوخ کرنا", - "transaction.status.sale.failedOn": "{{serviceProvider}}کے ذریعے فروخت ناکام ہو گئی۔", - "transaction.status.sale.pendingCard.msg": "کرپٹو فروخت کرنے کے بارے میں مزید جانیں۔", - "transaction.status.sale.pendingCard.title": "میری فروخت ابھی تک کیوں زیر التوا ہے؟", - "transaction.status.sale.pendingOn": "{{serviceProvider}}کے ذریعے فروخت کرنا", - "transaction.status.sale.successOn": "{{serviceProvider}}کے ذریعے فروخت کیا گیا۔", - "transaction.status.sell.canceled": "منسوخ شدہ فروخت", - "transaction.status.sell.canceling": "فروخت منسوخ کرنا", - "transaction.status.sell.failed": "فروخت کرنے میں ناکام", - "transaction.status.sell.pending": "فروخت کرنا", - "transaction.status.sell.success": "فروخت", - "transaction.status.sell.successDapp": "{{externalDappName}}پر فروخت ہوا۔", - "transaction.status.send.canceled": "بھیجنا منسوخ کر دیا گیا۔", - "transaction.status.send.canceling": "بھیجنا منسوخ کر رہا ہے۔", - "transaction.status.send.failed": "بھیجنے میں ناکام", - "transaction.status.send.pending": "بھیج رہا ہے۔", - "transaction.status.send.success": "بھیجا", - "transaction.status.send.successDapp": "{{externalDappName}}پر بھیجا گیا۔", - "transaction.status.swap.canceled": "تبادلہ منسوخ کر دیا گیا۔", - "transaction.status.swap.canceling": "تبادلہ منسوخ کرنا", - "transaction.status.swap.expired": "تبادلہ کی میعاد ختم ہوگئی", - "transaction.status.swap.failed": "تبادلہ کرنے میں ناکام", - "transaction.status.swap.insufficientFunds": "ناکافی فنڈز", - "transaction.status.swap.pending": "تبادلہ کرنا", - "transaction.status.swap.success": "ادل بدل", - "transaction.status.swap.successDapp": "{{externalDappName}}پر تبدیل کیا گیا۔", - "transaction.status.unwrap.canceled": "کھولنا منسوخ کر دیا گیا۔", - "transaction.status.unwrap.canceling": "کھولنا منسوخ کرنا", - "transaction.status.unwrap.failed": "کھولنے میں ناکام", - "transaction.status.unwrap.pending": "کھولنا", - "transaction.status.unwrap.success": "لپیٹے ہوئے ۔", - "transaction.status.unwrap.successDapp": "{{externalDappName}}پر کھول دیا گیا۔", - "transaction.status.wrap.canceled": "منسوخ شدہ لپیٹ", - "transaction.status.wrap.canceling": "لپیٹنا منسوخ کرنا", - "transaction.status.wrap.failed": "لپیٹنے میں ناکام", - "transaction.status.wrap.pending": "ریپنگ", - "transaction.status.wrap.success": "لپیٹے ہوئے", - "transaction.status.wrap.successDapp": "{{externalDappName}}پر لپٹا", - "transaction.submittedOn": "پر جمع کرایا", - "transaction.summary.liquidity": "{{firstAmountWithSymbol}} اور {{secondAmountWithSymbol}}", - "transaction.summary.received": "{{tokenAmountWithSymbol}} سے {{recipientAddress}}", - "transaction.summary.received.noAmount": "{{name}}سے موصول ہوا۔", - "transaction.summary.sent": "{{senderAddress}}سے {{tokenAmountWithSymbol}}", - "transaction.summary.sent.noAmount": "{{name}}پر بھیجا گیا۔", - "transaction.warning.insufficientGas.modal.message": "اس ٹرانزیکشن کی نیٹ ورک لاگت کو پورا کرنے کے لیے آپ کو {{networkName}} پر ~{{tokenAmount}} {{tokenSymbol}} () کی ضرورت ہے۔ کسی اور سلسلہ سے {{tokenSymbol}} کو تبدیل کریں یا آگے بڑھنے کے لیے اپنے کارڈ سے خریدیں۔", - "transaction.warning.insufficientGas.modal.message.noAction": "اس ٹرانزیکشن کی نیٹ ورک لاگت کو پورا کرنے کے لیے آپ کو {{networkName}} پر ~{{tokenAmount}} {{tokenSymbol}} () کی ضرورت ہے۔", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount": "اس ٹرانزیکشن کی نیٹ ورک لاگت کو پورا کرنے کے لیے آپ کو {{networkName}} پر ~{{tokenAmount}} {{tokenSymbol}} () کی ضرورت ہے۔", - "transaction.warning.insufficientGas.modal.messageSwapWithoutTokenAmount.noAction": "اس ٹوکن کو تبدیل کرنے کے لیے، آپ کو {{networkName}}پر مزید {{tokenSymbol}} کی ضرورت ہے۔", - "transaction.warning.insufficientGas.modal.title.withNetwork": "{{networkName}}پر {{tokenSymbol}} کافی نہیں ہے۔", - "transaction.warning.insufficientGas.modal.title.withoutNetwork": "کافی نہیں {{tokenSymbol}}", - "transaction.warning.maxNative.message": "آپ اپنا زیادہ تر نیٹ ورک ٹوکن بیلنس خرچ کرنے والے ہیں۔ یہ مستقبل کے نیٹ ورک کے اخراجات کو پورا کرنے کے لیے ناکافی فنڈز چھوڑ سکتا ہے۔", - "transaction.warning.maxNative.title": "کم نیٹ ورک ٹوکن بیلنس", - "transaction.watcher.error.cancel": "لین دین منسوخ کرنے سے قاصر", - "transaction.watcher.error.status": "ٹرانزیکشن اسٹیٹس چیک کرتے وقت خرابی", - "uniswapX.aggregatesLiquidity": " بہتر قیمتوں اور گیس سے پاک تبادلہ کے لیے لیکویڈیٹی ذرائع کو جمع کرتا ہے۔", - "uniswapX.cost": "UniswapX بلاکچین پر لین دین کے لیے عام اخراجات کو ہٹاتا ہے۔", - "uniswapx.description": "UniswapX بہتر قیمتوں اور گیس سے پاک تبادلہ کے لیے لیکویڈیٹی ذرائع کو جمع کرتا ہے۔", - "uniswapx.description.unsupported": "UniswapX فی الحال دستیاب نہیں ہے کیونکہ آپ کے سمارٹ والیٹ کی ترتیبات کا نظم ایک مختلف والیٹ ایپ کے ذریعے کیا جاتا ہے۔", - "uniswapx.included": "شامل ہے UniswapX", - "uniswapx.item": " UniswapX ", - "uniswapx.label": "UniswapX", - "uniswapX.learnMore": "UniswapX کے ساتھ تبادلہ کرنے کے بارے میں مزید جانیں۔", - "uniswapx.unavailable.title": "UniswapX دستیاب نہیں ہے۔", - "uniswapx.v2QuoteFailed": "UniswapX v2 ہارڈ اقتباس ناکام ہو گیا۔ کلاسک سویپ کے ساتھ دوبارہ کوشش کریں۔", - "unitags.banner.button.claim": "ابھی اس کا دعوی کریں", - "unitags.banner.subtitle": "ایک ذاتی ویب 3 پروفائل بنائیں اور آسانی سے اپنے ایڈریس کو دوستوں کے ساتھ شیئر کریں۔", - "unitags.banner.title.compact": "اپنے {{unitagDomain}} صارف نام کا دعوی کریں اور اپنی مرضی کے مطابق پروفائل بنائیں۔", - "unitags.banner.title.full": "اپنے {{unitagDomain}} صارف نام کا دعوی کریں۔", - "unitags.choosePhoto.option.cameraRoll": "کیمرہ رول میں سے انتخاب کریں۔", - "unitags.choosePhoto.option.computer": "کمپیوٹر سے اپ لوڈ کریں۔", - "unitags.choosePhoto.option.nft": "ایک NFT منتخب کریں۔", - "unitags.choosePhoto.option.remove": "پروفائل تصویر ہٹا دیں۔", - "unitags.claim.available": "دستیاب ہے۔", - "unitags.claim.confirmation.customize": "پروفائل کو حسب ضرورت بنائیں", - "unitags.claim.confirmation.description": "{{unitagAddress}} کرپٹو بھیجنے اور وصول کرنے کے لیے تیار ہے۔ اپنے web3 پروفائل کو حسب ضرورت بنا کر اپنا بٹوہ تیار کرنا جاری رکھیں۔", - "unitags.claim.confirmation.success.long": "تم اسے سمجھ گئے!", - "unitags.claim.confirmation.success.short": "یہ مل گیا!", - "unitags.claim.error.addressLimit": "آپ پہلے ہی اس ایڈریس کے لیے اپنے صارف نام میں زیادہ سے زیادہ تبدیلیاں کر چکے ہیں۔", - "unitags.claim.error.avatar": "اوتار سیٹ نہیں کیا جا سکا۔ بعد میں دوبارہ کوشش کریں۔", - "unitags.claim.error.default": "صارف نام کا دعوی نہیں کیا جا سکا۔ بعد میں دوبارہ کوشش کریں۔", - "unitags.claim.error.deviceLimit": "آپ نے صارف ناموں کی زیادہ سے زیادہ تعداد کو مارا ہے جو اس آلہ کے لیے فعال ہو سکتے ہیں۔", - "unitags.claim.error.general": "صارف نام کا دعوی کرنے سے قاصر", - "unitags.claim.error.unavailable": "یہ صارف کا نام دستیاب نہیں ہے", - "unitags.claim.error.unknown": "نامعلوم خامی", - "unitags.claim.username.default": "تمھارا نام", - "unitags.delete.confirm.subtitle": "آپ اپنا صارف نام اور حسب ضرورت پروفائل کی تفصیلات حذف کرنے والے ہیں۔ آپ اس پر دوبارہ دعوی نہیں کر سکیں گے۔", - "unitags.delete.confirm.title": "کیا تمہیں یقین ہے؟", - "unitags.editProfile.placeholder": "صارف نام", - "unitags.editUsername.confirm.subtitle": "آپ اپنا صارف نام تبدیل کرنے والے ہیں۔ ایک بار جب آپ اسے تبدیل کرتے ہیں، تو آپ دوبارہ اس کا دعوی نہیں کر سکتے۔", - "unitags.editUsername.confirm.title": "کیا تمہیں یقین ہے؟", - "unitags.editUsername.title": "اپنے صارف نام میں ترمیم کریں۔", - "unitags.editUsername.warning.default": "ایک بار جب آپ اپنا صارف نام تبدیل کر لیتے ہیں، تو آپ دوبارہ اس کا دعوی نہیں کر سکتے۔ آپ اسے صرف 2 بار تبدیل کر سکتے ہیں۔", - "unitags.editUsername.warning.max": "آپ 2 صارف ناموں کی تبدیلیوں کی زیادہ سے زیادہ تعداد تک پہنچ گئے ہیں۔", - "unitags.extension.intro.buttton": "صارف نام کا دعوی کریں۔", - "unitags.extension.intro.description": "0x پتوں کو الوداع کہیں۔ صارف نام پڑھنے کے قابل نام ہیں جو کرپٹو بھیجنے اور وصول کرنا آسان بناتے ہیں۔", - "unitags.extension.intro.title": "صارف ناموں کا تعارف", - "unitags.extension.intro.upsell.customizable": "حسب ضرورت پروفائلز", - "unitags.extension.intro.upsell.ens": "ENS ذیلی ڈومینز کے ذریعے تقویت یافتہ", - "unitags.extension.intro.upsell.free": "دعوی کرنے کے لئے آزاد", - "unitags.intro.features.ens": "ENS ذیلی ڈومینز کے ذریعے تقویت یافتہ", - "unitags.intro.features.free": "دعوی کرنے کے لئے آزاد", - "unitags.intro.features.profile": "حسب ضرورت پروفائلز", - "unitags.intro.subtitle": "0x پتوں کو الوداع کہیں۔ صارف نام پڑھنے کے قابل نام ہیں جو کرپٹو بھیجنے اور وصول کرنا آسان بناتے ہیں۔", - "unitags.intro.title": "صارف ناموں کا تعارف", - "unitags.notification.delete.error": "صارف نام حذف نہیں کیا جا سکا۔ بعد میں دوبارہ کوشش کریں۔", - "unitags.notification.delete.title": "صارف نام حذف کر دیا گیا۔", - "unitags.notification.profile.error": "پروفائل کو اپ ڈیٹ نہیں کیا جا سکا۔ بعد میں دوبارہ کوشش کریں۔", - "unitags.notification.profile.title": "پروفائل اپ ڈیٹ ہو گیا۔", - "unitags.notification.username.error": "صارف نام تبدیل نہیں کیا جا سکا۔ بعد میں دوبارہ کوشش کریں۔", - "unitags.notification.username.title": "صارف نام تبدیل کر دیا گیا۔", - "unitags.onboarding.claim.subtitle": "یہ آپ کا ذاتی پتہ ہے جس پر لوگ کرپٹو بھیج سکتے ہیں۔", - "unitags.onboarding.claim.title.choose": "اپنا صارف نام بنائیں", - "unitags.onboarding.claim.title.claim": "اپنے صارف نام کا دعوی کریں۔", - "unitags.onboarding.info.description": "صارف نام پیچیدہ 0x پتوں کو پڑھنے کے قابل ناموں میں تبدیل کرتے ہیں۔ {{unitagDomain}} صارف نام کا دعوی کر کے، آپ آسانی سے کرپٹو بھیج اور وصول کر سکتے ہیں اور ایک عوامی ویب3 پروفائل بنا سکتے ہیں۔", - "unitags.onboarding.info.title": "ایک آسان پتہ", - "unitags.onboarding.profile.subtitle": "اپنا اپ لوڈ کریں یا اپنے منفرد یونیکون کے ساتھ قائم رہیں۔ آپ اسے بعد میں ہمیشہ تبدیل کر سکتے ہیں۔", - "unitags.onboarding.profile.title": "پروفائل تصویر منتخب کریں۔", - "unitags.profile.action.delete": "صارف نام حذف کریں۔", - "unitags.profile.action.edit": "صارف نام میں ترمیم کریں۔", - "unitags.profile.bio.label": "بایو", - "unitags.profile.bio.placeholder": "اپنے پروفائل کے لیے بائیو ٹائپ کریں۔", - "unitags.profile.links.twitter": "ٹویٹر", - "unitags.username.error.chars": "صارف ناموں میں صرف حروف اور اعداد شامل ہو سکتے ہیں۔", - "unitags.username.error.max": "صارف نام {{number}} حروف سے زیادہ نہیں ہو سکتے", - "unitags.username.error.min": "صارف نام کم از کم {{number}} حروف کے ہونے چاہئیں", - "unitags.username.error.uppercase": "صارف ناموں میں صرف چھوٹے حروف اور اعداد شامل ہو سکتے ہیں۔", - "uwulink.error.insufficientTokens": "{{chain}}پر {{tokenSymbol}} کافی نہیں ہے۔", - "v2.notAvailable": "Uniswap V2 اس نیٹ ورک پر دستیاب نہیں ہے۔", - "wallet.appSignIn": "ایپ کے ساتھ سائن ان کریں۔", - "wallet.connectingAgreement": "بٹوے کو جوڑ کر، آپ یونی سویپ لیبز کی سروس کی شرائط اور اس کی رازداری کی پالیسیسے اتفاق کرتے ہیں۔", - "wallet.connectionFailed.message": "کنکشن کی کوشش ناکام ہو گئی۔ براہ کرم اپنے بٹوے میں جڑنے کے لیے اقدامات کی پیروی کرتے ہوئے دوبارہ کوشش کریں۔", - "wallet.mismatch.popup.description": "کچھ خصوصیات آپ کے منسلک بٹوے کے ذریعہ تعاون یافتہ نہیں ہیں۔", - "wallet.mismatch.popup.title": "پرس کی محدود حمایت", - "wallet.other": "دوسرے بٹوے", - "wallet.scanToConnect": "منسلک ہونے کے لیے QR کوڈ اسکین کریں۔", - "wallet.wrongNet": "آپ کا بٹوہ غلط نیٹ ورک سے جڑا ہوا ہے۔", - "walletConnect.dapps.empty.description": "WalletConnect کے ذریعے کوڈ اسکین کرکے ایپ سے جڑیں۔", - "walletConnect.dapps.manage.empty.title": "کوئی ایپس منسلک نہیں ہیں۔", - "walletConnect.dapps.manage.title": "کنکشنز", - "walletConnect.error.connection.message": "Unswap Wallet فی الحال {{chainNames}}کو سپورٹ کرتا ہے۔ براہ کرم ان زنجیروں پر صرف \"{{dappName}}\" استعمال کریں۔", - "walletConnect.error.connection.title": "رابطے میں خرابی", - "walletConnect.error.general.message": "WalletConnect کے ساتھ ایک مسئلہ تھا۔ دوبارہ کوشش کریں", - "walletConnect.error.general.title": "WalletConnect کی خرابی۔", - "walletConnect.error.scantastic.message": "آپ کے QR کوڈ میں ایک مسئلہ تھا۔ دوبارہ کوشش کریں", - "walletConnect.error.scantastic.title": "غلط QR کوڈ", - "walletConnect.error.unsupported.message": "دوبارہ کوشش کرنے سے پہلے یقینی بنائیں کہ آپ ایک درست WalletConnect، Ethereum پتہ، یا Uniswap Extension QR کوڈ اسکین کر رہے ہیں۔", - "walletConnect.error.unsupported.title": "غلط QR کوڈ", - "walletConnect.error.unsupportedV1.message": "WalletConnect v1 مزید تعاون یافتہ نہیں ہے۔ آپ جس ایپلیکیشن سے منسلک ہونے کی کوشش کر رہے ہیں اسے WalletConnect v2 میں اپ گریڈ کرنے کی ضرورت ہے۔", - "walletConnect.error.unsupportedV1.title": "غلط QR کوڈ", - "walletConnect.error.uwu.scan": "اس QR کوڈ کو اسکین کرنے میں ایک مسئلہ تھا۔", - "walletConnect.error.uwu.title": "UwU لنک کی خرابی۔", - "walletConnect.error.uwu.unsupported": "یہ QR کوڈ تعاون یافتہ نہیں ہے۔", - "walletConnect.pending.button.connect": "جڑیں۔", - "walletConnect.pending.button.reject": "رد کرنا", - "walletConnect.pending.button.scrollDown": "جڑنے کے لیے نیچے سکرول کریں۔", - "walletConnect.pending.threat.confirmationText": "میں خطرات کو سمجھتا ہوں۔", - "walletConnect.pending.threat.description": "اس ایپ سے پیغامات یا لین دین پر دستخط کرنے سے رقوم ضائع ہو سکتی ہیں۔", - "walletConnect.pending.threat.title": "نقصان دہ ایپ کا پتہ چلا", - "walletConnect.pending.title": "{{dappName}}سے جڑیں۔", - "walletConnect.pending.unverified.description": "آگے بڑھنے سے پہلے یقینی بنائیں کہ آپ اس سائٹ پر بھروسہ کرتے ہیں۔ ", - "walletConnect.pending.unverified.title": "غیر تصدیق شدہ ایپ", - "walletConnect.permissions.option.requestApprovals": "لین دین کی منظوریوں کی درخواست کریں۔", - "walletConnect.permissions.option.transferAssets": "Move funds without permission", - "walletConnect.permissions.option.viewTokenBalances": "View your balance and activity", - "walletConnect.permissions.title": "App permissions", - "walletConnect.request.bundledTransactions.label_one": "سنگل بنڈل ٹرانزیکشن", - "walletConnect.request.bundledTransactions.label_other": "{{count}} بنڈل ٹرانزیکشنز", - "walletConnect.request.button.scrollDown": "سائن کرنے کے لیے نیچے سکرول کریں۔", - "walletConnect.request.button.sign": "دستخط", - "walletConnect.request.details.label.function": "فنکشن", - "walletConnect.request.details.label.sending": "بھیج رہا ہے۔", - "walletConnect.request.details.label.token": "ٹوکن", - "walletConnect.request.details.label.tokens": "ٹوکنز", - "walletConnect.request.error.insufficientFunds": "اس لین دین کو مکمل کرنے کے لیے آپ کے پاس کافی {{currencySymbol}} نہیں ہے۔", - "walletConnect.request.error.network": "انٹرنیٹ یا نیٹ ورک کنکشن کی خرابی۔", - "walletConnect.request.warning.batch.message": "ہوشیار رہیں: اس درخواست میں متعدد ٹرانزیکشنز شامل ہیں اور اثاثے منتقل کر سکتے ہیں۔", - "walletConnect.request.warning.general.message": "محتاط رہیں: یہ پیغام اثاثوں کو منتقل کر سکتا ہے۔", - "walletConnect.request.warning.message": "پیغامات یا لین دین پر دستخط کرنے کے لیے، آپ کو والیٹ کی بازیابی کا جملہ درآمد کرنا ہوگا۔", - "walletConnect.request.warning.title": "یہ پرس صرف دیکھنے کے موڈ میں ہے۔", - "web.explore.description": "{{network}}پر ٹوکن دریافت اور تحقیق کریں۔ اوپر کے تالابوں کو دریافت کریں۔ ریئل ٹائم قیمتیں، تجارتی حجم، TVL، چارٹس، اور لین دین کا ڈیٹا دیکھیں۔", - "web.explore.title.pools": "Uniswap پر {{network}} پر ٹاپ پولز کو دریافت کریں۔", - "web.explore.title.tokens": "Uniswap پر {{network}} پر ٹاپ ٹوکن دریافت کریں۔", - "web.explore.title.transactions": "Uniswap پر {{network}} پر سرفہرست لین دین کو دریافت کریں۔" -} diff --git a/packages/uniswap/src/i18n/locales/translations/vi-VN.json b/packages/uniswap/src/i18n/locales/translations/vi-VN.json index ea0d816cc7e..72522a19279 100644 --- a/packages/uniswap/src/i18n/locales/translations/vi-VN.json +++ b/packages/uniswap/src/i18n/locales/translations/vi-VN.json @@ -30,7 +30,6 @@ "account.drawer.modal.body": "Lưu trữ và hoán đổi token an toàn với ứng dụng Uniswap. Khả dụng trên iOS và Android.", "account.drawer.modal.dont": "Bạn chưa có Uniswap Wallet?", "account.drawer.modal.scan": "Quét bằng Uniswap Wallet", - "account.drawer.spamToggle": "Ẩn token và NFT không xác định", "account.passkey.delete.acknowledge": "Tôi đã sao lưu cụm từ khôi phục và hiểu rằng Uniswap Labs không thể giúp tôi khôi phục ví của mình nếu tôi không sao lưu cụm từ khôi phục.", "account.passkey.delete.description": "Hãy đảm bảo bạn đã sao lưu cụm từ khôi phục bằng ứng dụng Uniswap trên di động hoặc tiện ích mở rộng Uniswap cho trình duyệt.", "account.passkey.delete.descriptionEmphasized": "Bạn có thể không truy cập được ví của mình nếu không có cụm từ khôi phục.", @@ -115,6 +114,7 @@ "account.wallet.watch.placeholder": "ENS hoặc địa chỉ", "account.wallet.watch.title": "Nhập địa chỉ ví", "activity.pending": "{{pendingActivityCount}} đang chờ xử lý", + "activity.recentActivity": "Recent activity", "activity.transaction.lpRewards.descriptor": "Đã thu phần thưởng {{symbol}}", "activity.transaction.send.descriptor": "{{amountWithSymbol}} đến {{walletAddress}}", "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} đổi lấy {{amountWithSymbolB}}", @@ -144,15 +144,15 @@ "bridgedAsset.send.warning.description": "Bạn đang gửi phiên bản được bao bọc của {{currencySymbol}} trên {{chainName}}. Bạn sẽ mất quỹ tài sản này vĩnh viễn nếu gửi đến một sàn giao dịch tập trung.", "bridgedAsset.send.warning.title": "Đảm bảo rằng bạn đang gửi đến một địa chỉ tương thích", "bridgedAsset.tdp.description": "Đây là phiên bản bắc cầu của {{currencySymbol}}, được neo giá 1:1 với {{currencySymbol}} gốc.", - "bridgedAsset.wormhole.button": "Chuyển sang Wormhole", - "bridgedAsset.wormhole.description": "Chuyển sang cổng thông tin Wormhole để bắc cầu {{currencySymbol}} của bạn từ {{chainName}} sang {{nativeChainName}}.", + "bridgedAsset.wormhole.button": "Continue to {{provider}}", + "bridgedAsset.wormhole.description": "Continue to the {{provider}} portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", "bridgedAsset.wormhole.title": "Rút {{currencySymbol}} sang {{nativeChainName}}", "bridgedAsset.wormhole.toNativeChain": "sang {{nativeChainName}}", "bridgedAsset.wormhole.withdrawToNativeChain": "Rút sang {{nativeChainName}}", "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} phút {{seconds}} giây", "bridging.estimatedTime.minutesOnly": "~{{minutes}} phút", "bridging.estimatedTime.secondsOnly": "~{{seconds}} giây", - "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XPL, ZEC — now available on Unichain.", "chart.candlestick": "Biểu đồ nến", "chart.error.pools": "Không thể hiển thị dữ liệu lịch sử cho pool hiện tại.", "chart.error.tokens": "Không thể hiển thị dữ liệu lịch sử cho token hiện tại.", @@ -257,6 +257,7 @@ "common.button.unlock": "Mở khóa", "common.button.view": "Xem", "common.button.viewDetails": "Xem chi tiết", + "common.button.viewMore": "View more", "common.button.yes": "Có", "common.buy.label": "Mua", "common.buyAndSell": "Mua và bán trên Uniswap", @@ -370,6 +371,7 @@ "common.input.noRecipient.error": "Chọn người nhận", "common.input.password.confirm": "Xác nhận mật khẩu", "common.input.password.error.mismatch": "Mật khẩu không khớp", + "common.input.password.error.same": "New password must be different from current password", "common.input.password.error.weak": "Mật khẩu quá yếu", "common.input.password.new": "Mật khẩu mới", "common.input.password.placeholder": "Mật khẩu", @@ -503,6 +505,7 @@ "common.remove.liquidity.canceled": "Đã hủy rút thanh khoản", "common.remove.liquidity.failed": "Rút thanh khoản không thành công", "common.removing.liquidity": "Đang xóa thanh khoản", + "common.reported": "Reported", "common.resetLimit": "Đặt lại giới hạn {{symbol}}", "common.resetLimitWallet": "Đặt lại giới hạn {{symbol}} trong ví", "common.resettingLimit": "Đang đặt lại giới hạn {{symbol}}...", @@ -532,6 +535,7 @@ "common.status": "Trạng thái", "common.step.number": "Bước {{number}}", "common.step.number.of": "Bước {{current}} trên {{total}}", + "common.submit": "Submit", "common.swap": "Hoán đổi", "common.swap.expired": "Hoán đổi đã hết hạn", "common.swap.failed": "Hoán đổi không thành công", @@ -797,6 +801,7 @@ "fee.tier.create": "Tạo bậc phí", "fee.tier.create.button": "Tạo bậc phí mới", "fee.tier.create.description": "Tạo bậc mới sẽ khởi tạo trong một pool mới và dẫn đến phí mạng cao hơn bình thường.", + "fee.tier.default": "-- fee tier", "fee.tier.description": "Số tiền kiếm được cung cấp thanh khoản. Chọn số tiền phù hợp với khả năng chịu rủi ro và chiến lược của bạn.", "fee.tier.description.v2": "Số tiền kiếm được cung cấp thanh khoản. Mọi pool v2 có phí cố định là 0,3%. Để có thêm tùy chọn, hãy cung cấp thanh khoản ở v4.", "fee.tier.dynamic": "Bậc phí linh hoạt", @@ -884,9 +889,9 @@ "hero.swap.title": "Hoán đổi mọi lúc, 
 mọi nơi.", "hidden.nfts.info.banner.text": "Tìm hiểu thêm về NFT đã ẩn", "hidden.nfts.info.text.button": "NFT đã ẩn ({{numHidden}})", - "hidden.nfts.info.text.extension": "Đây là những NFT có khả năng lừa đảo và NFT bạn đã ẩn. Bạn có thể nhấp chuột phải vào NFT để bỏ ẩn.", "hidden.nfts.info.text.mobile": "Đây là những NFT có khả năng lừa đảo và NFT bạn đã ẩn. Bạn có thể nhấn giữ NFT để bỏ ẩn.", "hidden.nfts.info.text.title": "NFT đã ẩn", + "hidden.nfts.info.text.web": "These are potential scams and NFTs you’ve hidden. You can click on an NFT to unhide it.", "hidden.tokens.info.banner.text": "Tìm hiểu thêm về token đã ẩn", "hidden.tokens.info.text.button": "Token đã ẩn ({{numHidden}})", "hidden.tokens.info.text.info": "Đây là những token có khả năng lừa đảo, có số dư nhỏ và token bạn đã ẩn. Token đã ẩn không được tính vào tổng số dư ví của bạn.", @@ -957,32 +962,16 @@ "landing.uniswapX.subtitle": "Hoán đổi thông minh, không còn trở ngại.", "landing.walletBody": "Ví và tiện ích mở rộng crypto tự lưu ký đáng tin cậy với hàng triệu lượt tải, hỗ trợ từ người thật và đánh giá 4,8 .", "landing.walletSubtitle": "Hoán đổi, lưu trữ và khám phá.", - "language.afrikaans": "Tiếng Afrikaans", - "language.arabic": "Tiếng Ả Rập", - "language.catalan": "Tiếng Catalunya", "language.chineseSimplified": "Tiếng Trung, Giản thể", "language.chineseTraditional": "Tiếng Trung, Phồn thể", - "language.czech": "Tiếng Séc", - "language.danish": "Tiếng Đan Mạch", "language.dutch": "Tiếng Hà Lan", "language.english": "Tiếng Anh", - "language.finnish": "Tiếng Phần Lan", "language.french": "Tiếng Pháp", - "language.greek": "Tiếng Hy Lạp", - "language.hebrew": "Tiếng Do Thái", - "language.hindi": "Tiếng Hindi", - "language.hungarian": "Tiếng Hungary", "language.indonesian": "Tiếng Indonesia", - "language.italian": "Tiếng Ý", "language.japanese": "Tiếng Nhật", "language.korean": "Tiếng Hàn", - "language.malay": "Tiếng Mã Lai", - "language.norwegian": "Tiếng Na Uy", - "language.polish": "Tiếng Ba Lan", "language.portuguese": "Tiếng Bồ Đào Nha", - "language.romanian": "Tiếng Romania", "language.russian": "Tiếng Nga", - "language.serbian": "Tiếng Serbia", "language.spanishArgentina": "Tiếng Tây Ban Nha (Argentina)", "language.spanishBelize": "Tiếng Tây Ban Nha (Belize)", "language.spanishBolivia": "Tiếng Tây Ban Nha (Bolivia)", @@ -1006,11 +995,7 @@ "language.spanishUruguay": "Tiếng Tây Ban Nha (Uruguay)", "language.spanishUs": "Tiếng Tây Ban Nha (Hoa Kỳ)", "language.spanishVenezuela": "Tiếng Tây Ban Nha (Venezuela)", - "language.swahili": "Tiếng Swahili", - "language.swedish": "Tiếng Thụy Điển", "language.turkish": "Tiếng Thổ Nhĩ Kỳ", - "language.ukrainian": "Tiếng Ukraina", - "language.urdu": "Tiếng Urdu", "language.vietnamese": "Tiếng Việt", "large.price.difference": "Chênh lệnh giá lớn", "large.price.difference.tooltip": "Nếu tiếp tục giao dịch này, bạn sẽ bị mất quỹ. Giao dịch lớn hoặc thanh khoản thấp có thể gây ra mức chênh lệch này.", @@ -1114,7 +1099,6 @@ "notification.smartWallet.disabled.all": "Đã tắt ví thông minh", "notification.smartWallet.disabled.plural": "Đã tắt trên {{amount}} mạng", "notification.spam.NFT.failed": "Không thể báo cáo NFT. Thử lại sau.", - "notification.spam.NFT.successful": "Đã báo cáo", "notification.swap.network": "Đang hoán đổi trên {{network}}", "notification.swap.pending.swap": "Đang chờ hoán đổi", "notification.swap.pending.unwrap": "Đang chờ hủy bao bọc", @@ -1214,6 +1198,7 @@ "onboarding.home.intro.backup.description.mobile": "Lập kế hoạch khôi phục phòng khi bạn mất hoặc đổi điện thoại.", "onboarding.home.intro.backup.title": "Sao lưu ví của bạn", "onboarding.home.intro.bridgedAssets.description": "Giờ đây, SOL, WIF, BONK và JUP đã có sẵn trên Unichain", + "onboarding.home.intro.bridgedAssets.description.v2": "DOGE, XRP, XPL, ZEC — now available on Unichain", "onboarding.home.intro.bridgedAssets.title": "Giao dịch các token mới trên Unichain", "onboarding.home.intro.fund.description": "Nạp tiền vào ví bằng cách mua crypto hoặc chuyển từ tài khoản khác.", "onboarding.home.intro.fund.title": "Nhận token đầu tiên của bạn", @@ -1438,15 +1423,18 @@ "poolFinder.availablePools.notFound.description": "Không tìm thấy pool v2 trùng khớp. Hãy kiểm tra lại lựa chọn token của bạn và đảm bảo bạn đã kết nối với đúng ví.", "pools.explore": "Khám phá pool", "portfolio.activity.filters.timePeriod.all": "Mọi thời điểm", - "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", + "portfolio.activity.filters.transactionType.addLiquidity": "Added liquidity", "portfolio.activity.filters.transactionType.all": "Mọi loại", "portfolio.activity.filters.transactionType.approvals": "Approvals", - "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", - "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.claimFees": "Claimed fees", + "portfolio.activity.filters.transactionType.createPool": "Pools created", "portfolio.activity.filters.transactionType.mints": "Mints", - "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", + "portfolio.activity.filters.transactionType.receives": "Receives", + "portfolio.activity.filters.transactionType.removeLiquidity": "Removed liquidity", + "portfolio.activity.filters.transactionType.sends": "Sends", "portfolio.activity.filters.transactionType.swaps": "Các giao dịch hoán đổi", "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.search.placeholder": "Search activity", "portfolio.activity.table.column.address": "Address", "portfolio.activity.table.column.amount": "Amount", "portfolio.activity.table.column.time": "Time", @@ -1459,7 +1447,12 @@ "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", "portfolio.disconnected.demoWallet.title": "Demo wallet", "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", + "portfolio.nfts.search.placeholder": "Search your NFTs", "portfolio.nfts.title": "NFT", + "portfolio.overview.stats.averageSwapSize": "Average swap size", + "portfolio.overview.stats.swappedThisWeek": "Swapped this week", + "portfolio.overview.stats.swapsThisWeek": "Swaps this week", + "portfolio.overview.stats.totalSwapVolume": "Total swap volume", "portfolio.overview.title": "Tổng quan", "portfolio.title": "Danh mục đầu tư", "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", @@ -1471,6 +1464,7 @@ "portfolio.tokens.table.column.token": "Token", "portfolio.tokens.table.column.value": "Giá trị", "portfolio.tokens.title": "Token", + "portfolio.view": "View portfolio", "position.addHook": "Thêm Hook", "position.addHook.tooltip": "Hook là tính năng nâng cao cho phép pool tương tác với hợp đồng thông minh, mở khóa nhiều khả năng khác nhau. Hãy thận trọng khi thêm hook, vì một số hook có thể độc hại hoặc gây ra hậu quả không mong muốn.", "position.addingHook": "Đang thêm hook", @@ -1588,6 +1582,33 @@ "qrScanner.wallet.networks": "Các mạng được hỗ trợ", "range.outOfView": "Khoảng giá ngoài phạm vi hiển thị", "removeLiquidity.pooled": "{{symbol}} trong pool:", + "reporting.activity.unhide.action": "Unhide activity", + "reporting.pool.details.title": "Don’t recognize this position?", + "reporting.token.data.options.price.subtitle": "Token price is wrong or unavailable", + "reporting.token.data.options.price.title": "Price", + "reporting.token.data.options.priceChart.subtitle": "Data is wrong or incomplete", + "reporting.token.data.options.priceChart.title": "Price chart", + "reporting.token.data.options.tokenDetails.subtitle": "Token image, description, or link issue", + "reporting.token.data.options.tokenDetails.title": "Token details", + "reporting.token.data.options.volume.subtitle": "Token volume is wrong or unavailable", + "reporting.token.data.options.volume.title": "Volume", + "reporting.token.data.title": "Data issue", + "reporting.token.options.hiddenFees.subtitle": "Token has undisclosed fees when bought/sold", + "reporting.token.options.hiddenFees.title": "Hidden fees", + "reporting.token.options.imposter.subtitle": "Token seems fraudulent or misleading", + "reporting.token.options.imposter.title": "Imposter token", + "reporting.token.options.other.title": "Something else", + "reporting.token.options.spam.subtitle": "Token appeared in wallet unexpectedly", + "reporting.token.options.spam.title": "Spam token", + "reporting.token.report.button.disabled": "Select an issue", + "reporting.token.report.other.placeholder": "Describe the issue", + "reporting.token.report.title": "Report token", + "reporting.token.report.title.withSymbol": "Report {{symbol}}", + "reporting.token.warning.button": "This warning is incorrect", + "reporting.token.warning.report.placeholder": "Add details (optional)", + "reporting.token.warning.report.submit": "Report issue", + "reporting.token.warning.report.subtitle": "Report an issue if the warning below seems wrong. We’ll take a closer look.", + "reporting.token.warning.report.title": "Report an inaccurate warning", "revoke.failed.message": "Thu hồi không thành công do lỗi mạng hoặc sự cố kết nối. Vui lòng kiểm tra kết nối và thử lại.", "routing.aggregateLiquidity": "Khi khả dụng, tổng hợp các nguồn thanh khoản để có giá tốt hơn và hoán đổi có miễn phí gas.", "routing.aggregateLiquidity.uniswapx": "UniswapX tổng hợp các nguồn thanh khoản onchain và offchain để đem tới mức giá tốt nhất và giao dịch hoán đổi không tốn gas.", @@ -1735,6 +1756,7 @@ "settings.setting.backup.status.inProgress": "Đang sao lưu vào {{cloudProviderName}}...", "settings.setting.backup.status.recoveryPhrase.backed": "Đã sao lưu", "settings.setting.backup.status.title": "Sao lưu trên {{cloudProviderName}}", + "settings.setting.balancesActivity.title": "Balances and activity", "settings.setting.beta.tooltip": "Sắp ra mắt", "settings.setting.biometrics.appAccess.subtitle.android": "Yêu cầu khuôn mặt/vân tay để mở ứng dụng.", "settings.setting.biometrics.appAccess.subtitle.ios": "Yêu cầu {{biometricsMethod}} để mở ứng dụng.", @@ -1786,7 +1808,8 @@ "settings.setting.privacy.analytics.title": "Thống kê ứng dụng", "settings.setting.privateKeys.title": "Khóa riêng tư", "settings.setting.recoveryPhrase.title": "Cụm từ khôi phục", - "settings.setting.smallBalances.title": "Số dư danh mục đầu tư", + "settings.setting.reportedActivity.subtitle": "Transactions you’ve reported as spam will be hidden from your activity feed.", + "settings.setting.reportedActivity.title": "Hide reported activity", "settings.setting.smartWallet.action.enable": "Bật", "settings.setting.smartWallet.action.smartWallet": "Ví thông minh", "settings.setting.smartWallet.notEligible": "Không đủ điều kiện", @@ -2290,6 +2313,8 @@ "transaction.networkCost.label": "Phí mạng", "transaction.networkCost.maxNativeBalance.description": "Một lượng nhỏ số dư token sẽ được giữ lại để chi trả phí mạng của giao dịch này.", "transaction.networkCost.maxNativeBalance.title": "Vì sao tôi không thể dùng số dư tối đa?", + "transaction.networkCost.presetNativeBalance.description": "You don’t have enough balance to cover both this amount and the network cost of the transaction.", + "transaction.networkCost.presetNativeBalance.title": "Why can’t I use this amount?", "transaction.networkCost.veryHigh.label": "Phí mạng rất cao", "transaction.notification.error.cancel": "Không thể hủy giao dịch", "transaction.notification.error.replace": "Không thể thay thế giao dịch", diff --git a/packages/uniswap/src/i18n/locales/translations/zh-CN.json b/packages/uniswap/src/i18n/locales/translations/zh-CN.json index 17ad3bb5632..c084962f85b 100644 --- a/packages/uniswap/src/i18n/locales/translations/zh-CN.json +++ b/packages/uniswap/src/i18n/locales/translations/zh-CN.json @@ -30,7 +30,6 @@ "account.drawer.modal.body": "使用 Uniswap 应用安全地存储和交换代币。适用于 iOS 和 Android。", "account.drawer.modal.dont": "没有 Uniswap Wallet?", "account.drawer.modal.scan": "使用 Uniswap Wallet 扫描", - "account.drawer.spamToggle": "隐藏未知代币和非同质化代币", "account.passkey.delete.acknowledge": "我已备份恢复短语,并了解如果未能备份,Uniswap 实验室将无法帮助我恢复钱包。", "account.passkey.delete.description": "请确保你已通过 Uniswap 移动端应用或浏览器扩展备份了恢复短语。", "account.passkey.delete.descriptionEmphasized": "如果没有恢复短语,你可能无法访问钱包。", @@ -115,6 +114,7 @@ "account.wallet.watch.placeholder": "ENS 或地址", "account.wallet.watch.title": "输入钱包地址", "activity.pending": "{{pendingActivityCount}} 待处理", + "activity.recentActivity": "Recent activity", "activity.transaction.lpRewards.descriptor": "已收取 {{symbol}} 奖励", "activity.transaction.send.descriptor": "{{amountWithSymbol}} 至 {{walletAddress}}", "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} 交换 {{amountWithSymbolB}}", @@ -144,15 +144,15 @@ "bridgedAsset.send.warning.description": "你正在发送 {{chainName}} 上的封装版 {{currencySymbol}}。将其发送至中心化交易所将导致资金永久损失。", "bridgedAsset.send.warning.title": "请确保你发送至兼容的地址", "bridgedAsset.tdp.description": "这是 {{currencySymbol}} 的跨链桥接版本,由原生 {{currencySymbol}} 以 1:1 比例提供支持。", - "bridgedAsset.wormhole.button": "继续前往 Wormhole", - "bridgedAsset.wormhole.description": "继续前往 Wormhole 门户,将你的 {{currencySymbol}} 从 {{chainName}} 跨链桥接至 {{nativeChainName}}。", + "bridgedAsset.wormhole.button": "Continue to {{provider}}", + "bridgedAsset.wormhole.description": "Continue to the {{provider}} portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", "bridgedAsset.wormhole.title": "将 {{currencySymbol}} 提取到 {{nativeChainName}}", "bridgedAsset.wormhole.toNativeChain": "到 {{nativeChainName}}", "bridgedAsset.wormhole.withdrawToNativeChain": "提取到 {{nativeChainName}}", "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} 分钟 {{seconds}} 秒", "bridging.estimatedTime.minutesOnly": "~{{minutes}} 分钟", "bridging.estimatedTime.secondsOnly": "~{{seconds}} 秒", - "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XPL, ZEC — now available on Unichain.", "chart.candlestick": "K 线图", "chart.error.pools": "无法显示当前资金池的历史数据。", "chart.error.tokens": "无法显示当前代币的历史数据。", @@ -257,6 +257,7 @@ "common.button.unlock": "解锁", "common.button.view": "查看", "common.button.viewDetails": "查看详情", + "common.button.viewMore": "View more", "common.button.yes": "是", "common.buy.label": "购买", "common.buyAndSell": "在 Uniswap 上买卖", @@ -370,6 +371,7 @@ "common.input.noRecipient.error": "选择收款人", "common.input.password.confirm": "确认密码", "common.input.password.error.mismatch": "密码不匹配", + "common.input.password.error.same": "New password must be different from current password", "common.input.password.error.weak": "此密码太弱", "common.input.password.new": "新密码", "common.input.password.placeholder": "密码", @@ -503,6 +505,7 @@ "common.remove.liquidity.canceled": "移除流动性已取消", "common.remove.liquidity.failed": "移除流动性失败", "common.removing.liquidity": "正在移除流动性", + "common.reported": "Reported", "common.resetLimit": "重置 {{symbol}} 限额", "common.resetLimitWallet": "重置 {{symbol}} 钱包限额", "common.resettingLimit": "正在重置 {{symbol}} 限额...", @@ -532,6 +535,7 @@ "common.status": "状态", "common.step.number": "步骤 {{number}}", "common.step.number.of": "第 {{current}} 步(共 {{total}} 步)", + "common.submit": "Submit", "common.swap": "交换", "common.swap.expired": "交换已过期", "common.swap.failed": "交换失败", @@ -797,6 +801,7 @@ "fee.tier.create": "创建费用等级", "fee.tier.create.button": "创建新费用等级", "fee.tier.create.description": "创建新等级将在新资金池中初始化,并导致网络费用比平常高。", + "fee.tier.default": "-- fee tier", "fee.tier.description": "通过提供流动性赚取的金额。选择适合你风险承受能力和投资策略的金额。", "fee.tier.description.v2": "通过提供流动性赚取的金额。所有 v2 资金池均收取 0.3% 的固定费用。如需更多选择,请在 v4 上提供流动性。", "fee.tier.dynamic": "动态费用等级", @@ -884,9 +889,9 @@ "hero.swap.title": "随时随地
交换。", "hidden.nfts.info.banner.text": "了解有关隐藏非同质化代币的更多信息", "hidden.nfts.info.text.button": "隐藏的非同质化代币 ({{numHidden}})", - "hidden.nfts.info.text.extension": "这些是潜在骗局和你选择隐藏的非同质化代币。你可以右键单击非同质化代币将其取消隐藏。", "hidden.nfts.info.text.mobile": "这些是潜在骗局和你选择隐藏的非同质化代币。你可以长按非同质化代币将其取消隐藏。", "hidden.nfts.info.text.title": "隐藏的非同质化代币", + "hidden.nfts.info.text.web": "These are potential scams and NFTs you’ve hidden. You can click on an NFT to unhide it.", "hidden.tokens.info.banner.text": "详细了解隐藏的代币", "hidden.tokens.info.text.button": "隐藏的代币 ({{numHidden}})", "hidden.tokens.info.text.info": "这些是潜在的骗局、小额余额以及你隐藏的代币。隐藏代币不包含在你的钱包总余额中。", @@ -957,32 +962,16 @@ "landing.uniswapX.subtitle": "交换更智能,零摩擦。", "landing.walletBody": "值得信赖的自托管加密货币钱包和扩展,拥有数百万次下载量、真人支持以及 4.8 评级。", "landing.walletSubtitle": "交换、存储、探索。", - "language.afrikaans": "南非荷兰语", - "language.arabic": "阿拉伯语", - "language.catalan": "加泰罗尼亚语", "language.chineseSimplified": "简体中文", "language.chineseTraditional": "繁体中文", - "language.czech": "捷克语", - "language.danish": "丹麦语", "language.dutch": "荷兰语", "language.english": "英语", - "language.finnish": "芬兰语", "language.french": "法语", - "language.greek": "希腊语", - "language.hebrew": "希伯来语", - "language.hindi": "印地语", - "language.hungarian": "匈牙利语", "language.indonesian": "印度尼西亚语", - "language.italian": "意大利语", "language.japanese": "日语", "language.korean": "韩语", - "language.malay": "马来语", - "language.norwegian": "挪威语", - "language.polish": "波兰语", "language.portuguese": "葡萄牙语", - "language.romanian": "罗马尼亚语", "language.russian": "俄语", - "language.serbian": "塞尔维亚语", "language.spanishArgentina": "西班牙语(阿根廷)", "language.spanishBelize": "西班牙语(伯利兹)", "language.spanishBolivia": "西班牙语(玻利维亚)", @@ -1006,11 +995,7 @@ "language.spanishUruguay": "西班牙语(乌拉圭)", "language.spanishUs": "西班牙语(美国)", "language.spanishVenezuela": "西班牙语(委内瑞拉)", - "language.swahili": "斯瓦希里语", - "language.swedish": "瑞典语", "language.turkish": "土耳其语", - "language.ukrainian": "乌克兰语", - "language.urdu": "乌尔都语", "language.vietnamese": "越南语", "large.price.difference": "差价较大", "large.price.difference.tooltip": "进行该交易可能会导致资金损失。这种差异可能是由于大额交易或流动性低所致。", @@ -1114,7 +1099,6 @@ "notification.smartWallet.disabled.all": "智能钱包已禁用", "notification.smartWallet.disabled.plural": "已在 {{amount}} 个网络上禁用", "notification.spam.NFT.failed": "无法报告非同质化代币。请稍后重试。", - "notification.spam.NFT.successful": "已举报", "notification.swap.network": "正在 {{network}} 上交换", "notification.swap.pending.swap": "待交换", "notification.swap.pending.unwrap": "待拆封", @@ -1214,6 +1198,7 @@ "onboarding.home.intro.backup.description.mobile": "制定恢复计划,以防手机丢失或更换新手机。", "onboarding.home.intro.backup.title": "备份你的钱包", "onboarding.home.intro.bridgedAssets.description": "SOL、WIF、BONK 与 JUP — 现已在 Unichain 上线", + "onboarding.home.intro.bridgedAssets.description.v2": "DOGE, XRP, XPL, ZEC — now available on Unichain", "onboarding.home.intro.bridgedAssets.title": "在 Unichain 上交易新代币", "onboarding.home.intro.fund.description": "购买加密货币或从其他账户转移加密货币,为你的钱包充值。", "onboarding.home.intro.fund.title": "获取你的第一个代币", @@ -1438,15 +1423,18 @@ "poolFinder.availablePools.notFound.description": "未找到相符的 v2 资金池。请仔细检查你选择的代币,并确保你已连接至正确的钱包。", "pools.explore": "探索资金池", "portfolio.activity.filters.timePeriod.all": "所有时间", - "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", + "portfolio.activity.filters.transactionType.addLiquidity": "Added liquidity", "portfolio.activity.filters.transactionType.all": "所有类型", "portfolio.activity.filters.transactionType.approvals": "Approvals", - "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", - "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.claimFees": "Claimed fees", + "portfolio.activity.filters.transactionType.createPool": "Pools created", "portfolio.activity.filters.transactionType.mints": "Mints", - "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", + "portfolio.activity.filters.transactionType.receives": "Receives", + "portfolio.activity.filters.transactionType.removeLiquidity": "Removed liquidity", + "portfolio.activity.filters.transactionType.sends": "Sends", "portfolio.activity.filters.transactionType.swaps": "交换", "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.search.placeholder": "Search activity", "portfolio.activity.table.column.address": "Address", "portfolio.activity.table.column.amount": "Amount", "portfolio.activity.table.column.time": "Time", @@ -1459,7 +1447,12 @@ "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", "portfolio.disconnected.demoWallet.title": "Demo wallet", "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", + "portfolio.nfts.search.placeholder": "Search your NFTs", "portfolio.nfts.title": "非同质化代币", + "portfolio.overview.stats.averageSwapSize": "Average swap size", + "portfolio.overview.stats.swappedThisWeek": "Swapped this week", + "portfolio.overview.stats.swapsThisWeek": "Swaps this week", + "portfolio.overview.stats.totalSwapVolume": "Total swap volume", "portfolio.overview.title": "概览", "portfolio.title": "资产组合", "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", @@ -1471,6 +1464,7 @@ "portfolio.tokens.table.column.token": "代币", "portfolio.tokens.table.column.value": "价值", "portfolio.tokens.title": "代币", + "portfolio.view": "View portfolio", "position.addHook": "添加钩子", "position.addHook.tooltip": "钩子是一项高级功能,使资金池能够与智能合约进行交互,从而解锁各种功能。添加钩子时要小心,因为有些钩子可能是恶意的或会导致意想不到的后果。", "position.addingHook": "添加钩子", @@ -1588,6 +1582,33 @@ "qrScanner.wallet.networks": "支持的网络", "range.outOfView": "区间不可见", "removeLiquidity.pooled": "已汇集 {{symbol}}:", + "reporting.activity.unhide.action": "Unhide activity", + "reporting.pool.details.title": "Don’t recognize this position?", + "reporting.token.data.options.price.subtitle": "Token price is wrong or unavailable", + "reporting.token.data.options.price.title": "Price", + "reporting.token.data.options.priceChart.subtitle": "Data is wrong or incomplete", + "reporting.token.data.options.priceChart.title": "Price chart", + "reporting.token.data.options.tokenDetails.subtitle": "Token image, description, or link issue", + "reporting.token.data.options.tokenDetails.title": "Token details", + "reporting.token.data.options.volume.subtitle": "Token volume is wrong or unavailable", + "reporting.token.data.options.volume.title": "Volume", + "reporting.token.data.title": "Data issue", + "reporting.token.options.hiddenFees.subtitle": "Token has undisclosed fees when bought/sold", + "reporting.token.options.hiddenFees.title": "Hidden fees", + "reporting.token.options.imposter.subtitle": "Token seems fraudulent or misleading", + "reporting.token.options.imposter.title": "Imposter token", + "reporting.token.options.other.title": "Something else", + "reporting.token.options.spam.subtitle": "Token appeared in wallet unexpectedly", + "reporting.token.options.spam.title": "Spam token", + "reporting.token.report.button.disabled": "Select an issue", + "reporting.token.report.other.placeholder": "Describe the issue", + "reporting.token.report.title": "Report token", + "reporting.token.report.title.withSymbol": "Report {{symbol}}", + "reporting.token.warning.button": "This warning is incorrect", + "reporting.token.warning.report.placeholder": "Add details (optional)", + "reporting.token.warning.report.submit": "Report issue", + "reporting.token.warning.report.subtitle": "Report an issue if the warning below seems wrong. We’ll take a closer look.", + "reporting.token.warning.report.title": "Report an inaccurate warning", "revoke.failed.message": "可能是网络或连接问题导致撤销操作失败。请检查网络连接后重试。", "routing.aggregateLiquidity": "在可用时,聚合流动性来源,以获得更优惠的价格和免 Gas 费交换。", "routing.aggregateLiquidity.uniswapx": "UniswapX 聚合链上与链下的流动性来源,为你提供最佳的可用价格和免 Gas 费交换。", @@ -1735,6 +1756,7 @@ "settings.setting.backup.status.inProgress": "正在备份到 {{cloudProviderName}}...", "settings.setting.backup.status.recoveryPhrase.backed": "已备份", "settings.setting.backup.status.title": "{{cloudProviderName}} 备份", + "settings.setting.balancesActivity.title": "Balances and activity", "settings.setting.beta.tooltip": "即将推出", "settings.setting.biometrics.appAccess.subtitle.android": "需要面部识别/指纹才能打开应用。", "settings.setting.biometrics.appAccess.subtitle.ios": "需要提供 {{biometricsMethod}} 才能打开应用。", @@ -1786,7 +1808,8 @@ "settings.setting.privacy.analytics.title": "应用分析", "settings.setting.privateKeys.title": "私钥", "settings.setting.recoveryPhrase.title": "恢复短语", - "settings.setting.smallBalances.title": "投资组合余额", + "settings.setting.reportedActivity.subtitle": "Transactions you’ve reported as spam will be hidden from your activity feed.", + "settings.setting.reportedActivity.title": "Hide reported activity", "settings.setting.smartWallet.action.enable": "启用", "settings.setting.smartWallet.action.smartWallet": "智能钱包", "settings.setting.smartWallet.notEligible": "不符合资格", @@ -2290,6 +2313,8 @@ "transaction.networkCost.label": "网络费用", "transaction.networkCost.maxNativeBalance.description": "保留少量网络代币余额以支付本次交易的网络费用。", "transaction.networkCost.maxNativeBalance.title": "为什么我不能使用我的最大余额?", + "transaction.networkCost.presetNativeBalance.description": "You don’t have enough balance to cover both this amount and the network cost of the transaction.", + "transaction.networkCost.presetNativeBalance.title": "Why can’t I use this amount?", "transaction.networkCost.veryHigh.label": "极高网络费用", "transaction.notification.error.cancel": "无法取消交易", "transaction.notification.error.replace": "无法替换交易", diff --git a/packages/uniswap/src/i18n/locales/translations/zh-TW.json b/packages/uniswap/src/i18n/locales/translations/zh-TW.json index 21c0ea4913e..eaef08a9fbe 100644 --- a/packages/uniswap/src/i18n/locales/translations/zh-TW.json +++ b/packages/uniswap/src/i18n/locales/translations/zh-TW.json @@ -30,7 +30,6 @@ "account.drawer.modal.body": "使用 Uniswap App 安全地儲存和交換代幣。適用於 iOS 和 Android。", "account.drawer.modal.dont": "沒有 Uniswap Wallet?", "account.drawer.modal.scan": "使用 Uniswap Wallet 掃描", - "account.drawer.spamToggle": "隱藏未知代幣和 NFT", "account.passkey.delete.acknowledge": "我已備份好我的助記詞,並明白如果未能妥善保管,Uniswap Labs 無法協助我恢復錢包。", "account.passkey.delete.description": "請確保你已透過 Uniswap 行動版 App 或瀏覽器擴充功能備份好你的助記詞。", "account.passkey.delete.descriptionEmphasized": "若沒有助記詞,你將無法存取你的錢包。", @@ -115,6 +114,7 @@ "account.wallet.watch.placeholder": "ENS 或地址", "account.wallet.watch.title": "輸入錢包地址", "activity.pending": "{{pendingActivityCount}} 待處理", + "activity.recentActivity": "Recent activity", "activity.transaction.lpRewards.descriptor": "已收取 {{symbol}} 獎勵", "activity.transaction.send.descriptor": "{{amountWithSymbol}} 到 {{walletAddress}}", "activity.transaction.swap.descriptor": "{{amountWithSymbolA}} 交換 {{amountWithSymbolB}}", @@ -144,15 +144,15 @@ "bridgedAsset.send.warning.description": "你正在傳送 {{chainName}} 上的包裝版 {{currencySymbol}}。若將其傳送至中心化交易所,將導致資金永久損失。", "bridgedAsset.send.warning.title": "請確保你正在傳送至相容地址", "bridgedAsset.tdp.description": "這是橋接版本的 {{currencySymbol}},由原生 {{currencySymbol}} 以 1:1 比例提供支援。", - "bridgedAsset.wormhole.button": "繼續前往 Wormhole", - "bridgedAsset.wormhole.description": "繼續前往 Wormhole 入口,將你的 {{currencySymbol}} 從 {{chainName}} 橋接至 {{nativeChainName}}。", + "bridgedAsset.wormhole.button": "Continue to {{provider}}", + "bridgedAsset.wormhole.description": "Continue to the {{provider}} portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", "bridgedAsset.wormhole.title": "將 {{currencySymbol}} 提領至 {{nativeChainName}}", "bridgedAsset.wormhole.toNativeChain": "至 {{nativeChainName}}", "bridgedAsset.wormhole.withdrawToNativeChain": "提領至 {{nativeChainName}}", "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} 分 {{seconds}} 秒", "bridging.estimatedTime.minutesOnly": "~{{minutes}} 分鐘", "bridging.estimatedTime.secondsOnly": "~{{seconds}} 秒", - "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XPL, ZEC — now available on Unichain.", "chart.candlestick": "K 線圖表", "chart.error.pools": "無法顯示目前資產池的過往記錄資料。", "chart.error.tokens": "無法顯示目前代幣的過往記錄資料。", @@ -257,6 +257,7 @@ "common.button.unlock": "解鎖", "common.button.view": "檢視", "common.button.viewDetails": "檢視詳情", + "common.button.viewMore": "View more", "common.button.yes": "是的", "common.buy.label": "購買", "common.buyAndSell": "在 Uniswap 買賣", @@ -370,6 +371,7 @@ "common.input.noRecipient.error": "選擇接收方", "common.input.password.confirm": "確認密碼", "common.input.password.error.mismatch": "密碼不相符", + "common.input.password.error.same": "New password must be different from current password", "common.input.password.error.weak": "此密碼強度不足", "common.input.password.new": "新密碼", "common.input.password.placeholder": "密碼", @@ -503,6 +505,7 @@ "common.remove.liquidity.canceled": "移除流動資產已取消", "common.remove.liquidity.failed": "移除流動資產失敗", "common.removing.liquidity": "正在移除流動資產", + "common.reported": "Reported", "common.resetLimit": "重設 {{symbol}} 限制", "common.resetLimitWallet": "重設 {{symbol}} 錢包限額", "common.resettingLimit": "正在重設 {{symbol}} 限制...", @@ -532,6 +535,7 @@ "common.status": "狀態", "common.step.number": "步驟 {{number}}", "common.step.number.of": "第 {{current}} 步 (共 {{total}} 步)", + "common.submit": "Submit", "common.swap": "交換", "common.swap.expired": "交換已過期", "common.swap.failed": "交換失敗", @@ -797,6 +801,7 @@ "fee.tier.create": "建立交易費用等級", "fee.tier.create.button": "建立新交易費用等級", "fee.tier.create.description": "建立新等級將在新資產池中初始化,並導致比平常更高的網路費。", + "fee.tier.default": "-- fee tier", "fee.tier.description": "提供流動資產所賺取的金額。選擇適合你的風險承受能力和策略的金額。", "fee.tier.description.v2": "提供流動資產所賺取的金額。所有 v2 資產池都有固定的 0.3% 交易費用。如需更多選擇,請在 v4 上提供流動資產。", "fee.tier.dynamic": "動態交易費用等級", @@ -884,9 +889,9 @@ "hero.swap.title": "隨時隨地
代幣交換。", "hidden.nfts.info.banner.text": "了解有關隱藏 NFT 的更多信息", "hidden.nfts.info.text.button": "隱藏的 NFT ({{numHidden}})", - "hidden.nfts.info.text.extension": "這些是你隱藏的潛在騙局和 NFT。你可以使用滑鼠右鍵按一下 NFT 將其取消隱藏。", "hidden.nfts.info.text.mobile": "這些是你隱藏的潛在騙局和 NFT。你可以長按 NFT 將其取消隱藏。", "hidden.nfts.info.text.title": "隱藏的 NFT", + "hidden.nfts.info.text.web": "These are potential scams and NFTs you’ve hidden. You can click on an NFT to unhide it.", "hidden.tokens.info.banner.text": "了解有關隱藏代幣的更多資訊", "hidden.tokens.info.text.button": "隱藏代幣 ({{numHidden}})", "hidden.tokens.info.text.info": "隱藏代幣是潛在的詐騙、小額餘額和你隱藏的代幣。隱藏代幣不包含在你的錢包總餘額中。", @@ -957,32 +962,16 @@ "landing.uniswapX.subtitle": "智慧交換,零摩擦。", "landing.walletBody": "備受信任的自主管理型加密貨幣錢包和擴充功能,下載量多達數百萬次,由真人提供支援,4.8 評等。", "landing.walletSubtitle": "交換、儲存、探索。", - "language.afrikaans": "阿非利卡文", - "language.arabic": "阿拉伯語", - "language.catalan": "加泰隆尼亞語", "language.chineseSimplified": "簡體中文", "language.chineseTraditional": "繁體中文", - "language.czech": "捷克語", - "language.danish": "丹麥語", "language.dutch": "荷蘭文", "language.english": "英文", - "language.finnish": "芬蘭文", "language.french": "法文", - "language.greek": "希臘文", - "language.hebrew": "希伯來文", - "language.hindi": "印地文", - "language.hungarian": "匈牙利文", "language.indonesian": "印尼文", - "language.italian": "義大利語", "language.japanese": "日文", "language.korean": "韓文", - "language.malay": "馬來文", - "language.norwegian": "挪威文", - "language.polish": "波蘭文", "language.portuguese": "葡萄牙文", - "language.romanian": "羅馬尼亞語", "language.russian": "俄文", - "language.serbian": "塞爾維亞文", "language.spanishArgentina": "西班牙文 (阿根廷)", "language.spanishBelize": "西班牙文 (貝里斯)", "language.spanishBolivia": "西班牙文 (玻利維亞)", @@ -1006,11 +995,7 @@ "language.spanishUruguay": "西班牙文 (烏拉圭)", "language.spanishUs": "西班牙文 (美國)", "language.spanishVenezuela": "西班牙文 (委內瑞拉)", - "language.swahili": "斯瓦希里語", - "language.swedish": "瑞典文", "language.turkish": "土耳其文", - "language.ukrainian": "烏克蘭文", - "language.urdu": "烏都文", "language.vietnamese": "越南文", "large.price.difference": "價格差異大", "large.price.difference.tooltip": "繼續進行此交易將導致資金損失。這種差異可能是由於交易量大或流動性低所造成的。", @@ -1114,7 +1099,6 @@ "notification.smartWallet.disabled.all": "智慧型錢包已停用", "notification.smartWallet.disabled.plural": "已在 {{amount}} 個網路上停用", "notification.spam.NFT.failed": "無法報告 NFT。請稍後再試。", - "notification.spam.NFT.successful": "已檢舉", "notification.swap.network": "正在 {{network}} 上交換", "notification.swap.pending.swap": "交換待處理", "notification.swap.pending.unwrap": "拆封待處理", @@ -1214,6 +1198,7 @@ "onboarding.home.intro.backup.description.mobile": "預先設定恢復計畫,以防手機遺失或更換新機。", "onboarding.home.intro.backup.title": "備份你的錢包", "onboarding.home.intro.bridgedAssets.description": "SOL、WIF、BONK 與 JUP — 現已於 Unichain 上開放", + "onboarding.home.intro.bridgedAssets.description.v2": "DOGE, XRP, XPL, ZEC — now available on Unichain", "onboarding.home.intro.bridgedAssets.title": "在 Unichain 上交易新代幣", "onboarding.home.intro.fund.description": "透過購買加密貨幣或從其他帳戶轉帳來為你的錢包充值。", "onboarding.home.intro.fund.title": "獲取你的第一個代幣", @@ -1438,15 +1423,18 @@ "poolFinder.availablePools.notFound.description": "未找到相符的 v2 資產池。請仔細檢查你選取的代幣,並確保你已連接至正確的錢包。", "pools.explore": "探索資產池", "portfolio.activity.filters.timePeriod.all": "全部時間", - "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", + "portfolio.activity.filters.transactionType.addLiquidity": "Added liquidity", "portfolio.activity.filters.transactionType.all": "所有類型", "portfolio.activity.filters.transactionType.approvals": "Approvals", - "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", - "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.claimFees": "Claimed fees", + "portfolio.activity.filters.transactionType.createPool": "Pools created", "portfolio.activity.filters.transactionType.mints": "Mints", - "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", + "portfolio.activity.filters.transactionType.receives": "Receives", + "portfolio.activity.filters.transactionType.removeLiquidity": "Removed liquidity", + "portfolio.activity.filters.transactionType.sends": "Sends", "portfolio.activity.filters.transactionType.swaps": "交換", "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.search.placeholder": "Search activity", "portfolio.activity.table.column.address": "Address", "portfolio.activity.table.column.amount": "Amount", "portfolio.activity.table.column.time": "Time", @@ -1459,7 +1447,12 @@ "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", "portfolio.disconnected.demoWallet.title": "Demo wallet", "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", + "portfolio.nfts.search.placeholder": "Search your NFTs", "portfolio.nfts.title": "NFT", + "portfolio.overview.stats.averageSwapSize": "Average swap size", + "portfolio.overview.stats.swappedThisWeek": "Swapped this week", + "portfolio.overview.stats.swapsThisWeek": "Swaps this week", + "portfolio.overview.stats.totalSwapVolume": "Total swap volume", "portfolio.overview.title": "概覽", "portfolio.title": "資產組合", "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", @@ -1471,6 +1464,7 @@ "portfolio.tokens.table.column.token": "代幣", "portfolio.tokens.table.column.value": "價值", "portfolio.tokens.title": "代幣", + "portfolio.view": "View portfolio", "position.addHook": "新增一個掛鉤", "position.addHook.tooltip": "掛鉤是一項進階功能,使資產池能夠與智慧型合約互動,進而解鎖各種功能。在新增掛鉤時請務必小心,因為有些掛鉤可能是惡意的或會導致意外後果。", "position.addingHook": "新增掛鉤", @@ -1588,6 +1582,33 @@ "qrScanner.wallet.networks": "支援的網路", "range.outOfView": "範圍不可見", "removeLiquidity.pooled": "合併 {{symbol}}:", + "reporting.activity.unhide.action": "Unhide activity", + "reporting.pool.details.title": "Don’t recognize this position?", + "reporting.token.data.options.price.subtitle": "Token price is wrong or unavailable", + "reporting.token.data.options.price.title": "Price", + "reporting.token.data.options.priceChart.subtitle": "Data is wrong or incomplete", + "reporting.token.data.options.priceChart.title": "Price chart", + "reporting.token.data.options.tokenDetails.subtitle": "Token image, description, or link issue", + "reporting.token.data.options.tokenDetails.title": "Token details", + "reporting.token.data.options.volume.subtitle": "Token volume is wrong or unavailable", + "reporting.token.data.options.volume.title": "Volume", + "reporting.token.data.title": "Data issue", + "reporting.token.options.hiddenFees.subtitle": "Token has undisclosed fees when bought/sold", + "reporting.token.options.hiddenFees.title": "Hidden fees", + "reporting.token.options.imposter.subtitle": "Token seems fraudulent or misleading", + "reporting.token.options.imposter.title": "Imposter token", + "reporting.token.options.other.title": "Something else", + "reporting.token.options.spam.subtitle": "Token appeared in wallet unexpectedly", + "reporting.token.options.spam.title": "Spam token", + "reporting.token.report.button.disabled": "Select an issue", + "reporting.token.report.other.placeholder": "Describe the issue", + "reporting.token.report.title": "Report token", + "reporting.token.report.title.withSymbol": "Report {{symbol}}", + "reporting.token.warning.button": "This warning is incorrect", + "reporting.token.warning.report.placeholder": "Add details (optional)", + "reporting.token.warning.report.submit": "Report issue", + "reporting.token.warning.report.subtitle": "Report an issue if the warning below seems wrong. We’ll take a closer look.", + "reporting.token.warning.report.title": "Report an inaccurate warning", "revoke.failed.message": "撤銷操作失敗,可能是網路或連線存在問題。請檢查網路連線並重試。", "routing.aggregateLiquidity": "如果可以,請聚合流動性來源,以獲得更優惠的價格以及免燃料費的交換。", "routing.aggregateLiquidity.uniswapx": "UniswapX 可集結鏈上和鏈下的流動性來源,為你帶來最優惠的價格和免燃料費交換。", @@ -1735,6 +1756,7 @@ "settings.setting.backup.status.inProgress": "正在備份到 {{cloudProviderName}}...", "settings.setting.backup.status.recoveryPhrase.backed": "已備份", "settings.setting.backup.status.title": "{{cloudProviderName}} 備份", + "settings.setting.balancesActivity.title": "Balances and activity", "settings.setting.beta.tooltip": "即將推出", "settings.setting.biometrics.appAccess.subtitle.android": "需要臉部辨識/指紋,才能開啟 App。", "settings.setting.biometrics.appAccess.subtitle.ios": "需要 {{biometricsMethod}},才能開啟 App。", @@ -1786,7 +1808,8 @@ "settings.setting.privacy.analytics.title": "App 分析", "settings.setting.privateKeys.title": "私鑰", "settings.setting.recoveryPhrase.title": "助記詞", - "settings.setting.smallBalances.title": "投資組合餘額", + "settings.setting.reportedActivity.subtitle": "Transactions you’ve reported as spam will be hidden from your activity feed.", + "settings.setting.reportedActivity.title": "Hide reported activity", "settings.setting.smartWallet.action.enable": "啟用", "settings.setting.smartWallet.action.smartWallet": "智慧型錢包", "settings.setting.smartWallet.notEligible": "不符合條件", @@ -2290,6 +2313,8 @@ "transaction.networkCost.label": "網路費", "transaction.networkCost.maxNativeBalance.description": "保留少量網路代幣餘額以支付本交易的網路費。", "transaction.networkCost.maxNativeBalance.title": "為什麼我不能使用我的最大餘額?", + "transaction.networkCost.presetNativeBalance.description": "You don’t have enough balance to cover both this amount and the network cost of the transaction.", + "transaction.networkCost.presetNativeBalance.title": "Why can’t I use this amount?", "transaction.networkCost.veryHigh.label": "網路費非常高", "transaction.notification.error.cancel": "無法取消交易", "transaction.notification.error.replace": "無法取代交易", diff --git a/packages/uniswap/src/state/uniswapMigrationTests.ts b/packages/uniswap/src/state/uniswapMigrationTests.ts index 56fb59d3d09..8c2b4f428b9 100644 --- a/packages/uniswap/src/state/uniswapMigrationTests.ts +++ b/packages/uniswap/src/state/uniswapMigrationTests.ts @@ -5,7 +5,6 @@ import { PreV55SearchResultType } from 'uniswap/src/state/oldTypes' // Mobile: 89 // Extension: 25 // Web: 25 - export function testRemoveTHBFromCurrency(migration: (state: any) => any, prevSchema: any): void { const result = migration(prevSchema) @@ -16,10 +15,9 @@ export function testRemoveTHBFromCurrency(migration: (state: any) => any, prevSc } } -// Web: 55 // Mobile: 93 // Extension: 27 - +// Web: 55 export function testMigrateSearchHistory(migration: (state: any) => any, prevSchema: any): void { const result = migration(prevSchema) @@ -39,3 +37,11 @@ export function testMigrateSearchHistory(migration: (state: any) => any, prevSch } } } + +// Mobile: 95 +// Extension: 29 +// Web: 59 +export function testAddActivityVisibility(migration: (state: any) => any, prevSchema: any): void { + const result = migration(prevSchema) + expect(result.visibility.activity).toEqual({}) +} diff --git a/packages/uniswap/src/state/uniswapMigrations.ts b/packages/uniswap/src/state/uniswapMigrations.ts index 457a7f076ab..50971e6b49b 100644 --- a/packages/uniswap/src/state/uniswapMigrations.ts +++ b/packages/uniswap/src/state/uniswapMigrations.ts @@ -164,3 +164,16 @@ export function addDismissedBridgedAndCompatibleWarnings(state: any): any { }, } } + +// Mobile: 95 +// Extension: 29 +// Web: 59 +export function addActivityVisibility(state: any): any { + if (!state?.visibility) { + return state + } + return { + ...state, + visibility: { ...state.visibility, activity: {} }, + } +} diff --git a/packages/uniswap/src/test/fixtures/testIDs.ts b/packages/uniswap/src/test/fixtures/testIDs.ts index dc0ef02f8b1..40d3b7ff8c4 100644 --- a/packages/uniswap/src/test/fixtures/testIDs.ts +++ b/packages/uniswap/src/test/fixtures/testIDs.ts @@ -116,6 +116,9 @@ export const TestID = { PDPLinksLoadingSkeleton: 'pdp-links-loading-skeleton', PoolDetailsAddLiquidityButton: 'pool-details-add-liquidity-button', PoolDetailsSwapButton: 'pool-details-swap-button', + PortfolioActionTileBuy: 'portfolio-action-tile-buy', + PortfolioActionTileMore: 'portfolio-action-tile-more', + PortfolioActionTileSwap: 'portfolio-action-tile-swap', PortfolioBalance: 'portfolio-balance', PortfolioRelativeChange: 'portfolio-relative-change', PriceCell: 'price-cell', diff --git a/packages/utilities/babel.config.js b/packages/utilities/babel.config.js deleted file mode 100644 index bb6340cc175..00000000000 --- a/packages/utilities/babel.config.js +++ /dev/null @@ -1,54 +0,0 @@ -/** - * FIXME(INFRA-1034):Babel config is copied over from packages/uniswap/babel.config.js to get jest-expo working in `utilities` - * (Our es-jest is currently incorrectly configured to handle ESM imports while our jest-expo config is vitest - */ - -const { NODE_ENV } = process.env - -const inProduction = NODE_ENV === 'production' -const inTest = NODE_ENV === 'test' - -module.exports = function (api) { - api.cache.using(() => process.env.NODE_ENV) - - let plugins = inProduction ? ['transform-remove-console'] : [] - if (!inTest) { - plugins.push('transform-inline-environment-variables') - } - - plugins = [ - ...plugins, - [ - 'module:react-native-dotenv', - { - // ideally use envName here to add a mobile namespace but this doesn't work when sharing with dotenv-webpack - moduleName: 'react-native-dotenv', - path: '../../.env.defaults', // must use this path so this file can be shared with web since dotenv-webpack is less flexible - safe: true, - allowUndefined: false, - }, - ], - - // TypeScript compiles this, but in production builds, metro doesn't use tsc - '@babel/plugin-proposal-logical-assignment-operators', - // metro doesn't like these - '@babel/plugin-proposal-numeric-separator', - // https://github.com/software-mansion/react-native-reanimated/issues/3364#issuecomment-1268591867 - '@babel/plugin-proposal-export-namespace-from', - // 'react-native-reanimated/plugin' must be listed last - // https://arc.net/l/quote/plrvpkad - [ - 'react-native-reanimated/plugin', - { - globals: ['__scanCodes', '__scanOCR'], - }, - ], - ] - - return { - presets: ['module:@react-native/babel-preset'], - plugins, - } -} diff --git a/apps/web/src/hooks/useInfiniteScroll.test.tsx b/packages/utilities/src/react/useInfiniteScroll.test.tsx similarity index 76% rename from apps/web/src/hooks/useInfiniteScroll.test.tsx rename to packages/utilities/src/react/useInfiniteScroll.test.tsx index 6c8cbf75134..614b3f84ab4 100644 --- a/apps/web/src/hooks/useInfiniteScroll.test.tsx +++ b/packages/utilities/src/react/useInfiniteScroll.test.tsx @@ -1,7 +1,13 @@ -import { useInfiniteScroll } from 'hooks/useInfiniteScroll' +import { act, render, renderHook } from '@testing-library/react' import { useEffect } from 'react' -import { act, render, renderHook } from 'test-utils/render' -import { Flex } from 'ui/src' +import { useInfiniteScroll } from 'utilities/src/react/useInfiniteScroll' +import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest' + +vi.mock('utilities/src/logger/logger', () => ({ + logger: { + warn: vi.fn(), + }, +})) // Mock IntersectionObserver const mockObserve = vi.fn() @@ -11,7 +17,7 @@ let intersectionCallback: (entries: IntersectionObserverEntry[]) => void beforeAll(() => { // Mock IntersectionObserver globally - Object.defineProperty(window, 'IntersectionObserver', { + Object.defineProperty(globalThis, 'IntersectionObserver', { writable: true, configurable: true, value: vi.fn((callback) => { @@ -36,7 +42,7 @@ function TestComponent({ onLoadMore: () => void hasNextPage: boolean isFetching: boolean -}) { +}): JSX.Element { const { sentinelRef } = useInfiniteScroll({ onLoadMore, hasNextPage, isFetching }) useEffect(() => { @@ -49,7 +55,7 @@ function TestComponent({ } }, [sentinelRef]) - return + return

} data-testid="sentinel" /> } function TestComponentWithReset({ @@ -60,9 +66,9 @@ function TestComponentWithReset({ onLoadMore: () => void hasNextPage: boolean isFetching: boolean -}) { +}): JSX.Element { const { sentinelRef } = useInfiniteScroll({ onLoadMore, hasNextPage, isFetching }) - return + return
} data-testid="sentinel" /> } describe('useInfiniteScroll', () => { @@ -76,7 +82,7 @@ describe('useInfiniteScroll', () => { it('should call onLoadMore when sentinel intersects and conditions are met', async () => { const onLoadMore = vi.fn() - render() + render() await act(async () => { intersectionCallback([{ isIntersecting: true } as IntersectionObserverEntry]) @@ -87,7 +93,7 @@ describe('useInfiniteScroll', () => { it('should not call onLoadMore when hasNextPage is false', async () => { const onLoadMore = vi.fn() - render() + render() await act(async () => { intersectionCallback([{ isIntersecting: true } as IntersectionObserverEntry]) @@ -98,7 +104,7 @@ describe('useInfiniteScroll', () => { it('should not call onLoadMore when isFetching is true', async () => { const onLoadMore = vi.fn() - render() + render() await act(async () => { intersectionCallback([{ isIntersecting: true } as IntersectionObserverEntry]) @@ -112,7 +118,7 @@ describe('useInfiniteScroll', () => { const onLoadMore2 = vi.fn() const { rerender } = render( - , + , ) // First intersection @@ -122,7 +128,7 @@ describe('useInfiniteScroll', () => { expect(onLoadMore1).toHaveBeenCalledTimes(1) // Change onLoadMore to trigger reset - rerender() + rerender() // Should trigger again with new function await act(async () => { diff --git a/apps/web/src/hooks/useInfiniteScroll.ts b/packages/utilities/src/react/useInfiniteScroll.ts similarity index 74% rename from apps/web/src/hooks/useInfiniteScroll.ts rename to packages/utilities/src/react/useInfiniteScroll.ts index 5dd49a7cbf5..0dbea265932 100644 --- a/apps/web/src/hooks/useInfiniteScroll.ts +++ b/packages/utilities/src/react/useInfiniteScroll.ts @@ -12,7 +12,7 @@ export function useInfiniteScroll({ hasNextPage: boolean isFetching: boolean threshold?: number -}) { +}): { sentinelRef: React.MutableRefObject } { const sentinelRef = useRef(null) const [isLoading, setIsLoading] = useState(false) @@ -26,7 +26,7 @@ export function useInfiniteScroll({ try { await onLoadMore() } catch (error) { - logger.warn('useInfiniteScroll', 'Failed to load more items', error) + logger.warn('useInfiniteScroll', 'Failed to load more items', error as string) } finally { setIsLoading(false) } @@ -35,21 +35,23 @@ export function useInfiniteScroll({ useEffect(() => { const element = sentinelRef.current if (!element) { - return () => {} + return (): void => {} } const observer = new IntersectionObserver( (entries) => { const [entry] = entries - if (entry.isIntersecting && hasNextPage && !isFetching && !isLoading) { - stableOnLoadMore() + if (entry && entry.isIntersecting && hasNextPage && !isFetching && !isLoading) { + stableOnLoadMore().catch((error) => { + logger.warn('useInfiniteScroll', 'Failed to handle intersection', error as string) + }) } }, { threshold }, ) observer.observe(element) - return () => observer.disconnect() + return (): void => observer.disconnect() }, [hasNextPage, isFetching, stableOnLoadMore, threshold, isLoading]) return { sentinelRef } diff --git a/packages/utilities/src/reactQuery/cache.ts b/packages/utilities/src/reactQuery/cache.ts index 6513d9686db..f3132d58f7b 100644 --- a/packages/utilities/src/reactQuery/cache.ts +++ b/packages/utilities/src/reactQuery/cache.ts @@ -4,6 +4,7 @@ */ export enum ReactQueryCacheKey { ActivityScreenRefresh = 'ActivityScreenRefresh', + AuctionApi = 'AuctionApi', BalanceAndUnitags = 'BalanceAndUnitags', CameraPermission = 'CameraPermission', CancelTransactionRequest = 'CancelTransactionRequest', @@ -22,6 +23,7 @@ export enum ReactQueryCacheKey { LocalActivities = 'localActivities', MismatchAccountBulk = 'MismatchAccountBulk', MnemonicUnlocked = 'MnemonicUnlocked', + Notifications = 'Notifications', OnboardingRedirect = 'OnboardingRedirect', OnchainBalances = 'OnchainBalances', OnchainENS = 'OnchainENS', @@ -32,6 +34,7 @@ export enum ReactQueryCacheKey { PositionTokenURI = 'PositionTokenURI', PrepareSwapTransaction = 'PrepareSwapTransaction', RemoteSvg = 'RemoteSvg', + Session = 'Session', SharedUniswapXActivities = 'SharedUniswapXActivities', SignatureToActivity = 'SignatureToActivity', SolanaConnection = 'SolanaConnection', diff --git a/packages/wallet/package.json b/packages/wallet/package.json index bb6f34a492b..3499a2432ba 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -19,7 +19,6 @@ "@bufbuild/protobuf": "1.10.0", "@ethersproject/abstract-signer": "5.7.0", "@ethersproject/bignumber": "5.7.0", - "@ethersproject/constants": "5.7.0", "@ethersproject/contracts": "5.7.0", "@ethersproject/providers": "5.7.2", "@gorhom/bottom-sheet": "4.6.4", @@ -33,7 +32,6 @@ "@uniswap/permit2-sdk": "1.3.0", "@uniswap/router-sdk": "2.0.2", "@uniswap/sdk-core": "7.7.2", - "@uniswap/universal-router-sdk": "4.19.5", "@universe/api": "workspace:^", "@universe/gating": "workspace:^", "apollo3-cache-persist": "0.14.1", diff --git a/packages/wallet/src/components/WalletPreviewCard/__snapshots__/WalletPreviewCard.test.tsx.snap b/packages/wallet/src/components/WalletPreviewCard/__snapshots__/WalletPreviewCard.test.tsx.snap index 34c2281694c..f0bd9ede877 100644 --- a/packages/wallet/src/components/WalletPreviewCard/__snapshots__/WalletPreviewCard.test.tsx.snap +++ b/packages/wallet/src/components/WalletPreviewCard/__snapshots__/WalletPreviewCard.test.tsx.snap @@ -69,6 +69,12 @@ exports[`renders wallet preview card 1`] = ` { "alignContent": "center", "alignItems": "center", + "color": { + "dynamic": { + "dark": "#FFFFFF", + "light": "#222222", + }, + }, "flex": 1, "flexDirection": "row", "justifyContent": "space-between", @@ -248,7 +254,7 @@ exports[`renders wallet preview card 1`] = ` }, }, "flexShrink": 1, - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel, -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif", "fontSize": 18, "fontWeight": "400", "lineHeight": 23.400000000000002, @@ -298,7 +304,7 @@ exports[`renders wallet preview card 1`] = ` "light": "rgba(19, 19, 19, 0.63)", }, }, - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel, -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif", "fontSize": 16, "fontWeight": "400", "lineHeight": 20.8, diff --git a/packages/wallet/src/components/accounts/__snapshots__/AccountDetails.test.tsx.snap b/packages/wallet/src/components/accounts/__snapshots__/AccountDetails.test.tsx.snap index 78547002179..22bc3b900bc 100644 --- a/packages/wallet/src/components/accounts/__snapshots__/AccountDetails.test.tsx.snap +++ b/packages/wallet/src/components/accounts/__snapshots__/AccountDetails.test.tsx.snap @@ -181,7 +181,7 @@ exports[`AccountDetails renders without error 1`] = ` }, }, "flexShrink": 1, - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel, -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif", "fontSize": 14, "fontWeight": "400", "lineHeight": 18.2, @@ -218,7 +218,7 @@ exports[`AccountDetails renders without error 1`] = ` "light": "rgba(19, 19, 19, 0.63)", }, }, - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel, -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif", "fontSize": 14, "fontWeight": "400", "lineHeight": 18.2, @@ -421,7 +421,7 @@ exports[`AccountDetails renders without error with chevron 1`] = ` }, }, "flexShrink": 1, - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel, -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif", "fontSize": 14, "fontWeight": "400", "lineHeight": 18.2, @@ -458,7 +458,7 @@ exports[`AccountDetails renders without error with chevron 1`] = ` "light": "rgba(19, 19, 19, 0.63)", }, }, - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel, -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif", "fontSize": 14, "fontWeight": "400", "lineHeight": 18.2, diff --git a/packages/wallet/src/components/buttons/__snapshots__/LinkButton.test.tsx.snap b/packages/wallet/src/components/buttons/__snapshots__/LinkButton.test.tsx.snap index 6f1eb1030be..aa1989eeef7 100644 --- a/packages/wallet/src/components/buttons/__snapshots__/LinkButton.test.tsx.snap +++ b/packages/wallet/src/components/buttons/__snapshots__/LinkButton.test.tsx.snap @@ -47,6 +47,12 @@ exports[`LinkButton renders without error 1`] = ` style={ { "alignItems": "center", + "color": { + "dynamic": { + "dark": "#FFFFFF", + "light": "#222222", + }, + }, "flexDirection": "row", "gap": 4, "justifyContent": "center", @@ -66,7 +72,7 @@ exports[`LinkButton renders without error 1`] = ` }, }, "flexShrink": 1, - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel, -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif", } } suppressHighlighting={true} diff --git a/packages/wallet/src/components/settings/portfolioBalance/PortfolioBalanceModal.tsx b/packages/wallet/src/components/settings/portfolioBalance/PortfolioBalanceModal.tsx index 3721bae82d2..41756f62b9c 100644 --- a/packages/wallet/src/components/settings/portfolioBalance/PortfolioBalanceModal.tsx +++ b/packages/wallet/src/components/settings/portfolioBalance/PortfolioBalanceModal.tsx @@ -1,11 +1,16 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' import { Flex, Switch, Text, TouchableArea } from 'ui/src' import { Modal } from 'uniswap/src/components/modals/Modal' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' -import { useHideSmallBalancesSetting, useHideSpamTokensSetting } from 'uniswap/src/features/settings/hooks' -import { setHideSmallBalances, setHideSpamTokens } from 'uniswap/src/features/settings/slice' +import { + useHideReportedActivitySetting, + useHideSmallBalancesSetting, + useHideSpamTokensSetting, +} from 'uniswap/src/features/settings/hooks' +import { setHideReportedActivity, setHideSmallBalances, setHideSpamTokens } from 'uniswap/src/features/settings/slice' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { isExtensionApp } from 'utilities/src/platform' @@ -22,24 +27,32 @@ export type PortfolioBalanceModalState = Omit { setTimeout(() => { dispatch(setHideSmallBalances(!hideSmallBalances)) }, AVOID_RENDER_DURING_ANIMATION_MS) }, [dispatch, hideSmallBalances]) + const hideSpamTokens = useHideSpamTokensSetting() const onToggleHideSpamTokens = useCallback(() => { setTimeout(() => { dispatch(setHideSpamTokens(!hideSpamTokens)) }, AVOID_RENDER_DURING_ANIMATION_MS) }, [dispatch, hideSpamTokens]) + const isDataReportingAbilitiesEnabled = useFeatureFlag(FeatureFlags.DataReportingAbilities) + const hideReportedActivity = useHideReportedActivitySetting() + const onToggleHideReportedActivity = useCallback(() => { + setTimeout(() => { + dispatch(setHideReportedActivity(!hideReportedActivity)) + }, AVOID_RENDER_DURING_ANIMATION_MS) + }, [dispatch, hideReportedActivity]) + return ( - {t('settings.setting.smallBalances.title')} + {t('settings.setting.balancesActivity.title')} @@ -69,6 +82,14 @@ export function PortfolioBalanceModal({ isOpen, onClose }: PortfolioBalanceModal title={t('settings.setting.unknownTokens.title')} onCheckedChange={onToggleHideSpamTokens} /> + {isDataReportingAbilitiesEnabled && ( + + )} diff --git a/packages/wallet/src/data/apollo/usePersistedApolloClient.tsx b/packages/wallet/src/data/apollo/usePersistedApolloClient.tsx index 5f293a4d902..89edbc9195b 100644 --- a/packages/wallet/src/data/apollo/usePersistedApolloClient.tsx +++ b/packages/wallet/src/data/apollo/usePersistedApolloClient.tsx @@ -19,7 +19,6 @@ import { logger } from 'utilities/src/logger/logger' import { isMobileApp } from 'utilities/src/platform' import { useEvent } from 'utilities/src/react/hooks' import { initAndPersistCache } from 'wallet/src/data/apollo/cache' -import { getOnRampAuthLink } from 'wallet/src/data/onRampAuthLink' import { useWalletSigners } from 'wallet/src/features/wallet/context' import { useAccounts } from 'wallet/src/features/wallet/hooks' @@ -130,7 +129,7 @@ function makeApolloClientInit(ctx: { accounts: ReturnType signerManager: ReturnType }): () => Promise> { - const { storageWrapper, maxCacheSizeInBytes, customEndpoint, reduxStore, accounts, signerManager } = ctx + const { storageWrapper, maxCacheSizeInBytes, customEndpoint, reduxStore } = ctx const apolloLink = customEndpoint ? getCustomGraphqlHttpLink(customEndpoint) : getGraphqlHttpLink() const init = async (): Promise> => { @@ -151,7 +150,6 @@ function makeApolloClientInit(ctx: { // requires typing outside of wallet package // biome-ignore lint/suspicious/noExplicitAny: PerformanceLink args come from Apollo and require typing outside wallet package getPerformanceLink((args: any) => sendAnalyticsEvent(WalletEventName.PerformanceGraphql, args)), - getOnRampAuthLink(accounts, signerManager), getInstantTokenBalanceUpdateApolloLink({ reduxStore }), restLink, ] diff --git a/packages/wallet/src/data/onRampAuthLink.ts b/packages/wallet/src/data/onRampAuthLink.ts deleted file mode 100644 index c9119eaaf4a..00000000000 --- a/packages/wallet/src/data/onRampAuthLink.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { ApolloLink } from '@apollo/client' -import { setContext } from '@apollo/client/link/context' -import { GQLQueries } from '@universe/api' -import { AccountType } from 'uniswap/src/features/accounts/types' -import { logger } from 'utilities/src/logger/logger' -import { createOnRampTransactionsAuth, ON_RAMP_AUTH_MAX_LIMIT } from 'wallet/src/data/utils' -import { Account } from 'wallet/src/features/wallet/accounts/types' -import { SignerManager } from 'wallet/src/features/wallet/signing/SignerManager' - -export function getOnRampAuthLink(accounts: Record, signerManager: SignerManager): ApolloLink { - return setContext(async (operation, prevContext) => { - const account = accounts[operation.variables?.address] - - if (account?.type !== AccountType.SignerMnemonic || operation.operationName !== GQLQueries.TransactionList) { - return prevContext - } - - try { - const onRampAuth = await createOnRampTransactionsAuth({ - limit: ON_RAMP_AUTH_MAX_LIMIT, - account, - signerManager, - }) - - return { - ...prevContext, - onRampAuth, - } - } catch (error) { - logger.error(error, { - tags: { - file: 'onRampAuthLink.ts', - function: 'getOnRampAuthLink', - }, - extra: { - address: account.address, - }, - }) - - return prevContext - } - }).concat((operation, forward) => { - if (operation.getContext().onRampAuth) { - operation.variables = { - ...operation.variables, - onRampAuth: operation.getContext().onRampAuth, - } - } - return forward(operation) - }) -} diff --git a/packages/wallet/src/features/behaviorHistory/selectors.ts b/packages/wallet/src/features/behaviorHistory/selectors.ts index a36138f8760..e5d92138ec2 100644 --- a/packages/wallet/src/features/behaviorHistory/selectors.ts +++ b/packages/wallet/src/features/behaviorHistory/selectors.ts @@ -15,6 +15,9 @@ export const selectHasUsedExplore = (state: WalletState): boolean => state.behav export const selectHasViewedBridgedAssetsCard = (state: WalletState): boolean => state.behaviorHistory.hasViewedBridgedAssetsCard ?? false +export const selectHasViewedBridgedAssetsV2Card = (state: WalletState): boolean => + state.behaviorHistory.hasViewedBridgedAssetsV2Card ?? false + export const selectHasViewedOffRampTooltip = (state: WalletState): boolean => state.behaviorHistory.hasViewedOffRampTooltip diff --git a/packages/wallet/src/features/behaviorHistory/slice.ts b/packages/wallet/src/features/behaviorHistory/slice.ts index 9d65f39c49a..4f0b025b6d0 100644 --- a/packages/wallet/src/features/behaviorHistory/slice.ts +++ b/packages/wallet/src/features/behaviorHistory/slice.ts @@ -13,6 +13,7 @@ export interface BehaviorHistoryState { backupReminderLastSeenTs?: number hasViewedOffRampTooltip: boolean hasViewedBridgedAssetsCard?: boolean + hasViewedBridgedAssetsV2Card?: boolean hasDismissedBridgingWarning?: boolean hasViewedDappRequestBridgingBanner?: { [dappUrl: string]: boolean @@ -77,6 +78,9 @@ const slice = createSlice({ setHasViewedBridgedAssetsCard: (state, action: PayloadAction) => { state.hasViewedBridgedAssetsCard = action.payload }, + setHasViewedBridgedAssetsV2Card: (state, action: PayloadAction) => { + state.hasViewedBridgedAssetsV2Card = action.payload + }, setHasViewedOffRampTooltip: (state, action: PayloadAction) => { state.hasViewedOffRampTooltip = action.payload }, @@ -170,6 +174,7 @@ export const { resetWalletBehaviorHistory, setHasViewedNotificationsCard, setHasViewedBridgedAssetsCard, + setHasViewedBridgedAssetsV2Card, setHasDismissedSmartWalletHomeScreenNudge, setHasCopiedPrivateKeys, setHasShown5792Nudge, diff --git a/packages/wallet/src/features/notifications/components/__snapshots__/NotSupportedNetworkNotification.test.tsx.snap b/packages/wallet/src/features/notifications/components/__snapshots__/NotSupportedNetworkNotification.test.tsx.snap index 763eb0bb172..bef70b88f97 100644 --- a/packages/wallet/src/features/notifications/components/__snapshots__/NotSupportedNetworkNotification.test.tsx.snap +++ b/packages/wallet/src/features/notifications/components/__snapshots__/NotSupportedNetworkNotification.test.tsx.snap @@ -145,6 +145,12 @@ exports[`NotSupportedNetworkNotification renders without error 1`] = ` style={ { "alignItems": "center", + "color": { + "dynamic": { + "dark": "#FFFFFF", + "light": "#222222", + }, + }, "flexDirection": "row", "gap": 8, "justifyContent": "flex-start", @@ -238,7 +244,7 @@ exports[`NotSupportedNetworkNotification renders without error 1`] = ` "light": "#131313", }, }, - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel, -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif", "fontSize": 16, "fontWeight": "400", "lineHeight": 20.8, diff --git a/packages/wallet/src/features/transactions/executeTransaction/services/TransactionService/transactionServiceImpl.test.ts b/packages/wallet/src/features/transactions/executeTransaction/services/TransactionService/transactionServiceImpl.test.ts index 151d84736a0..b91d3316bd9 100644 --- a/packages/wallet/src/features/transactions/executeTransaction/services/TransactionService/transactionServiceImpl.test.ts +++ b/packages/wallet/src/features/transactions/executeTransaction/services/TransactionService/transactionServiceImpl.test.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-lines */ import { BaseProvider, JsonRpcProvider, Provider, TransactionReceipt } from '@ethersproject/providers' import { BigNumber, utils } from 'ethers' import { AssetType } from 'uniswap/src/entities/assets' @@ -57,7 +56,6 @@ describe('TransactionService', () => { signTypedData: jest.fn(), sendTransaction: jest.fn(), sendTransactionSync: jest.fn(), - signAndSendTransaction: jest.fn(), } // Create a proper mock for AnalyticsService without relying on jest.Mocked diff --git a/packages/wallet/src/features/transactions/executeTransaction/services/TransactionSignerService/transactionSignerService.ts b/packages/wallet/src/features/transactions/executeTransaction/services/TransactionSignerService/transactionSignerService.ts index ca8ebf27c95..adbaa65f01f 100644 --- a/packages/wallet/src/features/transactions/executeTransaction/services/TransactionSignerService/transactionSignerService.ts +++ b/packages/wallet/src/features/transactions/executeTransaction/services/TransactionSignerService/transactionSignerService.ts @@ -22,13 +22,6 @@ export type TransactionSignerInput = { * Abstracts the transaction signing process */ export interface TransactionSigner { - /** - * Sign and send a transaction - * @param input The transaction request - * @returns The response, populated request, and timestamp - */ - signAndSendTransaction(input: TransactionSignerInput): Promise - /** * Prepare a transaction * @param input The transaction request diff --git a/packages/wallet/src/features/transactions/executeTransaction/services/TransactionSignerService/transactionSignerServiceImpl.test.ts b/packages/wallet/src/features/transactions/executeTransaction/services/TransactionSignerService/transactionSignerServiceImpl.test.ts index 18e1cca8a5a..c6a35a6eaf3 100644 --- a/packages/wallet/src/features/transactions/executeTransaction/services/TransactionSignerService/transactionSignerServiceImpl.test.ts +++ b/packages/wallet/src/features/transactions/executeTransaction/services/TransactionSignerService/transactionSignerServiceImpl.test.ts @@ -182,79 +182,6 @@ describe('TransactionSignerService', () => { }) }) - describe('signAndSendTransaction', () => { - it('should prepare, sign and send a transaction', async () => { - // Arrange - const service = createTestService() - const request = { - to: '0xabcdef1234567890123456789012345678901234', - value: '0x1234', // Wei amount - data: '0x123abc', // Call data - } as providers.TransactionRequest - - const populatedRequest = { - ...request, - gasLimit: '0x5000', - chainId: 1, - nonce: 42, - } as providers.TransactionRequest - - const signedTx = - '0x02f86c0105849502f90082500094abcd80823039a08cb1593ca382884e2d2248a81942c93afa94e7190146dbdf7aa93ced3c6ba4ea11fa01bb62ef729131b4f3fab2977c9b9e83cd4b3781fab393db1a1dec3fbad97982' - - const txHash = '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890' - - // Mock the individual steps - mockPopulateTransaction.mockResolvedValue(populatedRequest) - mockSignTransaction.mockResolvedValue(signedTx) - mockSendTransaction.mockResolvedValue({ hash: txHash }) - - // Use Date.now mock to make the test deterministic - const mockTimestamp = 1234567890 - jest.spyOn(Date, 'now').mockReturnValue(mockTimestamp) - - // Act - const result = await service.signAndSendTransaction({ request }) - - // Assert - expect(mockPopulateTransaction).toHaveBeenCalledWith(request) - expect(mockSignTransaction).toHaveBeenCalledWith(populatedRequest) - expect(mockSendTransaction).toHaveBeenCalledWith(signedTx) - expect(result).toEqual({ - transactionHash: txHash, - populatedRequest, - timestampBeforeSign: mockTimestamp, - timestampBeforeSend: mockTimestamp, - }) - }) - - it('should handle errors during transaction flow', async () => { - // Arrange - const service = createTestService() - const request = { to: '0xabcd', value: '0x123' } as providers.TransactionRequest - - // Simulate an error at the populate step - const error = new Error('Transaction underpriced') - mockPopulateTransaction.mockRejectedValue(error) - - // Act & Assert - await expect(service.signAndSendTransaction({ request })).rejects.toThrow('Transaction underpriced') - }) - - it('should handle canceled signing by user', async () => { - // Arrange - const service = createTestService() - const request = { to: '0xabcd', value: '0x123' } as providers.TransactionRequest - const populatedRequest = { ...request, gasLimit: '0x5000' } - - mockPopulateTransaction.mockResolvedValue(populatedRequest) - mockSignTransaction.mockRejectedValue(new Error('User denied transaction signature')) - - // Act & Assert - await expect(service.signAndSendTransaction({ request })).rejects.toThrow('User denied transaction signature') - }) - }) - describe('signTypedData', () => { it('should sign typed data successfully', async () => { // Arrange diff --git a/packages/wallet/src/features/transactions/executeTransaction/services/TransactionSignerService/transactionSignerServiceImpl.ts b/packages/wallet/src/features/transactions/executeTransaction/services/TransactionSignerService/transactionSignerServiceImpl.ts index b40738c462a..6c4367e9c38 100644 --- a/packages/wallet/src/features/transactions/executeTransaction/services/TransactionSignerService/transactionSignerServiceImpl.ts +++ b/packages/wallet/src/features/transactions/executeTransaction/services/TransactionSignerService/transactionSignerServiceImpl.ts @@ -68,20 +68,12 @@ export function createTransactionSignerService(ctx: { return jsonRpcProvider.formatter.receipt(rawReceipt) } - const signAndSendTransaction = getSignAndSendTransaction({ - prepareTransaction, - signTransaction, - signTypedData, - sendTransaction, - }) - return { prepareTransaction, signTransaction, signTypedData, sendTransaction, sendTransactionSync, - signAndSendTransaction, } } @@ -188,27 +180,5 @@ export function createBundledDelegationTransactionSignerService(ctx: { signTypedData, sendTransaction, sendTransactionSync, - signAndSendTransaction: getSignAndSendTransaction({ - prepareTransaction: baseTransactionSignerService.prepareTransaction, - signTransaction, - signTypedData, - sendTransaction, - }), - } -} - -function getSignAndSendTransaction(ctx: { - prepareTransaction: TransactionSigner['prepareTransaction'] - signTransaction: TransactionSigner['signTransaction'] - signTypedData: TransactionSigner['signTypedData'] - sendTransaction: TransactionSigner['sendTransaction'] -}): TransactionSigner['signAndSendTransaction'] { - return async (input) => { - const populatedRequest = await ctx.prepareTransaction(input) - const timestampBeforeSign = Date.now() - const signedTx = await ctx.signTransaction(populatedRequest) - const timestampBeforeSend = Date.now() - const transactionHash = await ctx.sendTransaction({ signedTx }) - return { transactionHash, populatedRequest, timestampBeforeSign, timestampBeforeSend } } } diff --git a/packages/wallet/src/features/transactions/rpcUtils.test.ts b/packages/wallet/src/features/transactions/rpcUtils.test.ts index a27e1d7cd45..4283932832c 100644 --- a/packages/wallet/src/features/transactions/rpcUtils.test.ts +++ b/packages/wallet/src/features/transactions/rpcUtils.test.ts @@ -10,6 +10,7 @@ describe('getRPCErrorCategory', () => { expected: 'tx_limit_reached_for_delegated_account', }, { error: rpcUtilsFixtures.timeout, expected: 'timeout' }, + { error: rpcUtilsFixtures.confirmationTimeout, expected: 'confirmation_timeout' }, { error: rpcUtilsFixtures.noNetwork, expected: 'no_network' }, { error: rpcUtilsFixtures.rateLimited1, expected: 'rate_limited' }, { error: rpcUtilsFixtures.rateLimited2, expected: 'rate_limited' }, diff --git a/packages/wallet/src/features/transactions/swap/WalletSwapFlow.tsx b/packages/wallet/src/features/transactions/swap/WalletSwapFlow.tsx index dc82c72899f..359e24f16b5 100644 --- a/packages/wallet/src/features/transactions/swap/WalletSwapFlow.tsx +++ b/packages/wallet/src/features/transactions/swap/WalletSwapFlow.tsx @@ -4,20 +4,16 @@ import { TradeRoutingPreference } from 'uniswap/src/features/transactions/swap/c import { SwapFlow, type SwapFlowProps } from 'uniswap/src/features/transactions/swap/SwapFlow/SwapFlow' import { SwapDependenciesStoreContextProvider } from 'uniswap/src/features/transactions/swap/stores/swapDependenciesStore/SwapDependenciesStoreContextProvider' import { SwapFormStoreContextProvider } from 'uniswap/src/features/transactions/swap/stores/swapFormStore/SwapFormStoreContextProvider' -import { useSwapCallback } from 'wallet/src/features/transactions/swap/hooks/useSwapCallback' import { useSwapHandlers } from 'wallet/src/features/transactions/swap/hooks/useSwapHandlers' -import { useWrapCallback } from 'wallet/src/features/transactions/swap/hooks/useWrapCallback' import { SwapProtection } from 'wallet/src/features/transactions/swap/settings/SwapProtection' -type WalletSwapFlowProps = Omit & { +type WalletSwapFlowProps = Omit & { onSubmitSwap?: () => Promise } const SETTINGS: SwapFlowProps['settings'] = [Slippage, SwapProtection, TradeRoutingPreference] export function WalletSwapFlow(props: WalletSwapFlowProps): JSX.Element { - const swapCallback = useSwapCallback() - const wrapCallback = useWrapCallback() const swapHandlers = useSwapHandlers() return ( @@ -27,11 +23,7 @@ export function WalletSwapFlow(props: WalletSwapFlowProps): JSX.Element { hideSettings={props.hideHeader} hideFooter={props.hideFooter} > - + diff --git a/packages/wallet/src/features/transactions/swap/executeSwapSaga.test.ts b/packages/wallet/src/features/transactions/swap/executeSwapSaga.test.ts index b094eb2cd8d..62078592d71 100644 --- a/packages/wallet/src/features/transactions/swap/executeSwapSaga.test.ts +++ b/packages/wallet/src/features/transactions/swap/executeSwapSaga.test.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-lines */ import { call } from '@redux-saga/core/effects' import { TradingApi } from '@universe/api' import { expectSaga } from 'redux-saga-test-plan' diff --git a/packages/wallet/src/features/transactions/swap/hooks/useSwapCallback.ts b/packages/wallet/src/features/transactions/swap/hooks/useSwapCallback.ts deleted file mode 100644 index b806b1233ce..00000000000 --- a/packages/wallet/src/features/transactions/swap/hooks/useSwapCallback.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { TradingApi } from '@universe/api' -import { useCallback } from 'react' -import { useDispatch, useSelector } from 'react-redux' -import { AccountMeta } from 'uniswap/src/features/accounts/types' -import { usePortfolioTotalValue } from 'uniswap/src/features/dataApi/balances/balancesRest' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' -import { SwapEventName } from 'uniswap/src/features/telemetry/constants' -import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' -import { selectSwapStartTimestamp } from 'uniswap/src/features/timing/selectors' -import { updateSwapStartTimestamp } from 'uniswap/src/features/timing/slice' -import { getBaseTradeAnalyticsProperties } from 'uniswap/src/features/transactions/swap/analytics' -import { SwapCallback, SwapCallbackParams } from 'uniswap/src/features/transactions/swap/types/swapCallback' -import { isClassic } from 'uniswap/src/features/transactions/swap/utils/routing' -import { getClassicQuoteFromResponse } from 'uniswap/src/features/transactions/swap/utils/tradingApi' -import { useWallet } from 'uniswap/src/features/wallet/hooks/useWallet' -import { toStringish } from 'uniswap/src/utils/number' -import { useTrace } from 'utilities/src/telemetry/trace/TraceContext' -import { swapActions } from 'wallet/src/features/transactions/swap/swapSaga' - -/** Callback to submit trades and track progress */ -export function useSwapCallback(): SwapCallback { - const appDispatch = useDispatch() - const formatter = useLocalizationContext() - const swapStartTimestamp = useSelector(selectSwapStartTimestamp) - const trace = useTrace() - - const account = useWallet().evmAccount - - const { data: portfolioData } = usePortfolioTotalValue({ - evmAddress: account?.address, - fetchPolicy: 'cache-first', - }) - - return useCallback( - (args: SwapCallbackParams) => { - const { - account: accountDetails, - swapTxContext, - txId, - onSuccess, - onFailure, - onPending, - currencyInAmountUSD, - currencyOutAmountUSD, - presetPercentage, - preselectAsset, - isAutoSlippage, - isFiatInputMode, - isSmartWalletTransaction, - includesDelegation, - } = args - const { trade, gasFee } = swapTxContext - - // unsigned (missing permit signature) swaps are only supported on interface; this is an unreachable state and the following check is included for type safety. - if (swapTxContext.routing === TradingApi.Routing.CLASSIC && swapTxContext.unsigned) { - throw new Error('Swaps with async signatures are not implemented for wallet') - } - - const analytics = getBaseTradeAnalyticsProperties({ - formatter, - trade, - currencyInAmountUSD, - currencyOutAmountUSD, - presetPercentage, - preselectAsset, - portfolioBalanceUsd: portfolioData?.balanceUSD, - trace, - includesDelegation, - isSmartWalletTransaction, - }) - const swapFlowDuration = swapStartTimestamp ? Date.now() - swapStartTimestamp : undefined - const accountMeta: AccountMeta = { ...accountDetails, type: accountDetails.accountType } - - appDispatch( - swapActions.trigger({ - swapTxContext, - txId, - account: accountMeta, - analytics, - onSuccess, - onFailure, - onPending, - }), - ) - - const blockNumber = getClassicQuoteFromResponse(trade.quote)?.blockNumber?.toString() - - sendAnalyticsEvent(SwapEventName.SwapSubmittedButtonClicked, { - ...analytics, - estimated_network_fee_wei: gasFee.value, - gas_limit: isClassic(swapTxContext) ? toStringish(swapTxContext.txRequests[0].gasLimit) : undefined, - transaction_deadline_seconds: trade.deadline, - swap_quote_block_number: blockNumber, - is_auto_slippage: isAutoSlippage, - swap_flow_duration_milliseconds: swapFlowDuration, - is_fiat_input_mode: isFiatInputMode, - }) - - // Reset swap start timestamp now that the swap has been submitted - appDispatch(updateSwapStartTimestamp({ timestamp: undefined })) - }, - [appDispatch, formatter, portfolioData?.balanceUSD, swapStartTimestamp, trace], - ) -} diff --git a/packages/wallet/src/features/transactions/swap/hooks/useSwapHandlers.ts b/packages/wallet/src/features/transactions/swap/hooks/useSwapHandlers.ts index ab5987f0921..d783696ed34 100644 --- a/packages/wallet/src/features/transactions/swap/hooks/useSwapHandlers.ts +++ b/packages/wallet/src/features/transactions/swap/hooks/useSwapHandlers.ts @@ -1,4 +1,3 @@ -import { FeatureFlags, getFeatureFlag } from '@universe/gating' import { useCallback, useMemo } from 'react' import { useDispatch, useSelector } from 'react-redux' import { AccountMeta } from 'uniswap/src/features/accounts/types' @@ -25,7 +24,7 @@ import { useSwapSigning } from 'wallet/src/features/transactions/swap/hooks/useS /** * Custom hook that provides SwapHandlers with improved caching for prepared transactions */ -export function useSwapHandlers(): SwapHandlers | undefined { +export function useSwapHandlers(): SwapHandlers { const dispatch = useDispatch() const formatter = useLocalizationContext() const swapStartTimestamp = useSelector(selectSwapStartTimestamp) @@ -118,13 +117,10 @@ export function useSwapHandlers(): SwapHandlers | undefined { ) return useMemo( - () => - getFeatureFlag(FeatureFlags.SwapPreSign) - ? { - prepareAndSign: signing.prepareAndSign, - execute, - } - : undefined, + () => ({ + prepareAndSign: signing.prepareAndSign, + execute, + }), [execute, signing.prepareAndSign], ) } diff --git a/packages/wallet/src/features/transactions/swap/hooks/useWrapCallback.ts b/packages/wallet/src/features/transactions/swap/hooks/useWrapCallback.ts deleted file mode 100644 index ede5b2be82d..00000000000 --- a/packages/wallet/src/features/transactions/swap/hooks/useWrapCallback.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { useCallback } from 'react' -import { useDispatch } from 'react-redux' -import { WrapCallback, WrapCallbackParams } from 'uniswap/src/features/transactions/swap/types/wrapCallback' -import { tokenWrapActions } from 'wallet/src/features/transactions/swap/wrapSaga' -import { useActiveSignerAccount } from 'wallet/src/features/wallet/hooks' - -export function useWrapCallback(): WrapCallback { - const appDispatch = useDispatch() - const account = useActiveSignerAccount() - - return useCallback( - ({ onSuccess, ...params }: WrapCallbackParams) => { - if (!account || account.address !== params.account.address) { - throw new Error('No active signer account or account mismatch') - } - appDispatch(tokenWrapActions.trigger({ ...params, account })) - onSuccess() - }, - [appDispatch, account], - ) -} diff --git a/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.test.ts b/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.test.ts index 8b9eda0d70f..dbb65764d52 100644 --- a/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.test.ts +++ b/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.test.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-lines */ import { call, select } from '@redux-saga/core/effects' import { MaxUint256, TradeType } from '@uniswap/sdk-core' import { TradingApi, type UnwrapQuoteResponse, type WrapQuoteResponse } from '@universe/api' diff --git a/packages/wallet/src/features/transactions/swap/swapSaga.test.ts b/packages/wallet/src/features/transactions/swap/swapSaga.test.ts deleted file mode 100644 index 739e6bce957..00000000000 --- a/packages/wallet/src/features/transactions/swap/swapSaga.test.ts +++ /dev/null @@ -1,385 +0,0 @@ -import { MaxUint256 } from '@ethersproject/constants' -import { call, select } from '@redux-saga/core/effects' -import { permit2Address } from '@uniswap/permit2-sdk' -import { Protocol } from '@uniswap/router-sdk' -import { TradeType } from '@uniswap/sdk-core' -import { UNIVERSAL_ROUTER_ADDRESS, UniversalRouterVersion } from '@uniswap/universal-router-sdk' -import { TradingApi } from '@universe/api' -import JSBI from 'jsbi' -import { expectSaga, testSaga } from 'redux-saga-test-plan' -import { EffectProviders, StaticProvider } from 'redux-saga-test-plan/providers' -import { DAI, nativeOnChain, USDC } from 'uniswap/src/constants/tokens' -import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' -import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' -import { SwapTradeBaseProperties } from 'uniswap/src/features/telemetry/types' -import { ClassicTrade, UniswapXTrade } from 'uniswap/src/features/transactions/swap/types/trade' -import { - ExactInputSwapTransactionInfo, - TransactionOriginType, - TransactionType, - TransactionTypeInfo, -} from 'uniswap/src/features/transactions/types/transactionDetails' -import { WrapType } from 'uniswap/src/features/transactions/types/wrap' -import { mockPermit } from 'uniswap/src/test/fixtures/permit' -import { currencyId } from 'uniswap/src/utils/currencyId' -import { - ExecuteTransactionParams, - executeTransaction, -} from 'wallet/src/features/transactions/executeTransaction/executeTransactionSaga' -import { tryGetNonce } from 'wallet/src/features/transactions/executeTransaction/tryGetNonce' -import { getShouldWaitBetweenTransactions } from 'wallet/src/features/transactions/swap/confirmation' -import { SubmitUniswapXOrderParams, submitUniswapXOrder } from 'wallet/src/features/transactions/swap/submitOrderSaga' -import { - approveAndSwap, - handleTransactionSpacing, - SwapParams, - shouldSubmitViaPrivateRpc, -} from 'wallet/src/features/transactions/swap/swapSaga' -import { getProvider } from 'wallet/src/features/wallet/context' -import { selectWalletSwapProtectionSetting } from 'wallet/src/features/wallet/selectors' -import { SwapProtectionSetting } from 'wallet/src/features/wallet/slice' -import { signerMnemonicAccount } from 'wallet/src/test/fixtures' -import { getTxProvidersMocks } from 'wallet/src/test/mocks' - -jest.mock('@universe/gating', () => ({ - ...jest.requireActual('@universe/gating'), - getStatsigClient: jest.fn(() => ({ - checkGate: jest.fn().mockReturnValue(true), - getLayer: jest.fn(() => ({ - get: jest.fn(() => false), - })), - })), -})) - -const account = signerMnemonicAccount() - -const MOCK_TIMESTAMP = 1487076708000 -const CHAIN_ID = UniverseChainId.Mainnet -const universalRouterAddress = UNIVERSAL_ROUTER_ADDRESS(UniversalRouterVersion.V1_2, CHAIN_ID) - -const { mockProvider } = getTxProvidersMocks() - -const mockTransactionTypeInfo: ExactInputSwapTransactionInfo = { - type: TransactionType.Swap, - tradeType: TradeType.EXACT_INPUT, - inputCurrencyId: currencyId(nativeOnChain(CHAIN_ID)), - outputCurrencyId: '0xabc', - inputCurrencyAmountRaw: '10000', - expectedOutputCurrencyAmountRaw: '200000', - minimumOutputCurrencyAmountRaw: '300000', - protocol: Protocol.V3, -} - -jest.mock('uniswap/src/features/transactions/swap/utils/trade', () => { - return { - tradeToTransactionInfo: (): TransactionTypeInfo => mockTransactionTypeInfo, - } -}) - -// TODO(WEB-4499): Use Trade/Quote fixtures instead of casted objects -const mockTrade = { - routing: TradingApi.Routing.CLASSIC, - inputAmount: { currency: nativeOnChain(CHAIN_ID) }, - outputAmount: { currency: USDC }, - quote: { amount: MaxUint256 }, - slippageTolerance: 0.5, -} as unknown as ClassicTrade - -const mockUniswapXTrade = { - routing: TradingApi.Routing.DUTCH_V2, - inputAmount: { currency: nativeOnChain(CHAIN_ID), quotient: JSBI.BigInt(1000) }, - outputAmount: { currency: USDC }, - quote: { amount: MaxUint256, routing: TradingApi.Routing.DUTCH_V2 }, - slippageTolerance: 0.5, -} as unknown as UniswapXTrade - -const mockRevocationTxRequest = { - chainId: 1, - to: DAI.address, - data: '0x0', -} - -const mockApproveTxRequest = { - chainId: 1, - to: DAI.address, - data: '0x0', - nonce: 1, -} - -const mockSwapTxRequest = { - chainId: 1, - to: universalRouterAddress, - data: '0x0', -} - -const classicSwapParams = { - txId: '1', - account, - analytics: { - transactionOriginType: TransactionOriginType.Internal, - } as SwapTradeBaseProperties, - swapTxContext: { - routing: TradingApi.Routing.CLASSIC, - approveTxRequest: mockApproveTxRequest, - revocationTxRequest: mockRevocationTxRequest, - txRequests: [mockSwapTxRequest], - trade: mockTrade, - gasFee: { value: '5', isLoading: false, error: null }, - gasFeeEstimation: {}, - permit: undefined, - swapRequestArgs: undefined, - unsigned: false, - includesDelegation: false, - }, - onSuccess: jest.fn(), - onPending: jest.fn(), - onFailure: jest.fn(), -} satisfies SwapParams - -const uniswapXSwapParams = { - txId: '1', - account, - analytics: { - transactionOriginType: TransactionOriginType.Internal, - } as SwapTradeBaseProperties, - swapTxContext: { - routing: TradingApi.Routing.DUTCH_V2, - - approveTxRequest: mockApproveTxRequest, - revocationTxRequest: mockRevocationTxRequest, - trade: mockUniswapXTrade, - permit: mockPermit, - gasFee: { value: '5', isLoading: false, error: null }, - gasFeeEstimation: {}, - gasFeeBreakdown: { classicGasUseEstimateUSD: '5', approvalCost: '5' }, - includesDelegation: false, - }, - onSuccess: jest.fn(), - onPending: jest.fn(), - onFailure: jest.fn(), -} satisfies SwapParams - -const nonce = 1 - -const expectedSendApprovalParams: ExecuteTransactionParams = { - chainId: mockApproveTxRequest.chainId, - account, - options: { - request: mockApproveTxRequest, - submitViaPrivateRpc: false, - userSubmissionTimestampMs: MOCK_TIMESTAMP, - }, - typeInfo: { - type: TransactionType.Approve, - tokenAddress: mockApproveTxRequest.to, - spender: permit2Address(mockApproveTxRequest.chainId), - swapTxId: '1', - gasEstimate: undefined, - }, - transactionOriginType: TransactionOriginType.Internal, - analytics: { - transactionOriginType: TransactionOriginType.Internal, - }, -} - -describe(approveAndSwap, () => { - let dateNowSpy: jest.SpyInstance - const sharedProviders: (EffectProviders | StaticProvider)[] = [ - [select(selectWalletSwapProtectionSetting), SwapProtectionSetting.Off], - [ - call(getShouldWaitBetweenTransactions, { - swapper: account.address, - chainId: mockSwapTxRequest.chainId, - privateRpcAvailable: false, - }), - false, - ], - [call(getProvider, mockSwapTxRequest.chainId), mockProvider], - [call(tryGetNonce, classicSwapParams.account, mockSwapTxRequest.chainId), { nonce }], - ] - - beforeAll(() => { - // Lock Time - dateNowSpy = jest.spyOn(Date, 'now').mockImplementation(() => MOCK_TIMESTAMP) - }) - - afterAll(() => { - // Unlock Time - dateNowSpy.mockRestore() - }) - - it('sends a swap tx', async () => { - const classicSwapParamsWithoutApprove = { - ...classicSwapParams, - swapTxContext: { - ...classicSwapParams.swapTxContext, - approveTxRequest: undefined, - revocationTxRequest: undefined, - includesDelegation: false, - }, - } satisfies SwapParams - - const expectedSendSwapParams: ExecuteTransactionParams = { - chainId: classicSwapParamsWithoutApprove.swapTxContext.txRequests[0].chainId, - account: classicSwapParamsWithoutApprove.account, - options: { - request: { ...mockSwapTxRequest, nonce }, - submitViaPrivateRpc: false, - userSubmissionTimestampMs: Date.now(), - isSmartWalletTransaction: false, - includesDelegation: false, - }, - typeInfo: mockTransactionTypeInfo, - analytics: classicSwapParamsWithoutApprove.analytics, - txId: classicSwapParamsWithoutApprove.txId, - transactionOriginType: TransactionOriginType.Internal, - } - - // `expectSaga` tests the entire saga at once w/out manually specifying all effect return values. - // It does not ensure proper ordering; this is tested by testSaga below. - await expectSaga(approveAndSwap, classicSwapParamsWithoutApprove) - .provide([ - ...sharedProviders, - [ - call(executeTransaction, expectedSendSwapParams), - { transactionHash: '0xMockSwapTxHash', populatedRequest: {} }, - ], - ]) - .call(executeTransaction, expectedSendSwapParams) - .silentRun() - - // `testSaga` ensures that the saga yields specific types of effects in a particular order. - // Requires manually providing return values for each effect in `.next()`. - testSaga(approveAndSwap, classicSwapParamsWithoutApprove) - .next() - .call(shouldSubmitViaPrivateRpc, classicSwapParams.swapTxContext.txRequests[0].chainId) - .next(false) - .call(getShouldWaitBetweenTransactions, { - swapper: account.address, - chainId: expectedSendSwapParams.chainId, - privateRpcAvailable: false, - }) - .next(false) - .call(classicSwapParams.onSuccess) - .next() - .call(tryGetNonce, classicSwapParams.account, mockSwapTxRequest.chainId) - .next({ nonce }) - .call(executeTransaction, expectedSendSwapParams) - .next({ transactionHash: '0xMockSwapTxHash', populatedRequest: {} }) - .put(pushNotification({ type: AppNotificationType.SwapPending, wrapType: WrapType.NotApplicable })) - .next() - .isDone() - }) - - it('sends a swap tx with incremented nonce if an approve tx is sent first', async () => { - const expectedSendSwapParams: ExecuteTransactionParams = { - chainId: classicSwapParams.swapTxContext.txRequests[0].chainId, - account: classicSwapParams.account, - options: { - request: { ...mockSwapTxRequest, nonce: nonce + 1 }, - submitViaPrivateRpc: false, - userSubmissionTimestampMs: Date.now(), - includesDelegation: false, - isSmartWalletTransaction: false, - }, - typeInfo: mockTransactionTypeInfo, - analytics: classicSwapParams.analytics, - txId: classicSwapParams.txId, - transactionOriginType: TransactionOriginType.Internal, - } - await expectSaga(approveAndSwap, classicSwapParams) - .provide([ - ...sharedProviders, - [ - call(executeTransaction, expectedSendApprovalParams), - { transactionHash: '0xMockApprovalTxHash', populatedRequest: {} }, - ], - [ - call(executeTransaction, expectedSendSwapParams), - { transactionHash: '0xMockSwapTxHash', populatedRequest: {} }, - ], - ]) - .call(executeTransaction, expectedSendSwapParams) - .silentRun() - testSaga(approveAndSwap, classicSwapParams) - .next() - .call(shouldSubmitViaPrivateRpc, classicSwapParams.swapTxContext.txRequests[0].chainId) - .next(false) - .call(getShouldWaitBetweenTransactions, { - swapper: account.address, - chainId: expectedSendSwapParams.chainId, - privateRpcAvailable: false, - }) - .next(false) - .call(classicSwapParams.onSuccess) - .next() - .call(tryGetNonce, classicSwapParams.account, mockSwapTxRequest.chainId) - .next({ nonce }) - .call(executeTransaction, expectedSendApprovalParams) - .next({ transactionHash: '0xMockApprovalTxHash', populatedRequest: {} }) - .call(handleTransactionSpacing, { - shouldWait: false, - hash: '0xMockApprovalTxHash', - onFailure: classicSwapParams.onFailure, - }) - .next() - .call(executeTransaction, expectedSendSwapParams) - .next({ transactionHash: '0xMockSwapTxHash', populatedRequest: {} }) - .put(pushNotification({ type: AppNotificationType.SwapPending, wrapType: WrapType.NotApplicable })) - .next() - .isDone() - }) - - it('sends a uniswapx order', async () => { - const expectedSubmitOrderParams: SubmitUniswapXOrderParams = { - chainId: uniswapXSwapParams.swapTxContext.trade.inputAmount.currency.chainId, - account: uniswapXSwapParams.account, - typeInfo: mockTransactionTypeInfo, - analytics: uniswapXSwapParams.analytics, - approveTxHash: '0xMockApprovalTxHash', - txId: uniswapXSwapParams.txId, - permit: mockPermit.typedData, - routing: uniswapXSwapParams.swapTxContext.trade.quote.routing, - quote: uniswapXSwapParams.swapTxContext.trade.quote.quote, - onSuccess: uniswapXSwapParams.onSuccess, - onFailure: uniswapXSwapParams.onFailure, - } - - await expectSaga(approveAndSwap, uniswapXSwapParams) - .provide([ - ...sharedProviders, - [ - call(executeTransaction, expectedSendApprovalParams), - { transactionHash: '0xMockApprovalTxHash', populatedRequest: {} }, - ], - [call(submitUniswapXOrder, expectedSubmitOrderParams), undefined], - ]) - .call.fn(submitUniswapXOrder) - .silentRun() - - testSaga(approveAndSwap, uniswapXSwapParams) - .next() - .call(getShouldWaitBetweenTransactions, { - swapper: account.address, - chainId: expectedSubmitOrderParams.chainId, - privateRpcAvailable: false, - }) - .next(false) - .call(uniswapXSwapParams.onPending) - .next() - .call(tryGetNonce, classicSwapParams.account, mockSwapTxRequest.chainId) - .next({ nonce }) - .call(executeTransaction, expectedSendApprovalParams) - .next({ transactionHash: '0xMockApprovalTxHash', populatedRequest: {} }) - .call(handleTransactionSpacing, { - shouldWait: false, - hash: '0xMockApprovalTxHash', - onFailure: uniswapXSwapParams.onFailure, - }) - .next() - .call(submitUniswapXOrder, expectedSubmitOrderParams) - .next() - .isDone() - }) -}) diff --git a/packages/wallet/src/features/transactions/swap/swapSaga.ts b/packages/wallet/src/features/transactions/swap/swapSaga.ts deleted file mode 100644 index 378fad172d7..00000000000 --- a/packages/wallet/src/features/transactions/swap/swapSaga.ts +++ /dev/null @@ -1,283 +0,0 @@ -import { permit2Address } from '@uniswap/permit2-sdk' -import { TradingApi } from '@universe/api' -import { Experiments, FeatureFlags, getFeatureFlagName, getStatsigClient } from '@universe/gating' -import { call, put, select } from 'typed-redux-saga' -import { SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types' -import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' -import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' -import { SwapTradeBaseProperties } from 'uniswap/src/features/telemetry/types' -import { logExperimentQualifyingEvent } from 'uniswap/src/features/telemetry/utils/logExperimentQualifyingEvent' -import { getFlashblocksExperimentStatus } from 'uniswap/src/features/transactions/swap/hooks/useIsUnichainFlashblocksEnabled' -import { PermitMethod, ValidatedSwapTxContext } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' -import { isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing' -import { tradeToTransactionInfo } from 'uniswap/src/features/transactions/swap/utils/trade' -import { - ApproveTransactionInfo, - Permit2ApproveTransactionInfo, - TransactionOptions, - TransactionOriginType, - TransactionType, -} from 'uniswap/src/features/transactions/types/transactionDetails' -import { WrapType } from 'uniswap/src/features/transactions/types/wrap' -import { logger } from 'utilities/src/logger/logger' -import { isPrivateRpcSupportedOnChain } from 'wallet/src/features/providers/utils' -import { - ExecuteTransactionParams, - executeTransaction, -} from 'wallet/src/features/transactions/executeTransaction/executeTransactionSaga' -import { CalculatedNonce, tryGetNonce } from 'wallet/src/features/transactions/executeTransaction/tryGetNonce' -import { - getShouldWaitBetweenTransactions, - getSwapTransactionCount, - waitForTransactionConfirmation, -} from 'wallet/src/features/transactions/swap/confirmation' -import { SubmitUniswapXOrderParams, submitUniswapXOrder } from 'wallet/src/features/transactions/swap/submitOrderSaga' -import { selectWalletSwapProtectionSetting } from 'wallet/src/features/wallet/selectors' -import { SwapProtectionSetting } from 'wallet/src/features/wallet/slice' -import { createMonitoredSaga } from 'wallet/src/utils/saga' - -export type SwapParams = { - txId?: string - account: SignerMnemonicAccountMeta - analytics: SwapTradeBaseProperties - swapTxContext: ValidatedSwapTxContext - onSuccess: () => void - onFailure: () => void - onPending: () => void -} - -export function* approveAndSwap(params: SwapParams) { - const userSubmissionTimestampMs = Date.now() - let calculatedNonce: CalculatedNonce | undefined - try { - const { swapTxContext, account, txId, analytics, onSuccess, onFailure, onPending } = params - const { approveTxRequest } = swapTxContext - const isUniswapXRouting = isUniswapX(swapTxContext) - const isBridge = swapTxContext.routing === TradingApi.Routing.BRIDGE - const chainId = swapTxContext.trade.inputAmount.currency.chainId - - // MEV protection is not needed for UniswapX approval and/or wrap transactions. - // We disable for bridge to avoid any potential issues with BE checking status. - const submitViaPrivateRpc = !isUniswapXRouting && !isBridge && (yield* call(shouldSubmitViaPrivateRpc, chainId)) - - const shouldWait = yield* call(getShouldWaitBetweenTransactions, { - swapper: account.address, - chainId, - privateRpcAvailable: submitViaPrivateRpc, - }) - const swapTxHasDelayedSubmission = shouldWait && getSwapTransactionCount(swapTxContext) > 1 - - if (isUniswapXRouting || swapTxHasDelayedSubmission) { - yield* call(onPending) - } else { - yield* call(onSuccess) - } - - // We must manually set the nonce when submitting multiple transactions in a row, - // otherwise for some L2s the Provider might fetch the same nonce for both transactions. - calculatedNonce = yield* call(tryGetNonce, account, chainId) - let nonce = calculatedNonce?.nonce - - const gasFeeEstimation = swapTxContext.gasFeeEstimation - - let approveTxHash: string | undefined - // Approval Logic - if (approveTxRequest) { - const typeInfo: ApproveTransactionInfo = { - type: TransactionType.Approve, - tokenAddress: approveTxRequest.to, - spender: permit2Address(chainId), - swapTxId: txId, - gasEstimate: gasFeeEstimation.approvalEstimate, - } - const options: TransactionOptions = { - request: { ...approveTxRequest, nonce }, - submitViaPrivateRpc, - userSubmissionTimestampMs, - } - const executeTransactionParams: ExecuteTransactionParams = { - chainId, - account, - options, - typeInfo, - analytics, - transactionOriginType: TransactionOriginType.Internal, - } - - // TODO(WEB-4406) - Refactor the approval submission's rpc call latency to not delay wrap submission - approveTxHash = (yield* call(executeTransaction, executeTransactionParams)).transactionHash - nonce = nonce ? nonce + 1 : undefined - - yield* call(handleTransactionSpacing, { shouldWait, hash: approveTxHash, onFailure }) - } - - // Permit transaction logic (smart account mismatch case) - if ( - swapTxContext.routing === TradingApi.Routing.CLASSIC && - swapTxContext.permit?.method === PermitMethod.Transaction - ) { - const permitTxRequest = swapTxContext.permit.txRequest - - // Spender should be routing contract, called in the swap tx - const spender = swapTxContext.txRequests?.[0]?.to ?? '' - - const typeInfo: Permit2ApproveTransactionInfo = { - type: TransactionType.Permit2Approve, - spender, - } - const options: TransactionOptions = { - request: { ...permitTxRequest, nonce }, - submitViaPrivateRpc, - userSubmissionTimestampMs, - } - const executeTransactionParams: ExecuteTransactionParams = { - chainId, - account, - options, - typeInfo, - analytics, - transactionOriginType: TransactionOriginType.Internal, - } - - const permitTxHash = (yield* call(executeTransaction, executeTransactionParams)).transactionHash - nonce = nonce ? nonce + 1 : undefined - - yield* call(handleTransactionSpacing, { shouldWait, hash: permitTxHash, onFailure }) - } - - // Default to input for USD volume amount - const transactedUSDValue = analytics.token_in_amount_usd - - const typeInfo = tradeToTransactionInfo({ - trade: swapTxContext.trade, - transactedUSDValue, - gasEstimate: gasFeeEstimation.swapEstimate, - }) - - // Swap Logic - UniswapX - if (isUniswapXRouting) { - const { trade, permit } = swapTxContext - const { quote } = trade.quote - - const submitOrderParams: SubmitUniswapXOrderParams = { - account, - analytics, - approveTxHash, - permit: permit.typedData, - quote, - routing: swapTxContext.routing, - typeInfo, - chainId, - txId, - onSuccess, - onFailure, - } - yield* call(submitUniswapXOrder, submitOrderParams) - } else if (swapTxContext.routing === TradingApi.Routing.BRIDGE) { - const options: TransactionOptions = { - request: { ...swapTxContext.txRequests[0], nonce }, - submitViaPrivateRpc, - userSubmissionTimestampMs, - includesDelegation: swapTxContext.includesDelegation, - isSmartWalletTransaction: swapTxContext.txRequests[0].to.toLowerCase() === account.address.toLowerCase(), - } - const executeTransactionParams: ExecuteTransactionParams = { - txId, - chainId, - account, - options, - typeInfo, - analytics, - transactionOriginType: TransactionOriginType.Internal, - } - yield* call(executeTransaction, executeTransactionParams) - yield* put(pushNotification({ type: AppNotificationType.SwapPending, wrapType: WrapType.NotApplicable })) - - // Call onSuccess now if it wasn't called earlier in function due to transaction spacing - if (swapTxHasDelayedSubmission) { - yield* call(onSuccess) - } - } else if (swapTxContext.routing === TradingApi.Routing.CLASSIC) { - const options: TransactionOptions = { - request: { ...swapTxContext.txRequests?.[0], nonce }, - submitViaPrivateRpc, - userSubmissionTimestampMs, - includesDelegation: swapTxContext.includesDelegation, - isSmartWalletTransaction: swapTxContext.txRequests?.[0]?.to === account.address, - } - const executeTransactionParams: ExecuteTransactionParams = { - txId, - chainId, - account, - options, - typeInfo, - analytics, - transactionOriginType: TransactionOriginType.Internal, - } - yield* call(executeTransaction, executeTransactionParams) - - const { shouldLogQualifyingEvent, shouldShowModal } = getFlashblocksExperimentStatus({ - chainId, - routing: swapTxContext.routing, - }) - - if (shouldLogQualifyingEvent) { - logExperimentQualifyingEvent({ - experiment: Experiments.UnichainFlashblocksModal, - }) - } - - // Show pending notification for control variant or ineligible swaps - if (!shouldShowModal) { - yield* put(pushNotification({ type: AppNotificationType.SwapPending, wrapType: WrapType.NotApplicable })) - } - - // Call onSuccess now if it wasn't called earlier in function due to transaction spacing - if (swapTxHasDelayedSubmission) { - yield* call(onSuccess) - } - } - } catch (error) { - logger.error(error, { - tags: { file: 'swapSaga', function: 'approveAndSwap' }, - extra: { analytics: params.analytics, calculatedNonce }, - }) - } -} - -export const { - name: swapSagaName, - wrappedSaga: swapSaga, - reducer: swapReducer, - actions: swapActions, -} = createMonitoredSaga({ - saga: approveAndSwap, - name: 'swap', -}) - -export function* shouldSubmitViaPrivateRpc(chainId: number) { - const swapProtectionSetting = yield* select(selectWalletSwapProtectionSetting) - const swapProtectionOn = swapProtectionSetting === SwapProtectionSetting.On - const privateRpcFeatureEnabled = getStatsigClient().checkGate(getFeatureFlagName(FeatureFlags.PrivateRpc)) - const privateRpcSupportedOnChain = chainId ? isPrivateRpcSupportedOnChain(chainId) : false - return Boolean(swapProtectionOn && privateRpcSupportedOnChain && privateRpcFeatureEnabled) -} - -/** Returns after the transactions corresponding to the given hash returns. Calls onFailure and throws an error if the transaction does not succeed. */ -export function* handleTransactionSpacing(params: { shouldWait: boolean; hash: string; onFailure: () => void }) { - const { shouldWait, hash } = params - - if (!shouldWait) { - return - } - - const { success } = yield* call(waitForTransactionConfirmation, { hash }) - - if (!success) { - // Call back to UI - params.onFailure() - - // Throw error to prevent saga from continuing - throw new Error('Wait failed in swapSaga') - } -} diff --git a/packages/wallet/src/features/transactions/swap/types/fixtures.ts b/packages/wallet/src/features/transactions/swap/types/fixtures.ts index 76c2f96b017..dabc3b059f9 100644 --- a/packages/wallet/src/features/transactions/swap/types/fixtures.ts +++ b/packages/wallet/src/features/transactions/swap/types/fixtures.ts @@ -44,7 +44,6 @@ export const mockTransactionService: jest.Mocked = { export const mockTransactionSigner: jest.Mocked = { signTypedData: jest.fn(), signTransaction: jest.fn(), - signAndSendTransaction: jest.fn(), prepareTransaction: jest.fn(), sendTransaction: jest.fn(), sendTransactionSync: jest.fn(), diff --git a/packages/wallet/src/features/transactions/swap/wrapSaga.test.ts b/packages/wallet/src/features/transactions/swap/wrapSaga.test.ts deleted file mode 100644 index 02f69fecc78..00000000000 --- a/packages/wallet/src/features/transactions/swap/wrapSaga.test.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { CurrencyAmount } from '@uniswap/sdk-core' -import { testSaga } from 'redux-saga-test-plan' -import { nativeOnChain } from 'uniswap/src/constants/tokens' -import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' -import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' -import { - TransactionOriginType, - TransactionType, - WrapTransactionInfo, -} from 'uniswap/src/features/transactions/types/transactionDetails' -import { WrapType } from 'uniswap/src/features/transactions/types/wrap' -import { ethersTransactionRequest } from 'uniswap/src/test/fixtures' -import { executeTransaction } from 'wallet/src/features/transactions/executeTransaction/executeTransactionSaga' -import { WrapParams, wrap } from 'wallet/src/features/transactions/swap/wrapSaga' -import { signerMnemonicAccount } from 'wallet/src/test/fixtures' - -const account = signerMnemonicAccount() - -const wrapTxInfo: WrapTransactionInfo = { - type: TransactionType.Wrap, - unwrapped: false, - currencyAmountRaw: '200000', - swapTxId: undefined, - gasEstimate: undefined, -} - -const unwrapTxInfo: WrapTransactionInfo = { - ...wrapTxInfo, - unwrapped: true, -} - -const txRequest = ethersTransactionRequest() - -const params: WrapParams = { - txId: '1', - account, - txRequest, - inputCurrencyAmount: CurrencyAmount.fromRawAmount(nativeOnChain(UniverseChainId.Mainnet), '200000'), -} - -describe(wrap, () => { - it('successfully wrap native eth', () => { - testSaga(wrap, params) - .next() - .call(executeTransaction, { - txId: '1', - transactionOriginType: TransactionOriginType.Internal, - chainId: UniverseChainId.Mainnet, - account: params.account, - typeInfo: wrapTxInfo, - options: { request: txRequest }, - }) - .next() - .put(pushNotification({ type: AppNotificationType.SwapPending, wrapType: WrapType.Wrap })) - .next() - .isDone() - }) - - it('successfully unwraps to native eth', () => { - const unwrapParams: WrapParams = { - ...params, - inputCurrencyAmount: CurrencyAmount.fromRawAmount(nativeOnChain(UniverseChainId.Mainnet).wrapped, '200000'), - } - testSaga(wrap, unwrapParams) - .next() - .call(executeTransaction, { - txId: '1', - transactionOriginType: TransactionOriginType.Internal, - chainId: UniverseChainId.Mainnet, - account: params.account, - typeInfo: unwrapTxInfo, - options: { request: txRequest }, - }) - .next() - .put(pushNotification({ type: AppNotificationType.SwapPending, wrapType: WrapType.Unwrap })) - .next() - .isDone() - }) -}) diff --git a/packages/wallet/src/features/transactions/swap/wrapSaga.ts b/packages/wallet/src/features/transactions/swap/wrapSaga.ts deleted file mode 100644 index c19e475d041..00000000000 --- a/packages/wallet/src/features/transactions/swap/wrapSaga.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { Currency, CurrencyAmount } from '@uniswap/sdk-core' -import { GasEstimate } from '@universe/api' -import { providers } from 'ethers' -import { call, put } from 'typed-redux-saga' -import { SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types' -import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' -import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' -import { - TransactionOptions, - TransactionOriginType, - TransactionType, - TransactionTypeInfo, -} from 'uniswap/src/features/transactions/types/transactionDetails' -import { WrapType } from 'uniswap/src/features/transactions/types/wrap' -import { logger } from 'utilities/src/logger/logger' -import { executeTransaction } from 'wallet/src/features/transactions/executeTransaction/executeTransactionSaga' -import { createMonitoredSaga } from 'wallet/src/utils/saga' - -export type WrapParams = { - txId?: string - // The id that will be used for the swap submitted after the wrap, if applicable. - swapTxId?: string - txRequest: providers.TransactionRequest - account: SignerMnemonicAccountMeta - inputCurrencyAmount: CurrencyAmount - skipPushNotification?: boolean - gasEstimate?: GasEstimate -} - -export function* wrap(params: WrapParams) { - try { - const { account, inputCurrencyAmount, txRequest, txId, skipPushNotification, swapTxId, gasEstimate } = params - let typeInfo: TransactionTypeInfo - - if (inputCurrencyAmount.currency.isNative) { - typeInfo = { - type: TransactionType.Wrap, - unwrapped: false, - currencyAmountRaw: inputCurrencyAmount.quotient.toString(), - swapTxId, - gasEstimate, - } - } else { - typeInfo = { - type: TransactionType.Wrap, - unwrapped: true, - currencyAmountRaw: inputCurrencyAmount.quotient.toString(), - swapTxId, - gasEstimate, - } - } - - const options: TransactionOptions = { - request: txRequest, - } - - const result = yield* call(executeTransaction, { - txId, - chainId: inputCurrencyAmount.currency.chainId, - account, - options, - typeInfo, - transactionOriginType: TransactionOriginType.Internal, - }) - - if (!skipPushNotification) { - const wrapType = inputCurrencyAmount.currency.isNative ? WrapType.Wrap : WrapType.Unwrap - yield* put(pushNotification({ type: AppNotificationType.SwapPending, wrapType })) - } - - return result - } catch (error) { - logger.error(error, { tags: { file: 'wrapSaga', function: 'wrap' } }) - return undefined - } -} - -export const { - name: tokenWrapSagaName, - wrappedSaga: tokenWrapSaga, - reducer: tokenWrapReducer, - actions: tokenWrapActions, -} = createMonitoredSaga({ - saga: wrap, - name: 'wrap', -}) diff --git a/packages/wallet/src/features/transactions/utils.ts b/packages/wallet/src/features/transactions/utils.ts index d34292bb8fb..bd9e6795fa4 100644 --- a/packages/wallet/src/features/transactions/utils.ts +++ b/packages/wallet/src/features/transactions/utils.ts @@ -134,6 +134,7 @@ export function getPercentageError( * category. As more distinct patterns are found from the errors, we * should update this function to categorize them. */ +// eslint-disable-next-line complexity export function getRPCErrorCategory(error: Error): string { const message = error.message switch (true) { @@ -157,6 +158,8 @@ export function getRPCErrorCategory(error: Error): string { return 'already_known' case message.includes('could not detect network'): return 'no_network' + case message.includes("was added to the mempool but wasn't confirmed within"): + return 'confirmation_timeout' case message.includes('code=TIMEOUT'): return 'timeout' case message.includes('Cannot read properties of'): diff --git a/packages/wallet/src/test/rpcUtilsFixtures.ts b/packages/wallet/src/test/rpcUtilsFixtures.ts index 0fef5864e42..9c850889723 100644 --- a/packages/wallet/src/test/rpcUtilsFixtures.ts +++ b/packages/wallet/src/test/rpcUtilsFixtures.ts @@ -13,6 +13,9 @@ const txLimitReachedForDelegatedAccount = const timeout = 'timeout (requestBody="{\"method\":\"eth_sendRawTransaction\",\"params\":[\"...\"],\"id\":165,\"jsonrpc\":\"2.0\"}", requestMethod="POST", timeout=120000, url="...", code=TIMEOUT, version=web/5.7.1)' +const confirmationTimeout = + 'processing response error (body="{\"jsonrpc\":\"2.0\",\"id\":305,\"error\":{\"code\":4,\"message\":\"Transaction ... was added to the mempool but wasn\'t confirmed within 6s.\"}}", error={"code":4}, requestBody="{\"method\":\"eth_sendRawTransactionSync\",\"params\":[\"...\"],\"id\":305,\"jsonrpc\":\"2.0\"}", requestMethod="POST", url="...", code=SERVER_ERROR, version=web/5.7.1)' + const noNetwork = 'could not detect network (event="noNetwork", code=NETWORK_ERROR, version=providers/5.7.2)' const cannotReadProperty1 = "Cannot read properties of null (reading 'to')" @@ -46,6 +49,7 @@ export const rpcUtilsFixtures = { missingResponseBody, txLimitReachedForDelegatedAccount, timeout, + confirmationTimeout, noNetwork, cannotReadProperty1, cannotReadProperty2, diff --git a/packages/wallet/src/utils/password.ts b/packages/wallet/src/utils/password.ts index 7cdb954dc9e..e16b71752c4 100644 --- a/packages/wallet/src/utils/password.ts +++ b/packages/wallet/src/utils/password.ts @@ -8,6 +8,7 @@ import zxcvbn from 'zxcvbn' export enum PasswordErrors { WeakPassword = 'WeakPassword', PasswordsDoNotMatch = 'PasswordsDoNotMatch', + SamePassword = 'SamePassword', } export enum PasswordStrength { diff --git a/patches/lightweight-charts@4.1.1.patch b/patches/lightweight-charts@4.1.1.patch deleted file mode 100644 index 2d14120b614..00000000000 --- a/patches/lightweight-charts@4.1.1.patch +++ /dev/null @@ -1,421 +0,0 @@ -diff --git a/node_modules/lightweight-charts/.DS_Store b/.DS_Store -new file mode 100644 -index 0000000000000000000000000000000000000000..e0676ed8754fb549501fe9c26ee02e96cbc6e0ee -Binary files /dev/null and b/.DS_Store differ -diff --git a/dist/lightweight-charts.development.cjs b/dist/lightweight-charts.development.cjs -index 2b1e6c659f028facc794d987d2f0b94d9f8e2508..7f410ee8738dda136c9517804186d8ea178a9028 100644 ---- a/dist/lightweight-charts.development.cjs -+++ b/dist/lightweight-charts.development.cjs -@@ -1,7 +1,7 @@ - /*! - * @license -- * TradingView Lightweight Charts™ v4.1.1 -- * Copyright (c) 2023 TradingView, Inc. -+ * TradingView Lightweight Charts™ v4.2.0-dev+202405092055 -+ * Copyright (c) 2024 TradingView, Inc. - * Licensed under Apache License 2.0 https://www.apache.org/licenses/LICENSE-2.0 - */ - 'use strict'; -@@ -150,6 +150,10 @@ exports.LineStyle = void 0; - * A dotted line with more space between dots. - */ - LineStyle[LineStyle["SparseDotted"] = 4] = "SparseDotted"; -+ /** -+ * A dotted line with more space between dots. -+ */ -+ LineStyle[LineStyle["CustomDotGrid"] = 5] = "CustomDotGrid"; - })(exports.LineStyle || (exports.LineStyle = {})); - function setLineStyle(ctx, style) { - const dashPatterns = { -@@ -158,6 +162,7 @@ function setLineStyle(ctx, style) { - [2 /* LineStyle.Dashed */]: [2 * ctx.lineWidth, 2 * ctx.lineWidth], - [3 /* LineStyle.LargeDashed */]: [6 * ctx.lineWidth, 6 * ctx.lineWidth], - [4 /* LineStyle.SparseDotted */]: [ctx.lineWidth, 4 * ctx.lineWidth], -+ [5 /* LineStyle.CustomDotGrid */]: [ctx.lineWidth, ctx.lineWidth], - }; - const dashPattern = dashPatterns[style]; - ctx.setLineDash(dashPattern); -@@ -5110,6 +5115,42 @@ class GridRenderer extends BitmapCoordinatesPaneRenderer { - ctx.lineWidth = lineWidth; - strokeInPixel(ctx, () => { - const data = ensureNotNull(this._private__data); -+ if (data._internal_vertLineStyle === 5 /* LineStyle.CustomDotGrid */) { -+ if (!data._internal_vertLinesVisible || !data._internal_horzLinesVisible) { -+ return; -+ } -+ ctx.fillStyle = data._internal_vertLinesColor; -+ setLineStyle(ctx, data._internal_vertLineStyle); -+ ctx.beginPath(); -+ const dotGapY = data._internal_priceMarks.length > 1 ? data._internal_priceMarks[1]._internal_coord - data._internal_priceMarks[0]._internal_coord : undefined; -+ let lastDotGapX; -+ for (let i = 0; i < data._internal_timeMarks.length; i++) { -+ ctx.fillStyle = data._internal_vertLinesColor; -+ const timeMark = data._internal_timeMarks[i]; -+ const x = Math.round(timeMark._internal_coord * horizontalPixelRatio); -+ const dotGapX = i < (data._internal_timeMarks.length - 1) ? (data._internal_timeMarks[i + 1]._internal_coord - timeMark._internal_coord) : lastDotGapX; -+ const addExtraDot = (dotGapX && dotGapY) ? dotGapX > (dotGapY * 1.7) : false; -+ lastDotGapX = dotGapX; -+ for (let j = 0; j < data._internal_priceMarks.length; j++) { -+ const priceMark = data._internal_priceMarks[j]; -+ const y = Math.round(priceMark._internal_coord * verticalPixelRatio); -+ ctx.moveTo(x, y); -+ ctx.arc(x, y, 1.5, 0, Math.PI * 2); -+ if (addExtraDot && dotGapX) { -+ const extraDotX = Math.round((timeMark._internal_coord + (dotGapX / 2)) * horizontalPixelRatio); -+ ctx.moveTo(extraDotX, y); -+ ctx.arc(extraDotX, y, 1.5, 0, Math.PI * 2); -+ if (i === 0) { -+ const prevExtraDotX = Math.round((timeMark._internal_coord - (dotGapX / 2)) * horizontalPixelRatio); -+ ctx.moveTo(prevExtraDotX, y); -+ ctx.arc(prevExtraDotX, y, 1.5, 0, Math.PI * 2); -+ } -+ } -+ } -+ } -+ ctx.fill(); -+ return; -+ } - if (data._internal_vertLinesVisible) { - ctx.strokeStyle = data._internal_vertLinesColor; - setLineStyle(ctx, data._internal_vertLineStyle); -@@ -12917,7 +12958,7 @@ const customSeriesDefaultOptions = Object.assign(Object.assign({}, seriesOptions - * Returns the current version as a string. For example `'3.3.0'`. - */ - function version() { -- return "4.1.1"; -+ return "4.2.0-dev+202405092055"; - } - - exports.createChart = createChart; -diff --git a/dist/lightweight-charts.development.mjs b/dist/lightweight-charts.development.mjs -index bff9a23210cb1915bbf78b6af27a7e33804c04f4..2b8b44a335cb6d9c3238f9d07b623d4519c52709 100644 ---- a/dist/lightweight-charts.development.mjs -+++ b/dist/lightweight-charts.development.mjs -@@ -1,7 +1,7 @@ - /*! - * @license -- * TradingView Lightweight Charts™ v4.1.1 -- * Copyright (c) 2023 TradingView, Inc. -+ * TradingView Lightweight Charts™ v4.2.0-dev+202405092055 -+ * Copyright (c) 2024 TradingView, Inc. - * Licensed under Apache License 2.0 https://www.apache.org/licenses/LICENSE-2.0 - */ - import { size as size$1, bindCanvasElementBitmapSizeTo, equalSizes, tryCreateCanvasRenderingTarget2D } from 'fancy-canvas'; -@@ -148,6 +148,10 @@ var LineStyle; - * A dotted line with more space between dots. - */ - LineStyle[LineStyle["SparseDotted"] = 4] = "SparseDotted"; -+ /** -+ * A dotted line with more space between dots. -+ */ -+ LineStyle[LineStyle["CustomDotGrid"] = 5] = "CustomDotGrid"; - })(LineStyle || (LineStyle = {})); - function setLineStyle(ctx, style) { - const dashPatterns = { -@@ -156,6 +160,7 @@ function setLineStyle(ctx, style) { - [2 /* LineStyle.Dashed */]: [2 * ctx.lineWidth, 2 * ctx.lineWidth], - [3 /* LineStyle.LargeDashed */]: [6 * ctx.lineWidth, 6 * ctx.lineWidth], - [4 /* LineStyle.SparseDotted */]: [ctx.lineWidth, 4 * ctx.lineWidth], -+ [5 /* LineStyle.CustomDotGrid */]: [ctx.lineWidth, ctx.lineWidth], - }; - const dashPattern = dashPatterns[style]; - ctx.setLineDash(dashPattern); -@@ -5108,6 +5113,42 @@ class GridRenderer extends BitmapCoordinatesPaneRenderer { - ctx.lineWidth = lineWidth; - strokeInPixel(ctx, () => { - const data = ensureNotNull(this._private__data); -+ if (data._internal_vertLineStyle === 5 /* LineStyle.CustomDotGrid */) { -+ if (!data._internal_vertLinesVisible || !data._internal_horzLinesVisible) { -+ return; -+ } -+ ctx.fillStyle = data._internal_vertLinesColor; -+ setLineStyle(ctx, data._internal_vertLineStyle); -+ ctx.beginPath(); -+ const dotGapY = data._internal_priceMarks.length > 1 ? data._internal_priceMarks[1]._internal_coord - data._internal_priceMarks[0]._internal_coord : undefined; -+ let lastDotGapX; -+ for (let i = 0; i < data._internal_timeMarks.length; i++) { -+ ctx.fillStyle = data._internal_vertLinesColor; -+ const timeMark = data._internal_timeMarks[i]; -+ const x = Math.round(timeMark._internal_coord * horizontalPixelRatio); -+ const dotGapX = i < (data._internal_timeMarks.length - 1) ? (data._internal_timeMarks[i + 1]._internal_coord - timeMark._internal_coord) : lastDotGapX; -+ const addExtraDot = (dotGapX && dotGapY) ? dotGapX > (dotGapY * 1.7) : false; -+ lastDotGapX = dotGapX; -+ for (let j = 0; j < data._internal_priceMarks.length; j++) { -+ const priceMark = data._internal_priceMarks[j]; -+ const y = Math.round(priceMark._internal_coord * verticalPixelRatio); -+ ctx.moveTo(x, y); -+ ctx.arc(x, y, 1.5, 0, Math.PI * 2); -+ if (addExtraDot && dotGapX) { -+ const extraDotX = Math.round((timeMark._internal_coord + (dotGapX / 2)) * horizontalPixelRatio); -+ ctx.moveTo(extraDotX, y); -+ ctx.arc(extraDotX, y, 1.5, 0, Math.PI * 2); -+ if (i === 0) { -+ const prevExtraDotX = Math.round((timeMark._internal_coord - (dotGapX / 2)) * horizontalPixelRatio); -+ ctx.moveTo(prevExtraDotX, y); -+ ctx.arc(prevExtraDotX, y, 1.5, 0, Math.PI * 2); -+ } -+ } -+ } -+ } -+ ctx.fill(); -+ return; -+ } - if (data._internal_vertLinesVisible) { - ctx.strokeStyle = data._internal_vertLinesColor; - setLineStyle(ctx, data._internal_vertLineStyle); -@@ -12915,7 +12956,7 @@ const customSeriesDefaultOptions = Object.assign(Object.assign({}, seriesOptions - * Returns the current version as a string. For example `'3.3.0'`. - */ - function version() { -- return "4.1.1"; -+ return "4.2.0-dev+202405092055"; - } - - export { ColorType, CrosshairMode, LastPriceAnimationMode, LineStyle, LineType, MismatchDirection, PriceLineSource, PriceScaleMode, TickMarkType, TrackingModeExitMode, createChart, createChartEx, customSeriesDefaultOptions, isBusinessDay, isUTCTimestamp, version }; -diff --git a/dist/lightweight-charts.production.cjs b/dist/lightweight-charts.production.cjs -index 99e70963fdfc805dcf616f9aeb2782b56efe18d3..80bf6d32c7d5cc2b7bb139fb08fd4e34062f453b 100644 ---- a/dist/lightweight-charts.production.cjs -+++ b/dist/lightweight-charts.production.cjs -@@ -1,7 +1,7 @@ - /*! - * @license -- * TradingView Lightweight Charts™ v4.1.1 -- * Copyright (c) 2023 TradingView, Inc. -+ * TradingView Lightweight Charts™ v4.2.0-dev+202405092055 -+ * Copyright (c) 2024 TradingView, Inc. - * Licensed under Apache License 2.0 https://www.apache.org/licenses/LICENSE-2.0 - */ --"use strict";var t=require("fancy-canvas");const i={upColor:"#26a69a",downColor:"#ef5350",wickVisible:!0,borderVisible:!0,borderColor:"#378658",borderUpColor:"#26a69a",borderDownColor:"#ef5350",wickColor:"#737375",wickUpColor:"#26a69a",wickDownColor:"#ef5350"},n={upColor:"#26a69a",downColor:"#ef5350",openVisible:!0,thinBars:!0},s={color:"#2196f3",lineStyle:0,lineWidth:3,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},e={topColor:"rgba( 46, 220, 135, 0.4)",bottomColor:"rgba( 40, 221, 100, 0)",invertFilledArea:!1,lineColor:"#33D778",lineStyle:0,lineWidth:3,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},r={baseValue:{type:"price",price:0},topFillColor1:"rgba(38, 166, 154, 0.28)",topFillColor2:"rgba(38, 166, 154, 0.05)",topLineColor:"rgba(38, 166, 154, 1)",bottomFillColor1:"rgba(239, 83, 80, 0.05)",bottomFillColor2:"rgba(239, 83, 80, 0.28)",bottomLineColor:"rgba(239, 83, 80, 1)",lineWidth:3,lineStyle:0,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},h={color:"#26a69a",base:0},l={color:"#2196f3"},a={title:"",visible:!0,lastValueVisible:!0,priceLineVisible:!0,priceLineSource:0,priceLineWidth:1,priceLineColor:"",priceLineStyle:2,baseLineVisible:!0,baseLineWidth:1,baseLineColor:"#B2B5BE",baseLineStyle:0,priceFormat:{type:"price",precision:2,minMove:.01}};var o,_;function u(t,i){const n={0:[],1:[t.lineWidth,t.lineWidth],2:[2*t.lineWidth,2*t.lineWidth],3:[6*t.lineWidth,6*t.lineWidth],4:[t.lineWidth,4*t.lineWidth]}[i];t.setLineDash(n)}function c(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(n,i+e),t.lineTo(s,i+e),t.stroke()}function d(t,i){if(!t)throw new Error("Assertion failed"+(i?": "+i:""))}function f(t){if(void 0===t)throw new Error("Value is undefined");return t}function v(t){if(null===t)throw new Error("Value is null");return t}function p(t){return v(f(t))}exports.LineType=void 0,(o=exports.LineType||(exports.LineType={}))[o.Simple=0]="Simple",o[o.WithSteps=1]="WithSteps",o[o.Curved=2]="Curved",exports.LineStyle=void 0,(_=exports.LineStyle||(exports.LineStyle={}))[_.Solid=0]="Solid",_[_.Dotted=1]="Dotted",_[_.Dashed=2]="Dashed",_[_.LargeDashed=3]="LargeDashed",_[_.SparseDotted=4]="SparseDotted";const m={khaki:"#f0e68c",azure:"#f0ffff",aliceblue:"#f0f8ff",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gainsboro:"#dcdcdc",gray:"#808080",green:"#008000",honeydew:"#f0fff0",floralwhite:"#fffaf0",lightblue:"#add8e6",lightcoral:"#f08080",lemonchiffon:"#fffacd",hotpink:"#ff69b4",lightyellow:"#ffffe0",greenyellow:"#adff2f",lightgoldenrodyellow:"#fafad2",limegreen:"#32cd32",linen:"#faf0e6",lightcyan:"#e0ffff",magenta:"#f0f",maroon:"#800000",olive:"#808000",orange:"#ffa500",oldlace:"#fdf5e6",mediumblue:"#0000cd",transparent:"#0000",lime:"#0f0",lightpink:"#ffb6c1",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",midnightblue:"#191970",orchid:"#da70d6",mediumorchid:"#ba55d3",mediumturquoise:"#48d1cc",orangered:"#ff4500",royalblue:"#4169e1",powderblue:"#b0e0e6",red:"#f00",coral:"#ff7f50",turquoise:"#40e0d0",white:"#fff",whitesmoke:"#f5f5f5",wheat:"#f5deb3",teal:"#008080",steelblue:"#4682b4",bisque:"#ffe4c4",aquamarine:"#7fffd4",aqua:"#0ff",sienna:"#a0522d",silver:"#c0c0c0",springgreen:"#00ff7f",antiquewhite:"#faebd7",burlywood:"#deb887",brown:"#a52a2a",beige:"#f5f5dc",chocolate:"#d2691e",chartreuse:"#7fff00",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cadetblue:"#5f9ea0",tomato:"#ff6347",fuchsia:"#f0f",blue:"#00f",salmon:"#fa8072",blanchedalmond:"#ffebcd",slateblue:"#6a5acd",slategray:"#708090",thistle:"#d8bfd8",tan:"#d2b48c",cyan:"#0ff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",blueviolet:"#8a2be2",black:"#000",darkmagenta:"#8b008b",darkslateblue:"#483d8b",darkkhaki:"#bdb76b",darkorchid:"#9932cc",darkorange:"#ff8c00",darkgreen:"#006400",darkred:"#8b0000",dodgerblue:"#1e90ff",darkslategray:"#2f4f4f",dimgray:"#696969",deepskyblue:"#00bfff",firebrick:"#b22222",forestgreen:"#228b22",indigo:"#4b0082",ivory:"#fffff0",lavenderblush:"#fff0f5",feldspar:"#d19275",indianred:"#cd5c5c",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightskyblue:"#87cefa",lightslategray:"#789",lightslateblue:"#8470ff",snow:"#fffafa",lightseagreen:"#20b2aa",lightsalmon:"#ffa07a",darksalmon:"#e9967a",darkviolet:"#9400d3",mediumpurple:"#9370d8",mediumaquamarine:"#66cdaa",skyblue:"#87ceeb",lavender:"#e6e6fa",lightsteelblue:"#b0c4de",mediumvioletred:"#c71585",mintcream:"#f5fffa",navajowhite:"#ffdead",navy:"#000080",olivedrab:"#6b8e23",palevioletred:"#d87093",violetred:"#d02090",yellow:"#ff0",yellowgreen:"#9acd32",lawngreen:"#7cfc00",pink:"#ffc0cb",paleturquoise:"#afeeee",palegoldenrod:"#eee8aa",darkolivegreen:"#556b2f",darkseagreen:"#8fbc8f",darkturquoise:"#00ced1",peachpuff:"#ffdab9",deeppink:"#ff1493",violet:"#ee82ee",palegreen:"#98fb98",mediumseagreen:"#3cb371",peru:"#cd853f",saddlebrown:"#8b4513",sandybrown:"#f4a460",rosybrown:"#bc8f8f",purple:"#800080",seagreen:"#2e8b57",seashell:"#fff5ee",papayawhip:"#ffefd5",mediumslateblue:"#7b68ee",plum:"#dda0dd",mediumspringgreen:"#00fa9a"};function b(t){return t<0?0:t>255?255:Math.round(t)||0}function w(t){return t<=0||t>0?t<0?0:t>1?1:Math.round(1e4*t)/1e4:0}const g=/^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,M=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,x=/^rgb\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*\)$/,S=/^rgba\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?[\d]{0,10}(?:\.\d+)?)\s*\)$/;function k(t){(t=t.toLowerCase())in m&&(t=m[t]);{const i=S.exec(t)||x.exec(t);if(i)return[b(parseInt(i[1],10)),b(parseInt(i[2],10)),b(parseInt(i[3],10)),w(i.length<5?1:parseFloat(i[4]))]}{const i=M.exec(t);if(i)return[b(parseInt(i[1],16)),b(parseInt(i[2],16)),b(parseInt(i[3],16)),1]}{const i=g.exec(t);if(i)return[b(17*parseInt(i[1],16)),b(17*parseInt(i[2],16)),b(17*parseInt(i[3],16)),1]}throw new Error(`Cannot parse color: ${t}`)}function y(t){const i=k(t);return{t:`rgb(${i[0]}, ${i[1]}, ${i[2]})`,i:(n=i,.199*n[0]+.687*n[1]+.114*n[2]>160?"black":"white")};var n}class C{constructor(){this.h=[]}l(t,i,n){const s={o:t,_:i,u:!0===n};this.h.push(s)}v(t){const i=this.h.findIndex((i=>t===i.o));i>-1&&this.h.splice(i,1)}p(t){this.h=this.h.filter((i=>i._!==t))}m(t,i,n){const s=[...this.h];this.h=this.h.filter((t=>!t.u)),s.forEach((s=>s.o(t,i,n)))}M(){return this.h.length>0}S(){this.h=[]}}function T(t,...i){for(const n of i)for(const i in n)void 0!==n[i]&&("object"!=typeof n[i]||void 0===t[i]||Array.isArray(n[i])?t[i]=n[i]:T(t[i],n[i]));return t}function P(t){return"number"==typeof t&&isFinite(t)}function R(t){return"number"==typeof t&&t%1==0}function D(t){return"string"==typeof t}function O(t){return"boolean"==typeof t}function A(t){const i=t;if(!i||"object"!=typeof i)return i;let n,s,e;for(s in n=Array.isArray(i)?[]:{},i)i.hasOwnProperty(s)&&(e=i[s],n[s]=e&&"object"==typeof e?A(e):e);return n}function V(t){return null!==t}function B(t){return null===t?void 0:t}const I="-apple-system, BlinkMacSystemFont, 'Trebuchet MS', Roboto, Ubuntu, sans-serif";function z(t,i,n){return void 0===i&&(i=I),`${n=void 0!==n?`${n} `:""}${t}px ${i}`}class E{constructor(t){this.k={C:1,T:5,P:NaN,R:"",D:"",O:"",A:"",V:0,B:0,I:0,L:0,N:0},this.F=t}W(){const t=this.k,i=this.j(),n=this.H();return t.P===i&&t.D===n||(t.P=i,t.D=n,t.R=z(i,n),t.L=2.5/12*i,t.V=t.L,t.B=i/12*t.T,t.I=i/12*t.T,t.N=0),t.O=this.$(),t.A=this.U(),this.k}$(){return this.F.W().layout.textColor}U(){return this.F.q()}j(){return this.F.W().layout.fontSize}H(){return this.F.W().layout.fontFamily}}class L{constructor(){this.Y=[]}X(t){this.Y=t}K(t,i,n){this.Y.forEach((s=>{s.K(t,i,n)}))}}class N{K(t,i,n){t.useMediaCoordinateSpace((t=>this.Z(t,i,n)))}G(t,i,n){t.useMediaCoordinateSpace((t=>this.J(t,i,n)))}J(t,i,n){}}class F extends N{constructor(){super(...arguments),this.tt=null}it(t){this.tt=t}Z({context:t}){if(null===this.tt||null===this.tt.nt)return;const i=this.tt.nt,n=this.tt,s=s=>{t.beginPath();for(let e=i.to-1;e>=i.from;--e){const i=n.st[e];t.moveTo(i.et,i.rt),t.arc(i.et,i.rt,s,0,2*Math.PI)}t.fill()};n.ht>0&&(t.fillStyle=n.lt,s(n.ot+n.ht)),t.fillStyle=n._t,s(n.ot)}}function W(){return{st:[{et:0,rt:0,ut:0,ct:0}],_t:"",lt:"",ot:0,ht:0,nt:null}}const j={from:0,to:1};class H{constructor(t,i){this.dt=new L,this.ft=[],this.vt=[],this.bt=!0,this.F=t,this.wt=i,this.dt.X(this.ft)}gt(t){const i=this.F.Mt();i.length!==this.ft.length&&(this.vt=i.map(W),this.ft=this.vt.map((t=>{const i=new F;return i.it(t),i})),this.dt.X(this.ft)),this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.dt}St(){const t=2===this.wt.W().mode,i=this.F.Mt(),n=this.wt.kt(),s=this.F.yt();i.forEach(((i,e)=>{var r;const h=this.vt[e],l=i.Ct(n);if(t||null===l||!i.Tt())return void(h.nt=null);const a=v(i.Pt());h._t=l.Rt,h.ot=l.ot,h.ht=l.Dt,h.st[0].ct=l.ct,h.st[0].rt=i.At().Ot(l.ct,a.Vt),h.lt=null!==(r=l.Bt)&&void 0!==r?r:this.F.It(h.st[0].rt/i.At().zt()),h.st[0].ut=n,h.st[0].et=s.Et(n),h.nt=j}))}}class ${K(t,i,n){t.useBitmapCoordinateSpace((t=>this.Z(t,i,n)))}}class U extends ${constructor(t){super(),this.Lt=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;const e=this.Lt.Nt.Tt,r=this.Lt.Ft.Tt;if(!e&&!r)return;const h=Math.round(this.Lt.et*n),l=Math.round(this.Lt.rt*s);t.lineCap="butt",e&&h>=0&&(t.lineWidth=Math.floor(this.Lt.Nt.ht*n),t.strokeStyle=this.Lt.Nt.O,t.fillStyle=this.Lt.Nt.O,u(t,this.Lt.Nt.Wt),function(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(i+e,n),t.lineTo(i+e,s),t.stroke()}(t,h,0,i.height)),r&&l>=0&&(t.lineWidth=Math.floor(this.Lt.Ft.ht*s),t.strokeStyle=this.Lt.Ft.O,t.fillStyle=this.Lt.Ft.O,u(t,this.Lt.Ft.Wt),c(t,l,0,i.width))}}class q{constructor(t){this.bt=!0,this.jt={Nt:{ht:1,Wt:0,O:"",Tt:!1},Ft:{ht:1,Wt:0,O:"",Tt:!1},et:0,rt:0},this.Ht=new U(this.jt),this.$t=t}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht}St(){const t=this.$t.Tt(),i=v(this.$t.Ut()),n=i.qt().W().crosshair,s=this.jt;if(2===n.mode)return s.Ft.Tt=!1,void(s.Nt.Tt=!1);s.Ft.Tt=t&&this.$t.Yt(i),s.Nt.Tt=t&&this.$t.Xt(),s.Ft.ht=n.horzLine.width,s.Ft.Wt=n.horzLine.style,s.Ft.O=n.horzLine.color,s.Nt.ht=n.vertLine.width,s.Nt.Wt=n.vertLine.style,s.Nt.O=n.vertLine.color,s.et=this.$t.Kt(),s.rt=this.$t.Zt()}}function Y(t,i,n,s,e,r){t.fillRect(i+r,n,s-2*r,r),t.fillRect(i+r,n+e-r,s-2*r,r),t.fillRect(i,n,r,e),t.fillRect(i+s-r,n,r,e)}function X(t,i,n,s,e,r){t.save(),t.globalCompositeOperation="copy",t.fillStyle=r,t.fillRect(i,n,s,e),t.restore()}function K(t,i){return t.map((t=>0===t?t:t+i))}function Z(t,i,n,s,e,r){t.beginPath(),t.lineTo(i+s-r[1],n),0!==r[1]&&t.arcTo(i+s,n,i+s,n+r[1],r[1]),t.lineTo(i+s,n+e-r[2]),0!==r[2]&&t.arcTo(i+s,n+e,i+s-r[2],n+e,r[2]),t.lineTo(i+r[3],n+e),0!==r[3]&&t.arcTo(i,n+e,i,n+e-r[3],r[3]),t.lineTo(i,n+r[0]),0!==r[0]&&t.arcTo(i,n,i+r[0],n,r[0])}function G(t,i,n,s,e,r,h=0,l=[0,0,0,0],a=""){if(t.save(),!h||!a||a===r)return Z(t,i,n,s,e,l),t.fillStyle=r,t.fill(),void t.restore();const o=h/2;if("transparent"!==r){Z(t,i+h,n+h,s-2*h,e-2*h,K(l,-h)),t.fillStyle=r,t.fill()}if("transparent"!==a){Z(t,i+o,n+o,s-h,e-h,K(l,-o)),t.lineWidth=h,t.strokeStyle=a,t.closePath(),t.stroke()}t.restore()}function J(t,i,n,s,e,r,h){t.save(),t.globalCompositeOperation="copy";const l=t.createLinearGradient(0,0,0,e);l.addColorStop(0,r),l.addColorStop(1,h),t.fillStyle=l,t.fillRect(i,n,s,e),t.restore()}class Q{constructor(t,i){this.it(t,i)}it(t,i){this.Lt=t,this.Gt=i}zt(t,i){return this.Lt.Tt?t.P+t.L+t.V:0}K(t,i,n,s){if(!this.Lt.Tt||0===this.Lt.Jt.length)return;const e=this.Lt.O,r=this.Gt.t,h=t.useBitmapCoordinateSpace((t=>{const h=t.context;h.font=i.R;const l=this.Qt(t,i,n,s),a=l.ti,o=(t,i)=>{l.ii?G(h,a.ni,a.si,a.ei,a.ri,t,a.hi,[a.ot,0,0,a.ot],i):G(h,a.li,a.si,a.ei,a.ri,t,a.hi,[0,a.ot,a.ot,0],i)};return o(r,"transparent"),this.Lt.ai&&(h.fillStyle=e,h.fillRect(a.li,a.oi,a._i-a.li,a.ui)),o("transparent",r),this.Lt.ci&&(h.fillStyle=i.A,h.fillRect(l.ii?a.di-a.hi:0,a.si,a.hi,a.fi-a.si)),l}));t.useMediaCoordinateSpace((({context:t})=>{const n=h.vi;t.font=i.R,t.textAlign=h.ii?"right":"left",t.textBaseline="middle",t.fillStyle=e,t.fillText(this.Lt.Jt,n.pi,(n.si+n.fi)/2+n.mi)}))}Qt(t,i,n,s){var e;const{context:r,bitmapSize:h,mediaSize:l,horizontalPixelRatio:a,verticalPixelRatio:o}=t,_=this.Lt.ai||!this.Lt.bi?i.T:0,u=this.Lt.wi?i.C:0,c=i.L+this.Gt.gi,d=i.V+this.Gt.Mi,f=i.B,v=i.I,p=this.Lt.Jt,m=i.P,b=n.xi(r,p),w=Math.ceil(n.Si(r,p)),g=m+c+d,M=i.C+f+v+w+_,x=Math.max(1,Math.floor(o));let S=Math.round(g*o);S%2!=x%2&&(S+=1);const k=u>0?Math.max(1,Math.floor(u*a)):0,y=Math.round(M*a),C=Math.round(_*a),T=null!==(e=this.Gt.ki)&&void 0!==e?e:this.Gt.yi,P=Math.round(T*o)-Math.floor(.5*o),R=Math.floor(P+x/2-S/2),D=R+S,O="right"===s,A=O?l.width-u:u,V=O?h.width-k:k;let B,I,z;return O?(B=V-y,I=V-C,z=A-_-f-u):(B=V+y,I=V+C,z=A+_+f),{ii:O,ti:{si:R,oi:P,fi:D,ei:y,ri:S,ot:2*a,hi:k,ni:B,li:V,_i:I,ui:x,di:h.width},vi:{si:R/o,fi:D/o,pi:z,mi:b}}}}class tt{constructor(t){this.Ci={yi:0,t:"#000",Mi:0,gi:0},this.Ti={Jt:"",Tt:!1,ai:!0,bi:!1,Bt:"",O:"#FFF",ci:!1,wi:!1},this.Pi={Jt:"",Tt:!1,ai:!1,bi:!0,Bt:"",O:"#FFF",ci:!0,wi:!0},this.bt=!0,this.Ri=new(t||Q)(this.Ti,this.Ci),this.Di=new(t||Q)(this.Pi,this.Ci)}Jt(){return this.Oi(),this.Ti.Jt}yi(){return this.Oi(),this.Ci.yi}gt(){this.bt=!0}zt(t,i=!1){return Math.max(this.Ri.zt(t,i),this.Di.zt(t,i))}Ai(){return this.Ci.ki||0}Vi(t){this.Ci.ki=t}Bi(){return this.Oi(),this.Ti.Tt||this.Pi.Tt}Ii(){return this.Oi(),this.Ti.Tt}xt(t){return this.Oi(),this.Ti.ai=this.Ti.ai&&t.W().ticksVisible,this.Pi.ai=this.Pi.ai&&t.W().ticksVisible,this.Ri.it(this.Ti,this.Ci),this.Di.it(this.Pi,this.Ci),this.Ri}zi(){return this.Oi(),this.Ri.it(this.Ti,this.Ci),this.Di.it(this.Pi,this.Ci),this.Di}Oi(){this.bt&&(this.Ti.ai=!0,this.Pi.ai=!1,this.Ei(this.Ti,this.Pi,this.Ci))}}class it extends tt{constructor(t,i,n){super(),this.$t=t,this.Li=i,this.Ni=n}Ei(t,i,n){if(t.Tt=!1,2===this.$t.W().mode)return;const s=this.$t.W().horzLine;if(!s.labelVisible)return;const e=this.Li.Pt();if(!this.$t.Tt()||this.Li.Fi()||null===e)return;const r=y(s.labelBackgroundColor);n.t=r.t,t.O=r.i;const h=2/12*this.Li.P();n.gi=h,n.Mi=h;const l=this.Ni(this.Li);n.yi=l.yi,t.Jt=this.Li.Wi(l.ct,e),t.Tt=!0}}const nt=/[1-9]/g;class st{constructor(){this.Lt=null}it(t){this.Lt=t}K(t,i){if(null===this.Lt||!1===this.Lt.Tt||0===this.Lt.Jt.length)return;const n=t.useMediaCoordinateSpace((({context:t})=>(t.font=i.R,Math.round(i.ji.Si(t,v(this.Lt).Jt,nt)))));if(n<=0)return;const s=i.Hi,e=n+2*s,r=e/2,h=this.Lt.$i;let l=this.Lt.yi,a=Math.floor(l-r)+.5;a<0?(l+=Math.abs(0-a),a=Math.floor(l-r)+.5):a+e>h&&(l-=Math.abs(h-(a+e)),a=Math.floor(l-r)+.5);const o=a+e,_=Math.ceil(0+i.C+i.T+i.L+i.P+i.V);t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:n,verticalPixelRatio:s})=>{const e=v(this.Lt);t.fillStyle=e.t;const r=Math.round(a*n),h=Math.round(0*s),l=Math.round(o*n),u=Math.round(_*s),c=Math.round(2*n);if(t.beginPath(),t.moveTo(r,h),t.lineTo(r,u-c),t.arcTo(r,u,r+c,u,c),t.lineTo(l-c,u),t.arcTo(l,u,l,u-c,c),t.lineTo(l,h),t.fill(),e.ai){const r=Math.round(e.yi*n),l=h,a=Math.round((l+i.T)*s);t.fillStyle=e.O;const o=Math.max(1,Math.floor(n)),_=Math.floor(.5*n);t.fillRect(r-_,l,o,a-l)}})),t.useMediaCoordinateSpace((({context:t})=>{const n=v(this.Lt),e=0+i.C+i.T+i.L+i.P/2;t.font=i.R,t.textAlign="left",t.textBaseline="middle",t.fillStyle=n.O;const r=i.ji.xi(t,"Apr0");t.translate(a+s,e+r),t.fillText(n.Jt,0,0)}))}}class et{constructor(t,i,n){this.bt=!0,this.Ht=new st,this.jt={Tt:!1,t:"#4c525e",O:"white",Jt:"",$i:0,yi:NaN,ai:!0},this.wt=t,this.Ui=i,this.Ni=n}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht.it(this.jt),this.Ht}St(){const t=this.jt;if(t.Tt=!1,2===this.wt.W().mode)return;const i=this.wt.W().vertLine;if(!i.labelVisible)return;const n=this.Ui.yt();if(n.Fi())return;t.$i=n.$i();const s=this.Ni();if(null===s)return;t.yi=s.yi;const e=n.qi(this.wt.kt());t.Jt=n.Yi(v(e)),t.Tt=!0;const r=y(i.labelBackgroundColor);t.t=r.t,t.O=r.i,t.ai=n.W().ticksVisible}}class rt{constructor(){this.Xi=null,this.Ki=0}Zi(){return this.Ki}Gi(t){this.Ki=t}At(){return this.Xi}Ji(t){this.Xi=t}Qi(t){return[]}tn(){return[]}Tt(){return!0}}var ht;exports.CrosshairMode=void 0,(ht=exports.CrosshairMode||(exports.CrosshairMode={}))[ht.Normal=0]="Normal",ht[ht.Magnet=1]="Magnet",ht[ht.Hidden=2]="Hidden";class lt extends rt{constructor(t,i){super(),this.nn=null,this.sn=NaN,this.en=0,this.rn=!0,this.hn=new Map,this.ln=!1,this.an=NaN,this.on=NaN,this._n=NaN,this.un=NaN,this.Ui=t,this.cn=i,this.dn=new H(t,this);this.fn=((t,i)=>n=>{const s=i(),e=t();if(n===v(this.nn).vn())return{ct:e,yi:s};{const t=v(n.Pt());return{ct:n.pn(s,t),yi:s}}})((()=>this.sn),(()=>this.on));const n=((t,i)=>()=>{const n=this.Ui.yt().mn(t()),s=i();return n&&Number.isFinite(s)?{ut:n,yi:s}:null})((()=>this.en),(()=>this.Kt()));this.bn=new et(this,t,n),this.wn=new q(this)}W(){return this.cn}gn(t,i){this._n=t,this.un=i}Mn(){this._n=NaN,this.un=NaN}xn(){return this._n}Sn(){return this.un}kn(t,i,n){this.ln||(this.ln=!0),this.rn=!0,this.yn(t,i,n)}kt(){return this.en}Kt(){return this.an}Zt(){return this.on}Tt(){return this.rn}Cn(){this.rn=!1,this.Tn(),this.sn=NaN,this.an=NaN,this.on=NaN,this.nn=null,this.Mn()}Pn(t){return null!==this.nn?[this.wn,this.dn]:[]}Yt(t){return t===this.nn&&this.cn.horzLine.visible}Xt(){return this.cn.vertLine.visible}Rn(t,i){this.rn&&this.nn===t||this.hn.clear();const n=[];return this.nn===t&&n.push(this.Dn(this.hn,i,this.fn)),n}tn(){return this.rn?[this.bn]:[]}Ut(){return this.nn}On(){this.wn.gt(),this.hn.forEach((t=>t.gt())),this.bn.gt(),this.dn.gt()}An(t){return t&&!t.vn().Fi()?t.vn():null}yn(t,i,n){this.Vn(t,i,n)&&this.On()}Vn(t,i,n){const s=this.an,e=this.on,r=this.sn,h=this.en,l=this.nn,a=this.An(n);this.en=t,this.an=isNaN(t)?NaN:this.Ui.yt().Et(t),this.nn=n;const o=null!==a?a.Pt():null;return null!==a&&null!==o?(this.sn=i,this.on=a.Ot(i,o)):(this.sn=NaN,this.on=NaN),s!==this.an||e!==this.on||h!==this.en||r!==this.sn||l!==this.nn}Tn(){const t=this.Ui.Mt().map((t=>t.In().Bn())).filter(V),i=0===t.length?null:Math.max(...t);this.en=null!==i?i:NaN}Dn(t,i,n){let s=t.get(i);return void 0===s&&(s=new it(this,i,n),t.set(i,s)),s}}function at(t){return"left"===t||"right"===t}class ot{constructor(t){this.zn=new Map,this.En=[],this.Ln=t}Nn(t,i){const n=function(t,i){return void 0===t?i:{Fn:Math.max(t.Fn,i.Fn),Wn:t.Wn||i.Wn}}(this.zn.get(t),i);this.zn.set(t,n)}jn(){return this.Ln}Hn(t){const i=this.zn.get(t);return void 0===i?{Fn:this.Ln}:{Fn:Math.max(this.Ln,i.Fn),Wn:i.Wn}}$n(){this.Un(),this.En=[{qn:0}]}Yn(t){this.Un(),this.En=[{qn:1,Vt:t}]}Xn(t){this.Kn(),this.En.push({qn:5,Vt:t})}Un(){this.Kn(),this.En.push({qn:6})}Zn(){this.Un(),this.En=[{qn:4}]}Gn(t){this.Un(),this.En.push({qn:2,Vt:t})}Jn(t){this.Un(),this.En.push({qn:3,Vt:t})}Qn(){return this.En}ts(t){for(const i of t.En)this.ns(i);this.Ln=Math.max(this.Ln,t.Ln),t.zn.forEach(((t,i)=>{this.Nn(i,t)}))}static ss(){return new ot(2)}static es(){return new ot(3)}ns(t){switch(t.qn){case 0:this.$n();break;case 1:this.Yn(t.Vt);break;case 2:this.Gn(t.Vt);break;case 3:this.Jn(t.Vt);break;case 4:this.Zn();break;case 5:this.Xn(t.Vt);break;case 6:this.Kn()}}Kn(){const t=this.En.findIndex((t=>5===t.qn));-1!==t&&this.En.splice(t,1)}}const _t=".";function ut(t,i){if(!P(t))return"n/a";if(!R(i))throw new TypeError("invalid length");if(i<0||i>16)throw new TypeError("invalid length");if(0===i)return t.toString();return("0000000000000000"+t.toString()).slice(-i)}class ct{constructor(t,i){if(i||(i=1),P(t)&&R(t)||(t=100),t<0)throw new TypeError("invalid base");this.Li=t,this.rs=i,this.hs()}format(t){const i=t<0?"−":"";return t=Math.abs(t),i+this.ls(t)}hs(){if(this.os=0,this.Li>0&&this.rs>0){let t=this.Li;for(;t>1;)t/=10,this.os++}}ls(t){const i=this.Li/this.rs;let n=Math.floor(t),s="";const e=void 0!==this.os?this.os:NaN;if(i>1){let r=+(Math.round(t*i)-n*i).toFixed(this.os);r>=i&&(r-=i,n+=1),s=_t+ut(+r.toFixed(this.os)*this.rs,e)}else n=Math.round(n*i)/i,e>0&&(s=_t+ut(0,e));return n.toFixed(0)+s}}class dt extends ct{constructor(t=100){super(t)}format(t){return`${super.format(t)}%`}}class ft{constructor(t){this._s=t}format(t){let i="";return t<0&&(i="-",t=-t),t<995?i+this.us(t):t<999995?i+this.us(t/1e3)+"K":t<999999995?(t=1e3*Math.round(t/1e3),i+this.us(t/1e6)+"M"):(t=1e6*Math.round(t/1e6),i+this.us(t/1e9)+"B")}us(t){let i;const n=Math.pow(10,this._s);return i=(t=Math.round(t*n)/n)>=1e-15&&t<1?t.toFixed(this._s).replace(/\.?0+$/,""):String(t),i.replace(/(\.[1-9]*)0+$/,((t,i)=>i))}}function vt(t,i,n,s,e,r,h){if(0===i.length||s.from>=i.length||s.to<=0)return;const{context:l,horizontalPixelRatio:a,verticalPixelRatio:o}=t,_=i[s.from];let u=r(t,_),c=_;if(s.to-s.from<2){const i=e/2;l.beginPath();const n={et:_.et-i,rt:_.rt},s={et:_.et+i,rt:_.rt};l.moveTo(n.et*a,n.rt*o),l.lineTo(s.et*a,s.rt*o),h(t,u,n,s)}else{const e=(i,n)=>{h(t,u,c,n),l.beginPath(),u=i,c=n};let d=c;l.beginPath(),l.moveTo(_.et*a,_.rt*o);for(let h=s.from+1;h=s.from;--n){const s=i[n];if(s){const i=e(t,s);i!==a&&(l.beginPath(),null!==a&&l.fill(),l.fillStyle=i,a=i);const n=Math.round(s.et*r)+o,u=s.rt*h;l.moveTo(n,u),l.arc(n,u,_,0,2*Math.PI)}}l.fill()}(t,i,l,n,o)}}class Rt extends Pt{Ds(t,i){return i._t}}function Dt(t,i,n,s,e=0,r=i.length){let h=r-e;for(;0>1,l=e+r;s(i[l],n)===t?(e=l+1,h-=r+1):h=r}return e}const Ot=Dt.bind(null,!0),At=Dt.bind(null,!1);function Vt(t,i){return t.ut0&&r=s&&(l=r-1),h>0&&hObject.assign(Object.assign({},t),this.Es.$s().Hs(t.ut))))}Us(){this.zs=null}Fs(){this.Vs&&(this.qs(),this.Vs=!1),this.Bs&&(this.js(),this.Bs=!1),this.As&&(this.Ys(),this.As=!1)}Ys(){const t=this.Es.At(),i=this.Ls.yt();if(this.Us(),i.Fi()||t.Fi())return;const n=i.Xs();if(null===n)return;if(0===this.Es.In().Ks())return;const s=this.Es.Pt();null!==s&&(this.zs=It(this.Is,n,this.Ns),this.Zs(t,i,s.Vt),this.Gs())}}class Et extends zt{constructor(t,i){super(t,i,!0)}Zs(t,i,n){i.Js(this.Is,B(this.zs)),t.Qs(this.Is,n,B(this.zs))}te(t,i){return{ut:t,ct:i,et:NaN,rt:NaN}}qs(){const t=this.Es.$s();this.Is=this.Es.In().ie().map((i=>{const n=i.Vt[3];return this.ne(i.se,n,t)}))}}class Lt extends Et{constructor(t,i){super(t,i),this.Ws=new L,this.ee=new Ct,this.re=new Rt,this.Ws.X([this.ee,this.re])}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Es.W();this.ee.it({ds:t.lineType,st:this.Is,Wt:t.lineStyle,ht:t.lineWidth,fs:null,vs:t.invertFilledArea,nt:this.zs,cs:this.Ls.yt().he()}),this.re.it({ds:t.lineVisible?t.lineType:void 0,st:this.Is,Wt:t.lineStyle,ht:t.lineWidth,nt:this.zs,cs:this.Ls.yt().he(),Rs:t.pointMarkersVisible?t.pointMarkersRadius||t.lineWidth/2+2:void 0})}}class Nt extends ${constructor(){super(...arguments),this.Lt=null,this.le=0,this.ae=0}it(t){this.Lt=t}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.Lt||0===this.Lt.In.length||null===this.Lt.nt)return;if(this.le=this.oe(i),this.le>=2){Math.max(1,Math.floor(i))%2!=this.le%2&&this.le--}this.ae=this.Lt._e?Math.min(this.le,Math.floor(i)):this.le;let s=null;const e=this.ae<=this.le&&this.Lt.he>=Math.floor(1.5*i);for(let r=this.Lt.nt.from;rf+p-1&&(e=f+p-1,s=e-_+1),t.fillRect(i,s,o-i,e-s+1)}const i=a+m;let s=Math.max(f,Math.round(h.pe*n)-l),e=s+_-1;e>f+p-1&&(e=f+p-1,s=e-_+1),t.fillRect(u+1,s,i-u,e-s+1)}}}oe(t){const i=Math.floor(t);return Math.max(i,Math.floor(function(t,i){return Math.floor(.3*t*i)}(v(this.Lt).he,t)))}}class Ft extends zt{constructor(t,i){super(t,i,!1)}Zs(t,i,n){i.Js(this.Is,B(this.zs)),t.me(this.Is,n,B(this.zs))}be(t,i,n){return{ut:t,we:i.Vt[0],ge:i.Vt[1],Me:i.Vt[2],xe:i.Vt[3],et:NaN,ve:NaN,ce:NaN,de:NaN,pe:NaN}}qs(){const t=this.Es.$s();this.Is=this.Es.In().ie().map((i=>this.ne(i.se,i,t)))}}class Wt extends Ft{constructor(){super(...arguments),this.Ws=new Nt}ne(t,i,n){return Object.assign(Object.assign({},this.be(t,i,n)),n.Hs(t))}Gs(){const t=this.Es.W();this.Ws.it({In:this.Is,he:this.Ls.yt().he(),fe:t.openVisible,_e:t.thinBars,nt:this.zs})}}class jt extends Mt{constructor(){super(...arguments),this.Cs=new yt}ps(t,i){const n=this.tt;return this.Cs.bs(t,{gs:i.Se,Ms:i.ke,xs:i.ye,Ss:i.Ce,ks:t.bitmapSize.height,fs:n.fs})}}class Ht extends Pt{constructor(){super(...arguments),this.Te=new yt}Ds(t,i){const n=this.tt;return this.Te.bs(t,{gs:i.Pe,Ms:i.Pe,xs:i.Re,Ss:i.Re,ks:t.bitmapSize.height,fs:n.fs})}}class $t extends Et{constructor(t,i){super(t,i),this.Ws=new L,this.De=new jt,this.Oe=new Ht,this.Ws.X([this.De,this.Oe])}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Es.Pt();if(null===t)return;const i=this.Es.W(),n=this.Es.At().Ot(i.baseValue.price,t.Vt),s=this.Ls.yt().he();this.De.it({st:this.Is,ht:i.lineWidth,Wt:i.lineStyle,ds:i.lineType,fs:n,vs:!1,nt:this.zs,cs:s}),this.Oe.it({st:this.Is,ht:i.lineWidth,Wt:i.lineStyle,ds:i.lineVisible?i.lineType:void 0,Rs:i.pointMarkersVisible?i.pointMarkersRadius||i.lineWidth/2+2:void 0,fs:n,nt:this.zs,cs:s})}}class Ut extends ${constructor(){super(...arguments),this.Lt=null,this.le=0}it(t){this.Lt=t}Z(t){if(null===this.Lt||0===this.Lt.In.length||null===this.Lt.nt)return;const{horizontalPixelRatio:i}=t;if(this.le=function(t,i){if(t>=2.5&&t<=4)return Math.floor(3*i);const n=1-.2*Math.atan(Math.max(4,t)-4)/(.5*Math.PI),s=Math.floor(t*n*i),e=Math.floor(t*i),r=Math.min(s,e);return Math.max(Math.floor(i),r)}(this.Lt.he,i),this.le>=2){Math.floor(i)%2!=this.le%2&&this.le--}const n=this.Lt.In;this.Lt.Ae&&this.Ve(t,n,this.Lt.nt),this.Lt.ci&&this.Be(t,n,this.Lt.nt);const s=this.Ie(i);(!this.Lt.ci||this.le>2*s)&&this.ze(t,n,this.Lt.nt)}Ve(t,i,n){if(null===this.Lt)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="",l=Math.min(Math.floor(e),Math.floor(this.Lt.he*e));l=Math.max(Math.floor(e),Math.min(l,this.le));const a=Math.floor(.5*l);let o=null;for(let t=n.from;t2*l)Y(s,o,u,_-o+1,c-u+1,l);else{const t=_-o+1;s.fillRect(o,u,t,c-u+1)}a=_}}ze(t,i,n){if(null===this.Lt)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="";const l=this.Ie(e);for(let t=n.from;to||s.fillRect(_,a,u-_+1,o-a+1)}}}class qt extends Ft{constructor(){super(...arguments),this.Ws=new Ut}ne(t,i,n){return Object.assign(Object.assign({},this.be(t,i,n)),n.Hs(t))}Gs(){const t=this.Es.W();this.Ws.it({In:this.Is,he:this.Ls.yt().he(),Ae:t.wickVisible,ci:t.borderVisible,nt:this.zs})}}class Yt{constructor(t,i){this.Ne=t,this.Li=i}K(t,i,n){this.Ne.draw(t,this.Li,i,n)}}class Xt extends zt{constructor(t,i,n){super(t,i,!1),this.wn=n,this.Ws=new Yt(this.wn.renderer(),(i=>{const n=t.Pt();return null===n?null:t.At().Ot(i,n.Vt)}))}Fe(t){return this.wn.priceValueBuilder(t)}We(t){return this.wn.isWhitespace(t)}qs(){const t=this.Es.$s();this.Is=this.Es.In().ie().map((i=>Object.assign(Object.assign({ut:i.se,et:NaN},t.Hs(i.se)),{je:i.He})))}Zs(t,i){i.Js(this.Is,B(this.zs))}Gs(){this.wn.update({bars:this.Is.map(Kt),barSpacing:this.Ls.yt().he(),visibleRange:this.zs},this.Es.W())}}function Kt(t){return{x:t.et,time:t.ut,originalData:t.je,barColor:t.ue}}class Zt extends ${constructor(){super(...arguments),this.Lt=null,this.$e=[]}it(t){this.Lt=t,this.$e=[]}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.Lt||0===this.Lt.st.length||null===this.Lt.nt)return;this.$e.length||this.Ue(i);const s=Math.max(1,Math.floor(n)),e=Math.round(this.Lt.qe*n)-Math.floor(s/2),r=e+s;for(let i=this.Lt.nt.from;is.Xe?s.di=n.Os-i-1:n.Os=s.di+i+1))}let s=Math.ceil(this.Lt.he*t);for(let t=this.Lt.nt.from;t0&&s<4)for(let t=this.Lt.nt.from;ts&&(i.Ye>i.Xe?i.di-=1:i.Os+=1)}}}class Gt extends Et{constructor(){super(...arguments),this.Ws=new Zt}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t={st:this.Is,he:this.Ls.yt().he(),nt:this.zs,qe:this.Es.At().Ot(this.Es.W().base,v(this.Es.Pt()).Vt)};this.Ws.it(t)}}class Jt extends Et{constructor(){super(...arguments),this.Ws=new Rt}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Es.W(),i={st:this.Is,Wt:t.lineStyle,ds:t.lineVisible?t.lineType:void 0,ht:t.lineWidth,Rs:t.pointMarkersVisible?t.pointMarkersRadius||t.lineWidth/2+2:void 0,nt:this.zs,cs:this.Ls.yt().he()};this.Ws.it(i)}}const Qt=/[2-9]/g;class ti{constructor(t=50){this.Ke=0,this.Ze=1,this.Ge=1,this.Je={},this.Qe=new Map,this.tr=t}ir(){this.Ke=0,this.Qe.clear(),this.Ze=1,this.Ge=1,this.Je={}}Si(t,i,n){return this.nr(t,i,n).width}xi(t,i,n){const s=this.nr(t,i,n);return((s.actualBoundingBoxAscent||0)-(s.actualBoundingBoxDescent||0))/2}nr(t,i,n){const s=n||Qt,e=String(i).replace(s,"0");if(this.Qe.has(e))return f(this.Qe.get(e)).sr;if(this.Ke===this.tr){const t=this.Je[this.Ge];delete this.Je[this.Ge],this.Qe.delete(t),this.Ge++,this.Ke--}t.save(),t.textBaseline="middle";const r=t.measureText(e);return t.restore(),0===r.width&&i.length||(this.Qe.set(e,{sr:r,er:this.Ze}),this.Je[this.Ze]=e,this.Ke++,this.Ze++),r}}class ii{constructor(t){this.rr=null,this.k=null,this.hr="right",this.lr=t}ar(t,i,n){this.rr=t,this.k=i,this.hr=n}K(t){null!==this.k&&null!==this.rr&&this.rr.K(t,this.k,this.lr,this.hr)}}class ni{constructor(t,i,n){this._r=t,this.lr=new ti(50),this.ur=i,this.F=n,this.j=-1,this.Ht=new ii(this.lr)}xt(){const t=this.F.cr(this.ur);if(null===t)return null;const i=t.dr(this.ur)?t.vr():this.ur.At();if(null===i)return null;const n=t.pr(i);if("overlay"===n)return null;const s=this.F.mr();return s.P!==this.j&&(this.j=s.P,this.lr.ir()),this.Ht.ar(this._r.zi(),s,n),this.Ht}}class si extends ${constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}br(t,i){var n;if(!(null===(n=this.Lt)||void 0===n?void 0:n.Tt))return null;const{rt:s,ht:e,wr:r}=this.Lt;return i>=s-e-7&&i<=s+e+7?{gr:this.Lt,wr:r}:null}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;if(!1===this.Lt.Tt)return;const e=Math.round(this.Lt.rt*s);e<0||e>i.height||(t.lineCap="butt",t.strokeStyle=this.Lt.O,t.lineWidth=Math.floor(this.Lt.ht*n),u(t,this.Lt.Wt),c(t,e,0,i.width))}}class ei{constructor(t){this.Mr={rt:0,O:"rgba(0, 0, 0, 0)",ht:1,Wt:0,Tt:!1},this.Sr=new si,this.bt=!0,this.Es=t,this.Ls=t.qt(),this.Sr.it(this.Mr)}gt(){this.bt=!0}xt(){return this.Es.Tt()?(this.bt&&(this.kr(),this.bt=!1),this.Sr):null}}class ri extends ei{constructor(t){super(t)}kr(){this.Mr.Tt=!1;const t=this.Es.At(),i=t.yr().yr;if(2!==i&&3!==i)return;const n=this.Es.W();if(!n.baseLineVisible||!this.Es.Tt())return;const s=this.Es.Pt();null!==s&&(this.Mr.Tt=!0,this.Mr.rt=t.Ot(s.Vt,s.Vt),this.Mr.O=n.baseLineColor,this.Mr.ht=n.baseLineWidth,this.Mr.Wt=n.baseLineStyle)}}class hi extends ${constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}He(){return this.Lt}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){const s=this.Lt;if(null===s)return;const e=Math.max(1,Math.floor(i)),r=e%2/2,h=Math.round(s.Xe.x*i)+r,l=s.Xe.y*n;t.fillStyle=s.Cr,t.beginPath();const a=Math.max(2,1.5*s.Tr)*i;t.arc(h,l,a,0,2*Math.PI,!1),t.fill(),t.fillStyle=s.Pr,t.beginPath(),t.arc(h,l,s.ot*i,0,2*Math.PI,!1),t.fill(),t.lineWidth=e,t.strokeStyle=s.Rr,t.beginPath(),t.arc(h,l,s.ot*i+e/2,0,2*Math.PI,!1),t.stroke()}}const li=[{Dr:0,Or:.25,Ar:4,Vr:10,Br:.25,Ir:0,zr:.4,Er:.8},{Dr:.25,Or:.525,Ar:10,Vr:14,Br:0,Ir:0,zr:.8,Er:0},{Dr:.525,Or:1,Ar:14,Vr:14,Br:0,Ir:0,zr:0,Er:0}];function ai(t,i,n,s){return function(t,i){if("transparent"===t)return t;const n=k(t),s=n[3];return`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${i*s})`}(t,n+(s-n)*i)}function oi(t,i){const n=t%2600/2600;let s;for(const t of li)if(n>=t.Dr&&n<=t.Or){s=t;break}d(void 0!==s,"Last price animation internal logic error");const e=(n-s.Dr)/(s.Or-s.Dr);return{Pr:ai(i,e,s.Br,s.Ir),Rr:ai(i,e,s.zr,s.Er),ot:(r=e,h=s.Ar,l=s.Vr,h+(l-h)*r)};var r,h,l}class _i{constructor(t){this.Ht=new hi,this.bt=!0,this.Lr=!0,this.Nr=performance.now(),this.Fr=this.Nr-1,this.Wr=t}jr(){this.Fr=this.Nr-1,this.gt()}Hr(){if(this.gt(),2===this.Wr.W().lastPriceAnimation){const t=performance.now(),i=this.Fr-t;if(i>0)return void(i<650&&(this.Fr+=2600));this.Nr=t,this.Fr=t+2600}}gt(){this.bt=!0}$r(){this.Lr=!0}Tt(){return 0!==this.Wr.W().lastPriceAnimation}Ur(){switch(this.Wr.W().lastPriceAnimation){case 0:return!1;case 1:return!0;case 2:return performance.now()<=this.Fr}}xt(){return this.bt?(this.St(),this.bt=!1,this.Lr=!1):this.Lr&&(this.qr(),this.Lr=!1),this.Ht}St(){this.Ht.it(null);const t=this.Wr.qt().yt(),i=t.Xs(),n=this.Wr.Pt();if(null===i||null===n)return;const s=this.Wr.Yr(!0);if(s.Xr||!i.Kr(s.se))return;const e={x:t.Et(s.se),y:this.Wr.At().Ot(s.ct,n.Vt)},r=s.O,h=this.Wr.W().lineWidth,l=oi(this.Zr(),r);this.Ht.it({Cr:r,Tr:h,Pr:l.Pr,Rr:l.Rr,ot:l.ot,Xe:e})}qr(){const t=this.Ht.He();if(null!==t){const i=oi(this.Zr(),t.Cr);t.Pr=i.Pr,t.Rr=i.Rr,t.ot=i.ot}}Zr(){return this.Ur()?performance.now()-this.Nr:2599}}function ui(t,i){return kt(Math.min(Math.max(t,12),30)*i)}function ci(t,i){switch(t){case"arrowDown":case"arrowUp":return ui(i,1);case"circle":return ui(i,.8);case"square":return ui(i,.7)}}function di(t){return function(t){const i=Math.ceil(t);return i%2!=0?i-1:i}(ui(t,1))}function fi(t){return Math.max(ui(t,.1),3)}function vi(t,i,n,s,e){const r=ci("square",n),h=(r-1)/2,l=t-h,a=i-h;return s>=l&&s<=l+r&&e>=a&&e<=a+r}function pi(t,i,n,s,e){const r=(ci("arrowUp",e)-1)/2,h=(kt(e/2)-1)/2;i.beginPath(),t?(i.moveTo(n-r,s),i.lineTo(n,s-r),i.lineTo(n+r,s),i.lineTo(n+h,s),i.lineTo(n+h,s+r),i.lineTo(n-h,s+r),i.lineTo(n-h,s)):(i.moveTo(n-r,s),i.lineTo(n,s+r),i.lineTo(n+r,s),i.lineTo(n+h,s),i.lineTo(n+h,s-r),i.lineTo(n-h,s-r),i.lineTo(n-h,s)),i.fill()}function mi(t,i,n,s,e,r){return vi(i,n,s,e,r)}class bi extends N{constructor(){super(...arguments),this.Lt=null,this.lr=new ti,this.j=-1,this.H="",this.Gr=""}it(t){this.Lt=t}ar(t,i){this.j===t&&this.H===i||(this.j=t,this.H=i,this.Gr=z(t,i),this.lr.ir())}br(t,i){if(null===this.Lt||null===this.Lt.nt)return null;for(let n=this.Lt.nt.from;n=t&&e<=t+n&&r>=i-h&&r<=i+h}(t.Jt.et,t.Jt.rt,t.Jt.$i,t.Jt.zt,i,n))||function(t,i,n){if(0===t.Ks)return!1;switch(t.th){case"arrowDown":case"arrowUp":return mi(0,t.et,t.rt,t.Ks,i,n);case"circle":return function(t,i,n,s,e){const r=2+ci("circle",n)/2,h=t-s,l=i-e;return Math.sqrt(h*h+l*l)<=r}(t.et,t.rt,t.Ks,i,n);case"square":return vi(t.et,t.rt,t.Ks,i,n)}}(t,i,n)}function Mi(t,i,n,s,e,r,h,l,a){const o=P(n)?n:n.xe,_=P(n)?n:n.ge,u=P(n)?n:n.Me,c=P(i.size)?Math.max(i.size,0):1,d=di(l.he())*c,f=d/2;switch(t.Ks=d,i.position){case"inBar":return t.rt=h.Ot(o,a),void(void 0!==t.Jt&&(t.Jt.rt=t.rt+f+r+.6*e));case"aboveBar":return t.rt=h.Ot(_,a)-f-s.ih,void 0!==t.Jt&&(t.Jt.rt=t.rt-f-.6*e,s.ih+=1.2*e),void(s.ih+=d+r);case"belowBar":return t.rt=h.Ot(u,a)+f+s.nh,void 0!==t.Jt&&(t.Jt.rt=t.rt+f+r+.6*e,s.nh+=1.2*e),void(s.nh+=d+r)}i.position}class xi{constructor(t,i){this.bt=!0,this.sh=!0,this.eh=!0,this.rh=null,this.Ht=new bi,this.Wr=t,this.Ui=i,this.Lt={st:[],nt:null}}gt(t){this.bt=!0,this.eh=!0,"data"===t&&(this.sh=!0)}xt(t){if(!this.Wr.Tt())return null;this.bt&&this.hh();const i=this.Ui.W().layout;return this.Ht.ar(i.fontSize,i.fontFamily),this.Ht.it(this.Lt),this.Ht}lh(){if(this.eh){if(this.Wr.ah().length>0){const t=this.Ui.yt().he(),i=fi(t),n=1.5*di(t)+2*i;this.rh={above:n,below:n}}else this.rh=null;this.eh=!1}return this.rh}hh(){const t=this.Wr.At(),i=this.Ui.yt(),n=this.Wr.ah();this.sh&&(this.Lt.st=n.map((t=>({ut:t.time,et:0,rt:0,Ks:0,th:t.shape,O:t.color,Jr:t.Jr,wr:t.id,Jt:void 0}))),this.sh=!1);const s=this.Ui.W().layout;this.Lt.nt=null;const e=i.Xs();if(null===e)return;const r=this.Wr.Pt();if(null===r)return;if(0===this.Lt.st.length)return;let h=NaN;const l=fi(i.he()),a={ih:l,nh:l};this.Lt.nt=It(this.Lt.st,e,!0);for(let e=this.Lt.nt.from;e0&&(_.Jt={Qr:o.text,et:0,rt:0,$i:0,zt:0});const u=this.Wr.oh(o.time);null!==u&&Mi(_,o,u,a,s.fontSize,l,t,i,r.Vt)}this.bt=!1}}class Si extends ei{constructor(t){super(t)}kr(){const t=this.Mr;t.Tt=!1;const i=this.Es.W();if(!i.priceLineVisible||!this.Es.Tt())return;const n=this.Es.Yr(0===i.priceLineSource);n.Xr||(t.Tt=!0,t.rt=n.yi,t.O=this.Es._h(n.O),t.ht=i.priceLineWidth,t.Wt=i.priceLineStyle)}}class ki extends tt{constructor(t){super(),this.$t=t}Ei(t,i,n){t.Tt=!1,i.Tt=!1;const s=this.$t;if(!s.Tt())return;const e=s.W(),r=e.lastValueVisible,h=""!==s.uh(),l=0===e.seriesLastValueMode,a=s.Yr(!1);if(a.Xr)return;r&&(t.Jt=this.dh(a,r,l),t.Tt=0!==t.Jt.length),(h||l)&&(i.Jt=this.fh(a,r,h,l),i.Tt=i.Jt.length>0);const o=s._h(a.O),_=y(o);n.t=_.t,n.yi=a.yi,i.Bt=s.qt().It(a.yi/s.At().zt()),t.Bt=o,t.O=_.i,i.O=_.i}fh(t,i,n,s){let e="";const r=this.$t.uh();return n&&0!==r.length&&(e+=`${r} `),i&&s&&(e+=this.$t.At().ph()?t.mh:t.bh),e.trim()}dh(t,i,n){return i?n?this.$t.At().ph()?t.bh:t.mh:t.Jt:""}}function yi(t,i,n,s){const e=Number.isFinite(i),r=Number.isFinite(n);return e&&r?t(i,n):e||r?e?i:n:s}class Ci{constructor(t,i){this.wh=t,this.gh=i}Mh(t){return null!==t&&(this.wh===t.wh&&this.gh===t.gh)}xh(){return new Ci(this.wh,this.gh)}Sh(){return this.wh}kh(){return this.gh}yh(){return this.gh-this.wh}Fi(){return this.gh===this.wh||Number.isNaN(this.gh)||Number.isNaN(this.wh)}ts(t){return null===t?this:new Ci(yi(Math.min,this.Sh(),t.Sh(),-1/0),yi(Math.max,this.kh(),t.kh(),1/0))}Ch(t){if(!P(t))return;if(0===this.gh-this.wh)return;const i=.5*(this.gh+this.wh);let n=this.gh-i,s=this.wh-i;n*=t,s*=t,this.gh=i+n,this.wh=i+s}Th(t){P(t)&&(this.gh+=t,this.wh+=t)}Ph(){return{minValue:this.wh,maxValue:this.gh}}static Rh(t){return null===t?null:new Ci(t.minValue,t.maxValue)}}class Ti{constructor(t,i){this.Dh=t,this.Oh=i||null}Ah(){return this.Dh}Vh(){return this.Oh}Ph(){return null===this.Dh?null:{priceRange:this.Dh.Ph(),margins:this.Oh||void 0}}static Rh(t){return null===t?null:new Ti(Ci.Rh(t.priceRange),t.margins)}}class Pi extends ei{constructor(t,i){super(t),this.Bh=i}kr(){const t=this.Mr;t.Tt=!1;const i=this.Bh.W();if(!this.Es.Tt()||!i.lineVisible)return;const n=this.Bh.Ih();null!==n&&(t.Tt=!0,t.rt=n,t.O=i.color,t.ht=i.lineWidth,t.Wt=i.lineStyle,t.wr=this.Bh.W().id)}}class Ri extends tt{constructor(t,i){super(),this.Wr=t,this.Bh=i}Ei(t,i,n){t.Tt=!1,i.Tt=!1;const s=this.Bh.W(),e=s.axisLabelVisible,r=""!==s.title,h=this.Wr;if(!e||!h.Tt())return;const l=this.Bh.Ih();if(null===l)return;r&&(i.Jt=s.title,i.Tt=!0),i.Bt=h.qt().It(l/h.At().zt()),t.Jt=this.zh(s.price),t.Tt=!0;const a=y(s.axisLabelColor||s.color);n.t=a.t;const o=s.axisLabelTextColor||a.i;t.O=o,i.O=o,n.yi=l}zh(t){const i=this.Wr.Pt();return null===i?"":this.Wr.At().Wi(t,i.Vt)}}class Di{constructor(t,i){this.Wr=t,this.cn=i,this.Eh=new Pi(t,this),this._r=new Ri(t,this),this.Lh=new ni(this._r,t,t.qt())}Nh(t){T(this.cn,t),this.gt(),this.Wr.qt().Fh()}W(){return this.cn}Wh(){return this.Eh}jh(){return this.Lh}Hh(){return this._r}gt(){this.Eh.gt(),this._r.gt()}Ih(){const t=this.Wr,i=t.At();if(t.qt().yt().Fi()||i.Fi())return null;const n=t.Pt();return null===n?null:i.Ot(this.cn.price,n.Vt)}}class Oi extends rt{constructor(t){super(),this.Ui=t}qt(){return this.Ui}}const Ai={Bar:(t,i,n,s)=>{var e;const r=i.upColor,h=i.downColor,l=v(t(n,s)),a=p(l.Vt[0])<=p(l.Vt[3]);return{ue:null!==(e=l.O)&&void 0!==e?e:a?r:h}},Candlestick:(t,i,n,s)=>{var e,r,h;const l=i.upColor,a=i.downColor,o=i.borderUpColor,_=i.borderDownColor,u=i.wickUpColor,c=i.wickDownColor,d=v(t(n,s)),f=p(d.Vt[0])<=p(d.Vt[3]);return{ue:null!==(e=d.O)&&void 0!==e?e:f?l:a,Le:null!==(r=d.Bt)&&void 0!==r?r:f?o:_,Ee:null!==(h=d.$h)&&void 0!==h?h:f?u:c}},Custom:(t,i,n,s)=>{var e;return{ue:null!==(e=v(t(n,s)).O)&&void 0!==e?e:i.color}},Area:(t,i,n,s)=>{var e,r,h,l;const a=v(t(n,s));return{ue:null!==(e=a._t)&&void 0!==e?e:i.lineColor,_t:null!==(r=a._t)&&void 0!==r?r:i.lineColor,Ts:null!==(h=a.Ts)&&void 0!==h?h:i.topColor,Ps:null!==(l=a.Ps)&&void 0!==l?l:i.bottomColor}},Baseline:(t,i,n,s)=>{var e,r,h,l,a,o;const _=v(t(n,s));return{ue:_.Vt[3]>=i.baseValue.price?i.topLineColor:i.bottomLineColor,Pe:null!==(e=_.Pe)&&void 0!==e?e:i.topLineColor,Re:null!==(r=_.Re)&&void 0!==r?r:i.bottomLineColor,Se:null!==(h=_.Se)&&void 0!==h?h:i.topFillColor1,ke:null!==(l=_.ke)&&void 0!==l?l:i.topFillColor2,ye:null!==(a=_.ye)&&void 0!==a?a:i.bottomFillColor1,Ce:null!==(o=_.Ce)&&void 0!==o?o:i.bottomFillColor2}},Line:(t,i,n,s)=>{var e,r;const h=v(t(n,s));return{ue:null!==(e=h.O)&&void 0!==e?e:i.color,_t:null!==(r=h.O)&&void 0!==r?r:i.color}},Histogram:(t,i,n,s)=>{var e;return{ue:null!==(e=v(t(n,s)).O)&&void 0!==e?e:i.color}}};class Vi{constructor(t){this.Uh=(t,i)=>void 0!==i?i.Vt:this.Wr.In().qh(t),this.Wr=t,this.Yh=Ai[t.Xh()]}Hs(t,i){return this.Yh(this.Uh,this.Wr.W(),t,i)}}var Bi;exports.MismatchDirection=void 0,(Bi=exports.MismatchDirection||(exports.MismatchDirection={}))[Bi.NearestLeft=-1]="NearestLeft",Bi[Bi.None=0]="None",Bi[Bi.NearestRight=1]="NearestRight";const Ii=30;class zi{constructor(){this.Kh=[],this.Zh=new Map,this.Gh=new Map}Jh(){return this.Ks()>0?this.Kh[this.Kh.length-1]:null}Qh(){return this.Ks()>0?this.tl(0):null}Bn(){return this.Ks()>0?this.tl(this.Kh.length-1):null}Ks(){return this.Kh.length}Fi(){return 0===this.Ks()}Kr(t){return null!==this.il(t,0)}qh(t){return this.nl(t)}nl(t,i=0){const n=this.il(t,i);return null===n?null:Object.assign(Object.assign({},this.sl(n)),{se:this.tl(n)})}ie(){return this.Kh}el(t,i,n){if(this.Fi())return null;let s=null;for(const e of n){s=Ei(s,this.rl(t,i,e))}return s}it(t){this.Gh.clear(),this.Zh.clear(),this.Kh=t}tl(t){return this.Kh[t].se}sl(t){return this.Kh[t]}il(t,i){const n=this.hl(t);if(null===n&&0!==i)switch(i){case-1:return this.ll(t);case 1:return this.al(t);default:throw new TypeError("Unknown search mode")}return n}ll(t){let i=this.ol(t);return i>0&&(i-=1),i!==this.Kh.length&&this.tl(i)t.set.se>i))}ul(t,i,n){let s=null;for(let e=t;es.dl&&(s.dl=t)))}return s}rl(t,i,n){if(this.Fi())return null;let s=null;const e=v(this.Qh()),r=v(this.Bn()),h=Math.max(t,e),l=Math.min(i,r),a=Math.ceil(h/Ii)*Ii,o=Math.max(a,Math.floor(l/Ii)*Ii);{const t=this.ol(h),e=this._l(Math.min(l,a,i));s=Ei(s,this.ul(t,e,n))}let _=this.Zh.get(n);void 0===_&&(_=new Map,this.Zh.set(n,_));for(let t=Math.max(a+1,h);tnew Ni(t)));return this.gl={vl:e,pl:r},r}tn(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.yl).timeAxisViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.Ml)||void 0===s?void 0:s.vl)===e)return this.Ml.pl;const r=this.Wr.qt().yt(),h=e.map((t=>new Wi(t,r)));return this.Ml={vl:e,pl:h},h}Rn(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.yl).priceAxisViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.xl)||void 0===s?void 0:s.vl)===e)return this.xl.pl;const r=this.Wr.At(),h=e.map((t=>new ji(t,r)));return this.xl={vl:e,pl:h},h}Tl(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.yl).priceAxisPaneViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.Sl)||void 0===s?void 0:s.vl)===e)return this.Sl.pl;const r=e.map((t=>new Ni(t)));return this.Sl={vl:e,pl:r},r}Pl(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.yl).timeAxisPaneViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.kl)||void 0===s?void 0:s.vl)===e)return this.kl.pl;const r=e.map((t=>new Ni(t)));return this.kl={vl:e,pl:r},r}Rl(t,i){var n,s,e;return null!==(e=null===(s=(n=this.yl).autoscaleInfo)||void 0===s?void 0:s.call(n,t,i))&&void 0!==e?e:null}br(t,i){var n,s,e;return null!==(e=null===(s=(n=this.yl).hitTest)||void 0===s?void 0:s.call(n,t,i))&&void 0!==e?e:null}}function $i(t,i,n,s){t.forEach((t=>{i(t).forEach((t=>{t.ml()===n&&s.push(t)}))}))}function Ui(t){return t.Pn()}function qi(t){return t.Tl()}function Yi(t){return t.Pl()}class Xi extends Oi{constructor(t,i,n,s,e){super(t),this.Lt=new zi,this.Eh=new Si(this),this.Dl=[],this.Ol=new ri(this),this.Al=null,this.Vl=null,this.Bl=[],this.Il=[],this.zl=null,this.El=[],this.cn=i,this.Ll=n;const r=new ki(this);this.hn=[r],this.Lh=new ni(r,this,t),"Area"!==n&&"Line"!==n&&"Baseline"!==n||(this.Al=new _i(this)),this.Nl(),this.Fl(e)}S(){null!==this.zl&&clearTimeout(this.zl)}_h(t){return this.cn.priceLineColor||t}Yr(t){const i={Xr:!0},n=this.At();if(this.qt().yt().Fi()||n.Fi()||this.Lt.Fi())return i;const s=this.qt().yt().Xs(),e=this.Pt();if(null===s||null===e)return i;let r,h;if(t){const t=this.Lt.Jh();if(null===t)return i;r=t,h=t.se}else{const t=this.Lt.nl(s.di(),-1);if(null===t)return i;if(r=this.Lt.qh(t.se),null===r)return i;h=t.se}const l=r.Vt[3],a=this.$s().Hs(h,{Vt:r}),o=n.Ot(l,e.Vt);return{Xr:!1,ct:l,Jt:n.Wi(l,e.Vt),mh:n.Wl(l),bh:n.jl(l,e.Vt),O:a.ue,yi:o,se:h}}$s(){return null!==this.Vl||(this.Vl=new Vi(this)),this.Vl}W(){return this.cn}Nh(t){const i=t.priceScaleId;void 0!==i&&i!==this.cn.priceScaleId&&this.qt().Hl(this,i),T(this.cn,t),void 0!==t.priceFormat&&(this.Nl(),this.qt().$l()),this.qt().Ul(this),this.qt().ql(),this.wn.gt("options")}it(t,i){this.Lt.it(t),this.Yl(),this.wn.gt("data"),this.dn.gt("data"),null!==this.Al&&(i&&i.Xl?this.Al.Hr():0===t.length&&this.Al.jr());const n=this.qt().cr(this);this.qt().Kl(n),this.qt().Ul(this),this.qt().ql(),this.qt().Fh()}Zl(t){this.Bl=t,this.Yl();const i=this.qt().cr(this);this.dn.gt("data"),this.qt().Kl(i),this.qt().Ul(this),this.qt().ql(),this.qt().Fh()}Gl(){return this.Bl}ah(){return this.Il}Jl(t){const i=new Di(this,t);return this.Dl.push(i),this.qt().Ul(this),i}Ql(t){const i=this.Dl.indexOf(t);-1!==i&&this.Dl.splice(i,1),this.qt().Ul(this)}Xh(){return this.Ll}Pt(){const t=this.ta();return null===t?null:{Vt:t.Vt[3],ia:t.ut}}ta(){const t=this.qt().yt().Xs();if(null===t)return null;const i=t.Os();return this.Lt.nl(i,1)}In(){return this.Lt}oh(t){const i=this.Lt.qh(t);return null===i?null:"Bar"===this.Ll||"Candlestick"===this.Ll||"Custom"===this.Ll?{we:i.Vt[0],ge:i.Vt[1],Me:i.Vt[2],xe:i.Vt[3]}:i.Vt[3]}na(t){const i=[];$i(this.El,Ui,"top",i);const n=this.Al;return null!==n&&n.Tt()?(null===this.zl&&n.Ur()&&(this.zl=setTimeout((()=>{this.zl=null,this.qt().sa()}),0)),n.$r(),i.push(n),i):i}Pn(){const t=[];this.ea()||t.push(this.Ol),t.push(this.wn,this.Eh,this.dn);const i=this.Dl.map((t=>t.Wh()));return t.push(...i),$i(this.El,Ui,"normal",t),t}ra(){return this.ha(Ui,"bottom")}la(t){return this.ha(qi,t)}aa(t){return this.ha(Yi,t)}oa(t,i){return this.El.map((n=>n.br(t,i))).filter((t=>null!==t))}Qi(t){return[this.Lh,...this.Dl.map((t=>t.jh()))]}Rn(t,i){if(i!==this.Xi&&!this.ea())return[];const n=[...this.hn];for(const t of this.Dl)n.push(t.Hh());return this.El.forEach((t=>{n.push(...t.Rn())})),n}tn(){const t=[];return this.El.forEach((i=>{t.push(...i.tn())})),t}Rl(t,i){if(void 0!==this.cn.autoscaleInfoProvider){const n=this.cn.autoscaleInfoProvider((()=>{const n=this._a(t,i);return null===n?null:n.Ph()}));return Ti.Rh(n)}return this._a(t,i)}ua(){return this.cn.priceFormat.minMove}ca(){return this.da}On(){var t;this.wn.gt(),this.dn.gt();for(const t of this.hn)t.gt();for(const t of this.Dl)t.gt();this.Eh.gt(),this.Ol.gt(),null===(t=this.Al)||void 0===t||t.gt(),this.El.forEach((t=>t.On()))}At(){return v(super.At())}Ct(t){if(!(("Line"===this.Ll||"Area"===this.Ll||"Baseline"===this.Ll)&&this.cn.crosshairMarkerVisible))return null;const i=this.Lt.qh(t);if(null===i)return null;return{ct:i.Vt[3],ot:this.fa(),Bt:this.va(),Dt:this.pa(),Rt:this.ma(t)}}uh(){return this.cn.title}Tt(){return this.cn.visible}ba(t){this.El.push(new Hi(t,this))}wa(t){this.El=this.El.filter((i=>i.Cl()!==t))}ga(){if(this.wn instanceof Xt!=!1)return t=>this.wn.Fe(t)}Ma(){if(this.wn instanceof Xt!=!1)return t=>this.wn.We(t)}ea(){return!at(this.At().xa())}_a(t,i){if(!R(t)||!R(i)||this.Lt.Fi())return null;const n="Line"===this.Ll||"Area"===this.Ll||"Baseline"===this.Ll||"Histogram"===this.Ll?[3]:[2,1],s=this.Lt.el(t,i,n);let e=null!==s?new Ci(s.cl,s.dl):null;if("Histogram"===this.Xh()){const t=this.cn.base,i=new Ci(t,t);e=null!==e?e.ts(i):i}let r=this.dn.lh();return this.El.forEach((n=>{const s=n.Rl(t,i);if(null==s?void 0:s.priceRange){const t=new Ci(s.priceRange.minValue,s.priceRange.maxValue);e=null!==e?e.ts(t):t}var h,l,a,o;(null==s?void 0:s.margins)&&(h=r,l=s.margins,r={above:Math.max(null!==(a=null==h?void 0:h.above)&&void 0!==a?a:0,l.above),below:Math.max(null!==(o=null==h?void 0:h.below)&&void 0!==o?o:0,l.below)})})),new Ti(e,r)}fa(){switch(this.Ll){case"Line":case"Area":case"Baseline":return this.cn.crosshairMarkerRadius}return 0}va(){switch(this.Ll){case"Line":case"Area":case"Baseline":{const t=this.cn.crosshairMarkerBorderColor;if(0!==t.length)return t}}return null}pa(){switch(this.Ll){case"Line":case"Area":case"Baseline":return this.cn.crosshairMarkerBorderWidth}return 0}ma(t){switch(this.Ll){case"Line":case"Area":case"Baseline":{const t=this.cn.crosshairMarkerBackgroundColor;if(0!==t.length)return t}}return this.$s().Hs(t).ue}Nl(){switch(this.cn.priceFormat.type){case"custom":this.da={format:this.cn.priceFormat.formatter};break;case"volume":this.da=new ft(this.cn.priceFormat.precision);break;case"percent":this.da=new dt(this.cn.priceFormat.precision);break;default:{const t=Math.pow(10,this.cn.priceFormat.precision);this.da=new ct(t,this.cn.priceFormat.minMove*t)}}null!==this.Xi&&this.Xi.Sa()}Yl(){const t=this.qt().yt();if(!t.ka()||this.Lt.Fi())return void(this.Il=[]);const i=v(this.Lt.Qh());this.Il=this.Bl.map(((n,s)=>{const e=v(t.ya(n.time,!0)),r=et instanceof Xi)).reduce(((t,s)=>{if(n.dr(s)||!s.Tt())return t;const e=s.At(),r=s.In();if(e.Fi()||!r.Kr(i))return t;const h=r.qh(i);if(null===h)return t;const l=p(s.Pt());return t.concat([e.Ot(h.Vt[3],l.Vt)])}),[]);if(0===l.length)return s;l.sort(((t,i)=>Math.abs(t-h)-Math.abs(i-h)));const a=l[0];return s=e.pn(a,r),s}}class Zi extends ${constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;const e=Math.max(1,Math.floor(n));t.lineWidth=e,function(t,i){t.save(),t.lineWidth%2&&t.translate(.5,.5),i(),t.restore()}(t,(()=>{const r=v(this.Lt);if(r.Pa){t.strokeStyle=r.Ra,u(t,r.Da),t.beginPath();for(const s of r.Oa){const r=Math.round(s.Aa*n);t.moveTo(r,-e),t.lineTo(r,i.height+e)}t.stroke()}if(r.Va){t.strokeStyle=r.Ba,u(t,r.Ia),t.beginPath();for(const n of r.za){const r=Math.round(n.Aa*s);t.moveTo(-e,r),t.lineTo(i.width+e,r)}t.stroke()}}))}}class Gi{constructor(t){this.Ht=new Zi,this.bt=!0,this.nn=t}gt(){this.bt=!0}xt(){if(this.bt){const t=this.nn.qt().W().grid,i={Va:t.horzLines.visible,Pa:t.vertLines.visible,Ba:t.horzLines.color,Ra:t.vertLines.color,Ia:t.horzLines.style,Da:t.vertLines.style,za:this.nn.vn().Ea(),Oa:(this.nn.qt().yt().Ea()||[]).map((t=>({Aa:t.coord})))};this.Ht.it(i),this.bt=!1}return this.Ht}}class Ji{constructor(t){this.wn=new Gi(t)}Wh(){return this.wn}}const Qi={La:4,Na:1e-4};function tn(t,i){const n=100*(t-i)/i;return i<0?-n:n}function nn(t,i){const n=tn(t.Sh(),i),s=tn(t.kh(),i);return new Ci(n,s)}function sn(t,i){const n=100*(t-i)/i+100;return i<0?-n:n}function en(t,i){const n=sn(t.Sh(),i),s=sn(t.kh(),i);return new Ci(n,s)}function rn(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.log10(n+i.Na)+i.La;return t<0?-s:s}function hn(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.pow(10,n-i.La)-i.Na;return t<0?-s:s}function ln(t,i){if(null===t)return null;const n=rn(t.Sh(),i),s=rn(t.kh(),i);return new Ci(n,s)}function an(t,i){if(null===t)return null;const n=hn(t.Sh(),i),s=hn(t.kh(),i);return new Ci(n,s)}function on(t){if(null===t)return Qi;const i=Math.abs(t.kh()-t.Sh());if(i>=1||i<1e-15)return Qi;const n=Math.ceil(Math.abs(Math.log10(i))),s=Qi.La+n;return{La:s,Na:1/Math.pow(10,s)}}class _n{constructor(t,i){if(this.Fa=t,this.Wa=i,function(t){if(t<0)return!1;for(let i=t;i>1;i/=10)if(i%10!=0)return!1;return!0}(this.Fa))this.ja=[2,2.5,2];else{this.ja=[];for(let t=this.Fa;1!==t;){if(t%2==0)this.ja.push(2),t/=2;else{if(t%5!=0)throw new Error("unexpected base");this.ja.push(2,2.5),t/=5}if(this.ja.length>100)throw new Error("something wrong with base")}}}Ha(t,i,n){const s=0===this.Fa?0:1/this.Fa;let e=Math.pow(10,Math.max(0,Math.ceil(Math.log10(t-i)))),r=0,h=this.Wa[0];for(;;){const t=St(e,s,1e-14)&&e>s+1e-14,i=St(e,n*h,1e-14),l=St(e,1,1e-14);if(!(t&&i&&l))break;e/=h,h=this.Wa[++r%this.Wa.length]}if(e<=s+1e-14&&(e=s),e=Math.max(1,e),this.ja.length>0&&(l=e,a=1,o=1e-14,Math.abs(l-a)s+1e-14;)e/=h,h=this.ja[++r%this.ja.length];var l,a,o;return e}}class un{constructor(t,i,n,s){this.$a=[],this.Li=t,this.Fa=i,this.Ua=n,this.qa=s}Ha(t,i){if(t=o?1:-1;let d=null,f=0;for(let n=a-u;n>o;n-=_){const s=this.qa(n,i,!0);null!==d&&Math.abs(s-d)l||(fv(t.Zi())-v(i.Zi())))}var dn;exports.PriceScaleMode=void 0,(dn=exports.PriceScaleMode||(exports.PriceScaleMode={}))[dn.Normal=0]="Normal",dn[dn.Logarithmic=1]="Logarithmic",dn[dn.Percentage=2]="Percentage",dn[dn.IndexedTo100=3]="IndexedTo100";const fn=new dt,vn=new ct(100,1);class pn{constructor(t,i,n,s){this.Qa=0,this.io=null,this.Dh=null,this.no=null,this.so={eo:!1,ro:null},this.ho=0,this.lo=0,this.ao=new C,this.oo=new C,this._o=[],this.uo=null,this.co=null,this.do=null,this.fo=null,this.da=vn,this.vo=on(null),this.po=t,this.cn=i,this.mo=n,this.bo=s,this.wo=new un(this,100,this.Mo.bind(this),this.xo.bind(this))}xa(){return this.po}W(){return this.cn}Nh(t){if(T(this.cn,t),this.Sa(),void 0!==t.mode&&this.So({yr:t.mode}),void 0!==t.scaleMargins){const i=f(t.scaleMargins.top),n=f(t.scaleMargins.bottom);if(i<0||i>1)throw new Error(`Invalid top margin - expect value between 0 and 1, given=${i}`);if(n<0||n>1||i+n>1)throw new Error(`Invalid bottom margin - expect value between 0 and 1, given=${n}`);if(i+n>1)throw new Error(`Invalid margins - sum of margins must be less than 1, given=${i+n}`);this.ko(),this.co=null}}yo(){return this.cn.autoScale}Ja(){return 1===this.cn.mode}ph(){return 2===this.cn.mode}Co(){return 3===this.cn.mode}yr(){return{Wn:this.cn.autoScale,To:this.cn.invertScale,yr:this.cn.mode}}So(t){const i=this.yr();let n=null;void 0!==t.Wn&&(this.cn.autoScale=t.Wn),void 0!==t.yr&&(this.cn.mode=t.yr,2!==t.yr&&3!==t.yr||(this.cn.autoScale=!0),this.so.eo=!1),1===i.yr&&t.yr!==i.yr&&(!function(t,i){if(null===t)return!1;const n=hn(t.Sh(),i),s=hn(t.kh(),i);return isFinite(n)&&isFinite(s)}(this.Dh,this.vo)?this.cn.autoScale=!0:(n=an(this.Dh,this.vo),null!==n&&this.Po(n))),1===t.yr&&t.yr!==i.yr&&(n=ln(this.Dh,this.vo),null!==n&&this.Po(n));const s=i.yr!==this.cn.mode;s&&(2===i.yr||this.ph())&&this.Sa(),s&&(3===i.yr||this.Co())&&this.Sa(),void 0!==t.To&&i.To!==t.To&&(this.cn.invertScale=t.To,this.Ro()),this.oo.m(i,this.yr())}Do(){return this.oo}P(){return this.mo.fontSize}zt(){return this.Qa}Oo(t){this.Qa!==t&&(this.Qa=t,this.ko(),this.co=null)}Ao(){if(this.io)return this.io;const t=this.zt()-this.Vo()-this.Bo();return this.io=t,t}Ah(){return this.Io(),this.Dh}Po(t,i){const n=this.Dh;(i||null===n&&null!==t||null!==n&&!n.Mh(t))&&(this.co=null,this.Dh=t)}Fi(){return this.Io(),0===this.Qa||!this.Dh||this.Dh.Fi()}zo(t){return this.To()?t:this.zt()-1-t}Ot(t,i){return this.ph()?t=tn(t,i):this.Co()&&(t=sn(t,i)),this.xo(t,i)}Qs(t,i,n){this.Io();const s=this.Bo(),e=v(this.Ah()),r=e.Sh(),h=e.kh(),l=this.Ao()-1,a=this.To(),o=l/(h-r),_=void 0===n?0:n.from,u=void 0===n?t.length:n.to,c=this.Eo();for(let n=_;nt.On()))}Sa(){this.co=null;const t=this.Jo();let i=100;null!==t&&(i=Math.round(1/t.ua())),this.da=vn,this.ph()?(this.da=fn,i=100):this.Co()?(this.da=new ct(100,1),i=100):null!==t&&(this.da=t.ca()),this.wo=new un(this,i,this.Mo.bind(this),this.xo.bind(this)),this.wo.Xa()}Wo(){this.uo=null}Jo(){return this._o[0]||null}Vo(){return this.To()?this.cn.scaleMargins.bottom*this.zt()+this.lo:this.cn.scaleMargins.top*this.zt()+this.ho}Bo(){return this.To()?this.cn.scaleMargins.top*this.zt()+this.ho:this.cn.scaleMargins.bottom*this.zt()+this.lo}Io(){this.so.eo||(this.so.eo=!0,this.i_())}ko(){this.io=null}xo(t,i){if(this.Io(),this.Fi())return 0;t=this.Ja()&&t?rn(t,this.vo):t;const n=v(this.Ah()),s=this.Bo()+(this.Ao()-1)*(t-n.Sh())/n.yh();return this.zo(s)}Mo(t,i){if(this.Io(),this.Fi())return 0;const n=this.zo(t),s=v(this.Ah()),e=s.Sh()+s.yh()*((n-this.Bo())/(this.Ao()-1));return this.Ja()?hn(e,this.vo):e}Ro(){this.co=null,this.wo.Xa()}i_(){const t=this.so.ro;if(null===t)return;let i=null;const n=this.Qo();let s=0,e=0;for(const r of n){if(!r.Tt())continue;const n=r.Pt();if(null===n)continue;const h=r.Rl(t.Os(),t.di());let l=h&&h.Ah();if(null!==l){switch(this.cn.mode){case 1:l=ln(l,this.vo);break;case 2:l=nn(l,n.Vt);break;case 3:l=en(l,n.Vt)}if(i=null===i?l:i.ts(v(l)),null!==h){const t=h.Vh();null!==t&&(s=Math.max(s,t.above),e=Math.max(s,t.below))}}}if(s===this.ho&&e===this.lo||(this.ho=s,this.lo=e,this.co=null,this.ko()),null!==i){if(i.Sh()===i.kh()){const t=this.Jo(),n=5*(null===t||this.ph()||this.Co()?1:t.ua());this.Ja()&&(i=an(i,this.vo)),i=new Ci(i.Sh()-n,i.kh()+n),this.Ja()&&(i=ln(i,this.vo))}if(this.Ja()){const t=an(i,this.vo),n=on(t);if(r=n,h=this.vo,r.La!==h.La||r.Na!==h.Na){const s=null!==this.no?an(this.no,this.vo):null;this.vo=n,i=ln(t,n),null!==s&&(this.no=ln(s,n))}}this.Po(i)}else null===this.Dh&&(this.Po(new Ci(-.5,.5)),this.vo=on(null));var r,h;this.so.eo=!0}Eo(){return this.ph()?tn:this.Co()?sn:this.Ja()?t=>rn(t,this.vo):null}n_(t,i,n){return void 0===i?(void 0===n&&(n=this.ca()),n.format(t)):i(t)}zh(t,i){return this.n_(t,this.bo.priceFormatter,i)}Go(t,i){return this.n_(t,this.bo.percentageFormatter,i)}}class mn{constructor(t,i){this._o=[],this.s_=new Map,this.Qa=0,this.e_=0,this.r_=1e3,this.uo=null,this.h_=new C,this.wl=t,this.Ui=i,this.l_=new Ji(this);const n=i.W();this.a_=this.o_("left",n.leftPriceScale),this.__=this.o_("right",n.rightPriceScale),this.a_.Do().l(this.u_.bind(this,this.a_),this),this.__.Do().l(this.u_.bind(this,this.__),this),this.c_(n)}c_(t){if(t.leftPriceScale&&this.a_.Nh(t.leftPriceScale),t.rightPriceScale&&this.__.Nh(t.rightPriceScale),t.localization&&(this.a_.Sa(),this.__.Sa()),t.overlayPriceScales){const i=Array.from(this.s_.values());for(const n of i){const i=v(n[0].At());i.Nh(t.overlayPriceScales),t.localization&&i.Sa()}}}d_(t){switch(t){case"left":return this.a_;case"right":return this.__}return this.s_.has(t)?f(this.s_.get(t))[0].At():null}S(){this.qt().f_().p(this),this.a_.Do().p(this),this.__.Do().p(this),this._o.forEach((t=>{t.S&&t.S()})),this.h_.m()}v_(){return this.r_}p_(t){this.r_=t}qt(){return this.Ui}$i(){return this.e_}zt(){return this.Qa}m_(t){this.e_=t,this.b_()}Oo(t){this.Qa=t,this.a_.Oo(t),this.__.Oo(t),this._o.forEach((i=>{if(this.dr(i)){const n=i.At();null!==n&&n.Oo(t)}})),this.b_()}Ta(){return this._o}dr(t){const i=t.At();return null===i||this.a_!==i&&this.__!==i}Fo(t,i,n){const s=void 0!==n?n:this.g_().w_+1;this.M_(t,i,s)}jo(t){const i=this._o.indexOf(t);d(-1!==i,"removeDataSource: invalid data source"),this._o.splice(i,1);const n=v(t.At()).xa();if(this.s_.has(n)){const i=f(this.s_.get(n)),s=i.indexOf(t);-1!==s&&(i.splice(s,1),0===i.length&&this.s_.delete(n))}const s=t.At();s&&s.Ta().indexOf(t)>=0&&s.jo(t),null!==s&&(s.Wo(),this.x_(s)),this.uo=null}pr(t){return t===this.a_?"left":t===this.__?"right":"overlay"}S_(){return this.a_}k_(){return this.__}y_(t,i){t.Uo(i)}C_(t,i){t.qo(i),this.b_()}T_(t){t.Yo()}P_(t,i){t.Xo(i)}R_(t,i){t.Ko(i),this.b_()}D_(t){t.Zo()}b_(){this._o.forEach((t=>{t.On()}))}vn(){let t=null;return this.Ui.W().rightPriceScale.visible&&0!==this.__.Ta().length?t=this.__:this.Ui.W().leftPriceScale.visible&&0!==this.a_.Ta().length?t=this.a_:0!==this._o.length&&(t=this._o[0].At()),null===t&&(t=this.__),t}vr(){let t=null;return this.Ui.W().rightPriceScale.visible?t=this.__:this.Ui.W().leftPriceScale.visible&&(t=this.a_),t}x_(t){null!==t&&t.yo()&&this.O_(t)}A_(t){const i=this.wl.Xs();t.So({Wn:!0}),null!==i&&t.t_(i),this.b_()}V_(){this.O_(this.a_),this.O_(this.__)}B_(){this.x_(this.a_),this.x_(this.__),this._o.forEach((t=>{this.dr(t)&&this.x_(t.At())})),this.b_(),this.Ui.Fh()}No(){return null===this.uo&&(this.uo=cn(this._o)),this.uo}I_(){return this.h_}z_(){return this.l_}O_(t){const i=t.Qo();if(i&&i.length>0&&!this.wl.Fi()){const i=this.wl.Xs();null!==i&&t.t_(i)}t.On()}g_(){const t=this.No();if(0===t.length)return{E_:0,w_:0};let i=0,n=0;for(let s=0;sn&&(n=e))}return{E_:i,w_:n}}M_(t,i,n){let s=this.d_(i);if(null===s&&(s=this.o_(i,this.Ui.W().overlayPriceScales)),this._o.push(t),!at(i)){const n=this.s_.get(i)||[];n.push(t),this.s_.set(i,n)}s.Fo(t),t.Ji(s),t.Gi(n),this.x_(s),this.uo=null}u_(t,i,n){i.yr!==n.yr&&this.O_(t)}o_(t,i){const n=Object.assign({visible:!0,autoScale:!0},A(i)),s=new pn(t,n,this.Ui.W().layout,this.Ui.W().localization);return s.Oo(this.zt()),s}}class bn{constructor(t,i,n=50){this.Ke=0,this.Ze=1,this.Ge=1,this.Qe=new Map,this.Je=new Map,this.L_=t,this.N_=i,this.tr=n}F_(t){const i=t.time,n=this.N_.cacheKey(i),s=this.Qe.get(n);if(void 0!==s)return s.W_;if(this.Ke===this.tr){const t=this.Je.get(this.Ge);this.Je.delete(this.Ge),this.Qe.delete(f(t)),this.Ge++,this.Ke--}const e=this.L_(t);return this.Qe.set(n,{W_:e,er:this.Ze}),this.Je.set(this.Ze,n),this.Ke++,this.Ze++,e}}class wn{constructor(t,i){d(t<=i,"right should be >= left"),this.j_=t,this.H_=i}Os(){return this.j_}di(){return this.H_}U_(){return this.H_-this.j_+1}Kr(t){return this.j_<=t&&t<=this.H_}Mh(t){return this.j_===t.Os()&&this.H_===t.di()}}function gn(t,i){return null===t||null===i?t===i:t.Mh(i)}class Mn{constructor(){this.q_=new Map,this.Qe=null,this.Y_=!1}X_(t){this.Y_=t,this.Qe=null}K_(t,i){this.Z_(i),this.Qe=null;for(let n=i;n{t<=n[0].index?i.push(s):n.splice(Ot(n,t,(i=>i.indexi-t))){if(!this.q_.get(n))continue;const s=i;i=[];const e=s.length;let r=0;const h=f(this.q_.get(n)),l=h.length;let a=1/0,o=-1/0;for(let n=0;n=t&&_-o>=t)i.push(l),o=_;else if(this.Y_)return s}for(;ri.weight?t:i}class kn{constructor(t,i,n,s){this.e_=0,this.eu=null,this.ru=[],this.fo=null,this.do=null,this.hu=new Mn,this.lu=new Map,this.au=xn.su(),this.ou=!0,this._u=new C,this.uu=new C,this.cu=new C,this.du=null,this.fu=null,this.vu=[],this.cn=i,this.bo=n,this.pu=i.rightOffset,this.mu=i.barSpacing,this.Ui=t,this.N_=s,this.bu(),this.hu.X_(i.uniformDistribution)}W(){return this.cn}wu(t){T(this.bo,t),this.gu(),this.bu()}Nh(t,i){var n;T(this.cn,t),this.cn.fixLeftEdge&&this.Mu(),this.cn.fixRightEdge&&this.xu(),void 0!==t.barSpacing&&this.Ui.Gn(t.barSpacing),void 0!==t.rightOffset&&this.Ui.Jn(t.rightOffset),void 0!==t.minBarSpacing&&this.Ui.Gn(null!==(n=t.barSpacing)&&void 0!==n?n:this.mu),this.gu(),this.bu(),this.cu.m()}mn(t){var i,n;return null!==(n=null===(i=this.ru[t])||void 0===i?void 0:i.time)&&void 0!==n?n:null}qi(t){var i;return null!==(i=this.ru[t])&&void 0!==i?i:null}ya(t,i){if(this.ru.length<1)return null;if(this.N_.key(t)>this.N_.key(this.ru[this.ru.length-1].time))return i?this.ru.length-1:null;const n=Ot(this.ru,this.N_.key(t),((t,i)=>this.N_.key(t.time)0}Xs(){return this.Su(),this.au.iu()}ku(){return this.Su(),this.au.nu()}yu(){const t=this.Xs();if(null===t)return null;const i={from:t.Os(),to:t.di()};return this.Cu(i)}Cu(t){const i=Math.round(t.from),n=Math.round(t.to),s=v(this.Tu()),e=v(this.Pu());return{from:v(this.qi(Math.max(s,i))),to:v(this.qi(Math.min(e,n)))}}Ru(t){return{from:v(this.ya(t.from,!0)),to:v(this.ya(t.to,!0))}}$i(){return this.e_}m_(t){if(!isFinite(t)||t<=0)return;if(this.e_===t)return;const i=this.ku(),n=this.e_;if(this.e_=t,this.ou=!0,this.cn.lockVisibleTimeRangeOnResize&&0!==n){const i=this.mu*t/n;this.mu=i}if(this.cn.fixLeftEdge&&null!==i&&i.Os()<=0){const i=n-t;this.pu-=Math.round(i/this.mu)+1,this.ou=!0}this.Du(),this.Ou()}Et(t){if(this.Fi()||!R(t))return 0;const i=this.Au()+this.pu-t;return this.e_-(i+.5)*this.mu-1}Js(t,i){const n=this.Au(),s=void 0===i?0:i.from,e=void 0===i?t.length:i.to;for(let i=s;ii/2&&!o?n.needAlignCoordinate=!1:n.needAlignCoordinate=_&&t.index<=l||u&&t.index>=a,c++}return this.vu.length=c,this.fu=this.vu,this.vu}Fu(){this.ou=!0,this.Gn(this.cn.barSpacing),this.Jn(this.cn.rightOffset)}Wu(t){this.ou=!0,this.eu=t,this.Ou(),this.Mu()}ju(t,i){const n=this.Bu(t),s=this.he(),e=s+i*(s/10);this.Gn(e),this.cn.rightBarStaysOnScroll||this.Jn(this.Eu()+(n-this.Bu(t)))}Uo(t){this.fo&&this.Zo(),null===this.do&&null===this.du&&(this.Fi()||(this.do=t,this.Hu()))}qo(t){if(null===this.du)return;const i=xt(this.e_-t,0,this.e_),n=xt(this.e_-v(this.do),0,this.e_);0!==i&&0!==n&&this.Gn(this.du.he*i/n)}Yo(){null!==this.do&&(this.do=null,this.$u())}Xo(t){null===this.fo&&null===this.du&&(this.Fi()||(this.fo=t,this.Hu()))}Ko(t){if(null===this.fo)return;const i=(this.fo-t)/this.he();this.pu=v(this.du).Eu+i,this.ou=!0,this.Ou()}Zo(){null!==this.fo&&(this.fo=null,this.$u())}Uu(){this.qu(this.cn.rightOffset)}qu(t,i=400){if(!isFinite(t))throw new RangeError("offset is required and must be finite number");if(!isFinite(i)||i<=0)throw new RangeError("animationDuration (optional) must be finite positive number");const n=this.pu,s=performance.now();this.Ui.Xn({Yu:t=>(t-s)/i>=1,Xu:e=>{const r=(e-s)/i;return r>=1?t:n+(t-n)*r}})}gt(t,i){this.ou=!0,this.ru=t,this.hu.K_(t,i),this.Ou()}Ku(){return this._u}Zu(){return this.uu}Gu(){return this.cu}Au(){return this.eu||0}Ju(t){const i=t.U_();this.zu(this.e_/i),this.pu=t.di()-this.Au(),this.Ou(),this.ou=!0,this.Ui.Iu(),this.Ui.Fh()}Qu(){const t=this.Tu(),i=this.Pu();null!==t&&null!==i&&this.Ju(new wn(t,i+this.cn.rightOffset))}tc(t){const i=new wn(t.from,t.to);this.Ju(i)}Yi(t){return void 0!==this.bo.timeFormatter?this.bo.timeFormatter(t.originalTime):this.N_.formatHorzItem(t.time)}Lu(){const{handleScroll:t,handleScale:i}=this.Ui.W();return!(t.horzTouchDrag||t.mouseWheel||t.pressedMouseMove||t.vertTouchDrag||i.axisDoubleClickReset.time||i.axisPressedMouseMove.time||i.mouseWheel||i.pinch)}Tu(){return 0===this.ru.length?null:0}Pu(){return 0===this.ru.length?null:this.ru.length-1}ic(t){return(this.e_-1-t)/this.mu}Bu(t){const i=this.ic(t),n=this.Au()+this.pu-i;return Math.round(1e6*n)/1e6}zu(t){const i=this.mu;this.mu=t,this.Du(),i!==this.mu&&(this.ou=!0,this.nc())}Su(){if(!this.ou)return;if(this.ou=!1,this.Fi())return void this.sc(xn.su());const t=this.Au(),i=this.e_/this.mu,n=this.pu+t,s=new wn(n-i+1,n);this.sc(new xn(s))}Du(){const t=this.ec();if(this.mut&&(this.mu=t,this.ou=!0)}}ec(){return this.cn.fixLeftEdge&&this.cn.fixRightEdge&&0!==this.ru.length?this.e_/this.ru.length:this.cn.minBarSpacing}Ou(){const t=this.rc();this.pu>t&&(this.pu=t,this.ou=!0);const i=this.hc();null!==i&&this.puthis.lc(t)),this.N_),this.lu.set(t.weight,i)),i.F_(t)}lc(t){return this.N_.formatTickmark(t,this.bo)}sc(t){const i=this.au;this.au=t,gn(i.iu(),this.au.iu())||this._u.m(),gn(i.nu(),this.au.nu())||this.uu.m(),this.nc()}nc(){this.fu=null}gu(){this.nc(),this.lu.clear()}bu(){this.N_.updateFormatter(this.bo)}Mu(){if(!this.cn.fixLeftEdge)return;const t=this.Tu();if(null===t)return;const i=this.Xs();if(null===i)return;const n=i.Os()-t;if(n<0){const t=this.pu-n-1;this.Jn(t)}this.Du()}xu(){this.Ou(),this.Du()}}class yn extends N{constructor(t){super(),this.ac=new Map,this.Lt=t}Z(t){}J(t){if(!this.Lt.Tt)return;const{context:i,mediaSize:n}=t;let s=0;for(const t of this.Lt.oc){if(0===t.Jt.length)continue;i.font=t.R;const e=this._c(i,t.Jt);e>n.width?t.ju=n.width/e:t.ju=1,s+=t.uc*t.ju}let e=0;switch(this.Lt.cc){case"top":e=0;break;case"center":e=Math.max((n.height-s)/2,0);break;case"bottom":e=Math.max(n.height-s,0)}i.fillStyle=this.Lt.O;for(const t of this.Lt.oc){i.save();let s=0;switch(this.Lt.dc){case"left":i.textAlign="left",s=t.uc/2;break;case"center":i.textAlign="center",s=n.width/2;break;case"right":i.textAlign="right",s=n.width-1-t.uc/2}i.translate(s,e),i.textBaseline="top",i.font=t.R,i.scale(t.ju,t.ju),i.fillText(t.Jt,0,t.fc),i.restore(),e+=t.uc*t.ju}}_c(t,i){const n=this.vc(t.font);let s=n.get(i);return void 0===s&&(s=t.measureText(i).width,n.set(i,s)),s}vc(t){let i=this.ac.get(t);return void 0===i&&(i=new Map,this.ac.set(t,i)),i}}class Cn{constructor(t){this.bt=!0,this.jt={Tt:!1,O:"",oc:[],cc:"center",dc:"center"},this.Ht=new yn(this.jt),this.$t=t}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht}St(){const t=this.$t.W(),i=this.jt;i.Tt=t.visible,i.Tt&&(i.O=t.color,i.dc=t.horzAlign,i.cc=t.vertAlign,i.oc=[{Jt:t.text,R:z(t.fontSize,t.fontFamily,t.fontStyle),uc:1.2*t.fontSize,fc:0,ju:0}])}}class Tn extends rt{constructor(t,i){super(),this.cn=i,this.wn=new Cn(this)}Rn(){return[]}Pn(){return[this.wn]}W(){return this.cn}On(){this.wn.gt()}}var Pn,Rn,Dn,On,An;exports.TrackingModeExitMode=void 0,(Pn=exports.TrackingModeExitMode||(exports.TrackingModeExitMode={}))[Pn.OnTouchEnd=0]="OnTouchEnd",Pn[Pn.OnNextTap=1]="OnNextTap";class Vn{constructor(t,i,n){this.mc=[],this.bc=[],this.e_=0,this.wc=null,this.gc=new C,this.Mc=new C,this.xc=null,this.Sc=t,this.cn=i,this.N_=n,this.kc=new E(this),this.wl=new kn(this,i.timeScale,this.cn.localization,n),this.wt=new lt(this,i.crosshair),this.yc=new Ki(i.crosshair),this.Cc=new Tn(this,i.watermark),this.Tc(),this.mc[0].p_(2e3),this.Pc=this.Rc(0),this.Dc=this.Rc(1)}$l(){this.Oc(ot.es())}Fh(){this.Oc(ot.ss())}sa(){this.Oc(new ot(1))}Ul(t){const i=this.Ac(t);this.Oc(i)}Vc(){return this.wc}Bc(t){const i=this.wc;this.wc=t,null!==i&&this.Ul(i.Ic),null!==t&&this.Ul(t.Ic)}W(){return this.cn}Nh(t){T(this.cn,t),this.mc.forEach((i=>i.c_(t))),void 0!==t.timeScale&&this.wl.Nh(t.timeScale),void 0!==t.localization&&this.wl.wu(t.localization),(t.leftPriceScale||t.rightPriceScale)&&this.gc.m(),this.Pc=this.Rc(0),this.Dc=this.Rc(1),this.$l()}zc(t,i){if("left"===t)return void this.Nh({leftPriceScale:i});if("right"===t)return void this.Nh({rightPriceScale:i});const n=this.Ec(t);null!==n&&(n.At.Nh(i),this.gc.m())}Ec(t){for(const i of this.mc){const n=i.d_(t);if(null!==n)return{Ut:i,At:n}}return null}yt(){return this.wl}Lc(){return this.mc}Nc(){return this.Cc}Fc(){return this.wt}Wc(){return this.Mc}jc(t,i){t.Oo(i),this.Iu()}m_(t){this.e_=t,this.wl.m_(this.e_),this.mc.forEach((i=>i.m_(t))),this.Iu()}Tc(t){const i=new mn(this.wl,this);void 0!==t?this.mc.splice(t,0,i):this.mc.push(i);const n=void 0===t?this.mc.length-1:t,s=ot.es();return s.Nn(n,{Fn:0,Wn:!0}),this.Oc(s),i}y_(t,i,n){t.y_(i,n)}C_(t,i,n){t.C_(i,n),this.ql(),this.Oc(this.Hc(t,2))}T_(t,i){t.T_(i),this.Oc(this.Hc(t,2))}P_(t,i,n){i.yo()||t.P_(i,n)}R_(t,i,n){i.yo()||(t.R_(i,n),this.ql(),this.Oc(this.Hc(t,2)))}D_(t,i){i.yo()||(t.D_(i),this.Oc(this.Hc(t,2)))}A_(t,i){t.A_(i),this.Oc(this.Hc(t,2))}$c(t){this.wl.Uo(t)}Uc(t,i){const n=this.yt();if(n.Fi()||0===i)return;const s=n.$i();t=Math.max(1,Math.min(t,s)),n.ju(t,i),this.Iu()}qc(t){this.Yc(0),this.Xc(t),this.Kc()}Zc(t){this.wl.qo(t),this.Iu()}Gc(){this.wl.Yo(),this.Fh()}Yc(t){this.wl.Xo(t)}Xc(t){this.wl.Ko(t),this.Iu()}Kc(){this.wl.Zo(),this.Fh()}Mt(){return this.bc}Jc(t,i,n,s,e){this.wt.gn(t,i);let r=NaN,h=this.wl.Vu(t);const l=this.wl.Xs();null!==l&&(h=Math.min(Math.max(l.Os(),h),l.di()));const a=s.vn(),o=a.Pt();null!==o&&(r=a.pn(i,o)),r=this.yc.Ca(r,h,s),this.wt.kn(h,r,s),this.sa(),e||this.Mc.m(this.wt.kt(),{x:t,y:i},n)}Qc(t,i,n){const s=n.vn(),e=s.Pt(),r=s.Ot(t,v(e)),h=this.wl.ya(i,!0),l=this.wl.Et(v(h));this.Jc(l,r,null,n,!0)}td(t){this.Fc().Cn(),this.sa(),t||this.Mc.m(null,null,null)}ql(){const t=this.wt.Ut();if(null!==t){const i=this.wt.xn(),n=this.wt.Sn();this.Jc(i,n,null,t)}this.wt.On()}nd(t,i,n){const s=this.wl.mn(0);void 0!==i&&void 0!==n&&this.wl.gt(i,n);const e=this.wl.mn(0),r=this.wl.Au(),h=this.wl.Xs();if(null!==h&&null!==s&&null!==e){const i=h.Kr(r),l=this.N_.key(s)>this.N_.key(e),a=null!==t&&t>r&&!l,o=this.wl.W().allowShiftVisibleRangeOnWhitespaceReplacement,_=i&&(!(void 0===n)||o)&&this.wl.W().shiftVisibleRangeOnNewBar;if(a&&!_){const i=t-r;this.wl.Jn(this.wl.Eu()-i)}}this.wl.Wu(t)}Kl(t){null!==t&&t.B_()}cr(t){const i=this.mc.find((i=>i.No().includes(t)));return void 0===i?null:i}Iu(){this.Cc.On(),this.mc.forEach((t=>t.B_())),this.ql()}S(){this.mc.forEach((t=>t.S())),this.mc.length=0,this.cn.localization.priceFormatter=void 0,this.cn.localization.percentageFormatter=void 0,this.cn.localization.timeFormatter=void 0}sd(){return this.kc}mr(){return this.kc.W()}f_(){return this.gc}ed(t,i,n){const s=this.mc[0],e=this.rd(i,t,s,n);return this.bc.push(e),1===this.bc.length?this.$l():this.Fh(),e}hd(t){const i=this.cr(t),n=this.bc.indexOf(t);d(-1!==n,"Series not found"),this.bc.splice(n,1),v(i).jo(t),t.S&&t.S()}Hl(t,i){const n=v(this.cr(t));n.jo(t);const s=this.Ec(i);if(null===s){const s=t.Zi();n.Fo(t,i,s)}else{const e=s.Ut===n?t.Zi():void 0;s.Ut.Fo(t,i,e)}}Qu(){const t=ot.ss();t.$n(),this.Oc(t)}ld(t){const i=ot.ss();i.Yn(t),this.Oc(i)}Zn(){const t=ot.ss();t.Zn(),this.Oc(t)}Gn(t){const i=ot.ss();i.Gn(t),this.Oc(i)}Jn(t){const i=ot.ss();i.Jn(t),this.Oc(i)}Xn(t){const i=ot.ss();i.Xn(t),this.Oc(i)}Un(){const t=ot.ss();t.Un(),this.Oc(t)}ad(){return this.cn.rightPriceScale.visible?"right":"left"}od(){return this.Dc}q(){return this.Pc}It(t){const i=this.Dc,n=this.Pc;if(i===n)return i;if(t=Math.max(0,Math.min(100,Math.round(100*t))),null===this.xc||this.xc.Ts!==n||this.xc.Ps!==i)this.xc={Ts:n,Ps:i,_d:new Map};else{const i=this.xc._d.get(t);if(void 0!==i)return i}const s=function(t,i,n){const[s,e,r,h]=k(t),[l,a,o,_]=k(i),u=[b(s+n*(l-s)),b(e+n*(a-e)),b(r+n*(o-r)),w(h+n*(_-h))];return`rgba(${u[0]}, ${u[1]}, ${u[2]}, ${u[3]})`}(n,i,t/100);return this.xc._d.set(t,s),s}Hc(t,i){const n=new ot(i);if(null!==t){const s=this.mc.indexOf(t);n.Nn(s,{Fn:i})}return n}Ac(t,i){return void 0===i&&(i=2),this.Hc(this.cr(t),i)}Oc(t){this.Sc&&this.Sc(t),this.mc.forEach((t=>t.z_().Wh().gt()))}rd(t,i,n,s){const e=new Xi(this,t,i,n,s),r=void 0!==t.priceScaleId?t.priceScaleId:this.ad();return n.Fo(e,r),at(r)||e.Nh(t),e}Rc(t){const i=this.cn.layout;return"gradient"===i.background.type?0===t?i.background.topColor:i.background.bottomColor:i.background.color}}function Bn(t){return!P(t)&&!D(t)}function In(t){return P(t)}exports.LastPriceAnimationMode=void 0,(Rn=exports.LastPriceAnimationMode||(exports.LastPriceAnimationMode={}))[Rn.Disabled=0]="Disabled",Rn[Rn.Continuous=1]="Continuous",Rn[Rn.OnDataUpdate=2]="OnDataUpdate",exports.PriceLineSource=void 0,(Dn=exports.PriceLineSource||(exports.PriceLineSource={}))[Dn.LastBar=0]="LastBar",Dn[Dn.LastVisible=1]="LastVisible",exports.ColorType=void 0,(On=exports.ColorType||(exports.ColorType={})).Solid="solid",On.VerticalGradient="gradient",exports.TickMarkType=void 0,(An=exports.TickMarkType||(exports.TickMarkType={}))[An.Year=0]="Year",An[An.Month=1]="Month",An[An.DayOfMonth=2]="DayOfMonth",An[An.Time=3]="Time",An[An.TimeWithSeconds=4]="TimeWithSeconds";const zn=t=>t.getUTCFullYear();function En(t,i,n){return i.replace(/yyyy/g,(t=>ut(zn(t),4))(t)).replace(/yy/g,(t=>ut(zn(t)%100,2))(t)).replace(/MMMM/g,((t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"long"}))(t,n)).replace(/MMM/g,((t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"short"}))(t,n)).replace(/MM/g,(t=>ut((t=>t.getUTCMonth()+1)(t),2))(t)).replace(/dd/g,(t=>ut((t=>t.getUTCDate())(t),2))(t))}class Ln{constructor(t="yyyy-MM-dd",i="default"){this.ud=t,this.dd=i}F_(t){return En(t,this.ud,this.dd)}}class Nn{constructor(t){this.fd=t||"%h:%m:%s"}F_(t){return this.fd.replace("%h",ut(t.getUTCHours(),2)).replace("%m",ut(t.getUTCMinutes(),2)).replace("%s",ut(t.getUTCSeconds(),2))}}const Fn={vd:"yyyy-MM-dd",pd:"%h:%m:%s",md:" ",bd:"default"};class Wn{constructor(t={}){const i=Object.assign(Object.assign({},Fn),t);this.wd=new Ln(i.vd,i.bd),this.gd=new Nn(i.pd),this.Md=i.md}F_(t){return`${this.wd.F_(t)}${this.Md}${this.gd.F_(t)}`}}function jn(t){return 60*t*60*1e3}function Hn(t){return 60*t*1e3}const $n=[{xd:(Un=1,1e3*Un),Sd:10},{xd:Hn(1),Sd:20},{xd:Hn(5),Sd:21},{xd:Hn(30),Sd:22},{xd:jn(1),Sd:30},{xd:jn(3),Sd:31},{xd:jn(6),Sd:32},{xd:jn(12),Sd:33}];var Un;function qn(t,i){if(t.getUTCFullYear()!==i.getUTCFullYear())return 70;if(t.getUTCMonth()!==i.getUTCMonth())return 60;if(t.getUTCDate()!==i.getUTCDate())return 50;for(let n=$n.length-1;n>=0;--n)if(Math.floor(i.getTime()/$n[n].xd)!==Math.floor(t.getTime()/$n[n].xd))return $n[n].Sd;return 0}function Yn(t){let i=t;if(D(t)&&(i=Kn(t)),!Bn(i))throw new Error("time must be of type BusinessDay");const n=new Date(Date.UTC(i.year,i.month-1,i.day,0,0,0,0));return{kd:Math.round(n.getTime()/1e3),yd:i}}function Xn(t){if(!In(t))throw new Error("time must be of type isUTCTimestamp");return{kd:t}}function Kn(t){const i=new Date(t);if(isNaN(i.getTime()))throw new Error(`Invalid date string=${t}, expected format=yyyy-mm-dd`);return{day:i.getUTCDate(),month:i.getUTCMonth()+1,year:i.getUTCFullYear()}}function Zn(t){D(t.time)&&(t.time=Kn(t.time))}class Gn{options(){return this.cn}setOptions(t){this.cn=t,this.updateFormatter(t.localization)}preprocessData(t){Array.isArray(t)?function(t){t.forEach(Zn)}(t):Zn(t)}createConverterToInternalObj(t){return v(function(t){return 0===t.length?null:Bn(t[0].time)||D(t[0].time)?Yn:Xn}(t))}key(t){return"object"==typeof t&&"kd"in t?t.kd:this.key(this.convertHorzItemToInternal(t))}cacheKey(t){const i=t;return void 0===i.yd?new Date(1e3*i.kd).getTime():new Date(Date.UTC(i.yd.year,i.yd.month-1,i.yd.day)).getTime()}convertHorzItemToInternal(t){return In(i=t)?Xn(i):Bn(i)?Yn(i):Yn(Kn(i));var i}updateFormatter(t){if(!this.cn)return;const i=t.dateFormat;this.cn.timeScale.timeVisible?this.Cd=new Wn({vd:i,pd:this.cn.timeScale.secondsVisible?"%h:%m:%s":"%h:%m",md:" ",bd:t.locale}):this.Cd=new Ln(i,t.locale)}formatHorzItem(t){const i=t;return this.Cd.F_(new Date(1e3*i.kd))}formatTickmark(t,i){const n=function(t,i,n){switch(t){case 0:case 10:return i?n?4:3:2;case 20:case 21:case 22:case 30:case 31:case 32:case 33:return i?3:2;case 50:return 2;case 60:return 1;case 70:return 0}}(t.weight,this.cn.timeScale.timeVisible,this.cn.timeScale.secondsVisible),s=this.cn.timeScale;if(void 0!==s.tickMarkFormatter){const e=s.tickMarkFormatter(t.originalTime,n,i.locale);if(null!==e)return e}return function(t,i,n){const s={};switch(i){case 0:s.year="numeric";break;case 1:s.month="short";break;case 2:s.day="numeric";break;case 3:s.hour12=!1,s.hour="2-digit",s.minute="2-digit";break;case 4:s.hour12=!1,s.hour="2-digit",s.minute="2-digit",s.second="2-digit"}const e=void 0===t.yd?new Date(1e3*t.kd):new Date(Date.UTC(t.yd.year,t.yd.month-1,t.yd.day));return new Date(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()).toLocaleString(n,s)}(t.time,n,i.locale)}maxTickMarkWeight(t){let i=t.reduce(Sn,t[0]).weight;return i>30&&i<50&&(i=30),i}fillWeightsForPoints(t,i){!function(t,i=0){if(0===t.length)return;let n=0===i?null:t[i-1].time.kd,s=null!==n?new Date(1e3*n):null,e=0;for(let r=i;r1){const i=Math.ceil(e/(t.length-1)),n=new Date(1e3*(t[0].time.kd-i));t[0].timeWeight=qn(new Date(1e3*t[0].time.kd),n)}}(t,i)}static Td(t){return T({localization:{dateFormat:"dd MMM 'yy"}},null!=t?t:{})}}const Jn="undefined"!=typeof window;function Qn(){return!!Jn&&window.navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function ts(){return!!Jn&&/iPhone|iPad|iPod/.test(window.navigator.platform)}function is(t){return t+t%2}function ns(t,i){return t.Pd-i.Pd}function ss(t,i,n){const s=(t.Pd-i.Pd)/(t.ut-i.ut);return Math.sign(s)*Math.min(Math.abs(s),n)}class es{constructor(t,i,n,s){this.Rd=null,this.Dd=null,this.Od=null,this.Ad=null,this.Vd=null,this.Bd=0,this.Id=0,this.zd=t,this.Ed=i,this.Ld=n,this.rs=s}Nd(t,i){if(null!==this.Rd){if(this.Rd.ut===i)return void(this.Rd.Pd=t);if(Math.abs(this.Rd.Pd-t)50)return;let n=0;const s=ss(this.Rd,this.Dd,this.Ed),e=ns(this.Rd,this.Dd),r=[s],h=[e];if(n+=e,null!==this.Od){const t=ss(this.Dd,this.Od,this.Ed);if(Math.sign(t)===Math.sign(s)){const i=ns(this.Dd,this.Od);if(r.push(t),h.push(i),n+=i,null!==this.Ad){const t=ss(this.Od,this.Ad,this.Ed);if(Math.sign(t)===Math.sign(s)){const i=ns(this.Od,this.Ad);r.push(t),h.push(i),n+=i}}}}let l=0;for(let t=0;t({width:Math.max(t.width,i.width),height:Math.max(t.height,i.height)})});return e.resizeCanvasElement(n),e}function hs(t,i,n,s){t.G&&t.G(i,n,s)}function ls(t,i,n,s){t.K(i,n,s)}function as(t,i,n,s){const e=t(n,s);for(const t of e){const n=t.xt();null!==n&&i(n)}}function os(t){Jn&&void 0!==window.chrome&&t.addEventListener("mousedown",(t=>{if(1===t.button)return t.preventDefault(),!1}))}class _s{constructor(t,i,n){this.Wd=0,this.jd=null,this.Hd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY},this.$d=0,this.Ud=null,this.qd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY},this.Yd=null,this.Xd=!1,this.Kd=null,this.Zd=null,this.Gd=!1,this.Jd=!1,this.Qd=!1,this.tf=null,this.if=null,this.nf=null,this.sf=null,this.ef=null,this.rf=null,this.hf=null,this.lf=0,this.af=!1,this._f=!1,this.uf=!1,this.cf=0,this.df=null,this.ff=!ts(),this.vf=t=>{this.pf(t)},this.mf=t=>{if(this.bf(t)){const i=this.wf(t);if(++this.$d,this.Ud&&this.$d>1){const{gf:n}=this.Mf(ds(t),this.qd);n<30&&!this.Qd&&this.xf(i,this.kf.Sf),this.yf()}}else{const i=this.wf(t);if(++this.Wd,this.jd&&this.Wd>1){const{gf:n}=this.Mf(ds(t),this.Hd);n<5&&!this.Jd&&this.Cf(i,this.kf.Tf),this.Pf()}}},this.Rf=t,this.kf=i,this.cn=n,this.Df()}S(){null!==this.tf&&(this.tf(),this.tf=null),null!==this.if&&(this.if(),this.if=null),null!==this.sf&&(this.sf(),this.sf=null),null!==this.ef&&(this.ef(),this.ef=null),null!==this.rf&&(this.rf(),this.rf=null),null!==this.nf&&(this.nf(),this.nf=null),this.Of(),this.Pf()}Af(t){this.sf&&this.sf();const i=this.Vf.bind(this);if(this.sf=()=>{this.Rf.removeEventListener("mousemove",i)},this.Rf.addEventListener("mousemove",i),this.bf(t))return;const n=this.wf(t);this.Cf(n,this.kf.Bf),this.ff=!0}Pf(){null!==this.jd&&clearTimeout(this.jd),this.Wd=0,this.jd=null,this.Hd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY}}yf(){null!==this.Ud&&clearTimeout(this.Ud),this.$d=0,this.Ud=null,this.qd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY}}Vf(t){if(this.uf||null!==this.Zd)return;if(this.bf(t))return;const i=this.wf(t);this.Cf(i,this.kf.If),this.ff=!0}zf(t){const i=vs(t.changedTouches,v(this.df));if(null===i)return;if(this.cf=fs(t),null!==this.hf)return;if(this._f)return;this.af=!0;const n=this.Mf(ds(i),v(this.Zd)),{Ef:s,Lf:e,gf:r}=n;if(this.Gd||!(r<5)){if(!this.Gd){const t=.5*s,i=e>=t&&!this.cn.Nf(),n=t>e&&!this.cn.Ff();i||n||(this._f=!0),this.Gd=!0,this.Qd=!0,this.Of(),this.yf()}if(!this._f){const n=this.wf(t,i);this.xf(n,this.kf.Wf),cs(t)}}}jf(t){if(0!==t.button)return;const i=this.Mf(ds(t),v(this.Kd)),{gf:n}=i;if(n>=5&&(this.Jd=!0,this.Pf()),this.Jd){const i=this.wf(t);this.Cf(i,this.kf.Hf)}}Mf(t,i){const n=Math.abs(i.et-t.et),s=Math.abs(i.rt-t.rt);return{Ef:n,Lf:s,gf:n+s}}$f(t){let i=vs(t.changedTouches,v(this.df));if(null===i&&0===t.touches.length&&(i=t.changedTouches[0]),null===i)return;this.df=null,this.cf=fs(t),this.Of(),this.Zd=null,this.rf&&(this.rf(),this.rf=null);const n=this.wf(t,i);if(this.xf(n,this.kf.Uf),++this.$d,this.Ud&&this.$d>1){const{gf:t}=this.Mf(ds(i),this.qd);t<30&&!this.Qd&&this.xf(n,this.kf.Sf),this.yf()}else this.Qd||(this.xf(n,this.kf.qf),this.kf.qf&&cs(t));0===this.$d&&cs(t),0===t.touches.length&&this.Xd&&(this.Xd=!1,cs(t))}pf(t){if(0!==t.button)return;const i=this.wf(t);if(this.Kd=null,this.uf=!1,this.ef&&(this.ef(),this.ef=null),Qn()){this.Rf.ownerDocument.documentElement.removeEventListener("mouseleave",this.vf)}if(!this.bf(t))if(this.Cf(i,this.kf.Yf),++this.Wd,this.jd&&this.Wd>1){const{gf:n}=this.Mf(ds(t),this.Hd);n<5&&!this.Jd&&this.Cf(i,this.kf.Tf),this.Pf()}else this.Jd||this.Cf(i,this.kf.Xf)}Of(){null!==this.Yd&&(clearTimeout(this.Yd),this.Yd=null)}Kf(t){if(null!==this.df)return;const i=t.changedTouches[0];this.df=i.identifier,this.cf=fs(t);const n=this.Rf.ownerDocument.documentElement;this.Qd=!1,this.Gd=!1,this._f=!1,this.Zd=ds(i),this.rf&&(this.rf(),this.rf=null);{const i=this.zf.bind(this),s=this.$f.bind(this);this.rf=()=>{n.removeEventListener("touchmove",i),n.removeEventListener("touchend",s)},n.addEventListener("touchmove",i,{passive:!1}),n.addEventListener("touchend",s,{passive:!1}),this.Of(),this.Yd=setTimeout(this.Zf.bind(this,t),240)}const s=this.wf(t,i);this.xf(s,this.kf.Gf),this.Ud||(this.$d=0,this.Ud=setTimeout(this.yf.bind(this),500),this.qd=ds(i))}Jf(t){if(0!==t.button)return;const i=this.Rf.ownerDocument.documentElement;Qn()&&i.addEventListener("mouseleave",this.vf),this.Jd=!1,this.Kd=ds(t),this.ef&&(this.ef(),this.ef=null);{const t=this.jf.bind(this),n=this.pf.bind(this);this.ef=()=>{i.removeEventListener("mousemove",t),i.removeEventListener("mouseup",n)},i.addEventListener("mousemove",t),i.addEventListener("mouseup",n)}if(this.uf=!0,this.bf(t))return;const n=this.wf(t);this.Cf(n,this.kf.Qf),this.jd||(this.Wd=0,this.jd=setTimeout(this.Pf.bind(this),500),this.Hd=ds(t))}Df(){this.Rf.addEventListener("mouseenter",this.Af.bind(this)),this.Rf.addEventListener("touchcancel",this.Of.bind(this));{const t=this.Rf.ownerDocument,i=t=>{this.kf.tv&&(t.composed&&this.Rf.contains(t.composedPath()[0])||t.target&&this.Rf.contains(t.target)||this.kf.tv())};this.if=()=>{t.removeEventListener("touchstart",i)},this.tf=()=>{t.removeEventListener("mousedown",i)},t.addEventListener("mousedown",i),t.addEventListener("touchstart",i,{passive:!0})}ts()&&(this.nf=()=>{this.Rf.removeEventListener("dblclick",this.mf)},this.Rf.addEventListener("dblclick",this.mf)),this.Rf.addEventListener("mouseleave",this.iv.bind(this)),this.Rf.addEventListener("touchstart",this.Kf.bind(this),{passive:!0}),os(this.Rf),this.Rf.addEventListener("mousedown",this.Jf.bind(this)),this.nv(),this.Rf.addEventListener("touchmove",(()=>{}),{passive:!1})}nv(){void 0===this.kf.sv&&void 0===this.kf.ev&&void 0===this.kf.rv||(this.Rf.addEventListener("touchstart",(t=>this.hv(t.touches)),{passive:!0}),this.Rf.addEventListener("touchmove",(t=>{if(2===t.touches.length&&null!==this.hf&&void 0!==this.kf.ev){const i=us(t.touches[0],t.touches[1])/this.lf;this.kf.ev(this.hf,i),cs(t)}}),{passive:!1}),this.Rf.addEventListener("touchend",(t=>{this.hv(t.touches)})))}hv(t){1===t.length&&(this.af=!1),2!==t.length||this.af||this.Xd?this.lv():this.av(t)}av(t){const i=this.Rf.getBoundingClientRect()||{left:0,top:0};this.hf={et:(t[0].clientX-i.left+(t[1].clientX-i.left))/2,rt:(t[0].clientY-i.top+(t[1].clientY-i.top))/2},this.lf=us(t[0],t[1]),void 0!==this.kf.sv&&this.kf.sv(),this.Of()}lv(){null!==this.hf&&(this.hf=null,void 0!==this.kf.rv&&this.kf.rv())}iv(t){if(this.sf&&this.sf(),this.bf(t))return;if(!this.ff)return;const i=this.wf(t);this.Cf(i,this.kf.ov),this.ff=!ts()}Zf(t){const i=vs(t.touches,v(this.df));if(null===i)return;const n=this.wf(t,i);this.xf(n,this.kf._v),this.Qd=!0,this.Xd=!0}bf(t){return t.sourceCapabilities&&void 0!==t.sourceCapabilities.firesTouchEvents?t.sourceCapabilities.firesTouchEvents:fs(t){"touchstart"!==t.type&&cs(t)}}}}function us(t,i){const n=t.clientX-i.clientX,s=t.clientY-i.clientY;return Math.sqrt(n*n+s*s)}function cs(t){t.cancelable&&t.preventDefault()}function ds(t){return{et:t.pageX,rt:t.pageY}}function fs(t){return t.timeStamp||performance.now()}function vs(t,i){for(let n=0;n{var s,e,r,h;return(null!==(e=null===(s=n.At())||void 0===s?void 0:s.xa())&&void 0!==e?e:"")!==i?[]:null!==(h=null===(r=n.la)||void 0===r?void 0:r.call(n,t))&&void 0!==h?h:[]}}class ws{constructor(i,n,s,e){this.Li=null,this.wv=null,this.gv=!1,this.Mv=new ti(200),this.Gr=null,this.xv=0,this.Sv=!1,this.kv=()=>{this.Sv||this.nn.yv().qt().Fh()},this.Cv=()=>{this.Sv||this.nn.yv().qt().Fh()},this.nn=i,this.cn=n,this.mo=n.layout,this.kc=s,this.Tv="left"===e,this.Pv=bs("normal",e),this.Rv=bs("top",e),this.Dv=bs("bottom",e),this.Ov=document.createElement("div"),this.Ov.style.height="100%",this.Ov.style.overflow="hidden",this.Ov.style.width="25px",this.Ov.style.left="0",this.Ov.style.position="relative",this.Av=rs(this.Ov,t.size({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.kv);const r=this.Av.canvasElement;r.style.position="absolute",r.style.zIndex="1",r.style.left="0",r.style.top="0",this.Vv=rs(this.Ov,t.size({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.Cv);const h=this.Vv.canvasElement;h.style.position="absolute",h.style.zIndex="2",h.style.left="0",h.style.top="0";const l={Qf:this.Bv.bind(this),Gf:this.Bv.bind(this),Hf:this.Iv.bind(this),Wf:this.Iv.bind(this),tv:this.zv.bind(this),Yf:this.Ev.bind(this),Uf:this.Ev.bind(this),Tf:this.Lv.bind(this),Sf:this.Lv.bind(this),Bf:this.Nv.bind(this),ov:this.Fv.bind(this)};this.Wv=new _s(this.Vv.canvasElement,l,{Nf:()=>!this.cn.handleScroll.vertTouchDrag,Ff:()=>!0})}S(){this.Wv.S(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Vv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.kv),this.Av.dispose(),null!==this.Li&&this.Li.$o().p(this),this.Li=null}jv(){return this.Ov}P(){return this.mo.fontSize}Hv(){const t=this.kc.W();return this.Gr!==t.R&&(this.Mv.ir(),this.Gr=t.R),t}$v(){if(null===this.Li)return 0;let t=0;const i=this.Hv(),n=v(this.Av.canvasElement.getContext("2d"));n.save();const s=this.Li.Ea();n.font=this.Uv(),s.length>0&&(t=Math.max(this.Mv.Si(n,s[0].Za),this.Mv.Si(n,s[s.length-1].Za)));const e=this.qv();for(let i=e.length;i--;){const s=this.Mv.Si(n,e[i].Jt());s>t&&(t=s)}const r=this.Li.Pt();if(null!==r&&null!==this.wv){const i=this.Li.pn(1,r),s=this.Li.pn(this.wv.height-2,r);t=Math.max(t,this.Mv.Si(n,this.Li.Wi(Math.floor(Math.min(i,s))+.11111111111111,r)),this.Mv.Si(n,this.Li.Wi(Math.ceil(Math.max(i,s))-.11111111111111,r)))}n.restore();const h=t||34;return is(Math.ceil(i.C+i.T+i.B+i.I+5+h))}Yv(i){null!==this.wv&&t.equalSizes(this.wv,i)||(this.wv=i,this.Sv=!0,this.Av.resizeCanvasElement(i),this.Vv.resizeCanvasElement(i),this.Sv=!1,this.Ov.style.width=`${i.width}px`,this.Ov.style.height=`${i.height}px`)}Xv(){return v(this.wv).width}Ji(t){this.Li!==t&&(null!==this.Li&&this.Li.$o().p(this),this.Li=t,t.$o().l(this.ao.bind(this),this))}At(){return this.Li}ir(){const t=this.nn.Kv();this.nn.yv().qt().A_(t,v(this.At()))}Zv(i){if(null===this.wv)return;if(1!==i){this.Gv(),this.Av.applySuggestedBitmapSize();const i=t.tryCreateCanvasRenderingTarget2D(this.Av);null!==i&&(i.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Be(t)})),this.nn.Qv(i,this.Dv),this.tp(i),this.nn.Qv(i,this.Pv),this.ip(i))}this.Vv.applySuggestedBitmapSize();const n=t.tryCreateCanvasRenderingTarget2D(this.Vv);null!==n&&(n.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.np(n),this.nn.Qv(n,this.Rv))}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}gt(){var t;null===(t=this.Li)||void 0===t||t.Ea()}Bv(t){if(null===this.Li||this.Li.Fi()||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.yv().qt(),n=this.nn.Kv();this.gv=!0,i.y_(n,this.Li,t.localY)}Iv(t){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.yv().qt(),n=this.nn.Kv(),s=this.Li;i.C_(n,s,t.localY)}zv(){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const t=this.nn.yv().qt(),i=this.nn.Kv(),n=this.Li;this.gv&&(this.gv=!1,t.T_(i,n))}Ev(t){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.yv().qt(),n=this.nn.Kv();this.gv=!1,i.T_(n,this.Li)}Lv(t){this.cn.handleScale.axisDoubleClickReset.price&&this.ir()}Nv(t){if(null===this.Li)return;!this.nn.yv().qt().W().handleScale.axisPressedMouseMove.price||this.Li.ph()||this.Li.Co()||this.rp(1)}Fv(t){this.rp(0)}qv(){const t=[],i=null===this.Li?void 0:this.Li;return(n=>{for(let s=0;s{t.fillStyle=n.borderColor;const l=Math.max(1,Math.floor(h)),a=Math.floor(.5*h),o=Math.round(s.T*r);t.beginPath();for(const n of i)t.rect(Math.floor(e*r),Math.round(n.Aa*h)-a,o,l);t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{var r;t.font=this.Uv(),t.fillStyle=null!==(r=n.textColor)&&void 0!==r?r:this.mo.textColor,t.textAlign=this.Tv?"right":"left",t.textBaseline="middle";const h=this.Tv?Math.round(e-s.B):Math.round(e+s.T+s.B),l=i.map((i=>this.Mv.xi(t,i.Za)));for(let n=i.length;n--;){const s=i[n];t.fillText(s.Za,h,s.Aa+l[n])}}))}Gv(){if(null===this.wv||null===this.Li)return;let t=this.wv.height/2;const i=[],n=this.Li.No().slice(),s=this.nn.Kv(),e=this.Hv();this.Li===s.vr()&&this.nn.Kv().No().forEach((t=>{s.dr(t)&&n.push(t)}));const r=this.Li.Ta()[0],h=this.Li;n.forEach((n=>{const e=n.Rn(s,h);e.forEach((t=>{t.Vi(null),t.Bi()&&i.push(t)})),r===n&&e.length>0&&(t=e[0].yi())})),i.forEach((t=>t.Vi(t.yi())));this.Li.W().alignLabels&&this.hp(i,e,t)}hp(t,i,n){if(null===this.wv)return;const s=t.filter((t=>t.yi()<=n)),e=t.filter((t=>t.yi()>n));s.sort(((t,i)=>i.yi()-t.yi())),s.length&&e.length&&e.push(s[0]),e.sort(((t,i)=>t.yi()-i.yi()));for(const n of t){const t=Math.floor(n.zt(i)/2),s=n.yi();s>-t&&sthis.wv.height-t&&sl-r&&n.Vi(l-r)}for(let t=1;t{if(i.Ii()){i.xt(v(this.Li)).K(t,n,this.Mv,s)}}))}np(t){if(null===this.wv||null===this.Li)return;const i=this.nn.yv().qt(),n=[],s=this.nn.Kv(),e=i.Fc().Rn(s,this.Li);e.length&&n.push(e);const r=this.Hv(),h=this.Tv?"right":"left";n.forEach((i=>{i.forEach((i=>{i.xt(v(this.Li)).K(t,r,this.Mv,h)}))}))}rp(t){this.Ov.style.cursor=1===t?"ns-resize":"default"}ao(){const t=this.$v();this.xv{this.Sv||null===this.wp||this.Ui().Fh()},this.Cv=()=>{this.Sv||null===this.wp||this.Ui().Fh()},this.gp=i,this.wp=n,this.wp.I_().l(this.Mp.bind(this),this,!0),this.xp=document.createElement("td"),this.xp.style.padding="0",this.xp.style.position="relative";const s=document.createElement("div");s.style.width="100%",s.style.height="100%",s.style.position="relative",s.style.overflow="hidden",this.Sp=document.createElement("td"),this.Sp.style.padding="0",this.kp=document.createElement("td"),this.kp.style.padding="0",this.xp.appendChild(s),this.Av=rs(s,t.size({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.kv);const e=this.Av.canvasElement;e.style.position="absolute",e.style.zIndex="1",e.style.left="0",e.style.top="0",this.Vv=rs(s,t.size({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.Cv);const r=this.Vv.canvasElement;r.style.position="absolute",r.style.zIndex="2",r.style.left="0",r.style.top="0",this.yp=document.createElement("tr"),this.yp.appendChild(this.Sp),this.yp.appendChild(this.xp),this.yp.appendChild(this.kp),this.Cp(),this.Wv=new _s(this.Vv.canvasElement,this,{Nf:()=>null===this.vp&&!this.gp.W().handleScroll.vertTouchDrag,Ff:()=>null===this.vp&&!this.gp.W().handleScroll.horzTouchDrag})}S(){null!==this.lp&&this.lp.S(),null!==this.ap&&this.ap.S(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Vv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.kv),this.Av.dispose(),null!==this.wp&&this.wp.I_().p(this),this.Wv.S()}Kv(){return v(this.wp)}Tp(t){null!==this.wp&&this.wp.I_().p(this),this.wp=t,null!==this.wp&&this.wp.I_().l(ks.prototype.Mp.bind(this),this,!0),this.Cp()}yv(){return this.gp}jv(){return this.yp}Cp(){if(null!==this.wp&&(this.Pp(),0!==this.Ui().Mt().length)){if(null!==this.lp){const t=this.wp.S_();this.lp.Ji(v(t))}if(null!==this.ap){const t=this.wp.k_();this.ap.Ji(v(t))}}}Rp(){null!==this.lp&&this.lp.gt(),null!==this.ap&&this.ap.gt()}v_(){return null!==this.wp?this.wp.v_():0}p_(t){this.wp&&this.wp.p_(t)}Bf(t){if(!this.wp)return;this.Dp();const i=t.localX,n=t.localY;this.Op(i,n,t)}Qf(t){this.Dp(),this.Ap(),this.Op(t.localX,t.localY,t)}If(t){var i;if(!this.wp)return;this.Dp();const n=t.localX,s=t.localY;this.Op(n,s,t);const e=this.br(n,s);this.gp.Vp(null!==(i=null==e?void 0:e.bv)&&void 0!==i?i:null),this.Ui().Bc(e&&{Ic:e.Ic,pv:e.pv})}Xf(t){null!==this.wp&&(this.Dp(),this.Bp(t))}Tf(t){null!==this.wp&&this.Ip(this.cp,t)}Sf(t){this.Tf(t)}Hf(t){this.Dp(),this.zp(t),this.Op(t.localX,t.localY,t)}Yf(t){null!==this.wp&&(this.Dp(),this.fp=!1,this.Ep(t))}qf(t){null!==this.wp&&this.Bp(t)}_v(t){if(this.fp=!0,null===this.vp){const i={x:t.localX,y:t.localY};this.Lp(i,i,t)}}ov(t){null!==this.wp&&(this.Dp(),this.wp.qt().Bc(null),this.Np())}Fp(){return this.up}Wp(){return this.cp}sv(){this.dp=1,this.Ui().Un()}ev(t,i){if(!this.gp.W().handleScale.pinch)return;const n=5*(i-this.dp);this.dp=i,this.Ui().Uc(t.et,n)}Gf(t){this.fp=!1,this.pp=null!==this.vp,this.Ap();const i=this.Ui().Fc();null!==this.vp&&i.Tt()&&(this.mp={x:i.Kt(),y:i.Zt()},this.vp={x:t.localX,y:t.localY})}Wf(t){if(null===this.wp)return;const i=t.localX,n=t.localY;if(null===this.vp)this.zp(t);else{this.pp=!1;const s=v(this.mp),e=s.x+(i-this.vp.x),r=s.y+(n-this.vp.y);this.Op(e,r,t)}}Uf(t){0===this.yv().W().trackingMode.exitMode&&(this.pp=!0),this.jp(),this.Ep(t)}br(t,i){const n=this.wp;return null===n?null:function(t,i,n){const s=t.No(),e=function(t,i,n){var s,e;let r,h;for(const o of t){const t=null!==(e=null===(s=o.oa)||void 0===s?void 0:s.call(o,i,n))&&void 0!==e?e:[];for(const i of t)l=i.zOrder,(!(a=null==r?void 0:r.zOrder)||"top"===l&&"top"!==a||"normal"===l&&"bottom"===a)&&(r=i,h=o)}var l,a;return r&&h?{mv:r,Ic:h}:null}(s,i,n);if("top"===(null==e?void 0:e.mv.zOrder))return ps(e);for(const r of s){if(e&&e.Ic===r&&"bottom"!==e.mv.zOrder&&!e.mv.isBackground)return ps(e);const s=ms(r.Pn(t),i,n);if(null!==s)return{Ic:r,fv:s.fv,pv:s.pv};if(e&&e.Ic===r&&"bottom"!==e.mv.zOrder&&e.mv.isBackground)return ps(e)}return(null==e?void 0:e.mv)?ps(e):null}(n,t,i)}Hp(i,n){v("left"===n?this.lp:this.ap).Yv(t.size({width:i,height:this.wv.height}))}$p(){return this.wv}Yv(i){t.equalSizes(this.wv,i)||(this.wv=i,this.Sv=!0,this.Av.resizeCanvasElement(i),this.Vv.resizeCanvasElement(i),this.Sv=!1,this.xp.style.width=i.width+"px",this.xp.style.height=i.height+"px")}Up(){const t=v(this.wp);t.x_(t.S_()),t.x_(t.k_());for(const i of t.Ta())if(t.dr(i)){const n=i.At();null!==n&&t.x_(n),i.On()}}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Zv(i){if(0===i)return;if(null===this.wp)return;if(i>1&&this.Up(),null!==this.lp&&this.lp.Zv(i),null!==this.ap&&this.ap.Zv(i),1!==i){this.Av.applySuggestedBitmapSize();const i=t.tryCreateCanvasRenderingTarget2D(this.Av);null!==i&&(i.useBitmapCoordinateSpace((t=>{this.Jv(t)})),this.wp&&(this.qp(i,gs),this.Yp(i),this.Xp(i),this.qp(i,Ms),this.qp(i,xs)))}this.Vv.applySuggestedBitmapSize();const n=t.tryCreateCanvasRenderingTarget2D(this.Vv);null!==n&&(n.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.Kp(n),this.qp(n,Ss))}Zp(){return this.lp}Gp(){return this.ap}Qv(t,i){this.qp(t,i)}Mp(){null!==this.wp&&this.wp.I_().p(this),this.wp=null}Bp(t){this.Ip(this.up,t)}Ip(t,i){const n=i.localX,s=i.localY;t.M()&&t.m(this.Ui().yt().Vu(n),{x:n,y:s},i)}Jv({context:t,bitmapSize:i}){const{width:n,height:s}=i,e=this.Ui(),r=e.q(),h=e.od();r===h?X(t,0,0,n,s,h):J(t,0,0,n,s,r,h)}Yp(t){const i=v(this.wp).z_().Wh().xt();null!==i&&i.K(t,!1)}Xp(t){const i=this.Ui().Nc();this.Jp(t,Ms,hs,i),this.Jp(t,Ms,ls,i)}Kp(t){this.Jp(t,Ms,ls,this.Ui().Fc())}qp(t,i){const n=v(this.wp).No();for(const s of n)this.Jp(t,i,hs,s);for(const s of n)this.Jp(t,i,ls,s)}Jp(t,i,n,s){const e=v(this.wp),r=e.qt().Vc(),h=null!==r&&r.Ic===s,l=null!==r&&h&&void 0!==r.pv?r.pv.gr:void 0;as(i,(i=>n(i,t,h,l)),s,e)}Pp(){if(null===this.wp)return;const t=this.gp,i=this.wp.S_().W().visible,n=this.wp.k_().W().visible;i||null===this.lp||(this.Sp.removeChild(this.lp.jv()),this.lp.S(),this.lp=null),n||null===this.ap||(this.kp.removeChild(this.ap.jv()),this.ap.S(),this.ap=null);const s=t.qt().sd();i&&null===this.lp&&(this.lp=new ws(this,t.W(),s,"left"),this.Sp.appendChild(this.lp.jv())),n&&null===this.ap&&(this.ap=new ws(this,t.W(),s,"right"),this.kp.appendChild(this.ap.jv()))}Qp(t){return t.uv&&this.fp||null!==this.vp}tm(t){return Math.max(0,Math.min(t,this.wv.width-1))}im(t){return Math.max(0,Math.min(t,this.wv.height-1))}Op(t,i,n){this.Ui().Jc(this.tm(t),this.im(i),n,v(this.wp))}Np(){this.Ui().td()}jp(){this.pp&&(this.vp=null,this.Np())}Lp(t,i,n){this.vp=t,this.pp=!1,this.Op(i.x,i.y,n);const s=this.Ui().Fc();this.mp={x:s.Kt(),y:s.Zt()}}Ui(){return this.gp.qt()}Ep(t){if(!this._p)return;const i=this.Ui(),n=this.Kv();if(i.D_(n,n.vn()),this.op=null,this._p=!1,i.Kc(),null!==this.bp){const t=performance.now(),n=i.yt();this.bp.Dr(n.Eu(),t),this.bp.Yu(t)||i.Xn(this.bp)}}Dp(){this.vp=null}Ap(){if(!this.wp)return;if(this.Ui().Un(),document.activeElement!==document.body&&document.activeElement!==document.documentElement)v(document.activeElement).blur();else{const t=document.getSelection();null!==t&&t.removeAllRanges()}!this.wp.vn().Fi()&&this.Ui().yt().Fi()}zp(t){if(null===this.wp)return;const i=this.Ui(),n=i.yt();if(n.Fi())return;const s=this.gp.W(),e=s.handleScroll,r=s.kineticScroll;if((!e.pressedMouseMove||t.uv)&&(!e.horzTouchDrag&&!e.vertTouchDrag||!t.uv))return;const h=this.wp.vn(),l=performance.now();if(null!==this.op||this.Qp(t)||(this.op={x:t.clientX,y:t.clientY,kd:l,nm:t.localX,sm:t.localY}),null!==this.op&&!this._p&&(this.op.x!==t.clientX||this.op.y!==t.clientY)){if(t.uv&&r.touch||!t.uv&&r.mouse){const t=n.he();this.bp=new es(.2/t,7/t,.997,15/t),this.bp.Nd(n.Eu(),this.op.kd)}else this.bp=null;h.Fi()||i.P_(this.wp,h,t.localY),i.Yc(t.localX),this._p=!0}this._p&&(h.Fi()||i.R_(this.wp,h,t.localY),i.Xc(t.localX),null!==this.bp&&this.bp.Nd(n.Eu(),l))}}class ys{constructor(i,n,s,e,r){this.bt=!0,this.wv=t.size({width:0,height:0}),this.kv=()=>this.Zv(3),this.Tv="left"===i,this.kc=s.sd,this.cn=n,this.rm=e,this.hm=r,this.Ov=document.createElement("div"),this.Ov.style.width="25px",this.Ov.style.height="100%",this.Ov.style.overflow="hidden",this.Av=rs(this.Ov,t.size({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.kv)}S(){this.Av.unsubscribeSuggestedBitmapSizeChanged(this.kv),this.Av.dispose()}jv(){return this.Ov}$p(){return this.wv}Yv(i){t.equalSizes(this.wv,i)||(this.wv=i,this.Av.resizeCanvasElement(i),this.Ov.style.width=`${i.width}px`,this.Ov.style.height=`${i.height}px`,this.bt=!0)}Zv(i){if(i<3&&!this.bt)return;if(0===this.wv.width||0===this.wv.height)return;this.bt=!1,this.Av.applySuggestedBitmapSize();const n=t.tryCreateCanvasRenderingTarget2D(this.Av);null!==n&&n.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Be(t)}))}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Be({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(!this.rm())return;t.fillStyle=this.cn.timeScale.borderColor;const e=Math.floor(this.kc.W().C*n),r=Math.floor(this.kc.W().C*s),h=this.Tv?i.width-e:0;t.fillRect(h,0,e,r)}Jv({context:t,bitmapSize:i}){X(t,0,0,i.width,i.height,this.hm())}}function Cs(t){return i=>{var n,s;return null!==(s=null===(n=i.aa)||void 0===n?void 0:n.call(i,t))&&void 0!==s?s:[]}}const Ts=Cs("normal"),Ps=Cs("top"),Rs=Cs("bottom");class Ds{constructor(i,n){this.lm=null,this.am=null,this.k=null,this.om=!1,this.wv=t.size({width:0,height:0}),this._m=new C,this.Mv=new ti(5),this.Sv=!1,this.kv=()=>{this.Sv||this.gp.qt().Fh()},this.Cv=()=>{this.Sv||this.gp.qt().Fh()},this.gp=i,this.N_=n,this.cn=i.W().layout,this.um=document.createElement("tr"),this.dm=document.createElement("td"),this.dm.style.padding="0",this.fm=document.createElement("td"),this.fm.style.padding="0",this.Ov=document.createElement("td"),this.Ov.style.height="25px",this.Ov.style.padding="0",this.vm=document.createElement("div"),this.vm.style.width="100%",this.vm.style.height="100%",this.vm.style.position="relative",this.vm.style.overflow="hidden",this.Ov.appendChild(this.vm),this.Av=rs(this.vm,t.size({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.kv);const s=this.Av.canvasElement;s.style.position="absolute",s.style.zIndex="1",s.style.left="0",s.style.top="0",this.Vv=rs(this.vm,t.size({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.Cv);const e=this.Vv.canvasElement;e.style.position="absolute",e.style.zIndex="2",e.style.left="0",e.style.top="0",this.um.appendChild(this.dm),this.um.appendChild(this.Ov),this.um.appendChild(this.fm),this.pm(),this.gp.qt().f_().l(this.pm.bind(this),this),this.Wv=new _s(this.Vv.canvasElement,this,{Nf:()=>!0,Ff:()=>!this.gp.W().handleScroll.horzTouchDrag})}S(){this.Wv.S(),null!==this.lm&&this.lm.S(),null!==this.am&&this.am.S(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Vv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.kv),this.Av.dispose()}jv(){return this.um}bm(){return this.lm}wm(){return this.am}Qf(t){if(this.om)return;this.om=!0;const i=this.gp.qt();!i.yt().Fi()&&this.gp.W().handleScale.axisPressedMouseMove.time&&i.$c(t.localX)}Gf(t){this.Qf(t)}tv(){const t=this.gp.qt();!t.yt().Fi()&&this.om&&(this.om=!1,this.gp.W().handleScale.axisPressedMouseMove.time&&t.Gc())}Hf(t){const i=this.gp.qt();!i.yt().Fi()&&this.gp.W().handleScale.axisPressedMouseMove.time&&i.Zc(t.localX)}Wf(t){this.Hf(t)}Yf(){this.om=!1;const t=this.gp.qt();t.yt().Fi()&&!this.gp.W().handleScale.axisPressedMouseMove.time||t.Gc()}Uf(){this.Yf()}Tf(){this.gp.W().handleScale.axisDoubleClickReset.time&&this.gp.qt().Zn()}Sf(){this.Tf()}Bf(){this.gp.qt().W().handleScale.axisPressedMouseMove.time&&this.rp(1)}ov(){this.rp(0)}$p(){return this.wv}gm(){return this._m}Mm(i,n,s){t.equalSizes(this.wv,i)||(this.wv=i,this.Sv=!0,this.Av.resizeCanvasElement(i),this.Vv.resizeCanvasElement(i),this.Sv=!1,this.Ov.style.width=`${i.width}px`,this.Ov.style.height=`${i.height}px`,this._m.m(i)),null!==this.lm&&this.lm.Yv(t.size({width:n,height:i.height})),null!==this.am&&this.am.Yv(t.size({width:s,height:i.height}))}xm(){const t=this.Sm();return Math.ceil(t.C+t.T+t.P+t.L+t.V+t.km)}gt(){this.gp.qt().yt().Ea()}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Zv(i){if(0===i)return;if(1!==i){this.Av.applySuggestedBitmapSize();const n=t.tryCreateCanvasRenderingTarget2D(this.Av);null!==n&&(n.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Be(t),this.ym(n,Rs)})),this.tp(n),this.ym(n,Ts)),null!==this.lm&&this.lm.Zv(i),null!==this.am&&this.am.Zv(i)}this.Vv.applySuggestedBitmapSize();const n=t.tryCreateCanvasRenderingTarget2D(this.Vv);null!==n&&(n.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.Cm([...this.gp.qt().Mt(),this.gp.qt().Fc()],n),this.ym(n,Ps))}ym(t,i){const n=this.gp.qt().Mt();for(const s of n)as(i,(i=>hs(i,t,!1,void 0)),s,void 0);for(const s of n)as(i,(i=>ls(i,t,!1,void 0)),s,void 0)}Jv({context:t,bitmapSize:i}){X(t,0,0,i.width,i.height,this.gp.qt().od())}Be({context:t,bitmapSize:i,verticalPixelRatio:n}){if(this.gp.W().timeScale.borderVisible){t.fillStyle=this.Tm();const s=Math.max(1,Math.floor(this.Sm().C*n));t.fillRect(0,0,i.width,s)}}tp(t){const i=this.gp.qt().yt(),n=i.Ea();if(!n||0===n.length)return;const s=this.N_.maxTickMarkWeight(n),e=this.Sm(),r=i.W();r.borderVisible&&r.ticksVisible&&t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:i,verticalPixelRatio:s})=>{t.strokeStyle=this.Tm(),t.fillStyle=this.Tm();const r=Math.max(1,Math.floor(i)),h=Math.floor(.5*i);t.beginPath();const l=Math.round(e.T*s);for(let s=n.length;s--;){const e=Math.round(n[s].coord*i);t.rect(e-h,0,r,l)}t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{const i=e.C+e.T+e.L+e.P/2;t.textAlign="center",t.textBaseline="middle",t.fillStyle=this.$(),t.font=this.Uv();for(const e of n)if(e.weight=s){const n=e.needAlignCoordinate?this.Pm(t,e.coord,e.label):e.coord;t.fillText(e.label,n,i)}}))}Pm(t,i,n){const s=this.Mv.Si(t,n),e=s/2,r=Math.floor(i-e)+.5;return r<0?i+=Math.abs(0-r):r+s>this.wv.width&&(i-=Math.abs(this.wv.width-(r+s))),i}Cm(t,i){const n=this.Sm();for(const s of t)for(const t of s.tn())t.xt().K(i,n)}Tm(){return this.gp.W().timeScale.borderColor}$(){return this.cn.textColor}j(){return this.cn.fontSize}Uv(){return z(this.j(),this.cn.fontFamily)}Rm(){return z(this.j(),this.cn.fontFamily,"bold")}Sm(){null===this.k&&(this.k={C:1,N:NaN,L:NaN,V:NaN,Hi:NaN,T:5,P:NaN,R:"",ji:new ti,km:0});const t=this.k,i=this.Uv();if(t.R!==i){const n=this.j();t.P=n,t.R=i,t.L=3*n/12,t.V=3*n/12,t.Hi=9*n/12,t.N=0,t.km=4*n/12,t.ji.ir()}return this.k}rp(t){this.Ov.style.cursor=1===t?"ew-resize":"default"}pm(){const t=this.gp.qt(),i=t.W();i.leftPriceScale.visible||null===this.lm||(this.dm.removeChild(this.lm.jv()),this.lm.S(),this.lm=null),i.rightPriceScale.visible||null===this.am||(this.fm.removeChild(this.am.jv()),this.am.S(),this.am=null);const n={sd:this.gp.qt().sd()},s=()=>i.leftPriceScale.borderVisible&&t.yt().W().borderVisible,e=()=>t.od();i.leftPriceScale.visible&&null===this.lm&&(this.lm=new ys("left",i,n,s,e),this.dm.appendChild(this.lm.jv())),i.rightPriceScale.visible&&null===this.am&&(this.am=new ys("right",i,n,s,e),this.fm.appendChild(this.am.jv()))}}const Os=!!Jn&&!!navigator.userAgentData&&navigator.userAgentData.brands.some((t=>t.brand.includes("Chromium")))&&!!Jn&&((null===(As=null===navigator||void 0===navigator?void 0:navigator.userAgentData)||void 0===As?void 0:As.platform)?"Windows"===navigator.userAgentData.platform:navigator.userAgent.toLowerCase().indexOf("win")>=0);var As;class Vs{constructor(t,i,n){var s;this.Dm=[],this.Om=0,this.Qa=0,this.e_=0,this.Am=0,this.Vm=0,this.Bm=null,this.Im=!1,this.up=new C,this.cp=new C,this.Mc=new C,this.zm=null,this.Em=null,this.Lm=t,this.cn=i,this.N_=n,this.um=document.createElement("div"),this.um.classList.add("tv-lightweight-charts"),this.um.style.overflow="hidden",this.um.style.direction="ltr",this.um.style.width="100%",this.um.style.height="100%",(s=this.um).style.userSelect="none",s.style.webkitUserSelect="none",s.style.msUserSelect="none",s.style.MozUserSelect="none",s.style.webkitTapHighlightColor="transparent",this.Nm=document.createElement("table"),this.Nm.setAttribute("cellspacing","0"),this.um.appendChild(this.Nm),this.Fm=this.Wm.bind(this),Bs(this.cn)&&this.jm(!0),this.Ui=new Vn(this.Sc.bind(this),this.cn,n),this.qt().Wc().l(this.Hm.bind(this),this),this.$m=new Ds(this,this.N_),this.Nm.appendChild(this.$m.jv());const e=i.autoSize&&this.Um();let r=this.cn.width,h=this.cn.height;if(e||0===r||0===h){const i=t.getBoundingClientRect();r=r||i.width,h=h||i.height}this.qm(r,h),this.Ym(),t.appendChild(this.um),this.Xm(),this.Ui.yt().Gu().l(this.Ui.$l.bind(this.Ui),this),this.Ui.f_().l(this.Ui.$l.bind(this.Ui),this)}qt(){return this.Ui}W(){return this.cn}Km(){return this.Dm}Zm(){return this.$m}S(){this.jm(!1),0!==this.Om&&window.cancelAnimationFrame(this.Om),this.Ui.Wc().p(this),this.Ui.yt().Gu().p(this),this.Ui.f_().p(this),this.Ui.S();for(const t of this.Dm)this.Nm.removeChild(t.jv()),t.Fp().p(this),t.Wp().p(this),t.S();this.Dm=[],v(this.$m).S(),null!==this.um.parentElement&&this.um.parentElement.removeChild(this.um),this.Mc.S(),this.up.S(),this.cp.S(),this.Gm()}qm(i,n,s=!1){if(this.Qa===n&&this.e_===i)return;const e=function(i){const n=Math.floor(i.width),s=Math.floor(i.height),e=n-n%2,r=s-s%2;return t.size({width:e,height:r})}(t.size({width:i,height:n}));this.Qa=e.height,this.e_=e.width;const r=this.Qa+"px",h=this.e_+"px";v(this.um).style.height=r,v(this.um).style.width=h,this.Nm.style.height=r,this.Nm.style.width=h,s?this.Jm(ot.es(),performance.now()):this.Ui.$l()}Zv(t){void 0===t&&(t=ot.es());for(let i=0;i{let s=0;for(let e=0;e{v("left"===t?this.$m.bm():this.$m.wm()).ep(v(i),n,s)};if(this.cn.timeScale.visible){const t=this.$m.sp();if(null!==i){let n=0;this.sb()&&(h("left",n,s),n=v(e.Zp()).sp().width),this.$m.ep(i,n,s),n+=t.width,this.eb()&&h("right",n,s)}s+=t.height}return t.size({width:n,height:s})}ob(){let i=0,n=0,s=0;for(const t of this.Dm)this.sb()&&(n=Math.max(n,v(t.Zp()).$v(),this.cn.leftPriceScale.minimumWidth)),this.eb()&&(s=Math.max(s,v(t.Gp()).$v(),this.cn.rightPriceScale.minimumWidth)),i+=t.v_();n=is(n),s=is(s);const e=this.e_,r=this.Qa,h=Math.max(e-n-s,0),l=this.cn.timeScale.visible;let a=l?Math.max(this.$m.xm(),this.cn.timeScale.minimumHeight):0;var o;a=(o=a)+o%2;const _=0+a,u=r<_?0:r-_,c=u/i;let d=0;for(let i=0;i{t.Rp()})),3===(null===(n=this.Bm)||void 0===n?void 0:n.jn())&&(this.Bm.ts(t),this.ub(),this.cb(this.Bm),this.fb(this.Bm,i),t=this.Bm,this.Bm=null)),this.Zv(t)}fb(t,i){for(const n of t.Qn())this.ns(n,i)}cb(t){const i=this.Ui.Lc();for(let n=0;n{if(this.Im=!1,this.Om=0,null!==this.Bm){const i=this.Bm;this.Bm=null,this.Jm(i,t);for(const n of i.Qn())if(5===n.qn&&!n.Vt.Yu(t)){this.qt().Xn(n.Vt);break}}})))}ub(){this.Ym()}Ym(){const t=this.Ui.Lc(),i=t.length,n=this.Dm.length;for(let t=i;t{const n=i.In().nl(t);null!==n&&e.set(i,n)}))}let r;if(null!==t){const i=null===(s=this.Ui.yt().qi(t))||void 0===s?void 0:s.originalTime;void 0!==i&&(r=i)}const h=this.qt().Vc(),l=null!==h&&h.Ic instanceof Xi?h.Ic:void 0,a=null!==h&&void 0!==h.pv?h.pv.wr:void 0;return{bb:r,se:null!=t?t:void 0,wb:null!=i?i:void 0,gb:l,Mb:e,xb:a,Sb:null!=n?n:void 0}}vb(t,i,n){this.up.m((()=>this.mb(t,i,n)))}pb(t,i,n){this.cp.m((()=>this.mb(t,i,n)))}Hm(t,i,n){this.Mc.m((()=>this.mb(t,i,n)))}Xm(){const t=this.cn.timeScale.visible?"":"none";this.$m.jv().style.display=t}sb(){return this.Dm[0].Kv().S_().W().visible}eb(){return this.Dm[0].Kv().k_().W().visible}Um(){return"ResizeObserver"in window&&(this.zm=new ResizeObserver((t=>{const i=t.find((t=>t.target===this.Lm));i&&this.qm(i.contentRect.width,i.contentRect.height)})),this.zm.observe(this.Lm,{box:"border-box"}),!0)}Gm(){null!==this.zm&&this.zm.disconnect(),this.zm=null}}function Bs(t){return Boolean(t.handleScroll.mouseWheel||t.handleScale.mouseWheel)}function Is(t,i){var n={};for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&i.indexOf(s)<0&&(n[s]=t[s]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var e=0;for(s=Object.getOwnPropertySymbols(t);efunction(t,i){return i?i(t):void 0===(n=t).open&&void 0===n.value;var n}(s,h)?Hs({ut:i,se:n,bb:e},s):Hs(t(i,n,s,e,r),s)}function Us(t){return{Candlestick:$s(Fs),Bar:$s(Ns),Area:$s(Es),Baseline:$s(Ls),Histogram:$s(zs),Line:$s(zs),Custom:$s(Ws)}[t]}function qs(t){return{se:0,yb:new Map,ia:t}}function Ys(t,i){if(void 0!==t&&0!==t.length)return{Cb:i.key(t[0].ut),Tb:i.key(t[t.length-1].ut)}}function Xs(t){let i;return t.forEach((t=>{void 0===i&&(i=t.bb)})),f(i)}class Ks{constructor(t){this.Pb=new Map,this.Rb=new Map,this.Db=new Map,this.Ob=[],this.N_=t}S(){this.Pb.clear(),this.Rb.clear(),this.Db.clear(),this.Ob=[]}Ab(t,i){let n=0!==this.Pb.size,s=!1;const e=this.Rb.get(t);if(void 0!==e)if(1===this.Rb.size)n=!1,s=!0,this.Pb.clear();else for(const i of this.Ob)i.pointData.yb.delete(t)&&(s=!0);let r=[];if(0!==i.length){const n=i.map((t=>t.time)),e=this.N_.createConverterToInternalObj(i),h=Us(t.Xh()),l=t.ga(),a=t.Ma();r=i.map(((i,r)=>{const o=e(i.time),_=this.N_.key(o);let u=this.Pb.get(_);void 0===u&&(u=qs(o),this.Pb.set(_,u),s=!0);const c=h(o,u.se,i,n[r],l,a);return u.yb.set(t,c),c}))}n&&this.Vb(),this.Bb(t,r);let h=-1;if(s){const t=[];this.Pb.forEach((i=>{t.push({timeWeight:0,time:i.ia,pointData:i,originalTime:Xs(i.yb)})})),t.sort(((t,i)=>this.N_.key(t.time)-this.N_.key(i.time))),h=this.Ib(t)}return this.zb(t,h,function(t,i,n){const s=Ys(t,n),e=Ys(i,n);if(void 0!==s&&void 0!==e)return{Xl:s.Tb>=e.Tb&&s.Cb>=e.Cb}}(this.Rb.get(t),e,this.N_))}hd(t){return this.Ab(t,[])}Eb(t,i){const n=i;!function(t){void 0===t.bb&&(t.bb=t.time)}(n),this.N_.preprocessData(i);const s=this.N_.createConverterToInternalObj([i])(i.time),e=this.Db.get(t);if(void 0!==e&&this.N_.key(s)this.N_.key(t.time)this.N_.key(s.ut)?js(i)&&n.push(i):js(i)?n[n.length-1]=i:n.splice(-1,1),this.Db.set(t,i.ut)}Bb(t,i){0!==i.length?(this.Rb.set(t,i.filter(js)),this.Db.set(t,i[i.length-1].ut)):(this.Rb.delete(t),this.Db.delete(t))}Vb(){for(const t of this.Ob)0===t.pointData.yb.size&&this.Pb.delete(this.N_.key(t.time))}Ib(t){let i=-1;for(let n=0;n{0!==i.length&&(t=Math.max(t,i[i.length-1].se))})),t}zb(t,i,n){const s={Fb:new Map,yt:{Au:this.Nb()}};if(-1!==i)this.Rb.forEach(((i,e)=>{s.Fb.set(e,{He:i,Wb:e===t?n:void 0})})),this.Rb.has(t)||s.Fb.set(t,{He:[],Wb:n}),s.yt.jb=this.Ob,s.yt.Hb=i;else{const i=this.Rb.get(t);s.Fb.set(t,{He:i||[],Wb:n})}return s}}function Zs(t,i){t.se=i,t.yb.forEach((t=>{t.se=i}))}function Gs(t){const i={value:t.Vt[3],time:t.bb};return void 0!==t.kb&&(i.customValues=t.kb),i}function Js(t){const i=Gs(t);return void 0!==t.O&&(i.color=t.O),i}function Qs(t){const i=Gs(t);return void 0!==t._t&&(i.lineColor=t._t),void 0!==t.Ts&&(i.topColor=t.Ts),void 0!==t.Ps&&(i.bottomColor=t.Ps),i}function te(t){const i=Gs(t);return void 0!==t.Pe&&(i.topLineColor=t.Pe),void 0!==t.Re&&(i.bottomLineColor=t.Re),void 0!==t.Se&&(i.topFillColor1=t.Se),void 0!==t.ke&&(i.topFillColor2=t.ke),void 0!==t.ye&&(i.bottomFillColor1=t.ye),void 0!==t.Ce&&(i.bottomFillColor2=t.Ce),i}function ie(t){const i={open:t.Vt[0],high:t.Vt[1],low:t.Vt[2],close:t.Vt[3],time:t.bb};return void 0!==t.kb&&(i.customValues=t.kb),i}function ne(t){const i=ie(t);return void 0!==t.O&&(i.color=t.O),i}function se(t){const i=ie(t),{O:n,Bt:s,$h:e}=t;return void 0!==n&&(i.color=n),void 0!==s&&(i.borderColor=s),void 0!==e&&(i.wickColor=e),i}function ee(t){return{Area:Qs,Line:Js,Baseline:te,Histogram:Js,Bar:ne,Candlestick:se,Custom:re}[t]}function re(t){const i=t.bb;return Object.assign(Object.assign({},t.He),{time:i})}const he={vertLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},horzLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},mode:1},le={vertLines:{color:"#D6DCDE",style:0,visible:!0},horzLines:{color:"#D6DCDE",style:0,visible:!0}},ae={background:{type:"solid",color:"#FFFFFF"},textColor:"#191919",fontSize:12,fontFamily:I},oe={autoScale:!0,mode:0,invertScale:!1,alignLabels:!0,borderVisible:!0,borderColor:"#2B2B43",entireTextOnly:!1,visible:!1,ticksVisible:!1,scaleMargins:{bottom:.1,top:.2},minimumWidth:0},_e={rightOffset:0,barSpacing:6,minBarSpacing:.5,fixLeftEdge:!1,fixRightEdge:!1,lockVisibleTimeRangeOnResize:!1,rightBarStaysOnScroll:!1,borderVisible:!0,borderColor:"#2B2B43",visible:!0,timeVisible:!1,secondsVisible:!0,shiftVisibleRangeOnNewBar:!0,allowShiftVisibleRangeOnWhitespaceReplacement:!1,ticksVisible:!1,uniformDistribution:!1,minimumHeight:0},ue={color:"rgba(0, 0, 0, 0)",visible:!1,fontSize:48,fontFamily:I,fontStyle:"",text:"",horzAlign:"center",vertAlign:"center"};function ce(){return{width:0,height:0,autoSize:!1,layout:ae,crosshair:he,grid:le,overlayPriceScales:Object.assign({},oe),leftPriceScale:Object.assign(Object.assign({},oe),{visible:!1}),rightPriceScale:Object.assign(Object.assign({},oe),{visible:!0}),timeScale:_e,watermark:ue,localization:{locale:Jn?navigator.language:"",dateFormat:"dd MMM 'yy"},handleScroll:{mouseWheel:!0,pressedMouseMove:!0,horzTouchDrag:!0,vertTouchDrag:!0},handleScale:{axisPressedMouseMove:{time:!0,price:!0},axisDoubleClickReset:{time:!0,price:!0},mouseWheel:!0,pinch:!0},kineticScroll:{mouse:!1,touch:!0},trackingMode:{exitMode:1}}}class de{constructor(t,i){this.$b=t,this.Ub=i}applyOptions(t){this.$b.qt().zc(this.Ub,t)}options(){return this.Li().W()}width(){return at(this.Ub)?this.$b.nb(this.Ub):0}Li(){return v(this.$b.qt().Ec(this.Ub)).At}}function fe(t,i,n){const s=Is(t,["time","originalTime"]),e=Object.assign({time:i},s);return void 0!==n&&(e.originalTime=n),e}const ve={color:"#FF0000",price:0,lineStyle:2,lineWidth:1,lineVisible:!0,axisLabelVisible:!0,title:"",axisLabelColor:"",axisLabelTextColor:""};class pe{constructor(t){this.Bh=t}applyOptions(t){this.Bh.Nh(t)}options(){return this.Bh.W()}qb(){return this.Bh}}class me{constructor(t,i,n,s,e){this.Yb=new C,this.Es=t,this.Xb=i,this.Kb=n,this.N_=e,this.Zb=s}S(){this.Yb.S()}priceFormatter(){return this.Es.ca()}priceToCoordinate(t){const i=this.Es.Pt();return null===i?null:this.Es.At().Ot(t,i.Vt)}coordinateToPrice(t){const i=this.Es.Pt();return null===i?null:this.Es.At().pn(t,i.Vt)}barsInLogicalRange(t){if(null===t)return null;const i=new xn(new wn(t.from,t.to)).iu(),n=this.Es.In();if(n.Fi())return null;const s=n.nl(i.Os(),1),e=n.nl(i.di(),-1),r=v(n.Qh()),h=v(n.Bn());if(null!==s&&null!==e&&s.se>e.se)return{barsBefore:t.from-r,barsAfter:h-t.to};const l={barsBefore:null===s||s.se===r?t.from-r:s.se-r,barsAfter:null===e||e.se===h?h-t.to:h-e.se};return null!==s&&null!==e&&(l.from=s.bb,l.to=e.bb),l}setData(t){this.N_,this.Es.Xh(),this.Xb.Gb(this.Es,t),this.Jb("full")}update(t){this.Es.Xh(),this.Xb.Qb(this.Es,t),this.Jb("update")}dataByIndex(t,i){const n=this.Es.In().nl(t,i);if(null===n)return null;return ee(this.seriesType())(n)}data(){const t=ee(this.seriesType());return this.Es.In().ie().map((i=>t(i)))}subscribeDataChanged(t){this.Yb.l(t)}unsubscribeDataChanged(t){this.Yb.v(t)}setMarkers(t){this.N_;const i=t.map((t=>fe(t,this.N_.convertHorzItemToInternal(t.time),t.time)));this.Es.Zl(i)}markers(){return this.Es.Gl().map((t=>fe(t,t.originalTime,void 0)))}applyOptions(t){this.Es.Nh(t)}options(){return A(this.Es.W())}priceScale(){return this.Kb.priceScale(this.Es.At().xa())}createPriceLine(t){const i=T(A(ve),t),n=this.Es.Jl(i);return new pe(n)}removePriceLine(t){this.Es.Ql(t.qb())}seriesType(){return this.Es.Xh()}attachPrimitive(t){this.Es.ba(t),t.attached&&t.attached({chart:this.Zb,series:this,requestUpdate:()=>this.Es.qt().$l()})}detachPrimitive(t){this.Es.wa(t),t.detached&&t.detached()}Jb(t){this.Yb.M()&&this.Yb.m(t)}}class be{constructor(t,i,n){this.tw=new C,this.uu=new C,this._m=new C,this.Ui=t,this.wl=t.yt(),this.$m=i,this.wl.Ku().l(this.iw.bind(this)),this.wl.Zu().l(this.nw.bind(this)),this.$m.gm().l(this.sw.bind(this)),this.N_=n}S(){this.wl.Ku().p(this),this.wl.Zu().p(this),this.$m.gm().p(this),this.tw.S(),this.uu.S(),this._m.S()}scrollPosition(){return this.wl.Eu()}scrollToPosition(t,i){i?this.wl.qu(t,1e3):this.Ui.Jn(t)}scrollToRealTime(){this.wl.Uu()}getVisibleRange(){const t=this.wl.yu();return null===t?null:{from:t.from.originalTime,to:t.to.originalTime}}setVisibleRange(t){const i={from:this.N_.convertHorzItemToInternal(t.from),to:this.N_.convertHorzItemToInternal(t.to)},n=this.wl.Ru(i);this.Ui.ld(n)}getVisibleLogicalRange(){const t=this.wl.ku();return null===t?null:{from:t.Os(),to:t.di()}}setVisibleLogicalRange(t){d(t.from<=t.to,"The from index cannot be after the to index."),this.Ui.ld(t)}resetTimeScale(){this.Ui.Zn()}fitContent(){this.Ui.Qu()}logicalToCoordinate(t){const i=this.Ui.yt();return i.Fi()?null:i.Et(t)}coordinateToLogical(t){return this.wl.Fi()?null:this.wl.Vu(t)}timeToCoordinate(t){const i=this.N_.convertHorzItemToInternal(t),n=this.wl.ya(i,!1);return null===n?null:this.wl.Et(n)}coordinateToTime(t){const i=this.Ui.yt(),n=i.Vu(t),s=i.qi(n);return null===s?null:s.originalTime}width(){return this.$m.$p().width}height(){return this.$m.$p().height}subscribeVisibleTimeRangeChange(t){this.tw.l(t)}unsubscribeVisibleTimeRangeChange(t){this.tw.v(t)}subscribeVisibleLogicalRangeChange(t){this.uu.l(t)}unsubscribeVisibleLogicalRangeChange(t){this.uu.v(t)}subscribeSizeChange(t){this._m.l(t)}unsubscribeSizeChange(t){this._m.v(t)}applyOptions(t){this.wl.Nh(t)}options(){return Object.assign(Object.assign({},A(this.wl.W())),{barSpacing:this.wl.he()})}iw(){this.tw.M()&&this.tw.m(this.getVisibleRange())}nw(){this.uu.M()&&this.uu.m(this.getVisibleLogicalRange())}sw(t){this._m.m(t.width,t.height)}}function we(t){if(void 0===t||"custom"===t.type)return;const i=t;void 0!==i.minMove&&void 0===i.precision&&(i.precision=function(t){if(t>=1)return 0;let i=0;for(;i<8;i++){const n=Math.round(t);if(Math.abs(n-t)<1e-8)return i;t*=10}return i}(i.minMove))}function ge(t){return function(t){if(O(t.handleScale)){const i=t.handleScale;t.handleScale={axisDoubleClickReset:{time:i,price:i},axisPressedMouseMove:{time:i,price:i},mouseWheel:i,pinch:i}}else if(void 0!==t.handleScale){const{axisPressedMouseMove:i,axisDoubleClickReset:n}=t.handleScale;O(i)&&(t.handleScale.axisPressedMouseMove={time:i,price:i}),O(n)&&(t.handleScale.axisDoubleClickReset={time:n,price:n})}const i=t.handleScroll;O(i)&&(t.handleScroll={horzTouchDrag:i,vertTouchDrag:i,mouseWheel:i,pressedMouseMove:i})}(t),t}class Me{constructor(t,i,n){this.ew=new Map,this.rw=new Map,this.hw=new C,this.lw=new C,this.aw=new C,this.ow=new Ks(i);const s=void 0===n?A(ce()):T(A(ce()),ge(n));this.N_=i,this.$b=new Vs(t,s,i),this.$b.Fp().l((t=>{this.hw.M()&&this.hw.m(this._w(t()))}),this),this.$b.Wp().l((t=>{this.lw.M()&&this.lw.m(this._w(t()))}),this),this.$b.Wc().l((t=>{this.aw.M()&&this.aw.m(this._w(t()))}),this);const e=this.$b.qt();this.uw=new be(e,this.$b.Zm(),this.N_)}remove(){this.$b.Fp().p(this),this.$b.Wp().p(this),this.$b.Wc().p(this),this.uw.S(),this.$b.S(),this.ew.clear(),this.rw.clear(),this.hw.S(),this.lw.S(),this.aw.S(),this.ow.S()}resize(t,i,n){this.autoSizeActive()||this.$b.qm(t,i,n)}addCustomSeries(t,i){const n=p(t),s=Object.assign(Object.assign({},l),n.defaultOptions());return this.cw("Custom",s,i,n)}addAreaSeries(t){return this.cw("Area",e,t)}addBaselineSeries(t){return this.cw("Baseline",r,t)}addBarSeries(t){return this.cw("Bar",n,t)}addCandlestickSeries(t={}){return function(t){void 0!==t.borderColor&&(t.borderUpColor=t.borderColor,t.borderDownColor=t.borderColor),void 0!==t.wickColor&&(t.wickUpColor=t.wickColor,t.wickDownColor=t.wickColor)}(t),this.cw("Candlestick",i,t)}addHistogramSeries(t){return this.cw("Histogram",h,t)}addLineSeries(t){return this.cw("Line",s,t)}removeSeries(t){const i=f(this.ew.get(t)),n=this.ow.hd(i);this.$b.qt().hd(i),this.dw(n),this.ew.delete(t),this.rw.delete(i)}Gb(t,i){this.dw(this.ow.Ab(t,i))}Qb(t,i){this.dw(this.ow.Eb(t,i))}subscribeClick(t){this.hw.l(t)}unsubscribeClick(t){this.hw.v(t)}subscribeCrosshairMove(t){this.aw.l(t)}unsubscribeCrosshairMove(t){this.aw.v(t)}subscribeDblClick(t){this.lw.l(t)}unsubscribeDblClick(t){this.lw.v(t)}priceScale(t){return new de(this.$b,t)}timeScale(){return this.uw}applyOptions(t){this.$b.Nh(ge(t))}options(){return this.$b.W()}takeScreenshot(){return this.$b.tb()}autoSizeActive(){return this.$b.rb()}chartElement(){return this.$b.hb()}paneSize(){const t=this.$b.ab();return{height:t.height,width:t.width}}setCrosshairPosition(t,i,n){const s=this.ew.get(n);if(void 0===s)return;const e=this.$b.qt().cr(s);null!==e&&this.$b.qt().Qc(t,i,e)}clearCrosshairPosition(){this.$b.qt().td(!0)}cw(t,i,n={},s){we(n.priceFormat);const e=T(A(a),A(i),n),r=this.$b.qt().ed(t,e,s),h=new me(r,this,this,this,this.N_);return this.ew.set(h,r),this.rw.set(r,h),h}dw(t){const i=this.$b.qt();i.nd(t.yt.Au,t.yt.jb,t.yt.Hb),t.Fb.forEach(((t,i)=>i.it(t.He,t.Wb))),i.Iu()}fw(t){return f(this.rw.get(t))}_w(t){const i=new Map;t.Mb.forEach(((t,n)=>{const s=n.Xh(),e=ee(s)(t);if("Custom"!==s)d(function(t){return void 0!==t.open||void 0!==t.value}(e));else{const t=n.Ma();d(!t||!1===t(e))}i.set(this.fw(n),e)}));const n=void 0===t.gb?void 0:this.fw(t.gb);return{time:t.bb,logical:t.se,point:t.wb,hoveredSeries:n,hoveredObjectId:t.xb,seriesData:i,sourceEvent:t.Sb}}}function xe(t,i,n){let s;if(D(t)){const i=document.getElementById(t);d(null!==i,`Cannot find element in DOM with id=${t}`),s=i}else s=t;const e=new Me(s,i,n);return i.setOptions(e.options()),e}const Se=Object.assign(Object.assign({},a),l);exports.createChart=function(t,i){return xe(t,new Gn,Gn.Td(i))},exports.createChartEx=xe,exports.customSeriesDefaultOptions=Se,exports.isBusinessDay=Bn,exports.isUTCTimestamp=In,exports.version=function(){return"4.1.1"}; -+"use strict";var t=require("fancy-canvas");const i={upColor:"#26a69a",downColor:"#ef5350",wickVisible:!0,borderVisible:!0,borderColor:"#378658",borderUpColor:"#26a69a",borderDownColor:"#ef5350",wickColor:"#737375",wickUpColor:"#26a69a",wickDownColor:"#ef5350"},n={upColor:"#26a69a",downColor:"#ef5350",openVisible:!0,thinBars:!0},s={color:"#2196f3",lineStyle:0,lineWidth:3,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},e={topColor:"rgba( 46, 220, 135, 0.4)",bottomColor:"rgba( 40, 221, 100, 0)",invertFilledArea:!1,lineColor:"#33D778",lineStyle:0,lineWidth:3,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},r={baseValue:{type:"price",price:0},topFillColor1:"rgba(38, 166, 154, 0.28)",topFillColor2:"rgba(38, 166, 154, 0.05)",topLineColor:"rgba(38, 166, 154, 1)",bottomFillColor1:"rgba(239, 83, 80, 0.05)",bottomFillColor2:"rgba(239, 83, 80, 0.28)",bottomLineColor:"rgba(239, 83, 80, 1)",lineWidth:3,lineStyle:0,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},h={color:"#26a69a",base:0},l={color:"#2196f3"},a={title:"",visible:!0,lastValueVisible:!0,priceLineVisible:!0,priceLineSource:0,priceLineWidth:1,priceLineColor:"",priceLineStyle:2,baseLineVisible:!0,baseLineWidth:1,baseLineColor:"#B2B5BE",baseLineStyle:0,priceFormat:{type:"price",precision:2,minMove:.01}};var o,_;function u(t,i){const n={0:[],1:[t.lineWidth,t.lineWidth],2:[2*t.lineWidth,2*t.lineWidth],3:[6*t.lineWidth,6*t.lineWidth],4:[t.lineWidth,4*t.lineWidth],5:[t.lineWidth,t.lineWidth]}[i];t.setLineDash(n)}function c(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(n,i+e),t.lineTo(s,i+e),t.stroke()}function d(t,i){if(!t)throw new Error("Assertion failed"+(i?": "+i:""))}function f(t){if(void 0===t)throw new Error("Value is undefined");return t}function v(t){if(null===t)throw new Error("Value is null");return t}function p(t){return v(f(t))}exports.LineType=void 0,(o=exports.LineType||(exports.LineType={}))[o.Simple=0]="Simple",o[o.WithSteps=1]="WithSteps",o[o.Curved=2]="Curved",exports.LineStyle=void 0,(_=exports.LineStyle||(exports.LineStyle={}))[_.Solid=0]="Solid",_[_.Dotted=1]="Dotted",_[_.Dashed=2]="Dashed",_[_.LargeDashed=3]="LargeDashed",_[_.SparseDotted=4]="SparseDotted",_[_.CustomDotGrid=5]="CustomDotGrid";const m={khaki:"#f0e68c",azure:"#f0ffff",aliceblue:"#f0f8ff",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gainsboro:"#dcdcdc",gray:"#808080",green:"#008000",honeydew:"#f0fff0",floralwhite:"#fffaf0",lightblue:"#add8e6",lightcoral:"#f08080",lemonchiffon:"#fffacd",hotpink:"#ff69b4",lightyellow:"#ffffe0",greenyellow:"#adff2f",lightgoldenrodyellow:"#fafad2",limegreen:"#32cd32",linen:"#faf0e6",lightcyan:"#e0ffff",magenta:"#f0f",maroon:"#800000",olive:"#808000",orange:"#ffa500",oldlace:"#fdf5e6",mediumblue:"#0000cd",transparent:"#0000",lime:"#0f0",lightpink:"#ffb6c1",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",midnightblue:"#191970",orchid:"#da70d6",mediumorchid:"#ba55d3",mediumturquoise:"#48d1cc",orangered:"#ff4500",royalblue:"#4169e1",powderblue:"#b0e0e6",red:"#f00",coral:"#ff7f50",turquoise:"#40e0d0",white:"#fff",whitesmoke:"#f5f5f5",wheat:"#f5deb3",teal:"#008080",steelblue:"#4682b4",bisque:"#ffe4c4",aquamarine:"#7fffd4",aqua:"#0ff",sienna:"#a0522d",silver:"#c0c0c0",springgreen:"#00ff7f",antiquewhite:"#faebd7",burlywood:"#deb887",brown:"#a52a2a",beige:"#f5f5dc",chocolate:"#d2691e",chartreuse:"#7fff00",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cadetblue:"#5f9ea0",tomato:"#ff6347",fuchsia:"#f0f",blue:"#00f",salmon:"#fa8072",blanchedalmond:"#ffebcd",slateblue:"#6a5acd",slategray:"#708090",thistle:"#d8bfd8",tan:"#d2b48c",cyan:"#0ff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",blueviolet:"#8a2be2",black:"#000",darkmagenta:"#8b008b",darkslateblue:"#483d8b",darkkhaki:"#bdb76b",darkorchid:"#9932cc",darkorange:"#ff8c00",darkgreen:"#006400",darkred:"#8b0000",dodgerblue:"#1e90ff",darkslategray:"#2f4f4f",dimgray:"#696969",deepskyblue:"#00bfff",firebrick:"#b22222",forestgreen:"#228b22",indigo:"#4b0082",ivory:"#fffff0",lavenderblush:"#fff0f5",feldspar:"#d19275",indianred:"#cd5c5c",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightskyblue:"#87cefa",lightslategray:"#789",lightslateblue:"#8470ff",snow:"#fffafa",lightseagreen:"#20b2aa",lightsalmon:"#ffa07a",darksalmon:"#e9967a",darkviolet:"#9400d3",mediumpurple:"#9370d8",mediumaquamarine:"#66cdaa",skyblue:"#87ceeb",lavender:"#e6e6fa",lightsteelblue:"#b0c4de",mediumvioletred:"#c71585",mintcream:"#f5fffa",navajowhite:"#ffdead",navy:"#000080",olivedrab:"#6b8e23",palevioletred:"#d87093",violetred:"#d02090",yellow:"#ff0",yellowgreen:"#9acd32",lawngreen:"#7cfc00",pink:"#ffc0cb",paleturquoise:"#afeeee",palegoldenrod:"#eee8aa",darkolivegreen:"#556b2f",darkseagreen:"#8fbc8f",darkturquoise:"#00ced1",peachpuff:"#ffdab9",deeppink:"#ff1493",violet:"#ee82ee",palegreen:"#98fb98",mediumseagreen:"#3cb371",peru:"#cd853f",saddlebrown:"#8b4513",sandybrown:"#f4a460",rosybrown:"#bc8f8f",purple:"#800080",seagreen:"#2e8b57",seashell:"#fff5ee",papayawhip:"#ffefd5",mediumslateblue:"#7b68ee",plum:"#dda0dd",mediumspringgreen:"#00fa9a"};function b(t){return t<0?0:t>255?255:Math.round(t)||0}function w(t){return t<=0||t>0?t<0?0:t>1?1:Math.round(1e4*t)/1e4:0}const g=/^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,M=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,x=/^rgb\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*\)$/,S=/^rgba\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?[\d]{0,10}(?:\.\d+)?)\s*\)$/;function k(t){(t=t.toLowerCase())in m&&(t=m[t]);{const i=S.exec(t)||x.exec(t);if(i)return[b(parseInt(i[1],10)),b(parseInt(i[2],10)),b(parseInt(i[3],10)),w(i.length<5?1:parseFloat(i[4]))]}{const i=M.exec(t);if(i)return[b(parseInt(i[1],16)),b(parseInt(i[2],16)),b(parseInt(i[3],16)),1]}{const i=g.exec(t);if(i)return[b(17*parseInt(i[1],16)),b(17*parseInt(i[2],16)),b(17*parseInt(i[3],16)),1]}throw new Error(`Cannot parse color: ${t}`)}function y(t){const i=k(t);return{t:`rgb(${i[0]}, ${i[1]}, ${i[2]})`,i:(n=i,.199*n[0]+.687*n[1]+.114*n[2]>160?"black":"white")};var n}class C{constructor(){this.h=[]}l(t,i,n){const s={o:t,_:i,u:!0===n};this.h.push(s)}v(t){const i=this.h.findIndex((i=>t===i.o));i>-1&&this.h.splice(i,1)}p(t){this.h=this.h.filter((i=>i._!==t))}m(t,i,n){const s=[...this.h];this.h=this.h.filter((t=>!t.u)),s.forEach((s=>s.o(t,i,n)))}M(){return this.h.length>0}S(){this.h=[]}}function T(t,...i){for(const n of i)for(const i in n)void 0!==n[i]&&("object"!=typeof n[i]||void 0===t[i]||Array.isArray(n[i])?t[i]=n[i]:T(t[i],n[i]));return t}function P(t){return"number"==typeof t&&isFinite(t)}function R(t){return"number"==typeof t&&t%1==0}function D(t){return"string"==typeof t}function O(t){return"boolean"==typeof t}function A(t){const i=t;if(!i||"object"!=typeof i)return i;let n,s,e;for(s in n=Array.isArray(i)?[]:{},i)i.hasOwnProperty(s)&&(e=i[s],n[s]=e&&"object"==typeof e?A(e):e);return n}function V(t){return null!==t}function B(t){return null===t?void 0:t}const I="-apple-system, BlinkMacSystemFont, 'Trebuchet MS', Roboto, Ubuntu, sans-serif";function z(t,i,n){return void 0===i&&(i=I),`${n=void 0!==n?`${n} `:""}${t}px ${i}`}class E{constructor(t){this.k={C:1,T:5,P:NaN,R:"",D:"",O:"",A:"",V:0,B:0,I:0,L:0,N:0},this.F=t}W(){const t=this.k,i=this.j(),n=this.H();return t.P===i&&t.D===n||(t.P=i,t.D=n,t.R=z(i,n),t.L=2.5/12*i,t.V=t.L,t.B=i/12*t.T,t.I=i/12*t.T,t.N=0),t.O=this.$(),t.A=this.U(),this.k}$(){return this.F.W().layout.textColor}U(){return this.F.q()}j(){return this.F.W().layout.fontSize}H(){return this.F.W().layout.fontFamily}}class L{constructor(){this.Y=[]}X(t){this.Y=t}K(t,i,n){this.Y.forEach((s=>{s.K(t,i,n)}))}}class N{K(t,i,n){t.useMediaCoordinateSpace((t=>this.Z(t,i,n)))}G(t,i,n){t.useMediaCoordinateSpace((t=>this.J(t,i,n)))}J(t,i,n){}}class F extends N{constructor(){super(...arguments),this.tt=null}it(t){this.tt=t}Z({context:t}){if(null===this.tt||null===this.tt.nt)return;const i=this.tt.nt,n=this.tt,s=s=>{t.beginPath();for(let e=i.to-1;e>=i.from;--e){const i=n.st[e];t.moveTo(i.et,i.rt),t.arc(i.et,i.rt,s,0,2*Math.PI)}t.fill()};n.ht>0&&(t.fillStyle=n.lt,s(n.ot+n.ht)),t.fillStyle=n._t,s(n.ot)}}function W(){return{st:[{et:0,rt:0,ut:0,ct:0}],_t:"",lt:"",ot:0,ht:0,nt:null}}const j={from:0,to:1};class H{constructor(t,i){this.dt=new L,this.ft=[],this.vt=[],this.bt=!0,this.F=t,this.wt=i,this.dt.X(this.ft)}gt(t){const i=this.F.Mt();i.length!==this.ft.length&&(this.vt=i.map(W),this.ft=this.vt.map((t=>{const i=new F;return i.it(t),i})),this.dt.X(this.ft)),this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.dt}St(){const t=2===this.wt.W().mode,i=this.F.Mt(),n=this.wt.kt(),s=this.F.yt();i.forEach(((i,e)=>{var r;const h=this.vt[e],l=i.Ct(n);if(t||null===l||!i.Tt())return void(h.nt=null);const a=v(i.Pt());h._t=l.Rt,h.ot=l.ot,h.ht=l.Dt,h.st[0].ct=l.ct,h.st[0].rt=i.At().Ot(l.ct,a.Vt),h.lt=null!==(r=l.Bt)&&void 0!==r?r:this.F.It(h.st[0].rt/i.At().zt()),h.st[0].ut=n,h.st[0].et=s.Et(n),h.nt=j}))}}class ${K(t,i,n){t.useBitmapCoordinateSpace((t=>this.Z(t,i,n)))}}class U extends ${constructor(t){super(),this.Lt=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;const e=this.Lt.Nt.Tt,r=this.Lt.Ft.Tt;if(!e&&!r)return;const h=Math.round(this.Lt.et*n),l=Math.round(this.Lt.rt*s);t.lineCap="butt",e&&h>=0&&(t.lineWidth=Math.floor(this.Lt.Nt.ht*n),t.strokeStyle=this.Lt.Nt.O,t.fillStyle=this.Lt.Nt.O,u(t,this.Lt.Nt.Wt),function(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(i+e,n),t.lineTo(i+e,s),t.stroke()}(t,h,0,i.height)),r&&l>=0&&(t.lineWidth=Math.floor(this.Lt.Ft.ht*s),t.strokeStyle=this.Lt.Ft.O,t.fillStyle=this.Lt.Ft.O,u(t,this.Lt.Ft.Wt),c(t,l,0,i.width))}}class q{constructor(t){this.bt=!0,this.jt={Nt:{ht:1,Wt:0,O:"",Tt:!1},Ft:{ht:1,Wt:0,O:"",Tt:!1},et:0,rt:0},this.Ht=new U(this.jt),this.$t=t}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht}St(){const t=this.$t.Tt(),i=v(this.$t.Ut()),n=i.qt().W().crosshair,s=this.jt;if(2===n.mode)return s.Ft.Tt=!1,void(s.Nt.Tt=!1);s.Ft.Tt=t&&this.$t.Yt(i),s.Nt.Tt=t&&this.$t.Xt(),s.Ft.ht=n.horzLine.width,s.Ft.Wt=n.horzLine.style,s.Ft.O=n.horzLine.color,s.Nt.ht=n.vertLine.width,s.Nt.Wt=n.vertLine.style,s.Nt.O=n.vertLine.color,s.et=this.$t.Kt(),s.rt=this.$t.Zt()}}function Y(t,i,n,s,e,r){t.fillRect(i+r,n,s-2*r,r),t.fillRect(i+r,n+e-r,s-2*r,r),t.fillRect(i,n,r,e),t.fillRect(i+s-r,n,r,e)}function X(t,i,n,s,e,r){t.save(),t.globalCompositeOperation="copy",t.fillStyle=r,t.fillRect(i,n,s,e),t.restore()}function K(t,i){return t.map((t=>0===t?t:t+i))}function Z(t,i,n,s,e,r){t.beginPath(),t.lineTo(i+s-r[1],n),0!==r[1]&&t.arcTo(i+s,n,i+s,n+r[1],r[1]),t.lineTo(i+s,n+e-r[2]),0!==r[2]&&t.arcTo(i+s,n+e,i+s-r[2],n+e,r[2]),t.lineTo(i+r[3],n+e),0!==r[3]&&t.arcTo(i,n+e,i,n+e-r[3],r[3]),t.lineTo(i,n+r[0]),0!==r[0]&&t.arcTo(i,n,i+r[0],n,r[0])}function G(t,i,n,s,e,r,h=0,l=[0,0,0,0],a=""){if(t.save(),!h||!a||a===r)return Z(t,i,n,s,e,l),t.fillStyle=r,t.fill(),void t.restore();const o=h/2;if("transparent"!==r){Z(t,i+h,n+h,s-2*h,e-2*h,K(l,-h)),t.fillStyle=r,t.fill()}if("transparent"!==a){Z(t,i+o,n+o,s-h,e-h,K(l,-o)),t.lineWidth=h,t.strokeStyle=a,t.closePath(),t.stroke()}t.restore()}function J(t,i,n,s,e,r,h){t.save(),t.globalCompositeOperation="copy";const l=t.createLinearGradient(0,0,0,e);l.addColorStop(0,r),l.addColorStop(1,h),t.fillStyle=l,t.fillRect(i,n,s,e),t.restore()}class Q{constructor(t,i){this.it(t,i)}it(t,i){this.Lt=t,this.Gt=i}zt(t,i){return this.Lt.Tt?t.P+t.L+t.V:0}K(t,i,n,s){if(!this.Lt.Tt||0===this.Lt.Jt.length)return;const e=this.Lt.O,r=this.Gt.t,h=t.useBitmapCoordinateSpace((t=>{const h=t.context;h.font=i.R;const l=this.Qt(t,i,n,s),a=l.ti,o=(t,i)=>{l.ii?G(h,a.ni,a.si,a.ei,a.ri,t,a.hi,[a.ot,0,0,a.ot],i):G(h,a.li,a.si,a.ei,a.ri,t,a.hi,[0,a.ot,a.ot,0],i)};return o(r,"transparent"),this.Lt.ai&&(h.fillStyle=e,h.fillRect(a.li,a.oi,a._i-a.li,a.ui)),o("transparent",r),this.Lt.ci&&(h.fillStyle=i.A,h.fillRect(l.ii?a.di-a.hi:0,a.si,a.hi,a.fi-a.si)),l}));t.useMediaCoordinateSpace((({context:t})=>{const n=h.vi;t.font=i.R,t.textAlign=h.ii?"right":"left",t.textBaseline="middle",t.fillStyle=e,t.fillText(this.Lt.Jt,n.pi,(n.si+n.fi)/2+n.mi)}))}Qt(t,i,n,s){var e;const{context:r,bitmapSize:h,mediaSize:l,horizontalPixelRatio:a,verticalPixelRatio:o}=t,_=this.Lt.ai||!this.Lt.bi?i.T:0,u=this.Lt.wi?i.C:0,c=i.L+this.Gt.gi,d=i.V+this.Gt.Mi,f=i.B,v=i.I,p=this.Lt.Jt,m=i.P,b=n.xi(r,p),w=Math.ceil(n.Si(r,p)),g=m+c+d,M=i.C+f+v+w+_,x=Math.max(1,Math.floor(o));let S=Math.round(g*o);S%2!=x%2&&(S+=1);const k=u>0?Math.max(1,Math.floor(u*a)):0,y=Math.round(M*a),C=Math.round(_*a),T=null!==(e=this.Gt.ki)&&void 0!==e?e:this.Gt.yi,P=Math.round(T*o)-Math.floor(.5*o),R=Math.floor(P+x/2-S/2),D=R+S,O="right"===s,A=O?l.width-u:u,V=O?h.width-k:k;let B,I,z;return O?(B=V-y,I=V-C,z=A-_-f-u):(B=V+y,I=V+C,z=A+_+f),{ii:O,ti:{si:R,oi:P,fi:D,ei:y,ri:S,ot:2*a,hi:k,ni:B,li:V,_i:I,ui:x,di:h.width},vi:{si:R/o,fi:D/o,pi:z,mi:b}}}}class tt{constructor(t){this.Ci={yi:0,t:"#000",Mi:0,gi:0},this.Ti={Jt:"",Tt:!1,ai:!0,bi:!1,Bt:"",O:"#FFF",ci:!1,wi:!1},this.Pi={Jt:"",Tt:!1,ai:!1,bi:!0,Bt:"",O:"#FFF",ci:!0,wi:!0},this.bt=!0,this.Ri=new(t||Q)(this.Ti,this.Ci),this.Di=new(t||Q)(this.Pi,this.Ci)}Jt(){return this.Oi(),this.Ti.Jt}yi(){return this.Oi(),this.Ci.yi}gt(){this.bt=!0}zt(t,i=!1){return Math.max(this.Ri.zt(t,i),this.Di.zt(t,i))}Ai(){return this.Ci.ki||0}Vi(t){this.Ci.ki=t}Bi(){return this.Oi(),this.Ti.Tt||this.Pi.Tt}Ii(){return this.Oi(),this.Ti.Tt}xt(t){return this.Oi(),this.Ti.ai=this.Ti.ai&&t.W().ticksVisible,this.Pi.ai=this.Pi.ai&&t.W().ticksVisible,this.Ri.it(this.Ti,this.Ci),this.Di.it(this.Pi,this.Ci),this.Ri}zi(){return this.Oi(),this.Ri.it(this.Ti,this.Ci),this.Di.it(this.Pi,this.Ci),this.Di}Oi(){this.bt&&(this.Ti.ai=!0,this.Pi.ai=!1,this.Ei(this.Ti,this.Pi,this.Ci))}}class it extends tt{constructor(t,i,n){super(),this.$t=t,this.Li=i,this.Ni=n}Ei(t,i,n){if(t.Tt=!1,2===this.$t.W().mode)return;const s=this.$t.W().horzLine;if(!s.labelVisible)return;const e=this.Li.Pt();if(!this.$t.Tt()||this.Li.Fi()||null===e)return;const r=y(s.labelBackgroundColor);n.t=r.t,t.O=r.i;const h=2/12*this.Li.P();n.gi=h,n.Mi=h;const l=this.Ni(this.Li);n.yi=l.yi,t.Jt=this.Li.Wi(l.ct,e),t.Tt=!0}}const nt=/[1-9]/g;class st{constructor(){this.Lt=null}it(t){this.Lt=t}K(t,i){if(null===this.Lt||!1===this.Lt.Tt||0===this.Lt.Jt.length)return;const n=t.useMediaCoordinateSpace((({context:t})=>(t.font=i.R,Math.round(i.ji.Si(t,v(this.Lt).Jt,nt)))));if(n<=0)return;const s=i.Hi,e=n+2*s,r=e/2,h=this.Lt.$i;let l=this.Lt.yi,a=Math.floor(l-r)+.5;a<0?(l+=Math.abs(0-a),a=Math.floor(l-r)+.5):a+e>h&&(l-=Math.abs(h-(a+e)),a=Math.floor(l-r)+.5);const o=a+e,_=Math.ceil(0+i.C+i.T+i.L+i.P+i.V);t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:n,verticalPixelRatio:s})=>{const e=v(this.Lt);t.fillStyle=e.t;const r=Math.round(a*n),h=Math.round(0*s),l=Math.round(o*n),u=Math.round(_*s),c=Math.round(2*n);if(t.beginPath(),t.moveTo(r,h),t.lineTo(r,u-c),t.arcTo(r,u,r+c,u,c),t.lineTo(l-c,u),t.arcTo(l,u,l,u-c,c),t.lineTo(l,h),t.fill(),e.ai){const r=Math.round(e.yi*n),l=h,a=Math.round((l+i.T)*s);t.fillStyle=e.O;const o=Math.max(1,Math.floor(n)),_=Math.floor(.5*n);t.fillRect(r-_,l,o,a-l)}})),t.useMediaCoordinateSpace((({context:t})=>{const n=v(this.Lt),e=0+i.C+i.T+i.L+i.P/2;t.font=i.R,t.textAlign="left",t.textBaseline="middle",t.fillStyle=n.O;const r=i.ji.xi(t,"Apr0");t.translate(a+s,e+r),t.fillText(n.Jt,0,0)}))}}class et{constructor(t,i,n){this.bt=!0,this.Ht=new st,this.jt={Tt:!1,t:"#4c525e",O:"white",Jt:"",$i:0,yi:NaN,ai:!0},this.wt=t,this.Ui=i,this.Ni=n}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht.it(this.jt),this.Ht}St(){const t=this.jt;if(t.Tt=!1,2===this.wt.W().mode)return;const i=this.wt.W().vertLine;if(!i.labelVisible)return;const n=this.Ui.yt();if(n.Fi())return;t.$i=n.$i();const s=this.Ni();if(null===s)return;t.yi=s.yi;const e=n.qi(this.wt.kt());t.Jt=n.Yi(v(e)),t.Tt=!0;const r=y(i.labelBackgroundColor);t.t=r.t,t.O=r.i,t.ai=n.W().ticksVisible}}class rt{constructor(){this.Xi=null,this.Ki=0}Zi(){return this.Ki}Gi(t){this.Ki=t}At(){return this.Xi}Ji(t){this.Xi=t}Qi(t){return[]}tn(){return[]}Tt(){return!0}}var ht;exports.CrosshairMode=void 0,(ht=exports.CrosshairMode||(exports.CrosshairMode={}))[ht.Normal=0]="Normal",ht[ht.Magnet=1]="Magnet",ht[ht.Hidden=2]="Hidden";class lt extends rt{constructor(t,i){super(),this.nn=null,this.sn=NaN,this.en=0,this.rn=!0,this.hn=new Map,this.ln=!1,this.an=NaN,this.on=NaN,this._n=NaN,this.un=NaN,this.Ui=t,this.cn=i,this.dn=new H(t,this);this.fn=((t,i)=>n=>{const s=i(),e=t();if(n===v(this.nn).vn())return{ct:e,yi:s};{const t=v(n.Pt());return{ct:n.pn(s,t),yi:s}}})((()=>this.sn),(()=>this.on));const n=((t,i)=>()=>{const n=this.Ui.yt().mn(t()),s=i();return n&&Number.isFinite(s)?{ut:n,yi:s}:null})((()=>this.en),(()=>this.Kt()));this.bn=new et(this,t,n),this.wn=new q(this)}W(){return this.cn}gn(t,i){this._n=t,this.un=i}Mn(){this._n=NaN,this.un=NaN}xn(){return this._n}Sn(){return this.un}kn(t,i,n){this.ln||(this.ln=!0),this.rn=!0,this.yn(t,i,n)}kt(){return this.en}Kt(){return this.an}Zt(){return this.on}Tt(){return this.rn}Cn(){this.rn=!1,this.Tn(),this.sn=NaN,this.an=NaN,this.on=NaN,this.nn=null,this.Mn()}Pn(t){return null!==this.nn?[this.wn,this.dn]:[]}Yt(t){return t===this.nn&&this.cn.horzLine.visible}Xt(){return this.cn.vertLine.visible}Rn(t,i){this.rn&&this.nn===t||this.hn.clear();const n=[];return this.nn===t&&n.push(this.Dn(this.hn,i,this.fn)),n}tn(){return this.rn?[this.bn]:[]}Ut(){return this.nn}On(){this.wn.gt(),this.hn.forEach((t=>t.gt())),this.bn.gt(),this.dn.gt()}An(t){return t&&!t.vn().Fi()?t.vn():null}yn(t,i,n){this.Vn(t,i,n)&&this.On()}Vn(t,i,n){const s=this.an,e=this.on,r=this.sn,h=this.en,l=this.nn,a=this.An(n);this.en=t,this.an=isNaN(t)?NaN:this.Ui.yt().Et(t),this.nn=n;const o=null!==a?a.Pt():null;return null!==a&&null!==o?(this.sn=i,this.on=a.Ot(i,o)):(this.sn=NaN,this.on=NaN),s!==this.an||e!==this.on||h!==this.en||r!==this.sn||l!==this.nn}Tn(){const t=this.Ui.Mt().map((t=>t.In().Bn())).filter(V),i=0===t.length?null:Math.max(...t);this.en=null!==i?i:NaN}Dn(t,i,n){let s=t.get(i);return void 0===s&&(s=new it(this,i,n),t.set(i,s)),s}}function at(t){return"left"===t||"right"===t}class ot{constructor(t){this.zn=new Map,this.En=[],this.Ln=t}Nn(t,i){const n=function(t,i){return void 0===t?i:{Fn:Math.max(t.Fn,i.Fn),Wn:t.Wn||i.Wn}}(this.zn.get(t),i);this.zn.set(t,n)}jn(){return this.Ln}Hn(t){const i=this.zn.get(t);return void 0===i?{Fn:this.Ln}:{Fn:Math.max(this.Ln,i.Fn),Wn:i.Wn}}$n(){this.Un(),this.En=[{qn:0}]}Yn(t){this.Un(),this.En=[{qn:1,Vt:t}]}Xn(t){this.Kn(),this.En.push({qn:5,Vt:t})}Un(){this.Kn(),this.En.push({qn:6})}Zn(){this.Un(),this.En=[{qn:4}]}Gn(t){this.Un(),this.En.push({qn:2,Vt:t})}Jn(t){this.Un(),this.En.push({qn:3,Vt:t})}Qn(){return this.En}ts(t){for(const i of t.En)this.ns(i);this.Ln=Math.max(this.Ln,t.Ln),t.zn.forEach(((t,i)=>{this.Nn(i,t)}))}static ss(){return new ot(2)}static es(){return new ot(3)}ns(t){switch(t.qn){case 0:this.$n();break;case 1:this.Yn(t.Vt);break;case 2:this.Gn(t.Vt);break;case 3:this.Jn(t.Vt);break;case 4:this.Zn();break;case 5:this.Xn(t.Vt);break;case 6:this.Kn()}}Kn(){const t=this.En.findIndex((t=>5===t.qn));-1!==t&&this.En.splice(t,1)}}const _t=".";function ut(t,i){if(!P(t))return"n/a";if(!R(i))throw new TypeError("invalid length");if(i<0||i>16)throw new TypeError("invalid length");if(0===i)return t.toString();return("0000000000000000"+t.toString()).slice(-i)}class ct{constructor(t,i){if(i||(i=1),P(t)&&R(t)||(t=100),t<0)throw new TypeError("invalid base");this.Li=t,this.rs=i,this.hs()}format(t){const i=t<0?"−":"";return t=Math.abs(t),i+this.ls(t)}hs(){if(this.os=0,this.Li>0&&this.rs>0){let t=this.Li;for(;t>1;)t/=10,this.os++}}ls(t){const i=this.Li/this.rs;let n=Math.floor(t),s="";const e=void 0!==this.os?this.os:NaN;if(i>1){let r=+(Math.round(t*i)-n*i).toFixed(this.os);r>=i&&(r-=i,n+=1),s=_t+ut(+r.toFixed(this.os)*this.rs,e)}else n=Math.round(n*i)/i,e>0&&(s=_t+ut(0,e));return n.toFixed(0)+s}}class dt extends ct{constructor(t=100){super(t)}format(t){return`${super.format(t)}%`}}class ft{constructor(t){this._s=t}format(t){let i="";return t<0&&(i="-",t=-t),t<995?i+this.us(t):t<999995?i+this.us(t/1e3)+"K":t<999999995?(t=1e3*Math.round(t/1e3),i+this.us(t/1e6)+"M"):(t=1e6*Math.round(t/1e6),i+this.us(t/1e9)+"B")}us(t){let i;const n=Math.pow(10,this._s);return i=(t=Math.round(t*n)/n)>=1e-15&&t<1?t.toFixed(this._s).replace(/\.?0+$/,""):String(t),i.replace(/(\.[1-9]*)0+$/,((t,i)=>i))}}function vt(t,i,n,s,e,r,h){if(0===i.length||s.from>=i.length||s.to<=0)return;const{context:l,horizontalPixelRatio:a,verticalPixelRatio:o}=t,_=i[s.from];let u=r(t,_),c=_;if(s.to-s.from<2){const i=e/2;l.beginPath();const n={et:_.et-i,rt:_.rt},s={et:_.et+i,rt:_.rt};l.moveTo(n.et*a,n.rt*o),l.lineTo(s.et*a,s.rt*o),h(t,u,n,s)}else{const e=(i,n)=>{h(t,u,c,n),l.beginPath(),u=i,c=n};let d=c;l.beginPath(),l.moveTo(_.et*a,_.rt*o);for(let h=s.from+1;h=s.from;--n){const s=i[n];if(s){const i=e(t,s);i!==a&&(l.beginPath(),null!==a&&l.fill(),l.fillStyle=i,a=i);const n=Math.round(s.et*r)+o,u=s.rt*h;l.moveTo(n,u),l.arc(n,u,_,0,2*Math.PI)}}l.fill()}(t,i,l,n,o)}}class Rt extends Pt{Ds(t,i){return i._t}}function Dt(t,i,n,s,e=0,r=i.length){let h=r-e;for(;0>1,l=e+r;s(i[l],n)===t?(e=l+1,h-=r+1):h=r}return e}const Ot=Dt.bind(null,!0),At=Dt.bind(null,!1);function Vt(t,i){return t.ut0&&r=s&&(l=r-1),h>0&&hObject.assign(Object.assign({},t),this.Es.$s().Hs(t.ut))))}Us(){this.zs=null}Fs(){this.Vs&&(this.qs(),this.Vs=!1),this.Bs&&(this.js(),this.Bs=!1),this.As&&(this.Ys(),this.As=!1)}Ys(){const t=this.Es.At(),i=this.Ls.yt();if(this.Us(),i.Fi()||t.Fi())return;const n=i.Xs();if(null===n)return;if(0===this.Es.In().Ks())return;const s=this.Es.Pt();null!==s&&(this.zs=It(this.Is,n,this.Ns),this.Zs(t,i,s.Vt),this.Gs())}}class Et extends zt{constructor(t,i){super(t,i,!0)}Zs(t,i,n){i.Js(this.Is,B(this.zs)),t.Qs(this.Is,n,B(this.zs))}te(t,i){return{ut:t,ct:i,et:NaN,rt:NaN}}qs(){const t=this.Es.$s();this.Is=this.Es.In().ie().map((i=>{const n=i.Vt[3];return this.ne(i.se,n,t)}))}}class Lt extends Et{constructor(t,i){super(t,i),this.Ws=new L,this.ee=new Ct,this.re=new Rt,this.Ws.X([this.ee,this.re])}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Es.W();this.ee.it({ds:t.lineType,st:this.Is,Wt:t.lineStyle,ht:t.lineWidth,fs:null,vs:t.invertFilledArea,nt:this.zs,cs:this.Ls.yt().he()}),this.re.it({ds:t.lineVisible?t.lineType:void 0,st:this.Is,Wt:t.lineStyle,ht:t.lineWidth,nt:this.zs,cs:this.Ls.yt().he(),Rs:t.pointMarkersVisible?t.pointMarkersRadius||t.lineWidth/2+2:void 0})}}class Nt extends ${constructor(){super(...arguments),this.Lt=null,this.le=0,this.ae=0}it(t){this.Lt=t}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.Lt||0===this.Lt.In.length||null===this.Lt.nt)return;if(this.le=this.oe(i),this.le>=2){Math.max(1,Math.floor(i))%2!=this.le%2&&this.le--}this.ae=this.Lt._e?Math.min(this.le,Math.floor(i)):this.le;let s=null;const e=this.ae<=this.le&&this.Lt.he>=Math.floor(1.5*i);for(let r=this.Lt.nt.from;rf+p-1&&(e=f+p-1,s=e-_+1),t.fillRect(i,s,o-i,e-s+1)}const i=a+m;let s=Math.max(f,Math.round(h.pe*n)-l),e=s+_-1;e>f+p-1&&(e=f+p-1,s=e-_+1),t.fillRect(u+1,s,i-u,e-s+1)}}}oe(t){const i=Math.floor(t);return Math.max(i,Math.floor(function(t,i){return Math.floor(.3*t*i)}(v(this.Lt).he,t)))}}class Ft extends zt{constructor(t,i){super(t,i,!1)}Zs(t,i,n){i.Js(this.Is,B(this.zs)),t.me(this.Is,n,B(this.zs))}be(t,i,n){return{ut:t,we:i.Vt[0],ge:i.Vt[1],Me:i.Vt[2],xe:i.Vt[3],et:NaN,ve:NaN,ce:NaN,de:NaN,pe:NaN}}qs(){const t=this.Es.$s();this.Is=this.Es.In().ie().map((i=>this.ne(i.se,i,t)))}}class Wt extends Ft{constructor(){super(...arguments),this.Ws=new Nt}ne(t,i,n){return Object.assign(Object.assign({},this.be(t,i,n)),n.Hs(t))}Gs(){const t=this.Es.W();this.Ws.it({In:this.Is,he:this.Ls.yt().he(),fe:t.openVisible,_e:t.thinBars,nt:this.zs})}}class jt extends Mt{constructor(){super(...arguments),this.Cs=new yt}ps(t,i){const n=this.tt;return this.Cs.bs(t,{gs:i.Se,Ms:i.ke,xs:i.ye,Ss:i.Ce,ks:t.bitmapSize.height,fs:n.fs})}}class Ht extends Pt{constructor(){super(...arguments),this.Te=new yt}Ds(t,i){const n=this.tt;return this.Te.bs(t,{gs:i.Pe,Ms:i.Pe,xs:i.Re,Ss:i.Re,ks:t.bitmapSize.height,fs:n.fs})}}class $t extends Et{constructor(t,i){super(t,i),this.Ws=new L,this.De=new jt,this.Oe=new Ht,this.Ws.X([this.De,this.Oe])}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Es.Pt();if(null===t)return;const i=this.Es.W(),n=this.Es.At().Ot(i.baseValue.price,t.Vt),s=this.Ls.yt().he();this.De.it({st:this.Is,ht:i.lineWidth,Wt:i.lineStyle,ds:i.lineType,fs:n,vs:!1,nt:this.zs,cs:s}),this.Oe.it({st:this.Is,ht:i.lineWidth,Wt:i.lineStyle,ds:i.lineVisible?i.lineType:void 0,Rs:i.pointMarkersVisible?i.pointMarkersRadius||i.lineWidth/2+2:void 0,fs:n,nt:this.zs,cs:s})}}class Ut extends ${constructor(){super(...arguments),this.Lt=null,this.le=0}it(t){this.Lt=t}Z(t){if(null===this.Lt||0===this.Lt.In.length||null===this.Lt.nt)return;const{horizontalPixelRatio:i}=t;if(this.le=function(t,i){if(t>=2.5&&t<=4)return Math.floor(3*i);const n=1-.2*Math.atan(Math.max(4,t)-4)/(.5*Math.PI),s=Math.floor(t*n*i),e=Math.floor(t*i),r=Math.min(s,e);return Math.max(Math.floor(i),r)}(this.Lt.he,i),this.le>=2){Math.floor(i)%2!=this.le%2&&this.le--}const n=this.Lt.In;this.Lt.Ae&&this.Ve(t,n,this.Lt.nt),this.Lt.ci&&this.Be(t,n,this.Lt.nt);const s=this.Ie(i);(!this.Lt.ci||this.le>2*s)&&this.ze(t,n,this.Lt.nt)}Ve(t,i,n){if(null===this.Lt)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="",l=Math.min(Math.floor(e),Math.floor(this.Lt.he*e));l=Math.max(Math.floor(e),Math.min(l,this.le));const a=Math.floor(.5*l);let o=null;for(let t=n.from;t2*l)Y(s,o,u,_-o+1,c-u+1,l);else{const t=_-o+1;s.fillRect(o,u,t,c-u+1)}a=_}}ze(t,i,n){if(null===this.Lt)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="";const l=this.Ie(e);for(let t=n.from;to||s.fillRect(_,a,u-_+1,o-a+1)}}}class qt extends Ft{constructor(){super(...arguments),this.Ws=new Ut}ne(t,i,n){return Object.assign(Object.assign({},this.be(t,i,n)),n.Hs(t))}Gs(){const t=this.Es.W();this.Ws.it({In:this.Is,he:this.Ls.yt().he(),Ae:t.wickVisible,ci:t.borderVisible,nt:this.zs})}}class Yt{constructor(t,i){this.Ne=t,this.Li=i}K(t,i,n){this.Ne.draw(t,this.Li,i,n)}}class Xt extends zt{constructor(t,i,n){super(t,i,!1),this.wn=n,this.Ws=new Yt(this.wn.renderer(),(i=>{const n=t.Pt();return null===n?null:t.At().Ot(i,n.Vt)}))}Fe(t){return this.wn.priceValueBuilder(t)}We(t){return this.wn.isWhitespace(t)}qs(){const t=this.Es.$s();this.Is=this.Es.In().ie().map((i=>Object.assign(Object.assign({ut:i.se,et:NaN},t.Hs(i.se)),{je:i.He})))}Zs(t,i){i.Js(this.Is,B(this.zs))}Gs(){this.wn.update({bars:this.Is.map(Kt),barSpacing:this.Ls.yt().he(),visibleRange:this.zs},this.Es.W())}}function Kt(t){return{x:t.et,time:t.ut,originalData:t.je,barColor:t.ue}}class Zt extends ${constructor(){super(...arguments),this.Lt=null,this.$e=[]}it(t){this.Lt=t,this.$e=[]}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.Lt||0===this.Lt.st.length||null===this.Lt.nt)return;this.$e.length||this.Ue(i);const s=Math.max(1,Math.floor(n)),e=Math.round(this.Lt.qe*n)-Math.floor(s/2),r=e+s;for(let i=this.Lt.nt.from;is.Xe?s.di=n.Os-i-1:n.Os=s.di+i+1))}let s=Math.ceil(this.Lt.he*t);for(let t=this.Lt.nt.from;t0&&s<4)for(let t=this.Lt.nt.from;ts&&(i.Ye>i.Xe?i.di-=1:i.Os+=1)}}}class Gt extends Et{constructor(){super(...arguments),this.Ws=new Zt}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t={st:this.Is,he:this.Ls.yt().he(),nt:this.zs,qe:this.Es.At().Ot(this.Es.W().base,v(this.Es.Pt()).Vt)};this.Ws.it(t)}}class Jt extends Et{constructor(){super(...arguments),this.Ws=new Rt}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Es.W(),i={st:this.Is,Wt:t.lineStyle,ds:t.lineVisible?t.lineType:void 0,ht:t.lineWidth,Rs:t.pointMarkersVisible?t.pointMarkersRadius||t.lineWidth/2+2:void 0,nt:this.zs,cs:this.Ls.yt().he()};this.Ws.it(i)}}const Qt=/[2-9]/g;class ti{constructor(t=50){this.Ke=0,this.Ze=1,this.Ge=1,this.Je={},this.Qe=new Map,this.tr=t}ir(){this.Ke=0,this.Qe.clear(),this.Ze=1,this.Ge=1,this.Je={}}Si(t,i,n){return this.nr(t,i,n).width}xi(t,i,n){const s=this.nr(t,i,n);return((s.actualBoundingBoxAscent||0)-(s.actualBoundingBoxDescent||0))/2}nr(t,i,n){const s=n||Qt,e=String(i).replace(s,"0");if(this.Qe.has(e))return f(this.Qe.get(e)).sr;if(this.Ke===this.tr){const t=this.Je[this.Ge];delete this.Je[this.Ge],this.Qe.delete(t),this.Ge++,this.Ke--}t.save(),t.textBaseline="middle";const r=t.measureText(e);return t.restore(),0===r.width&&i.length||(this.Qe.set(e,{sr:r,er:this.Ze}),this.Je[this.Ze]=e,this.Ke++,this.Ze++),r}}class ii{constructor(t){this.rr=null,this.k=null,this.hr="right",this.lr=t}ar(t,i,n){this.rr=t,this.k=i,this.hr=n}K(t){null!==this.k&&null!==this.rr&&this.rr.K(t,this.k,this.lr,this.hr)}}class ni{constructor(t,i,n){this._r=t,this.lr=new ti(50),this.ur=i,this.F=n,this.j=-1,this.Ht=new ii(this.lr)}xt(){const t=this.F.cr(this.ur);if(null===t)return null;const i=t.dr(this.ur)?t.vr():this.ur.At();if(null===i)return null;const n=t.pr(i);if("overlay"===n)return null;const s=this.F.mr();return s.P!==this.j&&(this.j=s.P,this.lr.ir()),this.Ht.ar(this._r.zi(),s,n),this.Ht}}class si extends ${constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}br(t,i){var n;if(!(null===(n=this.Lt)||void 0===n?void 0:n.Tt))return null;const{rt:s,ht:e,wr:r}=this.Lt;return i>=s-e-7&&i<=s+e+7?{gr:this.Lt,wr:r}:null}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;if(!1===this.Lt.Tt)return;const e=Math.round(this.Lt.rt*s);e<0||e>i.height||(t.lineCap="butt",t.strokeStyle=this.Lt.O,t.lineWidth=Math.floor(this.Lt.ht*n),u(t,this.Lt.Wt),c(t,e,0,i.width))}}class ei{constructor(t){this.Mr={rt:0,O:"rgba(0, 0, 0, 0)",ht:1,Wt:0,Tt:!1},this.Sr=new si,this.bt=!0,this.Es=t,this.Ls=t.qt(),this.Sr.it(this.Mr)}gt(){this.bt=!0}xt(){return this.Es.Tt()?(this.bt&&(this.kr(),this.bt=!1),this.Sr):null}}class ri extends ei{constructor(t){super(t)}kr(){this.Mr.Tt=!1;const t=this.Es.At(),i=t.yr().yr;if(2!==i&&3!==i)return;const n=this.Es.W();if(!n.baseLineVisible||!this.Es.Tt())return;const s=this.Es.Pt();null!==s&&(this.Mr.Tt=!0,this.Mr.rt=t.Ot(s.Vt,s.Vt),this.Mr.O=n.baseLineColor,this.Mr.ht=n.baseLineWidth,this.Mr.Wt=n.baseLineStyle)}}class hi extends ${constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}He(){return this.Lt}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){const s=this.Lt;if(null===s)return;const e=Math.max(1,Math.floor(i)),r=e%2/2,h=Math.round(s.Xe.x*i)+r,l=s.Xe.y*n;t.fillStyle=s.Cr,t.beginPath();const a=Math.max(2,1.5*s.Tr)*i;t.arc(h,l,a,0,2*Math.PI,!1),t.fill(),t.fillStyle=s.Pr,t.beginPath(),t.arc(h,l,s.ot*i,0,2*Math.PI,!1),t.fill(),t.lineWidth=e,t.strokeStyle=s.Rr,t.beginPath(),t.arc(h,l,s.ot*i+e/2,0,2*Math.PI,!1),t.stroke()}}const li=[{Dr:0,Or:.25,Ar:4,Vr:10,Br:.25,Ir:0,zr:.4,Er:.8},{Dr:.25,Or:.525,Ar:10,Vr:14,Br:0,Ir:0,zr:.8,Er:0},{Dr:.525,Or:1,Ar:14,Vr:14,Br:0,Ir:0,zr:0,Er:0}];function ai(t,i,n,s){return function(t,i){if("transparent"===t)return t;const n=k(t),s=n[3];return`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${i*s})`}(t,n+(s-n)*i)}function oi(t,i){const n=t%2600/2600;let s;for(const t of li)if(n>=t.Dr&&n<=t.Or){s=t;break}d(void 0!==s,"Last price animation internal logic error");const e=(n-s.Dr)/(s.Or-s.Dr);return{Pr:ai(i,e,s.Br,s.Ir),Rr:ai(i,e,s.zr,s.Er),ot:(r=e,h=s.Ar,l=s.Vr,h+(l-h)*r)};var r,h,l}class _i{constructor(t){this.Ht=new hi,this.bt=!0,this.Lr=!0,this.Nr=performance.now(),this.Fr=this.Nr-1,this.Wr=t}jr(){this.Fr=this.Nr-1,this.gt()}Hr(){if(this.gt(),2===this.Wr.W().lastPriceAnimation){const t=performance.now(),i=this.Fr-t;if(i>0)return void(i<650&&(this.Fr+=2600));this.Nr=t,this.Fr=t+2600}}gt(){this.bt=!0}$r(){this.Lr=!0}Tt(){return 0!==this.Wr.W().lastPriceAnimation}Ur(){switch(this.Wr.W().lastPriceAnimation){case 0:return!1;case 1:return!0;case 2:return performance.now()<=this.Fr}}xt(){return this.bt?(this.St(),this.bt=!1,this.Lr=!1):this.Lr&&(this.qr(),this.Lr=!1),this.Ht}St(){this.Ht.it(null);const t=this.Wr.qt().yt(),i=t.Xs(),n=this.Wr.Pt();if(null===i||null===n)return;const s=this.Wr.Yr(!0);if(s.Xr||!i.Kr(s.se))return;const e={x:t.Et(s.se),y:this.Wr.At().Ot(s.ct,n.Vt)},r=s.O,h=this.Wr.W().lineWidth,l=oi(this.Zr(),r);this.Ht.it({Cr:r,Tr:h,Pr:l.Pr,Rr:l.Rr,ot:l.ot,Xe:e})}qr(){const t=this.Ht.He();if(null!==t){const i=oi(this.Zr(),t.Cr);t.Pr=i.Pr,t.Rr=i.Rr,t.ot=i.ot}}Zr(){return this.Ur()?performance.now()-this.Nr:2599}}function ui(t,i){return kt(Math.min(Math.max(t,12),30)*i)}function ci(t,i){switch(t){case"arrowDown":case"arrowUp":return ui(i,1);case"circle":return ui(i,.8);case"square":return ui(i,.7)}}function di(t){return function(t){const i=Math.ceil(t);return i%2!=0?i-1:i}(ui(t,1))}function fi(t){return Math.max(ui(t,.1),3)}function vi(t,i,n,s,e){const r=ci("square",n),h=(r-1)/2,l=t-h,a=i-h;return s>=l&&s<=l+r&&e>=a&&e<=a+r}function pi(t,i,n,s,e){const r=(ci("arrowUp",e)-1)/2,h=(kt(e/2)-1)/2;i.beginPath(),t?(i.moveTo(n-r,s),i.lineTo(n,s-r),i.lineTo(n+r,s),i.lineTo(n+h,s),i.lineTo(n+h,s+r),i.lineTo(n-h,s+r),i.lineTo(n-h,s)):(i.moveTo(n-r,s),i.lineTo(n,s+r),i.lineTo(n+r,s),i.lineTo(n+h,s),i.lineTo(n+h,s-r),i.lineTo(n-h,s-r),i.lineTo(n-h,s)),i.fill()}function mi(t,i,n,s,e,r){return vi(i,n,s,e,r)}class bi extends N{constructor(){super(...arguments),this.Lt=null,this.lr=new ti,this.j=-1,this.H="",this.Gr=""}it(t){this.Lt=t}ar(t,i){this.j===t&&this.H===i||(this.j=t,this.H=i,this.Gr=z(t,i),this.lr.ir())}br(t,i){if(null===this.Lt||null===this.Lt.nt)return null;for(let n=this.Lt.nt.from;n=t&&e<=t+n&&r>=i-h&&r<=i+h}(t.Jt.et,t.Jt.rt,t.Jt.$i,t.Jt.zt,i,n))||function(t,i,n){if(0===t.Ks)return!1;switch(t.th){case"arrowDown":case"arrowUp":return mi(0,t.et,t.rt,t.Ks,i,n);case"circle":return function(t,i,n,s,e){const r=2+ci("circle",n)/2,h=t-s,l=i-e;return Math.sqrt(h*h+l*l)<=r}(t.et,t.rt,t.Ks,i,n);case"square":return vi(t.et,t.rt,t.Ks,i,n)}}(t,i,n)}function Mi(t,i,n,s,e,r,h,l,a){const o=P(n)?n:n.xe,_=P(n)?n:n.ge,u=P(n)?n:n.Me,c=P(i.size)?Math.max(i.size,0):1,d=di(l.he())*c,f=d/2;switch(t.Ks=d,i.position){case"inBar":return t.rt=h.Ot(o,a),void(void 0!==t.Jt&&(t.Jt.rt=t.rt+f+r+.6*e));case"aboveBar":return t.rt=h.Ot(_,a)-f-s.ih,void 0!==t.Jt&&(t.Jt.rt=t.rt-f-.6*e,s.ih+=1.2*e),void(s.ih+=d+r);case"belowBar":return t.rt=h.Ot(u,a)+f+s.nh,void 0!==t.Jt&&(t.Jt.rt=t.rt+f+r+.6*e,s.nh+=1.2*e),void(s.nh+=d+r)}i.position}class xi{constructor(t,i){this.bt=!0,this.sh=!0,this.eh=!0,this.rh=null,this.Ht=new bi,this.Wr=t,this.Ui=i,this.Lt={st:[],nt:null}}gt(t){this.bt=!0,this.eh=!0,"data"===t&&(this.sh=!0)}xt(t){if(!this.Wr.Tt())return null;this.bt&&this.hh();const i=this.Ui.W().layout;return this.Ht.ar(i.fontSize,i.fontFamily),this.Ht.it(this.Lt),this.Ht}lh(){if(this.eh){if(this.Wr.ah().length>0){const t=this.Ui.yt().he(),i=fi(t),n=1.5*di(t)+2*i;this.rh={above:n,below:n}}else this.rh=null;this.eh=!1}return this.rh}hh(){const t=this.Wr.At(),i=this.Ui.yt(),n=this.Wr.ah();this.sh&&(this.Lt.st=n.map((t=>({ut:t.time,et:0,rt:0,Ks:0,th:t.shape,O:t.color,Jr:t.Jr,wr:t.id,Jt:void 0}))),this.sh=!1);const s=this.Ui.W().layout;this.Lt.nt=null;const e=i.Xs();if(null===e)return;const r=this.Wr.Pt();if(null===r)return;if(0===this.Lt.st.length)return;let h=NaN;const l=fi(i.he()),a={ih:l,nh:l};this.Lt.nt=It(this.Lt.st,e,!0);for(let e=this.Lt.nt.from;e0&&(_.Jt={Qr:o.text,et:0,rt:0,$i:0,zt:0});const u=this.Wr.oh(o.time);null!==u&&Mi(_,o,u,a,s.fontSize,l,t,i,r.Vt)}this.bt=!1}}class Si extends ei{constructor(t){super(t)}kr(){const t=this.Mr;t.Tt=!1;const i=this.Es.W();if(!i.priceLineVisible||!this.Es.Tt())return;const n=this.Es.Yr(0===i.priceLineSource);n.Xr||(t.Tt=!0,t.rt=n.yi,t.O=this.Es._h(n.O),t.ht=i.priceLineWidth,t.Wt=i.priceLineStyle)}}class ki extends tt{constructor(t){super(),this.$t=t}Ei(t,i,n){t.Tt=!1,i.Tt=!1;const s=this.$t;if(!s.Tt())return;const e=s.W(),r=e.lastValueVisible,h=""!==s.uh(),l=0===e.seriesLastValueMode,a=s.Yr(!1);if(a.Xr)return;r&&(t.Jt=this.dh(a,r,l),t.Tt=0!==t.Jt.length),(h||l)&&(i.Jt=this.fh(a,r,h,l),i.Tt=i.Jt.length>0);const o=s._h(a.O),_=y(o);n.t=_.t,n.yi=a.yi,i.Bt=s.qt().It(a.yi/s.At().zt()),t.Bt=o,t.O=_.i,i.O=_.i}fh(t,i,n,s){let e="";const r=this.$t.uh();return n&&0!==r.length&&(e+=`${r} `),i&&s&&(e+=this.$t.At().ph()?t.mh:t.bh),e.trim()}dh(t,i,n){return i?n?this.$t.At().ph()?t.bh:t.mh:t.Jt:""}}function yi(t,i,n,s){const e=Number.isFinite(i),r=Number.isFinite(n);return e&&r?t(i,n):e||r?e?i:n:s}class Ci{constructor(t,i){this.wh=t,this.gh=i}Mh(t){return null!==t&&(this.wh===t.wh&&this.gh===t.gh)}xh(){return new Ci(this.wh,this.gh)}Sh(){return this.wh}kh(){return this.gh}yh(){return this.gh-this.wh}Fi(){return this.gh===this.wh||Number.isNaN(this.gh)||Number.isNaN(this.wh)}ts(t){return null===t?this:new Ci(yi(Math.min,this.Sh(),t.Sh(),-1/0),yi(Math.max,this.kh(),t.kh(),1/0))}Ch(t){if(!P(t))return;if(0===this.gh-this.wh)return;const i=.5*(this.gh+this.wh);let n=this.gh-i,s=this.wh-i;n*=t,s*=t,this.gh=i+n,this.wh=i+s}Th(t){P(t)&&(this.gh+=t,this.wh+=t)}Ph(){return{minValue:this.wh,maxValue:this.gh}}static Rh(t){return null===t?null:new Ci(t.minValue,t.maxValue)}}class Ti{constructor(t,i){this.Dh=t,this.Oh=i||null}Ah(){return this.Dh}Vh(){return this.Oh}Ph(){return null===this.Dh?null:{priceRange:this.Dh.Ph(),margins:this.Oh||void 0}}static Rh(t){return null===t?null:new Ti(Ci.Rh(t.priceRange),t.margins)}}class Pi extends ei{constructor(t,i){super(t),this.Bh=i}kr(){const t=this.Mr;t.Tt=!1;const i=this.Bh.W();if(!this.Es.Tt()||!i.lineVisible)return;const n=this.Bh.Ih();null!==n&&(t.Tt=!0,t.rt=n,t.O=i.color,t.ht=i.lineWidth,t.Wt=i.lineStyle,t.wr=this.Bh.W().id)}}class Ri extends tt{constructor(t,i){super(),this.Wr=t,this.Bh=i}Ei(t,i,n){t.Tt=!1,i.Tt=!1;const s=this.Bh.W(),e=s.axisLabelVisible,r=""!==s.title,h=this.Wr;if(!e||!h.Tt())return;const l=this.Bh.Ih();if(null===l)return;r&&(i.Jt=s.title,i.Tt=!0),i.Bt=h.qt().It(l/h.At().zt()),t.Jt=this.zh(s.price),t.Tt=!0;const a=y(s.axisLabelColor||s.color);n.t=a.t;const o=s.axisLabelTextColor||a.i;t.O=o,i.O=o,n.yi=l}zh(t){const i=this.Wr.Pt();return null===i?"":this.Wr.At().Wi(t,i.Vt)}}class Di{constructor(t,i){this.Wr=t,this.cn=i,this.Eh=new Pi(t,this),this._r=new Ri(t,this),this.Lh=new ni(this._r,t,t.qt())}Nh(t){T(this.cn,t),this.gt(),this.Wr.qt().Fh()}W(){return this.cn}Wh(){return this.Eh}jh(){return this.Lh}Hh(){return this._r}gt(){this.Eh.gt(),this._r.gt()}Ih(){const t=this.Wr,i=t.At();if(t.qt().yt().Fi()||i.Fi())return null;const n=t.Pt();return null===n?null:i.Ot(this.cn.price,n.Vt)}}class Oi extends rt{constructor(t){super(),this.Ui=t}qt(){return this.Ui}}const Ai={Bar:(t,i,n,s)=>{var e;const r=i.upColor,h=i.downColor,l=v(t(n,s)),a=p(l.Vt[0])<=p(l.Vt[3]);return{ue:null!==(e=l.O)&&void 0!==e?e:a?r:h}},Candlestick:(t,i,n,s)=>{var e,r,h;const l=i.upColor,a=i.downColor,o=i.borderUpColor,_=i.borderDownColor,u=i.wickUpColor,c=i.wickDownColor,d=v(t(n,s)),f=p(d.Vt[0])<=p(d.Vt[3]);return{ue:null!==(e=d.O)&&void 0!==e?e:f?l:a,Le:null!==(r=d.Bt)&&void 0!==r?r:f?o:_,Ee:null!==(h=d.$h)&&void 0!==h?h:f?u:c}},Custom:(t,i,n,s)=>{var e;return{ue:null!==(e=v(t(n,s)).O)&&void 0!==e?e:i.color}},Area:(t,i,n,s)=>{var e,r,h,l;const a=v(t(n,s));return{ue:null!==(e=a._t)&&void 0!==e?e:i.lineColor,_t:null!==(r=a._t)&&void 0!==r?r:i.lineColor,Ts:null!==(h=a.Ts)&&void 0!==h?h:i.topColor,Ps:null!==(l=a.Ps)&&void 0!==l?l:i.bottomColor}},Baseline:(t,i,n,s)=>{var e,r,h,l,a,o;const _=v(t(n,s));return{ue:_.Vt[3]>=i.baseValue.price?i.topLineColor:i.bottomLineColor,Pe:null!==(e=_.Pe)&&void 0!==e?e:i.topLineColor,Re:null!==(r=_.Re)&&void 0!==r?r:i.bottomLineColor,Se:null!==(h=_.Se)&&void 0!==h?h:i.topFillColor1,ke:null!==(l=_.ke)&&void 0!==l?l:i.topFillColor2,ye:null!==(a=_.ye)&&void 0!==a?a:i.bottomFillColor1,Ce:null!==(o=_.Ce)&&void 0!==o?o:i.bottomFillColor2}},Line:(t,i,n,s)=>{var e,r;const h=v(t(n,s));return{ue:null!==(e=h.O)&&void 0!==e?e:i.color,_t:null!==(r=h.O)&&void 0!==r?r:i.color}},Histogram:(t,i,n,s)=>{var e;return{ue:null!==(e=v(t(n,s)).O)&&void 0!==e?e:i.color}}};class Vi{constructor(t){this.Uh=(t,i)=>void 0!==i?i.Vt:this.Wr.In().qh(t),this.Wr=t,this.Yh=Ai[t.Xh()]}Hs(t,i){return this.Yh(this.Uh,this.Wr.W(),t,i)}}var Bi;exports.MismatchDirection=void 0,(Bi=exports.MismatchDirection||(exports.MismatchDirection={}))[Bi.NearestLeft=-1]="NearestLeft",Bi[Bi.None=0]="None",Bi[Bi.NearestRight=1]="NearestRight";const Ii=30;class zi{constructor(){this.Kh=[],this.Zh=new Map,this.Gh=new Map}Jh(){return this.Ks()>0?this.Kh[this.Kh.length-1]:null}Qh(){return this.Ks()>0?this.tl(0):null}Bn(){return this.Ks()>0?this.tl(this.Kh.length-1):null}Ks(){return this.Kh.length}Fi(){return 0===this.Ks()}Kr(t){return null!==this.il(t,0)}qh(t){return this.nl(t)}nl(t,i=0){const n=this.il(t,i);return null===n?null:Object.assign(Object.assign({},this.sl(n)),{se:this.tl(n)})}ie(){return this.Kh}el(t,i,n){if(this.Fi())return null;let s=null;for(const e of n){s=Ei(s,this.rl(t,i,e))}return s}it(t){this.Gh.clear(),this.Zh.clear(),this.Kh=t}tl(t){return this.Kh[t].se}sl(t){return this.Kh[t]}il(t,i){const n=this.hl(t);if(null===n&&0!==i)switch(i){case-1:return this.ll(t);case 1:return this.al(t);default:throw new TypeError("Unknown search mode")}return n}ll(t){let i=this.ol(t);return i>0&&(i-=1),i!==this.Kh.length&&this.tl(i)t.set.se>i))}ul(t,i,n){let s=null;for(let e=t;es.dl&&(s.dl=t)))}return s}rl(t,i,n){if(this.Fi())return null;let s=null;const e=v(this.Qh()),r=v(this.Bn()),h=Math.max(t,e),l=Math.min(i,r),a=Math.ceil(h/Ii)*Ii,o=Math.max(a,Math.floor(l/Ii)*Ii);{const t=this.ol(h),e=this._l(Math.min(l,a,i));s=Ei(s,this.ul(t,e,n))}let _=this.Zh.get(n);void 0===_&&(_=new Map,this.Zh.set(n,_));for(let t=Math.max(a+1,h);tnew Ni(t)));return this.gl={vl:e,pl:r},r}tn(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.yl).timeAxisViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.Ml)||void 0===s?void 0:s.vl)===e)return this.Ml.pl;const r=this.Wr.qt().yt(),h=e.map((t=>new Wi(t,r)));return this.Ml={vl:e,pl:h},h}Rn(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.yl).priceAxisViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.xl)||void 0===s?void 0:s.vl)===e)return this.xl.pl;const r=this.Wr.At(),h=e.map((t=>new ji(t,r)));return this.xl={vl:e,pl:h},h}Tl(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.yl).priceAxisPaneViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.Sl)||void 0===s?void 0:s.vl)===e)return this.Sl.pl;const r=e.map((t=>new Ni(t)));return this.Sl={vl:e,pl:r},r}Pl(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.yl).timeAxisPaneViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.kl)||void 0===s?void 0:s.vl)===e)return this.kl.pl;const r=e.map((t=>new Ni(t)));return this.kl={vl:e,pl:r},r}Rl(t,i){var n,s,e;return null!==(e=null===(s=(n=this.yl).autoscaleInfo)||void 0===s?void 0:s.call(n,t,i))&&void 0!==e?e:null}br(t,i){var n,s,e;return null!==(e=null===(s=(n=this.yl).hitTest)||void 0===s?void 0:s.call(n,t,i))&&void 0!==e?e:null}}function $i(t,i,n,s){t.forEach((t=>{i(t).forEach((t=>{t.ml()===n&&s.push(t)}))}))}function Ui(t){return t.Pn()}function qi(t){return t.Tl()}function Yi(t){return t.Pl()}class Xi extends Oi{constructor(t,i,n,s,e){super(t),this.Lt=new zi,this.Eh=new Si(this),this.Dl=[],this.Ol=new ri(this),this.Al=null,this.Vl=null,this.Bl=[],this.Il=[],this.zl=null,this.El=[],this.cn=i,this.Ll=n;const r=new ki(this);this.hn=[r],this.Lh=new ni(r,this,t),"Area"!==n&&"Line"!==n&&"Baseline"!==n||(this.Al=new _i(this)),this.Nl(),this.Fl(e)}S(){null!==this.zl&&clearTimeout(this.zl)}_h(t){return this.cn.priceLineColor||t}Yr(t){const i={Xr:!0},n=this.At();if(this.qt().yt().Fi()||n.Fi()||this.Lt.Fi())return i;const s=this.qt().yt().Xs(),e=this.Pt();if(null===s||null===e)return i;let r,h;if(t){const t=this.Lt.Jh();if(null===t)return i;r=t,h=t.se}else{const t=this.Lt.nl(s.di(),-1);if(null===t)return i;if(r=this.Lt.qh(t.se),null===r)return i;h=t.se}const l=r.Vt[3],a=this.$s().Hs(h,{Vt:r}),o=n.Ot(l,e.Vt);return{Xr:!1,ct:l,Jt:n.Wi(l,e.Vt),mh:n.Wl(l),bh:n.jl(l,e.Vt),O:a.ue,yi:o,se:h}}$s(){return null!==this.Vl||(this.Vl=new Vi(this)),this.Vl}W(){return this.cn}Nh(t){const i=t.priceScaleId;void 0!==i&&i!==this.cn.priceScaleId&&this.qt().Hl(this,i),T(this.cn,t),void 0!==t.priceFormat&&(this.Nl(),this.qt().$l()),this.qt().Ul(this),this.qt().ql(),this.wn.gt("options")}it(t,i){this.Lt.it(t),this.Yl(),this.wn.gt("data"),this.dn.gt("data"),null!==this.Al&&(i&&i.Xl?this.Al.Hr():0===t.length&&this.Al.jr());const n=this.qt().cr(this);this.qt().Kl(n),this.qt().Ul(this),this.qt().ql(),this.qt().Fh()}Zl(t){this.Bl=t,this.Yl();const i=this.qt().cr(this);this.dn.gt("data"),this.qt().Kl(i),this.qt().Ul(this),this.qt().ql(),this.qt().Fh()}Gl(){return this.Bl}ah(){return this.Il}Jl(t){const i=new Di(this,t);return this.Dl.push(i),this.qt().Ul(this),i}Ql(t){const i=this.Dl.indexOf(t);-1!==i&&this.Dl.splice(i,1),this.qt().Ul(this)}Xh(){return this.Ll}Pt(){const t=this.ta();return null===t?null:{Vt:t.Vt[3],ia:t.ut}}ta(){const t=this.qt().yt().Xs();if(null===t)return null;const i=t.Os();return this.Lt.nl(i,1)}In(){return this.Lt}oh(t){const i=this.Lt.qh(t);return null===i?null:"Bar"===this.Ll||"Candlestick"===this.Ll||"Custom"===this.Ll?{we:i.Vt[0],ge:i.Vt[1],Me:i.Vt[2],xe:i.Vt[3]}:i.Vt[3]}na(t){const i=[];$i(this.El,Ui,"top",i);const n=this.Al;return null!==n&&n.Tt()?(null===this.zl&&n.Ur()&&(this.zl=setTimeout((()=>{this.zl=null,this.qt().sa()}),0)),n.$r(),i.push(n),i):i}Pn(){const t=[];this.ea()||t.push(this.Ol),t.push(this.wn,this.Eh,this.dn);const i=this.Dl.map((t=>t.Wh()));return t.push(...i),$i(this.El,Ui,"normal",t),t}ra(){return this.ha(Ui,"bottom")}la(t){return this.ha(qi,t)}aa(t){return this.ha(Yi,t)}oa(t,i){return this.El.map((n=>n.br(t,i))).filter((t=>null!==t))}Qi(t){return[this.Lh,...this.Dl.map((t=>t.jh()))]}Rn(t,i){if(i!==this.Xi&&!this.ea())return[];const n=[...this.hn];for(const t of this.Dl)n.push(t.Hh());return this.El.forEach((t=>{n.push(...t.Rn())})),n}tn(){const t=[];return this.El.forEach((i=>{t.push(...i.tn())})),t}Rl(t,i){if(void 0!==this.cn.autoscaleInfoProvider){const n=this.cn.autoscaleInfoProvider((()=>{const n=this._a(t,i);return null===n?null:n.Ph()}));return Ti.Rh(n)}return this._a(t,i)}ua(){return this.cn.priceFormat.minMove}ca(){return this.da}On(){var t;this.wn.gt(),this.dn.gt();for(const t of this.hn)t.gt();for(const t of this.Dl)t.gt();this.Eh.gt(),this.Ol.gt(),null===(t=this.Al)||void 0===t||t.gt(),this.El.forEach((t=>t.On()))}At(){return v(super.At())}Ct(t){if(!(("Line"===this.Ll||"Area"===this.Ll||"Baseline"===this.Ll)&&this.cn.crosshairMarkerVisible))return null;const i=this.Lt.qh(t);if(null===i)return null;return{ct:i.Vt[3],ot:this.fa(),Bt:this.va(),Dt:this.pa(),Rt:this.ma(t)}}uh(){return this.cn.title}Tt(){return this.cn.visible}ba(t){this.El.push(new Hi(t,this))}wa(t){this.El=this.El.filter((i=>i.Cl()!==t))}ga(){if(this.wn instanceof Xt!=!1)return t=>this.wn.Fe(t)}Ma(){if(this.wn instanceof Xt!=!1)return t=>this.wn.We(t)}ea(){return!at(this.At().xa())}_a(t,i){if(!R(t)||!R(i)||this.Lt.Fi())return null;const n="Line"===this.Ll||"Area"===this.Ll||"Baseline"===this.Ll||"Histogram"===this.Ll?[3]:[2,1],s=this.Lt.el(t,i,n);let e=null!==s?new Ci(s.cl,s.dl):null;if("Histogram"===this.Xh()){const t=this.cn.base,i=new Ci(t,t);e=null!==e?e.ts(i):i}let r=this.dn.lh();return this.El.forEach((n=>{const s=n.Rl(t,i);if(null==s?void 0:s.priceRange){const t=new Ci(s.priceRange.minValue,s.priceRange.maxValue);e=null!==e?e.ts(t):t}var h,l,a,o;(null==s?void 0:s.margins)&&(h=r,l=s.margins,r={above:Math.max(null!==(a=null==h?void 0:h.above)&&void 0!==a?a:0,l.above),below:Math.max(null!==(o=null==h?void 0:h.below)&&void 0!==o?o:0,l.below)})})),new Ti(e,r)}fa(){switch(this.Ll){case"Line":case"Area":case"Baseline":return this.cn.crosshairMarkerRadius}return 0}va(){switch(this.Ll){case"Line":case"Area":case"Baseline":{const t=this.cn.crosshairMarkerBorderColor;if(0!==t.length)return t}}return null}pa(){switch(this.Ll){case"Line":case"Area":case"Baseline":return this.cn.crosshairMarkerBorderWidth}return 0}ma(t){switch(this.Ll){case"Line":case"Area":case"Baseline":{const t=this.cn.crosshairMarkerBackgroundColor;if(0!==t.length)return t}}return this.$s().Hs(t).ue}Nl(){switch(this.cn.priceFormat.type){case"custom":this.da={format:this.cn.priceFormat.formatter};break;case"volume":this.da=new ft(this.cn.priceFormat.precision);break;case"percent":this.da=new dt(this.cn.priceFormat.precision);break;default:{const t=Math.pow(10,this.cn.priceFormat.precision);this.da=new ct(t,this.cn.priceFormat.minMove*t)}}null!==this.Xi&&this.Xi.Sa()}Yl(){const t=this.qt().yt();if(!t.ka()||this.Lt.Fi())return void(this.Il=[]);const i=v(this.Lt.Qh());this.Il=this.Bl.map(((n,s)=>{const e=v(t.ya(n.time,!0)),r=et instanceof Xi)).reduce(((t,s)=>{if(n.dr(s)||!s.Tt())return t;const e=s.At(),r=s.In();if(e.Fi()||!r.Kr(i))return t;const h=r.qh(i);if(null===h)return t;const l=p(s.Pt());return t.concat([e.Ot(h.Vt[3],l.Vt)])}),[]);if(0===l.length)return s;l.sort(((t,i)=>Math.abs(t-h)-Math.abs(i-h)));const a=l[0];return s=e.pn(a,r),s}}class Zi extends ${constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;const e=Math.max(1,Math.floor(n));t.lineWidth=e,function(t,i){t.save(),t.lineWidth%2&&t.translate(.5,.5),i(),t.restore()}(t,(()=>{const r=v(this.Lt);if(5!==r.Pa){if(r.Ra){t.strokeStyle=r.Da,u(t,r.Pa),t.beginPath();for(const s of r.Oa){const r=Math.round(s.Aa*n);t.moveTo(r,-e),t.lineTo(r,i.height+e)}t.stroke()}if(r.Va){t.strokeStyle=r.Ba,u(t,r.Ia),t.beginPath();for(const n of r.za){const r=Math.round(n.Aa*s);t.moveTo(-e,r),t.lineTo(i.width+e,r)}t.stroke()}}else{if(!r.Ra||!r.Va)return;t.fillStyle=r.Da,u(t,r.Pa),t.beginPath();const i=r.za.length>1?r.za[1].Aa-r.za[0].Aa:void 0;let e;for(let h=0;h1.7*i;e=o;for(let i=0;i({Aa:t.coord})))};this.Ht.it(i),this.bt=!1}return this.Ht}}class Ji{constructor(t){this.wn=new Gi(t)}Wh(){return this.wn}}const Qi={La:4,Na:1e-4};function tn(t,i){const n=100*(t-i)/i;return i<0?-n:n}function nn(t,i){const n=tn(t.Sh(),i),s=tn(t.kh(),i);return new Ci(n,s)}function sn(t,i){const n=100*(t-i)/i+100;return i<0?-n:n}function en(t,i){const n=sn(t.Sh(),i),s=sn(t.kh(),i);return new Ci(n,s)}function rn(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.log10(n+i.Na)+i.La;return t<0?-s:s}function hn(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.pow(10,n-i.La)-i.Na;return t<0?-s:s}function ln(t,i){if(null===t)return null;const n=rn(t.Sh(),i),s=rn(t.kh(),i);return new Ci(n,s)}function an(t,i){if(null===t)return null;const n=hn(t.Sh(),i),s=hn(t.kh(),i);return new Ci(n,s)}function on(t){if(null===t)return Qi;const i=Math.abs(t.kh()-t.Sh());if(i>=1||i<1e-15)return Qi;const n=Math.ceil(Math.abs(Math.log10(i))),s=Qi.La+n;return{La:s,Na:1/Math.pow(10,s)}}class _n{constructor(t,i){if(this.Fa=t,this.Wa=i,function(t){if(t<0)return!1;for(let i=t;i>1;i/=10)if(i%10!=0)return!1;return!0}(this.Fa))this.ja=[2,2.5,2];else{this.ja=[];for(let t=this.Fa;1!==t;){if(t%2==0)this.ja.push(2),t/=2;else{if(t%5!=0)throw new Error("unexpected base");this.ja.push(2,2.5),t/=5}if(this.ja.length>100)throw new Error("something wrong with base")}}}Ha(t,i,n){const s=0===this.Fa?0:1/this.Fa;let e=Math.pow(10,Math.max(0,Math.ceil(Math.log10(t-i)))),r=0,h=this.Wa[0];for(;;){const t=St(e,s,1e-14)&&e>s+1e-14,i=St(e,n*h,1e-14),l=St(e,1,1e-14);if(!(t&&i&&l))break;e/=h,h=this.Wa[++r%this.Wa.length]}if(e<=s+1e-14&&(e=s),e=Math.max(1,e),this.ja.length>0&&(l=e,a=1,o=1e-14,Math.abs(l-a)s+1e-14;)e/=h,h=this.ja[++r%this.ja.length];var l,a,o;return e}}class un{constructor(t,i,n,s){this.$a=[],this.Li=t,this.Fa=i,this.Ua=n,this.qa=s}Ha(t,i){if(t=o?1:-1;let d=null,f=0;for(let n=a-u;n>o;n-=_){const s=this.qa(n,i,!0);null!==d&&Math.abs(s-d)l||(fv(t.Zi())-v(i.Zi())))}var dn;exports.PriceScaleMode=void 0,(dn=exports.PriceScaleMode||(exports.PriceScaleMode={}))[dn.Normal=0]="Normal",dn[dn.Logarithmic=1]="Logarithmic",dn[dn.Percentage=2]="Percentage",dn[dn.IndexedTo100=3]="IndexedTo100";const fn=new dt,vn=new ct(100,1);class pn{constructor(t,i,n,s){this.Qa=0,this.io=null,this.Dh=null,this.no=null,this.so={eo:!1,ro:null},this.ho=0,this.lo=0,this.ao=new C,this.oo=new C,this._o=[],this.uo=null,this.co=null,this.do=null,this.fo=null,this.da=vn,this.vo=on(null),this.po=t,this.cn=i,this.mo=n,this.bo=s,this.wo=new un(this,100,this.Mo.bind(this),this.xo.bind(this))}xa(){return this.po}W(){return this.cn}Nh(t){if(T(this.cn,t),this.Sa(),void 0!==t.mode&&this.So({yr:t.mode}),void 0!==t.scaleMargins){const i=f(t.scaleMargins.top),n=f(t.scaleMargins.bottom);if(i<0||i>1)throw new Error(`Invalid top margin - expect value between 0 and 1, given=${i}`);if(n<0||n>1||i+n>1)throw new Error(`Invalid bottom margin - expect value between 0 and 1, given=${n}`);if(i+n>1)throw new Error(`Invalid margins - sum of margins must be less than 1, given=${i+n}`);this.ko(),this.co=null}}yo(){return this.cn.autoScale}Ja(){return 1===this.cn.mode}ph(){return 2===this.cn.mode}Co(){return 3===this.cn.mode}yr(){return{Wn:this.cn.autoScale,To:this.cn.invertScale,yr:this.cn.mode}}So(t){const i=this.yr();let n=null;void 0!==t.Wn&&(this.cn.autoScale=t.Wn),void 0!==t.yr&&(this.cn.mode=t.yr,2!==t.yr&&3!==t.yr||(this.cn.autoScale=!0),this.so.eo=!1),1===i.yr&&t.yr!==i.yr&&(!function(t,i){if(null===t)return!1;const n=hn(t.Sh(),i),s=hn(t.kh(),i);return isFinite(n)&&isFinite(s)}(this.Dh,this.vo)?this.cn.autoScale=!0:(n=an(this.Dh,this.vo),null!==n&&this.Po(n))),1===t.yr&&t.yr!==i.yr&&(n=ln(this.Dh,this.vo),null!==n&&this.Po(n));const s=i.yr!==this.cn.mode;s&&(2===i.yr||this.ph())&&this.Sa(),s&&(3===i.yr||this.Co())&&this.Sa(),void 0!==t.To&&i.To!==t.To&&(this.cn.invertScale=t.To,this.Ro()),this.oo.m(i,this.yr())}Do(){return this.oo}P(){return this.mo.fontSize}zt(){return this.Qa}Oo(t){this.Qa!==t&&(this.Qa=t,this.ko(),this.co=null)}Ao(){if(this.io)return this.io;const t=this.zt()-this.Vo()-this.Bo();return this.io=t,t}Ah(){return this.Io(),this.Dh}Po(t,i){const n=this.Dh;(i||null===n&&null!==t||null!==n&&!n.Mh(t))&&(this.co=null,this.Dh=t)}Fi(){return this.Io(),0===this.Qa||!this.Dh||this.Dh.Fi()}zo(t){return this.To()?t:this.zt()-1-t}Ot(t,i){return this.ph()?t=tn(t,i):this.Co()&&(t=sn(t,i)),this.xo(t,i)}Qs(t,i,n){this.Io();const s=this.Bo(),e=v(this.Ah()),r=e.Sh(),h=e.kh(),l=this.Ao()-1,a=this.To(),o=l/(h-r),_=void 0===n?0:n.from,u=void 0===n?t.length:n.to,c=this.Eo();for(let n=_;nt.On()))}Sa(){this.co=null;const t=this.Jo();let i=100;null!==t&&(i=Math.round(1/t.ua())),this.da=vn,this.ph()?(this.da=fn,i=100):this.Co()?(this.da=new ct(100,1),i=100):null!==t&&(this.da=t.ca()),this.wo=new un(this,i,this.Mo.bind(this),this.xo.bind(this)),this.wo.Xa()}Wo(){this.uo=null}Jo(){return this._o[0]||null}Vo(){return this.To()?this.cn.scaleMargins.bottom*this.zt()+this.lo:this.cn.scaleMargins.top*this.zt()+this.ho}Bo(){return this.To()?this.cn.scaleMargins.top*this.zt()+this.ho:this.cn.scaleMargins.bottom*this.zt()+this.lo}Io(){this.so.eo||(this.so.eo=!0,this.i_())}ko(){this.io=null}xo(t,i){if(this.Io(),this.Fi())return 0;t=this.Ja()&&t?rn(t,this.vo):t;const n=v(this.Ah()),s=this.Bo()+(this.Ao()-1)*(t-n.Sh())/n.yh();return this.zo(s)}Mo(t,i){if(this.Io(),this.Fi())return 0;const n=this.zo(t),s=v(this.Ah()),e=s.Sh()+s.yh()*((n-this.Bo())/(this.Ao()-1));return this.Ja()?hn(e,this.vo):e}Ro(){this.co=null,this.wo.Xa()}i_(){const t=this.so.ro;if(null===t)return;let i=null;const n=this.Qo();let s=0,e=0;for(const r of n){if(!r.Tt())continue;const n=r.Pt();if(null===n)continue;const h=r.Rl(t.Os(),t.di());let l=h&&h.Ah();if(null!==l){switch(this.cn.mode){case 1:l=ln(l,this.vo);break;case 2:l=nn(l,n.Vt);break;case 3:l=en(l,n.Vt)}if(i=null===i?l:i.ts(v(l)),null!==h){const t=h.Vh();null!==t&&(s=Math.max(s,t.above),e=Math.max(s,t.below))}}}if(s===this.ho&&e===this.lo||(this.ho=s,this.lo=e,this.co=null,this.ko()),null!==i){if(i.Sh()===i.kh()){const t=this.Jo(),n=5*(null===t||this.ph()||this.Co()?1:t.ua());this.Ja()&&(i=an(i,this.vo)),i=new Ci(i.Sh()-n,i.kh()+n),this.Ja()&&(i=ln(i,this.vo))}if(this.Ja()){const t=an(i,this.vo),n=on(t);if(r=n,h=this.vo,r.La!==h.La||r.Na!==h.Na){const s=null!==this.no?an(this.no,this.vo):null;this.vo=n,i=ln(t,n),null!==s&&(this.no=ln(s,n))}}this.Po(i)}else null===this.Dh&&(this.Po(new Ci(-.5,.5)),this.vo=on(null));var r,h;this.so.eo=!0}Eo(){return this.ph()?tn:this.Co()?sn:this.Ja()?t=>rn(t,this.vo):null}n_(t,i,n){return void 0===i?(void 0===n&&(n=this.ca()),n.format(t)):i(t)}zh(t,i){return this.n_(t,this.bo.priceFormatter,i)}Go(t,i){return this.n_(t,this.bo.percentageFormatter,i)}}class mn{constructor(t,i){this._o=[],this.s_=new Map,this.Qa=0,this.e_=0,this.r_=1e3,this.uo=null,this.h_=new C,this.wl=t,this.Ui=i,this.l_=new Ji(this);const n=i.W();this.a_=this.o_("left",n.leftPriceScale),this.__=this.o_("right",n.rightPriceScale),this.a_.Do().l(this.u_.bind(this,this.a_),this),this.__.Do().l(this.u_.bind(this,this.__),this),this.c_(n)}c_(t){if(t.leftPriceScale&&this.a_.Nh(t.leftPriceScale),t.rightPriceScale&&this.__.Nh(t.rightPriceScale),t.localization&&(this.a_.Sa(),this.__.Sa()),t.overlayPriceScales){const i=Array.from(this.s_.values());for(const n of i){const i=v(n[0].At());i.Nh(t.overlayPriceScales),t.localization&&i.Sa()}}}d_(t){switch(t){case"left":return this.a_;case"right":return this.__}return this.s_.has(t)?f(this.s_.get(t))[0].At():null}S(){this.qt().f_().p(this),this.a_.Do().p(this),this.__.Do().p(this),this._o.forEach((t=>{t.S&&t.S()})),this.h_.m()}v_(){return this.r_}p_(t){this.r_=t}qt(){return this.Ui}$i(){return this.e_}zt(){return this.Qa}m_(t){this.e_=t,this.b_()}Oo(t){this.Qa=t,this.a_.Oo(t),this.__.Oo(t),this._o.forEach((i=>{if(this.dr(i)){const n=i.At();null!==n&&n.Oo(t)}})),this.b_()}Ta(){return this._o}dr(t){const i=t.At();return null===i||this.a_!==i&&this.__!==i}Fo(t,i,n){const s=void 0!==n?n:this.g_().w_+1;this.M_(t,i,s)}jo(t){const i=this._o.indexOf(t);d(-1!==i,"removeDataSource: invalid data source"),this._o.splice(i,1);const n=v(t.At()).xa();if(this.s_.has(n)){const i=f(this.s_.get(n)),s=i.indexOf(t);-1!==s&&(i.splice(s,1),0===i.length&&this.s_.delete(n))}const s=t.At();s&&s.Ta().indexOf(t)>=0&&s.jo(t),null!==s&&(s.Wo(),this.x_(s)),this.uo=null}pr(t){return t===this.a_?"left":t===this.__?"right":"overlay"}S_(){return this.a_}k_(){return this.__}y_(t,i){t.Uo(i)}C_(t,i){t.qo(i),this.b_()}T_(t){t.Yo()}P_(t,i){t.Xo(i)}R_(t,i){t.Ko(i),this.b_()}D_(t){t.Zo()}b_(){this._o.forEach((t=>{t.On()}))}vn(){let t=null;return this.Ui.W().rightPriceScale.visible&&0!==this.__.Ta().length?t=this.__:this.Ui.W().leftPriceScale.visible&&0!==this.a_.Ta().length?t=this.a_:0!==this._o.length&&(t=this._o[0].At()),null===t&&(t=this.__),t}vr(){let t=null;return this.Ui.W().rightPriceScale.visible?t=this.__:this.Ui.W().leftPriceScale.visible&&(t=this.a_),t}x_(t){null!==t&&t.yo()&&this.O_(t)}A_(t){const i=this.wl.Xs();t.So({Wn:!0}),null!==i&&t.t_(i),this.b_()}V_(){this.O_(this.a_),this.O_(this.__)}B_(){this.x_(this.a_),this.x_(this.__),this._o.forEach((t=>{this.dr(t)&&this.x_(t.At())})),this.b_(),this.Ui.Fh()}No(){return null===this.uo&&(this.uo=cn(this._o)),this.uo}I_(){return this.h_}z_(){return this.l_}O_(t){const i=t.Qo();if(i&&i.length>0&&!this.wl.Fi()){const i=this.wl.Xs();null!==i&&t.t_(i)}t.On()}g_(){const t=this.No();if(0===t.length)return{E_:0,w_:0};let i=0,n=0;for(let s=0;sn&&(n=e))}return{E_:i,w_:n}}M_(t,i,n){let s=this.d_(i);if(null===s&&(s=this.o_(i,this.Ui.W().overlayPriceScales)),this._o.push(t),!at(i)){const n=this.s_.get(i)||[];n.push(t),this.s_.set(i,n)}s.Fo(t),t.Ji(s),t.Gi(n),this.x_(s),this.uo=null}u_(t,i,n){i.yr!==n.yr&&this.O_(t)}o_(t,i){const n=Object.assign({visible:!0,autoScale:!0},A(i)),s=new pn(t,n,this.Ui.W().layout,this.Ui.W().localization);return s.Oo(this.zt()),s}}class bn{constructor(t,i,n=50){this.Ke=0,this.Ze=1,this.Ge=1,this.Qe=new Map,this.Je=new Map,this.L_=t,this.N_=i,this.tr=n}F_(t){const i=t.time,n=this.N_.cacheKey(i),s=this.Qe.get(n);if(void 0!==s)return s.W_;if(this.Ke===this.tr){const t=this.Je.get(this.Ge);this.Je.delete(this.Ge),this.Qe.delete(f(t)),this.Ge++,this.Ke--}const e=this.L_(t);return this.Qe.set(n,{W_:e,er:this.Ze}),this.Je.set(this.Ze,n),this.Ke++,this.Ze++,e}}class wn{constructor(t,i){d(t<=i,"right should be >= left"),this.j_=t,this.H_=i}Os(){return this.j_}di(){return this.H_}U_(){return this.H_-this.j_+1}Kr(t){return this.j_<=t&&t<=this.H_}Mh(t){return this.j_===t.Os()&&this.H_===t.di()}}function gn(t,i){return null===t||null===i?t===i:t.Mh(i)}class Mn{constructor(){this.q_=new Map,this.Qe=null,this.Y_=!1}X_(t){this.Y_=t,this.Qe=null}K_(t,i){this.Z_(i),this.Qe=null;for(let n=i;n{t<=n[0].index?i.push(s):n.splice(Ot(n,t,(i=>i.indexi-t))){if(!this.q_.get(n))continue;const s=i;i=[];const e=s.length;let r=0;const h=f(this.q_.get(n)),l=h.length;let a=1/0,o=-1/0;for(let n=0;n=t&&_-o>=t)i.push(l),o=_;else if(this.Y_)return s}for(;ri.weight?t:i}class kn{constructor(t,i,n,s){this.e_=0,this.eu=null,this.ru=[],this.fo=null,this.do=null,this.hu=new Mn,this.lu=new Map,this.au=xn.su(),this.ou=!0,this._u=new C,this.uu=new C,this.cu=new C,this.du=null,this.fu=null,this.vu=[],this.cn=i,this.bo=n,this.pu=i.rightOffset,this.mu=i.barSpacing,this.Ui=t,this.N_=s,this.bu(),this.hu.X_(i.uniformDistribution)}W(){return this.cn}wu(t){T(this.bo,t),this.gu(),this.bu()}Nh(t,i){var n;T(this.cn,t),this.cn.fixLeftEdge&&this.Mu(),this.cn.fixRightEdge&&this.xu(),void 0!==t.barSpacing&&this.Ui.Gn(t.barSpacing),void 0!==t.rightOffset&&this.Ui.Jn(t.rightOffset),void 0!==t.minBarSpacing&&this.Ui.Gn(null!==(n=t.barSpacing)&&void 0!==n?n:this.mu),this.gu(),this.bu(),this.cu.m()}mn(t){var i,n;return null!==(n=null===(i=this.ru[t])||void 0===i?void 0:i.time)&&void 0!==n?n:null}qi(t){var i;return null!==(i=this.ru[t])&&void 0!==i?i:null}ya(t,i){if(this.ru.length<1)return null;if(this.N_.key(t)>this.N_.key(this.ru[this.ru.length-1].time))return i?this.ru.length-1:null;const n=Ot(this.ru,this.N_.key(t),((t,i)=>this.N_.key(t.time)0}Xs(){return this.Su(),this.au.iu()}ku(){return this.Su(),this.au.nu()}yu(){const t=this.Xs();if(null===t)return null;const i={from:t.Os(),to:t.di()};return this.Cu(i)}Cu(t){const i=Math.round(t.from),n=Math.round(t.to),s=v(this.Tu()),e=v(this.Pu());return{from:v(this.qi(Math.max(s,i))),to:v(this.qi(Math.min(e,n)))}}Ru(t){return{from:v(this.ya(t.from,!0)),to:v(this.ya(t.to,!0))}}$i(){return this.e_}m_(t){if(!isFinite(t)||t<=0)return;if(this.e_===t)return;const i=this.ku(),n=this.e_;if(this.e_=t,this.ou=!0,this.cn.lockVisibleTimeRangeOnResize&&0!==n){const i=this.mu*t/n;this.mu=i}if(this.cn.fixLeftEdge&&null!==i&&i.Os()<=0){const i=n-t;this.pu-=Math.round(i/this.mu)+1,this.ou=!0}this.Du(),this.Ou()}Et(t){if(this.Fi()||!R(t))return 0;const i=this.Au()+this.pu-t;return this.e_-(i+.5)*this.mu-1}Js(t,i){const n=this.Au(),s=void 0===i?0:i.from,e=void 0===i?t.length:i.to;for(let i=s;ii/2&&!o?n.needAlignCoordinate=!1:n.needAlignCoordinate=_&&t.index<=l||u&&t.index>=a,c++}return this.vu.length=c,this.fu=this.vu,this.vu}Fu(){this.ou=!0,this.Gn(this.cn.barSpacing),this.Jn(this.cn.rightOffset)}Wu(t){this.ou=!0,this.eu=t,this.Ou(),this.Mu()}ju(t,i){const n=this.Bu(t),s=this.he(),e=s+i*(s/10);this.Gn(e),this.cn.rightBarStaysOnScroll||this.Jn(this.Eu()+(n-this.Bu(t)))}Uo(t){this.fo&&this.Zo(),null===this.do&&null===this.du&&(this.Fi()||(this.do=t,this.Hu()))}qo(t){if(null===this.du)return;const i=xt(this.e_-t,0,this.e_),n=xt(this.e_-v(this.do),0,this.e_);0!==i&&0!==n&&this.Gn(this.du.he*i/n)}Yo(){null!==this.do&&(this.do=null,this.$u())}Xo(t){null===this.fo&&null===this.du&&(this.Fi()||(this.fo=t,this.Hu()))}Ko(t){if(null===this.fo)return;const i=(this.fo-t)/this.he();this.pu=v(this.du).Eu+i,this.ou=!0,this.Ou()}Zo(){null!==this.fo&&(this.fo=null,this.$u())}Uu(){this.qu(this.cn.rightOffset)}qu(t,i=400){if(!isFinite(t))throw new RangeError("offset is required and must be finite number");if(!isFinite(i)||i<=0)throw new RangeError("animationDuration (optional) must be finite positive number");const n=this.pu,s=performance.now();this.Ui.Xn({Yu:t=>(t-s)/i>=1,Xu:e=>{const r=(e-s)/i;return r>=1?t:n+(t-n)*r}})}gt(t,i){this.ou=!0,this.ru=t,this.hu.K_(t,i),this.Ou()}Ku(){return this._u}Zu(){return this.uu}Gu(){return this.cu}Au(){return this.eu||0}Ju(t){const i=t.U_();this.zu(this.e_/i),this.pu=t.di()-this.Au(),this.Ou(),this.ou=!0,this.Ui.Iu(),this.Ui.Fh()}Qu(){const t=this.Tu(),i=this.Pu();null!==t&&null!==i&&this.Ju(new wn(t,i+this.cn.rightOffset))}tc(t){const i=new wn(t.from,t.to);this.Ju(i)}Yi(t){return void 0!==this.bo.timeFormatter?this.bo.timeFormatter(t.originalTime):this.N_.formatHorzItem(t.time)}Lu(){const{handleScroll:t,handleScale:i}=this.Ui.W();return!(t.horzTouchDrag||t.mouseWheel||t.pressedMouseMove||t.vertTouchDrag||i.axisDoubleClickReset.time||i.axisPressedMouseMove.time||i.mouseWheel||i.pinch)}Tu(){return 0===this.ru.length?null:0}Pu(){return 0===this.ru.length?null:this.ru.length-1}ic(t){return(this.e_-1-t)/this.mu}Bu(t){const i=this.ic(t),n=this.Au()+this.pu-i;return Math.round(1e6*n)/1e6}zu(t){const i=this.mu;this.mu=t,this.Du(),i!==this.mu&&(this.ou=!0,this.nc())}Su(){if(!this.ou)return;if(this.ou=!1,this.Fi())return void this.sc(xn.su());const t=this.Au(),i=this.e_/this.mu,n=this.pu+t,s=new wn(n-i+1,n);this.sc(new xn(s))}Du(){const t=this.ec();if(this.mut&&(this.mu=t,this.ou=!0)}}ec(){return this.cn.fixLeftEdge&&this.cn.fixRightEdge&&0!==this.ru.length?this.e_/this.ru.length:this.cn.minBarSpacing}Ou(){const t=this.rc();this.pu>t&&(this.pu=t,this.ou=!0);const i=this.hc();null!==i&&this.puthis.lc(t)),this.N_),this.lu.set(t.weight,i)),i.F_(t)}lc(t){return this.N_.formatTickmark(t,this.bo)}sc(t){const i=this.au;this.au=t,gn(i.iu(),this.au.iu())||this._u.m(),gn(i.nu(),this.au.nu())||this.uu.m(),this.nc()}nc(){this.fu=null}gu(){this.nc(),this.lu.clear()}bu(){this.N_.updateFormatter(this.bo)}Mu(){if(!this.cn.fixLeftEdge)return;const t=this.Tu();if(null===t)return;const i=this.Xs();if(null===i)return;const n=i.Os()-t;if(n<0){const t=this.pu-n-1;this.Jn(t)}this.Du()}xu(){this.Ou(),this.Du()}}class yn extends N{constructor(t){super(),this.ac=new Map,this.Lt=t}Z(t){}J(t){if(!this.Lt.Tt)return;const{context:i,mediaSize:n}=t;let s=0;for(const t of this.Lt.oc){if(0===t.Jt.length)continue;i.font=t.R;const e=this._c(i,t.Jt);e>n.width?t.ju=n.width/e:t.ju=1,s+=t.uc*t.ju}let e=0;switch(this.Lt.cc){case"top":e=0;break;case"center":e=Math.max((n.height-s)/2,0);break;case"bottom":e=Math.max(n.height-s,0)}i.fillStyle=this.Lt.O;for(const t of this.Lt.oc){i.save();let s=0;switch(this.Lt.dc){case"left":i.textAlign="left",s=t.uc/2;break;case"center":i.textAlign="center",s=n.width/2;break;case"right":i.textAlign="right",s=n.width-1-t.uc/2}i.translate(s,e),i.textBaseline="top",i.font=t.R,i.scale(t.ju,t.ju),i.fillText(t.Jt,0,t.fc),i.restore(),e+=t.uc*t.ju}}_c(t,i){const n=this.vc(t.font);let s=n.get(i);return void 0===s&&(s=t.measureText(i).width,n.set(i,s)),s}vc(t){let i=this.ac.get(t);return void 0===i&&(i=new Map,this.ac.set(t,i)),i}}class Cn{constructor(t){this.bt=!0,this.jt={Tt:!1,O:"",oc:[],cc:"center",dc:"center"},this.Ht=new yn(this.jt),this.$t=t}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht}St(){const t=this.$t.W(),i=this.jt;i.Tt=t.visible,i.Tt&&(i.O=t.color,i.dc=t.horzAlign,i.cc=t.vertAlign,i.oc=[{Jt:t.text,R:z(t.fontSize,t.fontFamily,t.fontStyle),uc:1.2*t.fontSize,fc:0,ju:0}])}}class Tn extends rt{constructor(t,i){super(),this.cn=i,this.wn=new Cn(this)}Rn(){return[]}Pn(){return[this.wn]}W(){return this.cn}On(){this.wn.gt()}}var Pn,Rn,Dn,On,An;exports.TrackingModeExitMode=void 0,(Pn=exports.TrackingModeExitMode||(exports.TrackingModeExitMode={}))[Pn.OnTouchEnd=0]="OnTouchEnd",Pn[Pn.OnNextTap=1]="OnNextTap";class Vn{constructor(t,i,n){this.mc=[],this.bc=[],this.e_=0,this.wc=null,this.gc=new C,this.Mc=new C,this.xc=null,this.Sc=t,this.cn=i,this.N_=n,this.kc=new E(this),this.wl=new kn(this,i.timeScale,this.cn.localization,n),this.wt=new lt(this,i.crosshair),this.yc=new Ki(i.crosshair),this.Cc=new Tn(this,i.watermark),this.Tc(),this.mc[0].p_(2e3),this.Pc=this.Rc(0),this.Dc=this.Rc(1)}$l(){this.Oc(ot.es())}Fh(){this.Oc(ot.ss())}sa(){this.Oc(new ot(1))}Ul(t){const i=this.Ac(t);this.Oc(i)}Vc(){return this.wc}Bc(t){const i=this.wc;this.wc=t,null!==i&&this.Ul(i.Ic),null!==t&&this.Ul(t.Ic)}W(){return this.cn}Nh(t){T(this.cn,t),this.mc.forEach((i=>i.c_(t))),void 0!==t.timeScale&&this.wl.Nh(t.timeScale),void 0!==t.localization&&this.wl.wu(t.localization),(t.leftPriceScale||t.rightPriceScale)&&this.gc.m(),this.Pc=this.Rc(0),this.Dc=this.Rc(1),this.$l()}zc(t,i){if("left"===t)return void this.Nh({leftPriceScale:i});if("right"===t)return void this.Nh({rightPriceScale:i});const n=this.Ec(t);null!==n&&(n.At.Nh(i),this.gc.m())}Ec(t){for(const i of this.mc){const n=i.d_(t);if(null!==n)return{Ut:i,At:n}}return null}yt(){return this.wl}Lc(){return this.mc}Nc(){return this.Cc}Fc(){return this.wt}Wc(){return this.Mc}jc(t,i){t.Oo(i),this.Iu()}m_(t){this.e_=t,this.wl.m_(this.e_),this.mc.forEach((i=>i.m_(t))),this.Iu()}Tc(t){const i=new mn(this.wl,this);void 0!==t?this.mc.splice(t,0,i):this.mc.push(i);const n=void 0===t?this.mc.length-1:t,s=ot.es();return s.Nn(n,{Fn:0,Wn:!0}),this.Oc(s),i}y_(t,i,n){t.y_(i,n)}C_(t,i,n){t.C_(i,n),this.ql(),this.Oc(this.Hc(t,2))}T_(t,i){t.T_(i),this.Oc(this.Hc(t,2))}P_(t,i,n){i.yo()||t.P_(i,n)}R_(t,i,n){i.yo()||(t.R_(i,n),this.ql(),this.Oc(this.Hc(t,2)))}D_(t,i){i.yo()||(t.D_(i),this.Oc(this.Hc(t,2)))}A_(t,i){t.A_(i),this.Oc(this.Hc(t,2))}$c(t){this.wl.Uo(t)}Uc(t,i){const n=this.yt();if(n.Fi()||0===i)return;const s=n.$i();t=Math.max(1,Math.min(t,s)),n.ju(t,i),this.Iu()}qc(t){this.Yc(0),this.Xc(t),this.Kc()}Zc(t){this.wl.qo(t),this.Iu()}Gc(){this.wl.Yo(),this.Fh()}Yc(t){this.wl.Xo(t)}Xc(t){this.wl.Ko(t),this.Iu()}Kc(){this.wl.Zo(),this.Fh()}Mt(){return this.bc}Jc(t,i,n,s,e){this.wt.gn(t,i);let r=NaN,h=this.wl.Vu(t);const l=this.wl.Xs();null!==l&&(h=Math.min(Math.max(l.Os(),h),l.di()));const a=s.vn(),o=a.Pt();null!==o&&(r=a.pn(i,o)),r=this.yc.Ca(r,h,s),this.wt.kn(h,r,s),this.sa(),e||this.Mc.m(this.wt.kt(),{x:t,y:i},n)}Qc(t,i,n){const s=n.vn(),e=s.Pt(),r=s.Ot(t,v(e)),h=this.wl.ya(i,!0),l=this.wl.Et(v(h));this.Jc(l,r,null,n,!0)}td(t){this.Fc().Cn(),this.sa(),t||this.Mc.m(null,null,null)}ql(){const t=this.wt.Ut();if(null!==t){const i=this.wt.xn(),n=this.wt.Sn();this.Jc(i,n,null,t)}this.wt.On()}nd(t,i,n){const s=this.wl.mn(0);void 0!==i&&void 0!==n&&this.wl.gt(i,n);const e=this.wl.mn(0),r=this.wl.Au(),h=this.wl.Xs();if(null!==h&&null!==s&&null!==e){const i=h.Kr(r),l=this.N_.key(s)>this.N_.key(e),a=null!==t&&t>r&&!l,o=this.wl.W().allowShiftVisibleRangeOnWhitespaceReplacement,_=i&&(!(void 0===n)||o)&&this.wl.W().shiftVisibleRangeOnNewBar;if(a&&!_){const i=t-r;this.wl.Jn(this.wl.Eu()-i)}}this.wl.Wu(t)}Kl(t){null!==t&&t.B_()}cr(t){const i=this.mc.find((i=>i.No().includes(t)));return void 0===i?null:i}Iu(){this.Cc.On(),this.mc.forEach((t=>t.B_())),this.ql()}S(){this.mc.forEach((t=>t.S())),this.mc.length=0,this.cn.localization.priceFormatter=void 0,this.cn.localization.percentageFormatter=void 0,this.cn.localization.timeFormatter=void 0}sd(){return this.kc}mr(){return this.kc.W()}f_(){return this.gc}ed(t,i,n){const s=this.mc[0],e=this.rd(i,t,s,n);return this.bc.push(e),1===this.bc.length?this.$l():this.Fh(),e}hd(t){const i=this.cr(t),n=this.bc.indexOf(t);d(-1!==n,"Series not found"),this.bc.splice(n,1),v(i).jo(t),t.S&&t.S()}Hl(t,i){const n=v(this.cr(t));n.jo(t);const s=this.Ec(i);if(null===s){const s=t.Zi();n.Fo(t,i,s)}else{const e=s.Ut===n?t.Zi():void 0;s.Ut.Fo(t,i,e)}}Qu(){const t=ot.ss();t.$n(),this.Oc(t)}ld(t){const i=ot.ss();i.Yn(t),this.Oc(i)}Zn(){const t=ot.ss();t.Zn(),this.Oc(t)}Gn(t){const i=ot.ss();i.Gn(t),this.Oc(i)}Jn(t){const i=ot.ss();i.Jn(t),this.Oc(i)}Xn(t){const i=ot.ss();i.Xn(t),this.Oc(i)}Un(){const t=ot.ss();t.Un(),this.Oc(t)}ad(){return this.cn.rightPriceScale.visible?"right":"left"}od(){return this.Dc}q(){return this.Pc}It(t){const i=this.Dc,n=this.Pc;if(i===n)return i;if(t=Math.max(0,Math.min(100,Math.round(100*t))),null===this.xc||this.xc.Ts!==n||this.xc.Ps!==i)this.xc={Ts:n,Ps:i,_d:new Map};else{const i=this.xc._d.get(t);if(void 0!==i)return i}const s=function(t,i,n){const[s,e,r,h]=k(t),[l,a,o,_]=k(i),u=[b(s+n*(l-s)),b(e+n*(a-e)),b(r+n*(o-r)),w(h+n*(_-h))];return`rgba(${u[0]}, ${u[1]}, ${u[2]}, ${u[3]})`}(n,i,t/100);return this.xc._d.set(t,s),s}Hc(t,i){const n=new ot(i);if(null!==t){const s=this.mc.indexOf(t);n.Nn(s,{Fn:i})}return n}Ac(t,i){return void 0===i&&(i=2),this.Hc(this.cr(t),i)}Oc(t){this.Sc&&this.Sc(t),this.mc.forEach((t=>t.z_().Wh().gt()))}rd(t,i,n,s){const e=new Xi(this,t,i,n,s),r=void 0!==t.priceScaleId?t.priceScaleId:this.ad();return n.Fo(e,r),at(r)||e.Nh(t),e}Rc(t){const i=this.cn.layout;return"gradient"===i.background.type?0===t?i.background.topColor:i.background.bottomColor:i.background.color}}function Bn(t){return!P(t)&&!D(t)}function In(t){return P(t)}exports.LastPriceAnimationMode=void 0,(Rn=exports.LastPriceAnimationMode||(exports.LastPriceAnimationMode={}))[Rn.Disabled=0]="Disabled",Rn[Rn.Continuous=1]="Continuous",Rn[Rn.OnDataUpdate=2]="OnDataUpdate",exports.PriceLineSource=void 0,(Dn=exports.PriceLineSource||(exports.PriceLineSource={}))[Dn.LastBar=0]="LastBar",Dn[Dn.LastVisible=1]="LastVisible",exports.ColorType=void 0,(On=exports.ColorType||(exports.ColorType={})).Solid="solid",On.VerticalGradient="gradient",exports.TickMarkType=void 0,(An=exports.TickMarkType||(exports.TickMarkType={}))[An.Year=0]="Year",An[An.Month=1]="Month",An[An.DayOfMonth=2]="DayOfMonth",An[An.Time=3]="Time",An[An.TimeWithSeconds=4]="TimeWithSeconds";const zn=t=>t.getUTCFullYear();function En(t,i,n){return i.replace(/yyyy/g,(t=>ut(zn(t),4))(t)).replace(/yy/g,(t=>ut(zn(t)%100,2))(t)).replace(/MMMM/g,((t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"long"}))(t,n)).replace(/MMM/g,((t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"short"}))(t,n)).replace(/MM/g,(t=>ut((t=>t.getUTCMonth()+1)(t),2))(t)).replace(/dd/g,(t=>ut((t=>t.getUTCDate())(t),2))(t))}class Ln{constructor(t="yyyy-MM-dd",i="default"){this.ud=t,this.dd=i}F_(t){return En(t,this.ud,this.dd)}}class Nn{constructor(t){this.fd=t||"%h:%m:%s"}F_(t){return this.fd.replace("%h",ut(t.getUTCHours(),2)).replace("%m",ut(t.getUTCMinutes(),2)).replace("%s",ut(t.getUTCSeconds(),2))}}const Fn={vd:"yyyy-MM-dd",pd:"%h:%m:%s",md:" ",bd:"default"};class Wn{constructor(t={}){const i=Object.assign(Object.assign({},Fn),t);this.wd=new Ln(i.vd,i.bd),this.gd=new Nn(i.pd),this.Md=i.md}F_(t){return`${this.wd.F_(t)}${this.Md}${this.gd.F_(t)}`}}function jn(t){return 60*t*60*1e3}function Hn(t){return 60*t*1e3}const $n=[{xd:(Un=1,1e3*Un),Sd:10},{xd:Hn(1),Sd:20},{xd:Hn(5),Sd:21},{xd:Hn(30),Sd:22},{xd:jn(1),Sd:30},{xd:jn(3),Sd:31},{xd:jn(6),Sd:32},{xd:jn(12),Sd:33}];var Un;function qn(t,i){if(t.getUTCFullYear()!==i.getUTCFullYear())return 70;if(t.getUTCMonth()!==i.getUTCMonth())return 60;if(t.getUTCDate()!==i.getUTCDate())return 50;for(let n=$n.length-1;n>=0;--n)if(Math.floor(i.getTime()/$n[n].xd)!==Math.floor(t.getTime()/$n[n].xd))return $n[n].Sd;return 0}function Yn(t){let i=t;if(D(t)&&(i=Kn(t)),!Bn(i))throw new Error("time must be of type BusinessDay");const n=new Date(Date.UTC(i.year,i.month-1,i.day,0,0,0,0));return{kd:Math.round(n.getTime()/1e3),yd:i}}function Xn(t){if(!In(t))throw new Error("time must be of type isUTCTimestamp");return{kd:t}}function Kn(t){const i=new Date(t);if(isNaN(i.getTime()))throw new Error(`Invalid date string=${t}, expected format=yyyy-mm-dd`);return{day:i.getUTCDate(),month:i.getUTCMonth()+1,year:i.getUTCFullYear()}}function Zn(t){D(t.time)&&(t.time=Kn(t.time))}class Gn{options(){return this.cn}setOptions(t){this.cn=t,this.updateFormatter(t.localization)}preprocessData(t){Array.isArray(t)?function(t){t.forEach(Zn)}(t):Zn(t)}createConverterToInternalObj(t){return v(function(t){return 0===t.length?null:Bn(t[0].time)||D(t[0].time)?Yn:Xn}(t))}key(t){return"object"==typeof t&&"kd"in t?t.kd:this.key(this.convertHorzItemToInternal(t))}cacheKey(t){const i=t;return void 0===i.yd?new Date(1e3*i.kd).getTime():new Date(Date.UTC(i.yd.year,i.yd.month-1,i.yd.day)).getTime()}convertHorzItemToInternal(t){return In(i=t)?Xn(i):Bn(i)?Yn(i):Yn(Kn(i));var i}updateFormatter(t){if(!this.cn)return;const i=t.dateFormat;this.cn.timeScale.timeVisible?this.Cd=new Wn({vd:i,pd:this.cn.timeScale.secondsVisible?"%h:%m:%s":"%h:%m",md:" ",bd:t.locale}):this.Cd=new Ln(i,t.locale)}formatHorzItem(t){const i=t;return this.Cd.F_(new Date(1e3*i.kd))}formatTickmark(t,i){const n=function(t,i,n){switch(t){case 0:case 10:return i?n?4:3:2;case 20:case 21:case 22:case 30:case 31:case 32:case 33:return i?3:2;case 50:return 2;case 60:return 1;case 70:return 0}}(t.weight,this.cn.timeScale.timeVisible,this.cn.timeScale.secondsVisible),s=this.cn.timeScale;if(void 0!==s.tickMarkFormatter){const e=s.tickMarkFormatter(t.originalTime,n,i.locale);if(null!==e)return e}return function(t,i,n){const s={};switch(i){case 0:s.year="numeric";break;case 1:s.month="short";break;case 2:s.day="numeric";break;case 3:s.hour12=!1,s.hour="2-digit",s.minute="2-digit";break;case 4:s.hour12=!1,s.hour="2-digit",s.minute="2-digit",s.second="2-digit"}const e=void 0===t.yd?new Date(1e3*t.kd):new Date(Date.UTC(t.yd.year,t.yd.month-1,t.yd.day));return new Date(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()).toLocaleString(n,s)}(t.time,n,i.locale)}maxTickMarkWeight(t){let i=t.reduce(Sn,t[0]).weight;return i>30&&i<50&&(i=30),i}fillWeightsForPoints(t,i){!function(t,i=0){if(0===t.length)return;let n=0===i?null:t[i-1].time.kd,s=null!==n?new Date(1e3*n):null,e=0;for(let r=i;r1){const i=Math.ceil(e/(t.length-1)),n=new Date(1e3*(t[0].time.kd-i));t[0].timeWeight=qn(new Date(1e3*t[0].time.kd),n)}}(t,i)}static Td(t){return T({localization:{dateFormat:"dd MMM 'yy"}},null!=t?t:{})}}const Jn="undefined"!=typeof window;function Qn(){return!!Jn&&window.navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function ts(){return!!Jn&&/iPhone|iPad|iPod/.test(window.navigator.platform)}function is(t){return t+t%2}function ns(t,i){return t.Pd-i.Pd}function ss(t,i,n){const s=(t.Pd-i.Pd)/(t.ut-i.ut);return Math.sign(s)*Math.min(Math.abs(s),n)}class es{constructor(t,i,n,s){this.Rd=null,this.Dd=null,this.Od=null,this.Ad=null,this.Vd=null,this.Bd=0,this.Id=0,this.zd=t,this.Ed=i,this.Ld=n,this.rs=s}Nd(t,i){if(null!==this.Rd){if(this.Rd.ut===i)return void(this.Rd.Pd=t);if(Math.abs(this.Rd.Pd-t)50)return;let n=0;const s=ss(this.Rd,this.Dd,this.Ed),e=ns(this.Rd,this.Dd),r=[s],h=[e];if(n+=e,null!==this.Od){const t=ss(this.Dd,this.Od,this.Ed);if(Math.sign(t)===Math.sign(s)){const i=ns(this.Dd,this.Od);if(r.push(t),h.push(i),n+=i,null!==this.Ad){const t=ss(this.Od,this.Ad,this.Ed);if(Math.sign(t)===Math.sign(s)){const i=ns(this.Od,this.Ad);r.push(t),h.push(i),n+=i}}}}let l=0;for(let t=0;t({width:Math.max(t.width,i.width),height:Math.max(t.height,i.height)})});return e.resizeCanvasElement(n),e}function hs(t,i,n,s){t.G&&t.G(i,n,s)}function ls(t,i,n,s){t.K(i,n,s)}function as(t,i,n,s){const e=t(n,s);for(const t of e){const n=t.xt();null!==n&&i(n)}}function os(t){Jn&&void 0!==window.chrome&&t.addEventListener("mousedown",(t=>{if(1===t.button)return t.preventDefault(),!1}))}class _s{constructor(t,i,n){this.Wd=0,this.jd=null,this.Hd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY},this.$d=0,this.Ud=null,this.qd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY},this.Yd=null,this.Xd=!1,this.Kd=null,this.Zd=null,this.Gd=!1,this.Jd=!1,this.Qd=!1,this.tf=null,this.if=null,this.nf=null,this.sf=null,this.ef=null,this.rf=null,this.hf=null,this.lf=0,this.af=!1,this._f=!1,this.uf=!1,this.cf=0,this.df=null,this.ff=!ts(),this.vf=t=>{this.pf(t)},this.mf=t=>{if(this.bf(t)){const i=this.wf(t);if(++this.$d,this.Ud&&this.$d>1){const{gf:n}=this.Mf(ds(t),this.qd);n<30&&!this.Qd&&this.xf(i,this.kf.Sf),this.yf()}}else{const i=this.wf(t);if(++this.Wd,this.jd&&this.Wd>1){const{gf:n}=this.Mf(ds(t),this.Hd);n<5&&!this.Jd&&this.Cf(i,this.kf.Tf),this.Pf()}}},this.Rf=t,this.kf=i,this.cn=n,this.Df()}S(){null!==this.tf&&(this.tf(),this.tf=null),null!==this.if&&(this.if(),this.if=null),null!==this.sf&&(this.sf(),this.sf=null),null!==this.ef&&(this.ef(),this.ef=null),null!==this.rf&&(this.rf(),this.rf=null),null!==this.nf&&(this.nf(),this.nf=null),this.Of(),this.Pf()}Af(t){this.sf&&this.sf();const i=this.Vf.bind(this);if(this.sf=()=>{this.Rf.removeEventListener("mousemove",i)},this.Rf.addEventListener("mousemove",i),this.bf(t))return;const n=this.wf(t);this.Cf(n,this.kf.Bf),this.ff=!0}Pf(){null!==this.jd&&clearTimeout(this.jd),this.Wd=0,this.jd=null,this.Hd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY}}yf(){null!==this.Ud&&clearTimeout(this.Ud),this.$d=0,this.Ud=null,this.qd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY}}Vf(t){if(this.uf||null!==this.Zd)return;if(this.bf(t))return;const i=this.wf(t);this.Cf(i,this.kf.If),this.ff=!0}zf(t){const i=vs(t.changedTouches,v(this.df));if(null===i)return;if(this.cf=fs(t),null!==this.hf)return;if(this._f)return;this.af=!0;const n=this.Mf(ds(i),v(this.Zd)),{Ef:s,Lf:e,gf:r}=n;if(this.Gd||!(r<5)){if(!this.Gd){const t=.5*s,i=e>=t&&!this.cn.Nf(),n=t>e&&!this.cn.Ff();i||n||(this._f=!0),this.Gd=!0,this.Qd=!0,this.Of(),this.yf()}if(!this._f){const n=this.wf(t,i);this.xf(n,this.kf.Wf),cs(t)}}}jf(t){if(0!==t.button)return;const i=this.Mf(ds(t),v(this.Kd)),{gf:n}=i;if(n>=5&&(this.Jd=!0,this.Pf()),this.Jd){const i=this.wf(t);this.Cf(i,this.kf.Hf)}}Mf(t,i){const n=Math.abs(i.et-t.et),s=Math.abs(i.rt-t.rt);return{Ef:n,Lf:s,gf:n+s}}$f(t){let i=vs(t.changedTouches,v(this.df));if(null===i&&0===t.touches.length&&(i=t.changedTouches[0]),null===i)return;this.df=null,this.cf=fs(t),this.Of(),this.Zd=null,this.rf&&(this.rf(),this.rf=null);const n=this.wf(t,i);if(this.xf(n,this.kf.Uf),++this.$d,this.Ud&&this.$d>1){const{gf:t}=this.Mf(ds(i),this.qd);t<30&&!this.Qd&&this.xf(n,this.kf.Sf),this.yf()}else this.Qd||(this.xf(n,this.kf.qf),this.kf.qf&&cs(t));0===this.$d&&cs(t),0===t.touches.length&&this.Xd&&(this.Xd=!1,cs(t))}pf(t){if(0!==t.button)return;const i=this.wf(t);if(this.Kd=null,this.uf=!1,this.ef&&(this.ef(),this.ef=null),Qn()){this.Rf.ownerDocument.documentElement.removeEventListener("mouseleave",this.vf)}if(!this.bf(t))if(this.Cf(i,this.kf.Yf),++this.Wd,this.jd&&this.Wd>1){const{gf:n}=this.Mf(ds(t),this.Hd);n<5&&!this.Jd&&this.Cf(i,this.kf.Tf),this.Pf()}else this.Jd||this.Cf(i,this.kf.Xf)}Of(){null!==this.Yd&&(clearTimeout(this.Yd),this.Yd=null)}Kf(t){if(null!==this.df)return;const i=t.changedTouches[0];this.df=i.identifier,this.cf=fs(t);const n=this.Rf.ownerDocument.documentElement;this.Qd=!1,this.Gd=!1,this._f=!1,this.Zd=ds(i),this.rf&&(this.rf(),this.rf=null);{const i=this.zf.bind(this),s=this.$f.bind(this);this.rf=()=>{n.removeEventListener("touchmove",i),n.removeEventListener("touchend",s)},n.addEventListener("touchmove",i,{passive:!1}),n.addEventListener("touchend",s,{passive:!1}),this.Of(),this.Yd=setTimeout(this.Zf.bind(this,t),240)}const s=this.wf(t,i);this.xf(s,this.kf.Gf),this.Ud||(this.$d=0,this.Ud=setTimeout(this.yf.bind(this),500),this.qd=ds(i))}Jf(t){if(0!==t.button)return;const i=this.Rf.ownerDocument.documentElement;Qn()&&i.addEventListener("mouseleave",this.vf),this.Jd=!1,this.Kd=ds(t),this.ef&&(this.ef(),this.ef=null);{const t=this.jf.bind(this),n=this.pf.bind(this);this.ef=()=>{i.removeEventListener("mousemove",t),i.removeEventListener("mouseup",n)},i.addEventListener("mousemove",t),i.addEventListener("mouseup",n)}if(this.uf=!0,this.bf(t))return;const n=this.wf(t);this.Cf(n,this.kf.Qf),this.jd||(this.Wd=0,this.jd=setTimeout(this.Pf.bind(this),500),this.Hd=ds(t))}Df(){this.Rf.addEventListener("mouseenter",this.Af.bind(this)),this.Rf.addEventListener("touchcancel",this.Of.bind(this));{const t=this.Rf.ownerDocument,i=t=>{this.kf.tv&&(t.composed&&this.Rf.contains(t.composedPath()[0])||t.target&&this.Rf.contains(t.target)||this.kf.tv())};this.if=()=>{t.removeEventListener("touchstart",i)},this.tf=()=>{t.removeEventListener("mousedown",i)},t.addEventListener("mousedown",i),t.addEventListener("touchstart",i,{passive:!0})}ts()&&(this.nf=()=>{this.Rf.removeEventListener("dblclick",this.mf)},this.Rf.addEventListener("dblclick",this.mf)),this.Rf.addEventListener("mouseleave",this.iv.bind(this)),this.Rf.addEventListener("touchstart",this.Kf.bind(this),{passive:!0}),os(this.Rf),this.Rf.addEventListener("mousedown",this.Jf.bind(this)),this.nv(),this.Rf.addEventListener("touchmove",(()=>{}),{passive:!1})}nv(){void 0===this.kf.sv&&void 0===this.kf.ev&&void 0===this.kf.rv||(this.Rf.addEventListener("touchstart",(t=>this.hv(t.touches)),{passive:!0}),this.Rf.addEventListener("touchmove",(t=>{if(2===t.touches.length&&null!==this.hf&&void 0!==this.kf.ev){const i=us(t.touches[0],t.touches[1])/this.lf;this.kf.ev(this.hf,i),cs(t)}}),{passive:!1}),this.Rf.addEventListener("touchend",(t=>{this.hv(t.touches)})))}hv(t){1===t.length&&(this.af=!1),2!==t.length||this.af||this.Xd?this.lv():this.av(t)}av(t){const i=this.Rf.getBoundingClientRect()||{left:0,top:0};this.hf={et:(t[0].clientX-i.left+(t[1].clientX-i.left))/2,rt:(t[0].clientY-i.top+(t[1].clientY-i.top))/2},this.lf=us(t[0],t[1]),void 0!==this.kf.sv&&this.kf.sv(),this.Of()}lv(){null!==this.hf&&(this.hf=null,void 0!==this.kf.rv&&this.kf.rv())}iv(t){if(this.sf&&this.sf(),this.bf(t))return;if(!this.ff)return;const i=this.wf(t);this.Cf(i,this.kf.ov),this.ff=!ts()}Zf(t){const i=vs(t.touches,v(this.df));if(null===i)return;const n=this.wf(t,i);this.xf(n,this.kf._v),this.Qd=!0,this.Xd=!0}bf(t){return t.sourceCapabilities&&void 0!==t.sourceCapabilities.firesTouchEvents?t.sourceCapabilities.firesTouchEvents:fs(t){"touchstart"!==t.type&&cs(t)}}}}function us(t,i){const n=t.clientX-i.clientX,s=t.clientY-i.clientY;return Math.sqrt(n*n+s*s)}function cs(t){t.cancelable&&t.preventDefault()}function ds(t){return{et:t.pageX,rt:t.pageY}}function fs(t){return t.timeStamp||performance.now()}function vs(t,i){for(let n=0;n{var s,e,r,h;return(null!==(e=null===(s=n.At())||void 0===s?void 0:s.xa())&&void 0!==e?e:"")!==i?[]:null!==(h=null===(r=n.la)||void 0===r?void 0:r.call(n,t))&&void 0!==h?h:[]}}class ws{constructor(i,n,s,e){this.Li=null,this.wv=null,this.gv=!1,this.Mv=new ti(200),this.Gr=null,this.xv=0,this.Sv=!1,this.kv=()=>{this.Sv||this.nn.yv().qt().Fh()},this.Cv=()=>{this.Sv||this.nn.yv().qt().Fh()},this.nn=i,this.cn=n,this.mo=n.layout,this.kc=s,this.Tv="left"===e,this.Pv=bs("normal",e),this.Rv=bs("top",e),this.Dv=bs("bottom",e),this.Ov=document.createElement("div"),this.Ov.style.height="100%",this.Ov.style.overflow="hidden",this.Ov.style.width="25px",this.Ov.style.left="0",this.Ov.style.position="relative",this.Av=rs(this.Ov,t.size({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.kv);const r=this.Av.canvasElement;r.style.position="absolute",r.style.zIndex="1",r.style.left="0",r.style.top="0",this.Vv=rs(this.Ov,t.size({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.Cv);const h=this.Vv.canvasElement;h.style.position="absolute",h.style.zIndex="2",h.style.left="0",h.style.top="0";const l={Qf:this.Bv.bind(this),Gf:this.Bv.bind(this),Hf:this.Iv.bind(this),Wf:this.Iv.bind(this),tv:this.zv.bind(this),Yf:this.Ev.bind(this),Uf:this.Ev.bind(this),Tf:this.Lv.bind(this),Sf:this.Lv.bind(this),Bf:this.Nv.bind(this),ov:this.Fv.bind(this)};this.Wv=new _s(this.Vv.canvasElement,l,{Nf:()=>!this.cn.handleScroll.vertTouchDrag,Ff:()=>!0})}S(){this.Wv.S(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Vv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.kv),this.Av.dispose(),null!==this.Li&&this.Li.$o().p(this),this.Li=null}jv(){return this.Ov}P(){return this.mo.fontSize}Hv(){const t=this.kc.W();return this.Gr!==t.R&&(this.Mv.ir(),this.Gr=t.R),t}$v(){if(null===this.Li)return 0;let t=0;const i=this.Hv(),n=v(this.Av.canvasElement.getContext("2d"));n.save();const s=this.Li.Ea();n.font=this.Uv(),s.length>0&&(t=Math.max(this.Mv.Si(n,s[0].Za),this.Mv.Si(n,s[s.length-1].Za)));const e=this.qv();for(let i=e.length;i--;){const s=this.Mv.Si(n,e[i].Jt());s>t&&(t=s)}const r=this.Li.Pt();if(null!==r&&null!==this.wv){const i=this.Li.pn(1,r),s=this.Li.pn(this.wv.height-2,r);t=Math.max(t,this.Mv.Si(n,this.Li.Wi(Math.floor(Math.min(i,s))+.11111111111111,r)),this.Mv.Si(n,this.Li.Wi(Math.ceil(Math.max(i,s))-.11111111111111,r)))}n.restore();const h=t||34;return is(Math.ceil(i.C+i.T+i.B+i.I+5+h))}Yv(i){null!==this.wv&&t.equalSizes(this.wv,i)||(this.wv=i,this.Sv=!0,this.Av.resizeCanvasElement(i),this.Vv.resizeCanvasElement(i),this.Sv=!1,this.Ov.style.width=`${i.width}px`,this.Ov.style.height=`${i.height}px`)}Xv(){return v(this.wv).width}Ji(t){this.Li!==t&&(null!==this.Li&&this.Li.$o().p(this),this.Li=t,t.$o().l(this.ao.bind(this),this))}At(){return this.Li}ir(){const t=this.nn.Kv();this.nn.yv().qt().A_(t,v(this.At()))}Zv(i){if(null===this.wv)return;if(1!==i){this.Gv(),this.Av.applySuggestedBitmapSize();const i=t.tryCreateCanvasRenderingTarget2D(this.Av);null!==i&&(i.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Be(t)})),this.nn.Qv(i,this.Dv),this.tp(i),this.nn.Qv(i,this.Pv),this.ip(i))}this.Vv.applySuggestedBitmapSize();const n=t.tryCreateCanvasRenderingTarget2D(this.Vv);null!==n&&(n.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.np(n),this.nn.Qv(n,this.Rv))}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}gt(){var t;null===(t=this.Li)||void 0===t||t.Ea()}Bv(t){if(null===this.Li||this.Li.Fi()||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.yv().qt(),n=this.nn.Kv();this.gv=!0,i.y_(n,this.Li,t.localY)}Iv(t){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.yv().qt(),n=this.nn.Kv(),s=this.Li;i.C_(n,s,t.localY)}zv(){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const t=this.nn.yv().qt(),i=this.nn.Kv(),n=this.Li;this.gv&&(this.gv=!1,t.T_(i,n))}Ev(t){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.yv().qt(),n=this.nn.Kv();this.gv=!1,i.T_(n,this.Li)}Lv(t){this.cn.handleScale.axisDoubleClickReset.price&&this.ir()}Nv(t){if(null===this.Li)return;!this.nn.yv().qt().W().handleScale.axisPressedMouseMove.price||this.Li.ph()||this.Li.Co()||this.rp(1)}Fv(t){this.rp(0)}qv(){const t=[],i=null===this.Li?void 0:this.Li;return(n=>{for(let s=0;s{t.fillStyle=n.borderColor;const l=Math.max(1,Math.floor(h)),a=Math.floor(.5*h),o=Math.round(s.T*r);t.beginPath();for(const n of i)t.rect(Math.floor(e*r),Math.round(n.Aa*h)-a,o,l);t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{var r;t.font=this.Uv(),t.fillStyle=null!==(r=n.textColor)&&void 0!==r?r:this.mo.textColor,t.textAlign=this.Tv?"right":"left",t.textBaseline="middle";const h=this.Tv?Math.round(e-s.B):Math.round(e+s.T+s.B),l=i.map((i=>this.Mv.xi(t,i.Za)));for(let n=i.length;n--;){const s=i[n];t.fillText(s.Za,h,s.Aa+l[n])}}))}Gv(){if(null===this.wv||null===this.Li)return;let t=this.wv.height/2;const i=[],n=this.Li.No().slice(),s=this.nn.Kv(),e=this.Hv();this.Li===s.vr()&&this.nn.Kv().No().forEach((t=>{s.dr(t)&&n.push(t)}));const r=this.Li.Ta()[0],h=this.Li;n.forEach((n=>{const e=n.Rn(s,h);e.forEach((t=>{t.Vi(null),t.Bi()&&i.push(t)})),r===n&&e.length>0&&(t=e[0].yi())})),i.forEach((t=>t.Vi(t.yi())));this.Li.W().alignLabels&&this.hp(i,e,t)}hp(t,i,n){if(null===this.wv)return;const s=t.filter((t=>t.yi()<=n)),e=t.filter((t=>t.yi()>n));s.sort(((t,i)=>i.yi()-t.yi())),s.length&&e.length&&e.push(s[0]),e.sort(((t,i)=>t.yi()-i.yi()));for(const n of t){const t=Math.floor(n.zt(i)/2),s=n.yi();s>-t&&sthis.wv.height-t&&sl-r&&n.Vi(l-r)}for(let t=1;t{if(i.Ii()){i.xt(v(this.Li)).K(t,n,this.Mv,s)}}))}np(t){if(null===this.wv||null===this.Li)return;const i=this.nn.yv().qt(),n=[],s=this.nn.Kv(),e=i.Fc().Rn(s,this.Li);e.length&&n.push(e);const r=this.Hv(),h=this.Tv?"right":"left";n.forEach((i=>{i.forEach((i=>{i.xt(v(this.Li)).K(t,r,this.Mv,h)}))}))}rp(t){this.Ov.style.cursor=1===t?"ns-resize":"default"}ao(){const t=this.$v();this.xv{this.Sv||null===this.wp||this.Ui().Fh()},this.Cv=()=>{this.Sv||null===this.wp||this.Ui().Fh()},this.gp=i,this.wp=n,this.wp.I_().l(this.Mp.bind(this),this,!0),this.xp=document.createElement("td"),this.xp.style.padding="0",this.xp.style.position="relative";const s=document.createElement("div");s.style.width="100%",s.style.height="100%",s.style.position="relative",s.style.overflow="hidden",this.Sp=document.createElement("td"),this.Sp.style.padding="0",this.kp=document.createElement("td"),this.kp.style.padding="0",this.xp.appendChild(s),this.Av=rs(s,t.size({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.kv);const e=this.Av.canvasElement;e.style.position="absolute",e.style.zIndex="1",e.style.left="0",e.style.top="0",this.Vv=rs(s,t.size({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.Cv);const r=this.Vv.canvasElement;r.style.position="absolute",r.style.zIndex="2",r.style.left="0",r.style.top="0",this.yp=document.createElement("tr"),this.yp.appendChild(this.Sp),this.yp.appendChild(this.xp),this.yp.appendChild(this.kp),this.Cp(),this.Wv=new _s(this.Vv.canvasElement,this,{Nf:()=>null===this.vp&&!this.gp.W().handleScroll.vertTouchDrag,Ff:()=>null===this.vp&&!this.gp.W().handleScroll.horzTouchDrag})}S(){null!==this.lp&&this.lp.S(),null!==this.ap&&this.ap.S(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Vv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.kv),this.Av.dispose(),null!==this.wp&&this.wp.I_().p(this),this.Wv.S()}Kv(){return v(this.wp)}Tp(t){null!==this.wp&&this.wp.I_().p(this),this.wp=t,null!==this.wp&&this.wp.I_().l(ks.prototype.Mp.bind(this),this,!0),this.Cp()}yv(){return this.gp}jv(){return this.yp}Cp(){if(null!==this.wp&&(this.Pp(),0!==this.Ui().Mt().length)){if(null!==this.lp){const t=this.wp.S_();this.lp.Ji(v(t))}if(null!==this.ap){const t=this.wp.k_();this.ap.Ji(v(t))}}}Rp(){null!==this.lp&&this.lp.gt(),null!==this.ap&&this.ap.gt()}v_(){return null!==this.wp?this.wp.v_():0}p_(t){this.wp&&this.wp.p_(t)}Bf(t){if(!this.wp)return;this.Dp();const i=t.localX,n=t.localY;this.Op(i,n,t)}Qf(t){this.Dp(),this.Ap(),this.Op(t.localX,t.localY,t)}If(t){var i;if(!this.wp)return;this.Dp();const n=t.localX,s=t.localY;this.Op(n,s,t);const e=this.br(n,s);this.gp.Vp(null!==(i=null==e?void 0:e.bv)&&void 0!==i?i:null),this.Ui().Bc(e&&{Ic:e.Ic,pv:e.pv})}Xf(t){null!==this.wp&&(this.Dp(),this.Bp(t))}Tf(t){null!==this.wp&&this.Ip(this.cp,t)}Sf(t){this.Tf(t)}Hf(t){this.Dp(),this.zp(t),this.Op(t.localX,t.localY,t)}Yf(t){null!==this.wp&&(this.Dp(),this.fp=!1,this.Ep(t))}qf(t){null!==this.wp&&this.Bp(t)}_v(t){if(this.fp=!0,null===this.vp){const i={x:t.localX,y:t.localY};this.Lp(i,i,t)}}ov(t){null!==this.wp&&(this.Dp(),this.wp.qt().Bc(null),this.Np())}Fp(){return this.up}Wp(){return this.cp}sv(){this.dp=1,this.Ui().Un()}ev(t,i){if(!this.gp.W().handleScale.pinch)return;const n=5*(i-this.dp);this.dp=i,this.Ui().Uc(t.et,n)}Gf(t){this.fp=!1,this.pp=null!==this.vp,this.Ap();const i=this.Ui().Fc();null!==this.vp&&i.Tt()&&(this.mp={x:i.Kt(),y:i.Zt()},this.vp={x:t.localX,y:t.localY})}Wf(t){if(null===this.wp)return;const i=t.localX,n=t.localY;if(null===this.vp)this.zp(t);else{this.pp=!1;const s=v(this.mp),e=s.x+(i-this.vp.x),r=s.y+(n-this.vp.y);this.Op(e,r,t)}}Uf(t){0===this.yv().W().trackingMode.exitMode&&(this.pp=!0),this.jp(),this.Ep(t)}br(t,i){const n=this.wp;return null===n?null:function(t,i,n){const s=t.No(),e=function(t,i,n){var s,e;let r,h;for(const o of t){const t=null!==(e=null===(s=o.oa)||void 0===s?void 0:s.call(o,i,n))&&void 0!==e?e:[];for(const i of t)l=i.zOrder,(!(a=null==r?void 0:r.zOrder)||"top"===l&&"top"!==a||"normal"===l&&"bottom"===a)&&(r=i,h=o)}var l,a;return r&&h?{mv:r,Ic:h}:null}(s,i,n);if("top"===(null==e?void 0:e.mv.zOrder))return ps(e);for(const r of s){if(e&&e.Ic===r&&"bottom"!==e.mv.zOrder&&!e.mv.isBackground)return ps(e);const s=ms(r.Pn(t),i,n);if(null!==s)return{Ic:r,fv:s.fv,pv:s.pv};if(e&&e.Ic===r&&"bottom"!==e.mv.zOrder&&e.mv.isBackground)return ps(e)}return(null==e?void 0:e.mv)?ps(e):null}(n,t,i)}Hp(i,n){v("left"===n?this.lp:this.ap).Yv(t.size({width:i,height:this.wv.height}))}$p(){return this.wv}Yv(i){t.equalSizes(this.wv,i)||(this.wv=i,this.Sv=!0,this.Av.resizeCanvasElement(i),this.Vv.resizeCanvasElement(i),this.Sv=!1,this.xp.style.width=i.width+"px",this.xp.style.height=i.height+"px")}Up(){const t=v(this.wp);t.x_(t.S_()),t.x_(t.k_());for(const i of t.Ta())if(t.dr(i)){const n=i.At();null!==n&&t.x_(n),i.On()}}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Zv(i){if(0===i)return;if(null===this.wp)return;if(i>1&&this.Up(),null!==this.lp&&this.lp.Zv(i),null!==this.ap&&this.ap.Zv(i),1!==i){this.Av.applySuggestedBitmapSize();const i=t.tryCreateCanvasRenderingTarget2D(this.Av);null!==i&&(i.useBitmapCoordinateSpace((t=>{this.Jv(t)})),this.wp&&(this.qp(i,gs),this.Yp(i),this.Xp(i),this.qp(i,Ms),this.qp(i,xs)))}this.Vv.applySuggestedBitmapSize();const n=t.tryCreateCanvasRenderingTarget2D(this.Vv);null!==n&&(n.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.Kp(n),this.qp(n,Ss))}Zp(){return this.lp}Gp(){return this.ap}Qv(t,i){this.qp(t,i)}Mp(){null!==this.wp&&this.wp.I_().p(this),this.wp=null}Bp(t){this.Ip(this.up,t)}Ip(t,i){const n=i.localX,s=i.localY;t.M()&&t.m(this.Ui().yt().Vu(n),{x:n,y:s},i)}Jv({context:t,bitmapSize:i}){const{width:n,height:s}=i,e=this.Ui(),r=e.q(),h=e.od();r===h?X(t,0,0,n,s,h):J(t,0,0,n,s,r,h)}Yp(t){const i=v(this.wp).z_().Wh().xt();null!==i&&i.K(t,!1)}Xp(t){const i=this.Ui().Nc();this.Jp(t,Ms,hs,i),this.Jp(t,Ms,ls,i)}Kp(t){this.Jp(t,Ms,ls,this.Ui().Fc())}qp(t,i){const n=v(this.wp).No();for(const s of n)this.Jp(t,i,hs,s);for(const s of n)this.Jp(t,i,ls,s)}Jp(t,i,n,s){const e=v(this.wp),r=e.qt().Vc(),h=null!==r&&r.Ic===s,l=null!==r&&h&&void 0!==r.pv?r.pv.gr:void 0;as(i,(i=>n(i,t,h,l)),s,e)}Pp(){if(null===this.wp)return;const t=this.gp,i=this.wp.S_().W().visible,n=this.wp.k_().W().visible;i||null===this.lp||(this.Sp.removeChild(this.lp.jv()),this.lp.S(),this.lp=null),n||null===this.ap||(this.kp.removeChild(this.ap.jv()),this.ap.S(),this.ap=null);const s=t.qt().sd();i&&null===this.lp&&(this.lp=new ws(this,t.W(),s,"left"),this.Sp.appendChild(this.lp.jv())),n&&null===this.ap&&(this.ap=new ws(this,t.W(),s,"right"),this.kp.appendChild(this.ap.jv()))}Qp(t){return t.uv&&this.fp||null!==this.vp}tm(t){return Math.max(0,Math.min(t,this.wv.width-1))}im(t){return Math.max(0,Math.min(t,this.wv.height-1))}Op(t,i,n){this.Ui().Jc(this.tm(t),this.im(i),n,v(this.wp))}Np(){this.Ui().td()}jp(){this.pp&&(this.vp=null,this.Np())}Lp(t,i,n){this.vp=t,this.pp=!1,this.Op(i.x,i.y,n);const s=this.Ui().Fc();this.mp={x:s.Kt(),y:s.Zt()}}Ui(){return this.gp.qt()}Ep(t){if(!this._p)return;const i=this.Ui(),n=this.Kv();if(i.D_(n,n.vn()),this.op=null,this._p=!1,i.Kc(),null!==this.bp){const t=performance.now(),n=i.yt();this.bp.Dr(n.Eu(),t),this.bp.Yu(t)||i.Xn(this.bp)}}Dp(){this.vp=null}Ap(){if(!this.wp)return;if(this.Ui().Un(),document.activeElement!==document.body&&document.activeElement!==document.documentElement)v(document.activeElement).blur();else{const t=document.getSelection();null!==t&&t.removeAllRanges()}!this.wp.vn().Fi()&&this.Ui().yt().Fi()}zp(t){if(null===this.wp)return;const i=this.Ui(),n=i.yt();if(n.Fi())return;const s=this.gp.W(),e=s.handleScroll,r=s.kineticScroll;if((!e.pressedMouseMove||t.uv)&&(!e.horzTouchDrag&&!e.vertTouchDrag||!t.uv))return;const h=this.wp.vn(),l=performance.now();if(null!==this.op||this.Qp(t)||(this.op={x:t.clientX,y:t.clientY,kd:l,nm:t.localX,sm:t.localY}),null!==this.op&&!this._p&&(this.op.x!==t.clientX||this.op.y!==t.clientY)){if(t.uv&&r.touch||!t.uv&&r.mouse){const t=n.he();this.bp=new es(.2/t,7/t,.997,15/t),this.bp.Nd(n.Eu(),this.op.kd)}else this.bp=null;h.Fi()||i.P_(this.wp,h,t.localY),i.Yc(t.localX),this._p=!0}this._p&&(h.Fi()||i.R_(this.wp,h,t.localY),i.Xc(t.localX),null!==this.bp&&this.bp.Nd(n.Eu(),l))}}class ys{constructor(i,n,s,e,r){this.bt=!0,this.wv=t.size({width:0,height:0}),this.kv=()=>this.Zv(3),this.Tv="left"===i,this.kc=s.sd,this.cn=n,this.rm=e,this.hm=r,this.Ov=document.createElement("div"),this.Ov.style.width="25px",this.Ov.style.height="100%",this.Ov.style.overflow="hidden",this.Av=rs(this.Ov,t.size({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.kv)}S(){this.Av.unsubscribeSuggestedBitmapSizeChanged(this.kv),this.Av.dispose()}jv(){return this.Ov}$p(){return this.wv}Yv(i){t.equalSizes(this.wv,i)||(this.wv=i,this.Av.resizeCanvasElement(i),this.Ov.style.width=`${i.width}px`,this.Ov.style.height=`${i.height}px`,this.bt=!0)}Zv(i){if(i<3&&!this.bt)return;if(0===this.wv.width||0===this.wv.height)return;this.bt=!1,this.Av.applySuggestedBitmapSize();const n=t.tryCreateCanvasRenderingTarget2D(this.Av);null!==n&&n.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Be(t)}))}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Be({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(!this.rm())return;t.fillStyle=this.cn.timeScale.borderColor;const e=Math.floor(this.kc.W().C*n),r=Math.floor(this.kc.W().C*s),h=this.Tv?i.width-e:0;t.fillRect(h,0,e,r)}Jv({context:t,bitmapSize:i}){X(t,0,0,i.width,i.height,this.hm())}}function Cs(t){return i=>{var n,s;return null!==(s=null===(n=i.aa)||void 0===n?void 0:n.call(i,t))&&void 0!==s?s:[]}}const Ts=Cs("normal"),Ps=Cs("top"),Rs=Cs("bottom");class Ds{constructor(i,n){this.lm=null,this.am=null,this.k=null,this.om=!1,this.wv=t.size({width:0,height:0}),this._m=new C,this.Mv=new ti(5),this.Sv=!1,this.kv=()=>{this.Sv||this.gp.qt().Fh()},this.Cv=()=>{this.Sv||this.gp.qt().Fh()},this.gp=i,this.N_=n,this.cn=i.W().layout,this.um=document.createElement("tr"),this.dm=document.createElement("td"),this.dm.style.padding="0",this.fm=document.createElement("td"),this.fm.style.padding="0",this.Ov=document.createElement("td"),this.Ov.style.height="25px",this.Ov.style.padding="0",this.vm=document.createElement("div"),this.vm.style.width="100%",this.vm.style.height="100%",this.vm.style.position="relative",this.vm.style.overflow="hidden",this.Ov.appendChild(this.vm),this.Av=rs(this.vm,t.size({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.kv);const s=this.Av.canvasElement;s.style.position="absolute",s.style.zIndex="1",s.style.left="0",s.style.top="0",this.Vv=rs(this.vm,t.size({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.Cv);const e=this.Vv.canvasElement;e.style.position="absolute",e.style.zIndex="2",e.style.left="0",e.style.top="0",this.um.appendChild(this.dm),this.um.appendChild(this.Ov),this.um.appendChild(this.fm),this.pm(),this.gp.qt().f_().l(this.pm.bind(this),this),this.Wv=new _s(this.Vv.canvasElement,this,{Nf:()=>!0,Ff:()=>!this.gp.W().handleScroll.horzTouchDrag})}S(){this.Wv.S(),null!==this.lm&&this.lm.S(),null!==this.am&&this.am.S(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Vv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.kv),this.Av.dispose()}jv(){return this.um}bm(){return this.lm}wm(){return this.am}Qf(t){if(this.om)return;this.om=!0;const i=this.gp.qt();!i.yt().Fi()&&this.gp.W().handleScale.axisPressedMouseMove.time&&i.$c(t.localX)}Gf(t){this.Qf(t)}tv(){const t=this.gp.qt();!t.yt().Fi()&&this.om&&(this.om=!1,this.gp.W().handleScale.axisPressedMouseMove.time&&t.Gc())}Hf(t){const i=this.gp.qt();!i.yt().Fi()&&this.gp.W().handleScale.axisPressedMouseMove.time&&i.Zc(t.localX)}Wf(t){this.Hf(t)}Yf(){this.om=!1;const t=this.gp.qt();t.yt().Fi()&&!this.gp.W().handleScale.axisPressedMouseMove.time||t.Gc()}Uf(){this.Yf()}Tf(){this.gp.W().handleScale.axisDoubleClickReset.time&&this.gp.qt().Zn()}Sf(){this.Tf()}Bf(){this.gp.qt().W().handleScale.axisPressedMouseMove.time&&this.rp(1)}ov(){this.rp(0)}$p(){return this.wv}gm(){return this._m}Mm(i,n,s){t.equalSizes(this.wv,i)||(this.wv=i,this.Sv=!0,this.Av.resizeCanvasElement(i),this.Vv.resizeCanvasElement(i),this.Sv=!1,this.Ov.style.width=`${i.width}px`,this.Ov.style.height=`${i.height}px`,this._m.m(i)),null!==this.lm&&this.lm.Yv(t.size({width:n,height:i.height})),null!==this.am&&this.am.Yv(t.size({width:s,height:i.height}))}xm(){const t=this.Sm();return Math.ceil(t.C+t.T+t.P+t.L+t.V+t.km)}gt(){this.gp.qt().yt().Ea()}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Zv(i){if(0===i)return;if(1!==i){this.Av.applySuggestedBitmapSize();const n=t.tryCreateCanvasRenderingTarget2D(this.Av);null!==n&&(n.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Be(t),this.ym(n,Rs)})),this.tp(n),this.ym(n,Ts)),null!==this.lm&&this.lm.Zv(i),null!==this.am&&this.am.Zv(i)}this.Vv.applySuggestedBitmapSize();const n=t.tryCreateCanvasRenderingTarget2D(this.Vv);null!==n&&(n.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.Cm([...this.gp.qt().Mt(),this.gp.qt().Fc()],n),this.ym(n,Ps))}ym(t,i){const n=this.gp.qt().Mt();for(const s of n)as(i,(i=>hs(i,t,!1,void 0)),s,void 0);for(const s of n)as(i,(i=>ls(i,t,!1,void 0)),s,void 0)}Jv({context:t,bitmapSize:i}){X(t,0,0,i.width,i.height,this.gp.qt().od())}Be({context:t,bitmapSize:i,verticalPixelRatio:n}){if(this.gp.W().timeScale.borderVisible){t.fillStyle=this.Tm();const s=Math.max(1,Math.floor(this.Sm().C*n));t.fillRect(0,0,i.width,s)}}tp(t){const i=this.gp.qt().yt(),n=i.Ea();if(!n||0===n.length)return;const s=this.N_.maxTickMarkWeight(n),e=this.Sm(),r=i.W();r.borderVisible&&r.ticksVisible&&t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:i,verticalPixelRatio:s})=>{t.strokeStyle=this.Tm(),t.fillStyle=this.Tm();const r=Math.max(1,Math.floor(i)),h=Math.floor(.5*i);t.beginPath();const l=Math.round(e.T*s);for(let s=n.length;s--;){const e=Math.round(n[s].coord*i);t.rect(e-h,0,r,l)}t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{const i=e.C+e.T+e.L+e.P/2;t.textAlign="center",t.textBaseline="middle",t.fillStyle=this.$(),t.font=this.Uv();for(const e of n)if(e.weight=s){const n=e.needAlignCoordinate?this.Pm(t,e.coord,e.label):e.coord;t.fillText(e.label,n,i)}}))}Pm(t,i,n){const s=this.Mv.Si(t,n),e=s/2,r=Math.floor(i-e)+.5;return r<0?i+=Math.abs(0-r):r+s>this.wv.width&&(i-=Math.abs(this.wv.width-(r+s))),i}Cm(t,i){const n=this.Sm();for(const s of t)for(const t of s.tn())t.xt().K(i,n)}Tm(){return this.gp.W().timeScale.borderColor}$(){return this.cn.textColor}j(){return this.cn.fontSize}Uv(){return z(this.j(),this.cn.fontFamily)}Rm(){return z(this.j(),this.cn.fontFamily,"bold")}Sm(){null===this.k&&(this.k={C:1,N:NaN,L:NaN,V:NaN,Hi:NaN,T:5,P:NaN,R:"",ji:new ti,km:0});const t=this.k,i=this.Uv();if(t.R!==i){const n=this.j();t.P=n,t.R=i,t.L=3*n/12,t.V=3*n/12,t.Hi=9*n/12,t.N=0,t.km=4*n/12,t.ji.ir()}return this.k}rp(t){this.Ov.style.cursor=1===t?"ew-resize":"default"}pm(){const t=this.gp.qt(),i=t.W();i.leftPriceScale.visible||null===this.lm||(this.dm.removeChild(this.lm.jv()),this.lm.S(),this.lm=null),i.rightPriceScale.visible||null===this.am||(this.fm.removeChild(this.am.jv()),this.am.S(),this.am=null);const n={sd:this.gp.qt().sd()},s=()=>i.leftPriceScale.borderVisible&&t.yt().W().borderVisible,e=()=>t.od();i.leftPriceScale.visible&&null===this.lm&&(this.lm=new ys("left",i,n,s,e),this.dm.appendChild(this.lm.jv())),i.rightPriceScale.visible&&null===this.am&&(this.am=new ys("right",i,n,s,e),this.fm.appendChild(this.am.jv()))}}const Os=!!Jn&&!!navigator.userAgentData&&navigator.userAgentData.brands.some((t=>t.brand.includes("Chromium")))&&!!Jn&&((null===(As=null===navigator||void 0===navigator?void 0:navigator.userAgentData)||void 0===As?void 0:As.platform)?"Windows"===navigator.userAgentData.platform:navigator.userAgent.toLowerCase().indexOf("win")>=0);var As;class Vs{constructor(t,i,n){var s;this.Dm=[],this.Om=0,this.Qa=0,this.e_=0,this.Am=0,this.Vm=0,this.Bm=null,this.Im=!1,this.up=new C,this.cp=new C,this.Mc=new C,this.zm=null,this.Em=null,this.Lm=t,this.cn=i,this.N_=n,this.um=document.createElement("div"),this.um.classList.add("tv-lightweight-charts"),this.um.style.overflow="hidden",this.um.style.direction="ltr",this.um.style.width="100%",this.um.style.height="100%",(s=this.um).style.userSelect="none",s.style.webkitUserSelect="none",s.style.msUserSelect="none",s.style.MozUserSelect="none",s.style.webkitTapHighlightColor="transparent",this.Nm=document.createElement("table"),this.Nm.setAttribute("cellspacing","0"),this.um.appendChild(this.Nm),this.Fm=this.Wm.bind(this),Bs(this.cn)&&this.jm(!0),this.Ui=new Vn(this.Sc.bind(this),this.cn,n),this.qt().Wc().l(this.Hm.bind(this),this),this.$m=new Ds(this,this.N_),this.Nm.appendChild(this.$m.jv());const e=i.autoSize&&this.Um();let r=this.cn.width,h=this.cn.height;if(e||0===r||0===h){const i=t.getBoundingClientRect();r=r||i.width,h=h||i.height}this.qm(r,h),this.Ym(),t.appendChild(this.um),this.Xm(),this.Ui.yt().Gu().l(this.Ui.$l.bind(this.Ui),this),this.Ui.f_().l(this.Ui.$l.bind(this.Ui),this)}qt(){return this.Ui}W(){return this.cn}Km(){return this.Dm}Zm(){return this.$m}S(){this.jm(!1),0!==this.Om&&window.cancelAnimationFrame(this.Om),this.Ui.Wc().p(this),this.Ui.yt().Gu().p(this),this.Ui.f_().p(this),this.Ui.S();for(const t of this.Dm)this.Nm.removeChild(t.jv()),t.Fp().p(this),t.Wp().p(this),t.S();this.Dm=[],v(this.$m).S(),null!==this.um.parentElement&&this.um.parentElement.removeChild(this.um),this.Mc.S(),this.up.S(),this.cp.S(),this.Gm()}qm(i,n,s=!1){if(this.Qa===n&&this.e_===i)return;const e=function(i){const n=Math.floor(i.width),s=Math.floor(i.height),e=n-n%2,r=s-s%2;return t.size({width:e,height:r})}(t.size({width:i,height:n}));this.Qa=e.height,this.e_=e.width;const r=this.Qa+"px",h=this.e_+"px";v(this.um).style.height=r,v(this.um).style.width=h,this.Nm.style.height=r,this.Nm.style.width=h,s?this.Jm(ot.es(),performance.now()):this.Ui.$l()}Zv(t){void 0===t&&(t=ot.es());for(let i=0;i{let s=0;for(let e=0;e{v("left"===t?this.$m.bm():this.$m.wm()).ep(v(i),n,s)};if(this.cn.timeScale.visible){const t=this.$m.sp();if(null!==i){let n=0;this.sb()&&(h("left",n,s),n=v(e.Zp()).sp().width),this.$m.ep(i,n,s),n+=t.width,this.eb()&&h("right",n,s)}s+=t.height}return t.size({width:n,height:s})}ob(){let i=0,n=0,s=0;for(const t of this.Dm)this.sb()&&(n=Math.max(n,v(t.Zp()).$v(),this.cn.leftPriceScale.minimumWidth)),this.eb()&&(s=Math.max(s,v(t.Gp()).$v(),this.cn.rightPriceScale.minimumWidth)),i+=t.v_();n=is(n),s=is(s);const e=this.e_,r=this.Qa,h=Math.max(e-n-s,0),l=this.cn.timeScale.visible;let a=l?Math.max(this.$m.xm(),this.cn.timeScale.minimumHeight):0;var o;a=(o=a)+o%2;const _=0+a,u=r<_?0:r-_,c=u/i;let d=0;for(let i=0;i{t.Rp()})),3===(null===(n=this.Bm)||void 0===n?void 0:n.jn())&&(this.Bm.ts(t),this.ub(),this.cb(this.Bm),this.fb(this.Bm,i),t=this.Bm,this.Bm=null)),this.Zv(t)}fb(t,i){for(const n of t.Qn())this.ns(n,i)}cb(t){const i=this.Ui.Lc();for(let n=0;n{if(this.Im=!1,this.Om=0,null!==this.Bm){const i=this.Bm;this.Bm=null,this.Jm(i,t);for(const n of i.Qn())if(5===n.qn&&!n.Vt.Yu(t)){this.qt().Xn(n.Vt);break}}})))}ub(){this.Ym()}Ym(){const t=this.Ui.Lc(),i=t.length,n=this.Dm.length;for(let t=i;t{const n=i.In().nl(t);null!==n&&e.set(i,n)}))}let r;if(null!==t){const i=null===(s=this.Ui.yt().qi(t))||void 0===s?void 0:s.originalTime;void 0!==i&&(r=i)}const h=this.qt().Vc(),l=null!==h&&h.Ic instanceof Xi?h.Ic:void 0,a=null!==h&&void 0!==h.pv?h.pv.wr:void 0;return{bb:r,se:null!=t?t:void 0,wb:null!=i?i:void 0,gb:l,Mb:e,xb:a,Sb:null!=n?n:void 0}}vb(t,i,n){this.up.m((()=>this.mb(t,i,n)))}pb(t,i,n){this.cp.m((()=>this.mb(t,i,n)))}Hm(t,i,n){this.Mc.m((()=>this.mb(t,i,n)))}Xm(){const t=this.cn.timeScale.visible?"":"none";this.$m.jv().style.display=t}sb(){return this.Dm[0].Kv().S_().W().visible}eb(){return this.Dm[0].Kv().k_().W().visible}Um(){return"ResizeObserver"in window&&(this.zm=new ResizeObserver((t=>{const i=t.find((t=>t.target===this.Lm));i&&this.qm(i.contentRect.width,i.contentRect.height)})),this.zm.observe(this.Lm,{box:"border-box"}),!0)}Gm(){null!==this.zm&&this.zm.disconnect(),this.zm=null}}function Bs(t){return Boolean(t.handleScroll.mouseWheel||t.handleScale.mouseWheel)}function Is(t,i){var n={};for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&i.indexOf(s)<0&&(n[s]=t[s]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var e=0;for(s=Object.getOwnPropertySymbols(t);efunction(t,i){return i?i(t):void 0===(n=t).open&&void 0===n.value;var n}(s,h)?Hs({ut:i,se:n,bb:e},s):Hs(t(i,n,s,e,r),s)}function Us(t){return{Candlestick:$s(Fs),Bar:$s(Ns),Area:$s(Es),Baseline:$s(Ls),Histogram:$s(zs),Line:$s(zs),Custom:$s(Ws)}[t]}function qs(t){return{se:0,yb:new Map,ia:t}}function Ys(t,i){if(void 0!==t&&0!==t.length)return{Cb:i.key(t[0].ut),Tb:i.key(t[t.length-1].ut)}}function Xs(t){let i;return t.forEach((t=>{void 0===i&&(i=t.bb)})),f(i)}class Ks{constructor(t){this.Pb=new Map,this.Rb=new Map,this.Db=new Map,this.Ob=[],this.N_=t}S(){this.Pb.clear(),this.Rb.clear(),this.Db.clear(),this.Ob=[]}Ab(t,i){let n=0!==this.Pb.size,s=!1;const e=this.Rb.get(t);if(void 0!==e)if(1===this.Rb.size)n=!1,s=!0,this.Pb.clear();else for(const i of this.Ob)i.pointData.yb.delete(t)&&(s=!0);let r=[];if(0!==i.length){const n=i.map((t=>t.time)),e=this.N_.createConverterToInternalObj(i),h=Us(t.Xh()),l=t.ga(),a=t.Ma();r=i.map(((i,r)=>{const o=e(i.time),_=this.N_.key(o);let u=this.Pb.get(_);void 0===u&&(u=qs(o),this.Pb.set(_,u),s=!0);const c=h(o,u.se,i,n[r],l,a);return u.yb.set(t,c),c}))}n&&this.Vb(),this.Bb(t,r);let h=-1;if(s){const t=[];this.Pb.forEach((i=>{t.push({timeWeight:0,time:i.ia,pointData:i,originalTime:Xs(i.yb)})})),t.sort(((t,i)=>this.N_.key(t.time)-this.N_.key(i.time))),h=this.Ib(t)}return this.zb(t,h,function(t,i,n){const s=Ys(t,n),e=Ys(i,n);if(void 0!==s&&void 0!==e)return{Xl:s.Tb>=e.Tb&&s.Cb>=e.Cb}}(this.Rb.get(t),e,this.N_))}hd(t){return this.Ab(t,[])}Eb(t,i){const n=i;!function(t){void 0===t.bb&&(t.bb=t.time)}(n),this.N_.preprocessData(i);const s=this.N_.createConverterToInternalObj([i])(i.time),e=this.Db.get(t);if(void 0!==e&&this.N_.key(s)this.N_.key(t.time)this.N_.key(s.ut)?js(i)&&n.push(i):js(i)?n[n.length-1]=i:n.splice(-1,1),this.Db.set(t,i.ut)}Bb(t,i){0!==i.length?(this.Rb.set(t,i.filter(js)),this.Db.set(t,i[i.length-1].ut)):(this.Rb.delete(t),this.Db.delete(t))}Vb(){for(const t of this.Ob)0===t.pointData.yb.size&&this.Pb.delete(this.N_.key(t.time))}Ib(t){let i=-1;for(let n=0;n{0!==i.length&&(t=Math.max(t,i[i.length-1].se))})),t}zb(t,i,n){const s={Fb:new Map,yt:{Au:this.Nb()}};if(-1!==i)this.Rb.forEach(((i,e)=>{s.Fb.set(e,{He:i,Wb:e===t?n:void 0})})),this.Rb.has(t)||s.Fb.set(t,{He:[],Wb:n}),s.yt.jb=this.Ob,s.yt.Hb=i;else{const i=this.Rb.get(t);s.Fb.set(t,{He:i||[],Wb:n})}return s}}function Zs(t,i){t.se=i,t.yb.forEach((t=>{t.se=i}))}function Gs(t){const i={value:t.Vt[3],time:t.bb};return void 0!==t.kb&&(i.customValues=t.kb),i}function Js(t){const i=Gs(t);return void 0!==t.O&&(i.color=t.O),i}function Qs(t){const i=Gs(t);return void 0!==t._t&&(i.lineColor=t._t),void 0!==t.Ts&&(i.topColor=t.Ts),void 0!==t.Ps&&(i.bottomColor=t.Ps),i}function te(t){const i=Gs(t);return void 0!==t.Pe&&(i.topLineColor=t.Pe),void 0!==t.Re&&(i.bottomLineColor=t.Re),void 0!==t.Se&&(i.topFillColor1=t.Se),void 0!==t.ke&&(i.topFillColor2=t.ke),void 0!==t.ye&&(i.bottomFillColor1=t.ye),void 0!==t.Ce&&(i.bottomFillColor2=t.Ce),i}function ie(t){const i={open:t.Vt[0],high:t.Vt[1],low:t.Vt[2],close:t.Vt[3],time:t.bb};return void 0!==t.kb&&(i.customValues=t.kb),i}function ne(t){const i=ie(t);return void 0!==t.O&&(i.color=t.O),i}function se(t){const i=ie(t),{O:n,Bt:s,$h:e}=t;return void 0!==n&&(i.color=n),void 0!==s&&(i.borderColor=s),void 0!==e&&(i.wickColor=e),i}function ee(t){return{Area:Qs,Line:Js,Baseline:te,Histogram:Js,Bar:ne,Candlestick:se,Custom:re}[t]}function re(t){const i=t.bb;return Object.assign(Object.assign({},t.He),{time:i})}const he={vertLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},horzLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},mode:1},le={vertLines:{color:"#D6DCDE",style:0,visible:!0},horzLines:{color:"#D6DCDE",style:0,visible:!0}},ae={background:{type:"solid",color:"#FFFFFF"},textColor:"#191919",fontSize:12,fontFamily:I},oe={autoScale:!0,mode:0,invertScale:!1,alignLabels:!0,borderVisible:!0,borderColor:"#2B2B43",entireTextOnly:!1,visible:!1,ticksVisible:!1,scaleMargins:{bottom:.1,top:.2},minimumWidth:0},_e={rightOffset:0,barSpacing:6,minBarSpacing:.5,fixLeftEdge:!1,fixRightEdge:!1,lockVisibleTimeRangeOnResize:!1,rightBarStaysOnScroll:!1,borderVisible:!0,borderColor:"#2B2B43",visible:!0,timeVisible:!1,secondsVisible:!0,shiftVisibleRangeOnNewBar:!0,allowShiftVisibleRangeOnWhitespaceReplacement:!1,ticksVisible:!1,uniformDistribution:!1,minimumHeight:0},ue={color:"rgba(0, 0, 0, 0)",visible:!1,fontSize:48,fontFamily:I,fontStyle:"",text:"",horzAlign:"center",vertAlign:"center"};function ce(){return{width:0,height:0,autoSize:!1,layout:ae,crosshair:he,grid:le,overlayPriceScales:Object.assign({},oe),leftPriceScale:Object.assign(Object.assign({},oe),{visible:!1}),rightPriceScale:Object.assign(Object.assign({},oe),{visible:!0}),timeScale:_e,watermark:ue,localization:{locale:Jn?navigator.language:"",dateFormat:"dd MMM 'yy"},handleScroll:{mouseWheel:!0,pressedMouseMove:!0,horzTouchDrag:!0,vertTouchDrag:!0},handleScale:{axisPressedMouseMove:{time:!0,price:!0},axisDoubleClickReset:{time:!0,price:!0},mouseWheel:!0,pinch:!0},kineticScroll:{mouse:!1,touch:!0},trackingMode:{exitMode:1}}}class de{constructor(t,i){this.$b=t,this.Ub=i}applyOptions(t){this.$b.qt().zc(this.Ub,t)}options(){return this.Li().W()}width(){return at(this.Ub)?this.$b.nb(this.Ub):0}Li(){return v(this.$b.qt().Ec(this.Ub)).At}}function fe(t,i,n){const s=Is(t,["time","originalTime"]),e=Object.assign({time:i},s);return void 0!==n&&(e.originalTime=n),e}const ve={color:"#FF0000",price:0,lineStyle:2,lineWidth:1,lineVisible:!0,axisLabelVisible:!0,title:"",axisLabelColor:"",axisLabelTextColor:""};class pe{constructor(t){this.Bh=t}applyOptions(t){this.Bh.Nh(t)}options(){return this.Bh.W()}qb(){return this.Bh}}class me{constructor(t,i,n,s,e){this.Yb=new C,this.Es=t,this.Xb=i,this.Kb=n,this.N_=e,this.Zb=s}S(){this.Yb.S()}priceFormatter(){return this.Es.ca()}priceToCoordinate(t){const i=this.Es.Pt();return null===i?null:this.Es.At().Ot(t,i.Vt)}coordinateToPrice(t){const i=this.Es.Pt();return null===i?null:this.Es.At().pn(t,i.Vt)}barsInLogicalRange(t){if(null===t)return null;const i=new xn(new wn(t.from,t.to)).iu(),n=this.Es.In();if(n.Fi())return null;const s=n.nl(i.Os(),1),e=n.nl(i.di(),-1),r=v(n.Qh()),h=v(n.Bn());if(null!==s&&null!==e&&s.se>e.se)return{barsBefore:t.from-r,barsAfter:h-t.to};const l={barsBefore:null===s||s.se===r?t.from-r:s.se-r,barsAfter:null===e||e.se===h?h-t.to:h-e.se};return null!==s&&null!==e&&(l.from=s.bb,l.to=e.bb),l}setData(t){this.N_,this.Es.Xh(),this.Xb.Gb(this.Es,t),this.Jb("full")}update(t){this.Es.Xh(),this.Xb.Qb(this.Es,t),this.Jb("update")}dataByIndex(t,i){const n=this.Es.In().nl(t,i);if(null===n)return null;return ee(this.seriesType())(n)}data(){const t=ee(this.seriesType());return this.Es.In().ie().map((i=>t(i)))}subscribeDataChanged(t){this.Yb.l(t)}unsubscribeDataChanged(t){this.Yb.v(t)}setMarkers(t){this.N_;const i=t.map((t=>fe(t,this.N_.convertHorzItemToInternal(t.time),t.time)));this.Es.Zl(i)}markers(){return this.Es.Gl().map((t=>fe(t,t.originalTime,void 0)))}applyOptions(t){this.Es.Nh(t)}options(){return A(this.Es.W())}priceScale(){return this.Kb.priceScale(this.Es.At().xa())}createPriceLine(t){const i=T(A(ve),t),n=this.Es.Jl(i);return new pe(n)}removePriceLine(t){this.Es.Ql(t.qb())}seriesType(){return this.Es.Xh()}attachPrimitive(t){this.Es.ba(t),t.attached&&t.attached({chart:this.Zb,series:this,requestUpdate:()=>this.Es.qt().$l()})}detachPrimitive(t){this.Es.wa(t),t.detached&&t.detached()}Jb(t){this.Yb.M()&&this.Yb.m(t)}}class be{constructor(t,i,n){this.tw=new C,this.uu=new C,this._m=new C,this.Ui=t,this.wl=t.yt(),this.$m=i,this.wl.Ku().l(this.iw.bind(this)),this.wl.Zu().l(this.nw.bind(this)),this.$m.gm().l(this.sw.bind(this)),this.N_=n}S(){this.wl.Ku().p(this),this.wl.Zu().p(this),this.$m.gm().p(this),this.tw.S(),this.uu.S(),this._m.S()}scrollPosition(){return this.wl.Eu()}scrollToPosition(t,i){i?this.wl.qu(t,1e3):this.Ui.Jn(t)}scrollToRealTime(){this.wl.Uu()}getVisibleRange(){const t=this.wl.yu();return null===t?null:{from:t.from.originalTime,to:t.to.originalTime}}setVisibleRange(t){const i={from:this.N_.convertHorzItemToInternal(t.from),to:this.N_.convertHorzItemToInternal(t.to)},n=this.wl.Ru(i);this.Ui.ld(n)}getVisibleLogicalRange(){const t=this.wl.ku();return null===t?null:{from:t.Os(),to:t.di()}}setVisibleLogicalRange(t){d(t.from<=t.to,"The from index cannot be after the to index."),this.Ui.ld(t)}resetTimeScale(){this.Ui.Zn()}fitContent(){this.Ui.Qu()}logicalToCoordinate(t){const i=this.Ui.yt();return i.Fi()?null:i.Et(t)}coordinateToLogical(t){return this.wl.Fi()?null:this.wl.Vu(t)}timeToCoordinate(t){const i=this.N_.convertHorzItemToInternal(t),n=this.wl.ya(i,!1);return null===n?null:this.wl.Et(n)}coordinateToTime(t){const i=this.Ui.yt(),n=i.Vu(t),s=i.qi(n);return null===s?null:s.originalTime}width(){return this.$m.$p().width}height(){return this.$m.$p().height}subscribeVisibleTimeRangeChange(t){this.tw.l(t)}unsubscribeVisibleTimeRangeChange(t){this.tw.v(t)}subscribeVisibleLogicalRangeChange(t){this.uu.l(t)}unsubscribeVisibleLogicalRangeChange(t){this.uu.v(t)}subscribeSizeChange(t){this._m.l(t)}unsubscribeSizeChange(t){this._m.v(t)}applyOptions(t){this.wl.Nh(t)}options(){return Object.assign(Object.assign({},A(this.wl.W())),{barSpacing:this.wl.he()})}iw(){this.tw.M()&&this.tw.m(this.getVisibleRange())}nw(){this.uu.M()&&this.uu.m(this.getVisibleLogicalRange())}sw(t){this._m.m(t.width,t.height)}}function we(t){if(void 0===t||"custom"===t.type)return;const i=t;void 0!==i.minMove&&void 0===i.precision&&(i.precision=function(t){if(t>=1)return 0;let i=0;for(;i<8;i++){const n=Math.round(t);if(Math.abs(n-t)<1e-8)return i;t*=10}return i}(i.minMove))}function ge(t){return function(t){if(O(t.handleScale)){const i=t.handleScale;t.handleScale={axisDoubleClickReset:{time:i,price:i},axisPressedMouseMove:{time:i,price:i},mouseWheel:i,pinch:i}}else if(void 0!==t.handleScale){const{axisPressedMouseMove:i,axisDoubleClickReset:n}=t.handleScale;O(i)&&(t.handleScale.axisPressedMouseMove={time:i,price:i}),O(n)&&(t.handleScale.axisDoubleClickReset={time:n,price:n})}const i=t.handleScroll;O(i)&&(t.handleScroll={horzTouchDrag:i,vertTouchDrag:i,mouseWheel:i,pressedMouseMove:i})}(t),t}class Me{constructor(t,i,n){this.ew=new Map,this.rw=new Map,this.hw=new C,this.lw=new C,this.aw=new C,this.ow=new Ks(i);const s=void 0===n?A(ce()):T(A(ce()),ge(n));this.N_=i,this.$b=new Vs(t,s,i),this.$b.Fp().l((t=>{this.hw.M()&&this.hw.m(this._w(t()))}),this),this.$b.Wp().l((t=>{this.lw.M()&&this.lw.m(this._w(t()))}),this),this.$b.Wc().l((t=>{this.aw.M()&&this.aw.m(this._w(t()))}),this);const e=this.$b.qt();this.uw=new be(e,this.$b.Zm(),this.N_)}remove(){this.$b.Fp().p(this),this.$b.Wp().p(this),this.$b.Wc().p(this),this.uw.S(),this.$b.S(),this.ew.clear(),this.rw.clear(),this.hw.S(),this.lw.S(),this.aw.S(),this.ow.S()}resize(t,i,n){this.autoSizeActive()||this.$b.qm(t,i,n)}addCustomSeries(t,i){const n=p(t),s=Object.assign(Object.assign({},l),n.defaultOptions());return this.cw("Custom",s,i,n)}addAreaSeries(t){return this.cw("Area",e,t)}addBaselineSeries(t){return this.cw("Baseline",r,t)}addBarSeries(t){return this.cw("Bar",n,t)}addCandlestickSeries(t={}){return function(t){void 0!==t.borderColor&&(t.borderUpColor=t.borderColor,t.borderDownColor=t.borderColor),void 0!==t.wickColor&&(t.wickUpColor=t.wickColor,t.wickDownColor=t.wickColor)}(t),this.cw("Candlestick",i,t)}addHistogramSeries(t){return this.cw("Histogram",h,t)}addLineSeries(t){return this.cw("Line",s,t)}removeSeries(t){const i=f(this.ew.get(t)),n=this.ow.hd(i);this.$b.qt().hd(i),this.dw(n),this.ew.delete(t),this.rw.delete(i)}Gb(t,i){this.dw(this.ow.Ab(t,i))}Qb(t,i){this.dw(this.ow.Eb(t,i))}subscribeClick(t){this.hw.l(t)}unsubscribeClick(t){this.hw.v(t)}subscribeCrosshairMove(t){this.aw.l(t)}unsubscribeCrosshairMove(t){this.aw.v(t)}subscribeDblClick(t){this.lw.l(t)}unsubscribeDblClick(t){this.lw.v(t)}priceScale(t){return new de(this.$b,t)}timeScale(){return this.uw}applyOptions(t){this.$b.Nh(ge(t))}options(){return this.$b.W()}takeScreenshot(){return this.$b.tb()}autoSizeActive(){return this.$b.rb()}chartElement(){return this.$b.hb()}paneSize(){const t=this.$b.ab();return{height:t.height,width:t.width}}setCrosshairPosition(t,i,n){const s=this.ew.get(n);if(void 0===s)return;const e=this.$b.qt().cr(s);null!==e&&this.$b.qt().Qc(t,i,e)}clearCrosshairPosition(){this.$b.qt().td(!0)}cw(t,i,n={},s){we(n.priceFormat);const e=T(A(a),A(i),n),r=this.$b.qt().ed(t,e,s),h=new me(r,this,this,this,this.N_);return this.ew.set(h,r),this.rw.set(r,h),h}dw(t){const i=this.$b.qt();i.nd(t.yt.Au,t.yt.jb,t.yt.Hb),t.Fb.forEach(((t,i)=>i.it(t.He,t.Wb))),i.Iu()}fw(t){return f(this.rw.get(t))}_w(t){const i=new Map;t.Mb.forEach(((t,n)=>{const s=n.Xh(),e=ee(s)(t);if("Custom"!==s)d(function(t){return void 0!==t.open||void 0!==t.value}(e));else{const t=n.Ma();d(!t||!1===t(e))}i.set(this.fw(n),e)}));const n=void 0===t.gb?void 0:this.fw(t.gb);return{time:t.bb,logical:t.se,point:t.wb,hoveredSeries:n,hoveredObjectId:t.xb,seriesData:i,sourceEvent:t.Sb}}}function xe(t,i,n){let s;if(D(t)){const i=document.getElementById(t);d(null!==i,`Cannot find element in DOM with id=${t}`),s=i}else s=t;const e=new Me(s,i,n);return i.setOptions(e.options()),e}const Se=Object.assign(Object.assign({},a),l);exports.createChart=function(t,i){return xe(t,new Gn,Gn.Td(i))},exports.createChartEx=xe,exports.customSeriesDefaultOptions=Se,exports.isBusinessDay=Bn,exports.isUTCTimestamp=In,exports.version=function(){return"4.2.0-dev+202405092055"}; -diff --git a/dist/lightweight-charts.production.mjs b/dist/lightweight-charts.production.mjs -index 53704c442c01ea4d0842f0def3fd2c266b2f2bbc..b00e329e9d933adc97b882a1d6436b7121d7c5a6 100644 ---- a/dist/lightweight-charts.production.mjs -+++ b/dist/lightweight-charts.production.mjs -@@ -1,7 +1,7 @@ - /*! - * @license -- * TradingView Lightweight Charts™ v4.1.1 -- * Copyright (c) 2023 TradingView, Inc. -+ * TradingView Lightweight Charts™ v4.2.0-dev+202405092055 -+ * Copyright (c) 2024 TradingView, Inc. - * Licensed under Apache License 2.0 https://www.apache.org/licenses/LICENSE-2.0 - */ --import{size as t,bindCanvasElementBitmapSizeTo as i,equalSizes as n,tryCreateCanvasRenderingTarget2D as s}from"fancy-canvas";const e={upColor:"#26a69a",downColor:"#ef5350",wickVisible:!0,borderVisible:!0,borderColor:"#378658",borderUpColor:"#26a69a",borderDownColor:"#ef5350",wickColor:"#737375",wickUpColor:"#26a69a",wickDownColor:"#ef5350"},r={upColor:"#26a69a",downColor:"#ef5350",openVisible:!0,thinBars:!0},h={color:"#2196f3",lineStyle:0,lineWidth:3,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},l={topColor:"rgba( 46, 220, 135, 0.4)",bottomColor:"rgba( 40, 221, 100, 0)",invertFilledArea:!1,lineColor:"#33D778",lineStyle:0,lineWidth:3,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},a={baseValue:{type:"price",price:0},topFillColor1:"rgba(38, 166, 154, 0.28)",topFillColor2:"rgba(38, 166, 154, 0.05)",topLineColor:"rgba(38, 166, 154, 1)",bottomFillColor1:"rgba(239, 83, 80, 0.05)",bottomFillColor2:"rgba(239, 83, 80, 0.28)",bottomLineColor:"rgba(239, 83, 80, 1)",lineWidth:3,lineStyle:0,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},o={color:"#26a69a",base:0},_={color:"#2196f3"},u={title:"",visible:!0,lastValueVisible:!0,priceLineVisible:!0,priceLineSource:0,priceLineWidth:1,priceLineColor:"",priceLineStyle:2,baseLineVisible:!0,baseLineWidth:1,baseLineColor:"#B2B5BE",baseLineStyle:0,priceFormat:{type:"price",precision:2,minMove:.01}};var c,d;function f(t,i){const n={0:[],1:[t.lineWidth,t.lineWidth],2:[2*t.lineWidth,2*t.lineWidth],3:[6*t.lineWidth,6*t.lineWidth],4:[t.lineWidth,4*t.lineWidth]}[i];t.setLineDash(n)}function v(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(n,i+e),t.lineTo(s,i+e),t.stroke()}function p(t,i){if(!t)throw new Error("Assertion failed"+(i?": "+i:""))}function m(t){if(void 0===t)throw new Error("Value is undefined");return t}function b(t){if(null===t)throw new Error("Value is null");return t}function w(t){return b(m(t))}!function(t){t[t.Simple=0]="Simple",t[t.WithSteps=1]="WithSteps",t[t.Curved=2]="Curved"}(c||(c={})),function(t){t[t.Solid=0]="Solid",t[t.Dotted=1]="Dotted",t[t.Dashed=2]="Dashed",t[t.LargeDashed=3]="LargeDashed",t[t.SparseDotted=4]="SparseDotted"}(d||(d={}));const g={khaki:"#f0e68c",azure:"#f0ffff",aliceblue:"#f0f8ff",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gainsboro:"#dcdcdc",gray:"#808080",green:"#008000",honeydew:"#f0fff0",floralwhite:"#fffaf0",lightblue:"#add8e6",lightcoral:"#f08080",lemonchiffon:"#fffacd",hotpink:"#ff69b4",lightyellow:"#ffffe0",greenyellow:"#adff2f",lightgoldenrodyellow:"#fafad2",limegreen:"#32cd32",linen:"#faf0e6",lightcyan:"#e0ffff",magenta:"#f0f",maroon:"#800000",olive:"#808000",orange:"#ffa500",oldlace:"#fdf5e6",mediumblue:"#0000cd",transparent:"#0000",lime:"#0f0",lightpink:"#ffb6c1",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",midnightblue:"#191970",orchid:"#da70d6",mediumorchid:"#ba55d3",mediumturquoise:"#48d1cc",orangered:"#ff4500",royalblue:"#4169e1",powderblue:"#b0e0e6",red:"#f00",coral:"#ff7f50",turquoise:"#40e0d0",white:"#fff",whitesmoke:"#f5f5f5",wheat:"#f5deb3",teal:"#008080",steelblue:"#4682b4",bisque:"#ffe4c4",aquamarine:"#7fffd4",aqua:"#0ff",sienna:"#a0522d",silver:"#c0c0c0",springgreen:"#00ff7f",antiquewhite:"#faebd7",burlywood:"#deb887",brown:"#a52a2a",beige:"#f5f5dc",chocolate:"#d2691e",chartreuse:"#7fff00",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cadetblue:"#5f9ea0",tomato:"#ff6347",fuchsia:"#f0f",blue:"#00f",salmon:"#fa8072",blanchedalmond:"#ffebcd",slateblue:"#6a5acd",slategray:"#708090",thistle:"#d8bfd8",tan:"#d2b48c",cyan:"#0ff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",blueviolet:"#8a2be2",black:"#000",darkmagenta:"#8b008b",darkslateblue:"#483d8b",darkkhaki:"#bdb76b",darkorchid:"#9932cc",darkorange:"#ff8c00",darkgreen:"#006400",darkred:"#8b0000",dodgerblue:"#1e90ff",darkslategray:"#2f4f4f",dimgray:"#696969",deepskyblue:"#00bfff",firebrick:"#b22222",forestgreen:"#228b22",indigo:"#4b0082",ivory:"#fffff0",lavenderblush:"#fff0f5",feldspar:"#d19275",indianred:"#cd5c5c",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightskyblue:"#87cefa",lightslategray:"#789",lightslateblue:"#8470ff",snow:"#fffafa",lightseagreen:"#20b2aa",lightsalmon:"#ffa07a",darksalmon:"#e9967a",darkviolet:"#9400d3",mediumpurple:"#9370d8",mediumaquamarine:"#66cdaa",skyblue:"#87ceeb",lavender:"#e6e6fa",lightsteelblue:"#b0c4de",mediumvioletred:"#c71585",mintcream:"#f5fffa",navajowhite:"#ffdead",navy:"#000080",olivedrab:"#6b8e23",palevioletred:"#d87093",violetred:"#d02090",yellow:"#ff0",yellowgreen:"#9acd32",lawngreen:"#7cfc00",pink:"#ffc0cb",paleturquoise:"#afeeee",palegoldenrod:"#eee8aa",darkolivegreen:"#556b2f",darkseagreen:"#8fbc8f",darkturquoise:"#00ced1",peachpuff:"#ffdab9",deeppink:"#ff1493",violet:"#ee82ee",palegreen:"#98fb98",mediumseagreen:"#3cb371",peru:"#cd853f",saddlebrown:"#8b4513",sandybrown:"#f4a460",rosybrown:"#bc8f8f",purple:"#800080",seagreen:"#2e8b57",seashell:"#fff5ee",papayawhip:"#ffefd5",mediumslateblue:"#7b68ee",plum:"#dda0dd",mediumspringgreen:"#00fa9a"};function M(t){return t<0?0:t>255?255:Math.round(t)||0}function x(t){return t<=0||t>0?t<0?0:t>1?1:Math.round(1e4*t)/1e4:0}const S=/^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,k=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,y=/^rgb\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*\)$/,C=/^rgba\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?[\d]{0,10}(?:\.\d+)?)\s*\)$/;function T(t){(t=t.toLowerCase())in g&&(t=g[t]);{const i=C.exec(t)||y.exec(t);if(i)return[M(parseInt(i[1],10)),M(parseInt(i[2],10)),M(parseInt(i[3],10)),x(i.length<5?1:parseFloat(i[4]))]}{const i=k.exec(t);if(i)return[M(parseInt(i[1],16)),M(parseInt(i[2],16)),M(parseInt(i[3],16)),1]}{const i=S.exec(t);if(i)return[M(17*parseInt(i[1],16)),M(17*parseInt(i[2],16)),M(17*parseInt(i[3],16)),1]}throw new Error(`Cannot parse color: ${t}`)}function P(t){const i=T(t);return{t:`rgb(${i[0]}, ${i[1]}, ${i[2]})`,i:(n=i,.199*n[0]+.687*n[1]+.114*n[2]>160?"black":"white")};var n}class R{constructor(){this.h=[]}l(t,i,n){const s={o:t,_:i,u:!0===n};this.h.push(s)}v(t){const i=this.h.findIndex((i=>t===i.o));i>-1&&this.h.splice(i,1)}p(t){this.h=this.h.filter((i=>i._!==t))}m(t,i,n){const s=[...this.h];this.h=this.h.filter((t=>!t.u)),s.forEach((s=>s.o(t,i,n)))}M(){return this.h.length>0}S(){this.h=[]}}function D(t,...i){for(const n of i)for(const i in n)void 0!==n[i]&&("object"!=typeof n[i]||void 0===t[i]||Array.isArray(n[i])?t[i]=n[i]:D(t[i],n[i]));return t}function O(t){return"number"==typeof t&&isFinite(t)}function A(t){return"number"==typeof t&&t%1==0}function V(t){return"string"==typeof t}function B(t){return"boolean"==typeof t}function I(t){const i=t;if(!i||"object"!=typeof i)return i;let n,s,e;for(s in n=Array.isArray(i)?[]:{},i)i.hasOwnProperty(s)&&(e=i[s],n[s]=e&&"object"==typeof e?I(e):e);return n}function z(t){return null!==t}function E(t){return null===t?void 0:t}const L="-apple-system, BlinkMacSystemFont, 'Trebuchet MS', Roboto, Ubuntu, sans-serif";function N(t,i,n){return void 0===i&&(i=L),`${n=void 0!==n?`${n} `:""}${t}px ${i}`}class F{constructor(t){this.k={C:1,T:5,P:NaN,R:"",D:"",O:"",A:"",V:0,B:0,I:0,L:0,N:0},this.F=t}W(){const t=this.k,i=this.j(),n=this.H();return t.P===i&&t.D===n||(t.P=i,t.D=n,t.R=N(i,n),t.L=2.5/12*i,t.V=t.L,t.B=i/12*t.T,t.I=i/12*t.T,t.N=0),t.O=this.$(),t.A=this.U(),this.k}$(){return this.F.W().layout.textColor}U(){return this.F.q()}j(){return this.F.W().layout.fontSize}H(){return this.F.W().layout.fontFamily}}class W{constructor(){this.Y=[]}X(t){this.Y=t}K(t,i,n){this.Y.forEach((s=>{s.K(t,i,n)}))}}class j{K(t,i,n){t.useMediaCoordinateSpace((t=>this.Z(t,i,n)))}G(t,i,n){t.useMediaCoordinateSpace((t=>this.J(t,i,n)))}J(t,i,n){}}class H extends j{constructor(){super(...arguments),this.tt=null}it(t){this.tt=t}Z({context:t}){if(null===this.tt||null===this.tt.nt)return;const i=this.tt.nt,n=this.tt,s=s=>{t.beginPath();for(let e=i.to-1;e>=i.from;--e){const i=n.st[e];t.moveTo(i.et,i.rt),t.arc(i.et,i.rt,s,0,2*Math.PI)}t.fill()};n.ht>0&&(t.fillStyle=n.lt,s(n.ot+n.ht)),t.fillStyle=n._t,s(n.ot)}}function $(){return{st:[{et:0,rt:0,ut:0,ct:0}],_t:"",lt:"",ot:0,ht:0,nt:null}}const U={from:0,to:1};class q{constructor(t,i){this.dt=new W,this.ft=[],this.vt=[],this.bt=!0,this.F=t,this.wt=i,this.dt.X(this.ft)}gt(t){const i=this.F.Mt();i.length!==this.ft.length&&(this.vt=i.map($),this.ft=this.vt.map((t=>{const i=new H;return i.it(t),i})),this.dt.X(this.ft)),this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.dt}St(){const t=2===this.wt.W().mode,i=this.F.Mt(),n=this.wt.kt(),s=this.F.yt();i.forEach(((i,e)=>{var r;const h=this.vt[e],l=i.Ct(n);if(t||null===l||!i.Tt())return void(h.nt=null);const a=b(i.Pt());h._t=l.Rt,h.ot=l.ot,h.ht=l.Dt,h.st[0].ct=l.ct,h.st[0].rt=i.At().Ot(l.ct,a.Vt),h.lt=null!==(r=l.Bt)&&void 0!==r?r:this.F.It(h.st[0].rt/i.At().zt()),h.st[0].ut=n,h.st[0].et=s.Et(n),h.nt=U}))}}class Y{K(t,i,n){t.useBitmapCoordinateSpace((t=>this.Z(t,i,n)))}}class X extends Y{constructor(t){super(),this.Lt=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;const e=this.Lt.Nt.Tt,r=this.Lt.Ft.Tt;if(!e&&!r)return;const h=Math.round(this.Lt.et*n),l=Math.round(this.Lt.rt*s);t.lineCap="butt",e&&h>=0&&(t.lineWidth=Math.floor(this.Lt.Nt.ht*n),t.strokeStyle=this.Lt.Nt.O,t.fillStyle=this.Lt.Nt.O,f(t,this.Lt.Nt.Wt),function(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(i+e,n),t.lineTo(i+e,s),t.stroke()}(t,h,0,i.height)),r&&l>=0&&(t.lineWidth=Math.floor(this.Lt.Ft.ht*s),t.strokeStyle=this.Lt.Ft.O,t.fillStyle=this.Lt.Ft.O,f(t,this.Lt.Ft.Wt),v(t,l,0,i.width))}}class K{constructor(t){this.bt=!0,this.jt={Nt:{ht:1,Wt:0,O:"",Tt:!1},Ft:{ht:1,Wt:0,O:"",Tt:!1},et:0,rt:0},this.Ht=new X(this.jt),this.$t=t}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht}St(){const t=this.$t.Tt(),i=b(this.$t.Ut()),n=i.qt().W().crosshair,s=this.jt;if(2===n.mode)return s.Ft.Tt=!1,void(s.Nt.Tt=!1);s.Ft.Tt=t&&this.$t.Yt(i),s.Nt.Tt=t&&this.$t.Xt(),s.Ft.ht=n.horzLine.width,s.Ft.Wt=n.horzLine.style,s.Ft.O=n.horzLine.color,s.Nt.ht=n.vertLine.width,s.Nt.Wt=n.vertLine.style,s.Nt.O=n.vertLine.color,s.et=this.$t.Kt(),s.rt=this.$t.Zt()}}function Z(t,i,n,s,e,r){t.fillRect(i+r,n,s-2*r,r),t.fillRect(i+r,n+e-r,s-2*r,r),t.fillRect(i,n,r,e),t.fillRect(i+s-r,n,r,e)}function G(t,i,n,s,e,r){t.save(),t.globalCompositeOperation="copy",t.fillStyle=r,t.fillRect(i,n,s,e),t.restore()}function J(t,i){return t.map((t=>0===t?t:t+i))}function Q(t,i,n,s,e,r){t.beginPath(),t.lineTo(i+s-r[1],n),0!==r[1]&&t.arcTo(i+s,n,i+s,n+r[1],r[1]),t.lineTo(i+s,n+e-r[2]),0!==r[2]&&t.arcTo(i+s,n+e,i+s-r[2],n+e,r[2]),t.lineTo(i+r[3],n+e),0!==r[3]&&t.arcTo(i,n+e,i,n+e-r[3],r[3]),t.lineTo(i,n+r[0]),0!==r[0]&&t.arcTo(i,n,i+r[0],n,r[0])}function tt(t,i,n,s,e,r,h=0,l=[0,0,0,0],a=""){if(t.save(),!h||!a||a===r)return Q(t,i,n,s,e,l),t.fillStyle=r,t.fill(),void t.restore();const o=h/2;if("transparent"!==r){Q(t,i+h,n+h,s-2*h,e-2*h,J(l,-h)),t.fillStyle=r,t.fill()}if("transparent"!==a){Q(t,i+o,n+o,s-h,e-h,J(l,-o)),t.lineWidth=h,t.strokeStyle=a,t.closePath(),t.stroke()}t.restore()}function it(t,i,n,s,e,r,h){t.save(),t.globalCompositeOperation="copy";const l=t.createLinearGradient(0,0,0,e);l.addColorStop(0,r),l.addColorStop(1,h),t.fillStyle=l,t.fillRect(i,n,s,e),t.restore()}class nt{constructor(t,i){this.it(t,i)}it(t,i){this.Lt=t,this.Gt=i}zt(t,i){return this.Lt.Tt?t.P+t.L+t.V:0}K(t,i,n,s){if(!this.Lt.Tt||0===this.Lt.Jt.length)return;const e=this.Lt.O,r=this.Gt.t,h=t.useBitmapCoordinateSpace((t=>{const h=t.context;h.font=i.R;const l=this.Qt(t,i,n,s),a=l.ti,o=(t,i)=>{l.ii?tt(h,a.ni,a.si,a.ei,a.ri,t,a.hi,[a.ot,0,0,a.ot],i):tt(h,a.li,a.si,a.ei,a.ri,t,a.hi,[0,a.ot,a.ot,0],i)};return o(r,"transparent"),this.Lt.ai&&(h.fillStyle=e,h.fillRect(a.li,a.oi,a._i-a.li,a.ui)),o("transparent",r),this.Lt.ci&&(h.fillStyle=i.A,h.fillRect(l.ii?a.di-a.hi:0,a.si,a.hi,a.fi-a.si)),l}));t.useMediaCoordinateSpace((({context:t})=>{const n=h.vi;t.font=i.R,t.textAlign=h.ii?"right":"left",t.textBaseline="middle",t.fillStyle=e,t.fillText(this.Lt.Jt,n.pi,(n.si+n.fi)/2+n.mi)}))}Qt(t,i,n,s){var e;const{context:r,bitmapSize:h,mediaSize:l,horizontalPixelRatio:a,verticalPixelRatio:o}=t,_=this.Lt.ai||!this.Lt.bi?i.T:0,u=this.Lt.wi?i.C:0,c=i.L+this.Gt.gi,d=i.V+this.Gt.Mi,f=i.B,v=i.I,p=this.Lt.Jt,m=i.P,b=n.xi(r,p),w=Math.ceil(n.Si(r,p)),g=m+c+d,M=i.C+f+v+w+_,x=Math.max(1,Math.floor(o));let S=Math.round(g*o);S%2!=x%2&&(S+=1);const k=u>0?Math.max(1,Math.floor(u*a)):0,y=Math.round(M*a),C=Math.round(_*a),T=null!==(e=this.Gt.ki)&&void 0!==e?e:this.Gt.yi,P=Math.round(T*o)-Math.floor(.5*o),R=Math.floor(P+x/2-S/2),D=R+S,O="right"===s,A=O?l.width-u:u,V=O?h.width-k:k;let B,I,z;return O?(B=V-y,I=V-C,z=A-_-f-u):(B=V+y,I=V+C,z=A+_+f),{ii:O,ti:{si:R,oi:P,fi:D,ei:y,ri:S,ot:2*a,hi:k,ni:B,li:V,_i:I,ui:x,di:h.width},vi:{si:R/o,fi:D/o,pi:z,mi:b}}}}class st{constructor(t){this.Ci={yi:0,t:"#000",Mi:0,gi:0},this.Ti={Jt:"",Tt:!1,ai:!0,bi:!1,Bt:"",O:"#FFF",ci:!1,wi:!1},this.Pi={Jt:"",Tt:!1,ai:!1,bi:!0,Bt:"",O:"#FFF",ci:!0,wi:!0},this.bt=!0,this.Ri=new(t||nt)(this.Ti,this.Ci),this.Di=new(t||nt)(this.Pi,this.Ci)}Jt(){return this.Oi(),this.Ti.Jt}yi(){return this.Oi(),this.Ci.yi}gt(){this.bt=!0}zt(t,i=!1){return Math.max(this.Ri.zt(t,i),this.Di.zt(t,i))}Ai(){return this.Ci.ki||0}Vi(t){this.Ci.ki=t}Bi(){return this.Oi(),this.Ti.Tt||this.Pi.Tt}Ii(){return this.Oi(),this.Ti.Tt}xt(t){return this.Oi(),this.Ti.ai=this.Ti.ai&&t.W().ticksVisible,this.Pi.ai=this.Pi.ai&&t.W().ticksVisible,this.Ri.it(this.Ti,this.Ci),this.Di.it(this.Pi,this.Ci),this.Ri}zi(){return this.Oi(),this.Ri.it(this.Ti,this.Ci),this.Di.it(this.Pi,this.Ci),this.Di}Oi(){this.bt&&(this.Ti.ai=!0,this.Pi.ai=!1,this.Ei(this.Ti,this.Pi,this.Ci))}}class et extends st{constructor(t,i,n){super(),this.$t=t,this.Li=i,this.Ni=n}Ei(t,i,n){if(t.Tt=!1,2===this.$t.W().mode)return;const s=this.$t.W().horzLine;if(!s.labelVisible)return;const e=this.Li.Pt();if(!this.$t.Tt()||this.Li.Fi()||null===e)return;const r=P(s.labelBackgroundColor);n.t=r.t,t.O=r.i;const h=2/12*this.Li.P();n.gi=h,n.Mi=h;const l=this.Ni(this.Li);n.yi=l.yi,t.Jt=this.Li.Wi(l.ct,e),t.Tt=!0}}const rt=/[1-9]/g;class ht{constructor(){this.Lt=null}it(t){this.Lt=t}K(t,i){if(null===this.Lt||!1===this.Lt.Tt||0===this.Lt.Jt.length)return;const n=t.useMediaCoordinateSpace((({context:t})=>(t.font=i.R,Math.round(i.ji.Si(t,b(this.Lt).Jt,rt)))));if(n<=0)return;const s=i.Hi,e=n+2*s,r=e/2,h=this.Lt.$i;let l=this.Lt.yi,a=Math.floor(l-r)+.5;a<0?(l+=Math.abs(0-a),a=Math.floor(l-r)+.5):a+e>h&&(l-=Math.abs(h-(a+e)),a=Math.floor(l-r)+.5);const o=a+e,_=Math.ceil(0+i.C+i.T+i.L+i.P+i.V);t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:n,verticalPixelRatio:s})=>{const e=b(this.Lt);t.fillStyle=e.t;const r=Math.round(a*n),h=Math.round(0*s),l=Math.round(o*n),u=Math.round(_*s),c=Math.round(2*n);if(t.beginPath(),t.moveTo(r,h),t.lineTo(r,u-c),t.arcTo(r,u,r+c,u,c),t.lineTo(l-c,u),t.arcTo(l,u,l,u-c,c),t.lineTo(l,h),t.fill(),e.ai){const r=Math.round(e.yi*n),l=h,a=Math.round((l+i.T)*s);t.fillStyle=e.O;const o=Math.max(1,Math.floor(n)),_=Math.floor(.5*n);t.fillRect(r-_,l,o,a-l)}})),t.useMediaCoordinateSpace((({context:t})=>{const n=b(this.Lt),e=0+i.C+i.T+i.L+i.P/2;t.font=i.R,t.textAlign="left",t.textBaseline="middle",t.fillStyle=n.O;const r=i.ji.xi(t,"Apr0");t.translate(a+s,e+r),t.fillText(n.Jt,0,0)}))}}class lt{constructor(t,i,n){this.bt=!0,this.Ht=new ht,this.jt={Tt:!1,t:"#4c525e",O:"white",Jt:"",$i:0,yi:NaN,ai:!0},this.wt=t,this.Ui=i,this.Ni=n}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht.it(this.jt),this.Ht}St(){const t=this.jt;if(t.Tt=!1,2===this.wt.W().mode)return;const i=this.wt.W().vertLine;if(!i.labelVisible)return;const n=this.Ui.yt();if(n.Fi())return;t.$i=n.$i();const s=this.Ni();if(null===s)return;t.yi=s.yi;const e=n.qi(this.wt.kt());t.Jt=n.Yi(b(e)),t.Tt=!0;const r=P(i.labelBackgroundColor);t.t=r.t,t.O=r.i,t.ai=n.W().ticksVisible}}class at{constructor(){this.Xi=null,this.Ki=0}Zi(){return this.Ki}Gi(t){this.Ki=t}At(){return this.Xi}Ji(t){this.Xi=t}Qi(t){return[]}tn(){return[]}Tt(){return!0}}var ot;!function(t){t[t.Normal=0]="Normal",t[t.Magnet=1]="Magnet",t[t.Hidden=2]="Hidden"}(ot||(ot={}));class _t extends at{constructor(t,i){super(),this.nn=null,this.sn=NaN,this.en=0,this.rn=!0,this.hn=new Map,this.ln=!1,this.an=NaN,this.on=NaN,this._n=NaN,this.un=NaN,this.Ui=t,this.cn=i,this.dn=new q(t,this);this.fn=((t,i)=>n=>{const s=i(),e=t();if(n===b(this.nn).vn())return{ct:e,yi:s};{const t=b(n.Pt());return{ct:n.pn(s,t),yi:s}}})((()=>this.sn),(()=>this.on));const n=((t,i)=>()=>{const n=this.Ui.yt().mn(t()),s=i();return n&&Number.isFinite(s)?{ut:n,yi:s}:null})((()=>this.en),(()=>this.Kt()));this.bn=new lt(this,t,n),this.wn=new K(this)}W(){return this.cn}gn(t,i){this._n=t,this.un=i}Mn(){this._n=NaN,this.un=NaN}xn(){return this._n}Sn(){return this.un}kn(t,i,n){this.ln||(this.ln=!0),this.rn=!0,this.yn(t,i,n)}kt(){return this.en}Kt(){return this.an}Zt(){return this.on}Tt(){return this.rn}Cn(){this.rn=!1,this.Tn(),this.sn=NaN,this.an=NaN,this.on=NaN,this.nn=null,this.Mn()}Pn(t){return null!==this.nn?[this.wn,this.dn]:[]}Yt(t){return t===this.nn&&this.cn.horzLine.visible}Xt(){return this.cn.vertLine.visible}Rn(t,i){this.rn&&this.nn===t||this.hn.clear();const n=[];return this.nn===t&&n.push(this.Dn(this.hn,i,this.fn)),n}tn(){return this.rn?[this.bn]:[]}Ut(){return this.nn}On(){this.wn.gt(),this.hn.forEach((t=>t.gt())),this.bn.gt(),this.dn.gt()}An(t){return t&&!t.vn().Fi()?t.vn():null}yn(t,i,n){this.Vn(t,i,n)&&this.On()}Vn(t,i,n){const s=this.an,e=this.on,r=this.sn,h=this.en,l=this.nn,a=this.An(n);this.en=t,this.an=isNaN(t)?NaN:this.Ui.yt().Et(t),this.nn=n;const o=null!==a?a.Pt():null;return null!==a&&null!==o?(this.sn=i,this.on=a.Ot(i,o)):(this.sn=NaN,this.on=NaN),s!==this.an||e!==this.on||h!==this.en||r!==this.sn||l!==this.nn}Tn(){const t=this.Ui.Mt().map((t=>t.In().Bn())).filter(z),i=0===t.length?null:Math.max(...t);this.en=null!==i?i:NaN}Dn(t,i,n){let s=t.get(i);return void 0===s&&(s=new et(this,i,n),t.set(i,s)),s}}function ut(t){return"left"===t||"right"===t}class ct{constructor(t){this.zn=new Map,this.En=[],this.Ln=t}Nn(t,i){const n=function(t,i){return void 0===t?i:{Fn:Math.max(t.Fn,i.Fn),Wn:t.Wn||i.Wn}}(this.zn.get(t),i);this.zn.set(t,n)}jn(){return this.Ln}Hn(t){const i=this.zn.get(t);return void 0===i?{Fn:this.Ln}:{Fn:Math.max(this.Ln,i.Fn),Wn:i.Wn}}$n(){this.Un(),this.En=[{qn:0}]}Yn(t){this.Un(),this.En=[{qn:1,Vt:t}]}Xn(t){this.Kn(),this.En.push({qn:5,Vt:t})}Un(){this.Kn(),this.En.push({qn:6})}Zn(){this.Un(),this.En=[{qn:4}]}Gn(t){this.Un(),this.En.push({qn:2,Vt:t})}Jn(t){this.Un(),this.En.push({qn:3,Vt:t})}Qn(){return this.En}ts(t){for(const i of t.En)this.ns(i);this.Ln=Math.max(this.Ln,t.Ln),t.zn.forEach(((t,i)=>{this.Nn(i,t)}))}static ss(){return new ct(2)}static es(){return new ct(3)}ns(t){switch(t.qn){case 0:this.$n();break;case 1:this.Yn(t.Vt);break;case 2:this.Gn(t.Vt);break;case 3:this.Jn(t.Vt);break;case 4:this.Zn();break;case 5:this.Xn(t.Vt);break;case 6:this.Kn()}}Kn(){const t=this.En.findIndex((t=>5===t.qn));-1!==t&&this.En.splice(t,1)}}const dt=".";function ft(t,i){if(!O(t))return"n/a";if(!A(i))throw new TypeError("invalid length");if(i<0||i>16)throw new TypeError("invalid length");if(0===i)return t.toString();return("0000000000000000"+t.toString()).slice(-i)}class vt{constructor(t,i){if(i||(i=1),O(t)&&A(t)||(t=100),t<0)throw new TypeError("invalid base");this.Li=t,this.rs=i,this.hs()}format(t){const i=t<0?"−":"";return t=Math.abs(t),i+this.ls(t)}hs(){if(this.os=0,this.Li>0&&this.rs>0){let t=this.Li;for(;t>1;)t/=10,this.os++}}ls(t){const i=this.Li/this.rs;let n=Math.floor(t),s="";const e=void 0!==this.os?this.os:NaN;if(i>1){let r=+(Math.round(t*i)-n*i).toFixed(this.os);r>=i&&(r-=i,n+=1),s=dt+ft(+r.toFixed(this.os)*this.rs,e)}else n=Math.round(n*i)/i,e>0&&(s=dt+ft(0,e));return n.toFixed(0)+s}}class pt extends vt{constructor(t=100){super(t)}format(t){return`${super.format(t)}%`}}class mt{constructor(t){this._s=t}format(t){let i="";return t<0&&(i="-",t=-t),t<995?i+this.us(t):t<999995?i+this.us(t/1e3)+"K":t<999999995?(t=1e3*Math.round(t/1e3),i+this.us(t/1e6)+"M"):(t=1e6*Math.round(t/1e6),i+this.us(t/1e9)+"B")}us(t){let i;const n=Math.pow(10,this._s);return i=(t=Math.round(t*n)/n)>=1e-15&&t<1?t.toFixed(this._s).replace(/\.?0+$/,""):String(t),i.replace(/(\.[1-9]*)0+$/,((t,i)=>i))}}function bt(t,i,n,s,e,r,h){if(0===i.length||s.from>=i.length||s.to<=0)return;const{context:l,horizontalPixelRatio:a,verticalPixelRatio:o}=t,_=i[s.from];let u=r(t,_),c=_;if(s.to-s.from<2){const i=e/2;l.beginPath();const n={et:_.et-i,rt:_.rt},s={et:_.et+i,rt:_.rt};l.moveTo(n.et*a,n.rt*o),l.lineTo(s.et*a,s.rt*o),h(t,u,n,s)}else{const e=(i,n)=>{h(t,u,c,n),l.beginPath(),u=i,c=n};let d=c;l.beginPath(),l.moveTo(_.et*a,_.rt*o);for(let h=s.from+1;h=s.from;--n){const s=i[n];if(s){const i=e(t,s);i!==a&&(l.beginPath(),null!==a&&l.fill(),l.fillStyle=i,a=i);const n=Math.round(s.et*r)+o,u=s.rt*h;l.moveTo(n,u),l.arc(n,u,_,0,2*Math.PI)}}l.fill()}(t,i,l,n,o)}}class At extends Ot{Ds(t,i){return i._t}}function Vt(t,i,n,s,e=0,r=i.length){let h=r-e;for(;0>1,l=e+r;s(i[l],n)===t?(e=l+1,h-=r+1):h=r}return e}const Bt=Vt.bind(null,!0),It=Vt.bind(null,!1);function zt(t,i){return t.ut0&&r=s&&(l=r-1),h>0&&hObject.assign(Object.assign({},t),this.Es.$s().Hs(t.ut))))}Us(){this.zs=null}Fs(){this.Vs&&(this.qs(),this.Vs=!1),this.Bs&&(this.js(),this.Bs=!1),this.As&&(this.Ys(),this.As=!1)}Ys(){const t=this.Es.At(),i=this.Ls.yt();if(this.Us(),i.Fi()||t.Fi())return;const n=i.Xs();if(null===n)return;if(0===this.Es.In().Ks())return;const s=this.Es.Pt();null!==s&&(this.zs=Lt(this.Is,n,this.Ns),this.Zs(t,i,s.Vt),this.Gs())}}class Ft extends Nt{constructor(t,i){super(t,i,!0)}Zs(t,i,n){i.Js(this.Is,E(this.zs)),t.Qs(this.Is,n,E(this.zs))}te(t,i){return{ut:t,ct:i,et:NaN,rt:NaN}}qs(){const t=this.Es.$s();this.Is=this.Es.In().ie().map((i=>{const n=i.Vt[3];return this.ne(i.se,n,t)}))}}class Wt extends Ft{constructor(t,i){super(t,i),this.Ws=new W,this.ee=new Rt,this.re=new At,this.Ws.X([this.ee,this.re])}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Es.W();this.ee.it({ds:t.lineType,st:this.Is,Wt:t.lineStyle,ht:t.lineWidth,fs:null,vs:t.invertFilledArea,nt:this.zs,cs:this.Ls.yt().he()}),this.re.it({ds:t.lineVisible?t.lineType:void 0,st:this.Is,Wt:t.lineStyle,ht:t.lineWidth,nt:this.zs,cs:this.Ls.yt().he(),Rs:t.pointMarkersVisible?t.pointMarkersRadius||t.lineWidth/2+2:void 0})}}class jt extends Y{constructor(){super(...arguments),this.Lt=null,this.le=0,this.ae=0}it(t){this.Lt=t}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.Lt||0===this.Lt.In.length||null===this.Lt.nt)return;if(this.le=this.oe(i),this.le>=2){Math.max(1,Math.floor(i))%2!=this.le%2&&this.le--}this.ae=this.Lt._e?Math.min(this.le,Math.floor(i)):this.le;let s=null;const e=this.ae<=this.le&&this.Lt.he>=Math.floor(1.5*i);for(let r=this.Lt.nt.from;rf+p-1&&(e=f+p-1,s=e-_+1),t.fillRect(i,s,o-i,e-s+1)}const i=a+m;let s=Math.max(f,Math.round(h.pe*n)-l),e=s+_-1;e>f+p-1&&(e=f+p-1,s=e-_+1),t.fillRect(u+1,s,i-u,e-s+1)}}}oe(t){const i=Math.floor(t);return Math.max(i,Math.floor(function(t,i){return Math.floor(.3*t*i)}(b(this.Lt).he,t)))}}class Ht extends Nt{constructor(t,i){super(t,i,!1)}Zs(t,i,n){i.Js(this.Is,E(this.zs)),t.me(this.Is,n,E(this.zs))}be(t,i,n){return{ut:t,we:i.Vt[0],ge:i.Vt[1],Me:i.Vt[2],xe:i.Vt[3],et:NaN,ve:NaN,ce:NaN,de:NaN,pe:NaN}}qs(){const t=this.Es.$s();this.Is=this.Es.In().ie().map((i=>this.ne(i.se,i,t)))}}class $t extends Ht{constructor(){super(...arguments),this.Ws=new jt}ne(t,i,n){return Object.assign(Object.assign({},this.be(t,i,n)),n.Hs(t))}Gs(){const t=this.Es.W();this.Ws.it({In:this.Is,he:this.Ls.yt().he(),fe:t.openVisible,_e:t.thinBars,nt:this.zs})}}class Ut extends kt{constructor(){super(...arguments),this.Cs=new Pt}ps(t,i){const n=this.tt;return this.Cs.bs(t,{gs:i.Se,Ms:i.ke,xs:i.ye,Ss:i.Ce,ks:t.bitmapSize.height,fs:n.fs})}}class qt extends Ot{constructor(){super(...arguments),this.Te=new Pt}Ds(t,i){const n=this.tt;return this.Te.bs(t,{gs:i.Pe,Ms:i.Pe,xs:i.Re,Ss:i.Re,ks:t.bitmapSize.height,fs:n.fs})}}class Yt extends Ft{constructor(t,i){super(t,i),this.Ws=new W,this.De=new Ut,this.Oe=new qt,this.Ws.X([this.De,this.Oe])}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Es.Pt();if(null===t)return;const i=this.Es.W(),n=this.Es.At().Ot(i.baseValue.price,t.Vt),s=this.Ls.yt().he();this.De.it({st:this.Is,ht:i.lineWidth,Wt:i.lineStyle,ds:i.lineType,fs:n,vs:!1,nt:this.zs,cs:s}),this.Oe.it({st:this.Is,ht:i.lineWidth,Wt:i.lineStyle,ds:i.lineVisible?i.lineType:void 0,Rs:i.pointMarkersVisible?i.pointMarkersRadius||i.lineWidth/2+2:void 0,fs:n,nt:this.zs,cs:s})}}class Xt extends Y{constructor(){super(...arguments),this.Lt=null,this.le=0}it(t){this.Lt=t}Z(t){if(null===this.Lt||0===this.Lt.In.length||null===this.Lt.nt)return;const{horizontalPixelRatio:i}=t;if(this.le=function(t,i){if(t>=2.5&&t<=4)return Math.floor(3*i);const n=1-.2*Math.atan(Math.max(4,t)-4)/(.5*Math.PI),s=Math.floor(t*n*i),e=Math.floor(t*i),r=Math.min(s,e);return Math.max(Math.floor(i),r)}(this.Lt.he,i),this.le>=2){Math.floor(i)%2!=this.le%2&&this.le--}const n=this.Lt.In;this.Lt.Ae&&this.Ve(t,n,this.Lt.nt),this.Lt.ci&&this.Be(t,n,this.Lt.nt);const s=this.Ie(i);(!this.Lt.ci||this.le>2*s)&&this.ze(t,n,this.Lt.nt)}Ve(t,i,n){if(null===this.Lt)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="",l=Math.min(Math.floor(e),Math.floor(this.Lt.he*e));l=Math.max(Math.floor(e),Math.min(l,this.le));const a=Math.floor(.5*l);let o=null;for(let t=n.from;t2*l)Z(s,o,u,_-o+1,c-u+1,l);else{const t=_-o+1;s.fillRect(o,u,t,c-u+1)}a=_}}ze(t,i,n){if(null===this.Lt)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="";const l=this.Ie(e);for(let t=n.from;to||s.fillRect(_,a,u-_+1,o-a+1)}}}class Kt extends Ht{constructor(){super(...arguments),this.Ws=new Xt}ne(t,i,n){return Object.assign(Object.assign({},this.be(t,i,n)),n.Hs(t))}Gs(){const t=this.Es.W();this.Ws.it({In:this.Is,he:this.Ls.yt().he(),Ae:t.wickVisible,ci:t.borderVisible,nt:this.zs})}}class Zt{constructor(t,i){this.Ne=t,this.Li=i}K(t,i,n){this.Ne.draw(t,this.Li,i,n)}}class Gt extends Nt{constructor(t,i,n){super(t,i,!1),this.wn=n,this.Ws=new Zt(this.wn.renderer(),(i=>{const n=t.Pt();return null===n?null:t.At().Ot(i,n.Vt)}))}Fe(t){return this.wn.priceValueBuilder(t)}We(t){return this.wn.isWhitespace(t)}qs(){const t=this.Es.$s();this.Is=this.Es.In().ie().map((i=>Object.assign(Object.assign({ut:i.se,et:NaN},t.Hs(i.se)),{je:i.He})))}Zs(t,i){i.Js(this.Is,E(this.zs))}Gs(){this.wn.update({bars:this.Is.map(Jt),barSpacing:this.Ls.yt().he(),visibleRange:this.zs},this.Es.W())}}function Jt(t){return{x:t.et,time:t.ut,originalData:t.je,barColor:t.ue}}class Qt extends Y{constructor(){super(...arguments),this.Lt=null,this.$e=[]}it(t){this.Lt=t,this.$e=[]}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.Lt||0===this.Lt.st.length||null===this.Lt.nt)return;this.$e.length||this.Ue(i);const s=Math.max(1,Math.floor(n)),e=Math.round(this.Lt.qe*n)-Math.floor(s/2),r=e+s;for(let i=this.Lt.nt.from;is.Xe?s.di=n.Os-i-1:n.Os=s.di+i+1))}let s=Math.ceil(this.Lt.he*t);for(let t=this.Lt.nt.from;t0&&s<4)for(let t=this.Lt.nt.from;ts&&(i.Ye>i.Xe?i.di-=1:i.Os+=1)}}}class ti extends Ft{constructor(){super(...arguments),this.Ws=new Qt}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t={st:this.Is,he:this.Ls.yt().he(),nt:this.zs,qe:this.Es.At().Ot(this.Es.W().base,b(this.Es.Pt()).Vt)};this.Ws.it(t)}}class ii extends Ft{constructor(){super(...arguments),this.Ws=new At}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Es.W(),i={st:this.Is,Wt:t.lineStyle,ds:t.lineVisible?t.lineType:void 0,ht:t.lineWidth,Rs:t.pointMarkersVisible?t.pointMarkersRadius||t.lineWidth/2+2:void 0,nt:this.zs,cs:this.Ls.yt().he()};this.Ws.it(i)}}const ni=/[2-9]/g;class si{constructor(t=50){this.Ke=0,this.Ze=1,this.Ge=1,this.Je={},this.Qe=new Map,this.tr=t}ir(){this.Ke=0,this.Qe.clear(),this.Ze=1,this.Ge=1,this.Je={}}Si(t,i,n){return this.nr(t,i,n).width}xi(t,i,n){const s=this.nr(t,i,n);return((s.actualBoundingBoxAscent||0)-(s.actualBoundingBoxDescent||0))/2}nr(t,i,n){const s=n||ni,e=String(i).replace(s,"0");if(this.Qe.has(e))return m(this.Qe.get(e)).sr;if(this.Ke===this.tr){const t=this.Je[this.Ge];delete this.Je[this.Ge],this.Qe.delete(t),this.Ge++,this.Ke--}t.save(),t.textBaseline="middle";const r=t.measureText(e);return t.restore(),0===r.width&&i.length||(this.Qe.set(e,{sr:r,er:this.Ze}),this.Je[this.Ze]=e,this.Ke++,this.Ze++),r}}class ei{constructor(t){this.rr=null,this.k=null,this.hr="right",this.lr=t}ar(t,i,n){this.rr=t,this.k=i,this.hr=n}K(t){null!==this.k&&null!==this.rr&&this.rr.K(t,this.k,this.lr,this.hr)}}class ri{constructor(t,i,n){this._r=t,this.lr=new si(50),this.ur=i,this.F=n,this.j=-1,this.Ht=new ei(this.lr)}xt(){const t=this.F.cr(this.ur);if(null===t)return null;const i=t.dr(this.ur)?t.vr():this.ur.At();if(null===i)return null;const n=t.pr(i);if("overlay"===n)return null;const s=this.F.mr();return s.P!==this.j&&(this.j=s.P,this.lr.ir()),this.Ht.ar(this._r.zi(),s,n),this.Ht}}class hi extends Y{constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}br(t,i){var n;if(!(null===(n=this.Lt)||void 0===n?void 0:n.Tt))return null;const{rt:s,ht:e,wr:r}=this.Lt;return i>=s-e-7&&i<=s+e+7?{gr:this.Lt,wr:r}:null}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;if(!1===this.Lt.Tt)return;const e=Math.round(this.Lt.rt*s);e<0||e>i.height||(t.lineCap="butt",t.strokeStyle=this.Lt.O,t.lineWidth=Math.floor(this.Lt.ht*n),f(t,this.Lt.Wt),v(t,e,0,i.width))}}class li{constructor(t){this.Mr={rt:0,O:"rgba(0, 0, 0, 0)",ht:1,Wt:0,Tt:!1},this.Sr=new hi,this.bt=!0,this.Es=t,this.Ls=t.qt(),this.Sr.it(this.Mr)}gt(){this.bt=!0}xt(){return this.Es.Tt()?(this.bt&&(this.kr(),this.bt=!1),this.Sr):null}}class ai extends li{constructor(t){super(t)}kr(){this.Mr.Tt=!1;const t=this.Es.At(),i=t.yr().yr;if(2!==i&&3!==i)return;const n=this.Es.W();if(!n.baseLineVisible||!this.Es.Tt())return;const s=this.Es.Pt();null!==s&&(this.Mr.Tt=!0,this.Mr.rt=t.Ot(s.Vt,s.Vt),this.Mr.O=n.baseLineColor,this.Mr.ht=n.baseLineWidth,this.Mr.Wt=n.baseLineStyle)}}class oi extends Y{constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}He(){return this.Lt}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){const s=this.Lt;if(null===s)return;const e=Math.max(1,Math.floor(i)),r=e%2/2,h=Math.round(s.Xe.x*i)+r,l=s.Xe.y*n;t.fillStyle=s.Cr,t.beginPath();const a=Math.max(2,1.5*s.Tr)*i;t.arc(h,l,a,0,2*Math.PI,!1),t.fill(),t.fillStyle=s.Pr,t.beginPath(),t.arc(h,l,s.ot*i,0,2*Math.PI,!1),t.fill(),t.lineWidth=e,t.strokeStyle=s.Rr,t.beginPath(),t.arc(h,l,s.ot*i+e/2,0,2*Math.PI,!1),t.stroke()}}const _i=[{Dr:0,Or:.25,Ar:4,Vr:10,Br:.25,Ir:0,zr:.4,Er:.8},{Dr:.25,Or:.525,Ar:10,Vr:14,Br:0,Ir:0,zr:.8,Er:0},{Dr:.525,Or:1,Ar:14,Vr:14,Br:0,Ir:0,zr:0,Er:0}];function ui(t,i,n,s){return function(t,i){if("transparent"===t)return t;const n=T(t),s=n[3];return`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${i*s})`}(t,n+(s-n)*i)}function ci(t,i){const n=t%2600/2600;let s;for(const t of _i)if(n>=t.Dr&&n<=t.Or){s=t;break}p(void 0!==s,"Last price animation internal logic error");const e=(n-s.Dr)/(s.Or-s.Dr);return{Pr:ui(i,e,s.Br,s.Ir),Rr:ui(i,e,s.zr,s.Er),ot:(r=e,h=s.Ar,l=s.Vr,h+(l-h)*r)};var r,h,l}class di{constructor(t){this.Ht=new oi,this.bt=!0,this.Lr=!0,this.Nr=performance.now(),this.Fr=this.Nr-1,this.Wr=t}jr(){this.Fr=this.Nr-1,this.gt()}Hr(){if(this.gt(),2===this.Wr.W().lastPriceAnimation){const t=performance.now(),i=this.Fr-t;if(i>0)return void(i<650&&(this.Fr+=2600));this.Nr=t,this.Fr=t+2600}}gt(){this.bt=!0}$r(){this.Lr=!0}Tt(){return 0!==this.Wr.W().lastPriceAnimation}Ur(){switch(this.Wr.W().lastPriceAnimation){case 0:return!1;case 1:return!0;case 2:return performance.now()<=this.Fr}}xt(){return this.bt?(this.St(),this.bt=!1,this.Lr=!1):this.Lr&&(this.qr(),this.Lr=!1),this.Ht}St(){this.Ht.it(null);const t=this.Wr.qt().yt(),i=t.Xs(),n=this.Wr.Pt();if(null===i||null===n)return;const s=this.Wr.Yr(!0);if(s.Xr||!i.Kr(s.se))return;const e={x:t.Et(s.se),y:this.Wr.At().Ot(s.ct,n.Vt)},r=s.O,h=this.Wr.W().lineWidth,l=ci(this.Zr(),r);this.Ht.it({Cr:r,Tr:h,Pr:l.Pr,Rr:l.Rr,ot:l.ot,Xe:e})}qr(){const t=this.Ht.He();if(null!==t){const i=ci(this.Zr(),t.Cr);t.Pr=i.Pr,t.Rr=i.Rr,t.ot=i.ot}}Zr(){return this.Ur()?performance.now()-this.Nr:2599}}function fi(t,i){return Tt(Math.min(Math.max(t,12),30)*i)}function vi(t,i){switch(t){case"arrowDown":case"arrowUp":return fi(i,1);case"circle":return fi(i,.8);case"square":return fi(i,.7)}}function pi(t){return function(t){const i=Math.ceil(t);return i%2!=0?i-1:i}(fi(t,1))}function mi(t){return Math.max(fi(t,.1),3)}function bi(t,i,n,s,e){const r=vi("square",n),h=(r-1)/2,l=t-h,a=i-h;return s>=l&&s<=l+r&&e>=a&&e<=a+r}function wi(t,i,n,s,e){const r=(vi("arrowUp",e)-1)/2,h=(Tt(e/2)-1)/2;i.beginPath(),t?(i.moveTo(n-r,s),i.lineTo(n,s-r),i.lineTo(n+r,s),i.lineTo(n+h,s),i.lineTo(n+h,s+r),i.lineTo(n-h,s+r),i.lineTo(n-h,s)):(i.moveTo(n-r,s),i.lineTo(n,s+r),i.lineTo(n+r,s),i.lineTo(n+h,s),i.lineTo(n+h,s-r),i.lineTo(n-h,s-r),i.lineTo(n-h,s)),i.fill()}function gi(t,i,n,s,e,r){return bi(i,n,s,e,r)}class Mi extends j{constructor(){super(...arguments),this.Lt=null,this.lr=new si,this.j=-1,this.H="",this.Gr=""}it(t){this.Lt=t}ar(t,i){this.j===t&&this.H===i||(this.j=t,this.H=i,this.Gr=N(t,i),this.lr.ir())}br(t,i){if(null===this.Lt||null===this.Lt.nt)return null;for(let n=this.Lt.nt.from;n=t&&e<=t+n&&r>=i-h&&r<=i+h}(t.Jt.et,t.Jt.rt,t.Jt.$i,t.Jt.zt,i,n))||function(t,i,n){if(0===t.Ks)return!1;switch(t.th){case"arrowDown":case"arrowUp":return gi(0,t.et,t.rt,t.Ks,i,n);case"circle":return function(t,i,n,s,e){const r=2+vi("circle",n)/2,h=t-s,l=i-e;return Math.sqrt(h*h+l*l)<=r}(t.et,t.rt,t.Ks,i,n);case"square":return bi(t.et,t.rt,t.Ks,i,n)}}(t,i,n)}function ki(t,i,n,s,e,r,h,l,a){const o=O(n)?n:n.xe,_=O(n)?n:n.ge,u=O(n)?n:n.Me,c=O(i.size)?Math.max(i.size,0):1,d=pi(l.he())*c,f=d/2;switch(t.Ks=d,i.position){case"inBar":return t.rt=h.Ot(o,a),void(void 0!==t.Jt&&(t.Jt.rt=t.rt+f+r+.6*e));case"aboveBar":return t.rt=h.Ot(_,a)-f-s.ih,void 0!==t.Jt&&(t.Jt.rt=t.rt-f-.6*e,s.ih+=1.2*e),void(s.ih+=d+r);case"belowBar":return t.rt=h.Ot(u,a)+f+s.nh,void 0!==t.Jt&&(t.Jt.rt=t.rt+f+r+.6*e,s.nh+=1.2*e),void(s.nh+=d+r)}i.position}class yi{constructor(t,i){this.bt=!0,this.sh=!0,this.eh=!0,this.rh=null,this.Ht=new Mi,this.Wr=t,this.Ui=i,this.Lt={st:[],nt:null}}gt(t){this.bt=!0,this.eh=!0,"data"===t&&(this.sh=!0)}xt(t){if(!this.Wr.Tt())return null;this.bt&&this.hh();const i=this.Ui.W().layout;return this.Ht.ar(i.fontSize,i.fontFamily),this.Ht.it(this.Lt),this.Ht}lh(){if(this.eh){if(this.Wr.ah().length>0){const t=this.Ui.yt().he(),i=mi(t),n=1.5*pi(t)+2*i;this.rh={above:n,below:n}}else this.rh=null;this.eh=!1}return this.rh}hh(){const t=this.Wr.At(),i=this.Ui.yt(),n=this.Wr.ah();this.sh&&(this.Lt.st=n.map((t=>({ut:t.time,et:0,rt:0,Ks:0,th:t.shape,O:t.color,Jr:t.Jr,wr:t.id,Jt:void 0}))),this.sh=!1);const s=this.Ui.W().layout;this.Lt.nt=null;const e=i.Xs();if(null===e)return;const r=this.Wr.Pt();if(null===r)return;if(0===this.Lt.st.length)return;let h=NaN;const l=mi(i.he()),a={ih:l,nh:l};this.Lt.nt=Lt(this.Lt.st,e,!0);for(let e=this.Lt.nt.from;e0&&(_.Jt={Qr:o.text,et:0,rt:0,$i:0,zt:0});const u=this.Wr.oh(o.time);null!==u&&ki(_,o,u,a,s.fontSize,l,t,i,r.Vt)}this.bt=!1}}class Ci extends li{constructor(t){super(t)}kr(){const t=this.Mr;t.Tt=!1;const i=this.Es.W();if(!i.priceLineVisible||!this.Es.Tt())return;const n=this.Es.Yr(0===i.priceLineSource);n.Xr||(t.Tt=!0,t.rt=n.yi,t.O=this.Es._h(n.O),t.ht=i.priceLineWidth,t.Wt=i.priceLineStyle)}}class Ti extends st{constructor(t){super(),this.$t=t}Ei(t,i,n){t.Tt=!1,i.Tt=!1;const s=this.$t;if(!s.Tt())return;const e=s.W(),r=e.lastValueVisible,h=""!==s.uh(),l=0===e.seriesLastValueMode,a=s.Yr(!1);if(a.Xr)return;r&&(t.Jt=this.dh(a,r,l),t.Tt=0!==t.Jt.length),(h||l)&&(i.Jt=this.fh(a,r,h,l),i.Tt=i.Jt.length>0);const o=s._h(a.O),_=P(o);n.t=_.t,n.yi=a.yi,i.Bt=s.qt().It(a.yi/s.At().zt()),t.Bt=o,t.O=_.i,i.O=_.i}fh(t,i,n,s){let e="";const r=this.$t.uh();return n&&0!==r.length&&(e+=`${r} `),i&&s&&(e+=this.$t.At().ph()?t.mh:t.bh),e.trim()}dh(t,i,n){return i?n?this.$t.At().ph()?t.bh:t.mh:t.Jt:""}}function Pi(t,i,n,s){const e=Number.isFinite(i),r=Number.isFinite(n);return e&&r?t(i,n):e||r?e?i:n:s}class Ri{constructor(t,i){this.wh=t,this.gh=i}Mh(t){return null!==t&&(this.wh===t.wh&&this.gh===t.gh)}xh(){return new Ri(this.wh,this.gh)}Sh(){return this.wh}kh(){return this.gh}yh(){return this.gh-this.wh}Fi(){return this.gh===this.wh||Number.isNaN(this.gh)||Number.isNaN(this.wh)}ts(t){return null===t?this:new Ri(Pi(Math.min,this.Sh(),t.Sh(),-1/0),Pi(Math.max,this.kh(),t.kh(),1/0))}Ch(t){if(!O(t))return;if(0===this.gh-this.wh)return;const i=.5*(this.gh+this.wh);let n=this.gh-i,s=this.wh-i;n*=t,s*=t,this.gh=i+n,this.wh=i+s}Th(t){O(t)&&(this.gh+=t,this.wh+=t)}Ph(){return{minValue:this.wh,maxValue:this.gh}}static Rh(t){return null===t?null:new Ri(t.minValue,t.maxValue)}}class Di{constructor(t,i){this.Dh=t,this.Oh=i||null}Ah(){return this.Dh}Vh(){return this.Oh}Ph(){return null===this.Dh?null:{priceRange:this.Dh.Ph(),margins:this.Oh||void 0}}static Rh(t){return null===t?null:new Di(Ri.Rh(t.priceRange),t.margins)}}class Oi extends li{constructor(t,i){super(t),this.Bh=i}kr(){const t=this.Mr;t.Tt=!1;const i=this.Bh.W();if(!this.Es.Tt()||!i.lineVisible)return;const n=this.Bh.Ih();null!==n&&(t.Tt=!0,t.rt=n,t.O=i.color,t.ht=i.lineWidth,t.Wt=i.lineStyle,t.wr=this.Bh.W().id)}}class Ai extends st{constructor(t,i){super(),this.Wr=t,this.Bh=i}Ei(t,i,n){t.Tt=!1,i.Tt=!1;const s=this.Bh.W(),e=s.axisLabelVisible,r=""!==s.title,h=this.Wr;if(!e||!h.Tt())return;const l=this.Bh.Ih();if(null===l)return;r&&(i.Jt=s.title,i.Tt=!0),i.Bt=h.qt().It(l/h.At().zt()),t.Jt=this.zh(s.price),t.Tt=!0;const a=P(s.axisLabelColor||s.color);n.t=a.t;const o=s.axisLabelTextColor||a.i;t.O=o,i.O=o,n.yi=l}zh(t){const i=this.Wr.Pt();return null===i?"":this.Wr.At().Wi(t,i.Vt)}}class Vi{constructor(t,i){this.Wr=t,this.cn=i,this.Eh=new Oi(t,this),this._r=new Ai(t,this),this.Lh=new ri(this._r,t,t.qt())}Nh(t){D(this.cn,t),this.gt(),this.Wr.qt().Fh()}W(){return this.cn}Wh(){return this.Eh}jh(){return this.Lh}Hh(){return this._r}gt(){this.Eh.gt(),this._r.gt()}Ih(){const t=this.Wr,i=t.At();if(t.qt().yt().Fi()||i.Fi())return null;const n=t.Pt();return null===n?null:i.Ot(this.cn.price,n.Vt)}}class Bi extends at{constructor(t){super(),this.Ui=t}qt(){return this.Ui}}const Ii={Bar:(t,i,n,s)=>{var e;const r=i.upColor,h=i.downColor,l=b(t(n,s)),a=w(l.Vt[0])<=w(l.Vt[3]);return{ue:null!==(e=l.O)&&void 0!==e?e:a?r:h}},Candlestick:(t,i,n,s)=>{var e,r,h;const l=i.upColor,a=i.downColor,o=i.borderUpColor,_=i.borderDownColor,u=i.wickUpColor,c=i.wickDownColor,d=b(t(n,s)),f=w(d.Vt[0])<=w(d.Vt[3]);return{ue:null!==(e=d.O)&&void 0!==e?e:f?l:a,Le:null!==(r=d.Bt)&&void 0!==r?r:f?o:_,Ee:null!==(h=d.$h)&&void 0!==h?h:f?u:c}},Custom:(t,i,n,s)=>{var e;return{ue:null!==(e=b(t(n,s)).O)&&void 0!==e?e:i.color}},Area:(t,i,n,s)=>{var e,r,h,l;const a=b(t(n,s));return{ue:null!==(e=a._t)&&void 0!==e?e:i.lineColor,_t:null!==(r=a._t)&&void 0!==r?r:i.lineColor,Ts:null!==(h=a.Ts)&&void 0!==h?h:i.topColor,Ps:null!==(l=a.Ps)&&void 0!==l?l:i.bottomColor}},Baseline:(t,i,n,s)=>{var e,r,h,l,a,o;const _=b(t(n,s));return{ue:_.Vt[3]>=i.baseValue.price?i.topLineColor:i.bottomLineColor,Pe:null!==(e=_.Pe)&&void 0!==e?e:i.topLineColor,Re:null!==(r=_.Re)&&void 0!==r?r:i.bottomLineColor,Se:null!==(h=_.Se)&&void 0!==h?h:i.topFillColor1,ke:null!==(l=_.ke)&&void 0!==l?l:i.topFillColor2,ye:null!==(a=_.ye)&&void 0!==a?a:i.bottomFillColor1,Ce:null!==(o=_.Ce)&&void 0!==o?o:i.bottomFillColor2}},Line:(t,i,n,s)=>{var e,r;const h=b(t(n,s));return{ue:null!==(e=h.O)&&void 0!==e?e:i.color,_t:null!==(r=h.O)&&void 0!==r?r:i.color}},Histogram:(t,i,n,s)=>{var e;return{ue:null!==(e=b(t(n,s)).O)&&void 0!==e?e:i.color}}};class zi{constructor(t){this.Uh=(t,i)=>void 0!==i?i.Vt:this.Wr.In().qh(t),this.Wr=t,this.Yh=Ii[t.Xh()]}Hs(t,i){return this.Yh(this.Uh,this.Wr.W(),t,i)}}var Ei;!function(t){t[t.NearestLeft=-1]="NearestLeft",t[t.None=0]="None",t[t.NearestRight=1]="NearestRight"}(Ei||(Ei={}));const Li=30;class Ni{constructor(){this.Kh=[],this.Zh=new Map,this.Gh=new Map}Jh(){return this.Ks()>0?this.Kh[this.Kh.length-1]:null}Qh(){return this.Ks()>0?this.tl(0):null}Bn(){return this.Ks()>0?this.tl(this.Kh.length-1):null}Ks(){return this.Kh.length}Fi(){return 0===this.Ks()}Kr(t){return null!==this.il(t,0)}qh(t){return this.nl(t)}nl(t,i=0){const n=this.il(t,i);return null===n?null:Object.assign(Object.assign({},this.sl(n)),{se:this.tl(n)})}ie(){return this.Kh}el(t,i,n){if(this.Fi())return null;let s=null;for(const e of n){s=Fi(s,this.rl(t,i,e))}return s}it(t){this.Gh.clear(),this.Zh.clear(),this.Kh=t}tl(t){return this.Kh[t].se}sl(t){return this.Kh[t]}il(t,i){const n=this.hl(t);if(null===n&&0!==i)switch(i){case-1:return this.ll(t);case 1:return this.al(t);default:throw new TypeError("Unknown search mode")}return n}ll(t){let i=this.ol(t);return i>0&&(i-=1),i!==this.Kh.length&&this.tl(i)t.set.se>i))}ul(t,i,n){let s=null;for(let e=t;es.dl&&(s.dl=t)))}return s}rl(t,i,n){if(this.Fi())return null;let s=null;const e=b(this.Qh()),r=b(this.Bn()),h=Math.max(t,e),l=Math.min(i,r),a=Math.ceil(h/Li)*Li,o=Math.max(a,Math.floor(l/Li)*Li);{const t=this.ol(h),e=this._l(Math.min(l,a,i));s=Fi(s,this.ul(t,e,n))}let _=this.Zh.get(n);void 0===_&&(_=new Map,this.Zh.set(n,_));for(let t=Math.max(a+1,h);tnew ji(t)));return this.gl={vl:e,pl:r},r}tn(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.yl).timeAxisViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.Ml)||void 0===s?void 0:s.vl)===e)return this.Ml.pl;const r=this.Wr.qt().yt(),h=e.map((t=>new $i(t,r)));return this.Ml={vl:e,pl:h},h}Rn(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.yl).priceAxisViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.xl)||void 0===s?void 0:s.vl)===e)return this.xl.pl;const r=this.Wr.At(),h=e.map((t=>new Ui(t,r)));return this.xl={vl:e,pl:h},h}Tl(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.yl).priceAxisPaneViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.Sl)||void 0===s?void 0:s.vl)===e)return this.Sl.pl;const r=e.map((t=>new ji(t)));return this.Sl={vl:e,pl:r},r}Pl(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.yl).timeAxisPaneViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.kl)||void 0===s?void 0:s.vl)===e)return this.kl.pl;const r=e.map((t=>new ji(t)));return this.kl={vl:e,pl:r},r}Rl(t,i){var n,s,e;return null!==(e=null===(s=(n=this.yl).autoscaleInfo)||void 0===s?void 0:s.call(n,t,i))&&void 0!==e?e:null}br(t,i){var n,s,e;return null!==(e=null===(s=(n=this.yl).hitTest)||void 0===s?void 0:s.call(n,t,i))&&void 0!==e?e:null}}function Yi(t,i,n,s){t.forEach((t=>{i(t).forEach((t=>{t.ml()===n&&s.push(t)}))}))}function Xi(t){return t.Pn()}function Ki(t){return t.Tl()}function Zi(t){return t.Pl()}class Gi extends Bi{constructor(t,i,n,s,e){super(t),this.Lt=new Ni,this.Eh=new Ci(this),this.Dl=[],this.Ol=new ai(this),this.Al=null,this.Vl=null,this.Bl=[],this.Il=[],this.zl=null,this.El=[],this.cn=i,this.Ll=n;const r=new Ti(this);this.hn=[r],this.Lh=new ri(r,this,t),"Area"!==n&&"Line"!==n&&"Baseline"!==n||(this.Al=new di(this)),this.Nl(),this.Fl(e)}S(){null!==this.zl&&clearTimeout(this.zl)}_h(t){return this.cn.priceLineColor||t}Yr(t){const i={Xr:!0},n=this.At();if(this.qt().yt().Fi()||n.Fi()||this.Lt.Fi())return i;const s=this.qt().yt().Xs(),e=this.Pt();if(null===s||null===e)return i;let r,h;if(t){const t=this.Lt.Jh();if(null===t)return i;r=t,h=t.se}else{const t=this.Lt.nl(s.di(),-1);if(null===t)return i;if(r=this.Lt.qh(t.se),null===r)return i;h=t.se}const l=r.Vt[3],a=this.$s().Hs(h,{Vt:r}),o=n.Ot(l,e.Vt);return{Xr:!1,ct:l,Jt:n.Wi(l,e.Vt),mh:n.Wl(l),bh:n.jl(l,e.Vt),O:a.ue,yi:o,se:h}}$s(){return null!==this.Vl||(this.Vl=new zi(this)),this.Vl}W(){return this.cn}Nh(t){const i=t.priceScaleId;void 0!==i&&i!==this.cn.priceScaleId&&this.qt().Hl(this,i),D(this.cn,t),void 0!==t.priceFormat&&(this.Nl(),this.qt().$l()),this.qt().Ul(this),this.qt().ql(),this.wn.gt("options")}it(t,i){this.Lt.it(t),this.Yl(),this.wn.gt("data"),this.dn.gt("data"),null!==this.Al&&(i&&i.Xl?this.Al.Hr():0===t.length&&this.Al.jr());const n=this.qt().cr(this);this.qt().Kl(n),this.qt().Ul(this),this.qt().ql(),this.qt().Fh()}Zl(t){this.Bl=t,this.Yl();const i=this.qt().cr(this);this.dn.gt("data"),this.qt().Kl(i),this.qt().Ul(this),this.qt().ql(),this.qt().Fh()}Gl(){return this.Bl}ah(){return this.Il}Jl(t){const i=new Vi(this,t);return this.Dl.push(i),this.qt().Ul(this),i}Ql(t){const i=this.Dl.indexOf(t);-1!==i&&this.Dl.splice(i,1),this.qt().Ul(this)}Xh(){return this.Ll}Pt(){const t=this.ta();return null===t?null:{Vt:t.Vt[3],ia:t.ut}}ta(){const t=this.qt().yt().Xs();if(null===t)return null;const i=t.Os();return this.Lt.nl(i,1)}In(){return this.Lt}oh(t){const i=this.Lt.qh(t);return null===i?null:"Bar"===this.Ll||"Candlestick"===this.Ll||"Custom"===this.Ll?{we:i.Vt[0],ge:i.Vt[1],Me:i.Vt[2],xe:i.Vt[3]}:i.Vt[3]}na(t){const i=[];Yi(this.El,Xi,"top",i);const n=this.Al;return null!==n&&n.Tt()?(null===this.zl&&n.Ur()&&(this.zl=setTimeout((()=>{this.zl=null,this.qt().sa()}),0)),n.$r(),i.push(n),i):i}Pn(){const t=[];this.ea()||t.push(this.Ol),t.push(this.wn,this.Eh,this.dn);const i=this.Dl.map((t=>t.Wh()));return t.push(...i),Yi(this.El,Xi,"normal",t),t}ra(){return this.ha(Xi,"bottom")}la(t){return this.ha(Ki,t)}aa(t){return this.ha(Zi,t)}oa(t,i){return this.El.map((n=>n.br(t,i))).filter((t=>null!==t))}Qi(t){return[this.Lh,...this.Dl.map((t=>t.jh()))]}Rn(t,i){if(i!==this.Xi&&!this.ea())return[];const n=[...this.hn];for(const t of this.Dl)n.push(t.Hh());return this.El.forEach((t=>{n.push(...t.Rn())})),n}tn(){const t=[];return this.El.forEach((i=>{t.push(...i.tn())})),t}Rl(t,i){if(void 0!==this.cn.autoscaleInfoProvider){const n=this.cn.autoscaleInfoProvider((()=>{const n=this._a(t,i);return null===n?null:n.Ph()}));return Di.Rh(n)}return this._a(t,i)}ua(){return this.cn.priceFormat.minMove}ca(){return this.da}On(){var t;this.wn.gt(),this.dn.gt();for(const t of this.hn)t.gt();for(const t of this.Dl)t.gt();this.Eh.gt(),this.Ol.gt(),null===(t=this.Al)||void 0===t||t.gt(),this.El.forEach((t=>t.On()))}At(){return b(super.At())}Ct(t){if(!(("Line"===this.Ll||"Area"===this.Ll||"Baseline"===this.Ll)&&this.cn.crosshairMarkerVisible))return null;const i=this.Lt.qh(t);if(null===i)return null;return{ct:i.Vt[3],ot:this.fa(),Bt:this.va(),Dt:this.pa(),Rt:this.ma(t)}}uh(){return this.cn.title}Tt(){return this.cn.visible}ba(t){this.El.push(new qi(t,this))}wa(t){this.El=this.El.filter((i=>i.Cl()!==t))}ga(){if(this.wn instanceof Gt!=!1)return t=>this.wn.Fe(t)}Ma(){if(this.wn instanceof Gt!=!1)return t=>this.wn.We(t)}ea(){return!ut(this.At().xa())}_a(t,i){if(!A(t)||!A(i)||this.Lt.Fi())return null;const n="Line"===this.Ll||"Area"===this.Ll||"Baseline"===this.Ll||"Histogram"===this.Ll?[3]:[2,1],s=this.Lt.el(t,i,n);let e=null!==s?new Ri(s.cl,s.dl):null;if("Histogram"===this.Xh()){const t=this.cn.base,i=new Ri(t,t);e=null!==e?e.ts(i):i}let r=this.dn.lh();return this.El.forEach((n=>{const s=n.Rl(t,i);if(null==s?void 0:s.priceRange){const t=new Ri(s.priceRange.minValue,s.priceRange.maxValue);e=null!==e?e.ts(t):t}var h,l,a,o;(null==s?void 0:s.margins)&&(h=r,l=s.margins,r={above:Math.max(null!==(a=null==h?void 0:h.above)&&void 0!==a?a:0,l.above),below:Math.max(null!==(o=null==h?void 0:h.below)&&void 0!==o?o:0,l.below)})})),new Di(e,r)}fa(){switch(this.Ll){case"Line":case"Area":case"Baseline":return this.cn.crosshairMarkerRadius}return 0}va(){switch(this.Ll){case"Line":case"Area":case"Baseline":{const t=this.cn.crosshairMarkerBorderColor;if(0!==t.length)return t}}return null}pa(){switch(this.Ll){case"Line":case"Area":case"Baseline":return this.cn.crosshairMarkerBorderWidth}return 0}ma(t){switch(this.Ll){case"Line":case"Area":case"Baseline":{const t=this.cn.crosshairMarkerBackgroundColor;if(0!==t.length)return t}}return this.$s().Hs(t).ue}Nl(){switch(this.cn.priceFormat.type){case"custom":this.da={format:this.cn.priceFormat.formatter};break;case"volume":this.da=new mt(this.cn.priceFormat.precision);break;case"percent":this.da=new pt(this.cn.priceFormat.precision);break;default:{const t=Math.pow(10,this.cn.priceFormat.precision);this.da=new vt(t,this.cn.priceFormat.minMove*t)}}null!==this.Xi&&this.Xi.Sa()}Yl(){const t=this.qt().yt();if(!t.ka()||this.Lt.Fi())return void(this.Il=[]);const i=b(this.Lt.Qh());this.Il=this.Bl.map(((n,s)=>{const e=b(t.ya(n.time,!0)),r=et instanceof Gi)).reduce(((t,s)=>{if(n.dr(s)||!s.Tt())return t;const e=s.At(),r=s.In();if(e.Fi()||!r.Kr(i))return t;const h=r.qh(i);if(null===h)return t;const l=w(s.Pt());return t.concat([e.Ot(h.Vt[3],l.Vt)])}),[]);if(0===l.length)return s;l.sort(((t,i)=>Math.abs(t-h)-Math.abs(i-h)));const a=l[0];return s=e.pn(a,r),s}}class Qi extends Y{constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;const e=Math.max(1,Math.floor(n));t.lineWidth=e,function(t,i){t.save(),t.lineWidth%2&&t.translate(.5,.5),i(),t.restore()}(t,(()=>{const r=b(this.Lt);if(r.Pa){t.strokeStyle=r.Ra,f(t,r.Da),t.beginPath();for(const s of r.Oa){const r=Math.round(s.Aa*n);t.moveTo(r,-e),t.lineTo(r,i.height+e)}t.stroke()}if(r.Va){t.strokeStyle=r.Ba,f(t,r.Ia),t.beginPath();for(const n of r.za){const r=Math.round(n.Aa*s);t.moveTo(-e,r),t.lineTo(i.width+e,r)}t.stroke()}}))}}class tn{constructor(t){this.Ht=new Qi,this.bt=!0,this.nn=t}gt(){this.bt=!0}xt(){if(this.bt){const t=this.nn.qt().W().grid,i={Va:t.horzLines.visible,Pa:t.vertLines.visible,Ba:t.horzLines.color,Ra:t.vertLines.color,Ia:t.horzLines.style,Da:t.vertLines.style,za:this.nn.vn().Ea(),Oa:(this.nn.qt().yt().Ea()||[]).map((t=>({Aa:t.coord})))};this.Ht.it(i),this.bt=!1}return this.Ht}}class nn{constructor(t){this.wn=new tn(t)}Wh(){return this.wn}}const sn={La:4,Na:1e-4};function en(t,i){const n=100*(t-i)/i;return i<0?-n:n}function rn(t,i){const n=en(t.Sh(),i),s=en(t.kh(),i);return new Ri(n,s)}function hn(t,i){const n=100*(t-i)/i+100;return i<0?-n:n}function ln(t,i){const n=hn(t.Sh(),i),s=hn(t.kh(),i);return new Ri(n,s)}function an(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.log10(n+i.Na)+i.La;return t<0?-s:s}function on(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.pow(10,n-i.La)-i.Na;return t<0?-s:s}function _n(t,i){if(null===t)return null;const n=an(t.Sh(),i),s=an(t.kh(),i);return new Ri(n,s)}function un(t,i){if(null===t)return null;const n=on(t.Sh(),i),s=on(t.kh(),i);return new Ri(n,s)}function cn(t){if(null===t)return sn;const i=Math.abs(t.kh()-t.Sh());if(i>=1||i<1e-15)return sn;const n=Math.ceil(Math.abs(Math.log10(i))),s=sn.La+n;return{La:s,Na:1/Math.pow(10,s)}}class dn{constructor(t,i){if(this.Fa=t,this.Wa=i,function(t){if(t<0)return!1;for(let i=t;i>1;i/=10)if(i%10!=0)return!1;return!0}(this.Fa))this.ja=[2,2.5,2];else{this.ja=[];for(let t=this.Fa;1!==t;){if(t%2==0)this.ja.push(2),t/=2;else{if(t%5!=0)throw new Error("unexpected base");this.ja.push(2,2.5),t/=5}if(this.ja.length>100)throw new Error("something wrong with base")}}}Ha(t,i,n){const s=0===this.Fa?0:1/this.Fa;let e=Math.pow(10,Math.max(0,Math.ceil(Math.log10(t-i)))),r=0,h=this.Wa[0];for(;;){const t=Ct(e,s,1e-14)&&e>s+1e-14,i=Ct(e,n*h,1e-14),l=Ct(e,1,1e-14);if(!(t&&i&&l))break;e/=h,h=this.Wa[++r%this.Wa.length]}if(e<=s+1e-14&&(e=s),e=Math.max(1,e),this.ja.length>0&&(l=e,a=1,o=1e-14,Math.abs(l-a)s+1e-14;)e/=h,h=this.ja[++r%this.ja.length];var l,a,o;return e}}class fn{constructor(t,i,n,s){this.$a=[],this.Li=t,this.Fa=i,this.Ua=n,this.qa=s}Ha(t,i){if(t=o?1:-1;let d=null,f=0;for(let n=a-u;n>o;n-=_){const s=this.qa(n,i,!0);null!==d&&Math.abs(s-d)l||(fb(t.Zi())-b(i.Zi())))}var pn;!function(t){t[t.Normal=0]="Normal",t[t.Logarithmic=1]="Logarithmic",t[t.Percentage=2]="Percentage",t[t.IndexedTo100=3]="IndexedTo100"}(pn||(pn={}));const mn=new pt,bn=new vt(100,1);class wn{constructor(t,i,n,s){this.Qa=0,this.io=null,this.Dh=null,this.no=null,this.so={eo:!1,ro:null},this.ho=0,this.lo=0,this.ao=new R,this.oo=new R,this._o=[],this.uo=null,this.co=null,this.do=null,this.fo=null,this.da=bn,this.vo=cn(null),this.po=t,this.cn=i,this.mo=n,this.bo=s,this.wo=new fn(this,100,this.Mo.bind(this),this.xo.bind(this))}xa(){return this.po}W(){return this.cn}Nh(t){if(D(this.cn,t),this.Sa(),void 0!==t.mode&&this.So({yr:t.mode}),void 0!==t.scaleMargins){const i=m(t.scaleMargins.top),n=m(t.scaleMargins.bottom);if(i<0||i>1)throw new Error(`Invalid top margin - expect value between 0 and 1, given=${i}`);if(n<0||n>1||i+n>1)throw new Error(`Invalid bottom margin - expect value between 0 and 1, given=${n}`);if(i+n>1)throw new Error(`Invalid margins - sum of margins must be less than 1, given=${i+n}`);this.ko(),this.co=null}}yo(){return this.cn.autoScale}Ja(){return 1===this.cn.mode}ph(){return 2===this.cn.mode}Co(){return 3===this.cn.mode}yr(){return{Wn:this.cn.autoScale,To:this.cn.invertScale,yr:this.cn.mode}}So(t){const i=this.yr();let n=null;void 0!==t.Wn&&(this.cn.autoScale=t.Wn),void 0!==t.yr&&(this.cn.mode=t.yr,2!==t.yr&&3!==t.yr||(this.cn.autoScale=!0),this.so.eo=!1),1===i.yr&&t.yr!==i.yr&&(!function(t,i){if(null===t)return!1;const n=on(t.Sh(),i),s=on(t.kh(),i);return isFinite(n)&&isFinite(s)}(this.Dh,this.vo)?this.cn.autoScale=!0:(n=un(this.Dh,this.vo),null!==n&&this.Po(n))),1===t.yr&&t.yr!==i.yr&&(n=_n(this.Dh,this.vo),null!==n&&this.Po(n));const s=i.yr!==this.cn.mode;s&&(2===i.yr||this.ph())&&this.Sa(),s&&(3===i.yr||this.Co())&&this.Sa(),void 0!==t.To&&i.To!==t.To&&(this.cn.invertScale=t.To,this.Ro()),this.oo.m(i,this.yr())}Do(){return this.oo}P(){return this.mo.fontSize}zt(){return this.Qa}Oo(t){this.Qa!==t&&(this.Qa=t,this.ko(),this.co=null)}Ao(){if(this.io)return this.io;const t=this.zt()-this.Vo()-this.Bo();return this.io=t,t}Ah(){return this.Io(),this.Dh}Po(t,i){const n=this.Dh;(i||null===n&&null!==t||null!==n&&!n.Mh(t))&&(this.co=null,this.Dh=t)}Fi(){return this.Io(),0===this.Qa||!this.Dh||this.Dh.Fi()}zo(t){return this.To()?t:this.zt()-1-t}Ot(t,i){return this.ph()?t=en(t,i):this.Co()&&(t=hn(t,i)),this.xo(t,i)}Qs(t,i,n){this.Io();const s=this.Bo(),e=b(this.Ah()),r=e.Sh(),h=e.kh(),l=this.Ao()-1,a=this.To(),o=l/(h-r),_=void 0===n?0:n.from,u=void 0===n?t.length:n.to,c=this.Eo();for(let n=_;nt.On()))}Sa(){this.co=null;const t=this.Jo();let i=100;null!==t&&(i=Math.round(1/t.ua())),this.da=bn,this.ph()?(this.da=mn,i=100):this.Co()?(this.da=new vt(100,1),i=100):null!==t&&(this.da=t.ca()),this.wo=new fn(this,i,this.Mo.bind(this),this.xo.bind(this)),this.wo.Xa()}Wo(){this.uo=null}Jo(){return this._o[0]||null}Vo(){return this.To()?this.cn.scaleMargins.bottom*this.zt()+this.lo:this.cn.scaleMargins.top*this.zt()+this.ho}Bo(){return this.To()?this.cn.scaleMargins.top*this.zt()+this.ho:this.cn.scaleMargins.bottom*this.zt()+this.lo}Io(){this.so.eo||(this.so.eo=!0,this.i_())}ko(){this.io=null}xo(t,i){if(this.Io(),this.Fi())return 0;t=this.Ja()&&t?an(t,this.vo):t;const n=b(this.Ah()),s=this.Bo()+(this.Ao()-1)*(t-n.Sh())/n.yh();return this.zo(s)}Mo(t,i){if(this.Io(),this.Fi())return 0;const n=this.zo(t),s=b(this.Ah()),e=s.Sh()+s.yh()*((n-this.Bo())/(this.Ao()-1));return this.Ja()?on(e,this.vo):e}Ro(){this.co=null,this.wo.Xa()}i_(){const t=this.so.ro;if(null===t)return;let i=null;const n=this.Qo();let s=0,e=0;for(const r of n){if(!r.Tt())continue;const n=r.Pt();if(null===n)continue;const h=r.Rl(t.Os(),t.di());let l=h&&h.Ah();if(null!==l){switch(this.cn.mode){case 1:l=_n(l,this.vo);break;case 2:l=rn(l,n.Vt);break;case 3:l=ln(l,n.Vt)}if(i=null===i?l:i.ts(b(l)),null!==h){const t=h.Vh();null!==t&&(s=Math.max(s,t.above),e=Math.max(s,t.below))}}}if(s===this.ho&&e===this.lo||(this.ho=s,this.lo=e,this.co=null,this.ko()),null!==i){if(i.Sh()===i.kh()){const t=this.Jo(),n=5*(null===t||this.ph()||this.Co()?1:t.ua());this.Ja()&&(i=un(i,this.vo)),i=new Ri(i.Sh()-n,i.kh()+n),this.Ja()&&(i=_n(i,this.vo))}if(this.Ja()){const t=un(i,this.vo),n=cn(t);if(r=n,h=this.vo,r.La!==h.La||r.Na!==h.Na){const s=null!==this.no?un(this.no,this.vo):null;this.vo=n,i=_n(t,n),null!==s&&(this.no=_n(s,n))}}this.Po(i)}else null===this.Dh&&(this.Po(new Ri(-.5,.5)),this.vo=cn(null));var r,h;this.so.eo=!0}Eo(){return this.ph()?en:this.Co()?hn:this.Ja()?t=>an(t,this.vo):null}n_(t,i,n){return void 0===i?(void 0===n&&(n=this.ca()),n.format(t)):i(t)}zh(t,i){return this.n_(t,this.bo.priceFormatter,i)}Go(t,i){return this.n_(t,this.bo.percentageFormatter,i)}}class gn{constructor(t,i){this._o=[],this.s_=new Map,this.Qa=0,this.e_=0,this.r_=1e3,this.uo=null,this.h_=new R,this.wl=t,this.Ui=i,this.l_=new nn(this);const n=i.W();this.a_=this.o_("left",n.leftPriceScale),this.__=this.o_("right",n.rightPriceScale),this.a_.Do().l(this.u_.bind(this,this.a_),this),this.__.Do().l(this.u_.bind(this,this.__),this),this.c_(n)}c_(t){if(t.leftPriceScale&&this.a_.Nh(t.leftPriceScale),t.rightPriceScale&&this.__.Nh(t.rightPriceScale),t.localization&&(this.a_.Sa(),this.__.Sa()),t.overlayPriceScales){const i=Array.from(this.s_.values());for(const n of i){const i=b(n[0].At());i.Nh(t.overlayPriceScales),t.localization&&i.Sa()}}}d_(t){switch(t){case"left":return this.a_;case"right":return this.__}return this.s_.has(t)?m(this.s_.get(t))[0].At():null}S(){this.qt().f_().p(this),this.a_.Do().p(this),this.__.Do().p(this),this._o.forEach((t=>{t.S&&t.S()})),this.h_.m()}v_(){return this.r_}p_(t){this.r_=t}qt(){return this.Ui}$i(){return this.e_}zt(){return this.Qa}m_(t){this.e_=t,this.b_()}Oo(t){this.Qa=t,this.a_.Oo(t),this.__.Oo(t),this._o.forEach((i=>{if(this.dr(i)){const n=i.At();null!==n&&n.Oo(t)}})),this.b_()}Ta(){return this._o}dr(t){const i=t.At();return null===i||this.a_!==i&&this.__!==i}Fo(t,i,n){const s=void 0!==n?n:this.g_().w_+1;this.M_(t,i,s)}jo(t){const i=this._o.indexOf(t);p(-1!==i,"removeDataSource: invalid data source"),this._o.splice(i,1);const n=b(t.At()).xa();if(this.s_.has(n)){const i=m(this.s_.get(n)),s=i.indexOf(t);-1!==s&&(i.splice(s,1),0===i.length&&this.s_.delete(n))}const s=t.At();s&&s.Ta().indexOf(t)>=0&&s.jo(t),null!==s&&(s.Wo(),this.x_(s)),this.uo=null}pr(t){return t===this.a_?"left":t===this.__?"right":"overlay"}S_(){return this.a_}k_(){return this.__}y_(t,i){t.Uo(i)}C_(t,i){t.qo(i),this.b_()}T_(t){t.Yo()}P_(t,i){t.Xo(i)}R_(t,i){t.Ko(i),this.b_()}D_(t){t.Zo()}b_(){this._o.forEach((t=>{t.On()}))}vn(){let t=null;return this.Ui.W().rightPriceScale.visible&&0!==this.__.Ta().length?t=this.__:this.Ui.W().leftPriceScale.visible&&0!==this.a_.Ta().length?t=this.a_:0!==this._o.length&&(t=this._o[0].At()),null===t&&(t=this.__),t}vr(){let t=null;return this.Ui.W().rightPriceScale.visible?t=this.__:this.Ui.W().leftPriceScale.visible&&(t=this.a_),t}x_(t){null!==t&&t.yo()&&this.O_(t)}A_(t){const i=this.wl.Xs();t.So({Wn:!0}),null!==i&&t.t_(i),this.b_()}V_(){this.O_(this.a_),this.O_(this.__)}B_(){this.x_(this.a_),this.x_(this.__),this._o.forEach((t=>{this.dr(t)&&this.x_(t.At())})),this.b_(),this.Ui.Fh()}No(){return null===this.uo&&(this.uo=vn(this._o)),this.uo}I_(){return this.h_}z_(){return this.l_}O_(t){const i=t.Qo();if(i&&i.length>0&&!this.wl.Fi()){const i=this.wl.Xs();null!==i&&t.t_(i)}t.On()}g_(){const t=this.No();if(0===t.length)return{E_:0,w_:0};let i=0,n=0;for(let s=0;sn&&(n=e))}return{E_:i,w_:n}}M_(t,i,n){let s=this.d_(i);if(null===s&&(s=this.o_(i,this.Ui.W().overlayPriceScales)),this._o.push(t),!ut(i)){const n=this.s_.get(i)||[];n.push(t),this.s_.set(i,n)}s.Fo(t),t.Ji(s),t.Gi(n),this.x_(s),this.uo=null}u_(t,i,n){i.yr!==n.yr&&this.O_(t)}o_(t,i){const n=Object.assign({visible:!0,autoScale:!0},I(i)),s=new wn(t,n,this.Ui.W().layout,this.Ui.W().localization);return s.Oo(this.zt()),s}}class Mn{constructor(t,i,n=50){this.Ke=0,this.Ze=1,this.Ge=1,this.Qe=new Map,this.Je=new Map,this.L_=t,this.N_=i,this.tr=n}F_(t){const i=t.time,n=this.N_.cacheKey(i),s=this.Qe.get(n);if(void 0!==s)return s.W_;if(this.Ke===this.tr){const t=this.Je.get(this.Ge);this.Je.delete(this.Ge),this.Qe.delete(m(t)),this.Ge++,this.Ke--}const e=this.L_(t);return this.Qe.set(n,{W_:e,er:this.Ze}),this.Je.set(this.Ze,n),this.Ke++,this.Ze++,e}}class xn{constructor(t,i){p(t<=i,"right should be >= left"),this.j_=t,this.H_=i}Os(){return this.j_}di(){return this.H_}U_(){return this.H_-this.j_+1}Kr(t){return this.j_<=t&&t<=this.H_}Mh(t){return this.j_===t.Os()&&this.H_===t.di()}}function Sn(t,i){return null===t||null===i?t===i:t.Mh(i)}class kn{constructor(){this.q_=new Map,this.Qe=null,this.Y_=!1}X_(t){this.Y_=t,this.Qe=null}K_(t,i){this.Z_(i),this.Qe=null;for(let n=i;n{t<=n[0].index?i.push(s):n.splice(Bt(n,t,(i=>i.indexi-t))){if(!this.q_.get(n))continue;const s=i;i=[];const e=s.length;let r=0;const h=m(this.q_.get(n)),l=h.length;let a=1/0,o=-1/0;for(let n=0;n=t&&_-o>=t)i.push(l),o=_;else if(this.Y_)return s}for(;ri.weight?t:i}class Tn{constructor(t,i,n,s){this.e_=0,this.eu=null,this.ru=[],this.fo=null,this.do=null,this.hu=new kn,this.lu=new Map,this.au=yn.su(),this.ou=!0,this._u=new R,this.uu=new R,this.cu=new R,this.du=null,this.fu=null,this.vu=[],this.cn=i,this.bo=n,this.pu=i.rightOffset,this.mu=i.barSpacing,this.Ui=t,this.N_=s,this.bu(),this.hu.X_(i.uniformDistribution)}W(){return this.cn}wu(t){D(this.bo,t),this.gu(),this.bu()}Nh(t,i){var n;D(this.cn,t),this.cn.fixLeftEdge&&this.Mu(),this.cn.fixRightEdge&&this.xu(),void 0!==t.barSpacing&&this.Ui.Gn(t.barSpacing),void 0!==t.rightOffset&&this.Ui.Jn(t.rightOffset),void 0!==t.minBarSpacing&&this.Ui.Gn(null!==(n=t.barSpacing)&&void 0!==n?n:this.mu),this.gu(),this.bu(),this.cu.m()}mn(t){var i,n;return null!==(n=null===(i=this.ru[t])||void 0===i?void 0:i.time)&&void 0!==n?n:null}qi(t){var i;return null!==(i=this.ru[t])&&void 0!==i?i:null}ya(t,i){if(this.ru.length<1)return null;if(this.N_.key(t)>this.N_.key(this.ru[this.ru.length-1].time))return i?this.ru.length-1:null;const n=Bt(this.ru,this.N_.key(t),((t,i)=>this.N_.key(t.time)0}Xs(){return this.Su(),this.au.iu()}ku(){return this.Su(),this.au.nu()}yu(){const t=this.Xs();if(null===t)return null;const i={from:t.Os(),to:t.di()};return this.Cu(i)}Cu(t){const i=Math.round(t.from),n=Math.round(t.to),s=b(this.Tu()),e=b(this.Pu());return{from:b(this.qi(Math.max(s,i))),to:b(this.qi(Math.min(e,n)))}}Ru(t){return{from:b(this.ya(t.from,!0)),to:b(this.ya(t.to,!0))}}$i(){return this.e_}m_(t){if(!isFinite(t)||t<=0)return;if(this.e_===t)return;const i=this.ku(),n=this.e_;if(this.e_=t,this.ou=!0,this.cn.lockVisibleTimeRangeOnResize&&0!==n){const i=this.mu*t/n;this.mu=i}if(this.cn.fixLeftEdge&&null!==i&&i.Os()<=0){const i=n-t;this.pu-=Math.round(i/this.mu)+1,this.ou=!0}this.Du(),this.Ou()}Et(t){if(this.Fi()||!A(t))return 0;const i=this.Au()+this.pu-t;return this.e_-(i+.5)*this.mu-1}Js(t,i){const n=this.Au(),s=void 0===i?0:i.from,e=void 0===i?t.length:i.to;for(let i=s;ii/2&&!o?n.needAlignCoordinate=!1:n.needAlignCoordinate=_&&t.index<=l||u&&t.index>=a,c++}return this.vu.length=c,this.fu=this.vu,this.vu}Fu(){this.ou=!0,this.Gn(this.cn.barSpacing),this.Jn(this.cn.rightOffset)}Wu(t){this.ou=!0,this.eu=t,this.Ou(),this.Mu()}ju(t,i){const n=this.Bu(t),s=this.he(),e=s+i*(s/10);this.Gn(e),this.cn.rightBarStaysOnScroll||this.Jn(this.Eu()+(n-this.Bu(t)))}Uo(t){this.fo&&this.Zo(),null===this.do&&null===this.du&&(this.Fi()||(this.do=t,this.Hu()))}qo(t){if(null===this.du)return;const i=yt(this.e_-t,0,this.e_),n=yt(this.e_-b(this.do),0,this.e_);0!==i&&0!==n&&this.Gn(this.du.he*i/n)}Yo(){null!==this.do&&(this.do=null,this.$u())}Xo(t){null===this.fo&&null===this.du&&(this.Fi()||(this.fo=t,this.Hu()))}Ko(t){if(null===this.fo)return;const i=(this.fo-t)/this.he();this.pu=b(this.du).Eu+i,this.ou=!0,this.Ou()}Zo(){null!==this.fo&&(this.fo=null,this.$u())}Uu(){this.qu(this.cn.rightOffset)}qu(t,i=400){if(!isFinite(t))throw new RangeError("offset is required and must be finite number");if(!isFinite(i)||i<=0)throw new RangeError("animationDuration (optional) must be finite positive number");const n=this.pu,s=performance.now();this.Ui.Xn({Yu:t=>(t-s)/i>=1,Xu:e=>{const r=(e-s)/i;return r>=1?t:n+(t-n)*r}})}gt(t,i){this.ou=!0,this.ru=t,this.hu.K_(t,i),this.Ou()}Ku(){return this._u}Zu(){return this.uu}Gu(){return this.cu}Au(){return this.eu||0}Ju(t){const i=t.U_();this.zu(this.e_/i),this.pu=t.di()-this.Au(),this.Ou(),this.ou=!0,this.Ui.Iu(),this.Ui.Fh()}Qu(){const t=this.Tu(),i=this.Pu();null!==t&&null!==i&&this.Ju(new xn(t,i+this.cn.rightOffset))}tc(t){const i=new xn(t.from,t.to);this.Ju(i)}Yi(t){return void 0!==this.bo.timeFormatter?this.bo.timeFormatter(t.originalTime):this.N_.formatHorzItem(t.time)}Lu(){const{handleScroll:t,handleScale:i}=this.Ui.W();return!(t.horzTouchDrag||t.mouseWheel||t.pressedMouseMove||t.vertTouchDrag||i.axisDoubleClickReset.time||i.axisPressedMouseMove.time||i.mouseWheel||i.pinch)}Tu(){return 0===this.ru.length?null:0}Pu(){return 0===this.ru.length?null:this.ru.length-1}ic(t){return(this.e_-1-t)/this.mu}Bu(t){const i=this.ic(t),n=this.Au()+this.pu-i;return Math.round(1e6*n)/1e6}zu(t){const i=this.mu;this.mu=t,this.Du(),i!==this.mu&&(this.ou=!0,this.nc())}Su(){if(!this.ou)return;if(this.ou=!1,this.Fi())return void this.sc(yn.su());const t=this.Au(),i=this.e_/this.mu,n=this.pu+t,s=new xn(n-i+1,n);this.sc(new yn(s))}Du(){const t=this.ec();if(this.mut&&(this.mu=t,this.ou=!0)}}ec(){return this.cn.fixLeftEdge&&this.cn.fixRightEdge&&0!==this.ru.length?this.e_/this.ru.length:this.cn.minBarSpacing}Ou(){const t=this.rc();this.pu>t&&(this.pu=t,this.ou=!0);const i=this.hc();null!==i&&this.puthis.lc(t)),this.N_),this.lu.set(t.weight,i)),i.F_(t)}lc(t){return this.N_.formatTickmark(t,this.bo)}sc(t){const i=this.au;this.au=t,Sn(i.iu(),this.au.iu())||this._u.m(),Sn(i.nu(),this.au.nu())||this.uu.m(),this.nc()}nc(){this.fu=null}gu(){this.nc(),this.lu.clear()}bu(){this.N_.updateFormatter(this.bo)}Mu(){if(!this.cn.fixLeftEdge)return;const t=this.Tu();if(null===t)return;const i=this.Xs();if(null===i)return;const n=i.Os()-t;if(n<0){const t=this.pu-n-1;this.Jn(t)}this.Du()}xu(){this.Ou(),this.Du()}}class Pn extends j{constructor(t){super(),this.ac=new Map,this.Lt=t}Z(t){}J(t){if(!this.Lt.Tt)return;const{context:i,mediaSize:n}=t;let s=0;for(const t of this.Lt.oc){if(0===t.Jt.length)continue;i.font=t.R;const e=this._c(i,t.Jt);e>n.width?t.ju=n.width/e:t.ju=1,s+=t.uc*t.ju}let e=0;switch(this.Lt.cc){case"top":e=0;break;case"center":e=Math.max((n.height-s)/2,0);break;case"bottom":e=Math.max(n.height-s,0)}i.fillStyle=this.Lt.O;for(const t of this.Lt.oc){i.save();let s=0;switch(this.Lt.dc){case"left":i.textAlign="left",s=t.uc/2;break;case"center":i.textAlign="center",s=n.width/2;break;case"right":i.textAlign="right",s=n.width-1-t.uc/2}i.translate(s,e),i.textBaseline="top",i.font=t.R,i.scale(t.ju,t.ju),i.fillText(t.Jt,0,t.fc),i.restore(),e+=t.uc*t.ju}}_c(t,i){const n=this.vc(t.font);let s=n.get(i);return void 0===s&&(s=t.measureText(i).width,n.set(i,s)),s}vc(t){let i=this.ac.get(t);return void 0===i&&(i=new Map,this.ac.set(t,i)),i}}class Rn{constructor(t){this.bt=!0,this.jt={Tt:!1,O:"",oc:[],cc:"center",dc:"center"},this.Ht=new Pn(this.jt),this.$t=t}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht}St(){const t=this.$t.W(),i=this.jt;i.Tt=t.visible,i.Tt&&(i.O=t.color,i.dc=t.horzAlign,i.cc=t.vertAlign,i.oc=[{Jt:t.text,R:N(t.fontSize,t.fontFamily,t.fontStyle),uc:1.2*t.fontSize,fc:0,ju:0}])}}class Dn extends at{constructor(t,i){super(),this.cn=i,this.wn=new Rn(this)}Rn(){return[]}Pn(){return[this.wn]}W(){return this.cn}On(){this.wn.gt()}}var On,An,Vn,Bn,In;!function(t){t[t.OnTouchEnd=0]="OnTouchEnd",t[t.OnNextTap=1]="OnNextTap"}(On||(On={}));class zn{constructor(t,i,n){this.mc=[],this.bc=[],this.e_=0,this.wc=null,this.gc=new R,this.Mc=new R,this.xc=null,this.Sc=t,this.cn=i,this.N_=n,this.kc=new F(this),this.wl=new Tn(this,i.timeScale,this.cn.localization,n),this.wt=new _t(this,i.crosshair),this.yc=new Ji(i.crosshair),this.Cc=new Dn(this,i.watermark),this.Tc(),this.mc[0].p_(2e3),this.Pc=this.Rc(0),this.Dc=this.Rc(1)}$l(){this.Oc(ct.es())}Fh(){this.Oc(ct.ss())}sa(){this.Oc(new ct(1))}Ul(t){const i=this.Ac(t);this.Oc(i)}Vc(){return this.wc}Bc(t){const i=this.wc;this.wc=t,null!==i&&this.Ul(i.Ic),null!==t&&this.Ul(t.Ic)}W(){return this.cn}Nh(t){D(this.cn,t),this.mc.forEach((i=>i.c_(t))),void 0!==t.timeScale&&this.wl.Nh(t.timeScale),void 0!==t.localization&&this.wl.wu(t.localization),(t.leftPriceScale||t.rightPriceScale)&&this.gc.m(),this.Pc=this.Rc(0),this.Dc=this.Rc(1),this.$l()}zc(t,i){if("left"===t)return void this.Nh({leftPriceScale:i});if("right"===t)return void this.Nh({rightPriceScale:i});const n=this.Ec(t);null!==n&&(n.At.Nh(i),this.gc.m())}Ec(t){for(const i of this.mc){const n=i.d_(t);if(null!==n)return{Ut:i,At:n}}return null}yt(){return this.wl}Lc(){return this.mc}Nc(){return this.Cc}Fc(){return this.wt}Wc(){return this.Mc}jc(t,i){t.Oo(i),this.Iu()}m_(t){this.e_=t,this.wl.m_(this.e_),this.mc.forEach((i=>i.m_(t))),this.Iu()}Tc(t){const i=new gn(this.wl,this);void 0!==t?this.mc.splice(t,0,i):this.mc.push(i);const n=void 0===t?this.mc.length-1:t,s=ct.es();return s.Nn(n,{Fn:0,Wn:!0}),this.Oc(s),i}y_(t,i,n){t.y_(i,n)}C_(t,i,n){t.C_(i,n),this.ql(),this.Oc(this.Hc(t,2))}T_(t,i){t.T_(i),this.Oc(this.Hc(t,2))}P_(t,i,n){i.yo()||t.P_(i,n)}R_(t,i,n){i.yo()||(t.R_(i,n),this.ql(),this.Oc(this.Hc(t,2)))}D_(t,i){i.yo()||(t.D_(i),this.Oc(this.Hc(t,2)))}A_(t,i){t.A_(i),this.Oc(this.Hc(t,2))}$c(t){this.wl.Uo(t)}Uc(t,i){const n=this.yt();if(n.Fi()||0===i)return;const s=n.$i();t=Math.max(1,Math.min(t,s)),n.ju(t,i),this.Iu()}qc(t){this.Yc(0),this.Xc(t),this.Kc()}Zc(t){this.wl.qo(t),this.Iu()}Gc(){this.wl.Yo(),this.Fh()}Yc(t){this.wl.Xo(t)}Xc(t){this.wl.Ko(t),this.Iu()}Kc(){this.wl.Zo(),this.Fh()}Mt(){return this.bc}Jc(t,i,n,s,e){this.wt.gn(t,i);let r=NaN,h=this.wl.Vu(t);const l=this.wl.Xs();null!==l&&(h=Math.min(Math.max(l.Os(),h),l.di()));const a=s.vn(),o=a.Pt();null!==o&&(r=a.pn(i,o)),r=this.yc.Ca(r,h,s),this.wt.kn(h,r,s),this.sa(),e||this.Mc.m(this.wt.kt(),{x:t,y:i},n)}Qc(t,i,n){const s=n.vn(),e=s.Pt(),r=s.Ot(t,b(e)),h=this.wl.ya(i,!0),l=this.wl.Et(b(h));this.Jc(l,r,null,n,!0)}td(t){this.Fc().Cn(),this.sa(),t||this.Mc.m(null,null,null)}ql(){const t=this.wt.Ut();if(null!==t){const i=this.wt.xn(),n=this.wt.Sn();this.Jc(i,n,null,t)}this.wt.On()}nd(t,i,n){const s=this.wl.mn(0);void 0!==i&&void 0!==n&&this.wl.gt(i,n);const e=this.wl.mn(0),r=this.wl.Au(),h=this.wl.Xs();if(null!==h&&null!==s&&null!==e){const i=h.Kr(r),l=this.N_.key(s)>this.N_.key(e),a=null!==t&&t>r&&!l,o=this.wl.W().allowShiftVisibleRangeOnWhitespaceReplacement,_=i&&(!(void 0===n)||o)&&this.wl.W().shiftVisibleRangeOnNewBar;if(a&&!_){const i=t-r;this.wl.Jn(this.wl.Eu()-i)}}this.wl.Wu(t)}Kl(t){null!==t&&t.B_()}cr(t){const i=this.mc.find((i=>i.No().includes(t)));return void 0===i?null:i}Iu(){this.Cc.On(),this.mc.forEach((t=>t.B_())),this.ql()}S(){this.mc.forEach((t=>t.S())),this.mc.length=0,this.cn.localization.priceFormatter=void 0,this.cn.localization.percentageFormatter=void 0,this.cn.localization.timeFormatter=void 0}sd(){return this.kc}mr(){return this.kc.W()}f_(){return this.gc}ed(t,i,n){const s=this.mc[0],e=this.rd(i,t,s,n);return this.bc.push(e),1===this.bc.length?this.$l():this.Fh(),e}hd(t){const i=this.cr(t),n=this.bc.indexOf(t);p(-1!==n,"Series not found"),this.bc.splice(n,1),b(i).jo(t),t.S&&t.S()}Hl(t,i){const n=b(this.cr(t));n.jo(t);const s=this.Ec(i);if(null===s){const s=t.Zi();n.Fo(t,i,s)}else{const e=s.Ut===n?t.Zi():void 0;s.Ut.Fo(t,i,e)}}Qu(){const t=ct.ss();t.$n(),this.Oc(t)}ld(t){const i=ct.ss();i.Yn(t),this.Oc(i)}Zn(){const t=ct.ss();t.Zn(),this.Oc(t)}Gn(t){const i=ct.ss();i.Gn(t),this.Oc(i)}Jn(t){const i=ct.ss();i.Jn(t),this.Oc(i)}Xn(t){const i=ct.ss();i.Xn(t),this.Oc(i)}Un(){const t=ct.ss();t.Un(),this.Oc(t)}ad(){return this.cn.rightPriceScale.visible?"right":"left"}od(){return this.Dc}q(){return this.Pc}It(t){const i=this.Dc,n=this.Pc;if(i===n)return i;if(t=Math.max(0,Math.min(100,Math.round(100*t))),null===this.xc||this.xc.Ts!==n||this.xc.Ps!==i)this.xc={Ts:n,Ps:i,_d:new Map};else{const i=this.xc._d.get(t);if(void 0!==i)return i}const s=function(t,i,n){const[s,e,r,h]=T(t),[l,a,o,_]=T(i),u=[M(s+n*(l-s)),M(e+n*(a-e)),M(r+n*(o-r)),x(h+n*(_-h))];return`rgba(${u[0]}, ${u[1]}, ${u[2]}, ${u[3]})`}(n,i,t/100);return this.xc._d.set(t,s),s}Hc(t,i){const n=new ct(i);if(null!==t){const s=this.mc.indexOf(t);n.Nn(s,{Fn:i})}return n}Ac(t,i){return void 0===i&&(i=2),this.Hc(this.cr(t),i)}Oc(t){this.Sc&&this.Sc(t),this.mc.forEach((t=>t.z_().Wh().gt()))}rd(t,i,n,s){const e=new Gi(this,t,i,n,s),r=void 0!==t.priceScaleId?t.priceScaleId:this.ad();return n.Fo(e,r),ut(r)||e.Nh(t),e}Rc(t){const i=this.cn.layout;return"gradient"===i.background.type?0===t?i.background.topColor:i.background.bottomColor:i.background.color}}function En(t){return!O(t)&&!V(t)}function Ln(t){return O(t)}!function(t){t[t.Disabled=0]="Disabled",t[t.Continuous=1]="Continuous",t[t.OnDataUpdate=2]="OnDataUpdate"}(An||(An={})),function(t){t[t.LastBar=0]="LastBar",t[t.LastVisible=1]="LastVisible"}(Vn||(Vn={})),function(t){t.Solid="solid",t.VerticalGradient="gradient"}(Bn||(Bn={})),function(t){t[t.Year=0]="Year",t[t.Month=1]="Month",t[t.DayOfMonth=2]="DayOfMonth",t[t.Time=3]="Time",t[t.TimeWithSeconds=4]="TimeWithSeconds"}(In||(In={}));const Nn=t=>t.getUTCFullYear();function Fn(t,i,n){return i.replace(/yyyy/g,(t=>ft(Nn(t),4))(t)).replace(/yy/g,(t=>ft(Nn(t)%100,2))(t)).replace(/MMMM/g,((t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"long"}))(t,n)).replace(/MMM/g,((t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"short"}))(t,n)).replace(/MM/g,(t=>ft((t=>t.getUTCMonth()+1)(t),2))(t)).replace(/dd/g,(t=>ft((t=>t.getUTCDate())(t),2))(t))}class Wn{constructor(t="yyyy-MM-dd",i="default"){this.ud=t,this.dd=i}F_(t){return Fn(t,this.ud,this.dd)}}class jn{constructor(t){this.fd=t||"%h:%m:%s"}F_(t){return this.fd.replace("%h",ft(t.getUTCHours(),2)).replace("%m",ft(t.getUTCMinutes(),2)).replace("%s",ft(t.getUTCSeconds(),2))}}const Hn={vd:"yyyy-MM-dd",pd:"%h:%m:%s",md:" ",bd:"default"};class $n{constructor(t={}){const i=Object.assign(Object.assign({},Hn),t);this.wd=new Wn(i.vd,i.bd),this.gd=new jn(i.pd),this.Md=i.md}F_(t){return`${this.wd.F_(t)}${this.Md}${this.gd.F_(t)}`}}function Un(t){return 60*t*60*1e3}function qn(t){return 60*t*1e3}const Yn=[{xd:(Xn=1,1e3*Xn),Sd:10},{xd:qn(1),Sd:20},{xd:qn(5),Sd:21},{xd:qn(30),Sd:22},{xd:Un(1),Sd:30},{xd:Un(3),Sd:31},{xd:Un(6),Sd:32},{xd:Un(12),Sd:33}];var Xn;function Kn(t,i){if(t.getUTCFullYear()!==i.getUTCFullYear())return 70;if(t.getUTCMonth()!==i.getUTCMonth())return 60;if(t.getUTCDate()!==i.getUTCDate())return 50;for(let n=Yn.length-1;n>=0;--n)if(Math.floor(i.getTime()/Yn[n].xd)!==Math.floor(t.getTime()/Yn[n].xd))return Yn[n].Sd;return 0}function Zn(t){let i=t;if(V(t)&&(i=Jn(t)),!En(i))throw new Error("time must be of type BusinessDay");const n=new Date(Date.UTC(i.year,i.month-1,i.day,0,0,0,0));return{kd:Math.round(n.getTime()/1e3),yd:i}}function Gn(t){if(!Ln(t))throw new Error("time must be of type isUTCTimestamp");return{kd:t}}function Jn(t){const i=new Date(t);if(isNaN(i.getTime()))throw new Error(`Invalid date string=${t}, expected format=yyyy-mm-dd`);return{day:i.getUTCDate(),month:i.getUTCMonth()+1,year:i.getUTCFullYear()}}function Qn(t){V(t.time)&&(t.time=Jn(t.time))}class ts{options(){return this.cn}setOptions(t){this.cn=t,this.updateFormatter(t.localization)}preprocessData(t){Array.isArray(t)?function(t){t.forEach(Qn)}(t):Qn(t)}createConverterToInternalObj(t){return b(function(t){return 0===t.length?null:En(t[0].time)||V(t[0].time)?Zn:Gn}(t))}key(t){return"object"==typeof t&&"kd"in t?t.kd:this.key(this.convertHorzItemToInternal(t))}cacheKey(t){const i=t;return void 0===i.yd?new Date(1e3*i.kd).getTime():new Date(Date.UTC(i.yd.year,i.yd.month-1,i.yd.day)).getTime()}convertHorzItemToInternal(t){return Ln(i=t)?Gn(i):En(i)?Zn(i):Zn(Jn(i));var i}updateFormatter(t){if(!this.cn)return;const i=t.dateFormat;this.cn.timeScale.timeVisible?this.Cd=new $n({vd:i,pd:this.cn.timeScale.secondsVisible?"%h:%m:%s":"%h:%m",md:" ",bd:t.locale}):this.Cd=new Wn(i,t.locale)}formatHorzItem(t){const i=t;return this.Cd.F_(new Date(1e3*i.kd))}formatTickmark(t,i){const n=function(t,i,n){switch(t){case 0:case 10:return i?n?4:3:2;case 20:case 21:case 22:case 30:case 31:case 32:case 33:return i?3:2;case 50:return 2;case 60:return 1;case 70:return 0}}(t.weight,this.cn.timeScale.timeVisible,this.cn.timeScale.secondsVisible),s=this.cn.timeScale;if(void 0!==s.tickMarkFormatter){const e=s.tickMarkFormatter(t.originalTime,n,i.locale);if(null!==e)return e}return function(t,i,n){const s={};switch(i){case 0:s.year="numeric";break;case 1:s.month="short";break;case 2:s.day="numeric";break;case 3:s.hour12=!1,s.hour="2-digit",s.minute="2-digit";break;case 4:s.hour12=!1,s.hour="2-digit",s.minute="2-digit",s.second="2-digit"}const e=void 0===t.yd?new Date(1e3*t.kd):new Date(Date.UTC(t.yd.year,t.yd.month-1,t.yd.day));return new Date(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()).toLocaleString(n,s)}(t.time,n,i.locale)}maxTickMarkWeight(t){let i=t.reduce(Cn,t[0]).weight;return i>30&&i<50&&(i=30),i}fillWeightsForPoints(t,i){!function(t,i=0){if(0===t.length)return;let n=0===i?null:t[i-1].time.kd,s=null!==n?new Date(1e3*n):null,e=0;for(let r=i;r1){const i=Math.ceil(e/(t.length-1)),n=new Date(1e3*(t[0].time.kd-i));t[0].timeWeight=Kn(new Date(1e3*t[0].time.kd),n)}}(t,i)}static Td(t){return D({localization:{dateFormat:"dd MMM 'yy"}},null!=t?t:{})}}const is="undefined"!=typeof window;function ns(){return!!is&&window.navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function ss(){return!!is&&/iPhone|iPad|iPod/.test(window.navigator.platform)}function es(t){return t+t%2}function rs(t,i){return t.Pd-i.Pd}function hs(t,i,n){const s=(t.Pd-i.Pd)/(t.ut-i.ut);return Math.sign(s)*Math.min(Math.abs(s),n)}class ls{constructor(t,i,n,s){this.Rd=null,this.Dd=null,this.Od=null,this.Ad=null,this.Vd=null,this.Bd=0,this.Id=0,this.zd=t,this.Ed=i,this.Ld=n,this.rs=s}Nd(t,i){if(null!==this.Rd){if(this.Rd.ut===i)return void(this.Rd.Pd=t);if(Math.abs(this.Rd.Pd-t)50)return;let n=0;const s=hs(this.Rd,this.Dd,this.Ed),e=rs(this.Rd,this.Dd),r=[s],h=[e];if(n+=e,null!==this.Od){const t=hs(this.Dd,this.Od,this.Ed);if(Math.sign(t)===Math.sign(s)){const i=rs(this.Dd,this.Od);if(r.push(t),h.push(i),n+=i,null!==this.Ad){const t=hs(this.Od,this.Ad,this.Ed);if(Math.sign(t)===Math.sign(s)){const i=rs(this.Od,this.Ad);r.push(t),h.push(i),n+=i}}}}let l=0;for(let t=0;t({width:Math.max(t.width,i.width),height:Math.max(t.height,i.height)})});return e.resizeCanvasElement(n),e}function os(t,i,n,s){t.G&&t.G(i,n,s)}function _s(t,i,n,s){t.K(i,n,s)}function us(t,i,n,s){const e=t(n,s);for(const t of e){const n=t.xt();null!==n&&i(n)}}function cs(t){is&&void 0!==window.chrome&&t.addEventListener("mousedown",(t=>{if(1===t.button)return t.preventDefault(),!1}))}class ds{constructor(t,i,n){this.Wd=0,this.jd=null,this.Hd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY},this.$d=0,this.Ud=null,this.qd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY},this.Yd=null,this.Xd=!1,this.Kd=null,this.Zd=null,this.Gd=!1,this.Jd=!1,this.Qd=!1,this.tf=null,this.if=null,this.nf=null,this.sf=null,this.ef=null,this.rf=null,this.hf=null,this.lf=0,this.af=!1,this._f=!1,this.uf=!1,this.cf=0,this.df=null,this.ff=!ss(),this.vf=t=>{this.pf(t)},this.mf=t=>{if(this.bf(t)){const i=this.wf(t);if(++this.$d,this.Ud&&this.$d>1){const{gf:n}=this.Mf(ps(t),this.qd);n<30&&!this.Qd&&this.xf(i,this.kf.Sf),this.yf()}}else{const i=this.wf(t);if(++this.Wd,this.jd&&this.Wd>1){const{gf:n}=this.Mf(ps(t),this.Hd);n<5&&!this.Jd&&this.Cf(i,this.kf.Tf),this.Pf()}}},this.Rf=t,this.kf=i,this.cn=n,this.Df()}S(){null!==this.tf&&(this.tf(),this.tf=null),null!==this.if&&(this.if(),this.if=null),null!==this.sf&&(this.sf(),this.sf=null),null!==this.ef&&(this.ef(),this.ef=null),null!==this.rf&&(this.rf(),this.rf=null),null!==this.nf&&(this.nf(),this.nf=null),this.Of(),this.Pf()}Af(t){this.sf&&this.sf();const i=this.Vf.bind(this);if(this.sf=()=>{this.Rf.removeEventListener("mousemove",i)},this.Rf.addEventListener("mousemove",i),this.bf(t))return;const n=this.wf(t);this.Cf(n,this.kf.Bf),this.ff=!0}Pf(){null!==this.jd&&clearTimeout(this.jd),this.Wd=0,this.jd=null,this.Hd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY}}yf(){null!==this.Ud&&clearTimeout(this.Ud),this.$d=0,this.Ud=null,this.qd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY}}Vf(t){if(this.uf||null!==this.Zd)return;if(this.bf(t))return;const i=this.wf(t);this.Cf(i,this.kf.If),this.ff=!0}zf(t){const i=bs(t.changedTouches,b(this.df));if(null===i)return;if(this.cf=ms(t),null!==this.hf)return;if(this._f)return;this.af=!0;const n=this.Mf(ps(i),b(this.Zd)),{Ef:s,Lf:e,gf:r}=n;if(this.Gd||!(r<5)){if(!this.Gd){const t=.5*s,i=e>=t&&!this.cn.Nf(),n=t>e&&!this.cn.Ff();i||n||(this._f=!0),this.Gd=!0,this.Qd=!0,this.Of(),this.yf()}if(!this._f){const n=this.wf(t,i);this.xf(n,this.kf.Wf),vs(t)}}}jf(t){if(0!==t.button)return;const i=this.Mf(ps(t),b(this.Kd)),{gf:n}=i;if(n>=5&&(this.Jd=!0,this.Pf()),this.Jd){const i=this.wf(t);this.Cf(i,this.kf.Hf)}}Mf(t,i){const n=Math.abs(i.et-t.et),s=Math.abs(i.rt-t.rt);return{Ef:n,Lf:s,gf:n+s}}$f(t){let i=bs(t.changedTouches,b(this.df));if(null===i&&0===t.touches.length&&(i=t.changedTouches[0]),null===i)return;this.df=null,this.cf=ms(t),this.Of(),this.Zd=null,this.rf&&(this.rf(),this.rf=null);const n=this.wf(t,i);if(this.xf(n,this.kf.Uf),++this.$d,this.Ud&&this.$d>1){const{gf:t}=this.Mf(ps(i),this.qd);t<30&&!this.Qd&&this.xf(n,this.kf.Sf),this.yf()}else this.Qd||(this.xf(n,this.kf.qf),this.kf.qf&&vs(t));0===this.$d&&vs(t),0===t.touches.length&&this.Xd&&(this.Xd=!1,vs(t))}pf(t){if(0!==t.button)return;const i=this.wf(t);if(this.Kd=null,this.uf=!1,this.ef&&(this.ef(),this.ef=null),ns()){this.Rf.ownerDocument.documentElement.removeEventListener("mouseleave",this.vf)}if(!this.bf(t))if(this.Cf(i,this.kf.Yf),++this.Wd,this.jd&&this.Wd>1){const{gf:n}=this.Mf(ps(t),this.Hd);n<5&&!this.Jd&&this.Cf(i,this.kf.Tf),this.Pf()}else this.Jd||this.Cf(i,this.kf.Xf)}Of(){null!==this.Yd&&(clearTimeout(this.Yd),this.Yd=null)}Kf(t){if(null!==this.df)return;const i=t.changedTouches[0];this.df=i.identifier,this.cf=ms(t);const n=this.Rf.ownerDocument.documentElement;this.Qd=!1,this.Gd=!1,this._f=!1,this.Zd=ps(i),this.rf&&(this.rf(),this.rf=null);{const i=this.zf.bind(this),s=this.$f.bind(this);this.rf=()=>{n.removeEventListener("touchmove",i),n.removeEventListener("touchend",s)},n.addEventListener("touchmove",i,{passive:!1}),n.addEventListener("touchend",s,{passive:!1}),this.Of(),this.Yd=setTimeout(this.Zf.bind(this,t),240)}const s=this.wf(t,i);this.xf(s,this.kf.Gf),this.Ud||(this.$d=0,this.Ud=setTimeout(this.yf.bind(this),500),this.qd=ps(i))}Jf(t){if(0!==t.button)return;const i=this.Rf.ownerDocument.documentElement;ns()&&i.addEventListener("mouseleave",this.vf),this.Jd=!1,this.Kd=ps(t),this.ef&&(this.ef(),this.ef=null);{const t=this.jf.bind(this),n=this.pf.bind(this);this.ef=()=>{i.removeEventListener("mousemove",t),i.removeEventListener("mouseup",n)},i.addEventListener("mousemove",t),i.addEventListener("mouseup",n)}if(this.uf=!0,this.bf(t))return;const n=this.wf(t);this.Cf(n,this.kf.Qf),this.jd||(this.Wd=0,this.jd=setTimeout(this.Pf.bind(this),500),this.Hd=ps(t))}Df(){this.Rf.addEventListener("mouseenter",this.Af.bind(this)),this.Rf.addEventListener("touchcancel",this.Of.bind(this));{const t=this.Rf.ownerDocument,i=t=>{this.kf.tv&&(t.composed&&this.Rf.contains(t.composedPath()[0])||t.target&&this.Rf.contains(t.target)||this.kf.tv())};this.if=()=>{t.removeEventListener("touchstart",i)},this.tf=()=>{t.removeEventListener("mousedown",i)},t.addEventListener("mousedown",i),t.addEventListener("touchstart",i,{passive:!0})}ss()&&(this.nf=()=>{this.Rf.removeEventListener("dblclick",this.mf)},this.Rf.addEventListener("dblclick",this.mf)),this.Rf.addEventListener("mouseleave",this.iv.bind(this)),this.Rf.addEventListener("touchstart",this.Kf.bind(this),{passive:!0}),cs(this.Rf),this.Rf.addEventListener("mousedown",this.Jf.bind(this)),this.nv(),this.Rf.addEventListener("touchmove",(()=>{}),{passive:!1})}nv(){void 0===this.kf.sv&&void 0===this.kf.ev&&void 0===this.kf.rv||(this.Rf.addEventListener("touchstart",(t=>this.hv(t.touches)),{passive:!0}),this.Rf.addEventListener("touchmove",(t=>{if(2===t.touches.length&&null!==this.hf&&void 0!==this.kf.ev){const i=fs(t.touches[0],t.touches[1])/this.lf;this.kf.ev(this.hf,i),vs(t)}}),{passive:!1}),this.Rf.addEventListener("touchend",(t=>{this.hv(t.touches)})))}hv(t){1===t.length&&(this.af=!1),2!==t.length||this.af||this.Xd?this.lv():this.av(t)}av(t){const i=this.Rf.getBoundingClientRect()||{left:0,top:0};this.hf={et:(t[0].clientX-i.left+(t[1].clientX-i.left))/2,rt:(t[0].clientY-i.top+(t[1].clientY-i.top))/2},this.lf=fs(t[0],t[1]),void 0!==this.kf.sv&&this.kf.sv(),this.Of()}lv(){null!==this.hf&&(this.hf=null,void 0!==this.kf.rv&&this.kf.rv())}iv(t){if(this.sf&&this.sf(),this.bf(t))return;if(!this.ff)return;const i=this.wf(t);this.Cf(i,this.kf.ov),this.ff=!ss()}Zf(t){const i=bs(t.touches,b(this.df));if(null===i)return;const n=this.wf(t,i);this.xf(n,this.kf._v),this.Qd=!0,this.Xd=!0}bf(t){return t.sourceCapabilities&&void 0!==t.sourceCapabilities.firesTouchEvents?t.sourceCapabilities.firesTouchEvents:ms(t){"touchstart"!==t.type&&vs(t)}}}}function fs(t,i){const n=t.clientX-i.clientX,s=t.clientY-i.clientY;return Math.sqrt(n*n+s*s)}function vs(t){t.cancelable&&t.preventDefault()}function ps(t){return{et:t.pageX,rt:t.pageY}}function ms(t){return t.timeStamp||performance.now()}function bs(t,i){for(let n=0;n{var s,e,r,h;return(null!==(e=null===(s=n.At())||void 0===s?void 0:s.xa())&&void 0!==e?e:"")!==i?[]:null!==(h=null===(r=n.la)||void 0===r?void 0:r.call(n,t))&&void 0!==h?h:[]}}class xs{constructor(i,n,s,e){this.Li=null,this.wv=null,this.gv=!1,this.Mv=new si(200),this.Gr=null,this.xv=0,this.Sv=!1,this.kv=()=>{this.Sv||this.nn.yv().qt().Fh()},this.Cv=()=>{this.Sv||this.nn.yv().qt().Fh()},this.nn=i,this.cn=n,this.mo=n.layout,this.kc=s,this.Tv="left"===e,this.Pv=Ms("normal",e),this.Rv=Ms("top",e),this.Dv=Ms("bottom",e),this.Ov=document.createElement("div"),this.Ov.style.height="100%",this.Ov.style.overflow="hidden",this.Ov.style.width="25px",this.Ov.style.left="0",this.Ov.style.position="relative",this.Av=as(this.Ov,t({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.kv);const r=this.Av.canvasElement;r.style.position="absolute",r.style.zIndex="1",r.style.left="0",r.style.top="0",this.Vv=as(this.Ov,t({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.Cv);const h=this.Vv.canvasElement;h.style.position="absolute",h.style.zIndex="2",h.style.left="0",h.style.top="0";const l={Qf:this.Bv.bind(this),Gf:this.Bv.bind(this),Hf:this.Iv.bind(this),Wf:this.Iv.bind(this),tv:this.zv.bind(this),Yf:this.Ev.bind(this),Uf:this.Ev.bind(this),Tf:this.Lv.bind(this),Sf:this.Lv.bind(this),Bf:this.Nv.bind(this),ov:this.Fv.bind(this)};this.Wv=new ds(this.Vv.canvasElement,l,{Nf:()=>!this.cn.handleScroll.vertTouchDrag,Ff:()=>!0})}S(){this.Wv.S(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Vv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.kv),this.Av.dispose(),null!==this.Li&&this.Li.$o().p(this),this.Li=null}jv(){return this.Ov}P(){return this.mo.fontSize}Hv(){const t=this.kc.W();return this.Gr!==t.R&&(this.Mv.ir(),this.Gr=t.R),t}$v(){if(null===this.Li)return 0;let t=0;const i=this.Hv(),n=b(this.Av.canvasElement.getContext("2d"));n.save();const s=this.Li.Ea();n.font=this.Uv(),s.length>0&&(t=Math.max(this.Mv.Si(n,s[0].Za),this.Mv.Si(n,s[s.length-1].Za)));const e=this.qv();for(let i=e.length;i--;){const s=this.Mv.Si(n,e[i].Jt());s>t&&(t=s)}const r=this.Li.Pt();if(null!==r&&null!==this.wv){const i=this.Li.pn(1,r),s=this.Li.pn(this.wv.height-2,r);t=Math.max(t,this.Mv.Si(n,this.Li.Wi(Math.floor(Math.min(i,s))+.11111111111111,r)),this.Mv.Si(n,this.Li.Wi(Math.ceil(Math.max(i,s))-.11111111111111,r)))}n.restore();const h=t||34;return es(Math.ceil(i.C+i.T+i.B+i.I+5+h))}Yv(t){null!==this.wv&&n(this.wv,t)||(this.wv=t,this.Sv=!0,this.Av.resizeCanvasElement(t),this.Vv.resizeCanvasElement(t),this.Sv=!1,this.Ov.style.width=`${t.width}px`,this.Ov.style.height=`${t.height}px`)}Xv(){return b(this.wv).width}Ji(t){this.Li!==t&&(null!==this.Li&&this.Li.$o().p(this),this.Li=t,t.$o().l(this.ao.bind(this),this))}At(){return this.Li}ir(){const t=this.nn.Kv();this.nn.yv().qt().A_(t,b(this.At()))}Zv(t){if(null===this.wv)return;if(1!==t){this.Gv(),this.Av.applySuggestedBitmapSize();const t=s(this.Av);null!==t&&(t.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Be(t)})),this.nn.Qv(t,this.Dv),this.tp(t),this.nn.Qv(t,this.Pv),this.ip(t))}this.Vv.applySuggestedBitmapSize();const i=s(this.Vv);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.np(i),this.nn.Qv(i,this.Rv))}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}gt(){var t;null===(t=this.Li)||void 0===t||t.Ea()}Bv(t){if(null===this.Li||this.Li.Fi()||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.yv().qt(),n=this.nn.Kv();this.gv=!0,i.y_(n,this.Li,t.localY)}Iv(t){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.yv().qt(),n=this.nn.Kv(),s=this.Li;i.C_(n,s,t.localY)}zv(){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const t=this.nn.yv().qt(),i=this.nn.Kv(),n=this.Li;this.gv&&(this.gv=!1,t.T_(i,n))}Ev(t){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.yv().qt(),n=this.nn.Kv();this.gv=!1,i.T_(n,this.Li)}Lv(t){this.cn.handleScale.axisDoubleClickReset.price&&this.ir()}Nv(t){if(null===this.Li)return;!this.nn.yv().qt().W().handleScale.axisPressedMouseMove.price||this.Li.ph()||this.Li.Co()||this.rp(1)}Fv(t){this.rp(0)}qv(){const t=[],i=null===this.Li?void 0:this.Li;return(n=>{for(let s=0;s{t.fillStyle=n.borderColor;const l=Math.max(1,Math.floor(h)),a=Math.floor(.5*h),o=Math.round(s.T*r);t.beginPath();for(const n of i)t.rect(Math.floor(e*r),Math.round(n.Aa*h)-a,o,l);t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{var r;t.font=this.Uv(),t.fillStyle=null!==(r=n.textColor)&&void 0!==r?r:this.mo.textColor,t.textAlign=this.Tv?"right":"left",t.textBaseline="middle";const h=this.Tv?Math.round(e-s.B):Math.round(e+s.T+s.B),l=i.map((i=>this.Mv.xi(t,i.Za)));for(let n=i.length;n--;){const s=i[n];t.fillText(s.Za,h,s.Aa+l[n])}}))}Gv(){if(null===this.wv||null===this.Li)return;let t=this.wv.height/2;const i=[],n=this.Li.No().slice(),s=this.nn.Kv(),e=this.Hv();this.Li===s.vr()&&this.nn.Kv().No().forEach((t=>{s.dr(t)&&n.push(t)}));const r=this.Li.Ta()[0],h=this.Li;n.forEach((n=>{const e=n.Rn(s,h);e.forEach((t=>{t.Vi(null),t.Bi()&&i.push(t)})),r===n&&e.length>0&&(t=e[0].yi())})),i.forEach((t=>t.Vi(t.yi())));this.Li.W().alignLabels&&this.hp(i,e,t)}hp(t,i,n){if(null===this.wv)return;const s=t.filter((t=>t.yi()<=n)),e=t.filter((t=>t.yi()>n));s.sort(((t,i)=>i.yi()-t.yi())),s.length&&e.length&&e.push(s[0]),e.sort(((t,i)=>t.yi()-i.yi()));for(const n of t){const t=Math.floor(n.zt(i)/2),s=n.yi();s>-t&&sthis.wv.height-t&&sl-r&&n.Vi(l-r)}for(let t=1;t{if(i.Ii()){i.xt(b(this.Li)).K(t,n,this.Mv,s)}}))}np(t){if(null===this.wv||null===this.Li)return;const i=this.nn.yv().qt(),n=[],s=this.nn.Kv(),e=i.Fc().Rn(s,this.Li);e.length&&n.push(e);const r=this.Hv(),h=this.Tv?"right":"left";n.forEach((i=>{i.forEach((i=>{i.xt(b(this.Li)).K(t,r,this.Mv,h)}))}))}rp(t){this.Ov.style.cursor=1===t?"ns-resize":"default"}ao(){const t=this.$v();this.xv{this.Sv||null===this.wp||this.Ui().Fh()},this.Cv=()=>{this.Sv||null===this.wp||this.Ui().Fh()},this.gp=i,this.wp=n,this.wp.I_().l(this.Mp.bind(this),this,!0),this.xp=document.createElement("td"),this.xp.style.padding="0",this.xp.style.position="relative";const s=document.createElement("div");s.style.width="100%",s.style.height="100%",s.style.position="relative",s.style.overflow="hidden",this.Sp=document.createElement("td"),this.Sp.style.padding="0",this.kp=document.createElement("td"),this.kp.style.padding="0",this.xp.appendChild(s),this.Av=as(s,t({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.kv);const e=this.Av.canvasElement;e.style.position="absolute",e.style.zIndex="1",e.style.left="0",e.style.top="0",this.Vv=as(s,t({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.Cv);const r=this.Vv.canvasElement;r.style.position="absolute",r.style.zIndex="2",r.style.left="0",r.style.top="0",this.yp=document.createElement("tr"),this.yp.appendChild(this.Sp),this.yp.appendChild(this.xp),this.yp.appendChild(this.kp),this.Cp(),this.Wv=new ds(this.Vv.canvasElement,this,{Nf:()=>null===this.vp&&!this.gp.W().handleScroll.vertTouchDrag,Ff:()=>null===this.vp&&!this.gp.W().handleScroll.horzTouchDrag})}S(){null!==this.lp&&this.lp.S(),null!==this.ap&&this.ap.S(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Vv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.kv),this.Av.dispose(),null!==this.wp&&this.wp.I_().p(this),this.Wv.S()}Kv(){return b(this.wp)}Tp(t){null!==this.wp&&this.wp.I_().p(this),this.wp=t,null!==this.wp&&this.wp.I_().l(Ts.prototype.Mp.bind(this),this,!0),this.Cp()}yv(){return this.gp}jv(){return this.yp}Cp(){if(null!==this.wp&&(this.Pp(),0!==this.Ui().Mt().length)){if(null!==this.lp){const t=this.wp.S_();this.lp.Ji(b(t))}if(null!==this.ap){const t=this.wp.k_();this.ap.Ji(b(t))}}}Rp(){null!==this.lp&&this.lp.gt(),null!==this.ap&&this.ap.gt()}v_(){return null!==this.wp?this.wp.v_():0}p_(t){this.wp&&this.wp.p_(t)}Bf(t){if(!this.wp)return;this.Dp();const i=t.localX,n=t.localY;this.Op(i,n,t)}Qf(t){this.Dp(),this.Ap(),this.Op(t.localX,t.localY,t)}If(t){var i;if(!this.wp)return;this.Dp();const n=t.localX,s=t.localY;this.Op(n,s,t);const e=this.br(n,s);this.gp.Vp(null!==(i=null==e?void 0:e.bv)&&void 0!==i?i:null),this.Ui().Bc(e&&{Ic:e.Ic,pv:e.pv})}Xf(t){null!==this.wp&&(this.Dp(),this.Bp(t))}Tf(t){null!==this.wp&&this.Ip(this.cp,t)}Sf(t){this.Tf(t)}Hf(t){this.Dp(),this.zp(t),this.Op(t.localX,t.localY,t)}Yf(t){null!==this.wp&&(this.Dp(),this.fp=!1,this.Ep(t))}qf(t){null!==this.wp&&this.Bp(t)}_v(t){if(this.fp=!0,null===this.vp){const i={x:t.localX,y:t.localY};this.Lp(i,i,t)}}ov(t){null!==this.wp&&(this.Dp(),this.wp.qt().Bc(null),this.Np())}Fp(){return this.up}Wp(){return this.cp}sv(){this.dp=1,this.Ui().Un()}ev(t,i){if(!this.gp.W().handleScale.pinch)return;const n=5*(i-this.dp);this.dp=i,this.Ui().Uc(t.et,n)}Gf(t){this.fp=!1,this.pp=null!==this.vp,this.Ap();const i=this.Ui().Fc();null!==this.vp&&i.Tt()&&(this.mp={x:i.Kt(),y:i.Zt()},this.vp={x:t.localX,y:t.localY})}Wf(t){if(null===this.wp)return;const i=t.localX,n=t.localY;if(null===this.vp)this.zp(t);else{this.pp=!1;const s=b(this.mp),e=s.x+(i-this.vp.x),r=s.y+(n-this.vp.y);this.Op(e,r,t)}}Uf(t){0===this.yv().W().trackingMode.exitMode&&(this.pp=!0),this.jp(),this.Ep(t)}br(t,i){const n=this.wp;return null===n?null:function(t,i,n){const s=t.No(),e=function(t,i,n){var s,e;let r,h;for(const o of t){const t=null!==(e=null===(s=o.oa)||void 0===s?void 0:s.call(o,i,n))&&void 0!==e?e:[];for(const i of t)l=i.zOrder,(!(a=null==r?void 0:r.zOrder)||"top"===l&&"top"!==a||"normal"===l&&"bottom"===a)&&(r=i,h=o)}var l,a;return r&&h?{mv:r,Ic:h}:null}(s,i,n);if("top"===(null==e?void 0:e.mv.zOrder))return ws(e);for(const r of s){if(e&&e.Ic===r&&"bottom"!==e.mv.zOrder&&!e.mv.isBackground)return ws(e);const s=gs(r.Pn(t),i,n);if(null!==s)return{Ic:r,fv:s.fv,pv:s.pv};if(e&&e.Ic===r&&"bottom"!==e.mv.zOrder&&e.mv.isBackground)return ws(e)}return(null==e?void 0:e.mv)?ws(e):null}(n,t,i)}Hp(i,n){b("left"===n?this.lp:this.ap).Yv(t({width:i,height:this.wv.height}))}$p(){return this.wv}Yv(t){n(this.wv,t)||(this.wv=t,this.Sv=!0,this.Av.resizeCanvasElement(t),this.Vv.resizeCanvasElement(t),this.Sv=!1,this.xp.style.width=t.width+"px",this.xp.style.height=t.height+"px")}Up(){const t=b(this.wp);t.x_(t.S_()),t.x_(t.k_());for(const i of t.Ta())if(t.dr(i)){const n=i.At();null!==n&&t.x_(n),i.On()}}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Zv(t){if(0===t)return;if(null===this.wp)return;if(t>1&&this.Up(),null!==this.lp&&this.lp.Zv(t),null!==this.ap&&this.ap.Zv(t),1!==t){this.Av.applySuggestedBitmapSize();const t=s(this.Av);null!==t&&(t.useBitmapCoordinateSpace((t=>{this.Jv(t)})),this.wp&&(this.qp(t,Ss),this.Yp(t),this.Xp(t),this.qp(t,ks),this.qp(t,ys)))}this.Vv.applySuggestedBitmapSize();const i=s(this.Vv);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.Kp(i),this.qp(i,Cs))}Zp(){return this.lp}Gp(){return this.ap}Qv(t,i){this.qp(t,i)}Mp(){null!==this.wp&&this.wp.I_().p(this),this.wp=null}Bp(t){this.Ip(this.up,t)}Ip(t,i){const n=i.localX,s=i.localY;t.M()&&t.m(this.Ui().yt().Vu(n),{x:n,y:s},i)}Jv({context:t,bitmapSize:i}){const{width:n,height:s}=i,e=this.Ui(),r=e.q(),h=e.od();r===h?G(t,0,0,n,s,h):it(t,0,0,n,s,r,h)}Yp(t){const i=b(this.wp).z_().Wh().xt();null!==i&&i.K(t,!1)}Xp(t){const i=this.Ui().Nc();this.Jp(t,ks,os,i),this.Jp(t,ks,_s,i)}Kp(t){this.Jp(t,ks,_s,this.Ui().Fc())}qp(t,i){const n=b(this.wp).No();for(const s of n)this.Jp(t,i,os,s);for(const s of n)this.Jp(t,i,_s,s)}Jp(t,i,n,s){const e=b(this.wp),r=e.qt().Vc(),h=null!==r&&r.Ic===s,l=null!==r&&h&&void 0!==r.pv?r.pv.gr:void 0;us(i,(i=>n(i,t,h,l)),s,e)}Pp(){if(null===this.wp)return;const t=this.gp,i=this.wp.S_().W().visible,n=this.wp.k_().W().visible;i||null===this.lp||(this.Sp.removeChild(this.lp.jv()),this.lp.S(),this.lp=null),n||null===this.ap||(this.kp.removeChild(this.ap.jv()),this.ap.S(),this.ap=null);const s=t.qt().sd();i&&null===this.lp&&(this.lp=new xs(this,t.W(),s,"left"),this.Sp.appendChild(this.lp.jv())),n&&null===this.ap&&(this.ap=new xs(this,t.W(),s,"right"),this.kp.appendChild(this.ap.jv()))}Qp(t){return t.uv&&this.fp||null!==this.vp}tm(t){return Math.max(0,Math.min(t,this.wv.width-1))}im(t){return Math.max(0,Math.min(t,this.wv.height-1))}Op(t,i,n){this.Ui().Jc(this.tm(t),this.im(i),n,b(this.wp))}Np(){this.Ui().td()}jp(){this.pp&&(this.vp=null,this.Np())}Lp(t,i,n){this.vp=t,this.pp=!1,this.Op(i.x,i.y,n);const s=this.Ui().Fc();this.mp={x:s.Kt(),y:s.Zt()}}Ui(){return this.gp.qt()}Ep(t){if(!this._p)return;const i=this.Ui(),n=this.Kv();if(i.D_(n,n.vn()),this.op=null,this._p=!1,i.Kc(),null!==this.bp){const t=performance.now(),n=i.yt();this.bp.Dr(n.Eu(),t),this.bp.Yu(t)||i.Xn(this.bp)}}Dp(){this.vp=null}Ap(){if(!this.wp)return;if(this.Ui().Un(),document.activeElement!==document.body&&document.activeElement!==document.documentElement)b(document.activeElement).blur();else{const t=document.getSelection();null!==t&&t.removeAllRanges()}!this.wp.vn().Fi()&&this.Ui().yt().Fi()}zp(t){if(null===this.wp)return;const i=this.Ui(),n=i.yt();if(n.Fi())return;const s=this.gp.W(),e=s.handleScroll,r=s.kineticScroll;if((!e.pressedMouseMove||t.uv)&&(!e.horzTouchDrag&&!e.vertTouchDrag||!t.uv))return;const h=this.wp.vn(),l=performance.now();if(null!==this.op||this.Qp(t)||(this.op={x:t.clientX,y:t.clientY,kd:l,nm:t.localX,sm:t.localY}),null!==this.op&&!this._p&&(this.op.x!==t.clientX||this.op.y!==t.clientY)){if(t.uv&&r.touch||!t.uv&&r.mouse){const t=n.he();this.bp=new ls(.2/t,7/t,.997,15/t),this.bp.Nd(n.Eu(),this.op.kd)}else this.bp=null;h.Fi()||i.P_(this.wp,h,t.localY),i.Yc(t.localX),this._p=!0}this._p&&(h.Fi()||i.R_(this.wp,h,t.localY),i.Xc(t.localX),null!==this.bp&&this.bp.Nd(n.Eu(),l))}}class Ps{constructor(i,n,s,e,r){this.bt=!0,this.wv=t({width:0,height:0}),this.kv=()=>this.Zv(3),this.Tv="left"===i,this.kc=s.sd,this.cn=n,this.rm=e,this.hm=r,this.Ov=document.createElement("div"),this.Ov.style.width="25px",this.Ov.style.height="100%",this.Ov.style.overflow="hidden",this.Av=as(this.Ov,t({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.kv)}S(){this.Av.unsubscribeSuggestedBitmapSizeChanged(this.kv),this.Av.dispose()}jv(){return this.Ov}$p(){return this.wv}Yv(t){n(this.wv,t)||(this.wv=t,this.Av.resizeCanvasElement(t),this.Ov.style.width=`${t.width}px`,this.Ov.style.height=`${t.height}px`,this.bt=!0)}Zv(t){if(t<3&&!this.bt)return;if(0===this.wv.width||0===this.wv.height)return;this.bt=!1,this.Av.applySuggestedBitmapSize();const i=s(this.Av);null!==i&&i.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Be(t)}))}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Be({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(!this.rm())return;t.fillStyle=this.cn.timeScale.borderColor;const e=Math.floor(this.kc.W().C*n),r=Math.floor(this.kc.W().C*s),h=this.Tv?i.width-e:0;t.fillRect(h,0,e,r)}Jv({context:t,bitmapSize:i}){G(t,0,0,i.width,i.height,this.hm())}}function Rs(t){return i=>{var n,s;return null!==(s=null===(n=i.aa)||void 0===n?void 0:n.call(i,t))&&void 0!==s?s:[]}}const Ds=Rs("normal"),Os=Rs("top"),As=Rs("bottom");class Vs{constructor(i,n){this.lm=null,this.am=null,this.k=null,this.om=!1,this.wv=t({width:0,height:0}),this._m=new R,this.Mv=new si(5),this.Sv=!1,this.kv=()=>{this.Sv||this.gp.qt().Fh()},this.Cv=()=>{this.Sv||this.gp.qt().Fh()},this.gp=i,this.N_=n,this.cn=i.W().layout,this.um=document.createElement("tr"),this.dm=document.createElement("td"),this.dm.style.padding="0",this.fm=document.createElement("td"),this.fm.style.padding="0",this.Ov=document.createElement("td"),this.Ov.style.height="25px",this.Ov.style.padding="0",this.vm=document.createElement("div"),this.vm.style.width="100%",this.vm.style.height="100%",this.vm.style.position="relative",this.vm.style.overflow="hidden",this.Ov.appendChild(this.vm),this.Av=as(this.vm,t({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.kv);const s=this.Av.canvasElement;s.style.position="absolute",s.style.zIndex="1",s.style.left="0",s.style.top="0",this.Vv=as(this.vm,t({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.Cv);const e=this.Vv.canvasElement;e.style.position="absolute",e.style.zIndex="2",e.style.left="0",e.style.top="0",this.um.appendChild(this.dm),this.um.appendChild(this.Ov),this.um.appendChild(this.fm),this.pm(),this.gp.qt().f_().l(this.pm.bind(this),this),this.Wv=new ds(this.Vv.canvasElement,this,{Nf:()=>!0,Ff:()=>!this.gp.W().handleScroll.horzTouchDrag})}S(){this.Wv.S(),null!==this.lm&&this.lm.S(),null!==this.am&&this.am.S(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Vv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.kv),this.Av.dispose()}jv(){return this.um}bm(){return this.lm}wm(){return this.am}Qf(t){if(this.om)return;this.om=!0;const i=this.gp.qt();!i.yt().Fi()&&this.gp.W().handleScale.axisPressedMouseMove.time&&i.$c(t.localX)}Gf(t){this.Qf(t)}tv(){const t=this.gp.qt();!t.yt().Fi()&&this.om&&(this.om=!1,this.gp.W().handleScale.axisPressedMouseMove.time&&t.Gc())}Hf(t){const i=this.gp.qt();!i.yt().Fi()&&this.gp.W().handleScale.axisPressedMouseMove.time&&i.Zc(t.localX)}Wf(t){this.Hf(t)}Yf(){this.om=!1;const t=this.gp.qt();t.yt().Fi()&&!this.gp.W().handleScale.axisPressedMouseMove.time||t.Gc()}Uf(){this.Yf()}Tf(){this.gp.W().handleScale.axisDoubleClickReset.time&&this.gp.qt().Zn()}Sf(){this.Tf()}Bf(){this.gp.qt().W().handleScale.axisPressedMouseMove.time&&this.rp(1)}ov(){this.rp(0)}$p(){return this.wv}gm(){return this._m}Mm(i,s,e){n(this.wv,i)||(this.wv=i,this.Sv=!0,this.Av.resizeCanvasElement(i),this.Vv.resizeCanvasElement(i),this.Sv=!1,this.Ov.style.width=`${i.width}px`,this.Ov.style.height=`${i.height}px`,this._m.m(i)),null!==this.lm&&this.lm.Yv(t({width:s,height:i.height})),null!==this.am&&this.am.Yv(t({width:e,height:i.height}))}xm(){const t=this.Sm();return Math.ceil(t.C+t.T+t.P+t.L+t.V+t.km)}gt(){this.gp.qt().yt().Ea()}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Zv(t){if(0===t)return;if(1!==t){this.Av.applySuggestedBitmapSize();const i=s(this.Av);null!==i&&(i.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Be(t),this.ym(i,As)})),this.tp(i),this.ym(i,Ds)),null!==this.lm&&this.lm.Zv(t),null!==this.am&&this.am.Zv(t)}this.Vv.applySuggestedBitmapSize();const i=s(this.Vv);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.Cm([...this.gp.qt().Mt(),this.gp.qt().Fc()],i),this.ym(i,Os))}ym(t,i){const n=this.gp.qt().Mt();for(const s of n)us(i,(i=>os(i,t,!1,void 0)),s,void 0);for(const s of n)us(i,(i=>_s(i,t,!1,void 0)),s,void 0)}Jv({context:t,bitmapSize:i}){G(t,0,0,i.width,i.height,this.gp.qt().od())}Be({context:t,bitmapSize:i,verticalPixelRatio:n}){if(this.gp.W().timeScale.borderVisible){t.fillStyle=this.Tm();const s=Math.max(1,Math.floor(this.Sm().C*n));t.fillRect(0,0,i.width,s)}}tp(t){const i=this.gp.qt().yt(),n=i.Ea();if(!n||0===n.length)return;const s=this.N_.maxTickMarkWeight(n),e=this.Sm(),r=i.W();r.borderVisible&&r.ticksVisible&&t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:i,verticalPixelRatio:s})=>{t.strokeStyle=this.Tm(),t.fillStyle=this.Tm();const r=Math.max(1,Math.floor(i)),h=Math.floor(.5*i);t.beginPath();const l=Math.round(e.T*s);for(let s=n.length;s--;){const e=Math.round(n[s].coord*i);t.rect(e-h,0,r,l)}t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{const i=e.C+e.T+e.L+e.P/2;t.textAlign="center",t.textBaseline="middle",t.fillStyle=this.$(),t.font=this.Uv();for(const e of n)if(e.weight=s){const n=e.needAlignCoordinate?this.Pm(t,e.coord,e.label):e.coord;t.fillText(e.label,n,i)}}))}Pm(t,i,n){const s=this.Mv.Si(t,n),e=s/2,r=Math.floor(i-e)+.5;return r<0?i+=Math.abs(0-r):r+s>this.wv.width&&(i-=Math.abs(this.wv.width-(r+s))),i}Cm(t,i){const n=this.Sm();for(const s of t)for(const t of s.tn())t.xt().K(i,n)}Tm(){return this.gp.W().timeScale.borderColor}$(){return this.cn.textColor}j(){return this.cn.fontSize}Uv(){return N(this.j(),this.cn.fontFamily)}Rm(){return N(this.j(),this.cn.fontFamily,"bold")}Sm(){null===this.k&&(this.k={C:1,N:NaN,L:NaN,V:NaN,Hi:NaN,T:5,P:NaN,R:"",ji:new si,km:0});const t=this.k,i=this.Uv();if(t.R!==i){const n=this.j();t.P=n,t.R=i,t.L=3*n/12,t.V=3*n/12,t.Hi=9*n/12,t.N=0,t.km=4*n/12,t.ji.ir()}return this.k}rp(t){this.Ov.style.cursor=1===t?"ew-resize":"default"}pm(){const t=this.gp.qt(),i=t.W();i.leftPriceScale.visible||null===this.lm||(this.dm.removeChild(this.lm.jv()),this.lm.S(),this.lm=null),i.rightPriceScale.visible||null===this.am||(this.fm.removeChild(this.am.jv()),this.am.S(),this.am=null);const n={sd:this.gp.qt().sd()},s=()=>i.leftPriceScale.borderVisible&&t.yt().W().borderVisible,e=()=>t.od();i.leftPriceScale.visible&&null===this.lm&&(this.lm=new Ps("left",i,n,s,e),this.dm.appendChild(this.lm.jv())),i.rightPriceScale.visible&&null===this.am&&(this.am=new Ps("right",i,n,s,e),this.fm.appendChild(this.am.jv()))}}const Bs=!!is&&!!navigator.userAgentData&&navigator.userAgentData.brands.some((t=>t.brand.includes("Chromium")))&&!!is&&((null===(Is=null===navigator||void 0===navigator?void 0:navigator.userAgentData)||void 0===Is?void 0:Is.platform)?"Windows"===navigator.userAgentData.platform:navigator.userAgent.toLowerCase().indexOf("win")>=0);var Is;class zs{constructor(t,i,n){var s;this.Dm=[],this.Om=0,this.Qa=0,this.e_=0,this.Am=0,this.Vm=0,this.Bm=null,this.Im=!1,this.up=new R,this.cp=new R,this.Mc=new R,this.zm=null,this.Em=null,this.Lm=t,this.cn=i,this.N_=n,this.um=document.createElement("div"),this.um.classList.add("tv-lightweight-charts"),this.um.style.overflow="hidden",this.um.style.direction="ltr",this.um.style.width="100%",this.um.style.height="100%",(s=this.um).style.userSelect="none",s.style.webkitUserSelect="none",s.style.msUserSelect="none",s.style.MozUserSelect="none",s.style.webkitTapHighlightColor="transparent",this.Nm=document.createElement("table"),this.Nm.setAttribute("cellspacing","0"),this.um.appendChild(this.Nm),this.Fm=this.Wm.bind(this),Es(this.cn)&&this.jm(!0),this.Ui=new zn(this.Sc.bind(this),this.cn,n),this.qt().Wc().l(this.Hm.bind(this),this),this.$m=new Vs(this,this.N_),this.Nm.appendChild(this.$m.jv());const e=i.autoSize&&this.Um();let r=this.cn.width,h=this.cn.height;if(e||0===r||0===h){const i=t.getBoundingClientRect();r=r||i.width,h=h||i.height}this.qm(r,h),this.Ym(),t.appendChild(this.um),this.Xm(),this.Ui.yt().Gu().l(this.Ui.$l.bind(this.Ui),this),this.Ui.f_().l(this.Ui.$l.bind(this.Ui),this)}qt(){return this.Ui}W(){return this.cn}Km(){return this.Dm}Zm(){return this.$m}S(){this.jm(!1),0!==this.Om&&window.cancelAnimationFrame(this.Om),this.Ui.Wc().p(this),this.Ui.yt().Gu().p(this),this.Ui.f_().p(this),this.Ui.S();for(const t of this.Dm)this.Nm.removeChild(t.jv()),t.Fp().p(this),t.Wp().p(this),t.S();this.Dm=[],b(this.$m).S(),null!==this.um.parentElement&&this.um.parentElement.removeChild(this.um),this.Mc.S(),this.up.S(),this.cp.S(),this.Gm()}qm(i,n,s=!1){if(this.Qa===n&&this.e_===i)return;const e=function(i){const n=Math.floor(i.width),s=Math.floor(i.height);return t({width:n-n%2,height:s-s%2})}(t({width:i,height:n}));this.Qa=e.height,this.e_=e.width;const r=this.Qa+"px",h=this.e_+"px";b(this.um).style.height=r,b(this.um).style.width=h,this.Nm.style.height=r,this.Nm.style.width=h,s?this.Jm(ct.es(),performance.now()):this.Ui.$l()}Zv(t){void 0===t&&(t=ct.es());for(let i=0;i{let s=0;for(let e=0;e{b("left"===t?this.$m.bm():this.$m.wm()).ep(b(i),n,s)};if(this.cn.timeScale.visible){const t=this.$m.sp();if(null!==i){let n=0;this.sb()&&(h("left",n,s),n=b(e.Zp()).sp().width),this.$m.ep(i,n,s),n+=t.width,this.eb()&&h("right",n,s)}s+=t.height}return t({width:n,height:s})}ob(){let i=0,n=0,s=0;for(const t of this.Dm)this.sb()&&(n=Math.max(n,b(t.Zp()).$v(),this.cn.leftPriceScale.minimumWidth)),this.eb()&&(s=Math.max(s,b(t.Gp()).$v(),this.cn.rightPriceScale.minimumWidth)),i+=t.v_();n=es(n),s=es(s);const e=this.e_,r=this.Qa,h=Math.max(e-n-s,0),l=this.cn.timeScale.visible;let a=l?Math.max(this.$m.xm(),this.cn.timeScale.minimumHeight):0;var o;a=(o=a)+o%2;const _=0+a,u=r<_?0:r-_,c=u/i;let d=0;for(let i=0;i{t.Rp()})),3===(null===(n=this.Bm)||void 0===n?void 0:n.jn())&&(this.Bm.ts(t),this.ub(),this.cb(this.Bm),this.fb(this.Bm,i),t=this.Bm,this.Bm=null)),this.Zv(t)}fb(t,i){for(const n of t.Qn())this.ns(n,i)}cb(t){const i=this.Ui.Lc();for(let n=0;n{if(this.Im=!1,this.Om=0,null!==this.Bm){const i=this.Bm;this.Bm=null,this.Jm(i,t);for(const n of i.Qn())if(5===n.qn&&!n.Vt.Yu(t)){this.qt().Xn(n.Vt);break}}})))}ub(){this.Ym()}Ym(){const t=this.Ui.Lc(),i=t.length,n=this.Dm.length;for(let t=i;t{const n=i.In().nl(t);null!==n&&e.set(i,n)}))}let r;if(null!==t){const i=null===(s=this.Ui.yt().qi(t))||void 0===s?void 0:s.originalTime;void 0!==i&&(r=i)}const h=this.qt().Vc(),l=null!==h&&h.Ic instanceof Gi?h.Ic:void 0,a=null!==h&&void 0!==h.pv?h.pv.wr:void 0;return{bb:r,se:null!=t?t:void 0,wb:null!=i?i:void 0,gb:l,Mb:e,xb:a,Sb:null!=n?n:void 0}}vb(t,i,n){this.up.m((()=>this.mb(t,i,n)))}pb(t,i,n){this.cp.m((()=>this.mb(t,i,n)))}Hm(t,i,n){this.Mc.m((()=>this.mb(t,i,n)))}Xm(){const t=this.cn.timeScale.visible?"":"none";this.$m.jv().style.display=t}sb(){return this.Dm[0].Kv().S_().W().visible}eb(){return this.Dm[0].Kv().k_().W().visible}Um(){return"ResizeObserver"in window&&(this.zm=new ResizeObserver((t=>{const i=t.find((t=>t.target===this.Lm));i&&this.qm(i.contentRect.width,i.contentRect.height)})),this.zm.observe(this.Lm,{box:"border-box"}),!0)}Gm(){null!==this.zm&&this.zm.disconnect(),this.zm=null}}function Es(t){return Boolean(t.handleScroll.mouseWheel||t.handleScale.mouseWheel)}function Ls(t,i){var n={};for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&i.indexOf(s)<0&&(n[s]=t[s]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var e=0;for(s=Object.getOwnPropertySymbols(t);efunction(t,i){return i?i(t):void 0===(n=t).open&&void 0===n.value;var n}(s,h)?qs({ut:i,se:n,bb:e},s):qs(t(i,n,s,e,r),s)}function Xs(t){return{Candlestick:Ys(Hs),Bar:Ys(js),Area:Ys(Fs),Baseline:Ys(Ws),Histogram:Ys(Ns),Line:Ys(Ns),Custom:Ys($s)}[t]}function Ks(t){return{se:0,yb:new Map,ia:t}}function Zs(t,i){if(void 0!==t&&0!==t.length)return{Cb:i.key(t[0].ut),Tb:i.key(t[t.length-1].ut)}}function Gs(t){let i;return t.forEach((t=>{void 0===i&&(i=t.bb)})),m(i)}class Js{constructor(t){this.Pb=new Map,this.Rb=new Map,this.Db=new Map,this.Ob=[],this.N_=t}S(){this.Pb.clear(),this.Rb.clear(),this.Db.clear(),this.Ob=[]}Ab(t,i){let n=0!==this.Pb.size,s=!1;const e=this.Rb.get(t);if(void 0!==e)if(1===this.Rb.size)n=!1,s=!0,this.Pb.clear();else for(const i of this.Ob)i.pointData.yb.delete(t)&&(s=!0);let r=[];if(0!==i.length){const n=i.map((t=>t.time)),e=this.N_.createConverterToInternalObj(i),h=Xs(t.Xh()),l=t.ga(),a=t.Ma();r=i.map(((i,r)=>{const o=e(i.time),_=this.N_.key(o);let u=this.Pb.get(_);void 0===u&&(u=Ks(o),this.Pb.set(_,u),s=!0);const c=h(o,u.se,i,n[r],l,a);return u.yb.set(t,c),c}))}n&&this.Vb(),this.Bb(t,r);let h=-1;if(s){const t=[];this.Pb.forEach((i=>{t.push({timeWeight:0,time:i.ia,pointData:i,originalTime:Gs(i.yb)})})),t.sort(((t,i)=>this.N_.key(t.time)-this.N_.key(i.time))),h=this.Ib(t)}return this.zb(t,h,function(t,i,n){const s=Zs(t,n),e=Zs(i,n);if(void 0!==s&&void 0!==e)return{Xl:s.Tb>=e.Tb&&s.Cb>=e.Cb}}(this.Rb.get(t),e,this.N_))}hd(t){return this.Ab(t,[])}Eb(t,i){const n=i;!function(t){void 0===t.bb&&(t.bb=t.time)}(n),this.N_.preprocessData(i);const s=this.N_.createConverterToInternalObj([i])(i.time),e=this.Db.get(t);if(void 0!==e&&this.N_.key(s)this.N_.key(t.time)this.N_.key(s.ut)?Us(i)&&n.push(i):Us(i)?n[n.length-1]=i:n.splice(-1,1),this.Db.set(t,i.ut)}Bb(t,i){0!==i.length?(this.Rb.set(t,i.filter(Us)),this.Db.set(t,i[i.length-1].ut)):(this.Rb.delete(t),this.Db.delete(t))}Vb(){for(const t of this.Ob)0===t.pointData.yb.size&&this.Pb.delete(this.N_.key(t.time))}Ib(t){let i=-1;for(let n=0;n{0!==i.length&&(t=Math.max(t,i[i.length-1].se))})),t}zb(t,i,n){const s={Fb:new Map,yt:{Au:this.Nb()}};if(-1!==i)this.Rb.forEach(((i,e)=>{s.Fb.set(e,{He:i,Wb:e===t?n:void 0})})),this.Rb.has(t)||s.Fb.set(t,{He:[],Wb:n}),s.yt.jb=this.Ob,s.yt.Hb=i;else{const i=this.Rb.get(t);s.Fb.set(t,{He:i||[],Wb:n})}return s}}function Qs(t,i){t.se=i,t.yb.forEach((t=>{t.se=i}))}function te(t){const i={value:t.Vt[3],time:t.bb};return void 0!==t.kb&&(i.customValues=t.kb),i}function ie(t){const i=te(t);return void 0!==t.O&&(i.color=t.O),i}function ne(t){const i=te(t);return void 0!==t._t&&(i.lineColor=t._t),void 0!==t.Ts&&(i.topColor=t.Ts),void 0!==t.Ps&&(i.bottomColor=t.Ps),i}function se(t){const i=te(t);return void 0!==t.Pe&&(i.topLineColor=t.Pe),void 0!==t.Re&&(i.bottomLineColor=t.Re),void 0!==t.Se&&(i.topFillColor1=t.Se),void 0!==t.ke&&(i.topFillColor2=t.ke),void 0!==t.ye&&(i.bottomFillColor1=t.ye),void 0!==t.Ce&&(i.bottomFillColor2=t.Ce),i}function ee(t){const i={open:t.Vt[0],high:t.Vt[1],low:t.Vt[2],close:t.Vt[3],time:t.bb};return void 0!==t.kb&&(i.customValues=t.kb),i}function re(t){const i=ee(t);return void 0!==t.O&&(i.color=t.O),i}function he(t){const i=ee(t),{O:n,Bt:s,$h:e}=t;return void 0!==n&&(i.color=n),void 0!==s&&(i.borderColor=s),void 0!==e&&(i.wickColor=e),i}function le(t){return{Area:ne,Line:ie,Baseline:se,Histogram:ie,Bar:re,Candlestick:he,Custom:ae}[t]}function ae(t){const i=t.bb;return Object.assign(Object.assign({},t.He),{time:i})}const oe={vertLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},horzLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},mode:1},_e={vertLines:{color:"#D6DCDE",style:0,visible:!0},horzLines:{color:"#D6DCDE",style:0,visible:!0}},ue={background:{type:"solid",color:"#FFFFFF"},textColor:"#191919",fontSize:12,fontFamily:L},ce={autoScale:!0,mode:0,invertScale:!1,alignLabels:!0,borderVisible:!0,borderColor:"#2B2B43",entireTextOnly:!1,visible:!1,ticksVisible:!1,scaleMargins:{bottom:.1,top:.2},minimumWidth:0},de={rightOffset:0,barSpacing:6,minBarSpacing:.5,fixLeftEdge:!1,fixRightEdge:!1,lockVisibleTimeRangeOnResize:!1,rightBarStaysOnScroll:!1,borderVisible:!0,borderColor:"#2B2B43",visible:!0,timeVisible:!1,secondsVisible:!0,shiftVisibleRangeOnNewBar:!0,allowShiftVisibleRangeOnWhitespaceReplacement:!1,ticksVisible:!1,uniformDistribution:!1,minimumHeight:0},fe={color:"rgba(0, 0, 0, 0)",visible:!1,fontSize:48,fontFamily:L,fontStyle:"",text:"",horzAlign:"center",vertAlign:"center"};function ve(){return{width:0,height:0,autoSize:!1,layout:ue,crosshair:oe,grid:_e,overlayPriceScales:Object.assign({},ce),leftPriceScale:Object.assign(Object.assign({},ce),{visible:!1}),rightPriceScale:Object.assign(Object.assign({},ce),{visible:!0}),timeScale:de,watermark:fe,localization:{locale:is?navigator.language:"",dateFormat:"dd MMM 'yy"},handleScroll:{mouseWheel:!0,pressedMouseMove:!0,horzTouchDrag:!0,vertTouchDrag:!0},handleScale:{axisPressedMouseMove:{time:!0,price:!0},axisDoubleClickReset:{time:!0,price:!0},mouseWheel:!0,pinch:!0},kineticScroll:{mouse:!1,touch:!0},trackingMode:{exitMode:1}}}class pe{constructor(t,i){this.$b=t,this.Ub=i}applyOptions(t){this.$b.qt().zc(this.Ub,t)}options(){return this.Li().W()}width(){return ut(this.Ub)?this.$b.nb(this.Ub):0}Li(){return b(this.$b.qt().Ec(this.Ub)).At}}function me(t,i,n){const s=Ls(t,["time","originalTime"]),e=Object.assign({time:i},s);return void 0!==n&&(e.originalTime=n),e}const be={color:"#FF0000",price:0,lineStyle:2,lineWidth:1,lineVisible:!0,axisLabelVisible:!0,title:"",axisLabelColor:"",axisLabelTextColor:""};class we{constructor(t){this.Bh=t}applyOptions(t){this.Bh.Nh(t)}options(){return this.Bh.W()}qb(){return this.Bh}}class ge{constructor(t,i,n,s,e){this.Yb=new R,this.Es=t,this.Xb=i,this.Kb=n,this.N_=e,this.Zb=s}S(){this.Yb.S()}priceFormatter(){return this.Es.ca()}priceToCoordinate(t){const i=this.Es.Pt();return null===i?null:this.Es.At().Ot(t,i.Vt)}coordinateToPrice(t){const i=this.Es.Pt();return null===i?null:this.Es.At().pn(t,i.Vt)}barsInLogicalRange(t){if(null===t)return null;const i=new yn(new xn(t.from,t.to)).iu(),n=this.Es.In();if(n.Fi())return null;const s=n.nl(i.Os(),1),e=n.nl(i.di(),-1),r=b(n.Qh()),h=b(n.Bn());if(null!==s&&null!==e&&s.se>e.se)return{barsBefore:t.from-r,barsAfter:h-t.to};const l={barsBefore:null===s||s.se===r?t.from-r:s.se-r,barsAfter:null===e||e.se===h?h-t.to:h-e.se};return null!==s&&null!==e&&(l.from=s.bb,l.to=e.bb),l}setData(t){this.N_,this.Es.Xh(),this.Xb.Gb(this.Es,t),this.Jb("full")}update(t){this.Es.Xh(),this.Xb.Qb(this.Es,t),this.Jb("update")}dataByIndex(t,i){const n=this.Es.In().nl(t,i);if(null===n)return null;return le(this.seriesType())(n)}data(){const t=le(this.seriesType());return this.Es.In().ie().map((i=>t(i)))}subscribeDataChanged(t){this.Yb.l(t)}unsubscribeDataChanged(t){this.Yb.v(t)}setMarkers(t){this.N_;const i=t.map((t=>me(t,this.N_.convertHorzItemToInternal(t.time),t.time)));this.Es.Zl(i)}markers(){return this.Es.Gl().map((t=>me(t,t.originalTime,void 0)))}applyOptions(t){this.Es.Nh(t)}options(){return I(this.Es.W())}priceScale(){return this.Kb.priceScale(this.Es.At().xa())}createPriceLine(t){const i=D(I(be),t),n=this.Es.Jl(i);return new we(n)}removePriceLine(t){this.Es.Ql(t.qb())}seriesType(){return this.Es.Xh()}attachPrimitive(t){this.Es.ba(t),t.attached&&t.attached({chart:this.Zb,series:this,requestUpdate:()=>this.Es.qt().$l()})}detachPrimitive(t){this.Es.wa(t),t.detached&&t.detached()}Jb(t){this.Yb.M()&&this.Yb.m(t)}}class Me{constructor(t,i,n){this.tw=new R,this.uu=new R,this._m=new R,this.Ui=t,this.wl=t.yt(),this.$m=i,this.wl.Ku().l(this.iw.bind(this)),this.wl.Zu().l(this.nw.bind(this)),this.$m.gm().l(this.sw.bind(this)),this.N_=n}S(){this.wl.Ku().p(this),this.wl.Zu().p(this),this.$m.gm().p(this),this.tw.S(),this.uu.S(),this._m.S()}scrollPosition(){return this.wl.Eu()}scrollToPosition(t,i){i?this.wl.qu(t,1e3):this.Ui.Jn(t)}scrollToRealTime(){this.wl.Uu()}getVisibleRange(){const t=this.wl.yu();return null===t?null:{from:t.from.originalTime,to:t.to.originalTime}}setVisibleRange(t){const i={from:this.N_.convertHorzItemToInternal(t.from),to:this.N_.convertHorzItemToInternal(t.to)},n=this.wl.Ru(i);this.Ui.ld(n)}getVisibleLogicalRange(){const t=this.wl.ku();return null===t?null:{from:t.Os(),to:t.di()}}setVisibleLogicalRange(t){p(t.from<=t.to,"The from index cannot be after the to index."),this.Ui.ld(t)}resetTimeScale(){this.Ui.Zn()}fitContent(){this.Ui.Qu()}logicalToCoordinate(t){const i=this.Ui.yt();return i.Fi()?null:i.Et(t)}coordinateToLogical(t){return this.wl.Fi()?null:this.wl.Vu(t)}timeToCoordinate(t){const i=this.N_.convertHorzItemToInternal(t),n=this.wl.ya(i,!1);return null===n?null:this.wl.Et(n)}coordinateToTime(t){const i=this.Ui.yt(),n=i.Vu(t),s=i.qi(n);return null===s?null:s.originalTime}width(){return this.$m.$p().width}height(){return this.$m.$p().height}subscribeVisibleTimeRangeChange(t){this.tw.l(t)}unsubscribeVisibleTimeRangeChange(t){this.tw.v(t)}subscribeVisibleLogicalRangeChange(t){this.uu.l(t)}unsubscribeVisibleLogicalRangeChange(t){this.uu.v(t)}subscribeSizeChange(t){this._m.l(t)}unsubscribeSizeChange(t){this._m.v(t)}applyOptions(t){this.wl.Nh(t)}options(){return Object.assign(Object.assign({},I(this.wl.W())),{barSpacing:this.wl.he()})}iw(){this.tw.M()&&this.tw.m(this.getVisibleRange())}nw(){this.uu.M()&&this.uu.m(this.getVisibleLogicalRange())}sw(t){this._m.m(t.width,t.height)}}function xe(t){if(void 0===t||"custom"===t.type)return;const i=t;void 0!==i.minMove&&void 0===i.precision&&(i.precision=function(t){if(t>=1)return 0;let i=0;for(;i<8;i++){const n=Math.round(t);if(Math.abs(n-t)<1e-8)return i;t*=10}return i}(i.minMove))}function Se(t){return function(t){if(B(t.handleScale)){const i=t.handleScale;t.handleScale={axisDoubleClickReset:{time:i,price:i},axisPressedMouseMove:{time:i,price:i},mouseWheel:i,pinch:i}}else if(void 0!==t.handleScale){const{axisPressedMouseMove:i,axisDoubleClickReset:n}=t.handleScale;B(i)&&(t.handleScale.axisPressedMouseMove={time:i,price:i}),B(n)&&(t.handleScale.axisDoubleClickReset={time:n,price:n})}const i=t.handleScroll;B(i)&&(t.handleScroll={horzTouchDrag:i,vertTouchDrag:i,mouseWheel:i,pressedMouseMove:i})}(t),t}class ke{constructor(t,i,n){this.ew=new Map,this.rw=new Map,this.hw=new R,this.lw=new R,this.aw=new R,this.ow=new Js(i);const s=void 0===n?I(ve()):D(I(ve()),Se(n));this.N_=i,this.$b=new zs(t,s,i),this.$b.Fp().l((t=>{this.hw.M()&&this.hw.m(this._w(t()))}),this),this.$b.Wp().l((t=>{this.lw.M()&&this.lw.m(this._w(t()))}),this),this.$b.Wc().l((t=>{this.aw.M()&&this.aw.m(this._w(t()))}),this);const e=this.$b.qt();this.uw=new Me(e,this.$b.Zm(),this.N_)}remove(){this.$b.Fp().p(this),this.$b.Wp().p(this),this.$b.Wc().p(this),this.uw.S(),this.$b.S(),this.ew.clear(),this.rw.clear(),this.hw.S(),this.lw.S(),this.aw.S(),this.ow.S()}resize(t,i,n){this.autoSizeActive()||this.$b.qm(t,i,n)}addCustomSeries(t,i){const n=w(t),s=Object.assign(Object.assign({},_),n.defaultOptions());return this.cw("Custom",s,i,n)}addAreaSeries(t){return this.cw("Area",l,t)}addBaselineSeries(t){return this.cw("Baseline",a,t)}addBarSeries(t){return this.cw("Bar",r,t)}addCandlestickSeries(t={}){return function(t){void 0!==t.borderColor&&(t.borderUpColor=t.borderColor,t.borderDownColor=t.borderColor),void 0!==t.wickColor&&(t.wickUpColor=t.wickColor,t.wickDownColor=t.wickColor)}(t),this.cw("Candlestick",e,t)}addHistogramSeries(t){return this.cw("Histogram",o,t)}addLineSeries(t){return this.cw("Line",h,t)}removeSeries(t){const i=m(this.ew.get(t)),n=this.ow.hd(i);this.$b.qt().hd(i),this.dw(n),this.ew.delete(t),this.rw.delete(i)}Gb(t,i){this.dw(this.ow.Ab(t,i))}Qb(t,i){this.dw(this.ow.Eb(t,i))}subscribeClick(t){this.hw.l(t)}unsubscribeClick(t){this.hw.v(t)}subscribeCrosshairMove(t){this.aw.l(t)}unsubscribeCrosshairMove(t){this.aw.v(t)}subscribeDblClick(t){this.lw.l(t)}unsubscribeDblClick(t){this.lw.v(t)}priceScale(t){return new pe(this.$b,t)}timeScale(){return this.uw}applyOptions(t){this.$b.Nh(Se(t))}options(){return this.$b.W()}takeScreenshot(){return this.$b.tb()}autoSizeActive(){return this.$b.rb()}chartElement(){return this.$b.hb()}paneSize(){const t=this.$b.ab();return{height:t.height,width:t.width}}setCrosshairPosition(t,i,n){const s=this.ew.get(n);if(void 0===s)return;const e=this.$b.qt().cr(s);null!==e&&this.$b.qt().Qc(t,i,e)}clearCrosshairPosition(){this.$b.qt().td(!0)}cw(t,i,n={},s){xe(n.priceFormat);const e=D(I(u),I(i),n),r=this.$b.qt().ed(t,e,s),h=new ge(r,this,this,this,this.N_);return this.ew.set(h,r),this.rw.set(r,h),h}dw(t){const i=this.$b.qt();i.nd(t.yt.Au,t.yt.jb,t.yt.Hb),t.Fb.forEach(((t,i)=>i.it(t.He,t.Wb))),i.Iu()}fw(t){return m(this.rw.get(t))}_w(t){const i=new Map;t.Mb.forEach(((t,n)=>{const s=n.Xh(),e=le(s)(t);if("Custom"!==s)p(function(t){return void 0!==t.open||void 0!==t.value}(e));else{const t=n.Ma();p(!t||!1===t(e))}i.set(this.fw(n),e)}));const n=void 0===t.gb?void 0:this.fw(t.gb);return{time:t.bb,logical:t.se,point:t.wb,hoveredSeries:n,hoveredObjectId:t.xb,seriesData:i,sourceEvent:t.Sb}}}function ye(t,i,n){let s;if(V(t)){const i=document.getElementById(t);p(null!==i,`Cannot find element in DOM with id=${t}`),s=i}else s=t;const e=new ke(s,i,n);return i.setOptions(e.options()),e}function Ce(t,i){return ye(t,new ts,ts.Td(i))}const Te=Object.assign(Object.assign({},u),_);function Pe(){return"4.1.1"}export{Bn as ColorType,ot as CrosshairMode,An as LastPriceAnimationMode,d as LineStyle,c as LineType,Ei as MismatchDirection,Vn as PriceLineSource,pn as PriceScaleMode,In as TickMarkType,On as TrackingModeExitMode,Ce as createChart,ye as createChartEx,Te as customSeriesDefaultOptions,En as isBusinessDay,Ln as isUTCTimestamp,Pe as version}; -+import{size as t,bindCanvasElementBitmapSizeTo as i,equalSizes as n,tryCreateCanvasRenderingTarget2D as s}from"fancy-canvas";const e={upColor:"#26a69a",downColor:"#ef5350",wickVisible:!0,borderVisible:!0,borderColor:"#378658",borderUpColor:"#26a69a",borderDownColor:"#ef5350",wickColor:"#737375",wickUpColor:"#26a69a",wickDownColor:"#ef5350"},r={upColor:"#26a69a",downColor:"#ef5350",openVisible:!0,thinBars:!0},h={color:"#2196f3",lineStyle:0,lineWidth:3,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},l={topColor:"rgba( 46, 220, 135, 0.4)",bottomColor:"rgba( 40, 221, 100, 0)",invertFilledArea:!1,lineColor:"#33D778",lineStyle:0,lineWidth:3,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},a={baseValue:{type:"price",price:0},topFillColor1:"rgba(38, 166, 154, 0.28)",topFillColor2:"rgba(38, 166, 154, 0.05)",topLineColor:"rgba(38, 166, 154, 1)",bottomFillColor1:"rgba(239, 83, 80, 0.05)",bottomFillColor2:"rgba(239, 83, 80, 0.28)",bottomLineColor:"rgba(239, 83, 80, 1)",lineWidth:3,lineStyle:0,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},o={color:"#26a69a",base:0},_={color:"#2196f3"},u={title:"",visible:!0,lastValueVisible:!0,priceLineVisible:!0,priceLineSource:0,priceLineWidth:1,priceLineColor:"",priceLineStyle:2,baseLineVisible:!0,baseLineWidth:1,baseLineColor:"#B2B5BE",baseLineStyle:0,priceFormat:{type:"price",precision:2,minMove:.01}};var c,d;function f(t,i){const n={0:[],1:[t.lineWidth,t.lineWidth],2:[2*t.lineWidth,2*t.lineWidth],3:[6*t.lineWidth,6*t.lineWidth],4:[t.lineWidth,4*t.lineWidth],5:[t.lineWidth,t.lineWidth]}[i];t.setLineDash(n)}function v(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(n,i+e),t.lineTo(s,i+e),t.stroke()}function p(t,i){if(!t)throw new Error("Assertion failed"+(i?": "+i:""))}function m(t){if(void 0===t)throw new Error("Value is undefined");return t}function b(t){if(null===t)throw new Error("Value is null");return t}function w(t){return b(m(t))}!function(t){t[t.Simple=0]="Simple",t[t.WithSteps=1]="WithSteps",t[t.Curved=2]="Curved"}(c||(c={})),function(t){t[t.Solid=0]="Solid",t[t.Dotted=1]="Dotted",t[t.Dashed=2]="Dashed",t[t.LargeDashed=3]="LargeDashed",t[t.SparseDotted=4]="SparseDotted",t[t.CustomDotGrid=5]="CustomDotGrid"}(d||(d={}));const g={khaki:"#f0e68c",azure:"#f0ffff",aliceblue:"#f0f8ff",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gainsboro:"#dcdcdc",gray:"#808080",green:"#008000",honeydew:"#f0fff0",floralwhite:"#fffaf0",lightblue:"#add8e6",lightcoral:"#f08080",lemonchiffon:"#fffacd",hotpink:"#ff69b4",lightyellow:"#ffffe0",greenyellow:"#adff2f",lightgoldenrodyellow:"#fafad2",limegreen:"#32cd32",linen:"#faf0e6",lightcyan:"#e0ffff",magenta:"#f0f",maroon:"#800000",olive:"#808000",orange:"#ffa500",oldlace:"#fdf5e6",mediumblue:"#0000cd",transparent:"#0000",lime:"#0f0",lightpink:"#ffb6c1",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",midnightblue:"#191970",orchid:"#da70d6",mediumorchid:"#ba55d3",mediumturquoise:"#48d1cc",orangered:"#ff4500",royalblue:"#4169e1",powderblue:"#b0e0e6",red:"#f00",coral:"#ff7f50",turquoise:"#40e0d0",white:"#fff",whitesmoke:"#f5f5f5",wheat:"#f5deb3",teal:"#008080",steelblue:"#4682b4",bisque:"#ffe4c4",aquamarine:"#7fffd4",aqua:"#0ff",sienna:"#a0522d",silver:"#c0c0c0",springgreen:"#00ff7f",antiquewhite:"#faebd7",burlywood:"#deb887",brown:"#a52a2a",beige:"#f5f5dc",chocolate:"#d2691e",chartreuse:"#7fff00",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cadetblue:"#5f9ea0",tomato:"#ff6347",fuchsia:"#f0f",blue:"#00f",salmon:"#fa8072",blanchedalmond:"#ffebcd",slateblue:"#6a5acd",slategray:"#708090",thistle:"#d8bfd8",tan:"#d2b48c",cyan:"#0ff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",blueviolet:"#8a2be2",black:"#000",darkmagenta:"#8b008b",darkslateblue:"#483d8b",darkkhaki:"#bdb76b",darkorchid:"#9932cc",darkorange:"#ff8c00",darkgreen:"#006400",darkred:"#8b0000",dodgerblue:"#1e90ff",darkslategray:"#2f4f4f",dimgray:"#696969",deepskyblue:"#00bfff",firebrick:"#b22222",forestgreen:"#228b22",indigo:"#4b0082",ivory:"#fffff0",lavenderblush:"#fff0f5",feldspar:"#d19275",indianred:"#cd5c5c",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightskyblue:"#87cefa",lightslategray:"#789",lightslateblue:"#8470ff",snow:"#fffafa",lightseagreen:"#20b2aa",lightsalmon:"#ffa07a",darksalmon:"#e9967a",darkviolet:"#9400d3",mediumpurple:"#9370d8",mediumaquamarine:"#66cdaa",skyblue:"#87ceeb",lavender:"#e6e6fa",lightsteelblue:"#b0c4de",mediumvioletred:"#c71585",mintcream:"#f5fffa",navajowhite:"#ffdead",navy:"#000080",olivedrab:"#6b8e23",palevioletred:"#d87093",violetred:"#d02090",yellow:"#ff0",yellowgreen:"#9acd32",lawngreen:"#7cfc00",pink:"#ffc0cb",paleturquoise:"#afeeee",palegoldenrod:"#eee8aa",darkolivegreen:"#556b2f",darkseagreen:"#8fbc8f",darkturquoise:"#00ced1",peachpuff:"#ffdab9",deeppink:"#ff1493",violet:"#ee82ee",palegreen:"#98fb98",mediumseagreen:"#3cb371",peru:"#cd853f",saddlebrown:"#8b4513",sandybrown:"#f4a460",rosybrown:"#bc8f8f",purple:"#800080",seagreen:"#2e8b57",seashell:"#fff5ee",papayawhip:"#ffefd5",mediumslateblue:"#7b68ee",plum:"#dda0dd",mediumspringgreen:"#00fa9a"};function M(t){return t<0?0:t>255?255:Math.round(t)||0}function x(t){return t<=0||t>0?t<0?0:t>1?1:Math.round(1e4*t)/1e4:0}const S=/^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,k=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,y=/^rgb\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*\)$/,C=/^rgba\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?[\d]{0,10}(?:\.\d+)?)\s*\)$/;function T(t){(t=t.toLowerCase())in g&&(t=g[t]);{const i=C.exec(t)||y.exec(t);if(i)return[M(parseInt(i[1],10)),M(parseInt(i[2],10)),M(parseInt(i[3],10)),x(i.length<5?1:parseFloat(i[4]))]}{const i=k.exec(t);if(i)return[M(parseInt(i[1],16)),M(parseInt(i[2],16)),M(parseInt(i[3],16)),1]}{const i=S.exec(t);if(i)return[M(17*parseInt(i[1],16)),M(17*parseInt(i[2],16)),M(17*parseInt(i[3],16)),1]}throw new Error(`Cannot parse color: ${t}`)}function P(t){const i=T(t);return{t:`rgb(${i[0]}, ${i[1]}, ${i[2]})`,i:(n=i,.199*n[0]+.687*n[1]+.114*n[2]>160?"black":"white")};var n}class R{constructor(){this.h=[]}l(t,i,n){const s={o:t,_:i,u:!0===n};this.h.push(s)}v(t){const i=this.h.findIndex((i=>t===i.o));i>-1&&this.h.splice(i,1)}p(t){this.h=this.h.filter((i=>i._!==t))}m(t,i,n){const s=[...this.h];this.h=this.h.filter((t=>!t.u)),s.forEach((s=>s.o(t,i,n)))}M(){return this.h.length>0}S(){this.h=[]}}function D(t,...i){for(const n of i)for(const i in n)void 0!==n[i]&&("object"!=typeof n[i]||void 0===t[i]||Array.isArray(n[i])?t[i]=n[i]:D(t[i],n[i]));return t}function O(t){return"number"==typeof t&&isFinite(t)}function A(t){return"number"==typeof t&&t%1==0}function V(t){return"string"==typeof t}function B(t){return"boolean"==typeof t}function I(t){const i=t;if(!i||"object"!=typeof i)return i;let n,s,e;for(s in n=Array.isArray(i)?[]:{},i)i.hasOwnProperty(s)&&(e=i[s],n[s]=e&&"object"==typeof e?I(e):e);return n}function z(t){return null!==t}function E(t){return null===t?void 0:t}const L="-apple-system, BlinkMacSystemFont, 'Trebuchet MS', Roboto, Ubuntu, sans-serif";function N(t,i,n){return void 0===i&&(i=L),`${n=void 0!==n?`${n} `:""}${t}px ${i}`}class F{constructor(t){this.k={C:1,T:5,P:NaN,R:"",D:"",O:"",A:"",V:0,B:0,I:0,L:0,N:0},this.F=t}W(){const t=this.k,i=this.j(),n=this.H();return t.P===i&&t.D===n||(t.P=i,t.D=n,t.R=N(i,n),t.L=2.5/12*i,t.V=t.L,t.B=i/12*t.T,t.I=i/12*t.T,t.N=0),t.O=this.$(),t.A=this.U(),this.k}$(){return this.F.W().layout.textColor}U(){return this.F.q()}j(){return this.F.W().layout.fontSize}H(){return this.F.W().layout.fontFamily}}class W{constructor(){this.Y=[]}X(t){this.Y=t}K(t,i,n){this.Y.forEach((s=>{s.K(t,i,n)}))}}class j{K(t,i,n){t.useMediaCoordinateSpace((t=>this.Z(t,i,n)))}G(t,i,n){t.useMediaCoordinateSpace((t=>this.J(t,i,n)))}J(t,i,n){}}class H extends j{constructor(){super(...arguments),this.tt=null}it(t){this.tt=t}Z({context:t}){if(null===this.tt||null===this.tt.nt)return;const i=this.tt.nt,n=this.tt,s=s=>{t.beginPath();for(let e=i.to-1;e>=i.from;--e){const i=n.st[e];t.moveTo(i.et,i.rt),t.arc(i.et,i.rt,s,0,2*Math.PI)}t.fill()};n.ht>0&&(t.fillStyle=n.lt,s(n.ot+n.ht)),t.fillStyle=n._t,s(n.ot)}}function $(){return{st:[{et:0,rt:0,ut:0,ct:0}],_t:"",lt:"",ot:0,ht:0,nt:null}}const U={from:0,to:1};class q{constructor(t,i){this.dt=new W,this.ft=[],this.vt=[],this.bt=!0,this.F=t,this.wt=i,this.dt.X(this.ft)}gt(t){const i=this.F.Mt();i.length!==this.ft.length&&(this.vt=i.map($),this.ft=this.vt.map((t=>{const i=new H;return i.it(t),i})),this.dt.X(this.ft)),this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.dt}St(){const t=2===this.wt.W().mode,i=this.F.Mt(),n=this.wt.kt(),s=this.F.yt();i.forEach(((i,e)=>{var r;const h=this.vt[e],l=i.Ct(n);if(t||null===l||!i.Tt())return void(h.nt=null);const a=b(i.Pt());h._t=l.Rt,h.ot=l.ot,h.ht=l.Dt,h.st[0].ct=l.ct,h.st[0].rt=i.At().Ot(l.ct,a.Vt),h.lt=null!==(r=l.Bt)&&void 0!==r?r:this.F.It(h.st[0].rt/i.At().zt()),h.st[0].ut=n,h.st[0].et=s.Et(n),h.nt=U}))}}class Y{K(t,i,n){t.useBitmapCoordinateSpace((t=>this.Z(t,i,n)))}}class X extends Y{constructor(t){super(),this.Lt=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;const e=this.Lt.Nt.Tt,r=this.Lt.Ft.Tt;if(!e&&!r)return;const h=Math.round(this.Lt.et*n),l=Math.round(this.Lt.rt*s);t.lineCap="butt",e&&h>=0&&(t.lineWidth=Math.floor(this.Lt.Nt.ht*n),t.strokeStyle=this.Lt.Nt.O,t.fillStyle=this.Lt.Nt.O,f(t,this.Lt.Nt.Wt),function(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(i+e,n),t.lineTo(i+e,s),t.stroke()}(t,h,0,i.height)),r&&l>=0&&(t.lineWidth=Math.floor(this.Lt.Ft.ht*s),t.strokeStyle=this.Lt.Ft.O,t.fillStyle=this.Lt.Ft.O,f(t,this.Lt.Ft.Wt),v(t,l,0,i.width))}}class K{constructor(t){this.bt=!0,this.jt={Nt:{ht:1,Wt:0,O:"",Tt:!1},Ft:{ht:1,Wt:0,O:"",Tt:!1},et:0,rt:0},this.Ht=new X(this.jt),this.$t=t}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht}St(){const t=this.$t.Tt(),i=b(this.$t.Ut()),n=i.qt().W().crosshair,s=this.jt;if(2===n.mode)return s.Ft.Tt=!1,void(s.Nt.Tt=!1);s.Ft.Tt=t&&this.$t.Yt(i),s.Nt.Tt=t&&this.$t.Xt(),s.Ft.ht=n.horzLine.width,s.Ft.Wt=n.horzLine.style,s.Ft.O=n.horzLine.color,s.Nt.ht=n.vertLine.width,s.Nt.Wt=n.vertLine.style,s.Nt.O=n.vertLine.color,s.et=this.$t.Kt(),s.rt=this.$t.Zt()}}function Z(t,i,n,s,e,r){t.fillRect(i+r,n,s-2*r,r),t.fillRect(i+r,n+e-r,s-2*r,r),t.fillRect(i,n,r,e),t.fillRect(i+s-r,n,r,e)}function G(t,i,n,s,e,r){t.save(),t.globalCompositeOperation="copy",t.fillStyle=r,t.fillRect(i,n,s,e),t.restore()}function J(t,i){return t.map((t=>0===t?t:t+i))}function Q(t,i,n,s,e,r){t.beginPath(),t.lineTo(i+s-r[1],n),0!==r[1]&&t.arcTo(i+s,n,i+s,n+r[1],r[1]),t.lineTo(i+s,n+e-r[2]),0!==r[2]&&t.arcTo(i+s,n+e,i+s-r[2],n+e,r[2]),t.lineTo(i+r[3],n+e),0!==r[3]&&t.arcTo(i,n+e,i,n+e-r[3],r[3]),t.lineTo(i,n+r[0]),0!==r[0]&&t.arcTo(i,n,i+r[0],n,r[0])}function tt(t,i,n,s,e,r,h=0,l=[0,0,0,0],a=""){if(t.save(),!h||!a||a===r)return Q(t,i,n,s,e,l),t.fillStyle=r,t.fill(),void t.restore();const o=h/2;if("transparent"!==r){Q(t,i+h,n+h,s-2*h,e-2*h,J(l,-h)),t.fillStyle=r,t.fill()}if("transparent"!==a){Q(t,i+o,n+o,s-h,e-h,J(l,-o)),t.lineWidth=h,t.strokeStyle=a,t.closePath(),t.stroke()}t.restore()}function it(t,i,n,s,e,r,h){t.save(),t.globalCompositeOperation="copy";const l=t.createLinearGradient(0,0,0,e);l.addColorStop(0,r),l.addColorStop(1,h),t.fillStyle=l,t.fillRect(i,n,s,e),t.restore()}class nt{constructor(t,i){this.it(t,i)}it(t,i){this.Lt=t,this.Gt=i}zt(t,i){return this.Lt.Tt?t.P+t.L+t.V:0}K(t,i,n,s){if(!this.Lt.Tt||0===this.Lt.Jt.length)return;const e=this.Lt.O,r=this.Gt.t,h=t.useBitmapCoordinateSpace((t=>{const h=t.context;h.font=i.R;const l=this.Qt(t,i,n,s),a=l.ti,o=(t,i)=>{l.ii?tt(h,a.ni,a.si,a.ei,a.ri,t,a.hi,[a.ot,0,0,a.ot],i):tt(h,a.li,a.si,a.ei,a.ri,t,a.hi,[0,a.ot,a.ot,0],i)};return o(r,"transparent"),this.Lt.ai&&(h.fillStyle=e,h.fillRect(a.li,a.oi,a._i-a.li,a.ui)),o("transparent",r),this.Lt.ci&&(h.fillStyle=i.A,h.fillRect(l.ii?a.di-a.hi:0,a.si,a.hi,a.fi-a.si)),l}));t.useMediaCoordinateSpace((({context:t})=>{const n=h.vi;t.font=i.R,t.textAlign=h.ii?"right":"left",t.textBaseline="middle",t.fillStyle=e,t.fillText(this.Lt.Jt,n.pi,(n.si+n.fi)/2+n.mi)}))}Qt(t,i,n,s){var e;const{context:r,bitmapSize:h,mediaSize:l,horizontalPixelRatio:a,verticalPixelRatio:o}=t,_=this.Lt.ai||!this.Lt.bi?i.T:0,u=this.Lt.wi?i.C:0,c=i.L+this.Gt.gi,d=i.V+this.Gt.Mi,f=i.B,v=i.I,p=this.Lt.Jt,m=i.P,b=n.xi(r,p),w=Math.ceil(n.Si(r,p)),g=m+c+d,M=i.C+f+v+w+_,x=Math.max(1,Math.floor(o));let S=Math.round(g*o);S%2!=x%2&&(S+=1);const k=u>0?Math.max(1,Math.floor(u*a)):0,y=Math.round(M*a),C=Math.round(_*a),T=null!==(e=this.Gt.ki)&&void 0!==e?e:this.Gt.yi,P=Math.round(T*o)-Math.floor(.5*o),R=Math.floor(P+x/2-S/2),D=R+S,O="right"===s,A=O?l.width-u:u,V=O?h.width-k:k;let B,I,z;return O?(B=V-y,I=V-C,z=A-_-f-u):(B=V+y,I=V+C,z=A+_+f),{ii:O,ti:{si:R,oi:P,fi:D,ei:y,ri:S,ot:2*a,hi:k,ni:B,li:V,_i:I,ui:x,di:h.width},vi:{si:R/o,fi:D/o,pi:z,mi:b}}}}class st{constructor(t){this.Ci={yi:0,t:"#000",Mi:0,gi:0},this.Ti={Jt:"",Tt:!1,ai:!0,bi:!1,Bt:"",O:"#FFF",ci:!1,wi:!1},this.Pi={Jt:"",Tt:!1,ai:!1,bi:!0,Bt:"",O:"#FFF",ci:!0,wi:!0},this.bt=!0,this.Ri=new(t||nt)(this.Ti,this.Ci),this.Di=new(t||nt)(this.Pi,this.Ci)}Jt(){return this.Oi(),this.Ti.Jt}yi(){return this.Oi(),this.Ci.yi}gt(){this.bt=!0}zt(t,i=!1){return Math.max(this.Ri.zt(t,i),this.Di.zt(t,i))}Ai(){return this.Ci.ki||0}Vi(t){this.Ci.ki=t}Bi(){return this.Oi(),this.Ti.Tt||this.Pi.Tt}Ii(){return this.Oi(),this.Ti.Tt}xt(t){return this.Oi(),this.Ti.ai=this.Ti.ai&&t.W().ticksVisible,this.Pi.ai=this.Pi.ai&&t.W().ticksVisible,this.Ri.it(this.Ti,this.Ci),this.Di.it(this.Pi,this.Ci),this.Ri}zi(){return this.Oi(),this.Ri.it(this.Ti,this.Ci),this.Di.it(this.Pi,this.Ci),this.Di}Oi(){this.bt&&(this.Ti.ai=!0,this.Pi.ai=!1,this.Ei(this.Ti,this.Pi,this.Ci))}}class et extends st{constructor(t,i,n){super(),this.$t=t,this.Li=i,this.Ni=n}Ei(t,i,n){if(t.Tt=!1,2===this.$t.W().mode)return;const s=this.$t.W().horzLine;if(!s.labelVisible)return;const e=this.Li.Pt();if(!this.$t.Tt()||this.Li.Fi()||null===e)return;const r=P(s.labelBackgroundColor);n.t=r.t,t.O=r.i;const h=2/12*this.Li.P();n.gi=h,n.Mi=h;const l=this.Ni(this.Li);n.yi=l.yi,t.Jt=this.Li.Wi(l.ct,e),t.Tt=!0}}const rt=/[1-9]/g;class ht{constructor(){this.Lt=null}it(t){this.Lt=t}K(t,i){if(null===this.Lt||!1===this.Lt.Tt||0===this.Lt.Jt.length)return;const n=t.useMediaCoordinateSpace((({context:t})=>(t.font=i.R,Math.round(i.ji.Si(t,b(this.Lt).Jt,rt)))));if(n<=0)return;const s=i.Hi,e=n+2*s,r=e/2,h=this.Lt.$i;let l=this.Lt.yi,a=Math.floor(l-r)+.5;a<0?(l+=Math.abs(0-a),a=Math.floor(l-r)+.5):a+e>h&&(l-=Math.abs(h-(a+e)),a=Math.floor(l-r)+.5);const o=a+e,_=Math.ceil(0+i.C+i.T+i.L+i.P+i.V);t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:n,verticalPixelRatio:s})=>{const e=b(this.Lt);t.fillStyle=e.t;const r=Math.round(a*n),h=Math.round(0*s),l=Math.round(o*n),u=Math.round(_*s),c=Math.round(2*n);if(t.beginPath(),t.moveTo(r,h),t.lineTo(r,u-c),t.arcTo(r,u,r+c,u,c),t.lineTo(l-c,u),t.arcTo(l,u,l,u-c,c),t.lineTo(l,h),t.fill(),e.ai){const r=Math.round(e.yi*n),l=h,a=Math.round((l+i.T)*s);t.fillStyle=e.O;const o=Math.max(1,Math.floor(n)),_=Math.floor(.5*n);t.fillRect(r-_,l,o,a-l)}})),t.useMediaCoordinateSpace((({context:t})=>{const n=b(this.Lt),e=0+i.C+i.T+i.L+i.P/2;t.font=i.R,t.textAlign="left",t.textBaseline="middle",t.fillStyle=n.O;const r=i.ji.xi(t,"Apr0");t.translate(a+s,e+r),t.fillText(n.Jt,0,0)}))}}class lt{constructor(t,i,n){this.bt=!0,this.Ht=new ht,this.jt={Tt:!1,t:"#4c525e",O:"white",Jt:"",$i:0,yi:NaN,ai:!0},this.wt=t,this.Ui=i,this.Ni=n}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht.it(this.jt),this.Ht}St(){const t=this.jt;if(t.Tt=!1,2===this.wt.W().mode)return;const i=this.wt.W().vertLine;if(!i.labelVisible)return;const n=this.Ui.yt();if(n.Fi())return;t.$i=n.$i();const s=this.Ni();if(null===s)return;t.yi=s.yi;const e=n.qi(this.wt.kt());t.Jt=n.Yi(b(e)),t.Tt=!0;const r=P(i.labelBackgroundColor);t.t=r.t,t.O=r.i,t.ai=n.W().ticksVisible}}class at{constructor(){this.Xi=null,this.Ki=0}Zi(){return this.Ki}Gi(t){this.Ki=t}At(){return this.Xi}Ji(t){this.Xi=t}Qi(t){return[]}tn(){return[]}Tt(){return!0}}var ot;!function(t){t[t.Normal=0]="Normal",t[t.Magnet=1]="Magnet",t[t.Hidden=2]="Hidden"}(ot||(ot={}));class _t extends at{constructor(t,i){super(),this.nn=null,this.sn=NaN,this.en=0,this.rn=!0,this.hn=new Map,this.ln=!1,this.an=NaN,this.on=NaN,this._n=NaN,this.un=NaN,this.Ui=t,this.cn=i,this.dn=new q(t,this);this.fn=((t,i)=>n=>{const s=i(),e=t();if(n===b(this.nn).vn())return{ct:e,yi:s};{const t=b(n.Pt());return{ct:n.pn(s,t),yi:s}}})((()=>this.sn),(()=>this.on));const n=((t,i)=>()=>{const n=this.Ui.yt().mn(t()),s=i();return n&&Number.isFinite(s)?{ut:n,yi:s}:null})((()=>this.en),(()=>this.Kt()));this.bn=new lt(this,t,n),this.wn=new K(this)}W(){return this.cn}gn(t,i){this._n=t,this.un=i}Mn(){this._n=NaN,this.un=NaN}xn(){return this._n}Sn(){return this.un}kn(t,i,n){this.ln||(this.ln=!0),this.rn=!0,this.yn(t,i,n)}kt(){return this.en}Kt(){return this.an}Zt(){return this.on}Tt(){return this.rn}Cn(){this.rn=!1,this.Tn(),this.sn=NaN,this.an=NaN,this.on=NaN,this.nn=null,this.Mn()}Pn(t){return null!==this.nn?[this.wn,this.dn]:[]}Yt(t){return t===this.nn&&this.cn.horzLine.visible}Xt(){return this.cn.vertLine.visible}Rn(t,i){this.rn&&this.nn===t||this.hn.clear();const n=[];return this.nn===t&&n.push(this.Dn(this.hn,i,this.fn)),n}tn(){return this.rn?[this.bn]:[]}Ut(){return this.nn}On(){this.wn.gt(),this.hn.forEach((t=>t.gt())),this.bn.gt(),this.dn.gt()}An(t){return t&&!t.vn().Fi()?t.vn():null}yn(t,i,n){this.Vn(t,i,n)&&this.On()}Vn(t,i,n){const s=this.an,e=this.on,r=this.sn,h=this.en,l=this.nn,a=this.An(n);this.en=t,this.an=isNaN(t)?NaN:this.Ui.yt().Et(t),this.nn=n;const o=null!==a?a.Pt():null;return null!==a&&null!==o?(this.sn=i,this.on=a.Ot(i,o)):(this.sn=NaN,this.on=NaN),s!==this.an||e!==this.on||h!==this.en||r!==this.sn||l!==this.nn}Tn(){const t=this.Ui.Mt().map((t=>t.In().Bn())).filter(z),i=0===t.length?null:Math.max(...t);this.en=null!==i?i:NaN}Dn(t,i,n){let s=t.get(i);return void 0===s&&(s=new et(this,i,n),t.set(i,s)),s}}function ut(t){return"left"===t||"right"===t}class ct{constructor(t){this.zn=new Map,this.En=[],this.Ln=t}Nn(t,i){const n=function(t,i){return void 0===t?i:{Fn:Math.max(t.Fn,i.Fn),Wn:t.Wn||i.Wn}}(this.zn.get(t),i);this.zn.set(t,n)}jn(){return this.Ln}Hn(t){const i=this.zn.get(t);return void 0===i?{Fn:this.Ln}:{Fn:Math.max(this.Ln,i.Fn),Wn:i.Wn}}$n(){this.Un(),this.En=[{qn:0}]}Yn(t){this.Un(),this.En=[{qn:1,Vt:t}]}Xn(t){this.Kn(),this.En.push({qn:5,Vt:t})}Un(){this.Kn(),this.En.push({qn:6})}Zn(){this.Un(),this.En=[{qn:4}]}Gn(t){this.Un(),this.En.push({qn:2,Vt:t})}Jn(t){this.Un(),this.En.push({qn:3,Vt:t})}Qn(){return this.En}ts(t){for(const i of t.En)this.ns(i);this.Ln=Math.max(this.Ln,t.Ln),t.zn.forEach(((t,i)=>{this.Nn(i,t)}))}static ss(){return new ct(2)}static es(){return new ct(3)}ns(t){switch(t.qn){case 0:this.$n();break;case 1:this.Yn(t.Vt);break;case 2:this.Gn(t.Vt);break;case 3:this.Jn(t.Vt);break;case 4:this.Zn();break;case 5:this.Xn(t.Vt);break;case 6:this.Kn()}}Kn(){const t=this.En.findIndex((t=>5===t.qn));-1!==t&&this.En.splice(t,1)}}const dt=".";function ft(t,i){if(!O(t))return"n/a";if(!A(i))throw new TypeError("invalid length");if(i<0||i>16)throw new TypeError("invalid length");if(0===i)return t.toString();return("0000000000000000"+t.toString()).slice(-i)}class vt{constructor(t,i){if(i||(i=1),O(t)&&A(t)||(t=100),t<0)throw new TypeError("invalid base");this.Li=t,this.rs=i,this.hs()}format(t){const i=t<0?"−":"";return t=Math.abs(t),i+this.ls(t)}hs(){if(this.os=0,this.Li>0&&this.rs>0){let t=this.Li;for(;t>1;)t/=10,this.os++}}ls(t){const i=this.Li/this.rs;let n=Math.floor(t),s="";const e=void 0!==this.os?this.os:NaN;if(i>1){let r=+(Math.round(t*i)-n*i).toFixed(this.os);r>=i&&(r-=i,n+=1),s=dt+ft(+r.toFixed(this.os)*this.rs,e)}else n=Math.round(n*i)/i,e>0&&(s=dt+ft(0,e));return n.toFixed(0)+s}}class pt extends vt{constructor(t=100){super(t)}format(t){return`${super.format(t)}%`}}class mt{constructor(t){this._s=t}format(t){let i="";return t<0&&(i="-",t=-t),t<995?i+this.us(t):t<999995?i+this.us(t/1e3)+"K":t<999999995?(t=1e3*Math.round(t/1e3),i+this.us(t/1e6)+"M"):(t=1e6*Math.round(t/1e6),i+this.us(t/1e9)+"B")}us(t){let i;const n=Math.pow(10,this._s);return i=(t=Math.round(t*n)/n)>=1e-15&&t<1?t.toFixed(this._s).replace(/\.?0+$/,""):String(t),i.replace(/(\.[1-9]*)0+$/,((t,i)=>i))}}function bt(t,i,n,s,e,r,h){if(0===i.length||s.from>=i.length||s.to<=0)return;const{context:l,horizontalPixelRatio:a,verticalPixelRatio:o}=t,_=i[s.from];let u=r(t,_),c=_;if(s.to-s.from<2){const i=e/2;l.beginPath();const n={et:_.et-i,rt:_.rt},s={et:_.et+i,rt:_.rt};l.moveTo(n.et*a,n.rt*o),l.lineTo(s.et*a,s.rt*o),h(t,u,n,s)}else{const e=(i,n)=>{h(t,u,c,n),l.beginPath(),u=i,c=n};let d=c;l.beginPath(),l.moveTo(_.et*a,_.rt*o);for(let h=s.from+1;h=s.from;--n){const s=i[n];if(s){const i=e(t,s);i!==a&&(l.beginPath(),null!==a&&l.fill(),l.fillStyle=i,a=i);const n=Math.round(s.et*r)+o,u=s.rt*h;l.moveTo(n,u),l.arc(n,u,_,0,2*Math.PI)}}l.fill()}(t,i,l,n,o)}}class At extends Ot{Ds(t,i){return i._t}}function Vt(t,i,n,s,e=0,r=i.length){let h=r-e;for(;0>1,l=e+r;s(i[l],n)===t?(e=l+1,h-=r+1):h=r}return e}const Bt=Vt.bind(null,!0),It=Vt.bind(null,!1);function zt(t,i){return t.ut0&&r=s&&(l=r-1),h>0&&hObject.assign(Object.assign({},t),this.Es.$s().Hs(t.ut))))}Us(){this.zs=null}Fs(){this.Vs&&(this.qs(),this.Vs=!1),this.Bs&&(this.js(),this.Bs=!1),this.As&&(this.Ys(),this.As=!1)}Ys(){const t=this.Es.At(),i=this.Ls.yt();if(this.Us(),i.Fi()||t.Fi())return;const n=i.Xs();if(null===n)return;if(0===this.Es.In().Ks())return;const s=this.Es.Pt();null!==s&&(this.zs=Lt(this.Is,n,this.Ns),this.Zs(t,i,s.Vt),this.Gs())}}class Ft extends Nt{constructor(t,i){super(t,i,!0)}Zs(t,i,n){i.Js(this.Is,E(this.zs)),t.Qs(this.Is,n,E(this.zs))}te(t,i){return{ut:t,ct:i,et:NaN,rt:NaN}}qs(){const t=this.Es.$s();this.Is=this.Es.In().ie().map((i=>{const n=i.Vt[3];return this.ne(i.se,n,t)}))}}class Wt extends Ft{constructor(t,i){super(t,i),this.Ws=new W,this.ee=new Rt,this.re=new At,this.Ws.X([this.ee,this.re])}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Es.W();this.ee.it({ds:t.lineType,st:this.Is,Wt:t.lineStyle,ht:t.lineWidth,fs:null,vs:t.invertFilledArea,nt:this.zs,cs:this.Ls.yt().he()}),this.re.it({ds:t.lineVisible?t.lineType:void 0,st:this.Is,Wt:t.lineStyle,ht:t.lineWidth,nt:this.zs,cs:this.Ls.yt().he(),Rs:t.pointMarkersVisible?t.pointMarkersRadius||t.lineWidth/2+2:void 0})}}class jt extends Y{constructor(){super(...arguments),this.Lt=null,this.le=0,this.ae=0}it(t){this.Lt=t}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.Lt||0===this.Lt.In.length||null===this.Lt.nt)return;if(this.le=this.oe(i),this.le>=2){Math.max(1,Math.floor(i))%2!=this.le%2&&this.le--}this.ae=this.Lt._e?Math.min(this.le,Math.floor(i)):this.le;let s=null;const e=this.ae<=this.le&&this.Lt.he>=Math.floor(1.5*i);for(let r=this.Lt.nt.from;rf+p-1&&(e=f+p-1,s=e-_+1),t.fillRect(i,s,o-i,e-s+1)}const i=a+m;let s=Math.max(f,Math.round(h.pe*n)-l),e=s+_-1;e>f+p-1&&(e=f+p-1,s=e-_+1),t.fillRect(u+1,s,i-u,e-s+1)}}}oe(t){const i=Math.floor(t);return Math.max(i,Math.floor(function(t,i){return Math.floor(.3*t*i)}(b(this.Lt).he,t)))}}class Ht extends Nt{constructor(t,i){super(t,i,!1)}Zs(t,i,n){i.Js(this.Is,E(this.zs)),t.me(this.Is,n,E(this.zs))}be(t,i,n){return{ut:t,we:i.Vt[0],ge:i.Vt[1],Me:i.Vt[2],xe:i.Vt[3],et:NaN,ve:NaN,ce:NaN,de:NaN,pe:NaN}}qs(){const t=this.Es.$s();this.Is=this.Es.In().ie().map((i=>this.ne(i.se,i,t)))}}class $t extends Ht{constructor(){super(...arguments),this.Ws=new jt}ne(t,i,n){return Object.assign(Object.assign({},this.be(t,i,n)),n.Hs(t))}Gs(){const t=this.Es.W();this.Ws.it({In:this.Is,he:this.Ls.yt().he(),fe:t.openVisible,_e:t.thinBars,nt:this.zs})}}class Ut extends kt{constructor(){super(...arguments),this.Cs=new Pt}ps(t,i){const n=this.tt;return this.Cs.bs(t,{gs:i.Se,Ms:i.ke,xs:i.ye,Ss:i.Ce,ks:t.bitmapSize.height,fs:n.fs})}}class qt extends Ot{constructor(){super(...arguments),this.Te=new Pt}Ds(t,i){const n=this.tt;return this.Te.bs(t,{gs:i.Pe,Ms:i.Pe,xs:i.Re,Ss:i.Re,ks:t.bitmapSize.height,fs:n.fs})}}class Yt extends Ft{constructor(t,i){super(t,i),this.Ws=new W,this.De=new Ut,this.Oe=new qt,this.Ws.X([this.De,this.Oe])}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Es.Pt();if(null===t)return;const i=this.Es.W(),n=this.Es.At().Ot(i.baseValue.price,t.Vt),s=this.Ls.yt().he();this.De.it({st:this.Is,ht:i.lineWidth,Wt:i.lineStyle,ds:i.lineType,fs:n,vs:!1,nt:this.zs,cs:s}),this.Oe.it({st:this.Is,ht:i.lineWidth,Wt:i.lineStyle,ds:i.lineVisible?i.lineType:void 0,Rs:i.pointMarkersVisible?i.pointMarkersRadius||i.lineWidth/2+2:void 0,fs:n,nt:this.zs,cs:s})}}class Xt extends Y{constructor(){super(...arguments),this.Lt=null,this.le=0}it(t){this.Lt=t}Z(t){if(null===this.Lt||0===this.Lt.In.length||null===this.Lt.nt)return;const{horizontalPixelRatio:i}=t;if(this.le=function(t,i){if(t>=2.5&&t<=4)return Math.floor(3*i);const n=1-.2*Math.atan(Math.max(4,t)-4)/(.5*Math.PI),s=Math.floor(t*n*i),e=Math.floor(t*i),r=Math.min(s,e);return Math.max(Math.floor(i),r)}(this.Lt.he,i),this.le>=2){Math.floor(i)%2!=this.le%2&&this.le--}const n=this.Lt.In;this.Lt.Ae&&this.Ve(t,n,this.Lt.nt),this.Lt.ci&&this.Be(t,n,this.Lt.nt);const s=this.Ie(i);(!this.Lt.ci||this.le>2*s)&&this.ze(t,n,this.Lt.nt)}Ve(t,i,n){if(null===this.Lt)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="",l=Math.min(Math.floor(e),Math.floor(this.Lt.he*e));l=Math.max(Math.floor(e),Math.min(l,this.le));const a=Math.floor(.5*l);let o=null;for(let t=n.from;t2*l)Z(s,o,u,_-o+1,c-u+1,l);else{const t=_-o+1;s.fillRect(o,u,t,c-u+1)}a=_}}ze(t,i,n){if(null===this.Lt)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="";const l=this.Ie(e);for(let t=n.from;to||s.fillRect(_,a,u-_+1,o-a+1)}}}class Kt extends Ht{constructor(){super(...arguments),this.Ws=new Xt}ne(t,i,n){return Object.assign(Object.assign({},this.be(t,i,n)),n.Hs(t))}Gs(){const t=this.Es.W();this.Ws.it({In:this.Is,he:this.Ls.yt().he(),Ae:t.wickVisible,ci:t.borderVisible,nt:this.zs})}}class Zt{constructor(t,i){this.Ne=t,this.Li=i}K(t,i,n){this.Ne.draw(t,this.Li,i,n)}}class Gt extends Nt{constructor(t,i,n){super(t,i,!1),this.wn=n,this.Ws=new Zt(this.wn.renderer(),(i=>{const n=t.Pt();return null===n?null:t.At().Ot(i,n.Vt)}))}Fe(t){return this.wn.priceValueBuilder(t)}We(t){return this.wn.isWhitespace(t)}qs(){const t=this.Es.$s();this.Is=this.Es.In().ie().map((i=>Object.assign(Object.assign({ut:i.se,et:NaN},t.Hs(i.se)),{je:i.He})))}Zs(t,i){i.Js(this.Is,E(this.zs))}Gs(){this.wn.update({bars:this.Is.map(Jt),barSpacing:this.Ls.yt().he(),visibleRange:this.zs},this.Es.W())}}function Jt(t){return{x:t.et,time:t.ut,originalData:t.je,barColor:t.ue}}class Qt extends Y{constructor(){super(...arguments),this.Lt=null,this.$e=[]}it(t){this.Lt=t,this.$e=[]}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.Lt||0===this.Lt.st.length||null===this.Lt.nt)return;this.$e.length||this.Ue(i);const s=Math.max(1,Math.floor(n)),e=Math.round(this.Lt.qe*n)-Math.floor(s/2),r=e+s;for(let i=this.Lt.nt.from;is.Xe?s.di=n.Os-i-1:n.Os=s.di+i+1))}let s=Math.ceil(this.Lt.he*t);for(let t=this.Lt.nt.from;t0&&s<4)for(let t=this.Lt.nt.from;ts&&(i.Ye>i.Xe?i.di-=1:i.Os+=1)}}}class ti extends Ft{constructor(){super(...arguments),this.Ws=new Qt}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t={st:this.Is,he:this.Ls.yt().he(),nt:this.zs,qe:this.Es.At().Ot(this.Es.W().base,b(this.Es.Pt()).Vt)};this.Ws.it(t)}}class ii extends Ft{constructor(){super(...arguments),this.Ws=new At}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Es.W(),i={st:this.Is,Wt:t.lineStyle,ds:t.lineVisible?t.lineType:void 0,ht:t.lineWidth,Rs:t.pointMarkersVisible?t.pointMarkersRadius||t.lineWidth/2+2:void 0,nt:this.zs,cs:this.Ls.yt().he()};this.Ws.it(i)}}const ni=/[2-9]/g;class si{constructor(t=50){this.Ke=0,this.Ze=1,this.Ge=1,this.Je={},this.Qe=new Map,this.tr=t}ir(){this.Ke=0,this.Qe.clear(),this.Ze=1,this.Ge=1,this.Je={}}Si(t,i,n){return this.nr(t,i,n).width}xi(t,i,n){const s=this.nr(t,i,n);return((s.actualBoundingBoxAscent||0)-(s.actualBoundingBoxDescent||0))/2}nr(t,i,n){const s=n||ni,e=String(i).replace(s,"0");if(this.Qe.has(e))return m(this.Qe.get(e)).sr;if(this.Ke===this.tr){const t=this.Je[this.Ge];delete this.Je[this.Ge],this.Qe.delete(t),this.Ge++,this.Ke--}t.save(),t.textBaseline="middle";const r=t.measureText(e);return t.restore(),0===r.width&&i.length||(this.Qe.set(e,{sr:r,er:this.Ze}),this.Je[this.Ze]=e,this.Ke++,this.Ze++),r}}class ei{constructor(t){this.rr=null,this.k=null,this.hr="right",this.lr=t}ar(t,i,n){this.rr=t,this.k=i,this.hr=n}K(t){null!==this.k&&null!==this.rr&&this.rr.K(t,this.k,this.lr,this.hr)}}class ri{constructor(t,i,n){this._r=t,this.lr=new si(50),this.ur=i,this.F=n,this.j=-1,this.Ht=new ei(this.lr)}xt(){const t=this.F.cr(this.ur);if(null===t)return null;const i=t.dr(this.ur)?t.vr():this.ur.At();if(null===i)return null;const n=t.pr(i);if("overlay"===n)return null;const s=this.F.mr();return s.P!==this.j&&(this.j=s.P,this.lr.ir()),this.Ht.ar(this._r.zi(),s,n),this.Ht}}class hi extends Y{constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}br(t,i){var n;if(!(null===(n=this.Lt)||void 0===n?void 0:n.Tt))return null;const{rt:s,ht:e,wr:r}=this.Lt;return i>=s-e-7&&i<=s+e+7?{gr:this.Lt,wr:r}:null}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;if(!1===this.Lt.Tt)return;const e=Math.round(this.Lt.rt*s);e<0||e>i.height||(t.lineCap="butt",t.strokeStyle=this.Lt.O,t.lineWidth=Math.floor(this.Lt.ht*n),f(t,this.Lt.Wt),v(t,e,0,i.width))}}class li{constructor(t){this.Mr={rt:0,O:"rgba(0, 0, 0, 0)",ht:1,Wt:0,Tt:!1},this.Sr=new hi,this.bt=!0,this.Es=t,this.Ls=t.qt(),this.Sr.it(this.Mr)}gt(){this.bt=!0}xt(){return this.Es.Tt()?(this.bt&&(this.kr(),this.bt=!1),this.Sr):null}}class ai extends li{constructor(t){super(t)}kr(){this.Mr.Tt=!1;const t=this.Es.At(),i=t.yr().yr;if(2!==i&&3!==i)return;const n=this.Es.W();if(!n.baseLineVisible||!this.Es.Tt())return;const s=this.Es.Pt();null!==s&&(this.Mr.Tt=!0,this.Mr.rt=t.Ot(s.Vt,s.Vt),this.Mr.O=n.baseLineColor,this.Mr.ht=n.baseLineWidth,this.Mr.Wt=n.baseLineStyle)}}class oi extends Y{constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}He(){return this.Lt}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){const s=this.Lt;if(null===s)return;const e=Math.max(1,Math.floor(i)),r=e%2/2,h=Math.round(s.Xe.x*i)+r,l=s.Xe.y*n;t.fillStyle=s.Cr,t.beginPath();const a=Math.max(2,1.5*s.Tr)*i;t.arc(h,l,a,0,2*Math.PI,!1),t.fill(),t.fillStyle=s.Pr,t.beginPath(),t.arc(h,l,s.ot*i,0,2*Math.PI,!1),t.fill(),t.lineWidth=e,t.strokeStyle=s.Rr,t.beginPath(),t.arc(h,l,s.ot*i+e/2,0,2*Math.PI,!1),t.stroke()}}const _i=[{Dr:0,Or:.25,Ar:4,Vr:10,Br:.25,Ir:0,zr:.4,Er:.8},{Dr:.25,Or:.525,Ar:10,Vr:14,Br:0,Ir:0,zr:.8,Er:0},{Dr:.525,Or:1,Ar:14,Vr:14,Br:0,Ir:0,zr:0,Er:0}];function ui(t,i,n,s){return function(t,i){if("transparent"===t)return t;const n=T(t),s=n[3];return`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${i*s})`}(t,n+(s-n)*i)}function ci(t,i){const n=t%2600/2600;let s;for(const t of _i)if(n>=t.Dr&&n<=t.Or){s=t;break}p(void 0!==s,"Last price animation internal logic error");const e=(n-s.Dr)/(s.Or-s.Dr);return{Pr:ui(i,e,s.Br,s.Ir),Rr:ui(i,e,s.zr,s.Er),ot:(r=e,h=s.Ar,l=s.Vr,h+(l-h)*r)};var r,h,l}class di{constructor(t){this.Ht=new oi,this.bt=!0,this.Lr=!0,this.Nr=performance.now(),this.Fr=this.Nr-1,this.Wr=t}jr(){this.Fr=this.Nr-1,this.gt()}Hr(){if(this.gt(),2===this.Wr.W().lastPriceAnimation){const t=performance.now(),i=this.Fr-t;if(i>0)return void(i<650&&(this.Fr+=2600));this.Nr=t,this.Fr=t+2600}}gt(){this.bt=!0}$r(){this.Lr=!0}Tt(){return 0!==this.Wr.W().lastPriceAnimation}Ur(){switch(this.Wr.W().lastPriceAnimation){case 0:return!1;case 1:return!0;case 2:return performance.now()<=this.Fr}}xt(){return this.bt?(this.St(),this.bt=!1,this.Lr=!1):this.Lr&&(this.qr(),this.Lr=!1),this.Ht}St(){this.Ht.it(null);const t=this.Wr.qt().yt(),i=t.Xs(),n=this.Wr.Pt();if(null===i||null===n)return;const s=this.Wr.Yr(!0);if(s.Xr||!i.Kr(s.se))return;const e={x:t.Et(s.se),y:this.Wr.At().Ot(s.ct,n.Vt)},r=s.O,h=this.Wr.W().lineWidth,l=ci(this.Zr(),r);this.Ht.it({Cr:r,Tr:h,Pr:l.Pr,Rr:l.Rr,ot:l.ot,Xe:e})}qr(){const t=this.Ht.He();if(null!==t){const i=ci(this.Zr(),t.Cr);t.Pr=i.Pr,t.Rr=i.Rr,t.ot=i.ot}}Zr(){return this.Ur()?performance.now()-this.Nr:2599}}function fi(t,i){return Tt(Math.min(Math.max(t,12),30)*i)}function vi(t,i){switch(t){case"arrowDown":case"arrowUp":return fi(i,1);case"circle":return fi(i,.8);case"square":return fi(i,.7)}}function pi(t){return function(t){const i=Math.ceil(t);return i%2!=0?i-1:i}(fi(t,1))}function mi(t){return Math.max(fi(t,.1),3)}function bi(t,i,n,s,e){const r=vi("square",n),h=(r-1)/2,l=t-h,a=i-h;return s>=l&&s<=l+r&&e>=a&&e<=a+r}function wi(t,i,n,s,e){const r=(vi("arrowUp",e)-1)/2,h=(Tt(e/2)-1)/2;i.beginPath(),t?(i.moveTo(n-r,s),i.lineTo(n,s-r),i.lineTo(n+r,s),i.lineTo(n+h,s),i.lineTo(n+h,s+r),i.lineTo(n-h,s+r),i.lineTo(n-h,s)):(i.moveTo(n-r,s),i.lineTo(n,s+r),i.lineTo(n+r,s),i.lineTo(n+h,s),i.lineTo(n+h,s-r),i.lineTo(n-h,s-r),i.lineTo(n-h,s)),i.fill()}function gi(t,i,n,s,e,r){return bi(i,n,s,e,r)}class Mi extends j{constructor(){super(...arguments),this.Lt=null,this.lr=new si,this.j=-1,this.H="",this.Gr=""}it(t){this.Lt=t}ar(t,i){this.j===t&&this.H===i||(this.j=t,this.H=i,this.Gr=N(t,i),this.lr.ir())}br(t,i){if(null===this.Lt||null===this.Lt.nt)return null;for(let n=this.Lt.nt.from;n=t&&e<=t+n&&r>=i-h&&r<=i+h}(t.Jt.et,t.Jt.rt,t.Jt.$i,t.Jt.zt,i,n))||function(t,i,n){if(0===t.Ks)return!1;switch(t.th){case"arrowDown":case"arrowUp":return gi(0,t.et,t.rt,t.Ks,i,n);case"circle":return function(t,i,n,s,e){const r=2+vi("circle",n)/2,h=t-s,l=i-e;return Math.sqrt(h*h+l*l)<=r}(t.et,t.rt,t.Ks,i,n);case"square":return bi(t.et,t.rt,t.Ks,i,n)}}(t,i,n)}function ki(t,i,n,s,e,r,h,l,a){const o=O(n)?n:n.xe,_=O(n)?n:n.ge,u=O(n)?n:n.Me,c=O(i.size)?Math.max(i.size,0):1,d=pi(l.he())*c,f=d/2;switch(t.Ks=d,i.position){case"inBar":return t.rt=h.Ot(o,a),void(void 0!==t.Jt&&(t.Jt.rt=t.rt+f+r+.6*e));case"aboveBar":return t.rt=h.Ot(_,a)-f-s.ih,void 0!==t.Jt&&(t.Jt.rt=t.rt-f-.6*e,s.ih+=1.2*e),void(s.ih+=d+r);case"belowBar":return t.rt=h.Ot(u,a)+f+s.nh,void 0!==t.Jt&&(t.Jt.rt=t.rt+f+r+.6*e,s.nh+=1.2*e),void(s.nh+=d+r)}i.position}class yi{constructor(t,i){this.bt=!0,this.sh=!0,this.eh=!0,this.rh=null,this.Ht=new Mi,this.Wr=t,this.Ui=i,this.Lt={st:[],nt:null}}gt(t){this.bt=!0,this.eh=!0,"data"===t&&(this.sh=!0)}xt(t){if(!this.Wr.Tt())return null;this.bt&&this.hh();const i=this.Ui.W().layout;return this.Ht.ar(i.fontSize,i.fontFamily),this.Ht.it(this.Lt),this.Ht}lh(){if(this.eh){if(this.Wr.ah().length>0){const t=this.Ui.yt().he(),i=mi(t),n=1.5*pi(t)+2*i;this.rh={above:n,below:n}}else this.rh=null;this.eh=!1}return this.rh}hh(){const t=this.Wr.At(),i=this.Ui.yt(),n=this.Wr.ah();this.sh&&(this.Lt.st=n.map((t=>({ut:t.time,et:0,rt:0,Ks:0,th:t.shape,O:t.color,Jr:t.Jr,wr:t.id,Jt:void 0}))),this.sh=!1);const s=this.Ui.W().layout;this.Lt.nt=null;const e=i.Xs();if(null===e)return;const r=this.Wr.Pt();if(null===r)return;if(0===this.Lt.st.length)return;let h=NaN;const l=mi(i.he()),a={ih:l,nh:l};this.Lt.nt=Lt(this.Lt.st,e,!0);for(let e=this.Lt.nt.from;e0&&(_.Jt={Qr:o.text,et:0,rt:0,$i:0,zt:0});const u=this.Wr.oh(o.time);null!==u&&ki(_,o,u,a,s.fontSize,l,t,i,r.Vt)}this.bt=!1}}class Ci extends li{constructor(t){super(t)}kr(){const t=this.Mr;t.Tt=!1;const i=this.Es.W();if(!i.priceLineVisible||!this.Es.Tt())return;const n=this.Es.Yr(0===i.priceLineSource);n.Xr||(t.Tt=!0,t.rt=n.yi,t.O=this.Es._h(n.O),t.ht=i.priceLineWidth,t.Wt=i.priceLineStyle)}}class Ti extends st{constructor(t){super(),this.$t=t}Ei(t,i,n){t.Tt=!1,i.Tt=!1;const s=this.$t;if(!s.Tt())return;const e=s.W(),r=e.lastValueVisible,h=""!==s.uh(),l=0===e.seriesLastValueMode,a=s.Yr(!1);if(a.Xr)return;r&&(t.Jt=this.dh(a,r,l),t.Tt=0!==t.Jt.length),(h||l)&&(i.Jt=this.fh(a,r,h,l),i.Tt=i.Jt.length>0);const o=s._h(a.O),_=P(o);n.t=_.t,n.yi=a.yi,i.Bt=s.qt().It(a.yi/s.At().zt()),t.Bt=o,t.O=_.i,i.O=_.i}fh(t,i,n,s){let e="";const r=this.$t.uh();return n&&0!==r.length&&(e+=`${r} `),i&&s&&(e+=this.$t.At().ph()?t.mh:t.bh),e.trim()}dh(t,i,n){return i?n?this.$t.At().ph()?t.bh:t.mh:t.Jt:""}}function Pi(t,i,n,s){const e=Number.isFinite(i),r=Number.isFinite(n);return e&&r?t(i,n):e||r?e?i:n:s}class Ri{constructor(t,i){this.wh=t,this.gh=i}Mh(t){return null!==t&&(this.wh===t.wh&&this.gh===t.gh)}xh(){return new Ri(this.wh,this.gh)}Sh(){return this.wh}kh(){return this.gh}yh(){return this.gh-this.wh}Fi(){return this.gh===this.wh||Number.isNaN(this.gh)||Number.isNaN(this.wh)}ts(t){return null===t?this:new Ri(Pi(Math.min,this.Sh(),t.Sh(),-1/0),Pi(Math.max,this.kh(),t.kh(),1/0))}Ch(t){if(!O(t))return;if(0===this.gh-this.wh)return;const i=.5*(this.gh+this.wh);let n=this.gh-i,s=this.wh-i;n*=t,s*=t,this.gh=i+n,this.wh=i+s}Th(t){O(t)&&(this.gh+=t,this.wh+=t)}Ph(){return{minValue:this.wh,maxValue:this.gh}}static Rh(t){return null===t?null:new Ri(t.minValue,t.maxValue)}}class Di{constructor(t,i){this.Dh=t,this.Oh=i||null}Ah(){return this.Dh}Vh(){return this.Oh}Ph(){return null===this.Dh?null:{priceRange:this.Dh.Ph(),margins:this.Oh||void 0}}static Rh(t){return null===t?null:new Di(Ri.Rh(t.priceRange),t.margins)}}class Oi extends li{constructor(t,i){super(t),this.Bh=i}kr(){const t=this.Mr;t.Tt=!1;const i=this.Bh.W();if(!this.Es.Tt()||!i.lineVisible)return;const n=this.Bh.Ih();null!==n&&(t.Tt=!0,t.rt=n,t.O=i.color,t.ht=i.lineWidth,t.Wt=i.lineStyle,t.wr=this.Bh.W().id)}}class Ai extends st{constructor(t,i){super(),this.Wr=t,this.Bh=i}Ei(t,i,n){t.Tt=!1,i.Tt=!1;const s=this.Bh.W(),e=s.axisLabelVisible,r=""!==s.title,h=this.Wr;if(!e||!h.Tt())return;const l=this.Bh.Ih();if(null===l)return;r&&(i.Jt=s.title,i.Tt=!0),i.Bt=h.qt().It(l/h.At().zt()),t.Jt=this.zh(s.price),t.Tt=!0;const a=P(s.axisLabelColor||s.color);n.t=a.t;const o=s.axisLabelTextColor||a.i;t.O=o,i.O=o,n.yi=l}zh(t){const i=this.Wr.Pt();return null===i?"":this.Wr.At().Wi(t,i.Vt)}}class Vi{constructor(t,i){this.Wr=t,this.cn=i,this.Eh=new Oi(t,this),this._r=new Ai(t,this),this.Lh=new ri(this._r,t,t.qt())}Nh(t){D(this.cn,t),this.gt(),this.Wr.qt().Fh()}W(){return this.cn}Wh(){return this.Eh}jh(){return this.Lh}Hh(){return this._r}gt(){this.Eh.gt(),this._r.gt()}Ih(){const t=this.Wr,i=t.At();if(t.qt().yt().Fi()||i.Fi())return null;const n=t.Pt();return null===n?null:i.Ot(this.cn.price,n.Vt)}}class Bi extends at{constructor(t){super(),this.Ui=t}qt(){return this.Ui}}const Ii={Bar:(t,i,n,s)=>{var e;const r=i.upColor,h=i.downColor,l=b(t(n,s)),a=w(l.Vt[0])<=w(l.Vt[3]);return{ue:null!==(e=l.O)&&void 0!==e?e:a?r:h}},Candlestick:(t,i,n,s)=>{var e,r,h;const l=i.upColor,a=i.downColor,o=i.borderUpColor,_=i.borderDownColor,u=i.wickUpColor,c=i.wickDownColor,d=b(t(n,s)),f=w(d.Vt[0])<=w(d.Vt[3]);return{ue:null!==(e=d.O)&&void 0!==e?e:f?l:a,Le:null!==(r=d.Bt)&&void 0!==r?r:f?o:_,Ee:null!==(h=d.$h)&&void 0!==h?h:f?u:c}},Custom:(t,i,n,s)=>{var e;return{ue:null!==(e=b(t(n,s)).O)&&void 0!==e?e:i.color}},Area:(t,i,n,s)=>{var e,r,h,l;const a=b(t(n,s));return{ue:null!==(e=a._t)&&void 0!==e?e:i.lineColor,_t:null!==(r=a._t)&&void 0!==r?r:i.lineColor,Ts:null!==(h=a.Ts)&&void 0!==h?h:i.topColor,Ps:null!==(l=a.Ps)&&void 0!==l?l:i.bottomColor}},Baseline:(t,i,n,s)=>{var e,r,h,l,a,o;const _=b(t(n,s));return{ue:_.Vt[3]>=i.baseValue.price?i.topLineColor:i.bottomLineColor,Pe:null!==(e=_.Pe)&&void 0!==e?e:i.topLineColor,Re:null!==(r=_.Re)&&void 0!==r?r:i.bottomLineColor,Se:null!==(h=_.Se)&&void 0!==h?h:i.topFillColor1,ke:null!==(l=_.ke)&&void 0!==l?l:i.topFillColor2,ye:null!==(a=_.ye)&&void 0!==a?a:i.bottomFillColor1,Ce:null!==(o=_.Ce)&&void 0!==o?o:i.bottomFillColor2}},Line:(t,i,n,s)=>{var e,r;const h=b(t(n,s));return{ue:null!==(e=h.O)&&void 0!==e?e:i.color,_t:null!==(r=h.O)&&void 0!==r?r:i.color}},Histogram:(t,i,n,s)=>{var e;return{ue:null!==(e=b(t(n,s)).O)&&void 0!==e?e:i.color}}};class zi{constructor(t){this.Uh=(t,i)=>void 0!==i?i.Vt:this.Wr.In().qh(t),this.Wr=t,this.Yh=Ii[t.Xh()]}Hs(t,i){return this.Yh(this.Uh,this.Wr.W(),t,i)}}var Ei;!function(t){t[t.NearestLeft=-1]="NearestLeft",t[t.None=0]="None",t[t.NearestRight=1]="NearestRight"}(Ei||(Ei={}));const Li=30;class Ni{constructor(){this.Kh=[],this.Zh=new Map,this.Gh=new Map}Jh(){return this.Ks()>0?this.Kh[this.Kh.length-1]:null}Qh(){return this.Ks()>0?this.tl(0):null}Bn(){return this.Ks()>0?this.tl(this.Kh.length-1):null}Ks(){return this.Kh.length}Fi(){return 0===this.Ks()}Kr(t){return null!==this.il(t,0)}qh(t){return this.nl(t)}nl(t,i=0){const n=this.il(t,i);return null===n?null:Object.assign(Object.assign({},this.sl(n)),{se:this.tl(n)})}ie(){return this.Kh}el(t,i,n){if(this.Fi())return null;let s=null;for(const e of n){s=Fi(s,this.rl(t,i,e))}return s}it(t){this.Gh.clear(),this.Zh.clear(),this.Kh=t}tl(t){return this.Kh[t].se}sl(t){return this.Kh[t]}il(t,i){const n=this.hl(t);if(null===n&&0!==i)switch(i){case-1:return this.ll(t);case 1:return this.al(t);default:throw new TypeError("Unknown search mode")}return n}ll(t){let i=this.ol(t);return i>0&&(i-=1),i!==this.Kh.length&&this.tl(i)t.set.se>i))}ul(t,i,n){let s=null;for(let e=t;es.dl&&(s.dl=t)))}return s}rl(t,i,n){if(this.Fi())return null;let s=null;const e=b(this.Qh()),r=b(this.Bn()),h=Math.max(t,e),l=Math.min(i,r),a=Math.ceil(h/Li)*Li,o=Math.max(a,Math.floor(l/Li)*Li);{const t=this.ol(h),e=this._l(Math.min(l,a,i));s=Fi(s,this.ul(t,e,n))}let _=this.Zh.get(n);void 0===_&&(_=new Map,this.Zh.set(n,_));for(let t=Math.max(a+1,h);tnew ji(t)));return this.gl={vl:e,pl:r},r}tn(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.yl).timeAxisViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.Ml)||void 0===s?void 0:s.vl)===e)return this.Ml.pl;const r=this.Wr.qt().yt(),h=e.map((t=>new $i(t,r)));return this.Ml={vl:e,pl:h},h}Rn(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.yl).priceAxisViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.xl)||void 0===s?void 0:s.vl)===e)return this.xl.pl;const r=this.Wr.At(),h=e.map((t=>new Ui(t,r)));return this.xl={vl:e,pl:h},h}Tl(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.yl).priceAxisPaneViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.Sl)||void 0===s?void 0:s.vl)===e)return this.Sl.pl;const r=e.map((t=>new ji(t)));return this.Sl={vl:e,pl:r},r}Pl(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.yl).timeAxisPaneViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.kl)||void 0===s?void 0:s.vl)===e)return this.kl.pl;const r=e.map((t=>new ji(t)));return this.kl={vl:e,pl:r},r}Rl(t,i){var n,s,e;return null!==(e=null===(s=(n=this.yl).autoscaleInfo)||void 0===s?void 0:s.call(n,t,i))&&void 0!==e?e:null}br(t,i){var n,s,e;return null!==(e=null===(s=(n=this.yl).hitTest)||void 0===s?void 0:s.call(n,t,i))&&void 0!==e?e:null}}function Yi(t,i,n,s){t.forEach((t=>{i(t).forEach((t=>{t.ml()===n&&s.push(t)}))}))}function Xi(t){return t.Pn()}function Ki(t){return t.Tl()}function Zi(t){return t.Pl()}class Gi extends Bi{constructor(t,i,n,s,e){super(t),this.Lt=new Ni,this.Eh=new Ci(this),this.Dl=[],this.Ol=new ai(this),this.Al=null,this.Vl=null,this.Bl=[],this.Il=[],this.zl=null,this.El=[],this.cn=i,this.Ll=n;const r=new Ti(this);this.hn=[r],this.Lh=new ri(r,this,t),"Area"!==n&&"Line"!==n&&"Baseline"!==n||(this.Al=new di(this)),this.Nl(),this.Fl(e)}S(){null!==this.zl&&clearTimeout(this.zl)}_h(t){return this.cn.priceLineColor||t}Yr(t){const i={Xr:!0},n=this.At();if(this.qt().yt().Fi()||n.Fi()||this.Lt.Fi())return i;const s=this.qt().yt().Xs(),e=this.Pt();if(null===s||null===e)return i;let r,h;if(t){const t=this.Lt.Jh();if(null===t)return i;r=t,h=t.se}else{const t=this.Lt.nl(s.di(),-1);if(null===t)return i;if(r=this.Lt.qh(t.se),null===r)return i;h=t.se}const l=r.Vt[3],a=this.$s().Hs(h,{Vt:r}),o=n.Ot(l,e.Vt);return{Xr:!1,ct:l,Jt:n.Wi(l,e.Vt),mh:n.Wl(l),bh:n.jl(l,e.Vt),O:a.ue,yi:o,se:h}}$s(){return null!==this.Vl||(this.Vl=new zi(this)),this.Vl}W(){return this.cn}Nh(t){const i=t.priceScaleId;void 0!==i&&i!==this.cn.priceScaleId&&this.qt().Hl(this,i),D(this.cn,t),void 0!==t.priceFormat&&(this.Nl(),this.qt().$l()),this.qt().Ul(this),this.qt().ql(),this.wn.gt("options")}it(t,i){this.Lt.it(t),this.Yl(),this.wn.gt("data"),this.dn.gt("data"),null!==this.Al&&(i&&i.Xl?this.Al.Hr():0===t.length&&this.Al.jr());const n=this.qt().cr(this);this.qt().Kl(n),this.qt().Ul(this),this.qt().ql(),this.qt().Fh()}Zl(t){this.Bl=t,this.Yl();const i=this.qt().cr(this);this.dn.gt("data"),this.qt().Kl(i),this.qt().Ul(this),this.qt().ql(),this.qt().Fh()}Gl(){return this.Bl}ah(){return this.Il}Jl(t){const i=new Vi(this,t);return this.Dl.push(i),this.qt().Ul(this),i}Ql(t){const i=this.Dl.indexOf(t);-1!==i&&this.Dl.splice(i,1),this.qt().Ul(this)}Xh(){return this.Ll}Pt(){const t=this.ta();return null===t?null:{Vt:t.Vt[3],ia:t.ut}}ta(){const t=this.qt().yt().Xs();if(null===t)return null;const i=t.Os();return this.Lt.nl(i,1)}In(){return this.Lt}oh(t){const i=this.Lt.qh(t);return null===i?null:"Bar"===this.Ll||"Candlestick"===this.Ll||"Custom"===this.Ll?{we:i.Vt[0],ge:i.Vt[1],Me:i.Vt[2],xe:i.Vt[3]}:i.Vt[3]}na(t){const i=[];Yi(this.El,Xi,"top",i);const n=this.Al;return null!==n&&n.Tt()?(null===this.zl&&n.Ur()&&(this.zl=setTimeout((()=>{this.zl=null,this.qt().sa()}),0)),n.$r(),i.push(n),i):i}Pn(){const t=[];this.ea()||t.push(this.Ol),t.push(this.wn,this.Eh,this.dn);const i=this.Dl.map((t=>t.Wh()));return t.push(...i),Yi(this.El,Xi,"normal",t),t}ra(){return this.ha(Xi,"bottom")}la(t){return this.ha(Ki,t)}aa(t){return this.ha(Zi,t)}oa(t,i){return this.El.map((n=>n.br(t,i))).filter((t=>null!==t))}Qi(t){return[this.Lh,...this.Dl.map((t=>t.jh()))]}Rn(t,i){if(i!==this.Xi&&!this.ea())return[];const n=[...this.hn];for(const t of this.Dl)n.push(t.Hh());return this.El.forEach((t=>{n.push(...t.Rn())})),n}tn(){const t=[];return this.El.forEach((i=>{t.push(...i.tn())})),t}Rl(t,i){if(void 0!==this.cn.autoscaleInfoProvider){const n=this.cn.autoscaleInfoProvider((()=>{const n=this._a(t,i);return null===n?null:n.Ph()}));return Di.Rh(n)}return this._a(t,i)}ua(){return this.cn.priceFormat.minMove}ca(){return this.da}On(){var t;this.wn.gt(),this.dn.gt();for(const t of this.hn)t.gt();for(const t of this.Dl)t.gt();this.Eh.gt(),this.Ol.gt(),null===(t=this.Al)||void 0===t||t.gt(),this.El.forEach((t=>t.On()))}At(){return b(super.At())}Ct(t){if(!(("Line"===this.Ll||"Area"===this.Ll||"Baseline"===this.Ll)&&this.cn.crosshairMarkerVisible))return null;const i=this.Lt.qh(t);if(null===i)return null;return{ct:i.Vt[3],ot:this.fa(),Bt:this.va(),Dt:this.pa(),Rt:this.ma(t)}}uh(){return this.cn.title}Tt(){return this.cn.visible}ba(t){this.El.push(new qi(t,this))}wa(t){this.El=this.El.filter((i=>i.Cl()!==t))}ga(){if(this.wn instanceof Gt!=!1)return t=>this.wn.Fe(t)}Ma(){if(this.wn instanceof Gt!=!1)return t=>this.wn.We(t)}ea(){return!ut(this.At().xa())}_a(t,i){if(!A(t)||!A(i)||this.Lt.Fi())return null;const n="Line"===this.Ll||"Area"===this.Ll||"Baseline"===this.Ll||"Histogram"===this.Ll?[3]:[2,1],s=this.Lt.el(t,i,n);let e=null!==s?new Ri(s.cl,s.dl):null;if("Histogram"===this.Xh()){const t=this.cn.base,i=new Ri(t,t);e=null!==e?e.ts(i):i}let r=this.dn.lh();return this.El.forEach((n=>{const s=n.Rl(t,i);if(null==s?void 0:s.priceRange){const t=new Ri(s.priceRange.minValue,s.priceRange.maxValue);e=null!==e?e.ts(t):t}var h,l,a,o;(null==s?void 0:s.margins)&&(h=r,l=s.margins,r={above:Math.max(null!==(a=null==h?void 0:h.above)&&void 0!==a?a:0,l.above),below:Math.max(null!==(o=null==h?void 0:h.below)&&void 0!==o?o:0,l.below)})})),new Di(e,r)}fa(){switch(this.Ll){case"Line":case"Area":case"Baseline":return this.cn.crosshairMarkerRadius}return 0}va(){switch(this.Ll){case"Line":case"Area":case"Baseline":{const t=this.cn.crosshairMarkerBorderColor;if(0!==t.length)return t}}return null}pa(){switch(this.Ll){case"Line":case"Area":case"Baseline":return this.cn.crosshairMarkerBorderWidth}return 0}ma(t){switch(this.Ll){case"Line":case"Area":case"Baseline":{const t=this.cn.crosshairMarkerBackgroundColor;if(0!==t.length)return t}}return this.$s().Hs(t).ue}Nl(){switch(this.cn.priceFormat.type){case"custom":this.da={format:this.cn.priceFormat.formatter};break;case"volume":this.da=new mt(this.cn.priceFormat.precision);break;case"percent":this.da=new pt(this.cn.priceFormat.precision);break;default:{const t=Math.pow(10,this.cn.priceFormat.precision);this.da=new vt(t,this.cn.priceFormat.minMove*t)}}null!==this.Xi&&this.Xi.Sa()}Yl(){const t=this.qt().yt();if(!t.ka()||this.Lt.Fi())return void(this.Il=[]);const i=b(this.Lt.Qh());this.Il=this.Bl.map(((n,s)=>{const e=b(t.ya(n.time,!0)),r=et instanceof Gi)).reduce(((t,s)=>{if(n.dr(s)||!s.Tt())return t;const e=s.At(),r=s.In();if(e.Fi()||!r.Kr(i))return t;const h=r.qh(i);if(null===h)return t;const l=w(s.Pt());return t.concat([e.Ot(h.Vt[3],l.Vt)])}),[]);if(0===l.length)return s;l.sort(((t,i)=>Math.abs(t-h)-Math.abs(i-h)));const a=l[0];return s=e.pn(a,r),s}}class Qi extends Y{constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;const e=Math.max(1,Math.floor(n));t.lineWidth=e,function(t,i){t.save(),t.lineWidth%2&&t.translate(.5,.5),i(),t.restore()}(t,(()=>{const r=b(this.Lt);if(5!==r.Pa){if(r.Ra){t.strokeStyle=r.Da,f(t,r.Pa),t.beginPath();for(const s of r.Oa){const r=Math.round(s.Aa*n);t.moveTo(r,-e),t.lineTo(r,i.height+e)}t.stroke()}if(r.Va){t.strokeStyle=r.Ba,f(t,r.Ia),t.beginPath();for(const n of r.za){const r=Math.round(n.Aa*s);t.moveTo(-e,r),t.lineTo(i.width+e,r)}t.stroke()}}else{if(!r.Ra||!r.Va)return;t.fillStyle=r.Da,f(t,r.Pa),t.beginPath();const i=r.za.length>1?r.za[1].Aa-r.za[0].Aa:void 0;let e;for(let h=0;h1.7*i;e=o;for(let i=0;i({Aa:t.coord})))};this.Ht.it(i),this.bt=!1}return this.Ht}}class nn{constructor(t){this.wn=new tn(t)}Wh(){return this.wn}}const sn={La:4,Na:1e-4};function en(t,i){const n=100*(t-i)/i;return i<0?-n:n}function rn(t,i){const n=en(t.Sh(),i),s=en(t.kh(),i);return new Ri(n,s)}function hn(t,i){const n=100*(t-i)/i+100;return i<0?-n:n}function ln(t,i){const n=hn(t.Sh(),i),s=hn(t.kh(),i);return new Ri(n,s)}function an(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.log10(n+i.Na)+i.La;return t<0?-s:s}function on(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.pow(10,n-i.La)-i.Na;return t<0?-s:s}function _n(t,i){if(null===t)return null;const n=an(t.Sh(),i),s=an(t.kh(),i);return new Ri(n,s)}function un(t,i){if(null===t)return null;const n=on(t.Sh(),i),s=on(t.kh(),i);return new Ri(n,s)}function cn(t){if(null===t)return sn;const i=Math.abs(t.kh()-t.Sh());if(i>=1||i<1e-15)return sn;const n=Math.ceil(Math.abs(Math.log10(i))),s=sn.La+n;return{La:s,Na:1/Math.pow(10,s)}}class dn{constructor(t,i){if(this.Fa=t,this.Wa=i,function(t){if(t<0)return!1;for(let i=t;i>1;i/=10)if(i%10!=0)return!1;return!0}(this.Fa))this.ja=[2,2.5,2];else{this.ja=[];for(let t=this.Fa;1!==t;){if(t%2==0)this.ja.push(2),t/=2;else{if(t%5!=0)throw new Error("unexpected base");this.ja.push(2,2.5),t/=5}if(this.ja.length>100)throw new Error("something wrong with base")}}}Ha(t,i,n){const s=0===this.Fa?0:1/this.Fa;let e=Math.pow(10,Math.max(0,Math.ceil(Math.log10(t-i)))),r=0,h=this.Wa[0];for(;;){const t=Ct(e,s,1e-14)&&e>s+1e-14,i=Ct(e,n*h,1e-14),l=Ct(e,1,1e-14);if(!(t&&i&&l))break;e/=h,h=this.Wa[++r%this.Wa.length]}if(e<=s+1e-14&&(e=s),e=Math.max(1,e),this.ja.length>0&&(l=e,a=1,o=1e-14,Math.abs(l-a)s+1e-14;)e/=h,h=this.ja[++r%this.ja.length];var l,a,o;return e}}class fn{constructor(t,i,n,s){this.$a=[],this.Li=t,this.Fa=i,this.Ua=n,this.qa=s}Ha(t,i){if(t=o?1:-1;let d=null,f=0;for(let n=a-u;n>o;n-=_){const s=this.qa(n,i,!0);null!==d&&Math.abs(s-d)l||(fb(t.Zi())-b(i.Zi())))}var pn;!function(t){t[t.Normal=0]="Normal",t[t.Logarithmic=1]="Logarithmic",t[t.Percentage=2]="Percentage",t[t.IndexedTo100=3]="IndexedTo100"}(pn||(pn={}));const mn=new pt,bn=new vt(100,1);class wn{constructor(t,i,n,s){this.Qa=0,this.io=null,this.Dh=null,this.no=null,this.so={eo:!1,ro:null},this.ho=0,this.lo=0,this.ao=new R,this.oo=new R,this._o=[],this.uo=null,this.co=null,this.do=null,this.fo=null,this.da=bn,this.vo=cn(null),this.po=t,this.cn=i,this.mo=n,this.bo=s,this.wo=new fn(this,100,this.Mo.bind(this),this.xo.bind(this))}xa(){return this.po}W(){return this.cn}Nh(t){if(D(this.cn,t),this.Sa(),void 0!==t.mode&&this.So({yr:t.mode}),void 0!==t.scaleMargins){const i=m(t.scaleMargins.top),n=m(t.scaleMargins.bottom);if(i<0||i>1)throw new Error(`Invalid top margin - expect value between 0 and 1, given=${i}`);if(n<0||n>1||i+n>1)throw new Error(`Invalid bottom margin - expect value between 0 and 1, given=${n}`);if(i+n>1)throw new Error(`Invalid margins - sum of margins must be less than 1, given=${i+n}`);this.ko(),this.co=null}}yo(){return this.cn.autoScale}Ja(){return 1===this.cn.mode}ph(){return 2===this.cn.mode}Co(){return 3===this.cn.mode}yr(){return{Wn:this.cn.autoScale,To:this.cn.invertScale,yr:this.cn.mode}}So(t){const i=this.yr();let n=null;void 0!==t.Wn&&(this.cn.autoScale=t.Wn),void 0!==t.yr&&(this.cn.mode=t.yr,2!==t.yr&&3!==t.yr||(this.cn.autoScale=!0),this.so.eo=!1),1===i.yr&&t.yr!==i.yr&&(!function(t,i){if(null===t)return!1;const n=on(t.Sh(),i),s=on(t.kh(),i);return isFinite(n)&&isFinite(s)}(this.Dh,this.vo)?this.cn.autoScale=!0:(n=un(this.Dh,this.vo),null!==n&&this.Po(n))),1===t.yr&&t.yr!==i.yr&&(n=_n(this.Dh,this.vo),null!==n&&this.Po(n));const s=i.yr!==this.cn.mode;s&&(2===i.yr||this.ph())&&this.Sa(),s&&(3===i.yr||this.Co())&&this.Sa(),void 0!==t.To&&i.To!==t.To&&(this.cn.invertScale=t.To,this.Ro()),this.oo.m(i,this.yr())}Do(){return this.oo}P(){return this.mo.fontSize}zt(){return this.Qa}Oo(t){this.Qa!==t&&(this.Qa=t,this.ko(),this.co=null)}Ao(){if(this.io)return this.io;const t=this.zt()-this.Vo()-this.Bo();return this.io=t,t}Ah(){return this.Io(),this.Dh}Po(t,i){const n=this.Dh;(i||null===n&&null!==t||null!==n&&!n.Mh(t))&&(this.co=null,this.Dh=t)}Fi(){return this.Io(),0===this.Qa||!this.Dh||this.Dh.Fi()}zo(t){return this.To()?t:this.zt()-1-t}Ot(t,i){return this.ph()?t=en(t,i):this.Co()&&(t=hn(t,i)),this.xo(t,i)}Qs(t,i,n){this.Io();const s=this.Bo(),e=b(this.Ah()),r=e.Sh(),h=e.kh(),l=this.Ao()-1,a=this.To(),o=l/(h-r),_=void 0===n?0:n.from,u=void 0===n?t.length:n.to,c=this.Eo();for(let n=_;nt.On()))}Sa(){this.co=null;const t=this.Jo();let i=100;null!==t&&(i=Math.round(1/t.ua())),this.da=bn,this.ph()?(this.da=mn,i=100):this.Co()?(this.da=new vt(100,1),i=100):null!==t&&(this.da=t.ca()),this.wo=new fn(this,i,this.Mo.bind(this),this.xo.bind(this)),this.wo.Xa()}Wo(){this.uo=null}Jo(){return this._o[0]||null}Vo(){return this.To()?this.cn.scaleMargins.bottom*this.zt()+this.lo:this.cn.scaleMargins.top*this.zt()+this.ho}Bo(){return this.To()?this.cn.scaleMargins.top*this.zt()+this.ho:this.cn.scaleMargins.bottom*this.zt()+this.lo}Io(){this.so.eo||(this.so.eo=!0,this.i_())}ko(){this.io=null}xo(t,i){if(this.Io(),this.Fi())return 0;t=this.Ja()&&t?an(t,this.vo):t;const n=b(this.Ah()),s=this.Bo()+(this.Ao()-1)*(t-n.Sh())/n.yh();return this.zo(s)}Mo(t,i){if(this.Io(),this.Fi())return 0;const n=this.zo(t),s=b(this.Ah()),e=s.Sh()+s.yh()*((n-this.Bo())/(this.Ao()-1));return this.Ja()?on(e,this.vo):e}Ro(){this.co=null,this.wo.Xa()}i_(){const t=this.so.ro;if(null===t)return;let i=null;const n=this.Qo();let s=0,e=0;for(const r of n){if(!r.Tt())continue;const n=r.Pt();if(null===n)continue;const h=r.Rl(t.Os(),t.di());let l=h&&h.Ah();if(null!==l){switch(this.cn.mode){case 1:l=_n(l,this.vo);break;case 2:l=rn(l,n.Vt);break;case 3:l=ln(l,n.Vt)}if(i=null===i?l:i.ts(b(l)),null!==h){const t=h.Vh();null!==t&&(s=Math.max(s,t.above),e=Math.max(s,t.below))}}}if(s===this.ho&&e===this.lo||(this.ho=s,this.lo=e,this.co=null,this.ko()),null!==i){if(i.Sh()===i.kh()){const t=this.Jo(),n=5*(null===t||this.ph()||this.Co()?1:t.ua());this.Ja()&&(i=un(i,this.vo)),i=new Ri(i.Sh()-n,i.kh()+n),this.Ja()&&(i=_n(i,this.vo))}if(this.Ja()){const t=un(i,this.vo),n=cn(t);if(r=n,h=this.vo,r.La!==h.La||r.Na!==h.Na){const s=null!==this.no?un(this.no,this.vo):null;this.vo=n,i=_n(t,n),null!==s&&(this.no=_n(s,n))}}this.Po(i)}else null===this.Dh&&(this.Po(new Ri(-.5,.5)),this.vo=cn(null));var r,h;this.so.eo=!0}Eo(){return this.ph()?en:this.Co()?hn:this.Ja()?t=>an(t,this.vo):null}n_(t,i,n){return void 0===i?(void 0===n&&(n=this.ca()),n.format(t)):i(t)}zh(t,i){return this.n_(t,this.bo.priceFormatter,i)}Go(t,i){return this.n_(t,this.bo.percentageFormatter,i)}}class gn{constructor(t,i){this._o=[],this.s_=new Map,this.Qa=0,this.e_=0,this.r_=1e3,this.uo=null,this.h_=new R,this.wl=t,this.Ui=i,this.l_=new nn(this);const n=i.W();this.a_=this.o_("left",n.leftPriceScale),this.__=this.o_("right",n.rightPriceScale),this.a_.Do().l(this.u_.bind(this,this.a_),this),this.__.Do().l(this.u_.bind(this,this.__),this),this.c_(n)}c_(t){if(t.leftPriceScale&&this.a_.Nh(t.leftPriceScale),t.rightPriceScale&&this.__.Nh(t.rightPriceScale),t.localization&&(this.a_.Sa(),this.__.Sa()),t.overlayPriceScales){const i=Array.from(this.s_.values());for(const n of i){const i=b(n[0].At());i.Nh(t.overlayPriceScales),t.localization&&i.Sa()}}}d_(t){switch(t){case"left":return this.a_;case"right":return this.__}return this.s_.has(t)?m(this.s_.get(t))[0].At():null}S(){this.qt().f_().p(this),this.a_.Do().p(this),this.__.Do().p(this),this._o.forEach((t=>{t.S&&t.S()})),this.h_.m()}v_(){return this.r_}p_(t){this.r_=t}qt(){return this.Ui}$i(){return this.e_}zt(){return this.Qa}m_(t){this.e_=t,this.b_()}Oo(t){this.Qa=t,this.a_.Oo(t),this.__.Oo(t),this._o.forEach((i=>{if(this.dr(i)){const n=i.At();null!==n&&n.Oo(t)}})),this.b_()}Ta(){return this._o}dr(t){const i=t.At();return null===i||this.a_!==i&&this.__!==i}Fo(t,i,n){const s=void 0!==n?n:this.g_().w_+1;this.M_(t,i,s)}jo(t){const i=this._o.indexOf(t);p(-1!==i,"removeDataSource: invalid data source"),this._o.splice(i,1);const n=b(t.At()).xa();if(this.s_.has(n)){const i=m(this.s_.get(n)),s=i.indexOf(t);-1!==s&&(i.splice(s,1),0===i.length&&this.s_.delete(n))}const s=t.At();s&&s.Ta().indexOf(t)>=0&&s.jo(t),null!==s&&(s.Wo(),this.x_(s)),this.uo=null}pr(t){return t===this.a_?"left":t===this.__?"right":"overlay"}S_(){return this.a_}k_(){return this.__}y_(t,i){t.Uo(i)}C_(t,i){t.qo(i),this.b_()}T_(t){t.Yo()}P_(t,i){t.Xo(i)}R_(t,i){t.Ko(i),this.b_()}D_(t){t.Zo()}b_(){this._o.forEach((t=>{t.On()}))}vn(){let t=null;return this.Ui.W().rightPriceScale.visible&&0!==this.__.Ta().length?t=this.__:this.Ui.W().leftPriceScale.visible&&0!==this.a_.Ta().length?t=this.a_:0!==this._o.length&&(t=this._o[0].At()),null===t&&(t=this.__),t}vr(){let t=null;return this.Ui.W().rightPriceScale.visible?t=this.__:this.Ui.W().leftPriceScale.visible&&(t=this.a_),t}x_(t){null!==t&&t.yo()&&this.O_(t)}A_(t){const i=this.wl.Xs();t.So({Wn:!0}),null!==i&&t.t_(i),this.b_()}V_(){this.O_(this.a_),this.O_(this.__)}B_(){this.x_(this.a_),this.x_(this.__),this._o.forEach((t=>{this.dr(t)&&this.x_(t.At())})),this.b_(),this.Ui.Fh()}No(){return null===this.uo&&(this.uo=vn(this._o)),this.uo}I_(){return this.h_}z_(){return this.l_}O_(t){const i=t.Qo();if(i&&i.length>0&&!this.wl.Fi()){const i=this.wl.Xs();null!==i&&t.t_(i)}t.On()}g_(){const t=this.No();if(0===t.length)return{E_:0,w_:0};let i=0,n=0;for(let s=0;sn&&(n=e))}return{E_:i,w_:n}}M_(t,i,n){let s=this.d_(i);if(null===s&&(s=this.o_(i,this.Ui.W().overlayPriceScales)),this._o.push(t),!ut(i)){const n=this.s_.get(i)||[];n.push(t),this.s_.set(i,n)}s.Fo(t),t.Ji(s),t.Gi(n),this.x_(s),this.uo=null}u_(t,i,n){i.yr!==n.yr&&this.O_(t)}o_(t,i){const n=Object.assign({visible:!0,autoScale:!0},I(i)),s=new wn(t,n,this.Ui.W().layout,this.Ui.W().localization);return s.Oo(this.zt()),s}}class Mn{constructor(t,i,n=50){this.Ke=0,this.Ze=1,this.Ge=1,this.Qe=new Map,this.Je=new Map,this.L_=t,this.N_=i,this.tr=n}F_(t){const i=t.time,n=this.N_.cacheKey(i),s=this.Qe.get(n);if(void 0!==s)return s.W_;if(this.Ke===this.tr){const t=this.Je.get(this.Ge);this.Je.delete(this.Ge),this.Qe.delete(m(t)),this.Ge++,this.Ke--}const e=this.L_(t);return this.Qe.set(n,{W_:e,er:this.Ze}),this.Je.set(this.Ze,n),this.Ke++,this.Ze++,e}}class xn{constructor(t,i){p(t<=i,"right should be >= left"),this.j_=t,this.H_=i}Os(){return this.j_}di(){return this.H_}U_(){return this.H_-this.j_+1}Kr(t){return this.j_<=t&&t<=this.H_}Mh(t){return this.j_===t.Os()&&this.H_===t.di()}}function Sn(t,i){return null===t||null===i?t===i:t.Mh(i)}class kn{constructor(){this.q_=new Map,this.Qe=null,this.Y_=!1}X_(t){this.Y_=t,this.Qe=null}K_(t,i){this.Z_(i),this.Qe=null;for(let n=i;n{t<=n[0].index?i.push(s):n.splice(Bt(n,t,(i=>i.indexi-t))){if(!this.q_.get(n))continue;const s=i;i=[];const e=s.length;let r=0;const h=m(this.q_.get(n)),l=h.length;let a=1/0,o=-1/0;for(let n=0;n=t&&_-o>=t)i.push(l),o=_;else if(this.Y_)return s}for(;ri.weight?t:i}class Tn{constructor(t,i,n,s){this.e_=0,this.eu=null,this.ru=[],this.fo=null,this.do=null,this.hu=new kn,this.lu=new Map,this.au=yn.su(),this.ou=!0,this._u=new R,this.uu=new R,this.cu=new R,this.du=null,this.fu=null,this.vu=[],this.cn=i,this.bo=n,this.pu=i.rightOffset,this.mu=i.barSpacing,this.Ui=t,this.N_=s,this.bu(),this.hu.X_(i.uniformDistribution)}W(){return this.cn}wu(t){D(this.bo,t),this.gu(),this.bu()}Nh(t,i){var n;D(this.cn,t),this.cn.fixLeftEdge&&this.Mu(),this.cn.fixRightEdge&&this.xu(),void 0!==t.barSpacing&&this.Ui.Gn(t.barSpacing),void 0!==t.rightOffset&&this.Ui.Jn(t.rightOffset),void 0!==t.minBarSpacing&&this.Ui.Gn(null!==(n=t.barSpacing)&&void 0!==n?n:this.mu),this.gu(),this.bu(),this.cu.m()}mn(t){var i,n;return null!==(n=null===(i=this.ru[t])||void 0===i?void 0:i.time)&&void 0!==n?n:null}qi(t){var i;return null!==(i=this.ru[t])&&void 0!==i?i:null}ya(t,i){if(this.ru.length<1)return null;if(this.N_.key(t)>this.N_.key(this.ru[this.ru.length-1].time))return i?this.ru.length-1:null;const n=Bt(this.ru,this.N_.key(t),((t,i)=>this.N_.key(t.time)0}Xs(){return this.Su(),this.au.iu()}ku(){return this.Su(),this.au.nu()}yu(){const t=this.Xs();if(null===t)return null;const i={from:t.Os(),to:t.di()};return this.Cu(i)}Cu(t){const i=Math.round(t.from),n=Math.round(t.to),s=b(this.Tu()),e=b(this.Pu());return{from:b(this.qi(Math.max(s,i))),to:b(this.qi(Math.min(e,n)))}}Ru(t){return{from:b(this.ya(t.from,!0)),to:b(this.ya(t.to,!0))}}$i(){return this.e_}m_(t){if(!isFinite(t)||t<=0)return;if(this.e_===t)return;const i=this.ku(),n=this.e_;if(this.e_=t,this.ou=!0,this.cn.lockVisibleTimeRangeOnResize&&0!==n){const i=this.mu*t/n;this.mu=i}if(this.cn.fixLeftEdge&&null!==i&&i.Os()<=0){const i=n-t;this.pu-=Math.round(i/this.mu)+1,this.ou=!0}this.Du(),this.Ou()}Et(t){if(this.Fi()||!A(t))return 0;const i=this.Au()+this.pu-t;return this.e_-(i+.5)*this.mu-1}Js(t,i){const n=this.Au(),s=void 0===i?0:i.from,e=void 0===i?t.length:i.to;for(let i=s;ii/2&&!o?n.needAlignCoordinate=!1:n.needAlignCoordinate=_&&t.index<=l||u&&t.index>=a,c++}return this.vu.length=c,this.fu=this.vu,this.vu}Fu(){this.ou=!0,this.Gn(this.cn.barSpacing),this.Jn(this.cn.rightOffset)}Wu(t){this.ou=!0,this.eu=t,this.Ou(),this.Mu()}ju(t,i){const n=this.Bu(t),s=this.he(),e=s+i*(s/10);this.Gn(e),this.cn.rightBarStaysOnScroll||this.Jn(this.Eu()+(n-this.Bu(t)))}Uo(t){this.fo&&this.Zo(),null===this.do&&null===this.du&&(this.Fi()||(this.do=t,this.Hu()))}qo(t){if(null===this.du)return;const i=yt(this.e_-t,0,this.e_),n=yt(this.e_-b(this.do),0,this.e_);0!==i&&0!==n&&this.Gn(this.du.he*i/n)}Yo(){null!==this.do&&(this.do=null,this.$u())}Xo(t){null===this.fo&&null===this.du&&(this.Fi()||(this.fo=t,this.Hu()))}Ko(t){if(null===this.fo)return;const i=(this.fo-t)/this.he();this.pu=b(this.du).Eu+i,this.ou=!0,this.Ou()}Zo(){null!==this.fo&&(this.fo=null,this.$u())}Uu(){this.qu(this.cn.rightOffset)}qu(t,i=400){if(!isFinite(t))throw new RangeError("offset is required and must be finite number");if(!isFinite(i)||i<=0)throw new RangeError("animationDuration (optional) must be finite positive number");const n=this.pu,s=performance.now();this.Ui.Xn({Yu:t=>(t-s)/i>=1,Xu:e=>{const r=(e-s)/i;return r>=1?t:n+(t-n)*r}})}gt(t,i){this.ou=!0,this.ru=t,this.hu.K_(t,i),this.Ou()}Ku(){return this._u}Zu(){return this.uu}Gu(){return this.cu}Au(){return this.eu||0}Ju(t){const i=t.U_();this.zu(this.e_/i),this.pu=t.di()-this.Au(),this.Ou(),this.ou=!0,this.Ui.Iu(),this.Ui.Fh()}Qu(){const t=this.Tu(),i=this.Pu();null!==t&&null!==i&&this.Ju(new xn(t,i+this.cn.rightOffset))}tc(t){const i=new xn(t.from,t.to);this.Ju(i)}Yi(t){return void 0!==this.bo.timeFormatter?this.bo.timeFormatter(t.originalTime):this.N_.formatHorzItem(t.time)}Lu(){const{handleScroll:t,handleScale:i}=this.Ui.W();return!(t.horzTouchDrag||t.mouseWheel||t.pressedMouseMove||t.vertTouchDrag||i.axisDoubleClickReset.time||i.axisPressedMouseMove.time||i.mouseWheel||i.pinch)}Tu(){return 0===this.ru.length?null:0}Pu(){return 0===this.ru.length?null:this.ru.length-1}ic(t){return(this.e_-1-t)/this.mu}Bu(t){const i=this.ic(t),n=this.Au()+this.pu-i;return Math.round(1e6*n)/1e6}zu(t){const i=this.mu;this.mu=t,this.Du(),i!==this.mu&&(this.ou=!0,this.nc())}Su(){if(!this.ou)return;if(this.ou=!1,this.Fi())return void this.sc(yn.su());const t=this.Au(),i=this.e_/this.mu,n=this.pu+t,s=new xn(n-i+1,n);this.sc(new yn(s))}Du(){const t=this.ec();if(this.mut&&(this.mu=t,this.ou=!0)}}ec(){return this.cn.fixLeftEdge&&this.cn.fixRightEdge&&0!==this.ru.length?this.e_/this.ru.length:this.cn.minBarSpacing}Ou(){const t=this.rc();this.pu>t&&(this.pu=t,this.ou=!0);const i=this.hc();null!==i&&this.puthis.lc(t)),this.N_),this.lu.set(t.weight,i)),i.F_(t)}lc(t){return this.N_.formatTickmark(t,this.bo)}sc(t){const i=this.au;this.au=t,Sn(i.iu(),this.au.iu())||this._u.m(),Sn(i.nu(),this.au.nu())||this.uu.m(),this.nc()}nc(){this.fu=null}gu(){this.nc(),this.lu.clear()}bu(){this.N_.updateFormatter(this.bo)}Mu(){if(!this.cn.fixLeftEdge)return;const t=this.Tu();if(null===t)return;const i=this.Xs();if(null===i)return;const n=i.Os()-t;if(n<0){const t=this.pu-n-1;this.Jn(t)}this.Du()}xu(){this.Ou(),this.Du()}}class Pn extends j{constructor(t){super(),this.ac=new Map,this.Lt=t}Z(t){}J(t){if(!this.Lt.Tt)return;const{context:i,mediaSize:n}=t;let s=0;for(const t of this.Lt.oc){if(0===t.Jt.length)continue;i.font=t.R;const e=this._c(i,t.Jt);e>n.width?t.ju=n.width/e:t.ju=1,s+=t.uc*t.ju}let e=0;switch(this.Lt.cc){case"top":e=0;break;case"center":e=Math.max((n.height-s)/2,0);break;case"bottom":e=Math.max(n.height-s,0)}i.fillStyle=this.Lt.O;for(const t of this.Lt.oc){i.save();let s=0;switch(this.Lt.dc){case"left":i.textAlign="left",s=t.uc/2;break;case"center":i.textAlign="center",s=n.width/2;break;case"right":i.textAlign="right",s=n.width-1-t.uc/2}i.translate(s,e),i.textBaseline="top",i.font=t.R,i.scale(t.ju,t.ju),i.fillText(t.Jt,0,t.fc),i.restore(),e+=t.uc*t.ju}}_c(t,i){const n=this.vc(t.font);let s=n.get(i);return void 0===s&&(s=t.measureText(i).width,n.set(i,s)),s}vc(t){let i=this.ac.get(t);return void 0===i&&(i=new Map,this.ac.set(t,i)),i}}class Rn{constructor(t){this.bt=!0,this.jt={Tt:!1,O:"",oc:[],cc:"center",dc:"center"},this.Ht=new Pn(this.jt),this.$t=t}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht}St(){const t=this.$t.W(),i=this.jt;i.Tt=t.visible,i.Tt&&(i.O=t.color,i.dc=t.horzAlign,i.cc=t.vertAlign,i.oc=[{Jt:t.text,R:N(t.fontSize,t.fontFamily,t.fontStyle),uc:1.2*t.fontSize,fc:0,ju:0}])}}class Dn extends at{constructor(t,i){super(),this.cn=i,this.wn=new Rn(this)}Rn(){return[]}Pn(){return[this.wn]}W(){return this.cn}On(){this.wn.gt()}}var On,An,Vn,Bn,In;!function(t){t[t.OnTouchEnd=0]="OnTouchEnd",t[t.OnNextTap=1]="OnNextTap"}(On||(On={}));class zn{constructor(t,i,n){this.mc=[],this.bc=[],this.e_=0,this.wc=null,this.gc=new R,this.Mc=new R,this.xc=null,this.Sc=t,this.cn=i,this.N_=n,this.kc=new F(this),this.wl=new Tn(this,i.timeScale,this.cn.localization,n),this.wt=new _t(this,i.crosshair),this.yc=new Ji(i.crosshair),this.Cc=new Dn(this,i.watermark),this.Tc(),this.mc[0].p_(2e3),this.Pc=this.Rc(0),this.Dc=this.Rc(1)}$l(){this.Oc(ct.es())}Fh(){this.Oc(ct.ss())}sa(){this.Oc(new ct(1))}Ul(t){const i=this.Ac(t);this.Oc(i)}Vc(){return this.wc}Bc(t){const i=this.wc;this.wc=t,null!==i&&this.Ul(i.Ic),null!==t&&this.Ul(t.Ic)}W(){return this.cn}Nh(t){D(this.cn,t),this.mc.forEach((i=>i.c_(t))),void 0!==t.timeScale&&this.wl.Nh(t.timeScale),void 0!==t.localization&&this.wl.wu(t.localization),(t.leftPriceScale||t.rightPriceScale)&&this.gc.m(),this.Pc=this.Rc(0),this.Dc=this.Rc(1),this.$l()}zc(t,i){if("left"===t)return void this.Nh({leftPriceScale:i});if("right"===t)return void this.Nh({rightPriceScale:i});const n=this.Ec(t);null!==n&&(n.At.Nh(i),this.gc.m())}Ec(t){for(const i of this.mc){const n=i.d_(t);if(null!==n)return{Ut:i,At:n}}return null}yt(){return this.wl}Lc(){return this.mc}Nc(){return this.Cc}Fc(){return this.wt}Wc(){return this.Mc}jc(t,i){t.Oo(i),this.Iu()}m_(t){this.e_=t,this.wl.m_(this.e_),this.mc.forEach((i=>i.m_(t))),this.Iu()}Tc(t){const i=new gn(this.wl,this);void 0!==t?this.mc.splice(t,0,i):this.mc.push(i);const n=void 0===t?this.mc.length-1:t,s=ct.es();return s.Nn(n,{Fn:0,Wn:!0}),this.Oc(s),i}y_(t,i,n){t.y_(i,n)}C_(t,i,n){t.C_(i,n),this.ql(),this.Oc(this.Hc(t,2))}T_(t,i){t.T_(i),this.Oc(this.Hc(t,2))}P_(t,i,n){i.yo()||t.P_(i,n)}R_(t,i,n){i.yo()||(t.R_(i,n),this.ql(),this.Oc(this.Hc(t,2)))}D_(t,i){i.yo()||(t.D_(i),this.Oc(this.Hc(t,2)))}A_(t,i){t.A_(i),this.Oc(this.Hc(t,2))}$c(t){this.wl.Uo(t)}Uc(t,i){const n=this.yt();if(n.Fi()||0===i)return;const s=n.$i();t=Math.max(1,Math.min(t,s)),n.ju(t,i),this.Iu()}qc(t){this.Yc(0),this.Xc(t),this.Kc()}Zc(t){this.wl.qo(t),this.Iu()}Gc(){this.wl.Yo(),this.Fh()}Yc(t){this.wl.Xo(t)}Xc(t){this.wl.Ko(t),this.Iu()}Kc(){this.wl.Zo(),this.Fh()}Mt(){return this.bc}Jc(t,i,n,s,e){this.wt.gn(t,i);let r=NaN,h=this.wl.Vu(t);const l=this.wl.Xs();null!==l&&(h=Math.min(Math.max(l.Os(),h),l.di()));const a=s.vn(),o=a.Pt();null!==o&&(r=a.pn(i,o)),r=this.yc.Ca(r,h,s),this.wt.kn(h,r,s),this.sa(),e||this.Mc.m(this.wt.kt(),{x:t,y:i},n)}Qc(t,i,n){const s=n.vn(),e=s.Pt(),r=s.Ot(t,b(e)),h=this.wl.ya(i,!0),l=this.wl.Et(b(h));this.Jc(l,r,null,n,!0)}td(t){this.Fc().Cn(),this.sa(),t||this.Mc.m(null,null,null)}ql(){const t=this.wt.Ut();if(null!==t){const i=this.wt.xn(),n=this.wt.Sn();this.Jc(i,n,null,t)}this.wt.On()}nd(t,i,n){const s=this.wl.mn(0);void 0!==i&&void 0!==n&&this.wl.gt(i,n);const e=this.wl.mn(0),r=this.wl.Au(),h=this.wl.Xs();if(null!==h&&null!==s&&null!==e){const i=h.Kr(r),l=this.N_.key(s)>this.N_.key(e),a=null!==t&&t>r&&!l,o=this.wl.W().allowShiftVisibleRangeOnWhitespaceReplacement,_=i&&(!(void 0===n)||o)&&this.wl.W().shiftVisibleRangeOnNewBar;if(a&&!_){const i=t-r;this.wl.Jn(this.wl.Eu()-i)}}this.wl.Wu(t)}Kl(t){null!==t&&t.B_()}cr(t){const i=this.mc.find((i=>i.No().includes(t)));return void 0===i?null:i}Iu(){this.Cc.On(),this.mc.forEach((t=>t.B_())),this.ql()}S(){this.mc.forEach((t=>t.S())),this.mc.length=0,this.cn.localization.priceFormatter=void 0,this.cn.localization.percentageFormatter=void 0,this.cn.localization.timeFormatter=void 0}sd(){return this.kc}mr(){return this.kc.W()}f_(){return this.gc}ed(t,i,n){const s=this.mc[0],e=this.rd(i,t,s,n);return this.bc.push(e),1===this.bc.length?this.$l():this.Fh(),e}hd(t){const i=this.cr(t),n=this.bc.indexOf(t);p(-1!==n,"Series not found"),this.bc.splice(n,1),b(i).jo(t),t.S&&t.S()}Hl(t,i){const n=b(this.cr(t));n.jo(t);const s=this.Ec(i);if(null===s){const s=t.Zi();n.Fo(t,i,s)}else{const e=s.Ut===n?t.Zi():void 0;s.Ut.Fo(t,i,e)}}Qu(){const t=ct.ss();t.$n(),this.Oc(t)}ld(t){const i=ct.ss();i.Yn(t),this.Oc(i)}Zn(){const t=ct.ss();t.Zn(),this.Oc(t)}Gn(t){const i=ct.ss();i.Gn(t),this.Oc(i)}Jn(t){const i=ct.ss();i.Jn(t),this.Oc(i)}Xn(t){const i=ct.ss();i.Xn(t),this.Oc(i)}Un(){const t=ct.ss();t.Un(),this.Oc(t)}ad(){return this.cn.rightPriceScale.visible?"right":"left"}od(){return this.Dc}q(){return this.Pc}It(t){const i=this.Dc,n=this.Pc;if(i===n)return i;if(t=Math.max(0,Math.min(100,Math.round(100*t))),null===this.xc||this.xc.Ts!==n||this.xc.Ps!==i)this.xc={Ts:n,Ps:i,_d:new Map};else{const i=this.xc._d.get(t);if(void 0!==i)return i}const s=function(t,i,n){const[s,e,r,h]=T(t),[l,a,o,_]=T(i),u=[M(s+n*(l-s)),M(e+n*(a-e)),M(r+n*(o-r)),x(h+n*(_-h))];return`rgba(${u[0]}, ${u[1]}, ${u[2]}, ${u[3]})`}(n,i,t/100);return this.xc._d.set(t,s),s}Hc(t,i){const n=new ct(i);if(null!==t){const s=this.mc.indexOf(t);n.Nn(s,{Fn:i})}return n}Ac(t,i){return void 0===i&&(i=2),this.Hc(this.cr(t),i)}Oc(t){this.Sc&&this.Sc(t),this.mc.forEach((t=>t.z_().Wh().gt()))}rd(t,i,n,s){const e=new Gi(this,t,i,n,s),r=void 0!==t.priceScaleId?t.priceScaleId:this.ad();return n.Fo(e,r),ut(r)||e.Nh(t),e}Rc(t){const i=this.cn.layout;return"gradient"===i.background.type?0===t?i.background.topColor:i.background.bottomColor:i.background.color}}function En(t){return!O(t)&&!V(t)}function Ln(t){return O(t)}!function(t){t[t.Disabled=0]="Disabled",t[t.Continuous=1]="Continuous",t[t.OnDataUpdate=2]="OnDataUpdate"}(An||(An={})),function(t){t[t.LastBar=0]="LastBar",t[t.LastVisible=1]="LastVisible"}(Vn||(Vn={})),function(t){t.Solid="solid",t.VerticalGradient="gradient"}(Bn||(Bn={})),function(t){t[t.Year=0]="Year",t[t.Month=1]="Month",t[t.DayOfMonth=2]="DayOfMonth",t[t.Time=3]="Time",t[t.TimeWithSeconds=4]="TimeWithSeconds"}(In||(In={}));const Nn=t=>t.getUTCFullYear();function Fn(t,i,n){return i.replace(/yyyy/g,(t=>ft(Nn(t),4))(t)).replace(/yy/g,(t=>ft(Nn(t)%100,2))(t)).replace(/MMMM/g,((t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"long"}))(t,n)).replace(/MMM/g,((t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"short"}))(t,n)).replace(/MM/g,(t=>ft((t=>t.getUTCMonth()+1)(t),2))(t)).replace(/dd/g,(t=>ft((t=>t.getUTCDate())(t),2))(t))}class Wn{constructor(t="yyyy-MM-dd",i="default"){this.ud=t,this.dd=i}F_(t){return Fn(t,this.ud,this.dd)}}class jn{constructor(t){this.fd=t||"%h:%m:%s"}F_(t){return this.fd.replace("%h",ft(t.getUTCHours(),2)).replace("%m",ft(t.getUTCMinutes(),2)).replace("%s",ft(t.getUTCSeconds(),2))}}const Hn={vd:"yyyy-MM-dd",pd:"%h:%m:%s",md:" ",bd:"default"};class $n{constructor(t={}){const i=Object.assign(Object.assign({},Hn),t);this.wd=new Wn(i.vd,i.bd),this.gd=new jn(i.pd),this.Md=i.md}F_(t){return`${this.wd.F_(t)}${this.Md}${this.gd.F_(t)}`}}function Un(t){return 60*t*60*1e3}function qn(t){return 60*t*1e3}const Yn=[{xd:(Xn=1,1e3*Xn),Sd:10},{xd:qn(1),Sd:20},{xd:qn(5),Sd:21},{xd:qn(30),Sd:22},{xd:Un(1),Sd:30},{xd:Un(3),Sd:31},{xd:Un(6),Sd:32},{xd:Un(12),Sd:33}];var Xn;function Kn(t,i){if(t.getUTCFullYear()!==i.getUTCFullYear())return 70;if(t.getUTCMonth()!==i.getUTCMonth())return 60;if(t.getUTCDate()!==i.getUTCDate())return 50;for(let n=Yn.length-1;n>=0;--n)if(Math.floor(i.getTime()/Yn[n].xd)!==Math.floor(t.getTime()/Yn[n].xd))return Yn[n].Sd;return 0}function Zn(t){let i=t;if(V(t)&&(i=Jn(t)),!En(i))throw new Error("time must be of type BusinessDay");const n=new Date(Date.UTC(i.year,i.month-1,i.day,0,0,0,0));return{kd:Math.round(n.getTime()/1e3),yd:i}}function Gn(t){if(!Ln(t))throw new Error("time must be of type isUTCTimestamp");return{kd:t}}function Jn(t){const i=new Date(t);if(isNaN(i.getTime()))throw new Error(`Invalid date string=${t}, expected format=yyyy-mm-dd`);return{day:i.getUTCDate(),month:i.getUTCMonth()+1,year:i.getUTCFullYear()}}function Qn(t){V(t.time)&&(t.time=Jn(t.time))}class ts{options(){return this.cn}setOptions(t){this.cn=t,this.updateFormatter(t.localization)}preprocessData(t){Array.isArray(t)?function(t){t.forEach(Qn)}(t):Qn(t)}createConverterToInternalObj(t){return b(function(t){return 0===t.length?null:En(t[0].time)||V(t[0].time)?Zn:Gn}(t))}key(t){return"object"==typeof t&&"kd"in t?t.kd:this.key(this.convertHorzItemToInternal(t))}cacheKey(t){const i=t;return void 0===i.yd?new Date(1e3*i.kd).getTime():new Date(Date.UTC(i.yd.year,i.yd.month-1,i.yd.day)).getTime()}convertHorzItemToInternal(t){return Ln(i=t)?Gn(i):En(i)?Zn(i):Zn(Jn(i));var i}updateFormatter(t){if(!this.cn)return;const i=t.dateFormat;this.cn.timeScale.timeVisible?this.Cd=new $n({vd:i,pd:this.cn.timeScale.secondsVisible?"%h:%m:%s":"%h:%m",md:" ",bd:t.locale}):this.Cd=new Wn(i,t.locale)}formatHorzItem(t){const i=t;return this.Cd.F_(new Date(1e3*i.kd))}formatTickmark(t,i){const n=function(t,i,n){switch(t){case 0:case 10:return i?n?4:3:2;case 20:case 21:case 22:case 30:case 31:case 32:case 33:return i?3:2;case 50:return 2;case 60:return 1;case 70:return 0}}(t.weight,this.cn.timeScale.timeVisible,this.cn.timeScale.secondsVisible),s=this.cn.timeScale;if(void 0!==s.tickMarkFormatter){const e=s.tickMarkFormatter(t.originalTime,n,i.locale);if(null!==e)return e}return function(t,i,n){const s={};switch(i){case 0:s.year="numeric";break;case 1:s.month="short";break;case 2:s.day="numeric";break;case 3:s.hour12=!1,s.hour="2-digit",s.minute="2-digit";break;case 4:s.hour12=!1,s.hour="2-digit",s.minute="2-digit",s.second="2-digit"}const e=void 0===t.yd?new Date(1e3*t.kd):new Date(Date.UTC(t.yd.year,t.yd.month-1,t.yd.day));return new Date(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()).toLocaleString(n,s)}(t.time,n,i.locale)}maxTickMarkWeight(t){let i=t.reduce(Cn,t[0]).weight;return i>30&&i<50&&(i=30),i}fillWeightsForPoints(t,i){!function(t,i=0){if(0===t.length)return;let n=0===i?null:t[i-1].time.kd,s=null!==n?new Date(1e3*n):null,e=0;for(let r=i;r1){const i=Math.ceil(e/(t.length-1)),n=new Date(1e3*(t[0].time.kd-i));t[0].timeWeight=Kn(new Date(1e3*t[0].time.kd),n)}}(t,i)}static Td(t){return D({localization:{dateFormat:"dd MMM 'yy"}},null!=t?t:{})}}const is="undefined"!=typeof window;function ns(){return!!is&&window.navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function ss(){return!!is&&/iPhone|iPad|iPod/.test(window.navigator.platform)}function es(t){return t+t%2}function rs(t,i){return t.Pd-i.Pd}function hs(t,i,n){const s=(t.Pd-i.Pd)/(t.ut-i.ut);return Math.sign(s)*Math.min(Math.abs(s),n)}class ls{constructor(t,i,n,s){this.Rd=null,this.Dd=null,this.Od=null,this.Ad=null,this.Vd=null,this.Bd=0,this.Id=0,this.zd=t,this.Ed=i,this.Ld=n,this.rs=s}Nd(t,i){if(null!==this.Rd){if(this.Rd.ut===i)return void(this.Rd.Pd=t);if(Math.abs(this.Rd.Pd-t)50)return;let n=0;const s=hs(this.Rd,this.Dd,this.Ed),e=rs(this.Rd,this.Dd),r=[s],h=[e];if(n+=e,null!==this.Od){const t=hs(this.Dd,this.Od,this.Ed);if(Math.sign(t)===Math.sign(s)){const i=rs(this.Dd,this.Od);if(r.push(t),h.push(i),n+=i,null!==this.Ad){const t=hs(this.Od,this.Ad,this.Ed);if(Math.sign(t)===Math.sign(s)){const i=rs(this.Od,this.Ad);r.push(t),h.push(i),n+=i}}}}let l=0;for(let t=0;t({width:Math.max(t.width,i.width),height:Math.max(t.height,i.height)})});return e.resizeCanvasElement(n),e}function os(t,i,n,s){t.G&&t.G(i,n,s)}function _s(t,i,n,s){t.K(i,n,s)}function us(t,i,n,s){const e=t(n,s);for(const t of e){const n=t.xt();null!==n&&i(n)}}function cs(t){is&&void 0!==window.chrome&&t.addEventListener("mousedown",(t=>{if(1===t.button)return t.preventDefault(),!1}))}class ds{constructor(t,i,n){this.Wd=0,this.jd=null,this.Hd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY},this.$d=0,this.Ud=null,this.qd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY},this.Yd=null,this.Xd=!1,this.Kd=null,this.Zd=null,this.Gd=!1,this.Jd=!1,this.Qd=!1,this.tf=null,this.if=null,this.nf=null,this.sf=null,this.ef=null,this.rf=null,this.hf=null,this.lf=0,this.af=!1,this._f=!1,this.uf=!1,this.cf=0,this.df=null,this.ff=!ss(),this.vf=t=>{this.pf(t)},this.mf=t=>{if(this.bf(t)){const i=this.wf(t);if(++this.$d,this.Ud&&this.$d>1){const{gf:n}=this.Mf(ps(t),this.qd);n<30&&!this.Qd&&this.xf(i,this.kf.Sf),this.yf()}}else{const i=this.wf(t);if(++this.Wd,this.jd&&this.Wd>1){const{gf:n}=this.Mf(ps(t),this.Hd);n<5&&!this.Jd&&this.Cf(i,this.kf.Tf),this.Pf()}}},this.Rf=t,this.kf=i,this.cn=n,this.Df()}S(){null!==this.tf&&(this.tf(),this.tf=null),null!==this.if&&(this.if(),this.if=null),null!==this.sf&&(this.sf(),this.sf=null),null!==this.ef&&(this.ef(),this.ef=null),null!==this.rf&&(this.rf(),this.rf=null),null!==this.nf&&(this.nf(),this.nf=null),this.Of(),this.Pf()}Af(t){this.sf&&this.sf();const i=this.Vf.bind(this);if(this.sf=()=>{this.Rf.removeEventListener("mousemove",i)},this.Rf.addEventListener("mousemove",i),this.bf(t))return;const n=this.wf(t);this.Cf(n,this.kf.Bf),this.ff=!0}Pf(){null!==this.jd&&clearTimeout(this.jd),this.Wd=0,this.jd=null,this.Hd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY}}yf(){null!==this.Ud&&clearTimeout(this.Ud),this.$d=0,this.Ud=null,this.qd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY}}Vf(t){if(this.uf||null!==this.Zd)return;if(this.bf(t))return;const i=this.wf(t);this.Cf(i,this.kf.If),this.ff=!0}zf(t){const i=bs(t.changedTouches,b(this.df));if(null===i)return;if(this.cf=ms(t),null!==this.hf)return;if(this._f)return;this.af=!0;const n=this.Mf(ps(i),b(this.Zd)),{Ef:s,Lf:e,gf:r}=n;if(this.Gd||!(r<5)){if(!this.Gd){const t=.5*s,i=e>=t&&!this.cn.Nf(),n=t>e&&!this.cn.Ff();i||n||(this._f=!0),this.Gd=!0,this.Qd=!0,this.Of(),this.yf()}if(!this._f){const n=this.wf(t,i);this.xf(n,this.kf.Wf),vs(t)}}}jf(t){if(0!==t.button)return;const i=this.Mf(ps(t),b(this.Kd)),{gf:n}=i;if(n>=5&&(this.Jd=!0,this.Pf()),this.Jd){const i=this.wf(t);this.Cf(i,this.kf.Hf)}}Mf(t,i){const n=Math.abs(i.et-t.et),s=Math.abs(i.rt-t.rt);return{Ef:n,Lf:s,gf:n+s}}$f(t){let i=bs(t.changedTouches,b(this.df));if(null===i&&0===t.touches.length&&(i=t.changedTouches[0]),null===i)return;this.df=null,this.cf=ms(t),this.Of(),this.Zd=null,this.rf&&(this.rf(),this.rf=null);const n=this.wf(t,i);if(this.xf(n,this.kf.Uf),++this.$d,this.Ud&&this.$d>1){const{gf:t}=this.Mf(ps(i),this.qd);t<30&&!this.Qd&&this.xf(n,this.kf.Sf),this.yf()}else this.Qd||(this.xf(n,this.kf.qf),this.kf.qf&&vs(t));0===this.$d&&vs(t),0===t.touches.length&&this.Xd&&(this.Xd=!1,vs(t))}pf(t){if(0!==t.button)return;const i=this.wf(t);if(this.Kd=null,this.uf=!1,this.ef&&(this.ef(),this.ef=null),ns()){this.Rf.ownerDocument.documentElement.removeEventListener("mouseleave",this.vf)}if(!this.bf(t))if(this.Cf(i,this.kf.Yf),++this.Wd,this.jd&&this.Wd>1){const{gf:n}=this.Mf(ps(t),this.Hd);n<5&&!this.Jd&&this.Cf(i,this.kf.Tf),this.Pf()}else this.Jd||this.Cf(i,this.kf.Xf)}Of(){null!==this.Yd&&(clearTimeout(this.Yd),this.Yd=null)}Kf(t){if(null!==this.df)return;const i=t.changedTouches[0];this.df=i.identifier,this.cf=ms(t);const n=this.Rf.ownerDocument.documentElement;this.Qd=!1,this.Gd=!1,this._f=!1,this.Zd=ps(i),this.rf&&(this.rf(),this.rf=null);{const i=this.zf.bind(this),s=this.$f.bind(this);this.rf=()=>{n.removeEventListener("touchmove",i),n.removeEventListener("touchend",s)},n.addEventListener("touchmove",i,{passive:!1}),n.addEventListener("touchend",s,{passive:!1}),this.Of(),this.Yd=setTimeout(this.Zf.bind(this,t),240)}const s=this.wf(t,i);this.xf(s,this.kf.Gf),this.Ud||(this.$d=0,this.Ud=setTimeout(this.yf.bind(this),500),this.qd=ps(i))}Jf(t){if(0!==t.button)return;const i=this.Rf.ownerDocument.documentElement;ns()&&i.addEventListener("mouseleave",this.vf),this.Jd=!1,this.Kd=ps(t),this.ef&&(this.ef(),this.ef=null);{const t=this.jf.bind(this),n=this.pf.bind(this);this.ef=()=>{i.removeEventListener("mousemove",t),i.removeEventListener("mouseup",n)},i.addEventListener("mousemove",t),i.addEventListener("mouseup",n)}if(this.uf=!0,this.bf(t))return;const n=this.wf(t);this.Cf(n,this.kf.Qf),this.jd||(this.Wd=0,this.jd=setTimeout(this.Pf.bind(this),500),this.Hd=ps(t))}Df(){this.Rf.addEventListener("mouseenter",this.Af.bind(this)),this.Rf.addEventListener("touchcancel",this.Of.bind(this));{const t=this.Rf.ownerDocument,i=t=>{this.kf.tv&&(t.composed&&this.Rf.contains(t.composedPath()[0])||t.target&&this.Rf.contains(t.target)||this.kf.tv())};this.if=()=>{t.removeEventListener("touchstart",i)},this.tf=()=>{t.removeEventListener("mousedown",i)},t.addEventListener("mousedown",i),t.addEventListener("touchstart",i,{passive:!0})}ss()&&(this.nf=()=>{this.Rf.removeEventListener("dblclick",this.mf)},this.Rf.addEventListener("dblclick",this.mf)),this.Rf.addEventListener("mouseleave",this.iv.bind(this)),this.Rf.addEventListener("touchstart",this.Kf.bind(this),{passive:!0}),cs(this.Rf),this.Rf.addEventListener("mousedown",this.Jf.bind(this)),this.nv(),this.Rf.addEventListener("touchmove",(()=>{}),{passive:!1})}nv(){void 0===this.kf.sv&&void 0===this.kf.ev&&void 0===this.kf.rv||(this.Rf.addEventListener("touchstart",(t=>this.hv(t.touches)),{passive:!0}),this.Rf.addEventListener("touchmove",(t=>{if(2===t.touches.length&&null!==this.hf&&void 0!==this.kf.ev){const i=fs(t.touches[0],t.touches[1])/this.lf;this.kf.ev(this.hf,i),vs(t)}}),{passive:!1}),this.Rf.addEventListener("touchend",(t=>{this.hv(t.touches)})))}hv(t){1===t.length&&(this.af=!1),2!==t.length||this.af||this.Xd?this.lv():this.av(t)}av(t){const i=this.Rf.getBoundingClientRect()||{left:0,top:0};this.hf={et:(t[0].clientX-i.left+(t[1].clientX-i.left))/2,rt:(t[0].clientY-i.top+(t[1].clientY-i.top))/2},this.lf=fs(t[0],t[1]),void 0!==this.kf.sv&&this.kf.sv(),this.Of()}lv(){null!==this.hf&&(this.hf=null,void 0!==this.kf.rv&&this.kf.rv())}iv(t){if(this.sf&&this.sf(),this.bf(t))return;if(!this.ff)return;const i=this.wf(t);this.Cf(i,this.kf.ov),this.ff=!ss()}Zf(t){const i=bs(t.touches,b(this.df));if(null===i)return;const n=this.wf(t,i);this.xf(n,this.kf._v),this.Qd=!0,this.Xd=!0}bf(t){return t.sourceCapabilities&&void 0!==t.sourceCapabilities.firesTouchEvents?t.sourceCapabilities.firesTouchEvents:ms(t){"touchstart"!==t.type&&vs(t)}}}}function fs(t,i){const n=t.clientX-i.clientX,s=t.clientY-i.clientY;return Math.sqrt(n*n+s*s)}function vs(t){t.cancelable&&t.preventDefault()}function ps(t){return{et:t.pageX,rt:t.pageY}}function ms(t){return t.timeStamp||performance.now()}function bs(t,i){for(let n=0;n{var s,e,r,h;return(null!==(e=null===(s=n.At())||void 0===s?void 0:s.xa())&&void 0!==e?e:"")!==i?[]:null!==(h=null===(r=n.la)||void 0===r?void 0:r.call(n,t))&&void 0!==h?h:[]}}class xs{constructor(i,n,s,e){this.Li=null,this.wv=null,this.gv=!1,this.Mv=new si(200),this.Gr=null,this.xv=0,this.Sv=!1,this.kv=()=>{this.Sv||this.nn.yv().qt().Fh()},this.Cv=()=>{this.Sv||this.nn.yv().qt().Fh()},this.nn=i,this.cn=n,this.mo=n.layout,this.kc=s,this.Tv="left"===e,this.Pv=Ms("normal",e),this.Rv=Ms("top",e),this.Dv=Ms("bottom",e),this.Ov=document.createElement("div"),this.Ov.style.height="100%",this.Ov.style.overflow="hidden",this.Ov.style.width="25px",this.Ov.style.left="0",this.Ov.style.position="relative",this.Av=as(this.Ov,t({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.kv);const r=this.Av.canvasElement;r.style.position="absolute",r.style.zIndex="1",r.style.left="0",r.style.top="0",this.Vv=as(this.Ov,t({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.Cv);const h=this.Vv.canvasElement;h.style.position="absolute",h.style.zIndex="2",h.style.left="0",h.style.top="0";const l={Qf:this.Bv.bind(this),Gf:this.Bv.bind(this),Hf:this.Iv.bind(this),Wf:this.Iv.bind(this),tv:this.zv.bind(this),Yf:this.Ev.bind(this),Uf:this.Ev.bind(this),Tf:this.Lv.bind(this),Sf:this.Lv.bind(this),Bf:this.Nv.bind(this),ov:this.Fv.bind(this)};this.Wv=new ds(this.Vv.canvasElement,l,{Nf:()=>!this.cn.handleScroll.vertTouchDrag,Ff:()=>!0})}S(){this.Wv.S(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Vv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.kv),this.Av.dispose(),null!==this.Li&&this.Li.$o().p(this),this.Li=null}jv(){return this.Ov}P(){return this.mo.fontSize}Hv(){const t=this.kc.W();return this.Gr!==t.R&&(this.Mv.ir(),this.Gr=t.R),t}$v(){if(null===this.Li)return 0;let t=0;const i=this.Hv(),n=b(this.Av.canvasElement.getContext("2d"));n.save();const s=this.Li.Ea();n.font=this.Uv(),s.length>0&&(t=Math.max(this.Mv.Si(n,s[0].Za),this.Mv.Si(n,s[s.length-1].Za)));const e=this.qv();for(let i=e.length;i--;){const s=this.Mv.Si(n,e[i].Jt());s>t&&(t=s)}const r=this.Li.Pt();if(null!==r&&null!==this.wv){const i=this.Li.pn(1,r),s=this.Li.pn(this.wv.height-2,r);t=Math.max(t,this.Mv.Si(n,this.Li.Wi(Math.floor(Math.min(i,s))+.11111111111111,r)),this.Mv.Si(n,this.Li.Wi(Math.ceil(Math.max(i,s))-.11111111111111,r)))}n.restore();const h=t||34;return es(Math.ceil(i.C+i.T+i.B+i.I+5+h))}Yv(t){null!==this.wv&&n(this.wv,t)||(this.wv=t,this.Sv=!0,this.Av.resizeCanvasElement(t),this.Vv.resizeCanvasElement(t),this.Sv=!1,this.Ov.style.width=`${t.width}px`,this.Ov.style.height=`${t.height}px`)}Xv(){return b(this.wv).width}Ji(t){this.Li!==t&&(null!==this.Li&&this.Li.$o().p(this),this.Li=t,t.$o().l(this.ao.bind(this),this))}At(){return this.Li}ir(){const t=this.nn.Kv();this.nn.yv().qt().A_(t,b(this.At()))}Zv(t){if(null===this.wv)return;if(1!==t){this.Gv(),this.Av.applySuggestedBitmapSize();const t=s(this.Av);null!==t&&(t.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Be(t)})),this.nn.Qv(t,this.Dv),this.tp(t),this.nn.Qv(t,this.Pv),this.ip(t))}this.Vv.applySuggestedBitmapSize();const i=s(this.Vv);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.np(i),this.nn.Qv(i,this.Rv))}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}gt(){var t;null===(t=this.Li)||void 0===t||t.Ea()}Bv(t){if(null===this.Li||this.Li.Fi()||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.yv().qt(),n=this.nn.Kv();this.gv=!0,i.y_(n,this.Li,t.localY)}Iv(t){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.yv().qt(),n=this.nn.Kv(),s=this.Li;i.C_(n,s,t.localY)}zv(){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const t=this.nn.yv().qt(),i=this.nn.Kv(),n=this.Li;this.gv&&(this.gv=!1,t.T_(i,n))}Ev(t){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.yv().qt(),n=this.nn.Kv();this.gv=!1,i.T_(n,this.Li)}Lv(t){this.cn.handleScale.axisDoubleClickReset.price&&this.ir()}Nv(t){if(null===this.Li)return;!this.nn.yv().qt().W().handleScale.axisPressedMouseMove.price||this.Li.ph()||this.Li.Co()||this.rp(1)}Fv(t){this.rp(0)}qv(){const t=[],i=null===this.Li?void 0:this.Li;return(n=>{for(let s=0;s{t.fillStyle=n.borderColor;const l=Math.max(1,Math.floor(h)),a=Math.floor(.5*h),o=Math.round(s.T*r);t.beginPath();for(const n of i)t.rect(Math.floor(e*r),Math.round(n.Aa*h)-a,o,l);t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{var r;t.font=this.Uv(),t.fillStyle=null!==(r=n.textColor)&&void 0!==r?r:this.mo.textColor,t.textAlign=this.Tv?"right":"left",t.textBaseline="middle";const h=this.Tv?Math.round(e-s.B):Math.round(e+s.T+s.B),l=i.map((i=>this.Mv.xi(t,i.Za)));for(let n=i.length;n--;){const s=i[n];t.fillText(s.Za,h,s.Aa+l[n])}}))}Gv(){if(null===this.wv||null===this.Li)return;let t=this.wv.height/2;const i=[],n=this.Li.No().slice(),s=this.nn.Kv(),e=this.Hv();this.Li===s.vr()&&this.nn.Kv().No().forEach((t=>{s.dr(t)&&n.push(t)}));const r=this.Li.Ta()[0],h=this.Li;n.forEach((n=>{const e=n.Rn(s,h);e.forEach((t=>{t.Vi(null),t.Bi()&&i.push(t)})),r===n&&e.length>0&&(t=e[0].yi())})),i.forEach((t=>t.Vi(t.yi())));this.Li.W().alignLabels&&this.hp(i,e,t)}hp(t,i,n){if(null===this.wv)return;const s=t.filter((t=>t.yi()<=n)),e=t.filter((t=>t.yi()>n));s.sort(((t,i)=>i.yi()-t.yi())),s.length&&e.length&&e.push(s[0]),e.sort(((t,i)=>t.yi()-i.yi()));for(const n of t){const t=Math.floor(n.zt(i)/2),s=n.yi();s>-t&&sthis.wv.height-t&&sl-r&&n.Vi(l-r)}for(let t=1;t{if(i.Ii()){i.xt(b(this.Li)).K(t,n,this.Mv,s)}}))}np(t){if(null===this.wv||null===this.Li)return;const i=this.nn.yv().qt(),n=[],s=this.nn.Kv(),e=i.Fc().Rn(s,this.Li);e.length&&n.push(e);const r=this.Hv(),h=this.Tv?"right":"left";n.forEach((i=>{i.forEach((i=>{i.xt(b(this.Li)).K(t,r,this.Mv,h)}))}))}rp(t){this.Ov.style.cursor=1===t?"ns-resize":"default"}ao(){const t=this.$v();this.xv{this.Sv||null===this.wp||this.Ui().Fh()},this.Cv=()=>{this.Sv||null===this.wp||this.Ui().Fh()},this.gp=i,this.wp=n,this.wp.I_().l(this.Mp.bind(this),this,!0),this.xp=document.createElement("td"),this.xp.style.padding="0",this.xp.style.position="relative";const s=document.createElement("div");s.style.width="100%",s.style.height="100%",s.style.position="relative",s.style.overflow="hidden",this.Sp=document.createElement("td"),this.Sp.style.padding="0",this.kp=document.createElement("td"),this.kp.style.padding="0",this.xp.appendChild(s),this.Av=as(s,t({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.kv);const e=this.Av.canvasElement;e.style.position="absolute",e.style.zIndex="1",e.style.left="0",e.style.top="0",this.Vv=as(s,t({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.Cv);const r=this.Vv.canvasElement;r.style.position="absolute",r.style.zIndex="2",r.style.left="0",r.style.top="0",this.yp=document.createElement("tr"),this.yp.appendChild(this.Sp),this.yp.appendChild(this.xp),this.yp.appendChild(this.kp),this.Cp(),this.Wv=new ds(this.Vv.canvasElement,this,{Nf:()=>null===this.vp&&!this.gp.W().handleScroll.vertTouchDrag,Ff:()=>null===this.vp&&!this.gp.W().handleScroll.horzTouchDrag})}S(){null!==this.lp&&this.lp.S(),null!==this.ap&&this.ap.S(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Vv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.kv),this.Av.dispose(),null!==this.wp&&this.wp.I_().p(this),this.Wv.S()}Kv(){return b(this.wp)}Tp(t){null!==this.wp&&this.wp.I_().p(this),this.wp=t,null!==this.wp&&this.wp.I_().l(Ts.prototype.Mp.bind(this),this,!0),this.Cp()}yv(){return this.gp}jv(){return this.yp}Cp(){if(null!==this.wp&&(this.Pp(),0!==this.Ui().Mt().length)){if(null!==this.lp){const t=this.wp.S_();this.lp.Ji(b(t))}if(null!==this.ap){const t=this.wp.k_();this.ap.Ji(b(t))}}}Rp(){null!==this.lp&&this.lp.gt(),null!==this.ap&&this.ap.gt()}v_(){return null!==this.wp?this.wp.v_():0}p_(t){this.wp&&this.wp.p_(t)}Bf(t){if(!this.wp)return;this.Dp();const i=t.localX,n=t.localY;this.Op(i,n,t)}Qf(t){this.Dp(),this.Ap(),this.Op(t.localX,t.localY,t)}If(t){var i;if(!this.wp)return;this.Dp();const n=t.localX,s=t.localY;this.Op(n,s,t);const e=this.br(n,s);this.gp.Vp(null!==(i=null==e?void 0:e.bv)&&void 0!==i?i:null),this.Ui().Bc(e&&{Ic:e.Ic,pv:e.pv})}Xf(t){null!==this.wp&&(this.Dp(),this.Bp(t))}Tf(t){null!==this.wp&&this.Ip(this.cp,t)}Sf(t){this.Tf(t)}Hf(t){this.Dp(),this.zp(t),this.Op(t.localX,t.localY,t)}Yf(t){null!==this.wp&&(this.Dp(),this.fp=!1,this.Ep(t))}qf(t){null!==this.wp&&this.Bp(t)}_v(t){if(this.fp=!0,null===this.vp){const i={x:t.localX,y:t.localY};this.Lp(i,i,t)}}ov(t){null!==this.wp&&(this.Dp(),this.wp.qt().Bc(null),this.Np())}Fp(){return this.up}Wp(){return this.cp}sv(){this.dp=1,this.Ui().Un()}ev(t,i){if(!this.gp.W().handleScale.pinch)return;const n=5*(i-this.dp);this.dp=i,this.Ui().Uc(t.et,n)}Gf(t){this.fp=!1,this.pp=null!==this.vp,this.Ap();const i=this.Ui().Fc();null!==this.vp&&i.Tt()&&(this.mp={x:i.Kt(),y:i.Zt()},this.vp={x:t.localX,y:t.localY})}Wf(t){if(null===this.wp)return;const i=t.localX,n=t.localY;if(null===this.vp)this.zp(t);else{this.pp=!1;const s=b(this.mp),e=s.x+(i-this.vp.x),r=s.y+(n-this.vp.y);this.Op(e,r,t)}}Uf(t){0===this.yv().W().trackingMode.exitMode&&(this.pp=!0),this.jp(),this.Ep(t)}br(t,i){const n=this.wp;return null===n?null:function(t,i,n){const s=t.No(),e=function(t,i,n){var s,e;let r,h;for(const o of t){const t=null!==(e=null===(s=o.oa)||void 0===s?void 0:s.call(o,i,n))&&void 0!==e?e:[];for(const i of t)l=i.zOrder,(!(a=null==r?void 0:r.zOrder)||"top"===l&&"top"!==a||"normal"===l&&"bottom"===a)&&(r=i,h=o)}var l,a;return r&&h?{mv:r,Ic:h}:null}(s,i,n);if("top"===(null==e?void 0:e.mv.zOrder))return ws(e);for(const r of s){if(e&&e.Ic===r&&"bottom"!==e.mv.zOrder&&!e.mv.isBackground)return ws(e);const s=gs(r.Pn(t),i,n);if(null!==s)return{Ic:r,fv:s.fv,pv:s.pv};if(e&&e.Ic===r&&"bottom"!==e.mv.zOrder&&e.mv.isBackground)return ws(e)}return(null==e?void 0:e.mv)?ws(e):null}(n,t,i)}Hp(i,n){b("left"===n?this.lp:this.ap).Yv(t({width:i,height:this.wv.height}))}$p(){return this.wv}Yv(t){n(this.wv,t)||(this.wv=t,this.Sv=!0,this.Av.resizeCanvasElement(t),this.Vv.resizeCanvasElement(t),this.Sv=!1,this.xp.style.width=t.width+"px",this.xp.style.height=t.height+"px")}Up(){const t=b(this.wp);t.x_(t.S_()),t.x_(t.k_());for(const i of t.Ta())if(t.dr(i)){const n=i.At();null!==n&&t.x_(n),i.On()}}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Zv(t){if(0===t)return;if(null===this.wp)return;if(t>1&&this.Up(),null!==this.lp&&this.lp.Zv(t),null!==this.ap&&this.ap.Zv(t),1!==t){this.Av.applySuggestedBitmapSize();const t=s(this.Av);null!==t&&(t.useBitmapCoordinateSpace((t=>{this.Jv(t)})),this.wp&&(this.qp(t,Ss),this.Yp(t),this.Xp(t),this.qp(t,ks),this.qp(t,ys)))}this.Vv.applySuggestedBitmapSize();const i=s(this.Vv);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.Kp(i),this.qp(i,Cs))}Zp(){return this.lp}Gp(){return this.ap}Qv(t,i){this.qp(t,i)}Mp(){null!==this.wp&&this.wp.I_().p(this),this.wp=null}Bp(t){this.Ip(this.up,t)}Ip(t,i){const n=i.localX,s=i.localY;t.M()&&t.m(this.Ui().yt().Vu(n),{x:n,y:s},i)}Jv({context:t,bitmapSize:i}){const{width:n,height:s}=i,e=this.Ui(),r=e.q(),h=e.od();r===h?G(t,0,0,n,s,h):it(t,0,0,n,s,r,h)}Yp(t){const i=b(this.wp).z_().Wh().xt();null!==i&&i.K(t,!1)}Xp(t){const i=this.Ui().Nc();this.Jp(t,ks,os,i),this.Jp(t,ks,_s,i)}Kp(t){this.Jp(t,ks,_s,this.Ui().Fc())}qp(t,i){const n=b(this.wp).No();for(const s of n)this.Jp(t,i,os,s);for(const s of n)this.Jp(t,i,_s,s)}Jp(t,i,n,s){const e=b(this.wp),r=e.qt().Vc(),h=null!==r&&r.Ic===s,l=null!==r&&h&&void 0!==r.pv?r.pv.gr:void 0;us(i,(i=>n(i,t,h,l)),s,e)}Pp(){if(null===this.wp)return;const t=this.gp,i=this.wp.S_().W().visible,n=this.wp.k_().W().visible;i||null===this.lp||(this.Sp.removeChild(this.lp.jv()),this.lp.S(),this.lp=null),n||null===this.ap||(this.kp.removeChild(this.ap.jv()),this.ap.S(),this.ap=null);const s=t.qt().sd();i&&null===this.lp&&(this.lp=new xs(this,t.W(),s,"left"),this.Sp.appendChild(this.lp.jv())),n&&null===this.ap&&(this.ap=new xs(this,t.W(),s,"right"),this.kp.appendChild(this.ap.jv()))}Qp(t){return t.uv&&this.fp||null!==this.vp}tm(t){return Math.max(0,Math.min(t,this.wv.width-1))}im(t){return Math.max(0,Math.min(t,this.wv.height-1))}Op(t,i,n){this.Ui().Jc(this.tm(t),this.im(i),n,b(this.wp))}Np(){this.Ui().td()}jp(){this.pp&&(this.vp=null,this.Np())}Lp(t,i,n){this.vp=t,this.pp=!1,this.Op(i.x,i.y,n);const s=this.Ui().Fc();this.mp={x:s.Kt(),y:s.Zt()}}Ui(){return this.gp.qt()}Ep(t){if(!this._p)return;const i=this.Ui(),n=this.Kv();if(i.D_(n,n.vn()),this.op=null,this._p=!1,i.Kc(),null!==this.bp){const t=performance.now(),n=i.yt();this.bp.Dr(n.Eu(),t),this.bp.Yu(t)||i.Xn(this.bp)}}Dp(){this.vp=null}Ap(){if(!this.wp)return;if(this.Ui().Un(),document.activeElement!==document.body&&document.activeElement!==document.documentElement)b(document.activeElement).blur();else{const t=document.getSelection();null!==t&&t.removeAllRanges()}!this.wp.vn().Fi()&&this.Ui().yt().Fi()}zp(t){if(null===this.wp)return;const i=this.Ui(),n=i.yt();if(n.Fi())return;const s=this.gp.W(),e=s.handleScroll,r=s.kineticScroll;if((!e.pressedMouseMove||t.uv)&&(!e.horzTouchDrag&&!e.vertTouchDrag||!t.uv))return;const h=this.wp.vn(),l=performance.now();if(null!==this.op||this.Qp(t)||(this.op={x:t.clientX,y:t.clientY,kd:l,nm:t.localX,sm:t.localY}),null!==this.op&&!this._p&&(this.op.x!==t.clientX||this.op.y!==t.clientY)){if(t.uv&&r.touch||!t.uv&&r.mouse){const t=n.he();this.bp=new ls(.2/t,7/t,.997,15/t),this.bp.Nd(n.Eu(),this.op.kd)}else this.bp=null;h.Fi()||i.P_(this.wp,h,t.localY),i.Yc(t.localX),this._p=!0}this._p&&(h.Fi()||i.R_(this.wp,h,t.localY),i.Xc(t.localX),null!==this.bp&&this.bp.Nd(n.Eu(),l))}}class Ps{constructor(i,n,s,e,r){this.bt=!0,this.wv=t({width:0,height:0}),this.kv=()=>this.Zv(3),this.Tv="left"===i,this.kc=s.sd,this.cn=n,this.rm=e,this.hm=r,this.Ov=document.createElement("div"),this.Ov.style.width="25px",this.Ov.style.height="100%",this.Ov.style.overflow="hidden",this.Av=as(this.Ov,t({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.kv)}S(){this.Av.unsubscribeSuggestedBitmapSizeChanged(this.kv),this.Av.dispose()}jv(){return this.Ov}$p(){return this.wv}Yv(t){n(this.wv,t)||(this.wv=t,this.Av.resizeCanvasElement(t),this.Ov.style.width=`${t.width}px`,this.Ov.style.height=`${t.height}px`,this.bt=!0)}Zv(t){if(t<3&&!this.bt)return;if(0===this.wv.width||0===this.wv.height)return;this.bt=!1,this.Av.applySuggestedBitmapSize();const i=s(this.Av);null!==i&&i.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Be(t)}))}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Be({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(!this.rm())return;t.fillStyle=this.cn.timeScale.borderColor;const e=Math.floor(this.kc.W().C*n),r=Math.floor(this.kc.W().C*s),h=this.Tv?i.width-e:0;t.fillRect(h,0,e,r)}Jv({context:t,bitmapSize:i}){G(t,0,0,i.width,i.height,this.hm())}}function Rs(t){return i=>{var n,s;return null!==(s=null===(n=i.aa)||void 0===n?void 0:n.call(i,t))&&void 0!==s?s:[]}}const Ds=Rs("normal"),Os=Rs("top"),As=Rs("bottom");class Vs{constructor(i,n){this.lm=null,this.am=null,this.k=null,this.om=!1,this.wv=t({width:0,height:0}),this._m=new R,this.Mv=new si(5),this.Sv=!1,this.kv=()=>{this.Sv||this.gp.qt().Fh()},this.Cv=()=>{this.Sv||this.gp.qt().Fh()},this.gp=i,this.N_=n,this.cn=i.W().layout,this.um=document.createElement("tr"),this.dm=document.createElement("td"),this.dm.style.padding="0",this.fm=document.createElement("td"),this.fm.style.padding="0",this.Ov=document.createElement("td"),this.Ov.style.height="25px",this.Ov.style.padding="0",this.vm=document.createElement("div"),this.vm.style.width="100%",this.vm.style.height="100%",this.vm.style.position="relative",this.vm.style.overflow="hidden",this.Ov.appendChild(this.vm),this.Av=as(this.vm,t({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.kv);const s=this.Av.canvasElement;s.style.position="absolute",s.style.zIndex="1",s.style.left="0",s.style.top="0",this.Vv=as(this.vm,t({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.Cv);const e=this.Vv.canvasElement;e.style.position="absolute",e.style.zIndex="2",e.style.left="0",e.style.top="0",this.um.appendChild(this.dm),this.um.appendChild(this.Ov),this.um.appendChild(this.fm),this.pm(),this.gp.qt().f_().l(this.pm.bind(this),this),this.Wv=new ds(this.Vv.canvasElement,this,{Nf:()=>!0,Ff:()=>!this.gp.W().handleScroll.horzTouchDrag})}S(){this.Wv.S(),null!==this.lm&&this.lm.S(),null!==this.am&&this.am.S(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Vv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.kv),this.Av.dispose()}jv(){return this.um}bm(){return this.lm}wm(){return this.am}Qf(t){if(this.om)return;this.om=!0;const i=this.gp.qt();!i.yt().Fi()&&this.gp.W().handleScale.axisPressedMouseMove.time&&i.$c(t.localX)}Gf(t){this.Qf(t)}tv(){const t=this.gp.qt();!t.yt().Fi()&&this.om&&(this.om=!1,this.gp.W().handleScale.axisPressedMouseMove.time&&t.Gc())}Hf(t){const i=this.gp.qt();!i.yt().Fi()&&this.gp.W().handleScale.axisPressedMouseMove.time&&i.Zc(t.localX)}Wf(t){this.Hf(t)}Yf(){this.om=!1;const t=this.gp.qt();t.yt().Fi()&&!this.gp.W().handleScale.axisPressedMouseMove.time||t.Gc()}Uf(){this.Yf()}Tf(){this.gp.W().handleScale.axisDoubleClickReset.time&&this.gp.qt().Zn()}Sf(){this.Tf()}Bf(){this.gp.qt().W().handleScale.axisPressedMouseMove.time&&this.rp(1)}ov(){this.rp(0)}$p(){return this.wv}gm(){return this._m}Mm(i,s,e){n(this.wv,i)||(this.wv=i,this.Sv=!0,this.Av.resizeCanvasElement(i),this.Vv.resizeCanvasElement(i),this.Sv=!1,this.Ov.style.width=`${i.width}px`,this.Ov.style.height=`${i.height}px`,this._m.m(i)),null!==this.lm&&this.lm.Yv(t({width:s,height:i.height})),null!==this.am&&this.am.Yv(t({width:e,height:i.height}))}xm(){const t=this.Sm();return Math.ceil(t.C+t.T+t.P+t.L+t.V+t.km)}gt(){this.gp.qt().yt().Ea()}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Zv(t){if(0===t)return;if(1!==t){this.Av.applySuggestedBitmapSize();const i=s(this.Av);null!==i&&(i.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Be(t),this.ym(i,As)})),this.tp(i),this.ym(i,Ds)),null!==this.lm&&this.lm.Zv(t),null!==this.am&&this.am.Zv(t)}this.Vv.applySuggestedBitmapSize();const i=s(this.Vv);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.Cm([...this.gp.qt().Mt(),this.gp.qt().Fc()],i),this.ym(i,Os))}ym(t,i){const n=this.gp.qt().Mt();for(const s of n)us(i,(i=>os(i,t,!1,void 0)),s,void 0);for(const s of n)us(i,(i=>_s(i,t,!1,void 0)),s,void 0)}Jv({context:t,bitmapSize:i}){G(t,0,0,i.width,i.height,this.gp.qt().od())}Be({context:t,bitmapSize:i,verticalPixelRatio:n}){if(this.gp.W().timeScale.borderVisible){t.fillStyle=this.Tm();const s=Math.max(1,Math.floor(this.Sm().C*n));t.fillRect(0,0,i.width,s)}}tp(t){const i=this.gp.qt().yt(),n=i.Ea();if(!n||0===n.length)return;const s=this.N_.maxTickMarkWeight(n),e=this.Sm(),r=i.W();r.borderVisible&&r.ticksVisible&&t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:i,verticalPixelRatio:s})=>{t.strokeStyle=this.Tm(),t.fillStyle=this.Tm();const r=Math.max(1,Math.floor(i)),h=Math.floor(.5*i);t.beginPath();const l=Math.round(e.T*s);for(let s=n.length;s--;){const e=Math.round(n[s].coord*i);t.rect(e-h,0,r,l)}t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{const i=e.C+e.T+e.L+e.P/2;t.textAlign="center",t.textBaseline="middle",t.fillStyle=this.$(),t.font=this.Uv();for(const e of n)if(e.weight=s){const n=e.needAlignCoordinate?this.Pm(t,e.coord,e.label):e.coord;t.fillText(e.label,n,i)}}))}Pm(t,i,n){const s=this.Mv.Si(t,n),e=s/2,r=Math.floor(i-e)+.5;return r<0?i+=Math.abs(0-r):r+s>this.wv.width&&(i-=Math.abs(this.wv.width-(r+s))),i}Cm(t,i){const n=this.Sm();for(const s of t)for(const t of s.tn())t.xt().K(i,n)}Tm(){return this.gp.W().timeScale.borderColor}$(){return this.cn.textColor}j(){return this.cn.fontSize}Uv(){return N(this.j(),this.cn.fontFamily)}Rm(){return N(this.j(),this.cn.fontFamily,"bold")}Sm(){null===this.k&&(this.k={C:1,N:NaN,L:NaN,V:NaN,Hi:NaN,T:5,P:NaN,R:"",ji:new si,km:0});const t=this.k,i=this.Uv();if(t.R!==i){const n=this.j();t.P=n,t.R=i,t.L=3*n/12,t.V=3*n/12,t.Hi=9*n/12,t.N=0,t.km=4*n/12,t.ji.ir()}return this.k}rp(t){this.Ov.style.cursor=1===t?"ew-resize":"default"}pm(){const t=this.gp.qt(),i=t.W();i.leftPriceScale.visible||null===this.lm||(this.dm.removeChild(this.lm.jv()),this.lm.S(),this.lm=null),i.rightPriceScale.visible||null===this.am||(this.fm.removeChild(this.am.jv()),this.am.S(),this.am=null);const n={sd:this.gp.qt().sd()},s=()=>i.leftPriceScale.borderVisible&&t.yt().W().borderVisible,e=()=>t.od();i.leftPriceScale.visible&&null===this.lm&&(this.lm=new Ps("left",i,n,s,e),this.dm.appendChild(this.lm.jv())),i.rightPriceScale.visible&&null===this.am&&(this.am=new Ps("right",i,n,s,e),this.fm.appendChild(this.am.jv()))}}const Bs=!!is&&!!navigator.userAgentData&&navigator.userAgentData.brands.some((t=>t.brand.includes("Chromium")))&&!!is&&((null===(Is=null===navigator||void 0===navigator?void 0:navigator.userAgentData)||void 0===Is?void 0:Is.platform)?"Windows"===navigator.userAgentData.platform:navigator.userAgent.toLowerCase().indexOf("win")>=0);var Is;class zs{constructor(t,i,n){var s;this.Dm=[],this.Om=0,this.Qa=0,this.e_=0,this.Am=0,this.Vm=0,this.Bm=null,this.Im=!1,this.up=new R,this.cp=new R,this.Mc=new R,this.zm=null,this.Em=null,this.Lm=t,this.cn=i,this.N_=n,this.um=document.createElement("div"),this.um.classList.add("tv-lightweight-charts"),this.um.style.overflow="hidden",this.um.style.direction="ltr",this.um.style.width="100%",this.um.style.height="100%",(s=this.um).style.userSelect="none",s.style.webkitUserSelect="none",s.style.msUserSelect="none",s.style.MozUserSelect="none",s.style.webkitTapHighlightColor="transparent",this.Nm=document.createElement("table"),this.Nm.setAttribute("cellspacing","0"),this.um.appendChild(this.Nm),this.Fm=this.Wm.bind(this),Es(this.cn)&&this.jm(!0),this.Ui=new zn(this.Sc.bind(this),this.cn,n),this.qt().Wc().l(this.Hm.bind(this),this),this.$m=new Vs(this,this.N_),this.Nm.appendChild(this.$m.jv());const e=i.autoSize&&this.Um();let r=this.cn.width,h=this.cn.height;if(e||0===r||0===h){const i=t.getBoundingClientRect();r=r||i.width,h=h||i.height}this.qm(r,h),this.Ym(),t.appendChild(this.um),this.Xm(),this.Ui.yt().Gu().l(this.Ui.$l.bind(this.Ui),this),this.Ui.f_().l(this.Ui.$l.bind(this.Ui),this)}qt(){return this.Ui}W(){return this.cn}Km(){return this.Dm}Zm(){return this.$m}S(){this.jm(!1),0!==this.Om&&window.cancelAnimationFrame(this.Om),this.Ui.Wc().p(this),this.Ui.yt().Gu().p(this),this.Ui.f_().p(this),this.Ui.S();for(const t of this.Dm)this.Nm.removeChild(t.jv()),t.Fp().p(this),t.Wp().p(this),t.S();this.Dm=[],b(this.$m).S(),null!==this.um.parentElement&&this.um.parentElement.removeChild(this.um),this.Mc.S(),this.up.S(),this.cp.S(),this.Gm()}qm(i,n,s=!1){if(this.Qa===n&&this.e_===i)return;const e=function(i){const n=Math.floor(i.width),s=Math.floor(i.height);return t({width:n-n%2,height:s-s%2})}(t({width:i,height:n}));this.Qa=e.height,this.e_=e.width;const r=this.Qa+"px",h=this.e_+"px";b(this.um).style.height=r,b(this.um).style.width=h,this.Nm.style.height=r,this.Nm.style.width=h,s?this.Jm(ct.es(),performance.now()):this.Ui.$l()}Zv(t){void 0===t&&(t=ct.es());for(let i=0;i{let s=0;for(let e=0;e{b("left"===t?this.$m.bm():this.$m.wm()).ep(b(i),n,s)};if(this.cn.timeScale.visible){const t=this.$m.sp();if(null!==i){let n=0;this.sb()&&(h("left",n,s),n=b(e.Zp()).sp().width),this.$m.ep(i,n,s),n+=t.width,this.eb()&&h("right",n,s)}s+=t.height}return t({width:n,height:s})}ob(){let i=0,n=0,s=0;for(const t of this.Dm)this.sb()&&(n=Math.max(n,b(t.Zp()).$v(),this.cn.leftPriceScale.minimumWidth)),this.eb()&&(s=Math.max(s,b(t.Gp()).$v(),this.cn.rightPriceScale.minimumWidth)),i+=t.v_();n=es(n),s=es(s);const e=this.e_,r=this.Qa,h=Math.max(e-n-s,0),l=this.cn.timeScale.visible;let a=l?Math.max(this.$m.xm(),this.cn.timeScale.minimumHeight):0;var o;a=(o=a)+o%2;const _=0+a,u=r<_?0:r-_,c=u/i;let d=0;for(let i=0;i{t.Rp()})),3===(null===(n=this.Bm)||void 0===n?void 0:n.jn())&&(this.Bm.ts(t),this.ub(),this.cb(this.Bm),this.fb(this.Bm,i),t=this.Bm,this.Bm=null)),this.Zv(t)}fb(t,i){for(const n of t.Qn())this.ns(n,i)}cb(t){const i=this.Ui.Lc();for(let n=0;n{if(this.Im=!1,this.Om=0,null!==this.Bm){const i=this.Bm;this.Bm=null,this.Jm(i,t);for(const n of i.Qn())if(5===n.qn&&!n.Vt.Yu(t)){this.qt().Xn(n.Vt);break}}})))}ub(){this.Ym()}Ym(){const t=this.Ui.Lc(),i=t.length,n=this.Dm.length;for(let t=i;t{const n=i.In().nl(t);null!==n&&e.set(i,n)}))}let r;if(null!==t){const i=null===(s=this.Ui.yt().qi(t))||void 0===s?void 0:s.originalTime;void 0!==i&&(r=i)}const h=this.qt().Vc(),l=null!==h&&h.Ic instanceof Gi?h.Ic:void 0,a=null!==h&&void 0!==h.pv?h.pv.wr:void 0;return{bb:r,se:null!=t?t:void 0,wb:null!=i?i:void 0,gb:l,Mb:e,xb:a,Sb:null!=n?n:void 0}}vb(t,i,n){this.up.m((()=>this.mb(t,i,n)))}pb(t,i,n){this.cp.m((()=>this.mb(t,i,n)))}Hm(t,i,n){this.Mc.m((()=>this.mb(t,i,n)))}Xm(){const t=this.cn.timeScale.visible?"":"none";this.$m.jv().style.display=t}sb(){return this.Dm[0].Kv().S_().W().visible}eb(){return this.Dm[0].Kv().k_().W().visible}Um(){return"ResizeObserver"in window&&(this.zm=new ResizeObserver((t=>{const i=t.find((t=>t.target===this.Lm));i&&this.qm(i.contentRect.width,i.contentRect.height)})),this.zm.observe(this.Lm,{box:"border-box"}),!0)}Gm(){null!==this.zm&&this.zm.disconnect(),this.zm=null}}function Es(t){return Boolean(t.handleScroll.mouseWheel||t.handleScale.mouseWheel)}function Ls(t,i){var n={};for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&i.indexOf(s)<0&&(n[s]=t[s]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var e=0;for(s=Object.getOwnPropertySymbols(t);efunction(t,i){return i?i(t):void 0===(n=t).open&&void 0===n.value;var n}(s,h)?qs({ut:i,se:n,bb:e},s):qs(t(i,n,s,e,r),s)}function Xs(t){return{Candlestick:Ys(Hs),Bar:Ys(js),Area:Ys(Fs),Baseline:Ys(Ws),Histogram:Ys(Ns),Line:Ys(Ns),Custom:Ys($s)}[t]}function Ks(t){return{se:0,yb:new Map,ia:t}}function Zs(t,i){if(void 0!==t&&0!==t.length)return{Cb:i.key(t[0].ut),Tb:i.key(t[t.length-1].ut)}}function Gs(t){let i;return t.forEach((t=>{void 0===i&&(i=t.bb)})),m(i)}class Js{constructor(t){this.Pb=new Map,this.Rb=new Map,this.Db=new Map,this.Ob=[],this.N_=t}S(){this.Pb.clear(),this.Rb.clear(),this.Db.clear(),this.Ob=[]}Ab(t,i){let n=0!==this.Pb.size,s=!1;const e=this.Rb.get(t);if(void 0!==e)if(1===this.Rb.size)n=!1,s=!0,this.Pb.clear();else for(const i of this.Ob)i.pointData.yb.delete(t)&&(s=!0);let r=[];if(0!==i.length){const n=i.map((t=>t.time)),e=this.N_.createConverterToInternalObj(i),h=Xs(t.Xh()),l=t.ga(),a=t.Ma();r=i.map(((i,r)=>{const o=e(i.time),_=this.N_.key(o);let u=this.Pb.get(_);void 0===u&&(u=Ks(o),this.Pb.set(_,u),s=!0);const c=h(o,u.se,i,n[r],l,a);return u.yb.set(t,c),c}))}n&&this.Vb(),this.Bb(t,r);let h=-1;if(s){const t=[];this.Pb.forEach((i=>{t.push({timeWeight:0,time:i.ia,pointData:i,originalTime:Gs(i.yb)})})),t.sort(((t,i)=>this.N_.key(t.time)-this.N_.key(i.time))),h=this.Ib(t)}return this.zb(t,h,function(t,i,n){const s=Zs(t,n),e=Zs(i,n);if(void 0!==s&&void 0!==e)return{Xl:s.Tb>=e.Tb&&s.Cb>=e.Cb}}(this.Rb.get(t),e,this.N_))}hd(t){return this.Ab(t,[])}Eb(t,i){const n=i;!function(t){void 0===t.bb&&(t.bb=t.time)}(n),this.N_.preprocessData(i);const s=this.N_.createConverterToInternalObj([i])(i.time),e=this.Db.get(t);if(void 0!==e&&this.N_.key(s)this.N_.key(t.time)this.N_.key(s.ut)?Us(i)&&n.push(i):Us(i)?n[n.length-1]=i:n.splice(-1,1),this.Db.set(t,i.ut)}Bb(t,i){0!==i.length?(this.Rb.set(t,i.filter(Us)),this.Db.set(t,i[i.length-1].ut)):(this.Rb.delete(t),this.Db.delete(t))}Vb(){for(const t of this.Ob)0===t.pointData.yb.size&&this.Pb.delete(this.N_.key(t.time))}Ib(t){let i=-1;for(let n=0;n{0!==i.length&&(t=Math.max(t,i[i.length-1].se))})),t}zb(t,i,n){const s={Fb:new Map,yt:{Au:this.Nb()}};if(-1!==i)this.Rb.forEach(((i,e)=>{s.Fb.set(e,{He:i,Wb:e===t?n:void 0})})),this.Rb.has(t)||s.Fb.set(t,{He:[],Wb:n}),s.yt.jb=this.Ob,s.yt.Hb=i;else{const i=this.Rb.get(t);s.Fb.set(t,{He:i||[],Wb:n})}return s}}function Qs(t,i){t.se=i,t.yb.forEach((t=>{t.se=i}))}function te(t){const i={value:t.Vt[3],time:t.bb};return void 0!==t.kb&&(i.customValues=t.kb),i}function ie(t){const i=te(t);return void 0!==t.O&&(i.color=t.O),i}function ne(t){const i=te(t);return void 0!==t._t&&(i.lineColor=t._t),void 0!==t.Ts&&(i.topColor=t.Ts),void 0!==t.Ps&&(i.bottomColor=t.Ps),i}function se(t){const i=te(t);return void 0!==t.Pe&&(i.topLineColor=t.Pe),void 0!==t.Re&&(i.bottomLineColor=t.Re),void 0!==t.Se&&(i.topFillColor1=t.Se),void 0!==t.ke&&(i.topFillColor2=t.ke),void 0!==t.ye&&(i.bottomFillColor1=t.ye),void 0!==t.Ce&&(i.bottomFillColor2=t.Ce),i}function ee(t){const i={open:t.Vt[0],high:t.Vt[1],low:t.Vt[2],close:t.Vt[3],time:t.bb};return void 0!==t.kb&&(i.customValues=t.kb),i}function re(t){const i=ee(t);return void 0!==t.O&&(i.color=t.O),i}function he(t){const i=ee(t),{O:n,Bt:s,$h:e}=t;return void 0!==n&&(i.color=n),void 0!==s&&(i.borderColor=s),void 0!==e&&(i.wickColor=e),i}function le(t){return{Area:ne,Line:ie,Baseline:se,Histogram:ie,Bar:re,Candlestick:he,Custom:ae}[t]}function ae(t){const i=t.bb;return Object.assign(Object.assign({},t.He),{time:i})}const oe={vertLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},horzLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},mode:1},_e={vertLines:{color:"#D6DCDE",style:0,visible:!0},horzLines:{color:"#D6DCDE",style:0,visible:!0}},ue={background:{type:"solid",color:"#FFFFFF"},textColor:"#191919",fontSize:12,fontFamily:L},ce={autoScale:!0,mode:0,invertScale:!1,alignLabels:!0,borderVisible:!0,borderColor:"#2B2B43",entireTextOnly:!1,visible:!1,ticksVisible:!1,scaleMargins:{bottom:.1,top:.2},minimumWidth:0},de={rightOffset:0,barSpacing:6,minBarSpacing:.5,fixLeftEdge:!1,fixRightEdge:!1,lockVisibleTimeRangeOnResize:!1,rightBarStaysOnScroll:!1,borderVisible:!0,borderColor:"#2B2B43",visible:!0,timeVisible:!1,secondsVisible:!0,shiftVisibleRangeOnNewBar:!0,allowShiftVisibleRangeOnWhitespaceReplacement:!1,ticksVisible:!1,uniformDistribution:!1,minimumHeight:0},fe={color:"rgba(0, 0, 0, 0)",visible:!1,fontSize:48,fontFamily:L,fontStyle:"",text:"",horzAlign:"center",vertAlign:"center"};function ve(){return{width:0,height:0,autoSize:!1,layout:ue,crosshair:oe,grid:_e,overlayPriceScales:Object.assign({},ce),leftPriceScale:Object.assign(Object.assign({},ce),{visible:!1}),rightPriceScale:Object.assign(Object.assign({},ce),{visible:!0}),timeScale:de,watermark:fe,localization:{locale:is?navigator.language:"",dateFormat:"dd MMM 'yy"},handleScroll:{mouseWheel:!0,pressedMouseMove:!0,horzTouchDrag:!0,vertTouchDrag:!0},handleScale:{axisPressedMouseMove:{time:!0,price:!0},axisDoubleClickReset:{time:!0,price:!0},mouseWheel:!0,pinch:!0},kineticScroll:{mouse:!1,touch:!0},trackingMode:{exitMode:1}}}class pe{constructor(t,i){this.$b=t,this.Ub=i}applyOptions(t){this.$b.qt().zc(this.Ub,t)}options(){return this.Li().W()}width(){return ut(this.Ub)?this.$b.nb(this.Ub):0}Li(){return b(this.$b.qt().Ec(this.Ub)).At}}function me(t,i,n){const s=Ls(t,["time","originalTime"]),e=Object.assign({time:i},s);return void 0!==n&&(e.originalTime=n),e}const be={color:"#FF0000",price:0,lineStyle:2,lineWidth:1,lineVisible:!0,axisLabelVisible:!0,title:"",axisLabelColor:"",axisLabelTextColor:""};class we{constructor(t){this.Bh=t}applyOptions(t){this.Bh.Nh(t)}options(){return this.Bh.W()}qb(){return this.Bh}}class ge{constructor(t,i,n,s,e){this.Yb=new R,this.Es=t,this.Xb=i,this.Kb=n,this.N_=e,this.Zb=s}S(){this.Yb.S()}priceFormatter(){return this.Es.ca()}priceToCoordinate(t){const i=this.Es.Pt();return null===i?null:this.Es.At().Ot(t,i.Vt)}coordinateToPrice(t){const i=this.Es.Pt();return null===i?null:this.Es.At().pn(t,i.Vt)}barsInLogicalRange(t){if(null===t)return null;const i=new yn(new xn(t.from,t.to)).iu(),n=this.Es.In();if(n.Fi())return null;const s=n.nl(i.Os(),1),e=n.nl(i.di(),-1),r=b(n.Qh()),h=b(n.Bn());if(null!==s&&null!==e&&s.se>e.se)return{barsBefore:t.from-r,barsAfter:h-t.to};const l={barsBefore:null===s||s.se===r?t.from-r:s.se-r,barsAfter:null===e||e.se===h?h-t.to:h-e.se};return null!==s&&null!==e&&(l.from=s.bb,l.to=e.bb),l}setData(t){this.N_,this.Es.Xh(),this.Xb.Gb(this.Es,t),this.Jb("full")}update(t){this.Es.Xh(),this.Xb.Qb(this.Es,t),this.Jb("update")}dataByIndex(t,i){const n=this.Es.In().nl(t,i);if(null===n)return null;return le(this.seriesType())(n)}data(){const t=le(this.seriesType());return this.Es.In().ie().map((i=>t(i)))}subscribeDataChanged(t){this.Yb.l(t)}unsubscribeDataChanged(t){this.Yb.v(t)}setMarkers(t){this.N_;const i=t.map((t=>me(t,this.N_.convertHorzItemToInternal(t.time),t.time)));this.Es.Zl(i)}markers(){return this.Es.Gl().map((t=>me(t,t.originalTime,void 0)))}applyOptions(t){this.Es.Nh(t)}options(){return I(this.Es.W())}priceScale(){return this.Kb.priceScale(this.Es.At().xa())}createPriceLine(t){const i=D(I(be),t),n=this.Es.Jl(i);return new we(n)}removePriceLine(t){this.Es.Ql(t.qb())}seriesType(){return this.Es.Xh()}attachPrimitive(t){this.Es.ba(t),t.attached&&t.attached({chart:this.Zb,series:this,requestUpdate:()=>this.Es.qt().$l()})}detachPrimitive(t){this.Es.wa(t),t.detached&&t.detached()}Jb(t){this.Yb.M()&&this.Yb.m(t)}}class Me{constructor(t,i,n){this.tw=new R,this.uu=new R,this._m=new R,this.Ui=t,this.wl=t.yt(),this.$m=i,this.wl.Ku().l(this.iw.bind(this)),this.wl.Zu().l(this.nw.bind(this)),this.$m.gm().l(this.sw.bind(this)),this.N_=n}S(){this.wl.Ku().p(this),this.wl.Zu().p(this),this.$m.gm().p(this),this.tw.S(),this.uu.S(),this._m.S()}scrollPosition(){return this.wl.Eu()}scrollToPosition(t,i){i?this.wl.qu(t,1e3):this.Ui.Jn(t)}scrollToRealTime(){this.wl.Uu()}getVisibleRange(){const t=this.wl.yu();return null===t?null:{from:t.from.originalTime,to:t.to.originalTime}}setVisibleRange(t){const i={from:this.N_.convertHorzItemToInternal(t.from),to:this.N_.convertHorzItemToInternal(t.to)},n=this.wl.Ru(i);this.Ui.ld(n)}getVisibleLogicalRange(){const t=this.wl.ku();return null===t?null:{from:t.Os(),to:t.di()}}setVisibleLogicalRange(t){p(t.from<=t.to,"The from index cannot be after the to index."),this.Ui.ld(t)}resetTimeScale(){this.Ui.Zn()}fitContent(){this.Ui.Qu()}logicalToCoordinate(t){const i=this.Ui.yt();return i.Fi()?null:i.Et(t)}coordinateToLogical(t){return this.wl.Fi()?null:this.wl.Vu(t)}timeToCoordinate(t){const i=this.N_.convertHorzItemToInternal(t),n=this.wl.ya(i,!1);return null===n?null:this.wl.Et(n)}coordinateToTime(t){const i=this.Ui.yt(),n=i.Vu(t),s=i.qi(n);return null===s?null:s.originalTime}width(){return this.$m.$p().width}height(){return this.$m.$p().height}subscribeVisibleTimeRangeChange(t){this.tw.l(t)}unsubscribeVisibleTimeRangeChange(t){this.tw.v(t)}subscribeVisibleLogicalRangeChange(t){this.uu.l(t)}unsubscribeVisibleLogicalRangeChange(t){this.uu.v(t)}subscribeSizeChange(t){this._m.l(t)}unsubscribeSizeChange(t){this._m.v(t)}applyOptions(t){this.wl.Nh(t)}options(){return Object.assign(Object.assign({},I(this.wl.W())),{barSpacing:this.wl.he()})}iw(){this.tw.M()&&this.tw.m(this.getVisibleRange())}nw(){this.uu.M()&&this.uu.m(this.getVisibleLogicalRange())}sw(t){this._m.m(t.width,t.height)}}function xe(t){if(void 0===t||"custom"===t.type)return;const i=t;void 0!==i.minMove&&void 0===i.precision&&(i.precision=function(t){if(t>=1)return 0;let i=0;for(;i<8;i++){const n=Math.round(t);if(Math.abs(n-t)<1e-8)return i;t*=10}return i}(i.minMove))}function Se(t){return function(t){if(B(t.handleScale)){const i=t.handleScale;t.handleScale={axisDoubleClickReset:{time:i,price:i},axisPressedMouseMove:{time:i,price:i},mouseWheel:i,pinch:i}}else if(void 0!==t.handleScale){const{axisPressedMouseMove:i,axisDoubleClickReset:n}=t.handleScale;B(i)&&(t.handleScale.axisPressedMouseMove={time:i,price:i}),B(n)&&(t.handleScale.axisDoubleClickReset={time:n,price:n})}const i=t.handleScroll;B(i)&&(t.handleScroll={horzTouchDrag:i,vertTouchDrag:i,mouseWheel:i,pressedMouseMove:i})}(t),t}class ke{constructor(t,i,n){this.ew=new Map,this.rw=new Map,this.hw=new R,this.lw=new R,this.aw=new R,this.ow=new Js(i);const s=void 0===n?I(ve()):D(I(ve()),Se(n));this.N_=i,this.$b=new zs(t,s,i),this.$b.Fp().l((t=>{this.hw.M()&&this.hw.m(this._w(t()))}),this),this.$b.Wp().l((t=>{this.lw.M()&&this.lw.m(this._w(t()))}),this),this.$b.Wc().l((t=>{this.aw.M()&&this.aw.m(this._w(t()))}),this);const e=this.$b.qt();this.uw=new Me(e,this.$b.Zm(),this.N_)}remove(){this.$b.Fp().p(this),this.$b.Wp().p(this),this.$b.Wc().p(this),this.uw.S(),this.$b.S(),this.ew.clear(),this.rw.clear(),this.hw.S(),this.lw.S(),this.aw.S(),this.ow.S()}resize(t,i,n){this.autoSizeActive()||this.$b.qm(t,i,n)}addCustomSeries(t,i){const n=w(t),s=Object.assign(Object.assign({},_),n.defaultOptions());return this.cw("Custom",s,i,n)}addAreaSeries(t){return this.cw("Area",l,t)}addBaselineSeries(t){return this.cw("Baseline",a,t)}addBarSeries(t){return this.cw("Bar",r,t)}addCandlestickSeries(t={}){return function(t){void 0!==t.borderColor&&(t.borderUpColor=t.borderColor,t.borderDownColor=t.borderColor),void 0!==t.wickColor&&(t.wickUpColor=t.wickColor,t.wickDownColor=t.wickColor)}(t),this.cw("Candlestick",e,t)}addHistogramSeries(t){return this.cw("Histogram",o,t)}addLineSeries(t){return this.cw("Line",h,t)}removeSeries(t){const i=m(this.ew.get(t)),n=this.ow.hd(i);this.$b.qt().hd(i),this.dw(n),this.ew.delete(t),this.rw.delete(i)}Gb(t,i){this.dw(this.ow.Ab(t,i))}Qb(t,i){this.dw(this.ow.Eb(t,i))}subscribeClick(t){this.hw.l(t)}unsubscribeClick(t){this.hw.v(t)}subscribeCrosshairMove(t){this.aw.l(t)}unsubscribeCrosshairMove(t){this.aw.v(t)}subscribeDblClick(t){this.lw.l(t)}unsubscribeDblClick(t){this.lw.v(t)}priceScale(t){return new pe(this.$b,t)}timeScale(){return this.uw}applyOptions(t){this.$b.Nh(Se(t))}options(){return this.$b.W()}takeScreenshot(){return this.$b.tb()}autoSizeActive(){return this.$b.rb()}chartElement(){return this.$b.hb()}paneSize(){const t=this.$b.ab();return{height:t.height,width:t.width}}setCrosshairPosition(t,i,n){const s=this.ew.get(n);if(void 0===s)return;const e=this.$b.qt().cr(s);null!==e&&this.$b.qt().Qc(t,i,e)}clearCrosshairPosition(){this.$b.qt().td(!0)}cw(t,i,n={},s){xe(n.priceFormat);const e=D(I(u),I(i),n),r=this.$b.qt().ed(t,e,s),h=new ge(r,this,this,this,this.N_);return this.ew.set(h,r),this.rw.set(r,h),h}dw(t){const i=this.$b.qt();i.nd(t.yt.Au,t.yt.jb,t.yt.Hb),t.Fb.forEach(((t,i)=>i.it(t.He,t.Wb))),i.Iu()}fw(t){return m(this.rw.get(t))}_w(t){const i=new Map;t.Mb.forEach(((t,n)=>{const s=n.Xh(),e=le(s)(t);if("Custom"!==s)p(function(t){return void 0!==t.open||void 0!==t.value}(e));else{const t=n.Ma();p(!t||!1===t(e))}i.set(this.fw(n),e)}));const n=void 0===t.gb?void 0:this.fw(t.gb);return{time:t.bb,logical:t.se,point:t.wb,hoveredSeries:n,hoveredObjectId:t.xb,seriesData:i,sourceEvent:t.Sb}}}function ye(t,i,n){let s;if(V(t)){const i=document.getElementById(t);p(null!==i,`Cannot find element in DOM with id=${t}`),s=i}else s=t;const e=new ke(s,i,n);return i.setOptions(e.options()),e}function Ce(t,i){return ye(t,new ts,ts.Td(i))}const Te=Object.assign(Object.assign({},u),_);function Pe(){return"4.2.0-dev+202405092055"}export{Bn as ColorType,ot as CrosshairMode,An as LastPriceAnimationMode,d as LineStyle,c as LineType,Ei as MismatchDirection,Vn as PriceLineSource,pn as PriceScaleMode,In as TickMarkType,On as TrackingModeExitMode,Ce as createChart,ye as createChartEx,Te as customSeriesDefaultOptions,En as isBusinessDay,Ln as isUTCTimestamp,Pe as version}; -diff --git a/dist/lightweight-charts.standalone.development.js b/dist/lightweight-charts.standalone.development.js -index 56c1697eb8183445977901df0b10cf39c920c11d..befb938155fc7824158cae98b0d26ab1fb9ab52e 100644 ---- a/dist/lightweight-charts.standalone.development.js -+++ b/dist/lightweight-charts.standalone.development.js -@@ -1,7 +1,7 @@ - /*! - * @license -- * TradingView Lightweight Charts™ v4.1.1 -- * Copyright (c) 2023 TradingView, Inc. -+ * TradingView Lightweight Charts™ v4.2.0-dev+202405092055 -+ * Copyright (c) 2024 TradingView, Inc. - * Licensed under Apache License 2.0 https://www.apache.org/licenses/LICENSE-2.0 - */ - (function () { -@@ -149,6 +149,10 @@ - * A dotted line with more space between dots. - */ - LineStyle[LineStyle["SparseDotted"] = 4] = "SparseDotted"; -+ /** -+ * A dotted line with more space between dots. -+ */ -+ LineStyle[LineStyle["CustomDotGrid"] = 5] = "CustomDotGrid"; - })(LineStyle || (LineStyle = {})); - function setLineStyle(ctx, style) { - const dashPatterns = { -@@ -157,6 +161,7 @@ - [2 /* LineStyle.Dashed */]: [2 * ctx.lineWidth, 2 * ctx.lineWidth], - [3 /* LineStyle.LargeDashed */]: [6 * ctx.lineWidth, 6 * ctx.lineWidth], - [4 /* LineStyle.SparseDotted */]: [ctx.lineWidth, 4 * ctx.lineWidth], -+ [5 /* LineStyle.CustomDotGrid */]: [ctx.lineWidth, ctx.lineWidth], - }; - const dashPattern = dashPatterns[style]; - ctx.setLineDash(dashPattern); -@@ -5109,6 +5114,42 @@ - ctx.lineWidth = lineWidth; - strokeInPixel(ctx, () => { - const data = ensureNotNull(this._private__data); -+ if (data._internal_vertLineStyle === 5 /* LineStyle.CustomDotGrid */) { -+ if (!data._internal_vertLinesVisible || !data._internal_horzLinesVisible) { -+ return; -+ } -+ ctx.fillStyle = data._internal_vertLinesColor; -+ setLineStyle(ctx, data._internal_vertLineStyle); -+ ctx.beginPath(); -+ const dotGapY = data._internal_priceMarks.length > 1 ? data._internal_priceMarks[1]._internal_coord - data._internal_priceMarks[0]._internal_coord : undefined; -+ let lastDotGapX; -+ for (let i = 0; i < data._internal_timeMarks.length; i++) { -+ ctx.fillStyle = data._internal_vertLinesColor; -+ const timeMark = data._internal_timeMarks[i]; -+ const x = Math.round(timeMark._internal_coord * horizontalPixelRatio); -+ const dotGapX = i < (data._internal_timeMarks.length - 1) ? (data._internal_timeMarks[i + 1]._internal_coord - timeMark._internal_coord) : lastDotGapX; -+ const addExtraDot = (dotGapX && dotGapY) ? dotGapX > (dotGapY * 1.7) : false; -+ lastDotGapX = dotGapX; -+ for (let j = 0; j < data._internal_priceMarks.length; j++) { -+ const priceMark = data._internal_priceMarks[j]; -+ const y = Math.round(priceMark._internal_coord * verticalPixelRatio); -+ ctx.moveTo(x, y); -+ ctx.arc(x, y, 1.5, 0, Math.PI * 2); -+ if (addExtraDot && dotGapX) { -+ const extraDotX = Math.round((timeMark._internal_coord + (dotGapX / 2)) * horizontalPixelRatio); -+ ctx.moveTo(extraDotX, y); -+ ctx.arc(extraDotX, y, 1.5, 0, Math.PI * 2); -+ if (i === 0) { -+ const prevExtraDotX = Math.round((timeMark._internal_coord - (dotGapX / 2)) * horizontalPixelRatio); -+ ctx.moveTo(prevExtraDotX, y); -+ ctx.arc(prevExtraDotX, y, 1.5, 0, Math.PI * 2); -+ } -+ } -+ } -+ } -+ ctx.fill(); -+ return; -+ } - if (data._internal_vertLinesVisible) { - ctx.strokeStyle = data._internal_vertLinesColor; - setLineStyle(ctx, data._internal_vertLineStyle); -@@ -13313,7 +13354,7 @@ - * Returns the current version as a string. For example `'3.3.0'`. - */ - function version() { -- return "4.1.1"; -+ return "4.2.0-dev+202405092055"; - } - - var LightweightChartsModule = /*#__PURE__*/Object.freeze({ -diff --git a/dist/lightweight-charts.standalone.development.mjs b/dist/lightweight-charts.standalone.development.mjs -index 307fa04490e645f03453cb09490c9da90af2ffc9..e673e289eb8d32c8035ea73dd77ade3ee3a24d9d 100644 ---- a/dist/lightweight-charts.standalone.development.mjs -+++ b/dist/lightweight-charts.standalone.development.mjs -@@ -1,7 +1,7 @@ - /*! - * @license -- * TradingView Lightweight Charts™ v4.1.1 -- * Copyright (c) 2023 TradingView, Inc. -+ * TradingView Lightweight Charts™ v4.2.0-dev+202405092055 -+ * Copyright (c) 2024 TradingView, Inc. - * Licensed under Apache License 2.0 https://www.apache.org/licenses/LICENSE-2.0 - */ - const candlestickStyleDefaults = { -@@ -146,6 +146,10 @@ var LineStyle; - * A dotted line with more space between dots. - */ - LineStyle[LineStyle["SparseDotted"] = 4] = "SparseDotted"; -+ /** -+ * A dotted line with more space between dots. -+ */ -+ LineStyle[LineStyle["CustomDotGrid"] = 5] = "CustomDotGrid"; - })(LineStyle || (LineStyle = {})); - function setLineStyle(ctx, style) { - const dashPatterns = { -@@ -154,6 +158,7 @@ function setLineStyle(ctx, style) { - [2 /* LineStyle.Dashed */]: [2 * ctx.lineWidth, 2 * ctx.lineWidth], - [3 /* LineStyle.LargeDashed */]: [6 * ctx.lineWidth, 6 * ctx.lineWidth], - [4 /* LineStyle.SparseDotted */]: [ctx.lineWidth, 4 * ctx.lineWidth], -+ [5 /* LineStyle.CustomDotGrid */]: [ctx.lineWidth, ctx.lineWidth], - }; - const dashPattern = dashPatterns[style]; - ctx.setLineDash(dashPattern); -@@ -5106,6 +5111,42 @@ class GridRenderer extends BitmapCoordinatesPaneRenderer { - ctx.lineWidth = lineWidth; - strokeInPixel(ctx, () => { - const data = ensureNotNull(this._private__data); -+ if (data._internal_vertLineStyle === 5 /* LineStyle.CustomDotGrid */) { -+ if (!data._internal_vertLinesVisible || !data._internal_horzLinesVisible) { -+ return; -+ } -+ ctx.fillStyle = data._internal_vertLinesColor; -+ setLineStyle(ctx, data._internal_vertLineStyle); -+ ctx.beginPath(); -+ const dotGapY = data._internal_priceMarks.length > 1 ? data._internal_priceMarks[1]._internal_coord - data._internal_priceMarks[0]._internal_coord : undefined; -+ let lastDotGapX; -+ for (let i = 0; i < data._internal_timeMarks.length; i++) { -+ ctx.fillStyle = data._internal_vertLinesColor; -+ const timeMark = data._internal_timeMarks[i]; -+ const x = Math.round(timeMark._internal_coord * horizontalPixelRatio); -+ const dotGapX = i < (data._internal_timeMarks.length - 1) ? (data._internal_timeMarks[i + 1]._internal_coord - timeMark._internal_coord) : lastDotGapX; -+ const addExtraDot = (dotGapX && dotGapY) ? dotGapX > (dotGapY * 1.7) : false; -+ lastDotGapX = dotGapX; -+ for (let j = 0; j < data._internal_priceMarks.length; j++) { -+ const priceMark = data._internal_priceMarks[j]; -+ const y = Math.round(priceMark._internal_coord * verticalPixelRatio); -+ ctx.moveTo(x, y); -+ ctx.arc(x, y, 1.5, 0, Math.PI * 2); -+ if (addExtraDot && dotGapX) { -+ const extraDotX = Math.round((timeMark._internal_coord + (dotGapX / 2)) * horizontalPixelRatio); -+ ctx.moveTo(extraDotX, y); -+ ctx.arc(extraDotX, y, 1.5, 0, Math.PI * 2); -+ if (i === 0) { -+ const prevExtraDotX = Math.round((timeMark._internal_coord - (dotGapX / 2)) * horizontalPixelRatio); -+ ctx.moveTo(prevExtraDotX, y); -+ ctx.arc(prevExtraDotX, y, 1.5, 0, Math.PI * 2); -+ } -+ } -+ } -+ } -+ ctx.fill(); -+ return; -+ } - if (data._internal_vertLinesVisible) { - ctx.strokeStyle = data._internal_vertLinesColor; - setLineStyle(ctx, data._internal_vertLineStyle); -@@ -13310,7 +13351,7 @@ const customSeriesDefaultOptions = Object.assign(Object.assign({}, seriesOptions - * Returns the current version as a string. For example `'3.3.0'`. - */ - function version() { -- return "4.1.1"; -+ return "4.2.0-dev+202405092055"; - } - - export { ColorType, CrosshairMode, LastPriceAnimationMode, LineStyle, LineType, MismatchDirection, PriceLineSource, PriceScaleMode, TickMarkType, TrackingModeExitMode, createChart, createChartEx, customSeriesDefaultOptions, isBusinessDay, isUTCTimestamp, version }; -diff --git a/dist/lightweight-charts.standalone.production.js b/dist/lightweight-charts.standalone.production.js -index 73c825b466458fbce3ec56ebf8d00aed08978958..88f09bf6c19a954bde71cd5f76dae5e7dadeae96 100644 ---- a/dist/lightweight-charts.standalone.production.js -+++ b/dist/lightweight-charts.standalone.production.js -@@ -1,7 +1,7 @@ - /*! - * @license -- * TradingView Lightweight Charts™ v4.1.1 -- * Copyright (c) 2023 TradingView, Inc. -+ * TradingView Lightweight Charts™ v4.2.0-dev+202405092055 -+ * Copyright (c) 2024 TradingView, Inc. - * Licensed under Apache License 2.0 https://www.apache.org/licenses/LICENSE-2.0 - */ --!function(){"use strict";const t={upColor:"#26a69a",downColor:"#ef5350",wickVisible:!0,borderVisible:!0,borderColor:"#378658",borderUpColor:"#26a69a",borderDownColor:"#ef5350",wickColor:"#737375",wickUpColor:"#26a69a",wickDownColor:"#ef5350"},i={upColor:"#26a69a",downColor:"#ef5350",openVisible:!0,thinBars:!0},n={color:"#2196f3",lineStyle:0,lineWidth:3,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},s={topColor:"rgba( 46, 220, 135, 0.4)",bottomColor:"rgba( 40, 221, 100, 0)",invertFilledArea:!1,lineColor:"#33D778",lineStyle:0,lineWidth:3,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},e={baseValue:{type:"price",price:0},topFillColor1:"rgba(38, 166, 154, 0.28)",topFillColor2:"rgba(38, 166, 154, 0.05)",topLineColor:"rgba(38, 166, 154, 1)",bottomFillColor1:"rgba(239, 83, 80, 0.05)",bottomFillColor2:"rgba(239, 83, 80, 0.28)",bottomLineColor:"rgba(239, 83, 80, 1)",lineWidth:3,lineStyle:0,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},r={color:"#26a69a",base:0},h={color:"#2196f3"},l={title:"",visible:!0,lastValueVisible:!0,priceLineVisible:!0,priceLineSource:0,priceLineWidth:1,priceLineColor:"",priceLineStyle:2,baseLineVisible:!0,baseLineWidth:1,baseLineColor:"#B2B5BE",baseLineStyle:0,priceFormat:{type:"price",precision:2,minMove:.01}};var a,o;function _(t,i){const n={0:[],1:[t.lineWidth,t.lineWidth],2:[2*t.lineWidth,2*t.lineWidth],3:[6*t.lineWidth,6*t.lineWidth],4:[t.lineWidth,4*t.lineWidth]}[i];t.setLineDash(n)}function u(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(n,i+e),t.lineTo(s,i+e),t.stroke()}function c(t,i){if(!t)throw new Error("Assertion failed"+(i?": "+i:""))}function d(t){if(void 0===t)throw new Error("Value is undefined");return t}function f(t){if(null===t)throw new Error("Value is null");return t}function v(t){return f(d(t))}!function(t){t[t.Simple=0]="Simple",t[t.WithSteps=1]="WithSteps",t[t.Curved=2]="Curved"}(a||(a={})),function(t){t[t.Solid=0]="Solid",t[t.Dotted=1]="Dotted",t[t.Dashed=2]="Dashed",t[t.LargeDashed=3]="LargeDashed",t[t.SparseDotted=4]="SparseDotted"}(o||(o={}));const p={khaki:"#f0e68c",azure:"#f0ffff",aliceblue:"#f0f8ff",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gainsboro:"#dcdcdc",gray:"#808080",green:"#008000",honeydew:"#f0fff0",floralwhite:"#fffaf0",lightblue:"#add8e6",lightcoral:"#f08080",lemonchiffon:"#fffacd",hotpink:"#ff69b4",lightyellow:"#ffffe0",greenyellow:"#adff2f",lightgoldenrodyellow:"#fafad2",limegreen:"#32cd32",linen:"#faf0e6",lightcyan:"#e0ffff",magenta:"#f0f",maroon:"#800000",olive:"#808000",orange:"#ffa500",oldlace:"#fdf5e6",mediumblue:"#0000cd",transparent:"#0000",lime:"#0f0",lightpink:"#ffb6c1",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",midnightblue:"#191970",orchid:"#da70d6",mediumorchid:"#ba55d3",mediumturquoise:"#48d1cc",orangered:"#ff4500",royalblue:"#4169e1",powderblue:"#b0e0e6",red:"#f00",coral:"#ff7f50",turquoise:"#40e0d0",white:"#fff",whitesmoke:"#f5f5f5",wheat:"#f5deb3",teal:"#008080",steelblue:"#4682b4",bisque:"#ffe4c4",aquamarine:"#7fffd4",aqua:"#0ff",sienna:"#a0522d",silver:"#c0c0c0",springgreen:"#00ff7f",antiquewhite:"#faebd7",burlywood:"#deb887",brown:"#a52a2a",beige:"#f5f5dc",chocolate:"#d2691e",chartreuse:"#7fff00",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cadetblue:"#5f9ea0",tomato:"#ff6347",fuchsia:"#f0f",blue:"#00f",salmon:"#fa8072",blanchedalmond:"#ffebcd",slateblue:"#6a5acd",slategray:"#708090",thistle:"#d8bfd8",tan:"#d2b48c",cyan:"#0ff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",blueviolet:"#8a2be2",black:"#000",darkmagenta:"#8b008b",darkslateblue:"#483d8b",darkkhaki:"#bdb76b",darkorchid:"#9932cc",darkorange:"#ff8c00",darkgreen:"#006400",darkred:"#8b0000",dodgerblue:"#1e90ff",darkslategray:"#2f4f4f",dimgray:"#696969",deepskyblue:"#00bfff",firebrick:"#b22222",forestgreen:"#228b22",indigo:"#4b0082",ivory:"#fffff0",lavenderblush:"#fff0f5",feldspar:"#d19275",indianred:"#cd5c5c",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightskyblue:"#87cefa",lightslategray:"#789",lightslateblue:"#8470ff",snow:"#fffafa",lightseagreen:"#20b2aa",lightsalmon:"#ffa07a",darksalmon:"#e9967a",darkviolet:"#9400d3",mediumpurple:"#9370d8",mediumaquamarine:"#66cdaa",skyblue:"#87ceeb",lavender:"#e6e6fa",lightsteelblue:"#b0c4de",mediumvioletred:"#c71585",mintcream:"#f5fffa",navajowhite:"#ffdead",navy:"#000080",olivedrab:"#6b8e23",palevioletred:"#d87093",violetred:"#d02090",yellow:"#ff0",yellowgreen:"#9acd32",lawngreen:"#7cfc00",pink:"#ffc0cb",paleturquoise:"#afeeee",palegoldenrod:"#eee8aa",darkolivegreen:"#556b2f",darkseagreen:"#8fbc8f",darkturquoise:"#00ced1",peachpuff:"#ffdab9",deeppink:"#ff1493",violet:"#ee82ee",palegreen:"#98fb98",mediumseagreen:"#3cb371",peru:"#cd853f",saddlebrown:"#8b4513",sandybrown:"#f4a460",rosybrown:"#bc8f8f",purple:"#800080",seagreen:"#2e8b57",seashell:"#fff5ee",papayawhip:"#ffefd5",mediumslateblue:"#7b68ee",plum:"#dda0dd",mediumspringgreen:"#00fa9a"};function m(t){return t<0?0:t>255?255:Math.round(t)||0}function b(t){return t<=0||t>0?t<0?0:t>1?1:Math.round(1e4*t)/1e4:0}const w=/^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,g=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,M=/^rgb\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*\)$/,x=/^rgba\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?[\d]{0,10}(?:\.\d+)?)\s*\)$/;function S(t){(t=t.toLowerCase())in p&&(t=p[t]);{const i=x.exec(t)||M.exec(t);if(i)return[m(parseInt(i[1],10)),m(parseInt(i[2],10)),m(parseInt(i[3],10)),b(i.length<5?1:parseFloat(i[4]))]}{const i=g.exec(t);if(i)return[m(parseInt(i[1],16)),m(parseInt(i[2],16)),m(parseInt(i[3],16)),1]}{const i=w.exec(t);if(i)return[m(17*parseInt(i[1],16)),m(17*parseInt(i[2],16)),m(17*parseInt(i[3],16)),1]}throw new Error(`Cannot parse color: ${t}`)}function y(t){const i=S(t);return{t:`rgb(${i[0]}, ${i[1]}, ${i[2]})`,i:(n=i,.199*n[0]+.687*n[1]+.114*n[2]>160?"black":"white")};var n}class k{constructor(){this.h=[]}l(t,i,n){const s={o:t,_:i,u:!0===n};this.h.push(s)}v(t){const i=this.h.findIndex((i=>t===i.o));i>-1&&this.h.splice(i,1)}p(t){this.h=this.h.filter((i=>i._!==t))}m(t,i,n){const s=[...this.h];this.h=this.h.filter((t=>!t.u)),s.forEach((s=>s.o(t,i,n)))}M(){return this.h.length>0}S(){this.h=[]}}function C(t,...i){for(const n of i)for(const i in n)void 0!==n[i]&&("object"!=typeof n[i]||void 0===t[i]||Array.isArray(n[i])?t[i]=n[i]:C(t[i],n[i]));return t}function T(t){return"number"==typeof t&&isFinite(t)}function P(t){return"number"==typeof t&&t%1==0}function R(t){return"string"==typeof t}function D(t){return"boolean"==typeof t}function O(t){const i=t;if(!i||"object"!=typeof i)return i;let n,s,e;for(s in n=Array.isArray(i)?[]:{},i)i.hasOwnProperty(s)&&(e=i[s],n[s]=e&&"object"==typeof e?O(e):e);return n}function A(t){return null!==t}function B(t){return null===t?void 0:t}const V="-apple-system, BlinkMacSystemFont, 'Trebuchet MS', Roboto, Ubuntu, sans-serif";function z(t,i,n){return void 0===i&&(i=V),`${n=void 0!==n?`${n} `:""}${t}px ${i}`}class E{constructor(t){this.k={C:1,T:5,P:NaN,R:"",D:"",O:"",A:"",B:0,V:0,I:0,L:0,N:0},this.F=t}W(){const t=this.k,i=this.j(),n=this.H();return t.P===i&&t.D===n||(t.P=i,t.D=n,t.R=z(i,n),t.L=2.5/12*i,t.B=t.L,t.V=i/12*t.T,t.I=i/12*t.T,t.N=0),t.O=this.$(),t.A=this.U(),this.k}$(){return this.F.W().layout.textColor}U(){return this.F.q()}j(){return this.F.W().layout.fontSize}H(){return this.F.W().layout.fontFamily}}class I{constructor(){this.Y=[]}X(t){this.Y=t}K(t,i,n){this.Y.forEach((s=>{s.K(t,i,n)}))}}class L{K(t,i,n){t.useMediaCoordinateSpace((t=>this.Z(t,i,n)))}G(t,i,n){t.useMediaCoordinateSpace((t=>this.J(t,i,n)))}J(t,i,n){}}class N extends L{constructor(){super(...arguments),this.tt=null}it(t){this.tt=t}Z({context:t}){if(null===this.tt||null===this.tt.nt)return;const i=this.tt.nt,n=this.tt,s=s=>{t.beginPath();for(let e=i.to-1;e>=i.from;--e){const i=n.st[e];t.moveTo(i.et,i.rt),t.arc(i.et,i.rt,s,0,2*Math.PI)}t.fill()};n.ht>0&&(t.fillStyle=n.lt,s(n.ot+n.ht)),t.fillStyle=n._t,s(n.ot)}}function F(){return{st:[{et:0,rt:0,ut:0,ct:0}],_t:"",lt:"",ot:0,ht:0,nt:null}}const W={from:0,to:1};class j{constructor(t,i){this.dt=new I,this.ft=[],this.vt=[],this.bt=!0,this.F=t,this.wt=i,this.dt.X(this.ft)}gt(t){const i=this.F.Mt();i.length!==this.ft.length&&(this.vt=i.map(F),this.ft=this.vt.map((t=>{const i=new N;return i.it(t),i})),this.dt.X(this.ft)),this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.dt}St(){const t=2===this.wt.W().mode,i=this.F.Mt(),n=this.wt.yt(),s=this.F.kt();i.forEach(((i,e)=>{var r;const h=this.vt[e],l=i.Ct(n);if(t||null===l||!i.Tt())return void(h.nt=null);const a=f(i.Pt());h._t=l.Rt,h.ot=l.ot,h.ht=l.Dt,h.st[0].ct=l.ct,h.st[0].rt=i.At().Ot(l.ct,a.Bt),h.lt=null!==(r=l.Vt)&&void 0!==r?r:this.F.zt(h.st[0].rt/i.At().Et()),h.st[0].ut=n,h.st[0].et=s.It(n),h.nt=W}))}}class H{K(t,i,n){t.useBitmapCoordinateSpace((t=>this.Z(t,i,n)))}}class $ extends H{constructor(t){super(),this.Lt=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;const e=this.Lt.Nt.Tt,r=this.Lt.Ft.Tt;if(!e&&!r)return;const h=Math.round(this.Lt.et*n),l=Math.round(this.Lt.rt*s);t.lineCap="butt",e&&h>=0&&(t.lineWidth=Math.floor(this.Lt.Nt.ht*n),t.strokeStyle=this.Lt.Nt.O,t.fillStyle=this.Lt.Nt.O,_(t,this.Lt.Nt.Wt),function(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(i+e,n),t.lineTo(i+e,s),t.stroke()}(t,h,0,i.height)),r&&l>=0&&(t.lineWidth=Math.floor(this.Lt.Ft.ht*s),t.strokeStyle=this.Lt.Ft.O,t.fillStyle=this.Lt.Ft.O,_(t,this.Lt.Ft.Wt),u(t,l,0,i.width))}}class U{constructor(t){this.bt=!0,this.jt={Nt:{ht:1,Wt:0,O:"",Tt:!1},Ft:{ht:1,Wt:0,O:"",Tt:!1},et:0,rt:0},this.Ht=new $(this.jt),this.$t=t}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht}St(){const t=this.$t.Tt(),i=f(this.$t.Ut()),n=i.qt().W().crosshair,s=this.jt;if(2===n.mode)return s.Ft.Tt=!1,void(s.Nt.Tt=!1);s.Ft.Tt=t&&this.$t.Yt(i),s.Nt.Tt=t&&this.$t.Xt(),s.Ft.ht=n.horzLine.width,s.Ft.Wt=n.horzLine.style,s.Ft.O=n.horzLine.color,s.Nt.ht=n.vertLine.width,s.Nt.Wt=n.vertLine.style,s.Nt.O=n.vertLine.color,s.et=this.$t.Kt(),s.rt=this.$t.Zt()}}function q(t,i,n,s,e,r){t.fillRect(i+r,n,s-2*r,r),t.fillRect(i+r,n+e-r,s-2*r,r),t.fillRect(i,n,r,e),t.fillRect(i+s-r,n,r,e)}function Y(t,i,n,s,e,r){t.save(),t.globalCompositeOperation="copy",t.fillStyle=r,t.fillRect(i,n,s,e),t.restore()}function X(t,i){return t.map((t=>0===t?t:t+i))}function K(t,i,n,s,e,r){t.beginPath(),t.lineTo(i+s-r[1],n),0!==r[1]&&t.arcTo(i+s,n,i+s,n+r[1],r[1]),t.lineTo(i+s,n+e-r[2]),0!==r[2]&&t.arcTo(i+s,n+e,i+s-r[2],n+e,r[2]),t.lineTo(i+r[3],n+e),0!==r[3]&&t.arcTo(i,n+e,i,n+e-r[3],r[3]),t.lineTo(i,n+r[0]),0!==r[0]&&t.arcTo(i,n,i+r[0],n,r[0])}function Z(t,i,n,s,e,r,h=0,l=[0,0,0,0],a=""){if(t.save(),!h||!a||a===r)return K(t,i,n,s,e,l),t.fillStyle=r,t.fill(),void t.restore();const o=h/2;if("transparent"!==r){K(t,i+h,n+h,s-2*h,e-2*h,X(l,-h)),t.fillStyle=r,t.fill()}if("transparent"!==a){K(t,i+o,n+o,s-h,e-h,X(l,-o)),t.lineWidth=h,t.strokeStyle=a,t.closePath(),t.stroke()}t.restore()}function G(t,i,n,s,e,r,h){t.save(),t.globalCompositeOperation="copy";const l=t.createLinearGradient(0,0,0,e);l.addColorStop(0,r),l.addColorStop(1,h),t.fillStyle=l,t.fillRect(i,n,s,e),t.restore()}class J{constructor(t,i){this.it(t,i)}it(t,i){this.Lt=t,this.Gt=i}Et(t,i){return this.Lt.Tt?t.P+t.L+t.B:0}K(t,i,n,s){if(!this.Lt.Tt||0===this.Lt.Jt.length)return;const e=this.Lt.O,r=this.Gt.t,h=t.useBitmapCoordinateSpace((t=>{const h=t.context;h.font=i.R;const l=this.Qt(t,i,n,s),a=l.ti,o=(t,i)=>{l.ii?Z(h,a.ni,a.si,a.ei,a.ri,t,a.hi,[a.ot,0,0,a.ot],i):Z(h,a.li,a.si,a.ei,a.ri,t,a.hi,[0,a.ot,a.ot,0],i)};return o(r,"transparent"),this.Lt.ai&&(h.fillStyle=e,h.fillRect(a.li,a.oi,a._i-a.li,a.ui)),o("transparent",r),this.Lt.ci&&(h.fillStyle=i.A,h.fillRect(l.ii?a.di-a.hi:0,a.si,a.hi,a.fi-a.si)),l}));t.useMediaCoordinateSpace((({context:t})=>{const n=h.vi;t.font=i.R,t.textAlign=h.ii?"right":"left",t.textBaseline="middle",t.fillStyle=e,t.fillText(this.Lt.Jt,n.pi,(n.si+n.fi)/2+n.mi)}))}Qt(t,i,n,s){var e;const{context:r,bitmapSize:h,mediaSize:l,horizontalPixelRatio:a,verticalPixelRatio:o}=t,_=this.Lt.ai||!this.Lt.bi?i.T:0,u=this.Lt.wi?i.C:0,c=i.L+this.Gt.gi,d=i.B+this.Gt.Mi,f=i.V,v=i.I,p=this.Lt.Jt,m=i.P,b=n.xi(r,p),w=Math.ceil(n.Si(r,p)),g=m+c+d,M=i.C+f+v+w+_,x=Math.max(1,Math.floor(o));let S=Math.round(g*o);S%2!=x%2&&(S+=1);const y=u>0?Math.max(1,Math.floor(u*a)):0,k=Math.round(M*a),C=Math.round(_*a),T=null!==(e=this.Gt.yi)&&void 0!==e?e:this.Gt.ki,P=Math.round(T*o)-Math.floor(.5*o),R=Math.floor(P+x/2-S/2),D=R+S,O="right"===s,A=O?l.width-u:u,B=O?h.width-y:y;let V,z,E;return O?(V=B-k,z=B-C,E=A-_-f-u):(V=B+k,z=B+C,E=A+_+f),{ii:O,ti:{si:R,oi:P,fi:D,ei:k,ri:S,ot:2*a,hi:y,ni:V,li:B,_i:z,ui:x,di:h.width},vi:{si:R/o,fi:D/o,pi:E,mi:b}}}}class Q{constructor(t){this.Ci={ki:0,t:"#000",Mi:0,gi:0},this.Ti={Jt:"",Tt:!1,ai:!0,bi:!1,Vt:"",O:"#FFF",ci:!1,wi:!1},this.Pi={Jt:"",Tt:!1,ai:!1,bi:!0,Vt:"",O:"#FFF",ci:!0,wi:!0},this.bt=!0,this.Ri=new(t||J)(this.Ti,this.Ci),this.Di=new(t||J)(this.Pi,this.Ci)}Jt(){return this.Oi(),this.Ti.Jt}ki(){return this.Oi(),this.Ci.ki}gt(){this.bt=!0}Et(t,i=!1){return Math.max(this.Ri.Et(t,i),this.Di.Et(t,i))}Ai(){return this.Ci.yi||0}Bi(t){this.Ci.yi=t}Vi(){return this.Oi(),this.Ti.Tt||this.Pi.Tt}zi(){return this.Oi(),this.Ti.Tt}xt(t){return this.Oi(),this.Ti.ai=this.Ti.ai&&t.W().ticksVisible,this.Pi.ai=this.Pi.ai&&t.W().ticksVisible,this.Ri.it(this.Ti,this.Ci),this.Di.it(this.Pi,this.Ci),this.Ri}Ei(){return this.Oi(),this.Ri.it(this.Ti,this.Ci),this.Di.it(this.Pi,this.Ci),this.Di}Oi(){this.bt&&(this.Ti.ai=!0,this.Pi.ai=!1,this.Ii(this.Ti,this.Pi,this.Ci))}}class tt extends Q{constructor(t,i,n){super(),this.$t=t,this.Li=i,this.Ni=n}Ii(t,i,n){if(t.Tt=!1,2===this.$t.W().mode)return;const s=this.$t.W().horzLine;if(!s.labelVisible)return;const e=this.Li.Pt();if(!this.$t.Tt()||this.Li.Fi()||null===e)return;const r=y(s.labelBackgroundColor);n.t=r.t,t.O=r.i;const h=2/12*this.Li.P();n.gi=h,n.Mi=h;const l=this.Ni(this.Li);n.ki=l.ki,t.Jt=this.Li.Wi(l.ct,e),t.Tt=!0}}const it=/[1-9]/g;class nt{constructor(){this.Lt=null}it(t){this.Lt=t}K(t,i){if(null===this.Lt||!1===this.Lt.Tt||0===this.Lt.Jt.length)return;const n=t.useMediaCoordinateSpace((({context:t})=>(t.font=i.R,Math.round(i.ji.Si(t,f(this.Lt).Jt,it)))));if(n<=0)return;const s=i.Hi,e=n+2*s,r=e/2,h=this.Lt.$i;let l=this.Lt.ki,a=Math.floor(l-r)+.5;a<0?(l+=Math.abs(0-a),a=Math.floor(l-r)+.5):a+e>h&&(l-=Math.abs(h-(a+e)),a=Math.floor(l-r)+.5);const o=a+e,_=Math.ceil(0+i.C+i.T+i.L+i.P+i.B);t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:n,verticalPixelRatio:s})=>{const e=f(this.Lt);t.fillStyle=e.t;const r=Math.round(a*n),h=Math.round(0*s),l=Math.round(o*n),u=Math.round(_*s),c=Math.round(2*n);if(t.beginPath(),t.moveTo(r,h),t.lineTo(r,u-c),t.arcTo(r,u,r+c,u,c),t.lineTo(l-c,u),t.arcTo(l,u,l,u-c,c),t.lineTo(l,h),t.fill(),e.ai){const r=Math.round(e.ki*n),l=h,a=Math.round((l+i.T)*s);t.fillStyle=e.O;const o=Math.max(1,Math.floor(n)),_=Math.floor(.5*n);t.fillRect(r-_,l,o,a-l)}})),t.useMediaCoordinateSpace((({context:t})=>{const n=f(this.Lt),e=0+i.C+i.T+i.L+i.P/2;t.font=i.R,t.textAlign="left",t.textBaseline="middle",t.fillStyle=n.O;const r=i.ji.xi(t,"Apr0");t.translate(a+s,e+r),t.fillText(n.Jt,0,0)}))}}class st{constructor(t,i,n){this.bt=!0,this.Ht=new nt,this.jt={Tt:!1,t:"#4c525e",O:"white",Jt:"",$i:0,ki:NaN,ai:!0},this.wt=t,this.Ui=i,this.Ni=n}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht.it(this.jt),this.Ht}St(){const t=this.jt;if(t.Tt=!1,2===this.wt.W().mode)return;const i=this.wt.W().vertLine;if(!i.labelVisible)return;const n=this.Ui.kt();if(n.Fi())return;t.$i=n.$i();const s=this.Ni();if(null===s)return;t.ki=s.ki;const e=n.qi(this.wt.yt());t.Jt=n.Yi(f(e)),t.Tt=!0;const r=y(i.labelBackgroundColor);t.t=r.t,t.O=r.i,t.ai=n.W().ticksVisible}}class et{constructor(){this.Xi=null,this.Ki=0}Zi(){return this.Ki}Gi(t){this.Ki=t}At(){return this.Xi}Ji(t){this.Xi=t}Qi(t){return[]}tn(){return[]}Tt(){return!0}}var rt;!function(t){t[t.Normal=0]="Normal",t[t.Magnet=1]="Magnet",t[t.Hidden=2]="Hidden"}(rt||(rt={}));class ht extends et{constructor(t,i){super(),this.nn=null,this.sn=NaN,this.en=0,this.rn=!0,this.hn=new Map,this.ln=!1,this.an=NaN,this.on=NaN,this._n=NaN,this.un=NaN,this.Ui=t,this.cn=i,this.dn=new j(t,this);this.fn=((t,i)=>n=>{const s=i(),e=t();if(n===f(this.nn).vn())return{ct:e,ki:s};{const t=f(n.Pt());return{ct:n.pn(s,t),ki:s}}})((()=>this.sn),(()=>this.on));const n=((t,i)=>()=>{const n=this.Ui.kt().mn(t()),s=i();return n&&Number.isFinite(s)?{ut:n,ki:s}:null})((()=>this.en),(()=>this.Kt()));this.bn=new st(this,t,n),this.wn=new U(this)}W(){return this.cn}gn(t,i){this._n=t,this.un=i}Mn(){this._n=NaN,this.un=NaN}xn(){return this._n}Sn(){return this.un}yn(t,i,n){this.ln||(this.ln=!0),this.rn=!0,this.kn(t,i,n)}yt(){return this.en}Kt(){return this.an}Zt(){return this.on}Tt(){return this.rn}Cn(){this.rn=!1,this.Tn(),this.sn=NaN,this.an=NaN,this.on=NaN,this.nn=null,this.Mn()}Pn(t){return null!==this.nn?[this.wn,this.dn]:[]}Yt(t){return t===this.nn&&this.cn.horzLine.visible}Xt(){return this.cn.vertLine.visible}Rn(t,i){this.rn&&this.nn===t||this.hn.clear();const n=[];return this.nn===t&&n.push(this.Dn(this.hn,i,this.fn)),n}tn(){return this.rn?[this.bn]:[]}Ut(){return this.nn}On(){this.wn.gt(),this.hn.forEach((t=>t.gt())),this.bn.gt(),this.dn.gt()}An(t){return t&&!t.vn().Fi()?t.vn():null}kn(t,i,n){this.Bn(t,i,n)&&this.On()}Bn(t,i,n){const s=this.an,e=this.on,r=this.sn,h=this.en,l=this.nn,a=this.An(n);this.en=t,this.an=isNaN(t)?NaN:this.Ui.kt().It(t),this.nn=n;const o=null!==a?a.Pt():null;return null!==a&&null!==o?(this.sn=i,this.on=a.Ot(i,o)):(this.sn=NaN,this.on=NaN),s!==this.an||e!==this.on||h!==this.en||r!==this.sn||l!==this.nn}Tn(){const t=this.Ui.Mt().map((t=>t.zn().Vn())).filter(A),i=0===t.length?null:Math.max(...t);this.en=null!==i?i:NaN}Dn(t,i,n){let s=t.get(i);return void 0===s&&(s=new tt(this,i,n),t.set(i,s)),s}}function lt(t){return"left"===t||"right"===t}class at{constructor(t){this.En=new Map,this.In=[],this.Ln=t}Nn(t,i){const n=function(t,i){return void 0===t?i:{Fn:Math.max(t.Fn,i.Fn),Wn:t.Wn||i.Wn}}(this.En.get(t),i);this.En.set(t,n)}jn(){return this.Ln}Hn(t){const i=this.En.get(t);return void 0===i?{Fn:this.Ln}:{Fn:Math.max(this.Ln,i.Fn),Wn:i.Wn}}$n(){this.Un(),this.In=[{qn:0}]}Yn(t){this.Un(),this.In=[{qn:1,Bt:t}]}Xn(t){this.Kn(),this.In.push({qn:5,Bt:t})}Un(){this.Kn(),this.In.push({qn:6})}Zn(){this.Un(),this.In=[{qn:4}]}Gn(t){this.Un(),this.In.push({qn:2,Bt:t})}Jn(t){this.Un(),this.In.push({qn:3,Bt:t})}Qn(){return this.In}ts(t){for(const i of t.In)this.ns(i);this.Ln=Math.max(this.Ln,t.Ln),t.En.forEach(((t,i)=>{this.Nn(i,t)}))}static ss(){return new at(2)}static es(){return new at(3)}ns(t){switch(t.qn){case 0:this.$n();break;case 1:this.Yn(t.Bt);break;case 2:this.Gn(t.Bt);break;case 3:this.Jn(t.Bt);break;case 4:this.Zn();break;case 5:this.Xn(t.Bt);break;case 6:this.Kn()}}Kn(){const t=this.In.findIndex((t=>5===t.qn));-1!==t&&this.In.splice(t,1)}}const ot=".";function _t(t,i){if(!T(t))return"n/a";if(!P(i))throw new TypeError("invalid length");if(i<0||i>16)throw new TypeError("invalid length");if(0===i)return t.toString();return("0000000000000000"+t.toString()).slice(-i)}class ut{constructor(t,i){if(i||(i=1),T(t)&&P(t)||(t=100),t<0)throw new TypeError("invalid base");this.Li=t,this.rs=i,this.hs()}format(t){const i=t<0?"−":"";return t=Math.abs(t),i+this.ls(t)}hs(){if(this.os=0,this.Li>0&&this.rs>0){let t=this.Li;for(;t>1;)t/=10,this.os++}}ls(t){const i=this.Li/this.rs;let n=Math.floor(t),s="";const e=void 0!==this.os?this.os:NaN;if(i>1){let r=+(Math.round(t*i)-n*i).toFixed(this.os);r>=i&&(r-=i,n+=1),s=ot+_t(+r.toFixed(this.os)*this.rs,e)}else n=Math.round(n*i)/i,e>0&&(s=ot+_t(0,e));return n.toFixed(0)+s}}class ct extends ut{constructor(t=100){super(t)}format(t){return`${super.format(t)}%`}}class dt{constructor(t){this._s=t}format(t){let i="";return t<0&&(i="-",t=-t),t<995?i+this.us(t):t<999995?i+this.us(t/1e3)+"K":t<999999995?(t=1e3*Math.round(t/1e3),i+this.us(t/1e6)+"M"):(t=1e6*Math.round(t/1e6),i+this.us(t/1e9)+"B")}us(t){let i;const n=Math.pow(10,this._s);return i=(t=Math.round(t*n)/n)>=1e-15&&t<1?t.toFixed(this._s).replace(/\.?0+$/,""):String(t),i.replace(/(\.[1-9]*)0+$/,((t,i)=>i))}}function ft(t,i,n,s,e,r,h){if(0===i.length||s.from>=i.length||s.to<=0)return;const{context:l,horizontalPixelRatio:a,verticalPixelRatio:o}=t,_=i[s.from];let u=r(t,_),c=_;if(s.to-s.from<2){const i=e/2;l.beginPath();const n={et:_.et-i,rt:_.rt},s={et:_.et+i,rt:_.rt};l.moveTo(n.et*a,n.rt*o),l.lineTo(s.et*a,s.rt*o),h(t,u,n,s)}else{const e=(i,n)=>{h(t,u,c,n),l.beginPath(),u=i,c=n};let d=c;l.beginPath(),l.moveTo(_.et*a,_.rt*o);for(let h=s.from+1;h=s.from;--n){const s=i[n];if(s){const i=e(t,s);i!==a&&(l.beginPath(),null!==a&&l.fill(),l.fillStyle=i,a=i);const n=Math.round(s.et*r)+o,u=s.rt*h;l.moveTo(n,u),l.arc(n,u,_,0,2*Math.PI)}}l.fill()}(t,i,l,n,o)}}class Pt extends Tt{Ds(t,i){return i._t}}function Rt(t,i,n,s,e=0,r=i.length){let h=r-e;for(;0>1,l=e+r;s(i[l],n)===t?(e=l+1,h-=r+1):h=r}return e}const Dt=Rt.bind(null,!0),Ot=Rt.bind(null,!1);function At(t,i){return t.ut0&&r=s&&(l=r-1),h>0&&hObject.assign(Object.assign({},t),this.Is.$s().Hs(t.ut))))}Us(){this.Es=null}Fs(){this.Bs&&(this.qs(),this.Bs=!1),this.Vs&&(this.js(),this.Vs=!1),this.As&&(this.Ys(),this.As=!1)}Ys(){const t=this.Is.At(),i=this.Ls.kt();if(this.Us(),i.Fi()||t.Fi())return;const n=i.Xs();if(null===n)return;if(0===this.Is.zn().Ks())return;const s=this.Is.Pt();null!==s&&(this.Es=Vt(this.zs,n,this.Ns),this.Zs(t,i,s.Bt),this.Gs())}}class Et extends zt{constructor(t,i){super(t,i,!0)}Zs(t,i,n){i.Js(this.zs,B(this.Es)),t.Qs(this.zs,n,B(this.Es))}te(t,i){return{ut:t,ct:i,et:NaN,rt:NaN}}qs(){const t=this.Is.$s();this.zs=this.Is.zn().ie().map((i=>{const n=i.Bt[3];return this.ne(i.se,n,t)}))}}class It extends Et{constructor(t,i){super(t,i),this.Ws=new I,this.ee=new kt,this.re=new Pt,this.Ws.X([this.ee,this.re])}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Is.W();this.ee.it({ds:t.lineType,st:this.zs,Wt:t.lineStyle,ht:t.lineWidth,fs:null,vs:t.invertFilledArea,nt:this.Es,cs:this.Ls.kt().he()}),this.re.it({ds:t.lineVisible?t.lineType:void 0,st:this.zs,Wt:t.lineStyle,ht:t.lineWidth,nt:this.Es,cs:this.Ls.kt().he(),Rs:t.pointMarkersVisible?t.pointMarkersRadius||t.lineWidth/2+2:void 0})}}class Lt extends H{constructor(){super(...arguments),this.Lt=null,this.le=0,this.ae=0}it(t){this.Lt=t}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.Lt||0===this.Lt.zn.length||null===this.Lt.nt)return;if(this.le=this.oe(i),this.le>=2){Math.max(1,Math.floor(i))%2!=this.le%2&&this.le--}this.ae=this.Lt._e?Math.min(this.le,Math.floor(i)):this.le;let s=null;const e=this.ae<=this.le&&this.Lt.he>=Math.floor(1.5*i);for(let r=this.Lt.nt.from;rf+p-1&&(e=f+p-1,s=e-_+1),t.fillRect(i,s,o-i,e-s+1)}const i=a+m;let s=Math.max(f,Math.round(h.pe*n)-l),e=s+_-1;e>f+p-1&&(e=f+p-1,s=e-_+1),t.fillRect(u+1,s,i-u,e-s+1)}}}oe(t){const i=Math.floor(t);return Math.max(i,Math.floor(function(t,i){return Math.floor(.3*t*i)}(f(this.Lt).he,t)))}}class Nt extends zt{constructor(t,i){super(t,i,!1)}Zs(t,i,n){i.Js(this.zs,B(this.Es)),t.me(this.zs,n,B(this.Es))}be(t,i,n){return{ut:t,we:i.Bt[0],ge:i.Bt[1],Me:i.Bt[2],xe:i.Bt[3],et:NaN,ve:NaN,ce:NaN,de:NaN,pe:NaN}}qs(){const t=this.Is.$s();this.zs=this.Is.zn().ie().map((i=>this.ne(i.se,i,t)))}}class Ft extends Nt{constructor(){super(...arguments),this.Ws=new Lt}ne(t,i,n){return Object.assign(Object.assign({},this.be(t,i,n)),n.Hs(t))}Gs(){const t=this.Is.W();this.Ws.it({zn:this.zs,he:this.Ls.kt().he(),fe:t.openVisible,_e:t.thinBars,nt:this.Es})}}class Wt extends gt{constructor(){super(...arguments),this.Cs=new yt}ps(t,i){const n=this.tt;return this.Cs.bs(t,{gs:i.Se,Ms:i.ye,xs:i.ke,Ss:i.Ce,ys:t.bitmapSize.height,fs:n.fs})}}class jt extends Tt{constructor(){super(...arguments),this.Te=new yt}Ds(t,i){const n=this.tt;return this.Te.bs(t,{gs:i.Pe,Ms:i.Pe,xs:i.Re,Ss:i.Re,ys:t.bitmapSize.height,fs:n.fs})}}class Ht extends Et{constructor(t,i){super(t,i),this.Ws=new I,this.De=new Wt,this.Oe=new jt,this.Ws.X([this.De,this.Oe])}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Is.Pt();if(null===t)return;const i=this.Is.W(),n=this.Is.At().Ot(i.baseValue.price,t.Bt),s=this.Ls.kt().he();this.De.it({st:this.zs,ht:i.lineWidth,Wt:i.lineStyle,ds:i.lineType,fs:n,vs:!1,nt:this.Es,cs:s}),this.Oe.it({st:this.zs,ht:i.lineWidth,Wt:i.lineStyle,ds:i.lineVisible?i.lineType:void 0,Rs:i.pointMarkersVisible?i.pointMarkersRadius||i.lineWidth/2+2:void 0,fs:n,nt:this.Es,cs:s})}}class $t extends H{constructor(){super(...arguments),this.Lt=null,this.le=0}it(t){this.Lt=t}Z(t){if(null===this.Lt||0===this.Lt.zn.length||null===this.Lt.nt)return;const{horizontalPixelRatio:i}=t;if(this.le=function(t,i){if(t>=2.5&&t<=4)return Math.floor(3*i);const n=1-.2*Math.atan(Math.max(4,t)-4)/(.5*Math.PI),s=Math.floor(t*n*i),e=Math.floor(t*i),r=Math.min(s,e);return Math.max(Math.floor(i),r)}(this.Lt.he,i),this.le>=2){Math.floor(i)%2!=this.le%2&&this.le--}const n=this.Lt.zn;this.Lt.Ae&&this.Be(t,n,this.Lt.nt),this.Lt.ci&&this.Ve(t,n,this.Lt.nt);const s=this.ze(i);(!this.Lt.ci||this.le>2*s)&&this.Ee(t,n,this.Lt.nt)}Be(t,i,n){if(null===this.Lt)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="",l=Math.min(Math.floor(e),Math.floor(this.Lt.he*e));l=Math.max(Math.floor(e),Math.min(l,this.le));const a=Math.floor(.5*l);let o=null;for(let t=n.from;t2*l)q(s,o,u,_-o+1,c-u+1,l);else{const t=_-o+1;s.fillRect(o,u,t,c-u+1)}a=_}}Ee(t,i,n){if(null===this.Lt)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="";const l=this.ze(e);for(let t=n.from;to||s.fillRect(_,a,u-_+1,o-a+1)}}}class Ut extends Nt{constructor(){super(...arguments),this.Ws=new $t}ne(t,i,n){return Object.assign(Object.assign({},this.be(t,i,n)),n.Hs(t))}Gs(){const t=this.Is.W();this.Ws.it({zn:this.zs,he:this.Ls.kt().he(),Ae:t.wickVisible,ci:t.borderVisible,nt:this.Es})}}class qt{constructor(t,i){this.Ne=t,this.Li=i}K(t,i,n){this.Ne.draw(t,this.Li,i,n)}}class Yt extends zt{constructor(t,i,n){super(t,i,!1),this.wn=n,this.Ws=new qt(this.wn.renderer(),(i=>{const n=t.Pt();return null===n?null:t.At().Ot(i,n.Bt)}))}Fe(t){return this.wn.priceValueBuilder(t)}We(t){return this.wn.isWhitespace(t)}qs(){const t=this.Is.$s();this.zs=this.Is.zn().ie().map((i=>Object.assign(Object.assign({ut:i.se,et:NaN},t.Hs(i.se)),{je:i.He})))}Zs(t,i){i.Js(this.zs,B(this.Es))}Gs(){this.wn.update({bars:this.zs.map(Xt),barSpacing:this.Ls.kt().he(),visibleRange:this.Es},this.Is.W())}}function Xt(t){return{x:t.et,time:t.ut,originalData:t.je,barColor:t.ue}}class Kt extends H{constructor(){super(...arguments),this.Lt=null,this.$e=[]}it(t){this.Lt=t,this.$e=[]}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.Lt||0===this.Lt.st.length||null===this.Lt.nt)return;this.$e.length||this.Ue(i);const s=Math.max(1,Math.floor(n)),e=Math.round(this.Lt.qe*n)-Math.floor(s/2),r=e+s;for(let i=this.Lt.nt.from;is.Xe?s.di=n.Os-i-1:n.Os=s.di+i+1))}let s=Math.ceil(this.Lt.he*t);for(let t=this.Lt.nt.from;t0&&s<4)for(let t=this.Lt.nt.from;ts&&(i.Ye>i.Xe?i.di-=1:i.Os+=1)}}}class Zt extends Et{constructor(){super(...arguments),this.Ws=new Kt}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t={st:this.zs,he:this.Ls.kt().he(),nt:this.Es,qe:this.Is.At().Ot(this.Is.W().base,f(this.Is.Pt()).Bt)};this.Ws.it(t)}}class Gt extends Et{constructor(){super(...arguments),this.Ws=new Pt}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Is.W(),i={st:this.zs,Wt:t.lineStyle,ds:t.lineVisible?t.lineType:void 0,ht:t.lineWidth,Rs:t.pointMarkersVisible?t.pointMarkersRadius||t.lineWidth/2+2:void 0,nt:this.Es,cs:this.Ls.kt().he()};this.Ws.it(i)}}const Jt=/[2-9]/g;class Qt{constructor(t=50){this.Ke=0,this.Ze=1,this.Ge=1,this.Je={},this.Qe=new Map,this.tr=t}ir(){this.Ke=0,this.Qe.clear(),this.Ze=1,this.Ge=1,this.Je={}}Si(t,i,n){return this.nr(t,i,n).width}xi(t,i,n){const s=this.nr(t,i,n);return((s.actualBoundingBoxAscent||0)-(s.actualBoundingBoxDescent||0))/2}nr(t,i,n){const s=n||Jt,e=String(i).replace(s,"0");if(this.Qe.has(e))return d(this.Qe.get(e)).sr;if(this.Ke===this.tr){const t=this.Je[this.Ge];delete this.Je[this.Ge],this.Qe.delete(t),this.Ge++,this.Ke--}t.save(),t.textBaseline="middle";const r=t.measureText(e);return t.restore(),0===r.width&&i.length||(this.Qe.set(e,{sr:r,er:this.Ze}),this.Je[this.Ze]=e,this.Ke++,this.Ze++),r}}class ti{constructor(t){this.rr=null,this.k=null,this.hr="right",this.lr=t}ar(t,i,n){this.rr=t,this.k=i,this.hr=n}K(t){null!==this.k&&null!==this.rr&&this.rr.K(t,this.k,this.lr,this.hr)}}class ii{constructor(t,i,n){this._r=t,this.lr=new Qt(50),this.ur=i,this.F=n,this.j=-1,this.Ht=new ti(this.lr)}xt(){const t=this.F.cr(this.ur);if(null===t)return null;const i=t.dr(this.ur)?t.vr():this.ur.At();if(null===i)return null;const n=t.pr(i);if("overlay"===n)return null;const s=this.F.mr();return s.P!==this.j&&(this.j=s.P,this.lr.ir()),this.Ht.ar(this._r.Ei(),s,n),this.Ht}}class ni extends H{constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}br(t,i){var n;if(!(null===(n=this.Lt)||void 0===n?void 0:n.Tt))return null;const{rt:s,ht:e,wr:r}=this.Lt;return i>=s-e-7&&i<=s+e+7?{gr:this.Lt,wr:r}:null}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;if(!1===this.Lt.Tt)return;const e=Math.round(this.Lt.rt*s);e<0||e>i.height||(t.lineCap="butt",t.strokeStyle=this.Lt.O,t.lineWidth=Math.floor(this.Lt.ht*n),_(t,this.Lt.Wt),u(t,e,0,i.width))}}class si{constructor(t){this.Mr={rt:0,O:"rgba(0, 0, 0, 0)",ht:1,Wt:0,Tt:!1},this.Sr=new ni,this.bt=!0,this.Is=t,this.Ls=t.qt(),this.Sr.it(this.Mr)}gt(){this.bt=!0}xt(){return this.Is.Tt()?(this.bt&&(this.yr(),this.bt=!1),this.Sr):null}}class ei extends si{constructor(t){super(t)}yr(){this.Mr.Tt=!1;const t=this.Is.At(),i=t.kr().kr;if(2!==i&&3!==i)return;const n=this.Is.W();if(!n.baseLineVisible||!this.Is.Tt())return;const s=this.Is.Pt();null!==s&&(this.Mr.Tt=!0,this.Mr.rt=t.Ot(s.Bt,s.Bt),this.Mr.O=n.baseLineColor,this.Mr.ht=n.baseLineWidth,this.Mr.Wt=n.baseLineStyle)}}class ri extends H{constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}He(){return this.Lt}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){const s=this.Lt;if(null===s)return;const e=Math.max(1,Math.floor(i)),r=e%2/2,h=Math.round(s.Xe.x*i)+r,l=s.Xe.y*n;t.fillStyle=s.Cr,t.beginPath();const a=Math.max(2,1.5*s.Tr)*i;t.arc(h,l,a,0,2*Math.PI,!1),t.fill(),t.fillStyle=s.Pr,t.beginPath(),t.arc(h,l,s.ot*i,0,2*Math.PI,!1),t.fill(),t.lineWidth=e,t.strokeStyle=s.Rr,t.beginPath(),t.arc(h,l,s.ot*i+e/2,0,2*Math.PI,!1),t.stroke()}}const hi=[{Dr:0,Or:.25,Ar:4,Br:10,Vr:.25,zr:0,Er:.4,Ir:.8},{Dr:.25,Or:.525,Ar:10,Br:14,Vr:0,zr:0,Er:.8,Ir:0},{Dr:.525,Or:1,Ar:14,Br:14,Vr:0,zr:0,Er:0,Ir:0}];function li(t,i,n,s){return function(t,i){if("transparent"===t)return t;const n=S(t),s=n[3];return`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${i*s})`}(t,n+(s-n)*i)}function ai(t,i){const n=t%2600/2600;let s;for(const t of hi)if(n>=t.Dr&&n<=t.Or){s=t;break}c(void 0!==s,"Last price animation internal logic error");const e=(n-s.Dr)/(s.Or-s.Dr);return{Pr:li(i,e,s.Vr,s.zr),Rr:li(i,e,s.Er,s.Ir),ot:(r=e,h=s.Ar,l=s.Br,h+(l-h)*r)};var r,h,l}class oi{constructor(t){this.Ht=new ri,this.bt=!0,this.Lr=!0,this.Nr=performance.now(),this.Fr=this.Nr-1,this.Wr=t}jr(){this.Fr=this.Nr-1,this.gt()}Hr(){if(this.gt(),2===this.Wr.W().lastPriceAnimation){const t=performance.now(),i=this.Fr-t;if(i>0)return void(i<650&&(this.Fr+=2600));this.Nr=t,this.Fr=t+2600}}gt(){this.bt=!0}$r(){this.Lr=!0}Tt(){return 0!==this.Wr.W().lastPriceAnimation}Ur(){switch(this.Wr.W().lastPriceAnimation){case 0:return!1;case 1:return!0;case 2:return performance.now()<=this.Fr}}xt(){return this.bt?(this.St(),this.bt=!1,this.Lr=!1):this.Lr&&(this.qr(),this.Lr=!1),this.Ht}St(){this.Ht.it(null);const t=this.Wr.qt().kt(),i=t.Xs(),n=this.Wr.Pt();if(null===i||null===n)return;const s=this.Wr.Yr(!0);if(s.Xr||!i.Kr(s.se))return;const e={x:t.It(s.se),y:this.Wr.At().Ot(s.ct,n.Bt)},r=s.O,h=this.Wr.W().lineWidth,l=ai(this.Zr(),r);this.Ht.it({Cr:r,Tr:h,Pr:l.Pr,Rr:l.Rr,ot:l.ot,Xe:e})}qr(){const t=this.Ht.He();if(null!==t){const i=ai(this.Zr(),t.Cr);t.Pr=i.Pr,t.Rr=i.Rr,t.ot=i.ot}}Zr(){return this.Ur()?performance.now()-this.Nr:2599}}function _i(t,i){return St(Math.min(Math.max(t,12),30)*i)}function ui(t,i){switch(t){case"arrowDown":case"arrowUp":return _i(i,1);case"circle":return _i(i,.8);case"square":return _i(i,.7)}}function ci(t){return function(t){const i=Math.ceil(t);return i%2!=0?i-1:i}(_i(t,1))}function di(t){return Math.max(_i(t,.1),3)}function fi(t,i,n,s,e){const r=ui("square",n),h=(r-1)/2,l=t-h,a=i-h;return s>=l&&s<=l+r&&e>=a&&e<=a+r}function vi(t,i,n,s,e){const r=(ui("arrowUp",e)-1)/2,h=(St(e/2)-1)/2;i.beginPath(),t?(i.moveTo(n-r,s),i.lineTo(n,s-r),i.lineTo(n+r,s),i.lineTo(n+h,s),i.lineTo(n+h,s+r),i.lineTo(n-h,s+r),i.lineTo(n-h,s)):(i.moveTo(n-r,s),i.lineTo(n,s+r),i.lineTo(n+r,s),i.lineTo(n+h,s),i.lineTo(n+h,s-r),i.lineTo(n-h,s-r),i.lineTo(n-h,s)),i.fill()}function pi(t,i,n,s,e,r){return fi(i,n,s,e,r)}class mi extends L{constructor(){super(...arguments),this.Lt=null,this.lr=new Qt,this.j=-1,this.H="",this.Gr=""}it(t){this.Lt=t}ar(t,i){this.j===t&&this.H===i||(this.j=t,this.H=i,this.Gr=z(t,i),this.lr.ir())}br(t,i){if(null===this.Lt||null===this.Lt.nt)return null;for(let n=this.Lt.nt.from;n=t&&e<=t+n&&r>=i-h&&r<=i+h}(t.Jt.et,t.Jt.rt,t.Jt.$i,t.Jt.Et,i,n))||function(t,i,n){if(0===t.Ks)return!1;switch(t.th){case"arrowDown":case"arrowUp":return pi(0,t.et,t.rt,t.Ks,i,n);case"circle":return function(t,i,n,s,e){const r=2+ui("circle",n)/2,h=t-s,l=i-e;return Math.sqrt(h*h+l*l)<=r}(t.et,t.rt,t.Ks,i,n);case"square":return fi(t.et,t.rt,t.Ks,i,n)}}(t,i,n)}function gi(t,i,n,s,e,r,h,l,a){const o=T(n)?n:n.xe,_=T(n)?n:n.ge,u=T(n)?n:n.Me,c=T(i.size)?Math.max(i.size,0):1,d=ci(l.he())*c,f=d/2;switch(t.Ks=d,i.position){case"inBar":return t.rt=h.Ot(o,a),void(void 0!==t.Jt&&(t.Jt.rt=t.rt+f+r+.6*e));case"aboveBar":return t.rt=h.Ot(_,a)-f-s.ih,void 0!==t.Jt&&(t.Jt.rt=t.rt-f-.6*e,s.ih+=1.2*e),void(s.ih+=d+r);case"belowBar":return t.rt=h.Ot(u,a)+f+s.nh,void 0!==t.Jt&&(t.Jt.rt=t.rt+f+r+.6*e,s.nh+=1.2*e),void(s.nh+=d+r)}i.position}class Mi{constructor(t,i){this.bt=!0,this.sh=!0,this.eh=!0,this.rh=null,this.Ht=new mi,this.Wr=t,this.Ui=i,this.Lt={st:[],nt:null}}gt(t){this.bt=!0,this.eh=!0,"data"===t&&(this.sh=!0)}xt(t){if(!this.Wr.Tt())return null;this.bt&&this.hh();const i=this.Ui.W().layout;return this.Ht.ar(i.fontSize,i.fontFamily),this.Ht.it(this.Lt),this.Ht}lh(){if(this.eh){if(this.Wr.ah().length>0){const t=this.Ui.kt().he(),i=di(t),n=1.5*ci(t)+2*i;this.rh={above:n,below:n}}else this.rh=null;this.eh=!1}return this.rh}hh(){const t=this.Wr.At(),i=this.Ui.kt(),n=this.Wr.ah();this.sh&&(this.Lt.st=n.map((t=>({ut:t.time,et:0,rt:0,Ks:0,th:t.shape,O:t.color,Jr:t.Jr,wr:t.id,Jt:void 0}))),this.sh=!1);const s=this.Ui.W().layout;this.Lt.nt=null;const e=i.Xs();if(null===e)return;const r=this.Wr.Pt();if(null===r)return;if(0===this.Lt.st.length)return;let h=NaN;const l=di(i.he()),a={ih:l,nh:l};this.Lt.nt=Vt(this.Lt.st,e,!0);for(let e=this.Lt.nt.from;e0&&(_.Jt={Qr:o.text,et:0,rt:0,$i:0,Et:0});const u=this.Wr.oh(o.time);null!==u&&gi(_,o,u,a,s.fontSize,l,t,i,r.Bt)}this.bt=!1}}class xi extends si{constructor(t){super(t)}yr(){const t=this.Mr;t.Tt=!1;const i=this.Is.W();if(!i.priceLineVisible||!this.Is.Tt())return;const n=this.Is.Yr(0===i.priceLineSource);n.Xr||(t.Tt=!0,t.rt=n.ki,t.O=this.Is._h(n.O),t.ht=i.priceLineWidth,t.Wt=i.priceLineStyle)}}class Si extends Q{constructor(t){super(),this.$t=t}Ii(t,i,n){t.Tt=!1,i.Tt=!1;const s=this.$t;if(!s.Tt())return;const e=s.W(),r=e.lastValueVisible,h=""!==s.uh(),l=0===e.seriesLastValueMode,a=s.Yr(!1);if(a.Xr)return;r&&(t.Jt=this.dh(a,r,l),t.Tt=0!==t.Jt.length),(h||l)&&(i.Jt=this.fh(a,r,h,l),i.Tt=i.Jt.length>0);const o=s._h(a.O),_=y(o);n.t=_.t,n.ki=a.ki,i.Vt=s.qt().zt(a.ki/s.At().Et()),t.Vt=o,t.O=_.i,i.O=_.i}fh(t,i,n,s){let e="";const r=this.$t.uh();return n&&0!==r.length&&(e+=`${r} `),i&&s&&(e+=this.$t.At().ph()?t.mh:t.bh),e.trim()}dh(t,i,n){return i?n?this.$t.At().ph()?t.bh:t.mh:t.Jt:""}}function yi(t,i,n,s){const e=Number.isFinite(i),r=Number.isFinite(n);return e&&r?t(i,n):e||r?e?i:n:s}class ki{constructor(t,i){this.wh=t,this.gh=i}Mh(t){return null!==t&&(this.wh===t.wh&&this.gh===t.gh)}xh(){return new ki(this.wh,this.gh)}Sh(){return this.wh}yh(){return this.gh}kh(){return this.gh-this.wh}Fi(){return this.gh===this.wh||Number.isNaN(this.gh)||Number.isNaN(this.wh)}ts(t){return null===t?this:new ki(yi(Math.min,this.Sh(),t.Sh(),-1/0),yi(Math.max,this.yh(),t.yh(),1/0))}Ch(t){if(!T(t))return;if(0===this.gh-this.wh)return;const i=.5*(this.gh+this.wh);let n=this.gh-i,s=this.wh-i;n*=t,s*=t,this.gh=i+n,this.wh=i+s}Th(t){T(t)&&(this.gh+=t,this.wh+=t)}Ph(){return{minValue:this.wh,maxValue:this.gh}}static Rh(t){return null===t?null:new ki(t.minValue,t.maxValue)}}class Ci{constructor(t,i){this.Dh=t,this.Oh=i||null}Ah(){return this.Dh}Bh(){return this.Oh}Ph(){return null===this.Dh?null:{priceRange:this.Dh.Ph(),margins:this.Oh||void 0}}static Rh(t){return null===t?null:new Ci(ki.Rh(t.priceRange),t.margins)}}class Ti extends si{constructor(t,i){super(t),this.Vh=i}yr(){const t=this.Mr;t.Tt=!1;const i=this.Vh.W();if(!this.Is.Tt()||!i.lineVisible)return;const n=this.Vh.zh();null!==n&&(t.Tt=!0,t.rt=n,t.O=i.color,t.ht=i.lineWidth,t.Wt=i.lineStyle,t.wr=this.Vh.W().id)}}class Pi extends Q{constructor(t,i){super(),this.Wr=t,this.Vh=i}Ii(t,i,n){t.Tt=!1,i.Tt=!1;const s=this.Vh.W(),e=s.axisLabelVisible,r=""!==s.title,h=this.Wr;if(!e||!h.Tt())return;const l=this.Vh.zh();if(null===l)return;r&&(i.Jt=s.title,i.Tt=!0),i.Vt=h.qt().zt(l/h.At().Et()),t.Jt=this.Eh(s.price),t.Tt=!0;const a=y(s.axisLabelColor||s.color);n.t=a.t;const o=s.axisLabelTextColor||a.i;t.O=o,i.O=o,n.ki=l}Eh(t){const i=this.Wr.Pt();return null===i?"":this.Wr.At().Wi(t,i.Bt)}}class Ri{constructor(t,i){this.Wr=t,this.cn=i,this.Ih=new Ti(t,this),this._r=new Pi(t,this),this.Lh=new ii(this._r,t,t.qt())}Nh(t){C(this.cn,t),this.gt(),this.Wr.qt().Fh()}W(){return this.cn}Wh(){return this.Ih}jh(){return this.Lh}Hh(){return this._r}gt(){this.Ih.gt(),this._r.gt()}zh(){const t=this.Wr,i=t.At();if(t.qt().kt().Fi()||i.Fi())return null;const n=t.Pt();return null===n?null:i.Ot(this.cn.price,n.Bt)}}class Di extends et{constructor(t){super(),this.Ui=t}qt(){return this.Ui}}const Oi={Bar:(t,i,n,s)=>{var e;const r=i.upColor,h=i.downColor,l=f(t(n,s)),a=v(l.Bt[0])<=v(l.Bt[3]);return{ue:null!==(e=l.O)&&void 0!==e?e:a?r:h}},Candlestick:(t,i,n,s)=>{var e,r,h;const l=i.upColor,a=i.downColor,o=i.borderUpColor,_=i.borderDownColor,u=i.wickUpColor,c=i.wickDownColor,d=f(t(n,s)),p=v(d.Bt[0])<=v(d.Bt[3]);return{ue:null!==(e=d.O)&&void 0!==e?e:p?l:a,Le:null!==(r=d.Vt)&&void 0!==r?r:p?o:_,Ie:null!==(h=d.$h)&&void 0!==h?h:p?u:c}},Custom:(t,i,n,s)=>{var e;return{ue:null!==(e=f(t(n,s)).O)&&void 0!==e?e:i.color}},Area:(t,i,n,s)=>{var e,r,h,l;const a=f(t(n,s));return{ue:null!==(e=a._t)&&void 0!==e?e:i.lineColor,_t:null!==(r=a._t)&&void 0!==r?r:i.lineColor,Ts:null!==(h=a.Ts)&&void 0!==h?h:i.topColor,Ps:null!==(l=a.Ps)&&void 0!==l?l:i.bottomColor}},Baseline:(t,i,n,s)=>{var e,r,h,l,a,o;const _=f(t(n,s));return{ue:_.Bt[3]>=i.baseValue.price?i.topLineColor:i.bottomLineColor,Pe:null!==(e=_.Pe)&&void 0!==e?e:i.topLineColor,Re:null!==(r=_.Re)&&void 0!==r?r:i.bottomLineColor,Se:null!==(h=_.Se)&&void 0!==h?h:i.topFillColor1,ye:null!==(l=_.ye)&&void 0!==l?l:i.topFillColor2,ke:null!==(a=_.ke)&&void 0!==a?a:i.bottomFillColor1,Ce:null!==(o=_.Ce)&&void 0!==o?o:i.bottomFillColor2}},Line:(t,i,n,s)=>{var e,r;const h=f(t(n,s));return{ue:null!==(e=h.O)&&void 0!==e?e:i.color,_t:null!==(r=h.O)&&void 0!==r?r:i.color}},Histogram:(t,i,n,s)=>{var e;return{ue:null!==(e=f(t(n,s)).O)&&void 0!==e?e:i.color}}};class Ai{constructor(t){this.Uh=(t,i)=>void 0!==i?i.Bt:this.Wr.zn().qh(t),this.Wr=t,this.Yh=Oi[t.Xh()]}Hs(t,i){return this.Yh(this.Uh,this.Wr.W(),t,i)}}var Bi;!function(t){t[t.NearestLeft=-1]="NearestLeft",t[t.None=0]="None",t[t.NearestRight=1]="NearestRight"}(Bi||(Bi={}));const Vi=30;class zi{constructor(){this.Kh=[],this.Zh=new Map,this.Gh=new Map}Jh(){return this.Ks()>0?this.Kh[this.Kh.length-1]:null}Qh(){return this.Ks()>0?this.tl(0):null}Vn(){return this.Ks()>0?this.tl(this.Kh.length-1):null}Ks(){return this.Kh.length}Fi(){return 0===this.Ks()}Kr(t){return null!==this.il(t,0)}qh(t){return this.nl(t)}nl(t,i=0){const n=this.il(t,i);return null===n?null:Object.assign(Object.assign({},this.sl(n)),{se:this.tl(n)})}ie(){return this.Kh}el(t,i,n){if(this.Fi())return null;let s=null;for(const e of n){s=Ei(s,this.rl(t,i,e))}return s}it(t){this.Gh.clear(),this.Zh.clear(),this.Kh=t}tl(t){return this.Kh[t].se}sl(t){return this.Kh[t]}il(t,i){const n=this.hl(t);if(null===n&&0!==i)switch(i){case-1:return this.ll(t);case 1:return this.al(t);default:throw new TypeError("Unknown search mode")}return n}ll(t){let i=this.ol(t);return i>0&&(i-=1),i!==this.Kh.length&&this.tl(i)t.set.se>i))}ul(t,i,n){let s=null;for(let e=t;es.dl&&(s.dl=t)))}return s}rl(t,i,n){if(this.Fi())return null;let s=null;const e=f(this.Qh()),r=f(this.Vn()),h=Math.max(t,e),l=Math.min(i,r),a=Math.ceil(h/Vi)*Vi,o=Math.max(a,Math.floor(l/Vi)*Vi);{const t=this.ol(h),e=this._l(Math.min(l,a,i));s=Ei(s,this.ul(t,e,n))}let _=this.Zh.get(n);void 0===_&&(_=new Map,this.Zh.set(n,_));for(let t=Math.max(a+1,h);tnew Li(t)));return this.gl={vl:e,pl:r},r}tn(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.kl).timeAxisViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.Ml)||void 0===s?void 0:s.vl)===e)return this.Ml.pl;const r=this.Wr.qt().kt(),h=e.map((t=>new Fi(t,r)));return this.Ml={vl:e,pl:h},h}Rn(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.kl).priceAxisViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.xl)||void 0===s?void 0:s.vl)===e)return this.xl.pl;const r=this.Wr.At(),h=e.map((t=>new Wi(t,r)));return this.xl={vl:e,pl:h},h}Tl(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.kl).priceAxisPaneViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.Sl)||void 0===s?void 0:s.vl)===e)return this.Sl.pl;const r=e.map((t=>new Li(t)));return this.Sl={vl:e,pl:r},r}Pl(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.kl).timeAxisPaneViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.yl)||void 0===s?void 0:s.vl)===e)return this.yl.pl;const r=e.map((t=>new Li(t)));return this.yl={vl:e,pl:r},r}Rl(t,i){var n,s,e;return null!==(e=null===(s=(n=this.kl).autoscaleInfo)||void 0===s?void 0:s.call(n,t,i))&&void 0!==e?e:null}br(t,i){var n,s,e;return null!==(e=null===(s=(n=this.kl).hitTest)||void 0===s?void 0:s.call(n,t,i))&&void 0!==e?e:null}}function Hi(t,i,n,s){t.forEach((t=>{i(t).forEach((t=>{t.ml()===n&&s.push(t)}))}))}function $i(t){return t.Pn()}function Ui(t){return t.Tl()}function qi(t){return t.Pl()}class Yi extends Di{constructor(t,i,n,s,e){super(t),this.Lt=new zi,this.Ih=new xi(this),this.Dl=[],this.Ol=new ei(this),this.Al=null,this.Bl=null,this.Vl=[],this.zl=[],this.El=null,this.Il=[],this.cn=i,this.Ll=n;const r=new Si(this);this.hn=[r],this.Lh=new ii(r,this,t),"Area"!==n&&"Line"!==n&&"Baseline"!==n||(this.Al=new oi(this)),this.Nl(),this.Fl(e)}S(){null!==this.El&&clearTimeout(this.El)}_h(t){return this.cn.priceLineColor||t}Yr(t){const i={Xr:!0},n=this.At();if(this.qt().kt().Fi()||n.Fi()||this.Lt.Fi())return i;const s=this.qt().kt().Xs(),e=this.Pt();if(null===s||null===e)return i;let r,h;if(t){const t=this.Lt.Jh();if(null===t)return i;r=t,h=t.se}else{const t=this.Lt.nl(s.di(),-1);if(null===t)return i;if(r=this.Lt.qh(t.se),null===r)return i;h=t.se}const l=r.Bt[3],a=this.$s().Hs(h,{Bt:r}),o=n.Ot(l,e.Bt);return{Xr:!1,ct:l,Jt:n.Wi(l,e.Bt),mh:n.Wl(l),bh:n.jl(l,e.Bt),O:a.ue,ki:o,se:h}}$s(){return null!==this.Bl||(this.Bl=new Ai(this)),this.Bl}W(){return this.cn}Nh(t){const i=t.priceScaleId;void 0!==i&&i!==this.cn.priceScaleId&&this.qt().Hl(this,i),C(this.cn,t),void 0!==t.priceFormat&&(this.Nl(),this.qt().$l()),this.qt().Ul(this),this.qt().ql(),this.wn.gt("options")}it(t,i){this.Lt.it(t),this.Yl(),this.wn.gt("data"),this.dn.gt("data"),null!==this.Al&&(i&&i.Xl?this.Al.Hr():0===t.length&&this.Al.jr());const n=this.qt().cr(this);this.qt().Kl(n),this.qt().Ul(this),this.qt().ql(),this.qt().Fh()}Zl(t){this.Vl=t,this.Yl();const i=this.qt().cr(this);this.dn.gt("data"),this.qt().Kl(i),this.qt().Ul(this),this.qt().ql(),this.qt().Fh()}Gl(){return this.Vl}ah(){return this.zl}Jl(t){const i=new Ri(this,t);return this.Dl.push(i),this.qt().Ul(this),i}Ql(t){const i=this.Dl.indexOf(t);-1!==i&&this.Dl.splice(i,1),this.qt().Ul(this)}Xh(){return this.Ll}Pt(){const t=this.ta();return null===t?null:{Bt:t.Bt[3],ia:t.ut}}ta(){const t=this.qt().kt().Xs();if(null===t)return null;const i=t.Os();return this.Lt.nl(i,1)}zn(){return this.Lt}oh(t){const i=this.Lt.qh(t);return null===i?null:"Bar"===this.Ll||"Candlestick"===this.Ll||"Custom"===this.Ll?{we:i.Bt[0],ge:i.Bt[1],Me:i.Bt[2],xe:i.Bt[3]}:i.Bt[3]}na(t){const i=[];Hi(this.Il,$i,"top",i);const n=this.Al;return null!==n&&n.Tt()?(null===this.El&&n.Ur()&&(this.El=setTimeout((()=>{this.El=null,this.qt().sa()}),0)),n.$r(),i.push(n),i):i}Pn(){const t=[];this.ea()||t.push(this.Ol),t.push(this.wn,this.Ih,this.dn);const i=this.Dl.map((t=>t.Wh()));return t.push(...i),Hi(this.Il,$i,"normal",t),t}ra(){return this.ha($i,"bottom")}la(t){return this.ha(Ui,t)}aa(t){return this.ha(qi,t)}oa(t,i){return this.Il.map((n=>n.br(t,i))).filter((t=>null!==t))}Qi(t){return[this.Lh,...this.Dl.map((t=>t.jh()))]}Rn(t,i){if(i!==this.Xi&&!this.ea())return[];const n=[...this.hn];for(const t of this.Dl)n.push(t.Hh());return this.Il.forEach((t=>{n.push(...t.Rn())})),n}tn(){const t=[];return this.Il.forEach((i=>{t.push(...i.tn())})),t}Rl(t,i){if(void 0!==this.cn.autoscaleInfoProvider){const n=this.cn.autoscaleInfoProvider((()=>{const n=this._a(t,i);return null===n?null:n.Ph()}));return Ci.Rh(n)}return this._a(t,i)}ua(){return this.cn.priceFormat.minMove}ca(){return this.da}On(){var t;this.wn.gt(),this.dn.gt();for(const t of this.hn)t.gt();for(const t of this.Dl)t.gt();this.Ih.gt(),this.Ol.gt(),null===(t=this.Al)||void 0===t||t.gt(),this.Il.forEach((t=>t.On()))}At(){return f(super.At())}Ct(t){if(!(("Line"===this.Ll||"Area"===this.Ll||"Baseline"===this.Ll)&&this.cn.crosshairMarkerVisible))return null;const i=this.Lt.qh(t);if(null===i)return null;return{ct:i.Bt[3],ot:this.fa(),Vt:this.va(),Dt:this.pa(),Rt:this.ma(t)}}uh(){return this.cn.title}Tt(){return this.cn.visible}ba(t){this.Il.push(new ji(t,this))}wa(t){this.Il=this.Il.filter((i=>i.Cl()!==t))}ga(){if(this.wn instanceof Yt!=!1)return t=>this.wn.Fe(t)}Ma(){if(this.wn instanceof Yt!=!1)return t=>this.wn.We(t)}ea(){return!lt(this.At().xa())}_a(t,i){if(!P(t)||!P(i)||this.Lt.Fi())return null;const n="Line"===this.Ll||"Area"===this.Ll||"Baseline"===this.Ll||"Histogram"===this.Ll?[3]:[2,1],s=this.Lt.el(t,i,n);let e=null!==s?new ki(s.cl,s.dl):null;if("Histogram"===this.Xh()){const t=this.cn.base,i=new ki(t,t);e=null!==e?e.ts(i):i}let r=this.dn.lh();return this.Il.forEach((n=>{const s=n.Rl(t,i);if(null==s?void 0:s.priceRange){const t=new ki(s.priceRange.minValue,s.priceRange.maxValue);e=null!==e?e.ts(t):t}var h,l,a,o;(null==s?void 0:s.margins)&&(h=r,l=s.margins,r={above:Math.max(null!==(a=null==h?void 0:h.above)&&void 0!==a?a:0,l.above),below:Math.max(null!==(o=null==h?void 0:h.below)&&void 0!==o?o:0,l.below)})})),new Ci(e,r)}fa(){switch(this.Ll){case"Line":case"Area":case"Baseline":return this.cn.crosshairMarkerRadius}return 0}va(){switch(this.Ll){case"Line":case"Area":case"Baseline":{const t=this.cn.crosshairMarkerBorderColor;if(0!==t.length)return t}}return null}pa(){switch(this.Ll){case"Line":case"Area":case"Baseline":return this.cn.crosshairMarkerBorderWidth}return 0}ma(t){switch(this.Ll){case"Line":case"Area":case"Baseline":{const t=this.cn.crosshairMarkerBackgroundColor;if(0!==t.length)return t}}return this.$s().Hs(t).ue}Nl(){switch(this.cn.priceFormat.type){case"custom":this.da={format:this.cn.priceFormat.formatter};break;case"volume":this.da=new dt(this.cn.priceFormat.precision);break;case"percent":this.da=new ct(this.cn.priceFormat.precision);break;default:{const t=Math.pow(10,this.cn.priceFormat.precision);this.da=new ut(t,this.cn.priceFormat.minMove*t)}}null!==this.Xi&&this.Xi.Sa()}Yl(){const t=this.qt().kt();if(!t.ya()||this.Lt.Fi())return void(this.zl=[]);const i=f(this.Lt.Qh());this.zl=this.Vl.map(((n,s)=>{const e=f(t.ka(n.time,!0)),r=et instanceof Yi)).reduce(((t,s)=>{if(n.dr(s)||!s.Tt())return t;const e=s.At(),r=s.zn();if(e.Fi()||!r.Kr(i))return t;const h=r.qh(i);if(null===h)return t;const l=v(s.Pt());return t.concat([e.Ot(h.Bt[3],l.Bt)])}),[]);if(0===l.length)return s;l.sort(((t,i)=>Math.abs(t-h)-Math.abs(i-h)));const a=l[0];return s=e.pn(a,r),s}}class Ki extends H{constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;const e=Math.max(1,Math.floor(n));t.lineWidth=e,function(t,i){t.save(),t.lineWidth%2&&t.translate(.5,.5),i(),t.restore()}(t,(()=>{const r=f(this.Lt);if(r.Pa){t.strokeStyle=r.Ra,_(t,r.Da),t.beginPath();for(const s of r.Oa){const r=Math.round(s.Aa*n);t.moveTo(r,-e),t.lineTo(r,i.height+e)}t.stroke()}if(r.Ba){t.strokeStyle=r.Va,_(t,r.za),t.beginPath();for(const n of r.Ea){const r=Math.round(n.Aa*s);t.moveTo(-e,r),t.lineTo(i.width+e,r)}t.stroke()}}))}}class Zi{constructor(t){this.Ht=new Ki,this.bt=!0,this.nn=t}gt(){this.bt=!0}xt(){if(this.bt){const t=this.nn.qt().W().grid,i={Ba:t.horzLines.visible,Pa:t.vertLines.visible,Va:t.horzLines.color,Ra:t.vertLines.color,za:t.horzLines.style,Da:t.vertLines.style,Ea:this.nn.vn().Ia(),Oa:(this.nn.qt().kt().Ia()||[]).map((t=>({Aa:t.coord})))};this.Ht.it(i),this.bt=!1}return this.Ht}}class Gi{constructor(t){this.wn=new Zi(t)}Wh(){return this.wn}}const Ji={La:4,Na:1e-4};function Qi(t,i){const n=100*(t-i)/i;return i<0?-n:n}function tn(t,i){const n=Qi(t.Sh(),i),s=Qi(t.yh(),i);return new ki(n,s)}function nn(t,i){const n=100*(t-i)/i+100;return i<0?-n:n}function sn(t,i){const n=nn(t.Sh(),i),s=nn(t.yh(),i);return new ki(n,s)}function en(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.log10(n+i.Na)+i.La;return t<0?-s:s}function rn(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.pow(10,n-i.La)-i.Na;return t<0?-s:s}function hn(t,i){if(null===t)return null;const n=en(t.Sh(),i),s=en(t.yh(),i);return new ki(n,s)}function ln(t,i){if(null===t)return null;const n=rn(t.Sh(),i),s=rn(t.yh(),i);return new ki(n,s)}function an(t){if(null===t)return Ji;const i=Math.abs(t.yh()-t.Sh());if(i>=1||i<1e-15)return Ji;const n=Math.ceil(Math.abs(Math.log10(i))),s=Ji.La+n;return{La:s,Na:1/Math.pow(10,s)}}class on{constructor(t,i){if(this.Fa=t,this.Wa=i,function(t){if(t<0)return!1;for(let i=t;i>1;i/=10)if(i%10!=0)return!1;return!0}(this.Fa))this.ja=[2,2.5,2];else{this.ja=[];for(let t=this.Fa;1!==t;){if(t%2==0)this.ja.push(2),t/=2;else{if(t%5!=0)throw new Error("unexpected base");this.ja.push(2,2.5),t/=5}if(this.ja.length>100)throw new Error("something wrong with base")}}}Ha(t,i,n){const s=0===this.Fa?0:1/this.Fa;let e=Math.pow(10,Math.max(0,Math.ceil(Math.log10(t-i)))),r=0,h=this.Wa[0];for(;;){const t=xt(e,s,1e-14)&&e>s+1e-14,i=xt(e,n*h,1e-14),l=xt(e,1,1e-14);if(!(t&&i&&l))break;e/=h,h=this.Wa[++r%this.Wa.length]}if(e<=s+1e-14&&(e=s),e=Math.max(1,e),this.ja.length>0&&(l=e,a=1,o=1e-14,Math.abs(l-a)s+1e-14;)e/=h,h=this.ja[++r%this.ja.length];var l,a,o;return e}}class _n{constructor(t,i,n,s){this.$a=[],this.Li=t,this.Fa=i,this.Ua=n,this.qa=s}Ha(t,i){if(t=o?1:-1;let d=null,f=0;for(let n=a-u;n>o;n-=_){const s=this.qa(n,i,!0);null!==d&&Math.abs(s-d)l||(ff(t.Zi())-f(i.Zi())))}var cn;!function(t){t[t.Normal=0]="Normal",t[t.Logarithmic=1]="Logarithmic",t[t.Percentage=2]="Percentage",t[t.IndexedTo100=3]="IndexedTo100"}(cn||(cn={}));const dn=new ct,fn=new ut(100,1);class vn{constructor(t,i,n,s){this.Qa=0,this.io=null,this.Dh=null,this.no=null,this.so={eo:!1,ro:null},this.ho=0,this.lo=0,this.ao=new k,this.oo=new k,this._o=[],this.uo=null,this.co=null,this.do=null,this.fo=null,this.da=fn,this.vo=an(null),this.po=t,this.cn=i,this.mo=n,this.bo=s,this.wo=new _n(this,100,this.Mo.bind(this),this.xo.bind(this))}xa(){return this.po}W(){return this.cn}Nh(t){if(C(this.cn,t),this.Sa(),void 0!==t.mode&&this.So({kr:t.mode}),void 0!==t.scaleMargins){const i=d(t.scaleMargins.top),n=d(t.scaleMargins.bottom);if(i<0||i>1)throw new Error(`Invalid top margin - expect value between 0 and 1, given=${i}`);if(n<0||n>1||i+n>1)throw new Error(`Invalid bottom margin - expect value between 0 and 1, given=${n}`);if(i+n>1)throw new Error(`Invalid margins - sum of margins must be less than 1, given=${i+n}`);this.yo(),this.co=null}}ko(){return this.cn.autoScale}Ja(){return 1===this.cn.mode}ph(){return 2===this.cn.mode}Co(){return 3===this.cn.mode}kr(){return{Wn:this.cn.autoScale,To:this.cn.invertScale,kr:this.cn.mode}}So(t){const i=this.kr();let n=null;void 0!==t.Wn&&(this.cn.autoScale=t.Wn),void 0!==t.kr&&(this.cn.mode=t.kr,2!==t.kr&&3!==t.kr||(this.cn.autoScale=!0),this.so.eo=!1),1===i.kr&&t.kr!==i.kr&&(!function(t,i){if(null===t)return!1;const n=rn(t.Sh(),i),s=rn(t.yh(),i);return isFinite(n)&&isFinite(s)}(this.Dh,this.vo)?this.cn.autoScale=!0:(n=ln(this.Dh,this.vo),null!==n&&this.Po(n))),1===t.kr&&t.kr!==i.kr&&(n=hn(this.Dh,this.vo),null!==n&&this.Po(n));const s=i.kr!==this.cn.mode;s&&(2===i.kr||this.ph())&&this.Sa(),s&&(3===i.kr||this.Co())&&this.Sa(),void 0!==t.To&&i.To!==t.To&&(this.cn.invertScale=t.To,this.Ro()),this.oo.m(i,this.kr())}Do(){return this.oo}P(){return this.mo.fontSize}Et(){return this.Qa}Oo(t){this.Qa!==t&&(this.Qa=t,this.yo(),this.co=null)}Ao(){if(this.io)return this.io;const t=this.Et()-this.Bo()-this.Vo();return this.io=t,t}Ah(){return this.zo(),this.Dh}Po(t,i){const n=this.Dh;(i||null===n&&null!==t||null!==n&&!n.Mh(t))&&(this.co=null,this.Dh=t)}Fi(){return this.zo(),0===this.Qa||!this.Dh||this.Dh.Fi()}Eo(t){return this.To()?t:this.Et()-1-t}Ot(t,i){return this.ph()?t=Qi(t,i):this.Co()&&(t=nn(t,i)),this.xo(t,i)}Qs(t,i,n){this.zo();const s=this.Vo(),e=f(this.Ah()),r=e.Sh(),h=e.yh(),l=this.Ao()-1,a=this.To(),o=l/(h-r),_=void 0===n?0:n.from,u=void 0===n?t.length:n.to,c=this.Io();for(let n=_;nt.On()))}Sa(){this.co=null;const t=this.Jo();let i=100;null!==t&&(i=Math.round(1/t.ua())),this.da=fn,this.ph()?(this.da=dn,i=100):this.Co()?(this.da=new ut(100,1),i=100):null!==t&&(this.da=t.ca()),this.wo=new _n(this,i,this.Mo.bind(this),this.xo.bind(this)),this.wo.Xa()}Wo(){this.uo=null}Jo(){return this._o[0]||null}Bo(){return this.To()?this.cn.scaleMargins.bottom*this.Et()+this.lo:this.cn.scaleMargins.top*this.Et()+this.ho}Vo(){return this.To()?this.cn.scaleMargins.top*this.Et()+this.ho:this.cn.scaleMargins.bottom*this.Et()+this.lo}zo(){this.so.eo||(this.so.eo=!0,this.i_())}yo(){this.io=null}xo(t,i){if(this.zo(),this.Fi())return 0;t=this.Ja()&&t?en(t,this.vo):t;const n=f(this.Ah()),s=this.Vo()+(this.Ao()-1)*(t-n.Sh())/n.kh();return this.Eo(s)}Mo(t,i){if(this.zo(),this.Fi())return 0;const n=this.Eo(t),s=f(this.Ah()),e=s.Sh()+s.kh()*((n-this.Vo())/(this.Ao()-1));return this.Ja()?rn(e,this.vo):e}Ro(){this.co=null,this.wo.Xa()}i_(){const t=this.so.ro;if(null===t)return;let i=null;const n=this.Qo();let s=0,e=0;for(const r of n){if(!r.Tt())continue;const n=r.Pt();if(null===n)continue;const h=r.Rl(t.Os(),t.di());let l=h&&h.Ah();if(null!==l){switch(this.cn.mode){case 1:l=hn(l,this.vo);break;case 2:l=tn(l,n.Bt);break;case 3:l=sn(l,n.Bt)}if(i=null===i?l:i.ts(f(l)),null!==h){const t=h.Bh();null!==t&&(s=Math.max(s,t.above),e=Math.max(s,t.below))}}}if(s===this.ho&&e===this.lo||(this.ho=s,this.lo=e,this.co=null,this.yo()),null!==i){if(i.Sh()===i.yh()){const t=this.Jo(),n=5*(null===t||this.ph()||this.Co()?1:t.ua());this.Ja()&&(i=ln(i,this.vo)),i=new ki(i.Sh()-n,i.yh()+n),this.Ja()&&(i=hn(i,this.vo))}if(this.Ja()){const t=ln(i,this.vo),n=an(t);if(r=n,h=this.vo,r.La!==h.La||r.Na!==h.Na){const s=null!==this.no?ln(this.no,this.vo):null;this.vo=n,i=hn(t,n),null!==s&&(this.no=hn(s,n))}}this.Po(i)}else null===this.Dh&&(this.Po(new ki(-.5,.5)),this.vo=an(null));var r,h;this.so.eo=!0}Io(){return this.ph()?Qi:this.Co()?nn:this.Ja()?t=>en(t,this.vo):null}n_(t,i,n){return void 0===i?(void 0===n&&(n=this.ca()),n.format(t)):i(t)}Eh(t,i){return this.n_(t,this.bo.priceFormatter,i)}Go(t,i){return this.n_(t,this.bo.percentageFormatter,i)}}class pn{constructor(t,i){this._o=[],this.s_=new Map,this.Qa=0,this.e_=0,this.r_=1e3,this.uo=null,this.h_=new k,this.wl=t,this.Ui=i,this.l_=new Gi(this);const n=i.W();this.a_=this.o_("left",n.leftPriceScale),this.__=this.o_("right",n.rightPriceScale),this.a_.Do().l(this.u_.bind(this,this.a_),this),this.__.Do().l(this.u_.bind(this,this.__),this),this.c_(n)}c_(t){if(t.leftPriceScale&&this.a_.Nh(t.leftPriceScale),t.rightPriceScale&&this.__.Nh(t.rightPriceScale),t.localization&&(this.a_.Sa(),this.__.Sa()),t.overlayPriceScales){const i=Array.from(this.s_.values());for(const n of i){const i=f(n[0].At());i.Nh(t.overlayPriceScales),t.localization&&i.Sa()}}}d_(t){switch(t){case"left":return this.a_;case"right":return this.__}return this.s_.has(t)?d(this.s_.get(t))[0].At():null}S(){this.qt().f_().p(this),this.a_.Do().p(this),this.__.Do().p(this),this._o.forEach((t=>{t.S&&t.S()})),this.h_.m()}v_(){return this.r_}p_(t){this.r_=t}qt(){return this.Ui}$i(){return this.e_}Et(){return this.Qa}m_(t){this.e_=t,this.b_()}Oo(t){this.Qa=t,this.a_.Oo(t),this.__.Oo(t),this._o.forEach((i=>{if(this.dr(i)){const n=i.At();null!==n&&n.Oo(t)}})),this.b_()}Ta(){return this._o}dr(t){const i=t.At();return null===i||this.a_!==i&&this.__!==i}Fo(t,i,n){const s=void 0!==n?n:this.g_().w_+1;this.M_(t,i,s)}jo(t){const i=this._o.indexOf(t);c(-1!==i,"removeDataSource: invalid data source"),this._o.splice(i,1);const n=f(t.At()).xa();if(this.s_.has(n)){const i=d(this.s_.get(n)),s=i.indexOf(t);-1!==s&&(i.splice(s,1),0===i.length&&this.s_.delete(n))}const s=t.At();s&&s.Ta().indexOf(t)>=0&&s.jo(t),null!==s&&(s.Wo(),this.x_(s)),this.uo=null}pr(t){return t===this.a_?"left":t===this.__?"right":"overlay"}S_(){return this.a_}y_(){return this.__}k_(t,i){t.Uo(i)}C_(t,i){t.qo(i),this.b_()}T_(t){t.Yo()}P_(t,i){t.Xo(i)}R_(t,i){t.Ko(i),this.b_()}D_(t){t.Zo()}b_(){this._o.forEach((t=>{t.On()}))}vn(){let t=null;return this.Ui.W().rightPriceScale.visible&&0!==this.__.Ta().length?t=this.__:this.Ui.W().leftPriceScale.visible&&0!==this.a_.Ta().length?t=this.a_:0!==this._o.length&&(t=this._o[0].At()),null===t&&(t=this.__),t}vr(){let t=null;return this.Ui.W().rightPriceScale.visible?t=this.__:this.Ui.W().leftPriceScale.visible&&(t=this.a_),t}x_(t){null!==t&&t.ko()&&this.O_(t)}A_(t){const i=this.wl.Xs();t.So({Wn:!0}),null!==i&&t.t_(i),this.b_()}B_(){this.O_(this.a_),this.O_(this.__)}V_(){this.x_(this.a_),this.x_(this.__),this._o.forEach((t=>{this.dr(t)&&this.x_(t.At())})),this.b_(),this.Ui.Fh()}No(){return null===this.uo&&(this.uo=un(this._o)),this.uo}z_(){return this.h_}E_(){return this.l_}O_(t){const i=t.Qo();if(i&&i.length>0&&!this.wl.Fi()){const i=this.wl.Xs();null!==i&&t.t_(i)}t.On()}g_(){const t=this.No();if(0===t.length)return{I_:0,w_:0};let i=0,n=0;for(let s=0;sn&&(n=e))}return{I_:i,w_:n}}M_(t,i,n){let s=this.d_(i);if(null===s&&(s=this.o_(i,this.Ui.W().overlayPriceScales)),this._o.push(t),!lt(i)){const n=this.s_.get(i)||[];n.push(t),this.s_.set(i,n)}s.Fo(t),t.Ji(s),t.Gi(n),this.x_(s),this.uo=null}u_(t,i,n){i.kr!==n.kr&&this.O_(t)}o_(t,i){const n=Object.assign({visible:!0,autoScale:!0},O(i)),s=new vn(t,n,this.Ui.W().layout,this.Ui.W().localization);return s.Oo(this.Et()),s}}class mn{constructor(t,i,n=50){this.Ke=0,this.Ze=1,this.Ge=1,this.Qe=new Map,this.Je=new Map,this.L_=t,this.N_=i,this.tr=n}F_(t){const i=t.time,n=this.N_.cacheKey(i),s=this.Qe.get(n);if(void 0!==s)return s.W_;if(this.Ke===this.tr){const t=this.Je.get(this.Ge);this.Je.delete(this.Ge),this.Qe.delete(d(t)),this.Ge++,this.Ke--}const e=this.L_(t);return this.Qe.set(n,{W_:e,er:this.Ze}),this.Je.set(this.Ze,n),this.Ke++,this.Ze++,e}}class bn{constructor(t,i){c(t<=i,"right should be >= left"),this.j_=t,this.H_=i}Os(){return this.j_}di(){return this.H_}U_(){return this.H_-this.j_+1}Kr(t){return this.j_<=t&&t<=this.H_}Mh(t){return this.j_===t.Os()&&this.H_===t.di()}}function wn(t,i){return null===t||null===i?t===i:t.Mh(i)}class gn{constructor(){this.q_=new Map,this.Qe=null,this.Y_=!1}X_(t){this.Y_=t,this.Qe=null}K_(t,i){this.Z_(i),this.Qe=null;for(let n=i;n{t<=n[0].index?i.push(s):n.splice(Dt(n,t,(i=>i.indexi-t))){if(!this.q_.get(n))continue;const s=i;i=[];const e=s.length;let r=0;const h=d(this.q_.get(n)),l=h.length;let a=1/0,o=-1/0;for(let n=0;n=t&&_-o>=t)i.push(l),o=_;else if(this.Y_)return s}for(;ri.weight?t:i}class Sn{constructor(t,i,n,s){this.e_=0,this.eu=null,this.ru=[],this.fo=null,this.do=null,this.hu=new gn,this.lu=new Map,this.au=Mn.su(),this.ou=!0,this._u=new k,this.uu=new k,this.cu=new k,this.du=null,this.fu=null,this.vu=[],this.cn=i,this.bo=n,this.pu=i.rightOffset,this.mu=i.barSpacing,this.Ui=t,this.N_=s,this.bu(),this.hu.X_(i.uniformDistribution)}W(){return this.cn}wu(t){C(this.bo,t),this.gu(),this.bu()}Nh(t,i){var n;C(this.cn,t),this.cn.fixLeftEdge&&this.Mu(),this.cn.fixRightEdge&&this.xu(),void 0!==t.barSpacing&&this.Ui.Gn(t.barSpacing),void 0!==t.rightOffset&&this.Ui.Jn(t.rightOffset),void 0!==t.minBarSpacing&&this.Ui.Gn(null!==(n=t.barSpacing)&&void 0!==n?n:this.mu),this.gu(),this.bu(),this.cu.m()}mn(t){var i,n;return null!==(n=null===(i=this.ru[t])||void 0===i?void 0:i.time)&&void 0!==n?n:null}qi(t){var i;return null!==(i=this.ru[t])&&void 0!==i?i:null}ka(t,i){if(this.ru.length<1)return null;if(this.N_.key(t)>this.N_.key(this.ru[this.ru.length-1].time))return i?this.ru.length-1:null;const n=Dt(this.ru,this.N_.key(t),((t,i)=>this.N_.key(t.time)0}Xs(){return this.Su(),this.au.iu()}yu(){return this.Su(),this.au.nu()}ku(){const t=this.Xs();if(null===t)return null;const i={from:t.Os(),to:t.di()};return this.Cu(i)}Cu(t){const i=Math.round(t.from),n=Math.round(t.to),s=f(this.Tu()),e=f(this.Pu());return{from:f(this.qi(Math.max(s,i))),to:f(this.qi(Math.min(e,n)))}}Ru(t){return{from:f(this.ka(t.from,!0)),to:f(this.ka(t.to,!0))}}$i(){return this.e_}m_(t){if(!isFinite(t)||t<=0)return;if(this.e_===t)return;const i=this.yu(),n=this.e_;if(this.e_=t,this.ou=!0,this.cn.lockVisibleTimeRangeOnResize&&0!==n){const i=this.mu*t/n;this.mu=i}if(this.cn.fixLeftEdge&&null!==i&&i.Os()<=0){const i=n-t;this.pu-=Math.round(i/this.mu)+1,this.ou=!0}this.Du(),this.Ou()}It(t){if(this.Fi()||!P(t))return 0;const i=this.Au()+this.pu-t;return this.e_-(i+.5)*this.mu-1}Js(t,i){const n=this.Au(),s=void 0===i?0:i.from,e=void 0===i?t.length:i.to;for(let i=s;ii/2&&!o?n.needAlignCoordinate=!1:n.needAlignCoordinate=_&&t.index<=l||u&&t.index>=a,c++}return this.vu.length=c,this.fu=this.vu,this.vu}Fu(){this.ou=!0,this.Gn(this.cn.barSpacing),this.Jn(this.cn.rightOffset)}Wu(t){this.ou=!0,this.eu=t,this.Ou(),this.Mu()}ju(t,i){const n=this.Vu(t),s=this.he(),e=s+i*(s/10);this.Gn(e),this.cn.rightBarStaysOnScroll||this.Jn(this.Iu()+(n-this.Vu(t)))}Uo(t){this.fo&&this.Zo(),null===this.do&&null===this.du&&(this.Fi()||(this.do=t,this.Hu()))}qo(t){if(null===this.du)return;const i=Mt(this.e_-t,0,this.e_),n=Mt(this.e_-f(this.do),0,this.e_);0!==i&&0!==n&&this.Gn(this.du.he*i/n)}Yo(){null!==this.do&&(this.do=null,this.$u())}Xo(t){null===this.fo&&null===this.du&&(this.Fi()||(this.fo=t,this.Hu()))}Ko(t){if(null===this.fo)return;const i=(this.fo-t)/this.he();this.pu=f(this.du).Iu+i,this.ou=!0,this.Ou()}Zo(){null!==this.fo&&(this.fo=null,this.$u())}Uu(){this.qu(this.cn.rightOffset)}qu(t,i=400){if(!isFinite(t))throw new RangeError("offset is required and must be finite number");if(!isFinite(i)||i<=0)throw new RangeError("animationDuration (optional) must be finite positive number");const n=this.pu,s=performance.now();this.Ui.Xn({Yu:t=>(t-s)/i>=1,Xu:e=>{const r=(e-s)/i;return r>=1?t:n+(t-n)*r}})}gt(t,i){this.ou=!0,this.ru=t,this.hu.K_(t,i),this.Ou()}Ku(){return this._u}Zu(){return this.uu}Gu(){return this.cu}Au(){return this.eu||0}Ju(t){const i=t.U_();this.Eu(this.e_/i),this.pu=t.di()-this.Au(),this.Ou(),this.ou=!0,this.Ui.zu(),this.Ui.Fh()}Qu(){const t=this.Tu(),i=this.Pu();null!==t&&null!==i&&this.Ju(new bn(t,i+this.cn.rightOffset))}tc(t){const i=new bn(t.from,t.to);this.Ju(i)}Yi(t){return void 0!==this.bo.timeFormatter?this.bo.timeFormatter(t.originalTime):this.N_.formatHorzItem(t.time)}Lu(){const{handleScroll:t,handleScale:i}=this.Ui.W();return!(t.horzTouchDrag||t.mouseWheel||t.pressedMouseMove||t.vertTouchDrag||i.axisDoubleClickReset.time||i.axisPressedMouseMove.time||i.mouseWheel||i.pinch)}Tu(){return 0===this.ru.length?null:0}Pu(){return 0===this.ru.length?null:this.ru.length-1}ic(t){return(this.e_-1-t)/this.mu}Vu(t){const i=this.ic(t),n=this.Au()+this.pu-i;return Math.round(1e6*n)/1e6}Eu(t){const i=this.mu;this.mu=t,this.Du(),i!==this.mu&&(this.ou=!0,this.nc())}Su(){if(!this.ou)return;if(this.ou=!1,this.Fi())return void this.sc(Mn.su());const t=this.Au(),i=this.e_/this.mu,n=this.pu+t,s=new bn(n-i+1,n);this.sc(new Mn(s))}Du(){const t=this.ec();if(this.mut&&(this.mu=t,this.ou=!0)}}ec(){return this.cn.fixLeftEdge&&this.cn.fixRightEdge&&0!==this.ru.length?this.e_/this.ru.length:this.cn.minBarSpacing}Ou(){const t=this.rc();this.pu>t&&(this.pu=t,this.ou=!0);const i=this.hc();null!==i&&this.puthis.lc(t)),this.N_),this.lu.set(t.weight,i)),i.F_(t)}lc(t){return this.N_.formatTickmark(t,this.bo)}sc(t){const i=this.au;this.au=t,wn(i.iu(),this.au.iu())||this._u.m(),wn(i.nu(),this.au.nu())||this.uu.m(),this.nc()}nc(){this.fu=null}gu(){this.nc(),this.lu.clear()}bu(){this.N_.updateFormatter(this.bo)}Mu(){if(!this.cn.fixLeftEdge)return;const t=this.Tu();if(null===t)return;const i=this.Xs();if(null===i)return;const n=i.Os()-t;if(n<0){const t=this.pu-n-1;this.Jn(t)}this.Du()}xu(){this.Ou(),this.Du()}}class yn extends L{constructor(t){super(),this.ac=new Map,this.Lt=t}Z(t){}J(t){if(!this.Lt.Tt)return;const{context:i,mediaSize:n}=t;let s=0;for(const t of this.Lt.oc){if(0===t.Jt.length)continue;i.font=t.R;const e=this._c(i,t.Jt);e>n.width?t.ju=n.width/e:t.ju=1,s+=t.uc*t.ju}let e=0;switch(this.Lt.cc){case"top":e=0;break;case"center":e=Math.max((n.height-s)/2,0);break;case"bottom":e=Math.max(n.height-s,0)}i.fillStyle=this.Lt.O;for(const t of this.Lt.oc){i.save();let s=0;switch(this.Lt.dc){case"left":i.textAlign="left",s=t.uc/2;break;case"center":i.textAlign="center",s=n.width/2;break;case"right":i.textAlign="right",s=n.width-1-t.uc/2}i.translate(s,e),i.textBaseline="top",i.font=t.R,i.scale(t.ju,t.ju),i.fillText(t.Jt,0,t.fc),i.restore(),e+=t.uc*t.ju}}_c(t,i){const n=this.vc(t.font);let s=n.get(i);return void 0===s&&(s=t.measureText(i).width,n.set(i,s)),s}vc(t){let i=this.ac.get(t);return void 0===i&&(i=new Map,this.ac.set(t,i)),i}}class kn{constructor(t){this.bt=!0,this.jt={Tt:!1,O:"",oc:[],cc:"center",dc:"center"},this.Ht=new yn(this.jt),this.$t=t}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht}St(){const t=this.$t.W(),i=this.jt;i.Tt=t.visible,i.Tt&&(i.O=t.color,i.dc=t.horzAlign,i.cc=t.vertAlign,i.oc=[{Jt:t.text,R:z(t.fontSize,t.fontFamily,t.fontStyle),uc:1.2*t.fontSize,fc:0,ju:0}])}}class Cn extends et{constructor(t,i){super(),this.cn=i,this.wn=new kn(this)}Rn(){return[]}Pn(){return[this.wn]}W(){return this.cn}On(){this.wn.gt()}}var Tn,Pn,Rn,Dn,On;!function(t){t[t.OnTouchEnd=0]="OnTouchEnd",t[t.OnNextTap=1]="OnNextTap"}(Tn||(Tn={}));class An{constructor(t,i,n){this.mc=[],this.bc=[],this.e_=0,this.wc=null,this.gc=new k,this.Mc=new k,this.xc=null,this.Sc=t,this.cn=i,this.N_=n,this.yc=new E(this),this.wl=new Sn(this,i.timeScale,this.cn.localization,n),this.wt=new ht(this,i.crosshair),this.kc=new Xi(i.crosshair),this.Cc=new Cn(this,i.watermark),this.Tc(),this.mc[0].p_(2e3),this.Pc=this.Rc(0),this.Dc=this.Rc(1)}$l(){this.Oc(at.es())}Fh(){this.Oc(at.ss())}sa(){this.Oc(new at(1))}Ul(t){const i=this.Ac(t);this.Oc(i)}Bc(){return this.wc}Vc(t){const i=this.wc;this.wc=t,null!==i&&this.Ul(i.zc),null!==t&&this.Ul(t.zc)}W(){return this.cn}Nh(t){C(this.cn,t),this.mc.forEach((i=>i.c_(t))),void 0!==t.timeScale&&this.wl.Nh(t.timeScale),void 0!==t.localization&&this.wl.wu(t.localization),(t.leftPriceScale||t.rightPriceScale)&&this.gc.m(),this.Pc=this.Rc(0),this.Dc=this.Rc(1),this.$l()}Ec(t,i){if("left"===t)return void this.Nh({leftPriceScale:i});if("right"===t)return void this.Nh({rightPriceScale:i});const n=this.Ic(t);null!==n&&(n.At.Nh(i),this.gc.m())}Ic(t){for(const i of this.mc){const n=i.d_(t);if(null!==n)return{Ut:i,At:n}}return null}kt(){return this.wl}Lc(){return this.mc}Nc(){return this.Cc}Fc(){return this.wt}Wc(){return this.Mc}jc(t,i){t.Oo(i),this.zu()}m_(t){this.e_=t,this.wl.m_(this.e_),this.mc.forEach((i=>i.m_(t))),this.zu()}Tc(t){const i=new pn(this.wl,this);void 0!==t?this.mc.splice(t,0,i):this.mc.push(i);const n=void 0===t?this.mc.length-1:t,s=at.es();return s.Nn(n,{Fn:0,Wn:!0}),this.Oc(s),i}k_(t,i,n){t.k_(i,n)}C_(t,i,n){t.C_(i,n),this.ql(),this.Oc(this.Hc(t,2))}T_(t,i){t.T_(i),this.Oc(this.Hc(t,2))}P_(t,i,n){i.ko()||t.P_(i,n)}R_(t,i,n){i.ko()||(t.R_(i,n),this.ql(),this.Oc(this.Hc(t,2)))}D_(t,i){i.ko()||(t.D_(i),this.Oc(this.Hc(t,2)))}A_(t,i){t.A_(i),this.Oc(this.Hc(t,2))}$c(t){this.wl.Uo(t)}Uc(t,i){const n=this.kt();if(n.Fi()||0===i)return;const s=n.$i();t=Math.max(1,Math.min(t,s)),n.ju(t,i),this.zu()}qc(t){this.Yc(0),this.Xc(t),this.Kc()}Zc(t){this.wl.qo(t),this.zu()}Gc(){this.wl.Yo(),this.Fh()}Yc(t){this.wl.Xo(t)}Xc(t){this.wl.Ko(t),this.zu()}Kc(){this.wl.Zo(),this.Fh()}Mt(){return this.bc}Jc(t,i,n,s,e){this.wt.gn(t,i);let r=NaN,h=this.wl.Bu(t);const l=this.wl.Xs();null!==l&&(h=Math.min(Math.max(l.Os(),h),l.di()));const a=s.vn(),o=a.Pt();null!==o&&(r=a.pn(i,o)),r=this.kc.Ca(r,h,s),this.wt.yn(h,r,s),this.sa(),e||this.Mc.m(this.wt.yt(),{x:t,y:i},n)}Qc(t,i,n){const s=n.vn(),e=s.Pt(),r=s.Ot(t,f(e)),h=this.wl.ka(i,!0),l=this.wl.It(f(h));this.Jc(l,r,null,n,!0)}td(t){this.Fc().Cn(),this.sa(),t||this.Mc.m(null,null,null)}ql(){const t=this.wt.Ut();if(null!==t){const i=this.wt.xn(),n=this.wt.Sn();this.Jc(i,n,null,t)}this.wt.On()}nd(t,i,n){const s=this.wl.mn(0);void 0!==i&&void 0!==n&&this.wl.gt(i,n);const e=this.wl.mn(0),r=this.wl.Au(),h=this.wl.Xs();if(null!==h&&null!==s&&null!==e){const i=h.Kr(r),l=this.N_.key(s)>this.N_.key(e),a=null!==t&&t>r&&!l,o=this.wl.W().allowShiftVisibleRangeOnWhitespaceReplacement,_=i&&(!(void 0===n)||o)&&this.wl.W().shiftVisibleRangeOnNewBar;if(a&&!_){const i=t-r;this.wl.Jn(this.wl.Iu()-i)}}this.wl.Wu(t)}Kl(t){null!==t&&t.V_()}cr(t){const i=this.mc.find((i=>i.No().includes(t)));return void 0===i?null:i}zu(){this.Cc.On(),this.mc.forEach((t=>t.V_())),this.ql()}S(){this.mc.forEach((t=>t.S())),this.mc.length=0,this.cn.localization.priceFormatter=void 0,this.cn.localization.percentageFormatter=void 0,this.cn.localization.timeFormatter=void 0}sd(){return this.yc}mr(){return this.yc.W()}f_(){return this.gc}ed(t,i,n){const s=this.mc[0],e=this.rd(i,t,s,n);return this.bc.push(e),1===this.bc.length?this.$l():this.Fh(),e}hd(t){const i=this.cr(t),n=this.bc.indexOf(t);c(-1!==n,"Series not found"),this.bc.splice(n,1),f(i).jo(t),t.S&&t.S()}Hl(t,i){const n=f(this.cr(t));n.jo(t);const s=this.Ic(i);if(null===s){const s=t.Zi();n.Fo(t,i,s)}else{const e=s.Ut===n?t.Zi():void 0;s.Ut.Fo(t,i,e)}}Qu(){const t=at.ss();t.$n(),this.Oc(t)}ld(t){const i=at.ss();i.Yn(t),this.Oc(i)}Zn(){const t=at.ss();t.Zn(),this.Oc(t)}Gn(t){const i=at.ss();i.Gn(t),this.Oc(i)}Jn(t){const i=at.ss();i.Jn(t),this.Oc(i)}Xn(t){const i=at.ss();i.Xn(t),this.Oc(i)}Un(){const t=at.ss();t.Un(),this.Oc(t)}ad(){return this.cn.rightPriceScale.visible?"right":"left"}od(){return this.Dc}q(){return this.Pc}zt(t){const i=this.Dc,n=this.Pc;if(i===n)return i;if(t=Math.max(0,Math.min(100,Math.round(100*t))),null===this.xc||this.xc.Ts!==n||this.xc.Ps!==i)this.xc={Ts:n,Ps:i,_d:new Map};else{const i=this.xc._d.get(t);if(void 0!==i)return i}const s=function(t,i,n){const[s,e,r,h]=S(t),[l,a,o,_]=S(i),u=[m(s+n*(l-s)),m(e+n*(a-e)),m(r+n*(o-r)),b(h+n*(_-h))];return`rgba(${u[0]}, ${u[1]}, ${u[2]}, ${u[3]})`}(n,i,t/100);return this.xc._d.set(t,s),s}Hc(t,i){const n=new at(i);if(null!==t){const s=this.mc.indexOf(t);n.Nn(s,{Fn:i})}return n}Ac(t,i){return void 0===i&&(i=2),this.Hc(this.cr(t),i)}Oc(t){this.Sc&&this.Sc(t),this.mc.forEach((t=>t.E_().Wh().gt()))}rd(t,i,n,s){const e=new Yi(this,t,i,n,s),r=void 0!==t.priceScaleId?t.priceScaleId:this.ad();return n.Fo(e,r),lt(r)||e.Nh(t),e}Rc(t){const i=this.cn.layout;return"gradient"===i.background.type?0===t?i.background.topColor:i.background.bottomColor:i.background.color}}function Bn(t){return!T(t)&&!R(t)}function Vn(t){return T(t)}!function(t){t[t.Disabled=0]="Disabled",t[t.Continuous=1]="Continuous",t[t.OnDataUpdate=2]="OnDataUpdate"}(Pn||(Pn={})),function(t){t[t.LastBar=0]="LastBar",t[t.LastVisible=1]="LastVisible"}(Rn||(Rn={})),function(t){t.Solid="solid",t.VerticalGradient="gradient"}(Dn||(Dn={})),function(t){t[t.Year=0]="Year",t[t.Month=1]="Month",t[t.DayOfMonth=2]="DayOfMonth",t[t.Time=3]="Time",t[t.TimeWithSeconds=4]="TimeWithSeconds"}(On||(On={}));const zn=t=>t.getUTCFullYear();function En(t,i,n){return i.replace(/yyyy/g,(t=>_t(zn(t),4))(t)).replace(/yy/g,(t=>_t(zn(t)%100,2))(t)).replace(/MMMM/g,((t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"long"}))(t,n)).replace(/MMM/g,((t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"short"}))(t,n)).replace(/MM/g,(t=>_t((t=>t.getUTCMonth()+1)(t),2))(t)).replace(/dd/g,(t=>_t((t=>t.getUTCDate())(t),2))(t))}class In{constructor(t="yyyy-MM-dd",i="default"){this.ud=t,this.dd=i}F_(t){return En(t,this.ud,this.dd)}}class Ln{constructor(t){this.fd=t||"%h:%m:%s"}F_(t){return this.fd.replace("%h",_t(t.getUTCHours(),2)).replace("%m",_t(t.getUTCMinutes(),2)).replace("%s",_t(t.getUTCSeconds(),2))}}const Nn={vd:"yyyy-MM-dd",pd:"%h:%m:%s",md:" ",bd:"default"};class Fn{constructor(t={}){const i=Object.assign(Object.assign({},Nn),t);this.wd=new In(i.vd,i.bd),this.gd=new Ln(i.pd),this.Md=i.md}F_(t){return`${this.wd.F_(t)}${this.Md}${this.gd.F_(t)}`}}function Wn(t){return 60*t*60*1e3}function jn(t){return 60*t*1e3}const Hn=[{xd:($n=1,1e3*$n),Sd:10},{xd:jn(1),Sd:20},{xd:jn(5),Sd:21},{xd:jn(30),Sd:22},{xd:Wn(1),Sd:30},{xd:Wn(3),Sd:31},{xd:Wn(6),Sd:32},{xd:Wn(12),Sd:33}];var $n;function Un(t,i){if(t.getUTCFullYear()!==i.getUTCFullYear())return 70;if(t.getUTCMonth()!==i.getUTCMonth())return 60;if(t.getUTCDate()!==i.getUTCDate())return 50;for(let n=Hn.length-1;n>=0;--n)if(Math.floor(i.getTime()/Hn[n].xd)!==Math.floor(t.getTime()/Hn[n].xd))return Hn[n].Sd;return 0}function qn(t){let i=t;if(R(t)&&(i=Xn(t)),!Bn(i))throw new Error("time must be of type BusinessDay");const n=new Date(Date.UTC(i.year,i.month-1,i.day,0,0,0,0));return{yd:Math.round(n.getTime()/1e3),kd:i}}function Yn(t){if(!Vn(t))throw new Error("time must be of type isUTCTimestamp");return{yd:t}}function Xn(t){const i=new Date(t);if(isNaN(i.getTime()))throw new Error(`Invalid date string=${t}, expected format=yyyy-mm-dd`);return{day:i.getUTCDate(),month:i.getUTCMonth()+1,year:i.getUTCFullYear()}}function Kn(t){R(t.time)&&(t.time=Xn(t.time))}class Zn{options(){return this.cn}setOptions(t){this.cn=t,this.updateFormatter(t.localization)}preprocessData(t){Array.isArray(t)?function(t){t.forEach(Kn)}(t):Kn(t)}createConverterToInternalObj(t){return f(function(t){return 0===t.length?null:Bn(t[0].time)||R(t[0].time)?qn:Yn}(t))}key(t){return"object"==typeof t&&"yd"in t?t.yd:this.key(this.convertHorzItemToInternal(t))}cacheKey(t){const i=t;return void 0===i.kd?new Date(1e3*i.yd).getTime():new Date(Date.UTC(i.kd.year,i.kd.month-1,i.kd.day)).getTime()}convertHorzItemToInternal(t){return Vn(i=t)?Yn(i):Bn(i)?qn(i):qn(Xn(i));var i}updateFormatter(t){if(!this.cn)return;const i=t.dateFormat;this.cn.timeScale.timeVisible?this.Cd=new Fn({vd:i,pd:this.cn.timeScale.secondsVisible?"%h:%m:%s":"%h:%m",md:" ",bd:t.locale}):this.Cd=new In(i,t.locale)}formatHorzItem(t){const i=t;return this.Cd.F_(new Date(1e3*i.yd))}formatTickmark(t,i){const n=function(t,i,n){switch(t){case 0:case 10:return i?n?4:3:2;case 20:case 21:case 22:case 30:case 31:case 32:case 33:return i?3:2;case 50:return 2;case 60:return 1;case 70:return 0}}(t.weight,this.cn.timeScale.timeVisible,this.cn.timeScale.secondsVisible),s=this.cn.timeScale;if(void 0!==s.tickMarkFormatter){const e=s.tickMarkFormatter(t.originalTime,n,i.locale);if(null!==e)return e}return function(t,i,n){const s={};switch(i){case 0:s.year="numeric";break;case 1:s.month="short";break;case 2:s.day="numeric";break;case 3:s.hour12=!1,s.hour="2-digit",s.minute="2-digit";break;case 4:s.hour12=!1,s.hour="2-digit",s.minute="2-digit",s.second="2-digit"}const e=void 0===t.kd?new Date(1e3*t.yd):new Date(Date.UTC(t.kd.year,t.kd.month-1,t.kd.day));return new Date(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()).toLocaleString(n,s)}(t.time,n,i.locale)}maxTickMarkWeight(t){let i=t.reduce(xn,t[0]).weight;return i>30&&i<50&&(i=30),i}fillWeightsForPoints(t,i){!function(t,i=0){if(0===t.length)return;let n=0===i?null:t[i-1].time.yd,s=null!==n?new Date(1e3*n):null,e=0;for(let r=i;r1){const i=Math.ceil(e/(t.length-1)),n=new Date(1e3*(t[0].time.yd-i));t[0].timeWeight=Un(new Date(1e3*t[0].time.yd),n)}}(t,i)}static Td(t){return C({localization:{dateFormat:"dd MMM 'yy"}},null!=t?t:{})}}function Gn(t){var i=t.width,n=t.height;if(i<0)throw new Error("Negative width is not allowed for Size");if(n<0)throw new Error("Negative height is not allowed for Size");return{width:i,height:n}}function Jn(t,i){return t.width===i.width&&t.height===i.height}var Qn=function(){function t(t){var i=this;this._resolutionListener=function(){return i._onResolutionChanged()},this._resolutionMediaQueryList=null,this._observers=[],this._window=t,this._installResolutionListener()}return t.prototype.dispose=function(){this._uninstallResolutionListener(),this._window=null},Object.defineProperty(t.prototype,"value",{get:function(){return this._window.devicePixelRatio},enumerable:!1,configurable:!0}),t.prototype.subscribe=function(t){var i=this,n={next:t};return this._observers.push(n),{unsubscribe:function(){i._observers=i._observers.filter((function(t){return t!==n}))}}},t.prototype._installResolutionListener=function(){if(null!==this._resolutionMediaQueryList)throw new Error("Resolution listener is already installed");var t=this._window.devicePixelRatio;this._resolutionMediaQueryList=this._window.matchMedia("all and (resolution: ".concat(t,"dppx)")),this._resolutionMediaQueryList.addListener(this._resolutionListener)},t.prototype._uninstallResolutionListener=function(){null!==this._resolutionMediaQueryList&&(this._resolutionMediaQueryList.removeListener(this._resolutionListener),this._resolutionMediaQueryList=null)},t.prototype._reinstallResolutionListener=function(){this._uninstallResolutionListener(),this._installResolutionListener()},t.prototype._onResolutionChanged=function(){var t=this;this._observers.forEach((function(i){return i.next(t._window.devicePixelRatio)})),this._reinstallResolutionListener()},t}();var ts=function(){function t(t,i,n){var s;this._canvasElement=null,this._bitmapSizeChangedListeners=[],this._suggestedBitmapSize=null,this._suggestedBitmapSizeChangedListeners=[],this._devicePixelRatioObservable=null,this._canvasElementResizeObserver=null,this._canvasElement=t,this._canvasElementClientSize=Gn({width:this._canvasElement.clientWidth,height:this._canvasElement.clientHeight}),this._transformBitmapSize=null!=i?i:function(t){return t},this._allowResizeObserver=null===(s=null==n?void 0:n.allowResizeObserver)||void 0===s||s,this._chooseAndInitObserver()}return t.prototype.dispose=function(){var t,i;if(null===this._canvasElement)throw new Error("Object is disposed");null===(t=this._canvasElementResizeObserver)||void 0===t||t.disconnect(),this._canvasElementResizeObserver=null,null===(i=this._devicePixelRatioObservable)||void 0===i||i.dispose(),this._devicePixelRatioObservable=null,this._suggestedBitmapSizeChangedListeners.length=0,this._bitmapSizeChangedListeners.length=0,this._canvasElement=null},Object.defineProperty(t.prototype,"canvasElement",{get:function(){if(null===this._canvasElement)throw new Error("Object is disposed");return this._canvasElement},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"canvasElementClientSize",{get:function(){return this._canvasElementClientSize},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"bitmapSize",{get:function(){return Gn({width:this.canvasElement.width,height:this.canvasElement.height})},enumerable:!1,configurable:!0}),t.prototype.resizeCanvasElement=function(t){this._canvasElementClientSize=Gn(t),this.canvasElement.style.width="".concat(this._canvasElementClientSize.width,"px"),this.canvasElement.style.height="".concat(this._canvasElementClientSize.height,"px"),this._invalidateBitmapSize()},t.prototype.subscribeBitmapSizeChanged=function(t){this._bitmapSizeChangedListeners.push(t)},t.prototype.unsubscribeBitmapSizeChanged=function(t){this._bitmapSizeChangedListeners=this._bitmapSizeChangedListeners.filter((function(i){return i!==t}))},Object.defineProperty(t.prototype,"suggestedBitmapSize",{get:function(){return this._suggestedBitmapSize},enumerable:!1,configurable:!0}),t.prototype.subscribeSuggestedBitmapSizeChanged=function(t){this._suggestedBitmapSizeChangedListeners.push(t)},t.prototype.unsubscribeSuggestedBitmapSizeChanged=function(t){this._suggestedBitmapSizeChangedListeners=this._suggestedBitmapSizeChangedListeners.filter((function(i){return i!==t}))},t.prototype.applySuggestedBitmapSize=function(){if(null!==this._suggestedBitmapSize){var t=this._suggestedBitmapSize;this._suggestedBitmapSize=null,this._resizeBitmap(t),this._emitSuggestedBitmapSizeChanged(t,this._suggestedBitmapSize)}},t.prototype._resizeBitmap=function(t){var i=this.bitmapSize;Jn(i,t)||(this.canvasElement.width=t.width,this.canvasElement.height=t.height,this._emitBitmapSizeChanged(i,t))},t.prototype._emitBitmapSizeChanged=function(t,i){var n=this;this._bitmapSizeChangedListeners.forEach((function(s){return s.call(n,t,i)}))},t.prototype._suggestNewBitmapSize=function(t){var i=this._suggestedBitmapSize,n=Gn(this._transformBitmapSize(t,this._canvasElementClientSize)),s=Jn(this.bitmapSize,n)?null:n;null===i&&null===s||null!==i&&null!==s&&Jn(i,s)||(this._suggestedBitmapSize=s,this._emitSuggestedBitmapSizeChanged(i,s))},t.prototype._emitSuggestedBitmapSizeChanged=function(t,i){var n=this;this._suggestedBitmapSizeChangedListeners.forEach((function(s){return s.call(n,t,i)}))},t.prototype._chooseAndInitObserver=function(){var t=this;this._allowResizeObserver?new Promise((function(t){var i=new ResizeObserver((function(n){t(n.every((function(t){return"devicePixelContentBoxSize"in t}))),i.disconnect()}));i.observe(document.body,{box:"device-pixel-content-box"})})).catch((function(){return!1})).then((function(i){return i?t._initResizeObserver():t._initDevicePixelRatioObservable()})):this._initDevicePixelRatioObservable()},t.prototype._initDevicePixelRatioObservable=function(){var t=this;if(null!==this._canvasElement){var i=is(this._canvasElement);if(null===i)throw new Error("No window is associated with the canvas");this._devicePixelRatioObservable=function(t){return new Qn(t)}(i),this._devicePixelRatioObservable.subscribe((function(){return t._invalidateBitmapSize()})),this._invalidateBitmapSize()}},t.prototype._invalidateBitmapSize=function(){var t,i;if(null!==this._canvasElement){var n=is(this._canvasElement);if(null!==n){var s=null!==(i=null===(t=this._devicePixelRatioObservable)||void 0===t?void 0:t.value)&&void 0!==i?i:n.devicePixelRatio,e=this._canvasElement.getClientRects(),r=void 0!==e[0]?function(t,i){return Gn({width:Math.round(t.left*i+t.width*i)-Math.round(t.left*i),height:Math.round(t.top*i+t.height*i)-Math.round(t.top*i)})}(e[0],s):Gn({width:this._canvasElementClientSize.width*s,height:this._canvasElementClientSize.height*s});this._suggestNewBitmapSize(r)}}},t.prototype._initResizeObserver=function(){var t=this;null!==this._canvasElement&&(this._canvasElementResizeObserver=new ResizeObserver((function(i){var n=i.find((function(i){return i.target===t._canvasElement}));if(n&&n.devicePixelContentBoxSize&&n.devicePixelContentBoxSize[0]){var s=n.devicePixelContentBoxSize[0],e=Gn({width:s.inlineSize,height:s.blockSize});t._suggestNewBitmapSize(e)}})),this._canvasElementResizeObserver.observe(this._canvasElement,{box:"device-pixel-content-box"}))},t}();function is(t){return t.ownerDocument.defaultView}var ns=function(){function t(t,i,n){if(0===i.width||0===i.height)throw new TypeError("Rendering target could only be created on a media with positive width and height");if(this._mediaSize=i,0===n.width||0===n.height)throw new TypeError("Rendering target could only be created using a bitmap with positive integer width and height");this._bitmapSize=n,this._context=t}return t.prototype.useMediaCoordinateSpace=function(t){try{return this._context.save(),this._context.setTransform(1,0,0,1,0,0),this._context.scale(this._horizontalPixelRatio,this._verticalPixelRatio),t({context:this._context,mediaSize:this._mediaSize})}finally{this._context.restore()}},t.prototype.useBitmapCoordinateSpace=function(t){try{return this._context.save(),this._context.setTransform(1,0,0,1,0,0),t({context:this._context,mediaSize:this._mediaSize,bitmapSize:this._bitmapSize,horizontalPixelRatio:this._horizontalPixelRatio,verticalPixelRatio:this._verticalPixelRatio})}finally{this._context.restore()}},Object.defineProperty(t.prototype,"_horizontalPixelRatio",{get:function(){return this._bitmapSize.width/this._mediaSize.width},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"_verticalPixelRatio",{get:function(){return this._bitmapSize.height/this._mediaSize.height},enumerable:!1,configurable:!0}),t}();function ss(t,i){var n=t.canvasElementClientSize;if(0===n.width||0===n.height)return null;var s=t.bitmapSize;if(0===s.width||0===s.height)return null;var e=t.canvasElement.getContext("2d",i);return null===e?null:new ns(e,n,s)}const es="undefined"!=typeof window;function rs(){return!!es&&window.navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function hs(){return!!es&&/iPhone|iPad|iPod/.test(window.navigator.platform)}function ls(t){return t+t%2}function as(t,i){return t.Pd-i.Pd}function os(t,i,n){const s=(t.Pd-i.Pd)/(t.ut-i.ut);return Math.sign(s)*Math.min(Math.abs(s),n)}class _s{constructor(t,i,n,s){this.Rd=null,this.Dd=null,this.Od=null,this.Ad=null,this.Bd=null,this.Vd=0,this.zd=0,this.Ed=t,this.Id=i,this.Ld=n,this.rs=s}Nd(t,i){if(null!==this.Rd){if(this.Rd.ut===i)return void(this.Rd.Pd=t);if(Math.abs(this.Rd.Pd-t)50)return;let n=0;const s=os(this.Rd,this.Dd,this.Id),e=as(this.Rd,this.Dd),r=[s],h=[e];if(n+=e,null!==this.Od){const t=os(this.Dd,this.Od,this.Id);if(Math.sign(t)===Math.sign(s)){const i=as(this.Dd,this.Od);if(r.push(t),h.push(i),n+=i,null!==this.Ad){const t=os(this.Od,this.Ad,this.Id);if(Math.sign(t)===Math.sign(s)){const i=as(this.Od,this.Ad);r.push(t),h.push(i),n+=i}}}}let l=0;for(let t=0;t({width:Math.max(t.width,i.width),height:Math.max(t.height,i.height)})});return s.resizeCanvasElement(i),s}function cs(t,i,n,s){t.G&&t.G(i,n,s)}function ds(t,i,n,s){t.K(i,n,s)}function fs(t,i,n,s){const e=t(n,s);for(const t of e){const n=t.xt();null!==n&&i(n)}}function vs(t){es&&void 0!==window.chrome&&t.addEventListener("mousedown",(t=>{if(1===t.button)return t.preventDefault(),!1}))}class ps{constructor(t,i,n){this.Wd=0,this.jd=null,this.Hd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY},this.$d=0,this.Ud=null,this.qd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY},this.Yd=null,this.Xd=!1,this.Kd=null,this.Zd=null,this.Gd=!1,this.Jd=!1,this.Qd=!1,this.tf=null,this.if=null,this.nf=null,this.sf=null,this.ef=null,this.rf=null,this.hf=null,this.lf=0,this.af=!1,this._f=!1,this.uf=!1,this.cf=0,this.df=null,this.ff=!hs(),this.vf=t=>{this.pf(t)},this.mf=t=>{if(this.bf(t)){const i=this.wf(t);if(++this.$d,this.Ud&&this.$d>1){const{gf:n}=this.Mf(ws(t),this.qd);n<30&&!this.Qd&&this.xf(i,this.yf.Sf),this.kf()}}else{const i=this.wf(t);if(++this.Wd,this.jd&&this.Wd>1){const{gf:n}=this.Mf(ws(t),this.Hd);n<5&&!this.Jd&&this.Cf(i,this.yf.Tf),this.Pf()}}},this.Rf=t,this.yf=i,this.cn=n,this.Df()}S(){null!==this.tf&&(this.tf(),this.tf=null),null!==this.if&&(this.if(),this.if=null),null!==this.sf&&(this.sf(),this.sf=null),null!==this.ef&&(this.ef(),this.ef=null),null!==this.rf&&(this.rf(),this.rf=null),null!==this.nf&&(this.nf(),this.nf=null),this.Of(),this.Pf()}Af(t){this.sf&&this.sf();const i=this.Bf.bind(this);if(this.sf=()=>{this.Rf.removeEventListener("mousemove",i)},this.Rf.addEventListener("mousemove",i),this.bf(t))return;const n=this.wf(t);this.Cf(n,this.yf.Vf),this.ff=!0}Pf(){null!==this.jd&&clearTimeout(this.jd),this.Wd=0,this.jd=null,this.Hd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY}}kf(){null!==this.Ud&&clearTimeout(this.Ud),this.$d=0,this.Ud=null,this.qd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY}}Bf(t){if(this.uf||null!==this.Zd)return;if(this.bf(t))return;const i=this.wf(t);this.Cf(i,this.yf.zf),this.ff=!0}Ef(t){const i=Ms(t.changedTouches,f(this.df));if(null===i)return;if(this.cf=gs(t),null!==this.hf)return;if(this._f)return;this.af=!0;const n=this.Mf(ws(i),f(this.Zd)),{If:s,Lf:e,gf:r}=n;if(this.Gd||!(r<5)){if(!this.Gd){const t=.5*s,i=e>=t&&!this.cn.Nf(),n=t>e&&!this.cn.Ff();i||n||(this._f=!0),this.Gd=!0,this.Qd=!0,this.Of(),this.kf()}if(!this._f){const n=this.wf(t,i);this.xf(n,this.yf.Wf),bs(t)}}}jf(t){if(0!==t.button)return;const i=this.Mf(ws(t),f(this.Kd)),{gf:n}=i;if(n>=5&&(this.Jd=!0,this.Pf()),this.Jd){const i=this.wf(t);this.Cf(i,this.yf.Hf)}}Mf(t,i){const n=Math.abs(i.et-t.et),s=Math.abs(i.rt-t.rt);return{If:n,Lf:s,gf:n+s}}$f(t){let i=Ms(t.changedTouches,f(this.df));if(null===i&&0===t.touches.length&&(i=t.changedTouches[0]),null===i)return;this.df=null,this.cf=gs(t),this.Of(),this.Zd=null,this.rf&&(this.rf(),this.rf=null);const n=this.wf(t,i);if(this.xf(n,this.yf.Uf),++this.$d,this.Ud&&this.$d>1){const{gf:t}=this.Mf(ws(i),this.qd);t<30&&!this.Qd&&this.xf(n,this.yf.Sf),this.kf()}else this.Qd||(this.xf(n,this.yf.qf),this.yf.qf&&bs(t));0===this.$d&&bs(t),0===t.touches.length&&this.Xd&&(this.Xd=!1,bs(t))}pf(t){if(0!==t.button)return;const i=this.wf(t);if(this.Kd=null,this.uf=!1,this.ef&&(this.ef(),this.ef=null),rs()){this.Rf.ownerDocument.documentElement.removeEventListener("mouseleave",this.vf)}if(!this.bf(t))if(this.Cf(i,this.yf.Yf),++this.Wd,this.jd&&this.Wd>1){const{gf:n}=this.Mf(ws(t),this.Hd);n<5&&!this.Jd&&this.Cf(i,this.yf.Tf),this.Pf()}else this.Jd||this.Cf(i,this.yf.Xf)}Of(){null!==this.Yd&&(clearTimeout(this.Yd),this.Yd=null)}Kf(t){if(null!==this.df)return;const i=t.changedTouches[0];this.df=i.identifier,this.cf=gs(t);const n=this.Rf.ownerDocument.documentElement;this.Qd=!1,this.Gd=!1,this._f=!1,this.Zd=ws(i),this.rf&&(this.rf(),this.rf=null);{const i=this.Ef.bind(this),s=this.$f.bind(this);this.rf=()=>{n.removeEventListener("touchmove",i),n.removeEventListener("touchend",s)},n.addEventListener("touchmove",i,{passive:!1}),n.addEventListener("touchend",s,{passive:!1}),this.Of(),this.Yd=setTimeout(this.Zf.bind(this,t),240)}const s=this.wf(t,i);this.xf(s,this.yf.Gf),this.Ud||(this.$d=0,this.Ud=setTimeout(this.kf.bind(this),500),this.qd=ws(i))}Jf(t){if(0!==t.button)return;const i=this.Rf.ownerDocument.documentElement;rs()&&i.addEventListener("mouseleave",this.vf),this.Jd=!1,this.Kd=ws(t),this.ef&&(this.ef(),this.ef=null);{const t=this.jf.bind(this),n=this.pf.bind(this);this.ef=()=>{i.removeEventListener("mousemove",t),i.removeEventListener("mouseup",n)},i.addEventListener("mousemove",t),i.addEventListener("mouseup",n)}if(this.uf=!0,this.bf(t))return;const n=this.wf(t);this.Cf(n,this.yf.Qf),this.jd||(this.Wd=0,this.jd=setTimeout(this.Pf.bind(this),500),this.Hd=ws(t))}Df(){this.Rf.addEventListener("mouseenter",this.Af.bind(this)),this.Rf.addEventListener("touchcancel",this.Of.bind(this));{const t=this.Rf.ownerDocument,i=t=>{this.yf.tv&&(t.composed&&this.Rf.contains(t.composedPath()[0])||t.target&&this.Rf.contains(t.target)||this.yf.tv())};this.if=()=>{t.removeEventListener("touchstart",i)},this.tf=()=>{t.removeEventListener("mousedown",i)},t.addEventListener("mousedown",i),t.addEventListener("touchstart",i,{passive:!0})}hs()&&(this.nf=()=>{this.Rf.removeEventListener("dblclick",this.mf)},this.Rf.addEventListener("dblclick",this.mf)),this.Rf.addEventListener("mouseleave",this.iv.bind(this)),this.Rf.addEventListener("touchstart",this.Kf.bind(this),{passive:!0}),vs(this.Rf),this.Rf.addEventListener("mousedown",this.Jf.bind(this)),this.nv(),this.Rf.addEventListener("touchmove",(()=>{}),{passive:!1})}nv(){void 0===this.yf.sv&&void 0===this.yf.ev&&void 0===this.yf.rv||(this.Rf.addEventListener("touchstart",(t=>this.hv(t.touches)),{passive:!0}),this.Rf.addEventListener("touchmove",(t=>{if(2===t.touches.length&&null!==this.hf&&void 0!==this.yf.ev){const i=ms(t.touches[0],t.touches[1])/this.lf;this.yf.ev(this.hf,i),bs(t)}}),{passive:!1}),this.Rf.addEventListener("touchend",(t=>{this.hv(t.touches)})))}hv(t){1===t.length&&(this.af=!1),2!==t.length||this.af||this.Xd?this.lv():this.av(t)}av(t){const i=this.Rf.getBoundingClientRect()||{left:0,top:0};this.hf={et:(t[0].clientX-i.left+(t[1].clientX-i.left))/2,rt:(t[0].clientY-i.top+(t[1].clientY-i.top))/2},this.lf=ms(t[0],t[1]),void 0!==this.yf.sv&&this.yf.sv(),this.Of()}lv(){null!==this.hf&&(this.hf=null,void 0!==this.yf.rv&&this.yf.rv())}iv(t){if(this.sf&&this.sf(),this.bf(t))return;if(!this.ff)return;const i=this.wf(t);this.Cf(i,this.yf.ov),this.ff=!hs()}Zf(t){const i=Ms(t.touches,f(this.df));if(null===i)return;const n=this.wf(t,i);this.xf(n,this.yf._v),this.Qd=!0,this.Xd=!0}bf(t){return t.sourceCapabilities&&void 0!==t.sourceCapabilities.firesTouchEvents?t.sourceCapabilities.firesTouchEvents:gs(t){"touchstart"!==t.type&&bs(t)}}}}function ms(t,i){const n=t.clientX-i.clientX,s=t.clientY-i.clientY;return Math.sqrt(n*n+s*s)}function bs(t){t.cancelable&&t.preventDefault()}function ws(t){return{et:t.pageX,rt:t.pageY}}function gs(t){return t.timeStamp||performance.now()}function Ms(t,i){for(let n=0;n{var s,e,r,h;return(null!==(e=null===(s=n.At())||void 0===s?void 0:s.xa())&&void 0!==e?e:"")!==i?[]:null!==(h=null===(r=n.la)||void 0===r?void 0:r.call(n,t))&&void 0!==h?h:[]}}class ks{constructor(t,i,n,s){this.Li=null,this.wv=null,this.gv=!1,this.Mv=new Qt(200),this.Gr=null,this.xv=0,this.Sv=!1,this.yv=()=>{this.Sv||this.nn.kv().qt().Fh()},this.Cv=()=>{this.Sv||this.nn.kv().qt().Fh()},this.nn=t,this.cn=i,this.mo=i.layout,this.yc=n,this.Tv="left"===s,this.Pv=ys("normal",s),this.Rv=ys("top",s),this.Dv=ys("bottom",s),this.Ov=document.createElement("div"),this.Ov.style.height="100%",this.Ov.style.overflow="hidden",this.Ov.style.width="25px",this.Ov.style.left="0",this.Ov.style.position="relative",this.Av=us(this.Ov,Gn({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.yv);const e=this.Av.canvasElement;e.style.position="absolute",e.style.zIndex="1",e.style.left="0",e.style.top="0",this.Bv=us(this.Ov,Gn({width:16,height:16})),this.Bv.subscribeSuggestedBitmapSizeChanged(this.Cv);const r=this.Bv.canvasElement;r.style.position="absolute",r.style.zIndex="2",r.style.left="0",r.style.top="0";const h={Qf:this.Vv.bind(this),Gf:this.Vv.bind(this),Hf:this.zv.bind(this),Wf:this.zv.bind(this),tv:this.Ev.bind(this),Yf:this.Iv.bind(this),Uf:this.Iv.bind(this),Tf:this.Lv.bind(this),Sf:this.Lv.bind(this),Vf:this.Nv.bind(this),ov:this.Fv.bind(this)};this.Wv=new ps(this.Bv.canvasElement,h,{Nf:()=>!this.cn.handleScroll.vertTouchDrag,Ff:()=>!0})}S(){this.Wv.S(),this.Bv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Bv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.yv),this.Av.dispose(),null!==this.Li&&this.Li.$o().p(this),this.Li=null}jv(){return this.Ov}P(){return this.mo.fontSize}Hv(){const t=this.yc.W();return this.Gr!==t.R&&(this.Mv.ir(),this.Gr=t.R),t}$v(){if(null===this.Li)return 0;let t=0;const i=this.Hv(),n=f(this.Av.canvasElement.getContext("2d"));n.save();const s=this.Li.Ia();n.font=this.Uv(),s.length>0&&(t=Math.max(this.Mv.Si(n,s[0].Za),this.Mv.Si(n,s[s.length-1].Za)));const e=this.qv();for(let i=e.length;i--;){const s=this.Mv.Si(n,e[i].Jt());s>t&&(t=s)}const r=this.Li.Pt();if(null!==r&&null!==this.wv){const i=this.Li.pn(1,r),s=this.Li.pn(this.wv.height-2,r);t=Math.max(t,this.Mv.Si(n,this.Li.Wi(Math.floor(Math.min(i,s))+.11111111111111,r)),this.Mv.Si(n,this.Li.Wi(Math.ceil(Math.max(i,s))-.11111111111111,r)))}n.restore();const h=t||34;return ls(Math.ceil(i.C+i.T+i.V+i.I+5+h))}Yv(t){null!==this.wv&&Jn(this.wv,t)||(this.wv=t,this.Sv=!0,this.Av.resizeCanvasElement(t),this.Bv.resizeCanvasElement(t),this.Sv=!1,this.Ov.style.width=`${t.width}px`,this.Ov.style.height=`${t.height}px`)}Xv(){return f(this.wv).width}Ji(t){this.Li!==t&&(null!==this.Li&&this.Li.$o().p(this),this.Li=t,t.$o().l(this.ao.bind(this),this))}At(){return this.Li}ir(){const t=this.nn.Kv();this.nn.kv().qt().A_(t,f(this.At()))}Zv(t){if(null===this.wv)return;if(1!==t){this.Gv(),this.Av.applySuggestedBitmapSize();const t=ss(this.Av);null!==t&&(t.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Ve(t)})),this.nn.Qv(t,this.Dv),this.tp(t),this.nn.Qv(t,this.Pv),this.ip(t))}this.Bv.applySuggestedBitmapSize();const i=ss(this.Bv);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.np(i),this.nn.Qv(i,this.Rv))}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}gt(){var t;null===(t=this.Li)||void 0===t||t.Ia()}Vv(t){if(null===this.Li||this.Li.Fi()||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.kv().qt(),n=this.nn.Kv();this.gv=!0,i.k_(n,this.Li,t.localY)}zv(t){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.kv().qt(),n=this.nn.Kv(),s=this.Li;i.C_(n,s,t.localY)}Ev(){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const t=this.nn.kv().qt(),i=this.nn.Kv(),n=this.Li;this.gv&&(this.gv=!1,t.T_(i,n))}Iv(t){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.kv().qt(),n=this.nn.Kv();this.gv=!1,i.T_(n,this.Li)}Lv(t){this.cn.handleScale.axisDoubleClickReset.price&&this.ir()}Nv(t){if(null===this.Li)return;!this.nn.kv().qt().W().handleScale.axisPressedMouseMove.price||this.Li.ph()||this.Li.Co()||this.rp(1)}Fv(t){this.rp(0)}qv(){const t=[],i=null===this.Li?void 0:this.Li;return(n=>{for(let s=0;s{t.fillStyle=n.borderColor;const l=Math.max(1,Math.floor(h)),a=Math.floor(.5*h),o=Math.round(s.T*r);t.beginPath();for(const n of i)t.rect(Math.floor(e*r),Math.round(n.Aa*h)-a,o,l);t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{var r;t.font=this.Uv(),t.fillStyle=null!==(r=n.textColor)&&void 0!==r?r:this.mo.textColor,t.textAlign=this.Tv?"right":"left",t.textBaseline="middle";const h=this.Tv?Math.round(e-s.V):Math.round(e+s.T+s.V),l=i.map((i=>this.Mv.xi(t,i.Za)));for(let n=i.length;n--;){const s=i[n];t.fillText(s.Za,h,s.Aa+l[n])}}))}Gv(){if(null===this.wv||null===this.Li)return;let t=this.wv.height/2;const i=[],n=this.Li.No().slice(),s=this.nn.Kv(),e=this.Hv();this.Li===s.vr()&&this.nn.Kv().No().forEach((t=>{s.dr(t)&&n.push(t)}));const r=this.Li.Ta()[0],h=this.Li;n.forEach((n=>{const e=n.Rn(s,h);e.forEach((t=>{t.Bi(null),t.Vi()&&i.push(t)})),r===n&&e.length>0&&(t=e[0].ki())})),i.forEach((t=>t.Bi(t.ki())));this.Li.W().alignLabels&&this.hp(i,e,t)}hp(t,i,n){if(null===this.wv)return;const s=t.filter((t=>t.ki()<=n)),e=t.filter((t=>t.ki()>n));s.sort(((t,i)=>i.ki()-t.ki())),s.length&&e.length&&e.push(s[0]),e.sort(((t,i)=>t.ki()-i.ki()));for(const n of t){const t=Math.floor(n.Et(i)/2),s=n.ki();s>-t&&sthis.wv.height-t&&sl-r&&n.Bi(l-r)}for(let t=1;t{if(i.zi()){i.xt(f(this.Li)).K(t,n,this.Mv,s)}}))}np(t){if(null===this.wv||null===this.Li)return;const i=this.nn.kv().qt(),n=[],s=this.nn.Kv(),e=i.Fc().Rn(s,this.Li);e.length&&n.push(e);const r=this.Hv(),h=this.Tv?"right":"left";n.forEach((i=>{i.forEach((i=>{i.xt(f(this.Li)).K(t,r,this.Mv,h)}))}))}rp(t){this.Ov.style.cursor=1===t?"ns-resize":"default"}ao(){const t=this.$v();this.xv{this.Sv||null===this.wp||this.Ui().Fh()},this.Cv=()=>{this.Sv||null===this.wp||this.Ui().Fh()},this.gp=t,this.wp=i,this.wp.z_().l(this.Mp.bind(this),this,!0),this.xp=document.createElement("td"),this.xp.style.padding="0",this.xp.style.position="relative";const n=document.createElement("div");n.style.width="100%",n.style.height="100%",n.style.position="relative",n.style.overflow="hidden",this.Sp=document.createElement("td"),this.Sp.style.padding="0",this.yp=document.createElement("td"),this.yp.style.padding="0",this.xp.appendChild(n),this.Av=us(n,Gn({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.yv);const s=this.Av.canvasElement;s.style.position="absolute",s.style.zIndex="1",s.style.left="0",s.style.top="0",this.Bv=us(n,Gn({width:16,height:16})),this.Bv.subscribeSuggestedBitmapSizeChanged(this.Cv);const e=this.Bv.canvasElement;e.style.position="absolute",e.style.zIndex="2",e.style.left="0",e.style.top="0",this.kp=document.createElement("tr"),this.kp.appendChild(this.Sp),this.kp.appendChild(this.xp),this.kp.appendChild(this.yp),this.Cp(),this.Wv=new ps(this.Bv.canvasElement,this,{Nf:()=>null===this.vp&&!this.gp.W().handleScroll.vertTouchDrag,Ff:()=>null===this.vp&&!this.gp.W().handleScroll.horzTouchDrag})}S(){null!==this.lp&&this.lp.S(),null!==this.ap&&this.ap.S(),this.Bv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Bv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.yv),this.Av.dispose(),null!==this.wp&&this.wp.z_().p(this),this.Wv.S()}Kv(){return f(this.wp)}Tp(t){null!==this.wp&&this.wp.z_().p(this),this.wp=t,null!==this.wp&&this.wp.z_().l(Ds.prototype.Mp.bind(this),this,!0),this.Cp()}kv(){return this.gp}jv(){return this.kp}Cp(){if(null!==this.wp&&(this.Pp(),0!==this.Ui().Mt().length)){if(null!==this.lp){const t=this.wp.S_();this.lp.Ji(f(t))}if(null!==this.ap){const t=this.wp.y_();this.ap.Ji(f(t))}}}Rp(){null!==this.lp&&this.lp.gt(),null!==this.ap&&this.ap.gt()}v_(){return null!==this.wp?this.wp.v_():0}p_(t){this.wp&&this.wp.p_(t)}Vf(t){if(!this.wp)return;this.Dp();const i=t.localX,n=t.localY;this.Op(i,n,t)}Qf(t){this.Dp(),this.Ap(),this.Op(t.localX,t.localY,t)}zf(t){var i;if(!this.wp)return;this.Dp();const n=t.localX,s=t.localY;this.Op(n,s,t);const e=this.br(n,s);this.gp.Bp(null!==(i=null==e?void 0:e.bv)&&void 0!==i?i:null),this.Ui().Vc(e&&{zc:e.zc,pv:e.pv})}Xf(t){null!==this.wp&&(this.Dp(),this.Vp(t))}Tf(t){null!==this.wp&&this.zp(this.cp,t)}Sf(t){this.Tf(t)}Hf(t){this.Dp(),this.Ep(t),this.Op(t.localX,t.localY,t)}Yf(t){null!==this.wp&&(this.Dp(),this.fp=!1,this.Ip(t))}qf(t){null!==this.wp&&this.Vp(t)}_v(t){if(this.fp=!0,null===this.vp){const i={x:t.localX,y:t.localY};this.Lp(i,i,t)}}ov(t){null!==this.wp&&(this.Dp(),this.wp.qt().Vc(null),this.Np())}Fp(){return this.up}Wp(){return this.cp}sv(){this.dp=1,this.Ui().Un()}ev(t,i){if(!this.gp.W().handleScale.pinch)return;const n=5*(i-this.dp);this.dp=i,this.Ui().Uc(t.et,n)}Gf(t){this.fp=!1,this.pp=null!==this.vp,this.Ap();const i=this.Ui().Fc();null!==this.vp&&i.Tt()&&(this.mp={x:i.Kt(),y:i.Zt()},this.vp={x:t.localX,y:t.localY})}Wf(t){if(null===this.wp)return;const i=t.localX,n=t.localY;if(null===this.vp)this.Ep(t);else{this.pp=!1;const s=f(this.mp),e=s.x+(i-this.vp.x),r=s.y+(n-this.vp.y);this.Op(e,r,t)}}Uf(t){0===this.kv().W().trackingMode.exitMode&&(this.pp=!0),this.jp(),this.Ip(t)}br(t,i){const n=this.wp;return null===n?null:function(t,i,n){const s=t.No(),e=function(t,i,n){var s,e;let r,h;for(const o of t){const t=null!==(e=null===(s=o.oa)||void 0===s?void 0:s.call(o,i,n))&&void 0!==e?e:[];for(const i of t)l=i.zOrder,(!(a=null==r?void 0:r.zOrder)||"top"===l&&"top"!==a||"normal"===l&&"bottom"===a)&&(r=i,h=o)}var l,a;return r&&h?{mv:r,zc:h}:null}(s,i,n);if("top"===(null==e?void 0:e.mv.zOrder))return xs(e);for(const r of s){if(e&&e.zc===r&&"bottom"!==e.mv.zOrder&&!e.mv.isBackground)return xs(e);const s=Ss(r.Pn(t),i,n);if(null!==s)return{zc:r,fv:s.fv,pv:s.pv};if(e&&e.zc===r&&"bottom"!==e.mv.zOrder&&e.mv.isBackground)return xs(e)}return(null==e?void 0:e.mv)?xs(e):null}(n,t,i)}Hp(t,i){f("left"===i?this.lp:this.ap).Yv(Gn({width:t,height:this.wv.height}))}$p(){return this.wv}Yv(t){Jn(this.wv,t)||(this.wv=t,this.Sv=!0,this.Av.resizeCanvasElement(t),this.Bv.resizeCanvasElement(t),this.Sv=!1,this.xp.style.width=t.width+"px",this.xp.style.height=t.height+"px")}Up(){const t=f(this.wp);t.x_(t.S_()),t.x_(t.y_());for(const i of t.Ta())if(t.dr(i)){const n=i.At();null!==n&&t.x_(n),i.On()}}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Zv(t){if(0===t)return;if(null===this.wp)return;if(t>1&&this.Up(),null!==this.lp&&this.lp.Zv(t),null!==this.ap&&this.ap.Zv(t),1!==t){this.Av.applySuggestedBitmapSize();const t=ss(this.Av);null!==t&&(t.useBitmapCoordinateSpace((t=>{this.Jv(t)})),this.wp&&(this.qp(t,Cs),this.Yp(t),this.Xp(t),this.qp(t,Ts),this.qp(t,Ps)))}this.Bv.applySuggestedBitmapSize();const i=ss(this.Bv);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.Kp(i),this.qp(i,Rs))}Zp(){return this.lp}Gp(){return this.ap}Qv(t,i){this.qp(t,i)}Mp(){null!==this.wp&&this.wp.z_().p(this),this.wp=null}Vp(t){this.zp(this.up,t)}zp(t,i){const n=i.localX,s=i.localY;t.M()&&t.m(this.Ui().kt().Bu(n),{x:n,y:s},i)}Jv({context:t,bitmapSize:i}){const{width:n,height:s}=i,e=this.Ui(),r=e.q(),h=e.od();r===h?Y(t,0,0,n,s,h):G(t,0,0,n,s,r,h)}Yp(t){const i=f(this.wp).E_().Wh().xt();null!==i&&i.K(t,!1)}Xp(t){const i=this.Ui().Nc();this.Jp(t,Ts,cs,i),this.Jp(t,Ts,ds,i)}Kp(t){this.Jp(t,Ts,ds,this.Ui().Fc())}qp(t,i){const n=f(this.wp).No();for(const s of n)this.Jp(t,i,cs,s);for(const s of n)this.Jp(t,i,ds,s)}Jp(t,i,n,s){const e=f(this.wp),r=e.qt().Bc(),h=null!==r&&r.zc===s,l=null!==r&&h&&void 0!==r.pv?r.pv.gr:void 0;fs(i,(i=>n(i,t,h,l)),s,e)}Pp(){if(null===this.wp)return;const t=this.gp,i=this.wp.S_().W().visible,n=this.wp.y_().W().visible;i||null===this.lp||(this.Sp.removeChild(this.lp.jv()),this.lp.S(),this.lp=null),n||null===this.ap||(this.yp.removeChild(this.ap.jv()),this.ap.S(),this.ap=null);const s=t.qt().sd();i&&null===this.lp&&(this.lp=new ks(this,t.W(),s,"left"),this.Sp.appendChild(this.lp.jv())),n&&null===this.ap&&(this.ap=new ks(this,t.W(),s,"right"),this.yp.appendChild(this.ap.jv()))}Qp(t){return t.uv&&this.fp||null!==this.vp}tm(t){return Math.max(0,Math.min(t,this.wv.width-1))}im(t){return Math.max(0,Math.min(t,this.wv.height-1))}Op(t,i,n){this.Ui().Jc(this.tm(t),this.im(i),n,f(this.wp))}Np(){this.Ui().td()}jp(){this.pp&&(this.vp=null,this.Np())}Lp(t,i,n){this.vp=t,this.pp=!1,this.Op(i.x,i.y,n);const s=this.Ui().Fc();this.mp={x:s.Kt(),y:s.Zt()}}Ui(){return this.gp.qt()}Ip(t){if(!this._p)return;const i=this.Ui(),n=this.Kv();if(i.D_(n,n.vn()),this.op=null,this._p=!1,i.Kc(),null!==this.bp){const t=performance.now(),n=i.kt();this.bp.Dr(n.Iu(),t),this.bp.Yu(t)||i.Xn(this.bp)}}Dp(){this.vp=null}Ap(){if(!this.wp)return;if(this.Ui().Un(),document.activeElement!==document.body&&document.activeElement!==document.documentElement)f(document.activeElement).blur();else{const t=document.getSelection();null!==t&&t.removeAllRanges()}!this.wp.vn().Fi()&&this.Ui().kt().Fi()}Ep(t){if(null===this.wp)return;const i=this.Ui(),n=i.kt();if(n.Fi())return;const s=this.gp.W(),e=s.handleScroll,r=s.kineticScroll;if((!e.pressedMouseMove||t.uv)&&(!e.horzTouchDrag&&!e.vertTouchDrag||!t.uv))return;const h=this.wp.vn(),l=performance.now();if(null!==this.op||this.Qp(t)||(this.op={x:t.clientX,y:t.clientY,yd:l,nm:t.localX,sm:t.localY}),null!==this.op&&!this._p&&(this.op.x!==t.clientX||this.op.y!==t.clientY)){if(t.uv&&r.touch||!t.uv&&r.mouse){const t=n.he();this.bp=new _s(.2/t,7/t,.997,15/t),this.bp.Nd(n.Iu(),this.op.yd)}else this.bp=null;h.Fi()||i.P_(this.wp,h,t.localY),i.Yc(t.localX),this._p=!0}this._p&&(h.Fi()||i.R_(this.wp,h,t.localY),i.Xc(t.localX),null!==this.bp&&this.bp.Nd(n.Iu(),l))}}class Os{constructor(t,i,n,s,e){this.bt=!0,this.wv=Gn({width:0,height:0}),this.yv=()=>this.Zv(3),this.Tv="left"===t,this.yc=n.sd,this.cn=i,this.rm=s,this.hm=e,this.Ov=document.createElement("div"),this.Ov.style.width="25px",this.Ov.style.height="100%",this.Ov.style.overflow="hidden",this.Av=us(this.Ov,Gn({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.yv)}S(){this.Av.unsubscribeSuggestedBitmapSizeChanged(this.yv),this.Av.dispose()}jv(){return this.Ov}$p(){return this.wv}Yv(t){Jn(this.wv,t)||(this.wv=t,this.Av.resizeCanvasElement(t),this.Ov.style.width=`${t.width}px`,this.Ov.style.height=`${t.height}px`,this.bt=!0)}Zv(t){if(t<3&&!this.bt)return;if(0===this.wv.width||0===this.wv.height)return;this.bt=!1,this.Av.applySuggestedBitmapSize();const i=ss(this.Av);null!==i&&i.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Ve(t)}))}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Ve({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(!this.rm())return;t.fillStyle=this.cn.timeScale.borderColor;const e=Math.floor(this.yc.W().C*n),r=Math.floor(this.yc.W().C*s),h=this.Tv?i.width-e:0;t.fillRect(h,0,e,r)}Jv({context:t,bitmapSize:i}){Y(t,0,0,i.width,i.height,this.hm())}}function As(t){return i=>{var n,s;return null!==(s=null===(n=i.aa)||void 0===n?void 0:n.call(i,t))&&void 0!==s?s:[]}}const Bs=As("normal"),Vs=As("top"),zs=As("bottom");class Es{constructor(t,i){this.lm=null,this.am=null,this.k=null,this.om=!1,this.wv=Gn({width:0,height:0}),this._m=new k,this.Mv=new Qt(5),this.Sv=!1,this.yv=()=>{this.Sv||this.gp.qt().Fh()},this.Cv=()=>{this.Sv||this.gp.qt().Fh()},this.gp=t,this.N_=i,this.cn=t.W().layout,this.um=document.createElement("tr"),this.dm=document.createElement("td"),this.dm.style.padding="0",this.fm=document.createElement("td"),this.fm.style.padding="0",this.Ov=document.createElement("td"),this.Ov.style.height="25px",this.Ov.style.padding="0",this.vm=document.createElement("div"),this.vm.style.width="100%",this.vm.style.height="100%",this.vm.style.position="relative",this.vm.style.overflow="hidden",this.Ov.appendChild(this.vm),this.Av=us(this.vm,Gn({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.yv);const n=this.Av.canvasElement;n.style.position="absolute",n.style.zIndex="1",n.style.left="0",n.style.top="0",this.Bv=us(this.vm,Gn({width:16,height:16})),this.Bv.subscribeSuggestedBitmapSizeChanged(this.Cv);const s=this.Bv.canvasElement;s.style.position="absolute",s.style.zIndex="2",s.style.left="0",s.style.top="0",this.um.appendChild(this.dm),this.um.appendChild(this.Ov),this.um.appendChild(this.fm),this.pm(),this.gp.qt().f_().l(this.pm.bind(this),this),this.Wv=new ps(this.Bv.canvasElement,this,{Nf:()=>!0,Ff:()=>!this.gp.W().handleScroll.horzTouchDrag})}S(){this.Wv.S(),null!==this.lm&&this.lm.S(),null!==this.am&&this.am.S(),this.Bv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Bv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.yv),this.Av.dispose()}jv(){return this.um}bm(){return this.lm}wm(){return this.am}Qf(t){if(this.om)return;this.om=!0;const i=this.gp.qt();!i.kt().Fi()&&this.gp.W().handleScale.axisPressedMouseMove.time&&i.$c(t.localX)}Gf(t){this.Qf(t)}tv(){const t=this.gp.qt();!t.kt().Fi()&&this.om&&(this.om=!1,this.gp.W().handleScale.axisPressedMouseMove.time&&t.Gc())}Hf(t){const i=this.gp.qt();!i.kt().Fi()&&this.gp.W().handleScale.axisPressedMouseMove.time&&i.Zc(t.localX)}Wf(t){this.Hf(t)}Yf(){this.om=!1;const t=this.gp.qt();t.kt().Fi()&&!this.gp.W().handleScale.axisPressedMouseMove.time||t.Gc()}Uf(){this.Yf()}Tf(){this.gp.W().handleScale.axisDoubleClickReset.time&&this.gp.qt().Zn()}Sf(){this.Tf()}Vf(){this.gp.qt().W().handleScale.axisPressedMouseMove.time&&this.rp(1)}ov(){this.rp(0)}$p(){return this.wv}gm(){return this._m}Mm(t,i,n){Jn(this.wv,t)||(this.wv=t,this.Sv=!0,this.Av.resizeCanvasElement(t),this.Bv.resizeCanvasElement(t),this.Sv=!1,this.Ov.style.width=`${t.width}px`,this.Ov.style.height=`${t.height}px`,this._m.m(t)),null!==this.lm&&this.lm.Yv(Gn({width:i,height:t.height})),null!==this.am&&this.am.Yv(Gn({width:n,height:t.height}))}xm(){const t=this.Sm();return Math.ceil(t.C+t.T+t.P+t.L+t.B+t.ym)}gt(){this.gp.qt().kt().Ia()}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Zv(t){if(0===t)return;if(1!==t){this.Av.applySuggestedBitmapSize();const i=ss(this.Av);null!==i&&(i.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Ve(t),this.km(i,zs)})),this.tp(i),this.km(i,Bs)),null!==this.lm&&this.lm.Zv(t),null!==this.am&&this.am.Zv(t)}this.Bv.applySuggestedBitmapSize();const i=ss(this.Bv);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.Cm([...this.gp.qt().Mt(),this.gp.qt().Fc()],i),this.km(i,Vs))}km(t,i){const n=this.gp.qt().Mt();for(const s of n)fs(i,(i=>cs(i,t,!1,void 0)),s,void 0);for(const s of n)fs(i,(i=>ds(i,t,!1,void 0)),s,void 0)}Jv({context:t,bitmapSize:i}){Y(t,0,0,i.width,i.height,this.gp.qt().od())}Ve({context:t,bitmapSize:i,verticalPixelRatio:n}){if(this.gp.W().timeScale.borderVisible){t.fillStyle=this.Tm();const s=Math.max(1,Math.floor(this.Sm().C*n));t.fillRect(0,0,i.width,s)}}tp(t){const i=this.gp.qt().kt(),n=i.Ia();if(!n||0===n.length)return;const s=this.N_.maxTickMarkWeight(n),e=this.Sm(),r=i.W();r.borderVisible&&r.ticksVisible&&t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:i,verticalPixelRatio:s})=>{t.strokeStyle=this.Tm(),t.fillStyle=this.Tm();const r=Math.max(1,Math.floor(i)),h=Math.floor(.5*i);t.beginPath();const l=Math.round(e.T*s);for(let s=n.length;s--;){const e=Math.round(n[s].coord*i);t.rect(e-h,0,r,l)}t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{const i=e.C+e.T+e.L+e.P/2;t.textAlign="center",t.textBaseline="middle",t.fillStyle=this.$(),t.font=this.Uv();for(const e of n)if(e.weight=s){const n=e.needAlignCoordinate?this.Pm(t,e.coord,e.label):e.coord;t.fillText(e.label,n,i)}}))}Pm(t,i,n){const s=this.Mv.Si(t,n),e=s/2,r=Math.floor(i-e)+.5;return r<0?i+=Math.abs(0-r):r+s>this.wv.width&&(i-=Math.abs(this.wv.width-(r+s))),i}Cm(t,i){const n=this.Sm();for(const s of t)for(const t of s.tn())t.xt().K(i,n)}Tm(){return this.gp.W().timeScale.borderColor}$(){return this.cn.textColor}j(){return this.cn.fontSize}Uv(){return z(this.j(),this.cn.fontFamily)}Rm(){return z(this.j(),this.cn.fontFamily,"bold")}Sm(){null===this.k&&(this.k={C:1,N:NaN,L:NaN,B:NaN,Hi:NaN,T:5,P:NaN,R:"",ji:new Qt,ym:0});const t=this.k,i=this.Uv();if(t.R!==i){const n=this.j();t.P=n,t.R=i,t.L=3*n/12,t.B=3*n/12,t.Hi=9*n/12,t.N=0,t.ym=4*n/12,t.ji.ir()}return this.k}rp(t){this.Ov.style.cursor=1===t?"ew-resize":"default"}pm(){const t=this.gp.qt(),i=t.W();i.leftPriceScale.visible||null===this.lm||(this.dm.removeChild(this.lm.jv()),this.lm.S(),this.lm=null),i.rightPriceScale.visible||null===this.am||(this.fm.removeChild(this.am.jv()),this.am.S(),this.am=null);const n={sd:this.gp.qt().sd()},s=()=>i.leftPriceScale.borderVisible&&t.kt().W().borderVisible,e=()=>t.od();i.leftPriceScale.visible&&null===this.lm&&(this.lm=new Os("left",i,n,s,e),this.dm.appendChild(this.lm.jv())),i.rightPriceScale.visible&&null===this.am&&(this.am=new Os("right",i,n,s,e),this.fm.appendChild(this.am.jv()))}}const Is=!!es&&!!navigator.userAgentData&&navigator.userAgentData.brands.some((t=>t.brand.includes("Chromium")))&&!!es&&((null===(Ls=null===navigator||void 0===navigator?void 0:navigator.userAgentData)||void 0===Ls?void 0:Ls.platform)?"Windows"===navigator.userAgentData.platform:navigator.userAgent.toLowerCase().indexOf("win")>=0);var Ls;class Ns{constructor(t,i,n){var s;this.Dm=[],this.Om=0,this.Qa=0,this.e_=0,this.Am=0,this.Bm=0,this.Vm=null,this.zm=!1,this.up=new k,this.cp=new k,this.Mc=new k,this.Em=null,this.Im=null,this.Lm=t,this.cn=i,this.N_=n,this.um=document.createElement("div"),this.um.classList.add("tv-lightweight-charts"),this.um.style.overflow="hidden",this.um.style.direction="ltr",this.um.style.width="100%",this.um.style.height="100%",(s=this.um).style.userSelect="none",s.style.webkitUserSelect="none",s.style.msUserSelect="none",s.style.MozUserSelect="none",s.style.webkitTapHighlightColor="transparent",this.Nm=document.createElement("table"),this.Nm.setAttribute("cellspacing","0"),this.um.appendChild(this.Nm),this.Fm=this.Wm.bind(this),Fs(this.cn)&&this.jm(!0),this.Ui=new An(this.Sc.bind(this),this.cn,n),this.qt().Wc().l(this.Hm.bind(this),this),this.$m=new Es(this,this.N_),this.Nm.appendChild(this.$m.jv());const e=i.autoSize&&this.Um();let r=this.cn.width,h=this.cn.height;if(e||0===r||0===h){const i=t.getBoundingClientRect();r=r||i.width,h=h||i.height}this.qm(r,h),this.Ym(),t.appendChild(this.um),this.Xm(),this.Ui.kt().Gu().l(this.Ui.$l.bind(this.Ui),this),this.Ui.f_().l(this.Ui.$l.bind(this.Ui),this)}qt(){return this.Ui}W(){return this.cn}Km(){return this.Dm}Zm(){return this.$m}S(){this.jm(!1),0!==this.Om&&window.cancelAnimationFrame(this.Om),this.Ui.Wc().p(this),this.Ui.kt().Gu().p(this),this.Ui.f_().p(this),this.Ui.S();for(const t of this.Dm)this.Nm.removeChild(t.jv()),t.Fp().p(this),t.Wp().p(this),t.S();this.Dm=[],f(this.$m).S(),null!==this.um.parentElement&&this.um.parentElement.removeChild(this.um),this.Mc.S(),this.up.S(),this.cp.S(),this.Gm()}qm(t,i,n=!1){if(this.Qa===i&&this.e_===t)return;const s=function(t){const i=Math.floor(t.width),n=Math.floor(t.height);return Gn({width:i-i%2,height:n-n%2})}(Gn({width:t,height:i}));this.Qa=s.height,this.e_=s.width;const e=this.Qa+"px",r=this.e_+"px";f(this.um).style.height=e,f(this.um).style.width=r,this.Nm.style.height=e,this.Nm.style.width=r,n?this.Jm(at.es(),performance.now()):this.Ui.$l()}Zv(t){void 0===t&&(t=at.es());for(let i=0;i{let s=0;for(let e=0;e{f("left"===i?this.$m.bm():this.$m.wm()).ep(f(t),n,s)};if(this.cn.timeScale.visible){const i=this.$m.sp();if(null!==t){let e=0;this.sb()&&(r("left",e,n),e=f(s.Zp()).sp().width),this.$m.ep(t,e,n),e+=i.width,this.eb()&&r("right",e,n)}n+=i.height}return Gn({width:i,height:n})}ob(){let t=0,i=0,n=0;for(const s of this.Dm)this.sb()&&(i=Math.max(i,f(s.Zp()).$v(),this.cn.leftPriceScale.minimumWidth)),this.eb()&&(n=Math.max(n,f(s.Gp()).$v(),this.cn.rightPriceScale.minimumWidth)),t+=s.v_();i=ls(i),n=ls(n);const s=this.e_,e=this.Qa,r=Math.max(s-i-n,0),h=this.cn.timeScale.visible;let l=h?Math.max(this.$m.xm(),this.cn.timeScale.minimumHeight):0;var a;l=(a=l)+a%2;const o=0+l,_=e{t.Rp()})),3===(null===(n=this.Vm)||void 0===n?void 0:n.jn())&&(this.Vm.ts(t),this.ub(),this.cb(this.Vm),this.fb(this.Vm,i),t=this.Vm,this.Vm=null)),this.Zv(t)}fb(t,i){for(const n of t.Qn())this.ns(n,i)}cb(t){const i=this.Ui.Lc();for(let n=0;n{if(this.zm=!1,this.Om=0,null!==this.Vm){const i=this.Vm;this.Vm=null,this.Jm(i,t);for(const n of i.Qn())if(5===n.qn&&!n.Bt.Yu(t)){this.qt().Xn(n.Bt);break}}})))}ub(){this.Ym()}Ym(){const t=this.Ui.Lc(),i=t.length,n=this.Dm.length;for(let t=i;t{const n=i.zn().nl(t);null!==n&&e.set(i,n)}))}let r;if(null!==t){const i=null===(s=this.Ui.kt().qi(t))||void 0===s?void 0:s.originalTime;void 0!==i&&(r=i)}const h=this.qt().Bc(),l=null!==h&&h.zc instanceof Yi?h.zc:void 0,a=null!==h&&void 0!==h.pv?h.pv.wr:void 0;return{bb:r,se:null!=t?t:void 0,wb:null!=i?i:void 0,gb:l,Mb:e,xb:a,Sb:null!=n?n:void 0}}vb(t,i,n){this.up.m((()=>this.mb(t,i,n)))}pb(t,i,n){this.cp.m((()=>this.mb(t,i,n)))}Hm(t,i,n){this.Mc.m((()=>this.mb(t,i,n)))}Xm(){const t=this.cn.timeScale.visible?"":"none";this.$m.jv().style.display=t}sb(){return this.Dm[0].Kv().S_().W().visible}eb(){return this.Dm[0].Kv().y_().W().visible}Um(){return"ResizeObserver"in window&&(this.Em=new ResizeObserver((t=>{const i=t.find((t=>t.target===this.Lm));i&&this.qm(i.contentRect.width,i.contentRect.height)})),this.Em.observe(this.Lm,{box:"border-box"}),!0)}Gm(){null!==this.Em&&this.Em.disconnect(),this.Em=null}}function Fs(t){return Boolean(t.handleScroll.mouseWheel||t.handleScale.mouseWheel)}function Ws(t,i){var n={};for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&i.indexOf(s)<0&&(n[s]=t[s]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var e=0;for(s=Object.getOwnPropertySymbols(t);efunction(t,i){return i?i(t):void 0===(n=t).open&&void 0===n.value;var n}(s,h)?Ks({ut:i,se:n,bb:e},s):Ks(t(i,n,s,e,r),s)}function Gs(t){return{Candlestick:Zs(qs),Bar:Zs(Us),Area:Zs(Hs),Baseline:Zs($s),Histogram:Zs(js),Line:Zs(js),Custom:Zs(Ys)}[t]}function Js(t){return{se:0,kb:new Map,ia:t}}function Qs(t,i){if(void 0!==t&&0!==t.length)return{Cb:i.key(t[0].ut),Tb:i.key(t[t.length-1].ut)}}function te(t){let i;return t.forEach((t=>{void 0===i&&(i=t.bb)})),d(i)}class ie{constructor(t){this.Pb=new Map,this.Rb=new Map,this.Db=new Map,this.Ob=[],this.N_=t}S(){this.Pb.clear(),this.Rb.clear(),this.Db.clear(),this.Ob=[]}Ab(t,i){let n=0!==this.Pb.size,s=!1;const e=this.Rb.get(t);if(void 0!==e)if(1===this.Rb.size)n=!1,s=!0,this.Pb.clear();else for(const i of this.Ob)i.pointData.kb.delete(t)&&(s=!0);let r=[];if(0!==i.length){const n=i.map((t=>t.time)),e=this.N_.createConverterToInternalObj(i),h=Gs(t.Xh()),l=t.ga(),a=t.Ma();r=i.map(((i,r)=>{const o=e(i.time),_=this.N_.key(o);let u=this.Pb.get(_);void 0===u&&(u=Js(o),this.Pb.set(_,u),s=!0);const c=h(o,u.se,i,n[r],l,a);return u.kb.set(t,c),c}))}n&&this.Bb(),this.Vb(t,r);let h=-1;if(s){const t=[];this.Pb.forEach((i=>{t.push({timeWeight:0,time:i.ia,pointData:i,originalTime:te(i.kb)})})),t.sort(((t,i)=>this.N_.key(t.time)-this.N_.key(i.time))),h=this.zb(t)}return this.Eb(t,h,function(t,i,n){const s=Qs(t,n),e=Qs(i,n);if(void 0!==s&&void 0!==e)return{Xl:s.Tb>=e.Tb&&s.Cb>=e.Cb}}(this.Rb.get(t),e,this.N_))}hd(t){return this.Ab(t,[])}Ib(t,i){const n=i;!function(t){void 0===t.bb&&(t.bb=t.time)}(n),this.N_.preprocessData(i);const s=this.N_.createConverterToInternalObj([i])(i.time),e=this.Db.get(t);if(void 0!==e&&this.N_.key(s)this.N_.key(t.time)this.N_.key(s.ut)?Xs(i)&&n.push(i):Xs(i)?n[n.length-1]=i:n.splice(-1,1),this.Db.set(t,i.ut)}Vb(t,i){0!==i.length?(this.Rb.set(t,i.filter(Xs)),this.Db.set(t,i[i.length-1].ut)):(this.Rb.delete(t),this.Db.delete(t))}Bb(){for(const t of this.Ob)0===t.pointData.kb.size&&this.Pb.delete(this.N_.key(t.time))}zb(t){let i=-1;for(let n=0;n{0!==i.length&&(t=Math.max(t,i[i.length-1].se))})),t}Eb(t,i,n){const s={Fb:new Map,kt:{Au:this.Nb()}};if(-1!==i)this.Rb.forEach(((i,e)=>{s.Fb.set(e,{He:i,Wb:e===t?n:void 0})})),this.Rb.has(t)||s.Fb.set(t,{He:[],Wb:n}),s.kt.jb=this.Ob,s.kt.Hb=i;else{const i=this.Rb.get(t);s.Fb.set(t,{He:i||[],Wb:n})}return s}}function ne(t,i){t.se=i,t.kb.forEach((t=>{t.se=i}))}function se(t){const i={value:t.Bt[3],time:t.bb};return void 0!==t.yb&&(i.customValues=t.yb),i}function ee(t){const i=se(t);return void 0!==t.O&&(i.color=t.O),i}function re(t){const i=se(t);return void 0!==t._t&&(i.lineColor=t._t),void 0!==t.Ts&&(i.topColor=t.Ts),void 0!==t.Ps&&(i.bottomColor=t.Ps),i}function he(t){const i=se(t);return void 0!==t.Pe&&(i.topLineColor=t.Pe),void 0!==t.Re&&(i.bottomLineColor=t.Re),void 0!==t.Se&&(i.topFillColor1=t.Se),void 0!==t.ye&&(i.topFillColor2=t.ye),void 0!==t.ke&&(i.bottomFillColor1=t.ke),void 0!==t.Ce&&(i.bottomFillColor2=t.Ce),i}function le(t){const i={open:t.Bt[0],high:t.Bt[1],low:t.Bt[2],close:t.Bt[3],time:t.bb};return void 0!==t.yb&&(i.customValues=t.yb),i}function ae(t){const i=le(t);return void 0!==t.O&&(i.color=t.O),i}function oe(t){const i=le(t),{O:n,Vt:s,$h:e}=t;return void 0!==n&&(i.color=n),void 0!==s&&(i.borderColor=s),void 0!==e&&(i.wickColor=e),i}function _e(t){return{Area:re,Line:ee,Baseline:he,Histogram:ee,Bar:ae,Candlestick:oe,Custom:ue}[t]}function ue(t){const i=t.bb;return Object.assign(Object.assign({},t.He),{time:i})}const ce={vertLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},horzLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},mode:1},de={vertLines:{color:"#D6DCDE",style:0,visible:!0},horzLines:{color:"#D6DCDE",style:0,visible:!0}},fe={background:{type:"solid",color:"#FFFFFF"},textColor:"#191919",fontSize:12,fontFamily:V},ve={autoScale:!0,mode:0,invertScale:!1,alignLabels:!0,borderVisible:!0,borderColor:"#2B2B43",entireTextOnly:!1,visible:!1,ticksVisible:!1,scaleMargins:{bottom:.1,top:.2},minimumWidth:0},pe={rightOffset:0,barSpacing:6,minBarSpacing:.5,fixLeftEdge:!1,fixRightEdge:!1,lockVisibleTimeRangeOnResize:!1,rightBarStaysOnScroll:!1,borderVisible:!0,borderColor:"#2B2B43",visible:!0,timeVisible:!1,secondsVisible:!0,shiftVisibleRangeOnNewBar:!0,allowShiftVisibleRangeOnWhitespaceReplacement:!1,ticksVisible:!1,uniformDistribution:!1,minimumHeight:0},me={color:"rgba(0, 0, 0, 0)",visible:!1,fontSize:48,fontFamily:V,fontStyle:"",text:"",horzAlign:"center",vertAlign:"center"};function be(){return{width:0,height:0,autoSize:!1,layout:fe,crosshair:ce,grid:de,overlayPriceScales:Object.assign({},ve),leftPriceScale:Object.assign(Object.assign({},ve),{visible:!1}),rightPriceScale:Object.assign(Object.assign({},ve),{visible:!0}),timeScale:pe,watermark:me,localization:{locale:es?navigator.language:"",dateFormat:"dd MMM 'yy"},handleScroll:{mouseWheel:!0,pressedMouseMove:!0,horzTouchDrag:!0,vertTouchDrag:!0},handleScale:{axisPressedMouseMove:{time:!0,price:!0},axisDoubleClickReset:{time:!0,price:!0},mouseWheel:!0,pinch:!0},kineticScroll:{mouse:!1,touch:!0},trackingMode:{exitMode:1}}}class we{constructor(t,i){this.$b=t,this.Ub=i}applyOptions(t){this.$b.qt().Ec(this.Ub,t)}options(){return this.Li().W()}width(){return lt(this.Ub)?this.$b.nb(this.Ub):0}Li(){return f(this.$b.qt().Ic(this.Ub)).At}}function ge(t,i,n){const s=Ws(t,["time","originalTime"]),e=Object.assign({time:i},s);return void 0!==n&&(e.originalTime=n),e}const Me={color:"#FF0000",price:0,lineStyle:2,lineWidth:1,lineVisible:!0,axisLabelVisible:!0,title:"",axisLabelColor:"",axisLabelTextColor:""};class xe{constructor(t){this.Vh=t}applyOptions(t){this.Vh.Nh(t)}options(){return this.Vh.W()}qb(){return this.Vh}}class Se{constructor(t,i,n,s,e){this.Yb=new k,this.Is=t,this.Xb=i,this.Kb=n,this.N_=e,this.Zb=s}S(){this.Yb.S()}priceFormatter(){return this.Is.ca()}priceToCoordinate(t){const i=this.Is.Pt();return null===i?null:this.Is.At().Ot(t,i.Bt)}coordinateToPrice(t){const i=this.Is.Pt();return null===i?null:this.Is.At().pn(t,i.Bt)}barsInLogicalRange(t){if(null===t)return null;const i=new Mn(new bn(t.from,t.to)).iu(),n=this.Is.zn();if(n.Fi())return null;const s=n.nl(i.Os(),1),e=n.nl(i.di(),-1),r=f(n.Qh()),h=f(n.Vn());if(null!==s&&null!==e&&s.se>e.se)return{barsBefore:t.from-r,barsAfter:h-t.to};const l={barsBefore:null===s||s.se===r?t.from-r:s.se-r,barsAfter:null===e||e.se===h?h-t.to:h-e.se};return null!==s&&null!==e&&(l.from=s.bb,l.to=e.bb),l}setData(t){this.N_,this.Is.Xh(),this.Xb.Gb(this.Is,t),this.Jb("full")}update(t){this.Is.Xh(),this.Xb.Qb(this.Is,t),this.Jb("update")}dataByIndex(t,i){const n=this.Is.zn().nl(t,i);if(null===n)return null;return _e(this.seriesType())(n)}data(){const t=_e(this.seriesType());return this.Is.zn().ie().map((i=>t(i)))}subscribeDataChanged(t){this.Yb.l(t)}unsubscribeDataChanged(t){this.Yb.v(t)}setMarkers(t){this.N_;const i=t.map((t=>ge(t,this.N_.convertHorzItemToInternal(t.time),t.time)));this.Is.Zl(i)}markers(){return this.Is.Gl().map((t=>ge(t,t.originalTime,void 0)))}applyOptions(t){this.Is.Nh(t)}options(){return O(this.Is.W())}priceScale(){return this.Kb.priceScale(this.Is.At().xa())}createPriceLine(t){const i=C(O(Me),t),n=this.Is.Jl(i);return new xe(n)}removePriceLine(t){this.Is.Ql(t.qb())}seriesType(){return this.Is.Xh()}attachPrimitive(t){this.Is.ba(t),t.attached&&t.attached({chart:this.Zb,series:this,requestUpdate:()=>this.Is.qt().$l()})}detachPrimitive(t){this.Is.wa(t),t.detached&&t.detached()}Jb(t){this.Yb.M()&&this.Yb.m(t)}}class ye{constructor(t,i,n){this.tw=new k,this.uu=new k,this._m=new k,this.Ui=t,this.wl=t.kt(),this.$m=i,this.wl.Ku().l(this.iw.bind(this)),this.wl.Zu().l(this.nw.bind(this)),this.$m.gm().l(this.sw.bind(this)),this.N_=n}S(){this.wl.Ku().p(this),this.wl.Zu().p(this),this.$m.gm().p(this),this.tw.S(),this.uu.S(),this._m.S()}scrollPosition(){return this.wl.Iu()}scrollToPosition(t,i){i?this.wl.qu(t,1e3):this.Ui.Jn(t)}scrollToRealTime(){this.wl.Uu()}getVisibleRange(){const t=this.wl.ku();return null===t?null:{from:t.from.originalTime,to:t.to.originalTime}}setVisibleRange(t){const i={from:this.N_.convertHorzItemToInternal(t.from),to:this.N_.convertHorzItemToInternal(t.to)},n=this.wl.Ru(i);this.Ui.ld(n)}getVisibleLogicalRange(){const t=this.wl.yu();return null===t?null:{from:t.Os(),to:t.di()}}setVisibleLogicalRange(t){c(t.from<=t.to,"The from index cannot be after the to index."),this.Ui.ld(t)}resetTimeScale(){this.Ui.Zn()}fitContent(){this.Ui.Qu()}logicalToCoordinate(t){const i=this.Ui.kt();return i.Fi()?null:i.It(t)}coordinateToLogical(t){return this.wl.Fi()?null:this.wl.Bu(t)}timeToCoordinate(t){const i=this.N_.convertHorzItemToInternal(t),n=this.wl.ka(i,!1);return null===n?null:this.wl.It(n)}coordinateToTime(t){const i=this.Ui.kt(),n=i.Bu(t),s=i.qi(n);return null===s?null:s.originalTime}width(){return this.$m.$p().width}height(){return this.$m.$p().height}subscribeVisibleTimeRangeChange(t){this.tw.l(t)}unsubscribeVisibleTimeRangeChange(t){this.tw.v(t)}subscribeVisibleLogicalRangeChange(t){this.uu.l(t)}unsubscribeVisibleLogicalRangeChange(t){this.uu.v(t)}subscribeSizeChange(t){this._m.l(t)}unsubscribeSizeChange(t){this._m.v(t)}applyOptions(t){this.wl.Nh(t)}options(){return Object.assign(Object.assign({},O(this.wl.W())),{barSpacing:this.wl.he()})}iw(){this.tw.M()&&this.tw.m(this.getVisibleRange())}nw(){this.uu.M()&&this.uu.m(this.getVisibleLogicalRange())}sw(t){this._m.m(t.width,t.height)}}function ke(t){if(void 0===t||"custom"===t.type)return;const i=t;void 0!==i.minMove&&void 0===i.precision&&(i.precision=function(t){if(t>=1)return 0;let i=0;for(;i<8;i++){const n=Math.round(t);if(Math.abs(n-t)<1e-8)return i;t*=10}return i}(i.minMove))}function Ce(t){return function(t){if(D(t.handleScale)){const i=t.handleScale;t.handleScale={axisDoubleClickReset:{time:i,price:i},axisPressedMouseMove:{time:i,price:i},mouseWheel:i,pinch:i}}else if(void 0!==t.handleScale){const{axisPressedMouseMove:i,axisDoubleClickReset:n}=t.handleScale;D(i)&&(t.handleScale.axisPressedMouseMove={time:i,price:i}),D(n)&&(t.handleScale.axisDoubleClickReset={time:n,price:n})}const i=t.handleScroll;D(i)&&(t.handleScroll={horzTouchDrag:i,vertTouchDrag:i,mouseWheel:i,pressedMouseMove:i})}(t),t}class Te{constructor(t,i,n){this.ew=new Map,this.rw=new Map,this.hw=new k,this.lw=new k,this.aw=new k,this.ow=new ie(i);const s=void 0===n?O(be()):C(O(be()),Ce(n));this.N_=i,this.$b=new Ns(t,s,i),this.$b.Fp().l((t=>{this.hw.M()&&this.hw.m(this._w(t()))}),this),this.$b.Wp().l((t=>{this.lw.M()&&this.lw.m(this._w(t()))}),this),this.$b.Wc().l((t=>{this.aw.M()&&this.aw.m(this._w(t()))}),this);const e=this.$b.qt();this.uw=new ye(e,this.$b.Zm(),this.N_)}remove(){this.$b.Fp().p(this),this.$b.Wp().p(this),this.$b.Wc().p(this),this.uw.S(),this.$b.S(),this.ew.clear(),this.rw.clear(),this.hw.S(),this.lw.S(),this.aw.S(),this.ow.S()}resize(t,i,n){this.autoSizeActive()||this.$b.qm(t,i,n)}addCustomSeries(t,i){const n=v(t),s=Object.assign(Object.assign({},h),n.defaultOptions());return this.cw("Custom",s,i,n)}addAreaSeries(t){return this.cw("Area",s,t)}addBaselineSeries(t){return this.cw("Baseline",e,t)}addBarSeries(t){return this.cw("Bar",i,t)}addCandlestickSeries(i={}){return function(t){void 0!==t.borderColor&&(t.borderUpColor=t.borderColor,t.borderDownColor=t.borderColor),void 0!==t.wickColor&&(t.wickUpColor=t.wickColor,t.wickDownColor=t.wickColor)}(i),this.cw("Candlestick",t,i)}addHistogramSeries(t){return this.cw("Histogram",r,t)}addLineSeries(t){return this.cw("Line",n,t)}removeSeries(t){const i=d(this.ew.get(t)),n=this.ow.hd(i);this.$b.qt().hd(i),this.dw(n),this.ew.delete(t),this.rw.delete(i)}Gb(t,i){this.dw(this.ow.Ab(t,i))}Qb(t,i){this.dw(this.ow.Ib(t,i))}subscribeClick(t){this.hw.l(t)}unsubscribeClick(t){this.hw.v(t)}subscribeCrosshairMove(t){this.aw.l(t)}unsubscribeCrosshairMove(t){this.aw.v(t)}subscribeDblClick(t){this.lw.l(t)}unsubscribeDblClick(t){this.lw.v(t)}priceScale(t){return new we(this.$b,t)}timeScale(){return this.uw}applyOptions(t){this.$b.Nh(Ce(t))}options(){return this.$b.W()}takeScreenshot(){return this.$b.tb()}autoSizeActive(){return this.$b.rb()}chartElement(){return this.$b.hb()}paneSize(){const t=this.$b.ab();return{height:t.height,width:t.width}}setCrosshairPosition(t,i,n){const s=this.ew.get(n);if(void 0===s)return;const e=this.$b.qt().cr(s);null!==e&&this.$b.qt().Qc(t,i,e)}clearCrosshairPosition(){this.$b.qt().td(!0)}cw(t,i,n={},s){ke(n.priceFormat);const e=C(O(l),O(i),n),r=this.$b.qt().ed(t,e,s),h=new Se(r,this,this,this,this.N_);return this.ew.set(h,r),this.rw.set(r,h),h}dw(t){const i=this.$b.qt();i.nd(t.kt.Au,t.kt.jb,t.kt.Hb),t.Fb.forEach(((t,i)=>i.it(t.He,t.Wb))),i.zu()}fw(t){return d(this.rw.get(t))}_w(t){const i=new Map;t.Mb.forEach(((t,n)=>{const s=n.Xh(),e=_e(s)(t);if("Custom"!==s)c(function(t){return void 0!==t.open||void 0!==t.value}(e));else{const t=n.Ma();c(!t||!1===t(e))}i.set(this.fw(n),e)}));const n=void 0===t.gb?void 0:this.fw(t.gb);return{time:t.bb,logical:t.se,point:t.wb,hoveredSeries:n,hoveredObjectId:t.xb,seriesData:i,sourceEvent:t.Sb}}}function Pe(t,i,n){let s;if(R(t)){const i=document.getElementById(t);c(null!==i,`Cannot find element in DOM with id=${t}`),s=i}else s=t;const e=new Te(s,i,n);return i.setOptions(e.options()),e}const Re=Object.assign(Object.assign({},l),h);var De=Object.freeze({__proto__:null,get ColorType(){return Dn},get CrosshairMode(){return rt},get LastPriceAnimationMode(){return Pn},get LineStyle(){return o},get LineType(){return a},get MismatchDirection(){return Bi},get PriceLineSource(){return Rn},get PriceScaleMode(){return cn},get TickMarkType(){return On},get TrackingModeExitMode(){return Tn},createChart:function(t,i){return Pe(t,new Zn,Zn.Td(i))},createChartEx:Pe,customSeriesDefaultOptions:Re,isBusinessDay:Bn,isUTCTimestamp:Vn,version:function(){return"4.1.1"}});window.LightweightCharts=De}(); -+!function(){"use strict";const t={upColor:"#26a69a",downColor:"#ef5350",wickVisible:!0,borderVisible:!0,borderColor:"#378658",borderUpColor:"#26a69a",borderDownColor:"#ef5350",wickColor:"#737375",wickUpColor:"#26a69a",wickDownColor:"#ef5350"},i={upColor:"#26a69a",downColor:"#ef5350",openVisible:!0,thinBars:!0},n={color:"#2196f3",lineStyle:0,lineWidth:3,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},s={topColor:"rgba( 46, 220, 135, 0.4)",bottomColor:"rgba( 40, 221, 100, 0)",invertFilledArea:!1,lineColor:"#33D778",lineStyle:0,lineWidth:3,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},e={baseValue:{type:"price",price:0},topFillColor1:"rgba(38, 166, 154, 0.28)",topFillColor2:"rgba(38, 166, 154, 0.05)",topLineColor:"rgba(38, 166, 154, 1)",bottomFillColor1:"rgba(239, 83, 80, 0.05)",bottomFillColor2:"rgba(239, 83, 80, 0.28)",bottomLineColor:"rgba(239, 83, 80, 1)",lineWidth:3,lineStyle:0,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},r={color:"#26a69a",base:0},h={color:"#2196f3"},l={title:"",visible:!0,lastValueVisible:!0,priceLineVisible:!0,priceLineSource:0,priceLineWidth:1,priceLineColor:"",priceLineStyle:2,baseLineVisible:!0,baseLineWidth:1,baseLineColor:"#B2B5BE",baseLineStyle:0,priceFormat:{type:"price",precision:2,minMove:.01}};var a,o;function _(t,i){const n={0:[],1:[t.lineWidth,t.lineWidth],2:[2*t.lineWidth,2*t.lineWidth],3:[6*t.lineWidth,6*t.lineWidth],4:[t.lineWidth,4*t.lineWidth],5:[t.lineWidth,t.lineWidth]}[i];t.setLineDash(n)}function u(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(n,i+e),t.lineTo(s,i+e),t.stroke()}function c(t,i){if(!t)throw new Error("Assertion failed"+(i?": "+i:""))}function d(t){if(void 0===t)throw new Error("Value is undefined");return t}function f(t){if(null===t)throw new Error("Value is null");return t}function v(t){return f(d(t))}!function(t){t[t.Simple=0]="Simple",t[t.WithSteps=1]="WithSteps",t[t.Curved=2]="Curved"}(a||(a={})),function(t){t[t.Solid=0]="Solid",t[t.Dotted=1]="Dotted",t[t.Dashed=2]="Dashed",t[t.LargeDashed=3]="LargeDashed",t[t.SparseDotted=4]="SparseDotted",t[t.CustomDotGrid=5]="CustomDotGrid"}(o||(o={}));const p={khaki:"#f0e68c",azure:"#f0ffff",aliceblue:"#f0f8ff",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gainsboro:"#dcdcdc",gray:"#808080",green:"#008000",honeydew:"#f0fff0",floralwhite:"#fffaf0",lightblue:"#add8e6",lightcoral:"#f08080",lemonchiffon:"#fffacd",hotpink:"#ff69b4",lightyellow:"#ffffe0",greenyellow:"#adff2f",lightgoldenrodyellow:"#fafad2",limegreen:"#32cd32",linen:"#faf0e6",lightcyan:"#e0ffff",magenta:"#f0f",maroon:"#800000",olive:"#808000",orange:"#ffa500",oldlace:"#fdf5e6",mediumblue:"#0000cd",transparent:"#0000",lime:"#0f0",lightpink:"#ffb6c1",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",midnightblue:"#191970",orchid:"#da70d6",mediumorchid:"#ba55d3",mediumturquoise:"#48d1cc",orangered:"#ff4500",royalblue:"#4169e1",powderblue:"#b0e0e6",red:"#f00",coral:"#ff7f50",turquoise:"#40e0d0",white:"#fff",whitesmoke:"#f5f5f5",wheat:"#f5deb3",teal:"#008080",steelblue:"#4682b4",bisque:"#ffe4c4",aquamarine:"#7fffd4",aqua:"#0ff",sienna:"#a0522d",silver:"#c0c0c0",springgreen:"#00ff7f",antiquewhite:"#faebd7",burlywood:"#deb887",brown:"#a52a2a",beige:"#f5f5dc",chocolate:"#d2691e",chartreuse:"#7fff00",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cadetblue:"#5f9ea0",tomato:"#ff6347",fuchsia:"#f0f",blue:"#00f",salmon:"#fa8072",blanchedalmond:"#ffebcd",slateblue:"#6a5acd",slategray:"#708090",thistle:"#d8bfd8",tan:"#d2b48c",cyan:"#0ff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",blueviolet:"#8a2be2",black:"#000",darkmagenta:"#8b008b",darkslateblue:"#483d8b",darkkhaki:"#bdb76b",darkorchid:"#9932cc",darkorange:"#ff8c00",darkgreen:"#006400",darkred:"#8b0000",dodgerblue:"#1e90ff",darkslategray:"#2f4f4f",dimgray:"#696969",deepskyblue:"#00bfff",firebrick:"#b22222",forestgreen:"#228b22",indigo:"#4b0082",ivory:"#fffff0",lavenderblush:"#fff0f5",feldspar:"#d19275",indianred:"#cd5c5c",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightskyblue:"#87cefa",lightslategray:"#789",lightslateblue:"#8470ff",snow:"#fffafa",lightseagreen:"#20b2aa",lightsalmon:"#ffa07a",darksalmon:"#e9967a",darkviolet:"#9400d3",mediumpurple:"#9370d8",mediumaquamarine:"#66cdaa",skyblue:"#87ceeb",lavender:"#e6e6fa",lightsteelblue:"#b0c4de",mediumvioletred:"#c71585",mintcream:"#f5fffa",navajowhite:"#ffdead",navy:"#000080",olivedrab:"#6b8e23",palevioletred:"#d87093",violetred:"#d02090",yellow:"#ff0",yellowgreen:"#9acd32",lawngreen:"#7cfc00",pink:"#ffc0cb",paleturquoise:"#afeeee",palegoldenrod:"#eee8aa",darkolivegreen:"#556b2f",darkseagreen:"#8fbc8f",darkturquoise:"#00ced1",peachpuff:"#ffdab9",deeppink:"#ff1493",violet:"#ee82ee",palegreen:"#98fb98",mediumseagreen:"#3cb371",peru:"#cd853f",saddlebrown:"#8b4513",sandybrown:"#f4a460",rosybrown:"#bc8f8f",purple:"#800080",seagreen:"#2e8b57",seashell:"#fff5ee",papayawhip:"#ffefd5",mediumslateblue:"#7b68ee",plum:"#dda0dd",mediumspringgreen:"#00fa9a"};function m(t){return t<0?0:t>255?255:Math.round(t)||0}function b(t){return t<=0||t>0?t<0?0:t>1?1:Math.round(1e4*t)/1e4:0}const w=/^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,g=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,M=/^rgb\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*\)$/,x=/^rgba\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?[\d]{0,10}(?:\.\d+)?)\s*\)$/;function S(t){(t=t.toLowerCase())in p&&(t=p[t]);{const i=x.exec(t)||M.exec(t);if(i)return[m(parseInt(i[1],10)),m(parseInt(i[2],10)),m(parseInt(i[3],10)),b(i.length<5?1:parseFloat(i[4]))]}{const i=g.exec(t);if(i)return[m(parseInt(i[1],16)),m(parseInt(i[2],16)),m(parseInt(i[3],16)),1]}{const i=w.exec(t);if(i)return[m(17*parseInt(i[1],16)),m(17*parseInt(i[2],16)),m(17*parseInt(i[3],16)),1]}throw new Error(`Cannot parse color: ${t}`)}function y(t){const i=S(t);return{t:`rgb(${i[0]}, ${i[1]}, ${i[2]})`,i:(n=i,.199*n[0]+.687*n[1]+.114*n[2]>160?"black":"white")};var n}class k{constructor(){this.h=[]}l(t,i,n){const s={o:t,_:i,u:!0===n};this.h.push(s)}v(t){const i=this.h.findIndex((i=>t===i.o));i>-1&&this.h.splice(i,1)}p(t){this.h=this.h.filter((i=>i._!==t))}m(t,i,n){const s=[...this.h];this.h=this.h.filter((t=>!t.u)),s.forEach((s=>s.o(t,i,n)))}M(){return this.h.length>0}S(){this.h=[]}}function C(t,...i){for(const n of i)for(const i in n)void 0!==n[i]&&("object"!=typeof n[i]||void 0===t[i]||Array.isArray(n[i])?t[i]=n[i]:C(t[i],n[i]));return t}function T(t){return"number"==typeof t&&isFinite(t)}function P(t){return"number"==typeof t&&t%1==0}function R(t){return"string"==typeof t}function D(t){return"boolean"==typeof t}function O(t){const i=t;if(!i||"object"!=typeof i)return i;let n,s,e;for(s in n=Array.isArray(i)?[]:{},i)i.hasOwnProperty(s)&&(e=i[s],n[s]=e&&"object"==typeof e?O(e):e);return n}function A(t){return null!==t}function B(t){return null===t?void 0:t}const V="-apple-system, BlinkMacSystemFont, 'Trebuchet MS', Roboto, Ubuntu, sans-serif";function z(t,i,n){return void 0===i&&(i=V),`${n=void 0!==n?`${n} `:""}${t}px ${i}`}class E{constructor(t){this.k={C:1,T:5,P:NaN,R:"",D:"",O:"",A:"",B:0,V:0,I:0,L:0,N:0},this.F=t}W(){const t=this.k,i=this.j(),n=this.H();return t.P===i&&t.D===n||(t.P=i,t.D=n,t.R=z(i,n),t.L=2.5/12*i,t.B=t.L,t.V=i/12*t.T,t.I=i/12*t.T,t.N=0),t.O=this.$(),t.A=this.U(),this.k}$(){return this.F.W().layout.textColor}U(){return this.F.q()}j(){return this.F.W().layout.fontSize}H(){return this.F.W().layout.fontFamily}}class I{constructor(){this.Y=[]}X(t){this.Y=t}K(t,i,n){this.Y.forEach((s=>{s.K(t,i,n)}))}}class L{K(t,i,n){t.useMediaCoordinateSpace((t=>this.Z(t,i,n)))}G(t,i,n){t.useMediaCoordinateSpace((t=>this.J(t,i,n)))}J(t,i,n){}}class N extends L{constructor(){super(...arguments),this.tt=null}it(t){this.tt=t}Z({context:t}){if(null===this.tt||null===this.tt.nt)return;const i=this.tt.nt,n=this.tt,s=s=>{t.beginPath();for(let e=i.to-1;e>=i.from;--e){const i=n.st[e];t.moveTo(i.et,i.rt),t.arc(i.et,i.rt,s,0,2*Math.PI)}t.fill()};n.ht>0&&(t.fillStyle=n.lt,s(n.ot+n.ht)),t.fillStyle=n._t,s(n.ot)}}function F(){return{st:[{et:0,rt:0,ut:0,ct:0}],_t:"",lt:"",ot:0,ht:0,nt:null}}const W={from:0,to:1};class j{constructor(t,i){this.dt=new I,this.ft=[],this.vt=[],this.bt=!0,this.F=t,this.wt=i,this.dt.X(this.ft)}gt(t){const i=this.F.Mt();i.length!==this.ft.length&&(this.vt=i.map(F),this.ft=this.vt.map((t=>{const i=new N;return i.it(t),i})),this.dt.X(this.ft)),this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.dt}St(){const t=2===this.wt.W().mode,i=this.F.Mt(),n=this.wt.yt(),s=this.F.kt();i.forEach(((i,e)=>{var r;const h=this.vt[e],l=i.Ct(n);if(t||null===l||!i.Tt())return void(h.nt=null);const a=f(i.Pt());h._t=l.Rt,h.ot=l.ot,h.ht=l.Dt,h.st[0].ct=l.ct,h.st[0].rt=i.At().Ot(l.ct,a.Bt),h.lt=null!==(r=l.Vt)&&void 0!==r?r:this.F.zt(h.st[0].rt/i.At().Et()),h.st[0].ut=n,h.st[0].et=s.It(n),h.nt=W}))}}class H{K(t,i,n){t.useBitmapCoordinateSpace((t=>this.Z(t,i,n)))}}class $ extends H{constructor(t){super(),this.Lt=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;const e=this.Lt.Nt.Tt,r=this.Lt.Ft.Tt;if(!e&&!r)return;const h=Math.round(this.Lt.et*n),l=Math.round(this.Lt.rt*s);t.lineCap="butt",e&&h>=0&&(t.lineWidth=Math.floor(this.Lt.Nt.ht*n),t.strokeStyle=this.Lt.Nt.O,t.fillStyle=this.Lt.Nt.O,_(t,this.Lt.Nt.Wt),function(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(i+e,n),t.lineTo(i+e,s),t.stroke()}(t,h,0,i.height)),r&&l>=0&&(t.lineWidth=Math.floor(this.Lt.Ft.ht*s),t.strokeStyle=this.Lt.Ft.O,t.fillStyle=this.Lt.Ft.O,_(t,this.Lt.Ft.Wt),u(t,l,0,i.width))}}class U{constructor(t){this.bt=!0,this.jt={Nt:{ht:1,Wt:0,O:"",Tt:!1},Ft:{ht:1,Wt:0,O:"",Tt:!1},et:0,rt:0},this.Ht=new $(this.jt),this.$t=t}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht}St(){const t=this.$t.Tt(),i=f(this.$t.Ut()),n=i.qt().W().crosshair,s=this.jt;if(2===n.mode)return s.Ft.Tt=!1,void(s.Nt.Tt=!1);s.Ft.Tt=t&&this.$t.Yt(i),s.Nt.Tt=t&&this.$t.Xt(),s.Ft.ht=n.horzLine.width,s.Ft.Wt=n.horzLine.style,s.Ft.O=n.horzLine.color,s.Nt.ht=n.vertLine.width,s.Nt.Wt=n.vertLine.style,s.Nt.O=n.vertLine.color,s.et=this.$t.Kt(),s.rt=this.$t.Zt()}}function q(t,i,n,s,e,r){t.fillRect(i+r,n,s-2*r,r),t.fillRect(i+r,n+e-r,s-2*r,r),t.fillRect(i,n,r,e),t.fillRect(i+s-r,n,r,e)}function Y(t,i,n,s,e,r){t.save(),t.globalCompositeOperation="copy",t.fillStyle=r,t.fillRect(i,n,s,e),t.restore()}function X(t,i){return t.map((t=>0===t?t:t+i))}function K(t,i,n,s,e,r){t.beginPath(),t.lineTo(i+s-r[1],n),0!==r[1]&&t.arcTo(i+s,n,i+s,n+r[1],r[1]),t.lineTo(i+s,n+e-r[2]),0!==r[2]&&t.arcTo(i+s,n+e,i+s-r[2],n+e,r[2]),t.lineTo(i+r[3],n+e),0!==r[3]&&t.arcTo(i,n+e,i,n+e-r[3],r[3]),t.lineTo(i,n+r[0]),0!==r[0]&&t.arcTo(i,n,i+r[0],n,r[0])}function Z(t,i,n,s,e,r,h=0,l=[0,0,0,0],a=""){if(t.save(),!h||!a||a===r)return K(t,i,n,s,e,l),t.fillStyle=r,t.fill(),void t.restore();const o=h/2;if("transparent"!==r){K(t,i+h,n+h,s-2*h,e-2*h,X(l,-h)),t.fillStyle=r,t.fill()}if("transparent"!==a){K(t,i+o,n+o,s-h,e-h,X(l,-o)),t.lineWidth=h,t.strokeStyle=a,t.closePath(),t.stroke()}t.restore()}function G(t,i,n,s,e,r,h){t.save(),t.globalCompositeOperation="copy";const l=t.createLinearGradient(0,0,0,e);l.addColorStop(0,r),l.addColorStop(1,h),t.fillStyle=l,t.fillRect(i,n,s,e),t.restore()}class J{constructor(t,i){this.it(t,i)}it(t,i){this.Lt=t,this.Gt=i}Et(t,i){return this.Lt.Tt?t.P+t.L+t.B:0}K(t,i,n,s){if(!this.Lt.Tt||0===this.Lt.Jt.length)return;const e=this.Lt.O,r=this.Gt.t,h=t.useBitmapCoordinateSpace((t=>{const h=t.context;h.font=i.R;const l=this.Qt(t,i,n,s),a=l.ti,o=(t,i)=>{l.ii?Z(h,a.ni,a.si,a.ei,a.ri,t,a.hi,[a.ot,0,0,a.ot],i):Z(h,a.li,a.si,a.ei,a.ri,t,a.hi,[0,a.ot,a.ot,0],i)};return o(r,"transparent"),this.Lt.ai&&(h.fillStyle=e,h.fillRect(a.li,a.oi,a._i-a.li,a.ui)),o("transparent",r),this.Lt.ci&&(h.fillStyle=i.A,h.fillRect(l.ii?a.di-a.hi:0,a.si,a.hi,a.fi-a.si)),l}));t.useMediaCoordinateSpace((({context:t})=>{const n=h.vi;t.font=i.R,t.textAlign=h.ii?"right":"left",t.textBaseline="middle",t.fillStyle=e,t.fillText(this.Lt.Jt,n.pi,(n.si+n.fi)/2+n.mi)}))}Qt(t,i,n,s){var e;const{context:r,bitmapSize:h,mediaSize:l,horizontalPixelRatio:a,verticalPixelRatio:o}=t,_=this.Lt.ai||!this.Lt.bi?i.T:0,u=this.Lt.wi?i.C:0,c=i.L+this.Gt.gi,d=i.B+this.Gt.Mi,f=i.V,v=i.I,p=this.Lt.Jt,m=i.P,b=n.xi(r,p),w=Math.ceil(n.Si(r,p)),g=m+c+d,M=i.C+f+v+w+_,x=Math.max(1,Math.floor(o));let S=Math.round(g*o);S%2!=x%2&&(S+=1);const y=u>0?Math.max(1,Math.floor(u*a)):0,k=Math.round(M*a),C=Math.round(_*a),T=null!==(e=this.Gt.yi)&&void 0!==e?e:this.Gt.ki,P=Math.round(T*o)-Math.floor(.5*o),R=Math.floor(P+x/2-S/2),D=R+S,O="right"===s,A=O?l.width-u:u,B=O?h.width-y:y;let V,z,E;return O?(V=B-k,z=B-C,E=A-_-f-u):(V=B+k,z=B+C,E=A+_+f),{ii:O,ti:{si:R,oi:P,fi:D,ei:k,ri:S,ot:2*a,hi:y,ni:V,li:B,_i:z,ui:x,di:h.width},vi:{si:R/o,fi:D/o,pi:E,mi:b}}}}class Q{constructor(t){this.Ci={ki:0,t:"#000",Mi:0,gi:0},this.Ti={Jt:"",Tt:!1,ai:!0,bi:!1,Vt:"",O:"#FFF",ci:!1,wi:!1},this.Pi={Jt:"",Tt:!1,ai:!1,bi:!0,Vt:"",O:"#FFF",ci:!0,wi:!0},this.bt=!0,this.Ri=new(t||J)(this.Ti,this.Ci),this.Di=new(t||J)(this.Pi,this.Ci)}Jt(){return this.Oi(),this.Ti.Jt}ki(){return this.Oi(),this.Ci.ki}gt(){this.bt=!0}Et(t,i=!1){return Math.max(this.Ri.Et(t,i),this.Di.Et(t,i))}Ai(){return this.Ci.yi||0}Bi(t){this.Ci.yi=t}Vi(){return this.Oi(),this.Ti.Tt||this.Pi.Tt}zi(){return this.Oi(),this.Ti.Tt}xt(t){return this.Oi(),this.Ti.ai=this.Ti.ai&&t.W().ticksVisible,this.Pi.ai=this.Pi.ai&&t.W().ticksVisible,this.Ri.it(this.Ti,this.Ci),this.Di.it(this.Pi,this.Ci),this.Ri}Ei(){return this.Oi(),this.Ri.it(this.Ti,this.Ci),this.Di.it(this.Pi,this.Ci),this.Di}Oi(){this.bt&&(this.Ti.ai=!0,this.Pi.ai=!1,this.Ii(this.Ti,this.Pi,this.Ci))}}class tt extends Q{constructor(t,i,n){super(),this.$t=t,this.Li=i,this.Ni=n}Ii(t,i,n){if(t.Tt=!1,2===this.$t.W().mode)return;const s=this.$t.W().horzLine;if(!s.labelVisible)return;const e=this.Li.Pt();if(!this.$t.Tt()||this.Li.Fi()||null===e)return;const r=y(s.labelBackgroundColor);n.t=r.t,t.O=r.i;const h=2/12*this.Li.P();n.gi=h,n.Mi=h;const l=this.Ni(this.Li);n.ki=l.ki,t.Jt=this.Li.Wi(l.ct,e),t.Tt=!0}}const it=/[1-9]/g;class nt{constructor(){this.Lt=null}it(t){this.Lt=t}K(t,i){if(null===this.Lt||!1===this.Lt.Tt||0===this.Lt.Jt.length)return;const n=t.useMediaCoordinateSpace((({context:t})=>(t.font=i.R,Math.round(i.ji.Si(t,f(this.Lt).Jt,it)))));if(n<=0)return;const s=i.Hi,e=n+2*s,r=e/2,h=this.Lt.$i;let l=this.Lt.ki,a=Math.floor(l-r)+.5;a<0?(l+=Math.abs(0-a),a=Math.floor(l-r)+.5):a+e>h&&(l-=Math.abs(h-(a+e)),a=Math.floor(l-r)+.5);const o=a+e,_=Math.ceil(0+i.C+i.T+i.L+i.P+i.B);t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:n,verticalPixelRatio:s})=>{const e=f(this.Lt);t.fillStyle=e.t;const r=Math.round(a*n),h=Math.round(0*s),l=Math.round(o*n),u=Math.round(_*s),c=Math.round(2*n);if(t.beginPath(),t.moveTo(r,h),t.lineTo(r,u-c),t.arcTo(r,u,r+c,u,c),t.lineTo(l-c,u),t.arcTo(l,u,l,u-c,c),t.lineTo(l,h),t.fill(),e.ai){const r=Math.round(e.ki*n),l=h,a=Math.round((l+i.T)*s);t.fillStyle=e.O;const o=Math.max(1,Math.floor(n)),_=Math.floor(.5*n);t.fillRect(r-_,l,o,a-l)}})),t.useMediaCoordinateSpace((({context:t})=>{const n=f(this.Lt),e=0+i.C+i.T+i.L+i.P/2;t.font=i.R,t.textAlign="left",t.textBaseline="middle",t.fillStyle=n.O;const r=i.ji.xi(t,"Apr0");t.translate(a+s,e+r),t.fillText(n.Jt,0,0)}))}}class st{constructor(t,i,n){this.bt=!0,this.Ht=new nt,this.jt={Tt:!1,t:"#4c525e",O:"white",Jt:"",$i:0,ki:NaN,ai:!0},this.wt=t,this.Ui=i,this.Ni=n}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht.it(this.jt),this.Ht}St(){const t=this.jt;if(t.Tt=!1,2===this.wt.W().mode)return;const i=this.wt.W().vertLine;if(!i.labelVisible)return;const n=this.Ui.kt();if(n.Fi())return;t.$i=n.$i();const s=this.Ni();if(null===s)return;t.ki=s.ki;const e=n.qi(this.wt.yt());t.Jt=n.Yi(f(e)),t.Tt=!0;const r=y(i.labelBackgroundColor);t.t=r.t,t.O=r.i,t.ai=n.W().ticksVisible}}class et{constructor(){this.Xi=null,this.Ki=0}Zi(){return this.Ki}Gi(t){this.Ki=t}At(){return this.Xi}Ji(t){this.Xi=t}Qi(t){return[]}tn(){return[]}Tt(){return!0}}var rt;!function(t){t[t.Normal=0]="Normal",t[t.Magnet=1]="Magnet",t[t.Hidden=2]="Hidden"}(rt||(rt={}));class ht extends et{constructor(t,i){super(),this.nn=null,this.sn=NaN,this.en=0,this.rn=!0,this.hn=new Map,this.ln=!1,this.an=NaN,this.on=NaN,this._n=NaN,this.un=NaN,this.Ui=t,this.cn=i,this.dn=new j(t,this);this.fn=((t,i)=>n=>{const s=i(),e=t();if(n===f(this.nn).vn())return{ct:e,ki:s};{const t=f(n.Pt());return{ct:n.pn(s,t),ki:s}}})((()=>this.sn),(()=>this.on));const n=((t,i)=>()=>{const n=this.Ui.kt().mn(t()),s=i();return n&&Number.isFinite(s)?{ut:n,ki:s}:null})((()=>this.en),(()=>this.Kt()));this.bn=new st(this,t,n),this.wn=new U(this)}W(){return this.cn}gn(t,i){this._n=t,this.un=i}Mn(){this._n=NaN,this.un=NaN}xn(){return this._n}Sn(){return this.un}yn(t,i,n){this.ln||(this.ln=!0),this.rn=!0,this.kn(t,i,n)}yt(){return this.en}Kt(){return this.an}Zt(){return this.on}Tt(){return this.rn}Cn(){this.rn=!1,this.Tn(),this.sn=NaN,this.an=NaN,this.on=NaN,this.nn=null,this.Mn()}Pn(t){return null!==this.nn?[this.wn,this.dn]:[]}Yt(t){return t===this.nn&&this.cn.horzLine.visible}Xt(){return this.cn.vertLine.visible}Rn(t,i){this.rn&&this.nn===t||this.hn.clear();const n=[];return this.nn===t&&n.push(this.Dn(this.hn,i,this.fn)),n}tn(){return this.rn?[this.bn]:[]}Ut(){return this.nn}On(){this.wn.gt(),this.hn.forEach((t=>t.gt())),this.bn.gt(),this.dn.gt()}An(t){return t&&!t.vn().Fi()?t.vn():null}kn(t,i,n){this.Bn(t,i,n)&&this.On()}Bn(t,i,n){const s=this.an,e=this.on,r=this.sn,h=this.en,l=this.nn,a=this.An(n);this.en=t,this.an=isNaN(t)?NaN:this.Ui.kt().It(t),this.nn=n;const o=null!==a?a.Pt():null;return null!==a&&null!==o?(this.sn=i,this.on=a.Ot(i,o)):(this.sn=NaN,this.on=NaN),s!==this.an||e!==this.on||h!==this.en||r!==this.sn||l!==this.nn}Tn(){const t=this.Ui.Mt().map((t=>t.zn().Vn())).filter(A),i=0===t.length?null:Math.max(...t);this.en=null!==i?i:NaN}Dn(t,i,n){let s=t.get(i);return void 0===s&&(s=new tt(this,i,n),t.set(i,s)),s}}function lt(t){return"left"===t||"right"===t}class at{constructor(t){this.En=new Map,this.In=[],this.Ln=t}Nn(t,i){const n=function(t,i){return void 0===t?i:{Fn:Math.max(t.Fn,i.Fn),Wn:t.Wn||i.Wn}}(this.En.get(t),i);this.En.set(t,n)}jn(){return this.Ln}Hn(t){const i=this.En.get(t);return void 0===i?{Fn:this.Ln}:{Fn:Math.max(this.Ln,i.Fn),Wn:i.Wn}}$n(){this.Un(),this.In=[{qn:0}]}Yn(t){this.Un(),this.In=[{qn:1,Bt:t}]}Xn(t){this.Kn(),this.In.push({qn:5,Bt:t})}Un(){this.Kn(),this.In.push({qn:6})}Zn(){this.Un(),this.In=[{qn:4}]}Gn(t){this.Un(),this.In.push({qn:2,Bt:t})}Jn(t){this.Un(),this.In.push({qn:3,Bt:t})}Qn(){return this.In}ts(t){for(const i of t.In)this.ns(i);this.Ln=Math.max(this.Ln,t.Ln),t.En.forEach(((t,i)=>{this.Nn(i,t)}))}static ss(){return new at(2)}static es(){return new at(3)}ns(t){switch(t.qn){case 0:this.$n();break;case 1:this.Yn(t.Bt);break;case 2:this.Gn(t.Bt);break;case 3:this.Jn(t.Bt);break;case 4:this.Zn();break;case 5:this.Xn(t.Bt);break;case 6:this.Kn()}}Kn(){const t=this.In.findIndex((t=>5===t.qn));-1!==t&&this.In.splice(t,1)}}const ot=".";function _t(t,i){if(!T(t))return"n/a";if(!P(i))throw new TypeError("invalid length");if(i<0||i>16)throw new TypeError("invalid length");if(0===i)return t.toString();return("0000000000000000"+t.toString()).slice(-i)}class ut{constructor(t,i){if(i||(i=1),T(t)&&P(t)||(t=100),t<0)throw new TypeError("invalid base");this.Li=t,this.rs=i,this.hs()}format(t){const i=t<0?"−":"";return t=Math.abs(t),i+this.ls(t)}hs(){if(this.os=0,this.Li>0&&this.rs>0){let t=this.Li;for(;t>1;)t/=10,this.os++}}ls(t){const i=this.Li/this.rs;let n=Math.floor(t),s="";const e=void 0!==this.os?this.os:NaN;if(i>1){let r=+(Math.round(t*i)-n*i).toFixed(this.os);r>=i&&(r-=i,n+=1),s=ot+_t(+r.toFixed(this.os)*this.rs,e)}else n=Math.round(n*i)/i,e>0&&(s=ot+_t(0,e));return n.toFixed(0)+s}}class ct extends ut{constructor(t=100){super(t)}format(t){return`${super.format(t)}%`}}class dt{constructor(t){this._s=t}format(t){let i="";return t<0&&(i="-",t=-t),t<995?i+this.us(t):t<999995?i+this.us(t/1e3)+"K":t<999999995?(t=1e3*Math.round(t/1e3),i+this.us(t/1e6)+"M"):(t=1e6*Math.round(t/1e6),i+this.us(t/1e9)+"B")}us(t){let i;const n=Math.pow(10,this._s);return i=(t=Math.round(t*n)/n)>=1e-15&&t<1?t.toFixed(this._s).replace(/\.?0+$/,""):String(t),i.replace(/(\.[1-9]*)0+$/,((t,i)=>i))}}function ft(t,i,n,s,e,r,h){if(0===i.length||s.from>=i.length||s.to<=0)return;const{context:l,horizontalPixelRatio:a,verticalPixelRatio:o}=t,_=i[s.from];let u=r(t,_),c=_;if(s.to-s.from<2){const i=e/2;l.beginPath();const n={et:_.et-i,rt:_.rt},s={et:_.et+i,rt:_.rt};l.moveTo(n.et*a,n.rt*o),l.lineTo(s.et*a,s.rt*o),h(t,u,n,s)}else{const e=(i,n)=>{h(t,u,c,n),l.beginPath(),u=i,c=n};let d=c;l.beginPath(),l.moveTo(_.et*a,_.rt*o);for(let h=s.from+1;h=s.from;--n){const s=i[n];if(s){const i=e(t,s);i!==a&&(l.beginPath(),null!==a&&l.fill(),l.fillStyle=i,a=i);const n=Math.round(s.et*r)+o,u=s.rt*h;l.moveTo(n,u),l.arc(n,u,_,0,2*Math.PI)}}l.fill()}(t,i,l,n,o)}}class Pt extends Tt{Ds(t,i){return i._t}}function Rt(t,i,n,s,e=0,r=i.length){let h=r-e;for(;0>1,l=e+r;s(i[l],n)===t?(e=l+1,h-=r+1):h=r}return e}const Dt=Rt.bind(null,!0),Ot=Rt.bind(null,!1);function At(t,i){return t.ut0&&r=s&&(l=r-1),h>0&&hObject.assign(Object.assign({},t),this.Is.$s().Hs(t.ut))))}Us(){this.Es=null}Fs(){this.Bs&&(this.qs(),this.Bs=!1),this.Vs&&(this.js(),this.Vs=!1),this.As&&(this.Ys(),this.As=!1)}Ys(){const t=this.Is.At(),i=this.Ls.kt();if(this.Us(),i.Fi()||t.Fi())return;const n=i.Xs();if(null===n)return;if(0===this.Is.zn().Ks())return;const s=this.Is.Pt();null!==s&&(this.Es=Vt(this.zs,n,this.Ns),this.Zs(t,i,s.Bt),this.Gs())}}class Et extends zt{constructor(t,i){super(t,i,!0)}Zs(t,i,n){i.Js(this.zs,B(this.Es)),t.Qs(this.zs,n,B(this.Es))}te(t,i){return{ut:t,ct:i,et:NaN,rt:NaN}}qs(){const t=this.Is.$s();this.zs=this.Is.zn().ie().map((i=>{const n=i.Bt[3];return this.ne(i.se,n,t)}))}}class It extends Et{constructor(t,i){super(t,i),this.Ws=new I,this.ee=new kt,this.re=new Pt,this.Ws.X([this.ee,this.re])}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Is.W();this.ee.it({ds:t.lineType,st:this.zs,Wt:t.lineStyle,ht:t.lineWidth,fs:null,vs:t.invertFilledArea,nt:this.Es,cs:this.Ls.kt().he()}),this.re.it({ds:t.lineVisible?t.lineType:void 0,st:this.zs,Wt:t.lineStyle,ht:t.lineWidth,nt:this.Es,cs:this.Ls.kt().he(),Rs:t.pointMarkersVisible?t.pointMarkersRadius||t.lineWidth/2+2:void 0})}}class Lt extends H{constructor(){super(...arguments),this.Lt=null,this.le=0,this.ae=0}it(t){this.Lt=t}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.Lt||0===this.Lt.zn.length||null===this.Lt.nt)return;if(this.le=this.oe(i),this.le>=2){Math.max(1,Math.floor(i))%2!=this.le%2&&this.le--}this.ae=this.Lt._e?Math.min(this.le,Math.floor(i)):this.le;let s=null;const e=this.ae<=this.le&&this.Lt.he>=Math.floor(1.5*i);for(let r=this.Lt.nt.from;rf+p-1&&(e=f+p-1,s=e-_+1),t.fillRect(i,s,o-i,e-s+1)}const i=a+m;let s=Math.max(f,Math.round(h.pe*n)-l),e=s+_-1;e>f+p-1&&(e=f+p-1,s=e-_+1),t.fillRect(u+1,s,i-u,e-s+1)}}}oe(t){const i=Math.floor(t);return Math.max(i,Math.floor(function(t,i){return Math.floor(.3*t*i)}(f(this.Lt).he,t)))}}class Nt extends zt{constructor(t,i){super(t,i,!1)}Zs(t,i,n){i.Js(this.zs,B(this.Es)),t.me(this.zs,n,B(this.Es))}be(t,i,n){return{ut:t,we:i.Bt[0],ge:i.Bt[1],Me:i.Bt[2],xe:i.Bt[3],et:NaN,ve:NaN,ce:NaN,de:NaN,pe:NaN}}qs(){const t=this.Is.$s();this.zs=this.Is.zn().ie().map((i=>this.ne(i.se,i,t)))}}class Ft extends Nt{constructor(){super(...arguments),this.Ws=new Lt}ne(t,i,n){return Object.assign(Object.assign({},this.be(t,i,n)),n.Hs(t))}Gs(){const t=this.Is.W();this.Ws.it({zn:this.zs,he:this.Ls.kt().he(),fe:t.openVisible,_e:t.thinBars,nt:this.Es})}}class Wt extends gt{constructor(){super(...arguments),this.Cs=new yt}ps(t,i){const n=this.tt;return this.Cs.bs(t,{gs:i.Se,Ms:i.ye,xs:i.ke,Ss:i.Ce,ys:t.bitmapSize.height,fs:n.fs})}}class jt extends Tt{constructor(){super(...arguments),this.Te=new yt}Ds(t,i){const n=this.tt;return this.Te.bs(t,{gs:i.Pe,Ms:i.Pe,xs:i.Re,Ss:i.Re,ys:t.bitmapSize.height,fs:n.fs})}}class Ht extends Et{constructor(t,i){super(t,i),this.Ws=new I,this.De=new Wt,this.Oe=new jt,this.Ws.X([this.De,this.Oe])}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Is.Pt();if(null===t)return;const i=this.Is.W(),n=this.Is.At().Ot(i.baseValue.price,t.Bt),s=this.Ls.kt().he();this.De.it({st:this.zs,ht:i.lineWidth,Wt:i.lineStyle,ds:i.lineType,fs:n,vs:!1,nt:this.Es,cs:s}),this.Oe.it({st:this.zs,ht:i.lineWidth,Wt:i.lineStyle,ds:i.lineVisible?i.lineType:void 0,Rs:i.pointMarkersVisible?i.pointMarkersRadius||i.lineWidth/2+2:void 0,fs:n,nt:this.Es,cs:s})}}class $t extends H{constructor(){super(...arguments),this.Lt=null,this.le=0}it(t){this.Lt=t}Z(t){if(null===this.Lt||0===this.Lt.zn.length||null===this.Lt.nt)return;const{horizontalPixelRatio:i}=t;if(this.le=function(t,i){if(t>=2.5&&t<=4)return Math.floor(3*i);const n=1-.2*Math.atan(Math.max(4,t)-4)/(.5*Math.PI),s=Math.floor(t*n*i),e=Math.floor(t*i),r=Math.min(s,e);return Math.max(Math.floor(i),r)}(this.Lt.he,i),this.le>=2){Math.floor(i)%2!=this.le%2&&this.le--}const n=this.Lt.zn;this.Lt.Ae&&this.Be(t,n,this.Lt.nt),this.Lt.ci&&this.Ve(t,n,this.Lt.nt);const s=this.ze(i);(!this.Lt.ci||this.le>2*s)&&this.Ee(t,n,this.Lt.nt)}Be(t,i,n){if(null===this.Lt)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="",l=Math.min(Math.floor(e),Math.floor(this.Lt.he*e));l=Math.max(Math.floor(e),Math.min(l,this.le));const a=Math.floor(.5*l);let o=null;for(let t=n.from;t2*l)q(s,o,u,_-o+1,c-u+1,l);else{const t=_-o+1;s.fillRect(o,u,t,c-u+1)}a=_}}Ee(t,i,n){if(null===this.Lt)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="";const l=this.ze(e);for(let t=n.from;to||s.fillRect(_,a,u-_+1,o-a+1)}}}class Ut extends Nt{constructor(){super(...arguments),this.Ws=new $t}ne(t,i,n){return Object.assign(Object.assign({},this.be(t,i,n)),n.Hs(t))}Gs(){const t=this.Is.W();this.Ws.it({zn:this.zs,he:this.Ls.kt().he(),Ae:t.wickVisible,ci:t.borderVisible,nt:this.Es})}}class qt{constructor(t,i){this.Ne=t,this.Li=i}K(t,i,n){this.Ne.draw(t,this.Li,i,n)}}class Yt extends zt{constructor(t,i,n){super(t,i,!1),this.wn=n,this.Ws=new qt(this.wn.renderer(),(i=>{const n=t.Pt();return null===n?null:t.At().Ot(i,n.Bt)}))}Fe(t){return this.wn.priceValueBuilder(t)}We(t){return this.wn.isWhitespace(t)}qs(){const t=this.Is.$s();this.zs=this.Is.zn().ie().map((i=>Object.assign(Object.assign({ut:i.se,et:NaN},t.Hs(i.se)),{je:i.He})))}Zs(t,i){i.Js(this.zs,B(this.Es))}Gs(){this.wn.update({bars:this.zs.map(Xt),barSpacing:this.Ls.kt().he(),visibleRange:this.Es},this.Is.W())}}function Xt(t){return{x:t.et,time:t.ut,originalData:t.je,barColor:t.ue}}class Kt extends H{constructor(){super(...arguments),this.Lt=null,this.$e=[]}it(t){this.Lt=t,this.$e=[]}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.Lt||0===this.Lt.st.length||null===this.Lt.nt)return;this.$e.length||this.Ue(i);const s=Math.max(1,Math.floor(n)),e=Math.round(this.Lt.qe*n)-Math.floor(s/2),r=e+s;for(let i=this.Lt.nt.from;is.Xe?s.di=n.Os-i-1:n.Os=s.di+i+1))}let s=Math.ceil(this.Lt.he*t);for(let t=this.Lt.nt.from;t0&&s<4)for(let t=this.Lt.nt.from;ts&&(i.Ye>i.Xe?i.di-=1:i.Os+=1)}}}class Zt extends Et{constructor(){super(...arguments),this.Ws=new Kt}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t={st:this.zs,he:this.Ls.kt().he(),nt:this.Es,qe:this.Is.At().Ot(this.Is.W().base,f(this.Is.Pt()).Bt)};this.Ws.it(t)}}class Gt extends Et{constructor(){super(...arguments),this.Ws=new Pt}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Is.W(),i={st:this.zs,Wt:t.lineStyle,ds:t.lineVisible?t.lineType:void 0,ht:t.lineWidth,Rs:t.pointMarkersVisible?t.pointMarkersRadius||t.lineWidth/2+2:void 0,nt:this.Es,cs:this.Ls.kt().he()};this.Ws.it(i)}}const Jt=/[2-9]/g;class Qt{constructor(t=50){this.Ke=0,this.Ze=1,this.Ge=1,this.Je={},this.Qe=new Map,this.tr=t}ir(){this.Ke=0,this.Qe.clear(),this.Ze=1,this.Ge=1,this.Je={}}Si(t,i,n){return this.nr(t,i,n).width}xi(t,i,n){const s=this.nr(t,i,n);return((s.actualBoundingBoxAscent||0)-(s.actualBoundingBoxDescent||0))/2}nr(t,i,n){const s=n||Jt,e=String(i).replace(s,"0");if(this.Qe.has(e))return d(this.Qe.get(e)).sr;if(this.Ke===this.tr){const t=this.Je[this.Ge];delete this.Je[this.Ge],this.Qe.delete(t),this.Ge++,this.Ke--}t.save(),t.textBaseline="middle";const r=t.measureText(e);return t.restore(),0===r.width&&i.length||(this.Qe.set(e,{sr:r,er:this.Ze}),this.Je[this.Ze]=e,this.Ke++,this.Ze++),r}}class ti{constructor(t){this.rr=null,this.k=null,this.hr="right",this.lr=t}ar(t,i,n){this.rr=t,this.k=i,this.hr=n}K(t){null!==this.k&&null!==this.rr&&this.rr.K(t,this.k,this.lr,this.hr)}}class ii{constructor(t,i,n){this._r=t,this.lr=new Qt(50),this.ur=i,this.F=n,this.j=-1,this.Ht=new ti(this.lr)}xt(){const t=this.F.cr(this.ur);if(null===t)return null;const i=t.dr(this.ur)?t.vr():this.ur.At();if(null===i)return null;const n=t.pr(i);if("overlay"===n)return null;const s=this.F.mr();return s.P!==this.j&&(this.j=s.P,this.lr.ir()),this.Ht.ar(this._r.Ei(),s,n),this.Ht}}class ni extends H{constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}br(t,i){var n;if(!(null===(n=this.Lt)||void 0===n?void 0:n.Tt))return null;const{rt:s,ht:e,wr:r}=this.Lt;return i>=s-e-7&&i<=s+e+7?{gr:this.Lt,wr:r}:null}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;if(!1===this.Lt.Tt)return;const e=Math.round(this.Lt.rt*s);e<0||e>i.height||(t.lineCap="butt",t.strokeStyle=this.Lt.O,t.lineWidth=Math.floor(this.Lt.ht*n),_(t,this.Lt.Wt),u(t,e,0,i.width))}}class si{constructor(t){this.Mr={rt:0,O:"rgba(0, 0, 0, 0)",ht:1,Wt:0,Tt:!1},this.Sr=new ni,this.bt=!0,this.Is=t,this.Ls=t.qt(),this.Sr.it(this.Mr)}gt(){this.bt=!0}xt(){return this.Is.Tt()?(this.bt&&(this.yr(),this.bt=!1),this.Sr):null}}class ei extends si{constructor(t){super(t)}yr(){this.Mr.Tt=!1;const t=this.Is.At(),i=t.kr().kr;if(2!==i&&3!==i)return;const n=this.Is.W();if(!n.baseLineVisible||!this.Is.Tt())return;const s=this.Is.Pt();null!==s&&(this.Mr.Tt=!0,this.Mr.rt=t.Ot(s.Bt,s.Bt),this.Mr.O=n.baseLineColor,this.Mr.ht=n.baseLineWidth,this.Mr.Wt=n.baseLineStyle)}}class ri extends H{constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}He(){return this.Lt}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){const s=this.Lt;if(null===s)return;const e=Math.max(1,Math.floor(i)),r=e%2/2,h=Math.round(s.Xe.x*i)+r,l=s.Xe.y*n;t.fillStyle=s.Cr,t.beginPath();const a=Math.max(2,1.5*s.Tr)*i;t.arc(h,l,a,0,2*Math.PI,!1),t.fill(),t.fillStyle=s.Pr,t.beginPath(),t.arc(h,l,s.ot*i,0,2*Math.PI,!1),t.fill(),t.lineWidth=e,t.strokeStyle=s.Rr,t.beginPath(),t.arc(h,l,s.ot*i+e/2,0,2*Math.PI,!1),t.stroke()}}const hi=[{Dr:0,Or:.25,Ar:4,Br:10,Vr:.25,zr:0,Er:.4,Ir:.8},{Dr:.25,Or:.525,Ar:10,Br:14,Vr:0,zr:0,Er:.8,Ir:0},{Dr:.525,Or:1,Ar:14,Br:14,Vr:0,zr:0,Er:0,Ir:0}];function li(t,i,n,s){return function(t,i){if("transparent"===t)return t;const n=S(t),s=n[3];return`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${i*s})`}(t,n+(s-n)*i)}function ai(t,i){const n=t%2600/2600;let s;for(const t of hi)if(n>=t.Dr&&n<=t.Or){s=t;break}c(void 0!==s,"Last price animation internal logic error");const e=(n-s.Dr)/(s.Or-s.Dr);return{Pr:li(i,e,s.Vr,s.zr),Rr:li(i,e,s.Er,s.Ir),ot:(r=e,h=s.Ar,l=s.Br,h+(l-h)*r)};var r,h,l}class oi{constructor(t){this.Ht=new ri,this.bt=!0,this.Lr=!0,this.Nr=performance.now(),this.Fr=this.Nr-1,this.Wr=t}jr(){this.Fr=this.Nr-1,this.gt()}Hr(){if(this.gt(),2===this.Wr.W().lastPriceAnimation){const t=performance.now(),i=this.Fr-t;if(i>0)return void(i<650&&(this.Fr+=2600));this.Nr=t,this.Fr=t+2600}}gt(){this.bt=!0}$r(){this.Lr=!0}Tt(){return 0!==this.Wr.W().lastPriceAnimation}Ur(){switch(this.Wr.W().lastPriceAnimation){case 0:return!1;case 1:return!0;case 2:return performance.now()<=this.Fr}}xt(){return this.bt?(this.St(),this.bt=!1,this.Lr=!1):this.Lr&&(this.qr(),this.Lr=!1),this.Ht}St(){this.Ht.it(null);const t=this.Wr.qt().kt(),i=t.Xs(),n=this.Wr.Pt();if(null===i||null===n)return;const s=this.Wr.Yr(!0);if(s.Xr||!i.Kr(s.se))return;const e={x:t.It(s.se),y:this.Wr.At().Ot(s.ct,n.Bt)},r=s.O,h=this.Wr.W().lineWidth,l=ai(this.Zr(),r);this.Ht.it({Cr:r,Tr:h,Pr:l.Pr,Rr:l.Rr,ot:l.ot,Xe:e})}qr(){const t=this.Ht.He();if(null!==t){const i=ai(this.Zr(),t.Cr);t.Pr=i.Pr,t.Rr=i.Rr,t.ot=i.ot}}Zr(){return this.Ur()?performance.now()-this.Nr:2599}}function _i(t,i){return St(Math.min(Math.max(t,12),30)*i)}function ui(t,i){switch(t){case"arrowDown":case"arrowUp":return _i(i,1);case"circle":return _i(i,.8);case"square":return _i(i,.7)}}function ci(t){return function(t){const i=Math.ceil(t);return i%2!=0?i-1:i}(_i(t,1))}function di(t){return Math.max(_i(t,.1),3)}function fi(t,i,n,s,e){const r=ui("square",n),h=(r-1)/2,l=t-h,a=i-h;return s>=l&&s<=l+r&&e>=a&&e<=a+r}function vi(t,i,n,s,e){const r=(ui("arrowUp",e)-1)/2,h=(St(e/2)-1)/2;i.beginPath(),t?(i.moveTo(n-r,s),i.lineTo(n,s-r),i.lineTo(n+r,s),i.lineTo(n+h,s),i.lineTo(n+h,s+r),i.lineTo(n-h,s+r),i.lineTo(n-h,s)):(i.moveTo(n-r,s),i.lineTo(n,s+r),i.lineTo(n+r,s),i.lineTo(n+h,s),i.lineTo(n+h,s-r),i.lineTo(n-h,s-r),i.lineTo(n-h,s)),i.fill()}function pi(t,i,n,s,e,r){return fi(i,n,s,e,r)}class mi extends L{constructor(){super(...arguments),this.Lt=null,this.lr=new Qt,this.j=-1,this.H="",this.Gr=""}it(t){this.Lt=t}ar(t,i){this.j===t&&this.H===i||(this.j=t,this.H=i,this.Gr=z(t,i),this.lr.ir())}br(t,i){if(null===this.Lt||null===this.Lt.nt)return null;for(let n=this.Lt.nt.from;n=t&&e<=t+n&&r>=i-h&&r<=i+h}(t.Jt.et,t.Jt.rt,t.Jt.$i,t.Jt.Et,i,n))||function(t,i,n){if(0===t.Ks)return!1;switch(t.th){case"arrowDown":case"arrowUp":return pi(0,t.et,t.rt,t.Ks,i,n);case"circle":return function(t,i,n,s,e){const r=2+ui("circle",n)/2,h=t-s,l=i-e;return Math.sqrt(h*h+l*l)<=r}(t.et,t.rt,t.Ks,i,n);case"square":return fi(t.et,t.rt,t.Ks,i,n)}}(t,i,n)}function gi(t,i,n,s,e,r,h,l,a){const o=T(n)?n:n.xe,_=T(n)?n:n.ge,u=T(n)?n:n.Me,c=T(i.size)?Math.max(i.size,0):1,d=ci(l.he())*c,f=d/2;switch(t.Ks=d,i.position){case"inBar":return t.rt=h.Ot(o,a),void(void 0!==t.Jt&&(t.Jt.rt=t.rt+f+r+.6*e));case"aboveBar":return t.rt=h.Ot(_,a)-f-s.ih,void 0!==t.Jt&&(t.Jt.rt=t.rt-f-.6*e,s.ih+=1.2*e),void(s.ih+=d+r);case"belowBar":return t.rt=h.Ot(u,a)+f+s.nh,void 0!==t.Jt&&(t.Jt.rt=t.rt+f+r+.6*e,s.nh+=1.2*e),void(s.nh+=d+r)}i.position}class Mi{constructor(t,i){this.bt=!0,this.sh=!0,this.eh=!0,this.rh=null,this.Ht=new mi,this.Wr=t,this.Ui=i,this.Lt={st:[],nt:null}}gt(t){this.bt=!0,this.eh=!0,"data"===t&&(this.sh=!0)}xt(t){if(!this.Wr.Tt())return null;this.bt&&this.hh();const i=this.Ui.W().layout;return this.Ht.ar(i.fontSize,i.fontFamily),this.Ht.it(this.Lt),this.Ht}lh(){if(this.eh){if(this.Wr.ah().length>0){const t=this.Ui.kt().he(),i=di(t),n=1.5*ci(t)+2*i;this.rh={above:n,below:n}}else this.rh=null;this.eh=!1}return this.rh}hh(){const t=this.Wr.At(),i=this.Ui.kt(),n=this.Wr.ah();this.sh&&(this.Lt.st=n.map((t=>({ut:t.time,et:0,rt:0,Ks:0,th:t.shape,O:t.color,Jr:t.Jr,wr:t.id,Jt:void 0}))),this.sh=!1);const s=this.Ui.W().layout;this.Lt.nt=null;const e=i.Xs();if(null===e)return;const r=this.Wr.Pt();if(null===r)return;if(0===this.Lt.st.length)return;let h=NaN;const l=di(i.he()),a={ih:l,nh:l};this.Lt.nt=Vt(this.Lt.st,e,!0);for(let e=this.Lt.nt.from;e0&&(_.Jt={Qr:o.text,et:0,rt:0,$i:0,Et:0});const u=this.Wr.oh(o.time);null!==u&&gi(_,o,u,a,s.fontSize,l,t,i,r.Bt)}this.bt=!1}}class xi extends si{constructor(t){super(t)}yr(){const t=this.Mr;t.Tt=!1;const i=this.Is.W();if(!i.priceLineVisible||!this.Is.Tt())return;const n=this.Is.Yr(0===i.priceLineSource);n.Xr||(t.Tt=!0,t.rt=n.ki,t.O=this.Is._h(n.O),t.ht=i.priceLineWidth,t.Wt=i.priceLineStyle)}}class Si extends Q{constructor(t){super(),this.$t=t}Ii(t,i,n){t.Tt=!1,i.Tt=!1;const s=this.$t;if(!s.Tt())return;const e=s.W(),r=e.lastValueVisible,h=""!==s.uh(),l=0===e.seriesLastValueMode,a=s.Yr(!1);if(a.Xr)return;r&&(t.Jt=this.dh(a,r,l),t.Tt=0!==t.Jt.length),(h||l)&&(i.Jt=this.fh(a,r,h,l),i.Tt=i.Jt.length>0);const o=s._h(a.O),_=y(o);n.t=_.t,n.ki=a.ki,i.Vt=s.qt().zt(a.ki/s.At().Et()),t.Vt=o,t.O=_.i,i.O=_.i}fh(t,i,n,s){let e="";const r=this.$t.uh();return n&&0!==r.length&&(e+=`${r} `),i&&s&&(e+=this.$t.At().ph()?t.mh:t.bh),e.trim()}dh(t,i,n){return i?n?this.$t.At().ph()?t.bh:t.mh:t.Jt:""}}function yi(t,i,n,s){const e=Number.isFinite(i),r=Number.isFinite(n);return e&&r?t(i,n):e||r?e?i:n:s}class ki{constructor(t,i){this.wh=t,this.gh=i}Mh(t){return null!==t&&(this.wh===t.wh&&this.gh===t.gh)}xh(){return new ki(this.wh,this.gh)}Sh(){return this.wh}yh(){return this.gh}kh(){return this.gh-this.wh}Fi(){return this.gh===this.wh||Number.isNaN(this.gh)||Number.isNaN(this.wh)}ts(t){return null===t?this:new ki(yi(Math.min,this.Sh(),t.Sh(),-1/0),yi(Math.max,this.yh(),t.yh(),1/0))}Ch(t){if(!T(t))return;if(0===this.gh-this.wh)return;const i=.5*(this.gh+this.wh);let n=this.gh-i,s=this.wh-i;n*=t,s*=t,this.gh=i+n,this.wh=i+s}Th(t){T(t)&&(this.gh+=t,this.wh+=t)}Ph(){return{minValue:this.wh,maxValue:this.gh}}static Rh(t){return null===t?null:new ki(t.minValue,t.maxValue)}}class Ci{constructor(t,i){this.Dh=t,this.Oh=i||null}Ah(){return this.Dh}Bh(){return this.Oh}Ph(){return null===this.Dh?null:{priceRange:this.Dh.Ph(),margins:this.Oh||void 0}}static Rh(t){return null===t?null:new Ci(ki.Rh(t.priceRange),t.margins)}}class Ti extends si{constructor(t,i){super(t),this.Vh=i}yr(){const t=this.Mr;t.Tt=!1;const i=this.Vh.W();if(!this.Is.Tt()||!i.lineVisible)return;const n=this.Vh.zh();null!==n&&(t.Tt=!0,t.rt=n,t.O=i.color,t.ht=i.lineWidth,t.Wt=i.lineStyle,t.wr=this.Vh.W().id)}}class Pi extends Q{constructor(t,i){super(),this.Wr=t,this.Vh=i}Ii(t,i,n){t.Tt=!1,i.Tt=!1;const s=this.Vh.W(),e=s.axisLabelVisible,r=""!==s.title,h=this.Wr;if(!e||!h.Tt())return;const l=this.Vh.zh();if(null===l)return;r&&(i.Jt=s.title,i.Tt=!0),i.Vt=h.qt().zt(l/h.At().Et()),t.Jt=this.Eh(s.price),t.Tt=!0;const a=y(s.axisLabelColor||s.color);n.t=a.t;const o=s.axisLabelTextColor||a.i;t.O=o,i.O=o,n.ki=l}Eh(t){const i=this.Wr.Pt();return null===i?"":this.Wr.At().Wi(t,i.Bt)}}class Ri{constructor(t,i){this.Wr=t,this.cn=i,this.Ih=new Ti(t,this),this._r=new Pi(t,this),this.Lh=new ii(this._r,t,t.qt())}Nh(t){C(this.cn,t),this.gt(),this.Wr.qt().Fh()}W(){return this.cn}Wh(){return this.Ih}jh(){return this.Lh}Hh(){return this._r}gt(){this.Ih.gt(),this._r.gt()}zh(){const t=this.Wr,i=t.At();if(t.qt().kt().Fi()||i.Fi())return null;const n=t.Pt();return null===n?null:i.Ot(this.cn.price,n.Bt)}}class Di extends et{constructor(t){super(),this.Ui=t}qt(){return this.Ui}}const Oi={Bar:(t,i,n,s)=>{var e;const r=i.upColor,h=i.downColor,l=f(t(n,s)),a=v(l.Bt[0])<=v(l.Bt[3]);return{ue:null!==(e=l.O)&&void 0!==e?e:a?r:h}},Candlestick:(t,i,n,s)=>{var e,r,h;const l=i.upColor,a=i.downColor,o=i.borderUpColor,_=i.borderDownColor,u=i.wickUpColor,c=i.wickDownColor,d=f(t(n,s)),p=v(d.Bt[0])<=v(d.Bt[3]);return{ue:null!==(e=d.O)&&void 0!==e?e:p?l:a,Le:null!==(r=d.Vt)&&void 0!==r?r:p?o:_,Ie:null!==(h=d.$h)&&void 0!==h?h:p?u:c}},Custom:(t,i,n,s)=>{var e;return{ue:null!==(e=f(t(n,s)).O)&&void 0!==e?e:i.color}},Area:(t,i,n,s)=>{var e,r,h,l;const a=f(t(n,s));return{ue:null!==(e=a._t)&&void 0!==e?e:i.lineColor,_t:null!==(r=a._t)&&void 0!==r?r:i.lineColor,Ts:null!==(h=a.Ts)&&void 0!==h?h:i.topColor,Ps:null!==(l=a.Ps)&&void 0!==l?l:i.bottomColor}},Baseline:(t,i,n,s)=>{var e,r,h,l,a,o;const _=f(t(n,s));return{ue:_.Bt[3]>=i.baseValue.price?i.topLineColor:i.bottomLineColor,Pe:null!==(e=_.Pe)&&void 0!==e?e:i.topLineColor,Re:null!==(r=_.Re)&&void 0!==r?r:i.bottomLineColor,Se:null!==(h=_.Se)&&void 0!==h?h:i.topFillColor1,ye:null!==(l=_.ye)&&void 0!==l?l:i.topFillColor2,ke:null!==(a=_.ke)&&void 0!==a?a:i.bottomFillColor1,Ce:null!==(o=_.Ce)&&void 0!==o?o:i.bottomFillColor2}},Line:(t,i,n,s)=>{var e,r;const h=f(t(n,s));return{ue:null!==(e=h.O)&&void 0!==e?e:i.color,_t:null!==(r=h.O)&&void 0!==r?r:i.color}},Histogram:(t,i,n,s)=>{var e;return{ue:null!==(e=f(t(n,s)).O)&&void 0!==e?e:i.color}}};class Ai{constructor(t){this.Uh=(t,i)=>void 0!==i?i.Bt:this.Wr.zn().qh(t),this.Wr=t,this.Yh=Oi[t.Xh()]}Hs(t,i){return this.Yh(this.Uh,this.Wr.W(),t,i)}}var Bi;!function(t){t[t.NearestLeft=-1]="NearestLeft",t[t.None=0]="None",t[t.NearestRight=1]="NearestRight"}(Bi||(Bi={}));const Vi=30;class zi{constructor(){this.Kh=[],this.Zh=new Map,this.Gh=new Map}Jh(){return this.Ks()>0?this.Kh[this.Kh.length-1]:null}Qh(){return this.Ks()>0?this.tl(0):null}Vn(){return this.Ks()>0?this.tl(this.Kh.length-1):null}Ks(){return this.Kh.length}Fi(){return 0===this.Ks()}Kr(t){return null!==this.il(t,0)}qh(t){return this.nl(t)}nl(t,i=0){const n=this.il(t,i);return null===n?null:Object.assign(Object.assign({},this.sl(n)),{se:this.tl(n)})}ie(){return this.Kh}el(t,i,n){if(this.Fi())return null;let s=null;for(const e of n){s=Ei(s,this.rl(t,i,e))}return s}it(t){this.Gh.clear(),this.Zh.clear(),this.Kh=t}tl(t){return this.Kh[t].se}sl(t){return this.Kh[t]}il(t,i){const n=this.hl(t);if(null===n&&0!==i)switch(i){case-1:return this.ll(t);case 1:return this.al(t);default:throw new TypeError("Unknown search mode")}return n}ll(t){let i=this.ol(t);return i>0&&(i-=1),i!==this.Kh.length&&this.tl(i)t.set.se>i))}ul(t,i,n){let s=null;for(let e=t;es.dl&&(s.dl=t)))}return s}rl(t,i,n){if(this.Fi())return null;let s=null;const e=f(this.Qh()),r=f(this.Vn()),h=Math.max(t,e),l=Math.min(i,r),a=Math.ceil(h/Vi)*Vi,o=Math.max(a,Math.floor(l/Vi)*Vi);{const t=this.ol(h),e=this._l(Math.min(l,a,i));s=Ei(s,this.ul(t,e,n))}let _=this.Zh.get(n);void 0===_&&(_=new Map,this.Zh.set(n,_));for(let t=Math.max(a+1,h);tnew Li(t)));return this.gl={vl:e,pl:r},r}tn(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.kl).timeAxisViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.Ml)||void 0===s?void 0:s.vl)===e)return this.Ml.pl;const r=this.Wr.qt().kt(),h=e.map((t=>new Fi(t,r)));return this.Ml={vl:e,pl:h},h}Rn(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.kl).priceAxisViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.xl)||void 0===s?void 0:s.vl)===e)return this.xl.pl;const r=this.Wr.At(),h=e.map((t=>new Wi(t,r)));return this.xl={vl:e,pl:h},h}Tl(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.kl).priceAxisPaneViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.Sl)||void 0===s?void 0:s.vl)===e)return this.Sl.pl;const r=e.map((t=>new Li(t)));return this.Sl={vl:e,pl:r},r}Pl(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.kl).timeAxisPaneViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.yl)||void 0===s?void 0:s.vl)===e)return this.yl.pl;const r=e.map((t=>new Li(t)));return this.yl={vl:e,pl:r},r}Rl(t,i){var n,s,e;return null!==(e=null===(s=(n=this.kl).autoscaleInfo)||void 0===s?void 0:s.call(n,t,i))&&void 0!==e?e:null}br(t,i){var n,s,e;return null!==(e=null===(s=(n=this.kl).hitTest)||void 0===s?void 0:s.call(n,t,i))&&void 0!==e?e:null}}function Hi(t,i,n,s){t.forEach((t=>{i(t).forEach((t=>{t.ml()===n&&s.push(t)}))}))}function $i(t){return t.Pn()}function Ui(t){return t.Tl()}function qi(t){return t.Pl()}class Yi extends Di{constructor(t,i,n,s,e){super(t),this.Lt=new zi,this.Ih=new xi(this),this.Dl=[],this.Ol=new ei(this),this.Al=null,this.Bl=null,this.Vl=[],this.zl=[],this.El=null,this.Il=[],this.cn=i,this.Ll=n;const r=new Si(this);this.hn=[r],this.Lh=new ii(r,this,t),"Area"!==n&&"Line"!==n&&"Baseline"!==n||(this.Al=new oi(this)),this.Nl(),this.Fl(e)}S(){null!==this.El&&clearTimeout(this.El)}_h(t){return this.cn.priceLineColor||t}Yr(t){const i={Xr:!0},n=this.At();if(this.qt().kt().Fi()||n.Fi()||this.Lt.Fi())return i;const s=this.qt().kt().Xs(),e=this.Pt();if(null===s||null===e)return i;let r,h;if(t){const t=this.Lt.Jh();if(null===t)return i;r=t,h=t.se}else{const t=this.Lt.nl(s.di(),-1);if(null===t)return i;if(r=this.Lt.qh(t.se),null===r)return i;h=t.se}const l=r.Bt[3],a=this.$s().Hs(h,{Bt:r}),o=n.Ot(l,e.Bt);return{Xr:!1,ct:l,Jt:n.Wi(l,e.Bt),mh:n.Wl(l),bh:n.jl(l,e.Bt),O:a.ue,ki:o,se:h}}$s(){return null!==this.Bl||(this.Bl=new Ai(this)),this.Bl}W(){return this.cn}Nh(t){const i=t.priceScaleId;void 0!==i&&i!==this.cn.priceScaleId&&this.qt().Hl(this,i),C(this.cn,t),void 0!==t.priceFormat&&(this.Nl(),this.qt().$l()),this.qt().Ul(this),this.qt().ql(),this.wn.gt("options")}it(t,i){this.Lt.it(t),this.Yl(),this.wn.gt("data"),this.dn.gt("data"),null!==this.Al&&(i&&i.Xl?this.Al.Hr():0===t.length&&this.Al.jr());const n=this.qt().cr(this);this.qt().Kl(n),this.qt().Ul(this),this.qt().ql(),this.qt().Fh()}Zl(t){this.Vl=t,this.Yl();const i=this.qt().cr(this);this.dn.gt("data"),this.qt().Kl(i),this.qt().Ul(this),this.qt().ql(),this.qt().Fh()}Gl(){return this.Vl}ah(){return this.zl}Jl(t){const i=new Ri(this,t);return this.Dl.push(i),this.qt().Ul(this),i}Ql(t){const i=this.Dl.indexOf(t);-1!==i&&this.Dl.splice(i,1),this.qt().Ul(this)}Xh(){return this.Ll}Pt(){const t=this.ta();return null===t?null:{Bt:t.Bt[3],ia:t.ut}}ta(){const t=this.qt().kt().Xs();if(null===t)return null;const i=t.Os();return this.Lt.nl(i,1)}zn(){return this.Lt}oh(t){const i=this.Lt.qh(t);return null===i?null:"Bar"===this.Ll||"Candlestick"===this.Ll||"Custom"===this.Ll?{we:i.Bt[0],ge:i.Bt[1],Me:i.Bt[2],xe:i.Bt[3]}:i.Bt[3]}na(t){const i=[];Hi(this.Il,$i,"top",i);const n=this.Al;return null!==n&&n.Tt()?(null===this.El&&n.Ur()&&(this.El=setTimeout((()=>{this.El=null,this.qt().sa()}),0)),n.$r(),i.push(n),i):i}Pn(){const t=[];this.ea()||t.push(this.Ol),t.push(this.wn,this.Ih,this.dn);const i=this.Dl.map((t=>t.Wh()));return t.push(...i),Hi(this.Il,$i,"normal",t),t}ra(){return this.ha($i,"bottom")}la(t){return this.ha(Ui,t)}aa(t){return this.ha(qi,t)}oa(t,i){return this.Il.map((n=>n.br(t,i))).filter((t=>null!==t))}Qi(t){return[this.Lh,...this.Dl.map((t=>t.jh()))]}Rn(t,i){if(i!==this.Xi&&!this.ea())return[];const n=[...this.hn];for(const t of this.Dl)n.push(t.Hh());return this.Il.forEach((t=>{n.push(...t.Rn())})),n}tn(){const t=[];return this.Il.forEach((i=>{t.push(...i.tn())})),t}Rl(t,i){if(void 0!==this.cn.autoscaleInfoProvider){const n=this.cn.autoscaleInfoProvider((()=>{const n=this._a(t,i);return null===n?null:n.Ph()}));return Ci.Rh(n)}return this._a(t,i)}ua(){return this.cn.priceFormat.minMove}ca(){return this.da}On(){var t;this.wn.gt(),this.dn.gt();for(const t of this.hn)t.gt();for(const t of this.Dl)t.gt();this.Ih.gt(),this.Ol.gt(),null===(t=this.Al)||void 0===t||t.gt(),this.Il.forEach((t=>t.On()))}At(){return f(super.At())}Ct(t){if(!(("Line"===this.Ll||"Area"===this.Ll||"Baseline"===this.Ll)&&this.cn.crosshairMarkerVisible))return null;const i=this.Lt.qh(t);if(null===i)return null;return{ct:i.Bt[3],ot:this.fa(),Vt:this.va(),Dt:this.pa(),Rt:this.ma(t)}}uh(){return this.cn.title}Tt(){return this.cn.visible}ba(t){this.Il.push(new ji(t,this))}wa(t){this.Il=this.Il.filter((i=>i.Cl()!==t))}ga(){if(this.wn instanceof Yt!=!1)return t=>this.wn.Fe(t)}Ma(){if(this.wn instanceof Yt!=!1)return t=>this.wn.We(t)}ea(){return!lt(this.At().xa())}_a(t,i){if(!P(t)||!P(i)||this.Lt.Fi())return null;const n="Line"===this.Ll||"Area"===this.Ll||"Baseline"===this.Ll||"Histogram"===this.Ll?[3]:[2,1],s=this.Lt.el(t,i,n);let e=null!==s?new ki(s.cl,s.dl):null;if("Histogram"===this.Xh()){const t=this.cn.base,i=new ki(t,t);e=null!==e?e.ts(i):i}let r=this.dn.lh();return this.Il.forEach((n=>{const s=n.Rl(t,i);if(null==s?void 0:s.priceRange){const t=new ki(s.priceRange.minValue,s.priceRange.maxValue);e=null!==e?e.ts(t):t}var h,l,a,o;(null==s?void 0:s.margins)&&(h=r,l=s.margins,r={above:Math.max(null!==(a=null==h?void 0:h.above)&&void 0!==a?a:0,l.above),below:Math.max(null!==(o=null==h?void 0:h.below)&&void 0!==o?o:0,l.below)})})),new Ci(e,r)}fa(){switch(this.Ll){case"Line":case"Area":case"Baseline":return this.cn.crosshairMarkerRadius}return 0}va(){switch(this.Ll){case"Line":case"Area":case"Baseline":{const t=this.cn.crosshairMarkerBorderColor;if(0!==t.length)return t}}return null}pa(){switch(this.Ll){case"Line":case"Area":case"Baseline":return this.cn.crosshairMarkerBorderWidth}return 0}ma(t){switch(this.Ll){case"Line":case"Area":case"Baseline":{const t=this.cn.crosshairMarkerBackgroundColor;if(0!==t.length)return t}}return this.$s().Hs(t).ue}Nl(){switch(this.cn.priceFormat.type){case"custom":this.da={format:this.cn.priceFormat.formatter};break;case"volume":this.da=new dt(this.cn.priceFormat.precision);break;case"percent":this.da=new ct(this.cn.priceFormat.precision);break;default:{const t=Math.pow(10,this.cn.priceFormat.precision);this.da=new ut(t,this.cn.priceFormat.minMove*t)}}null!==this.Xi&&this.Xi.Sa()}Yl(){const t=this.qt().kt();if(!t.ya()||this.Lt.Fi())return void(this.zl=[]);const i=f(this.Lt.Qh());this.zl=this.Vl.map(((n,s)=>{const e=f(t.ka(n.time,!0)),r=et instanceof Yi)).reduce(((t,s)=>{if(n.dr(s)||!s.Tt())return t;const e=s.At(),r=s.zn();if(e.Fi()||!r.Kr(i))return t;const h=r.qh(i);if(null===h)return t;const l=v(s.Pt());return t.concat([e.Ot(h.Bt[3],l.Bt)])}),[]);if(0===l.length)return s;l.sort(((t,i)=>Math.abs(t-h)-Math.abs(i-h)));const a=l[0];return s=e.pn(a,r),s}}class Ki extends H{constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;const e=Math.max(1,Math.floor(n));t.lineWidth=e,function(t,i){t.save(),t.lineWidth%2&&t.translate(.5,.5),i(),t.restore()}(t,(()=>{const r=f(this.Lt);if(5!==r.Pa){if(r.Ra){t.strokeStyle=r.Da,_(t,r.Pa),t.beginPath();for(const s of r.Oa){const r=Math.round(s.Aa*n);t.moveTo(r,-e),t.lineTo(r,i.height+e)}t.stroke()}if(r.Ba){t.strokeStyle=r.Va,_(t,r.za),t.beginPath();for(const n of r.Ea){const r=Math.round(n.Aa*s);t.moveTo(-e,r),t.lineTo(i.width+e,r)}t.stroke()}}else{if(!r.Ra||!r.Ba)return;t.fillStyle=r.Da,_(t,r.Pa),t.beginPath();const i=r.Ea.length>1?r.Ea[1].Aa-r.Ea[0].Aa:void 0;let e;for(let h=0;h1.7*i;e=o;for(let i=0;i({Aa:t.coord})))};this.Ht.it(i),this.bt=!1}return this.Ht}}class Gi{constructor(t){this.wn=new Zi(t)}Wh(){return this.wn}}const Ji={La:4,Na:1e-4};function Qi(t,i){const n=100*(t-i)/i;return i<0?-n:n}function tn(t,i){const n=Qi(t.Sh(),i),s=Qi(t.yh(),i);return new ki(n,s)}function nn(t,i){const n=100*(t-i)/i+100;return i<0?-n:n}function sn(t,i){const n=nn(t.Sh(),i),s=nn(t.yh(),i);return new ki(n,s)}function en(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.log10(n+i.Na)+i.La;return t<0?-s:s}function rn(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.pow(10,n-i.La)-i.Na;return t<0?-s:s}function hn(t,i){if(null===t)return null;const n=en(t.Sh(),i),s=en(t.yh(),i);return new ki(n,s)}function ln(t,i){if(null===t)return null;const n=rn(t.Sh(),i),s=rn(t.yh(),i);return new ki(n,s)}function an(t){if(null===t)return Ji;const i=Math.abs(t.yh()-t.Sh());if(i>=1||i<1e-15)return Ji;const n=Math.ceil(Math.abs(Math.log10(i))),s=Ji.La+n;return{La:s,Na:1/Math.pow(10,s)}}class on{constructor(t,i){if(this.Fa=t,this.Wa=i,function(t){if(t<0)return!1;for(let i=t;i>1;i/=10)if(i%10!=0)return!1;return!0}(this.Fa))this.ja=[2,2.5,2];else{this.ja=[];for(let t=this.Fa;1!==t;){if(t%2==0)this.ja.push(2),t/=2;else{if(t%5!=0)throw new Error("unexpected base");this.ja.push(2,2.5),t/=5}if(this.ja.length>100)throw new Error("something wrong with base")}}}Ha(t,i,n){const s=0===this.Fa?0:1/this.Fa;let e=Math.pow(10,Math.max(0,Math.ceil(Math.log10(t-i)))),r=0,h=this.Wa[0];for(;;){const t=xt(e,s,1e-14)&&e>s+1e-14,i=xt(e,n*h,1e-14),l=xt(e,1,1e-14);if(!(t&&i&&l))break;e/=h,h=this.Wa[++r%this.Wa.length]}if(e<=s+1e-14&&(e=s),e=Math.max(1,e),this.ja.length>0&&(l=e,a=1,o=1e-14,Math.abs(l-a)s+1e-14;)e/=h,h=this.ja[++r%this.ja.length];var l,a,o;return e}}class _n{constructor(t,i,n,s){this.$a=[],this.Li=t,this.Fa=i,this.Ua=n,this.qa=s}Ha(t,i){if(t=o?1:-1;let d=null,f=0;for(let n=a-u;n>o;n-=_){const s=this.qa(n,i,!0);null!==d&&Math.abs(s-d)l||(ff(t.Zi())-f(i.Zi())))}var cn;!function(t){t[t.Normal=0]="Normal",t[t.Logarithmic=1]="Logarithmic",t[t.Percentage=2]="Percentage",t[t.IndexedTo100=3]="IndexedTo100"}(cn||(cn={}));const dn=new ct,fn=new ut(100,1);class vn{constructor(t,i,n,s){this.Qa=0,this.io=null,this.Dh=null,this.no=null,this.so={eo:!1,ro:null},this.ho=0,this.lo=0,this.ao=new k,this.oo=new k,this._o=[],this.uo=null,this.co=null,this.do=null,this.fo=null,this.da=fn,this.vo=an(null),this.po=t,this.cn=i,this.mo=n,this.bo=s,this.wo=new _n(this,100,this.Mo.bind(this),this.xo.bind(this))}xa(){return this.po}W(){return this.cn}Nh(t){if(C(this.cn,t),this.Sa(),void 0!==t.mode&&this.So({kr:t.mode}),void 0!==t.scaleMargins){const i=d(t.scaleMargins.top),n=d(t.scaleMargins.bottom);if(i<0||i>1)throw new Error(`Invalid top margin - expect value between 0 and 1, given=${i}`);if(n<0||n>1||i+n>1)throw new Error(`Invalid bottom margin - expect value between 0 and 1, given=${n}`);if(i+n>1)throw new Error(`Invalid margins - sum of margins must be less than 1, given=${i+n}`);this.yo(),this.co=null}}ko(){return this.cn.autoScale}Ja(){return 1===this.cn.mode}ph(){return 2===this.cn.mode}Co(){return 3===this.cn.mode}kr(){return{Wn:this.cn.autoScale,To:this.cn.invertScale,kr:this.cn.mode}}So(t){const i=this.kr();let n=null;void 0!==t.Wn&&(this.cn.autoScale=t.Wn),void 0!==t.kr&&(this.cn.mode=t.kr,2!==t.kr&&3!==t.kr||(this.cn.autoScale=!0),this.so.eo=!1),1===i.kr&&t.kr!==i.kr&&(!function(t,i){if(null===t)return!1;const n=rn(t.Sh(),i),s=rn(t.yh(),i);return isFinite(n)&&isFinite(s)}(this.Dh,this.vo)?this.cn.autoScale=!0:(n=ln(this.Dh,this.vo),null!==n&&this.Po(n))),1===t.kr&&t.kr!==i.kr&&(n=hn(this.Dh,this.vo),null!==n&&this.Po(n));const s=i.kr!==this.cn.mode;s&&(2===i.kr||this.ph())&&this.Sa(),s&&(3===i.kr||this.Co())&&this.Sa(),void 0!==t.To&&i.To!==t.To&&(this.cn.invertScale=t.To,this.Ro()),this.oo.m(i,this.kr())}Do(){return this.oo}P(){return this.mo.fontSize}Et(){return this.Qa}Oo(t){this.Qa!==t&&(this.Qa=t,this.yo(),this.co=null)}Ao(){if(this.io)return this.io;const t=this.Et()-this.Bo()-this.Vo();return this.io=t,t}Ah(){return this.zo(),this.Dh}Po(t,i){const n=this.Dh;(i||null===n&&null!==t||null!==n&&!n.Mh(t))&&(this.co=null,this.Dh=t)}Fi(){return this.zo(),0===this.Qa||!this.Dh||this.Dh.Fi()}Eo(t){return this.To()?t:this.Et()-1-t}Ot(t,i){return this.ph()?t=Qi(t,i):this.Co()&&(t=nn(t,i)),this.xo(t,i)}Qs(t,i,n){this.zo();const s=this.Vo(),e=f(this.Ah()),r=e.Sh(),h=e.yh(),l=this.Ao()-1,a=this.To(),o=l/(h-r),_=void 0===n?0:n.from,u=void 0===n?t.length:n.to,c=this.Io();for(let n=_;nt.On()))}Sa(){this.co=null;const t=this.Jo();let i=100;null!==t&&(i=Math.round(1/t.ua())),this.da=fn,this.ph()?(this.da=dn,i=100):this.Co()?(this.da=new ut(100,1),i=100):null!==t&&(this.da=t.ca()),this.wo=new _n(this,i,this.Mo.bind(this),this.xo.bind(this)),this.wo.Xa()}Wo(){this.uo=null}Jo(){return this._o[0]||null}Bo(){return this.To()?this.cn.scaleMargins.bottom*this.Et()+this.lo:this.cn.scaleMargins.top*this.Et()+this.ho}Vo(){return this.To()?this.cn.scaleMargins.top*this.Et()+this.ho:this.cn.scaleMargins.bottom*this.Et()+this.lo}zo(){this.so.eo||(this.so.eo=!0,this.i_())}yo(){this.io=null}xo(t,i){if(this.zo(),this.Fi())return 0;t=this.Ja()&&t?en(t,this.vo):t;const n=f(this.Ah()),s=this.Vo()+(this.Ao()-1)*(t-n.Sh())/n.kh();return this.Eo(s)}Mo(t,i){if(this.zo(),this.Fi())return 0;const n=this.Eo(t),s=f(this.Ah()),e=s.Sh()+s.kh()*((n-this.Vo())/(this.Ao()-1));return this.Ja()?rn(e,this.vo):e}Ro(){this.co=null,this.wo.Xa()}i_(){const t=this.so.ro;if(null===t)return;let i=null;const n=this.Qo();let s=0,e=0;for(const r of n){if(!r.Tt())continue;const n=r.Pt();if(null===n)continue;const h=r.Rl(t.Os(),t.di());let l=h&&h.Ah();if(null!==l){switch(this.cn.mode){case 1:l=hn(l,this.vo);break;case 2:l=tn(l,n.Bt);break;case 3:l=sn(l,n.Bt)}if(i=null===i?l:i.ts(f(l)),null!==h){const t=h.Bh();null!==t&&(s=Math.max(s,t.above),e=Math.max(s,t.below))}}}if(s===this.ho&&e===this.lo||(this.ho=s,this.lo=e,this.co=null,this.yo()),null!==i){if(i.Sh()===i.yh()){const t=this.Jo(),n=5*(null===t||this.ph()||this.Co()?1:t.ua());this.Ja()&&(i=ln(i,this.vo)),i=new ki(i.Sh()-n,i.yh()+n),this.Ja()&&(i=hn(i,this.vo))}if(this.Ja()){const t=ln(i,this.vo),n=an(t);if(r=n,h=this.vo,r.La!==h.La||r.Na!==h.Na){const s=null!==this.no?ln(this.no,this.vo):null;this.vo=n,i=hn(t,n),null!==s&&(this.no=hn(s,n))}}this.Po(i)}else null===this.Dh&&(this.Po(new ki(-.5,.5)),this.vo=an(null));var r,h;this.so.eo=!0}Io(){return this.ph()?Qi:this.Co()?nn:this.Ja()?t=>en(t,this.vo):null}n_(t,i,n){return void 0===i?(void 0===n&&(n=this.ca()),n.format(t)):i(t)}Eh(t,i){return this.n_(t,this.bo.priceFormatter,i)}Go(t,i){return this.n_(t,this.bo.percentageFormatter,i)}}class pn{constructor(t,i){this._o=[],this.s_=new Map,this.Qa=0,this.e_=0,this.r_=1e3,this.uo=null,this.h_=new k,this.wl=t,this.Ui=i,this.l_=new Gi(this);const n=i.W();this.a_=this.o_("left",n.leftPriceScale),this.__=this.o_("right",n.rightPriceScale),this.a_.Do().l(this.u_.bind(this,this.a_),this),this.__.Do().l(this.u_.bind(this,this.__),this),this.c_(n)}c_(t){if(t.leftPriceScale&&this.a_.Nh(t.leftPriceScale),t.rightPriceScale&&this.__.Nh(t.rightPriceScale),t.localization&&(this.a_.Sa(),this.__.Sa()),t.overlayPriceScales){const i=Array.from(this.s_.values());for(const n of i){const i=f(n[0].At());i.Nh(t.overlayPriceScales),t.localization&&i.Sa()}}}d_(t){switch(t){case"left":return this.a_;case"right":return this.__}return this.s_.has(t)?d(this.s_.get(t))[0].At():null}S(){this.qt().f_().p(this),this.a_.Do().p(this),this.__.Do().p(this),this._o.forEach((t=>{t.S&&t.S()})),this.h_.m()}v_(){return this.r_}p_(t){this.r_=t}qt(){return this.Ui}$i(){return this.e_}Et(){return this.Qa}m_(t){this.e_=t,this.b_()}Oo(t){this.Qa=t,this.a_.Oo(t),this.__.Oo(t),this._o.forEach((i=>{if(this.dr(i)){const n=i.At();null!==n&&n.Oo(t)}})),this.b_()}Ta(){return this._o}dr(t){const i=t.At();return null===i||this.a_!==i&&this.__!==i}Fo(t,i,n){const s=void 0!==n?n:this.g_().w_+1;this.M_(t,i,s)}jo(t){const i=this._o.indexOf(t);c(-1!==i,"removeDataSource: invalid data source"),this._o.splice(i,1);const n=f(t.At()).xa();if(this.s_.has(n)){const i=d(this.s_.get(n)),s=i.indexOf(t);-1!==s&&(i.splice(s,1),0===i.length&&this.s_.delete(n))}const s=t.At();s&&s.Ta().indexOf(t)>=0&&s.jo(t),null!==s&&(s.Wo(),this.x_(s)),this.uo=null}pr(t){return t===this.a_?"left":t===this.__?"right":"overlay"}S_(){return this.a_}y_(){return this.__}k_(t,i){t.Uo(i)}C_(t,i){t.qo(i),this.b_()}T_(t){t.Yo()}P_(t,i){t.Xo(i)}R_(t,i){t.Ko(i),this.b_()}D_(t){t.Zo()}b_(){this._o.forEach((t=>{t.On()}))}vn(){let t=null;return this.Ui.W().rightPriceScale.visible&&0!==this.__.Ta().length?t=this.__:this.Ui.W().leftPriceScale.visible&&0!==this.a_.Ta().length?t=this.a_:0!==this._o.length&&(t=this._o[0].At()),null===t&&(t=this.__),t}vr(){let t=null;return this.Ui.W().rightPriceScale.visible?t=this.__:this.Ui.W().leftPriceScale.visible&&(t=this.a_),t}x_(t){null!==t&&t.ko()&&this.O_(t)}A_(t){const i=this.wl.Xs();t.So({Wn:!0}),null!==i&&t.t_(i),this.b_()}B_(){this.O_(this.a_),this.O_(this.__)}V_(){this.x_(this.a_),this.x_(this.__),this._o.forEach((t=>{this.dr(t)&&this.x_(t.At())})),this.b_(),this.Ui.Fh()}No(){return null===this.uo&&(this.uo=un(this._o)),this.uo}z_(){return this.h_}E_(){return this.l_}O_(t){const i=t.Qo();if(i&&i.length>0&&!this.wl.Fi()){const i=this.wl.Xs();null!==i&&t.t_(i)}t.On()}g_(){const t=this.No();if(0===t.length)return{I_:0,w_:0};let i=0,n=0;for(let s=0;sn&&(n=e))}return{I_:i,w_:n}}M_(t,i,n){let s=this.d_(i);if(null===s&&(s=this.o_(i,this.Ui.W().overlayPriceScales)),this._o.push(t),!lt(i)){const n=this.s_.get(i)||[];n.push(t),this.s_.set(i,n)}s.Fo(t),t.Ji(s),t.Gi(n),this.x_(s),this.uo=null}u_(t,i,n){i.kr!==n.kr&&this.O_(t)}o_(t,i){const n=Object.assign({visible:!0,autoScale:!0},O(i)),s=new vn(t,n,this.Ui.W().layout,this.Ui.W().localization);return s.Oo(this.Et()),s}}class mn{constructor(t,i,n=50){this.Ke=0,this.Ze=1,this.Ge=1,this.Qe=new Map,this.Je=new Map,this.L_=t,this.N_=i,this.tr=n}F_(t){const i=t.time,n=this.N_.cacheKey(i),s=this.Qe.get(n);if(void 0!==s)return s.W_;if(this.Ke===this.tr){const t=this.Je.get(this.Ge);this.Je.delete(this.Ge),this.Qe.delete(d(t)),this.Ge++,this.Ke--}const e=this.L_(t);return this.Qe.set(n,{W_:e,er:this.Ze}),this.Je.set(this.Ze,n),this.Ke++,this.Ze++,e}}class bn{constructor(t,i){c(t<=i,"right should be >= left"),this.j_=t,this.H_=i}Os(){return this.j_}di(){return this.H_}U_(){return this.H_-this.j_+1}Kr(t){return this.j_<=t&&t<=this.H_}Mh(t){return this.j_===t.Os()&&this.H_===t.di()}}function wn(t,i){return null===t||null===i?t===i:t.Mh(i)}class gn{constructor(){this.q_=new Map,this.Qe=null,this.Y_=!1}X_(t){this.Y_=t,this.Qe=null}K_(t,i){this.Z_(i),this.Qe=null;for(let n=i;n{t<=n[0].index?i.push(s):n.splice(Dt(n,t,(i=>i.indexi-t))){if(!this.q_.get(n))continue;const s=i;i=[];const e=s.length;let r=0;const h=d(this.q_.get(n)),l=h.length;let a=1/0,o=-1/0;for(let n=0;n=t&&_-o>=t)i.push(l),o=_;else if(this.Y_)return s}for(;ri.weight?t:i}class Sn{constructor(t,i,n,s){this.e_=0,this.eu=null,this.ru=[],this.fo=null,this.do=null,this.hu=new gn,this.lu=new Map,this.au=Mn.su(),this.ou=!0,this._u=new k,this.uu=new k,this.cu=new k,this.du=null,this.fu=null,this.vu=[],this.cn=i,this.bo=n,this.pu=i.rightOffset,this.mu=i.barSpacing,this.Ui=t,this.N_=s,this.bu(),this.hu.X_(i.uniformDistribution)}W(){return this.cn}wu(t){C(this.bo,t),this.gu(),this.bu()}Nh(t,i){var n;C(this.cn,t),this.cn.fixLeftEdge&&this.Mu(),this.cn.fixRightEdge&&this.xu(),void 0!==t.barSpacing&&this.Ui.Gn(t.barSpacing),void 0!==t.rightOffset&&this.Ui.Jn(t.rightOffset),void 0!==t.minBarSpacing&&this.Ui.Gn(null!==(n=t.barSpacing)&&void 0!==n?n:this.mu),this.gu(),this.bu(),this.cu.m()}mn(t){var i,n;return null!==(n=null===(i=this.ru[t])||void 0===i?void 0:i.time)&&void 0!==n?n:null}qi(t){var i;return null!==(i=this.ru[t])&&void 0!==i?i:null}ka(t,i){if(this.ru.length<1)return null;if(this.N_.key(t)>this.N_.key(this.ru[this.ru.length-1].time))return i?this.ru.length-1:null;const n=Dt(this.ru,this.N_.key(t),((t,i)=>this.N_.key(t.time)0}Xs(){return this.Su(),this.au.iu()}yu(){return this.Su(),this.au.nu()}ku(){const t=this.Xs();if(null===t)return null;const i={from:t.Os(),to:t.di()};return this.Cu(i)}Cu(t){const i=Math.round(t.from),n=Math.round(t.to),s=f(this.Tu()),e=f(this.Pu());return{from:f(this.qi(Math.max(s,i))),to:f(this.qi(Math.min(e,n)))}}Ru(t){return{from:f(this.ka(t.from,!0)),to:f(this.ka(t.to,!0))}}$i(){return this.e_}m_(t){if(!isFinite(t)||t<=0)return;if(this.e_===t)return;const i=this.yu(),n=this.e_;if(this.e_=t,this.ou=!0,this.cn.lockVisibleTimeRangeOnResize&&0!==n){const i=this.mu*t/n;this.mu=i}if(this.cn.fixLeftEdge&&null!==i&&i.Os()<=0){const i=n-t;this.pu-=Math.round(i/this.mu)+1,this.ou=!0}this.Du(),this.Ou()}It(t){if(this.Fi()||!P(t))return 0;const i=this.Au()+this.pu-t;return this.e_-(i+.5)*this.mu-1}Js(t,i){const n=this.Au(),s=void 0===i?0:i.from,e=void 0===i?t.length:i.to;for(let i=s;ii/2&&!o?n.needAlignCoordinate=!1:n.needAlignCoordinate=_&&t.index<=l||u&&t.index>=a,c++}return this.vu.length=c,this.fu=this.vu,this.vu}Fu(){this.ou=!0,this.Gn(this.cn.barSpacing),this.Jn(this.cn.rightOffset)}Wu(t){this.ou=!0,this.eu=t,this.Ou(),this.Mu()}ju(t,i){const n=this.Vu(t),s=this.he(),e=s+i*(s/10);this.Gn(e),this.cn.rightBarStaysOnScroll||this.Jn(this.Iu()+(n-this.Vu(t)))}Uo(t){this.fo&&this.Zo(),null===this.do&&null===this.du&&(this.Fi()||(this.do=t,this.Hu()))}qo(t){if(null===this.du)return;const i=Mt(this.e_-t,0,this.e_),n=Mt(this.e_-f(this.do),0,this.e_);0!==i&&0!==n&&this.Gn(this.du.he*i/n)}Yo(){null!==this.do&&(this.do=null,this.$u())}Xo(t){null===this.fo&&null===this.du&&(this.Fi()||(this.fo=t,this.Hu()))}Ko(t){if(null===this.fo)return;const i=(this.fo-t)/this.he();this.pu=f(this.du).Iu+i,this.ou=!0,this.Ou()}Zo(){null!==this.fo&&(this.fo=null,this.$u())}Uu(){this.qu(this.cn.rightOffset)}qu(t,i=400){if(!isFinite(t))throw new RangeError("offset is required and must be finite number");if(!isFinite(i)||i<=0)throw new RangeError("animationDuration (optional) must be finite positive number");const n=this.pu,s=performance.now();this.Ui.Xn({Yu:t=>(t-s)/i>=1,Xu:e=>{const r=(e-s)/i;return r>=1?t:n+(t-n)*r}})}gt(t,i){this.ou=!0,this.ru=t,this.hu.K_(t,i),this.Ou()}Ku(){return this._u}Zu(){return this.uu}Gu(){return this.cu}Au(){return this.eu||0}Ju(t){const i=t.U_();this.Eu(this.e_/i),this.pu=t.di()-this.Au(),this.Ou(),this.ou=!0,this.Ui.zu(),this.Ui.Fh()}Qu(){const t=this.Tu(),i=this.Pu();null!==t&&null!==i&&this.Ju(new bn(t,i+this.cn.rightOffset))}tc(t){const i=new bn(t.from,t.to);this.Ju(i)}Yi(t){return void 0!==this.bo.timeFormatter?this.bo.timeFormatter(t.originalTime):this.N_.formatHorzItem(t.time)}Lu(){const{handleScroll:t,handleScale:i}=this.Ui.W();return!(t.horzTouchDrag||t.mouseWheel||t.pressedMouseMove||t.vertTouchDrag||i.axisDoubleClickReset.time||i.axisPressedMouseMove.time||i.mouseWheel||i.pinch)}Tu(){return 0===this.ru.length?null:0}Pu(){return 0===this.ru.length?null:this.ru.length-1}ic(t){return(this.e_-1-t)/this.mu}Vu(t){const i=this.ic(t),n=this.Au()+this.pu-i;return Math.round(1e6*n)/1e6}Eu(t){const i=this.mu;this.mu=t,this.Du(),i!==this.mu&&(this.ou=!0,this.nc())}Su(){if(!this.ou)return;if(this.ou=!1,this.Fi())return void this.sc(Mn.su());const t=this.Au(),i=this.e_/this.mu,n=this.pu+t,s=new bn(n-i+1,n);this.sc(new Mn(s))}Du(){const t=this.ec();if(this.mut&&(this.mu=t,this.ou=!0)}}ec(){return this.cn.fixLeftEdge&&this.cn.fixRightEdge&&0!==this.ru.length?this.e_/this.ru.length:this.cn.minBarSpacing}Ou(){const t=this.rc();this.pu>t&&(this.pu=t,this.ou=!0);const i=this.hc();null!==i&&this.puthis.lc(t)),this.N_),this.lu.set(t.weight,i)),i.F_(t)}lc(t){return this.N_.formatTickmark(t,this.bo)}sc(t){const i=this.au;this.au=t,wn(i.iu(),this.au.iu())||this._u.m(),wn(i.nu(),this.au.nu())||this.uu.m(),this.nc()}nc(){this.fu=null}gu(){this.nc(),this.lu.clear()}bu(){this.N_.updateFormatter(this.bo)}Mu(){if(!this.cn.fixLeftEdge)return;const t=this.Tu();if(null===t)return;const i=this.Xs();if(null===i)return;const n=i.Os()-t;if(n<0){const t=this.pu-n-1;this.Jn(t)}this.Du()}xu(){this.Ou(),this.Du()}}class yn extends L{constructor(t){super(),this.ac=new Map,this.Lt=t}Z(t){}J(t){if(!this.Lt.Tt)return;const{context:i,mediaSize:n}=t;let s=0;for(const t of this.Lt.oc){if(0===t.Jt.length)continue;i.font=t.R;const e=this._c(i,t.Jt);e>n.width?t.ju=n.width/e:t.ju=1,s+=t.uc*t.ju}let e=0;switch(this.Lt.cc){case"top":e=0;break;case"center":e=Math.max((n.height-s)/2,0);break;case"bottom":e=Math.max(n.height-s,0)}i.fillStyle=this.Lt.O;for(const t of this.Lt.oc){i.save();let s=0;switch(this.Lt.dc){case"left":i.textAlign="left",s=t.uc/2;break;case"center":i.textAlign="center",s=n.width/2;break;case"right":i.textAlign="right",s=n.width-1-t.uc/2}i.translate(s,e),i.textBaseline="top",i.font=t.R,i.scale(t.ju,t.ju),i.fillText(t.Jt,0,t.fc),i.restore(),e+=t.uc*t.ju}}_c(t,i){const n=this.vc(t.font);let s=n.get(i);return void 0===s&&(s=t.measureText(i).width,n.set(i,s)),s}vc(t){let i=this.ac.get(t);return void 0===i&&(i=new Map,this.ac.set(t,i)),i}}class kn{constructor(t){this.bt=!0,this.jt={Tt:!1,O:"",oc:[],cc:"center",dc:"center"},this.Ht=new yn(this.jt),this.$t=t}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht}St(){const t=this.$t.W(),i=this.jt;i.Tt=t.visible,i.Tt&&(i.O=t.color,i.dc=t.horzAlign,i.cc=t.vertAlign,i.oc=[{Jt:t.text,R:z(t.fontSize,t.fontFamily,t.fontStyle),uc:1.2*t.fontSize,fc:0,ju:0}])}}class Cn extends et{constructor(t,i){super(),this.cn=i,this.wn=new kn(this)}Rn(){return[]}Pn(){return[this.wn]}W(){return this.cn}On(){this.wn.gt()}}var Tn,Pn,Rn,Dn,On;!function(t){t[t.OnTouchEnd=0]="OnTouchEnd",t[t.OnNextTap=1]="OnNextTap"}(Tn||(Tn={}));class An{constructor(t,i,n){this.mc=[],this.bc=[],this.e_=0,this.wc=null,this.gc=new k,this.Mc=new k,this.xc=null,this.Sc=t,this.cn=i,this.N_=n,this.yc=new E(this),this.wl=new Sn(this,i.timeScale,this.cn.localization,n),this.wt=new ht(this,i.crosshair),this.kc=new Xi(i.crosshair),this.Cc=new Cn(this,i.watermark),this.Tc(),this.mc[0].p_(2e3),this.Pc=this.Rc(0),this.Dc=this.Rc(1)}$l(){this.Oc(at.es())}Fh(){this.Oc(at.ss())}sa(){this.Oc(new at(1))}Ul(t){const i=this.Ac(t);this.Oc(i)}Bc(){return this.wc}Vc(t){const i=this.wc;this.wc=t,null!==i&&this.Ul(i.zc),null!==t&&this.Ul(t.zc)}W(){return this.cn}Nh(t){C(this.cn,t),this.mc.forEach((i=>i.c_(t))),void 0!==t.timeScale&&this.wl.Nh(t.timeScale),void 0!==t.localization&&this.wl.wu(t.localization),(t.leftPriceScale||t.rightPriceScale)&&this.gc.m(),this.Pc=this.Rc(0),this.Dc=this.Rc(1),this.$l()}Ec(t,i){if("left"===t)return void this.Nh({leftPriceScale:i});if("right"===t)return void this.Nh({rightPriceScale:i});const n=this.Ic(t);null!==n&&(n.At.Nh(i),this.gc.m())}Ic(t){for(const i of this.mc){const n=i.d_(t);if(null!==n)return{Ut:i,At:n}}return null}kt(){return this.wl}Lc(){return this.mc}Nc(){return this.Cc}Fc(){return this.wt}Wc(){return this.Mc}jc(t,i){t.Oo(i),this.zu()}m_(t){this.e_=t,this.wl.m_(this.e_),this.mc.forEach((i=>i.m_(t))),this.zu()}Tc(t){const i=new pn(this.wl,this);void 0!==t?this.mc.splice(t,0,i):this.mc.push(i);const n=void 0===t?this.mc.length-1:t,s=at.es();return s.Nn(n,{Fn:0,Wn:!0}),this.Oc(s),i}k_(t,i,n){t.k_(i,n)}C_(t,i,n){t.C_(i,n),this.ql(),this.Oc(this.Hc(t,2))}T_(t,i){t.T_(i),this.Oc(this.Hc(t,2))}P_(t,i,n){i.ko()||t.P_(i,n)}R_(t,i,n){i.ko()||(t.R_(i,n),this.ql(),this.Oc(this.Hc(t,2)))}D_(t,i){i.ko()||(t.D_(i),this.Oc(this.Hc(t,2)))}A_(t,i){t.A_(i),this.Oc(this.Hc(t,2))}$c(t){this.wl.Uo(t)}Uc(t,i){const n=this.kt();if(n.Fi()||0===i)return;const s=n.$i();t=Math.max(1,Math.min(t,s)),n.ju(t,i),this.zu()}qc(t){this.Yc(0),this.Xc(t),this.Kc()}Zc(t){this.wl.qo(t),this.zu()}Gc(){this.wl.Yo(),this.Fh()}Yc(t){this.wl.Xo(t)}Xc(t){this.wl.Ko(t),this.zu()}Kc(){this.wl.Zo(),this.Fh()}Mt(){return this.bc}Jc(t,i,n,s,e){this.wt.gn(t,i);let r=NaN,h=this.wl.Bu(t);const l=this.wl.Xs();null!==l&&(h=Math.min(Math.max(l.Os(),h),l.di()));const a=s.vn(),o=a.Pt();null!==o&&(r=a.pn(i,o)),r=this.kc.Ca(r,h,s),this.wt.yn(h,r,s),this.sa(),e||this.Mc.m(this.wt.yt(),{x:t,y:i},n)}Qc(t,i,n){const s=n.vn(),e=s.Pt(),r=s.Ot(t,f(e)),h=this.wl.ka(i,!0),l=this.wl.It(f(h));this.Jc(l,r,null,n,!0)}td(t){this.Fc().Cn(),this.sa(),t||this.Mc.m(null,null,null)}ql(){const t=this.wt.Ut();if(null!==t){const i=this.wt.xn(),n=this.wt.Sn();this.Jc(i,n,null,t)}this.wt.On()}nd(t,i,n){const s=this.wl.mn(0);void 0!==i&&void 0!==n&&this.wl.gt(i,n);const e=this.wl.mn(0),r=this.wl.Au(),h=this.wl.Xs();if(null!==h&&null!==s&&null!==e){const i=h.Kr(r),l=this.N_.key(s)>this.N_.key(e),a=null!==t&&t>r&&!l,o=this.wl.W().allowShiftVisibleRangeOnWhitespaceReplacement,_=i&&(!(void 0===n)||o)&&this.wl.W().shiftVisibleRangeOnNewBar;if(a&&!_){const i=t-r;this.wl.Jn(this.wl.Iu()-i)}}this.wl.Wu(t)}Kl(t){null!==t&&t.V_()}cr(t){const i=this.mc.find((i=>i.No().includes(t)));return void 0===i?null:i}zu(){this.Cc.On(),this.mc.forEach((t=>t.V_())),this.ql()}S(){this.mc.forEach((t=>t.S())),this.mc.length=0,this.cn.localization.priceFormatter=void 0,this.cn.localization.percentageFormatter=void 0,this.cn.localization.timeFormatter=void 0}sd(){return this.yc}mr(){return this.yc.W()}f_(){return this.gc}ed(t,i,n){const s=this.mc[0],e=this.rd(i,t,s,n);return this.bc.push(e),1===this.bc.length?this.$l():this.Fh(),e}hd(t){const i=this.cr(t),n=this.bc.indexOf(t);c(-1!==n,"Series not found"),this.bc.splice(n,1),f(i).jo(t),t.S&&t.S()}Hl(t,i){const n=f(this.cr(t));n.jo(t);const s=this.Ic(i);if(null===s){const s=t.Zi();n.Fo(t,i,s)}else{const e=s.Ut===n?t.Zi():void 0;s.Ut.Fo(t,i,e)}}Qu(){const t=at.ss();t.$n(),this.Oc(t)}ld(t){const i=at.ss();i.Yn(t),this.Oc(i)}Zn(){const t=at.ss();t.Zn(),this.Oc(t)}Gn(t){const i=at.ss();i.Gn(t),this.Oc(i)}Jn(t){const i=at.ss();i.Jn(t),this.Oc(i)}Xn(t){const i=at.ss();i.Xn(t),this.Oc(i)}Un(){const t=at.ss();t.Un(),this.Oc(t)}ad(){return this.cn.rightPriceScale.visible?"right":"left"}od(){return this.Dc}q(){return this.Pc}zt(t){const i=this.Dc,n=this.Pc;if(i===n)return i;if(t=Math.max(0,Math.min(100,Math.round(100*t))),null===this.xc||this.xc.Ts!==n||this.xc.Ps!==i)this.xc={Ts:n,Ps:i,_d:new Map};else{const i=this.xc._d.get(t);if(void 0!==i)return i}const s=function(t,i,n){const[s,e,r,h]=S(t),[l,a,o,_]=S(i),u=[m(s+n*(l-s)),m(e+n*(a-e)),m(r+n*(o-r)),b(h+n*(_-h))];return`rgba(${u[0]}, ${u[1]}, ${u[2]}, ${u[3]})`}(n,i,t/100);return this.xc._d.set(t,s),s}Hc(t,i){const n=new at(i);if(null!==t){const s=this.mc.indexOf(t);n.Nn(s,{Fn:i})}return n}Ac(t,i){return void 0===i&&(i=2),this.Hc(this.cr(t),i)}Oc(t){this.Sc&&this.Sc(t),this.mc.forEach((t=>t.E_().Wh().gt()))}rd(t,i,n,s){const e=new Yi(this,t,i,n,s),r=void 0!==t.priceScaleId?t.priceScaleId:this.ad();return n.Fo(e,r),lt(r)||e.Nh(t),e}Rc(t){const i=this.cn.layout;return"gradient"===i.background.type?0===t?i.background.topColor:i.background.bottomColor:i.background.color}}function Bn(t){return!T(t)&&!R(t)}function Vn(t){return T(t)}!function(t){t[t.Disabled=0]="Disabled",t[t.Continuous=1]="Continuous",t[t.OnDataUpdate=2]="OnDataUpdate"}(Pn||(Pn={})),function(t){t[t.LastBar=0]="LastBar",t[t.LastVisible=1]="LastVisible"}(Rn||(Rn={})),function(t){t.Solid="solid",t.VerticalGradient="gradient"}(Dn||(Dn={})),function(t){t[t.Year=0]="Year",t[t.Month=1]="Month",t[t.DayOfMonth=2]="DayOfMonth",t[t.Time=3]="Time",t[t.TimeWithSeconds=4]="TimeWithSeconds"}(On||(On={}));const zn=t=>t.getUTCFullYear();function En(t,i,n){return i.replace(/yyyy/g,(t=>_t(zn(t),4))(t)).replace(/yy/g,(t=>_t(zn(t)%100,2))(t)).replace(/MMMM/g,((t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"long"}))(t,n)).replace(/MMM/g,((t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"short"}))(t,n)).replace(/MM/g,(t=>_t((t=>t.getUTCMonth()+1)(t),2))(t)).replace(/dd/g,(t=>_t((t=>t.getUTCDate())(t),2))(t))}class In{constructor(t="yyyy-MM-dd",i="default"){this.ud=t,this.dd=i}F_(t){return En(t,this.ud,this.dd)}}class Ln{constructor(t){this.fd=t||"%h:%m:%s"}F_(t){return this.fd.replace("%h",_t(t.getUTCHours(),2)).replace("%m",_t(t.getUTCMinutes(),2)).replace("%s",_t(t.getUTCSeconds(),2))}}const Nn={vd:"yyyy-MM-dd",pd:"%h:%m:%s",md:" ",bd:"default"};class Fn{constructor(t={}){const i=Object.assign(Object.assign({},Nn),t);this.wd=new In(i.vd,i.bd),this.gd=new Ln(i.pd),this.Md=i.md}F_(t){return`${this.wd.F_(t)}${this.Md}${this.gd.F_(t)}`}}function Wn(t){return 60*t*60*1e3}function jn(t){return 60*t*1e3}const Hn=[{xd:($n=1,1e3*$n),Sd:10},{xd:jn(1),Sd:20},{xd:jn(5),Sd:21},{xd:jn(30),Sd:22},{xd:Wn(1),Sd:30},{xd:Wn(3),Sd:31},{xd:Wn(6),Sd:32},{xd:Wn(12),Sd:33}];var $n;function Un(t,i){if(t.getUTCFullYear()!==i.getUTCFullYear())return 70;if(t.getUTCMonth()!==i.getUTCMonth())return 60;if(t.getUTCDate()!==i.getUTCDate())return 50;for(let n=Hn.length-1;n>=0;--n)if(Math.floor(i.getTime()/Hn[n].xd)!==Math.floor(t.getTime()/Hn[n].xd))return Hn[n].Sd;return 0}function qn(t){let i=t;if(R(t)&&(i=Xn(t)),!Bn(i))throw new Error("time must be of type BusinessDay");const n=new Date(Date.UTC(i.year,i.month-1,i.day,0,0,0,0));return{yd:Math.round(n.getTime()/1e3),kd:i}}function Yn(t){if(!Vn(t))throw new Error("time must be of type isUTCTimestamp");return{yd:t}}function Xn(t){const i=new Date(t);if(isNaN(i.getTime()))throw new Error(`Invalid date string=${t}, expected format=yyyy-mm-dd`);return{day:i.getUTCDate(),month:i.getUTCMonth()+1,year:i.getUTCFullYear()}}function Kn(t){R(t.time)&&(t.time=Xn(t.time))}class Zn{options(){return this.cn}setOptions(t){this.cn=t,this.updateFormatter(t.localization)}preprocessData(t){Array.isArray(t)?function(t){t.forEach(Kn)}(t):Kn(t)}createConverterToInternalObj(t){return f(function(t){return 0===t.length?null:Bn(t[0].time)||R(t[0].time)?qn:Yn}(t))}key(t){return"object"==typeof t&&"yd"in t?t.yd:this.key(this.convertHorzItemToInternal(t))}cacheKey(t){const i=t;return void 0===i.kd?new Date(1e3*i.yd).getTime():new Date(Date.UTC(i.kd.year,i.kd.month-1,i.kd.day)).getTime()}convertHorzItemToInternal(t){return Vn(i=t)?Yn(i):Bn(i)?qn(i):qn(Xn(i));var i}updateFormatter(t){if(!this.cn)return;const i=t.dateFormat;this.cn.timeScale.timeVisible?this.Cd=new Fn({vd:i,pd:this.cn.timeScale.secondsVisible?"%h:%m:%s":"%h:%m",md:" ",bd:t.locale}):this.Cd=new In(i,t.locale)}formatHorzItem(t){const i=t;return this.Cd.F_(new Date(1e3*i.yd))}formatTickmark(t,i){const n=function(t,i,n){switch(t){case 0:case 10:return i?n?4:3:2;case 20:case 21:case 22:case 30:case 31:case 32:case 33:return i?3:2;case 50:return 2;case 60:return 1;case 70:return 0}}(t.weight,this.cn.timeScale.timeVisible,this.cn.timeScale.secondsVisible),s=this.cn.timeScale;if(void 0!==s.tickMarkFormatter){const e=s.tickMarkFormatter(t.originalTime,n,i.locale);if(null!==e)return e}return function(t,i,n){const s={};switch(i){case 0:s.year="numeric";break;case 1:s.month="short";break;case 2:s.day="numeric";break;case 3:s.hour12=!1,s.hour="2-digit",s.minute="2-digit";break;case 4:s.hour12=!1,s.hour="2-digit",s.minute="2-digit",s.second="2-digit"}const e=void 0===t.kd?new Date(1e3*t.yd):new Date(Date.UTC(t.kd.year,t.kd.month-1,t.kd.day));return new Date(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()).toLocaleString(n,s)}(t.time,n,i.locale)}maxTickMarkWeight(t){let i=t.reduce(xn,t[0]).weight;return i>30&&i<50&&(i=30),i}fillWeightsForPoints(t,i){!function(t,i=0){if(0===t.length)return;let n=0===i?null:t[i-1].time.yd,s=null!==n?new Date(1e3*n):null,e=0;for(let r=i;r1){const i=Math.ceil(e/(t.length-1)),n=new Date(1e3*(t[0].time.yd-i));t[0].timeWeight=Un(new Date(1e3*t[0].time.yd),n)}}(t,i)}static Td(t){return C({localization:{dateFormat:"dd MMM 'yy"}},null!=t?t:{})}}function Gn(t){var i=t.width,n=t.height;if(i<0)throw new Error("Negative width is not allowed for Size");if(n<0)throw new Error("Negative height is not allowed for Size");return{width:i,height:n}}function Jn(t,i){return t.width===i.width&&t.height===i.height}var Qn=function(){function t(t){var i=this;this._resolutionListener=function(){return i._onResolutionChanged()},this._resolutionMediaQueryList=null,this._observers=[],this._window=t,this._installResolutionListener()}return t.prototype.dispose=function(){this._uninstallResolutionListener(),this._window=null},Object.defineProperty(t.prototype,"value",{get:function(){return this._window.devicePixelRatio},enumerable:!1,configurable:!0}),t.prototype.subscribe=function(t){var i=this,n={next:t};return this._observers.push(n),{unsubscribe:function(){i._observers=i._observers.filter((function(t){return t!==n}))}}},t.prototype._installResolutionListener=function(){if(null!==this._resolutionMediaQueryList)throw new Error("Resolution listener is already installed");var t=this._window.devicePixelRatio;this._resolutionMediaQueryList=this._window.matchMedia("all and (resolution: ".concat(t,"dppx)")),this._resolutionMediaQueryList.addListener(this._resolutionListener)},t.prototype._uninstallResolutionListener=function(){null!==this._resolutionMediaQueryList&&(this._resolutionMediaQueryList.removeListener(this._resolutionListener),this._resolutionMediaQueryList=null)},t.prototype._reinstallResolutionListener=function(){this._uninstallResolutionListener(),this._installResolutionListener()},t.prototype._onResolutionChanged=function(){var t=this;this._observers.forEach((function(i){return i.next(t._window.devicePixelRatio)})),this._reinstallResolutionListener()},t}();var ts=function(){function t(t,i,n){var s;this._canvasElement=null,this._bitmapSizeChangedListeners=[],this._suggestedBitmapSize=null,this._suggestedBitmapSizeChangedListeners=[],this._devicePixelRatioObservable=null,this._canvasElementResizeObserver=null,this._canvasElement=t,this._canvasElementClientSize=Gn({width:this._canvasElement.clientWidth,height:this._canvasElement.clientHeight}),this._transformBitmapSize=null!=i?i:function(t){return t},this._allowResizeObserver=null===(s=null==n?void 0:n.allowResizeObserver)||void 0===s||s,this._chooseAndInitObserver()}return t.prototype.dispose=function(){var t,i;if(null===this._canvasElement)throw new Error("Object is disposed");null===(t=this._canvasElementResizeObserver)||void 0===t||t.disconnect(),this._canvasElementResizeObserver=null,null===(i=this._devicePixelRatioObservable)||void 0===i||i.dispose(),this._devicePixelRatioObservable=null,this._suggestedBitmapSizeChangedListeners.length=0,this._bitmapSizeChangedListeners.length=0,this._canvasElement=null},Object.defineProperty(t.prototype,"canvasElement",{get:function(){if(null===this._canvasElement)throw new Error("Object is disposed");return this._canvasElement},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"canvasElementClientSize",{get:function(){return this._canvasElementClientSize},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"bitmapSize",{get:function(){return Gn({width:this.canvasElement.width,height:this.canvasElement.height})},enumerable:!1,configurable:!0}),t.prototype.resizeCanvasElement=function(t){this._canvasElementClientSize=Gn(t),this.canvasElement.style.width="".concat(this._canvasElementClientSize.width,"px"),this.canvasElement.style.height="".concat(this._canvasElementClientSize.height,"px"),this._invalidateBitmapSize()},t.prototype.subscribeBitmapSizeChanged=function(t){this._bitmapSizeChangedListeners.push(t)},t.prototype.unsubscribeBitmapSizeChanged=function(t){this._bitmapSizeChangedListeners=this._bitmapSizeChangedListeners.filter((function(i){return i!==t}))},Object.defineProperty(t.prototype,"suggestedBitmapSize",{get:function(){return this._suggestedBitmapSize},enumerable:!1,configurable:!0}),t.prototype.subscribeSuggestedBitmapSizeChanged=function(t){this._suggestedBitmapSizeChangedListeners.push(t)},t.prototype.unsubscribeSuggestedBitmapSizeChanged=function(t){this._suggestedBitmapSizeChangedListeners=this._suggestedBitmapSizeChangedListeners.filter((function(i){return i!==t}))},t.prototype.applySuggestedBitmapSize=function(){if(null!==this._suggestedBitmapSize){var t=this._suggestedBitmapSize;this._suggestedBitmapSize=null,this._resizeBitmap(t),this._emitSuggestedBitmapSizeChanged(t,this._suggestedBitmapSize)}},t.prototype._resizeBitmap=function(t){var i=this.bitmapSize;Jn(i,t)||(this.canvasElement.width=t.width,this.canvasElement.height=t.height,this._emitBitmapSizeChanged(i,t))},t.prototype._emitBitmapSizeChanged=function(t,i){var n=this;this._bitmapSizeChangedListeners.forEach((function(s){return s.call(n,t,i)}))},t.prototype._suggestNewBitmapSize=function(t){var i=this._suggestedBitmapSize,n=Gn(this._transformBitmapSize(t,this._canvasElementClientSize)),s=Jn(this.bitmapSize,n)?null:n;null===i&&null===s||null!==i&&null!==s&&Jn(i,s)||(this._suggestedBitmapSize=s,this._emitSuggestedBitmapSizeChanged(i,s))},t.prototype._emitSuggestedBitmapSizeChanged=function(t,i){var n=this;this._suggestedBitmapSizeChangedListeners.forEach((function(s){return s.call(n,t,i)}))},t.prototype._chooseAndInitObserver=function(){var t=this;this._allowResizeObserver?new Promise((function(t){var i=new ResizeObserver((function(n){t(n.every((function(t){return"devicePixelContentBoxSize"in t}))),i.disconnect()}));i.observe(document.body,{box:"device-pixel-content-box"})})).catch((function(){return!1})).then((function(i){return i?t._initResizeObserver():t._initDevicePixelRatioObservable()})):this._initDevicePixelRatioObservable()},t.prototype._initDevicePixelRatioObservable=function(){var t=this;if(null!==this._canvasElement){var i=is(this._canvasElement);if(null===i)throw new Error("No window is associated with the canvas");this._devicePixelRatioObservable=function(t){return new Qn(t)}(i),this._devicePixelRatioObservable.subscribe((function(){return t._invalidateBitmapSize()})),this._invalidateBitmapSize()}},t.prototype._invalidateBitmapSize=function(){var t,i;if(null!==this._canvasElement){var n=is(this._canvasElement);if(null!==n){var s=null!==(i=null===(t=this._devicePixelRatioObservable)||void 0===t?void 0:t.value)&&void 0!==i?i:n.devicePixelRatio,e=this._canvasElement.getClientRects(),r=void 0!==e[0]?function(t,i){return Gn({width:Math.round(t.left*i+t.width*i)-Math.round(t.left*i),height:Math.round(t.top*i+t.height*i)-Math.round(t.top*i)})}(e[0],s):Gn({width:this._canvasElementClientSize.width*s,height:this._canvasElementClientSize.height*s});this._suggestNewBitmapSize(r)}}},t.prototype._initResizeObserver=function(){var t=this;null!==this._canvasElement&&(this._canvasElementResizeObserver=new ResizeObserver((function(i){var n=i.find((function(i){return i.target===t._canvasElement}));if(n&&n.devicePixelContentBoxSize&&n.devicePixelContentBoxSize[0]){var s=n.devicePixelContentBoxSize[0],e=Gn({width:s.inlineSize,height:s.blockSize});t._suggestNewBitmapSize(e)}})),this._canvasElementResizeObserver.observe(this._canvasElement,{box:"device-pixel-content-box"}))},t}();function is(t){return t.ownerDocument.defaultView}var ns=function(){function t(t,i,n){if(0===i.width||0===i.height)throw new TypeError("Rendering target could only be created on a media with positive width and height");if(this._mediaSize=i,0===n.width||0===n.height)throw new TypeError("Rendering target could only be created using a bitmap with positive integer width and height");this._bitmapSize=n,this._context=t}return t.prototype.useMediaCoordinateSpace=function(t){try{return this._context.save(),this._context.setTransform(1,0,0,1,0,0),this._context.scale(this._horizontalPixelRatio,this._verticalPixelRatio),t({context:this._context,mediaSize:this._mediaSize})}finally{this._context.restore()}},t.prototype.useBitmapCoordinateSpace=function(t){try{return this._context.save(),this._context.setTransform(1,0,0,1,0,0),t({context:this._context,mediaSize:this._mediaSize,bitmapSize:this._bitmapSize,horizontalPixelRatio:this._horizontalPixelRatio,verticalPixelRatio:this._verticalPixelRatio})}finally{this._context.restore()}},Object.defineProperty(t.prototype,"_horizontalPixelRatio",{get:function(){return this._bitmapSize.width/this._mediaSize.width},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"_verticalPixelRatio",{get:function(){return this._bitmapSize.height/this._mediaSize.height},enumerable:!1,configurable:!0}),t}();function ss(t,i){var n=t.canvasElementClientSize;if(0===n.width||0===n.height)return null;var s=t.bitmapSize;if(0===s.width||0===s.height)return null;var e=t.canvasElement.getContext("2d",i);return null===e?null:new ns(e,n,s)}const es="undefined"!=typeof window;function rs(){return!!es&&window.navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function hs(){return!!es&&/iPhone|iPad|iPod/.test(window.navigator.platform)}function ls(t){return t+t%2}function as(t,i){return t.Pd-i.Pd}function os(t,i,n){const s=(t.Pd-i.Pd)/(t.ut-i.ut);return Math.sign(s)*Math.min(Math.abs(s),n)}class _s{constructor(t,i,n,s){this.Rd=null,this.Dd=null,this.Od=null,this.Ad=null,this.Bd=null,this.Vd=0,this.zd=0,this.Ed=t,this.Id=i,this.Ld=n,this.rs=s}Nd(t,i){if(null!==this.Rd){if(this.Rd.ut===i)return void(this.Rd.Pd=t);if(Math.abs(this.Rd.Pd-t)50)return;let n=0;const s=os(this.Rd,this.Dd,this.Id),e=as(this.Rd,this.Dd),r=[s],h=[e];if(n+=e,null!==this.Od){const t=os(this.Dd,this.Od,this.Id);if(Math.sign(t)===Math.sign(s)){const i=as(this.Dd,this.Od);if(r.push(t),h.push(i),n+=i,null!==this.Ad){const t=os(this.Od,this.Ad,this.Id);if(Math.sign(t)===Math.sign(s)){const i=as(this.Od,this.Ad);r.push(t),h.push(i),n+=i}}}}let l=0;for(let t=0;t({width:Math.max(t.width,i.width),height:Math.max(t.height,i.height)})});return s.resizeCanvasElement(i),s}function cs(t,i,n,s){t.G&&t.G(i,n,s)}function ds(t,i,n,s){t.K(i,n,s)}function fs(t,i,n,s){const e=t(n,s);for(const t of e){const n=t.xt();null!==n&&i(n)}}function vs(t){es&&void 0!==window.chrome&&t.addEventListener("mousedown",(t=>{if(1===t.button)return t.preventDefault(),!1}))}class ps{constructor(t,i,n){this.Wd=0,this.jd=null,this.Hd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY},this.$d=0,this.Ud=null,this.qd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY},this.Yd=null,this.Xd=!1,this.Kd=null,this.Zd=null,this.Gd=!1,this.Jd=!1,this.Qd=!1,this.tf=null,this.if=null,this.nf=null,this.sf=null,this.ef=null,this.rf=null,this.hf=null,this.lf=0,this.af=!1,this._f=!1,this.uf=!1,this.cf=0,this.df=null,this.ff=!hs(),this.vf=t=>{this.pf(t)},this.mf=t=>{if(this.bf(t)){const i=this.wf(t);if(++this.$d,this.Ud&&this.$d>1){const{gf:n}=this.Mf(ws(t),this.qd);n<30&&!this.Qd&&this.xf(i,this.yf.Sf),this.kf()}}else{const i=this.wf(t);if(++this.Wd,this.jd&&this.Wd>1){const{gf:n}=this.Mf(ws(t),this.Hd);n<5&&!this.Jd&&this.Cf(i,this.yf.Tf),this.Pf()}}},this.Rf=t,this.yf=i,this.cn=n,this.Df()}S(){null!==this.tf&&(this.tf(),this.tf=null),null!==this.if&&(this.if(),this.if=null),null!==this.sf&&(this.sf(),this.sf=null),null!==this.ef&&(this.ef(),this.ef=null),null!==this.rf&&(this.rf(),this.rf=null),null!==this.nf&&(this.nf(),this.nf=null),this.Of(),this.Pf()}Af(t){this.sf&&this.sf();const i=this.Bf.bind(this);if(this.sf=()=>{this.Rf.removeEventListener("mousemove",i)},this.Rf.addEventListener("mousemove",i),this.bf(t))return;const n=this.wf(t);this.Cf(n,this.yf.Vf),this.ff=!0}Pf(){null!==this.jd&&clearTimeout(this.jd),this.Wd=0,this.jd=null,this.Hd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY}}kf(){null!==this.Ud&&clearTimeout(this.Ud),this.$d=0,this.Ud=null,this.qd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY}}Bf(t){if(this.uf||null!==this.Zd)return;if(this.bf(t))return;const i=this.wf(t);this.Cf(i,this.yf.zf),this.ff=!0}Ef(t){const i=Ms(t.changedTouches,f(this.df));if(null===i)return;if(this.cf=gs(t),null!==this.hf)return;if(this._f)return;this.af=!0;const n=this.Mf(ws(i),f(this.Zd)),{If:s,Lf:e,gf:r}=n;if(this.Gd||!(r<5)){if(!this.Gd){const t=.5*s,i=e>=t&&!this.cn.Nf(),n=t>e&&!this.cn.Ff();i||n||(this._f=!0),this.Gd=!0,this.Qd=!0,this.Of(),this.kf()}if(!this._f){const n=this.wf(t,i);this.xf(n,this.yf.Wf),bs(t)}}}jf(t){if(0!==t.button)return;const i=this.Mf(ws(t),f(this.Kd)),{gf:n}=i;if(n>=5&&(this.Jd=!0,this.Pf()),this.Jd){const i=this.wf(t);this.Cf(i,this.yf.Hf)}}Mf(t,i){const n=Math.abs(i.et-t.et),s=Math.abs(i.rt-t.rt);return{If:n,Lf:s,gf:n+s}}$f(t){let i=Ms(t.changedTouches,f(this.df));if(null===i&&0===t.touches.length&&(i=t.changedTouches[0]),null===i)return;this.df=null,this.cf=gs(t),this.Of(),this.Zd=null,this.rf&&(this.rf(),this.rf=null);const n=this.wf(t,i);if(this.xf(n,this.yf.Uf),++this.$d,this.Ud&&this.$d>1){const{gf:t}=this.Mf(ws(i),this.qd);t<30&&!this.Qd&&this.xf(n,this.yf.Sf),this.kf()}else this.Qd||(this.xf(n,this.yf.qf),this.yf.qf&&bs(t));0===this.$d&&bs(t),0===t.touches.length&&this.Xd&&(this.Xd=!1,bs(t))}pf(t){if(0!==t.button)return;const i=this.wf(t);if(this.Kd=null,this.uf=!1,this.ef&&(this.ef(),this.ef=null),rs()){this.Rf.ownerDocument.documentElement.removeEventListener("mouseleave",this.vf)}if(!this.bf(t))if(this.Cf(i,this.yf.Yf),++this.Wd,this.jd&&this.Wd>1){const{gf:n}=this.Mf(ws(t),this.Hd);n<5&&!this.Jd&&this.Cf(i,this.yf.Tf),this.Pf()}else this.Jd||this.Cf(i,this.yf.Xf)}Of(){null!==this.Yd&&(clearTimeout(this.Yd),this.Yd=null)}Kf(t){if(null!==this.df)return;const i=t.changedTouches[0];this.df=i.identifier,this.cf=gs(t);const n=this.Rf.ownerDocument.documentElement;this.Qd=!1,this.Gd=!1,this._f=!1,this.Zd=ws(i),this.rf&&(this.rf(),this.rf=null);{const i=this.Ef.bind(this),s=this.$f.bind(this);this.rf=()=>{n.removeEventListener("touchmove",i),n.removeEventListener("touchend",s)},n.addEventListener("touchmove",i,{passive:!1}),n.addEventListener("touchend",s,{passive:!1}),this.Of(),this.Yd=setTimeout(this.Zf.bind(this,t),240)}const s=this.wf(t,i);this.xf(s,this.yf.Gf),this.Ud||(this.$d=0,this.Ud=setTimeout(this.kf.bind(this),500),this.qd=ws(i))}Jf(t){if(0!==t.button)return;const i=this.Rf.ownerDocument.documentElement;rs()&&i.addEventListener("mouseleave",this.vf),this.Jd=!1,this.Kd=ws(t),this.ef&&(this.ef(),this.ef=null);{const t=this.jf.bind(this),n=this.pf.bind(this);this.ef=()=>{i.removeEventListener("mousemove",t),i.removeEventListener("mouseup",n)},i.addEventListener("mousemove",t),i.addEventListener("mouseup",n)}if(this.uf=!0,this.bf(t))return;const n=this.wf(t);this.Cf(n,this.yf.Qf),this.jd||(this.Wd=0,this.jd=setTimeout(this.Pf.bind(this),500),this.Hd=ws(t))}Df(){this.Rf.addEventListener("mouseenter",this.Af.bind(this)),this.Rf.addEventListener("touchcancel",this.Of.bind(this));{const t=this.Rf.ownerDocument,i=t=>{this.yf.tv&&(t.composed&&this.Rf.contains(t.composedPath()[0])||t.target&&this.Rf.contains(t.target)||this.yf.tv())};this.if=()=>{t.removeEventListener("touchstart",i)},this.tf=()=>{t.removeEventListener("mousedown",i)},t.addEventListener("mousedown",i),t.addEventListener("touchstart",i,{passive:!0})}hs()&&(this.nf=()=>{this.Rf.removeEventListener("dblclick",this.mf)},this.Rf.addEventListener("dblclick",this.mf)),this.Rf.addEventListener("mouseleave",this.iv.bind(this)),this.Rf.addEventListener("touchstart",this.Kf.bind(this),{passive:!0}),vs(this.Rf),this.Rf.addEventListener("mousedown",this.Jf.bind(this)),this.nv(),this.Rf.addEventListener("touchmove",(()=>{}),{passive:!1})}nv(){void 0===this.yf.sv&&void 0===this.yf.ev&&void 0===this.yf.rv||(this.Rf.addEventListener("touchstart",(t=>this.hv(t.touches)),{passive:!0}),this.Rf.addEventListener("touchmove",(t=>{if(2===t.touches.length&&null!==this.hf&&void 0!==this.yf.ev){const i=ms(t.touches[0],t.touches[1])/this.lf;this.yf.ev(this.hf,i),bs(t)}}),{passive:!1}),this.Rf.addEventListener("touchend",(t=>{this.hv(t.touches)})))}hv(t){1===t.length&&(this.af=!1),2!==t.length||this.af||this.Xd?this.lv():this.av(t)}av(t){const i=this.Rf.getBoundingClientRect()||{left:0,top:0};this.hf={et:(t[0].clientX-i.left+(t[1].clientX-i.left))/2,rt:(t[0].clientY-i.top+(t[1].clientY-i.top))/2},this.lf=ms(t[0],t[1]),void 0!==this.yf.sv&&this.yf.sv(),this.Of()}lv(){null!==this.hf&&(this.hf=null,void 0!==this.yf.rv&&this.yf.rv())}iv(t){if(this.sf&&this.sf(),this.bf(t))return;if(!this.ff)return;const i=this.wf(t);this.Cf(i,this.yf.ov),this.ff=!hs()}Zf(t){const i=Ms(t.touches,f(this.df));if(null===i)return;const n=this.wf(t,i);this.xf(n,this.yf._v),this.Qd=!0,this.Xd=!0}bf(t){return t.sourceCapabilities&&void 0!==t.sourceCapabilities.firesTouchEvents?t.sourceCapabilities.firesTouchEvents:gs(t){"touchstart"!==t.type&&bs(t)}}}}function ms(t,i){const n=t.clientX-i.clientX,s=t.clientY-i.clientY;return Math.sqrt(n*n+s*s)}function bs(t){t.cancelable&&t.preventDefault()}function ws(t){return{et:t.pageX,rt:t.pageY}}function gs(t){return t.timeStamp||performance.now()}function Ms(t,i){for(let n=0;n{var s,e,r,h;return(null!==(e=null===(s=n.At())||void 0===s?void 0:s.xa())&&void 0!==e?e:"")!==i?[]:null!==(h=null===(r=n.la)||void 0===r?void 0:r.call(n,t))&&void 0!==h?h:[]}}class ks{constructor(t,i,n,s){this.Li=null,this.wv=null,this.gv=!1,this.Mv=new Qt(200),this.Gr=null,this.xv=0,this.Sv=!1,this.yv=()=>{this.Sv||this.nn.kv().qt().Fh()},this.Cv=()=>{this.Sv||this.nn.kv().qt().Fh()},this.nn=t,this.cn=i,this.mo=i.layout,this.yc=n,this.Tv="left"===s,this.Pv=ys("normal",s),this.Rv=ys("top",s),this.Dv=ys("bottom",s),this.Ov=document.createElement("div"),this.Ov.style.height="100%",this.Ov.style.overflow="hidden",this.Ov.style.width="25px",this.Ov.style.left="0",this.Ov.style.position="relative",this.Av=us(this.Ov,Gn({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.yv);const e=this.Av.canvasElement;e.style.position="absolute",e.style.zIndex="1",e.style.left="0",e.style.top="0",this.Bv=us(this.Ov,Gn({width:16,height:16})),this.Bv.subscribeSuggestedBitmapSizeChanged(this.Cv);const r=this.Bv.canvasElement;r.style.position="absolute",r.style.zIndex="2",r.style.left="0",r.style.top="0";const h={Qf:this.Vv.bind(this),Gf:this.Vv.bind(this),Hf:this.zv.bind(this),Wf:this.zv.bind(this),tv:this.Ev.bind(this),Yf:this.Iv.bind(this),Uf:this.Iv.bind(this),Tf:this.Lv.bind(this),Sf:this.Lv.bind(this),Vf:this.Nv.bind(this),ov:this.Fv.bind(this)};this.Wv=new ps(this.Bv.canvasElement,h,{Nf:()=>!this.cn.handleScroll.vertTouchDrag,Ff:()=>!0})}S(){this.Wv.S(),this.Bv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Bv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.yv),this.Av.dispose(),null!==this.Li&&this.Li.$o().p(this),this.Li=null}jv(){return this.Ov}P(){return this.mo.fontSize}Hv(){const t=this.yc.W();return this.Gr!==t.R&&(this.Mv.ir(),this.Gr=t.R),t}$v(){if(null===this.Li)return 0;let t=0;const i=this.Hv(),n=f(this.Av.canvasElement.getContext("2d"));n.save();const s=this.Li.Ia();n.font=this.Uv(),s.length>0&&(t=Math.max(this.Mv.Si(n,s[0].Za),this.Mv.Si(n,s[s.length-1].Za)));const e=this.qv();for(let i=e.length;i--;){const s=this.Mv.Si(n,e[i].Jt());s>t&&(t=s)}const r=this.Li.Pt();if(null!==r&&null!==this.wv){const i=this.Li.pn(1,r),s=this.Li.pn(this.wv.height-2,r);t=Math.max(t,this.Mv.Si(n,this.Li.Wi(Math.floor(Math.min(i,s))+.11111111111111,r)),this.Mv.Si(n,this.Li.Wi(Math.ceil(Math.max(i,s))-.11111111111111,r)))}n.restore();const h=t||34;return ls(Math.ceil(i.C+i.T+i.V+i.I+5+h))}Yv(t){null!==this.wv&&Jn(this.wv,t)||(this.wv=t,this.Sv=!0,this.Av.resizeCanvasElement(t),this.Bv.resizeCanvasElement(t),this.Sv=!1,this.Ov.style.width=`${t.width}px`,this.Ov.style.height=`${t.height}px`)}Xv(){return f(this.wv).width}Ji(t){this.Li!==t&&(null!==this.Li&&this.Li.$o().p(this),this.Li=t,t.$o().l(this.ao.bind(this),this))}At(){return this.Li}ir(){const t=this.nn.Kv();this.nn.kv().qt().A_(t,f(this.At()))}Zv(t){if(null===this.wv)return;if(1!==t){this.Gv(),this.Av.applySuggestedBitmapSize();const t=ss(this.Av);null!==t&&(t.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Ve(t)})),this.nn.Qv(t,this.Dv),this.tp(t),this.nn.Qv(t,this.Pv),this.ip(t))}this.Bv.applySuggestedBitmapSize();const i=ss(this.Bv);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.np(i),this.nn.Qv(i,this.Rv))}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}gt(){var t;null===(t=this.Li)||void 0===t||t.Ia()}Vv(t){if(null===this.Li||this.Li.Fi()||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.kv().qt(),n=this.nn.Kv();this.gv=!0,i.k_(n,this.Li,t.localY)}zv(t){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.kv().qt(),n=this.nn.Kv(),s=this.Li;i.C_(n,s,t.localY)}Ev(){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const t=this.nn.kv().qt(),i=this.nn.Kv(),n=this.Li;this.gv&&(this.gv=!1,t.T_(i,n))}Iv(t){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.kv().qt(),n=this.nn.Kv();this.gv=!1,i.T_(n,this.Li)}Lv(t){this.cn.handleScale.axisDoubleClickReset.price&&this.ir()}Nv(t){if(null===this.Li)return;!this.nn.kv().qt().W().handleScale.axisPressedMouseMove.price||this.Li.ph()||this.Li.Co()||this.rp(1)}Fv(t){this.rp(0)}qv(){const t=[],i=null===this.Li?void 0:this.Li;return(n=>{for(let s=0;s{t.fillStyle=n.borderColor;const l=Math.max(1,Math.floor(h)),a=Math.floor(.5*h),o=Math.round(s.T*r);t.beginPath();for(const n of i)t.rect(Math.floor(e*r),Math.round(n.Aa*h)-a,o,l);t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{var r;t.font=this.Uv(),t.fillStyle=null!==(r=n.textColor)&&void 0!==r?r:this.mo.textColor,t.textAlign=this.Tv?"right":"left",t.textBaseline="middle";const h=this.Tv?Math.round(e-s.V):Math.round(e+s.T+s.V),l=i.map((i=>this.Mv.xi(t,i.Za)));for(let n=i.length;n--;){const s=i[n];t.fillText(s.Za,h,s.Aa+l[n])}}))}Gv(){if(null===this.wv||null===this.Li)return;let t=this.wv.height/2;const i=[],n=this.Li.No().slice(),s=this.nn.Kv(),e=this.Hv();this.Li===s.vr()&&this.nn.Kv().No().forEach((t=>{s.dr(t)&&n.push(t)}));const r=this.Li.Ta()[0],h=this.Li;n.forEach((n=>{const e=n.Rn(s,h);e.forEach((t=>{t.Bi(null),t.Vi()&&i.push(t)})),r===n&&e.length>0&&(t=e[0].ki())})),i.forEach((t=>t.Bi(t.ki())));this.Li.W().alignLabels&&this.hp(i,e,t)}hp(t,i,n){if(null===this.wv)return;const s=t.filter((t=>t.ki()<=n)),e=t.filter((t=>t.ki()>n));s.sort(((t,i)=>i.ki()-t.ki())),s.length&&e.length&&e.push(s[0]),e.sort(((t,i)=>t.ki()-i.ki()));for(const n of t){const t=Math.floor(n.Et(i)/2),s=n.ki();s>-t&&sthis.wv.height-t&&sl-r&&n.Bi(l-r)}for(let t=1;t{if(i.zi()){i.xt(f(this.Li)).K(t,n,this.Mv,s)}}))}np(t){if(null===this.wv||null===this.Li)return;const i=this.nn.kv().qt(),n=[],s=this.nn.Kv(),e=i.Fc().Rn(s,this.Li);e.length&&n.push(e);const r=this.Hv(),h=this.Tv?"right":"left";n.forEach((i=>{i.forEach((i=>{i.xt(f(this.Li)).K(t,r,this.Mv,h)}))}))}rp(t){this.Ov.style.cursor=1===t?"ns-resize":"default"}ao(){const t=this.$v();this.xv{this.Sv||null===this.wp||this.Ui().Fh()},this.Cv=()=>{this.Sv||null===this.wp||this.Ui().Fh()},this.gp=t,this.wp=i,this.wp.z_().l(this.Mp.bind(this),this,!0),this.xp=document.createElement("td"),this.xp.style.padding="0",this.xp.style.position="relative";const n=document.createElement("div");n.style.width="100%",n.style.height="100%",n.style.position="relative",n.style.overflow="hidden",this.Sp=document.createElement("td"),this.Sp.style.padding="0",this.yp=document.createElement("td"),this.yp.style.padding="0",this.xp.appendChild(n),this.Av=us(n,Gn({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.yv);const s=this.Av.canvasElement;s.style.position="absolute",s.style.zIndex="1",s.style.left="0",s.style.top="0",this.Bv=us(n,Gn({width:16,height:16})),this.Bv.subscribeSuggestedBitmapSizeChanged(this.Cv);const e=this.Bv.canvasElement;e.style.position="absolute",e.style.zIndex="2",e.style.left="0",e.style.top="0",this.kp=document.createElement("tr"),this.kp.appendChild(this.Sp),this.kp.appendChild(this.xp),this.kp.appendChild(this.yp),this.Cp(),this.Wv=new ps(this.Bv.canvasElement,this,{Nf:()=>null===this.vp&&!this.gp.W().handleScroll.vertTouchDrag,Ff:()=>null===this.vp&&!this.gp.W().handleScroll.horzTouchDrag})}S(){null!==this.lp&&this.lp.S(),null!==this.ap&&this.ap.S(),this.Bv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Bv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.yv),this.Av.dispose(),null!==this.wp&&this.wp.z_().p(this),this.Wv.S()}Kv(){return f(this.wp)}Tp(t){null!==this.wp&&this.wp.z_().p(this),this.wp=t,null!==this.wp&&this.wp.z_().l(Ds.prototype.Mp.bind(this),this,!0),this.Cp()}kv(){return this.gp}jv(){return this.kp}Cp(){if(null!==this.wp&&(this.Pp(),0!==this.Ui().Mt().length)){if(null!==this.lp){const t=this.wp.S_();this.lp.Ji(f(t))}if(null!==this.ap){const t=this.wp.y_();this.ap.Ji(f(t))}}}Rp(){null!==this.lp&&this.lp.gt(),null!==this.ap&&this.ap.gt()}v_(){return null!==this.wp?this.wp.v_():0}p_(t){this.wp&&this.wp.p_(t)}Vf(t){if(!this.wp)return;this.Dp();const i=t.localX,n=t.localY;this.Op(i,n,t)}Qf(t){this.Dp(),this.Ap(),this.Op(t.localX,t.localY,t)}zf(t){var i;if(!this.wp)return;this.Dp();const n=t.localX,s=t.localY;this.Op(n,s,t);const e=this.br(n,s);this.gp.Bp(null!==(i=null==e?void 0:e.bv)&&void 0!==i?i:null),this.Ui().Vc(e&&{zc:e.zc,pv:e.pv})}Xf(t){null!==this.wp&&(this.Dp(),this.Vp(t))}Tf(t){null!==this.wp&&this.zp(this.cp,t)}Sf(t){this.Tf(t)}Hf(t){this.Dp(),this.Ep(t),this.Op(t.localX,t.localY,t)}Yf(t){null!==this.wp&&(this.Dp(),this.fp=!1,this.Ip(t))}qf(t){null!==this.wp&&this.Vp(t)}_v(t){if(this.fp=!0,null===this.vp){const i={x:t.localX,y:t.localY};this.Lp(i,i,t)}}ov(t){null!==this.wp&&(this.Dp(),this.wp.qt().Vc(null),this.Np())}Fp(){return this.up}Wp(){return this.cp}sv(){this.dp=1,this.Ui().Un()}ev(t,i){if(!this.gp.W().handleScale.pinch)return;const n=5*(i-this.dp);this.dp=i,this.Ui().Uc(t.et,n)}Gf(t){this.fp=!1,this.pp=null!==this.vp,this.Ap();const i=this.Ui().Fc();null!==this.vp&&i.Tt()&&(this.mp={x:i.Kt(),y:i.Zt()},this.vp={x:t.localX,y:t.localY})}Wf(t){if(null===this.wp)return;const i=t.localX,n=t.localY;if(null===this.vp)this.Ep(t);else{this.pp=!1;const s=f(this.mp),e=s.x+(i-this.vp.x),r=s.y+(n-this.vp.y);this.Op(e,r,t)}}Uf(t){0===this.kv().W().trackingMode.exitMode&&(this.pp=!0),this.jp(),this.Ip(t)}br(t,i){const n=this.wp;return null===n?null:function(t,i,n){const s=t.No(),e=function(t,i,n){var s,e;let r,h;for(const o of t){const t=null!==(e=null===(s=o.oa)||void 0===s?void 0:s.call(o,i,n))&&void 0!==e?e:[];for(const i of t)l=i.zOrder,(!(a=null==r?void 0:r.zOrder)||"top"===l&&"top"!==a||"normal"===l&&"bottom"===a)&&(r=i,h=o)}var l,a;return r&&h?{mv:r,zc:h}:null}(s,i,n);if("top"===(null==e?void 0:e.mv.zOrder))return xs(e);for(const r of s){if(e&&e.zc===r&&"bottom"!==e.mv.zOrder&&!e.mv.isBackground)return xs(e);const s=Ss(r.Pn(t),i,n);if(null!==s)return{zc:r,fv:s.fv,pv:s.pv};if(e&&e.zc===r&&"bottom"!==e.mv.zOrder&&e.mv.isBackground)return xs(e)}return(null==e?void 0:e.mv)?xs(e):null}(n,t,i)}Hp(t,i){f("left"===i?this.lp:this.ap).Yv(Gn({width:t,height:this.wv.height}))}$p(){return this.wv}Yv(t){Jn(this.wv,t)||(this.wv=t,this.Sv=!0,this.Av.resizeCanvasElement(t),this.Bv.resizeCanvasElement(t),this.Sv=!1,this.xp.style.width=t.width+"px",this.xp.style.height=t.height+"px")}Up(){const t=f(this.wp);t.x_(t.S_()),t.x_(t.y_());for(const i of t.Ta())if(t.dr(i)){const n=i.At();null!==n&&t.x_(n),i.On()}}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Zv(t){if(0===t)return;if(null===this.wp)return;if(t>1&&this.Up(),null!==this.lp&&this.lp.Zv(t),null!==this.ap&&this.ap.Zv(t),1!==t){this.Av.applySuggestedBitmapSize();const t=ss(this.Av);null!==t&&(t.useBitmapCoordinateSpace((t=>{this.Jv(t)})),this.wp&&(this.qp(t,Cs),this.Yp(t),this.Xp(t),this.qp(t,Ts),this.qp(t,Ps)))}this.Bv.applySuggestedBitmapSize();const i=ss(this.Bv);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.Kp(i),this.qp(i,Rs))}Zp(){return this.lp}Gp(){return this.ap}Qv(t,i){this.qp(t,i)}Mp(){null!==this.wp&&this.wp.z_().p(this),this.wp=null}Vp(t){this.zp(this.up,t)}zp(t,i){const n=i.localX,s=i.localY;t.M()&&t.m(this.Ui().kt().Bu(n),{x:n,y:s},i)}Jv({context:t,bitmapSize:i}){const{width:n,height:s}=i,e=this.Ui(),r=e.q(),h=e.od();r===h?Y(t,0,0,n,s,h):G(t,0,0,n,s,r,h)}Yp(t){const i=f(this.wp).E_().Wh().xt();null!==i&&i.K(t,!1)}Xp(t){const i=this.Ui().Nc();this.Jp(t,Ts,cs,i),this.Jp(t,Ts,ds,i)}Kp(t){this.Jp(t,Ts,ds,this.Ui().Fc())}qp(t,i){const n=f(this.wp).No();for(const s of n)this.Jp(t,i,cs,s);for(const s of n)this.Jp(t,i,ds,s)}Jp(t,i,n,s){const e=f(this.wp),r=e.qt().Bc(),h=null!==r&&r.zc===s,l=null!==r&&h&&void 0!==r.pv?r.pv.gr:void 0;fs(i,(i=>n(i,t,h,l)),s,e)}Pp(){if(null===this.wp)return;const t=this.gp,i=this.wp.S_().W().visible,n=this.wp.y_().W().visible;i||null===this.lp||(this.Sp.removeChild(this.lp.jv()),this.lp.S(),this.lp=null),n||null===this.ap||(this.yp.removeChild(this.ap.jv()),this.ap.S(),this.ap=null);const s=t.qt().sd();i&&null===this.lp&&(this.lp=new ks(this,t.W(),s,"left"),this.Sp.appendChild(this.lp.jv())),n&&null===this.ap&&(this.ap=new ks(this,t.W(),s,"right"),this.yp.appendChild(this.ap.jv()))}Qp(t){return t.uv&&this.fp||null!==this.vp}tm(t){return Math.max(0,Math.min(t,this.wv.width-1))}im(t){return Math.max(0,Math.min(t,this.wv.height-1))}Op(t,i,n){this.Ui().Jc(this.tm(t),this.im(i),n,f(this.wp))}Np(){this.Ui().td()}jp(){this.pp&&(this.vp=null,this.Np())}Lp(t,i,n){this.vp=t,this.pp=!1,this.Op(i.x,i.y,n);const s=this.Ui().Fc();this.mp={x:s.Kt(),y:s.Zt()}}Ui(){return this.gp.qt()}Ip(t){if(!this._p)return;const i=this.Ui(),n=this.Kv();if(i.D_(n,n.vn()),this.op=null,this._p=!1,i.Kc(),null!==this.bp){const t=performance.now(),n=i.kt();this.bp.Dr(n.Iu(),t),this.bp.Yu(t)||i.Xn(this.bp)}}Dp(){this.vp=null}Ap(){if(!this.wp)return;if(this.Ui().Un(),document.activeElement!==document.body&&document.activeElement!==document.documentElement)f(document.activeElement).blur();else{const t=document.getSelection();null!==t&&t.removeAllRanges()}!this.wp.vn().Fi()&&this.Ui().kt().Fi()}Ep(t){if(null===this.wp)return;const i=this.Ui(),n=i.kt();if(n.Fi())return;const s=this.gp.W(),e=s.handleScroll,r=s.kineticScroll;if((!e.pressedMouseMove||t.uv)&&(!e.horzTouchDrag&&!e.vertTouchDrag||!t.uv))return;const h=this.wp.vn(),l=performance.now();if(null!==this.op||this.Qp(t)||(this.op={x:t.clientX,y:t.clientY,yd:l,nm:t.localX,sm:t.localY}),null!==this.op&&!this._p&&(this.op.x!==t.clientX||this.op.y!==t.clientY)){if(t.uv&&r.touch||!t.uv&&r.mouse){const t=n.he();this.bp=new _s(.2/t,7/t,.997,15/t),this.bp.Nd(n.Iu(),this.op.yd)}else this.bp=null;h.Fi()||i.P_(this.wp,h,t.localY),i.Yc(t.localX),this._p=!0}this._p&&(h.Fi()||i.R_(this.wp,h,t.localY),i.Xc(t.localX),null!==this.bp&&this.bp.Nd(n.Iu(),l))}}class Os{constructor(t,i,n,s,e){this.bt=!0,this.wv=Gn({width:0,height:0}),this.yv=()=>this.Zv(3),this.Tv="left"===t,this.yc=n.sd,this.cn=i,this.rm=s,this.hm=e,this.Ov=document.createElement("div"),this.Ov.style.width="25px",this.Ov.style.height="100%",this.Ov.style.overflow="hidden",this.Av=us(this.Ov,Gn({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.yv)}S(){this.Av.unsubscribeSuggestedBitmapSizeChanged(this.yv),this.Av.dispose()}jv(){return this.Ov}$p(){return this.wv}Yv(t){Jn(this.wv,t)||(this.wv=t,this.Av.resizeCanvasElement(t),this.Ov.style.width=`${t.width}px`,this.Ov.style.height=`${t.height}px`,this.bt=!0)}Zv(t){if(t<3&&!this.bt)return;if(0===this.wv.width||0===this.wv.height)return;this.bt=!1,this.Av.applySuggestedBitmapSize();const i=ss(this.Av);null!==i&&i.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Ve(t)}))}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Ve({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(!this.rm())return;t.fillStyle=this.cn.timeScale.borderColor;const e=Math.floor(this.yc.W().C*n),r=Math.floor(this.yc.W().C*s),h=this.Tv?i.width-e:0;t.fillRect(h,0,e,r)}Jv({context:t,bitmapSize:i}){Y(t,0,0,i.width,i.height,this.hm())}}function As(t){return i=>{var n,s;return null!==(s=null===(n=i.aa)||void 0===n?void 0:n.call(i,t))&&void 0!==s?s:[]}}const Bs=As("normal"),Vs=As("top"),zs=As("bottom");class Es{constructor(t,i){this.lm=null,this.am=null,this.k=null,this.om=!1,this.wv=Gn({width:0,height:0}),this._m=new k,this.Mv=new Qt(5),this.Sv=!1,this.yv=()=>{this.Sv||this.gp.qt().Fh()},this.Cv=()=>{this.Sv||this.gp.qt().Fh()},this.gp=t,this.N_=i,this.cn=t.W().layout,this.um=document.createElement("tr"),this.dm=document.createElement("td"),this.dm.style.padding="0",this.fm=document.createElement("td"),this.fm.style.padding="0",this.Ov=document.createElement("td"),this.Ov.style.height="25px",this.Ov.style.padding="0",this.vm=document.createElement("div"),this.vm.style.width="100%",this.vm.style.height="100%",this.vm.style.position="relative",this.vm.style.overflow="hidden",this.Ov.appendChild(this.vm),this.Av=us(this.vm,Gn({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.yv);const n=this.Av.canvasElement;n.style.position="absolute",n.style.zIndex="1",n.style.left="0",n.style.top="0",this.Bv=us(this.vm,Gn({width:16,height:16})),this.Bv.subscribeSuggestedBitmapSizeChanged(this.Cv);const s=this.Bv.canvasElement;s.style.position="absolute",s.style.zIndex="2",s.style.left="0",s.style.top="0",this.um.appendChild(this.dm),this.um.appendChild(this.Ov),this.um.appendChild(this.fm),this.pm(),this.gp.qt().f_().l(this.pm.bind(this),this),this.Wv=new ps(this.Bv.canvasElement,this,{Nf:()=>!0,Ff:()=>!this.gp.W().handleScroll.horzTouchDrag})}S(){this.Wv.S(),null!==this.lm&&this.lm.S(),null!==this.am&&this.am.S(),this.Bv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Bv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.yv),this.Av.dispose()}jv(){return this.um}bm(){return this.lm}wm(){return this.am}Qf(t){if(this.om)return;this.om=!0;const i=this.gp.qt();!i.kt().Fi()&&this.gp.W().handleScale.axisPressedMouseMove.time&&i.$c(t.localX)}Gf(t){this.Qf(t)}tv(){const t=this.gp.qt();!t.kt().Fi()&&this.om&&(this.om=!1,this.gp.W().handleScale.axisPressedMouseMove.time&&t.Gc())}Hf(t){const i=this.gp.qt();!i.kt().Fi()&&this.gp.W().handleScale.axisPressedMouseMove.time&&i.Zc(t.localX)}Wf(t){this.Hf(t)}Yf(){this.om=!1;const t=this.gp.qt();t.kt().Fi()&&!this.gp.W().handleScale.axisPressedMouseMove.time||t.Gc()}Uf(){this.Yf()}Tf(){this.gp.W().handleScale.axisDoubleClickReset.time&&this.gp.qt().Zn()}Sf(){this.Tf()}Vf(){this.gp.qt().W().handleScale.axisPressedMouseMove.time&&this.rp(1)}ov(){this.rp(0)}$p(){return this.wv}gm(){return this._m}Mm(t,i,n){Jn(this.wv,t)||(this.wv=t,this.Sv=!0,this.Av.resizeCanvasElement(t),this.Bv.resizeCanvasElement(t),this.Sv=!1,this.Ov.style.width=`${t.width}px`,this.Ov.style.height=`${t.height}px`,this._m.m(t)),null!==this.lm&&this.lm.Yv(Gn({width:i,height:t.height})),null!==this.am&&this.am.Yv(Gn({width:n,height:t.height}))}xm(){const t=this.Sm();return Math.ceil(t.C+t.T+t.P+t.L+t.B+t.ym)}gt(){this.gp.qt().kt().Ia()}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Zv(t){if(0===t)return;if(1!==t){this.Av.applySuggestedBitmapSize();const i=ss(this.Av);null!==i&&(i.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Ve(t),this.km(i,zs)})),this.tp(i),this.km(i,Bs)),null!==this.lm&&this.lm.Zv(t),null!==this.am&&this.am.Zv(t)}this.Bv.applySuggestedBitmapSize();const i=ss(this.Bv);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.Cm([...this.gp.qt().Mt(),this.gp.qt().Fc()],i),this.km(i,Vs))}km(t,i){const n=this.gp.qt().Mt();for(const s of n)fs(i,(i=>cs(i,t,!1,void 0)),s,void 0);for(const s of n)fs(i,(i=>ds(i,t,!1,void 0)),s,void 0)}Jv({context:t,bitmapSize:i}){Y(t,0,0,i.width,i.height,this.gp.qt().od())}Ve({context:t,bitmapSize:i,verticalPixelRatio:n}){if(this.gp.W().timeScale.borderVisible){t.fillStyle=this.Tm();const s=Math.max(1,Math.floor(this.Sm().C*n));t.fillRect(0,0,i.width,s)}}tp(t){const i=this.gp.qt().kt(),n=i.Ia();if(!n||0===n.length)return;const s=this.N_.maxTickMarkWeight(n),e=this.Sm(),r=i.W();r.borderVisible&&r.ticksVisible&&t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:i,verticalPixelRatio:s})=>{t.strokeStyle=this.Tm(),t.fillStyle=this.Tm();const r=Math.max(1,Math.floor(i)),h=Math.floor(.5*i);t.beginPath();const l=Math.round(e.T*s);for(let s=n.length;s--;){const e=Math.round(n[s].coord*i);t.rect(e-h,0,r,l)}t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{const i=e.C+e.T+e.L+e.P/2;t.textAlign="center",t.textBaseline="middle",t.fillStyle=this.$(),t.font=this.Uv();for(const e of n)if(e.weight=s){const n=e.needAlignCoordinate?this.Pm(t,e.coord,e.label):e.coord;t.fillText(e.label,n,i)}}))}Pm(t,i,n){const s=this.Mv.Si(t,n),e=s/2,r=Math.floor(i-e)+.5;return r<0?i+=Math.abs(0-r):r+s>this.wv.width&&(i-=Math.abs(this.wv.width-(r+s))),i}Cm(t,i){const n=this.Sm();for(const s of t)for(const t of s.tn())t.xt().K(i,n)}Tm(){return this.gp.W().timeScale.borderColor}$(){return this.cn.textColor}j(){return this.cn.fontSize}Uv(){return z(this.j(),this.cn.fontFamily)}Rm(){return z(this.j(),this.cn.fontFamily,"bold")}Sm(){null===this.k&&(this.k={C:1,N:NaN,L:NaN,B:NaN,Hi:NaN,T:5,P:NaN,R:"",ji:new Qt,ym:0});const t=this.k,i=this.Uv();if(t.R!==i){const n=this.j();t.P=n,t.R=i,t.L=3*n/12,t.B=3*n/12,t.Hi=9*n/12,t.N=0,t.ym=4*n/12,t.ji.ir()}return this.k}rp(t){this.Ov.style.cursor=1===t?"ew-resize":"default"}pm(){const t=this.gp.qt(),i=t.W();i.leftPriceScale.visible||null===this.lm||(this.dm.removeChild(this.lm.jv()),this.lm.S(),this.lm=null),i.rightPriceScale.visible||null===this.am||(this.fm.removeChild(this.am.jv()),this.am.S(),this.am=null);const n={sd:this.gp.qt().sd()},s=()=>i.leftPriceScale.borderVisible&&t.kt().W().borderVisible,e=()=>t.od();i.leftPriceScale.visible&&null===this.lm&&(this.lm=new Os("left",i,n,s,e),this.dm.appendChild(this.lm.jv())),i.rightPriceScale.visible&&null===this.am&&(this.am=new Os("right",i,n,s,e),this.fm.appendChild(this.am.jv()))}}const Is=!!es&&!!navigator.userAgentData&&navigator.userAgentData.brands.some((t=>t.brand.includes("Chromium")))&&!!es&&((null===(Ls=null===navigator||void 0===navigator?void 0:navigator.userAgentData)||void 0===Ls?void 0:Ls.platform)?"Windows"===navigator.userAgentData.platform:navigator.userAgent.toLowerCase().indexOf("win")>=0);var Ls;class Ns{constructor(t,i,n){var s;this.Dm=[],this.Om=0,this.Qa=0,this.e_=0,this.Am=0,this.Bm=0,this.Vm=null,this.zm=!1,this.up=new k,this.cp=new k,this.Mc=new k,this.Em=null,this.Im=null,this.Lm=t,this.cn=i,this.N_=n,this.um=document.createElement("div"),this.um.classList.add("tv-lightweight-charts"),this.um.style.overflow="hidden",this.um.style.direction="ltr",this.um.style.width="100%",this.um.style.height="100%",(s=this.um).style.userSelect="none",s.style.webkitUserSelect="none",s.style.msUserSelect="none",s.style.MozUserSelect="none",s.style.webkitTapHighlightColor="transparent",this.Nm=document.createElement("table"),this.Nm.setAttribute("cellspacing","0"),this.um.appendChild(this.Nm),this.Fm=this.Wm.bind(this),Fs(this.cn)&&this.jm(!0),this.Ui=new An(this.Sc.bind(this),this.cn,n),this.qt().Wc().l(this.Hm.bind(this),this),this.$m=new Es(this,this.N_),this.Nm.appendChild(this.$m.jv());const e=i.autoSize&&this.Um();let r=this.cn.width,h=this.cn.height;if(e||0===r||0===h){const i=t.getBoundingClientRect();r=r||i.width,h=h||i.height}this.qm(r,h),this.Ym(),t.appendChild(this.um),this.Xm(),this.Ui.kt().Gu().l(this.Ui.$l.bind(this.Ui),this),this.Ui.f_().l(this.Ui.$l.bind(this.Ui),this)}qt(){return this.Ui}W(){return this.cn}Km(){return this.Dm}Zm(){return this.$m}S(){this.jm(!1),0!==this.Om&&window.cancelAnimationFrame(this.Om),this.Ui.Wc().p(this),this.Ui.kt().Gu().p(this),this.Ui.f_().p(this),this.Ui.S();for(const t of this.Dm)this.Nm.removeChild(t.jv()),t.Fp().p(this),t.Wp().p(this),t.S();this.Dm=[],f(this.$m).S(),null!==this.um.parentElement&&this.um.parentElement.removeChild(this.um),this.Mc.S(),this.up.S(),this.cp.S(),this.Gm()}qm(t,i,n=!1){if(this.Qa===i&&this.e_===t)return;const s=function(t){const i=Math.floor(t.width),n=Math.floor(t.height);return Gn({width:i-i%2,height:n-n%2})}(Gn({width:t,height:i}));this.Qa=s.height,this.e_=s.width;const e=this.Qa+"px",r=this.e_+"px";f(this.um).style.height=e,f(this.um).style.width=r,this.Nm.style.height=e,this.Nm.style.width=r,n?this.Jm(at.es(),performance.now()):this.Ui.$l()}Zv(t){void 0===t&&(t=at.es());for(let i=0;i{let s=0;for(let e=0;e{f("left"===i?this.$m.bm():this.$m.wm()).ep(f(t),n,s)};if(this.cn.timeScale.visible){const i=this.$m.sp();if(null!==t){let e=0;this.sb()&&(r("left",e,n),e=f(s.Zp()).sp().width),this.$m.ep(t,e,n),e+=i.width,this.eb()&&r("right",e,n)}n+=i.height}return Gn({width:i,height:n})}ob(){let t=0,i=0,n=0;for(const s of this.Dm)this.sb()&&(i=Math.max(i,f(s.Zp()).$v(),this.cn.leftPriceScale.minimumWidth)),this.eb()&&(n=Math.max(n,f(s.Gp()).$v(),this.cn.rightPriceScale.minimumWidth)),t+=s.v_();i=ls(i),n=ls(n);const s=this.e_,e=this.Qa,r=Math.max(s-i-n,0),h=this.cn.timeScale.visible;let l=h?Math.max(this.$m.xm(),this.cn.timeScale.minimumHeight):0;var a;l=(a=l)+a%2;const o=0+l,_=e{t.Rp()})),3===(null===(n=this.Vm)||void 0===n?void 0:n.jn())&&(this.Vm.ts(t),this.ub(),this.cb(this.Vm),this.fb(this.Vm,i),t=this.Vm,this.Vm=null)),this.Zv(t)}fb(t,i){for(const n of t.Qn())this.ns(n,i)}cb(t){const i=this.Ui.Lc();for(let n=0;n{if(this.zm=!1,this.Om=0,null!==this.Vm){const i=this.Vm;this.Vm=null,this.Jm(i,t);for(const n of i.Qn())if(5===n.qn&&!n.Bt.Yu(t)){this.qt().Xn(n.Bt);break}}})))}ub(){this.Ym()}Ym(){const t=this.Ui.Lc(),i=t.length,n=this.Dm.length;for(let t=i;t{const n=i.zn().nl(t);null!==n&&e.set(i,n)}))}let r;if(null!==t){const i=null===(s=this.Ui.kt().qi(t))||void 0===s?void 0:s.originalTime;void 0!==i&&(r=i)}const h=this.qt().Bc(),l=null!==h&&h.zc instanceof Yi?h.zc:void 0,a=null!==h&&void 0!==h.pv?h.pv.wr:void 0;return{bb:r,se:null!=t?t:void 0,wb:null!=i?i:void 0,gb:l,Mb:e,xb:a,Sb:null!=n?n:void 0}}vb(t,i,n){this.up.m((()=>this.mb(t,i,n)))}pb(t,i,n){this.cp.m((()=>this.mb(t,i,n)))}Hm(t,i,n){this.Mc.m((()=>this.mb(t,i,n)))}Xm(){const t=this.cn.timeScale.visible?"":"none";this.$m.jv().style.display=t}sb(){return this.Dm[0].Kv().S_().W().visible}eb(){return this.Dm[0].Kv().y_().W().visible}Um(){return"ResizeObserver"in window&&(this.Em=new ResizeObserver((t=>{const i=t.find((t=>t.target===this.Lm));i&&this.qm(i.contentRect.width,i.contentRect.height)})),this.Em.observe(this.Lm,{box:"border-box"}),!0)}Gm(){null!==this.Em&&this.Em.disconnect(),this.Em=null}}function Fs(t){return Boolean(t.handleScroll.mouseWheel||t.handleScale.mouseWheel)}function Ws(t,i){var n={};for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&i.indexOf(s)<0&&(n[s]=t[s]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var e=0;for(s=Object.getOwnPropertySymbols(t);efunction(t,i){return i?i(t):void 0===(n=t).open&&void 0===n.value;var n}(s,h)?Ks({ut:i,se:n,bb:e},s):Ks(t(i,n,s,e,r),s)}function Gs(t){return{Candlestick:Zs(qs),Bar:Zs(Us),Area:Zs(Hs),Baseline:Zs($s),Histogram:Zs(js),Line:Zs(js),Custom:Zs(Ys)}[t]}function Js(t){return{se:0,kb:new Map,ia:t}}function Qs(t,i){if(void 0!==t&&0!==t.length)return{Cb:i.key(t[0].ut),Tb:i.key(t[t.length-1].ut)}}function te(t){let i;return t.forEach((t=>{void 0===i&&(i=t.bb)})),d(i)}class ie{constructor(t){this.Pb=new Map,this.Rb=new Map,this.Db=new Map,this.Ob=[],this.N_=t}S(){this.Pb.clear(),this.Rb.clear(),this.Db.clear(),this.Ob=[]}Ab(t,i){let n=0!==this.Pb.size,s=!1;const e=this.Rb.get(t);if(void 0!==e)if(1===this.Rb.size)n=!1,s=!0,this.Pb.clear();else for(const i of this.Ob)i.pointData.kb.delete(t)&&(s=!0);let r=[];if(0!==i.length){const n=i.map((t=>t.time)),e=this.N_.createConverterToInternalObj(i),h=Gs(t.Xh()),l=t.ga(),a=t.Ma();r=i.map(((i,r)=>{const o=e(i.time),_=this.N_.key(o);let u=this.Pb.get(_);void 0===u&&(u=Js(o),this.Pb.set(_,u),s=!0);const c=h(o,u.se,i,n[r],l,a);return u.kb.set(t,c),c}))}n&&this.Bb(),this.Vb(t,r);let h=-1;if(s){const t=[];this.Pb.forEach((i=>{t.push({timeWeight:0,time:i.ia,pointData:i,originalTime:te(i.kb)})})),t.sort(((t,i)=>this.N_.key(t.time)-this.N_.key(i.time))),h=this.zb(t)}return this.Eb(t,h,function(t,i,n){const s=Qs(t,n),e=Qs(i,n);if(void 0!==s&&void 0!==e)return{Xl:s.Tb>=e.Tb&&s.Cb>=e.Cb}}(this.Rb.get(t),e,this.N_))}hd(t){return this.Ab(t,[])}Ib(t,i){const n=i;!function(t){void 0===t.bb&&(t.bb=t.time)}(n),this.N_.preprocessData(i);const s=this.N_.createConverterToInternalObj([i])(i.time),e=this.Db.get(t);if(void 0!==e&&this.N_.key(s)this.N_.key(t.time)this.N_.key(s.ut)?Xs(i)&&n.push(i):Xs(i)?n[n.length-1]=i:n.splice(-1,1),this.Db.set(t,i.ut)}Vb(t,i){0!==i.length?(this.Rb.set(t,i.filter(Xs)),this.Db.set(t,i[i.length-1].ut)):(this.Rb.delete(t),this.Db.delete(t))}Bb(){for(const t of this.Ob)0===t.pointData.kb.size&&this.Pb.delete(this.N_.key(t.time))}zb(t){let i=-1;for(let n=0;n{0!==i.length&&(t=Math.max(t,i[i.length-1].se))})),t}Eb(t,i,n){const s={Fb:new Map,kt:{Au:this.Nb()}};if(-1!==i)this.Rb.forEach(((i,e)=>{s.Fb.set(e,{He:i,Wb:e===t?n:void 0})})),this.Rb.has(t)||s.Fb.set(t,{He:[],Wb:n}),s.kt.jb=this.Ob,s.kt.Hb=i;else{const i=this.Rb.get(t);s.Fb.set(t,{He:i||[],Wb:n})}return s}}function ne(t,i){t.se=i,t.kb.forEach((t=>{t.se=i}))}function se(t){const i={value:t.Bt[3],time:t.bb};return void 0!==t.yb&&(i.customValues=t.yb),i}function ee(t){const i=se(t);return void 0!==t.O&&(i.color=t.O),i}function re(t){const i=se(t);return void 0!==t._t&&(i.lineColor=t._t),void 0!==t.Ts&&(i.topColor=t.Ts),void 0!==t.Ps&&(i.bottomColor=t.Ps),i}function he(t){const i=se(t);return void 0!==t.Pe&&(i.topLineColor=t.Pe),void 0!==t.Re&&(i.bottomLineColor=t.Re),void 0!==t.Se&&(i.topFillColor1=t.Se),void 0!==t.ye&&(i.topFillColor2=t.ye),void 0!==t.ke&&(i.bottomFillColor1=t.ke),void 0!==t.Ce&&(i.bottomFillColor2=t.Ce),i}function le(t){const i={open:t.Bt[0],high:t.Bt[1],low:t.Bt[2],close:t.Bt[3],time:t.bb};return void 0!==t.yb&&(i.customValues=t.yb),i}function ae(t){const i=le(t);return void 0!==t.O&&(i.color=t.O),i}function oe(t){const i=le(t),{O:n,Vt:s,$h:e}=t;return void 0!==n&&(i.color=n),void 0!==s&&(i.borderColor=s),void 0!==e&&(i.wickColor=e),i}function _e(t){return{Area:re,Line:ee,Baseline:he,Histogram:ee,Bar:ae,Candlestick:oe,Custom:ue}[t]}function ue(t){const i=t.bb;return Object.assign(Object.assign({},t.He),{time:i})}const ce={vertLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},horzLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},mode:1},de={vertLines:{color:"#D6DCDE",style:0,visible:!0},horzLines:{color:"#D6DCDE",style:0,visible:!0}},fe={background:{type:"solid",color:"#FFFFFF"},textColor:"#191919",fontSize:12,fontFamily:V},ve={autoScale:!0,mode:0,invertScale:!1,alignLabels:!0,borderVisible:!0,borderColor:"#2B2B43",entireTextOnly:!1,visible:!1,ticksVisible:!1,scaleMargins:{bottom:.1,top:.2},minimumWidth:0},pe={rightOffset:0,barSpacing:6,minBarSpacing:.5,fixLeftEdge:!1,fixRightEdge:!1,lockVisibleTimeRangeOnResize:!1,rightBarStaysOnScroll:!1,borderVisible:!0,borderColor:"#2B2B43",visible:!0,timeVisible:!1,secondsVisible:!0,shiftVisibleRangeOnNewBar:!0,allowShiftVisibleRangeOnWhitespaceReplacement:!1,ticksVisible:!1,uniformDistribution:!1,minimumHeight:0},me={color:"rgba(0, 0, 0, 0)",visible:!1,fontSize:48,fontFamily:V,fontStyle:"",text:"",horzAlign:"center",vertAlign:"center"};function be(){return{width:0,height:0,autoSize:!1,layout:fe,crosshair:ce,grid:de,overlayPriceScales:Object.assign({},ve),leftPriceScale:Object.assign(Object.assign({},ve),{visible:!1}),rightPriceScale:Object.assign(Object.assign({},ve),{visible:!0}),timeScale:pe,watermark:me,localization:{locale:es?navigator.language:"",dateFormat:"dd MMM 'yy"},handleScroll:{mouseWheel:!0,pressedMouseMove:!0,horzTouchDrag:!0,vertTouchDrag:!0},handleScale:{axisPressedMouseMove:{time:!0,price:!0},axisDoubleClickReset:{time:!0,price:!0},mouseWheel:!0,pinch:!0},kineticScroll:{mouse:!1,touch:!0},trackingMode:{exitMode:1}}}class we{constructor(t,i){this.$b=t,this.Ub=i}applyOptions(t){this.$b.qt().Ec(this.Ub,t)}options(){return this.Li().W()}width(){return lt(this.Ub)?this.$b.nb(this.Ub):0}Li(){return f(this.$b.qt().Ic(this.Ub)).At}}function ge(t,i,n){const s=Ws(t,["time","originalTime"]),e=Object.assign({time:i},s);return void 0!==n&&(e.originalTime=n),e}const Me={color:"#FF0000",price:0,lineStyle:2,lineWidth:1,lineVisible:!0,axisLabelVisible:!0,title:"",axisLabelColor:"",axisLabelTextColor:""};class xe{constructor(t){this.Vh=t}applyOptions(t){this.Vh.Nh(t)}options(){return this.Vh.W()}qb(){return this.Vh}}class Se{constructor(t,i,n,s,e){this.Yb=new k,this.Is=t,this.Xb=i,this.Kb=n,this.N_=e,this.Zb=s}S(){this.Yb.S()}priceFormatter(){return this.Is.ca()}priceToCoordinate(t){const i=this.Is.Pt();return null===i?null:this.Is.At().Ot(t,i.Bt)}coordinateToPrice(t){const i=this.Is.Pt();return null===i?null:this.Is.At().pn(t,i.Bt)}barsInLogicalRange(t){if(null===t)return null;const i=new Mn(new bn(t.from,t.to)).iu(),n=this.Is.zn();if(n.Fi())return null;const s=n.nl(i.Os(),1),e=n.nl(i.di(),-1),r=f(n.Qh()),h=f(n.Vn());if(null!==s&&null!==e&&s.se>e.se)return{barsBefore:t.from-r,barsAfter:h-t.to};const l={barsBefore:null===s||s.se===r?t.from-r:s.se-r,barsAfter:null===e||e.se===h?h-t.to:h-e.se};return null!==s&&null!==e&&(l.from=s.bb,l.to=e.bb),l}setData(t){this.N_,this.Is.Xh(),this.Xb.Gb(this.Is,t),this.Jb("full")}update(t){this.Is.Xh(),this.Xb.Qb(this.Is,t),this.Jb("update")}dataByIndex(t,i){const n=this.Is.zn().nl(t,i);if(null===n)return null;return _e(this.seriesType())(n)}data(){const t=_e(this.seriesType());return this.Is.zn().ie().map((i=>t(i)))}subscribeDataChanged(t){this.Yb.l(t)}unsubscribeDataChanged(t){this.Yb.v(t)}setMarkers(t){this.N_;const i=t.map((t=>ge(t,this.N_.convertHorzItemToInternal(t.time),t.time)));this.Is.Zl(i)}markers(){return this.Is.Gl().map((t=>ge(t,t.originalTime,void 0)))}applyOptions(t){this.Is.Nh(t)}options(){return O(this.Is.W())}priceScale(){return this.Kb.priceScale(this.Is.At().xa())}createPriceLine(t){const i=C(O(Me),t),n=this.Is.Jl(i);return new xe(n)}removePriceLine(t){this.Is.Ql(t.qb())}seriesType(){return this.Is.Xh()}attachPrimitive(t){this.Is.ba(t),t.attached&&t.attached({chart:this.Zb,series:this,requestUpdate:()=>this.Is.qt().$l()})}detachPrimitive(t){this.Is.wa(t),t.detached&&t.detached()}Jb(t){this.Yb.M()&&this.Yb.m(t)}}class ye{constructor(t,i,n){this.tw=new k,this.uu=new k,this._m=new k,this.Ui=t,this.wl=t.kt(),this.$m=i,this.wl.Ku().l(this.iw.bind(this)),this.wl.Zu().l(this.nw.bind(this)),this.$m.gm().l(this.sw.bind(this)),this.N_=n}S(){this.wl.Ku().p(this),this.wl.Zu().p(this),this.$m.gm().p(this),this.tw.S(),this.uu.S(),this._m.S()}scrollPosition(){return this.wl.Iu()}scrollToPosition(t,i){i?this.wl.qu(t,1e3):this.Ui.Jn(t)}scrollToRealTime(){this.wl.Uu()}getVisibleRange(){const t=this.wl.ku();return null===t?null:{from:t.from.originalTime,to:t.to.originalTime}}setVisibleRange(t){const i={from:this.N_.convertHorzItemToInternal(t.from),to:this.N_.convertHorzItemToInternal(t.to)},n=this.wl.Ru(i);this.Ui.ld(n)}getVisibleLogicalRange(){const t=this.wl.yu();return null===t?null:{from:t.Os(),to:t.di()}}setVisibleLogicalRange(t){c(t.from<=t.to,"The from index cannot be after the to index."),this.Ui.ld(t)}resetTimeScale(){this.Ui.Zn()}fitContent(){this.Ui.Qu()}logicalToCoordinate(t){const i=this.Ui.kt();return i.Fi()?null:i.It(t)}coordinateToLogical(t){return this.wl.Fi()?null:this.wl.Bu(t)}timeToCoordinate(t){const i=this.N_.convertHorzItemToInternal(t),n=this.wl.ka(i,!1);return null===n?null:this.wl.It(n)}coordinateToTime(t){const i=this.Ui.kt(),n=i.Bu(t),s=i.qi(n);return null===s?null:s.originalTime}width(){return this.$m.$p().width}height(){return this.$m.$p().height}subscribeVisibleTimeRangeChange(t){this.tw.l(t)}unsubscribeVisibleTimeRangeChange(t){this.tw.v(t)}subscribeVisibleLogicalRangeChange(t){this.uu.l(t)}unsubscribeVisibleLogicalRangeChange(t){this.uu.v(t)}subscribeSizeChange(t){this._m.l(t)}unsubscribeSizeChange(t){this._m.v(t)}applyOptions(t){this.wl.Nh(t)}options(){return Object.assign(Object.assign({},O(this.wl.W())),{barSpacing:this.wl.he()})}iw(){this.tw.M()&&this.tw.m(this.getVisibleRange())}nw(){this.uu.M()&&this.uu.m(this.getVisibleLogicalRange())}sw(t){this._m.m(t.width,t.height)}}function ke(t){if(void 0===t||"custom"===t.type)return;const i=t;void 0!==i.minMove&&void 0===i.precision&&(i.precision=function(t){if(t>=1)return 0;let i=0;for(;i<8;i++){const n=Math.round(t);if(Math.abs(n-t)<1e-8)return i;t*=10}return i}(i.minMove))}function Ce(t){return function(t){if(D(t.handleScale)){const i=t.handleScale;t.handleScale={axisDoubleClickReset:{time:i,price:i},axisPressedMouseMove:{time:i,price:i},mouseWheel:i,pinch:i}}else if(void 0!==t.handleScale){const{axisPressedMouseMove:i,axisDoubleClickReset:n}=t.handleScale;D(i)&&(t.handleScale.axisPressedMouseMove={time:i,price:i}),D(n)&&(t.handleScale.axisDoubleClickReset={time:n,price:n})}const i=t.handleScroll;D(i)&&(t.handleScroll={horzTouchDrag:i,vertTouchDrag:i,mouseWheel:i,pressedMouseMove:i})}(t),t}class Te{constructor(t,i,n){this.ew=new Map,this.rw=new Map,this.hw=new k,this.lw=new k,this.aw=new k,this.ow=new ie(i);const s=void 0===n?O(be()):C(O(be()),Ce(n));this.N_=i,this.$b=new Ns(t,s,i),this.$b.Fp().l((t=>{this.hw.M()&&this.hw.m(this._w(t()))}),this),this.$b.Wp().l((t=>{this.lw.M()&&this.lw.m(this._w(t()))}),this),this.$b.Wc().l((t=>{this.aw.M()&&this.aw.m(this._w(t()))}),this);const e=this.$b.qt();this.uw=new ye(e,this.$b.Zm(),this.N_)}remove(){this.$b.Fp().p(this),this.$b.Wp().p(this),this.$b.Wc().p(this),this.uw.S(),this.$b.S(),this.ew.clear(),this.rw.clear(),this.hw.S(),this.lw.S(),this.aw.S(),this.ow.S()}resize(t,i,n){this.autoSizeActive()||this.$b.qm(t,i,n)}addCustomSeries(t,i){const n=v(t),s=Object.assign(Object.assign({},h),n.defaultOptions());return this.cw("Custom",s,i,n)}addAreaSeries(t){return this.cw("Area",s,t)}addBaselineSeries(t){return this.cw("Baseline",e,t)}addBarSeries(t){return this.cw("Bar",i,t)}addCandlestickSeries(i={}){return function(t){void 0!==t.borderColor&&(t.borderUpColor=t.borderColor,t.borderDownColor=t.borderColor),void 0!==t.wickColor&&(t.wickUpColor=t.wickColor,t.wickDownColor=t.wickColor)}(i),this.cw("Candlestick",t,i)}addHistogramSeries(t){return this.cw("Histogram",r,t)}addLineSeries(t){return this.cw("Line",n,t)}removeSeries(t){const i=d(this.ew.get(t)),n=this.ow.hd(i);this.$b.qt().hd(i),this.dw(n),this.ew.delete(t),this.rw.delete(i)}Gb(t,i){this.dw(this.ow.Ab(t,i))}Qb(t,i){this.dw(this.ow.Ib(t,i))}subscribeClick(t){this.hw.l(t)}unsubscribeClick(t){this.hw.v(t)}subscribeCrosshairMove(t){this.aw.l(t)}unsubscribeCrosshairMove(t){this.aw.v(t)}subscribeDblClick(t){this.lw.l(t)}unsubscribeDblClick(t){this.lw.v(t)}priceScale(t){return new we(this.$b,t)}timeScale(){return this.uw}applyOptions(t){this.$b.Nh(Ce(t))}options(){return this.$b.W()}takeScreenshot(){return this.$b.tb()}autoSizeActive(){return this.$b.rb()}chartElement(){return this.$b.hb()}paneSize(){const t=this.$b.ab();return{height:t.height,width:t.width}}setCrosshairPosition(t,i,n){const s=this.ew.get(n);if(void 0===s)return;const e=this.$b.qt().cr(s);null!==e&&this.$b.qt().Qc(t,i,e)}clearCrosshairPosition(){this.$b.qt().td(!0)}cw(t,i,n={},s){ke(n.priceFormat);const e=C(O(l),O(i),n),r=this.$b.qt().ed(t,e,s),h=new Se(r,this,this,this,this.N_);return this.ew.set(h,r),this.rw.set(r,h),h}dw(t){const i=this.$b.qt();i.nd(t.kt.Au,t.kt.jb,t.kt.Hb),t.Fb.forEach(((t,i)=>i.it(t.He,t.Wb))),i.zu()}fw(t){return d(this.rw.get(t))}_w(t){const i=new Map;t.Mb.forEach(((t,n)=>{const s=n.Xh(),e=_e(s)(t);if("Custom"!==s)c(function(t){return void 0!==t.open||void 0!==t.value}(e));else{const t=n.Ma();c(!t||!1===t(e))}i.set(this.fw(n),e)}));const n=void 0===t.gb?void 0:this.fw(t.gb);return{time:t.bb,logical:t.se,point:t.wb,hoveredSeries:n,hoveredObjectId:t.xb,seriesData:i,sourceEvent:t.Sb}}}function Pe(t,i,n){let s;if(R(t)){const i=document.getElementById(t);c(null!==i,`Cannot find element in DOM with id=${t}`),s=i}else s=t;const e=new Te(s,i,n);return i.setOptions(e.options()),e}const Re=Object.assign(Object.assign({},l),h);var De=Object.freeze({__proto__:null,get ColorType(){return Dn},get CrosshairMode(){return rt},get LastPriceAnimationMode(){return Pn},get LineStyle(){return o},get LineType(){return a},get MismatchDirection(){return Bi},get PriceLineSource(){return Rn},get PriceScaleMode(){return cn},get TickMarkType(){return On},get TrackingModeExitMode(){return Tn},createChart:function(t,i){return Pe(t,new Zn,Zn.Td(i))},createChartEx:Pe,customSeriesDefaultOptions:Re,isBusinessDay:Bn,isUTCTimestamp:Vn,version:function(){return"4.2.0-dev+202405092055"}});window.LightweightCharts=De}(); -diff --git a/dist/lightweight-charts.standalone.production.mjs b/dist/lightweight-charts.standalone.production.mjs -index 90916563f5fca7f2f008c481bc9cf1a63800217c..4feaf578b6e27d58e1cce67a207809655a42507c 100644 ---- a/dist/lightweight-charts.standalone.production.mjs -+++ b/dist/lightweight-charts.standalone.production.mjs -@@ -1,7 +1,7 @@ - /*! - * @license -- * TradingView Lightweight Charts™ v4.1.1 -- * Copyright (c) 2023 TradingView, Inc. -+ * TradingView Lightweight Charts™ v4.2.0-dev+202405092055 -+ * Copyright (c) 2024 TradingView, Inc. - * Licensed under Apache License 2.0 https://www.apache.org/licenses/LICENSE-2.0 - */ --const t={upColor:"#26a69a",downColor:"#ef5350",wickVisible:!0,borderVisible:!0,borderColor:"#378658",borderUpColor:"#26a69a",borderDownColor:"#ef5350",wickColor:"#737375",wickUpColor:"#26a69a",wickDownColor:"#ef5350"},i={upColor:"#26a69a",downColor:"#ef5350",openVisible:!0,thinBars:!0},n={color:"#2196f3",lineStyle:0,lineWidth:3,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},s={topColor:"rgba( 46, 220, 135, 0.4)",bottomColor:"rgba( 40, 221, 100, 0)",invertFilledArea:!1,lineColor:"#33D778",lineStyle:0,lineWidth:3,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},e={baseValue:{type:"price",price:0},topFillColor1:"rgba(38, 166, 154, 0.28)",topFillColor2:"rgba(38, 166, 154, 0.05)",topLineColor:"rgba(38, 166, 154, 1)",bottomFillColor1:"rgba(239, 83, 80, 0.05)",bottomFillColor2:"rgba(239, 83, 80, 0.28)",bottomLineColor:"rgba(239, 83, 80, 1)",lineWidth:3,lineStyle:0,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},r={color:"#26a69a",base:0},h={color:"#2196f3"},l={title:"",visible:!0,lastValueVisible:!0,priceLineVisible:!0,priceLineSource:0,priceLineWidth:1,priceLineColor:"",priceLineStyle:2,baseLineVisible:!0,baseLineWidth:1,baseLineColor:"#B2B5BE",baseLineStyle:0,priceFormat:{type:"price",precision:2,minMove:.01}};var a,o;function _(t,i){const n={0:[],1:[t.lineWidth,t.lineWidth],2:[2*t.lineWidth,2*t.lineWidth],3:[6*t.lineWidth,6*t.lineWidth],4:[t.lineWidth,4*t.lineWidth]}[i];t.setLineDash(n)}function u(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(n,i+e),t.lineTo(s,i+e),t.stroke()}function c(t,i){if(!t)throw new Error("Assertion failed"+(i?": "+i:""))}function d(t){if(void 0===t)throw new Error("Value is undefined");return t}function f(t){if(null===t)throw new Error("Value is null");return t}function v(t){return f(d(t))}!function(t){t[t.Simple=0]="Simple",t[t.WithSteps=1]="WithSteps",t[t.Curved=2]="Curved"}(a||(a={})),function(t){t[t.Solid=0]="Solid",t[t.Dotted=1]="Dotted",t[t.Dashed=2]="Dashed",t[t.LargeDashed=3]="LargeDashed",t[t.SparseDotted=4]="SparseDotted"}(o||(o={}));const p={khaki:"#f0e68c",azure:"#f0ffff",aliceblue:"#f0f8ff",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gainsboro:"#dcdcdc",gray:"#808080",green:"#008000",honeydew:"#f0fff0",floralwhite:"#fffaf0",lightblue:"#add8e6",lightcoral:"#f08080",lemonchiffon:"#fffacd",hotpink:"#ff69b4",lightyellow:"#ffffe0",greenyellow:"#adff2f",lightgoldenrodyellow:"#fafad2",limegreen:"#32cd32",linen:"#faf0e6",lightcyan:"#e0ffff",magenta:"#f0f",maroon:"#800000",olive:"#808000",orange:"#ffa500",oldlace:"#fdf5e6",mediumblue:"#0000cd",transparent:"#0000",lime:"#0f0",lightpink:"#ffb6c1",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",midnightblue:"#191970",orchid:"#da70d6",mediumorchid:"#ba55d3",mediumturquoise:"#48d1cc",orangered:"#ff4500",royalblue:"#4169e1",powderblue:"#b0e0e6",red:"#f00",coral:"#ff7f50",turquoise:"#40e0d0",white:"#fff",whitesmoke:"#f5f5f5",wheat:"#f5deb3",teal:"#008080",steelblue:"#4682b4",bisque:"#ffe4c4",aquamarine:"#7fffd4",aqua:"#0ff",sienna:"#a0522d",silver:"#c0c0c0",springgreen:"#00ff7f",antiquewhite:"#faebd7",burlywood:"#deb887",brown:"#a52a2a",beige:"#f5f5dc",chocolate:"#d2691e",chartreuse:"#7fff00",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cadetblue:"#5f9ea0",tomato:"#ff6347",fuchsia:"#f0f",blue:"#00f",salmon:"#fa8072",blanchedalmond:"#ffebcd",slateblue:"#6a5acd",slategray:"#708090",thistle:"#d8bfd8",tan:"#d2b48c",cyan:"#0ff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",blueviolet:"#8a2be2",black:"#000",darkmagenta:"#8b008b",darkslateblue:"#483d8b",darkkhaki:"#bdb76b",darkorchid:"#9932cc",darkorange:"#ff8c00",darkgreen:"#006400",darkred:"#8b0000",dodgerblue:"#1e90ff",darkslategray:"#2f4f4f",dimgray:"#696969",deepskyblue:"#00bfff",firebrick:"#b22222",forestgreen:"#228b22",indigo:"#4b0082",ivory:"#fffff0",lavenderblush:"#fff0f5",feldspar:"#d19275",indianred:"#cd5c5c",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightskyblue:"#87cefa",lightslategray:"#789",lightslateblue:"#8470ff",snow:"#fffafa",lightseagreen:"#20b2aa",lightsalmon:"#ffa07a",darksalmon:"#e9967a",darkviolet:"#9400d3",mediumpurple:"#9370d8",mediumaquamarine:"#66cdaa",skyblue:"#87ceeb",lavender:"#e6e6fa",lightsteelblue:"#b0c4de",mediumvioletred:"#c71585",mintcream:"#f5fffa",navajowhite:"#ffdead",navy:"#000080",olivedrab:"#6b8e23",palevioletred:"#d87093",violetred:"#d02090",yellow:"#ff0",yellowgreen:"#9acd32",lawngreen:"#7cfc00",pink:"#ffc0cb",paleturquoise:"#afeeee",palegoldenrod:"#eee8aa",darkolivegreen:"#556b2f",darkseagreen:"#8fbc8f",darkturquoise:"#00ced1",peachpuff:"#ffdab9",deeppink:"#ff1493",violet:"#ee82ee",palegreen:"#98fb98",mediumseagreen:"#3cb371",peru:"#cd853f",saddlebrown:"#8b4513",sandybrown:"#f4a460",rosybrown:"#bc8f8f",purple:"#800080",seagreen:"#2e8b57",seashell:"#fff5ee",papayawhip:"#ffefd5",mediumslateblue:"#7b68ee",plum:"#dda0dd",mediumspringgreen:"#00fa9a"};function m(t){return t<0?0:t>255?255:Math.round(t)||0}function b(t){return t<=0||t>0?t<0?0:t>1?1:Math.round(1e4*t)/1e4:0}const w=/^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,g=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,M=/^rgb\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*\)$/,x=/^rgba\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?[\d]{0,10}(?:\.\d+)?)\s*\)$/;function S(t){(t=t.toLowerCase())in p&&(t=p[t]);{const i=x.exec(t)||M.exec(t);if(i)return[m(parseInt(i[1],10)),m(parseInt(i[2],10)),m(parseInt(i[3],10)),b(i.length<5?1:parseFloat(i[4]))]}{const i=g.exec(t);if(i)return[m(parseInt(i[1],16)),m(parseInt(i[2],16)),m(parseInt(i[3],16)),1]}{const i=w.exec(t);if(i)return[m(17*parseInt(i[1],16)),m(17*parseInt(i[2],16)),m(17*parseInt(i[3],16)),1]}throw new Error(`Cannot parse color: ${t}`)}function y(t){const i=S(t);return{t:`rgb(${i[0]}, ${i[1]}, ${i[2]})`,i:(n=i,.199*n[0]+.687*n[1]+.114*n[2]>160?"black":"white")};var n}class k{constructor(){this.h=[]}l(t,i,n){const s={o:t,_:i,u:!0===n};this.h.push(s)}v(t){const i=this.h.findIndex((i=>t===i.o));i>-1&&this.h.splice(i,1)}p(t){this.h=this.h.filter((i=>i._!==t))}m(t,i,n){const s=[...this.h];this.h=this.h.filter((t=>!t.u)),s.forEach((s=>s.o(t,i,n)))}M(){return this.h.length>0}S(){this.h=[]}}function C(t,...i){for(const n of i)for(const i in n)void 0!==n[i]&&("object"!=typeof n[i]||void 0===t[i]||Array.isArray(n[i])?t[i]=n[i]:C(t[i],n[i]));return t}function T(t){return"number"==typeof t&&isFinite(t)}function P(t){return"number"==typeof t&&t%1==0}function R(t){return"string"==typeof t}function D(t){return"boolean"==typeof t}function O(t){const i=t;if(!i||"object"!=typeof i)return i;let n,s,e;for(s in n=Array.isArray(i)?[]:{},i)i.hasOwnProperty(s)&&(e=i[s],n[s]=e&&"object"==typeof e?O(e):e);return n}function A(t){return null!==t}function V(t){return null===t?void 0:t}const B="-apple-system, BlinkMacSystemFont, 'Trebuchet MS', Roboto, Ubuntu, sans-serif";function z(t,i,n){return void 0===i&&(i=B),`${n=void 0!==n?`${n} `:""}${t}px ${i}`}class E{constructor(t){this.k={C:1,T:5,P:NaN,R:"",D:"",O:"",A:"",V:0,B:0,I:0,L:0,N:0},this.F=t}W(){const t=this.k,i=this.j(),n=this.H();return t.P===i&&t.D===n||(t.P=i,t.D=n,t.R=z(i,n),t.L=2.5/12*i,t.V=t.L,t.B=i/12*t.T,t.I=i/12*t.T,t.N=0),t.O=this.$(),t.A=this.U(),this.k}$(){return this.F.W().layout.textColor}U(){return this.F.q()}j(){return this.F.W().layout.fontSize}H(){return this.F.W().layout.fontFamily}}class I{constructor(){this.Y=[]}X(t){this.Y=t}K(t,i,n){this.Y.forEach((s=>{s.K(t,i,n)}))}}class L{K(t,i,n){t.useMediaCoordinateSpace((t=>this.Z(t,i,n)))}G(t,i,n){t.useMediaCoordinateSpace((t=>this.J(t,i,n)))}J(t,i,n){}}class N extends L{constructor(){super(...arguments),this.tt=null}it(t){this.tt=t}Z({context:t}){if(null===this.tt||null===this.tt.nt)return;const i=this.tt.nt,n=this.tt,s=s=>{t.beginPath();for(let e=i.to-1;e>=i.from;--e){const i=n.st[e];t.moveTo(i.et,i.rt),t.arc(i.et,i.rt,s,0,2*Math.PI)}t.fill()};n.ht>0&&(t.fillStyle=n.lt,s(n.ot+n.ht)),t.fillStyle=n._t,s(n.ot)}}function F(){return{st:[{et:0,rt:0,ut:0,ct:0}],_t:"",lt:"",ot:0,ht:0,nt:null}}const W={from:0,to:1};class j{constructor(t,i){this.dt=new I,this.ft=[],this.vt=[],this.bt=!0,this.F=t,this.wt=i,this.dt.X(this.ft)}gt(t){const i=this.F.Mt();i.length!==this.ft.length&&(this.vt=i.map(F),this.ft=this.vt.map((t=>{const i=new N;return i.it(t),i})),this.dt.X(this.ft)),this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.dt}St(){const t=2===this.wt.W().mode,i=this.F.Mt(),n=this.wt.yt(),s=this.F.kt();i.forEach(((i,e)=>{var r;const h=this.vt[e],l=i.Ct(n);if(t||null===l||!i.Tt())return void(h.nt=null);const a=f(i.Pt());h._t=l.Rt,h.ot=l.ot,h.ht=l.Dt,h.st[0].ct=l.ct,h.st[0].rt=i.At().Ot(l.ct,a.Vt),h.lt=null!==(r=l.Bt)&&void 0!==r?r:this.F.zt(h.st[0].rt/i.At().Et()),h.st[0].ut=n,h.st[0].et=s.It(n),h.nt=W}))}}class H{K(t,i,n){t.useBitmapCoordinateSpace((t=>this.Z(t,i,n)))}}class $ extends H{constructor(t){super(),this.Lt=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;const e=this.Lt.Nt.Tt,r=this.Lt.Ft.Tt;if(!e&&!r)return;const h=Math.round(this.Lt.et*n),l=Math.round(this.Lt.rt*s);t.lineCap="butt",e&&h>=0&&(t.lineWidth=Math.floor(this.Lt.Nt.ht*n),t.strokeStyle=this.Lt.Nt.O,t.fillStyle=this.Lt.Nt.O,_(t,this.Lt.Nt.Wt),function(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(i+e,n),t.lineTo(i+e,s),t.stroke()}(t,h,0,i.height)),r&&l>=0&&(t.lineWidth=Math.floor(this.Lt.Ft.ht*s),t.strokeStyle=this.Lt.Ft.O,t.fillStyle=this.Lt.Ft.O,_(t,this.Lt.Ft.Wt),u(t,l,0,i.width))}}class U{constructor(t){this.bt=!0,this.jt={Nt:{ht:1,Wt:0,O:"",Tt:!1},Ft:{ht:1,Wt:0,O:"",Tt:!1},et:0,rt:0},this.Ht=new $(this.jt),this.$t=t}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht}St(){const t=this.$t.Tt(),i=f(this.$t.Ut()),n=i.qt().W().crosshair,s=this.jt;if(2===n.mode)return s.Ft.Tt=!1,void(s.Nt.Tt=!1);s.Ft.Tt=t&&this.$t.Yt(i),s.Nt.Tt=t&&this.$t.Xt(),s.Ft.ht=n.horzLine.width,s.Ft.Wt=n.horzLine.style,s.Ft.O=n.horzLine.color,s.Nt.ht=n.vertLine.width,s.Nt.Wt=n.vertLine.style,s.Nt.O=n.vertLine.color,s.et=this.$t.Kt(),s.rt=this.$t.Zt()}}function q(t,i,n,s,e,r){t.fillRect(i+r,n,s-2*r,r),t.fillRect(i+r,n+e-r,s-2*r,r),t.fillRect(i,n,r,e),t.fillRect(i+s-r,n,r,e)}function Y(t,i,n,s,e,r){t.save(),t.globalCompositeOperation="copy",t.fillStyle=r,t.fillRect(i,n,s,e),t.restore()}function X(t,i){return t.map((t=>0===t?t:t+i))}function K(t,i,n,s,e,r){t.beginPath(),t.lineTo(i+s-r[1],n),0!==r[1]&&t.arcTo(i+s,n,i+s,n+r[1],r[1]),t.lineTo(i+s,n+e-r[2]),0!==r[2]&&t.arcTo(i+s,n+e,i+s-r[2],n+e,r[2]),t.lineTo(i+r[3],n+e),0!==r[3]&&t.arcTo(i,n+e,i,n+e-r[3],r[3]),t.lineTo(i,n+r[0]),0!==r[0]&&t.arcTo(i,n,i+r[0],n,r[0])}function Z(t,i,n,s,e,r,h=0,l=[0,0,0,0],a=""){if(t.save(),!h||!a||a===r)return K(t,i,n,s,e,l),t.fillStyle=r,t.fill(),void t.restore();const o=h/2;if("transparent"!==r){K(t,i+h,n+h,s-2*h,e-2*h,X(l,-h)),t.fillStyle=r,t.fill()}if("transparent"!==a){K(t,i+o,n+o,s-h,e-h,X(l,-o)),t.lineWidth=h,t.strokeStyle=a,t.closePath(),t.stroke()}t.restore()}function G(t,i,n,s,e,r,h){t.save(),t.globalCompositeOperation="copy";const l=t.createLinearGradient(0,0,0,e);l.addColorStop(0,r),l.addColorStop(1,h),t.fillStyle=l,t.fillRect(i,n,s,e),t.restore()}class J{constructor(t,i){this.it(t,i)}it(t,i){this.Lt=t,this.Gt=i}Et(t,i){return this.Lt.Tt?t.P+t.L+t.V:0}K(t,i,n,s){if(!this.Lt.Tt||0===this.Lt.Jt.length)return;const e=this.Lt.O,r=this.Gt.t,h=t.useBitmapCoordinateSpace((t=>{const h=t.context;h.font=i.R;const l=this.Qt(t,i,n,s),a=l.ti,o=(t,i)=>{l.ii?Z(h,a.ni,a.si,a.ei,a.ri,t,a.hi,[a.ot,0,0,a.ot],i):Z(h,a.li,a.si,a.ei,a.ri,t,a.hi,[0,a.ot,a.ot,0],i)};return o(r,"transparent"),this.Lt.ai&&(h.fillStyle=e,h.fillRect(a.li,a.oi,a._i-a.li,a.ui)),o("transparent",r),this.Lt.ci&&(h.fillStyle=i.A,h.fillRect(l.ii?a.di-a.hi:0,a.si,a.hi,a.fi-a.si)),l}));t.useMediaCoordinateSpace((({context:t})=>{const n=h.vi;t.font=i.R,t.textAlign=h.ii?"right":"left",t.textBaseline="middle",t.fillStyle=e,t.fillText(this.Lt.Jt,n.pi,(n.si+n.fi)/2+n.mi)}))}Qt(t,i,n,s){var e;const{context:r,bitmapSize:h,mediaSize:l,horizontalPixelRatio:a,verticalPixelRatio:o}=t,_=this.Lt.ai||!this.Lt.bi?i.T:0,u=this.Lt.wi?i.C:0,c=i.L+this.Gt.gi,d=i.V+this.Gt.Mi,f=i.B,v=i.I,p=this.Lt.Jt,m=i.P,b=n.xi(r,p),w=Math.ceil(n.Si(r,p)),g=m+c+d,M=i.C+f+v+w+_,x=Math.max(1,Math.floor(o));let S=Math.round(g*o);S%2!=x%2&&(S+=1);const y=u>0?Math.max(1,Math.floor(u*a)):0,k=Math.round(M*a),C=Math.round(_*a),T=null!==(e=this.Gt.yi)&&void 0!==e?e:this.Gt.ki,P=Math.round(T*o)-Math.floor(.5*o),R=Math.floor(P+x/2-S/2),D=R+S,O="right"===s,A=O?l.width-u:u,V=O?h.width-y:y;let B,z,E;return O?(B=V-k,z=V-C,E=A-_-f-u):(B=V+k,z=V+C,E=A+_+f),{ii:O,ti:{si:R,oi:P,fi:D,ei:k,ri:S,ot:2*a,hi:y,ni:B,li:V,_i:z,ui:x,di:h.width},vi:{si:R/o,fi:D/o,pi:E,mi:b}}}}class Q{constructor(t){this.Ci={ki:0,t:"#000",Mi:0,gi:0},this.Ti={Jt:"",Tt:!1,ai:!0,bi:!1,Bt:"",O:"#FFF",ci:!1,wi:!1},this.Pi={Jt:"",Tt:!1,ai:!1,bi:!0,Bt:"",O:"#FFF",ci:!0,wi:!0},this.bt=!0,this.Ri=new(t||J)(this.Ti,this.Ci),this.Di=new(t||J)(this.Pi,this.Ci)}Jt(){return this.Oi(),this.Ti.Jt}ki(){return this.Oi(),this.Ci.ki}gt(){this.bt=!0}Et(t,i=!1){return Math.max(this.Ri.Et(t,i),this.Di.Et(t,i))}Ai(){return this.Ci.yi||0}Vi(t){this.Ci.yi=t}Bi(){return this.Oi(),this.Ti.Tt||this.Pi.Tt}zi(){return this.Oi(),this.Ti.Tt}xt(t){return this.Oi(),this.Ti.ai=this.Ti.ai&&t.W().ticksVisible,this.Pi.ai=this.Pi.ai&&t.W().ticksVisible,this.Ri.it(this.Ti,this.Ci),this.Di.it(this.Pi,this.Ci),this.Ri}Ei(){return this.Oi(),this.Ri.it(this.Ti,this.Ci),this.Di.it(this.Pi,this.Ci),this.Di}Oi(){this.bt&&(this.Ti.ai=!0,this.Pi.ai=!1,this.Ii(this.Ti,this.Pi,this.Ci))}}class tt extends Q{constructor(t,i,n){super(),this.$t=t,this.Li=i,this.Ni=n}Ii(t,i,n){if(t.Tt=!1,2===this.$t.W().mode)return;const s=this.$t.W().horzLine;if(!s.labelVisible)return;const e=this.Li.Pt();if(!this.$t.Tt()||this.Li.Fi()||null===e)return;const r=y(s.labelBackgroundColor);n.t=r.t,t.O=r.i;const h=2/12*this.Li.P();n.gi=h,n.Mi=h;const l=this.Ni(this.Li);n.ki=l.ki,t.Jt=this.Li.Wi(l.ct,e),t.Tt=!0}}const it=/[1-9]/g;class nt{constructor(){this.Lt=null}it(t){this.Lt=t}K(t,i){if(null===this.Lt||!1===this.Lt.Tt||0===this.Lt.Jt.length)return;const n=t.useMediaCoordinateSpace((({context:t})=>(t.font=i.R,Math.round(i.ji.Si(t,f(this.Lt).Jt,it)))));if(n<=0)return;const s=i.Hi,e=n+2*s,r=e/2,h=this.Lt.$i;let l=this.Lt.ki,a=Math.floor(l-r)+.5;a<0?(l+=Math.abs(0-a),a=Math.floor(l-r)+.5):a+e>h&&(l-=Math.abs(h-(a+e)),a=Math.floor(l-r)+.5);const o=a+e,_=Math.ceil(0+i.C+i.T+i.L+i.P+i.V);t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:n,verticalPixelRatio:s})=>{const e=f(this.Lt);t.fillStyle=e.t;const r=Math.round(a*n),h=Math.round(0*s),l=Math.round(o*n),u=Math.round(_*s),c=Math.round(2*n);if(t.beginPath(),t.moveTo(r,h),t.lineTo(r,u-c),t.arcTo(r,u,r+c,u,c),t.lineTo(l-c,u),t.arcTo(l,u,l,u-c,c),t.lineTo(l,h),t.fill(),e.ai){const r=Math.round(e.ki*n),l=h,a=Math.round((l+i.T)*s);t.fillStyle=e.O;const o=Math.max(1,Math.floor(n)),_=Math.floor(.5*n);t.fillRect(r-_,l,o,a-l)}})),t.useMediaCoordinateSpace((({context:t})=>{const n=f(this.Lt),e=0+i.C+i.T+i.L+i.P/2;t.font=i.R,t.textAlign="left",t.textBaseline="middle",t.fillStyle=n.O;const r=i.ji.xi(t,"Apr0");t.translate(a+s,e+r),t.fillText(n.Jt,0,0)}))}}class st{constructor(t,i,n){this.bt=!0,this.Ht=new nt,this.jt={Tt:!1,t:"#4c525e",O:"white",Jt:"",$i:0,ki:NaN,ai:!0},this.wt=t,this.Ui=i,this.Ni=n}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht.it(this.jt),this.Ht}St(){const t=this.jt;if(t.Tt=!1,2===this.wt.W().mode)return;const i=this.wt.W().vertLine;if(!i.labelVisible)return;const n=this.Ui.kt();if(n.Fi())return;t.$i=n.$i();const s=this.Ni();if(null===s)return;t.ki=s.ki;const e=n.qi(this.wt.yt());t.Jt=n.Yi(f(e)),t.Tt=!0;const r=y(i.labelBackgroundColor);t.t=r.t,t.O=r.i,t.ai=n.W().ticksVisible}}class et{constructor(){this.Xi=null,this.Ki=0}Zi(){return this.Ki}Gi(t){this.Ki=t}At(){return this.Xi}Ji(t){this.Xi=t}Qi(t){return[]}tn(){return[]}Tt(){return!0}}var rt;!function(t){t[t.Normal=0]="Normal",t[t.Magnet=1]="Magnet",t[t.Hidden=2]="Hidden"}(rt||(rt={}));class ht extends et{constructor(t,i){super(),this.nn=null,this.sn=NaN,this.en=0,this.rn=!0,this.hn=new Map,this.ln=!1,this.an=NaN,this.on=NaN,this._n=NaN,this.un=NaN,this.Ui=t,this.cn=i,this.dn=new j(t,this);this.fn=((t,i)=>n=>{const s=i(),e=t();if(n===f(this.nn).vn())return{ct:e,ki:s};{const t=f(n.Pt());return{ct:n.pn(s,t),ki:s}}})((()=>this.sn),(()=>this.on));const n=((t,i)=>()=>{const n=this.Ui.kt().mn(t()),s=i();return n&&Number.isFinite(s)?{ut:n,ki:s}:null})((()=>this.en),(()=>this.Kt()));this.bn=new st(this,t,n),this.wn=new U(this)}W(){return this.cn}gn(t,i){this._n=t,this.un=i}Mn(){this._n=NaN,this.un=NaN}xn(){return this._n}Sn(){return this.un}yn(t,i,n){this.ln||(this.ln=!0),this.rn=!0,this.kn(t,i,n)}yt(){return this.en}Kt(){return this.an}Zt(){return this.on}Tt(){return this.rn}Cn(){this.rn=!1,this.Tn(),this.sn=NaN,this.an=NaN,this.on=NaN,this.nn=null,this.Mn()}Pn(t){return null!==this.nn?[this.wn,this.dn]:[]}Yt(t){return t===this.nn&&this.cn.horzLine.visible}Xt(){return this.cn.vertLine.visible}Rn(t,i){this.rn&&this.nn===t||this.hn.clear();const n=[];return this.nn===t&&n.push(this.Dn(this.hn,i,this.fn)),n}tn(){return this.rn?[this.bn]:[]}Ut(){return this.nn}On(){this.wn.gt(),this.hn.forEach((t=>t.gt())),this.bn.gt(),this.dn.gt()}An(t){return t&&!t.vn().Fi()?t.vn():null}kn(t,i,n){this.Vn(t,i,n)&&this.On()}Vn(t,i,n){const s=this.an,e=this.on,r=this.sn,h=this.en,l=this.nn,a=this.An(n);this.en=t,this.an=isNaN(t)?NaN:this.Ui.kt().It(t),this.nn=n;const o=null!==a?a.Pt():null;return null!==a&&null!==o?(this.sn=i,this.on=a.Ot(i,o)):(this.sn=NaN,this.on=NaN),s!==this.an||e!==this.on||h!==this.en||r!==this.sn||l!==this.nn}Tn(){const t=this.Ui.Mt().map((t=>t.zn().Bn())).filter(A),i=0===t.length?null:Math.max(...t);this.en=null!==i?i:NaN}Dn(t,i,n){let s=t.get(i);return void 0===s&&(s=new tt(this,i,n),t.set(i,s)),s}}function lt(t){return"left"===t||"right"===t}class at{constructor(t){this.En=new Map,this.In=[],this.Ln=t}Nn(t,i){const n=function(t,i){return void 0===t?i:{Fn:Math.max(t.Fn,i.Fn),Wn:t.Wn||i.Wn}}(this.En.get(t),i);this.En.set(t,n)}jn(){return this.Ln}Hn(t){const i=this.En.get(t);return void 0===i?{Fn:this.Ln}:{Fn:Math.max(this.Ln,i.Fn),Wn:i.Wn}}$n(){this.Un(),this.In=[{qn:0}]}Yn(t){this.Un(),this.In=[{qn:1,Vt:t}]}Xn(t){this.Kn(),this.In.push({qn:5,Vt:t})}Un(){this.Kn(),this.In.push({qn:6})}Zn(){this.Un(),this.In=[{qn:4}]}Gn(t){this.Un(),this.In.push({qn:2,Vt:t})}Jn(t){this.Un(),this.In.push({qn:3,Vt:t})}Qn(){return this.In}ts(t){for(const i of t.In)this.ns(i);this.Ln=Math.max(this.Ln,t.Ln),t.En.forEach(((t,i)=>{this.Nn(i,t)}))}static ss(){return new at(2)}static es(){return new at(3)}ns(t){switch(t.qn){case 0:this.$n();break;case 1:this.Yn(t.Vt);break;case 2:this.Gn(t.Vt);break;case 3:this.Jn(t.Vt);break;case 4:this.Zn();break;case 5:this.Xn(t.Vt);break;case 6:this.Kn()}}Kn(){const t=this.In.findIndex((t=>5===t.qn));-1!==t&&this.In.splice(t,1)}}const ot=".";function _t(t,i){if(!T(t))return"n/a";if(!P(i))throw new TypeError("invalid length");if(i<0||i>16)throw new TypeError("invalid length");if(0===i)return t.toString();return("0000000000000000"+t.toString()).slice(-i)}class ut{constructor(t,i){if(i||(i=1),T(t)&&P(t)||(t=100),t<0)throw new TypeError("invalid base");this.Li=t,this.rs=i,this.hs()}format(t){const i=t<0?"−":"";return t=Math.abs(t),i+this.ls(t)}hs(){if(this.os=0,this.Li>0&&this.rs>0){let t=this.Li;for(;t>1;)t/=10,this.os++}}ls(t){const i=this.Li/this.rs;let n=Math.floor(t),s="";const e=void 0!==this.os?this.os:NaN;if(i>1){let r=+(Math.round(t*i)-n*i).toFixed(this.os);r>=i&&(r-=i,n+=1),s=ot+_t(+r.toFixed(this.os)*this.rs,e)}else n=Math.round(n*i)/i,e>0&&(s=ot+_t(0,e));return n.toFixed(0)+s}}class ct extends ut{constructor(t=100){super(t)}format(t){return`${super.format(t)}%`}}class dt{constructor(t){this._s=t}format(t){let i="";return t<0&&(i="-",t=-t),t<995?i+this.us(t):t<999995?i+this.us(t/1e3)+"K":t<999999995?(t=1e3*Math.round(t/1e3),i+this.us(t/1e6)+"M"):(t=1e6*Math.round(t/1e6),i+this.us(t/1e9)+"B")}us(t){let i;const n=Math.pow(10,this._s);return i=(t=Math.round(t*n)/n)>=1e-15&&t<1?t.toFixed(this._s).replace(/\.?0+$/,""):String(t),i.replace(/(\.[1-9]*)0+$/,((t,i)=>i))}}function ft(t,i,n,s,e,r,h){if(0===i.length||s.from>=i.length||s.to<=0)return;const{context:l,horizontalPixelRatio:a,verticalPixelRatio:o}=t,_=i[s.from];let u=r(t,_),c=_;if(s.to-s.from<2){const i=e/2;l.beginPath();const n={et:_.et-i,rt:_.rt},s={et:_.et+i,rt:_.rt};l.moveTo(n.et*a,n.rt*o),l.lineTo(s.et*a,s.rt*o),h(t,u,n,s)}else{const e=(i,n)=>{h(t,u,c,n),l.beginPath(),u=i,c=n};let d=c;l.beginPath(),l.moveTo(_.et*a,_.rt*o);for(let h=s.from+1;h=s.from;--n){const s=i[n];if(s){const i=e(t,s);i!==a&&(l.beginPath(),null!==a&&l.fill(),l.fillStyle=i,a=i);const n=Math.round(s.et*r)+o,u=s.rt*h;l.moveTo(n,u),l.arc(n,u,_,0,2*Math.PI)}}l.fill()}(t,i,l,n,o)}}class Pt extends Tt{Ds(t,i){return i._t}}function Rt(t,i,n,s,e=0,r=i.length){let h=r-e;for(;0>1,l=e+r;s(i[l],n)===t?(e=l+1,h-=r+1):h=r}return e}const Dt=Rt.bind(null,!0),Ot=Rt.bind(null,!1);function At(t,i){return t.ut0&&r=s&&(l=r-1),h>0&&hObject.assign(Object.assign({},t),this.Is.$s().Hs(t.ut))))}Us(){this.Es=null}Fs(){this.Vs&&(this.qs(),this.Vs=!1),this.Bs&&(this.js(),this.Bs=!1),this.As&&(this.Ys(),this.As=!1)}Ys(){const t=this.Is.At(),i=this.Ls.kt();if(this.Us(),i.Fi()||t.Fi())return;const n=i.Xs();if(null===n)return;if(0===this.Is.zn().Ks())return;const s=this.Is.Pt();null!==s&&(this.Es=Bt(this.zs,n,this.Ns),this.Zs(t,i,s.Vt),this.Gs())}}class Et extends zt{constructor(t,i){super(t,i,!0)}Zs(t,i,n){i.Js(this.zs,V(this.Es)),t.Qs(this.zs,n,V(this.Es))}te(t,i){return{ut:t,ct:i,et:NaN,rt:NaN}}qs(){const t=this.Is.$s();this.zs=this.Is.zn().ie().map((i=>{const n=i.Vt[3];return this.ne(i.se,n,t)}))}}class It extends Et{constructor(t,i){super(t,i),this.Ws=new I,this.ee=new kt,this.re=new Pt,this.Ws.X([this.ee,this.re])}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Is.W();this.ee.it({ds:t.lineType,st:this.zs,Wt:t.lineStyle,ht:t.lineWidth,fs:null,vs:t.invertFilledArea,nt:this.Es,cs:this.Ls.kt().he()}),this.re.it({ds:t.lineVisible?t.lineType:void 0,st:this.zs,Wt:t.lineStyle,ht:t.lineWidth,nt:this.Es,cs:this.Ls.kt().he(),Rs:t.pointMarkersVisible?t.pointMarkersRadius||t.lineWidth/2+2:void 0})}}class Lt extends H{constructor(){super(...arguments),this.Lt=null,this.le=0,this.ae=0}it(t){this.Lt=t}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.Lt||0===this.Lt.zn.length||null===this.Lt.nt)return;if(this.le=this.oe(i),this.le>=2){Math.max(1,Math.floor(i))%2!=this.le%2&&this.le--}this.ae=this.Lt._e?Math.min(this.le,Math.floor(i)):this.le;let s=null;const e=this.ae<=this.le&&this.Lt.he>=Math.floor(1.5*i);for(let r=this.Lt.nt.from;rf+p-1&&(e=f+p-1,s=e-_+1),t.fillRect(i,s,o-i,e-s+1)}const i=a+m;let s=Math.max(f,Math.round(h.pe*n)-l),e=s+_-1;e>f+p-1&&(e=f+p-1,s=e-_+1),t.fillRect(u+1,s,i-u,e-s+1)}}}oe(t){const i=Math.floor(t);return Math.max(i,Math.floor(function(t,i){return Math.floor(.3*t*i)}(f(this.Lt).he,t)))}}class Nt extends zt{constructor(t,i){super(t,i,!1)}Zs(t,i,n){i.Js(this.zs,V(this.Es)),t.me(this.zs,n,V(this.Es))}be(t,i,n){return{ut:t,we:i.Vt[0],ge:i.Vt[1],Me:i.Vt[2],xe:i.Vt[3],et:NaN,ve:NaN,ce:NaN,de:NaN,pe:NaN}}qs(){const t=this.Is.$s();this.zs=this.Is.zn().ie().map((i=>this.ne(i.se,i,t)))}}class Ft extends Nt{constructor(){super(...arguments),this.Ws=new Lt}ne(t,i,n){return Object.assign(Object.assign({},this.be(t,i,n)),n.Hs(t))}Gs(){const t=this.Is.W();this.Ws.it({zn:this.zs,he:this.Ls.kt().he(),fe:t.openVisible,_e:t.thinBars,nt:this.Es})}}class Wt extends gt{constructor(){super(...arguments),this.Cs=new yt}ps(t,i){const n=this.tt;return this.Cs.bs(t,{gs:i.Se,Ms:i.ye,xs:i.ke,Ss:i.Ce,ys:t.bitmapSize.height,fs:n.fs})}}class jt extends Tt{constructor(){super(...arguments),this.Te=new yt}Ds(t,i){const n=this.tt;return this.Te.bs(t,{gs:i.Pe,Ms:i.Pe,xs:i.Re,Ss:i.Re,ys:t.bitmapSize.height,fs:n.fs})}}class Ht extends Et{constructor(t,i){super(t,i),this.Ws=new I,this.De=new Wt,this.Oe=new jt,this.Ws.X([this.De,this.Oe])}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Is.Pt();if(null===t)return;const i=this.Is.W(),n=this.Is.At().Ot(i.baseValue.price,t.Vt),s=this.Ls.kt().he();this.De.it({st:this.zs,ht:i.lineWidth,Wt:i.lineStyle,ds:i.lineType,fs:n,vs:!1,nt:this.Es,cs:s}),this.Oe.it({st:this.zs,ht:i.lineWidth,Wt:i.lineStyle,ds:i.lineVisible?i.lineType:void 0,Rs:i.pointMarkersVisible?i.pointMarkersRadius||i.lineWidth/2+2:void 0,fs:n,nt:this.Es,cs:s})}}class $t extends H{constructor(){super(...arguments),this.Lt=null,this.le=0}it(t){this.Lt=t}Z(t){if(null===this.Lt||0===this.Lt.zn.length||null===this.Lt.nt)return;const{horizontalPixelRatio:i}=t;if(this.le=function(t,i){if(t>=2.5&&t<=4)return Math.floor(3*i);const n=1-.2*Math.atan(Math.max(4,t)-4)/(.5*Math.PI),s=Math.floor(t*n*i),e=Math.floor(t*i),r=Math.min(s,e);return Math.max(Math.floor(i),r)}(this.Lt.he,i),this.le>=2){Math.floor(i)%2!=this.le%2&&this.le--}const n=this.Lt.zn;this.Lt.Ae&&this.Ve(t,n,this.Lt.nt),this.Lt.ci&&this.Be(t,n,this.Lt.nt);const s=this.ze(i);(!this.Lt.ci||this.le>2*s)&&this.Ee(t,n,this.Lt.nt)}Ve(t,i,n){if(null===this.Lt)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="",l=Math.min(Math.floor(e),Math.floor(this.Lt.he*e));l=Math.max(Math.floor(e),Math.min(l,this.le));const a=Math.floor(.5*l);let o=null;for(let t=n.from;t2*l)q(s,o,u,_-o+1,c-u+1,l);else{const t=_-o+1;s.fillRect(o,u,t,c-u+1)}a=_}}Ee(t,i,n){if(null===this.Lt)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="";const l=this.ze(e);for(let t=n.from;to||s.fillRect(_,a,u-_+1,o-a+1)}}}class Ut extends Nt{constructor(){super(...arguments),this.Ws=new $t}ne(t,i,n){return Object.assign(Object.assign({},this.be(t,i,n)),n.Hs(t))}Gs(){const t=this.Is.W();this.Ws.it({zn:this.zs,he:this.Ls.kt().he(),Ae:t.wickVisible,ci:t.borderVisible,nt:this.Es})}}class qt{constructor(t,i){this.Ne=t,this.Li=i}K(t,i,n){this.Ne.draw(t,this.Li,i,n)}}class Yt extends zt{constructor(t,i,n){super(t,i,!1),this.wn=n,this.Ws=new qt(this.wn.renderer(),(i=>{const n=t.Pt();return null===n?null:t.At().Ot(i,n.Vt)}))}Fe(t){return this.wn.priceValueBuilder(t)}We(t){return this.wn.isWhitespace(t)}qs(){const t=this.Is.$s();this.zs=this.Is.zn().ie().map((i=>Object.assign(Object.assign({ut:i.se,et:NaN},t.Hs(i.se)),{je:i.He})))}Zs(t,i){i.Js(this.zs,V(this.Es))}Gs(){this.wn.update({bars:this.zs.map(Xt),barSpacing:this.Ls.kt().he(),visibleRange:this.Es},this.Is.W())}}function Xt(t){return{x:t.et,time:t.ut,originalData:t.je,barColor:t.ue}}class Kt extends H{constructor(){super(...arguments),this.Lt=null,this.$e=[]}it(t){this.Lt=t,this.$e=[]}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.Lt||0===this.Lt.st.length||null===this.Lt.nt)return;this.$e.length||this.Ue(i);const s=Math.max(1,Math.floor(n)),e=Math.round(this.Lt.qe*n)-Math.floor(s/2),r=e+s;for(let i=this.Lt.nt.from;is.Xe?s.di=n.Os-i-1:n.Os=s.di+i+1))}let s=Math.ceil(this.Lt.he*t);for(let t=this.Lt.nt.from;t0&&s<4)for(let t=this.Lt.nt.from;ts&&(i.Ye>i.Xe?i.di-=1:i.Os+=1)}}}class Zt extends Et{constructor(){super(...arguments),this.Ws=new Kt}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t={st:this.zs,he:this.Ls.kt().he(),nt:this.Es,qe:this.Is.At().Ot(this.Is.W().base,f(this.Is.Pt()).Vt)};this.Ws.it(t)}}class Gt extends Et{constructor(){super(...arguments),this.Ws=new Pt}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Is.W(),i={st:this.zs,Wt:t.lineStyle,ds:t.lineVisible?t.lineType:void 0,ht:t.lineWidth,Rs:t.pointMarkersVisible?t.pointMarkersRadius||t.lineWidth/2+2:void 0,nt:this.Es,cs:this.Ls.kt().he()};this.Ws.it(i)}}const Jt=/[2-9]/g;class Qt{constructor(t=50){this.Ke=0,this.Ze=1,this.Ge=1,this.Je={},this.Qe=new Map,this.tr=t}ir(){this.Ke=0,this.Qe.clear(),this.Ze=1,this.Ge=1,this.Je={}}Si(t,i,n){return this.nr(t,i,n).width}xi(t,i,n){const s=this.nr(t,i,n);return((s.actualBoundingBoxAscent||0)-(s.actualBoundingBoxDescent||0))/2}nr(t,i,n){const s=n||Jt,e=String(i).replace(s,"0");if(this.Qe.has(e))return d(this.Qe.get(e)).sr;if(this.Ke===this.tr){const t=this.Je[this.Ge];delete this.Je[this.Ge],this.Qe.delete(t),this.Ge++,this.Ke--}t.save(),t.textBaseline="middle";const r=t.measureText(e);return t.restore(),0===r.width&&i.length||(this.Qe.set(e,{sr:r,er:this.Ze}),this.Je[this.Ze]=e,this.Ke++,this.Ze++),r}}class ti{constructor(t){this.rr=null,this.k=null,this.hr="right",this.lr=t}ar(t,i,n){this.rr=t,this.k=i,this.hr=n}K(t){null!==this.k&&null!==this.rr&&this.rr.K(t,this.k,this.lr,this.hr)}}class ii{constructor(t,i,n){this._r=t,this.lr=new Qt(50),this.ur=i,this.F=n,this.j=-1,this.Ht=new ti(this.lr)}xt(){const t=this.F.cr(this.ur);if(null===t)return null;const i=t.dr(this.ur)?t.vr():this.ur.At();if(null===i)return null;const n=t.pr(i);if("overlay"===n)return null;const s=this.F.mr();return s.P!==this.j&&(this.j=s.P,this.lr.ir()),this.Ht.ar(this._r.Ei(),s,n),this.Ht}}class ni extends H{constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}br(t,i){var n;if(!(null===(n=this.Lt)||void 0===n?void 0:n.Tt))return null;const{rt:s,ht:e,wr:r}=this.Lt;return i>=s-e-7&&i<=s+e+7?{gr:this.Lt,wr:r}:null}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;if(!1===this.Lt.Tt)return;const e=Math.round(this.Lt.rt*s);e<0||e>i.height||(t.lineCap="butt",t.strokeStyle=this.Lt.O,t.lineWidth=Math.floor(this.Lt.ht*n),_(t,this.Lt.Wt),u(t,e,0,i.width))}}class si{constructor(t){this.Mr={rt:0,O:"rgba(0, 0, 0, 0)",ht:1,Wt:0,Tt:!1},this.Sr=new ni,this.bt=!0,this.Is=t,this.Ls=t.qt(),this.Sr.it(this.Mr)}gt(){this.bt=!0}xt(){return this.Is.Tt()?(this.bt&&(this.yr(),this.bt=!1),this.Sr):null}}class ei extends si{constructor(t){super(t)}yr(){this.Mr.Tt=!1;const t=this.Is.At(),i=t.kr().kr;if(2!==i&&3!==i)return;const n=this.Is.W();if(!n.baseLineVisible||!this.Is.Tt())return;const s=this.Is.Pt();null!==s&&(this.Mr.Tt=!0,this.Mr.rt=t.Ot(s.Vt,s.Vt),this.Mr.O=n.baseLineColor,this.Mr.ht=n.baseLineWidth,this.Mr.Wt=n.baseLineStyle)}}class ri extends H{constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}He(){return this.Lt}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){const s=this.Lt;if(null===s)return;const e=Math.max(1,Math.floor(i)),r=e%2/2,h=Math.round(s.Xe.x*i)+r,l=s.Xe.y*n;t.fillStyle=s.Cr,t.beginPath();const a=Math.max(2,1.5*s.Tr)*i;t.arc(h,l,a,0,2*Math.PI,!1),t.fill(),t.fillStyle=s.Pr,t.beginPath(),t.arc(h,l,s.ot*i,0,2*Math.PI,!1),t.fill(),t.lineWidth=e,t.strokeStyle=s.Rr,t.beginPath(),t.arc(h,l,s.ot*i+e/2,0,2*Math.PI,!1),t.stroke()}}const hi=[{Dr:0,Or:.25,Ar:4,Vr:10,Br:.25,zr:0,Er:.4,Ir:.8},{Dr:.25,Or:.525,Ar:10,Vr:14,Br:0,zr:0,Er:.8,Ir:0},{Dr:.525,Or:1,Ar:14,Vr:14,Br:0,zr:0,Er:0,Ir:0}];function li(t,i,n,s){return function(t,i){if("transparent"===t)return t;const n=S(t),s=n[3];return`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${i*s})`}(t,n+(s-n)*i)}function ai(t,i){const n=t%2600/2600;let s;for(const t of hi)if(n>=t.Dr&&n<=t.Or){s=t;break}c(void 0!==s,"Last price animation internal logic error");const e=(n-s.Dr)/(s.Or-s.Dr);return{Pr:li(i,e,s.Br,s.zr),Rr:li(i,e,s.Er,s.Ir),ot:(r=e,h=s.Ar,l=s.Vr,h+(l-h)*r)};var r,h,l}class oi{constructor(t){this.Ht=new ri,this.bt=!0,this.Lr=!0,this.Nr=performance.now(),this.Fr=this.Nr-1,this.Wr=t}jr(){this.Fr=this.Nr-1,this.gt()}Hr(){if(this.gt(),2===this.Wr.W().lastPriceAnimation){const t=performance.now(),i=this.Fr-t;if(i>0)return void(i<650&&(this.Fr+=2600));this.Nr=t,this.Fr=t+2600}}gt(){this.bt=!0}$r(){this.Lr=!0}Tt(){return 0!==this.Wr.W().lastPriceAnimation}Ur(){switch(this.Wr.W().lastPriceAnimation){case 0:return!1;case 1:return!0;case 2:return performance.now()<=this.Fr}}xt(){return this.bt?(this.St(),this.bt=!1,this.Lr=!1):this.Lr&&(this.qr(),this.Lr=!1),this.Ht}St(){this.Ht.it(null);const t=this.Wr.qt().kt(),i=t.Xs(),n=this.Wr.Pt();if(null===i||null===n)return;const s=this.Wr.Yr(!0);if(s.Xr||!i.Kr(s.se))return;const e={x:t.It(s.se),y:this.Wr.At().Ot(s.ct,n.Vt)},r=s.O,h=this.Wr.W().lineWidth,l=ai(this.Zr(),r);this.Ht.it({Cr:r,Tr:h,Pr:l.Pr,Rr:l.Rr,ot:l.ot,Xe:e})}qr(){const t=this.Ht.He();if(null!==t){const i=ai(this.Zr(),t.Cr);t.Pr=i.Pr,t.Rr=i.Rr,t.ot=i.ot}}Zr(){return this.Ur()?performance.now()-this.Nr:2599}}function _i(t,i){return St(Math.min(Math.max(t,12),30)*i)}function ui(t,i){switch(t){case"arrowDown":case"arrowUp":return _i(i,1);case"circle":return _i(i,.8);case"square":return _i(i,.7)}}function ci(t){return function(t){const i=Math.ceil(t);return i%2!=0?i-1:i}(_i(t,1))}function di(t){return Math.max(_i(t,.1),3)}function fi(t,i,n,s,e){const r=ui("square",n),h=(r-1)/2,l=t-h,a=i-h;return s>=l&&s<=l+r&&e>=a&&e<=a+r}function vi(t,i,n,s,e){const r=(ui("arrowUp",e)-1)/2,h=(St(e/2)-1)/2;i.beginPath(),t?(i.moveTo(n-r,s),i.lineTo(n,s-r),i.lineTo(n+r,s),i.lineTo(n+h,s),i.lineTo(n+h,s+r),i.lineTo(n-h,s+r),i.lineTo(n-h,s)):(i.moveTo(n-r,s),i.lineTo(n,s+r),i.lineTo(n+r,s),i.lineTo(n+h,s),i.lineTo(n+h,s-r),i.lineTo(n-h,s-r),i.lineTo(n-h,s)),i.fill()}function pi(t,i,n,s,e,r){return fi(i,n,s,e,r)}class mi extends L{constructor(){super(...arguments),this.Lt=null,this.lr=new Qt,this.j=-1,this.H="",this.Gr=""}it(t){this.Lt=t}ar(t,i){this.j===t&&this.H===i||(this.j=t,this.H=i,this.Gr=z(t,i),this.lr.ir())}br(t,i){if(null===this.Lt||null===this.Lt.nt)return null;for(let n=this.Lt.nt.from;n=t&&e<=t+n&&r>=i-h&&r<=i+h}(t.Jt.et,t.Jt.rt,t.Jt.$i,t.Jt.Et,i,n))||function(t,i,n){if(0===t.Ks)return!1;switch(t.th){case"arrowDown":case"arrowUp":return pi(0,t.et,t.rt,t.Ks,i,n);case"circle":return function(t,i,n,s,e){const r=2+ui("circle",n)/2,h=t-s,l=i-e;return Math.sqrt(h*h+l*l)<=r}(t.et,t.rt,t.Ks,i,n);case"square":return fi(t.et,t.rt,t.Ks,i,n)}}(t,i,n)}function gi(t,i,n,s,e,r,h,l,a){const o=T(n)?n:n.xe,_=T(n)?n:n.ge,u=T(n)?n:n.Me,c=T(i.size)?Math.max(i.size,0):1,d=ci(l.he())*c,f=d/2;switch(t.Ks=d,i.position){case"inBar":return t.rt=h.Ot(o,a),void(void 0!==t.Jt&&(t.Jt.rt=t.rt+f+r+.6*e));case"aboveBar":return t.rt=h.Ot(_,a)-f-s.ih,void 0!==t.Jt&&(t.Jt.rt=t.rt-f-.6*e,s.ih+=1.2*e),void(s.ih+=d+r);case"belowBar":return t.rt=h.Ot(u,a)+f+s.nh,void 0!==t.Jt&&(t.Jt.rt=t.rt+f+r+.6*e,s.nh+=1.2*e),void(s.nh+=d+r)}i.position}class Mi{constructor(t,i){this.bt=!0,this.sh=!0,this.eh=!0,this.rh=null,this.Ht=new mi,this.Wr=t,this.Ui=i,this.Lt={st:[],nt:null}}gt(t){this.bt=!0,this.eh=!0,"data"===t&&(this.sh=!0)}xt(t){if(!this.Wr.Tt())return null;this.bt&&this.hh();const i=this.Ui.W().layout;return this.Ht.ar(i.fontSize,i.fontFamily),this.Ht.it(this.Lt),this.Ht}lh(){if(this.eh){if(this.Wr.ah().length>0){const t=this.Ui.kt().he(),i=di(t),n=1.5*ci(t)+2*i;this.rh={above:n,below:n}}else this.rh=null;this.eh=!1}return this.rh}hh(){const t=this.Wr.At(),i=this.Ui.kt(),n=this.Wr.ah();this.sh&&(this.Lt.st=n.map((t=>({ut:t.time,et:0,rt:0,Ks:0,th:t.shape,O:t.color,Jr:t.Jr,wr:t.id,Jt:void 0}))),this.sh=!1);const s=this.Ui.W().layout;this.Lt.nt=null;const e=i.Xs();if(null===e)return;const r=this.Wr.Pt();if(null===r)return;if(0===this.Lt.st.length)return;let h=NaN;const l=di(i.he()),a={ih:l,nh:l};this.Lt.nt=Bt(this.Lt.st,e,!0);for(let e=this.Lt.nt.from;e0&&(_.Jt={Qr:o.text,et:0,rt:0,$i:0,Et:0});const u=this.Wr.oh(o.time);null!==u&&gi(_,o,u,a,s.fontSize,l,t,i,r.Vt)}this.bt=!1}}class xi extends si{constructor(t){super(t)}yr(){const t=this.Mr;t.Tt=!1;const i=this.Is.W();if(!i.priceLineVisible||!this.Is.Tt())return;const n=this.Is.Yr(0===i.priceLineSource);n.Xr||(t.Tt=!0,t.rt=n.ki,t.O=this.Is._h(n.O),t.ht=i.priceLineWidth,t.Wt=i.priceLineStyle)}}class Si extends Q{constructor(t){super(),this.$t=t}Ii(t,i,n){t.Tt=!1,i.Tt=!1;const s=this.$t;if(!s.Tt())return;const e=s.W(),r=e.lastValueVisible,h=""!==s.uh(),l=0===e.seriesLastValueMode,a=s.Yr(!1);if(a.Xr)return;r&&(t.Jt=this.dh(a,r,l),t.Tt=0!==t.Jt.length),(h||l)&&(i.Jt=this.fh(a,r,h,l),i.Tt=i.Jt.length>0);const o=s._h(a.O),_=y(o);n.t=_.t,n.ki=a.ki,i.Bt=s.qt().zt(a.ki/s.At().Et()),t.Bt=o,t.O=_.i,i.O=_.i}fh(t,i,n,s){let e="";const r=this.$t.uh();return n&&0!==r.length&&(e+=`${r} `),i&&s&&(e+=this.$t.At().ph()?t.mh:t.bh),e.trim()}dh(t,i,n){return i?n?this.$t.At().ph()?t.bh:t.mh:t.Jt:""}}function yi(t,i,n,s){const e=Number.isFinite(i),r=Number.isFinite(n);return e&&r?t(i,n):e||r?e?i:n:s}class ki{constructor(t,i){this.wh=t,this.gh=i}Mh(t){return null!==t&&(this.wh===t.wh&&this.gh===t.gh)}xh(){return new ki(this.wh,this.gh)}Sh(){return this.wh}yh(){return this.gh}kh(){return this.gh-this.wh}Fi(){return this.gh===this.wh||Number.isNaN(this.gh)||Number.isNaN(this.wh)}ts(t){return null===t?this:new ki(yi(Math.min,this.Sh(),t.Sh(),-1/0),yi(Math.max,this.yh(),t.yh(),1/0))}Ch(t){if(!T(t))return;if(0===this.gh-this.wh)return;const i=.5*(this.gh+this.wh);let n=this.gh-i,s=this.wh-i;n*=t,s*=t,this.gh=i+n,this.wh=i+s}Th(t){T(t)&&(this.gh+=t,this.wh+=t)}Ph(){return{minValue:this.wh,maxValue:this.gh}}static Rh(t){return null===t?null:new ki(t.minValue,t.maxValue)}}class Ci{constructor(t,i){this.Dh=t,this.Oh=i||null}Ah(){return this.Dh}Vh(){return this.Oh}Ph(){return null===this.Dh?null:{priceRange:this.Dh.Ph(),margins:this.Oh||void 0}}static Rh(t){return null===t?null:new Ci(ki.Rh(t.priceRange),t.margins)}}class Ti extends si{constructor(t,i){super(t),this.Bh=i}yr(){const t=this.Mr;t.Tt=!1;const i=this.Bh.W();if(!this.Is.Tt()||!i.lineVisible)return;const n=this.Bh.zh();null!==n&&(t.Tt=!0,t.rt=n,t.O=i.color,t.ht=i.lineWidth,t.Wt=i.lineStyle,t.wr=this.Bh.W().id)}}class Pi extends Q{constructor(t,i){super(),this.Wr=t,this.Bh=i}Ii(t,i,n){t.Tt=!1,i.Tt=!1;const s=this.Bh.W(),e=s.axisLabelVisible,r=""!==s.title,h=this.Wr;if(!e||!h.Tt())return;const l=this.Bh.zh();if(null===l)return;r&&(i.Jt=s.title,i.Tt=!0),i.Bt=h.qt().zt(l/h.At().Et()),t.Jt=this.Eh(s.price),t.Tt=!0;const a=y(s.axisLabelColor||s.color);n.t=a.t;const o=s.axisLabelTextColor||a.i;t.O=o,i.O=o,n.ki=l}Eh(t){const i=this.Wr.Pt();return null===i?"":this.Wr.At().Wi(t,i.Vt)}}class Ri{constructor(t,i){this.Wr=t,this.cn=i,this.Ih=new Ti(t,this),this._r=new Pi(t,this),this.Lh=new ii(this._r,t,t.qt())}Nh(t){C(this.cn,t),this.gt(),this.Wr.qt().Fh()}W(){return this.cn}Wh(){return this.Ih}jh(){return this.Lh}Hh(){return this._r}gt(){this.Ih.gt(),this._r.gt()}zh(){const t=this.Wr,i=t.At();if(t.qt().kt().Fi()||i.Fi())return null;const n=t.Pt();return null===n?null:i.Ot(this.cn.price,n.Vt)}}class Di extends et{constructor(t){super(),this.Ui=t}qt(){return this.Ui}}const Oi={Bar:(t,i,n,s)=>{var e;const r=i.upColor,h=i.downColor,l=f(t(n,s)),a=v(l.Vt[0])<=v(l.Vt[3]);return{ue:null!==(e=l.O)&&void 0!==e?e:a?r:h}},Candlestick:(t,i,n,s)=>{var e,r,h;const l=i.upColor,a=i.downColor,o=i.borderUpColor,_=i.borderDownColor,u=i.wickUpColor,c=i.wickDownColor,d=f(t(n,s)),p=v(d.Vt[0])<=v(d.Vt[3]);return{ue:null!==(e=d.O)&&void 0!==e?e:p?l:a,Le:null!==(r=d.Bt)&&void 0!==r?r:p?o:_,Ie:null!==(h=d.$h)&&void 0!==h?h:p?u:c}},Custom:(t,i,n,s)=>{var e;return{ue:null!==(e=f(t(n,s)).O)&&void 0!==e?e:i.color}},Area:(t,i,n,s)=>{var e,r,h,l;const a=f(t(n,s));return{ue:null!==(e=a._t)&&void 0!==e?e:i.lineColor,_t:null!==(r=a._t)&&void 0!==r?r:i.lineColor,Ts:null!==(h=a.Ts)&&void 0!==h?h:i.topColor,Ps:null!==(l=a.Ps)&&void 0!==l?l:i.bottomColor}},Baseline:(t,i,n,s)=>{var e,r,h,l,a,o;const _=f(t(n,s));return{ue:_.Vt[3]>=i.baseValue.price?i.topLineColor:i.bottomLineColor,Pe:null!==(e=_.Pe)&&void 0!==e?e:i.topLineColor,Re:null!==(r=_.Re)&&void 0!==r?r:i.bottomLineColor,Se:null!==(h=_.Se)&&void 0!==h?h:i.topFillColor1,ye:null!==(l=_.ye)&&void 0!==l?l:i.topFillColor2,ke:null!==(a=_.ke)&&void 0!==a?a:i.bottomFillColor1,Ce:null!==(o=_.Ce)&&void 0!==o?o:i.bottomFillColor2}},Line:(t,i,n,s)=>{var e,r;const h=f(t(n,s));return{ue:null!==(e=h.O)&&void 0!==e?e:i.color,_t:null!==(r=h.O)&&void 0!==r?r:i.color}},Histogram:(t,i,n,s)=>{var e;return{ue:null!==(e=f(t(n,s)).O)&&void 0!==e?e:i.color}}};class Ai{constructor(t){this.Uh=(t,i)=>void 0!==i?i.Vt:this.Wr.zn().qh(t),this.Wr=t,this.Yh=Oi[t.Xh()]}Hs(t,i){return this.Yh(this.Uh,this.Wr.W(),t,i)}}var Vi;!function(t){t[t.NearestLeft=-1]="NearestLeft",t[t.None=0]="None",t[t.NearestRight=1]="NearestRight"}(Vi||(Vi={}));const Bi=30;class zi{constructor(){this.Kh=[],this.Zh=new Map,this.Gh=new Map}Jh(){return this.Ks()>0?this.Kh[this.Kh.length-1]:null}Qh(){return this.Ks()>0?this.tl(0):null}Bn(){return this.Ks()>0?this.tl(this.Kh.length-1):null}Ks(){return this.Kh.length}Fi(){return 0===this.Ks()}Kr(t){return null!==this.il(t,0)}qh(t){return this.nl(t)}nl(t,i=0){const n=this.il(t,i);return null===n?null:Object.assign(Object.assign({},this.sl(n)),{se:this.tl(n)})}ie(){return this.Kh}el(t,i,n){if(this.Fi())return null;let s=null;for(const e of n){s=Ei(s,this.rl(t,i,e))}return s}it(t){this.Gh.clear(),this.Zh.clear(),this.Kh=t}tl(t){return this.Kh[t].se}sl(t){return this.Kh[t]}il(t,i){const n=this.hl(t);if(null===n&&0!==i)switch(i){case-1:return this.ll(t);case 1:return this.al(t);default:throw new TypeError("Unknown search mode")}return n}ll(t){let i=this.ol(t);return i>0&&(i-=1),i!==this.Kh.length&&this.tl(i)t.set.se>i))}ul(t,i,n){let s=null;for(let e=t;es.dl&&(s.dl=t)))}return s}rl(t,i,n){if(this.Fi())return null;let s=null;const e=f(this.Qh()),r=f(this.Bn()),h=Math.max(t,e),l=Math.min(i,r),a=Math.ceil(h/Bi)*Bi,o=Math.max(a,Math.floor(l/Bi)*Bi);{const t=this.ol(h),e=this._l(Math.min(l,a,i));s=Ei(s,this.ul(t,e,n))}let _=this.Zh.get(n);void 0===_&&(_=new Map,this.Zh.set(n,_));for(let t=Math.max(a+1,h);tnew Li(t)));return this.gl={vl:e,pl:r},r}tn(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.kl).timeAxisViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.Ml)||void 0===s?void 0:s.vl)===e)return this.Ml.pl;const r=this.Wr.qt().kt(),h=e.map((t=>new Fi(t,r)));return this.Ml={vl:e,pl:h},h}Rn(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.kl).priceAxisViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.xl)||void 0===s?void 0:s.vl)===e)return this.xl.pl;const r=this.Wr.At(),h=e.map((t=>new Wi(t,r)));return this.xl={vl:e,pl:h},h}Tl(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.kl).priceAxisPaneViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.Sl)||void 0===s?void 0:s.vl)===e)return this.Sl.pl;const r=e.map((t=>new Li(t)));return this.Sl={vl:e,pl:r},r}Pl(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.kl).timeAxisPaneViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.yl)||void 0===s?void 0:s.vl)===e)return this.yl.pl;const r=e.map((t=>new Li(t)));return this.yl={vl:e,pl:r},r}Rl(t,i){var n,s,e;return null!==(e=null===(s=(n=this.kl).autoscaleInfo)||void 0===s?void 0:s.call(n,t,i))&&void 0!==e?e:null}br(t,i){var n,s,e;return null!==(e=null===(s=(n=this.kl).hitTest)||void 0===s?void 0:s.call(n,t,i))&&void 0!==e?e:null}}function Hi(t,i,n,s){t.forEach((t=>{i(t).forEach((t=>{t.ml()===n&&s.push(t)}))}))}function $i(t){return t.Pn()}function Ui(t){return t.Tl()}function qi(t){return t.Pl()}class Yi extends Di{constructor(t,i,n,s,e){super(t),this.Lt=new zi,this.Ih=new xi(this),this.Dl=[],this.Ol=new ei(this),this.Al=null,this.Vl=null,this.Bl=[],this.zl=[],this.El=null,this.Il=[],this.cn=i,this.Ll=n;const r=new Si(this);this.hn=[r],this.Lh=new ii(r,this,t),"Area"!==n&&"Line"!==n&&"Baseline"!==n||(this.Al=new oi(this)),this.Nl(),this.Fl(e)}S(){null!==this.El&&clearTimeout(this.El)}_h(t){return this.cn.priceLineColor||t}Yr(t){const i={Xr:!0},n=this.At();if(this.qt().kt().Fi()||n.Fi()||this.Lt.Fi())return i;const s=this.qt().kt().Xs(),e=this.Pt();if(null===s||null===e)return i;let r,h;if(t){const t=this.Lt.Jh();if(null===t)return i;r=t,h=t.se}else{const t=this.Lt.nl(s.di(),-1);if(null===t)return i;if(r=this.Lt.qh(t.se),null===r)return i;h=t.se}const l=r.Vt[3],a=this.$s().Hs(h,{Vt:r}),o=n.Ot(l,e.Vt);return{Xr:!1,ct:l,Jt:n.Wi(l,e.Vt),mh:n.Wl(l),bh:n.jl(l,e.Vt),O:a.ue,ki:o,se:h}}$s(){return null!==this.Vl||(this.Vl=new Ai(this)),this.Vl}W(){return this.cn}Nh(t){const i=t.priceScaleId;void 0!==i&&i!==this.cn.priceScaleId&&this.qt().Hl(this,i),C(this.cn,t),void 0!==t.priceFormat&&(this.Nl(),this.qt().$l()),this.qt().Ul(this),this.qt().ql(),this.wn.gt("options")}it(t,i){this.Lt.it(t),this.Yl(),this.wn.gt("data"),this.dn.gt("data"),null!==this.Al&&(i&&i.Xl?this.Al.Hr():0===t.length&&this.Al.jr());const n=this.qt().cr(this);this.qt().Kl(n),this.qt().Ul(this),this.qt().ql(),this.qt().Fh()}Zl(t){this.Bl=t,this.Yl();const i=this.qt().cr(this);this.dn.gt("data"),this.qt().Kl(i),this.qt().Ul(this),this.qt().ql(),this.qt().Fh()}Gl(){return this.Bl}ah(){return this.zl}Jl(t){const i=new Ri(this,t);return this.Dl.push(i),this.qt().Ul(this),i}Ql(t){const i=this.Dl.indexOf(t);-1!==i&&this.Dl.splice(i,1),this.qt().Ul(this)}Xh(){return this.Ll}Pt(){const t=this.ta();return null===t?null:{Vt:t.Vt[3],ia:t.ut}}ta(){const t=this.qt().kt().Xs();if(null===t)return null;const i=t.Os();return this.Lt.nl(i,1)}zn(){return this.Lt}oh(t){const i=this.Lt.qh(t);return null===i?null:"Bar"===this.Ll||"Candlestick"===this.Ll||"Custom"===this.Ll?{we:i.Vt[0],ge:i.Vt[1],Me:i.Vt[2],xe:i.Vt[3]}:i.Vt[3]}na(t){const i=[];Hi(this.Il,$i,"top",i);const n=this.Al;return null!==n&&n.Tt()?(null===this.El&&n.Ur()&&(this.El=setTimeout((()=>{this.El=null,this.qt().sa()}),0)),n.$r(),i.push(n),i):i}Pn(){const t=[];this.ea()||t.push(this.Ol),t.push(this.wn,this.Ih,this.dn);const i=this.Dl.map((t=>t.Wh()));return t.push(...i),Hi(this.Il,$i,"normal",t),t}ra(){return this.ha($i,"bottom")}la(t){return this.ha(Ui,t)}aa(t){return this.ha(qi,t)}oa(t,i){return this.Il.map((n=>n.br(t,i))).filter((t=>null!==t))}Qi(t){return[this.Lh,...this.Dl.map((t=>t.jh()))]}Rn(t,i){if(i!==this.Xi&&!this.ea())return[];const n=[...this.hn];for(const t of this.Dl)n.push(t.Hh());return this.Il.forEach((t=>{n.push(...t.Rn())})),n}tn(){const t=[];return this.Il.forEach((i=>{t.push(...i.tn())})),t}Rl(t,i){if(void 0!==this.cn.autoscaleInfoProvider){const n=this.cn.autoscaleInfoProvider((()=>{const n=this._a(t,i);return null===n?null:n.Ph()}));return Ci.Rh(n)}return this._a(t,i)}ua(){return this.cn.priceFormat.minMove}ca(){return this.da}On(){var t;this.wn.gt(),this.dn.gt();for(const t of this.hn)t.gt();for(const t of this.Dl)t.gt();this.Ih.gt(),this.Ol.gt(),null===(t=this.Al)||void 0===t||t.gt(),this.Il.forEach((t=>t.On()))}At(){return f(super.At())}Ct(t){if(!(("Line"===this.Ll||"Area"===this.Ll||"Baseline"===this.Ll)&&this.cn.crosshairMarkerVisible))return null;const i=this.Lt.qh(t);if(null===i)return null;return{ct:i.Vt[3],ot:this.fa(),Bt:this.va(),Dt:this.pa(),Rt:this.ma(t)}}uh(){return this.cn.title}Tt(){return this.cn.visible}ba(t){this.Il.push(new ji(t,this))}wa(t){this.Il=this.Il.filter((i=>i.Cl()!==t))}ga(){if(this.wn instanceof Yt!=!1)return t=>this.wn.Fe(t)}Ma(){if(this.wn instanceof Yt!=!1)return t=>this.wn.We(t)}ea(){return!lt(this.At().xa())}_a(t,i){if(!P(t)||!P(i)||this.Lt.Fi())return null;const n="Line"===this.Ll||"Area"===this.Ll||"Baseline"===this.Ll||"Histogram"===this.Ll?[3]:[2,1],s=this.Lt.el(t,i,n);let e=null!==s?new ki(s.cl,s.dl):null;if("Histogram"===this.Xh()){const t=this.cn.base,i=new ki(t,t);e=null!==e?e.ts(i):i}let r=this.dn.lh();return this.Il.forEach((n=>{const s=n.Rl(t,i);if(null==s?void 0:s.priceRange){const t=new ki(s.priceRange.minValue,s.priceRange.maxValue);e=null!==e?e.ts(t):t}var h,l,a,o;(null==s?void 0:s.margins)&&(h=r,l=s.margins,r={above:Math.max(null!==(a=null==h?void 0:h.above)&&void 0!==a?a:0,l.above),below:Math.max(null!==(o=null==h?void 0:h.below)&&void 0!==o?o:0,l.below)})})),new Ci(e,r)}fa(){switch(this.Ll){case"Line":case"Area":case"Baseline":return this.cn.crosshairMarkerRadius}return 0}va(){switch(this.Ll){case"Line":case"Area":case"Baseline":{const t=this.cn.crosshairMarkerBorderColor;if(0!==t.length)return t}}return null}pa(){switch(this.Ll){case"Line":case"Area":case"Baseline":return this.cn.crosshairMarkerBorderWidth}return 0}ma(t){switch(this.Ll){case"Line":case"Area":case"Baseline":{const t=this.cn.crosshairMarkerBackgroundColor;if(0!==t.length)return t}}return this.$s().Hs(t).ue}Nl(){switch(this.cn.priceFormat.type){case"custom":this.da={format:this.cn.priceFormat.formatter};break;case"volume":this.da=new dt(this.cn.priceFormat.precision);break;case"percent":this.da=new ct(this.cn.priceFormat.precision);break;default:{const t=Math.pow(10,this.cn.priceFormat.precision);this.da=new ut(t,this.cn.priceFormat.minMove*t)}}null!==this.Xi&&this.Xi.Sa()}Yl(){const t=this.qt().kt();if(!t.ya()||this.Lt.Fi())return void(this.zl=[]);const i=f(this.Lt.Qh());this.zl=this.Bl.map(((n,s)=>{const e=f(t.ka(n.time,!0)),r=et instanceof Yi)).reduce(((t,s)=>{if(n.dr(s)||!s.Tt())return t;const e=s.At(),r=s.zn();if(e.Fi()||!r.Kr(i))return t;const h=r.qh(i);if(null===h)return t;const l=v(s.Pt());return t.concat([e.Ot(h.Vt[3],l.Vt)])}),[]);if(0===l.length)return s;l.sort(((t,i)=>Math.abs(t-h)-Math.abs(i-h)));const a=l[0];return s=e.pn(a,r),s}}class Ki extends H{constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;const e=Math.max(1,Math.floor(n));t.lineWidth=e,function(t,i){t.save(),t.lineWidth%2&&t.translate(.5,.5),i(),t.restore()}(t,(()=>{const r=f(this.Lt);if(r.Pa){t.strokeStyle=r.Ra,_(t,r.Da),t.beginPath();for(const s of r.Oa){const r=Math.round(s.Aa*n);t.moveTo(r,-e),t.lineTo(r,i.height+e)}t.stroke()}if(r.Va){t.strokeStyle=r.Ba,_(t,r.za),t.beginPath();for(const n of r.Ea){const r=Math.round(n.Aa*s);t.moveTo(-e,r),t.lineTo(i.width+e,r)}t.stroke()}}))}}class Zi{constructor(t){this.Ht=new Ki,this.bt=!0,this.nn=t}gt(){this.bt=!0}xt(){if(this.bt){const t=this.nn.qt().W().grid,i={Va:t.horzLines.visible,Pa:t.vertLines.visible,Ba:t.horzLines.color,Ra:t.vertLines.color,za:t.horzLines.style,Da:t.vertLines.style,Ea:this.nn.vn().Ia(),Oa:(this.nn.qt().kt().Ia()||[]).map((t=>({Aa:t.coord})))};this.Ht.it(i),this.bt=!1}return this.Ht}}class Gi{constructor(t){this.wn=new Zi(t)}Wh(){return this.wn}}const Ji={La:4,Na:1e-4};function Qi(t,i){const n=100*(t-i)/i;return i<0?-n:n}function tn(t,i){const n=Qi(t.Sh(),i),s=Qi(t.yh(),i);return new ki(n,s)}function nn(t,i){const n=100*(t-i)/i+100;return i<0?-n:n}function sn(t,i){const n=nn(t.Sh(),i),s=nn(t.yh(),i);return new ki(n,s)}function en(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.log10(n+i.Na)+i.La;return t<0?-s:s}function rn(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.pow(10,n-i.La)-i.Na;return t<0?-s:s}function hn(t,i){if(null===t)return null;const n=en(t.Sh(),i),s=en(t.yh(),i);return new ki(n,s)}function ln(t,i){if(null===t)return null;const n=rn(t.Sh(),i),s=rn(t.yh(),i);return new ki(n,s)}function an(t){if(null===t)return Ji;const i=Math.abs(t.yh()-t.Sh());if(i>=1||i<1e-15)return Ji;const n=Math.ceil(Math.abs(Math.log10(i))),s=Ji.La+n;return{La:s,Na:1/Math.pow(10,s)}}class on{constructor(t,i){if(this.Fa=t,this.Wa=i,function(t){if(t<0)return!1;for(let i=t;i>1;i/=10)if(i%10!=0)return!1;return!0}(this.Fa))this.ja=[2,2.5,2];else{this.ja=[];for(let t=this.Fa;1!==t;){if(t%2==0)this.ja.push(2),t/=2;else{if(t%5!=0)throw new Error("unexpected base");this.ja.push(2,2.5),t/=5}if(this.ja.length>100)throw new Error("something wrong with base")}}}Ha(t,i,n){const s=0===this.Fa?0:1/this.Fa;let e=Math.pow(10,Math.max(0,Math.ceil(Math.log10(t-i)))),r=0,h=this.Wa[0];for(;;){const t=xt(e,s,1e-14)&&e>s+1e-14,i=xt(e,n*h,1e-14),l=xt(e,1,1e-14);if(!(t&&i&&l))break;e/=h,h=this.Wa[++r%this.Wa.length]}if(e<=s+1e-14&&(e=s),e=Math.max(1,e),this.ja.length>0&&(l=e,a=1,o=1e-14,Math.abs(l-a)s+1e-14;)e/=h,h=this.ja[++r%this.ja.length];var l,a,o;return e}}class _n{constructor(t,i,n,s){this.$a=[],this.Li=t,this.Fa=i,this.Ua=n,this.qa=s}Ha(t,i){if(t=o?1:-1;let d=null,f=0;for(let n=a-u;n>o;n-=_){const s=this.qa(n,i,!0);null!==d&&Math.abs(s-d)l||(ff(t.Zi())-f(i.Zi())))}var cn;!function(t){t[t.Normal=0]="Normal",t[t.Logarithmic=1]="Logarithmic",t[t.Percentage=2]="Percentage",t[t.IndexedTo100=3]="IndexedTo100"}(cn||(cn={}));const dn=new ct,fn=new ut(100,1);class vn{constructor(t,i,n,s){this.Qa=0,this.io=null,this.Dh=null,this.no=null,this.so={eo:!1,ro:null},this.ho=0,this.lo=0,this.ao=new k,this.oo=new k,this._o=[],this.uo=null,this.co=null,this.do=null,this.fo=null,this.da=fn,this.vo=an(null),this.po=t,this.cn=i,this.mo=n,this.bo=s,this.wo=new _n(this,100,this.Mo.bind(this),this.xo.bind(this))}xa(){return this.po}W(){return this.cn}Nh(t){if(C(this.cn,t),this.Sa(),void 0!==t.mode&&this.So({kr:t.mode}),void 0!==t.scaleMargins){const i=d(t.scaleMargins.top),n=d(t.scaleMargins.bottom);if(i<0||i>1)throw new Error(`Invalid top margin - expect value between 0 and 1, given=${i}`);if(n<0||n>1||i+n>1)throw new Error(`Invalid bottom margin - expect value between 0 and 1, given=${n}`);if(i+n>1)throw new Error(`Invalid margins - sum of margins must be less than 1, given=${i+n}`);this.yo(),this.co=null}}ko(){return this.cn.autoScale}Ja(){return 1===this.cn.mode}ph(){return 2===this.cn.mode}Co(){return 3===this.cn.mode}kr(){return{Wn:this.cn.autoScale,To:this.cn.invertScale,kr:this.cn.mode}}So(t){const i=this.kr();let n=null;void 0!==t.Wn&&(this.cn.autoScale=t.Wn),void 0!==t.kr&&(this.cn.mode=t.kr,2!==t.kr&&3!==t.kr||(this.cn.autoScale=!0),this.so.eo=!1),1===i.kr&&t.kr!==i.kr&&(!function(t,i){if(null===t)return!1;const n=rn(t.Sh(),i),s=rn(t.yh(),i);return isFinite(n)&&isFinite(s)}(this.Dh,this.vo)?this.cn.autoScale=!0:(n=ln(this.Dh,this.vo),null!==n&&this.Po(n))),1===t.kr&&t.kr!==i.kr&&(n=hn(this.Dh,this.vo),null!==n&&this.Po(n));const s=i.kr!==this.cn.mode;s&&(2===i.kr||this.ph())&&this.Sa(),s&&(3===i.kr||this.Co())&&this.Sa(),void 0!==t.To&&i.To!==t.To&&(this.cn.invertScale=t.To,this.Ro()),this.oo.m(i,this.kr())}Do(){return this.oo}P(){return this.mo.fontSize}Et(){return this.Qa}Oo(t){this.Qa!==t&&(this.Qa=t,this.yo(),this.co=null)}Ao(){if(this.io)return this.io;const t=this.Et()-this.Vo()-this.Bo();return this.io=t,t}Ah(){return this.zo(),this.Dh}Po(t,i){const n=this.Dh;(i||null===n&&null!==t||null!==n&&!n.Mh(t))&&(this.co=null,this.Dh=t)}Fi(){return this.zo(),0===this.Qa||!this.Dh||this.Dh.Fi()}Eo(t){return this.To()?t:this.Et()-1-t}Ot(t,i){return this.ph()?t=Qi(t,i):this.Co()&&(t=nn(t,i)),this.xo(t,i)}Qs(t,i,n){this.zo();const s=this.Bo(),e=f(this.Ah()),r=e.Sh(),h=e.yh(),l=this.Ao()-1,a=this.To(),o=l/(h-r),_=void 0===n?0:n.from,u=void 0===n?t.length:n.to,c=this.Io();for(let n=_;nt.On()))}Sa(){this.co=null;const t=this.Jo();let i=100;null!==t&&(i=Math.round(1/t.ua())),this.da=fn,this.ph()?(this.da=dn,i=100):this.Co()?(this.da=new ut(100,1),i=100):null!==t&&(this.da=t.ca()),this.wo=new _n(this,i,this.Mo.bind(this),this.xo.bind(this)),this.wo.Xa()}Wo(){this.uo=null}Jo(){return this._o[0]||null}Vo(){return this.To()?this.cn.scaleMargins.bottom*this.Et()+this.lo:this.cn.scaleMargins.top*this.Et()+this.ho}Bo(){return this.To()?this.cn.scaleMargins.top*this.Et()+this.ho:this.cn.scaleMargins.bottom*this.Et()+this.lo}zo(){this.so.eo||(this.so.eo=!0,this.i_())}yo(){this.io=null}xo(t,i){if(this.zo(),this.Fi())return 0;t=this.Ja()&&t?en(t,this.vo):t;const n=f(this.Ah()),s=this.Bo()+(this.Ao()-1)*(t-n.Sh())/n.kh();return this.Eo(s)}Mo(t,i){if(this.zo(),this.Fi())return 0;const n=this.Eo(t),s=f(this.Ah()),e=s.Sh()+s.kh()*((n-this.Bo())/(this.Ao()-1));return this.Ja()?rn(e,this.vo):e}Ro(){this.co=null,this.wo.Xa()}i_(){const t=this.so.ro;if(null===t)return;let i=null;const n=this.Qo();let s=0,e=0;for(const r of n){if(!r.Tt())continue;const n=r.Pt();if(null===n)continue;const h=r.Rl(t.Os(),t.di());let l=h&&h.Ah();if(null!==l){switch(this.cn.mode){case 1:l=hn(l,this.vo);break;case 2:l=tn(l,n.Vt);break;case 3:l=sn(l,n.Vt)}if(i=null===i?l:i.ts(f(l)),null!==h){const t=h.Vh();null!==t&&(s=Math.max(s,t.above),e=Math.max(s,t.below))}}}if(s===this.ho&&e===this.lo||(this.ho=s,this.lo=e,this.co=null,this.yo()),null!==i){if(i.Sh()===i.yh()){const t=this.Jo(),n=5*(null===t||this.ph()||this.Co()?1:t.ua());this.Ja()&&(i=ln(i,this.vo)),i=new ki(i.Sh()-n,i.yh()+n),this.Ja()&&(i=hn(i,this.vo))}if(this.Ja()){const t=ln(i,this.vo),n=an(t);if(r=n,h=this.vo,r.La!==h.La||r.Na!==h.Na){const s=null!==this.no?ln(this.no,this.vo):null;this.vo=n,i=hn(t,n),null!==s&&(this.no=hn(s,n))}}this.Po(i)}else null===this.Dh&&(this.Po(new ki(-.5,.5)),this.vo=an(null));var r,h;this.so.eo=!0}Io(){return this.ph()?Qi:this.Co()?nn:this.Ja()?t=>en(t,this.vo):null}n_(t,i,n){return void 0===i?(void 0===n&&(n=this.ca()),n.format(t)):i(t)}Eh(t,i){return this.n_(t,this.bo.priceFormatter,i)}Go(t,i){return this.n_(t,this.bo.percentageFormatter,i)}}class pn{constructor(t,i){this._o=[],this.s_=new Map,this.Qa=0,this.e_=0,this.r_=1e3,this.uo=null,this.h_=new k,this.wl=t,this.Ui=i,this.l_=new Gi(this);const n=i.W();this.a_=this.o_("left",n.leftPriceScale),this.__=this.o_("right",n.rightPriceScale),this.a_.Do().l(this.u_.bind(this,this.a_),this),this.__.Do().l(this.u_.bind(this,this.__),this),this.c_(n)}c_(t){if(t.leftPriceScale&&this.a_.Nh(t.leftPriceScale),t.rightPriceScale&&this.__.Nh(t.rightPriceScale),t.localization&&(this.a_.Sa(),this.__.Sa()),t.overlayPriceScales){const i=Array.from(this.s_.values());for(const n of i){const i=f(n[0].At());i.Nh(t.overlayPriceScales),t.localization&&i.Sa()}}}d_(t){switch(t){case"left":return this.a_;case"right":return this.__}return this.s_.has(t)?d(this.s_.get(t))[0].At():null}S(){this.qt().f_().p(this),this.a_.Do().p(this),this.__.Do().p(this),this._o.forEach((t=>{t.S&&t.S()})),this.h_.m()}v_(){return this.r_}p_(t){this.r_=t}qt(){return this.Ui}$i(){return this.e_}Et(){return this.Qa}m_(t){this.e_=t,this.b_()}Oo(t){this.Qa=t,this.a_.Oo(t),this.__.Oo(t),this._o.forEach((i=>{if(this.dr(i)){const n=i.At();null!==n&&n.Oo(t)}})),this.b_()}Ta(){return this._o}dr(t){const i=t.At();return null===i||this.a_!==i&&this.__!==i}Fo(t,i,n){const s=void 0!==n?n:this.g_().w_+1;this.M_(t,i,s)}jo(t){const i=this._o.indexOf(t);c(-1!==i,"removeDataSource: invalid data source"),this._o.splice(i,1);const n=f(t.At()).xa();if(this.s_.has(n)){const i=d(this.s_.get(n)),s=i.indexOf(t);-1!==s&&(i.splice(s,1),0===i.length&&this.s_.delete(n))}const s=t.At();s&&s.Ta().indexOf(t)>=0&&s.jo(t),null!==s&&(s.Wo(),this.x_(s)),this.uo=null}pr(t){return t===this.a_?"left":t===this.__?"right":"overlay"}S_(){return this.a_}y_(){return this.__}k_(t,i){t.Uo(i)}C_(t,i){t.qo(i),this.b_()}T_(t){t.Yo()}P_(t,i){t.Xo(i)}R_(t,i){t.Ko(i),this.b_()}D_(t){t.Zo()}b_(){this._o.forEach((t=>{t.On()}))}vn(){let t=null;return this.Ui.W().rightPriceScale.visible&&0!==this.__.Ta().length?t=this.__:this.Ui.W().leftPriceScale.visible&&0!==this.a_.Ta().length?t=this.a_:0!==this._o.length&&(t=this._o[0].At()),null===t&&(t=this.__),t}vr(){let t=null;return this.Ui.W().rightPriceScale.visible?t=this.__:this.Ui.W().leftPriceScale.visible&&(t=this.a_),t}x_(t){null!==t&&t.ko()&&this.O_(t)}A_(t){const i=this.wl.Xs();t.So({Wn:!0}),null!==i&&t.t_(i),this.b_()}V_(){this.O_(this.a_),this.O_(this.__)}B_(){this.x_(this.a_),this.x_(this.__),this._o.forEach((t=>{this.dr(t)&&this.x_(t.At())})),this.b_(),this.Ui.Fh()}No(){return null===this.uo&&(this.uo=un(this._o)),this.uo}z_(){return this.h_}E_(){return this.l_}O_(t){const i=t.Qo();if(i&&i.length>0&&!this.wl.Fi()){const i=this.wl.Xs();null!==i&&t.t_(i)}t.On()}g_(){const t=this.No();if(0===t.length)return{I_:0,w_:0};let i=0,n=0;for(let s=0;sn&&(n=e))}return{I_:i,w_:n}}M_(t,i,n){let s=this.d_(i);if(null===s&&(s=this.o_(i,this.Ui.W().overlayPriceScales)),this._o.push(t),!lt(i)){const n=this.s_.get(i)||[];n.push(t),this.s_.set(i,n)}s.Fo(t),t.Ji(s),t.Gi(n),this.x_(s),this.uo=null}u_(t,i,n){i.kr!==n.kr&&this.O_(t)}o_(t,i){const n=Object.assign({visible:!0,autoScale:!0},O(i)),s=new vn(t,n,this.Ui.W().layout,this.Ui.W().localization);return s.Oo(this.Et()),s}}class mn{constructor(t,i,n=50){this.Ke=0,this.Ze=1,this.Ge=1,this.Qe=new Map,this.Je=new Map,this.L_=t,this.N_=i,this.tr=n}F_(t){const i=t.time,n=this.N_.cacheKey(i),s=this.Qe.get(n);if(void 0!==s)return s.W_;if(this.Ke===this.tr){const t=this.Je.get(this.Ge);this.Je.delete(this.Ge),this.Qe.delete(d(t)),this.Ge++,this.Ke--}const e=this.L_(t);return this.Qe.set(n,{W_:e,er:this.Ze}),this.Je.set(this.Ze,n),this.Ke++,this.Ze++,e}}class bn{constructor(t,i){c(t<=i,"right should be >= left"),this.j_=t,this.H_=i}Os(){return this.j_}di(){return this.H_}U_(){return this.H_-this.j_+1}Kr(t){return this.j_<=t&&t<=this.H_}Mh(t){return this.j_===t.Os()&&this.H_===t.di()}}function wn(t,i){return null===t||null===i?t===i:t.Mh(i)}class gn{constructor(){this.q_=new Map,this.Qe=null,this.Y_=!1}X_(t){this.Y_=t,this.Qe=null}K_(t,i){this.Z_(i),this.Qe=null;for(let n=i;n{t<=n[0].index?i.push(s):n.splice(Dt(n,t,(i=>i.indexi-t))){if(!this.q_.get(n))continue;const s=i;i=[];const e=s.length;let r=0;const h=d(this.q_.get(n)),l=h.length;let a=1/0,o=-1/0;for(let n=0;n=t&&_-o>=t)i.push(l),o=_;else if(this.Y_)return s}for(;ri.weight?t:i}class Sn{constructor(t,i,n,s){this.e_=0,this.eu=null,this.ru=[],this.fo=null,this.do=null,this.hu=new gn,this.lu=new Map,this.au=Mn.su(),this.ou=!0,this._u=new k,this.uu=new k,this.cu=new k,this.du=null,this.fu=null,this.vu=[],this.cn=i,this.bo=n,this.pu=i.rightOffset,this.mu=i.barSpacing,this.Ui=t,this.N_=s,this.bu(),this.hu.X_(i.uniformDistribution)}W(){return this.cn}wu(t){C(this.bo,t),this.gu(),this.bu()}Nh(t,i){var n;C(this.cn,t),this.cn.fixLeftEdge&&this.Mu(),this.cn.fixRightEdge&&this.xu(),void 0!==t.barSpacing&&this.Ui.Gn(t.barSpacing),void 0!==t.rightOffset&&this.Ui.Jn(t.rightOffset),void 0!==t.minBarSpacing&&this.Ui.Gn(null!==(n=t.barSpacing)&&void 0!==n?n:this.mu),this.gu(),this.bu(),this.cu.m()}mn(t){var i,n;return null!==(n=null===(i=this.ru[t])||void 0===i?void 0:i.time)&&void 0!==n?n:null}qi(t){var i;return null!==(i=this.ru[t])&&void 0!==i?i:null}ka(t,i){if(this.ru.length<1)return null;if(this.N_.key(t)>this.N_.key(this.ru[this.ru.length-1].time))return i?this.ru.length-1:null;const n=Dt(this.ru,this.N_.key(t),((t,i)=>this.N_.key(t.time)0}Xs(){return this.Su(),this.au.iu()}yu(){return this.Su(),this.au.nu()}ku(){const t=this.Xs();if(null===t)return null;const i={from:t.Os(),to:t.di()};return this.Cu(i)}Cu(t){const i=Math.round(t.from),n=Math.round(t.to),s=f(this.Tu()),e=f(this.Pu());return{from:f(this.qi(Math.max(s,i))),to:f(this.qi(Math.min(e,n)))}}Ru(t){return{from:f(this.ka(t.from,!0)),to:f(this.ka(t.to,!0))}}$i(){return this.e_}m_(t){if(!isFinite(t)||t<=0)return;if(this.e_===t)return;const i=this.yu(),n=this.e_;if(this.e_=t,this.ou=!0,this.cn.lockVisibleTimeRangeOnResize&&0!==n){const i=this.mu*t/n;this.mu=i}if(this.cn.fixLeftEdge&&null!==i&&i.Os()<=0){const i=n-t;this.pu-=Math.round(i/this.mu)+1,this.ou=!0}this.Du(),this.Ou()}It(t){if(this.Fi()||!P(t))return 0;const i=this.Au()+this.pu-t;return this.e_-(i+.5)*this.mu-1}Js(t,i){const n=this.Au(),s=void 0===i?0:i.from,e=void 0===i?t.length:i.to;for(let i=s;ii/2&&!o?n.needAlignCoordinate=!1:n.needAlignCoordinate=_&&t.index<=l||u&&t.index>=a,c++}return this.vu.length=c,this.fu=this.vu,this.vu}Fu(){this.ou=!0,this.Gn(this.cn.barSpacing),this.Jn(this.cn.rightOffset)}Wu(t){this.ou=!0,this.eu=t,this.Ou(),this.Mu()}ju(t,i){const n=this.Bu(t),s=this.he(),e=s+i*(s/10);this.Gn(e),this.cn.rightBarStaysOnScroll||this.Jn(this.Iu()+(n-this.Bu(t)))}Uo(t){this.fo&&this.Zo(),null===this.do&&null===this.du&&(this.Fi()||(this.do=t,this.Hu()))}qo(t){if(null===this.du)return;const i=Mt(this.e_-t,0,this.e_),n=Mt(this.e_-f(this.do),0,this.e_);0!==i&&0!==n&&this.Gn(this.du.he*i/n)}Yo(){null!==this.do&&(this.do=null,this.$u())}Xo(t){null===this.fo&&null===this.du&&(this.Fi()||(this.fo=t,this.Hu()))}Ko(t){if(null===this.fo)return;const i=(this.fo-t)/this.he();this.pu=f(this.du).Iu+i,this.ou=!0,this.Ou()}Zo(){null!==this.fo&&(this.fo=null,this.$u())}Uu(){this.qu(this.cn.rightOffset)}qu(t,i=400){if(!isFinite(t))throw new RangeError("offset is required and must be finite number");if(!isFinite(i)||i<=0)throw new RangeError("animationDuration (optional) must be finite positive number");const n=this.pu,s=performance.now();this.Ui.Xn({Yu:t=>(t-s)/i>=1,Xu:e=>{const r=(e-s)/i;return r>=1?t:n+(t-n)*r}})}gt(t,i){this.ou=!0,this.ru=t,this.hu.K_(t,i),this.Ou()}Ku(){return this._u}Zu(){return this.uu}Gu(){return this.cu}Au(){return this.eu||0}Ju(t){const i=t.U_();this.Eu(this.e_/i),this.pu=t.di()-this.Au(),this.Ou(),this.ou=!0,this.Ui.zu(),this.Ui.Fh()}Qu(){const t=this.Tu(),i=this.Pu();null!==t&&null!==i&&this.Ju(new bn(t,i+this.cn.rightOffset))}tc(t){const i=new bn(t.from,t.to);this.Ju(i)}Yi(t){return void 0!==this.bo.timeFormatter?this.bo.timeFormatter(t.originalTime):this.N_.formatHorzItem(t.time)}Lu(){const{handleScroll:t,handleScale:i}=this.Ui.W();return!(t.horzTouchDrag||t.mouseWheel||t.pressedMouseMove||t.vertTouchDrag||i.axisDoubleClickReset.time||i.axisPressedMouseMove.time||i.mouseWheel||i.pinch)}Tu(){return 0===this.ru.length?null:0}Pu(){return 0===this.ru.length?null:this.ru.length-1}ic(t){return(this.e_-1-t)/this.mu}Bu(t){const i=this.ic(t),n=this.Au()+this.pu-i;return Math.round(1e6*n)/1e6}Eu(t){const i=this.mu;this.mu=t,this.Du(),i!==this.mu&&(this.ou=!0,this.nc())}Su(){if(!this.ou)return;if(this.ou=!1,this.Fi())return void this.sc(Mn.su());const t=this.Au(),i=this.e_/this.mu,n=this.pu+t,s=new bn(n-i+1,n);this.sc(new Mn(s))}Du(){const t=this.ec();if(this.mut&&(this.mu=t,this.ou=!0)}}ec(){return this.cn.fixLeftEdge&&this.cn.fixRightEdge&&0!==this.ru.length?this.e_/this.ru.length:this.cn.minBarSpacing}Ou(){const t=this.rc();this.pu>t&&(this.pu=t,this.ou=!0);const i=this.hc();null!==i&&this.puthis.lc(t)),this.N_),this.lu.set(t.weight,i)),i.F_(t)}lc(t){return this.N_.formatTickmark(t,this.bo)}sc(t){const i=this.au;this.au=t,wn(i.iu(),this.au.iu())||this._u.m(),wn(i.nu(),this.au.nu())||this.uu.m(),this.nc()}nc(){this.fu=null}gu(){this.nc(),this.lu.clear()}bu(){this.N_.updateFormatter(this.bo)}Mu(){if(!this.cn.fixLeftEdge)return;const t=this.Tu();if(null===t)return;const i=this.Xs();if(null===i)return;const n=i.Os()-t;if(n<0){const t=this.pu-n-1;this.Jn(t)}this.Du()}xu(){this.Ou(),this.Du()}}class yn extends L{constructor(t){super(),this.ac=new Map,this.Lt=t}Z(t){}J(t){if(!this.Lt.Tt)return;const{context:i,mediaSize:n}=t;let s=0;for(const t of this.Lt.oc){if(0===t.Jt.length)continue;i.font=t.R;const e=this._c(i,t.Jt);e>n.width?t.ju=n.width/e:t.ju=1,s+=t.uc*t.ju}let e=0;switch(this.Lt.cc){case"top":e=0;break;case"center":e=Math.max((n.height-s)/2,0);break;case"bottom":e=Math.max(n.height-s,0)}i.fillStyle=this.Lt.O;for(const t of this.Lt.oc){i.save();let s=0;switch(this.Lt.dc){case"left":i.textAlign="left",s=t.uc/2;break;case"center":i.textAlign="center",s=n.width/2;break;case"right":i.textAlign="right",s=n.width-1-t.uc/2}i.translate(s,e),i.textBaseline="top",i.font=t.R,i.scale(t.ju,t.ju),i.fillText(t.Jt,0,t.fc),i.restore(),e+=t.uc*t.ju}}_c(t,i){const n=this.vc(t.font);let s=n.get(i);return void 0===s&&(s=t.measureText(i).width,n.set(i,s)),s}vc(t){let i=this.ac.get(t);return void 0===i&&(i=new Map,this.ac.set(t,i)),i}}class kn{constructor(t){this.bt=!0,this.jt={Tt:!1,O:"",oc:[],cc:"center",dc:"center"},this.Ht=new yn(this.jt),this.$t=t}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht}St(){const t=this.$t.W(),i=this.jt;i.Tt=t.visible,i.Tt&&(i.O=t.color,i.dc=t.horzAlign,i.cc=t.vertAlign,i.oc=[{Jt:t.text,R:z(t.fontSize,t.fontFamily,t.fontStyle),uc:1.2*t.fontSize,fc:0,ju:0}])}}class Cn extends et{constructor(t,i){super(),this.cn=i,this.wn=new kn(this)}Rn(){return[]}Pn(){return[this.wn]}W(){return this.cn}On(){this.wn.gt()}}var Tn,Pn,Rn,Dn,On;!function(t){t[t.OnTouchEnd=0]="OnTouchEnd",t[t.OnNextTap=1]="OnNextTap"}(Tn||(Tn={}));class An{constructor(t,i,n){this.mc=[],this.bc=[],this.e_=0,this.wc=null,this.gc=new k,this.Mc=new k,this.xc=null,this.Sc=t,this.cn=i,this.N_=n,this.yc=new E(this),this.wl=new Sn(this,i.timeScale,this.cn.localization,n),this.wt=new ht(this,i.crosshair),this.kc=new Xi(i.crosshair),this.Cc=new Cn(this,i.watermark),this.Tc(),this.mc[0].p_(2e3),this.Pc=this.Rc(0),this.Dc=this.Rc(1)}$l(){this.Oc(at.es())}Fh(){this.Oc(at.ss())}sa(){this.Oc(new at(1))}Ul(t){const i=this.Ac(t);this.Oc(i)}Vc(){return this.wc}Bc(t){const i=this.wc;this.wc=t,null!==i&&this.Ul(i.zc),null!==t&&this.Ul(t.zc)}W(){return this.cn}Nh(t){C(this.cn,t),this.mc.forEach((i=>i.c_(t))),void 0!==t.timeScale&&this.wl.Nh(t.timeScale),void 0!==t.localization&&this.wl.wu(t.localization),(t.leftPriceScale||t.rightPriceScale)&&this.gc.m(),this.Pc=this.Rc(0),this.Dc=this.Rc(1),this.$l()}Ec(t,i){if("left"===t)return void this.Nh({leftPriceScale:i});if("right"===t)return void this.Nh({rightPriceScale:i});const n=this.Ic(t);null!==n&&(n.At.Nh(i),this.gc.m())}Ic(t){for(const i of this.mc){const n=i.d_(t);if(null!==n)return{Ut:i,At:n}}return null}kt(){return this.wl}Lc(){return this.mc}Nc(){return this.Cc}Fc(){return this.wt}Wc(){return this.Mc}jc(t,i){t.Oo(i),this.zu()}m_(t){this.e_=t,this.wl.m_(this.e_),this.mc.forEach((i=>i.m_(t))),this.zu()}Tc(t){const i=new pn(this.wl,this);void 0!==t?this.mc.splice(t,0,i):this.mc.push(i);const n=void 0===t?this.mc.length-1:t,s=at.es();return s.Nn(n,{Fn:0,Wn:!0}),this.Oc(s),i}k_(t,i,n){t.k_(i,n)}C_(t,i,n){t.C_(i,n),this.ql(),this.Oc(this.Hc(t,2))}T_(t,i){t.T_(i),this.Oc(this.Hc(t,2))}P_(t,i,n){i.ko()||t.P_(i,n)}R_(t,i,n){i.ko()||(t.R_(i,n),this.ql(),this.Oc(this.Hc(t,2)))}D_(t,i){i.ko()||(t.D_(i),this.Oc(this.Hc(t,2)))}A_(t,i){t.A_(i),this.Oc(this.Hc(t,2))}$c(t){this.wl.Uo(t)}Uc(t,i){const n=this.kt();if(n.Fi()||0===i)return;const s=n.$i();t=Math.max(1,Math.min(t,s)),n.ju(t,i),this.zu()}qc(t){this.Yc(0),this.Xc(t),this.Kc()}Zc(t){this.wl.qo(t),this.zu()}Gc(){this.wl.Yo(),this.Fh()}Yc(t){this.wl.Xo(t)}Xc(t){this.wl.Ko(t),this.zu()}Kc(){this.wl.Zo(),this.Fh()}Mt(){return this.bc}Jc(t,i,n,s,e){this.wt.gn(t,i);let r=NaN,h=this.wl.Vu(t);const l=this.wl.Xs();null!==l&&(h=Math.min(Math.max(l.Os(),h),l.di()));const a=s.vn(),o=a.Pt();null!==o&&(r=a.pn(i,o)),r=this.kc.Ca(r,h,s),this.wt.yn(h,r,s),this.sa(),e||this.Mc.m(this.wt.yt(),{x:t,y:i},n)}Qc(t,i,n){const s=n.vn(),e=s.Pt(),r=s.Ot(t,f(e)),h=this.wl.ka(i,!0),l=this.wl.It(f(h));this.Jc(l,r,null,n,!0)}td(t){this.Fc().Cn(),this.sa(),t||this.Mc.m(null,null,null)}ql(){const t=this.wt.Ut();if(null!==t){const i=this.wt.xn(),n=this.wt.Sn();this.Jc(i,n,null,t)}this.wt.On()}nd(t,i,n){const s=this.wl.mn(0);void 0!==i&&void 0!==n&&this.wl.gt(i,n);const e=this.wl.mn(0),r=this.wl.Au(),h=this.wl.Xs();if(null!==h&&null!==s&&null!==e){const i=h.Kr(r),l=this.N_.key(s)>this.N_.key(e),a=null!==t&&t>r&&!l,o=this.wl.W().allowShiftVisibleRangeOnWhitespaceReplacement,_=i&&(!(void 0===n)||o)&&this.wl.W().shiftVisibleRangeOnNewBar;if(a&&!_){const i=t-r;this.wl.Jn(this.wl.Iu()-i)}}this.wl.Wu(t)}Kl(t){null!==t&&t.B_()}cr(t){const i=this.mc.find((i=>i.No().includes(t)));return void 0===i?null:i}zu(){this.Cc.On(),this.mc.forEach((t=>t.B_())),this.ql()}S(){this.mc.forEach((t=>t.S())),this.mc.length=0,this.cn.localization.priceFormatter=void 0,this.cn.localization.percentageFormatter=void 0,this.cn.localization.timeFormatter=void 0}sd(){return this.yc}mr(){return this.yc.W()}f_(){return this.gc}ed(t,i,n){const s=this.mc[0],e=this.rd(i,t,s,n);return this.bc.push(e),1===this.bc.length?this.$l():this.Fh(),e}hd(t){const i=this.cr(t),n=this.bc.indexOf(t);c(-1!==n,"Series not found"),this.bc.splice(n,1),f(i).jo(t),t.S&&t.S()}Hl(t,i){const n=f(this.cr(t));n.jo(t);const s=this.Ic(i);if(null===s){const s=t.Zi();n.Fo(t,i,s)}else{const e=s.Ut===n?t.Zi():void 0;s.Ut.Fo(t,i,e)}}Qu(){const t=at.ss();t.$n(),this.Oc(t)}ld(t){const i=at.ss();i.Yn(t),this.Oc(i)}Zn(){const t=at.ss();t.Zn(),this.Oc(t)}Gn(t){const i=at.ss();i.Gn(t),this.Oc(i)}Jn(t){const i=at.ss();i.Jn(t),this.Oc(i)}Xn(t){const i=at.ss();i.Xn(t),this.Oc(i)}Un(){const t=at.ss();t.Un(),this.Oc(t)}ad(){return this.cn.rightPriceScale.visible?"right":"left"}od(){return this.Dc}q(){return this.Pc}zt(t){const i=this.Dc,n=this.Pc;if(i===n)return i;if(t=Math.max(0,Math.min(100,Math.round(100*t))),null===this.xc||this.xc.Ts!==n||this.xc.Ps!==i)this.xc={Ts:n,Ps:i,_d:new Map};else{const i=this.xc._d.get(t);if(void 0!==i)return i}const s=function(t,i,n){const[s,e,r,h]=S(t),[l,a,o,_]=S(i),u=[m(s+n*(l-s)),m(e+n*(a-e)),m(r+n*(o-r)),b(h+n*(_-h))];return`rgba(${u[0]}, ${u[1]}, ${u[2]}, ${u[3]})`}(n,i,t/100);return this.xc._d.set(t,s),s}Hc(t,i){const n=new at(i);if(null!==t){const s=this.mc.indexOf(t);n.Nn(s,{Fn:i})}return n}Ac(t,i){return void 0===i&&(i=2),this.Hc(this.cr(t),i)}Oc(t){this.Sc&&this.Sc(t),this.mc.forEach((t=>t.E_().Wh().gt()))}rd(t,i,n,s){const e=new Yi(this,t,i,n,s),r=void 0!==t.priceScaleId?t.priceScaleId:this.ad();return n.Fo(e,r),lt(r)||e.Nh(t),e}Rc(t){const i=this.cn.layout;return"gradient"===i.background.type?0===t?i.background.topColor:i.background.bottomColor:i.background.color}}function Vn(t){return!T(t)&&!R(t)}function Bn(t){return T(t)}!function(t){t[t.Disabled=0]="Disabled",t[t.Continuous=1]="Continuous",t[t.OnDataUpdate=2]="OnDataUpdate"}(Pn||(Pn={})),function(t){t[t.LastBar=0]="LastBar",t[t.LastVisible=1]="LastVisible"}(Rn||(Rn={})),function(t){t.Solid="solid",t.VerticalGradient="gradient"}(Dn||(Dn={})),function(t){t[t.Year=0]="Year",t[t.Month=1]="Month",t[t.DayOfMonth=2]="DayOfMonth",t[t.Time=3]="Time",t[t.TimeWithSeconds=4]="TimeWithSeconds"}(On||(On={}));const zn=t=>t.getUTCFullYear();function En(t,i,n){return i.replace(/yyyy/g,(t=>_t(zn(t),4))(t)).replace(/yy/g,(t=>_t(zn(t)%100,2))(t)).replace(/MMMM/g,((t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"long"}))(t,n)).replace(/MMM/g,((t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"short"}))(t,n)).replace(/MM/g,(t=>_t((t=>t.getUTCMonth()+1)(t),2))(t)).replace(/dd/g,(t=>_t((t=>t.getUTCDate())(t),2))(t))}class In{constructor(t="yyyy-MM-dd",i="default"){this.ud=t,this.dd=i}F_(t){return En(t,this.ud,this.dd)}}class Ln{constructor(t){this.fd=t||"%h:%m:%s"}F_(t){return this.fd.replace("%h",_t(t.getUTCHours(),2)).replace("%m",_t(t.getUTCMinutes(),2)).replace("%s",_t(t.getUTCSeconds(),2))}}const Nn={vd:"yyyy-MM-dd",pd:"%h:%m:%s",md:" ",bd:"default"};class Fn{constructor(t={}){const i=Object.assign(Object.assign({},Nn),t);this.wd=new In(i.vd,i.bd),this.gd=new Ln(i.pd),this.Md=i.md}F_(t){return`${this.wd.F_(t)}${this.Md}${this.gd.F_(t)}`}}function Wn(t){return 60*t*60*1e3}function jn(t){return 60*t*1e3}const Hn=[{xd:($n=1,1e3*$n),Sd:10},{xd:jn(1),Sd:20},{xd:jn(5),Sd:21},{xd:jn(30),Sd:22},{xd:Wn(1),Sd:30},{xd:Wn(3),Sd:31},{xd:Wn(6),Sd:32},{xd:Wn(12),Sd:33}];var $n;function Un(t,i){if(t.getUTCFullYear()!==i.getUTCFullYear())return 70;if(t.getUTCMonth()!==i.getUTCMonth())return 60;if(t.getUTCDate()!==i.getUTCDate())return 50;for(let n=Hn.length-1;n>=0;--n)if(Math.floor(i.getTime()/Hn[n].xd)!==Math.floor(t.getTime()/Hn[n].xd))return Hn[n].Sd;return 0}function qn(t){let i=t;if(R(t)&&(i=Xn(t)),!Vn(i))throw new Error("time must be of type BusinessDay");const n=new Date(Date.UTC(i.year,i.month-1,i.day,0,0,0,0));return{yd:Math.round(n.getTime()/1e3),kd:i}}function Yn(t){if(!Bn(t))throw new Error("time must be of type isUTCTimestamp");return{yd:t}}function Xn(t){const i=new Date(t);if(isNaN(i.getTime()))throw new Error(`Invalid date string=${t}, expected format=yyyy-mm-dd`);return{day:i.getUTCDate(),month:i.getUTCMonth()+1,year:i.getUTCFullYear()}}function Kn(t){R(t.time)&&(t.time=Xn(t.time))}class Zn{options(){return this.cn}setOptions(t){this.cn=t,this.updateFormatter(t.localization)}preprocessData(t){Array.isArray(t)?function(t){t.forEach(Kn)}(t):Kn(t)}createConverterToInternalObj(t){return f(function(t){return 0===t.length?null:Vn(t[0].time)||R(t[0].time)?qn:Yn}(t))}key(t){return"object"==typeof t&&"yd"in t?t.yd:this.key(this.convertHorzItemToInternal(t))}cacheKey(t){const i=t;return void 0===i.kd?new Date(1e3*i.yd).getTime():new Date(Date.UTC(i.kd.year,i.kd.month-1,i.kd.day)).getTime()}convertHorzItemToInternal(t){return Bn(i=t)?Yn(i):Vn(i)?qn(i):qn(Xn(i));var i}updateFormatter(t){if(!this.cn)return;const i=t.dateFormat;this.cn.timeScale.timeVisible?this.Cd=new Fn({vd:i,pd:this.cn.timeScale.secondsVisible?"%h:%m:%s":"%h:%m",md:" ",bd:t.locale}):this.Cd=new In(i,t.locale)}formatHorzItem(t){const i=t;return this.Cd.F_(new Date(1e3*i.yd))}formatTickmark(t,i){const n=function(t,i,n){switch(t){case 0:case 10:return i?n?4:3:2;case 20:case 21:case 22:case 30:case 31:case 32:case 33:return i?3:2;case 50:return 2;case 60:return 1;case 70:return 0}}(t.weight,this.cn.timeScale.timeVisible,this.cn.timeScale.secondsVisible),s=this.cn.timeScale;if(void 0!==s.tickMarkFormatter){const e=s.tickMarkFormatter(t.originalTime,n,i.locale);if(null!==e)return e}return function(t,i,n){const s={};switch(i){case 0:s.year="numeric";break;case 1:s.month="short";break;case 2:s.day="numeric";break;case 3:s.hour12=!1,s.hour="2-digit",s.minute="2-digit";break;case 4:s.hour12=!1,s.hour="2-digit",s.minute="2-digit",s.second="2-digit"}const e=void 0===t.kd?new Date(1e3*t.yd):new Date(Date.UTC(t.kd.year,t.kd.month-1,t.kd.day));return new Date(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()).toLocaleString(n,s)}(t.time,n,i.locale)}maxTickMarkWeight(t){let i=t.reduce(xn,t[0]).weight;return i>30&&i<50&&(i=30),i}fillWeightsForPoints(t,i){!function(t,i=0){if(0===t.length)return;let n=0===i?null:t[i-1].time.yd,s=null!==n?new Date(1e3*n):null,e=0;for(let r=i;r1){const i=Math.ceil(e/(t.length-1)),n=new Date(1e3*(t[0].time.yd-i));t[0].timeWeight=Un(new Date(1e3*t[0].time.yd),n)}}(t,i)}static Td(t){return C({localization:{dateFormat:"dd MMM 'yy"}},null!=t?t:{})}}function Gn(t){var i=t.width,n=t.height;if(i<0)throw new Error("Negative width is not allowed for Size");if(n<0)throw new Error("Negative height is not allowed for Size");return{width:i,height:n}}function Jn(t,i){return t.width===i.width&&t.height===i.height}var Qn=function(){function t(t){var i=this;this._resolutionListener=function(){return i._onResolutionChanged()},this._resolutionMediaQueryList=null,this._observers=[],this._window=t,this._installResolutionListener()}return t.prototype.dispose=function(){this._uninstallResolutionListener(),this._window=null},Object.defineProperty(t.prototype,"value",{get:function(){return this._window.devicePixelRatio},enumerable:!1,configurable:!0}),t.prototype.subscribe=function(t){var i=this,n={next:t};return this._observers.push(n),{unsubscribe:function(){i._observers=i._observers.filter((function(t){return t!==n}))}}},t.prototype._installResolutionListener=function(){if(null!==this._resolutionMediaQueryList)throw new Error("Resolution listener is already installed");var t=this._window.devicePixelRatio;this._resolutionMediaQueryList=this._window.matchMedia("all and (resolution: ".concat(t,"dppx)")),this._resolutionMediaQueryList.addListener(this._resolutionListener)},t.prototype._uninstallResolutionListener=function(){null!==this._resolutionMediaQueryList&&(this._resolutionMediaQueryList.removeListener(this._resolutionListener),this._resolutionMediaQueryList=null)},t.prototype._reinstallResolutionListener=function(){this._uninstallResolutionListener(),this._installResolutionListener()},t.prototype._onResolutionChanged=function(){var t=this;this._observers.forEach((function(i){return i.next(t._window.devicePixelRatio)})),this._reinstallResolutionListener()},t}();var ts=function(){function t(t,i,n){var s;this._canvasElement=null,this._bitmapSizeChangedListeners=[],this._suggestedBitmapSize=null,this._suggestedBitmapSizeChangedListeners=[],this._devicePixelRatioObservable=null,this._canvasElementResizeObserver=null,this._canvasElement=t,this._canvasElementClientSize=Gn({width:this._canvasElement.clientWidth,height:this._canvasElement.clientHeight}),this._transformBitmapSize=null!=i?i:function(t){return t},this._allowResizeObserver=null===(s=null==n?void 0:n.allowResizeObserver)||void 0===s||s,this._chooseAndInitObserver()}return t.prototype.dispose=function(){var t,i;if(null===this._canvasElement)throw new Error("Object is disposed");null===(t=this._canvasElementResizeObserver)||void 0===t||t.disconnect(),this._canvasElementResizeObserver=null,null===(i=this._devicePixelRatioObservable)||void 0===i||i.dispose(),this._devicePixelRatioObservable=null,this._suggestedBitmapSizeChangedListeners.length=0,this._bitmapSizeChangedListeners.length=0,this._canvasElement=null},Object.defineProperty(t.prototype,"canvasElement",{get:function(){if(null===this._canvasElement)throw new Error("Object is disposed");return this._canvasElement},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"canvasElementClientSize",{get:function(){return this._canvasElementClientSize},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"bitmapSize",{get:function(){return Gn({width:this.canvasElement.width,height:this.canvasElement.height})},enumerable:!1,configurable:!0}),t.prototype.resizeCanvasElement=function(t){this._canvasElementClientSize=Gn(t),this.canvasElement.style.width="".concat(this._canvasElementClientSize.width,"px"),this.canvasElement.style.height="".concat(this._canvasElementClientSize.height,"px"),this._invalidateBitmapSize()},t.prototype.subscribeBitmapSizeChanged=function(t){this._bitmapSizeChangedListeners.push(t)},t.prototype.unsubscribeBitmapSizeChanged=function(t){this._bitmapSizeChangedListeners=this._bitmapSizeChangedListeners.filter((function(i){return i!==t}))},Object.defineProperty(t.prototype,"suggestedBitmapSize",{get:function(){return this._suggestedBitmapSize},enumerable:!1,configurable:!0}),t.prototype.subscribeSuggestedBitmapSizeChanged=function(t){this._suggestedBitmapSizeChangedListeners.push(t)},t.prototype.unsubscribeSuggestedBitmapSizeChanged=function(t){this._suggestedBitmapSizeChangedListeners=this._suggestedBitmapSizeChangedListeners.filter((function(i){return i!==t}))},t.prototype.applySuggestedBitmapSize=function(){if(null!==this._suggestedBitmapSize){var t=this._suggestedBitmapSize;this._suggestedBitmapSize=null,this._resizeBitmap(t),this._emitSuggestedBitmapSizeChanged(t,this._suggestedBitmapSize)}},t.prototype._resizeBitmap=function(t){var i=this.bitmapSize;Jn(i,t)||(this.canvasElement.width=t.width,this.canvasElement.height=t.height,this._emitBitmapSizeChanged(i,t))},t.prototype._emitBitmapSizeChanged=function(t,i){var n=this;this._bitmapSizeChangedListeners.forEach((function(s){return s.call(n,t,i)}))},t.prototype._suggestNewBitmapSize=function(t){var i=this._suggestedBitmapSize,n=Gn(this._transformBitmapSize(t,this._canvasElementClientSize)),s=Jn(this.bitmapSize,n)?null:n;null===i&&null===s||null!==i&&null!==s&&Jn(i,s)||(this._suggestedBitmapSize=s,this._emitSuggestedBitmapSizeChanged(i,s))},t.prototype._emitSuggestedBitmapSizeChanged=function(t,i){var n=this;this._suggestedBitmapSizeChangedListeners.forEach((function(s){return s.call(n,t,i)}))},t.prototype._chooseAndInitObserver=function(){var t=this;this._allowResizeObserver?new Promise((function(t){var i=new ResizeObserver((function(n){t(n.every((function(t){return"devicePixelContentBoxSize"in t}))),i.disconnect()}));i.observe(document.body,{box:"device-pixel-content-box"})})).catch((function(){return!1})).then((function(i){return i?t._initResizeObserver():t._initDevicePixelRatioObservable()})):this._initDevicePixelRatioObservable()},t.prototype._initDevicePixelRatioObservable=function(){var t=this;if(null!==this._canvasElement){var i=is(this._canvasElement);if(null===i)throw new Error("No window is associated with the canvas");this._devicePixelRatioObservable=function(t){return new Qn(t)}(i),this._devicePixelRatioObservable.subscribe((function(){return t._invalidateBitmapSize()})),this._invalidateBitmapSize()}},t.prototype._invalidateBitmapSize=function(){var t,i;if(null!==this._canvasElement){var n=is(this._canvasElement);if(null!==n){var s=null!==(i=null===(t=this._devicePixelRatioObservable)||void 0===t?void 0:t.value)&&void 0!==i?i:n.devicePixelRatio,e=this._canvasElement.getClientRects(),r=void 0!==e[0]?function(t,i){return Gn({width:Math.round(t.left*i+t.width*i)-Math.round(t.left*i),height:Math.round(t.top*i+t.height*i)-Math.round(t.top*i)})}(e[0],s):Gn({width:this._canvasElementClientSize.width*s,height:this._canvasElementClientSize.height*s});this._suggestNewBitmapSize(r)}}},t.prototype._initResizeObserver=function(){var t=this;null!==this._canvasElement&&(this._canvasElementResizeObserver=new ResizeObserver((function(i){var n=i.find((function(i){return i.target===t._canvasElement}));if(n&&n.devicePixelContentBoxSize&&n.devicePixelContentBoxSize[0]){var s=n.devicePixelContentBoxSize[0],e=Gn({width:s.inlineSize,height:s.blockSize});t._suggestNewBitmapSize(e)}})),this._canvasElementResizeObserver.observe(this._canvasElement,{box:"device-pixel-content-box"}))},t}();function is(t){return t.ownerDocument.defaultView}var ns=function(){function t(t,i,n){if(0===i.width||0===i.height)throw new TypeError("Rendering target could only be created on a media with positive width and height");if(this._mediaSize=i,0===n.width||0===n.height)throw new TypeError("Rendering target could only be created using a bitmap with positive integer width and height");this._bitmapSize=n,this._context=t}return t.prototype.useMediaCoordinateSpace=function(t){try{return this._context.save(),this._context.setTransform(1,0,0,1,0,0),this._context.scale(this._horizontalPixelRatio,this._verticalPixelRatio),t({context:this._context,mediaSize:this._mediaSize})}finally{this._context.restore()}},t.prototype.useBitmapCoordinateSpace=function(t){try{return this._context.save(),this._context.setTransform(1,0,0,1,0,0),t({context:this._context,mediaSize:this._mediaSize,bitmapSize:this._bitmapSize,horizontalPixelRatio:this._horizontalPixelRatio,verticalPixelRatio:this._verticalPixelRatio})}finally{this._context.restore()}},Object.defineProperty(t.prototype,"_horizontalPixelRatio",{get:function(){return this._bitmapSize.width/this._mediaSize.width},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"_verticalPixelRatio",{get:function(){return this._bitmapSize.height/this._mediaSize.height},enumerable:!1,configurable:!0}),t}();function ss(t,i){var n=t.canvasElementClientSize;if(0===n.width||0===n.height)return null;var s=t.bitmapSize;if(0===s.width||0===s.height)return null;var e=t.canvasElement.getContext("2d",i);return null===e?null:new ns(e,n,s)}const es="undefined"!=typeof window;function rs(){return!!es&&window.navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function hs(){return!!es&&/iPhone|iPad|iPod/.test(window.navigator.platform)}function ls(t){return t+t%2}function as(t,i){return t.Pd-i.Pd}function os(t,i,n){const s=(t.Pd-i.Pd)/(t.ut-i.ut);return Math.sign(s)*Math.min(Math.abs(s),n)}class _s{constructor(t,i,n,s){this.Rd=null,this.Dd=null,this.Od=null,this.Ad=null,this.Vd=null,this.Bd=0,this.zd=0,this.Ed=t,this.Id=i,this.Ld=n,this.rs=s}Nd(t,i){if(null!==this.Rd){if(this.Rd.ut===i)return void(this.Rd.Pd=t);if(Math.abs(this.Rd.Pd-t)50)return;let n=0;const s=os(this.Rd,this.Dd,this.Id),e=as(this.Rd,this.Dd),r=[s],h=[e];if(n+=e,null!==this.Od){const t=os(this.Dd,this.Od,this.Id);if(Math.sign(t)===Math.sign(s)){const i=as(this.Dd,this.Od);if(r.push(t),h.push(i),n+=i,null!==this.Ad){const t=os(this.Od,this.Ad,this.Id);if(Math.sign(t)===Math.sign(s)){const i=as(this.Od,this.Ad);r.push(t),h.push(i),n+=i}}}}let l=0;for(let t=0;t({width:Math.max(t.width,i.width),height:Math.max(t.height,i.height)})});return s.resizeCanvasElement(i),s}function cs(t,i,n,s){t.G&&t.G(i,n,s)}function ds(t,i,n,s){t.K(i,n,s)}function fs(t,i,n,s){const e=t(n,s);for(const t of e){const n=t.xt();null!==n&&i(n)}}function vs(t){es&&void 0!==window.chrome&&t.addEventListener("mousedown",(t=>{if(1===t.button)return t.preventDefault(),!1}))}class ps{constructor(t,i,n){this.Wd=0,this.jd=null,this.Hd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY},this.$d=0,this.Ud=null,this.qd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY},this.Yd=null,this.Xd=!1,this.Kd=null,this.Zd=null,this.Gd=!1,this.Jd=!1,this.Qd=!1,this.tf=null,this.if=null,this.nf=null,this.sf=null,this.ef=null,this.rf=null,this.hf=null,this.lf=0,this.af=!1,this._f=!1,this.uf=!1,this.cf=0,this.df=null,this.ff=!hs(),this.vf=t=>{this.pf(t)},this.mf=t=>{if(this.bf(t)){const i=this.wf(t);if(++this.$d,this.Ud&&this.$d>1){const{gf:n}=this.Mf(ws(t),this.qd);n<30&&!this.Qd&&this.xf(i,this.yf.Sf),this.kf()}}else{const i=this.wf(t);if(++this.Wd,this.jd&&this.Wd>1){const{gf:n}=this.Mf(ws(t),this.Hd);n<5&&!this.Jd&&this.Cf(i,this.yf.Tf),this.Pf()}}},this.Rf=t,this.yf=i,this.cn=n,this.Df()}S(){null!==this.tf&&(this.tf(),this.tf=null),null!==this.if&&(this.if(),this.if=null),null!==this.sf&&(this.sf(),this.sf=null),null!==this.ef&&(this.ef(),this.ef=null),null!==this.rf&&(this.rf(),this.rf=null),null!==this.nf&&(this.nf(),this.nf=null),this.Of(),this.Pf()}Af(t){this.sf&&this.sf();const i=this.Vf.bind(this);if(this.sf=()=>{this.Rf.removeEventListener("mousemove",i)},this.Rf.addEventListener("mousemove",i),this.bf(t))return;const n=this.wf(t);this.Cf(n,this.yf.Bf),this.ff=!0}Pf(){null!==this.jd&&clearTimeout(this.jd),this.Wd=0,this.jd=null,this.Hd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY}}kf(){null!==this.Ud&&clearTimeout(this.Ud),this.$d=0,this.Ud=null,this.qd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY}}Vf(t){if(this.uf||null!==this.Zd)return;if(this.bf(t))return;const i=this.wf(t);this.Cf(i,this.yf.zf),this.ff=!0}Ef(t){const i=Ms(t.changedTouches,f(this.df));if(null===i)return;if(this.cf=gs(t),null!==this.hf)return;if(this._f)return;this.af=!0;const n=this.Mf(ws(i),f(this.Zd)),{If:s,Lf:e,gf:r}=n;if(this.Gd||!(r<5)){if(!this.Gd){const t=.5*s,i=e>=t&&!this.cn.Nf(),n=t>e&&!this.cn.Ff();i||n||(this._f=!0),this.Gd=!0,this.Qd=!0,this.Of(),this.kf()}if(!this._f){const n=this.wf(t,i);this.xf(n,this.yf.Wf),bs(t)}}}jf(t){if(0!==t.button)return;const i=this.Mf(ws(t),f(this.Kd)),{gf:n}=i;if(n>=5&&(this.Jd=!0,this.Pf()),this.Jd){const i=this.wf(t);this.Cf(i,this.yf.Hf)}}Mf(t,i){const n=Math.abs(i.et-t.et),s=Math.abs(i.rt-t.rt);return{If:n,Lf:s,gf:n+s}}$f(t){let i=Ms(t.changedTouches,f(this.df));if(null===i&&0===t.touches.length&&(i=t.changedTouches[0]),null===i)return;this.df=null,this.cf=gs(t),this.Of(),this.Zd=null,this.rf&&(this.rf(),this.rf=null);const n=this.wf(t,i);if(this.xf(n,this.yf.Uf),++this.$d,this.Ud&&this.$d>1){const{gf:t}=this.Mf(ws(i),this.qd);t<30&&!this.Qd&&this.xf(n,this.yf.Sf),this.kf()}else this.Qd||(this.xf(n,this.yf.qf),this.yf.qf&&bs(t));0===this.$d&&bs(t),0===t.touches.length&&this.Xd&&(this.Xd=!1,bs(t))}pf(t){if(0!==t.button)return;const i=this.wf(t);if(this.Kd=null,this.uf=!1,this.ef&&(this.ef(),this.ef=null),rs()){this.Rf.ownerDocument.documentElement.removeEventListener("mouseleave",this.vf)}if(!this.bf(t))if(this.Cf(i,this.yf.Yf),++this.Wd,this.jd&&this.Wd>1){const{gf:n}=this.Mf(ws(t),this.Hd);n<5&&!this.Jd&&this.Cf(i,this.yf.Tf),this.Pf()}else this.Jd||this.Cf(i,this.yf.Xf)}Of(){null!==this.Yd&&(clearTimeout(this.Yd),this.Yd=null)}Kf(t){if(null!==this.df)return;const i=t.changedTouches[0];this.df=i.identifier,this.cf=gs(t);const n=this.Rf.ownerDocument.documentElement;this.Qd=!1,this.Gd=!1,this._f=!1,this.Zd=ws(i),this.rf&&(this.rf(),this.rf=null);{const i=this.Ef.bind(this),s=this.$f.bind(this);this.rf=()=>{n.removeEventListener("touchmove",i),n.removeEventListener("touchend",s)},n.addEventListener("touchmove",i,{passive:!1}),n.addEventListener("touchend",s,{passive:!1}),this.Of(),this.Yd=setTimeout(this.Zf.bind(this,t),240)}const s=this.wf(t,i);this.xf(s,this.yf.Gf),this.Ud||(this.$d=0,this.Ud=setTimeout(this.kf.bind(this),500),this.qd=ws(i))}Jf(t){if(0!==t.button)return;const i=this.Rf.ownerDocument.documentElement;rs()&&i.addEventListener("mouseleave",this.vf),this.Jd=!1,this.Kd=ws(t),this.ef&&(this.ef(),this.ef=null);{const t=this.jf.bind(this),n=this.pf.bind(this);this.ef=()=>{i.removeEventListener("mousemove",t),i.removeEventListener("mouseup",n)},i.addEventListener("mousemove",t),i.addEventListener("mouseup",n)}if(this.uf=!0,this.bf(t))return;const n=this.wf(t);this.Cf(n,this.yf.Qf),this.jd||(this.Wd=0,this.jd=setTimeout(this.Pf.bind(this),500),this.Hd=ws(t))}Df(){this.Rf.addEventListener("mouseenter",this.Af.bind(this)),this.Rf.addEventListener("touchcancel",this.Of.bind(this));{const t=this.Rf.ownerDocument,i=t=>{this.yf.tv&&(t.composed&&this.Rf.contains(t.composedPath()[0])||t.target&&this.Rf.contains(t.target)||this.yf.tv())};this.if=()=>{t.removeEventListener("touchstart",i)},this.tf=()=>{t.removeEventListener("mousedown",i)},t.addEventListener("mousedown",i),t.addEventListener("touchstart",i,{passive:!0})}hs()&&(this.nf=()=>{this.Rf.removeEventListener("dblclick",this.mf)},this.Rf.addEventListener("dblclick",this.mf)),this.Rf.addEventListener("mouseleave",this.iv.bind(this)),this.Rf.addEventListener("touchstart",this.Kf.bind(this),{passive:!0}),vs(this.Rf),this.Rf.addEventListener("mousedown",this.Jf.bind(this)),this.nv(),this.Rf.addEventListener("touchmove",(()=>{}),{passive:!1})}nv(){void 0===this.yf.sv&&void 0===this.yf.ev&&void 0===this.yf.rv||(this.Rf.addEventListener("touchstart",(t=>this.hv(t.touches)),{passive:!0}),this.Rf.addEventListener("touchmove",(t=>{if(2===t.touches.length&&null!==this.hf&&void 0!==this.yf.ev){const i=ms(t.touches[0],t.touches[1])/this.lf;this.yf.ev(this.hf,i),bs(t)}}),{passive:!1}),this.Rf.addEventListener("touchend",(t=>{this.hv(t.touches)})))}hv(t){1===t.length&&(this.af=!1),2!==t.length||this.af||this.Xd?this.lv():this.av(t)}av(t){const i=this.Rf.getBoundingClientRect()||{left:0,top:0};this.hf={et:(t[0].clientX-i.left+(t[1].clientX-i.left))/2,rt:(t[0].clientY-i.top+(t[1].clientY-i.top))/2},this.lf=ms(t[0],t[1]),void 0!==this.yf.sv&&this.yf.sv(),this.Of()}lv(){null!==this.hf&&(this.hf=null,void 0!==this.yf.rv&&this.yf.rv())}iv(t){if(this.sf&&this.sf(),this.bf(t))return;if(!this.ff)return;const i=this.wf(t);this.Cf(i,this.yf.ov),this.ff=!hs()}Zf(t){const i=Ms(t.touches,f(this.df));if(null===i)return;const n=this.wf(t,i);this.xf(n,this.yf._v),this.Qd=!0,this.Xd=!0}bf(t){return t.sourceCapabilities&&void 0!==t.sourceCapabilities.firesTouchEvents?t.sourceCapabilities.firesTouchEvents:gs(t){"touchstart"!==t.type&&bs(t)}}}}function ms(t,i){const n=t.clientX-i.clientX,s=t.clientY-i.clientY;return Math.sqrt(n*n+s*s)}function bs(t){t.cancelable&&t.preventDefault()}function ws(t){return{et:t.pageX,rt:t.pageY}}function gs(t){return t.timeStamp||performance.now()}function Ms(t,i){for(let n=0;n{var s,e,r,h;return(null!==(e=null===(s=n.At())||void 0===s?void 0:s.xa())&&void 0!==e?e:"")!==i?[]:null!==(h=null===(r=n.la)||void 0===r?void 0:r.call(n,t))&&void 0!==h?h:[]}}class ks{constructor(t,i,n,s){this.Li=null,this.wv=null,this.gv=!1,this.Mv=new Qt(200),this.Gr=null,this.xv=0,this.Sv=!1,this.yv=()=>{this.Sv||this.nn.kv().qt().Fh()},this.Cv=()=>{this.Sv||this.nn.kv().qt().Fh()},this.nn=t,this.cn=i,this.mo=i.layout,this.yc=n,this.Tv="left"===s,this.Pv=ys("normal",s),this.Rv=ys("top",s),this.Dv=ys("bottom",s),this.Ov=document.createElement("div"),this.Ov.style.height="100%",this.Ov.style.overflow="hidden",this.Ov.style.width="25px",this.Ov.style.left="0",this.Ov.style.position="relative",this.Av=us(this.Ov,Gn({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.yv);const e=this.Av.canvasElement;e.style.position="absolute",e.style.zIndex="1",e.style.left="0",e.style.top="0",this.Vv=us(this.Ov,Gn({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.Cv);const r=this.Vv.canvasElement;r.style.position="absolute",r.style.zIndex="2",r.style.left="0",r.style.top="0";const h={Qf:this.Bv.bind(this),Gf:this.Bv.bind(this),Hf:this.zv.bind(this),Wf:this.zv.bind(this),tv:this.Ev.bind(this),Yf:this.Iv.bind(this),Uf:this.Iv.bind(this),Tf:this.Lv.bind(this),Sf:this.Lv.bind(this),Bf:this.Nv.bind(this),ov:this.Fv.bind(this)};this.Wv=new ps(this.Vv.canvasElement,h,{Nf:()=>!this.cn.handleScroll.vertTouchDrag,Ff:()=>!0})}S(){this.Wv.S(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Vv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.yv),this.Av.dispose(),null!==this.Li&&this.Li.$o().p(this),this.Li=null}jv(){return this.Ov}P(){return this.mo.fontSize}Hv(){const t=this.yc.W();return this.Gr!==t.R&&(this.Mv.ir(),this.Gr=t.R),t}$v(){if(null===this.Li)return 0;let t=0;const i=this.Hv(),n=f(this.Av.canvasElement.getContext("2d"));n.save();const s=this.Li.Ia();n.font=this.Uv(),s.length>0&&(t=Math.max(this.Mv.Si(n,s[0].Za),this.Mv.Si(n,s[s.length-1].Za)));const e=this.qv();for(let i=e.length;i--;){const s=this.Mv.Si(n,e[i].Jt());s>t&&(t=s)}const r=this.Li.Pt();if(null!==r&&null!==this.wv){const i=this.Li.pn(1,r),s=this.Li.pn(this.wv.height-2,r);t=Math.max(t,this.Mv.Si(n,this.Li.Wi(Math.floor(Math.min(i,s))+.11111111111111,r)),this.Mv.Si(n,this.Li.Wi(Math.ceil(Math.max(i,s))-.11111111111111,r)))}n.restore();const h=t||34;return ls(Math.ceil(i.C+i.T+i.B+i.I+5+h))}Yv(t){null!==this.wv&&Jn(this.wv,t)||(this.wv=t,this.Sv=!0,this.Av.resizeCanvasElement(t),this.Vv.resizeCanvasElement(t),this.Sv=!1,this.Ov.style.width=`${t.width}px`,this.Ov.style.height=`${t.height}px`)}Xv(){return f(this.wv).width}Ji(t){this.Li!==t&&(null!==this.Li&&this.Li.$o().p(this),this.Li=t,t.$o().l(this.ao.bind(this),this))}At(){return this.Li}ir(){const t=this.nn.Kv();this.nn.kv().qt().A_(t,f(this.At()))}Zv(t){if(null===this.wv)return;if(1!==t){this.Gv(),this.Av.applySuggestedBitmapSize();const t=ss(this.Av);null!==t&&(t.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Be(t)})),this.nn.Qv(t,this.Dv),this.tp(t),this.nn.Qv(t,this.Pv),this.ip(t))}this.Vv.applySuggestedBitmapSize();const i=ss(this.Vv);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.np(i),this.nn.Qv(i,this.Rv))}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}gt(){var t;null===(t=this.Li)||void 0===t||t.Ia()}Bv(t){if(null===this.Li||this.Li.Fi()||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.kv().qt(),n=this.nn.Kv();this.gv=!0,i.k_(n,this.Li,t.localY)}zv(t){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.kv().qt(),n=this.nn.Kv(),s=this.Li;i.C_(n,s,t.localY)}Ev(){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const t=this.nn.kv().qt(),i=this.nn.Kv(),n=this.Li;this.gv&&(this.gv=!1,t.T_(i,n))}Iv(t){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.kv().qt(),n=this.nn.Kv();this.gv=!1,i.T_(n,this.Li)}Lv(t){this.cn.handleScale.axisDoubleClickReset.price&&this.ir()}Nv(t){if(null===this.Li)return;!this.nn.kv().qt().W().handleScale.axisPressedMouseMove.price||this.Li.ph()||this.Li.Co()||this.rp(1)}Fv(t){this.rp(0)}qv(){const t=[],i=null===this.Li?void 0:this.Li;return(n=>{for(let s=0;s{t.fillStyle=n.borderColor;const l=Math.max(1,Math.floor(h)),a=Math.floor(.5*h),o=Math.round(s.T*r);t.beginPath();for(const n of i)t.rect(Math.floor(e*r),Math.round(n.Aa*h)-a,o,l);t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{var r;t.font=this.Uv(),t.fillStyle=null!==(r=n.textColor)&&void 0!==r?r:this.mo.textColor,t.textAlign=this.Tv?"right":"left",t.textBaseline="middle";const h=this.Tv?Math.round(e-s.B):Math.round(e+s.T+s.B),l=i.map((i=>this.Mv.xi(t,i.Za)));for(let n=i.length;n--;){const s=i[n];t.fillText(s.Za,h,s.Aa+l[n])}}))}Gv(){if(null===this.wv||null===this.Li)return;let t=this.wv.height/2;const i=[],n=this.Li.No().slice(),s=this.nn.Kv(),e=this.Hv();this.Li===s.vr()&&this.nn.Kv().No().forEach((t=>{s.dr(t)&&n.push(t)}));const r=this.Li.Ta()[0],h=this.Li;n.forEach((n=>{const e=n.Rn(s,h);e.forEach((t=>{t.Vi(null),t.Bi()&&i.push(t)})),r===n&&e.length>0&&(t=e[0].ki())})),i.forEach((t=>t.Vi(t.ki())));this.Li.W().alignLabels&&this.hp(i,e,t)}hp(t,i,n){if(null===this.wv)return;const s=t.filter((t=>t.ki()<=n)),e=t.filter((t=>t.ki()>n));s.sort(((t,i)=>i.ki()-t.ki())),s.length&&e.length&&e.push(s[0]),e.sort(((t,i)=>t.ki()-i.ki()));for(const n of t){const t=Math.floor(n.Et(i)/2),s=n.ki();s>-t&&sthis.wv.height-t&&sl-r&&n.Vi(l-r)}for(let t=1;t{if(i.zi()){i.xt(f(this.Li)).K(t,n,this.Mv,s)}}))}np(t){if(null===this.wv||null===this.Li)return;const i=this.nn.kv().qt(),n=[],s=this.nn.Kv(),e=i.Fc().Rn(s,this.Li);e.length&&n.push(e);const r=this.Hv(),h=this.Tv?"right":"left";n.forEach((i=>{i.forEach((i=>{i.xt(f(this.Li)).K(t,r,this.Mv,h)}))}))}rp(t){this.Ov.style.cursor=1===t?"ns-resize":"default"}ao(){const t=this.$v();this.xv{this.Sv||null===this.wp||this.Ui().Fh()},this.Cv=()=>{this.Sv||null===this.wp||this.Ui().Fh()},this.gp=t,this.wp=i,this.wp.z_().l(this.Mp.bind(this),this,!0),this.xp=document.createElement("td"),this.xp.style.padding="0",this.xp.style.position="relative";const n=document.createElement("div");n.style.width="100%",n.style.height="100%",n.style.position="relative",n.style.overflow="hidden",this.Sp=document.createElement("td"),this.Sp.style.padding="0",this.yp=document.createElement("td"),this.yp.style.padding="0",this.xp.appendChild(n),this.Av=us(n,Gn({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.yv);const s=this.Av.canvasElement;s.style.position="absolute",s.style.zIndex="1",s.style.left="0",s.style.top="0",this.Vv=us(n,Gn({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.Cv);const e=this.Vv.canvasElement;e.style.position="absolute",e.style.zIndex="2",e.style.left="0",e.style.top="0",this.kp=document.createElement("tr"),this.kp.appendChild(this.Sp),this.kp.appendChild(this.xp),this.kp.appendChild(this.yp),this.Cp(),this.Wv=new ps(this.Vv.canvasElement,this,{Nf:()=>null===this.vp&&!this.gp.W().handleScroll.vertTouchDrag,Ff:()=>null===this.vp&&!this.gp.W().handleScroll.horzTouchDrag})}S(){null!==this.lp&&this.lp.S(),null!==this.ap&&this.ap.S(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Vv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.yv),this.Av.dispose(),null!==this.wp&&this.wp.z_().p(this),this.Wv.S()}Kv(){return f(this.wp)}Tp(t){null!==this.wp&&this.wp.z_().p(this),this.wp=t,null!==this.wp&&this.wp.z_().l(Ds.prototype.Mp.bind(this),this,!0),this.Cp()}kv(){return this.gp}jv(){return this.kp}Cp(){if(null!==this.wp&&(this.Pp(),0!==this.Ui().Mt().length)){if(null!==this.lp){const t=this.wp.S_();this.lp.Ji(f(t))}if(null!==this.ap){const t=this.wp.y_();this.ap.Ji(f(t))}}}Rp(){null!==this.lp&&this.lp.gt(),null!==this.ap&&this.ap.gt()}v_(){return null!==this.wp?this.wp.v_():0}p_(t){this.wp&&this.wp.p_(t)}Bf(t){if(!this.wp)return;this.Dp();const i=t.localX,n=t.localY;this.Op(i,n,t)}Qf(t){this.Dp(),this.Ap(),this.Op(t.localX,t.localY,t)}zf(t){var i;if(!this.wp)return;this.Dp();const n=t.localX,s=t.localY;this.Op(n,s,t);const e=this.br(n,s);this.gp.Vp(null!==(i=null==e?void 0:e.bv)&&void 0!==i?i:null),this.Ui().Bc(e&&{zc:e.zc,pv:e.pv})}Xf(t){null!==this.wp&&(this.Dp(),this.Bp(t))}Tf(t){null!==this.wp&&this.zp(this.cp,t)}Sf(t){this.Tf(t)}Hf(t){this.Dp(),this.Ep(t),this.Op(t.localX,t.localY,t)}Yf(t){null!==this.wp&&(this.Dp(),this.fp=!1,this.Ip(t))}qf(t){null!==this.wp&&this.Bp(t)}_v(t){if(this.fp=!0,null===this.vp){const i={x:t.localX,y:t.localY};this.Lp(i,i,t)}}ov(t){null!==this.wp&&(this.Dp(),this.wp.qt().Bc(null),this.Np())}Fp(){return this.up}Wp(){return this.cp}sv(){this.dp=1,this.Ui().Un()}ev(t,i){if(!this.gp.W().handleScale.pinch)return;const n=5*(i-this.dp);this.dp=i,this.Ui().Uc(t.et,n)}Gf(t){this.fp=!1,this.pp=null!==this.vp,this.Ap();const i=this.Ui().Fc();null!==this.vp&&i.Tt()&&(this.mp={x:i.Kt(),y:i.Zt()},this.vp={x:t.localX,y:t.localY})}Wf(t){if(null===this.wp)return;const i=t.localX,n=t.localY;if(null===this.vp)this.Ep(t);else{this.pp=!1;const s=f(this.mp),e=s.x+(i-this.vp.x),r=s.y+(n-this.vp.y);this.Op(e,r,t)}}Uf(t){0===this.kv().W().trackingMode.exitMode&&(this.pp=!0),this.jp(),this.Ip(t)}br(t,i){const n=this.wp;return null===n?null:function(t,i,n){const s=t.No(),e=function(t,i,n){var s,e;let r,h;for(const o of t){const t=null!==(e=null===(s=o.oa)||void 0===s?void 0:s.call(o,i,n))&&void 0!==e?e:[];for(const i of t)l=i.zOrder,(!(a=null==r?void 0:r.zOrder)||"top"===l&&"top"!==a||"normal"===l&&"bottom"===a)&&(r=i,h=o)}var l,a;return r&&h?{mv:r,zc:h}:null}(s,i,n);if("top"===(null==e?void 0:e.mv.zOrder))return xs(e);for(const r of s){if(e&&e.zc===r&&"bottom"!==e.mv.zOrder&&!e.mv.isBackground)return xs(e);const s=Ss(r.Pn(t),i,n);if(null!==s)return{zc:r,fv:s.fv,pv:s.pv};if(e&&e.zc===r&&"bottom"!==e.mv.zOrder&&e.mv.isBackground)return xs(e)}return(null==e?void 0:e.mv)?xs(e):null}(n,t,i)}Hp(t,i){f("left"===i?this.lp:this.ap).Yv(Gn({width:t,height:this.wv.height}))}$p(){return this.wv}Yv(t){Jn(this.wv,t)||(this.wv=t,this.Sv=!0,this.Av.resizeCanvasElement(t),this.Vv.resizeCanvasElement(t),this.Sv=!1,this.xp.style.width=t.width+"px",this.xp.style.height=t.height+"px")}Up(){const t=f(this.wp);t.x_(t.S_()),t.x_(t.y_());for(const i of t.Ta())if(t.dr(i)){const n=i.At();null!==n&&t.x_(n),i.On()}}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Zv(t){if(0===t)return;if(null===this.wp)return;if(t>1&&this.Up(),null!==this.lp&&this.lp.Zv(t),null!==this.ap&&this.ap.Zv(t),1!==t){this.Av.applySuggestedBitmapSize();const t=ss(this.Av);null!==t&&(t.useBitmapCoordinateSpace((t=>{this.Jv(t)})),this.wp&&(this.qp(t,Cs),this.Yp(t),this.Xp(t),this.qp(t,Ts),this.qp(t,Ps)))}this.Vv.applySuggestedBitmapSize();const i=ss(this.Vv);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.Kp(i),this.qp(i,Rs))}Zp(){return this.lp}Gp(){return this.ap}Qv(t,i){this.qp(t,i)}Mp(){null!==this.wp&&this.wp.z_().p(this),this.wp=null}Bp(t){this.zp(this.up,t)}zp(t,i){const n=i.localX,s=i.localY;t.M()&&t.m(this.Ui().kt().Vu(n),{x:n,y:s},i)}Jv({context:t,bitmapSize:i}){const{width:n,height:s}=i,e=this.Ui(),r=e.q(),h=e.od();r===h?Y(t,0,0,n,s,h):G(t,0,0,n,s,r,h)}Yp(t){const i=f(this.wp).E_().Wh().xt();null!==i&&i.K(t,!1)}Xp(t){const i=this.Ui().Nc();this.Jp(t,Ts,cs,i),this.Jp(t,Ts,ds,i)}Kp(t){this.Jp(t,Ts,ds,this.Ui().Fc())}qp(t,i){const n=f(this.wp).No();for(const s of n)this.Jp(t,i,cs,s);for(const s of n)this.Jp(t,i,ds,s)}Jp(t,i,n,s){const e=f(this.wp),r=e.qt().Vc(),h=null!==r&&r.zc===s,l=null!==r&&h&&void 0!==r.pv?r.pv.gr:void 0;fs(i,(i=>n(i,t,h,l)),s,e)}Pp(){if(null===this.wp)return;const t=this.gp,i=this.wp.S_().W().visible,n=this.wp.y_().W().visible;i||null===this.lp||(this.Sp.removeChild(this.lp.jv()),this.lp.S(),this.lp=null),n||null===this.ap||(this.yp.removeChild(this.ap.jv()),this.ap.S(),this.ap=null);const s=t.qt().sd();i&&null===this.lp&&(this.lp=new ks(this,t.W(),s,"left"),this.Sp.appendChild(this.lp.jv())),n&&null===this.ap&&(this.ap=new ks(this,t.W(),s,"right"),this.yp.appendChild(this.ap.jv()))}Qp(t){return t.uv&&this.fp||null!==this.vp}tm(t){return Math.max(0,Math.min(t,this.wv.width-1))}im(t){return Math.max(0,Math.min(t,this.wv.height-1))}Op(t,i,n){this.Ui().Jc(this.tm(t),this.im(i),n,f(this.wp))}Np(){this.Ui().td()}jp(){this.pp&&(this.vp=null,this.Np())}Lp(t,i,n){this.vp=t,this.pp=!1,this.Op(i.x,i.y,n);const s=this.Ui().Fc();this.mp={x:s.Kt(),y:s.Zt()}}Ui(){return this.gp.qt()}Ip(t){if(!this._p)return;const i=this.Ui(),n=this.Kv();if(i.D_(n,n.vn()),this.op=null,this._p=!1,i.Kc(),null!==this.bp){const t=performance.now(),n=i.kt();this.bp.Dr(n.Iu(),t),this.bp.Yu(t)||i.Xn(this.bp)}}Dp(){this.vp=null}Ap(){if(!this.wp)return;if(this.Ui().Un(),document.activeElement!==document.body&&document.activeElement!==document.documentElement)f(document.activeElement).blur();else{const t=document.getSelection();null!==t&&t.removeAllRanges()}!this.wp.vn().Fi()&&this.Ui().kt().Fi()}Ep(t){if(null===this.wp)return;const i=this.Ui(),n=i.kt();if(n.Fi())return;const s=this.gp.W(),e=s.handleScroll,r=s.kineticScroll;if((!e.pressedMouseMove||t.uv)&&(!e.horzTouchDrag&&!e.vertTouchDrag||!t.uv))return;const h=this.wp.vn(),l=performance.now();if(null!==this.op||this.Qp(t)||(this.op={x:t.clientX,y:t.clientY,yd:l,nm:t.localX,sm:t.localY}),null!==this.op&&!this._p&&(this.op.x!==t.clientX||this.op.y!==t.clientY)){if(t.uv&&r.touch||!t.uv&&r.mouse){const t=n.he();this.bp=new _s(.2/t,7/t,.997,15/t),this.bp.Nd(n.Iu(),this.op.yd)}else this.bp=null;h.Fi()||i.P_(this.wp,h,t.localY),i.Yc(t.localX),this._p=!0}this._p&&(h.Fi()||i.R_(this.wp,h,t.localY),i.Xc(t.localX),null!==this.bp&&this.bp.Nd(n.Iu(),l))}}class Os{constructor(t,i,n,s,e){this.bt=!0,this.wv=Gn({width:0,height:0}),this.yv=()=>this.Zv(3),this.Tv="left"===t,this.yc=n.sd,this.cn=i,this.rm=s,this.hm=e,this.Ov=document.createElement("div"),this.Ov.style.width="25px",this.Ov.style.height="100%",this.Ov.style.overflow="hidden",this.Av=us(this.Ov,Gn({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.yv)}S(){this.Av.unsubscribeSuggestedBitmapSizeChanged(this.yv),this.Av.dispose()}jv(){return this.Ov}$p(){return this.wv}Yv(t){Jn(this.wv,t)||(this.wv=t,this.Av.resizeCanvasElement(t),this.Ov.style.width=`${t.width}px`,this.Ov.style.height=`${t.height}px`,this.bt=!0)}Zv(t){if(t<3&&!this.bt)return;if(0===this.wv.width||0===this.wv.height)return;this.bt=!1,this.Av.applySuggestedBitmapSize();const i=ss(this.Av);null!==i&&i.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Be(t)}))}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Be({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(!this.rm())return;t.fillStyle=this.cn.timeScale.borderColor;const e=Math.floor(this.yc.W().C*n),r=Math.floor(this.yc.W().C*s),h=this.Tv?i.width-e:0;t.fillRect(h,0,e,r)}Jv({context:t,bitmapSize:i}){Y(t,0,0,i.width,i.height,this.hm())}}function As(t){return i=>{var n,s;return null!==(s=null===(n=i.aa)||void 0===n?void 0:n.call(i,t))&&void 0!==s?s:[]}}const Vs=As("normal"),Bs=As("top"),zs=As("bottom");class Es{constructor(t,i){this.lm=null,this.am=null,this.k=null,this.om=!1,this.wv=Gn({width:0,height:0}),this._m=new k,this.Mv=new Qt(5),this.Sv=!1,this.yv=()=>{this.Sv||this.gp.qt().Fh()},this.Cv=()=>{this.Sv||this.gp.qt().Fh()},this.gp=t,this.N_=i,this.cn=t.W().layout,this.um=document.createElement("tr"),this.dm=document.createElement("td"),this.dm.style.padding="0",this.fm=document.createElement("td"),this.fm.style.padding="0",this.Ov=document.createElement("td"),this.Ov.style.height="25px",this.Ov.style.padding="0",this.vm=document.createElement("div"),this.vm.style.width="100%",this.vm.style.height="100%",this.vm.style.position="relative",this.vm.style.overflow="hidden",this.Ov.appendChild(this.vm),this.Av=us(this.vm,Gn({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.yv);const n=this.Av.canvasElement;n.style.position="absolute",n.style.zIndex="1",n.style.left="0",n.style.top="0",this.Vv=us(this.vm,Gn({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.Cv);const s=this.Vv.canvasElement;s.style.position="absolute",s.style.zIndex="2",s.style.left="0",s.style.top="0",this.um.appendChild(this.dm),this.um.appendChild(this.Ov),this.um.appendChild(this.fm),this.pm(),this.gp.qt().f_().l(this.pm.bind(this),this),this.Wv=new ps(this.Vv.canvasElement,this,{Nf:()=>!0,Ff:()=>!this.gp.W().handleScroll.horzTouchDrag})}S(){this.Wv.S(),null!==this.lm&&this.lm.S(),null!==this.am&&this.am.S(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Vv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.yv),this.Av.dispose()}jv(){return this.um}bm(){return this.lm}wm(){return this.am}Qf(t){if(this.om)return;this.om=!0;const i=this.gp.qt();!i.kt().Fi()&&this.gp.W().handleScale.axisPressedMouseMove.time&&i.$c(t.localX)}Gf(t){this.Qf(t)}tv(){const t=this.gp.qt();!t.kt().Fi()&&this.om&&(this.om=!1,this.gp.W().handleScale.axisPressedMouseMove.time&&t.Gc())}Hf(t){const i=this.gp.qt();!i.kt().Fi()&&this.gp.W().handleScale.axisPressedMouseMove.time&&i.Zc(t.localX)}Wf(t){this.Hf(t)}Yf(){this.om=!1;const t=this.gp.qt();t.kt().Fi()&&!this.gp.W().handleScale.axisPressedMouseMove.time||t.Gc()}Uf(){this.Yf()}Tf(){this.gp.W().handleScale.axisDoubleClickReset.time&&this.gp.qt().Zn()}Sf(){this.Tf()}Bf(){this.gp.qt().W().handleScale.axisPressedMouseMove.time&&this.rp(1)}ov(){this.rp(0)}$p(){return this.wv}gm(){return this._m}Mm(t,i,n){Jn(this.wv,t)||(this.wv=t,this.Sv=!0,this.Av.resizeCanvasElement(t),this.Vv.resizeCanvasElement(t),this.Sv=!1,this.Ov.style.width=`${t.width}px`,this.Ov.style.height=`${t.height}px`,this._m.m(t)),null!==this.lm&&this.lm.Yv(Gn({width:i,height:t.height})),null!==this.am&&this.am.Yv(Gn({width:n,height:t.height}))}xm(){const t=this.Sm();return Math.ceil(t.C+t.T+t.P+t.L+t.V+t.ym)}gt(){this.gp.qt().kt().Ia()}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Zv(t){if(0===t)return;if(1!==t){this.Av.applySuggestedBitmapSize();const i=ss(this.Av);null!==i&&(i.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Be(t),this.km(i,zs)})),this.tp(i),this.km(i,Vs)),null!==this.lm&&this.lm.Zv(t),null!==this.am&&this.am.Zv(t)}this.Vv.applySuggestedBitmapSize();const i=ss(this.Vv);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.Cm([...this.gp.qt().Mt(),this.gp.qt().Fc()],i),this.km(i,Bs))}km(t,i){const n=this.gp.qt().Mt();for(const s of n)fs(i,(i=>cs(i,t,!1,void 0)),s,void 0);for(const s of n)fs(i,(i=>ds(i,t,!1,void 0)),s,void 0)}Jv({context:t,bitmapSize:i}){Y(t,0,0,i.width,i.height,this.gp.qt().od())}Be({context:t,bitmapSize:i,verticalPixelRatio:n}){if(this.gp.W().timeScale.borderVisible){t.fillStyle=this.Tm();const s=Math.max(1,Math.floor(this.Sm().C*n));t.fillRect(0,0,i.width,s)}}tp(t){const i=this.gp.qt().kt(),n=i.Ia();if(!n||0===n.length)return;const s=this.N_.maxTickMarkWeight(n),e=this.Sm(),r=i.W();r.borderVisible&&r.ticksVisible&&t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:i,verticalPixelRatio:s})=>{t.strokeStyle=this.Tm(),t.fillStyle=this.Tm();const r=Math.max(1,Math.floor(i)),h=Math.floor(.5*i);t.beginPath();const l=Math.round(e.T*s);for(let s=n.length;s--;){const e=Math.round(n[s].coord*i);t.rect(e-h,0,r,l)}t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{const i=e.C+e.T+e.L+e.P/2;t.textAlign="center",t.textBaseline="middle",t.fillStyle=this.$(),t.font=this.Uv();for(const e of n)if(e.weight=s){const n=e.needAlignCoordinate?this.Pm(t,e.coord,e.label):e.coord;t.fillText(e.label,n,i)}}))}Pm(t,i,n){const s=this.Mv.Si(t,n),e=s/2,r=Math.floor(i-e)+.5;return r<0?i+=Math.abs(0-r):r+s>this.wv.width&&(i-=Math.abs(this.wv.width-(r+s))),i}Cm(t,i){const n=this.Sm();for(const s of t)for(const t of s.tn())t.xt().K(i,n)}Tm(){return this.gp.W().timeScale.borderColor}$(){return this.cn.textColor}j(){return this.cn.fontSize}Uv(){return z(this.j(),this.cn.fontFamily)}Rm(){return z(this.j(),this.cn.fontFamily,"bold")}Sm(){null===this.k&&(this.k={C:1,N:NaN,L:NaN,V:NaN,Hi:NaN,T:5,P:NaN,R:"",ji:new Qt,ym:0});const t=this.k,i=this.Uv();if(t.R!==i){const n=this.j();t.P=n,t.R=i,t.L=3*n/12,t.V=3*n/12,t.Hi=9*n/12,t.N=0,t.ym=4*n/12,t.ji.ir()}return this.k}rp(t){this.Ov.style.cursor=1===t?"ew-resize":"default"}pm(){const t=this.gp.qt(),i=t.W();i.leftPriceScale.visible||null===this.lm||(this.dm.removeChild(this.lm.jv()),this.lm.S(),this.lm=null),i.rightPriceScale.visible||null===this.am||(this.fm.removeChild(this.am.jv()),this.am.S(),this.am=null);const n={sd:this.gp.qt().sd()},s=()=>i.leftPriceScale.borderVisible&&t.kt().W().borderVisible,e=()=>t.od();i.leftPriceScale.visible&&null===this.lm&&(this.lm=new Os("left",i,n,s,e),this.dm.appendChild(this.lm.jv())),i.rightPriceScale.visible&&null===this.am&&(this.am=new Os("right",i,n,s,e),this.fm.appendChild(this.am.jv()))}}const Is=!!es&&!!navigator.userAgentData&&navigator.userAgentData.brands.some((t=>t.brand.includes("Chromium")))&&!!es&&((null===(Ls=null===navigator||void 0===navigator?void 0:navigator.userAgentData)||void 0===Ls?void 0:Ls.platform)?"Windows"===navigator.userAgentData.platform:navigator.userAgent.toLowerCase().indexOf("win")>=0);var Ls;class Ns{constructor(t,i,n){var s;this.Dm=[],this.Om=0,this.Qa=0,this.e_=0,this.Am=0,this.Vm=0,this.Bm=null,this.zm=!1,this.up=new k,this.cp=new k,this.Mc=new k,this.Em=null,this.Im=null,this.Lm=t,this.cn=i,this.N_=n,this.um=document.createElement("div"),this.um.classList.add("tv-lightweight-charts"),this.um.style.overflow="hidden",this.um.style.direction="ltr",this.um.style.width="100%",this.um.style.height="100%",(s=this.um).style.userSelect="none",s.style.webkitUserSelect="none",s.style.msUserSelect="none",s.style.MozUserSelect="none",s.style.webkitTapHighlightColor="transparent",this.Nm=document.createElement("table"),this.Nm.setAttribute("cellspacing","0"),this.um.appendChild(this.Nm),this.Fm=this.Wm.bind(this),Fs(this.cn)&&this.jm(!0),this.Ui=new An(this.Sc.bind(this),this.cn,n),this.qt().Wc().l(this.Hm.bind(this),this),this.$m=new Es(this,this.N_),this.Nm.appendChild(this.$m.jv());const e=i.autoSize&&this.Um();let r=this.cn.width,h=this.cn.height;if(e||0===r||0===h){const i=t.getBoundingClientRect();r=r||i.width,h=h||i.height}this.qm(r,h),this.Ym(),t.appendChild(this.um),this.Xm(),this.Ui.kt().Gu().l(this.Ui.$l.bind(this.Ui),this),this.Ui.f_().l(this.Ui.$l.bind(this.Ui),this)}qt(){return this.Ui}W(){return this.cn}Km(){return this.Dm}Zm(){return this.$m}S(){this.jm(!1),0!==this.Om&&window.cancelAnimationFrame(this.Om),this.Ui.Wc().p(this),this.Ui.kt().Gu().p(this),this.Ui.f_().p(this),this.Ui.S();for(const t of this.Dm)this.Nm.removeChild(t.jv()),t.Fp().p(this),t.Wp().p(this),t.S();this.Dm=[],f(this.$m).S(),null!==this.um.parentElement&&this.um.parentElement.removeChild(this.um),this.Mc.S(),this.up.S(),this.cp.S(),this.Gm()}qm(t,i,n=!1){if(this.Qa===i&&this.e_===t)return;const s=function(t){const i=Math.floor(t.width),n=Math.floor(t.height);return Gn({width:i-i%2,height:n-n%2})}(Gn({width:t,height:i}));this.Qa=s.height,this.e_=s.width;const e=this.Qa+"px",r=this.e_+"px";f(this.um).style.height=e,f(this.um).style.width=r,this.Nm.style.height=e,this.Nm.style.width=r,n?this.Jm(at.es(),performance.now()):this.Ui.$l()}Zv(t){void 0===t&&(t=at.es());for(let i=0;i{let s=0;for(let e=0;e{f("left"===i?this.$m.bm():this.$m.wm()).ep(f(t),n,s)};if(this.cn.timeScale.visible){const i=this.$m.sp();if(null!==t){let e=0;this.sb()&&(r("left",e,n),e=f(s.Zp()).sp().width),this.$m.ep(t,e,n),e+=i.width,this.eb()&&r("right",e,n)}n+=i.height}return Gn({width:i,height:n})}ob(){let t=0,i=0,n=0;for(const s of this.Dm)this.sb()&&(i=Math.max(i,f(s.Zp()).$v(),this.cn.leftPriceScale.minimumWidth)),this.eb()&&(n=Math.max(n,f(s.Gp()).$v(),this.cn.rightPriceScale.minimumWidth)),t+=s.v_();i=ls(i),n=ls(n);const s=this.e_,e=this.Qa,r=Math.max(s-i-n,0),h=this.cn.timeScale.visible;let l=h?Math.max(this.$m.xm(),this.cn.timeScale.minimumHeight):0;var a;l=(a=l)+a%2;const o=0+l,_=e{t.Rp()})),3===(null===(n=this.Bm)||void 0===n?void 0:n.jn())&&(this.Bm.ts(t),this.ub(),this.cb(this.Bm),this.fb(this.Bm,i),t=this.Bm,this.Bm=null)),this.Zv(t)}fb(t,i){for(const n of t.Qn())this.ns(n,i)}cb(t){const i=this.Ui.Lc();for(let n=0;n{if(this.zm=!1,this.Om=0,null!==this.Bm){const i=this.Bm;this.Bm=null,this.Jm(i,t);for(const n of i.Qn())if(5===n.qn&&!n.Vt.Yu(t)){this.qt().Xn(n.Vt);break}}})))}ub(){this.Ym()}Ym(){const t=this.Ui.Lc(),i=t.length,n=this.Dm.length;for(let t=i;t{const n=i.zn().nl(t);null!==n&&e.set(i,n)}))}let r;if(null!==t){const i=null===(s=this.Ui.kt().qi(t))||void 0===s?void 0:s.originalTime;void 0!==i&&(r=i)}const h=this.qt().Vc(),l=null!==h&&h.zc instanceof Yi?h.zc:void 0,a=null!==h&&void 0!==h.pv?h.pv.wr:void 0;return{bb:r,se:null!=t?t:void 0,wb:null!=i?i:void 0,gb:l,Mb:e,xb:a,Sb:null!=n?n:void 0}}vb(t,i,n){this.up.m((()=>this.mb(t,i,n)))}pb(t,i,n){this.cp.m((()=>this.mb(t,i,n)))}Hm(t,i,n){this.Mc.m((()=>this.mb(t,i,n)))}Xm(){const t=this.cn.timeScale.visible?"":"none";this.$m.jv().style.display=t}sb(){return this.Dm[0].Kv().S_().W().visible}eb(){return this.Dm[0].Kv().y_().W().visible}Um(){return"ResizeObserver"in window&&(this.Em=new ResizeObserver((t=>{const i=t.find((t=>t.target===this.Lm));i&&this.qm(i.contentRect.width,i.contentRect.height)})),this.Em.observe(this.Lm,{box:"border-box"}),!0)}Gm(){null!==this.Em&&this.Em.disconnect(),this.Em=null}}function Fs(t){return Boolean(t.handleScroll.mouseWheel||t.handleScale.mouseWheel)}function Ws(t,i){var n={};for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&i.indexOf(s)<0&&(n[s]=t[s]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var e=0;for(s=Object.getOwnPropertySymbols(t);efunction(t,i){return i?i(t):void 0===(n=t).open&&void 0===n.value;var n}(s,h)?Ks({ut:i,se:n,bb:e},s):Ks(t(i,n,s,e,r),s)}function Gs(t){return{Candlestick:Zs(qs),Bar:Zs(Us),Area:Zs(Hs),Baseline:Zs($s),Histogram:Zs(js),Line:Zs(js),Custom:Zs(Ys)}[t]}function Js(t){return{se:0,kb:new Map,ia:t}}function Qs(t,i){if(void 0!==t&&0!==t.length)return{Cb:i.key(t[0].ut),Tb:i.key(t[t.length-1].ut)}}function te(t){let i;return t.forEach((t=>{void 0===i&&(i=t.bb)})),d(i)}class ie{constructor(t){this.Pb=new Map,this.Rb=new Map,this.Db=new Map,this.Ob=[],this.N_=t}S(){this.Pb.clear(),this.Rb.clear(),this.Db.clear(),this.Ob=[]}Ab(t,i){let n=0!==this.Pb.size,s=!1;const e=this.Rb.get(t);if(void 0!==e)if(1===this.Rb.size)n=!1,s=!0,this.Pb.clear();else for(const i of this.Ob)i.pointData.kb.delete(t)&&(s=!0);let r=[];if(0!==i.length){const n=i.map((t=>t.time)),e=this.N_.createConverterToInternalObj(i),h=Gs(t.Xh()),l=t.ga(),a=t.Ma();r=i.map(((i,r)=>{const o=e(i.time),_=this.N_.key(o);let u=this.Pb.get(_);void 0===u&&(u=Js(o),this.Pb.set(_,u),s=!0);const c=h(o,u.se,i,n[r],l,a);return u.kb.set(t,c),c}))}n&&this.Vb(),this.Bb(t,r);let h=-1;if(s){const t=[];this.Pb.forEach((i=>{t.push({timeWeight:0,time:i.ia,pointData:i,originalTime:te(i.kb)})})),t.sort(((t,i)=>this.N_.key(t.time)-this.N_.key(i.time))),h=this.zb(t)}return this.Eb(t,h,function(t,i,n){const s=Qs(t,n),e=Qs(i,n);if(void 0!==s&&void 0!==e)return{Xl:s.Tb>=e.Tb&&s.Cb>=e.Cb}}(this.Rb.get(t),e,this.N_))}hd(t){return this.Ab(t,[])}Ib(t,i){const n=i;!function(t){void 0===t.bb&&(t.bb=t.time)}(n),this.N_.preprocessData(i);const s=this.N_.createConverterToInternalObj([i])(i.time),e=this.Db.get(t);if(void 0!==e&&this.N_.key(s)this.N_.key(t.time)this.N_.key(s.ut)?Xs(i)&&n.push(i):Xs(i)?n[n.length-1]=i:n.splice(-1,1),this.Db.set(t,i.ut)}Bb(t,i){0!==i.length?(this.Rb.set(t,i.filter(Xs)),this.Db.set(t,i[i.length-1].ut)):(this.Rb.delete(t),this.Db.delete(t))}Vb(){for(const t of this.Ob)0===t.pointData.kb.size&&this.Pb.delete(this.N_.key(t.time))}zb(t){let i=-1;for(let n=0;n{0!==i.length&&(t=Math.max(t,i[i.length-1].se))})),t}Eb(t,i,n){const s={Fb:new Map,kt:{Au:this.Nb()}};if(-1!==i)this.Rb.forEach(((i,e)=>{s.Fb.set(e,{He:i,Wb:e===t?n:void 0})})),this.Rb.has(t)||s.Fb.set(t,{He:[],Wb:n}),s.kt.jb=this.Ob,s.kt.Hb=i;else{const i=this.Rb.get(t);s.Fb.set(t,{He:i||[],Wb:n})}return s}}function ne(t,i){t.se=i,t.kb.forEach((t=>{t.se=i}))}function se(t){const i={value:t.Vt[3],time:t.bb};return void 0!==t.yb&&(i.customValues=t.yb),i}function ee(t){const i=se(t);return void 0!==t.O&&(i.color=t.O),i}function re(t){const i=se(t);return void 0!==t._t&&(i.lineColor=t._t),void 0!==t.Ts&&(i.topColor=t.Ts),void 0!==t.Ps&&(i.bottomColor=t.Ps),i}function he(t){const i=se(t);return void 0!==t.Pe&&(i.topLineColor=t.Pe),void 0!==t.Re&&(i.bottomLineColor=t.Re),void 0!==t.Se&&(i.topFillColor1=t.Se),void 0!==t.ye&&(i.topFillColor2=t.ye),void 0!==t.ke&&(i.bottomFillColor1=t.ke),void 0!==t.Ce&&(i.bottomFillColor2=t.Ce),i}function le(t){const i={open:t.Vt[0],high:t.Vt[1],low:t.Vt[2],close:t.Vt[3],time:t.bb};return void 0!==t.yb&&(i.customValues=t.yb),i}function ae(t){const i=le(t);return void 0!==t.O&&(i.color=t.O),i}function oe(t){const i=le(t),{O:n,Bt:s,$h:e}=t;return void 0!==n&&(i.color=n),void 0!==s&&(i.borderColor=s),void 0!==e&&(i.wickColor=e),i}function _e(t){return{Area:re,Line:ee,Baseline:he,Histogram:ee,Bar:ae,Candlestick:oe,Custom:ue}[t]}function ue(t){const i=t.bb;return Object.assign(Object.assign({},t.He),{time:i})}const ce={vertLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},horzLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},mode:1},de={vertLines:{color:"#D6DCDE",style:0,visible:!0},horzLines:{color:"#D6DCDE",style:0,visible:!0}},fe={background:{type:"solid",color:"#FFFFFF"},textColor:"#191919",fontSize:12,fontFamily:B},ve={autoScale:!0,mode:0,invertScale:!1,alignLabels:!0,borderVisible:!0,borderColor:"#2B2B43",entireTextOnly:!1,visible:!1,ticksVisible:!1,scaleMargins:{bottom:.1,top:.2},minimumWidth:0},pe={rightOffset:0,barSpacing:6,minBarSpacing:.5,fixLeftEdge:!1,fixRightEdge:!1,lockVisibleTimeRangeOnResize:!1,rightBarStaysOnScroll:!1,borderVisible:!0,borderColor:"#2B2B43",visible:!0,timeVisible:!1,secondsVisible:!0,shiftVisibleRangeOnNewBar:!0,allowShiftVisibleRangeOnWhitespaceReplacement:!1,ticksVisible:!1,uniformDistribution:!1,minimumHeight:0},me={color:"rgba(0, 0, 0, 0)",visible:!1,fontSize:48,fontFamily:B,fontStyle:"",text:"",horzAlign:"center",vertAlign:"center"};function be(){return{width:0,height:0,autoSize:!1,layout:fe,crosshair:ce,grid:de,overlayPriceScales:Object.assign({},ve),leftPriceScale:Object.assign(Object.assign({},ve),{visible:!1}),rightPriceScale:Object.assign(Object.assign({},ve),{visible:!0}),timeScale:pe,watermark:me,localization:{locale:es?navigator.language:"",dateFormat:"dd MMM 'yy"},handleScroll:{mouseWheel:!0,pressedMouseMove:!0,horzTouchDrag:!0,vertTouchDrag:!0},handleScale:{axisPressedMouseMove:{time:!0,price:!0},axisDoubleClickReset:{time:!0,price:!0},mouseWheel:!0,pinch:!0},kineticScroll:{mouse:!1,touch:!0},trackingMode:{exitMode:1}}}class we{constructor(t,i){this.$b=t,this.Ub=i}applyOptions(t){this.$b.qt().Ec(this.Ub,t)}options(){return this.Li().W()}width(){return lt(this.Ub)?this.$b.nb(this.Ub):0}Li(){return f(this.$b.qt().Ic(this.Ub)).At}}function ge(t,i,n){const s=Ws(t,["time","originalTime"]),e=Object.assign({time:i},s);return void 0!==n&&(e.originalTime=n),e}const Me={color:"#FF0000",price:0,lineStyle:2,lineWidth:1,lineVisible:!0,axisLabelVisible:!0,title:"",axisLabelColor:"",axisLabelTextColor:""};class xe{constructor(t){this.Bh=t}applyOptions(t){this.Bh.Nh(t)}options(){return this.Bh.W()}qb(){return this.Bh}}class Se{constructor(t,i,n,s,e){this.Yb=new k,this.Is=t,this.Xb=i,this.Kb=n,this.N_=e,this.Zb=s}S(){this.Yb.S()}priceFormatter(){return this.Is.ca()}priceToCoordinate(t){const i=this.Is.Pt();return null===i?null:this.Is.At().Ot(t,i.Vt)}coordinateToPrice(t){const i=this.Is.Pt();return null===i?null:this.Is.At().pn(t,i.Vt)}barsInLogicalRange(t){if(null===t)return null;const i=new Mn(new bn(t.from,t.to)).iu(),n=this.Is.zn();if(n.Fi())return null;const s=n.nl(i.Os(),1),e=n.nl(i.di(),-1),r=f(n.Qh()),h=f(n.Bn());if(null!==s&&null!==e&&s.se>e.se)return{barsBefore:t.from-r,barsAfter:h-t.to};const l={barsBefore:null===s||s.se===r?t.from-r:s.se-r,barsAfter:null===e||e.se===h?h-t.to:h-e.se};return null!==s&&null!==e&&(l.from=s.bb,l.to=e.bb),l}setData(t){this.N_,this.Is.Xh(),this.Xb.Gb(this.Is,t),this.Jb("full")}update(t){this.Is.Xh(),this.Xb.Qb(this.Is,t),this.Jb("update")}dataByIndex(t,i){const n=this.Is.zn().nl(t,i);if(null===n)return null;return _e(this.seriesType())(n)}data(){const t=_e(this.seriesType());return this.Is.zn().ie().map((i=>t(i)))}subscribeDataChanged(t){this.Yb.l(t)}unsubscribeDataChanged(t){this.Yb.v(t)}setMarkers(t){this.N_;const i=t.map((t=>ge(t,this.N_.convertHorzItemToInternal(t.time),t.time)));this.Is.Zl(i)}markers(){return this.Is.Gl().map((t=>ge(t,t.originalTime,void 0)))}applyOptions(t){this.Is.Nh(t)}options(){return O(this.Is.W())}priceScale(){return this.Kb.priceScale(this.Is.At().xa())}createPriceLine(t){const i=C(O(Me),t),n=this.Is.Jl(i);return new xe(n)}removePriceLine(t){this.Is.Ql(t.qb())}seriesType(){return this.Is.Xh()}attachPrimitive(t){this.Is.ba(t),t.attached&&t.attached({chart:this.Zb,series:this,requestUpdate:()=>this.Is.qt().$l()})}detachPrimitive(t){this.Is.wa(t),t.detached&&t.detached()}Jb(t){this.Yb.M()&&this.Yb.m(t)}}class ye{constructor(t,i,n){this.tw=new k,this.uu=new k,this._m=new k,this.Ui=t,this.wl=t.kt(),this.$m=i,this.wl.Ku().l(this.iw.bind(this)),this.wl.Zu().l(this.nw.bind(this)),this.$m.gm().l(this.sw.bind(this)),this.N_=n}S(){this.wl.Ku().p(this),this.wl.Zu().p(this),this.$m.gm().p(this),this.tw.S(),this.uu.S(),this._m.S()}scrollPosition(){return this.wl.Iu()}scrollToPosition(t,i){i?this.wl.qu(t,1e3):this.Ui.Jn(t)}scrollToRealTime(){this.wl.Uu()}getVisibleRange(){const t=this.wl.ku();return null===t?null:{from:t.from.originalTime,to:t.to.originalTime}}setVisibleRange(t){const i={from:this.N_.convertHorzItemToInternal(t.from),to:this.N_.convertHorzItemToInternal(t.to)},n=this.wl.Ru(i);this.Ui.ld(n)}getVisibleLogicalRange(){const t=this.wl.yu();return null===t?null:{from:t.Os(),to:t.di()}}setVisibleLogicalRange(t){c(t.from<=t.to,"The from index cannot be after the to index."),this.Ui.ld(t)}resetTimeScale(){this.Ui.Zn()}fitContent(){this.Ui.Qu()}logicalToCoordinate(t){const i=this.Ui.kt();return i.Fi()?null:i.It(t)}coordinateToLogical(t){return this.wl.Fi()?null:this.wl.Vu(t)}timeToCoordinate(t){const i=this.N_.convertHorzItemToInternal(t),n=this.wl.ka(i,!1);return null===n?null:this.wl.It(n)}coordinateToTime(t){const i=this.Ui.kt(),n=i.Vu(t),s=i.qi(n);return null===s?null:s.originalTime}width(){return this.$m.$p().width}height(){return this.$m.$p().height}subscribeVisibleTimeRangeChange(t){this.tw.l(t)}unsubscribeVisibleTimeRangeChange(t){this.tw.v(t)}subscribeVisibleLogicalRangeChange(t){this.uu.l(t)}unsubscribeVisibleLogicalRangeChange(t){this.uu.v(t)}subscribeSizeChange(t){this._m.l(t)}unsubscribeSizeChange(t){this._m.v(t)}applyOptions(t){this.wl.Nh(t)}options(){return Object.assign(Object.assign({},O(this.wl.W())),{barSpacing:this.wl.he()})}iw(){this.tw.M()&&this.tw.m(this.getVisibleRange())}nw(){this.uu.M()&&this.uu.m(this.getVisibleLogicalRange())}sw(t){this._m.m(t.width,t.height)}}function ke(t){if(void 0===t||"custom"===t.type)return;const i=t;void 0!==i.minMove&&void 0===i.precision&&(i.precision=function(t){if(t>=1)return 0;let i=0;for(;i<8;i++){const n=Math.round(t);if(Math.abs(n-t)<1e-8)return i;t*=10}return i}(i.minMove))}function Ce(t){return function(t){if(D(t.handleScale)){const i=t.handleScale;t.handleScale={axisDoubleClickReset:{time:i,price:i},axisPressedMouseMove:{time:i,price:i},mouseWheel:i,pinch:i}}else if(void 0!==t.handleScale){const{axisPressedMouseMove:i,axisDoubleClickReset:n}=t.handleScale;D(i)&&(t.handleScale.axisPressedMouseMove={time:i,price:i}),D(n)&&(t.handleScale.axisDoubleClickReset={time:n,price:n})}const i=t.handleScroll;D(i)&&(t.handleScroll={horzTouchDrag:i,vertTouchDrag:i,mouseWheel:i,pressedMouseMove:i})}(t),t}class Te{constructor(t,i,n){this.ew=new Map,this.rw=new Map,this.hw=new k,this.lw=new k,this.aw=new k,this.ow=new ie(i);const s=void 0===n?O(be()):C(O(be()),Ce(n));this.N_=i,this.$b=new Ns(t,s,i),this.$b.Fp().l((t=>{this.hw.M()&&this.hw.m(this._w(t()))}),this),this.$b.Wp().l((t=>{this.lw.M()&&this.lw.m(this._w(t()))}),this),this.$b.Wc().l((t=>{this.aw.M()&&this.aw.m(this._w(t()))}),this);const e=this.$b.qt();this.uw=new ye(e,this.$b.Zm(),this.N_)}remove(){this.$b.Fp().p(this),this.$b.Wp().p(this),this.$b.Wc().p(this),this.uw.S(),this.$b.S(),this.ew.clear(),this.rw.clear(),this.hw.S(),this.lw.S(),this.aw.S(),this.ow.S()}resize(t,i,n){this.autoSizeActive()||this.$b.qm(t,i,n)}addCustomSeries(t,i){const n=v(t),s=Object.assign(Object.assign({},h),n.defaultOptions());return this.cw("Custom",s,i,n)}addAreaSeries(t){return this.cw("Area",s,t)}addBaselineSeries(t){return this.cw("Baseline",e,t)}addBarSeries(t){return this.cw("Bar",i,t)}addCandlestickSeries(i={}){return function(t){void 0!==t.borderColor&&(t.borderUpColor=t.borderColor,t.borderDownColor=t.borderColor),void 0!==t.wickColor&&(t.wickUpColor=t.wickColor,t.wickDownColor=t.wickColor)}(i),this.cw("Candlestick",t,i)}addHistogramSeries(t){return this.cw("Histogram",r,t)}addLineSeries(t){return this.cw("Line",n,t)}removeSeries(t){const i=d(this.ew.get(t)),n=this.ow.hd(i);this.$b.qt().hd(i),this.dw(n),this.ew.delete(t),this.rw.delete(i)}Gb(t,i){this.dw(this.ow.Ab(t,i))}Qb(t,i){this.dw(this.ow.Ib(t,i))}subscribeClick(t){this.hw.l(t)}unsubscribeClick(t){this.hw.v(t)}subscribeCrosshairMove(t){this.aw.l(t)}unsubscribeCrosshairMove(t){this.aw.v(t)}subscribeDblClick(t){this.lw.l(t)}unsubscribeDblClick(t){this.lw.v(t)}priceScale(t){return new we(this.$b,t)}timeScale(){return this.uw}applyOptions(t){this.$b.Nh(Ce(t))}options(){return this.$b.W()}takeScreenshot(){return this.$b.tb()}autoSizeActive(){return this.$b.rb()}chartElement(){return this.$b.hb()}paneSize(){const t=this.$b.ab();return{height:t.height,width:t.width}}setCrosshairPosition(t,i,n){const s=this.ew.get(n);if(void 0===s)return;const e=this.$b.qt().cr(s);null!==e&&this.$b.qt().Qc(t,i,e)}clearCrosshairPosition(){this.$b.qt().td(!0)}cw(t,i,n={},s){ke(n.priceFormat);const e=C(O(l),O(i),n),r=this.$b.qt().ed(t,e,s),h=new Se(r,this,this,this,this.N_);return this.ew.set(h,r),this.rw.set(r,h),h}dw(t){const i=this.$b.qt();i.nd(t.kt.Au,t.kt.jb,t.kt.Hb),t.Fb.forEach(((t,i)=>i.it(t.He,t.Wb))),i.zu()}fw(t){return d(this.rw.get(t))}_w(t){const i=new Map;t.Mb.forEach(((t,n)=>{const s=n.Xh(),e=_e(s)(t);if("Custom"!==s)c(function(t){return void 0!==t.open||void 0!==t.value}(e));else{const t=n.Ma();c(!t||!1===t(e))}i.set(this.fw(n),e)}));const n=void 0===t.gb?void 0:this.fw(t.gb);return{time:t.bb,logical:t.se,point:t.wb,hoveredSeries:n,hoveredObjectId:t.xb,seriesData:i,sourceEvent:t.Sb}}}function Pe(t,i,n){let s;if(R(t)){const i=document.getElementById(t);c(null!==i,`Cannot find element in DOM with id=${t}`),s=i}else s=t;const e=new Te(s,i,n);return i.setOptions(e.options()),e}function Re(t,i){return Pe(t,new Zn,Zn.Td(i))}const De=Object.assign(Object.assign({},l),h);function Oe(){return"4.1.1"}export{Dn as ColorType,rt as CrosshairMode,Pn as LastPriceAnimationMode,o as LineStyle,a as LineType,Vi as MismatchDirection,Rn as PriceLineSource,cn as PriceScaleMode,On as TickMarkType,Tn as TrackingModeExitMode,Re as createChart,Pe as createChartEx,De as customSeriesDefaultOptions,Vn as isBusinessDay,Bn as isUTCTimestamp,Oe as version}; -+const t={upColor:"#26a69a",downColor:"#ef5350",wickVisible:!0,borderVisible:!0,borderColor:"#378658",borderUpColor:"#26a69a",borderDownColor:"#ef5350",wickColor:"#737375",wickUpColor:"#26a69a",wickDownColor:"#ef5350"},i={upColor:"#26a69a",downColor:"#ef5350",openVisible:!0,thinBars:!0},n={color:"#2196f3",lineStyle:0,lineWidth:3,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},s={topColor:"rgba( 46, 220, 135, 0.4)",bottomColor:"rgba( 40, 221, 100, 0)",invertFilledArea:!1,lineColor:"#33D778",lineStyle:0,lineWidth:3,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},e={baseValue:{type:"price",price:0},topFillColor1:"rgba(38, 166, 154, 0.28)",topFillColor2:"rgba(38, 166, 154, 0.05)",topLineColor:"rgba(38, 166, 154, 1)",bottomFillColor1:"rgba(239, 83, 80, 0.05)",bottomFillColor2:"rgba(239, 83, 80, 0.28)",bottomLineColor:"rgba(239, 83, 80, 1)",lineWidth:3,lineStyle:0,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},r={color:"#26a69a",base:0},h={color:"#2196f3"},l={title:"",visible:!0,lastValueVisible:!0,priceLineVisible:!0,priceLineSource:0,priceLineWidth:1,priceLineColor:"",priceLineStyle:2,baseLineVisible:!0,baseLineWidth:1,baseLineColor:"#B2B5BE",baseLineStyle:0,priceFormat:{type:"price",precision:2,minMove:.01}};var a,o;function _(t,i){const n={0:[],1:[t.lineWidth,t.lineWidth],2:[2*t.lineWidth,2*t.lineWidth],3:[6*t.lineWidth,6*t.lineWidth],4:[t.lineWidth,4*t.lineWidth],5:[t.lineWidth,t.lineWidth]}[i];t.setLineDash(n)}function u(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(n,i+e),t.lineTo(s,i+e),t.stroke()}function c(t,i){if(!t)throw new Error("Assertion failed"+(i?": "+i:""))}function d(t){if(void 0===t)throw new Error("Value is undefined");return t}function f(t){if(null===t)throw new Error("Value is null");return t}function v(t){return f(d(t))}!function(t){t[t.Simple=0]="Simple",t[t.WithSteps=1]="WithSteps",t[t.Curved=2]="Curved"}(a||(a={})),function(t){t[t.Solid=0]="Solid",t[t.Dotted=1]="Dotted",t[t.Dashed=2]="Dashed",t[t.LargeDashed=3]="LargeDashed",t[t.SparseDotted=4]="SparseDotted",t[t.CustomDotGrid=5]="CustomDotGrid"}(o||(o={}));const p={khaki:"#f0e68c",azure:"#f0ffff",aliceblue:"#f0f8ff",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gainsboro:"#dcdcdc",gray:"#808080",green:"#008000",honeydew:"#f0fff0",floralwhite:"#fffaf0",lightblue:"#add8e6",lightcoral:"#f08080",lemonchiffon:"#fffacd",hotpink:"#ff69b4",lightyellow:"#ffffe0",greenyellow:"#adff2f",lightgoldenrodyellow:"#fafad2",limegreen:"#32cd32",linen:"#faf0e6",lightcyan:"#e0ffff",magenta:"#f0f",maroon:"#800000",olive:"#808000",orange:"#ffa500",oldlace:"#fdf5e6",mediumblue:"#0000cd",transparent:"#0000",lime:"#0f0",lightpink:"#ffb6c1",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",midnightblue:"#191970",orchid:"#da70d6",mediumorchid:"#ba55d3",mediumturquoise:"#48d1cc",orangered:"#ff4500",royalblue:"#4169e1",powderblue:"#b0e0e6",red:"#f00",coral:"#ff7f50",turquoise:"#40e0d0",white:"#fff",whitesmoke:"#f5f5f5",wheat:"#f5deb3",teal:"#008080",steelblue:"#4682b4",bisque:"#ffe4c4",aquamarine:"#7fffd4",aqua:"#0ff",sienna:"#a0522d",silver:"#c0c0c0",springgreen:"#00ff7f",antiquewhite:"#faebd7",burlywood:"#deb887",brown:"#a52a2a",beige:"#f5f5dc",chocolate:"#d2691e",chartreuse:"#7fff00",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cadetblue:"#5f9ea0",tomato:"#ff6347",fuchsia:"#f0f",blue:"#00f",salmon:"#fa8072",blanchedalmond:"#ffebcd",slateblue:"#6a5acd",slategray:"#708090",thistle:"#d8bfd8",tan:"#d2b48c",cyan:"#0ff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",blueviolet:"#8a2be2",black:"#000",darkmagenta:"#8b008b",darkslateblue:"#483d8b",darkkhaki:"#bdb76b",darkorchid:"#9932cc",darkorange:"#ff8c00",darkgreen:"#006400",darkred:"#8b0000",dodgerblue:"#1e90ff",darkslategray:"#2f4f4f",dimgray:"#696969",deepskyblue:"#00bfff",firebrick:"#b22222",forestgreen:"#228b22",indigo:"#4b0082",ivory:"#fffff0",lavenderblush:"#fff0f5",feldspar:"#d19275",indianred:"#cd5c5c",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightskyblue:"#87cefa",lightslategray:"#789",lightslateblue:"#8470ff",snow:"#fffafa",lightseagreen:"#20b2aa",lightsalmon:"#ffa07a",darksalmon:"#e9967a",darkviolet:"#9400d3",mediumpurple:"#9370d8",mediumaquamarine:"#66cdaa",skyblue:"#87ceeb",lavender:"#e6e6fa",lightsteelblue:"#b0c4de",mediumvioletred:"#c71585",mintcream:"#f5fffa",navajowhite:"#ffdead",navy:"#000080",olivedrab:"#6b8e23",palevioletred:"#d87093",violetred:"#d02090",yellow:"#ff0",yellowgreen:"#9acd32",lawngreen:"#7cfc00",pink:"#ffc0cb",paleturquoise:"#afeeee",palegoldenrod:"#eee8aa",darkolivegreen:"#556b2f",darkseagreen:"#8fbc8f",darkturquoise:"#00ced1",peachpuff:"#ffdab9",deeppink:"#ff1493",violet:"#ee82ee",palegreen:"#98fb98",mediumseagreen:"#3cb371",peru:"#cd853f",saddlebrown:"#8b4513",sandybrown:"#f4a460",rosybrown:"#bc8f8f",purple:"#800080",seagreen:"#2e8b57",seashell:"#fff5ee",papayawhip:"#ffefd5",mediumslateblue:"#7b68ee",plum:"#dda0dd",mediumspringgreen:"#00fa9a"};function m(t){return t<0?0:t>255?255:Math.round(t)||0}function b(t){return t<=0||t>0?t<0?0:t>1?1:Math.round(1e4*t)/1e4:0}const w=/^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,g=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,M=/^rgb\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*\)$/,x=/^rgba\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?[\d]{0,10}(?:\.\d+)?)\s*\)$/;function S(t){(t=t.toLowerCase())in p&&(t=p[t]);{const i=x.exec(t)||M.exec(t);if(i)return[m(parseInt(i[1],10)),m(parseInt(i[2],10)),m(parseInt(i[3],10)),b(i.length<5?1:parseFloat(i[4]))]}{const i=g.exec(t);if(i)return[m(parseInt(i[1],16)),m(parseInt(i[2],16)),m(parseInt(i[3],16)),1]}{const i=w.exec(t);if(i)return[m(17*parseInt(i[1],16)),m(17*parseInt(i[2],16)),m(17*parseInt(i[3],16)),1]}throw new Error(`Cannot parse color: ${t}`)}function y(t){const i=S(t);return{t:`rgb(${i[0]}, ${i[1]}, ${i[2]})`,i:(n=i,.199*n[0]+.687*n[1]+.114*n[2]>160?"black":"white")};var n}class k{constructor(){this.h=[]}l(t,i,n){const s={o:t,_:i,u:!0===n};this.h.push(s)}v(t){const i=this.h.findIndex((i=>t===i.o));i>-1&&this.h.splice(i,1)}p(t){this.h=this.h.filter((i=>i._!==t))}m(t,i,n){const s=[...this.h];this.h=this.h.filter((t=>!t.u)),s.forEach((s=>s.o(t,i,n)))}M(){return this.h.length>0}S(){this.h=[]}}function C(t,...i){for(const n of i)for(const i in n)void 0!==n[i]&&("object"!=typeof n[i]||void 0===t[i]||Array.isArray(n[i])?t[i]=n[i]:C(t[i],n[i]));return t}function T(t){return"number"==typeof t&&isFinite(t)}function P(t){return"number"==typeof t&&t%1==0}function R(t){return"string"==typeof t}function D(t){return"boolean"==typeof t}function O(t){const i=t;if(!i||"object"!=typeof i)return i;let n,s,e;for(s in n=Array.isArray(i)?[]:{},i)i.hasOwnProperty(s)&&(e=i[s],n[s]=e&&"object"==typeof e?O(e):e);return n}function A(t){return null!==t}function V(t){return null===t?void 0:t}const B="-apple-system, BlinkMacSystemFont, 'Trebuchet MS', Roboto, Ubuntu, sans-serif";function z(t,i,n){return void 0===i&&(i=B),`${n=void 0!==n?`${n} `:""}${t}px ${i}`}class E{constructor(t){this.k={C:1,T:5,P:NaN,R:"",D:"",O:"",A:"",V:0,B:0,I:0,L:0,N:0},this.F=t}W(){const t=this.k,i=this.j(),n=this.H();return t.P===i&&t.D===n||(t.P=i,t.D=n,t.R=z(i,n),t.L=2.5/12*i,t.V=t.L,t.B=i/12*t.T,t.I=i/12*t.T,t.N=0),t.O=this.$(),t.A=this.U(),this.k}$(){return this.F.W().layout.textColor}U(){return this.F.q()}j(){return this.F.W().layout.fontSize}H(){return this.F.W().layout.fontFamily}}class I{constructor(){this.Y=[]}X(t){this.Y=t}K(t,i,n){this.Y.forEach((s=>{s.K(t,i,n)}))}}class L{K(t,i,n){t.useMediaCoordinateSpace((t=>this.Z(t,i,n)))}G(t,i,n){t.useMediaCoordinateSpace((t=>this.J(t,i,n)))}J(t,i,n){}}class N extends L{constructor(){super(...arguments),this.tt=null}it(t){this.tt=t}Z({context:t}){if(null===this.tt||null===this.tt.nt)return;const i=this.tt.nt,n=this.tt,s=s=>{t.beginPath();for(let e=i.to-1;e>=i.from;--e){const i=n.st[e];t.moveTo(i.et,i.rt),t.arc(i.et,i.rt,s,0,2*Math.PI)}t.fill()};n.ht>0&&(t.fillStyle=n.lt,s(n.ot+n.ht)),t.fillStyle=n._t,s(n.ot)}}function F(){return{st:[{et:0,rt:0,ut:0,ct:0}],_t:"",lt:"",ot:0,ht:0,nt:null}}const W={from:0,to:1};class j{constructor(t,i){this.dt=new I,this.ft=[],this.vt=[],this.bt=!0,this.F=t,this.wt=i,this.dt.X(this.ft)}gt(t){const i=this.F.Mt();i.length!==this.ft.length&&(this.vt=i.map(F),this.ft=this.vt.map((t=>{const i=new N;return i.it(t),i})),this.dt.X(this.ft)),this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.dt}St(){const t=2===this.wt.W().mode,i=this.F.Mt(),n=this.wt.yt(),s=this.F.kt();i.forEach(((i,e)=>{var r;const h=this.vt[e],l=i.Ct(n);if(t||null===l||!i.Tt())return void(h.nt=null);const a=f(i.Pt());h._t=l.Rt,h.ot=l.ot,h.ht=l.Dt,h.st[0].ct=l.ct,h.st[0].rt=i.At().Ot(l.ct,a.Vt),h.lt=null!==(r=l.Bt)&&void 0!==r?r:this.F.zt(h.st[0].rt/i.At().Et()),h.st[0].ut=n,h.st[0].et=s.It(n),h.nt=W}))}}class H{K(t,i,n){t.useBitmapCoordinateSpace((t=>this.Z(t,i,n)))}}class $ extends H{constructor(t){super(),this.Lt=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;const e=this.Lt.Nt.Tt,r=this.Lt.Ft.Tt;if(!e&&!r)return;const h=Math.round(this.Lt.et*n),l=Math.round(this.Lt.rt*s);t.lineCap="butt",e&&h>=0&&(t.lineWidth=Math.floor(this.Lt.Nt.ht*n),t.strokeStyle=this.Lt.Nt.O,t.fillStyle=this.Lt.Nt.O,_(t,this.Lt.Nt.Wt),function(t,i,n,s){t.beginPath();const e=t.lineWidth%2?.5:0;t.moveTo(i+e,n),t.lineTo(i+e,s),t.stroke()}(t,h,0,i.height)),r&&l>=0&&(t.lineWidth=Math.floor(this.Lt.Ft.ht*s),t.strokeStyle=this.Lt.Ft.O,t.fillStyle=this.Lt.Ft.O,_(t,this.Lt.Ft.Wt),u(t,l,0,i.width))}}class U{constructor(t){this.bt=!0,this.jt={Nt:{ht:1,Wt:0,O:"",Tt:!1},Ft:{ht:1,Wt:0,O:"",Tt:!1},et:0,rt:0},this.Ht=new $(this.jt),this.$t=t}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht}St(){const t=this.$t.Tt(),i=f(this.$t.Ut()),n=i.qt().W().crosshair,s=this.jt;if(2===n.mode)return s.Ft.Tt=!1,void(s.Nt.Tt=!1);s.Ft.Tt=t&&this.$t.Yt(i),s.Nt.Tt=t&&this.$t.Xt(),s.Ft.ht=n.horzLine.width,s.Ft.Wt=n.horzLine.style,s.Ft.O=n.horzLine.color,s.Nt.ht=n.vertLine.width,s.Nt.Wt=n.vertLine.style,s.Nt.O=n.vertLine.color,s.et=this.$t.Kt(),s.rt=this.$t.Zt()}}function q(t,i,n,s,e,r){t.fillRect(i+r,n,s-2*r,r),t.fillRect(i+r,n+e-r,s-2*r,r),t.fillRect(i,n,r,e),t.fillRect(i+s-r,n,r,e)}function Y(t,i,n,s,e,r){t.save(),t.globalCompositeOperation="copy",t.fillStyle=r,t.fillRect(i,n,s,e),t.restore()}function X(t,i){return t.map((t=>0===t?t:t+i))}function K(t,i,n,s,e,r){t.beginPath(),t.lineTo(i+s-r[1],n),0!==r[1]&&t.arcTo(i+s,n,i+s,n+r[1],r[1]),t.lineTo(i+s,n+e-r[2]),0!==r[2]&&t.arcTo(i+s,n+e,i+s-r[2],n+e,r[2]),t.lineTo(i+r[3],n+e),0!==r[3]&&t.arcTo(i,n+e,i,n+e-r[3],r[3]),t.lineTo(i,n+r[0]),0!==r[0]&&t.arcTo(i,n,i+r[0],n,r[0])}function Z(t,i,n,s,e,r,h=0,l=[0,0,0,0],a=""){if(t.save(),!h||!a||a===r)return K(t,i,n,s,e,l),t.fillStyle=r,t.fill(),void t.restore();const o=h/2;if("transparent"!==r){K(t,i+h,n+h,s-2*h,e-2*h,X(l,-h)),t.fillStyle=r,t.fill()}if("transparent"!==a){K(t,i+o,n+o,s-h,e-h,X(l,-o)),t.lineWidth=h,t.strokeStyle=a,t.closePath(),t.stroke()}t.restore()}function G(t,i,n,s,e,r,h){t.save(),t.globalCompositeOperation="copy";const l=t.createLinearGradient(0,0,0,e);l.addColorStop(0,r),l.addColorStop(1,h),t.fillStyle=l,t.fillRect(i,n,s,e),t.restore()}class J{constructor(t,i){this.it(t,i)}it(t,i){this.Lt=t,this.Gt=i}Et(t,i){return this.Lt.Tt?t.P+t.L+t.V:0}K(t,i,n,s){if(!this.Lt.Tt||0===this.Lt.Jt.length)return;const e=this.Lt.O,r=this.Gt.t,h=t.useBitmapCoordinateSpace((t=>{const h=t.context;h.font=i.R;const l=this.Qt(t,i,n,s),a=l.ti,o=(t,i)=>{l.ii?Z(h,a.ni,a.si,a.ei,a.ri,t,a.hi,[a.ot,0,0,a.ot],i):Z(h,a.li,a.si,a.ei,a.ri,t,a.hi,[0,a.ot,a.ot,0],i)};return o(r,"transparent"),this.Lt.ai&&(h.fillStyle=e,h.fillRect(a.li,a.oi,a._i-a.li,a.ui)),o("transparent",r),this.Lt.ci&&(h.fillStyle=i.A,h.fillRect(l.ii?a.di-a.hi:0,a.si,a.hi,a.fi-a.si)),l}));t.useMediaCoordinateSpace((({context:t})=>{const n=h.vi;t.font=i.R,t.textAlign=h.ii?"right":"left",t.textBaseline="middle",t.fillStyle=e,t.fillText(this.Lt.Jt,n.pi,(n.si+n.fi)/2+n.mi)}))}Qt(t,i,n,s){var e;const{context:r,bitmapSize:h,mediaSize:l,horizontalPixelRatio:a,verticalPixelRatio:o}=t,_=this.Lt.ai||!this.Lt.bi?i.T:0,u=this.Lt.wi?i.C:0,c=i.L+this.Gt.gi,d=i.V+this.Gt.Mi,f=i.B,v=i.I,p=this.Lt.Jt,m=i.P,b=n.xi(r,p),w=Math.ceil(n.Si(r,p)),g=m+c+d,M=i.C+f+v+w+_,x=Math.max(1,Math.floor(o));let S=Math.round(g*o);S%2!=x%2&&(S+=1);const y=u>0?Math.max(1,Math.floor(u*a)):0,k=Math.round(M*a),C=Math.round(_*a),T=null!==(e=this.Gt.yi)&&void 0!==e?e:this.Gt.ki,P=Math.round(T*o)-Math.floor(.5*o),R=Math.floor(P+x/2-S/2),D=R+S,O="right"===s,A=O?l.width-u:u,V=O?h.width-y:y;let B,z,E;return O?(B=V-k,z=V-C,E=A-_-f-u):(B=V+k,z=V+C,E=A+_+f),{ii:O,ti:{si:R,oi:P,fi:D,ei:k,ri:S,ot:2*a,hi:y,ni:B,li:V,_i:z,ui:x,di:h.width},vi:{si:R/o,fi:D/o,pi:E,mi:b}}}}class Q{constructor(t){this.Ci={ki:0,t:"#000",Mi:0,gi:0},this.Ti={Jt:"",Tt:!1,ai:!0,bi:!1,Bt:"",O:"#FFF",ci:!1,wi:!1},this.Pi={Jt:"",Tt:!1,ai:!1,bi:!0,Bt:"",O:"#FFF",ci:!0,wi:!0},this.bt=!0,this.Ri=new(t||J)(this.Ti,this.Ci),this.Di=new(t||J)(this.Pi,this.Ci)}Jt(){return this.Oi(),this.Ti.Jt}ki(){return this.Oi(),this.Ci.ki}gt(){this.bt=!0}Et(t,i=!1){return Math.max(this.Ri.Et(t,i),this.Di.Et(t,i))}Ai(){return this.Ci.yi||0}Vi(t){this.Ci.yi=t}Bi(){return this.Oi(),this.Ti.Tt||this.Pi.Tt}zi(){return this.Oi(),this.Ti.Tt}xt(t){return this.Oi(),this.Ti.ai=this.Ti.ai&&t.W().ticksVisible,this.Pi.ai=this.Pi.ai&&t.W().ticksVisible,this.Ri.it(this.Ti,this.Ci),this.Di.it(this.Pi,this.Ci),this.Ri}Ei(){return this.Oi(),this.Ri.it(this.Ti,this.Ci),this.Di.it(this.Pi,this.Ci),this.Di}Oi(){this.bt&&(this.Ti.ai=!0,this.Pi.ai=!1,this.Ii(this.Ti,this.Pi,this.Ci))}}class tt extends Q{constructor(t,i,n){super(),this.$t=t,this.Li=i,this.Ni=n}Ii(t,i,n){if(t.Tt=!1,2===this.$t.W().mode)return;const s=this.$t.W().horzLine;if(!s.labelVisible)return;const e=this.Li.Pt();if(!this.$t.Tt()||this.Li.Fi()||null===e)return;const r=y(s.labelBackgroundColor);n.t=r.t,t.O=r.i;const h=2/12*this.Li.P();n.gi=h,n.Mi=h;const l=this.Ni(this.Li);n.ki=l.ki,t.Jt=this.Li.Wi(l.ct,e),t.Tt=!0}}const it=/[1-9]/g;class nt{constructor(){this.Lt=null}it(t){this.Lt=t}K(t,i){if(null===this.Lt||!1===this.Lt.Tt||0===this.Lt.Jt.length)return;const n=t.useMediaCoordinateSpace((({context:t})=>(t.font=i.R,Math.round(i.ji.Si(t,f(this.Lt).Jt,it)))));if(n<=0)return;const s=i.Hi,e=n+2*s,r=e/2,h=this.Lt.$i;let l=this.Lt.ki,a=Math.floor(l-r)+.5;a<0?(l+=Math.abs(0-a),a=Math.floor(l-r)+.5):a+e>h&&(l-=Math.abs(h-(a+e)),a=Math.floor(l-r)+.5);const o=a+e,_=Math.ceil(0+i.C+i.T+i.L+i.P+i.V);t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:n,verticalPixelRatio:s})=>{const e=f(this.Lt);t.fillStyle=e.t;const r=Math.round(a*n),h=Math.round(0*s),l=Math.round(o*n),u=Math.round(_*s),c=Math.round(2*n);if(t.beginPath(),t.moveTo(r,h),t.lineTo(r,u-c),t.arcTo(r,u,r+c,u,c),t.lineTo(l-c,u),t.arcTo(l,u,l,u-c,c),t.lineTo(l,h),t.fill(),e.ai){const r=Math.round(e.ki*n),l=h,a=Math.round((l+i.T)*s);t.fillStyle=e.O;const o=Math.max(1,Math.floor(n)),_=Math.floor(.5*n);t.fillRect(r-_,l,o,a-l)}})),t.useMediaCoordinateSpace((({context:t})=>{const n=f(this.Lt),e=0+i.C+i.T+i.L+i.P/2;t.font=i.R,t.textAlign="left",t.textBaseline="middle",t.fillStyle=n.O;const r=i.ji.xi(t,"Apr0");t.translate(a+s,e+r),t.fillText(n.Jt,0,0)}))}}class st{constructor(t,i,n){this.bt=!0,this.Ht=new nt,this.jt={Tt:!1,t:"#4c525e",O:"white",Jt:"",$i:0,ki:NaN,ai:!0},this.wt=t,this.Ui=i,this.Ni=n}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht.it(this.jt),this.Ht}St(){const t=this.jt;if(t.Tt=!1,2===this.wt.W().mode)return;const i=this.wt.W().vertLine;if(!i.labelVisible)return;const n=this.Ui.kt();if(n.Fi())return;t.$i=n.$i();const s=this.Ni();if(null===s)return;t.ki=s.ki;const e=n.qi(this.wt.yt());t.Jt=n.Yi(f(e)),t.Tt=!0;const r=y(i.labelBackgroundColor);t.t=r.t,t.O=r.i,t.ai=n.W().ticksVisible}}class et{constructor(){this.Xi=null,this.Ki=0}Zi(){return this.Ki}Gi(t){this.Ki=t}At(){return this.Xi}Ji(t){this.Xi=t}Qi(t){return[]}tn(){return[]}Tt(){return!0}}var rt;!function(t){t[t.Normal=0]="Normal",t[t.Magnet=1]="Magnet",t[t.Hidden=2]="Hidden"}(rt||(rt={}));class ht extends et{constructor(t,i){super(),this.nn=null,this.sn=NaN,this.en=0,this.rn=!0,this.hn=new Map,this.ln=!1,this.an=NaN,this.on=NaN,this._n=NaN,this.un=NaN,this.Ui=t,this.cn=i,this.dn=new j(t,this);this.fn=((t,i)=>n=>{const s=i(),e=t();if(n===f(this.nn).vn())return{ct:e,ki:s};{const t=f(n.Pt());return{ct:n.pn(s,t),ki:s}}})((()=>this.sn),(()=>this.on));const n=((t,i)=>()=>{const n=this.Ui.kt().mn(t()),s=i();return n&&Number.isFinite(s)?{ut:n,ki:s}:null})((()=>this.en),(()=>this.Kt()));this.bn=new st(this,t,n),this.wn=new U(this)}W(){return this.cn}gn(t,i){this._n=t,this.un=i}Mn(){this._n=NaN,this.un=NaN}xn(){return this._n}Sn(){return this.un}yn(t,i,n){this.ln||(this.ln=!0),this.rn=!0,this.kn(t,i,n)}yt(){return this.en}Kt(){return this.an}Zt(){return this.on}Tt(){return this.rn}Cn(){this.rn=!1,this.Tn(),this.sn=NaN,this.an=NaN,this.on=NaN,this.nn=null,this.Mn()}Pn(t){return null!==this.nn?[this.wn,this.dn]:[]}Yt(t){return t===this.nn&&this.cn.horzLine.visible}Xt(){return this.cn.vertLine.visible}Rn(t,i){this.rn&&this.nn===t||this.hn.clear();const n=[];return this.nn===t&&n.push(this.Dn(this.hn,i,this.fn)),n}tn(){return this.rn?[this.bn]:[]}Ut(){return this.nn}On(){this.wn.gt(),this.hn.forEach((t=>t.gt())),this.bn.gt(),this.dn.gt()}An(t){return t&&!t.vn().Fi()?t.vn():null}kn(t,i,n){this.Vn(t,i,n)&&this.On()}Vn(t,i,n){const s=this.an,e=this.on,r=this.sn,h=this.en,l=this.nn,a=this.An(n);this.en=t,this.an=isNaN(t)?NaN:this.Ui.kt().It(t),this.nn=n;const o=null!==a?a.Pt():null;return null!==a&&null!==o?(this.sn=i,this.on=a.Ot(i,o)):(this.sn=NaN,this.on=NaN),s!==this.an||e!==this.on||h!==this.en||r!==this.sn||l!==this.nn}Tn(){const t=this.Ui.Mt().map((t=>t.zn().Bn())).filter(A),i=0===t.length?null:Math.max(...t);this.en=null!==i?i:NaN}Dn(t,i,n){let s=t.get(i);return void 0===s&&(s=new tt(this,i,n),t.set(i,s)),s}}function lt(t){return"left"===t||"right"===t}class at{constructor(t){this.En=new Map,this.In=[],this.Ln=t}Nn(t,i){const n=function(t,i){return void 0===t?i:{Fn:Math.max(t.Fn,i.Fn),Wn:t.Wn||i.Wn}}(this.En.get(t),i);this.En.set(t,n)}jn(){return this.Ln}Hn(t){const i=this.En.get(t);return void 0===i?{Fn:this.Ln}:{Fn:Math.max(this.Ln,i.Fn),Wn:i.Wn}}$n(){this.Un(),this.In=[{qn:0}]}Yn(t){this.Un(),this.In=[{qn:1,Vt:t}]}Xn(t){this.Kn(),this.In.push({qn:5,Vt:t})}Un(){this.Kn(),this.In.push({qn:6})}Zn(){this.Un(),this.In=[{qn:4}]}Gn(t){this.Un(),this.In.push({qn:2,Vt:t})}Jn(t){this.Un(),this.In.push({qn:3,Vt:t})}Qn(){return this.In}ts(t){for(const i of t.In)this.ns(i);this.Ln=Math.max(this.Ln,t.Ln),t.En.forEach(((t,i)=>{this.Nn(i,t)}))}static ss(){return new at(2)}static es(){return new at(3)}ns(t){switch(t.qn){case 0:this.$n();break;case 1:this.Yn(t.Vt);break;case 2:this.Gn(t.Vt);break;case 3:this.Jn(t.Vt);break;case 4:this.Zn();break;case 5:this.Xn(t.Vt);break;case 6:this.Kn()}}Kn(){const t=this.In.findIndex((t=>5===t.qn));-1!==t&&this.In.splice(t,1)}}const ot=".";function _t(t,i){if(!T(t))return"n/a";if(!P(i))throw new TypeError("invalid length");if(i<0||i>16)throw new TypeError("invalid length");if(0===i)return t.toString();return("0000000000000000"+t.toString()).slice(-i)}class ut{constructor(t,i){if(i||(i=1),T(t)&&P(t)||(t=100),t<0)throw new TypeError("invalid base");this.Li=t,this.rs=i,this.hs()}format(t){const i=t<0?"−":"";return t=Math.abs(t),i+this.ls(t)}hs(){if(this.os=0,this.Li>0&&this.rs>0){let t=this.Li;for(;t>1;)t/=10,this.os++}}ls(t){const i=this.Li/this.rs;let n=Math.floor(t),s="";const e=void 0!==this.os?this.os:NaN;if(i>1){let r=+(Math.round(t*i)-n*i).toFixed(this.os);r>=i&&(r-=i,n+=1),s=ot+_t(+r.toFixed(this.os)*this.rs,e)}else n=Math.round(n*i)/i,e>0&&(s=ot+_t(0,e));return n.toFixed(0)+s}}class ct extends ut{constructor(t=100){super(t)}format(t){return`${super.format(t)}%`}}class dt{constructor(t){this._s=t}format(t){let i="";return t<0&&(i="-",t=-t),t<995?i+this.us(t):t<999995?i+this.us(t/1e3)+"K":t<999999995?(t=1e3*Math.round(t/1e3),i+this.us(t/1e6)+"M"):(t=1e6*Math.round(t/1e6),i+this.us(t/1e9)+"B")}us(t){let i;const n=Math.pow(10,this._s);return i=(t=Math.round(t*n)/n)>=1e-15&&t<1?t.toFixed(this._s).replace(/\.?0+$/,""):String(t),i.replace(/(\.[1-9]*)0+$/,((t,i)=>i))}}function ft(t,i,n,s,e,r,h){if(0===i.length||s.from>=i.length||s.to<=0)return;const{context:l,horizontalPixelRatio:a,verticalPixelRatio:o}=t,_=i[s.from];let u=r(t,_),c=_;if(s.to-s.from<2){const i=e/2;l.beginPath();const n={et:_.et-i,rt:_.rt},s={et:_.et+i,rt:_.rt};l.moveTo(n.et*a,n.rt*o),l.lineTo(s.et*a,s.rt*o),h(t,u,n,s)}else{const e=(i,n)=>{h(t,u,c,n),l.beginPath(),u=i,c=n};let d=c;l.beginPath(),l.moveTo(_.et*a,_.rt*o);for(let h=s.from+1;h=s.from;--n){const s=i[n];if(s){const i=e(t,s);i!==a&&(l.beginPath(),null!==a&&l.fill(),l.fillStyle=i,a=i);const n=Math.round(s.et*r)+o,u=s.rt*h;l.moveTo(n,u),l.arc(n,u,_,0,2*Math.PI)}}l.fill()}(t,i,l,n,o)}}class Pt extends Tt{Ds(t,i){return i._t}}function Rt(t,i,n,s,e=0,r=i.length){let h=r-e;for(;0>1,l=e+r;s(i[l],n)===t?(e=l+1,h-=r+1):h=r}return e}const Dt=Rt.bind(null,!0),Ot=Rt.bind(null,!1);function At(t,i){return t.ut0&&r=s&&(l=r-1),h>0&&hObject.assign(Object.assign({},t),this.Is.$s().Hs(t.ut))))}Us(){this.Es=null}Fs(){this.Vs&&(this.qs(),this.Vs=!1),this.Bs&&(this.js(),this.Bs=!1),this.As&&(this.Ys(),this.As=!1)}Ys(){const t=this.Is.At(),i=this.Ls.kt();if(this.Us(),i.Fi()||t.Fi())return;const n=i.Xs();if(null===n)return;if(0===this.Is.zn().Ks())return;const s=this.Is.Pt();null!==s&&(this.Es=Bt(this.zs,n,this.Ns),this.Zs(t,i,s.Vt),this.Gs())}}class Et extends zt{constructor(t,i){super(t,i,!0)}Zs(t,i,n){i.Js(this.zs,V(this.Es)),t.Qs(this.zs,n,V(this.Es))}te(t,i){return{ut:t,ct:i,et:NaN,rt:NaN}}qs(){const t=this.Is.$s();this.zs=this.Is.zn().ie().map((i=>{const n=i.Vt[3];return this.ne(i.se,n,t)}))}}class It extends Et{constructor(t,i){super(t,i),this.Ws=new I,this.ee=new kt,this.re=new Pt,this.Ws.X([this.ee,this.re])}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Is.W();this.ee.it({ds:t.lineType,st:this.zs,Wt:t.lineStyle,ht:t.lineWidth,fs:null,vs:t.invertFilledArea,nt:this.Es,cs:this.Ls.kt().he()}),this.re.it({ds:t.lineVisible?t.lineType:void 0,st:this.zs,Wt:t.lineStyle,ht:t.lineWidth,nt:this.Es,cs:this.Ls.kt().he(),Rs:t.pointMarkersVisible?t.pointMarkersRadius||t.lineWidth/2+2:void 0})}}class Lt extends H{constructor(){super(...arguments),this.Lt=null,this.le=0,this.ae=0}it(t){this.Lt=t}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.Lt||0===this.Lt.zn.length||null===this.Lt.nt)return;if(this.le=this.oe(i),this.le>=2){Math.max(1,Math.floor(i))%2!=this.le%2&&this.le--}this.ae=this.Lt._e?Math.min(this.le,Math.floor(i)):this.le;let s=null;const e=this.ae<=this.le&&this.Lt.he>=Math.floor(1.5*i);for(let r=this.Lt.nt.from;rf+p-1&&(e=f+p-1,s=e-_+1),t.fillRect(i,s,o-i,e-s+1)}const i=a+m;let s=Math.max(f,Math.round(h.pe*n)-l),e=s+_-1;e>f+p-1&&(e=f+p-1,s=e-_+1),t.fillRect(u+1,s,i-u,e-s+1)}}}oe(t){const i=Math.floor(t);return Math.max(i,Math.floor(function(t,i){return Math.floor(.3*t*i)}(f(this.Lt).he,t)))}}class Nt extends zt{constructor(t,i){super(t,i,!1)}Zs(t,i,n){i.Js(this.zs,V(this.Es)),t.me(this.zs,n,V(this.Es))}be(t,i,n){return{ut:t,we:i.Vt[0],ge:i.Vt[1],Me:i.Vt[2],xe:i.Vt[3],et:NaN,ve:NaN,ce:NaN,de:NaN,pe:NaN}}qs(){const t=this.Is.$s();this.zs=this.Is.zn().ie().map((i=>this.ne(i.se,i,t)))}}class Ft extends Nt{constructor(){super(...arguments),this.Ws=new Lt}ne(t,i,n){return Object.assign(Object.assign({},this.be(t,i,n)),n.Hs(t))}Gs(){const t=this.Is.W();this.Ws.it({zn:this.zs,he:this.Ls.kt().he(),fe:t.openVisible,_e:t.thinBars,nt:this.Es})}}class Wt extends gt{constructor(){super(...arguments),this.Cs=new yt}ps(t,i){const n=this.tt;return this.Cs.bs(t,{gs:i.Se,Ms:i.ye,xs:i.ke,Ss:i.Ce,ys:t.bitmapSize.height,fs:n.fs})}}class jt extends Tt{constructor(){super(...arguments),this.Te=new yt}Ds(t,i){const n=this.tt;return this.Te.bs(t,{gs:i.Pe,Ms:i.Pe,xs:i.Re,Ss:i.Re,ys:t.bitmapSize.height,fs:n.fs})}}class Ht extends Et{constructor(t,i){super(t,i),this.Ws=new I,this.De=new Wt,this.Oe=new jt,this.Ws.X([this.De,this.Oe])}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Is.Pt();if(null===t)return;const i=this.Is.W(),n=this.Is.At().Ot(i.baseValue.price,t.Vt),s=this.Ls.kt().he();this.De.it({st:this.zs,ht:i.lineWidth,Wt:i.lineStyle,ds:i.lineType,fs:n,vs:!1,nt:this.Es,cs:s}),this.Oe.it({st:this.zs,ht:i.lineWidth,Wt:i.lineStyle,ds:i.lineVisible?i.lineType:void 0,Rs:i.pointMarkersVisible?i.pointMarkersRadius||i.lineWidth/2+2:void 0,fs:n,nt:this.Es,cs:s})}}class $t extends H{constructor(){super(...arguments),this.Lt=null,this.le=0}it(t){this.Lt=t}Z(t){if(null===this.Lt||0===this.Lt.zn.length||null===this.Lt.nt)return;const{horizontalPixelRatio:i}=t;if(this.le=function(t,i){if(t>=2.5&&t<=4)return Math.floor(3*i);const n=1-.2*Math.atan(Math.max(4,t)-4)/(.5*Math.PI),s=Math.floor(t*n*i),e=Math.floor(t*i),r=Math.min(s,e);return Math.max(Math.floor(i),r)}(this.Lt.he,i),this.le>=2){Math.floor(i)%2!=this.le%2&&this.le--}const n=this.Lt.zn;this.Lt.Ae&&this.Ve(t,n,this.Lt.nt),this.Lt.ci&&this.Be(t,n,this.Lt.nt);const s=this.ze(i);(!this.Lt.ci||this.le>2*s)&&this.Ee(t,n,this.Lt.nt)}Ve(t,i,n){if(null===this.Lt)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="",l=Math.min(Math.floor(e),Math.floor(this.Lt.he*e));l=Math.max(Math.floor(e),Math.min(l,this.le));const a=Math.floor(.5*l);let o=null;for(let t=n.from;t2*l)q(s,o,u,_-o+1,c-u+1,l);else{const t=_-o+1;s.fillRect(o,u,t,c-u+1)}a=_}}Ee(t,i,n){if(null===this.Lt)return;const{context:s,horizontalPixelRatio:e,verticalPixelRatio:r}=t;let h="";const l=this.ze(e);for(let t=n.from;to||s.fillRect(_,a,u-_+1,o-a+1)}}}class Ut extends Nt{constructor(){super(...arguments),this.Ws=new $t}ne(t,i,n){return Object.assign(Object.assign({},this.be(t,i,n)),n.Hs(t))}Gs(){const t=this.Is.W();this.Ws.it({zn:this.zs,he:this.Ls.kt().he(),Ae:t.wickVisible,ci:t.borderVisible,nt:this.Es})}}class qt{constructor(t,i){this.Ne=t,this.Li=i}K(t,i,n){this.Ne.draw(t,this.Li,i,n)}}class Yt extends zt{constructor(t,i,n){super(t,i,!1),this.wn=n,this.Ws=new qt(this.wn.renderer(),(i=>{const n=t.Pt();return null===n?null:t.At().Ot(i,n.Vt)}))}Fe(t){return this.wn.priceValueBuilder(t)}We(t){return this.wn.isWhitespace(t)}qs(){const t=this.Is.$s();this.zs=this.Is.zn().ie().map((i=>Object.assign(Object.assign({ut:i.se,et:NaN},t.Hs(i.se)),{je:i.He})))}Zs(t,i){i.Js(this.zs,V(this.Es))}Gs(){this.wn.update({bars:this.zs.map(Xt),barSpacing:this.Ls.kt().he(),visibleRange:this.Es},this.Is.W())}}function Xt(t){return{x:t.et,time:t.ut,originalData:t.je,barColor:t.ue}}class Kt extends H{constructor(){super(...arguments),this.Lt=null,this.$e=[]}it(t){this.Lt=t,this.$e=[]}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){if(null===this.Lt||0===this.Lt.st.length||null===this.Lt.nt)return;this.$e.length||this.Ue(i);const s=Math.max(1,Math.floor(n)),e=Math.round(this.Lt.qe*n)-Math.floor(s/2),r=e+s;for(let i=this.Lt.nt.from;is.Xe?s.di=n.Os-i-1:n.Os=s.di+i+1))}let s=Math.ceil(this.Lt.he*t);for(let t=this.Lt.nt.from;t0&&s<4)for(let t=this.Lt.nt.from;ts&&(i.Ye>i.Xe?i.di-=1:i.Os+=1)}}}class Zt extends Et{constructor(){super(...arguments),this.Ws=new Kt}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t={st:this.zs,he:this.Ls.kt().he(),nt:this.Es,qe:this.Is.At().Ot(this.Is.W().base,f(this.Is.Pt()).Vt)};this.Ws.it(t)}}class Gt extends Et{constructor(){super(...arguments),this.Ws=new Pt}ne(t,i,n){return Object.assign(Object.assign({},this.te(t,i)),n.Hs(t))}Gs(){const t=this.Is.W(),i={st:this.zs,Wt:t.lineStyle,ds:t.lineVisible?t.lineType:void 0,ht:t.lineWidth,Rs:t.pointMarkersVisible?t.pointMarkersRadius||t.lineWidth/2+2:void 0,nt:this.Es,cs:this.Ls.kt().he()};this.Ws.it(i)}}const Jt=/[2-9]/g;class Qt{constructor(t=50){this.Ke=0,this.Ze=1,this.Ge=1,this.Je={},this.Qe=new Map,this.tr=t}ir(){this.Ke=0,this.Qe.clear(),this.Ze=1,this.Ge=1,this.Je={}}Si(t,i,n){return this.nr(t,i,n).width}xi(t,i,n){const s=this.nr(t,i,n);return((s.actualBoundingBoxAscent||0)-(s.actualBoundingBoxDescent||0))/2}nr(t,i,n){const s=n||Jt,e=String(i).replace(s,"0");if(this.Qe.has(e))return d(this.Qe.get(e)).sr;if(this.Ke===this.tr){const t=this.Je[this.Ge];delete this.Je[this.Ge],this.Qe.delete(t),this.Ge++,this.Ke--}t.save(),t.textBaseline="middle";const r=t.measureText(e);return t.restore(),0===r.width&&i.length||(this.Qe.set(e,{sr:r,er:this.Ze}),this.Je[this.Ze]=e,this.Ke++,this.Ze++),r}}class ti{constructor(t){this.rr=null,this.k=null,this.hr="right",this.lr=t}ar(t,i,n){this.rr=t,this.k=i,this.hr=n}K(t){null!==this.k&&null!==this.rr&&this.rr.K(t,this.k,this.lr,this.hr)}}class ii{constructor(t,i,n){this._r=t,this.lr=new Qt(50),this.ur=i,this.F=n,this.j=-1,this.Ht=new ti(this.lr)}xt(){const t=this.F.cr(this.ur);if(null===t)return null;const i=t.dr(this.ur)?t.vr():this.ur.At();if(null===i)return null;const n=t.pr(i);if("overlay"===n)return null;const s=this.F.mr();return s.P!==this.j&&(this.j=s.P,this.lr.ir()),this.Ht.ar(this._r.Ei(),s,n),this.Ht}}class ni extends H{constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}br(t,i){var n;if(!(null===(n=this.Lt)||void 0===n?void 0:n.Tt))return null;const{rt:s,ht:e,wr:r}=this.Lt;return i>=s-e-7&&i<=s+e+7?{gr:this.Lt,wr:r}:null}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;if(!1===this.Lt.Tt)return;const e=Math.round(this.Lt.rt*s);e<0||e>i.height||(t.lineCap="butt",t.strokeStyle=this.Lt.O,t.lineWidth=Math.floor(this.Lt.ht*n),_(t,this.Lt.Wt),u(t,e,0,i.width))}}class si{constructor(t){this.Mr={rt:0,O:"rgba(0, 0, 0, 0)",ht:1,Wt:0,Tt:!1},this.Sr=new ni,this.bt=!0,this.Is=t,this.Ls=t.qt(),this.Sr.it(this.Mr)}gt(){this.bt=!0}xt(){return this.Is.Tt()?(this.bt&&(this.yr(),this.bt=!1),this.Sr):null}}class ei extends si{constructor(t){super(t)}yr(){this.Mr.Tt=!1;const t=this.Is.At(),i=t.kr().kr;if(2!==i&&3!==i)return;const n=this.Is.W();if(!n.baseLineVisible||!this.Is.Tt())return;const s=this.Is.Pt();null!==s&&(this.Mr.Tt=!0,this.Mr.rt=t.Ot(s.Vt,s.Vt),this.Mr.O=n.baseLineColor,this.Mr.ht=n.baseLineWidth,this.Mr.Wt=n.baseLineStyle)}}class ri extends H{constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}He(){return this.Lt}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:n}){const s=this.Lt;if(null===s)return;const e=Math.max(1,Math.floor(i)),r=e%2/2,h=Math.round(s.Xe.x*i)+r,l=s.Xe.y*n;t.fillStyle=s.Cr,t.beginPath();const a=Math.max(2,1.5*s.Tr)*i;t.arc(h,l,a,0,2*Math.PI,!1),t.fill(),t.fillStyle=s.Pr,t.beginPath(),t.arc(h,l,s.ot*i,0,2*Math.PI,!1),t.fill(),t.lineWidth=e,t.strokeStyle=s.Rr,t.beginPath(),t.arc(h,l,s.ot*i+e/2,0,2*Math.PI,!1),t.stroke()}}const hi=[{Dr:0,Or:.25,Ar:4,Vr:10,Br:.25,zr:0,Er:.4,Ir:.8},{Dr:.25,Or:.525,Ar:10,Vr:14,Br:0,zr:0,Er:.8,Ir:0},{Dr:.525,Or:1,Ar:14,Vr:14,Br:0,zr:0,Er:0,Ir:0}];function li(t,i,n,s){return function(t,i){if("transparent"===t)return t;const n=S(t),s=n[3];return`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${i*s})`}(t,n+(s-n)*i)}function ai(t,i){const n=t%2600/2600;let s;for(const t of hi)if(n>=t.Dr&&n<=t.Or){s=t;break}c(void 0!==s,"Last price animation internal logic error");const e=(n-s.Dr)/(s.Or-s.Dr);return{Pr:li(i,e,s.Br,s.zr),Rr:li(i,e,s.Er,s.Ir),ot:(r=e,h=s.Ar,l=s.Vr,h+(l-h)*r)};var r,h,l}class oi{constructor(t){this.Ht=new ri,this.bt=!0,this.Lr=!0,this.Nr=performance.now(),this.Fr=this.Nr-1,this.Wr=t}jr(){this.Fr=this.Nr-1,this.gt()}Hr(){if(this.gt(),2===this.Wr.W().lastPriceAnimation){const t=performance.now(),i=this.Fr-t;if(i>0)return void(i<650&&(this.Fr+=2600));this.Nr=t,this.Fr=t+2600}}gt(){this.bt=!0}$r(){this.Lr=!0}Tt(){return 0!==this.Wr.W().lastPriceAnimation}Ur(){switch(this.Wr.W().lastPriceAnimation){case 0:return!1;case 1:return!0;case 2:return performance.now()<=this.Fr}}xt(){return this.bt?(this.St(),this.bt=!1,this.Lr=!1):this.Lr&&(this.qr(),this.Lr=!1),this.Ht}St(){this.Ht.it(null);const t=this.Wr.qt().kt(),i=t.Xs(),n=this.Wr.Pt();if(null===i||null===n)return;const s=this.Wr.Yr(!0);if(s.Xr||!i.Kr(s.se))return;const e={x:t.It(s.se),y:this.Wr.At().Ot(s.ct,n.Vt)},r=s.O,h=this.Wr.W().lineWidth,l=ai(this.Zr(),r);this.Ht.it({Cr:r,Tr:h,Pr:l.Pr,Rr:l.Rr,ot:l.ot,Xe:e})}qr(){const t=this.Ht.He();if(null!==t){const i=ai(this.Zr(),t.Cr);t.Pr=i.Pr,t.Rr=i.Rr,t.ot=i.ot}}Zr(){return this.Ur()?performance.now()-this.Nr:2599}}function _i(t,i){return St(Math.min(Math.max(t,12),30)*i)}function ui(t,i){switch(t){case"arrowDown":case"arrowUp":return _i(i,1);case"circle":return _i(i,.8);case"square":return _i(i,.7)}}function ci(t){return function(t){const i=Math.ceil(t);return i%2!=0?i-1:i}(_i(t,1))}function di(t){return Math.max(_i(t,.1),3)}function fi(t,i,n,s,e){const r=ui("square",n),h=(r-1)/2,l=t-h,a=i-h;return s>=l&&s<=l+r&&e>=a&&e<=a+r}function vi(t,i,n,s,e){const r=(ui("arrowUp",e)-1)/2,h=(St(e/2)-1)/2;i.beginPath(),t?(i.moveTo(n-r,s),i.lineTo(n,s-r),i.lineTo(n+r,s),i.lineTo(n+h,s),i.lineTo(n+h,s+r),i.lineTo(n-h,s+r),i.lineTo(n-h,s)):(i.moveTo(n-r,s),i.lineTo(n,s+r),i.lineTo(n+r,s),i.lineTo(n+h,s),i.lineTo(n+h,s-r),i.lineTo(n-h,s-r),i.lineTo(n-h,s)),i.fill()}function pi(t,i,n,s,e,r){return fi(i,n,s,e,r)}class mi extends L{constructor(){super(...arguments),this.Lt=null,this.lr=new Qt,this.j=-1,this.H="",this.Gr=""}it(t){this.Lt=t}ar(t,i){this.j===t&&this.H===i||(this.j=t,this.H=i,this.Gr=z(t,i),this.lr.ir())}br(t,i){if(null===this.Lt||null===this.Lt.nt)return null;for(let n=this.Lt.nt.from;n=t&&e<=t+n&&r>=i-h&&r<=i+h}(t.Jt.et,t.Jt.rt,t.Jt.$i,t.Jt.Et,i,n))||function(t,i,n){if(0===t.Ks)return!1;switch(t.th){case"arrowDown":case"arrowUp":return pi(0,t.et,t.rt,t.Ks,i,n);case"circle":return function(t,i,n,s,e){const r=2+ui("circle",n)/2,h=t-s,l=i-e;return Math.sqrt(h*h+l*l)<=r}(t.et,t.rt,t.Ks,i,n);case"square":return fi(t.et,t.rt,t.Ks,i,n)}}(t,i,n)}function gi(t,i,n,s,e,r,h,l,a){const o=T(n)?n:n.xe,_=T(n)?n:n.ge,u=T(n)?n:n.Me,c=T(i.size)?Math.max(i.size,0):1,d=ci(l.he())*c,f=d/2;switch(t.Ks=d,i.position){case"inBar":return t.rt=h.Ot(o,a),void(void 0!==t.Jt&&(t.Jt.rt=t.rt+f+r+.6*e));case"aboveBar":return t.rt=h.Ot(_,a)-f-s.ih,void 0!==t.Jt&&(t.Jt.rt=t.rt-f-.6*e,s.ih+=1.2*e),void(s.ih+=d+r);case"belowBar":return t.rt=h.Ot(u,a)+f+s.nh,void 0!==t.Jt&&(t.Jt.rt=t.rt+f+r+.6*e,s.nh+=1.2*e),void(s.nh+=d+r)}i.position}class Mi{constructor(t,i){this.bt=!0,this.sh=!0,this.eh=!0,this.rh=null,this.Ht=new mi,this.Wr=t,this.Ui=i,this.Lt={st:[],nt:null}}gt(t){this.bt=!0,this.eh=!0,"data"===t&&(this.sh=!0)}xt(t){if(!this.Wr.Tt())return null;this.bt&&this.hh();const i=this.Ui.W().layout;return this.Ht.ar(i.fontSize,i.fontFamily),this.Ht.it(this.Lt),this.Ht}lh(){if(this.eh){if(this.Wr.ah().length>0){const t=this.Ui.kt().he(),i=di(t),n=1.5*ci(t)+2*i;this.rh={above:n,below:n}}else this.rh=null;this.eh=!1}return this.rh}hh(){const t=this.Wr.At(),i=this.Ui.kt(),n=this.Wr.ah();this.sh&&(this.Lt.st=n.map((t=>({ut:t.time,et:0,rt:0,Ks:0,th:t.shape,O:t.color,Jr:t.Jr,wr:t.id,Jt:void 0}))),this.sh=!1);const s=this.Ui.W().layout;this.Lt.nt=null;const e=i.Xs();if(null===e)return;const r=this.Wr.Pt();if(null===r)return;if(0===this.Lt.st.length)return;let h=NaN;const l=di(i.he()),a={ih:l,nh:l};this.Lt.nt=Bt(this.Lt.st,e,!0);for(let e=this.Lt.nt.from;e0&&(_.Jt={Qr:o.text,et:0,rt:0,$i:0,Et:0});const u=this.Wr.oh(o.time);null!==u&&gi(_,o,u,a,s.fontSize,l,t,i,r.Vt)}this.bt=!1}}class xi extends si{constructor(t){super(t)}yr(){const t=this.Mr;t.Tt=!1;const i=this.Is.W();if(!i.priceLineVisible||!this.Is.Tt())return;const n=this.Is.Yr(0===i.priceLineSource);n.Xr||(t.Tt=!0,t.rt=n.ki,t.O=this.Is._h(n.O),t.ht=i.priceLineWidth,t.Wt=i.priceLineStyle)}}class Si extends Q{constructor(t){super(),this.$t=t}Ii(t,i,n){t.Tt=!1,i.Tt=!1;const s=this.$t;if(!s.Tt())return;const e=s.W(),r=e.lastValueVisible,h=""!==s.uh(),l=0===e.seriesLastValueMode,a=s.Yr(!1);if(a.Xr)return;r&&(t.Jt=this.dh(a,r,l),t.Tt=0!==t.Jt.length),(h||l)&&(i.Jt=this.fh(a,r,h,l),i.Tt=i.Jt.length>0);const o=s._h(a.O),_=y(o);n.t=_.t,n.ki=a.ki,i.Bt=s.qt().zt(a.ki/s.At().Et()),t.Bt=o,t.O=_.i,i.O=_.i}fh(t,i,n,s){let e="";const r=this.$t.uh();return n&&0!==r.length&&(e+=`${r} `),i&&s&&(e+=this.$t.At().ph()?t.mh:t.bh),e.trim()}dh(t,i,n){return i?n?this.$t.At().ph()?t.bh:t.mh:t.Jt:""}}function yi(t,i,n,s){const e=Number.isFinite(i),r=Number.isFinite(n);return e&&r?t(i,n):e||r?e?i:n:s}class ki{constructor(t,i){this.wh=t,this.gh=i}Mh(t){return null!==t&&(this.wh===t.wh&&this.gh===t.gh)}xh(){return new ki(this.wh,this.gh)}Sh(){return this.wh}yh(){return this.gh}kh(){return this.gh-this.wh}Fi(){return this.gh===this.wh||Number.isNaN(this.gh)||Number.isNaN(this.wh)}ts(t){return null===t?this:new ki(yi(Math.min,this.Sh(),t.Sh(),-1/0),yi(Math.max,this.yh(),t.yh(),1/0))}Ch(t){if(!T(t))return;if(0===this.gh-this.wh)return;const i=.5*(this.gh+this.wh);let n=this.gh-i,s=this.wh-i;n*=t,s*=t,this.gh=i+n,this.wh=i+s}Th(t){T(t)&&(this.gh+=t,this.wh+=t)}Ph(){return{minValue:this.wh,maxValue:this.gh}}static Rh(t){return null===t?null:new ki(t.minValue,t.maxValue)}}class Ci{constructor(t,i){this.Dh=t,this.Oh=i||null}Ah(){return this.Dh}Vh(){return this.Oh}Ph(){return null===this.Dh?null:{priceRange:this.Dh.Ph(),margins:this.Oh||void 0}}static Rh(t){return null===t?null:new Ci(ki.Rh(t.priceRange),t.margins)}}class Ti extends si{constructor(t,i){super(t),this.Bh=i}yr(){const t=this.Mr;t.Tt=!1;const i=this.Bh.W();if(!this.Is.Tt()||!i.lineVisible)return;const n=this.Bh.zh();null!==n&&(t.Tt=!0,t.rt=n,t.O=i.color,t.ht=i.lineWidth,t.Wt=i.lineStyle,t.wr=this.Bh.W().id)}}class Pi extends Q{constructor(t,i){super(),this.Wr=t,this.Bh=i}Ii(t,i,n){t.Tt=!1,i.Tt=!1;const s=this.Bh.W(),e=s.axisLabelVisible,r=""!==s.title,h=this.Wr;if(!e||!h.Tt())return;const l=this.Bh.zh();if(null===l)return;r&&(i.Jt=s.title,i.Tt=!0),i.Bt=h.qt().zt(l/h.At().Et()),t.Jt=this.Eh(s.price),t.Tt=!0;const a=y(s.axisLabelColor||s.color);n.t=a.t;const o=s.axisLabelTextColor||a.i;t.O=o,i.O=o,n.ki=l}Eh(t){const i=this.Wr.Pt();return null===i?"":this.Wr.At().Wi(t,i.Vt)}}class Ri{constructor(t,i){this.Wr=t,this.cn=i,this.Ih=new Ti(t,this),this._r=new Pi(t,this),this.Lh=new ii(this._r,t,t.qt())}Nh(t){C(this.cn,t),this.gt(),this.Wr.qt().Fh()}W(){return this.cn}Wh(){return this.Ih}jh(){return this.Lh}Hh(){return this._r}gt(){this.Ih.gt(),this._r.gt()}zh(){const t=this.Wr,i=t.At();if(t.qt().kt().Fi()||i.Fi())return null;const n=t.Pt();return null===n?null:i.Ot(this.cn.price,n.Vt)}}class Di extends et{constructor(t){super(),this.Ui=t}qt(){return this.Ui}}const Oi={Bar:(t,i,n,s)=>{var e;const r=i.upColor,h=i.downColor,l=f(t(n,s)),a=v(l.Vt[0])<=v(l.Vt[3]);return{ue:null!==(e=l.O)&&void 0!==e?e:a?r:h}},Candlestick:(t,i,n,s)=>{var e,r,h;const l=i.upColor,a=i.downColor,o=i.borderUpColor,_=i.borderDownColor,u=i.wickUpColor,c=i.wickDownColor,d=f(t(n,s)),p=v(d.Vt[0])<=v(d.Vt[3]);return{ue:null!==(e=d.O)&&void 0!==e?e:p?l:a,Le:null!==(r=d.Bt)&&void 0!==r?r:p?o:_,Ie:null!==(h=d.$h)&&void 0!==h?h:p?u:c}},Custom:(t,i,n,s)=>{var e;return{ue:null!==(e=f(t(n,s)).O)&&void 0!==e?e:i.color}},Area:(t,i,n,s)=>{var e,r,h,l;const a=f(t(n,s));return{ue:null!==(e=a._t)&&void 0!==e?e:i.lineColor,_t:null!==(r=a._t)&&void 0!==r?r:i.lineColor,Ts:null!==(h=a.Ts)&&void 0!==h?h:i.topColor,Ps:null!==(l=a.Ps)&&void 0!==l?l:i.bottomColor}},Baseline:(t,i,n,s)=>{var e,r,h,l,a,o;const _=f(t(n,s));return{ue:_.Vt[3]>=i.baseValue.price?i.topLineColor:i.bottomLineColor,Pe:null!==(e=_.Pe)&&void 0!==e?e:i.topLineColor,Re:null!==(r=_.Re)&&void 0!==r?r:i.bottomLineColor,Se:null!==(h=_.Se)&&void 0!==h?h:i.topFillColor1,ye:null!==(l=_.ye)&&void 0!==l?l:i.topFillColor2,ke:null!==(a=_.ke)&&void 0!==a?a:i.bottomFillColor1,Ce:null!==(o=_.Ce)&&void 0!==o?o:i.bottomFillColor2}},Line:(t,i,n,s)=>{var e,r;const h=f(t(n,s));return{ue:null!==(e=h.O)&&void 0!==e?e:i.color,_t:null!==(r=h.O)&&void 0!==r?r:i.color}},Histogram:(t,i,n,s)=>{var e;return{ue:null!==(e=f(t(n,s)).O)&&void 0!==e?e:i.color}}};class Ai{constructor(t){this.Uh=(t,i)=>void 0!==i?i.Vt:this.Wr.zn().qh(t),this.Wr=t,this.Yh=Oi[t.Xh()]}Hs(t,i){return this.Yh(this.Uh,this.Wr.W(),t,i)}}var Vi;!function(t){t[t.NearestLeft=-1]="NearestLeft",t[t.None=0]="None",t[t.NearestRight=1]="NearestRight"}(Vi||(Vi={}));const Bi=30;class zi{constructor(){this.Kh=[],this.Zh=new Map,this.Gh=new Map}Jh(){return this.Ks()>0?this.Kh[this.Kh.length-1]:null}Qh(){return this.Ks()>0?this.tl(0):null}Bn(){return this.Ks()>0?this.tl(this.Kh.length-1):null}Ks(){return this.Kh.length}Fi(){return 0===this.Ks()}Kr(t){return null!==this.il(t,0)}qh(t){return this.nl(t)}nl(t,i=0){const n=this.il(t,i);return null===n?null:Object.assign(Object.assign({},this.sl(n)),{se:this.tl(n)})}ie(){return this.Kh}el(t,i,n){if(this.Fi())return null;let s=null;for(const e of n){s=Ei(s,this.rl(t,i,e))}return s}it(t){this.Gh.clear(),this.Zh.clear(),this.Kh=t}tl(t){return this.Kh[t].se}sl(t){return this.Kh[t]}il(t,i){const n=this.hl(t);if(null===n&&0!==i)switch(i){case-1:return this.ll(t);case 1:return this.al(t);default:throw new TypeError("Unknown search mode")}return n}ll(t){let i=this.ol(t);return i>0&&(i-=1),i!==this.Kh.length&&this.tl(i)t.set.se>i))}ul(t,i,n){let s=null;for(let e=t;es.dl&&(s.dl=t)))}return s}rl(t,i,n){if(this.Fi())return null;let s=null;const e=f(this.Qh()),r=f(this.Bn()),h=Math.max(t,e),l=Math.min(i,r),a=Math.ceil(h/Bi)*Bi,o=Math.max(a,Math.floor(l/Bi)*Bi);{const t=this.ol(h),e=this._l(Math.min(l,a,i));s=Ei(s,this.ul(t,e,n))}let _=this.Zh.get(n);void 0===_&&(_=new Map,this.Zh.set(n,_));for(let t=Math.max(a+1,h);tnew Li(t)));return this.gl={vl:e,pl:r},r}tn(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.kl).timeAxisViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.Ml)||void 0===s?void 0:s.vl)===e)return this.Ml.pl;const r=this.Wr.qt().kt(),h=e.map((t=>new Fi(t,r)));return this.Ml={vl:e,pl:h},h}Rn(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.kl).priceAxisViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.xl)||void 0===s?void 0:s.vl)===e)return this.xl.pl;const r=this.Wr.At(),h=e.map((t=>new Wi(t,r)));return this.xl={vl:e,pl:h},h}Tl(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.kl).priceAxisPaneViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.Sl)||void 0===s?void 0:s.vl)===e)return this.Sl.pl;const r=e.map((t=>new Li(t)));return this.Sl={vl:e,pl:r},r}Pl(){var t,i,n,s;const e=null!==(n=null===(i=(t=this.kl).timeAxisPaneViews)||void 0===i?void 0:i.call(t))&&void 0!==n?n:[];if((null===(s=this.yl)||void 0===s?void 0:s.vl)===e)return this.yl.pl;const r=e.map((t=>new Li(t)));return this.yl={vl:e,pl:r},r}Rl(t,i){var n,s,e;return null!==(e=null===(s=(n=this.kl).autoscaleInfo)||void 0===s?void 0:s.call(n,t,i))&&void 0!==e?e:null}br(t,i){var n,s,e;return null!==(e=null===(s=(n=this.kl).hitTest)||void 0===s?void 0:s.call(n,t,i))&&void 0!==e?e:null}}function Hi(t,i,n,s){t.forEach((t=>{i(t).forEach((t=>{t.ml()===n&&s.push(t)}))}))}function $i(t){return t.Pn()}function Ui(t){return t.Tl()}function qi(t){return t.Pl()}class Yi extends Di{constructor(t,i,n,s,e){super(t),this.Lt=new zi,this.Ih=new xi(this),this.Dl=[],this.Ol=new ei(this),this.Al=null,this.Vl=null,this.Bl=[],this.zl=[],this.El=null,this.Il=[],this.cn=i,this.Ll=n;const r=new Si(this);this.hn=[r],this.Lh=new ii(r,this,t),"Area"!==n&&"Line"!==n&&"Baseline"!==n||(this.Al=new oi(this)),this.Nl(),this.Fl(e)}S(){null!==this.El&&clearTimeout(this.El)}_h(t){return this.cn.priceLineColor||t}Yr(t){const i={Xr:!0},n=this.At();if(this.qt().kt().Fi()||n.Fi()||this.Lt.Fi())return i;const s=this.qt().kt().Xs(),e=this.Pt();if(null===s||null===e)return i;let r,h;if(t){const t=this.Lt.Jh();if(null===t)return i;r=t,h=t.se}else{const t=this.Lt.nl(s.di(),-1);if(null===t)return i;if(r=this.Lt.qh(t.se),null===r)return i;h=t.se}const l=r.Vt[3],a=this.$s().Hs(h,{Vt:r}),o=n.Ot(l,e.Vt);return{Xr:!1,ct:l,Jt:n.Wi(l,e.Vt),mh:n.Wl(l),bh:n.jl(l,e.Vt),O:a.ue,ki:o,se:h}}$s(){return null!==this.Vl||(this.Vl=new Ai(this)),this.Vl}W(){return this.cn}Nh(t){const i=t.priceScaleId;void 0!==i&&i!==this.cn.priceScaleId&&this.qt().Hl(this,i),C(this.cn,t),void 0!==t.priceFormat&&(this.Nl(),this.qt().$l()),this.qt().Ul(this),this.qt().ql(),this.wn.gt("options")}it(t,i){this.Lt.it(t),this.Yl(),this.wn.gt("data"),this.dn.gt("data"),null!==this.Al&&(i&&i.Xl?this.Al.Hr():0===t.length&&this.Al.jr());const n=this.qt().cr(this);this.qt().Kl(n),this.qt().Ul(this),this.qt().ql(),this.qt().Fh()}Zl(t){this.Bl=t,this.Yl();const i=this.qt().cr(this);this.dn.gt("data"),this.qt().Kl(i),this.qt().Ul(this),this.qt().ql(),this.qt().Fh()}Gl(){return this.Bl}ah(){return this.zl}Jl(t){const i=new Ri(this,t);return this.Dl.push(i),this.qt().Ul(this),i}Ql(t){const i=this.Dl.indexOf(t);-1!==i&&this.Dl.splice(i,1),this.qt().Ul(this)}Xh(){return this.Ll}Pt(){const t=this.ta();return null===t?null:{Vt:t.Vt[3],ia:t.ut}}ta(){const t=this.qt().kt().Xs();if(null===t)return null;const i=t.Os();return this.Lt.nl(i,1)}zn(){return this.Lt}oh(t){const i=this.Lt.qh(t);return null===i?null:"Bar"===this.Ll||"Candlestick"===this.Ll||"Custom"===this.Ll?{we:i.Vt[0],ge:i.Vt[1],Me:i.Vt[2],xe:i.Vt[3]}:i.Vt[3]}na(t){const i=[];Hi(this.Il,$i,"top",i);const n=this.Al;return null!==n&&n.Tt()?(null===this.El&&n.Ur()&&(this.El=setTimeout((()=>{this.El=null,this.qt().sa()}),0)),n.$r(),i.push(n),i):i}Pn(){const t=[];this.ea()||t.push(this.Ol),t.push(this.wn,this.Ih,this.dn);const i=this.Dl.map((t=>t.Wh()));return t.push(...i),Hi(this.Il,$i,"normal",t),t}ra(){return this.ha($i,"bottom")}la(t){return this.ha(Ui,t)}aa(t){return this.ha(qi,t)}oa(t,i){return this.Il.map((n=>n.br(t,i))).filter((t=>null!==t))}Qi(t){return[this.Lh,...this.Dl.map((t=>t.jh()))]}Rn(t,i){if(i!==this.Xi&&!this.ea())return[];const n=[...this.hn];for(const t of this.Dl)n.push(t.Hh());return this.Il.forEach((t=>{n.push(...t.Rn())})),n}tn(){const t=[];return this.Il.forEach((i=>{t.push(...i.tn())})),t}Rl(t,i){if(void 0!==this.cn.autoscaleInfoProvider){const n=this.cn.autoscaleInfoProvider((()=>{const n=this._a(t,i);return null===n?null:n.Ph()}));return Ci.Rh(n)}return this._a(t,i)}ua(){return this.cn.priceFormat.minMove}ca(){return this.da}On(){var t;this.wn.gt(),this.dn.gt();for(const t of this.hn)t.gt();for(const t of this.Dl)t.gt();this.Ih.gt(),this.Ol.gt(),null===(t=this.Al)||void 0===t||t.gt(),this.Il.forEach((t=>t.On()))}At(){return f(super.At())}Ct(t){if(!(("Line"===this.Ll||"Area"===this.Ll||"Baseline"===this.Ll)&&this.cn.crosshairMarkerVisible))return null;const i=this.Lt.qh(t);if(null===i)return null;return{ct:i.Vt[3],ot:this.fa(),Bt:this.va(),Dt:this.pa(),Rt:this.ma(t)}}uh(){return this.cn.title}Tt(){return this.cn.visible}ba(t){this.Il.push(new ji(t,this))}wa(t){this.Il=this.Il.filter((i=>i.Cl()!==t))}ga(){if(this.wn instanceof Yt!=!1)return t=>this.wn.Fe(t)}Ma(){if(this.wn instanceof Yt!=!1)return t=>this.wn.We(t)}ea(){return!lt(this.At().xa())}_a(t,i){if(!P(t)||!P(i)||this.Lt.Fi())return null;const n="Line"===this.Ll||"Area"===this.Ll||"Baseline"===this.Ll||"Histogram"===this.Ll?[3]:[2,1],s=this.Lt.el(t,i,n);let e=null!==s?new ki(s.cl,s.dl):null;if("Histogram"===this.Xh()){const t=this.cn.base,i=new ki(t,t);e=null!==e?e.ts(i):i}let r=this.dn.lh();return this.Il.forEach((n=>{const s=n.Rl(t,i);if(null==s?void 0:s.priceRange){const t=new ki(s.priceRange.minValue,s.priceRange.maxValue);e=null!==e?e.ts(t):t}var h,l,a,o;(null==s?void 0:s.margins)&&(h=r,l=s.margins,r={above:Math.max(null!==(a=null==h?void 0:h.above)&&void 0!==a?a:0,l.above),below:Math.max(null!==(o=null==h?void 0:h.below)&&void 0!==o?o:0,l.below)})})),new Ci(e,r)}fa(){switch(this.Ll){case"Line":case"Area":case"Baseline":return this.cn.crosshairMarkerRadius}return 0}va(){switch(this.Ll){case"Line":case"Area":case"Baseline":{const t=this.cn.crosshairMarkerBorderColor;if(0!==t.length)return t}}return null}pa(){switch(this.Ll){case"Line":case"Area":case"Baseline":return this.cn.crosshairMarkerBorderWidth}return 0}ma(t){switch(this.Ll){case"Line":case"Area":case"Baseline":{const t=this.cn.crosshairMarkerBackgroundColor;if(0!==t.length)return t}}return this.$s().Hs(t).ue}Nl(){switch(this.cn.priceFormat.type){case"custom":this.da={format:this.cn.priceFormat.formatter};break;case"volume":this.da=new dt(this.cn.priceFormat.precision);break;case"percent":this.da=new ct(this.cn.priceFormat.precision);break;default:{const t=Math.pow(10,this.cn.priceFormat.precision);this.da=new ut(t,this.cn.priceFormat.minMove*t)}}null!==this.Xi&&this.Xi.Sa()}Yl(){const t=this.qt().kt();if(!t.ya()||this.Lt.Fi())return void(this.zl=[]);const i=f(this.Lt.Qh());this.zl=this.Bl.map(((n,s)=>{const e=f(t.ka(n.time,!0)),r=et instanceof Yi)).reduce(((t,s)=>{if(n.dr(s)||!s.Tt())return t;const e=s.At(),r=s.zn();if(e.Fi()||!r.Kr(i))return t;const h=r.qh(i);if(null===h)return t;const l=v(s.Pt());return t.concat([e.Ot(h.Vt[3],l.Vt)])}),[]);if(0===l.length)return s;l.sort(((t,i)=>Math.abs(t-h)-Math.abs(i-h)));const a=l[0];return s=e.pn(a,r),s}}class Ki extends H{constructor(){super(...arguments),this.Lt=null}it(t){this.Lt=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(null===this.Lt)return;const e=Math.max(1,Math.floor(n));t.lineWidth=e,function(t,i){t.save(),t.lineWidth%2&&t.translate(.5,.5),i(),t.restore()}(t,(()=>{const r=f(this.Lt);if(5!==r.Pa){if(r.Ra){t.strokeStyle=r.Da,_(t,r.Pa),t.beginPath();for(const s of r.Oa){const r=Math.round(s.Aa*n);t.moveTo(r,-e),t.lineTo(r,i.height+e)}t.stroke()}if(r.Va){t.strokeStyle=r.Ba,_(t,r.za),t.beginPath();for(const n of r.Ea){const r=Math.round(n.Aa*s);t.moveTo(-e,r),t.lineTo(i.width+e,r)}t.stroke()}}else{if(!r.Ra||!r.Va)return;t.fillStyle=r.Da,_(t,r.Pa),t.beginPath();const i=r.Ea.length>1?r.Ea[1].Aa-r.Ea[0].Aa:void 0;let e;for(let h=0;h1.7*i;e=o;for(let i=0;i({Aa:t.coord})))};this.Ht.it(i),this.bt=!1}return this.Ht}}class Gi{constructor(t){this.wn=new Zi(t)}Wh(){return this.wn}}const Ji={La:4,Na:1e-4};function Qi(t,i){const n=100*(t-i)/i;return i<0?-n:n}function tn(t,i){const n=Qi(t.Sh(),i),s=Qi(t.yh(),i);return new ki(n,s)}function nn(t,i){const n=100*(t-i)/i+100;return i<0?-n:n}function sn(t,i){const n=nn(t.Sh(),i),s=nn(t.yh(),i);return new ki(n,s)}function en(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.log10(n+i.Na)+i.La;return t<0?-s:s}function rn(t,i){const n=Math.abs(t);if(n<1e-15)return 0;const s=Math.pow(10,n-i.La)-i.Na;return t<0?-s:s}function hn(t,i){if(null===t)return null;const n=en(t.Sh(),i),s=en(t.yh(),i);return new ki(n,s)}function ln(t,i){if(null===t)return null;const n=rn(t.Sh(),i),s=rn(t.yh(),i);return new ki(n,s)}function an(t){if(null===t)return Ji;const i=Math.abs(t.yh()-t.Sh());if(i>=1||i<1e-15)return Ji;const n=Math.ceil(Math.abs(Math.log10(i))),s=Ji.La+n;return{La:s,Na:1/Math.pow(10,s)}}class on{constructor(t,i){if(this.Fa=t,this.Wa=i,function(t){if(t<0)return!1;for(let i=t;i>1;i/=10)if(i%10!=0)return!1;return!0}(this.Fa))this.ja=[2,2.5,2];else{this.ja=[];for(let t=this.Fa;1!==t;){if(t%2==0)this.ja.push(2),t/=2;else{if(t%5!=0)throw new Error("unexpected base");this.ja.push(2,2.5),t/=5}if(this.ja.length>100)throw new Error("something wrong with base")}}}Ha(t,i,n){const s=0===this.Fa?0:1/this.Fa;let e=Math.pow(10,Math.max(0,Math.ceil(Math.log10(t-i)))),r=0,h=this.Wa[0];for(;;){const t=xt(e,s,1e-14)&&e>s+1e-14,i=xt(e,n*h,1e-14),l=xt(e,1,1e-14);if(!(t&&i&&l))break;e/=h,h=this.Wa[++r%this.Wa.length]}if(e<=s+1e-14&&(e=s),e=Math.max(1,e),this.ja.length>0&&(l=e,a=1,o=1e-14,Math.abs(l-a)s+1e-14;)e/=h,h=this.ja[++r%this.ja.length];var l,a,o;return e}}class _n{constructor(t,i,n,s){this.$a=[],this.Li=t,this.Fa=i,this.Ua=n,this.qa=s}Ha(t,i){if(t=o?1:-1;let d=null,f=0;for(let n=a-u;n>o;n-=_){const s=this.qa(n,i,!0);null!==d&&Math.abs(s-d)l||(ff(t.Zi())-f(i.Zi())))}var cn;!function(t){t[t.Normal=0]="Normal",t[t.Logarithmic=1]="Logarithmic",t[t.Percentage=2]="Percentage",t[t.IndexedTo100=3]="IndexedTo100"}(cn||(cn={}));const dn=new ct,fn=new ut(100,1);class vn{constructor(t,i,n,s){this.Qa=0,this.io=null,this.Dh=null,this.no=null,this.so={eo:!1,ro:null},this.ho=0,this.lo=0,this.ao=new k,this.oo=new k,this._o=[],this.uo=null,this.co=null,this.do=null,this.fo=null,this.da=fn,this.vo=an(null),this.po=t,this.cn=i,this.mo=n,this.bo=s,this.wo=new _n(this,100,this.Mo.bind(this),this.xo.bind(this))}xa(){return this.po}W(){return this.cn}Nh(t){if(C(this.cn,t),this.Sa(),void 0!==t.mode&&this.So({kr:t.mode}),void 0!==t.scaleMargins){const i=d(t.scaleMargins.top),n=d(t.scaleMargins.bottom);if(i<0||i>1)throw new Error(`Invalid top margin - expect value between 0 and 1, given=${i}`);if(n<0||n>1||i+n>1)throw new Error(`Invalid bottom margin - expect value between 0 and 1, given=${n}`);if(i+n>1)throw new Error(`Invalid margins - sum of margins must be less than 1, given=${i+n}`);this.yo(),this.co=null}}ko(){return this.cn.autoScale}Ja(){return 1===this.cn.mode}ph(){return 2===this.cn.mode}Co(){return 3===this.cn.mode}kr(){return{Wn:this.cn.autoScale,To:this.cn.invertScale,kr:this.cn.mode}}So(t){const i=this.kr();let n=null;void 0!==t.Wn&&(this.cn.autoScale=t.Wn),void 0!==t.kr&&(this.cn.mode=t.kr,2!==t.kr&&3!==t.kr||(this.cn.autoScale=!0),this.so.eo=!1),1===i.kr&&t.kr!==i.kr&&(!function(t,i){if(null===t)return!1;const n=rn(t.Sh(),i),s=rn(t.yh(),i);return isFinite(n)&&isFinite(s)}(this.Dh,this.vo)?this.cn.autoScale=!0:(n=ln(this.Dh,this.vo),null!==n&&this.Po(n))),1===t.kr&&t.kr!==i.kr&&(n=hn(this.Dh,this.vo),null!==n&&this.Po(n));const s=i.kr!==this.cn.mode;s&&(2===i.kr||this.ph())&&this.Sa(),s&&(3===i.kr||this.Co())&&this.Sa(),void 0!==t.To&&i.To!==t.To&&(this.cn.invertScale=t.To,this.Ro()),this.oo.m(i,this.kr())}Do(){return this.oo}P(){return this.mo.fontSize}Et(){return this.Qa}Oo(t){this.Qa!==t&&(this.Qa=t,this.yo(),this.co=null)}Ao(){if(this.io)return this.io;const t=this.Et()-this.Vo()-this.Bo();return this.io=t,t}Ah(){return this.zo(),this.Dh}Po(t,i){const n=this.Dh;(i||null===n&&null!==t||null!==n&&!n.Mh(t))&&(this.co=null,this.Dh=t)}Fi(){return this.zo(),0===this.Qa||!this.Dh||this.Dh.Fi()}Eo(t){return this.To()?t:this.Et()-1-t}Ot(t,i){return this.ph()?t=Qi(t,i):this.Co()&&(t=nn(t,i)),this.xo(t,i)}Qs(t,i,n){this.zo();const s=this.Bo(),e=f(this.Ah()),r=e.Sh(),h=e.yh(),l=this.Ao()-1,a=this.To(),o=l/(h-r),_=void 0===n?0:n.from,u=void 0===n?t.length:n.to,c=this.Io();for(let n=_;nt.On()))}Sa(){this.co=null;const t=this.Jo();let i=100;null!==t&&(i=Math.round(1/t.ua())),this.da=fn,this.ph()?(this.da=dn,i=100):this.Co()?(this.da=new ut(100,1),i=100):null!==t&&(this.da=t.ca()),this.wo=new _n(this,i,this.Mo.bind(this),this.xo.bind(this)),this.wo.Xa()}Wo(){this.uo=null}Jo(){return this._o[0]||null}Vo(){return this.To()?this.cn.scaleMargins.bottom*this.Et()+this.lo:this.cn.scaleMargins.top*this.Et()+this.ho}Bo(){return this.To()?this.cn.scaleMargins.top*this.Et()+this.ho:this.cn.scaleMargins.bottom*this.Et()+this.lo}zo(){this.so.eo||(this.so.eo=!0,this.i_())}yo(){this.io=null}xo(t,i){if(this.zo(),this.Fi())return 0;t=this.Ja()&&t?en(t,this.vo):t;const n=f(this.Ah()),s=this.Bo()+(this.Ao()-1)*(t-n.Sh())/n.kh();return this.Eo(s)}Mo(t,i){if(this.zo(),this.Fi())return 0;const n=this.Eo(t),s=f(this.Ah()),e=s.Sh()+s.kh()*((n-this.Bo())/(this.Ao()-1));return this.Ja()?rn(e,this.vo):e}Ro(){this.co=null,this.wo.Xa()}i_(){const t=this.so.ro;if(null===t)return;let i=null;const n=this.Qo();let s=0,e=0;for(const r of n){if(!r.Tt())continue;const n=r.Pt();if(null===n)continue;const h=r.Rl(t.Os(),t.di());let l=h&&h.Ah();if(null!==l){switch(this.cn.mode){case 1:l=hn(l,this.vo);break;case 2:l=tn(l,n.Vt);break;case 3:l=sn(l,n.Vt)}if(i=null===i?l:i.ts(f(l)),null!==h){const t=h.Vh();null!==t&&(s=Math.max(s,t.above),e=Math.max(s,t.below))}}}if(s===this.ho&&e===this.lo||(this.ho=s,this.lo=e,this.co=null,this.yo()),null!==i){if(i.Sh()===i.yh()){const t=this.Jo(),n=5*(null===t||this.ph()||this.Co()?1:t.ua());this.Ja()&&(i=ln(i,this.vo)),i=new ki(i.Sh()-n,i.yh()+n),this.Ja()&&(i=hn(i,this.vo))}if(this.Ja()){const t=ln(i,this.vo),n=an(t);if(r=n,h=this.vo,r.La!==h.La||r.Na!==h.Na){const s=null!==this.no?ln(this.no,this.vo):null;this.vo=n,i=hn(t,n),null!==s&&(this.no=hn(s,n))}}this.Po(i)}else null===this.Dh&&(this.Po(new ki(-.5,.5)),this.vo=an(null));var r,h;this.so.eo=!0}Io(){return this.ph()?Qi:this.Co()?nn:this.Ja()?t=>en(t,this.vo):null}n_(t,i,n){return void 0===i?(void 0===n&&(n=this.ca()),n.format(t)):i(t)}Eh(t,i){return this.n_(t,this.bo.priceFormatter,i)}Go(t,i){return this.n_(t,this.bo.percentageFormatter,i)}}class pn{constructor(t,i){this._o=[],this.s_=new Map,this.Qa=0,this.e_=0,this.r_=1e3,this.uo=null,this.h_=new k,this.wl=t,this.Ui=i,this.l_=new Gi(this);const n=i.W();this.a_=this.o_("left",n.leftPriceScale),this.__=this.o_("right",n.rightPriceScale),this.a_.Do().l(this.u_.bind(this,this.a_),this),this.__.Do().l(this.u_.bind(this,this.__),this),this.c_(n)}c_(t){if(t.leftPriceScale&&this.a_.Nh(t.leftPriceScale),t.rightPriceScale&&this.__.Nh(t.rightPriceScale),t.localization&&(this.a_.Sa(),this.__.Sa()),t.overlayPriceScales){const i=Array.from(this.s_.values());for(const n of i){const i=f(n[0].At());i.Nh(t.overlayPriceScales),t.localization&&i.Sa()}}}d_(t){switch(t){case"left":return this.a_;case"right":return this.__}return this.s_.has(t)?d(this.s_.get(t))[0].At():null}S(){this.qt().f_().p(this),this.a_.Do().p(this),this.__.Do().p(this),this._o.forEach((t=>{t.S&&t.S()})),this.h_.m()}v_(){return this.r_}p_(t){this.r_=t}qt(){return this.Ui}$i(){return this.e_}Et(){return this.Qa}m_(t){this.e_=t,this.b_()}Oo(t){this.Qa=t,this.a_.Oo(t),this.__.Oo(t),this._o.forEach((i=>{if(this.dr(i)){const n=i.At();null!==n&&n.Oo(t)}})),this.b_()}Ta(){return this._o}dr(t){const i=t.At();return null===i||this.a_!==i&&this.__!==i}Fo(t,i,n){const s=void 0!==n?n:this.g_().w_+1;this.M_(t,i,s)}jo(t){const i=this._o.indexOf(t);c(-1!==i,"removeDataSource: invalid data source"),this._o.splice(i,1);const n=f(t.At()).xa();if(this.s_.has(n)){const i=d(this.s_.get(n)),s=i.indexOf(t);-1!==s&&(i.splice(s,1),0===i.length&&this.s_.delete(n))}const s=t.At();s&&s.Ta().indexOf(t)>=0&&s.jo(t),null!==s&&(s.Wo(),this.x_(s)),this.uo=null}pr(t){return t===this.a_?"left":t===this.__?"right":"overlay"}S_(){return this.a_}y_(){return this.__}k_(t,i){t.Uo(i)}C_(t,i){t.qo(i),this.b_()}T_(t){t.Yo()}P_(t,i){t.Xo(i)}R_(t,i){t.Ko(i),this.b_()}D_(t){t.Zo()}b_(){this._o.forEach((t=>{t.On()}))}vn(){let t=null;return this.Ui.W().rightPriceScale.visible&&0!==this.__.Ta().length?t=this.__:this.Ui.W().leftPriceScale.visible&&0!==this.a_.Ta().length?t=this.a_:0!==this._o.length&&(t=this._o[0].At()),null===t&&(t=this.__),t}vr(){let t=null;return this.Ui.W().rightPriceScale.visible?t=this.__:this.Ui.W().leftPriceScale.visible&&(t=this.a_),t}x_(t){null!==t&&t.ko()&&this.O_(t)}A_(t){const i=this.wl.Xs();t.So({Wn:!0}),null!==i&&t.t_(i),this.b_()}V_(){this.O_(this.a_),this.O_(this.__)}B_(){this.x_(this.a_),this.x_(this.__),this._o.forEach((t=>{this.dr(t)&&this.x_(t.At())})),this.b_(),this.Ui.Fh()}No(){return null===this.uo&&(this.uo=un(this._o)),this.uo}z_(){return this.h_}E_(){return this.l_}O_(t){const i=t.Qo();if(i&&i.length>0&&!this.wl.Fi()){const i=this.wl.Xs();null!==i&&t.t_(i)}t.On()}g_(){const t=this.No();if(0===t.length)return{I_:0,w_:0};let i=0,n=0;for(let s=0;sn&&(n=e))}return{I_:i,w_:n}}M_(t,i,n){let s=this.d_(i);if(null===s&&(s=this.o_(i,this.Ui.W().overlayPriceScales)),this._o.push(t),!lt(i)){const n=this.s_.get(i)||[];n.push(t),this.s_.set(i,n)}s.Fo(t),t.Ji(s),t.Gi(n),this.x_(s),this.uo=null}u_(t,i,n){i.kr!==n.kr&&this.O_(t)}o_(t,i){const n=Object.assign({visible:!0,autoScale:!0},O(i)),s=new vn(t,n,this.Ui.W().layout,this.Ui.W().localization);return s.Oo(this.Et()),s}}class mn{constructor(t,i,n=50){this.Ke=0,this.Ze=1,this.Ge=1,this.Qe=new Map,this.Je=new Map,this.L_=t,this.N_=i,this.tr=n}F_(t){const i=t.time,n=this.N_.cacheKey(i),s=this.Qe.get(n);if(void 0!==s)return s.W_;if(this.Ke===this.tr){const t=this.Je.get(this.Ge);this.Je.delete(this.Ge),this.Qe.delete(d(t)),this.Ge++,this.Ke--}const e=this.L_(t);return this.Qe.set(n,{W_:e,er:this.Ze}),this.Je.set(this.Ze,n),this.Ke++,this.Ze++,e}}class bn{constructor(t,i){c(t<=i,"right should be >= left"),this.j_=t,this.H_=i}Os(){return this.j_}di(){return this.H_}U_(){return this.H_-this.j_+1}Kr(t){return this.j_<=t&&t<=this.H_}Mh(t){return this.j_===t.Os()&&this.H_===t.di()}}function wn(t,i){return null===t||null===i?t===i:t.Mh(i)}class gn{constructor(){this.q_=new Map,this.Qe=null,this.Y_=!1}X_(t){this.Y_=t,this.Qe=null}K_(t,i){this.Z_(i),this.Qe=null;for(let n=i;n{t<=n[0].index?i.push(s):n.splice(Dt(n,t,(i=>i.indexi-t))){if(!this.q_.get(n))continue;const s=i;i=[];const e=s.length;let r=0;const h=d(this.q_.get(n)),l=h.length;let a=1/0,o=-1/0;for(let n=0;n=t&&_-o>=t)i.push(l),o=_;else if(this.Y_)return s}for(;ri.weight?t:i}class Sn{constructor(t,i,n,s){this.e_=0,this.eu=null,this.ru=[],this.fo=null,this.do=null,this.hu=new gn,this.lu=new Map,this.au=Mn.su(),this.ou=!0,this._u=new k,this.uu=new k,this.cu=new k,this.du=null,this.fu=null,this.vu=[],this.cn=i,this.bo=n,this.pu=i.rightOffset,this.mu=i.barSpacing,this.Ui=t,this.N_=s,this.bu(),this.hu.X_(i.uniformDistribution)}W(){return this.cn}wu(t){C(this.bo,t),this.gu(),this.bu()}Nh(t,i){var n;C(this.cn,t),this.cn.fixLeftEdge&&this.Mu(),this.cn.fixRightEdge&&this.xu(),void 0!==t.barSpacing&&this.Ui.Gn(t.barSpacing),void 0!==t.rightOffset&&this.Ui.Jn(t.rightOffset),void 0!==t.minBarSpacing&&this.Ui.Gn(null!==(n=t.barSpacing)&&void 0!==n?n:this.mu),this.gu(),this.bu(),this.cu.m()}mn(t){var i,n;return null!==(n=null===(i=this.ru[t])||void 0===i?void 0:i.time)&&void 0!==n?n:null}qi(t){var i;return null!==(i=this.ru[t])&&void 0!==i?i:null}ka(t,i){if(this.ru.length<1)return null;if(this.N_.key(t)>this.N_.key(this.ru[this.ru.length-1].time))return i?this.ru.length-1:null;const n=Dt(this.ru,this.N_.key(t),((t,i)=>this.N_.key(t.time)0}Xs(){return this.Su(),this.au.iu()}yu(){return this.Su(),this.au.nu()}ku(){const t=this.Xs();if(null===t)return null;const i={from:t.Os(),to:t.di()};return this.Cu(i)}Cu(t){const i=Math.round(t.from),n=Math.round(t.to),s=f(this.Tu()),e=f(this.Pu());return{from:f(this.qi(Math.max(s,i))),to:f(this.qi(Math.min(e,n)))}}Ru(t){return{from:f(this.ka(t.from,!0)),to:f(this.ka(t.to,!0))}}$i(){return this.e_}m_(t){if(!isFinite(t)||t<=0)return;if(this.e_===t)return;const i=this.yu(),n=this.e_;if(this.e_=t,this.ou=!0,this.cn.lockVisibleTimeRangeOnResize&&0!==n){const i=this.mu*t/n;this.mu=i}if(this.cn.fixLeftEdge&&null!==i&&i.Os()<=0){const i=n-t;this.pu-=Math.round(i/this.mu)+1,this.ou=!0}this.Du(),this.Ou()}It(t){if(this.Fi()||!P(t))return 0;const i=this.Au()+this.pu-t;return this.e_-(i+.5)*this.mu-1}Js(t,i){const n=this.Au(),s=void 0===i?0:i.from,e=void 0===i?t.length:i.to;for(let i=s;ii/2&&!o?n.needAlignCoordinate=!1:n.needAlignCoordinate=_&&t.index<=l||u&&t.index>=a,c++}return this.vu.length=c,this.fu=this.vu,this.vu}Fu(){this.ou=!0,this.Gn(this.cn.barSpacing),this.Jn(this.cn.rightOffset)}Wu(t){this.ou=!0,this.eu=t,this.Ou(),this.Mu()}ju(t,i){const n=this.Bu(t),s=this.he(),e=s+i*(s/10);this.Gn(e),this.cn.rightBarStaysOnScroll||this.Jn(this.Iu()+(n-this.Bu(t)))}Uo(t){this.fo&&this.Zo(),null===this.do&&null===this.du&&(this.Fi()||(this.do=t,this.Hu()))}qo(t){if(null===this.du)return;const i=Mt(this.e_-t,0,this.e_),n=Mt(this.e_-f(this.do),0,this.e_);0!==i&&0!==n&&this.Gn(this.du.he*i/n)}Yo(){null!==this.do&&(this.do=null,this.$u())}Xo(t){null===this.fo&&null===this.du&&(this.Fi()||(this.fo=t,this.Hu()))}Ko(t){if(null===this.fo)return;const i=(this.fo-t)/this.he();this.pu=f(this.du).Iu+i,this.ou=!0,this.Ou()}Zo(){null!==this.fo&&(this.fo=null,this.$u())}Uu(){this.qu(this.cn.rightOffset)}qu(t,i=400){if(!isFinite(t))throw new RangeError("offset is required and must be finite number");if(!isFinite(i)||i<=0)throw new RangeError("animationDuration (optional) must be finite positive number");const n=this.pu,s=performance.now();this.Ui.Xn({Yu:t=>(t-s)/i>=1,Xu:e=>{const r=(e-s)/i;return r>=1?t:n+(t-n)*r}})}gt(t,i){this.ou=!0,this.ru=t,this.hu.K_(t,i),this.Ou()}Ku(){return this._u}Zu(){return this.uu}Gu(){return this.cu}Au(){return this.eu||0}Ju(t){const i=t.U_();this.Eu(this.e_/i),this.pu=t.di()-this.Au(),this.Ou(),this.ou=!0,this.Ui.zu(),this.Ui.Fh()}Qu(){const t=this.Tu(),i=this.Pu();null!==t&&null!==i&&this.Ju(new bn(t,i+this.cn.rightOffset))}tc(t){const i=new bn(t.from,t.to);this.Ju(i)}Yi(t){return void 0!==this.bo.timeFormatter?this.bo.timeFormatter(t.originalTime):this.N_.formatHorzItem(t.time)}Lu(){const{handleScroll:t,handleScale:i}=this.Ui.W();return!(t.horzTouchDrag||t.mouseWheel||t.pressedMouseMove||t.vertTouchDrag||i.axisDoubleClickReset.time||i.axisPressedMouseMove.time||i.mouseWheel||i.pinch)}Tu(){return 0===this.ru.length?null:0}Pu(){return 0===this.ru.length?null:this.ru.length-1}ic(t){return(this.e_-1-t)/this.mu}Bu(t){const i=this.ic(t),n=this.Au()+this.pu-i;return Math.round(1e6*n)/1e6}Eu(t){const i=this.mu;this.mu=t,this.Du(),i!==this.mu&&(this.ou=!0,this.nc())}Su(){if(!this.ou)return;if(this.ou=!1,this.Fi())return void this.sc(Mn.su());const t=this.Au(),i=this.e_/this.mu,n=this.pu+t,s=new bn(n-i+1,n);this.sc(new Mn(s))}Du(){const t=this.ec();if(this.mut&&(this.mu=t,this.ou=!0)}}ec(){return this.cn.fixLeftEdge&&this.cn.fixRightEdge&&0!==this.ru.length?this.e_/this.ru.length:this.cn.minBarSpacing}Ou(){const t=this.rc();this.pu>t&&(this.pu=t,this.ou=!0);const i=this.hc();null!==i&&this.puthis.lc(t)),this.N_),this.lu.set(t.weight,i)),i.F_(t)}lc(t){return this.N_.formatTickmark(t,this.bo)}sc(t){const i=this.au;this.au=t,wn(i.iu(),this.au.iu())||this._u.m(),wn(i.nu(),this.au.nu())||this.uu.m(),this.nc()}nc(){this.fu=null}gu(){this.nc(),this.lu.clear()}bu(){this.N_.updateFormatter(this.bo)}Mu(){if(!this.cn.fixLeftEdge)return;const t=this.Tu();if(null===t)return;const i=this.Xs();if(null===i)return;const n=i.Os()-t;if(n<0){const t=this.pu-n-1;this.Jn(t)}this.Du()}xu(){this.Ou(),this.Du()}}class yn extends L{constructor(t){super(),this.ac=new Map,this.Lt=t}Z(t){}J(t){if(!this.Lt.Tt)return;const{context:i,mediaSize:n}=t;let s=0;for(const t of this.Lt.oc){if(0===t.Jt.length)continue;i.font=t.R;const e=this._c(i,t.Jt);e>n.width?t.ju=n.width/e:t.ju=1,s+=t.uc*t.ju}let e=0;switch(this.Lt.cc){case"top":e=0;break;case"center":e=Math.max((n.height-s)/2,0);break;case"bottom":e=Math.max(n.height-s,0)}i.fillStyle=this.Lt.O;for(const t of this.Lt.oc){i.save();let s=0;switch(this.Lt.dc){case"left":i.textAlign="left",s=t.uc/2;break;case"center":i.textAlign="center",s=n.width/2;break;case"right":i.textAlign="right",s=n.width-1-t.uc/2}i.translate(s,e),i.textBaseline="top",i.font=t.R,i.scale(t.ju,t.ju),i.fillText(t.Jt,0,t.fc),i.restore(),e+=t.uc*t.ju}}_c(t,i){const n=this.vc(t.font);let s=n.get(i);return void 0===s&&(s=t.measureText(i).width,n.set(i,s)),s}vc(t){let i=this.ac.get(t);return void 0===i&&(i=new Map,this.ac.set(t,i)),i}}class kn{constructor(t){this.bt=!0,this.jt={Tt:!1,O:"",oc:[],cc:"center",dc:"center"},this.Ht=new yn(this.jt),this.$t=t}gt(){this.bt=!0}xt(){return this.bt&&(this.St(),this.bt=!1),this.Ht}St(){const t=this.$t.W(),i=this.jt;i.Tt=t.visible,i.Tt&&(i.O=t.color,i.dc=t.horzAlign,i.cc=t.vertAlign,i.oc=[{Jt:t.text,R:z(t.fontSize,t.fontFamily,t.fontStyle),uc:1.2*t.fontSize,fc:0,ju:0}])}}class Cn extends et{constructor(t,i){super(),this.cn=i,this.wn=new kn(this)}Rn(){return[]}Pn(){return[this.wn]}W(){return this.cn}On(){this.wn.gt()}}var Tn,Pn,Rn,Dn,On;!function(t){t[t.OnTouchEnd=0]="OnTouchEnd",t[t.OnNextTap=1]="OnNextTap"}(Tn||(Tn={}));class An{constructor(t,i,n){this.mc=[],this.bc=[],this.e_=0,this.wc=null,this.gc=new k,this.Mc=new k,this.xc=null,this.Sc=t,this.cn=i,this.N_=n,this.yc=new E(this),this.wl=new Sn(this,i.timeScale,this.cn.localization,n),this.wt=new ht(this,i.crosshair),this.kc=new Xi(i.crosshair),this.Cc=new Cn(this,i.watermark),this.Tc(),this.mc[0].p_(2e3),this.Pc=this.Rc(0),this.Dc=this.Rc(1)}$l(){this.Oc(at.es())}Fh(){this.Oc(at.ss())}sa(){this.Oc(new at(1))}Ul(t){const i=this.Ac(t);this.Oc(i)}Vc(){return this.wc}Bc(t){const i=this.wc;this.wc=t,null!==i&&this.Ul(i.zc),null!==t&&this.Ul(t.zc)}W(){return this.cn}Nh(t){C(this.cn,t),this.mc.forEach((i=>i.c_(t))),void 0!==t.timeScale&&this.wl.Nh(t.timeScale),void 0!==t.localization&&this.wl.wu(t.localization),(t.leftPriceScale||t.rightPriceScale)&&this.gc.m(),this.Pc=this.Rc(0),this.Dc=this.Rc(1),this.$l()}Ec(t,i){if("left"===t)return void this.Nh({leftPriceScale:i});if("right"===t)return void this.Nh({rightPriceScale:i});const n=this.Ic(t);null!==n&&(n.At.Nh(i),this.gc.m())}Ic(t){for(const i of this.mc){const n=i.d_(t);if(null!==n)return{Ut:i,At:n}}return null}kt(){return this.wl}Lc(){return this.mc}Nc(){return this.Cc}Fc(){return this.wt}Wc(){return this.Mc}jc(t,i){t.Oo(i),this.zu()}m_(t){this.e_=t,this.wl.m_(this.e_),this.mc.forEach((i=>i.m_(t))),this.zu()}Tc(t){const i=new pn(this.wl,this);void 0!==t?this.mc.splice(t,0,i):this.mc.push(i);const n=void 0===t?this.mc.length-1:t,s=at.es();return s.Nn(n,{Fn:0,Wn:!0}),this.Oc(s),i}k_(t,i,n){t.k_(i,n)}C_(t,i,n){t.C_(i,n),this.ql(),this.Oc(this.Hc(t,2))}T_(t,i){t.T_(i),this.Oc(this.Hc(t,2))}P_(t,i,n){i.ko()||t.P_(i,n)}R_(t,i,n){i.ko()||(t.R_(i,n),this.ql(),this.Oc(this.Hc(t,2)))}D_(t,i){i.ko()||(t.D_(i),this.Oc(this.Hc(t,2)))}A_(t,i){t.A_(i),this.Oc(this.Hc(t,2))}$c(t){this.wl.Uo(t)}Uc(t,i){const n=this.kt();if(n.Fi()||0===i)return;const s=n.$i();t=Math.max(1,Math.min(t,s)),n.ju(t,i),this.zu()}qc(t){this.Yc(0),this.Xc(t),this.Kc()}Zc(t){this.wl.qo(t),this.zu()}Gc(){this.wl.Yo(),this.Fh()}Yc(t){this.wl.Xo(t)}Xc(t){this.wl.Ko(t),this.zu()}Kc(){this.wl.Zo(),this.Fh()}Mt(){return this.bc}Jc(t,i,n,s,e){this.wt.gn(t,i);let r=NaN,h=this.wl.Vu(t);const l=this.wl.Xs();null!==l&&(h=Math.min(Math.max(l.Os(),h),l.di()));const a=s.vn(),o=a.Pt();null!==o&&(r=a.pn(i,o)),r=this.kc.Ca(r,h,s),this.wt.yn(h,r,s),this.sa(),e||this.Mc.m(this.wt.yt(),{x:t,y:i},n)}Qc(t,i,n){const s=n.vn(),e=s.Pt(),r=s.Ot(t,f(e)),h=this.wl.ka(i,!0),l=this.wl.It(f(h));this.Jc(l,r,null,n,!0)}td(t){this.Fc().Cn(),this.sa(),t||this.Mc.m(null,null,null)}ql(){const t=this.wt.Ut();if(null!==t){const i=this.wt.xn(),n=this.wt.Sn();this.Jc(i,n,null,t)}this.wt.On()}nd(t,i,n){const s=this.wl.mn(0);void 0!==i&&void 0!==n&&this.wl.gt(i,n);const e=this.wl.mn(0),r=this.wl.Au(),h=this.wl.Xs();if(null!==h&&null!==s&&null!==e){const i=h.Kr(r),l=this.N_.key(s)>this.N_.key(e),a=null!==t&&t>r&&!l,o=this.wl.W().allowShiftVisibleRangeOnWhitespaceReplacement,_=i&&(!(void 0===n)||o)&&this.wl.W().shiftVisibleRangeOnNewBar;if(a&&!_){const i=t-r;this.wl.Jn(this.wl.Iu()-i)}}this.wl.Wu(t)}Kl(t){null!==t&&t.B_()}cr(t){const i=this.mc.find((i=>i.No().includes(t)));return void 0===i?null:i}zu(){this.Cc.On(),this.mc.forEach((t=>t.B_())),this.ql()}S(){this.mc.forEach((t=>t.S())),this.mc.length=0,this.cn.localization.priceFormatter=void 0,this.cn.localization.percentageFormatter=void 0,this.cn.localization.timeFormatter=void 0}sd(){return this.yc}mr(){return this.yc.W()}f_(){return this.gc}ed(t,i,n){const s=this.mc[0],e=this.rd(i,t,s,n);return this.bc.push(e),1===this.bc.length?this.$l():this.Fh(),e}hd(t){const i=this.cr(t),n=this.bc.indexOf(t);c(-1!==n,"Series not found"),this.bc.splice(n,1),f(i).jo(t),t.S&&t.S()}Hl(t,i){const n=f(this.cr(t));n.jo(t);const s=this.Ic(i);if(null===s){const s=t.Zi();n.Fo(t,i,s)}else{const e=s.Ut===n?t.Zi():void 0;s.Ut.Fo(t,i,e)}}Qu(){const t=at.ss();t.$n(),this.Oc(t)}ld(t){const i=at.ss();i.Yn(t),this.Oc(i)}Zn(){const t=at.ss();t.Zn(),this.Oc(t)}Gn(t){const i=at.ss();i.Gn(t),this.Oc(i)}Jn(t){const i=at.ss();i.Jn(t),this.Oc(i)}Xn(t){const i=at.ss();i.Xn(t),this.Oc(i)}Un(){const t=at.ss();t.Un(),this.Oc(t)}ad(){return this.cn.rightPriceScale.visible?"right":"left"}od(){return this.Dc}q(){return this.Pc}zt(t){const i=this.Dc,n=this.Pc;if(i===n)return i;if(t=Math.max(0,Math.min(100,Math.round(100*t))),null===this.xc||this.xc.Ts!==n||this.xc.Ps!==i)this.xc={Ts:n,Ps:i,_d:new Map};else{const i=this.xc._d.get(t);if(void 0!==i)return i}const s=function(t,i,n){const[s,e,r,h]=S(t),[l,a,o,_]=S(i),u=[m(s+n*(l-s)),m(e+n*(a-e)),m(r+n*(o-r)),b(h+n*(_-h))];return`rgba(${u[0]}, ${u[1]}, ${u[2]}, ${u[3]})`}(n,i,t/100);return this.xc._d.set(t,s),s}Hc(t,i){const n=new at(i);if(null!==t){const s=this.mc.indexOf(t);n.Nn(s,{Fn:i})}return n}Ac(t,i){return void 0===i&&(i=2),this.Hc(this.cr(t),i)}Oc(t){this.Sc&&this.Sc(t),this.mc.forEach((t=>t.E_().Wh().gt()))}rd(t,i,n,s){const e=new Yi(this,t,i,n,s),r=void 0!==t.priceScaleId?t.priceScaleId:this.ad();return n.Fo(e,r),lt(r)||e.Nh(t),e}Rc(t){const i=this.cn.layout;return"gradient"===i.background.type?0===t?i.background.topColor:i.background.bottomColor:i.background.color}}function Vn(t){return!T(t)&&!R(t)}function Bn(t){return T(t)}!function(t){t[t.Disabled=0]="Disabled",t[t.Continuous=1]="Continuous",t[t.OnDataUpdate=2]="OnDataUpdate"}(Pn||(Pn={})),function(t){t[t.LastBar=0]="LastBar",t[t.LastVisible=1]="LastVisible"}(Rn||(Rn={})),function(t){t.Solid="solid",t.VerticalGradient="gradient"}(Dn||(Dn={})),function(t){t[t.Year=0]="Year",t[t.Month=1]="Month",t[t.DayOfMonth=2]="DayOfMonth",t[t.Time=3]="Time",t[t.TimeWithSeconds=4]="TimeWithSeconds"}(On||(On={}));const zn=t=>t.getUTCFullYear();function En(t,i,n){return i.replace(/yyyy/g,(t=>_t(zn(t),4))(t)).replace(/yy/g,(t=>_t(zn(t)%100,2))(t)).replace(/MMMM/g,((t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"long"}))(t,n)).replace(/MMM/g,((t,i)=>new Date(t.getUTCFullYear(),t.getUTCMonth(),1).toLocaleString(i,{month:"short"}))(t,n)).replace(/MM/g,(t=>_t((t=>t.getUTCMonth()+1)(t),2))(t)).replace(/dd/g,(t=>_t((t=>t.getUTCDate())(t),2))(t))}class In{constructor(t="yyyy-MM-dd",i="default"){this.ud=t,this.dd=i}F_(t){return En(t,this.ud,this.dd)}}class Ln{constructor(t){this.fd=t||"%h:%m:%s"}F_(t){return this.fd.replace("%h",_t(t.getUTCHours(),2)).replace("%m",_t(t.getUTCMinutes(),2)).replace("%s",_t(t.getUTCSeconds(),2))}}const Nn={vd:"yyyy-MM-dd",pd:"%h:%m:%s",md:" ",bd:"default"};class Fn{constructor(t={}){const i=Object.assign(Object.assign({},Nn),t);this.wd=new In(i.vd,i.bd),this.gd=new Ln(i.pd),this.Md=i.md}F_(t){return`${this.wd.F_(t)}${this.Md}${this.gd.F_(t)}`}}function Wn(t){return 60*t*60*1e3}function jn(t){return 60*t*1e3}const Hn=[{xd:($n=1,1e3*$n),Sd:10},{xd:jn(1),Sd:20},{xd:jn(5),Sd:21},{xd:jn(30),Sd:22},{xd:Wn(1),Sd:30},{xd:Wn(3),Sd:31},{xd:Wn(6),Sd:32},{xd:Wn(12),Sd:33}];var $n;function Un(t,i){if(t.getUTCFullYear()!==i.getUTCFullYear())return 70;if(t.getUTCMonth()!==i.getUTCMonth())return 60;if(t.getUTCDate()!==i.getUTCDate())return 50;for(let n=Hn.length-1;n>=0;--n)if(Math.floor(i.getTime()/Hn[n].xd)!==Math.floor(t.getTime()/Hn[n].xd))return Hn[n].Sd;return 0}function qn(t){let i=t;if(R(t)&&(i=Xn(t)),!Vn(i))throw new Error("time must be of type BusinessDay");const n=new Date(Date.UTC(i.year,i.month-1,i.day,0,0,0,0));return{yd:Math.round(n.getTime()/1e3),kd:i}}function Yn(t){if(!Bn(t))throw new Error("time must be of type isUTCTimestamp");return{yd:t}}function Xn(t){const i=new Date(t);if(isNaN(i.getTime()))throw new Error(`Invalid date string=${t}, expected format=yyyy-mm-dd`);return{day:i.getUTCDate(),month:i.getUTCMonth()+1,year:i.getUTCFullYear()}}function Kn(t){R(t.time)&&(t.time=Xn(t.time))}class Zn{options(){return this.cn}setOptions(t){this.cn=t,this.updateFormatter(t.localization)}preprocessData(t){Array.isArray(t)?function(t){t.forEach(Kn)}(t):Kn(t)}createConverterToInternalObj(t){return f(function(t){return 0===t.length?null:Vn(t[0].time)||R(t[0].time)?qn:Yn}(t))}key(t){return"object"==typeof t&&"yd"in t?t.yd:this.key(this.convertHorzItemToInternal(t))}cacheKey(t){const i=t;return void 0===i.kd?new Date(1e3*i.yd).getTime():new Date(Date.UTC(i.kd.year,i.kd.month-1,i.kd.day)).getTime()}convertHorzItemToInternal(t){return Bn(i=t)?Yn(i):Vn(i)?qn(i):qn(Xn(i));var i}updateFormatter(t){if(!this.cn)return;const i=t.dateFormat;this.cn.timeScale.timeVisible?this.Cd=new Fn({vd:i,pd:this.cn.timeScale.secondsVisible?"%h:%m:%s":"%h:%m",md:" ",bd:t.locale}):this.Cd=new In(i,t.locale)}formatHorzItem(t){const i=t;return this.Cd.F_(new Date(1e3*i.yd))}formatTickmark(t,i){const n=function(t,i,n){switch(t){case 0:case 10:return i?n?4:3:2;case 20:case 21:case 22:case 30:case 31:case 32:case 33:return i?3:2;case 50:return 2;case 60:return 1;case 70:return 0}}(t.weight,this.cn.timeScale.timeVisible,this.cn.timeScale.secondsVisible),s=this.cn.timeScale;if(void 0!==s.tickMarkFormatter){const e=s.tickMarkFormatter(t.originalTime,n,i.locale);if(null!==e)return e}return function(t,i,n){const s={};switch(i){case 0:s.year="numeric";break;case 1:s.month="short";break;case 2:s.day="numeric";break;case 3:s.hour12=!1,s.hour="2-digit",s.minute="2-digit";break;case 4:s.hour12=!1,s.hour="2-digit",s.minute="2-digit",s.second="2-digit"}const e=void 0===t.kd?new Date(1e3*t.yd):new Date(Date.UTC(t.kd.year,t.kd.month-1,t.kd.day));return new Date(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()).toLocaleString(n,s)}(t.time,n,i.locale)}maxTickMarkWeight(t){let i=t.reduce(xn,t[0]).weight;return i>30&&i<50&&(i=30),i}fillWeightsForPoints(t,i){!function(t,i=0){if(0===t.length)return;let n=0===i?null:t[i-1].time.yd,s=null!==n?new Date(1e3*n):null,e=0;for(let r=i;r1){const i=Math.ceil(e/(t.length-1)),n=new Date(1e3*(t[0].time.yd-i));t[0].timeWeight=Un(new Date(1e3*t[0].time.yd),n)}}(t,i)}static Td(t){return C({localization:{dateFormat:"dd MMM 'yy"}},null!=t?t:{})}}function Gn(t){var i=t.width,n=t.height;if(i<0)throw new Error("Negative width is not allowed for Size");if(n<0)throw new Error("Negative height is not allowed for Size");return{width:i,height:n}}function Jn(t,i){return t.width===i.width&&t.height===i.height}var Qn=function(){function t(t){var i=this;this._resolutionListener=function(){return i._onResolutionChanged()},this._resolutionMediaQueryList=null,this._observers=[],this._window=t,this._installResolutionListener()}return t.prototype.dispose=function(){this._uninstallResolutionListener(),this._window=null},Object.defineProperty(t.prototype,"value",{get:function(){return this._window.devicePixelRatio},enumerable:!1,configurable:!0}),t.prototype.subscribe=function(t){var i=this,n={next:t};return this._observers.push(n),{unsubscribe:function(){i._observers=i._observers.filter((function(t){return t!==n}))}}},t.prototype._installResolutionListener=function(){if(null!==this._resolutionMediaQueryList)throw new Error("Resolution listener is already installed");var t=this._window.devicePixelRatio;this._resolutionMediaQueryList=this._window.matchMedia("all and (resolution: ".concat(t,"dppx)")),this._resolutionMediaQueryList.addListener(this._resolutionListener)},t.prototype._uninstallResolutionListener=function(){null!==this._resolutionMediaQueryList&&(this._resolutionMediaQueryList.removeListener(this._resolutionListener),this._resolutionMediaQueryList=null)},t.prototype._reinstallResolutionListener=function(){this._uninstallResolutionListener(),this._installResolutionListener()},t.prototype._onResolutionChanged=function(){var t=this;this._observers.forEach((function(i){return i.next(t._window.devicePixelRatio)})),this._reinstallResolutionListener()},t}();var ts=function(){function t(t,i,n){var s;this._canvasElement=null,this._bitmapSizeChangedListeners=[],this._suggestedBitmapSize=null,this._suggestedBitmapSizeChangedListeners=[],this._devicePixelRatioObservable=null,this._canvasElementResizeObserver=null,this._canvasElement=t,this._canvasElementClientSize=Gn({width:this._canvasElement.clientWidth,height:this._canvasElement.clientHeight}),this._transformBitmapSize=null!=i?i:function(t){return t},this._allowResizeObserver=null===(s=null==n?void 0:n.allowResizeObserver)||void 0===s||s,this._chooseAndInitObserver()}return t.prototype.dispose=function(){var t,i;if(null===this._canvasElement)throw new Error("Object is disposed");null===(t=this._canvasElementResizeObserver)||void 0===t||t.disconnect(),this._canvasElementResizeObserver=null,null===(i=this._devicePixelRatioObservable)||void 0===i||i.dispose(),this._devicePixelRatioObservable=null,this._suggestedBitmapSizeChangedListeners.length=0,this._bitmapSizeChangedListeners.length=0,this._canvasElement=null},Object.defineProperty(t.prototype,"canvasElement",{get:function(){if(null===this._canvasElement)throw new Error("Object is disposed");return this._canvasElement},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"canvasElementClientSize",{get:function(){return this._canvasElementClientSize},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"bitmapSize",{get:function(){return Gn({width:this.canvasElement.width,height:this.canvasElement.height})},enumerable:!1,configurable:!0}),t.prototype.resizeCanvasElement=function(t){this._canvasElementClientSize=Gn(t),this.canvasElement.style.width="".concat(this._canvasElementClientSize.width,"px"),this.canvasElement.style.height="".concat(this._canvasElementClientSize.height,"px"),this._invalidateBitmapSize()},t.prototype.subscribeBitmapSizeChanged=function(t){this._bitmapSizeChangedListeners.push(t)},t.prototype.unsubscribeBitmapSizeChanged=function(t){this._bitmapSizeChangedListeners=this._bitmapSizeChangedListeners.filter((function(i){return i!==t}))},Object.defineProperty(t.prototype,"suggestedBitmapSize",{get:function(){return this._suggestedBitmapSize},enumerable:!1,configurable:!0}),t.prototype.subscribeSuggestedBitmapSizeChanged=function(t){this._suggestedBitmapSizeChangedListeners.push(t)},t.prototype.unsubscribeSuggestedBitmapSizeChanged=function(t){this._suggestedBitmapSizeChangedListeners=this._suggestedBitmapSizeChangedListeners.filter((function(i){return i!==t}))},t.prototype.applySuggestedBitmapSize=function(){if(null!==this._suggestedBitmapSize){var t=this._suggestedBitmapSize;this._suggestedBitmapSize=null,this._resizeBitmap(t),this._emitSuggestedBitmapSizeChanged(t,this._suggestedBitmapSize)}},t.prototype._resizeBitmap=function(t){var i=this.bitmapSize;Jn(i,t)||(this.canvasElement.width=t.width,this.canvasElement.height=t.height,this._emitBitmapSizeChanged(i,t))},t.prototype._emitBitmapSizeChanged=function(t,i){var n=this;this._bitmapSizeChangedListeners.forEach((function(s){return s.call(n,t,i)}))},t.prototype._suggestNewBitmapSize=function(t){var i=this._suggestedBitmapSize,n=Gn(this._transformBitmapSize(t,this._canvasElementClientSize)),s=Jn(this.bitmapSize,n)?null:n;null===i&&null===s||null!==i&&null!==s&&Jn(i,s)||(this._suggestedBitmapSize=s,this._emitSuggestedBitmapSizeChanged(i,s))},t.prototype._emitSuggestedBitmapSizeChanged=function(t,i){var n=this;this._suggestedBitmapSizeChangedListeners.forEach((function(s){return s.call(n,t,i)}))},t.prototype._chooseAndInitObserver=function(){var t=this;this._allowResizeObserver?new Promise((function(t){var i=new ResizeObserver((function(n){t(n.every((function(t){return"devicePixelContentBoxSize"in t}))),i.disconnect()}));i.observe(document.body,{box:"device-pixel-content-box"})})).catch((function(){return!1})).then((function(i){return i?t._initResizeObserver():t._initDevicePixelRatioObservable()})):this._initDevicePixelRatioObservable()},t.prototype._initDevicePixelRatioObservable=function(){var t=this;if(null!==this._canvasElement){var i=is(this._canvasElement);if(null===i)throw new Error("No window is associated with the canvas");this._devicePixelRatioObservable=function(t){return new Qn(t)}(i),this._devicePixelRatioObservable.subscribe((function(){return t._invalidateBitmapSize()})),this._invalidateBitmapSize()}},t.prototype._invalidateBitmapSize=function(){var t,i;if(null!==this._canvasElement){var n=is(this._canvasElement);if(null!==n){var s=null!==(i=null===(t=this._devicePixelRatioObservable)||void 0===t?void 0:t.value)&&void 0!==i?i:n.devicePixelRatio,e=this._canvasElement.getClientRects(),r=void 0!==e[0]?function(t,i){return Gn({width:Math.round(t.left*i+t.width*i)-Math.round(t.left*i),height:Math.round(t.top*i+t.height*i)-Math.round(t.top*i)})}(e[0],s):Gn({width:this._canvasElementClientSize.width*s,height:this._canvasElementClientSize.height*s});this._suggestNewBitmapSize(r)}}},t.prototype._initResizeObserver=function(){var t=this;null!==this._canvasElement&&(this._canvasElementResizeObserver=new ResizeObserver((function(i){var n=i.find((function(i){return i.target===t._canvasElement}));if(n&&n.devicePixelContentBoxSize&&n.devicePixelContentBoxSize[0]){var s=n.devicePixelContentBoxSize[0],e=Gn({width:s.inlineSize,height:s.blockSize});t._suggestNewBitmapSize(e)}})),this._canvasElementResizeObserver.observe(this._canvasElement,{box:"device-pixel-content-box"}))},t}();function is(t){return t.ownerDocument.defaultView}var ns=function(){function t(t,i,n){if(0===i.width||0===i.height)throw new TypeError("Rendering target could only be created on a media with positive width and height");if(this._mediaSize=i,0===n.width||0===n.height)throw new TypeError("Rendering target could only be created using a bitmap with positive integer width and height");this._bitmapSize=n,this._context=t}return t.prototype.useMediaCoordinateSpace=function(t){try{return this._context.save(),this._context.setTransform(1,0,0,1,0,0),this._context.scale(this._horizontalPixelRatio,this._verticalPixelRatio),t({context:this._context,mediaSize:this._mediaSize})}finally{this._context.restore()}},t.prototype.useBitmapCoordinateSpace=function(t){try{return this._context.save(),this._context.setTransform(1,0,0,1,0,0),t({context:this._context,mediaSize:this._mediaSize,bitmapSize:this._bitmapSize,horizontalPixelRatio:this._horizontalPixelRatio,verticalPixelRatio:this._verticalPixelRatio})}finally{this._context.restore()}},Object.defineProperty(t.prototype,"_horizontalPixelRatio",{get:function(){return this._bitmapSize.width/this._mediaSize.width},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"_verticalPixelRatio",{get:function(){return this._bitmapSize.height/this._mediaSize.height},enumerable:!1,configurable:!0}),t}();function ss(t,i){var n=t.canvasElementClientSize;if(0===n.width||0===n.height)return null;var s=t.bitmapSize;if(0===s.width||0===s.height)return null;var e=t.canvasElement.getContext("2d",i);return null===e?null:new ns(e,n,s)}const es="undefined"!=typeof window;function rs(){return!!es&&window.navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function hs(){return!!es&&/iPhone|iPad|iPod/.test(window.navigator.platform)}function ls(t){return t+t%2}function as(t,i){return t.Pd-i.Pd}function os(t,i,n){const s=(t.Pd-i.Pd)/(t.ut-i.ut);return Math.sign(s)*Math.min(Math.abs(s),n)}class _s{constructor(t,i,n,s){this.Rd=null,this.Dd=null,this.Od=null,this.Ad=null,this.Vd=null,this.Bd=0,this.zd=0,this.Ed=t,this.Id=i,this.Ld=n,this.rs=s}Nd(t,i){if(null!==this.Rd){if(this.Rd.ut===i)return void(this.Rd.Pd=t);if(Math.abs(this.Rd.Pd-t)50)return;let n=0;const s=os(this.Rd,this.Dd,this.Id),e=as(this.Rd,this.Dd),r=[s],h=[e];if(n+=e,null!==this.Od){const t=os(this.Dd,this.Od,this.Id);if(Math.sign(t)===Math.sign(s)){const i=as(this.Dd,this.Od);if(r.push(t),h.push(i),n+=i,null!==this.Ad){const t=os(this.Od,this.Ad,this.Id);if(Math.sign(t)===Math.sign(s)){const i=as(this.Od,this.Ad);r.push(t),h.push(i),n+=i}}}}let l=0;for(let t=0;t({width:Math.max(t.width,i.width),height:Math.max(t.height,i.height)})});return s.resizeCanvasElement(i),s}function cs(t,i,n,s){t.G&&t.G(i,n,s)}function ds(t,i,n,s){t.K(i,n,s)}function fs(t,i,n,s){const e=t(n,s);for(const t of e){const n=t.xt();null!==n&&i(n)}}function vs(t){es&&void 0!==window.chrome&&t.addEventListener("mousedown",(t=>{if(1===t.button)return t.preventDefault(),!1}))}class ps{constructor(t,i,n){this.Wd=0,this.jd=null,this.Hd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY},this.$d=0,this.Ud=null,this.qd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY},this.Yd=null,this.Xd=!1,this.Kd=null,this.Zd=null,this.Gd=!1,this.Jd=!1,this.Qd=!1,this.tf=null,this.if=null,this.nf=null,this.sf=null,this.ef=null,this.rf=null,this.hf=null,this.lf=0,this.af=!1,this._f=!1,this.uf=!1,this.cf=0,this.df=null,this.ff=!hs(),this.vf=t=>{this.pf(t)},this.mf=t=>{if(this.bf(t)){const i=this.wf(t);if(++this.$d,this.Ud&&this.$d>1){const{gf:n}=this.Mf(ws(t),this.qd);n<30&&!this.Qd&&this.xf(i,this.yf.Sf),this.kf()}}else{const i=this.wf(t);if(++this.Wd,this.jd&&this.Wd>1){const{gf:n}=this.Mf(ws(t),this.Hd);n<5&&!this.Jd&&this.Cf(i,this.yf.Tf),this.Pf()}}},this.Rf=t,this.yf=i,this.cn=n,this.Df()}S(){null!==this.tf&&(this.tf(),this.tf=null),null!==this.if&&(this.if(),this.if=null),null!==this.sf&&(this.sf(),this.sf=null),null!==this.ef&&(this.ef(),this.ef=null),null!==this.rf&&(this.rf(),this.rf=null),null!==this.nf&&(this.nf(),this.nf=null),this.Of(),this.Pf()}Af(t){this.sf&&this.sf();const i=this.Vf.bind(this);if(this.sf=()=>{this.Rf.removeEventListener("mousemove",i)},this.Rf.addEventListener("mousemove",i),this.bf(t))return;const n=this.wf(t);this.Cf(n,this.yf.Bf),this.ff=!0}Pf(){null!==this.jd&&clearTimeout(this.jd),this.Wd=0,this.jd=null,this.Hd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY}}kf(){null!==this.Ud&&clearTimeout(this.Ud),this.$d=0,this.Ud=null,this.qd={et:Number.NEGATIVE_INFINITY,rt:Number.POSITIVE_INFINITY}}Vf(t){if(this.uf||null!==this.Zd)return;if(this.bf(t))return;const i=this.wf(t);this.Cf(i,this.yf.zf),this.ff=!0}Ef(t){const i=Ms(t.changedTouches,f(this.df));if(null===i)return;if(this.cf=gs(t),null!==this.hf)return;if(this._f)return;this.af=!0;const n=this.Mf(ws(i),f(this.Zd)),{If:s,Lf:e,gf:r}=n;if(this.Gd||!(r<5)){if(!this.Gd){const t=.5*s,i=e>=t&&!this.cn.Nf(),n=t>e&&!this.cn.Ff();i||n||(this._f=!0),this.Gd=!0,this.Qd=!0,this.Of(),this.kf()}if(!this._f){const n=this.wf(t,i);this.xf(n,this.yf.Wf),bs(t)}}}jf(t){if(0!==t.button)return;const i=this.Mf(ws(t),f(this.Kd)),{gf:n}=i;if(n>=5&&(this.Jd=!0,this.Pf()),this.Jd){const i=this.wf(t);this.Cf(i,this.yf.Hf)}}Mf(t,i){const n=Math.abs(i.et-t.et),s=Math.abs(i.rt-t.rt);return{If:n,Lf:s,gf:n+s}}$f(t){let i=Ms(t.changedTouches,f(this.df));if(null===i&&0===t.touches.length&&(i=t.changedTouches[0]),null===i)return;this.df=null,this.cf=gs(t),this.Of(),this.Zd=null,this.rf&&(this.rf(),this.rf=null);const n=this.wf(t,i);if(this.xf(n,this.yf.Uf),++this.$d,this.Ud&&this.$d>1){const{gf:t}=this.Mf(ws(i),this.qd);t<30&&!this.Qd&&this.xf(n,this.yf.Sf),this.kf()}else this.Qd||(this.xf(n,this.yf.qf),this.yf.qf&&bs(t));0===this.$d&&bs(t),0===t.touches.length&&this.Xd&&(this.Xd=!1,bs(t))}pf(t){if(0!==t.button)return;const i=this.wf(t);if(this.Kd=null,this.uf=!1,this.ef&&(this.ef(),this.ef=null),rs()){this.Rf.ownerDocument.documentElement.removeEventListener("mouseleave",this.vf)}if(!this.bf(t))if(this.Cf(i,this.yf.Yf),++this.Wd,this.jd&&this.Wd>1){const{gf:n}=this.Mf(ws(t),this.Hd);n<5&&!this.Jd&&this.Cf(i,this.yf.Tf),this.Pf()}else this.Jd||this.Cf(i,this.yf.Xf)}Of(){null!==this.Yd&&(clearTimeout(this.Yd),this.Yd=null)}Kf(t){if(null!==this.df)return;const i=t.changedTouches[0];this.df=i.identifier,this.cf=gs(t);const n=this.Rf.ownerDocument.documentElement;this.Qd=!1,this.Gd=!1,this._f=!1,this.Zd=ws(i),this.rf&&(this.rf(),this.rf=null);{const i=this.Ef.bind(this),s=this.$f.bind(this);this.rf=()=>{n.removeEventListener("touchmove",i),n.removeEventListener("touchend",s)},n.addEventListener("touchmove",i,{passive:!1}),n.addEventListener("touchend",s,{passive:!1}),this.Of(),this.Yd=setTimeout(this.Zf.bind(this,t),240)}const s=this.wf(t,i);this.xf(s,this.yf.Gf),this.Ud||(this.$d=0,this.Ud=setTimeout(this.kf.bind(this),500),this.qd=ws(i))}Jf(t){if(0!==t.button)return;const i=this.Rf.ownerDocument.documentElement;rs()&&i.addEventListener("mouseleave",this.vf),this.Jd=!1,this.Kd=ws(t),this.ef&&(this.ef(),this.ef=null);{const t=this.jf.bind(this),n=this.pf.bind(this);this.ef=()=>{i.removeEventListener("mousemove",t),i.removeEventListener("mouseup",n)},i.addEventListener("mousemove",t),i.addEventListener("mouseup",n)}if(this.uf=!0,this.bf(t))return;const n=this.wf(t);this.Cf(n,this.yf.Qf),this.jd||(this.Wd=0,this.jd=setTimeout(this.Pf.bind(this),500),this.Hd=ws(t))}Df(){this.Rf.addEventListener("mouseenter",this.Af.bind(this)),this.Rf.addEventListener("touchcancel",this.Of.bind(this));{const t=this.Rf.ownerDocument,i=t=>{this.yf.tv&&(t.composed&&this.Rf.contains(t.composedPath()[0])||t.target&&this.Rf.contains(t.target)||this.yf.tv())};this.if=()=>{t.removeEventListener("touchstart",i)},this.tf=()=>{t.removeEventListener("mousedown",i)},t.addEventListener("mousedown",i),t.addEventListener("touchstart",i,{passive:!0})}hs()&&(this.nf=()=>{this.Rf.removeEventListener("dblclick",this.mf)},this.Rf.addEventListener("dblclick",this.mf)),this.Rf.addEventListener("mouseleave",this.iv.bind(this)),this.Rf.addEventListener("touchstart",this.Kf.bind(this),{passive:!0}),vs(this.Rf),this.Rf.addEventListener("mousedown",this.Jf.bind(this)),this.nv(),this.Rf.addEventListener("touchmove",(()=>{}),{passive:!1})}nv(){void 0===this.yf.sv&&void 0===this.yf.ev&&void 0===this.yf.rv||(this.Rf.addEventListener("touchstart",(t=>this.hv(t.touches)),{passive:!0}),this.Rf.addEventListener("touchmove",(t=>{if(2===t.touches.length&&null!==this.hf&&void 0!==this.yf.ev){const i=ms(t.touches[0],t.touches[1])/this.lf;this.yf.ev(this.hf,i),bs(t)}}),{passive:!1}),this.Rf.addEventListener("touchend",(t=>{this.hv(t.touches)})))}hv(t){1===t.length&&(this.af=!1),2!==t.length||this.af||this.Xd?this.lv():this.av(t)}av(t){const i=this.Rf.getBoundingClientRect()||{left:0,top:0};this.hf={et:(t[0].clientX-i.left+(t[1].clientX-i.left))/2,rt:(t[0].clientY-i.top+(t[1].clientY-i.top))/2},this.lf=ms(t[0],t[1]),void 0!==this.yf.sv&&this.yf.sv(),this.Of()}lv(){null!==this.hf&&(this.hf=null,void 0!==this.yf.rv&&this.yf.rv())}iv(t){if(this.sf&&this.sf(),this.bf(t))return;if(!this.ff)return;const i=this.wf(t);this.Cf(i,this.yf.ov),this.ff=!hs()}Zf(t){const i=Ms(t.touches,f(this.df));if(null===i)return;const n=this.wf(t,i);this.xf(n,this.yf._v),this.Qd=!0,this.Xd=!0}bf(t){return t.sourceCapabilities&&void 0!==t.sourceCapabilities.firesTouchEvents?t.sourceCapabilities.firesTouchEvents:gs(t){"touchstart"!==t.type&&bs(t)}}}}function ms(t,i){const n=t.clientX-i.clientX,s=t.clientY-i.clientY;return Math.sqrt(n*n+s*s)}function bs(t){t.cancelable&&t.preventDefault()}function ws(t){return{et:t.pageX,rt:t.pageY}}function gs(t){return t.timeStamp||performance.now()}function Ms(t,i){for(let n=0;n{var s,e,r,h;return(null!==(e=null===(s=n.At())||void 0===s?void 0:s.xa())&&void 0!==e?e:"")!==i?[]:null!==(h=null===(r=n.la)||void 0===r?void 0:r.call(n,t))&&void 0!==h?h:[]}}class ks{constructor(t,i,n,s){this.Li=null,this.wv=null,this.gv=!1,this.Mv=new Qt(200),this.Gr=null,this.xv=0,this.Sv=!1,this.yv=()=>{this.Sv||this.nn.kv().qt().Fh()},this.Cv=()=>{this.Sv||this.nn.kv().qt().Fh()},this.nn=t,this.cn=i,this.mo=i.layout,this.yc=n,this.Tv="left"===s,this.Pv=ys("normal",s),this.Rv=ys("top",s),this.Dv=ys("bottom",s),this.Ov=document.createElement("div"),this.Ov.style.height="100%",this.Ov.style.overflow="hidden",this.Ov.style.width="25px",this.Ov.style.left="0",this.Ov.style.position="relative",this.Av=us(this.Ov,Gn({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.yv);const e=this.Av.canvasElement;e.style.position="absolute",e.style.zIndex="1",e.style.left="0",e.style.top="0",this.Vv=us(this.Ov,Gn({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.Cv);const r=this.Vv.canvasElement;r.style.position="absolute",r.style.zIndex="2",r.style.left="0",r.style.top="0";const h={Qf:this.Bv.bind(this),Gf:this.Bv.bind(this),Hf:this.zv.bind(this),Wf:this.zv.bind(this),tv:this.Ev.bind(this),Yf:this.Iv.bind(this),Uf:this.Iv.bind(this),Tf:this.Lv.bind(this),Sf:this.Lv.bind(this),Bf:this.Nv.bind(this),ov:this.Fv.bind(this)};this.Wv=new ps(this.Vv.canvasElement,h,{Nf:()=>!this.cn.handleScroll.vertTouchDrag,Ff:()=>!0})}S(){this.Wv.S(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Vv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.yv),this.Av.dispose(),null!==this.Li&&this.Li.$o().p(this),this.Li=null}jv(){return this.Ov}P(){return this.mo.fontSize}Hv(){const t=this.yc.W();return this.Gr!==t.R&&(this.Mv.ir(),this.Gr=t.R),t}$v(){if(null===this.Li)return 0;let t=0;const i=this.Hv(),n=f(this.Av.canvasElement.getContext("2d"));n.save();const s=this.Li.Ia();n.font=this.Uv(),s.length>0&&(t=Math.max(this.Mv.Si(n,s[0].Za),this.Mv.Si(n,s[s.length-1].Za)));const e=this.qv();for(let i=e.length;i--;){const s=this.Mv.Si(n,e[i].Jt());s>t&&(t=s)}const r=this.Li.Pt();if(null!==r&&null!==this.wv){const i=this.Li.pn(1,r),s=this.Li.pn(this.wv.height-2,r);t=Math.max(t,this.Mv.Si(n,this.Li.Wi(Math.floor(Math.min(i,s))+.11111111111111,r)),this.Mv.Si(n,this.Li.Wi(Math.ceil(Math.max(i,s))-.11111111111111,r)))}n.restore();const h=t||34;return ls(Math.ceil(i.C+i.T+i.B+i.I+5+h))}Yv(t){null!==this.wv&&Jn(this.wv,t)||(this.wv=t,this.Sv=!0,this.Av.resizeCanvasElement(t),this.Vv.resizeCanvasElement(t),this.Sv=!1,this.Ov.style.width=`${t.width}px`,this.Ov.style.height=`${t.height}px`)}Xv(){return f(this.wv).width}Ji(t){this.Li!==t&&(null!==this.Li&&this.Li.$o().p(this),this.Li=t,t.$o().l(this.ao.bind(this),this))}At(){return this.Li}ir(){const t=this.nn.Kv();this.nn.kv().qt().A_(t,f(this.At()))}Zv(t){if(null===this.wv)return;if(1!==t){this.Gv(),this.Av.applySuggestedBitmapSize();const t=ss(this.Av);null!==t&&(t.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Be(t)})),this.nn.Qv(t,this.Dv),this.tp(t),this.nn.Qv(t,this.Pv),this.ip(t))}this.Vv.applySuggestedBitmapSize();const i=ss(this.Vv);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.np(i),this.nn.Qv(i,this.Rv))}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}gt(){var t;null===(t=this.Li)||void 0===t||t.Ia()}Bv(t){if(null===this.Li||this.Li.Fi()||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.kv().qt(),n=this.nn.Kv();this.gv=!0,i.k_(n,this.Li,t.localY)}zv(t){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.kv().qt(),n=this.nn.Kv(),s=this.Li;i.C_(n,s,t.localY)}Ev(){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const t=this.nn.kv().qt(),i=this.nn.Kv(),n=this.Li;this.gv&&(this.gv=!1,t.T_(i,n))}Iv(t){if(null===this.Li||!this.cn.handleScale.axisPressedMouseMove.price)return;const i=this.nn.kv().qt(),n=this.nn.Kv();this.gv=!1,i.T_(n,this.Li)}Lv(t){this.cn.handleScale.axisDoubleClickReset.price&&this.ir()}Nv(t){if(null===this.Li)return;!this.nn.kv().qt().W().handleScale.axisPressedMouseMove.price||this.Li.ph()||this.Li.Co()||this.rp(1)}Fv(t){this.rp(0)}qv(){const t=[],i=null===this.Li?void 0:this.Li;return(n=>{for(let s=0;s{t.fillStyle=n.borderColor;const l=Math.max(1,Math.floor(h)),a=Math.floor(.5*h),o=Math.round(s.T*r);t.beginPath();for(const n of i)t.rect(Math.floor(e*r),Math.round(n.Aa*h)-a,o,l);t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{var r;t.font=this.Uv(),t.fillStyle=null!==(r=n.textColor)&&void 0!==r?r:this.mo.textColor,t.textAlign=this.Tv?"right":"left",t.textBaseline="middle";const h=this.Tv?Math.round(e-s.B):Math.round(e+s.T+s.B),l=i.map((i=>this.Mv.xi(t,i.Za)));for(let n=i.length;n--;){const s=i[n];t.fillText(s.Za,h,s.Aa+l[n])}}))}Gv(){if(null===this.wv||null===this.Li)return;let t=this.wv.height/2;const i=[],n=this.Li.No().slice(),s=this.nn.Kv(),e=this.Hv();this.Li===s.vr()&&this.nn.Kv().No().forEach((t=>{s.dr(t)&&n.push(t)}));const r=this.Li.Ta()[0],h=this.Li;n.forEach((n=>{const e=n.Rn(s,h);e.forEach((t=>{t.Vi(null),t.Bi()&&i.push(t)})),r===n&&e.length>0&&(t=e[0].ki())})),i.forEach((t=>t.Vi(t.ki())));this.Li.W().alignLabels&&this.hp(i,e,t)}hp(t,i,n){if(null===this.wv)return;const s=t.filter((t=>t.ki()<=n)),e=t.filter((t=>t.ki()>n));s.sort(((t,i)=>i.ki()-t.ki())),s.length&&e.length&&e.push(s[0]),e.sort(((t,i)=>t.ki()-i.ki()));for(const n of t){const t=Math.floor(n.Et(i)/2),s=n.ki();s>-t&&sthis.wv.height-t&&sl-r&&n.Vi(l-r)}for(let t=1;t{if(i.zi()){i.xt(f(this.Li)).K(t,n,this.Mv,s)}}))}np(t){if(null===this.wv||null===this.Li)return;const i=this.nn.kv().qt(),n=[],s=this.nn.Kv(),e=i.Fc().Rn(s,this.Li);e.length&&n.push(e);const r=this.Hv(),h=this.Tv?"right":"left";n.forEach((i=>{i.forEach((i=>{i.xt(f(this.Li)).K(t,r,this.Mv,h)}))}))}rp(t){this.Ov.style.cursor=1===t?"ns-resize":"default"}ao(){const t=this.$v();this.xv{this.Sv||null===this.wp||this.Ui().Fh()},this.Cv=()=>{this.Sv||null===this.wp||this.Ui().Fh()},this.gp=t,this.wp=i,this.wp.z_().l(this.Mp.bind(this),this,!0),this.xp=document.createElement("td"),this.xp.style.padding="0",this.xp.style.position="relative";const n=document.createElement("div");n.style.width="100%",n.style.height="100%",n.style.position="relative",n.style.overflow="hidden",this.Sp=document.createElement("td"),this.Sp.style.padding="0",this.yp=document.createElement("td"),this.yp.style.padding="0",this.xp.appendChild(n),this.Av=us(n,Gn({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.yv);const s=this.Av.canvasElement;s.style.position="absolute",s.style.zIndex="1",s.style.left="0",s.style.top="0",this.Vv=us(n,Gn({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.Cv);const e=this.Vv.canvasElement;e.style.position="absolute",e.style.zIndex="2",e.style.left="0",e.style.top="0",this.kp=document.createElement("tr"),this.kp.appendChild(this.Sp),this.kp.appendChild(this.xp),this.kp.appendChild(this.yp),this.Cp(),this.Wv=new ps(this.Vv.canvasElement,this,{Nf:()=>null===this.vp&&!this.gp.W().handleScroll.vertTouchDrag,Ff:()=>null===this.vp&&!this.gp.W().handleScroll.horzTouchDrag})}S(){null!==this.lp&&this.lp.S(),null!==this.ap&&this.ap.S(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Vv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.yv),this.Av.dispose(),null!==this.wp&&this.wp.z_().p(this),this.Wv.S()}Kv(){return f(this.wp)}Tp(t){null!==this.wp&&this.wp.z_().p(this),this.wp=t,null!==this.wp&&this.wp.z_().l(Ds.prototype.Mp.bind(this),this,!0),this.Cp()}kv(){return this.gp}jv(){return this.kp}Cp(){if(null!==this.wp&&(this.Pp(),0!==this.Ui().Mt().length)){if(null!==this.lp){const t=this.wp.S_();this.lp.Ji(f(t))}if(null!==this.ap){const t=this.wp.y_();this.ap.Ji(f(t))}}}Rp(){null!==this.lp&&this.lp.gt(),null!==this.ap&&this.ap.gt()}v_(){return null!==this.wp?this.wp.v_():0}p_(t){this.wp&&this.wp.p_(t)}Bf(t){if(!this.wp)return;this.Dp();const i=t.localX,n=t.localY;this.Op(i,n,t)}Qf(t){this.Dp(),this.Ap(),this.Op(t.localX,t.localY,t)}zf(t){var i;if(!this.wp)return;this.Dp();const n=t.localX,s=t.localY;this.Op(n,s,t);const e=this.br(n,s);this.gp.Vp(null!==(i=null==e?void 0:e.bv)&&void 0!==i?i:null),this.Ui().Bc(e&&{zc:e.zc,pv:e.pv})}Xf(t){null!==this.wp&&(this.Dp(),this.Bp(t))}Tf(t){null!==this.wp&&this.zp(this.cp,t)}Sf(t){this.Tf(t)}Hf(t){this.Dp(),this.Ep(t),this.Op(t.localX,t.localY,t)}Yf(t){null!==this.wp&&(this.Dp(),this.fp=!1,this.Ip(t))}qf(t){null!==this.wp&&this.Bp(t)}_v(t){if(this.fp=!0,null===this.vp){const i={x:t.localX,y:t.localY};this.Lp(i,i,t)}}ov(t){null!==this.wp&&(this.Dp(),this.wp.qt().Bc(null),this.Np())}Fp(){return this.up}Wp(){return this.cp}sv(){this.dp=1,this.Ui().Un()}ev(t,i){if(!this.gp.W().handleScale.pinch)return;const n=5*(i-this.dp);this.dp=i,this.Ui().Uc(t.et,n)}Gf(t){this.fp=!1,this.pp=null!==this.vp,this.Ap();const i=this.Ui().Fc();null!==this.vp&&i.Tt()&&(this.mp={x:i.Kt(),y:i.Zt()},this.vp={x:t.localX,y:t.localY})}Wf(t){if(null===this.wp)return;const i=t.localX,n=t.localY;if(null===this.vp)this.Ep(t);else{this.pp=!1;const s=f(this.mp),e=s.x+(i-this.vp.x),r=s.y+(n-this.vp.y);this.Op(e,r,t)}}Uf(t){0===this.kv().W().trackingMode.exitMode&&(this.pp=!0),this.jp(),this.Ip(t)}br(t,i){const n=this.wp;return null===n?null:function(t,i,n){const s=t.No(),e=function(t,i,n){var s,e;let r,h;for(const o of t){const t=null!==(e=null===(s=o.oa)||void 0===s?void 0:s.call(o,i,n))&&void 0!==e?e:[];for(const i of t)l=i.zOrder,(!(a=null==r?void 0:r.zOrder)||"top"===l&&"top"!==a||"normal"===l&&"bottom"===a)&&(r=i,h=o)}var l,a;return r&&h?{mv:r,zc:h}:null}(s,i,n);if("top"===(null==e?void 0:e.mv.zOrder))return xs(e);for(const r of s){if(e&&e.zc===r&&"bottom"!==e.mv.zOrder&&!e.mv.isBackground)return xs(e);const s=Ss(r.Pn(t),i,n);if(null!==s)return{zc:r,fv:s.fv,pv:s.pv};if(e&&e.zc===r&&"bottom"!==e.mv.zOrder&&e.mv.isBackground)return xs(e)}return(null==e?void 0:e.mv)?xs(e):null}(n,t,i)}Hp(t,i){f("left"===i?this.lp:this.ap).Yv(Gn({width:t,height:this.wv.height}))}$p(){return this.wv}Yv(t){Jn(this.wv,t)||(this.wv=t,this.Sv=!0,this.Av.resizeCanvasElement(t),this.Vv.resizeCanvasElement(t),this.Sv=!1,this.xp.style.width=t.width+"px",this.xp.style.height=t.height+"px")}Up(){const t=f(this.wp);t.x_(t.S_()),t.x_(t.y_());for(const i of t.Ta())if(t.dr(i)){const n=i.At();null!==n&&t.x_(n),i.On()}}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Zv(t){if(0===t)return;if(null===this.wp)return;if(t>1&&this.Up(),null!==this.lp&&this.lp.Zv(t),null!==this.ap&&this.ap.Zv(t),1!==t){this.Av.applySuggestedBitmapSize();const t=ss(this.Av);null!==t&&(t.useBitmapCoordinateSpace((t=>{this.Jv(t)})),this.wp&&(this.qp(t,Cs),this.Yp(t),this.Xp(t),this.qp(t,Ts),this.qp(t,Ps)))}this.Vv.applySuggestedBitmapSize();const i=ss(this.Vv);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.Kp(i),this.qp(i,Rs))}Zp(){return this.lp}Gp(){return this.ap}Qv(t,i){this.qp(t,i)}Mp(){null!==this.wp&&this.wp.z_().p(this),this.wp=null}Bp(t){this.zp(this.up,t)}zp(t,i){const n=i.localX,s=i.localY;t.M()&&t.m(this.Ui().kt().Vu(n),{x:n,y:s},i)}Jv({context:t,bitmapSize:i}){const{width:n,height:s}=i,e=this.Ui(),r=e.q(),h=e.od();r===h?Y(t,0,0,n,s,h):G(t,0,0,n,s,r,h)}Yp(t){const i=f(this.wp).E_().Wh().xt();null!==i&&i.K(t,!1)}Xp(t){const i=this.Ui().Nc();this.Jp(t,Ts,cs,i),this.Jp(t,Ts,ds,i)}Kp(t){this.Jp(t,Ts,ds,this.Ui().Fc())}qp(t,i){const n=f(this.wp).No();for(const s of n)this.Jp(t,i,cs,s);for(const s of n)this.Jp(t,i,ds,s)}Jp(t,i,n,s){const e=f(this.wp),r=e.qt().Vc(),h=null!==r&&r.zc===s,l=null!==r&&h&&void 0!==r.pv?r.pv.gr:void 0;fs(i,(i=>n(i,t,h,l)),s,e)}Pp(){if(null===this.wp)return;const t=this.gp,i=this.wp.S_().W().visible,n=this.wp.y_().W().visible;i||null===this.lp||(this.Sp.removeChild(this.lp.jv()),this.lp.S(),this.lp=null),n||null===this.ap||(this.yp.removeChild(this.ap.jv()),this.ap.S(),this.ap=null);const s=t.qt().sd();i&&null===this.lp&&(this.lp=new ks(this,t.W(),s,"left"),this.Sp.appendChild(this.lp.jv())),n&&null===this.ap&&(this.ap=new ks(this,t.W(),s,"right"),this.yp.appendChild(this.ap.jv()))}Qp(t){return t.uv&&this.fp||null!==this.vp}tm(t){return Math.max(0,Math.min(t,this.wv.width-1))}im(t){return Math.max(0,Math.min(t,this.wv.height-1))}Op(t,i,n){this.Ui().Jc(this.tm(t),this.im(i),n,f(this.wp))}Np(){this.Ui().td()}jp(){this.pp&&(this.vp=null,this.Np())}Lp(t,i,n){this.vp=t,this.pp=!1,this.Op(i.x,i.y,n);const s=this.Ui().Fc();this.mp={x:s.Kt(),y:s.Zt()}}Ui(){return this.gp.qt()}Ip(t){if(!this._p)return;const i=this.Ui(),n=this.Kv();if(i.D_(n,n.vn()),this.op=null,this._p=!1,i.Kc(),null!==this.bp){const t=performance.now(),n=i.kt();this.bp.Dr(n.Iu(),t),this.bp.Yu(t)||i.Xn(this.bp)}}Dp(){this.vp=null}Ap(){if(!this.wp)return;if(this.Ui().Un(),document.activeElement!==document.body&&document.activeElement!==document.documentElement)f(document.activeElement).blur();else{const t=document.getSelection();null!==t&&t.removeAllRanges()}!this.wp.vn().Fi()&&this.Ui().kt().Fi()}Ep(t){if(null===this.wp)return;const i=this.Ui(),n=i.kt();if(n.Fi())return;const s=this.gp.W(),e=s.handleScroll,r=s.kineticScroll;if((!e.pressedMouseMove||t.uv)&&(!e.horzTouchDrag&&!e.vertTouchDrag||!t.uv))return;const h=this.wp.vn(),l=performance.now();if(null!==this.op||this.Qp(t)||(this.op={x:t.clientX,y:t.clientY,yd:l,nm:t.localX,sm:t.localY}),null!==this.op&&!this._p&&(this.op.x!==t.clientX||this.op.y!==t.clientY)){if(t.uv&&r.touch||!t.uv&&r.mouse){const t=n.he();this.bp=new _s(.2/t,7/t,.997,15/t),this.bp.Nd(n.Iu(),this.op.yd)}else this.bp=null;h.Fi()||i.P_(this.wp,h,t.localY),i.Yc(t.localX),this._p=!0}this._p&&(h.Fi()||i.R_(this.wp,h,t.localY),i.Xc(t.localX),null!==this.bp&&this.bp.Nd(n.Iu(),l))}}class Os{constructor(t,i,n,s,e){this.bt=!0,this.wv=Gn({width:0,height:0}),this.yv=()=>this.Zv(3),this.Tv="left"===t,this.yc=n.sd,this.cn=i,this.rm=s,this.hm=e,this.Ov=document.createElement("div"),this.Ov.style.width="25px",this.Ov.style.height="100%",this.Ov.style.overflow="hidden",this.Av=us(this.Ov,Gn({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.yv)}S(){this.Av.unsubscribeSuggestedBitmapSizeChanged(this.yv),this.Av.dispose()}jv(){return this.Ov}$p(){return this.wv}Yv(t){Jn(this.wv,t)||(this.wv=t,this.Av.resizeCanvasElement(t),this.Ov.style.width=`${t.width}px`,this.Ov.style.height=`${t.height}px`,this.bt=!0)}Zv(t){if(t<3&&!this.bt)return;if(0===this.wv.width||0===this.wv.height)return;this.bt=!1,this.Av.applySuggestedBitmapSize();const i=ss(this.Av);null!==i&&i.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Be(t)}))}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Be({context:t,bitmapSize:i,horizontalPixelRatio:n,verticalPixelRatio:s}){if(!this.rm())return;t.fillStyle=this.cn.timeScale.borderColor;const e=Math.floor(this.yc.W().C*n),r=Math.floor(this.yc.W().C*s),h=this.Tv?i.width-e:0;t.fillRect(h,0,e,r)}Jv({context:t,bitmapSize:i}){Y(t,0,0,i.width,i.height,this.hm())}}function As(t){return i=>{var n,s;return null!==(s=null===(n=i.aa)||void 0===n?void 0:n.call(i,t))&&void 0!==s?s:[]}}const Vs=As("normal"),Bs=As("top"),zs=As("bottom");class Es{constructor(t,i){this.lm=null,this.am=null,this.k=null,this.om=!1,this.wv=Gn({width:0,height:0}),this._m=new k,this.Mv=new Qt(5),this.Sv=!1,this.yv=()=>{this.Sv||this.gp.qt().Fh()},this.Cv=()=>{this.Sv||this.gp.qt().Fh()},this.gp=t,this.N_=i,this.cn=t.W().layout,this.um=document.createElement("tr"),this.dm=document.createElement("td"),this.dm.style.padding="0",this.fm=document.createElement("td"),this.fm.style.padding="0",this.Ov=document.createElement("td"),this.Ov.style.height="25px",this.Ov.style.padding="0",this.vm=document.createElement("div"),this.vm.style.width="100%",this.vm.style.height="100%",this.vm.style.position="relative",this.vm.style.overflow="hidden",this.Ov.appendChild(this.vm),this.Av=us(this.vm,Gn({width:16,height:16})),this.Av.subscribeSuggestedBitmapSizeChanged(this.yv);const n=this.Av.canvasElement;n.style.position="absolute",n.style.zIndex="1",n.style.left="0",n.style.top="0",this.Vv=us(this.vm,Gn({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.Cv);const s=this.Vv.canvasElement;s.style.position="absolute",s.style.zIndex="2",s.style.left="0",s.style.top="0",this.um.appendChild(this.dm),this.um.appendChild(this.Ov),this.um.appendChild(this.fm),this.pm(),this.gp.qt().f_().l(this.pm.bind(this),this),this.Wv=new ps(this.Vv.canvasElement,this,{Nf:()=>!0,Ff:()=>!this.gp.W().handleScroll.horzTouchDrag})}S(){this.Wv.S(),null!==this.lm&&this.lm.S(),null!==this.am&&this.am.S(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.Cv),this.Vv.dispose(),this.Av.unsubscribeSuggestedBitmapSizeChanged(this.yv),this.Av.dispose()}jv(){return this.um}bm(){return this.lm}wm(){return this.am}Qf(t){if(this.om)return;this.om=!0;const i=this.gp.qt();!i.kt().Fi()&&this.gp.W().handleScale.axisPressedMouseMove.time&&i.$c(t.localX)}Gf(t){this.Qf(t)}tv(){const t=this.gp.qt();!t.kt().Fi()&&this.om&&(this.om=!1,this.gp.W().handleScale.axisPressedMouseMove.time&&t.Gc())}Hf(t){const i=this.gp.qt();!i.kt().Fi()&&this.gp.W().handleScale.axisPressedMouseMove.time&&i.Zc(t.localX)}Wf(t){this.Hf(t)}Yf(){this.om=!1;const t=this.gp.qt();t.kt().Fi()&&!this.gp.W().handleScale.axisPressedMouseMove.time||t.Gc()}Uf(){this.Yf()}Tf(){this.gp.W().handleScale.axisDoubleClickReset.time&&this.gp.qt().Zn()}Sf(){this.Tf()}Bf(){this.gp.qt().W().handleScale.axisPressedMouseMove.time&&this.rp(1)}ov(){this.rp(0)}$p(){return this.wv}gm(){return this._m}Mm(t,i,n){Jn(this.wv,t)||(this.wv=t,this.Sv=!0,this.Av.resizeCanvasElement(t),this.Vv.resizeCanvasElement(t),this.Sv=!1,this.Ov.style.width=`${t.width}px`,this.Ov.style.height=`${t.height}px`,this._m.m(t)),null!==this.lm&&this.lm.Yv(Gn({width:i,height:t.height})),null!==this.am&&this.am.Yv(Gn({width:n,height:t.height}))}xm(){const t=this.Sm();return Math.ceil(t.C+t.T+t.P+t.L+t.V+t.ym)}gt(){this.gp.qt().kt().Ia()}sp(){return this.Av.bitmapSize}ep(t,i,n){const s=this.sp();s.width>0&&s.height>0&&t.drawImage(this.Av.canvasElement,i,n)}Zv(t){if(0===t)return;if(1!==t){this.Av.applySuggestedBitmapSize();const i=ss(this.Av);null!==i&&(i.useBitmapCoordinateSpace((t=>{this.Jv(t),this.Be(t),this.km(i,zs)})),this.tp(i),this.km(i,Vs)),null!==this.lm&&this.lm.Zv(t),null!==this.am&&this.am.Zv(t)}this.Vv.applySuggestedBitmapSize();const i=ss(this.Vv);null!==i&&(i.useBitmapCoordinateSpace((({context:t,bitmapSize:i})=>{t.clearRect(0,0,i.width,i.height)})),this.Cm([...this.gp.qt().Mt(),this.gp.qt().Fc()],i),this.km(i,Bs))}km(t,i){const n=this.gp.qt().Mt();for(const s of n)fs(i,(i=>cs(i,t,!1,void 0)),s,void 0);for(const s of n)fs(i,(i=>ds(i,t,!1,void 0)),s,void 0)}Jv({context:t,bitmapSize:i}){Y(t,0,0,i.width,i.height,this.gp.qt().od())}Be({context:t,bitmapSize:i,verticalPixelRatio:n}){if(this.gp.W().timeScale.borderVisible){t.fillStyle=this.Tm();const s=Math.max(1,Math.floor(this.Sm().C*n));t.fillRect(0,0,i.width,s)}}tp(t){const i=this.gp.qt().kt(),n=i.Ia();if(!n||0===n.length)return;const s=this.N_.maxTickMarkWeight(n),e=this.Sm(),r=i.W();r.borderVisible&&r.ticksVisible&&t.useBitmapCoordinateSpace((({context:t,horizontalPixelRatio:i,verticalPixelRatio:s})=>{t.strokeStyle=this.Tm(),t.fillStyle=this.Tm();const r=Math.max(1,Math.floor(i)),h=Math.floor(.5*i);t.beginPath();const l=Math.round(e.T*s);for(let s=n.length;s--;){const e=Math.round(n[s].coord*i);t.rect(e-h,0,r,l)}t.fill()})),t.useMediaCoordinateSpace((({context:t})=>{const i=e.C+e.T+e.L+e.P/2;t.textAlign="center",t.textBaseline="middle",t.fillStyle=this.$(),t.font=this.Uv();for(const e of n)if(e.weight=s){const n=e.needAlignCoordinate?this.Pm(t,e.coord,e.label):e.coord;t.fillText(e.label,n,i)}}))}Pm(t,i,n){const s=this.Mv.Si(t,n),e=s/2,r=Math.floor(i-e)+.5;return r<0?i+=Math.abs(0-r):r+s>this.wv.width&&(i-=Math.abs(this.wv.width-(r+s))),i}Cm(t,i){const n=this.Sm();for(const s of t)for(const t of s.tn())t.xt().K(i,n)}Tm(){return this.gp.W().timeScale.borderColor}$(){return this.cn.textColor}j(){return this.cn.fontSize}Uv(){return z(this.j(),this.cn.fontFamily)}Rm(){return z(this.j(),this.cn.fontFamily,"bold")}Sm(){null===this.k&&(this.k={C:1,N:NaN,L:NaN,V:NaN,Hi:NaN,T:5,P:NaN,R:"",ji:new Qt,ym:0});const t=this.k,i=this.Uv();if(t.R!==i){const n=this.j();t.P=n,t.R=i,t.L=3*n/12,t.V=3*n/12,t.Hi=9*n/12,t.N=0,t.ym=4*n/12,t.ji.ir()}return this.k}rp(t){this.Ov.style.cursor=1===t?"ew-resize":"default"}pm(){const t=this.gp.qt(),i=t.W();i.leftPriceScale.visible||null===this.lm||(this.dm.removeChild(this.lm.jv()),this.lm.S(),this.lm=null),i.rightPriceScale.visible||null===this.am||(this.fm.removeChild(this.am.jv()),this.am.S(),this.am=null);const n={sd:this.gp.qt().sd()},s=()=>i.leftPriceScale.borderVisible&&t.kt().W().borderVisible,e=()=>t.od();i.leftPriceScale.visible&&null===this.lm&&(this.lm=new Os("left",i,n,s,e),this.dm.appendChild(this.lm.jv())),i.rightPriceScale.visible&&null===this.am&&(this.am=new Os("right",i,n,s,e),this.fm.appendChild(this.am.jv()))}}const Is=!!es&&!!navigator.userAgentData&&navigator.userAgentData.brands.some((t=>t.brand.includes("Chromium")))&&!!es&&((null===(Ls=null===navigator||void 0===navigator?void 0:navigator.userAgentData)||void 0===Ls?void 0:Ls.platform)?"Windows"===navigator.userAgentData.platform:navigator.userAgent.toLowerCase().indexOf("win")>=0);var Ls;class Ns{constructor(t,i,n){var s;this.Dm=[],this.Om=0,this.Qa=0,this.e_=0,this.Am=0,this.Vm=0,this.Bm=null,this.zm=!1,this.up=new k,this.cp=new k,this.Mc=new k,this.Em=null,this.Im=null,this.Lm=t,this.cn=i,this.N_=n,this.um=document.createElement("div"),this.um.classList.add("tv-lightweight-charts"),this.um.style.overflow="hidden",this.um.style.direction="ltr",this.um.style.width="100%",this.um.style.height="100%",(s=this.um).style.userSelect="none",s.style.webkitUserSelect="none",s.style.msUserSelect="none",s.style.MozUserSelect="none",s.style.webkitTapHighlightColor="transparent",this.Nm=document.createElement("table"),this.Nm.setAttribute("cellspacing","0"),this.um.appendChild(this.Nm),this.Fm=this.Wm.bind(this),Fs(this.cn)&&this.jm(!0),this.Ui=new An(this.Sc.bind(this),this.cn,n),this.qt().Wc().l(this.Hm.bind(this),this),this.$m=new Es(this,this.N_),this.Nm.appendChild(this.$m.jv());const e=i.autoSize&&this.Um();let r=this.cn.width,h=this.cn.height;if(e||0===r||0===h){const i=t.getBoundingClientRect();r=r||i.width,h=h||i.height}this.qm(r,h),this.Ym(),t.appendChild(this.um),this.Xm(),this.Ui.kt().Gu().l(this.Ui.$l.bind(this.Ui),this),this.Ui.f_().l(this.Ui.$l.bind(this.Ui),this)}qt(){return this.Ui}W(){return this.cn}Km(){return this.Dm}Zm(){return this.$m}S(){this.jm(!1),0!==this.Om&&window.cancelAnimationFrame(this.Om),this.Ui.Wc().p(this),this.Ui.kt().Gu().p(this),this.Ui.f_().p(this),this.Ui.S();for(const t of this.Dm)this.Nm.removeChild(t.jv()),t.Fp().p(this),t.Wp().p(this),t.S();this.Dm=[],f(this.$m).S(),null!==this.um.parentElement&&this.um.parentElement.removeChild(this.um),this.Mc.S(),this.up.S(),this.cp.S(),this.Gm()}qm(t,i,n=!1){if(this.Qa===i&&this.e_===t)return;const s=function(t){const i=Math.floor(t.width),n=Math.floor(t.height);return Gn({width:i-i%2,height:n-n%2})}(Gn({width:t,height:i}));this.Qa=s.height,this.e_=s.width;const e=this.Qa+"px",r=this.e_+"px";f(this.um).style.height=e,f(this.um).style.width=r,this.Nm.style.height=e,this.Nm.style.width=r,n?this.Jm(at.es(),performance.now()):this.Ui.$l()}Zv(t){void 0===t&&(t=at.es());for(let i=0;i{let s=0;for(let e=0;e{f("left"===i?this.$m.bm():this.$m.wm()).ep(f(t),n,s)};if(this.cn.timeScale.visible){const i=this.$m.sp();if(null!==t){let e=0;this.sb()&&(r("left",e,n),e=f(s.Zp()).sp().width),this.$m.ep(t,e,n),e+=i.width,this.eb()&&r("right",e,n)}n+=i.height}return Gn({width:i,height:n})}ob(){let t=0,i=0,n=0;for(const s of this.Dm)this.sb()&&(i=Math.max(i,f(s.Zp()).$v(),this.cn.leftPriceScale.minimumWidth)),this.eb()&&(n=Math.max(n,f(s.Gp()).$v(),this.cn.rightPriceScale.minimumWidth)),t+=s.v_();i=ls(i),n=ls(n);const s=this.e_,e=this.Qa,r=Math.max(s-i-n,0),h=this.cn.timeScale.visible;let l=h?Math.max(this.$m.xm(),this.cn.timeScale.minimumHeight):0;var a;l=(a=l)+a%2;const o=0+l,_=e{t.Rp()})),3===(null===(n=this.Bm)||void 0===n?void 0:n.jn())&&(this.Bm.ts(t),this.ub(),this.cb(this.Bm),this.fb(this.Bm,i),t=this.Bm,this.Bm=null)),this.Zv(t)}fb(t,i){for(const n of t.Qn())this.ns(n,i)}cb(t){const i=this.Ui.Lc();for(let n=0;n{if(this.zm=!1,this.Om=0,null!==this.Bm){const i=this.Bm;this.Bm=null,this.Jm(i,t);for(const n of i.Qn())if(5===n.qn&&!n.Vt.Yu(t)){this.qt().Xn(n.Vt);break}}})))}ub(){this.Ym()}Ym(){const t=this.Ui.Lc(),i=t.length,n=this.Dm.length;for(let t=i;t{const n=i.zn().nl(t);null!==n&&e.set(i,n)}))}let r;if(null!==t){const i=null===(s=this.Ui.kt().qi(t))||void 0===s?void 0:s.originalTime;void 0!==i&&(r=i)}const h=this.qt().Vc(),l=null!==h&&h.zc instanceof Yi?h.zc:void 0,a=null!==h&&void 0!==h.pv?h.pv.wr:void 0;return{bb:r,se:null!=t?t:void 0,wb:null!=i?i:void 0,gb:l,Mb:e,xb:a,Sb:null!=n?n:void 0}}vb(t,i,n){this.up.m((()=>this.mb(t,i,n)))}pb(t,i,n){this.cp.m((()=>this.mb(t,i,n)))}Hm(t,i,n){this.Mc.m((()=>this.mb(t,i,n)))}Xm(){const t=this.cn.timeScale.visible?"":"none";this.$m.jv().style.display=t}sb(){return this.Dm[0].Kv().S_().W().visible}eb(){return this.Dm[0].Kv().y_().W().visible}Um(){return"ResizeObserver"in window&&(this.Em=new ResizeObserver((t=>{const i=t.find((t=>t.target===this.Lm));i&&this.qm(i.contentRect.width,i.contentRect.height)})),this.Em.observe(this.Lm,{box:"border-box"}),!0)}Gm(){null!==this.Em&&this.Em.disconnect(),this.Em=null}}function Fs(t){return Boolean(t.handleScroll.mouseWheel||t.handleScale.mouseWheel)}function Ws(t,i){var n={};for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&i.indexOf(s)<0&&(n[s]=t[s]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var e=0;for(s=Object.getOwnPropertySymbols(t);efunction(t,i){return i?i(t):void 0===(n=t).open&&void 0===n.value;var n}(s,h)?Ks({ut:i,se:n,bb:e},s):Ks(t(i,n,s,e,r),s)}function Gs(t){return{Candlestick:Zs(qs),Bar:Zs(Us),Area:Zs(Hs),Baseline:Zs($s),Histogram:Zs(js),Line:Zs(js),Custom:Zs(Ys)}[t]}function Js(t){return{se:0,kb:new Map,ia:t}}function Qs(t,i){if(void 0!==t&&0!==t.length)return{Cb:i.key(t[0].ut),Tb:i.key(t[t.length-1].ut)}}function te(t){let i;return t.forEach((t=>{void 0===i&&(i=t.bb)})),d(i)}class ie{constructor(t){this.Pb=new Map,this.Rb=new Map,this.Db=new Map,this.Ob=[],this.N_=t}S(){this.Pb.clear(),this.Rb.clear(),this.Db.clear(),this.Ob=[]}Ab(t,i){let n=0!==this.Pb.size,s=!1;const e=this.Rb.get(t);if(void 0!==e)if(1===this.Rb.size)n=!1,s=!0,this.Pb.clear();else for(const i of this.Ob)i.pointData.kb.delete(t)&&(s=!0);let r=[];if(0!==i.length){const n=i.map((t=>t.time)),e=this.N_.createConverterToInternalObj(i),h=Gs(t.Xh()),l=t.ga(),a=t.Ma();r=i.map(((i,r)=>{const o=e(i.time),_=this.N_.key(o);let u=this.Pb.get(_);void 0===u&&(u=Js(o),this.Pb.set(_,u),s=!0);const c=h(o,u.se,i,n[r],l,a);return u.kb.set(t,c),c}))}n&&this.Vb(),this.Bb(t,r);let h=-1;if(s){const t=[];this.Pb.forEach((i=>{t.push({timeWeight:0,time:i.ia,pointData:i,originalTime:te(i.kb)})})),t.sort(((t,i)=>this.N_.key(t.time)-this.N_.key(i.time))),h=this.zb(t)}return this.Eb(t,h,function(t,i,n){const s=Qs(t,n),e=Qs(i,n);if(void 0!==s&&void 0!==e)return{Xl:s.Tb>=e.Tb&&s.Cb>=e.Cb}}(this.Rb.get(t),e,this.N_))}hd(t){return this.Ab(t,[])}Ib(t,i){const n=i;!function(t){void 0===t.bb&&(t.bb=t.time)}(n),this.N_.preprocessData(i);const s=this.N_.createConverterToInternalObj([i])(i.time),e=this.Db.get(t);if(void 0!==e&&this.N_.key(s)this.N_.key(t.time)this.N_.key(s.ut)?Xs(i)&&n.push(i):Xs(i)?n[n.length-1]=i:n.splice(-1,1),this.Db.set(t,i.ut)}Bb(t,i){0!==i.length?(this.Rb.set(t,i.filter(Xs)),this.Db.set(t,i[i.length-1].ut)):(this.Rb.delete(t),this.Db.delete(t))}Vb(){for(const t of this.Ob)0===t.pointData.kb.size&&this.Pb.delete(this.N_.key(t.time))}zb(t){let i=-1;for(let n=0;n{0!==i.length&&(t=Math.max(t,i[i.length-1].se))})),t}Eb(t,i,n){const s={Fb:new Map,kt:{Au:this.Nb()}};if(-1!==i)this.Rb.forEach(((i,e)=>{s.Fb.set(e,{He:i,Wb:e===t?n:void 0})})),this.Rb.has(t)||s.Fb.set(t,{He:[],Wb:n}),s.kt.jb=this.Ob,s.kt.Hb=i;else{const i=this.Rb.get(t);s.Fb.set(t,{He:i||[],Wb:n})}return s}}function ne(t,i){t.se=i,t.kb.forEach((t=>{t.se=i}))}function se(t){const i={value:t.Vt[3],time:t.bb};return void 0!==t.yb&&(i.customValues=t.yb),i}function ee(t){const i=se(t);return void 0!==t.O&&(i.color=t.O),i}function re(t){const i=se(t);return void 0!==t._t&&(i.lineColor=t._t),void 0!==t.Ts&&(i.topColor=t.Ts),void 0!==t.Ps&&(i.bottomColor=t.Ps),i}function he(t){const i=se(t);return void 0!==t.Pe&&(i.topLineColor=t.Pe),void 0!==t.Re&&(i.bottomLineColor=t.Re),void 0!==t.Se&&(i.topFillColor1=t.Se),void 0!==t.ye&&(i.topFillColor2=t.ye),void 0!==t.ke&&(i.bottomFillColor1=t.ke),void 0!==t.Ce&&(i.bottomFillColor2=t.Ce),i}function le(t){const i={open:t.Vt[0],high:t.Vt[1],low:t.Vt[2],close:t.Vt[3],time:t.bb};return void 0!==t.yb&&(i.customValues=t.yb),i}function ae(t){const i=le(t);return void 0!==t.O&&(i.color=t.O),i}function oe(t){const i=le(t),{O:n,Bt:s,$h:e}=t;return void 0!==n&&(i.color=n),void 0!==s&&(i.borderColor=s),void 0!==e&&(i.wickColor=e),i}function _e(t){return{Area:re,Line:ee,Baseline:he,Histogram:ee,Bar:ae,Candlestick:oe,Custom:ue}[t]}function ue(t){const i=t.bb;return Object.assign(Object.assign({},t.He),{time:i})}const ce={vertLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},horzLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},mode:1},de={vertLines:{color:"#D6DCDE",style:0,visible:!0},horzLines:{color:"#D6DCDE",style:0,visible:!0}},fe={background:{type:"solid",color:"#FFFFFF"},textColor:"#191919",fontSize:12,fontFamily:B},ve={autoScale:!0,mode:0,invertScale:!1,alignLabels:!0,borderVisible:!0,borderColor:"#2B2B43",entireTextOnly:!1,visible:!1,ticksVisible:!1,scaleMargins:{bottom:.1,top:.2},minimumWidth:0},pe={rightOffset:0,barSpacing:6,minBarSpacing:.5,fixLeftEdge:!1,fixRightEdge:!1,lockVisibleTimeRangeOnResize:!1,rightBarStaysOnScroll:!1,borderVisible:!0,borderColor:"#2B2B43",visible:!0,timeVisible:!1,secondsVisible:!0,shiftVisibleRangeOnNewBar:!0,allowShiftVisibleRangeOnWhitespaceReplacement:!1,ticksVisible:!1,uniformDistribution:!1,minimumHeight:0},me={color:"rgba(0, 0, 0, 0)",visible:!1,fontSize:48,fontFamily:B,fontStyle:"",text:"",horzAlign:"center",vertAlign:"center"};function be(){return{width:0,height:0,autoSize:!1,layout:fe,crosshair:ce,grid:de,overlayPriceScales:Object.assign({},ve),leftPriceScale:Object.assign(Object.assign({},ve),{visible:!1}),rightPriceScale:Object.assign(Object.assign({},ve),{visible:!0}),timeScale:pe,watermark:me,localization:{locale:es?navigator.language:"",dateFormat:"dd MMM 'yy"},handleScroll:{mouseWheel:!0,pressedMouseMove:!0,horzTouchDrag:!0,vertTouchDrag:!0},handleScale:{axisPressedMouseMove:{time:!0,price:!0},axisDoubleClickReset:{time:!0,price:!0},mouseWheel:!0,pinch:!0},kineticScroll:{mouse:!1,touch:!0},trackingMode:{exitMode:1}}}class we{constructor(t,i){this.$b=t,this.Ub=i}applyOptions(t){this.$b.qt().Ec(this.Ub,t)}options(){return this.Li().W()}width(){return lt(this.Ub)?this.$b.nb(this.Ub):0}Li(){return f(this.$b.qt().Ic(this.Ub)).At}}function ge(t,i,n){const s=Ws(t,["time","originalTime"]),e=Object.assign({time:i},s);return void 0!==n&&(e.originalTime=n),e}const Me={color:"#FF0000",price:0,lineStyle:2,lineWidth:1,lineVisible:!0,axisLabelVisible:!0,title:"",axisLabelColor:"",axisLabelTextColor:""};class xe{constructor(t){this.Bh=t}applyOptions(t){this.Bh.Nh(t)}options(){return this.Bh.W()}qb(){return this.Bh}}class Se{constructor(t,i,n,s,e){this.Yb=new k,this.Is=t,this.Xb=i,this.Kb=n,this.N_=e,this.Zb=s}S(){this.Yb.S()}priceFormatter(){return this.Is.ca()}priceToCoordinate(t){const i=this.Is.Pt();return null===i?null:this.Is.At().Ot(t,i.Vt)}coordinateToPrice(t){const i=this.Is.Pt();return null===i?null:this.Is.At().pn(t,i.Vt)}barsInLogicalRange(t){if(null===t)return null;const i=new Mn(new bn(t.from,t.to)).iu(),n=this.Is.zn();if(n.Fi())return null;const s=n.nl(i.Os(),1),e=n.nl(i.di(),-1),r=f(n.Qh()),h=f(n.Bn());if(null!==s&&null!==e&&s.se>e.se)return{barsBefore:t.from-r,barsAfter:h-t.to};const l={barsBefore:null===s||s.se===r?t.from-r:s.se-r,barsAfter:null===e||e.se===h?h-t.to:h-e.se};return null!==s&&null!==e&&(l.from=s.bb,l.to=e.bb),l}setData(t){this.N_,this.Is.Xh(),this.Xb.Gb(this.Is,t),this.Jb("full")}update(t){this.Is.Xh(),this.Xb.Qb(this.Is,t),this.Jb("update")}dataByIndex(t,i){const n=this.Is.zn().nl(t,i);if(null===n)return null;return _e(this.seriesType())(n)}data(){const t=_e(this.seriesType());return this.Is.zn().ie().map((i=>t(i)))}subscribeDataChanged(t){this.Yb.l(t)}unsubscribeDataChanged(t){this.Yb.v(t)}setMarkers(t){this.N_;const i=t.map((t=>ge(t,this.N_.convertHorzItemToInternal(t.time),t.time)));this.Is.Zl(i)}markers(){return this.Is.Gl().map((t=>ge(t,t.originalTime,void 0)))}applyOptions(t){this.Is.Nh(t)}options(){return O(this.Is.W())}priceScale(){return this.Kb.priceScale(this.Is.At().xa())}createPriceLine(t){const i=C(O(Me),t),n=this.Is.Jl(i);return new xe(n)}removePriceLine(t){this.Is.Ql(t.qb())}seriesType(){return this.Is.Xh()}attachPrimitive(t){this.Is.ba(t),t.attached&&t.attached({chart:this.Zb,series:this,requestUpdate:()=>this.Is.qt().$l()})}detachPrimitive(t){this.Is.wa(t),t.detached&&t.detached()}Jb(t){this.Yb.M()&&this.Yb.m(t)}}class ye{constructor(t,i,n){this.tw=new k,this.uu=new k,this._m=new k,this.Ui=t,this.wl=t.kt(),this.$m=i,this.wl.Ku().l(this.iw.bind(this)),this.wl.Zu().l(this.nw.bind(this)),this.$m.gm().l(this.sw.bind(this)),this.N_=n}S(){this.wl.Ku().p(this),this.wl.Zu().p(this),this.$m.gm().p(this),this.tw.S(),this.uu.S(),this._m.S()}scrollPosition(){return this.wl.Iu()}scrollToPosition(t,i){i?this.wl.qu(t,1e3):this.Ui.Jn(t)}scrollToRealTime(){this.wl.Uu()}getVisibleRange(){const t=this.wl.ku();return null===t?null:{from:t.from.originalTime,to:t.to.originalTime}}setVisibleRange(t){const i={from:this.N_.convertHorzItemToInternal(t.from),to:this.N_.convertHorzItemToInternal(t.to)},n=this.wl.Ru(i);this.Ui.ld(n)}getVisibleLogicalRange(){const t=this.wl.yu();return null===t?null:{from:t.Os(),to:t.di()}}setVisibleLogicalRange(t){c(t.from<=t.to,"The from index cannot be after the to index."),this.Ui.ld(t)}resetTimeScale(){this.Ui.Zn()}fitContent(){this.Ui.Qu()}logicalToCoordinate(t){const i=this.Ui.kt();return i.Fi()?null:i.It(t)}coordinateToLogical(t){return this.wl.Fi()?null:this.wl.Vu(t)}timeToCoordinate(t){const i=this.N_.convertHorzItemToInternal(t),n=this.wl.ka(i,!1);return null===n?null:this.wl.It(n)}coordinateToTime(t){const i=this.Ui.kt(),n=i.Vu(t),s=i.qi(n);return null===s?null:s.originalTime}width(){return this.$m.$p().width}height(){return this.$m.$p().height}subscribeVisibleTimeRangeChange(t){this.tw.l(t)}unsubscribeVisibleTimeRangeChange(t){this.tw.v(t)}subscribeVisibleLogicalRangeChange(t){this.uu.l(t)}unsubscribeVisibleLogicalRangeChange(t){this.uu.v(t)}subscribeSizeChange(t){this._m.l(t)}unsubscribeSizeChange(t){this._m.v(t)}applyOptions(t){this.wl.Nh(t)}options(){return Object.assign(Object.assign({},O(this.wl.W())),{barSpacing:this.wl.he()})}iw(){this.tw.M()&&this.tw.m(this.getVisibleRange())}nw(){this.uu.M()&&this.uu.m(this.getVisibleLogicalRange())}sw(t){this._m.m(t.width,t.height)}}function ke(t){if(void 0===t||"custom"===t.type)return;const i=t;void 0!==i.minMove&&void 0===i.precision&&(i.precision=function(t){if(t>=1)return 0;let i=0;for(;i<8;i++){const n=Math.round(t);if(Math.abs(n-t)<1e-8)return i;t*=10}return i}(i.minMove))}function Ce(t){return function(t){if(D(t.handleScale)){const i=t.handleScale;t.handleScale={axisDoubleClickReset:{time:i,price:i},axisPressedMouseMove:{time:i,price:i},mouseWheel:i,pinch:i}}else if(void 0!==t.handleScale){const{axisPressedMouseMove:i,axisDoubleClickReset:n}=t.handleScale;D(i)&&(t.handleScale.axisPressedMouseMove={time:i,price:i}),D(n)&&(t.handleScale.axisDoubleClickReset={time:n,price:n})}const i=t.handleScroll;D(i)&&(t.handleScroll={horzTouchDrag:i,vertTouchDrag:i,mouseWheel:i,pressedMouseMove:i})}(t),t}class Te{constructor(t,i,n){this.ew=new Map,this.rw=new Map,this.hw=new k,this.lw=new k,this.aw=new k,this.ow=new ie(i);const s=void 0===n?O(be()):C(O(be()),Ce(n));this.N_=i,this.$b=new Ns(t,s,i),this.$b.Fp().l((t=>{this.hw.M()&&this.hw.m(this._w(t()))}),this),this.$b.Wp().l((t=>{this.lw.M()&&this.lw.m(this._w(t()))}),this),this.$b.Wc().l((t=>{this.aw.M()&&this.aw.m(this._w(t()))}),this);const e=this.$b.qt();this.uw=new ye(e,this.$b.Zm(),this.N_)}remove(){this.$b.Fp().p(this),this.$b.Wp().p(this),this.$b.Wc().p(this),this.uw.S(),this.$b.S(),this.ew.clear(),this.rw.clear(),this.hw.S(),this.lw.S(),this.aw.S(),this.ow.S()}resize(t,i,n){this.autoSizeActive()||this.$b.qm(t,i,n)}addCustomSeries(t,i){const n=v(t),s=Object.assign(Object.assign({},h),n.defaultOptions());return this.cw("Custom",s,i,n)}addAreaSeries(t){return this.cw("Area",s,t)}addBaselineSeries(t){return this.cw("Baseline",e,t)}addBarSeries(t){return this.cw("Bar",i,t)}addCandlestickSeries(i={}){return function(t){void 0!==t.borderColor&&(t.borderUpColor=t.borderColor,t.borderDownColor=t.borderColor),void 0!==t.wickColor&&(t.wickUpColor=t.wickColor,t.wickDownColor=t.wickColor)}(i),this.cw("Candlestick",t,i)}addHistogramSeries(t){return this.cw("Histogram",r,t)}addLineSeries(t){return this.cw("Line",n,t)}removeSeries(t){const i=d(this.ew.get(t)),n=this.ow.hd(i);this.$b.qt().hd(i),this.dw(n),this.ew.delete(t),this.rw.delete(i)}Gb(t,i){this.dw(this.ow.Ab(t,i))}Qb(t,i){this.dw(this.ow.Ib(t,i))}subscribeClick(t){this.hw.l(t)}unsubscribeClick(t){this.hw.v(t)}subscribeCrosshairMove(t){this.aw.l(t)}unsubscribeCrosshairMove(t){this.aw.v(t)}subscribeDblClick(t){this.lw.l(t)}unsubscribeDblClick(t){this.lw.v(t)}priceScale(t){return new we(this.$b,t)}timeScale(){return this.uw}applyOptions(t){this.$b.Nh(Ce(t))}options(){return this.$b.W()}takeScreenshot(){return this.$b.tb()}autoSizeActive(){return this.$b.rb()}chartElement(){return this.$b.hb()}paneSize(){const t=this.$b.ab();return{height:t.height,width:t.width}}setCrosshairPosition(t,i,n){const s=this.ew.get(n);if(void 0===s)return;const e=this.$b.qt().cr(s);null!==e&&this.$b.qt().Qc(t,i,e)}clearCrosshairPosition(){this.$b.qt().td(!0)}cw(t,i,n={},s){ke(n.priceFormat);const e=C(O(l),O(i),n),r=this.$b.qt().ed(t,e,s),h=new Se(r,this,this,this,this.N_);return this.ew.set(h,r),this.rw.set(r,h),h}dw(t){const i=this.$b.qt();i.nd(t.kt.Au,t.kt.jb,t.kt.Hb),t.Fb.forEach(((t,i)=>i.it(t.He,t.Wb))),i.zu()}fw(t){return d(this.rw.get(t))}_w(t){const i=new Map;t.Mb.forEach(((t,n)=>{const s=n.Xh(),e=_e(s)(t);if("Custom"!==s)c(function(t){return void 0!==t.open||void 0!==t.value}(e));else{const t=n.Ma();c(!t||!1===t(e))}i.set(this.fw(n),e)}));const n=void 0===t.gb?void 0:this.fw(t.gb);return{time:t.bb,logical:t.se,point:t.wb,hoveredSeries:n,hoveredObjectId:t.xb,seriesData:i,sourceEvent:t.Sb}}}function Pe(t,i,n){let s;if(R(t)){const i=document.getElementById(t);c(null!==i,`Cannot find element in DOM with id=${t}`),s=i}else s=t;const e=new Te(s,i,n);return i.setOptions(e.options()),e}function Re(t,i){return Pe(t,new Zn,Zn.Td(i))}const De=Object.assign(Object.assign({},l),h);function Oe(){return"4.2.0-dev+202405092055"}export{Dn as ColorType,rt as CrosshairMode,Pn as LastPriceAnimationMode,o as LineStyle,a as LineType,Vi as MismatchDirection,Rn as PriceLineSource,cn as PriceScaleMode,On as TickMarkType,Tn as TrackingModeExitMode,Re as createChart,Pe as createChartEx,De as customSeriesDefaultOptions,Vn as isBusinessDay,Bn as isUTCTimestamp,Oe as version}; -diff --git a/dist/typings.d.ts b/dist/typings.d.ts -index 97a82b7bc837b9513fd3693e867011c4a4ebbc83..503e68f336c642b955678e75b21d75df0df5d1b3 100644 ---- a/dist/typings.d.ts -+++ b/dist/typings.d.ts -@@ -69,7 +69,11 @@ export declare enum LineStyle { - /** - * A dotted line with more space between dots. - */ -- SparseDotted = 4 -+ SparseDotted = 4, -+ /** -+ * A dotted line with more space between dots. -+ */ -+ CustomDotGrid = 5 - } - /** - * Represents the possible line types. From 1609591f4cfb3b2fd4f010f86eb9be6ee90e058d Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 20 Jan 2026 00:17:06 +0700 Subject: [PATCH 5/6] Potential fix for code scanning alert no. 21: Incomplete URL substring sanitization Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- .../turnstileSolver.integration.test.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts b/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts index 424e096648a..f2ef7413cf8 100644 --- a/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts +++ b/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts @@ -25,7 +25,16 @@ beforeAll(() => { }) vi.spyOn(document.head, 'appendChild').mockImplementation((node) => { - if (node instanceof HTMLScriptElement && node.src.includes('challenges.cloudflare.com')) { + let isTurnstileScript = false + if (node instanceof HTMLScriptElement && node.src) { + try { + const url = new URL(node.src, window.location.href) + isTurnstileScript = url.hostname === 'challenges.cloudflare.com' + } catch { + isTurnstileScript = false + } + } + if (isTurnstileScript) { // Simulate script load immediately setTimeout(() => { // Set up the mock turnstile API From f6b397f75d76f3bbfce1219501cc4bc9f8092663 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 20 Jan 2026 00:22:38 +0700 Subject: [PATCH 6/6] Potential fix for code scanning alert no. 22: Incomplete URL substring sanitization Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- .../turnstileSolver.integration.test.ts | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts b/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts index f2ef7413cf8..f44c0c3151b 100644 --- a/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts +++ b/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts @@ -252,12 +252,20 @@ describe('Turnstile Solver Integration Tests', () => { it('handles script loading failures', async () => { // Mock script loading failure vi.spyOn(document.head, 'appendChild').mockImplementationOnce((node) => { - if (node instanceof HTMLScriptElement && node.src.includes('challenges.cloudflare.com')) { - setTimeout(() => { - if (node.onerror) { - node.onerror({} as Event) - } - }, 0) + if (node instanceof HTMLScriptElement) { + let host: string | null = null + try { + host = new URL(node.src, window.location.href).host + } catch { + host = null + } + if (host === 'challenges.cloudflare.com') { + setTimeout(() => { + if (node.onerror) { + node.onerror({} as Event) + } + }, 0) + } } return node })