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
- Check the pallet operating mode (query `inboundQueueV2OperatingMode` / OperatingMode storage) before submitting; wait until it is `Normal`.
- If maintenance is over, the appropriate governance/ops channel must call the extrinsic that sets OperatingMode back to Normal.
- If halting was unexpected, inspect recent runtime-upgrade or governance activity to find who/what halted the queue.
- 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
- Query OperatingMode before every submit
- Subscribe to maintenance/governance announcements
- Retry with backoff during known halt windows
- Configure test runtimes to start in Normal mode
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)