datahaven-xyz/datahaven · warning · Error

Halted

Halted

Error message

Halted

What it means

The inbound-queue-v2 pallet's `submit` extrinsic throws `Error::Halted` when the pallet's `OperatingMode` storage value reports `is_halted()`. The pallet is placed in halted mode (normally via governance/maintenance) to stop accepting new inbound Ethereum messages, e.g. during upgrades or incident response. Any submission attempt is rejected before verification even runs.

Solutions

  1. Check the pallet operating mode (query `inboundQueueV2OperatingMode` / OperatingMode storage) before submitting; wait until it is `Normal`.
  2. If maintenance is over, the appropriate governance/ops channel must call the extrinsic that sets OperatingMode back to Normal.
  3. If halting was unexpected, inspect recent runtime-upgrade or governance activity to find who/what halted the queue.
  4. In tests, configure the mock/runtime genesis so OperatingMode starts as Normal.

Example fix

// before: submit fails with Halted
let _ = InboundQueueV2::submit(RuntimeOrigin::signed(relayer), Box::new(event_proof));

// after: ensure the pallet is not halted first
assert!(!OperatingMode::<Runtime>::get().is_halted(), "bridge halted; retry later");
InboundQueueV2::submit(RuntimeOrigin::signed(relayer), Box::new(event_proof))?;
Defensive patterns

Strategy: validation

Validate before calling

let mode = api.query.inboundQueueV2.operatingMode();
if (mode.isHalted) throw new Error('Bridge halted; hold submissions');

Type guard

function isOperational(mode) { return mode != null && mode.type === 'Normal'; }

Try / catch

try { await api.tx.inboundQueueV2.submit(eventProof).signAndSend(account); } catch (e) { if (String(e).includes('Halted')) scheduleRetryAfterMaintenance(); else throw e; }

Prevention

When it happens

Trigger: Calling the `submit` extrinsic (call_index 0) with a signed origin while `OperatingMode::<T>::get().is_halted()` is true — i.e. the bridge pallet is in Normal→Halted state set by an operational/governance call.

Common situations: Bridging during scheduled maintenance windows or after an incident when operators halt the inbound queue; running E2E tests against a runtime configured to start halted; relayers retrying message submission while the pallet remains halted after a runtime upgrade.

Related errors


AI-assisted analysis of datahaven-xyz/datahaven@edcb13dbbc (2026-09-13). Data as JSON: /api/errors/52af1c73f723405c. Report an issue: GitHub.

Appendix: source

Thrown at operator/pallets/inbound-queue-v2/src/lib.rs:192

    }

    /// StorageMap used for encoding a SparseBitmapImpl that tracks whether a specific nonce has
    /// been processed or not. Message nonces are unique and never repeated.
    #[pallet::storage]
    pub type NonceBitmap<T: Config> = StorageMap<_, Twox64Concat, u128, u128, ValueQuery>;

    /// The current operating mode of the pallet.
    #[pallet::storage]
    pub type OperatingMode<T: Config> = StorageValue<_, BasicOperatingMode, ValueQuery>;

    #[pallet::call]
    impl<T: Config> Pallet<T> {
        /// Submit an inbound message originating from the Gateway contract on Ethereum
        #[pallet::call_index(0)]
        #[pallet::weight(T::WeightInfo::submit())]
        pub fn submit(origin: OriginFor<T>, event: Box<EventProof>) -> DispatchResult {
            let who = ensure_signed(origin)?;
            ensure!(!OperatingMode::<T>::get().is_halted(), Error::<T>::Halted);

            // submit message for verification
            T::Verifier::verify(&event.event_log, &event.proof)
                .map_err(|e| Error::<T>::Verification(e))?;

            // Decode event log into a bridge message
            let message =
                Message::try_from(&event.event_log).map_err(|_| Error::<T>::InvalidMessage)?;

            Self::process_message(who, message)
        }

        /// Halt or resume all pallet operations. May only be called by root.
        #[pallet::call_index(1)]
        #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))]
        pub fn set_operating_mode(
            origin: OriginFor<T>,
            mode: BasicOperatingMode,

View on GitHub (pinned to edcb13dbbc)