Commit deb9ff03 authored by tom goriunov's avatar tom goriunov Committed by GitHub

Merge pull request #1491 from blockscout/tom2drum/issue-1355

Multiple optimistic rollup withdrawals on tx page 
parents e7d5da6a 1bd122b5
...@@ -14,6 +14,12 @@ export type TransactionRevertReason = { ...@@ -14,6 +14,12 @@ export type TransactionRevertReason = {
type WrappedTransactionFields = 'decoded_input' | 'fee' | 'gas_limit' | 'gas_price' | 'hash' | 'max_fee_per_gas' | type WrappedTransactionFields = 'decoded_input' | 'fee' | 'gas_limit' | 'gas_price' | 'hash' | 'max_fee_per_gas' |
'max_priority_fee_per_gas' | 'method' | 'nonce' | 'raw_input' | 'to' | 'type' | 'value'; 'max_priority_fee_per_gas' | 'method' | 'nonce' | 'raw_input' | 'to' | 'type' | 'value';
export interface OpWithdrawal {
l1_transaction_hash: string;
nonce: number;
status: L2WithdrawalStatus;
}
export type Transaction = { export type Transaction = {
to: AddressParam | null; to: AddressParam | null;
created_contract: AddressParam | null; created_contract: AddressParam | null;
...@@ -54,8 +60,7 @@ export type Transaction = { ...@@ -54,8 +60,7 @@ export type Transaction = {
l1_gas_used?: string; l1_gas_used?: string;
has_error_in_internal_txs: boolean | null; has_error_in_internal_txs: boolean | null;
// optimism fields // optimism fields
op_withdrawal_status?: L2WithdrawalStatus; op_withdrawals?: Array<OpWithdrawal>;
op_l1_transaction_hash?: string;
// SUAVE fields // SUAVE fields
execution_node?: AddressParam | null; execution_node?: AddressParam | null;
allowed_peekers?: Array<string>; allowed_peekers?: Array<string>;
......
import { Text, HStack } from '@chakra-ui/react'; import { HStack, Box } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { Step } from './types'; import type { Step } from './types';
...@@ -17,7 +17,7 @@ const VerificationStep = ({ step, isLast, isPassed }: Props) => { ...@@ -17,7 +17,7 @@ const VerificationStep = ({ step, isLast, isPassed }: Props) => {
return ( return (
<HStack gap={ 2 } color={ stepColor }> <HStack gap={ 2 } color={ stepColor }>
<IconSvg name={ isPassed ? 'finalized' : 'unfinalized' } boxSize={ 5 }/> <IconSvg name={ isPassed ? 'finalized' : 'unfinalized' } boxSize={ 5 }/>
<Text color={ stepColor }>{ typeof step === 'string' ? step : step.content }</Text> <Box color={ stepColor }>{ typeof step === 'string' ? step : step.content }</Box>
{ !isLast && <IconSvg name="arrows/east" boxSize={ 5 }/> } { !isLast && <IconSvg name="arrows/east" boxSize={ 5 }/> }
</HStack> </HStack>
); );
......
...@@ -30,7 +30,7 @@ const VerificationSteps = ({ currentStep, steps, isLoading, rightSlot, className ...@@ -30,7 +30,7 @@ const VerificationSteps = ({ currentStep, steps, isLoading, rightSlot, className
> >
{ steps.map((step, index) => ( { steps.map((step, index) => (
<VerificationStep <VerificationStep
key={ currentStep } key={ index }
step={ step } step={ step }
isLast={ index === steps.length - 1 && !rightSlot } isLast={ index === steps.length - 1 && !rightSlot }
isPassed={ index <= currentStepIndex } isPassed={ index <= currentStepIndex }
......
...@@ -150,10 +150,27 @@ const TxDetails = () => { ...@@ -150,10 +150,27 @@ const TxDetails = () => {
</Tag> </Tag>
) } ) }
</DetailsInfoItem> </DetailsInfoItem>
<TxDetailsWithdrawalStatus { config.features.optimisticRollup.isEnabled && data.op_withdrawals && data.op_withdrawals.length > 0 && (
status={ data.op_withdrawal_status } <DetailsInfoItem
l1TxHash={ data.op_l1_transaction_hash } title="Withdrawal status"
/> hint="Detailed status progress of the transaction"
>
<Flex flexDir="column" rowGap={ 2 }>
{ data.op_withdrawals.map((withdrawal) => (
<Box key={ withdrawal.nonce }>
<Box mb={ 2 }>
<span>Nonce: </span>
<chakra.span fontWeight={ 600 }>{ withdrawal.nonce }</chakra.span>
</Box>
<TxDetailsWithdrawalStatus
status={ withdrawal.status }
l1TxHash={ withdrawal.l1_transaction_hash }
/>
</Box>
)) }
</Flex>
</DetailsInfoItem>
) }
{ data.zkevm_status && ( { data.zkevm_status && (
<DetailsInfoItem <DetailsInfoItem
title="Confirmation status" title="Confirmation status"
......
import { Box } from '@chakra-ui/react';
import { test as base, expect } from '@playwright/experimental-ct-react'; import { test as base, expect } from '@playwright/experimental-ct-react';
import React from 'react'; import React from 'react';
...@@ -25,7 +26,9 @@ statuses.forEach((status) => { ...@@ -25,7 +26,9 @@ statuses.forEach((status) => {
const component = await mount( const component = await mount(
<TestApp> <TestApp>
<TxDetailsWithdrawalStatus status={ status } l1TxHash="0x7d93a59a228e97d084a635181c3053e324237d07566ec12287eae6da2bcf9456"/> <Box p={ 2 }>
<TxDetailsWithdrawalStatus status={ status } l1TxHash="0x7d93a59a228e97d084a635181c3053e324237d07566ec12287eae6da2bcf9456"/>
</Box>
</TestApp>, </TestApp>,
); );
......
...@@ -4,8 +4,6 @@ import React from 'react'; ...@@ -4,8 +4,6 @@ import React from 'react';
import type { L2WithdrawalStatus } from 'types/api/l2Withdrawals'; import type { L2WithdrawalStatus } from 'types/api/l2Withdrawals';
import { WITHDRAWAL_STATUSES } from 'types/api/l2Withdrawals'; import { WITHDRAWAL_STATUSES } from 'types/api/l2Withdrawals';
import config from 'configs/app';
import DetailsInfoItem from 'ui/shared/DetailsInfoItem';
import TxEntityL1 from 'ui/shared/entities/tx/TxEntityL1'; import TxEntityL1 from 'ui/shared/entities/tx/TxEntityL1';
import VerificationSteps from 'ui/shared/verificationSteps/VerificationSteps'; import VerificationSteps from 'ui/shared/verificationSteps/VerificationSteps';
...@@ -15,10 +13,6 @@ interface Props { ...@@ -15,10 +13,6 @@ interface Props {
} }
const TxDetailsWithdrawalStatus = ({ status, l1TxHash }: Props) => { const TxDetailsWithdrawalStatus = ({ status, l1TxHash }: Props) => {
if (!config.features.optimisticRollup.isEnabled) {
return null;
}
if (!status || !WITHDRAWAL_STATUSES.includes(status)) { if (!status || !WITHDRAWAL_STATUSES.includes(status)) {
return null; return null;
} }
...@@ -55,23 +49,18 @@ const TxDetailsWithdrawalStatus = ({ status, l1TxHash }: Props) => { ...@@ -55,23 +49,18 @@ const TxDetailsWithdrawalStatus = ({ status, l1TxHash }: Props) => {
href="https://app.optimism.io/bridge/withdraw" href="https://app.optimism.io/bridge/withdraw"
target="_blank" target="_blank"
> >
Claim funds Claim funds
</Button> </Button>
) : null; ) : null;
return ( return (
<DetailsInfoItem <VerificationSteps
title="Withdrawal status" steps={ steps as unknown as Array<L2WithdrawalStatus> }
hint="Detailed status progress of the transaction" currentStep={ status }
> rightSlot={ rightSlot }
<VerificationSteps my={ hasClaimButton ? '-6px' : 0 }
steps={ steps as unknown as Array<L2WithdrawalStatus> } lineHeight={ hasClaimButton ? 8 : undefined }
currentStep={ status } />
rightSlot={ rightSlot }
my={ hasClaimButton ? '-6px' : 0 }
lineHeight={ hasClaimButton ? 8 : undefined }
/>
</DetailsInfoItem>
); );
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment