From fdfa5cd7af51868e80108d37dbe6326077eaf78f Mon Sep 17 00:00:00 2001 From: Gerardo Nardelli Date: Mon, 20 Jul 2020 18:44:29 -0300 Subject: [PATCH] Add new status for when there is no registered activity by validators (#401) --- alm/src/components/ConfirmationsContainer.tsx | 3 +- alm/src/components/ExecutionConfirmation.tsx | 20 +- .../components/ValidatorsConfirmations.tsx | 31 ++- alm/src/config/constants.ts | 3 + alm/src/config/descriptions.ts | 10 +- alm/src/hooks/useMessageConfirmations.ts | 7 +- .../__tests__/getConfirmationsForTx.test.ts | 207 ++++++++++++++++-- alm/src/utils/getConfirmationsForTx.ts | 13 +- 8 files changed, 259 insertions(+), 35 deletions(-) diff --git a/alm/src/components/ConfirmationsContainer.tsx b/alm/src/components/ConfirmationsContainer.tsx index 437a69d5..4f0bffae 100644 --- a/alm/src/components/ConfirmationsContainer.tsx +++ b/alm/src/components/ConfirmationsContainer.tsx @@ -49,7 +49,7 @@ export const ConfirmationsContainer = ({ message, receipt, fromHome, timestamp } } = useStateProvider() const { requiredSignatures, validatorList } = useValidatorContract({ fromHome, receipt }) const { blockConfirmations } = useBlockConfirmations({ fromHome, receipt }) - const { confirmations, status, executionData, signatureCollected } = useMessageConfirmations({ + const { confirmations, status, executionData, signatureCollected, waitingBlocksResolved } = useMessageConfirmations({ message, receipt, fromHome, @@ -100,6 +100,7 @@ export const ConfirmationsContainer = ({ message, receipt, fromHome, timestamp } confirmations={confirmations} requiredSignatures={requiredSignatures} validatorList={validatorList} + waitingBlocksResolved={waitingBlocksResolved} /> {signatureCollected && } diff --git a/alm/src/components/ExecutionConfirmation.tsx b/alm/src/components/ExecutionConfirmation.tsx index 17d78148..d1af0a90 100644 --- a/alm/src/components/ExecutionConfirmation.tsx +++ b/alm/src/components/ExecutionConfirmation.tsx @@ -1,7 +1,7 @@ import React from 'react' import { formatTimestamp, formatTxHash, getExplorerTxUrl } from '../utils/networks' import { useWindowWidth } from '@react-hook/window-size' -import { VALIDATOR_CONFIRMATION_STATUS } from '../config/constants' +import { SEARCHING_TX, VALIDATOR_CONFIRMATION_STATUS } from '../config/constants' import { SimpleLoading } from './commons/Loading' import styled from 'styled-components' import { ExecutionData } from '../hooks/useMessageConfirmations' @@ -35,7 +35,11 @@ export const ExecutionConfirmation = ({ executionData, isHome }: ExecutionConfir case VALIDATOR_CONFIRMATION_STATUS.WAITING: return {validatorStatus} default: - return + return executionData.validator ? ( + {VALIDATOR_CONFIRMATION_STATUS.WAITING} + ) : ( + + ) } } @@ -54,9 +58,15 @@ export const ExecutionConfirmation = ({ executionData, isHome }: ExecutionConfir {formattedValidator ? formattedValidator : } {getExecutionStatusElement(executionData.status)} - - {executionData.timestamp > 0 ? formatTimestamp(executionData.timestamp) : ''} - + {executionData.timestamp > 0 ? ( + + {formatTimestamp(executionData.timestamp)} + + ) : executionData.status === VALIDATOR_CONFIRMATION_STATUS.WAITING ? ( + '' + ) : ( + SEARCHING_TX + )} diff --git a/alm/src/components/ValidatorsConfirmations.tsx b/alm/src/components/ValidatorsConfirmations.tsx index bcd08394..127effcf 100644 --- a/alm/src/components/ValidatorsConfirmations.tsx +++ b/alm/src/components/ValidatorsConfirmations.tsx @@ -1,7 +1,7 @@ import React from 'react' import { formatTimestamp, formatTxHash, getExplorerTxUrl } from '../utils/networks' import { useWindowWidth } from '@react-hook/window-size' -import { VALIDATOR_CONFIRMATION_STATUS } from '../config/constants' +import { SEARCHING_TX, VALIDATOR_CONFIRMATION_STATUS } from '../config/constants' import { SimpleLoading } from './commons/Loading' import styled from 'styled-components' import { ConfirmationParam } from '../hooks/useMessageConfirmations' @@ -17,12 +17,14 @@ export interface ValidatorsConfirmationsParams { confirmations: Array requiredSignatures: number validatorList: string[] + waitingBlocksResolved: boolean } export const ValidatorsConfirmations = ({ confirmations, requiredSignatures, - validatorList + validatorList, + waitingBlocksResolved }: ValidatorsConfirmationsParams) => { const windowWidth = useWindowWidth() @@ -37,7 +39,11 @@ export const ValidatorsConfirmations = ({ case VALIDATOR_CONFIRMATION_STATUS.NOT_REQUIRED: return {validatorStatus} default: - return + return waitingBlocksResolved ? ( + {VALIDATOR_CONFIRMATION_STATUS.WAITING} + ) : ( + + ) } } @@ -60,7 +66,12 @@ export const ValidatorsConfirmations = ({ const elementIfNoTimestamp = displayedStatus !== VALIDATOR_CONFIRMATION_STATUS.WAITING && displayedStatus !== VALIDATOR_CONFIRMATION_STATUS.NOT_REQUIRED ? ( - + (displayedStatus === VALIDATOR_CONFIRMATION_STATUS.UNDEFINED || displayedStatus === '') && + waitingBlocksResolved ? ( + SEARCHING_TX + ) : ( + + ) ) : ( '' ) @@ -69,11 +80,13 @@ export const ValidatorsConfirmations = ({ {windowWidth < 850 ? formatTxHash(validator) : validator} {getValidatorStatusElement(displayedStatus)} - - {confirmation && confirmation.timestamp > 0 - ? formatTimestamp(confirmation.timestamp) - : elementIfNoTimestamp} - + {confirmation && confirmation.timestamp > 0 ? ( + + {formatTimestamp(confirmation.timestamp)} + + ) : ( + elementIfNoTimestamp + )} ) diff --git a/alm/src/config/constants.ts b/alm/src/config/constants.ts index 5a745af7..6c2e2fba 100644 --- a/alm/src/config/constants.ts +++ b/alm/src/config/constants.ts @@ -45,6 +45,7 @@ export const CONFIRMATIONS_STATUS = { EXECUTION_WAITING: 'EXECUTION_WAITING', FAILED: 'FAILED', PENDING: 'PENDING', + SEARCHING: 'SEARCHING', WAITING_VALIDATORS: 'WAITING_VALIDATORS', WAITING_CHAIN: 'WAITING_CHAIN', UNDEFINED: 'UNDEFINED' @@ -58,3 +59,5 @@ export const VALIDATOR_CONFIRMATION_STATUS = { NOT_REQUIRED: 'Not required', UNDEFINED: 'UNDEFINED' } + +export const SEARCHING_TX = 'Searching Transaction...' diff --git a/alm/src/config/descriptions.ts b/alm/src/config/descriptions.ts index edc38270..d030db50 100644 --- a/alm/src/config/descriptions.ts +++ b/alm/src/config/descriptions.ts @@ -14,6 +14,7 @@ export const CONFIRMATIONS_STATUS_LABEL: { [key: string]: string } = { FAILED: 'Failed', PENDING: 'Pending', WAITING_VALIDATORS: 'Waiting', + SEARCHING: 'Waiting', WAITING_CHAIN: 'Waiting' } @@ -26,6 +27,7 @@ export const CONFIRMATIONS_STATUS_LABEL_HOME: { [key: string]: string } = { FAILED: 'Confirmation Failed', PENDING: 'Confirmation Pending', WAITING_VALIDATORS: 'Confirmation Waiting', + SEARCHING: 'Confirmation Waiting', WAITING_CHAIN: 'Confirmation Waiting' } @@ -39,7 +41,9 @@ export const CONFIRMATIONS_STATUS_DESCRIPTION: { [key: string]: string } = { PENDING: 'The specified transaction was included in a block. A\nmajority of validators sent confirmations which have\nnot yet been added to a block.', WAITING_VALIDATORS: - 'The specified transaction was included in a block.\nSome validators have sent confirmations, others are\nwaiting for chain finalization.', + 'The specified transaction was included in a block.\nSome validators have sent confirmations, others are\nwaiting for chain finalization.\nCheck status again after a few blocks. If the issue still persists contact to the validators by messaging on %linkhttps://forum.poa.network/c/support', + SEARCHING: + 'The specified transaction was included in a block. The app is looking for confirmations. Either\n1. Validators are waiting for chain finalization before sending their signatures.\n2. Validators are not active.\n3. The bridge was stopped.\nCheck status again after a few blocks. If the issue still persists contact to the validators by messaging on %linkhttps://forum.poa.network/c/support', WAITING_CHAIN: 'The specified transaction was included in a block.\nValidators are waiting for chain finalization before\nsending their confirmations.' } @@ -60,7 +64,9 @@ export const CONFIRMATIONS_STATUS_DESCRIPTION_HOME: { [key: string]: string } = PENDING: 'The specified transaction was included in a block.\nA majority of validators sent signatures which have not\nyet been added to a block.', WAITING_VALIDATORS: - 'The specified transaction was included in a block.\nSome validators have sent signatures, others are\nwaiting for chain finalization.', + 'The specified transaction was included in a block.\nSome validators have sent signatures, others are\nwaiting for chain finalization.\nCheck status again after a few blocks. If the issue still persists contact to the validators by messaging on %linkhttps://forum.poa.network/c/support', + SEARCHING: + 'The specified transaction was included in a block. The app is looking for confirmations. Either\n1. Validators are waiting for chain finalization before sending their signatures.\n2. Validators are not active.\n3. The bridge was stopped.\nCheck status again after a few blocks. If the issue still persists contact to the validators by messaging on %linkhttps://forum.poa.network/c/support', WAITING_CHAIN: 'The specified transaction was included in a block.\nValidators are waiting for chain finalization\nbefore sending their signatures.' } diff --git a/alm/src/hooks/useMessageConfirmations.ts b/alm/src/hooks/useMessageConfirmations.ts index e79c8389..c470185c 100644 --- a/alm/src/hooks/useMessageConfirmations.ts +++ b/alm/src/hooks/useMessageConfirmations.ts @@ -329,7 +329,7 @@ export const useMessageConfirmations = ({ } else if (waitingBlocksForExecutionResolved) { setStatus(CONFIRMATIONS_STATUS.EXECUTION_WAITING) } else { - setStatus(CONFIRMATIONS_STATUS.UNDEFINED) + setStatus(CONFIRMATIONS_STATUS.EXECUTION_WAITING) } } else { setStatus(CONFIRMATIONS_STATUS.UNDEFINED) @@ -342,6 +342,8 @@ export const useMessageConfirmations = ({ setStatus(CONFIRMATIONS_STATUS.PENDING) } else if (waitingBlocksResolved && existsConfirmation(confirmations)) { setStatus(CONFIRMATIONS_STATUS.WAITING_VALIDATORS) + } else if (waitingBlocksResolved) { + setStatus(CONFIRMATIONS_STATUS.SEARCHING) } else { setStatus(CONFIRMATIONS_STATUS.UNDEFINED) } @@ -366,6 +368,7 @@ export const useMessageConfirmations = ({ confirmations, status, signatureCollected, - executionData + executionData, + waitingBlocksResolved } } diff --git a/alm/src/utils/__tests__/getConfirmationsForTx.test.ts b/alm/src/utils/__tests__/getConfirmationsForTx.test.ts index 4a91266b..67aa5fa5 100644 --- a/alm/src/utils/__tests__/getConfirmationsForTx.test.ts +++ b/alm/src/utils/__tests__/getConfirmationsForTx.test.ts @@ -104,12 +104,15 @@ describe('getConfirmationsForTx', () => { expect(getValidatorConfirmation).toBeCalledTimes(1) expect(getValidatorSuccessTransaction).toBeCalledTimes(1) expect(setSignatureCollected).toBeCalledTimes(1) + expect(setSignatureCollected.mock.calls[0][0]).toEqual(true) expect(getValidatorFailedTransaction).toBeCalledTimes(1) - expect(setFailedConfirmations).toBeCalledTimes(0) + expect(setFailedConfirmations).toBeCalledTimes(1) + expect(setFailedConfirmations.mock.calls[0][0]).toEqual(false) expect(getValidatorPendingTransaction).toBeCalledTimes(0) - expect(setPendingConfirmations).toBeCalledTimes(0) + expect(setPendingConfirmations).toBeCalledTimes(1) + expect(setPendingConfirmations.mock.calls[0][0]).toEqual(false) expect(setResult.mock.calls[0][0]()).toEqual( expect.arrayContaining([ @@ -179,13 +182,16 @@ describe('getConfirmationsForTx', () => { expect(setResult).toBeCalledTimes(2) expect(getValidatorConfirmation).toBeCalledTimes(1) expect(getValidatorSuccessTransaction).toBeCalledTimes(1) - expect(setSignatureCollected).toBeCalledTimes(0) + expect(setSignatureCollected).toBeCalledTimes(1) + expect(setSignatureCollected.mock.calls[0][0]).toEqual(false) expect(getValidatorFailedTransaction).toBeCalledTimes(1) - expect(setFailedConfirmations).toBeCalledTimes(0) + expect(setFailedConfirmations).toBeCalledTimes(1) + expect(setFailedConfirmations.mock.calls[0][0]).toEqual(false) expect(getValidatorPendingTransaction).toBeCalledTimes(1) - expect(setPendingConfirmations).toBeCalledTimes(0) + expect(setPendingConfirmations).toBeCalledTimes(1) + expect(setPendingConfirmations.mock.calls[0][0]).toEqual(false) }) test('should set validator confirmations status, validator transactions and not retry', async () => { getValidatorConfirmation.mockImplementation(() => async (validator: string) => ({ @@ -242,12 +248,15 @@ describe('getConfirmationsForTx', () => { expect(getValidatorConfirmation).toBeCalledTimes(1) expect(getValidatorSuccessTransaction).toBeCalledTimes(1) expect(setSignatureCollected).toBeCalledTimes(1) + expect(setSignatureCollected.mock.calls[0][0]).toEqual(true) expect(getValidatorFailedTransaction).toBeCalledTimes(1) - expect(setFailedConfirmations).toBeCalledTimes(0) + expect(setFailedConfirmations).toBeCalledTimes(1) + expect(setFailedConfirmations.mock.calls[0][0]).toEqual(false) expect(getValidatorPendingTransaction).toBeCalledTimes(0) - expect(setPendingConfirmations).toBeCalledTimes(0) + expect(setPendingConfirmations).toBeCalledTimes(1) + expect(setPendingConfirmations.mock.calls[0][0]).toEqual(false) expect(setResult.mock.calls[0][0]()).toEqual( expect.arrayContaining([ @@ -327,12 +336,15 @@ describe('getConfirmationsForTx', () => { expect(getValidatorConfirmation).toBeCalledTimes(1) expect(getValidatorSuccessTransaction).toBeCalledTimes(1) expect(setSignatureCollected).toBeCalledTimes(1) + expect(setSignatureCollected.mock.calls[0][0]).toEqual(true) expect(getValidatorFailedTransaction).toBeCalledTimes(1) - expect(setFailedConfirmations).toBeCalledTimes(0) + expect(setFailedConfirmations).toBeCalledTimes(1) + expect(setFailedConfirmations.mock.calls[0][0]).toEqual(false) expect(getValidatorPendingTransaction).toBeCalledTimes(0) - expect(setPendingConfirmations).toBeCalledTimes(0) + expect(setPendingConfirmations).toBeCalledTimes(1) + expect(setPendingConfirmations.mock.calls[0][0]).toEqual(false) expect(setResult.mock.calls[0][0]()).toEqual( expect.arrayContaining([ @@ -414,13 +426,16 @@ describe('getConfirmationsForTx', () => { expect(setResult).toBeCalledTimes(2) expect(getValidatorConfirmation).toBeCalledTimes(1) expect(getValidatorSuccessTransaction).toBeCalledTimes(1) - expect(setSignatureCollected).toBeCalledTimes(0) + expect(setSignatureCollected).toBeCalledTimes(1) + expect(setSignatureCollected.mock.calls[0][0]).toEqual(false) expect(getValidatorFailedTransaction).toBeCalledTimes(1) - expect(setFailedConfirmations).toBeCalledTimes(0) + expect(setFailedConfirmations).toBeCalledTimes(1) + expect(setFailedConfirmations.mock.calls[0][0]).toEqual(false) expect(getValidatorPendingTransaction).toBeCalledTimes(1) expect(setPendingConfirmations).toBeCalledTimes(1) + expect(setPendingConfirmations.mock.calls[0][0]).toEqual(true) expect(setResult.mock.calls[0][0]()).toEqual( expect.arrayContaining([ @@ -498,13 +513,16 @@ describe('getConfirmationsForTx', () => { expect(setResult).toBeCalledTimes(2) expect(getValidatorConfirmation).toBeCalledTimes(1) expect(getValidatorSuccessTransaction).toBeCalledTimes(1) - expect(setSignatureCollected).toBeCalledTimes(0) + expect(setSignatureCollected).toBeCalledTimes(1) + expect(setSignatureCollected.mock.calls[0][0]).toEqual(false) expect(getValidatorFailedTransaction).toBeCalledTimes(1) expect(setFailedConfirmations).toBeCalledTimes(1) + expect(setFailedConfirmations.mock.calls[0][0]).toEqual(true) expect(getValidatorPendingTransaction).toBeCalledTimes(1) - expect(setPendingConfirmations).toBeCalledTimes(0) + expect(setPendingConfirmations).toBeCalledTimes(1) + expect(setPendingConfirmations.mock.calls[0][0]).toEqual(false) expect(setResult.mock.calls[0][0]()).toEqual( expect.arrayContaining([ @@ -521,4 +539,167 @@ describe('getConfirmationsForTx', () => { ]) ) }) + test('should remove pending state after transaction mined', async () => { + // Validator1 success + // Validator2 failed + // Validator3 Pending + + getValidatorConfirmation + .mockImplementationOnce(() => async (validator: string) => ({ + validator, + status: + validator === validator1 ? VALIDATOR_CONFIRMATION_STATUS.SUCCESS : VALIDATOR_CONFIRMATION_STATUS.UNDEFINED + })) + .mockImplementation(() => async (validator: string) => ({ + validator, + status: + validator !== validator2 ? VALIDATOR_CONFIRMATION_STATUS.SUCCESS : VALIDATOR_CONFIRMATION_STATUS.UNDEFINED + })) + getValidatorSuccessTransaction + .mockImplementationOnce(() => async (validatorData: BasicConfirmationParam) => ({ + validator: validatorData.validator, + status: VALIDATOR_CONFIRMATION_STATUS.SUCCESS, + txHash: validatorData.validator === validator1 ? '0x123' : '', + timestamp: validatorData.validator === validator1 ? 123 : 0 + })) + .mockImplementation(() => async (validatorData: BasicConfirmationParam) => ({ + validator: validatorData.validator, + status: VALIDATOR_CONFIRMATION_STATUS.SUCCESS, + txHash: validatorData.validator !== validator2 ? '0x123' : '', + timestamp: validatorData.validator !== validator2 ? 123 : 0 + })) + getValidatorFailedTransaction.mockImplementation(() => async (validatorData: BasicConfirmationParam) => ({ + validator: validatorData.validator, + status: + validatorData.validator === validator2 + ? VALIDATOR_CONFIRMATION_STATUS.FAILED + : VALIDATOR_CONFIRMATION_STATUS.UNDEFINED, + txHash: validatorData.validator === validator2 ? '0x123' : '', + timestamp: validatorData.validator === validator2 ? 123 : 0 + })) + getValidatorPendingTransaction + .mockImplementationOnce(() => async (validatorData: BasicConfirmationParam) => ({ + validator: validatorData.validator, + status: + validatorData.validator === validator3 + ? VALIDATOR_CONFIRMATION_STATUS.PENDING + : VALIDATOR_CONFIRMATION_STATUS.UNDEFINED, + txHash: validatorData.validator === validator3 ? '0x123' : '', + timestamp: validatorData.validator === validator3 ? 123 : 0 + })) + .mockImplementationOnce(() => async (validatorData: BasicConfirmationParam) => ({ + validator: validatorData.validator, + status: VALIDATOR_CONFIRMATION_STATUS.UNDEFINED, + txHash: '', + timestamp: 0 + })) + + const setResult = jest.fn() + const setSignatureCollected = jest.fn() + const setFailedConfirmations = jest.fn() + const setPendingConfirmations = jest.fn() + + await getConfirmationsForTx( + messageData, + web3, + validatorList, + bridgeContract, + confirmationContractMethod, + setResult, + requiredSignatures, + setSignatureCollected, + waitingBlocksResolved, + subscriptions, + timestamp, + getFailedTransactions, + setFailedConfirmations, + getPendingTransactions, + setPendingConfirmations, + getSuccessTransactions + ) + + unsubscribe() + + expect(setResult).toBeCalledTimes(2) + expect(getValidatorConfirmation).toBeCalledTimes(1) + expect(getValidatorSuccessTransaction).toBeCalledTimes(1) + expect(setSignatureCollected).toBeCalledTimes(1) + expect(setSignatureCollected.mock.calls[0][0]).toEqual(false) + + expect(getValidatorFailedTransaction).toBeCalledTimes(1) + expect(setFailedConfirmations).toBeCalledTimes(1) + expect(setFailedConfirmations.mock.calls[0][0]).toEqual(false) + + expect(getValidatorPendingTransaction).toBeCalledTimes(1) + expect(setPendingConfirmations).toBeCalledTimes(1) + expect(setPendingConfirmations.mock.calls[0][0]).toEqual(true) + + expect(setResult.mock.calls[0][0]()).toEqual( + expect.arrayContaining([ + { validator: validator1, status: VALIDATOR_CONFIRMATION_STATUS.SUCCESS }, + { validator: validator2, status: VALIDATOR_CONFIRMATION_STATUS.FAILED, txHash: '0x123', timestamp: 123 }, + { validator: validator3, status: VALIDATOR_CONFIRMATION_STATUS.PENDING, txHash: '0x123', timestamp: 123 } + ]) + ) + expect(setResult.mock.calls[1][0]).toEqual( + expect.arrayContaining([ + { validator: validator1, status: VALIDATOR_CONFIRMATION_STATUS.SUCCESS, txHash: '0x123', timestamp: 123 }, + { validator: validator2, status: VALIDATOR_CONFIRMATION_STATUS.FAILED, txHash: '0x123', timestamp: 123 }, + { validator: validator3, status: VALIDATOR_CONFIRMATION_STATUS.PENDING, txHash: '0x123', timestamp: 123 } + ]) + ) + + await getConfirmationsForTx( + messageData, + web3, + validatorList, + bridgeContract, + confirmationContractMethod, + setResult, + requiredSignatures, + setSignatureCollected, + waitingBlocksResolved, + subscriptions, + timestamp, + getFailedTransactions, + setFailedConfirmations, + getPendingTransactions, + setPendingConfirmations, + getSuccessTransactions + ) + + unsubscribe() + + expect(setResult).toBeCalledTimes(4) + expect(getValidatorConfirmation).toBeCalledTimes(2) + expect(getValidatorSuccessTransaction).toBeCalledTimes(2) + expect(setSignatureCollected).toBeCalledTimes(2) + expect(setSignatureCollected.mock.calls[0][0]).toEqual(false) + expect(setSignatureCollected.mock.calls[1][0]).toEqual(true) + + expect(getValidatorFailedTransaction).toBeCalledTimes(2) + expect(setFailedConfirmations).toBeCalledTimes(2) + expect(setFailedConfirmations.mock.calls[0][0]).toEqual(false) + expect(setFailedConfirmations.mock.calls[1][0]).toEqual(false) + + expect(getValidatorPendingTransaction).toBeCalledTimes(1) + expect(setPendingConfirmations).toBeCalledTimes(2) + expect(setPendingConfirmations.mock.calls[0][0]).toEqual(true) + expect(setPendingConfirmations.mock.calls[1][0]).toEqual(false) + + expect(setResult.mock.calls[2][0]()).toEqual( + expect.arrayContaining([ + { validator: validator1, status: VALIDATOR_CONFIRMATION_STATUS.SUCCESS }, + { validator: validator2, status: VALIDATOR_CONFIRMATION_STATUS.FAILED, txHash: '0x123', timestamp: 123 }, + { validator: validator3, status: VALIDATOR_CONFIRMATION_STATUS.SUCCESS } + ]) + ) + expect(setResult.mock.calls[3][0]).toEqual( + expect.arrayContaining([ + { validator: validator1, status: VALIDATOR_CONFIRMATION_STATUS.SUCCESS, txHash: '0x123', timestamp: 123 }, + { validator: validator2, status: VALIDATOR_CONFIRMATION_STATUS.FAILED, txHash: '0x123', timestamp: 123 }, + { validator: validator3, status: VALIDATOR_CONFIRMATION_STATUS.SUCCESS, txHash: '0x123', timestamp: 123 } + ]) + ) + }) }) diff --git a/alm/src/utils/getConfirmationsForTx.ts b/alm/src/utils/getConfirmationsForTx.ts index ab1f423e..6140868d 100644 --- a/alm/src/utils/getConfirmationsForTx.ts +++ b/alm/src/utils/getConfirmationsForTx.ts @@ -59,6 +59,7 @@ export const getConfirmationsForTx = async ( const notSuccessConfirmations = validatorConfirmations.filter(c => c.status !== VALIDATOR_CONFIRMATION_STATUS.SUCCESS) // If signatures not collected, look for pending transactions + let pendingConfirmationsResult = false if (successConfirmations.length !== requiredSignatures) { // Check if confirmation is pending const validatorPendingConfirmationsChecks = await Promise.all( @@ -74,7 +75,7 @@ export const getConfirmationsForTx = async ( }) if (validatorPendingConfirmations.length > 0) { - setPendingConfirmations(true) + pendingConfirmationsResult = true } } @@ -83,6 +84,7 @@ export const getConfirmationsForTx = async ( ) // Check if confirmation failed + let failedConfirmationsResult = false const validatorFailedConfirmationsChecks = await Promise.all( undefinedConfirmations.map( getValidatorFailedTransaction(bridgeContract, messageData, timestamp, getFailedTransactions) @@ -97,7 +99,7 @@ export const getConfirmationsForTx = async ( }) const messageConfirmationsFailed = validatorFailedConfirmations.length > validatorList.length - requiredSignatures if (messageConfirmationsFailed) { - setFailedConfirmations(true) + failedConfirmationsResult = true } const missingConfirmations = validatorConfirmations.filter( @@ -108,6 +110,7 @@ export const getConfirmationsForTx = async ( shouldRetry = true } + let signatureCollectedResult = false if (successConfirmations.length === requiredSignatures) { // If signatures collected, it should set other signatures not found as not required const notRequiredConfirmations = missingConfirmations.map(c => ({ @@ -116,7 +119,7 @@ export const getConfirmationsForTx = async ( })) validatorConfirmations = [...validatorConfirmations, ...notRequiredConfirmations] - setSignatureCollected(true) + signatureCollectedResult = true } // get transactions from success signatures @@ -137,7 +140,11 @@ export const getConfirmationsForTx = async ( }) } + // Set results setResult(updatedValidatorConfirmations) + setFailedConfirmations(failedConfirmationsResult) + setPendingConfirmations(pendingConfirmationsResult) + setSignatureCollected(signatureCollectedResult) // Retry if not all transaction were found for validator confirmations if (successConfirmationWithTxFound.length < successConfirmationWithData.length) {