From 4807891eaef9037a9e2aaebdd95d99a82fb6fd68 Mon Sep 17 00:00:00 2001 From: Mavrik Date: Fri, 20 Jun 2025 16:51:34 +0200 Subject: [PATCH 1/9] feat: added new localizations --- src/locales/translations/en-US.json | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/locales/translations/en-US.json b/src/locales/translations/en-US.json index 46407cd0..997ae351 100644 --- a/src/locales/translations/en-US.json +++ b/src/locales/translations/en-US.json @@ -24,6 +24,7 @@ "saturday": "Sat" } }, + "cancelTransaction": "Cancel Transaction", "logLevel": "Log Level", "loadOlderLogs": "Load older logs", "effectiveBalance": "Effective Balance", @@ -518,6 +519,7 @@ "viewValidator": "View Validator", "reviewStatus": "Review validator status {{pubKey}}", "txStatuses": { + "cancelTxToolTip": "Note: the app may lose track of an in-flight tx. It could still be pending in your wallet or on-chain. Please verify in your wallet or on a block explorer before retrying.", "processingRequest": "Processing Request", "validatorComplete": { "title": "Validator Complete", @@ -797,10 +799,14 @@ "consolidation": { "title": "Validator Consolidation Requested", "errorTitle": "Failed to Consolidate", - "errorTargetConsolidationText": "Request to consolidate target validator: {{pubKey}} with source validator: {{sourcePubKey}} was unsuccessful. Click here to review the transaction details on Etherscan.", - "targetConsolidationText": "Request to consolidate target validator: {{pubKey}} with source validator: {{sourcePubKey}} as been sent. Click here to review the transaction details on Etherscan.", - "selfConsolidationText": "Request for self consolidation of validator: {{pubKey}} has been sent. Click here to review the transaction details on Etherscan.", - "errorSelfConsolidationText": "Request for self consolidation of validator: {{pubKey}} was unsuccessful. Click here to review the transaction details on Etherscan." + "target": { + "errorText": "Request to consolidate target validator: {{pubKey}} with source validator: {{sourcePubKey}} was unsuccessful. Click here to review the transaction details on Etherscan.", + "text": "Request to consolidate target validator: {{pubKey}} with source validator: {{sourcePubKey}} as been sent. Click here to review the transaction details on Etherscan." + }, + "self": { + "text": "Request for self consolidation of validator: {{pubKey}} has been sent. Click here to review the transaction details on Etherscan.", + "errorText": "Request for self consolidation of validator: {{pubKey}} was unsuccessful. Click here to review the transaction details on Etherscan." + } }, "partialWithdrawal": { "title": "Partial Withdrawal Requested", From c407780b141a7e1d4a902c265d2d7adf47bfa60a Mon Sep 17 00:00:00 2001 From: Mavrik Date: Fri, 20 Jun 2025 17:02:26 +0200 Subject: [PATCH 2/9] feat: add reset option in deposit hook --- src/hooks/useValidatorDeposit.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/hooks/useValidatorDeposit.ts b/src/hooks/useValidatorDeposit.ts index 4fd7e374..309e3998 100644 --- a/src/hooks/useValidatorDeposit.ts +++ b/src/hooks/useValidatorDeposit.ts @@ -17,6 +17,7 @@ export type ValidatorDepositReturnType = { pubKey: string txHash: TxHash | undefined makeDeposit: () => Promise + reset: () => void } const useValidatorDeposit = ({ @@ -26,7 +27,7 @@ const useValidatorDeposit = ({ }: ValidatorDepositConfig): ValidatorDepositReturnType => { const { DEPOSIT_CONTRACT_ADDRESS, GENESIS_FORK_VERSION } = beaconSpec const { index, withdrawalCredentials, effectiveBalance, withdrawalPrefix } = validator - const [txHash, setTxHash] = useState() + const [txHash, setTxHash] = useState(undefined) const [pubKey, setPubKey] = useState('') const [isLoading, setLoading] = useState(false) const [error, setError] = useState('') @@ -88,12 +89,19 @@ const useValidatorDeposit = ({ } } + const reset = () => { + setTxHash(undefined) + setLoading(false) + setError('') + } + return { isLoading, error, pubKey, txHash, makeDeposit, + reset, } } From d0fe681de23c634ef94d0c080cb55f64bc89d928 Mon Sep 17 00:00:00 2001 From: Mavrik Date: Fri, 20 Jun 2025 17:03:39 +0200 Subject: [PATCH 3/9] feat: update query options and allow query to reset if hash changes --- src/hooks/useResolveTransactionOnce.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/hooks/useResolveTransactionOnce.ts b/src/hooks/useResolveTransactionOnce.ts index 7acd6290..ab171394 100644 --- a/src/hooks/useResolveTransactionOnce.ts +++ b/src/hooks/useResolveTransactionOnce.ts @@ -13,7 +13,15 @@ const useResolveTransactionOnce = ( const [isEnabledFetch, setIsEnabledFetch] = useState(true) const { isFetched, status, ...rest } = useWaitForTransactionReceipt({ hash: txHash, - query: { enabled: isEnabledFetch }, + query: { + enabled: isEnabledFetch, + refetchOnMount: false, + refetchOnReconnect: false, + refetchOnWindowFocus: false, + retry: false, + retryOnMount: false, + staleTime: Infinity, + }, }) useEffect(() => { @@ -22,6 +30,10 @@ const useResolveTransactionOnce = ( } }, [isFetched]) + useEffect(() => { + setIsEnabledFetch(true) + }, [txHash]) + return { ...rest, txStatus: status.toUpperCase() as Status, From 8227933490dba44a3aba8f62f8ead98e741c9f23 Mon Sep 17 00:00:00 2001 From: Mavrik Date: Fri, 20 Jun 2025 17:05:26 +0200 Subject: [PATCH 4/9] feat: add reset option to block --- .../TransactionStatus/TransactionStatusBlock.tsx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/components/TransactionStatus/TransactionStatusBlock.tsx b/src/components/TransactionStatus/TransactionStatusBlock.tsx index 7d483f10..976f29b9 100644 --- a/src/components/TransactionStatus/TransactionStatusBlock.tsx +++ b/src/components/TransactionStatus/TransactionStatusBlock.tsx @@ -7,6 +7,7 @@ import getEtherscanLink from '../../../utilities/getEtherscanLink' import isValidNetwork from '../../../utilities/isValidNetwork' import { Status } from '../../constants/enums' import Button, { ButtonFace } from '../Button/Button' +import Tooltip from '../ToolTip/Tooltip' import Typography from '../Typography/Typography' export interface TransactionStatusBlockProps { @@ -16,6 +17,7 @@ export interface TransactionStatusBlockProps { onErrorText?: string onSuccessText?: string onSuccess?: () => void + onReset?: () => void chainId: number } @@ -26,18 +28,21 @@ const TransactionStatusBlock: FC = ({ onErrorText, onSuccessText, onSuccess, + onReset, chainId, }) => { const { t } = useTranslation() + const isPending = txStatus === Status.PENDING const isSuccess = txStatus === Status.SUCCESS const isError = txStatus === Status.ERROR const etherScanLink = isValidNetwork(chainId) ? getEtherscanLink(chainId, `/tx/${txHash}`) : null const hasErrorCallback = !!onError && !!onErrorText const hasSuccessCallback = !!onSuccess && onSuccessText + const status = isSuccess ? 'success' : isError ? 'error' : 'pending' - const statusTitle = `validatorManagement.txStatuses.${isSuccess ? 'success' : isError ? 'error' : 'pending'}.title` - const statusText = `validatorManagement.txStatuses.${isSuccess ? 'success' : isError ? 'error' : 'pending'}.text` + const statusTitle = `validatorManagement.txStatuses.${status}.title` + const statusText = `validatorManagement.txStatuses.${status}.text` const txIcon = clsx( isSuccess ? 'bi-check text-subtitle1 text-success ' @@ -80,6 +85,13 @@ const TransactionStatusBlock: FC = ({ {t(statusText)} + {onReset && isPending && ( + + + + )} {isError && hasErrorCallback ? ( + + + )} ) : null diff --git a/src/components/ValidatorManagement/CreateValidatorView/Steps/SignDepositValidators/SingleDeposit/SingleDeposit.tsx b/src/components/ValidatorManagement/CreateValidatorView/Steps/SignDepositValidators/SingleDeposit/SingleDeposit.tsx index d06adf53..12229029 100644 --- a/src/components/ValidatorManagement/CreateValidatorView/Steps/SignDepositValidators/SingleDeposit/SingleDeposit.tsx +++ b/src/components/ValidatorManagement/CreateValidatorView/Steps/SignDepositValidators/SingleDeposit/SingleDeposit.tsx @@ -55,7 +55,7 @@ const SingleDeposit: FC = ({ t('validatorManagement.signAndDeposit.stepTitles.verifyTransaction'), t('validatorManagement.signAndDeposit.stepTitles.importValidator'), ] - const { isLoading, error, txHash, pubKey, makeDeposit } = useValidatorDeposit({ + const { isLoading, error, txHash, pubKey, makeDeposit, reset } = useValidatorDeposit({ validator: candidate, mnemonic, beaconSpec, @@ -112,7 +112,10 @@ const SingleDeposit: FC = ({ const acknowledgeRisk = () => setIsAcknowledge(true) - const retryTransaction = () => setStep(0) + const retryTransaction = () => { + setStep(0) + reset() + } return (
From d58932ca8d32bc5aa19ba69de3224f01c39c1bfe Mon Sep 17 00:00:00 2001 From: Mavrik Date: Fri, 20 Jun 2025 17:20:37 +0200 Subject: [PATCH 7/9] feat: add reset to withdrawal --- .../views/ValidatorWithdrawal/ValidatorWithdrawal.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/ValidatorModal/views/ValidatorWithdrawal/ValidatorWithdrawal.tsx b/src/components/ValidatorModal/views/ValidatorWithdrawal/ValidatorWithdrawal.tsx index 8c4fa65e..2782a584 100644 --- a/src/components/ValidatorModal/views/ValidatorWithdrawal/ValidatorWithdrawal.tsx +++ b/src/components/ValidatorModal/views/ValidatorWithdrawal/ValidatorWithdrawal.tsx @@ -216,6 +216,7 @@ const ValidatorWithdrawal: FC = ({ Date: Fri, 20 Jun 2025 17:21:33 +0200 Subject: [PATCH 8/9] feat: update the consolidation request with reset --- .../ConsolidationRequestStatus.tsx | 75 +++++++++++-------- .../SubmitConsolidationStep.tsx | 4 +- 2 files changed, 45 insertions(+), 34 deletions(-) diff --git a/src/components/ConsolidationRequestStatus/ConsolidationRequestStatus.tsx b/src/components/ConsolidationRequestStatus/ConsolidationRequestStatus.tsx index bd0b3d88..7dd262e6 100644 --- a/src/components/ConsolidationRequestStatus/ConsolidationRequestStatus.tsx +++ b/src/components/ConsolidationRequestStatus/ConsolidationRequestStatus.tsx @@ -4,6 +4,7 @@ import postActivity from '../../../utilities/postActivity' import { Status } from '../../constants/enums' import useResolveTransactionOnce from '../../hooks/useResolveTransactionOnce' import { ActivityType, NetworkId, TxHash } from '../../types' +import Tooltip from '../ToolTip/Tooltip' import TransactionStatus, { TransactionStatusStyle } from '../TransactionStatus/TransactionStatus' import Typography from '../Typography/Typography' @@ -11,10 +12,10 @@ export interface ConsolidationRequestStatusProps { targetPubKey: string sourcePubKey: string txHash: TxHash - networkId: number - id?: string | number - onRetryTx: (id: string | number) => void - onStatusUpdate?: (id: string | number, status: Status) => void + networkId: NetworkId + id: number + onRetryTx: (id: number) => void + onStatusUpdate?: (id: number, status: Status) => void } const ConsolidationRequestStatus: FC = ({ @@ -29,14 +30,8 @@ const ConsolidationRequestStatus: FC = ({ const { t } = useTranslation() const { txStatus } = useResolveTransactionOnce(txHash) - const renderText = { - [Status.SUCCESS]: 'successTxText', - [Status.ERROR]: 'errorTxText', - [Status.PENDING]: 'pendingTxText', - }[txStatus] - useEffect(() => { - if (txStatus && id != null) { + if (txStatus) { onStatusUpdate?.(id, txStatus) } }, [txStatus, id, onStatusUpdate]) @@ -61,25 +56,23 @@ const ConsolidationRequestStatus: FC = ({ })() }, [txStatus, targetPubKey, sourcePubKey, txHash]) - const handleRetry = useCallback(() => { - if (id != null) { - onRetryTx(id) - } - }, [id, onRetryTx]) + const handleRetry = useCallback(() => onRetryTx(id), [id, onRetryTx]) + + const commonProps = { + id, + networkId, + title: t('validatorManagement.consolidateView.signAndSubmit.consolidationRequest'), + status: txStatus, + txHash, + style: TransactionStatusStyle.Secondary, + } if (txStatus === Status.ERROR) { return ( - +
- {t(`validatorManagement.consolidateView.signAndSubmit.${renderText}`)} + {t('validatorManagement.consolidateView.signAndSubmit.errorTxText')}
@@ -91,15 +84,33 @@ const ConsolidationRequestStatus: FC = ({ ) } + if (txStatus === Status.PENDING) { + return ( + +
+ + {t('validatorManagement.consolidateView.signAndSubmit.pendingTxText')} + + +
+ + {t('cancelTransaction')} + +
+
+
+
+ ) + } + return ( ) } diff --git a/src/components/ValidatorManagement/ConsolidateView/Steps/SubmitConsolidationStep/SubmitConsolidationStep.tsx b/src/components/ValidatorManagement/ConsolidateView/Steps/SubmitConsolidationStep/SubmitConsolidationStep.tsx index 1d8ae1bb..4dd1203e 100644 --- a/src/components/ValidatorManagement/ConsolidateView/Steps/SubmitConsolidationStep/SubmitConsolidationStep.tsx +++ b/src/components/ValidatorManagement/ConsolidateView/Steps/SubmitConsolidationStep/SubmitConsolidationStep.tsx @@ -7,7 +7,7 @@ import ValidatorLogo from '../../../../../assets/images/validators.svg' import { CONSOLIDATION_CONTRACT } from '../../../../../constants/constants' import { Status } from '../../../../../constants/enums' import { useMaxHeight } from '../../../../../hooks/useMaxHeight' -import { ConsolidationTx } from '../../../../../types' +import { ConsolidationTx, NetworkId } from '../../../../../types' import { ValidatorInfo } from '../../../../../types/validator' import Button, { ButtonFace } from '../../../../Button/Button' import CheckBox from '../../../../CheckBox/CheckBox' @@ -117,7 +117,7 @@ const SubmitConsolidationStep: FC = ({ onRetryTx={retryTransaction} onStatusUpdate={updateConsolidationResults} id={index} - networkId={chainId} + networkId={chainId as NetworkId} txHash={txHash} /> )) From 836ea0ead836523372cb6e0c0c46df6b9ea58c3b Mon Sep 17 00:00:00 2001 From: Mavrik Date: Fri, 20 Jun 2025 17:22:30 +0200 Subject: [PATCH 9/9] fix: notificaton text fix --- src/components/ActivityHistory/ActivityText.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/components/ActivityHistory/ActivityText.tsx b/src/components/ActivityHistory/ActivityText.tsx index 7a4f3b0c..be72cac1 100644 --- a/src/components/ActivityHistory/ActivityText.tsx +++ b/src/components/ActivityHistory/ActivityText.tsx @@ -45,11 +45,7 @@ const ActivityText: React.FC = ({ values: () => ({ pubKey: formatEthAddress(pubKey) }), }, [ActivityType.CONSOLIDATION]: { - key: `consolidation.${isError ? 'error' : ''}${ - formattedData?.targetPubKey === formattedData?.sourcePubKey - ? 'SelfConsolidationText' - : 'TargetConsolidationText' - }`, + key: `consolidation.${formattedData?.targetPubKey === formattedData?.sourcePubKey ? 'self' : 'target'}.${isError ? 'errorText' : 'text'}`, values: () => ({ pubKey: formatEthAddress(formattedData?.targetPubKey), sourcePubKey: formatEthAddress(formattedData?.sourcePubKey),