diff --git a/src/components/nav/Header.tsx b/src/components/nav/Header.tsx index 57d2d33..136a080 100644 --- a/src/components/nav/Header.tsx +++ b/src/components/nav/Header.tsx @@ -62,9 +62,9 @@ export function Header({ pathName }: { pathName: string }) { About - + {/* API - + */} ), - (c: Fn) => ( - - API - - ), + // (c: Fn) => ( + // + // API + // + // ), (c: Fn) => ( Docs diff --git a/src/features/messages/MessageDetails.tsx b/src/features/messages/MessageDetails.tsx index fb5d319..b5abc7b 100644 --- a/src/features/messages/MessageDetails.tsx +++ b/src/features/messages/MessageDetails.tsx @@ -10,6 +10,7 @@ import CheckmarkIcon from '../../images/icons/checkmark-circle.svg'; import { useMultiProvider, useStore } from '../../store'; import { Message, MessageStatus } from '../../types'; import { logger } from '../../utils/logger'; +import { getHumanReadableDuration } from '../../utils/time'; import { getChainDisplayName, isEvmChain } from '../chains/utils'; import { useMessageDeliveryStatus } from '../deliveryStatus/useMessageDeliveryStatus'; @@ -84,6 +85,10 @@ export function MessageDetails({ messageId, message: messageFromUrlParams }: Pro isPiMsg, } = message; + const duration = destination?.timestamp + ? getHumanReadableDuration(destination.timestamp - origin.timestamp, 3) + : undefined; + const showTimeline = !isPiMsg && isEvmChain(multiProvider, originChainId) && @@ -120,6 +125,7 @@ export function MessageDetails({ messageId, message: messageFromUrlParams }: Pro domainId={destinationDomainId} status={status} transaction={destination} + duration={duration} debugResult={debugResult} isStatusFetching={isDeliveryStatusFetching} isPiMsg={isPiMsg} diff --git a/src/features/messages/cards/TransactionCard.tsx b/src/features/messages/cards/TransactionCard.tsx index dc7b619..e174a84 100644 --- a/src/features/messages/cards/TransactionCard.tsx +++ b/src/features/messages/cards/TransactionCard.tsx @@ -3,6 +3,7 @@ import Link from 'next/link'; import { PropsWithChildren, ReactNode, useState } from 'react'; import { MultiProvider } from '@hyperlane-xyz/sdk'; +import { isAddress, isZeroish } from '@hyperlane-xyz/utils'; import { Spinner } from '../../../components/animations/Spinner'; import { ChainLogo } from '../../../components/icons/ChainLogo'; @@ -48,6 +49,7 @@ export function DestinationTransactionCard({ domainId, status, transaction, + duration, debugResult, isStatusFetching, isPiMsg, @@ -57,6 +59,7 @@ export function DestinationTransactionCard({ domainId: DomainId; status: MessageStatus; transaction?: MessageTx; + duration?: string; debugResult?: MessageDebugResult; isStatusFetching: boolean; isPiMsg?: boolean; @@ -74,6 +77,7 @@ export function DestinationTransactionCard({ transaction={transaction} chainId={chainId} domainId={domainId} + duration={duration} blur={blur} /> ); @@ -190,16 +194,18 @@ function TransactionDetails({ chainId, domainId, transaction, + duration, blur, }: { chainId: ChainId; domainId: DomainId; transaction: MessageTx; + duration?: string; blur: boolean; }) { const multiProvider = useMultiProvider(); - const { hash, from, timestamp, blockNumber } = transaction; + const { hash, from, timestamp, blockNumber, mailbox } = transaction; const txExplorerLink = hash && !new BigNumber(hash).isZero() @@ -230,6 +236,16 @@ function TransactionDetails({ showCopy={true} blurValue={blur} /> + {mailbox && isAddress(mailbox) && !isZeroish(mailbox) && ( + + )} {!!timestamp && ( + {duration && ( + + )} {txExplorerLink && (