From d59a2ef27da1feb11522861aa316562b2fadd22f Mon Sep 17 00:00:00 2001 From: tom Date: Tue, 15 Apr 2025 10:55:13 +0200 Subject: [PATCH 1/4] Contract tab: finding matching bytecode states Fixes #2678 --- lib/socket/types.ts | 4 + ui/address/AddressContract.pw.tsx | 10 +-- ui/address/AddressContract.pwstory.tsx | 18 ---- ui/address/AddressContract.tsx | 87 +++++++++++++++++-- .../ContractAutoVerificationStatus.tsx | 42 +++++++++ ui/address/contract/ContractDetails.tsx | 17 ---- ui/address/contract/specs/ContractDetails.tsx | 2 +- ui/address/contract/useContractTabs.tsx | 51 ++++------- ui/pages/Address.tsx | 14 +-- ui/pages/Token.tsx | 4 +- 10 files changed, 155 insertions(+), 94 deletions(-) delete mode 100644 ui/address/AddressContract.pwstory.tsx create mode 100644 ui/address/contract/ContractAutoVerificationStatus.tsx diff --git a/lib/socket/types.ts b/lib/socket/types.ts index 5674dd1449..1a611706bd 100644 --- a/lib/socket/types.ts +++ b/lib/socket/types.ts @@ -32,7 +32,9 @@ SocketMessage.AddressTxsPending | SocketMessage.AddressTokenTransfer | SocketMessage.AddressChangedBytecode | SocketMessage.AddressFetchedBytecode | +SocketMessage.EthBytecodeDbLookupStarted | SocketMessage.SmartContractWasVerified | +SocketMessage.SmartContractWasNotVerified | SocketMessage.TokenTransfers | SocketMessage.TokenTotalSupply | SocketMessage.TokenInstanceMetadataFetched | @@ -71,7 +73,9 @@ export namespace SocketMessage { export type AddressTokenTransfer = SocketMessageParamsGeneric<'token_transfer', { token_transfers: Array }>; export type AddressChangedBytecode = SocketMessageParamsGeneric<'changed_bytecode', Record>; export type AddressFetchedBytecode = SocketMessageParamsGeneric<'fetched_bytecode', { fetched_bytecode: string }>; + export type EthBytecodeDbLookupStarted = SocketMessageParamsGeneric<'eth_bytecode_db_lookup_started', Record>; export type SmartContractWasVerified = SocketMessageParamsGeneric<'smart_contract_was_verified', Record>; + export type SmartContractWasNotVerified = SocketMessageParamsGeneric<'smart_contract_was_not_verified', Record>; export type TokenTransfers = SocketMessageParamsGeneric<'token_transfer', { token_transfer: number }>; export type TokenTotalSupply = SocketMessageParamsGeneric<'total_supply', { total_supply: number }>; export type TokenInstanceMetadataFetched = SocketMessageParamsGeneric<'fetched_token_instance_metadata', TokenInstanceMetadataSocketMessage>; diff --git a/ui/address/AddressContract.pw.tsx b/ui/address/AddressContract.pw.tsx index 72f537af77..e5dda7af27 100644 --- a/ui/address/AddressContract.pw.tsx +++ b/ui/address/AddressContract.pw.tsx @@ -7,7 +7,7 @@ import { ENVS_MAP } from 'playwright/fixtures/mockEnvs'; import * as socketServer from 'playwright/fixtures/socketServer'; import { test, expect } from 'playwright/lib'; -import AddressContract from './AddressContract.pwstory'; +import AddressContract from './AddressContract'; const hash = addressMock.contract.hash; @@ -27,7 +27,7 @@ test.describe('ABI functionality', () => { query: { hash, tab: 'read_contract' }, }, }; - const component = await render(, { hooksConfig }, { withSocket: true }); + const component = await render(, { hooksConfig }, { withSocket: true }); const socket = await createSocket(); await socketServer.joinChannel(socket, 'addresses:' + addressMock.contract.hash.toLowerCase()); @@ -43,7 +43,7 @@ test.describe('ABI functionality', () => { }, }; await mockEnvs(ENVS_MAP.noWalletClient); - const component = await render(, { hooksConfig }, { withSocket: true }); + const component = await render(, { hooksConfig }, { withSocket: true }); const socket = await createSocket(); await socketServer.joinChannel(socket, 'addresses:' + addressMock.contract.hash.toLowerCase()); @@ -58,7 +58,7 @@ test.describe('ABI functionality', () => { query: { hash, tab: 'write_contract' }, }, }; - const component = await render(, { hooksConfig }, { withSocket: true }); + const component = await render(, { hooksConfig }, { withSocket: true }); const socket = await createSocket(); await socketServer.joinChannel(socket, 'addresses:' + addressMock.contract.hash.toLowerCase()); @@ -80,7 +80,7 @@ test.describe('ABI functionality', () => { }; await mockEnvs(ENVS_MAP.noWalletClient); - const component = await render(, { hooksConfig }, { withSocket: true }); + const component = await render(, { hooksConfig }, { withSocket: true }); const socket = await createSocket(); await socketServer.joinChannel(socket, 'addresses:' + addressMock.contract.hash.toLowerCase()); diff --git a/ui/address/AddressContract.pwstory.tsx b/ui/address/AddressContract.pwstory.tsx deleted file mode 100644 index b088e93fbc..0000000000 --- a/ui/address/AddressContract.pwstory.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { useRouter } from 'next/router'; -import React from 'react'; - -import useApiQuery from 'lib/api/useApiQuery'; -import getQueryParamString from 'lib/router/getQueryParamString'; -import useContractTabs from 'ui/address/contract/useContractTabs'; - -import AddressContract from './AddressContract'; - -const AddressContractPwStory = () => { - const router = useRouter(); - const hash = getQueryParamString(router.query.hash); - const addressQuery = useApiQuery('address', { pathParams: { hash } }); - const { tabs } = useContractTabs(addressQuery.data, false); - return ; -}; - -export default AddressContractPwStory; diff --git a/ui/address/AddressContract.tsx b/ui/address/AddressContract.tsx index 84c3337e8b..6f7e8d6c98 100644 --- a/ui/address/AddressContract.tsx +++ b/ui/address/AddressContract.tsx @@ -1,22 +1,95 @@ +import { useQueryClient } from '@tanstack/react-query'; +import { useRouter } from 'next/router'; import React from 'react'; -import type { TabItemRegular } from 'toolkit/components/AdaptiveTabs/types'; +import type { SocketMessage } from 'lib/socket/types'; +import type { Address } from 'types/api/address'; +import { getResourceKey } from 'lib/api/useApiQuery'; +import { SECOND } from 'lib/consts'; +import delay from 'lib/delay'; +import getQueryParamString from 'lib/router/getQueryParamString'; +import useSocketChannel from 'lib/socket/useSocketChannel'; +import useSocketMessage from 'lib/socket/useSocketMessage'; import RoutedTabs from 'toolkit/components/RoutedTabs/RoutedTabs'; +import type { TContractAutoVerificationStatus } from './contract/ContractAutoVerificationStatus'; +import ContractAutoVerificationStatus from './contract/ContractAutoVerificationStatus'; +import useContractTabs from './contract/useContractTabs'; +import { CONTRACT_TAB_IDS } from './contract/utils'; + interface Props { - tabs: Array; - isLoading: boolean; - shouldRender?: boolean; + addressData: Address | undefined; + isLoading?: boolean; + hasMudTab?: boolean; } -const AddressContract = ({ tabs, isLoading, shouldRender }: Props) => { - if (!shouldRender) { +const AddressContract = ({ addressData, isLoading = false, hasMudTab }: Props) => { + const [ isQueryEnabled, setIsQueryEnabled ] = React.useState(false); + const [ autoVerificationStatus, setAutoVerificationStatus ] = React.useState(null); + + const router = useRouter(); + const queryClient = useQueryClient(); + + const enableQuery = React.useCallback(() => { + setIsQueryEnabled(true); + }, []); + + const tab = getQueryParamString(router.query.tab); + const isSocketEnabled = Boolean(addressData?.hash) && addressData?.is_contract && !isLoading && CONTRACT_TAB_IDS.concat('contract' as never).includes(tab); + + const channel = useSocketChannel({ + topic: `addresses:${ addressData?.hash?.toLowerCase() }`, + isDisabled: !isSocketEnabled, + onJoin: enableQuery, + onSocketError: enableQuery, + }); + + const contractTabs = useContractTabs({ + addressData, + isEnabled: isQueryEnabled, + hasMudTab, + channel, + }); + + const handleLookupStartedMessage: SocketMessage.EthBytecodeDbLookupStarted['handler'] = React.useCallback(() => { + setAutoVerificationStatus('pending'); + }, []); + + const handleContractWasVerifiedMessage: SocketMessage.SmartContractWasVerified['handler'] = React.useCallback(async() => { + setAutoVerificationStatus('success'); + await queryClient.refetchQueries({ + queryKey: getResourceKey('address', { pathParams: { hash: addressData?.hash } }), + }); + await queryClient.refetchQueries({ + queryKey: getResourceKey('contract', { pathParams: { hash: addressData?.hash } }), + }); + setAutoVerificationStatus(null); + }, [ addressData?.hash, queryClient ]); + + const handleContractWasNotVerifiedMessage: SocketMessage.SmartContractWasNotVerified['handler'] = React.useCallback(async() => { + setAutoVerificationStatus('failed'); + await delay(10 * SECOND); + setAutoVerificationStatus(null); + }, []); + + useSocketMessage({ channel, event: 'eth_bytecode_db_lookup_started', handler: handleLookupStartedMessage }); + useSocketMessage({ channel, event: 'smart_contract_was_verified', handler: handleContractWasVerifiedMessage }); + useSocketMessage({ channel, event: 'smart_contract_was_not_verified', handler: handleContractWasNotVerifiedMessage }); + + if (isLoading) { return null; } return ( - + : null } + rightSlotProps={{ ml: 6 }} + /> ); }; diff --git a/ui/address/contract/ContractAutoVerificationStatus.tsx b/ui/address/contract/ContractAutoVerificationStatus.tsx new file mode 100644 index 0000000000..1cbfd9baed --- /dev/null +++ b/ui/address/contract/ContractAutoVerificationStatus.tsx @@ -0,0 +1,42 @@ +import { Box, HStack, Spinner } from '@chakra-ui/react'; +import React from 'react'; + +import useIsMobile from 'lib/hooks/useIsMobile'; +import { Tooltip } from 'toolkit/chakra/tooltip'; +import IconSvg from 'ui/shared/IconSvg'; + +const STATUS_MAP = { + pending: { + text: 'Checking contract verification', + leftElement: , + }, + success: { + text: 'Contract successfully verified', + leftElement: , + }, + failed: { + text: 'Contract not verified automatically. Please verify manually.', + leftElement: , + }, +}; + +export type TContractAutoVerificationStatus = keyof typeof STATUS_MAP; + +interface Props { + status: TContractAutoVerificationStatus; +} + +const ContractAutoVerificationStatus = ({ status }: Props) => { + const isMobile = useIsMobile(); + + return ( + + + { STATUS_MAP[status].leftElement } + { STATUS_MAP[status].text } + + + ); +}; + +export default React.memo(ContractAutoVerificationStatus); diff --git a/ui/address/contract/ContractDetails.tsx b/ui/address/contract/ContractDetails.tsx index 8f369b3d44..f6219e3bca 100644 --- a/ui/address/contract/ContractDetails.tsx +++ b/ui/address/contract/ContractDetails.tsx @@ -5,7 +5,6 @@ import { useRouter } from 'next/router'; import type { Channel } from 'phoenix'; import React from 'react'; -import type { SocketMessage } from 'lib/socket/types'; import type { Address as AddressInfo } from 'types/api/address'; import type { AddressImplementation } from 'types/api/addressParams'; import type { SmartContract } from 'types/api/contract'; @@ -13,7 +12,6 @@ import type { SmartContract } from 'types/api/contract'; import type { ResourceError } from 'lib/api/resources'; import useApiQuery, { getResourceKey } from 'lib/api/useApiQuery'; import getQueryParamString from 'lib/router/getQueryParamString'; -import useSocketMessage from 'lib/socket/useSocketMessage'; import * as stubs from 'stubs/contract'; import RoutedTabs from 'toolkit/components/RoutedTabs/RoutedTabs'; import DataFetchAlert from 'ui/shared/DataFetchAlert'; @@ -66,21 +64,6 @@ const ContractDetails = ({ addressHash, channel, mainContractQuery }: Props) => const tabs = useContractDetailsTabs({ data, isLoading: isPlaceholderData, addressHash, sourceAddress: selectedItem.address }); - const handleContractWasVerifiedMessage: SocketMessage.SmartContractWasVerified['handler'] = React.useCallback(() => { - queryClient.refetchQueries({ - queryKey: getResourceKey('address', { pathParams: { hash: addressHash } }), - }); - queryClient.refetchQueries({ - queryKey: getResourceKey('contract', { pathParams: { hash: addressHash } }), - }); - }, [ addressHash, queryClient ]); - - useSocketMessage({ - channel, - event: 'smart_contract_was_verified', - handler: handleContractWasVerifiedMessage, - }); - if (isError) { return ; } diff --git a/ui/address/contract/specs/ContractDetails.tsx b/ui/address/contract/specs/ContractDetails.tsx index ac2aebf087..e2f4203e45 100644 --- a/ui/address/contract/specs/ContractDetails.tsx +++ b/ui/address/contract/specs/ContractDetails.tsx @@ -9,7 +9,7 @@ const ContractDetails = () => { const router = useRouter(); const hash = getQueryParamString(router.query.hash); const addressQuery = useApiQuery('address', { pathParams: { hash } }); - const { tabs } = useContractTabs(addressQuery.data, false); + const { tabs } = useContractTabs({ addressData: addressQuery.data, isEnabled: true, channel: undefined }); const content = tabs.find(({ id }) => id === 'contract_code')?.component; return content ?? null; }; diff --git a/ui/address/contract/useContractTabs.tsx b/ui/address/contract/useContractTabs.tsx index 4df06a27a4..a23bfd4721 100644 --- a/ui/address/contract/useContractTabs.tsx +++ b/ui/address/contract/useContractTabs.tsx @@ -1,12 +1,10 @@ -import { useRouter } from 'next/router'; +import type { Channel } from 'phoenix'; import React from 'react'; import type { Address } from 'types/api/address'; import config from 'configs/app'; import useApiQuery from 'lib/api/useApiQuery'; -import getQueryParamString from 'lib/router/getQueryParamString'; -import useSocketChannel from 'lib/socket/useSocketChannel'; import * as stubs from 'stubs/contract'; import ContractDetails from 'ui/address/contract/ContractDetails'; import ContractMethodsCustom from 'ui/address/contract/methods/ContractMethodsCustom'; @@ -16,7 +14,7 @@ import ContractMethodsRegular from 'ui/address/contract/methods/ContractMethodsR import ContentLoader from 'ui/shared/ContentLoader'; import type { CONTRACT_MAIN_TAB_IDS } from './utils'; -import { CONTRACT_DETAILS_TAB_IDS, CONTRACT_TAB_IDS } from './utils'; +import { CONTRACT_DETAILS_TAB_IDS } from './utils'; interface ContractTab { id: typeof CONTRACT_MAIN_TAB_IDS[number] | Array; @@ -30,54 +28,43 @@ interface ReturnType { isLoading: boolean; } -export default function useContractTabs(data: Address | undefined, isPlaceholderData: boolean, hasMudTab: boolean = false): ReturnType { - const [ isQueryEnabled, setIsQueryEnabled ] = React.useState(false); - - const router = useRouter(); - const tab = getQueryParamString(router.query.tab); - - const isEnabled = Boolean(data?.hash) && data?.is_contract && !isPlaceholderData && CONTRACT_TAB_IDS.concat('contract' as never).includes(tab); - - const enableQuery = React.useCallback(() => { - setIsQueryEnabled(true); - }, []); +interface Props { + addressData: Address | undefined; + isEnabled: boolean; + hasMudTab?: boolean; + channel: Channel | undefined; +} +export default function useContractTabs({ addressData, isEnabled, hasMudTab, channel }: Props): ReturnType { const contractQuery = useApiQuery('contract', { - pathParams: { hash: data?.hash }, + pathParams: { hash: addressData?.hash }, queryOptions: { - enabled: isEnabled && isQueryEnabled, + enabled: isEnabled, refetchOnMount: false, - placeholderData: data?.is_verified ? stubs.CONTRACT_CODE_VERIFIED : stubs.CONTRACT_CODE_UNVERIFIED, + placeholderData: addressData?.is_verified ? stubs.CONTRACT_CODE_VERIFIED : stubs.CONTRACT_CODE_UNVERIFIED, }, }); const mudSystemsQuery = useApiQuery('contract_mud_systems', { - pathParams: { hash: data?.hash }, + pathParams: { hash: addressData?.hash }, queryOptions: { - enabled: isEnabled && isQueryEnabled && hasMudTab, + enabled: isEnabled && hasMudTab, refetchOnMount: false, placeholderData: stubs.MUD_SYSTEMS, }, }); - const channel = useSocketChannel({ - topic: `addresses:${ data?.hash?.toLowerCase() }`, - isDisabled: !isEnabled, - onJoin: enableQuery, - onSocketError: enableQuery, - }); - const verifiedImplementations = React.useMemo(() => { - return data?.implementations?.filter(({ name, address }) => name && address && address !== data?.hash) || []; - }, [ data?.hash, data?.implementations ]); + return addressData?.implementations?.filter(({ name, address }) => name && address && address !== addressData?.hash) || []; + }, [ addressData?.hash, addressData?.implementations ]); return React.useMemo(() => { return { tabs: [ - data?.hash && { + addressData?.hash && { id: 'contract_code' as const, title: 'Code', - component: , + component: , subTabs: CONTRACT_DETAILS_TAB_IDS as unknown as Array, }, contractQuery.data?.abi && { @@ -112,7 +99,7 @@ export default function useContractTabs(data: Address | undefined, isPlaceholder isLoading: contractQuery.isPlaceholderData, }; }, [ - data?.hash, + addressData?.hash, contractQuery, channel, verifiedImplementations, diff --git a/ui/pages/Address.tsx b/ui/pages/Address.tsx index 3d52d9bd3e..33b0a785b8 100644 --- a/ui/pages/Address.tsx +++ b/ui/pages/Address.tsx @@ -34,7 +34,6 @@ import AddressTokenTransfers from 'ui/address/AddressTokenTransfers'; import AddressTxs from 'ui/address/AddressTxs'; import AddressUserOps from 'ui/address/AddressUserOps'; import AddressWithdrawals from 'ui/address/AddressWithdrawals'; -import useContractTabs from 'ui/address/contract/useContractTabs'; import { CONTRACT_TAB_IDS } from 'ui/address/contract/utils'; import AddressFavoriteButton from 'ui/address/details/AddressFavoriteButton'; import AddressMetadataAlert from 'ui/address/details/AddressMetadataAlert'; @@ -144,12 +143,6 @@ const AddressPageContent = () => { const xStarQuery = useFetchXStarScore({ hash }); - const contractTabs = useContractTabs( - addressQuery.data, - config.features.mudFramework.isEnabled ? (mudTablesCountQuery.isPlaceholderData || addressQuery.isPlaceholderData) : addressQuery.isPlaceholderData, - Boolean(config.features.mudFramework.isEnabled && mudTablesCountQuery.data && mudTablesCountQuery.data > 0), - ); - const tabs: Array = React.useMemo(() => { return [ { @@ -175,9 +168,9 @@ const AddressPageContent = () => { }, component: ( 0) } /> ), subTabs: CONTRACT_TAB_IDS, @@ -266,7 +259,6 @@ const AddressPageContent = () => { ].filter(Boolean); }, [ addressQuery, - contractTabs, addressTabsCountersQuery.data, userOpsAccountQuery.data, isTabsLoading, diff --git a/ui/pages/Token.tsx b/ui/pages/Token.tsx index b7dc5da904..8c0889b12f 100644 --- a/ui/pages/Token.tsx +++ b/ui/pages/Token.tsx @@ -23,7 +23,6 @@ import { generateListStub } from 'stubs/utils'; import RoutedTabs from 'toolkit/components/RoutedTabs/RoutedTabs'; import AddressContract from 'ui/address/AddressContract'; import AddressCsvExportLink from 'ui/address/AddressCsvExportLink'; -import useContractTabs from 'ui/address/contract/useContractTabs'; import { CONTRACT_TAB_IDS } from 'ui/address/contract/utils'; import TextAd from 'ui/shared/ad/TextAd'; import IconSvg from 'ui/shared/IconSvg'; @@ -159,7 +158,6 @@ const TokenPageContent = () => { }); const isLoading = tokenQuery.isPlaceholderData || addressQuery.isPlaceholderData; - const contractTabs = useContractTabs(addressQuery.data, addressQuery.isPlaceholderData); const tabs: Array = [ hasInventoryTab ? { @@ -191,7 +189,7 @@ const TokenPageContent = () => { return 'Contract'; }, - component: , + component: , subTabs: CONTRACT_TAB_IDS, } : undefined, ].filter(Boolean); From dbbf75d5a4fd0b287758495b0ff6d0b332377b76 Mon Sep 17 00:00:00 2001 From: tom Date: Tue, 15 Apr 2025 13:31:45 +0200 Subject: [PATCH 2/4] handle case when there is only one sub-tab on contract tab --- toolkit/components/AdaptiveTabs/AdaptiveTabs.tsx | 4 ---- toolkit/components/AdaptiveTabs/AdaptiveTabsList.tsx | 6 +++++- ui/address/AddressContract.tsx | 11 ++++++++--- .../contract/ContractAutoVerificationStatus.tsx | 12 +++++------- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/toolkit/components/AdaptiveTabs/AdaptiveTabs.tsx b/toolkit/components/AdaptiveTabs/AdaptiveTabs.tsx index 634f0c6e42..4f4f021868 100644 --- a/toolkit/components/AdaptiveTabs/AdaptiveTabs.tsx +++ b/toolkit/components/AdaptiveTabs/AdaptiveTabs.tsx @@ -43,10 +43,6 @@ const AdaptiveTabs = (props: Props) => { } }, [ defaultValue ]); - if (tabs.length === 1) { - return
{ tabs[0].component }
; - } - return ( { const activeTabIndex = tabsList.findIndex((tab) => getTabValue(tab) === activeTab) ?? 0; useScrollToActiveTab({ activeTabIndex, listRef, tabsRefs, isMobile, isLoading }); + if (tabs.length === 1 && !leftSlot && !rightSlot) { + return null; + } + return ( { ) } - { tabsList.slice(0, isLoading ? 5 : Infinity).map((tab, index) => { + { tabs.length > 1 && tabsList.slice(0, isLoading ? 5 : Infinity).map((tab, index) => { const value = getTabValue(tab); const ref = tabsRefs[index]; diff --git a/ui/address/AddressContract.tsx b/ui/address/AddressContract.tsx index 6f7e8d6c98..9582e80f8c 100644 --- a/ui/address/AddressContract.tsx +++ b/ui/address/AddressContract.tsx @@ -8,6 +8,7 @@ import type { Address } from 'types/api/address'; import { getResourceKey } from 'lib/api/useApiQuery'; import { SECOND } from 'lib/consts'; import delay from 'lib/delay'; +import useIsMobile from 'lib/hooks/useIsMobile'; import getQueryParamString from 'lib/router/getQueryParamString'; import useSocketChannel from 'lib/socket/useSocketChannel'; import useSocketMessage from 'lib/socket/useSocketMessage'; @@ -30,7 +31,7 @@ const AddressContract = ({ addressData, isLoading = false, hasMudTab }: Props) = const router = useRouter(); const queryClient = useQueryClient(); - + const isMobile = useIsMobile(); const enableQuery = React.useCallback(() => { setIsQueryEnabled(true); }, []); @@ -81,14 +82,18 @@ const AddressContract = ({ addressData, isLoading = false, hasMudTab }: Props) = return null; } + const rightSlot = autoVerificationStatus ? + 1 ? 'tooltip' : 'inline' }/> : + null; + return ( : null } - rightSlotProps={{ ml: 6 }} + rightSlot={ rightSlot } + rightSlotProps={{ ml: contractTabs.tabs.length > 1 ? { base: 'auto', md: 6 } : 0 }} /> ); }; diff --git a/ui/address/contract/ContractAutoVerificationStatus.tsx b/ui/address/contract/ContractAutoVerificationStatus.tsx index 1cbfd9baed..7f1db01a66 100644 --- a/ui/address/contract/ContractAutoVerificationStatus.tsx +++ b/ui/address/contract/ContractAutoVerificationStatus.tsx @@ -1,7 +1,6 @@ import { Box, HStack, Spinner } from '@chakra-ui/react'; import React from 'react'; -import useIsMobile from 'lib/hooks/useIsMobile'; import { Tooltip } from 'toolkit/chakra/tooltip'; import IconSvg from 'ui/shared/IconSvg'; @@ -24,16 +23,15 @@ export type TContractAutoVerificationStatus = keyof typeof STATUS_MAP; interface Props { status: TContractAutoVerificationStatus; + mode?: 'inline' | 'tooltip'; } -const ContractAutoVerificationStatus = ({ status }: Props) => { - const isMobile = useIsMobile(); - +const ContractAutoVerificationStatus = ({ status, mode = 'inline' }: Props) => { return ( - - + + { STATUS_MAP[status].leftElement } - { STATUS_MAP[status].text } + { STATUS_MAP[status].text } ); From 835fe345e9a2f64ebc7b0e97844ad61f8e980790 Mon Sep 17 00:00:00 2001 From: tom Date: Tue, 15 Apr 2025 15:13:53 +0200 Subject: [PATCH 3/4] tests --- playwright/fixtures/socketServer.ts | 2 + ui/address/AddressContract.pw.tsx | 80 ++++++++++++++++-- ...t_auto-verification-status-base-flow-1.png | Bin 0 -> 5303 bytes ...uto-verification-status-with-one-tab-1.png | Bin 0 -> 3249 bytes ui/address/contract/ContractDetails.pw.tsx | 17 +--- ...fault_verified-with-multiple-sources-2.png | Bin 54672 -> 54757 bytes ui/address/contract/specs/ContractDetails.tsx | 8 +- 7 files changed, 81 insertions(+), 26 deletions(-) create mode 100644 ui/address/__screenshots__/AddressContract.pw.tsx_default_auto-verification-status-base-flow-1.png create mode 100644 ui/address/__screenshots__/AddressContract.pw.tsx_default_auto-verification-status-with-one-tab-1.png diff --git a/playwright/fixtures/socketServer.ts b/playwright/fixtures/socketServer.ts index 19e94f878a..58278726ff 100644 --- a/playwright/fixtures/socketServer.ts +++ b/playwright/fixtures/socketServer.ts @@ -73,7 +73,9 @@ export function sendMessage(socket: WebSocket, channel: Channel, msg: 'verificat export function sendMessage(socket: WebSocket, channel: Channel, msg: 'total_supply', payload: { total_supply: number }): void; export function sendMessage(socket: WebSocket, channel: Channel, msg: 'changed_bytecode', payload: Record): void; export function sendMessage(socket: WebSocket, channel: Channel, msg: 'fetched_bytecode', payload: { fetched_bytecode: string }): void; +export function sendMessage(socket: WebSocket, channel: Channel, msg: 'eth_bytecode_db_lookup_started', payload: Record): void; export function sendMessage(socket: WebSocket, channel: Channel, msg: 'smart_contract_was_verified', payload: Record): void; +export function sendMessage(socket: WebSocket, channel: Channel, msg: 'smart_contract_was_not_verified', payload: Record): void; export function sendMessage(socket: WebSocket, channel: Channel, msg: 'token_transfer', payload: { token_transfers: Array }): void; export function sendMessage(socket: WebSocket, channel: Channel, msg: 'fetched_token_instance_metadata', payload: TokenInstanceMetadataSocketMessage): void; export function sendMessage(socket: WebSocket, channel: Channel, msg: string, payload: unknown): void { diff --git a/ui/address/AddressContract.pw.tsx b/ui/address/AddressContract.pw.tsx index e5dda7af27..5d18e1b49c 100644 --- a/ui/address/AddressContract.pw.tsx +++ b/ui/address/AddressContract.pw.tsx @@ -11,16 +11,16 @@ import AddressContract from './AddressContract'; const hash = addressMock.contract.hash; -test.beforeEach(async({ mockApiResponse }) => { - await mockApiResponse('address', addressMock.contract, { pathParams: { hash } }); - await mockApiResponse( - 'contract', - { ...contractInfoMock.verified, abi: [ ...contractMethodsMock.read, ...contractMethodsMock.write ] }, - { pathParams: { hash } }, - ); -}); - test.describe('ABI functionality', () => { + test.beforeEach(async({ mockApiResponse }) => { + await mockApiResponse('address', addressMock.contract, { pathParams: { hash } }); + await mockApiResponse( + 'contract', + { ...contractInfoMock.verified, abi: [ ...contractMethodsMock.read, ...contractMethodsMock.write ] }, + { pathParams: { hash } }, + ); + }); + test('read', async({ render, createSocket }) => { const hooksConfig = { router: { @@ -94,3 +94,65 @@ test.describe('ABI functionality', () => { await expect(component.getByLabel('5.').getByRole('button', { name: 'Write' })).toBeDisabled(); }); }); + +test.describe('auto verification status', () => { + const addressData = { ...addressMock.contract, is_verified: false, implementations: [] }; + let contractApiUrl: string; + + test.beforeEach(async({ mockApiResponse }) => { + await mockApiResponse('address', addressData, { pathParams: { hash } }); + contractApiUrl = await mockApiResponse('contract', contractInfoMock.nonVerified, { pathParams: { hash } }); + }); + + test('base flow', async({ render, createSocket }) => { + const hooksConfig = { + router: { + query: { hash, tab: 'contract' }, + }, + }; + const component = await render(, { hooksConfig }, { withSocket: true }); + + const socket = await createSocket(); + const channel = await socketServer.joinChannel(socket, 'addresses:' + addressData.hash.toLowerCase()); + + socketServer.sendMessage(socket, channel, 'eth_bytecode_db_lookup_started', { }); + const tabs = component.getByRole('tablist').first(); + await expect(tabs).toHaveScreenshot(); + }); + + test('after verification will refetch contract data', async({ page, render, createSocket }) => { + const hooksConfig = { + router: { + query: { hash, tab: 'contract' }, + }, + }; + await render(, { hooksConfig }, { withSocket: true }); + + const socket = await createSocket(); + const channel = await socketServer.joinChannel(socket, 'addresses:' + addressData.hash.toLowerCase()); + + socketServer.sendMessage(socket, channel, 'smart_contract_was_verified', { }); + + const contractRequest = await page.waitForRequest(contractApiUrl); + expect(contractRequest).toBeTruthy(); + }); + + test('with one tab', async({ render, createSocket, mockEnvs }) => { + const hooksConfig = { + router: { + query: { hash, tab: 'contract' }, + }, + }; + await mockEnvs([ + [ 'NEXT_PUBLIC_IS_ACCOUNT_SUPPORTED', 'false' ], + ]); + const component = await render(, { hooksConfig }, { withSocket: true }); + + const socket = await createSocket(); + const channel = await socketServer.joinChannel(socket, 'addresses:' + addressData.hash.toLowerCase()); + + socketServer.sendMessage(socket, channel, 'smart_contract_was_not_verified', { }); + const tabs = component.getByRole('tablist').first(); + await expect(tabs).toHaveScreenshot(); + }); +}); diff --git a/ui/address/__screenshots__/AddressContract.pw.tsx_default_auto-verification-status-base-flow-1.png b/ui/address/__screenshots__/AddressContract.pw.tsx_default_auto-verification-status-base-flow-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f5aa9f944d4f93df2850639d1be0fc227cb96ece GIT binary patch literal 5303 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 D)XyaY literal 0 HcmV?d00001 diff --git a/ui/address/__screenshots__/AddressContract.pw.tsx_default_auto-verification-status-with-one-tab-1.png b/ui/address/__screenshots__/AddressContract.pw.tsx_default_auto-verification-status-with-one-tab-1.png new file mode 100644 index 0000000000000000000000000000000000000000..aa8af788c3c788e4ff45e9734ca5778538a1180f GIT binary patch literal 3249 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 literal 0 HcmV?d00001 diff --git a/ui/address/contract/ContractDetails.pw.tsx b/ui/address/contract/ContractDetails.pw.tsx index b4ddb7fa3a..61a9dc7c11 100644 --- a/ui/address/contract/ContractDetails.pw.tsx +++ b/ui/address/contract/ContractDetails.pw.tsx @@ -18,13 +18,11 @@ const hooksConfig = { // test cases which use socket cannot run in parallel since the socket server always run on the same port test.describe.configure({ mode: 'serial' }); -let addressApiUrl: string; - test.beforeEach(async({ mockApiResponse, page }) => { await page.route('https://cdn.jsdelivr.net/npm/monaco-editor@0.33.0/**', (route) => { route.abort(); }); - addressApiUrl = await mockApiResponse('address', addressMock.contract, { pathParams: { hash: addressMock.contract.hash } }); + await mockApiResponse('address', addressMock.contract, { pathParams: { hash: addressMock.contract.hash } }); }); test.describe('full view', () => { @@ -95,19 +93,6 @@ test.describe('mobile view', () => { }); }); -test('verified via lookup in eth_bytecode_db', async({ render, mockApiResponse, createSocket, page }) => { - const contractApiUrl = await mockApiResponse('contract', contractMock.nonVerified, { pathParams: { hash: addressMock.contract.hash } }); - await render(, { hooksConfig }, { withSocket: true }); - - const socket = await createSocket(); - const channel = await socketServer.joinChannel(socket, `addresses:${ addressMock.contract.hash.toLowerCase() }`); - await page.waitForResponse(contractApiUrl); - socketServer.sendMessage(socket, channel, 'smart_contract_was_verified', {}); - const request = await page.waitForRequest(addressApiUrl); - - expect(request).toBeTruthy(); -}); - test('verified with multiple sources', async({ render, page, mockApiResponse, createSocket }) => { await mockApiResponse('contract', contractMock.withMultiplePaths, { pathParams: { hash: addressMock.contract.hash } }); await render(, { hooksConfig }, { withSocket: true }); diff --git a/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_verified-with-multiple-sources-2.png b/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_verified-with-multiple-sources-2.png index 28408db5729fc18f3618bca21dbdf15e60063510..8addc38247f50451fc7a63e519cc5481b84cdad2 100644 GIT binary patch literal 54757 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 literal 54672 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˶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 NC#@t^B=Pdy{{SRUalHTl diff --git a/ui/address/contract/specs/ContractDetails.tsx b/ui/address/contract/specs/ContractDetails.tsx index e2f4203e45..a41c6e47fa 100644 --- a/ui/address/contract/specs/ContractDetails.tsx +++ b/ui/address/contract/specs/ContractDetails.tsx @@ -2,6 +2,7 @@ import { useRouter } from 'next/router'; import useApiQuery from 'lib/api/useApiQuery'; import getQueryParamString from 'lib/router/getQueryParamString'; +import useSocketChannel from 'lib/socket/useSocketChannel'; import useContractTabs from '../useContractTabs'; @@ -9,7 +10,12 @@ const ContractDetails = () => { const router = useRouter(); const hash = getQueryParamString(router.query.hash); const addressQuery = useApiQuery('address', { pathParams: { hash } }); - const { tabs } = useContractTabs({ addressData: addressQuery.data, isEnabled: true, channel: undefined }); + const channel = useSocketChannel({ + topic: `addresses:${ hash?.toLowerCase() }`, + isDisabled: !addressQuery.data, + }); + + const { tabs } = useContractTabs({ addressData: addressQuery.data, isEnabled: true, channel }); const content = tabs.find(({ id }) => id === 'contract_code')?.component; return content ?? null; }; From 2366f333184044e07e793fc4ed073f00b94b7db9 Mon Sep 17 00:00:00 2001 From: tom Date: Tue, 20 May 2025 20:16:15 +0200 Subject: [PATCH 4/4] prevent calling the smart contract resource twice when opening the tab --- ui/address/contract/ContractDetails.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/address/contract/ContractDetails.tsx b/ui/address/contract/ContractDetails.tsx index 6162b23b7e..314ba43189 100644 --- a/ui/address/contract/ContractDetails.tsx +++ b/ui/address/contract/ContractDetails.tsx @@ -51,12 +51,12 @@ const ContractDetails = ({ addressData, channel, mainContractQuery }: Props) => const contractQuery = useApiQuery('general:contract', { pathParams: { hash: selectedItem?.address_hash }, queryOptions: { - enabled: Boolean(selectedItem?.address_hash && !mainContractQuery.isPlaceholderData), + enabled: Boolean(selectedItem?.address_hash && !mainContractQuery.isPlaceholderData && selectedItem.address_hash !== addressData.hash), refetchOnMount: false, placeholderData: addressData?.is_verified ? stubs.CONTRACT_CODE_VERIFIED : stubs.CONTRACT_CODE_UNVERIFIED, }, }); - const { data, isPlaceholderData, isError } = contractQuery; + const { data, isPlaceholderData, isError } = selectedItem.address_hash !== addressData.hash ? contractQuery : mainContractQuery; const tabs = useContractDetailsTabs({ data, isLoading: isPlaceholderData, addressData, sourceAddress: selectedItem.address_hash });