diff --git a/apps/api/src/api/services/phases/handlers/moonbeam-to-pendulum-handler.ts b/apps/api/src/api/services/phases/handlers/moonbeam-to-pendulum-handler.ts index 95cc09c78..5da5755f5 100644 --- a/apps/api/src/api/services/phases/handlers/moonbeam-to-pendulum-handler.ts +++ b/apps/api/src/api/services/phases/handlers/moonbeam-to-pendulum-handler.ts @@ -16,6 +16,7 @@ import logger from "../../../../config/logger"; import { MOONBEAM_EXECUTOR_PRIVATE_KEY, MOONBEAM_RECEIVER_CONTRACT_ADDRESS } from "../../../../constants/constants"; import QuoteTicket from "../../../../models/quoteTicket.model"; import RampState from "../../../../models/rampState.model"; +import { RecoverablePhaseError } from "../../../errors/phase-error"; import { BasePhaseHandler } from "../base-phase-handler"; import { StateMetadata } from "../meta-state-types"; @@ -80,7 +81,10 @@ export class MoonbeamToPendulumPhaseHandler extends BasePhaseHandler { } } catch (e) { logger.error(e); - throw new Error("MoonbeamToPendulumPhaseHandler: Failed to wait for hash registration in split receiver."); + throw new RecoverablePhaseError( + "MoonbeamToPendulumPhaseHandler: Failed to wait for hash registration in split receiver.", + 30 + ); } let obtainedHash: `0x${string}` | undefined = moonbeamXcmTransactionHash; @@ -129,14 +133,14 @@ export class MoonbeamToPendulumPhaseHandler extends BasePhaseHandler { } } catch (e) { console.error("Error while executing moonbeam split contract transaction:", e); - throw new Error("MoonbeamToPendulumPhaseHandler: Failed to send XCM transaction"); + throw new RecoverablePhaseError("MoonbeamToPendulumPhaseHandler: Failed to send XCM transaction", 30); } try { await waitUntilTrue(didInputTokenArriveOnPendulum, 5000); } catch (e) { console.error("Error while waiting for transaction receipt:", e); - throw new Error("MoonbeamToPendulumPhaseHandler: Failed to wait for tokens to arrive on Pendulum."); + throw new RecoverablePhaseError("MoonbeamToPendulumPhaseHandler: Failed to wait for tokens to arrive on Pendulum.", 30); } return this.transitionToNextPhase(state, this.nextPhaseSelector(state)); diff --git a/apps/api/src/api/services/phases/handlers/squid-router-phase-handler.ts b/apps/api/src/api/services/phases/handlers/squid-router-phase-handler.ts index d3ae8b916..4e7d79cdf 100644 --- a/apps/api/src/api/services/phases/handlers/squid-router-phase-handler.ts +++ b/apps/api/src/api/services/phases/handlers/squid-router-phase-handler.ts @@ -207,7 +207,7 @@ export class SquidRouterPhaseHandler extends BasePhaseHandler { await new Promise(resolve => setTimeout(resolve, delay)); } else { - throw new Error(`SquidRouterPhaseHandler: Error waiting for transaction confirmation: ${error}`); + throw this.createRecoverableError(`SquidRouterPhaseHandler: Error waiting for transaction confirmation: ${error}`); } } } @@ -220,7 +220,7 @@ export class SquidRouterPhaseHandler extends BasePhaseHandler { return await publicClient.getTransactionCount({ address }); } catch (error) { logger.error("Error getting nonce", error); - throw new Error("Failed to get transaction nonce"); + throw this.createRecoverableError("Failed to get transaction nonce"); } } } diff --git a/apps/api/src/api/services/phases/phase-processor.ts b/apps/api/src/api/services/phases/phase-processor.ts index 82e6cb266..43f6b4169 100644 --- a/apps/api/src/api/services/phases/phase-processor.ts +++ b/apps/api/src/api/services/phases/phase-processor.ts @@ -13,7 +13,7 @@ export class PhaseProcessor { private static instance: PhaseProcessor; private retriesMap = new Map(); private readonly MAX_RETRIES = 8; - private readonly MAX_EXECUTION_TIME_MS = 20 * 60 * 1000; // 20 minutes + private readonly MAX_EXECUTION_TIME_MS = 10 * 60 * 1000; // 10 minutes private lockedRamps = new Set(); /**