diff --git a/.github/workflows/push_frontend_images.yml b/.github/workflows/push_frontend_images.yml index c0571699..ec6258c6 100644 --- a/.github/workflows/push_frontend_images.yml +++ b/.github/workflows/push_frontend_images.yml @@ -29,7 +29,6 @@ jobs: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - deploy_testnet: if: github.event.base_ref == 'refs/heads/master' needs: [push-frontend-image] diff --git a/src/hooks/useTransferToL1.js b/src/hooks/useTransferToL1.js index c5fa0e42..908dfa74 100644 --- a/src/hooks/useTransferToL1.js +++ b/src/hooks/useTransferToL1.js @@ -83,7 +83,7 @@ export const useTransferToL1 = () => { l2hash }); } catch (ex) { - logger.error(ex.message, {ex}); + logger.error(ex.message, ex); trackError(ex); handleError(progressOptions.error(TransferError.TRANSACTION_ERROR, ex)); } @@ -110,7 +110,7 @@ export const useCompleteTransferToL1 = () => { const progressOptions = useTransferProgress(); const getL1Token = useL1Token(); const getL1TokenBridgeContract = useL1TokenBridgeContract(); - const addWithdrawalListener = useWithdrawalListener(); + const {addListener, removeListener} = useWithdrawalListener(); const [trackInitiated, trackSuccess, trackError, trackReject] = useCompleteTransferToL1Tracking(); return useCallback( @@ -136,7 +136,9 @@ export const useCompleteTransferToL1 = () => { }; const onTransactionHash = (error, transactionHash) => { - if (!error) { + if (error) { + onError(error); + } else { logger.log('Tx signed', {transactionHash}); handleProgress( progressOptions.withdraw( @@ -145,26 +147,27 @@ export const useCompleteTransferToL1 = () => { stepOf(TransferStep.WITHDRAW, CompleteTransferToL1Steps) ) ); - } else { - trackReject(error); - logger.error(error.message); - handleError(progressOptions.error(TransferError.TRANSACTION_ERROR, error)); } }; const onWithdrawal = (error, event) => { - if (!error) { + if (error) { + onError(error); + } else { const {transactionHash: l1hash} = event; logger.log('Done', l1hash); trackSuccess(l1hash); handleData({...transfer, l1hash}); - } else { - trackError(error); - logger.error(error.message); - handleError(progressOptions.error(TransferError.TRANSACTION_ERROR, error)); } }; + const onError = error => { + removeListener(); + trackError(error); + logger.error(error?.message, error); + handleError(progressOptions.error(TransferError.TRANSACTION_ERROR, error)); + }; + try { logger.log('CompleteTransferToL1 called'); handleProgress( @@ -173,13 +176,11 @@ export const useCompleteTransferToL1 = () => { stepOf(TransferStep.CONFIRM_TX, CompleteTransferToL1Steps) ) ); - addWithdrawalListener(onWithdrawal); + addListener(onWithdrawal); logger.log('Calling withdraw'); await sendWithdrawal(); } catch (ex) { - trackError(ex); - logger.error(ex.message, {ex}); - handleError(progressOptions.error(TransferError.TRANSACTION_ERROR, ex)); + onError(ex); } }, [ @@ -192,7 +193,8 @@ export const useCompleteTransferToL1 = () => { handleProgress, logger, progressOptions, - addWithdrawalListener + addListener, + removeListener ] ); }; diff --git a/src/hooks/useTransferToL2.js b/src/hooks/useTransferToL2.js index c7a5e1eb..41953bb6 100644 --- a/src/hooks/useTransferToL2.js +++ b/src/hooks/useTransferToL2.js @@ -32,7 +32,7 @@ export const useTransferToL2 = () => { const getTokenContract = useTokenContract(); const getTokenBridgeContract = useTokenBridgeContract(); const progressOptions = useTransferProgress(); - const addDepositListener = useDepositListener(); + const {addListener, removeListener} = useDepositListener(); const getDepositMessageToL2Event = useDepositMessageToL2Event(); const maxTotalBalance = useMaxTotalBalance(); @@ -81,20 +81,20 @@ export const useTransferToL2 = () => { }; const onTransactionHash = (error, transactionHash) => { - if (!error) { + if (error) { + onError(error); + } else { logger.log('Tx signed', {transactionHash}); handleProgress( progressOptions.deposit(amount, symbol, stepOf(TransferStep.DEPOSIT, TransferToL2Steps)) ); - } else { - trackReject(error); - logger.error(error.message); - handleError(progressOptions.error(TransferError.TRANSACTION_ERROR, error)); } }; const onDeposit = async (error, event) => { - if (!error) { + if (error) { + onError(error); + } else { const l2MessageEvent = await getDepositMessageToL2Event(event); if (l2MessageEvent) { handleData({ @@ -107,10 +107,6 @@ export const useTransferToL2 = () => { ...extractTransactionsHashFromEvent(l2MessageEvent) }); } - } else { - trackError(error); - logger.error(error.message); - handleError(progressOptions.error(TransferError.TRANSACTION_ERROR, error)); } }; @@ -144,6 +140,13 @@ export const useTransferToL2 = () => { return maxTotalBalance < tokenBridgeBalance + Number(amount); }; + const onError = error => { + removeListener(); + trackError(error); + logger.error(error?.message, error); + handleError(progressOptions.error(TransferError.TRANSACTION_ERROR, error)); + }; + try { logger.log('TransferToL2 called'); if (await isMaxBalanceExceeded()) { @@ -170,18 +173,17 @@ export const useTransferToL2 = () => { stepOf(TransferStep.CONFIRM_TX, TransferToL2Steps) ) ); - addDepositListener(onDeposit); + addListener(onDeposit); logger.log('Calling deposit'); await sendDeposit(); } catch (ex) { - trackError(ex); - logger.error(ex.message, {ex}); - handleError(progressOptions.error(TransferError.TRANSACTION_ERROR, ex)); + onError(ex); } }, [ selectedToken, - addDepositListener, + addListener, + removeListener, l1ChainId, l2ChainId, l1Account, diff --git a/src/providers/EventManagerProvider/EventManagerProvider.js b/src/providers/EventManagerProvider/EventManagerProvider.js index 8e410ff1..a32d4cef 100644 --- a/src/providers/EventManagerProvider/EventManagerProvider.js +++ b/src/providers/EventManagerProvider/EventManagerProvider.js @@ -31,6 +31,11 @@ export const EventManagerProvider = ({children}) => { listeners[eventName].push(callback); }; + const removeListeners = eventName => { + logger.log(`Remove listeners for event ${eventName}.`); + listeners[eventName] = []; + }; + const getPastEvents = (contract, eventName, options = {}) => { logger.log(`Getting ${eventName} past events.`); return contract.getPastEvents(eventName, { @@ -42,12 +47,7 @@ export const EventManagerProvider = ({children}) => { const emitListeners = (eventName, error, event) => { logger.log(`Event ${eventName} emitted to listeners.`, event); listeners[eventName]?.forEach(listener => listener(error, event)); - cleanListeners(eventName); - }; - - const cleanListeners = eventName => { - logger.log(`Clean listeners for event ${eventName}.`); - listeners[eventName] = []; + removeListeners(eventName); }; const onWithdrawal = (error, event) => { @@ -111,7 +111,8 @@ export const EventManagerProvider = ({children}) => { const value = { addListener, - getPastEvents + getPastEvents, + removeListeners }; return <EventManagerContext.Provider value={value}>{children}</EventManagerContext.Provider>; diff --git a/src/providers/EventManagerProvider/event-manager-context.js b/src/providers/EventManagerProvider/event-manager-context.js index a1c700d2..0cec28a5 100644 --- a/src/providers/EventManagerProvider/event-manager-context.js +++ b/src/providers/EventManagerProvider/event-manager-context.js @@ -2,5 +2,6 @@ import {createContext} from 'react'; export const EventManagerContext = createContext({ addListener: (eventName, callback) => ({eventName, callback}), + removeListeners: eventName => eventName, getPastEvents: async (contract, eventName, options) => ({contract, eventName, options}) }); diff --git a/src/providers/EventManagerProvider/event-manager-hooks.js b/src/providers/EventManagerProvider/event-manager-hooks.js index 67fce439..eb46f1ef 100644 --- a/src/providers/EventManagerProvider/event-manager-hooks.js +++ b/src/providers/EventManagerProvider/event-manager-hooks.js @@ -4,20 +4,31 @@ import {EventName} from '../../enums'; import {useStarknetContract} from '../../hooks'; import {EventManagerContext} from './event-manager-context'; -export const useEventListener = () => { - return useContext(EventManagerContext); +export const useEventListener = eventName => { + const {addListener, removeListeners} = useContext(EventManagerContext); + + const _addListener = useCallback( + callback => addListener(eventName, callback), + [addListener] + ); + + const _removeListeners = useCallback( + () => removeListeners(eventName), + [removeListeners] + ); + + return { + addListener: _addListener, + removeListener: _removeListeners + }; }; export const useDepositListener = () => { - const {addListener} = useContext(EventManagerContext); - - return useCallback(callback => addListener(EventName.L1.LOG_DEPOSIT, callback), [addListener]); + return useEventListener(EventName.L1.LOG_DEPOSIT); }; export const useWithdrawalListener = () => { - const {addListener} = useContext(EventManagerContext); - - return useCallback(callback => addListener(EventName.L1.LOG_WITHDRAWAL, callback), [addListener]); + return useEventListener(EventName.L1.LOG_WITHDRAWAL); }; export const useDepositMessageToL2Event = () => {