diff --git a/.vscode/tasks.json b/.vscode/tasks.json index f2635e4ca5..1e06422ff3 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -341,6 +341,7 @@ "localhost", "arbitrum", "arbitrum_sepolia", + "arbitrum_nova", "base", "blackfort_testnet", "celo", diff --git a/configs/envs/.env.mega_eth b/configs/envs/.env.mega_eth index 3960069047..52195da81e 100644 --- a/configs/envs/.env.mega_eth +++ b/configs/envs/.env.mega_eth @@ -33,6 +33,8 @@ NEXT_PUBLIC_MARKETPLACE_CATEGORIES_URL=https://raw.githubusercontent.com/blocksc NEXT_PUBLIC_MARKETPLACE_ENABLED=true NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM=https://airtable.com/appiy5yijZpMMSKjT/shr6uMGPKjj1DK7NL NEXT_PUBLIC_MARKETPLACE_SUGGEST_IDEAS_FORM=https://airtable.com/appiy5yijZpMMSKjT/pag3t82DUCyhGRZZO/form +NEXT_PUBLIC_MEGA_ETH_SOCKET_URL_METRICS=wss://testnetv2-dashboard.megaeth.com/metrics +NEXT_PUBLIC_MEGA_ETH_SOCKET_URL_RPC=wss://megaeth-testnet-v2.blockscout.com/api/v2/proxy/3rdparty/ws_megaeth_testnet_2 NEXT_PUBLIC_METADATA_SERVICE_API_HOST=https://metadata.services.blockscout.com NEXT_PUBLIC_MIXPANEL_CONFIG_OVERRIDES={"record_sessions_percent": 0.5,"record_heatmap_data": true} NEXT_PUBLIC_NETWORK_CURRENCY_DECIMALS=18 diff --git a/lib/contexts/settings.tsx b/lib/contexts/settings.tsx index 353ea50303..c59d5658bc 100644 --- a/lib/contexts/settings.tsx +++ b/lib/contexts/settings.tsx @@ -16,6 +16,8 @@ interface TSettingsContext { toggleAddressFormat: () => void; timeFormat: TimeFormat; toggleTimeFormat: () => void; + isLocalTime: boolean; + toggleIsLocalTime: () => void; } export const SettingsContext = React.createContext(null); @@ -32,6 +34,10 @@ export function SettingsContextProvider({ children }: SettingsProviderProps) { cookies.get(cookies.NAMES.TIME_FORMAT, appCookies) as TimeFormat || 'relative', ); + const [ isLocalTime, setIsLocalTime ] = React.useState( + (cookies.get(cookies.NAMES.LOCAL_TIME, appCookies) ?? 'true') === 'true', + ); + const toggleAddressFormat = React.useCallback(() => { setAddressFormat(prev => { const nextValue = prev === 'base16' ? 'bech32' : 'base16'; @@ -48,14 +54,24 @@ export function SettingsContextProvider({ children }: SettingsProviderProps) { }); }, []); + const toggleIsLocalTime = React.useCallback(() => { + setIsLocalTime(prev => { + const nextValue = !prev; + cookies.set(cookies.NAMES.LOCAL_TIME, nextValue ? 'true' : 'false'); + return nextValue; + }); + }, []); + const value = React.useMemo(() => { return { addressFormat, toggleAddressFormat, timeFormat, toggleTimeFormat, + isLocalTime, + toggleIsLocalTime, }; - }, [ addressFormat, toggleAddressFormat, timeFormat, toggleTimeFormat ]); + }, [ addressFormat, toggleAddressFormat, timeFormat, toggleTimeFormat, isLocalTime, toggleIsLocalTime ]); return ( diff --git a/lib/cookies.ts b/lib/cookies.ts index 578d93bd43..781ef3d4cf 100644 --- a/lib/cookies.ts +++ b/lib/cookies.ts @@ -14,6 +14,7 @@ export enum NAMES { ADDRESS_IDENTICON_TYPE = 'address_identicon_type', ADDRESS_FORMAT = 'address_format', TIME_FORMAT = 'time_format', + LOCAL_TIME = 'local_time', INDEXING_ALERT = 'indexing_alert', ADBLOCK_DETECTED = 'adblock_detected', MIXPANEL_DEBUG = '_mixpanel_debug', diff --git a/lib/date/dayjs.ts b/lib/date/dayjs.ts index 70424c17f7..624cb0b74e 100644 --- a/lib/date/dayjs.ts +++ b/lib/date/dayjs.ts @@ -5,6 +5,7 @@ import localizedFormat from 'dayjs/plugin/localizedFormat'; import minMax from 'dayjs/plugin/minMax'; import relativeTime from 'dayjs/plugin/relativeTime'; import updateLocale from 'dayjs/plugin/updateLocale'; +import utc from 'dayjs/plugin/utc'; import weekOfYear from 'dayjs/plugin/weekOfYear'; import { nbsp } from 'toolkit/utils/htmlEntities'; @@ -34,6 +35,7 @@ dayjs.extend(localizedFormat); dayjs.extend(duration); dayjs.extend(weekOfYear); dayjs.extend(minMax); +dayjs.extend(utc); dayjs.updateLocale('en', { formats: { @@ -63,3 +65,8 @@ dayjs.updateLocale('en', { dayjs.locale('en'); export default dayjs; + +export const FORMATS = { + // the "lll" format with seconds + lll_s: 'MMM D, YYYY h:mm:ss A', +}; diff --git a/ui/address/__screenshots__/AddressTxs.pw.tsx_default_base-view-desktop-2.png b/ui/address/__screenshots__/AddressTxs.pw.tsx_default_base-view-desktop-2.png index 3e4fb6baa1..cc7a1009bb 100644 Binary files a/ui/address/__screenshots__/AddressTxs.pw.tsx_default_base-view-desktop-2.png and b/ui/address/__screenshots__/AddressTxs.pw.tsx_default_base-view-desktop-2.png differ diff --git a/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_dark-color-mode_full-view-source-code-dark-mode-1.png b/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_dark-color-mode_full-view-source-code-dark-mode-1.png index 8beaab56d1..fac78df75f 100644 Binary files a/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_dark-color-mode_full-view-source-code-dark-mode-1.png and b/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_dark-color-mode_full-view-source-code-dark-mode-1.png differ diff --git a/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_full-view-abi-1.png b/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_full-view-abi-1.png index 507d8fa5ba..24e20cee84 100644 Binary files a/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_full-view-abi-1.png and b/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_full-view-abi-1.png differ diff --git a/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_full-view-bytecode-1.png b/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_full-view-bytecode-1.png index 7a959f4df9..2c33d6674b 100644 Binary files a/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_full-view-bytecode-1.png and b/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_full-view-bytecode-1.png differ diff --git a/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_full-view-compiler-1.png b/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_full-view-compiler-1.png index b8b77ff973..98148ac29e 100644 Binary files a/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_full-view-compiler-1.png and b/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_full-view-compiler-1.png differ diff --git a/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_full-view-source-code-dark-mode-1.png b/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_full-view-source-code-dark-mode-1.png index 6daeb8853f..1db074dd2a 100644 Binary files a/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_full-view-source-code-dark-mode-1.png and b/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_full-view-source-code-dark-mode-1.png differ diff --git a/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_mobile-view-source-code-1.png b/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_mobile-view-source-code-1.png index 96472621e8..2aa8037796 100644 Binary files a/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_mobile-view-source-code-1.png and b/ui/address/contract/__screenshots__/ContractDetails.pw.tsx_default_mobile-view-source-code-1.png differ diff --git a/ui/address/contract/info/ContractDetailsInfo.tsx b/ui/address/contract/info/ContractDetailsInfo.tsx index e4c76421a0..4ce7fabd35 100644 --- a/ui/address/contract/info/ContractDetailsInfo.tsx +++ b/ui/address/contract/info/ContractDetailsInfo.tsx @@ -7,7 +7,6 @@ import type { SmartContract } from 'types/api/contract'; import config from 'configs/app'; import { useMultichainContext } from 'lib/contexts/multichain'; import { CONTRACT_LICENSES } from 'lib/contracts/licenses'; -import dayjs from 'lib/date/dayjs'; import { Link } from 'toolkit/chakra/link'; import { getGitHubOwnerAndRepo } from 'ui/contractVerification/utils'; import ContainerWithScrollY from 'ui/shared/ContainerWithScrollY'; @@ -15,6 +14,7 @@ import ContractCertifiedLabel from 'ui/shared/ContractCertifiedLabel'; import AddressEntity from 'ui/shared/entities/address/AddressEntity'; import TxEntity from 'ui/shared/entities/tx/TxEntity'; import ContractCreationStatus from 'ui/shared/statusTag/ContractCreationStatus'; +import Time from 'ui/shared/time/Time'; import ContractSecurityAudits from '../audits/ContractSecurityAudits'; import ContractDetailsInfoItem from './ContractDetailsInfoItem'; @@ -187,7 +187,7 @@ const ContractDetailsInfo = ({ data, isLoading, addressData }: Props) => { wordBreak="break-word" isLoading={ isLoading } > - { dayjs(data.verified_at).format('llll') } +