diff --git a/public/nakamoto-mainnet.png b/public/nakamoto-mainnet.png new file mode 100644 index 000000000..e474c730b Binary files /dev/null and b/public/nakamoto-mainnet.png differ diff --git a/src/app/PageClient.tsx b/src/app/PageClient.tsx index f86feb1d6..afd14d7d4 100644 --- a/src/app/PageClient.tsx +++ b/src/app/PageClient.tsx @@ -1,16 +1,13 @@ 'use client'; -import { logError } from '@/common/utils/error-utils'; import { NextPage } from 'next'; import dynamic from 'next/dynamic'; -import { DEFAULT_BLOCKS_LIST_LIMIT, DEFAULT_LIST_LIMIT_SMALL } from '../common/constants/constants'; +import { DEFAULT_LIST_LIMIT_SMALL } from '../common/constants/constants'; import { useGlobalContext } from '../common/context/useGlobalContext'; -import { useRenderNewBlockList } from '../common/hooks/useIsNakamoto'; import { TxListTabs } from '../features/txs-list/tabs/TxListTabs'; import { Grid } from '../ui/Grid'; import { HomePageBlockListSkeleton } from './_components/BlockList/Grouped/skeleton'; -import { UpdatedBlocksList } from './_components/BlockList/UpdatedBlockList'; import { PageTitle } from './_components/PageTitle'; import { Stats } from './_components/Stats/Stats'; @@ -25,7 +22,6 @@ const HomePageBlockListDynamic = dynamic( const Home: NextPage = () => { const { activeNetwork } = useGlobalContext(); - const renderNewBlockList = useRenderNewBlockList(); return ( <> @@ -41,11 +37,7 @@ const Home: NextPage = () => { showFilterButton={false} showValueMenu={false} /> - {renderNewBlockList ? ( - - ) : ( - - )} + ); diff --git a/src/app/_components/BlockList/BlocksPage/BlocksPageHeaders.tsx b/src/app/_components/BlockList/BlocksPage/BlocksPageHeaders.tsx deleted file mode 100644 index f159cda76..000000000 --- a/src/app/_components/BlockList/BlocksPage/BlocksPageHeaders.tsx +++ /dev/null @@ -1,157 +0,0 @@ -'use client'; - -import { ReactNode, Suspense } from 'react'; - -import { BurnBlock, NakamotoBlock } from '@stacks/blockchain-api-client'; - -import { Card } from '../../../../common/components/Card'; -import { useSuspenseInfiniteQueryResult } from '../../../../common/hooks/useInfiniteQueryResult'; -import { useRenderNewBlockList } from '../../../../common/hooks/useIsNakamoto'; -import { useSuspenseBlocksByBurnBlock } from '../../../../common/queries/useBlocksByBurnBlock'; -import { useSuspenseBurnBlocks } from '../../../../common/queries/useBurnBlocksInfinite'; -import { Flex } from '../../../../ui/Flex'; -import { Icon } from '../../../../ui/Icon'; -import { Stack } from '../../../../ui/Stack'; -import { Text } from '../../../../ui/Text'; -import BitcoinIcon from '../../../../ui/icons/BitcoinIcon'; -import { BlockPageHeadersSkeleton } from '../Grouped/skeleton'; -import { useSuspenseAverageBlockTimes } from '../data/useAverageBlockTimes'; - -function LastBlockCard() { - const burnBlockResponse = useSuspenseBurnBlocks(1); - const burnBlocks = useSuspenseInfiniteQueryResult(burnBlockResponse); - const btcBlock = burnBlocks[0]; - const stxBlockResponse = useSuspenseBlocksByBurnBlock(btcBlock.burn_block_height, 1); - const stxBlocks = useSuspenseInfiniteQueryResult(stxBlockResponse, 1); - const lastStxBlock = stxBlocks[0]; - return ( - - - LAST BLOCK - - - - #{lastStxBlock.height} - - - - - #{btcBlock.burn_block_height} - - - - - {btcBlock.stacks_blocks.length} transactions - - - ); -} - -function AverageStacksBlockTimeCard() { - const { - data: { last_24h }, - } = useSuspenseAverageBlockTimes(); - - return ( - - - AVERAGE STACKS BLOCK TIME - - - {last_24h} sec. - - - In the last 24hs. - - - ); -} - -function LastConfirmedBitcoinBlockCard() { - const response = useSuspenseBurnBlocks(2); - const burnBlocks = useSuspenseInfiniteQueryResult(response); - const btcBlock = burnBlocks[1]; - return ( - - - In the previous bitcoin block - - - - - {btcBlock.stacks_blocks.length} - - - Stacks blocks - - - - - {btcBlock.total_tx_count} - - - Stacks transactions - - - - - ); -} - -export function BlocksPageHeaderLayout({ - lastBlockCard, - averageStacksBlockTimeCard, - lastConfirmedBitcoinBlockCard, - ...rest -}: { - lastBlockCard: ReactNode; - averageStacksBlockTimeCard: ReactNode; - lastConfirmedBitcoinBlockCard: ReactNode; -} & React.ComponentProps) { - const renderNewBlockList = useRenderNewBlockList(); - if (renderNewBlockList) { - return null; - } - return ( - *:not(:last-of-type)': { - borderBottom: ['1px solid var(--stacks-colors-borderPrimary)', null, null, 'none'], - borderRight: [null, null, null, '1px solid var(--stacks-colors-borderPrimary)'], - }, - '& > *:last-of-type': { - borderBottom: 'none', - borderRight: 'none', - }, - }} - {...rest} - > - {lastBlockCard} - {averageStacksBlockTimeCard} - {lastConfirmedBitcoinBlockCard} - - ); -} - -export function BlocksPageHeaders() { - return ( - }> - } - averageStacksBlockTimeCard={} - lastConfirmedBitcoinBlockCard={} - /> - - ); -} diff --git a/src/app/_components/BlockList/Grouped/skeleton.tsx b/src/app/_components/BlockList/Grouped/skeleton.tsx index 69f2b56e4..75956c4ba 100644 --- a/src/app/_components/BlockList/Grouped/skeleton.tsx +++ b/src/app/_components/BlockList/Grouped/skeleton.tsx @@ -6,13 +6,10 @@ import { Button } from '../../../../ui/Button'; import { Flex } from '../../../../ui/Flex'; import { SkeletonItem } from '../../../../ui/SkeletonItem'; import { SkeletonText } from '../../../../ui/SkeletonText'; -import { Stack } from '../../../../ui/Stack'; -import { Text } from '../../../../ui/Text'; import { BlocksPageBlockListLayout, BlocksPageControlsLayout, } from '../BlocksPage/BlocksPageBlockList'; -import { BlocksPageHeaderLayout } from '../BlocksPage/BlocksPageHeaders'; import { ControlsLayout } from '../Controls'; import { HomePageBlockListLayout, HomePageControlsLayout } from '../HomePage/HomePageBlockList'; import { BlockListRowSkeleton } from '../Ungrouped/skeleton'; @@ -172,32 +169,6 @@ export function BlocksPageBlockListGroupedSkeleton() { ); } -export function BlockPageHeaderSkeleton() { - return ( - - - - - - - - - - - - ); -} - -export function BlockPageHeadersSkeleton() { - return ( - } - averageStacksBlockTimeCard={} - lastConfirmedBitcoinBlockCard={} - /> - ); -} - function HomePageControlsSkeleton({ horizontal }: { horizontal?: boolean }) { return ( diff --git a/src/app/_components/BlockList/LayoutA/Paginated.tsx b/src/app/_components/BlockList/LayoutA/Paginated.tsx deleted file mode 100644 index 55e650a26..000000000 --- a/src/app/_components/BlockList/LayoutA/Paginated.tsx +++ /dev/null @@ -1,125 +0,0 @@ -'use client'; - -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; - -import { Section } from '../../../../common/components/Section'; -import { ExplorerErrorBoundary } from '../../ErrorBoundary'; -import { useBlockListContext } from '../BlockListContext'; -import { BlockListProvider } from '../BlockListProvider'; -import { useBlockListWebSocketUIBlock } from '../Sockets/useBlockListWebSocketUIBlock'; -import { FADE_DURATION } from '../consts'; -import { UISingleBlock } from '../types'; -import { BlockListWithControls } from './BlockListWithControls'; -import { usePaginatedBlockList } from './usePaginatedBlockList'; - -function PaginatedBlockListLayoutABase() { - const { setBlockListLoading, liveUpdates } = useBlockListContext(); - const [latestBlocksToShow, setLatestBlocksToShow] = useState([]); - - const { - initialBlockList, - initialBurnBlocks, - updateList, - hasNextPage, - isFetchingNextPage, - fetchNextPage, - } = usePaginatedBlockList(); - - const initialBlockHashes = useMemo(() => { - return new Set(initialBlockList.map(block => block.hash)); - }, [initialBlockList]); - - const initialBurnBlockHashes = useMemo(() => { - return new Set(Object.keys(initialBurnBlocks)); - }, [initialBurnBlocks]); - - const { latestUIBlocks, latestBlocksCount, clearLatestBlocks } = useBlockListWebSocketUIBlock( - initialBlockHashes, - initialBurnBlockHashes - ); - - const showLatestBlocks = useCallback(() => { - setLatestBlocksToShow(prevLatestBlocksToShow => { - return [...latestUIBlocks, ...prevLatestBlocksToShow]; - }); - clearLatestBlocks(); - }, [clearLatestBlocks, latestUIBlocks]); - - const blockList = useMemo( - () => [...latestBlocksToShow, ...initialBlockList], - [initialBlockList, latestBlocksToShow] - ); - - const showLatestBlocksWithFadeEffect = useCallback(() => { - setBlockListLoading(true); - setTimeout(() => { - showLatestBlocks(); - setBlockListLoading(false); - }, FADE_DURATION); - }, [setBlockListLoading, showLatestBlocks]); - - const prevLiveUpdatesRef = useRef(liveUpdates); - const prevLatestBlocksCountRef = useRef(latestBlocksCount); - - useEffect(() => { - const liveUpdatesToggled = prevLiveUpdatesRef.current !== liveUpdates; - - const receivedLatestBlockWhileLiveUpdates = - liveUpdates && - latestBlocksCount > 0 && - prevLatestBlocksCountRef.current !== latestBlocksCount; - - if (liveUpdatesToggled) { - setBlockListLoading(true); - setLatestBlocksToShow([]); - clearLatestBlocks(); - updateList().then(() => { - setBlockListLoading(false); - }); - } else if (receivedLatestBlockWhileLiveUpdates) { - showLatestBlocksWithFadeEffect(); - } - - prevLiveUpdatesRef.current = liveUpdates; - prevLatestBlocksCountRef.current = latestBlocksCount; - }, [ - liveUpdates, - latestBlocksCount, - clearLatestBlocks, - updateList, - showLatestBlocksWithFadeEffect, - setBlockListLoading, - ]); - - return ( - - ); -} - -export function PaginatedBlockListLayoutA() { - return ( - - - - - - ); -} diff --git a/src/app/_components/BlockList/SkeletonBlockList.tsx b/src/app/_components/BlockList/SkeletonBlockList.tsx deleted file mode 100644 index fbe564371..000000000 --- a/src/app/_components/BlockList/SkeletonBlockList.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { Section } from '../../../common/components/Section'; -import { TwoColumnsListItemSkeleton } from '../../../common/components/TwoColumnsListItemSkeleton'; - -export const SkeletonBlockList = () => { - return ( -
- {[...Array(10)].map((_, i) => ( - - ))} -
- ); -}; diff --git a/src/app/_components/BlockList/UpdatedBlockList.tsx b/src/app/_components/BlockList/UpdatedBlockList.tsx deleted file mode 100644 index ddfbfd504..000000000 --- a/src/app/_components/BlockList/UpdatedBlockList.tsx +++ /dev/null @@ -1,232 +0,0 @@ -'use client'; - -import { useColorModeValue } from '@chakra-ui/react'; -import { useQueryClient } from '@tanstack/react-query'; -import React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react'; - -import { Block, NakamotoBlock } from '@stacks/blockchain-api-client'; - -import { ListFooter } from '../../../common/components/ListFooter'; -import { Section } from '../../../common/components/Section'; -import { DEFAULT_LIST_LIMIT } from '../../../common/constants/constants'; -import { useInfiniteQueryResult } from '../../../common/hooks/useInfiniteQueryResult'; -import { useBlockListInfinite } from '../../../common/queries/useBlockListInfinite'; -import { Box } from '../../../ui/Box'; -import { Collapse } from '../../../ui/Collapse'; -import { FlexProps } from '../../../ui/Flex'; -import { FormControl } from '../../../ui/FormControl'; -import { FormLabel } from '../../../ui/FormLabel'; -import { Icon } from '../../../ui/Icon'; -import { Stack } from '../../../ui/Stack'; -import { Switch } from '../../../ui/Switch'; -import StxIcon from '../../../ui/icons/StxIcon'; -import { ExplorerErrorBoundary } from '../ErrorBoundary'; -import { BurnBlock } from './LayoutA/BurnBlock'; -import { StxBlock } from './LayoutA/StxBlock'; -import { SkeletonBlockList } from './SkeletonBlockList'; -import { useSubscribeBlocks } from './Sockets/useSubscribeBlocks'; -import { EnhancedBlock } from './types'; - -export const animationDuration = 0.8; - -export const BlockListItem: React.FC<{ block: Block } & FlexProps> = React.memo( - ({ block, ...rest }) => { - return ( - <> - } - /> - - - ); - } -); - -export const AnimatedBlockAndMicroblocksItem: FC<{ - block: EnhancedBlock; - onAnimationExit?: () => void; -}> = ({ block, onAnimationExit }) => { - const [show, setShow] = useState(!block.animate); - useEffect(() => { - if (block.animate) { - setTimeout(() => { - setShow(true); - }, 100); - } - }, [block.animate]); - useEffect(() => { - if (block.destroy) { - setShow(false); - } - }, [block.destroy]); - - return ( - { - if (state === 'exit') { - onAnimationExit?.(); - } - }} - data-testid={`block-item-${block.hash}`} - style={{ - overflow: 'unset', - }} - > - - - ); -}; - -export const BlockAndMicroblocksItem: React.FC<{ block: Block }> = ({ block }) => { - return ; -}; - -function UpdatedBlocksListBase({ - limit, -}: { - limit?: number; -} & FlexProps) { - const [isLive, setIsLive] = useState(false); - const [initialBlocks, setInitialBlocks] = useState([]); - const [latestBlocks, setLatestBlocks] = useState([]); - - const response = useBlockListInfinite(); - const { isFetchingNextPage, fetchNextPage, hasNextPage } = response; - const blocks = useInfiniteQueryResult(response, limit); - - const queryClient = useQueryClient(); - - const labelColor = useColorModeValue('slate.600', 'slate.400'); - - const handleBlock = useCallback((block: Block | NakamotoBlock) => { - setLatestBlocks(prevLatestBlocks => [ - { ...block, microblock_tx_count: {}, animate: true } as EnhancedBlock, - ...prevLatestBlocks, - ]); - }, []); - useSubscribeBlocks(isLive, handleBlock); - useEffect(() => { - if (!isLive) return; - setLatestBlocks([]); - void queryClient.invalidateQueries({ queryKey: ['blockListInfinite'] }); - }, [isLive, queryClient]); - - const lastClickTimeRef = useRef(0); - - const toggleLiveUpdates = useCallback(() => { - const now = Date.now(); - if (now - lastClickTimeRef.current > 2000) { - lastClickTimeRef.current = now; - setIsLive(!isLive); - } - }, [isLive]); - - useEffect(() => { - setInitialBlocks(blocks); - }, [blocks]); - - const allBlocks = useMemo(() => { - return [...latestBlocks, ...initialBlocks] - .sort((a, b) => (b.height || 0) - (a.height || 0)) - .reduce((acc: EnhancedBlock[], block, index) => { - if (!acc.some(b => b.height === block.height)) { - acc.push({ ...block, destroy: index >= (limit || DEFAULT_LIST_LIMIT) }); - } - return acc; - }, []); - }, [initialBlocks, latestBlocks, limit]); - - const removeOldBlock = useCallback((block: EnhancedBlock) => { - setInitialBlocks(prevBlocks => prevBlocks.filter(b => b.height !== block.height)); - setLatestBlocks(prevBlocks => prevBlocks.filter(b => b.height !== block.height)); - }, []); - - if (!allBlocks?.length) return ; - - return ( -
- - live view - - toggleLiveUpdates()} - /> - - } - > - - - {allBlocks?.map(block => - isLive ? ( - removeOldBlock(block)} - /> - ) : ( - - ) - )} - - - {!isLive && ( - - )} - - -
- ); -} - -export function UpdatedBlocksList({ limit }: { limit?: number }) { - return ( - - - - ); -} diff --git a/src/app/_components/NavBar/NetworkLabel.tsx b/src/app/_components/NavBar/NetworkLabel.tsx index e5df5bf3e..049b04229 100644 --- a/src/app/_components/NavBar/NetworkLabel.tsx +++ b/src/app/_components/NavBar/NetworkLabel.tsx @@ -2,8 +2,6 @@ import { useColorMode, useColorModeValue } from '@chakra-ui/react'; import { Check, Trash } from '@phosphor-icons/react'; import { FC, useMemo } from 'react'; -import { ChainID } from '@stacks/transactions'; - import { Badge } from '../../../common/components/Badge'; import { DEFAULT_DEVNET_SERVER } from '../../../common/constants/constants'; import { useGlobalContext } from '../../../common/context/useGlobalContext'; @@ -36,26 +34,16 @@ export const NetworkLabel: FC<{ network: Network }> = ({ network }) => { const isTestnet = network.url === testnet; const isDevnet = network.url === DEFAULT_DEVNET_SERVER; const isDefault = isMainnet || isTestnet; - let itemNetworkId: ChainID.Mainnet | ChainID.Testnet = isMainnet - ? ChainID.Mainnet - : ChainID.Testnet; - const { data, error, isFetching } = useCustomNetworkApiInfo(network.url, { + const { error, isFetching } = useCustomNetworkApiInfo(network.url, { enabled: !!network.url && !isDefault, }); const isDisabled = isFetching || !!error; - - if (!isDefault && data) { - itemNetworkId = data?.network_id && parseInt(data.network_id.toString()); - } - const isActive = activeNetwork.url === network.url; const networkHref = buildUrl('/', network); const purpleBadgeColor = useColorModeValue('purple.600', 'purple.300'); const purpleBadgeBg = useColorModeValue('purple.100', 'purple.900'); - const greenBadgeColor = useColorModeValue('green.600', 'green.300'); - const greenBadgeBg = useColorModeValue('green.100', 'green.900'); const badgeBorder = useColorModeValue('purple.300', 'purple.700'); const isNetworkRemovable = useMemo( @@ -101,36 +89,6 @@ export const NetworkLabel: FC<{ network: Network }> = ({ network }) => { subnet - ) : network.label === 'Stacks Testnet (Primary)' ? ( - - Nakamoto 3.0 - - ) : network.label === 'Nakamoto Testnet' ? ( - - Nakamoto 3.0 - ) : ( = ({ network }) => { fontWeight={'medium'} ml="8px" > - Nakamoto + Nakamoto 3.0 )} diff --git a/src/app/blocks/PageClient.tsx b/src/app/blocks/PageClient.tsx index 21adead76..2a084ec12 100644 --- a/src/app/blocks/PageClient.tsx +++ b/src/app/blocks/PageClient.tsx @@ -3,25 +3,9 @@ import type { NextPage } from 'next'; import dynamic from 'next/dynamic'; -import { useRenderNewBlockList } from '../../common/hooks/useIsNakamoto'; -import { - BlockPageHeadersSkeleton, - BlocksPageBlockListSkeleton, -} from '../_components/BlockList/Grouped/skeleton'; -import { SkeletonBlockList } from '../_components/BlockList/SkeletonBlockList'; +import { BlocksPageBlockListSkeleton } from '../_components/BlockList/Grouped/skeleton'; import { PageTitle } from '../_components/PageTitle'; -const BlocksPageHeadersDynamic = dynamic( - () => - import('../_components/BlockList/BlocksPage/BlocksPageHeaders').then( - mod => mod.BlocksPageHeaders - ), - { - loading: () => , - ssr: false, - } -); - const BlocksPageBlockListDynamic = dynamic( () => import('../_components/BlockList/BlocksPage/BlocksPageBlockList').then( @@ -33,15 +17,6 @@ const BlocksPageBlockListDynamic = dynamic( } ); -const PaginatedBlockListLayoutADynamic = dynamic( - () => - import('../_components/BlockList/LayoutA/Paginated').then(mod => mod.PaginatedBlockListLayoutA), - { - loading: () => , - ssr: false, - } -); - export function BlocksPageLayout({ title, blocksPageHeaders, @@ -61,14 +36,11 @@ export function BlocksPageLayout({ } const BlocksPage: NextPage = () => { - const renderNewBlockList = useRenderNewBlockList(); return ( : null} - blocksList={ - renderNewBlockList ? : - } + title={'Recent blocks'} + blocksPageHeaders={null} + blocksList={} /> ); }; diff --git a/src/app/blocks/skeleton.tsx b/src/app/blocks/skeleton.tsx index 892ee88a8..163fa730f 100644 --- a/src/app/blocks/skeleton.tsx +++ b/src/app/blocks/skeleton.tsx @@ -1,16 +1,13 @@ 'use client'; -import { - BlockPageHeadersSkeleton, - BlocksPageBlockListSkeleton, -} from '../_components/BlockList/Grouped/skeleton'; +import { BlocksPageBlockListSkeleton } from '../_components/BlockList/Grouped/skeleton'; import { BlocksPageLayout } from './PageClient'; export default function BlocksPageSkeleton() { return ( } + blocksPageHeaders={null} blocksList={} /> ); diff --git a/src/app/skeleton.tsx b/src/app/skeleton.tsx index f1d0b79a4..396b9f563 100644 --- a/src/app/skeleton.tsx +++ b/src/app/skeleton.tsx @@ -1,18 +1,14 @@ 'use client'; import { Section } from '../common/components/Section'; -import { useRenderNewBlockList } from '../common/hooks/useIsNakamoto'; import { SkeletonTxsList } from '../features/txs-list/SkeletonTxsList'; import { Grid } from '../ui/Grid'; import { HomePageBlockListSkeleton } from './_components/BlockList/Grouped/skeleton'; -import { SkeletonBlockList } from './_components/BlockList/SkeletonBlockList'; import { PageTitle } from './_components/PageTitle'; import { SkeletonStatSection } from './_components/Stats/SkeletonStatSection'; import { Wrapper } from './_components/Stats/Wrapper'; export default function HomePageSkeleton() { - const renderNewBlockList = useRenderNewBlockList(); - return ( <> Stacks Explorer @@ -30,7 +26,7 @@ export default function HomePageSkeleton() {
- {renderNewBlockList ? : } + ); diff --git a/src/common/components/modals/Nakamoto.tsx b/src/common/components/modals/Nakamoto.tsx index d7742c2d1..51a8c2122 100644 --- a/src/common/components/modals/Nakamoto.tsx +++ b/src/common/components/modals/Nakamoto.tsx @@ -5,10 +5,11 @@ import { ModalFooter, ModalOverlay, } from '@chakra-ui/react'; +import { ArrowUpRight } from '@phosphor-icons/react'; import { useQueryClient } from '@tanstack/react-query'; import { useEffect, useState } from 'react'; -import { Badge } from '../../../ui/Badge'; +import { Icon } from '../../..//ui/Icon'; import { ButtonLink } from '../../../ui/ButtonLink'; import { Flex } from '../../../ui/Flex'; import { Image } from '../../../ui/Image'; @@ -17,10 +18,10 @@ import { Text } from '../../../ui/Text'; import { TextLink } from '../../../ui/TextLink'; export function NakamotoModal() { - const [isOpen, setIsOpen] = useState(false); + const [isOpen, setIsOpen] = useState(true); useEffect(() => { - const nakamotoModalShown = localStorage.getItem('nakamoto3PrimaryTestnetModalShown'); + const nakamotoModalShown = localStorage.getItem('nakamoto3MainnetModalShown'); try { const dismissQueryParam = new URLSearchParams(window.location.search).get('dismiss'); // to run performance testing without the modal @@ -34,7 +35,7 @@ export function NakamotoModal() { }, []); const handleClose = () => { - localStorage.setItem('nakamoto3PrimaryTestnetModalShown', 'true'); + localStorage.setItem('nakamoto3MainnetModalShown', 'true'); setIsOpen(false); }; @@ -51,43 +52,47 @@ export function NakamotoModal() { /> - - NAKAMOTO UPGRADE - - Nakamoto 3.0 is live on Primary Testnet + Nakamoto 3.0 is live on Stacks Mainnet - {'Nakamoto'} + {'Nakamoto'} { handleClose(); void queryClient.clear(); }} _hover={{ textDecoration: 'none' }} + bg="accent.stacks-500" > - Explore Nakamoto 3.0 + Experience Fast Blocks and Bitcoin Finality - - Learn more about Nakamoto 3.0 ↗ - + + + + Learn more about Nakamoto on Mainnet + + + + + + Stacks Foundation Announcement + + + + diff --git a/src/common/hooks/useIsNakamoto.ts b/src/common/hooks/useIsNakamoto.ts deleted file mode 100644 index cc6a2d199..000000000 --- a/src/common/hooks/useIsNakamoto.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { useGlobalContext } from '../context/useGlobalContext'; - -export function useRenderNewBlockList() { - const { activeNetworkKey } = useGlobalContext(); - - const isMainnet = activeNetworkKey === 'https://api.hiro.so'; - - return !isMainnet; -}