datahaven-xyz/datahaven · error · Error

Halted

Halted

Error message

Halted

What it means

The ethereum-client pallet is currently in a halted operating mode, so `submit` refuses all incoming finalized beacon header updates. This is a deliberate kill-switch (`operating_mode().is_halted()`) checked before any update processing, typically set by governance/root via `halt` to pause the light client during incidents or migrations. No update will be accepted until the pallet is resumed.

Solutions

  1. Check the pallet operating mode before submitting: read `OperatingMode::<T>::get()` and only submit if it is not halted.
  2. If you are root/governance, dispatch the halt/resume extrinsic (call_index 3) with `OperatingMode::Normal` to resume operations, then retry `submit`.
  3. Coordinate with the protocol team — the halt is usually intentional; do not bypass it.
  4. If the pallet started halted unexpectedly, verify the runtime/genesis configuration for the initial operating mode.

Example fix

// before
 pallet.submit(update).unwrap();
// after
 ensure!(pallet.operating_mode() != OperatingMode::Halted, "client halted; wait for resume");
 pallet.submit(update)?;
Defensive patterns

Strategy: validation

Validate before calling

let mode = api.query.ethereumClient.operatingMode();
if (mode.isHalted) throw new Error('ethereum-client halted; submission blocked');

Type guard

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

Try / catch

try { await submit(update); } catch (e) { if (e.includes('Halted')) { pauseRelayer(); } else throw e; }

Prevention

When it happens

Trigger: Calling the `submit` extrinsic (call_index for `update: Box<Update>`) while `OperatingMode` is `Halted`; this happens after root dispatched the halt extrinsic (call_index 3) or when the pallet was deployed with halted as its initial mode.

Common situations: An incident response has frozen the bridge/light client; a chain upgrade re-deployed the pallet in halted state; operators submit updates during a maintenance window without checking the pallet mode first.

Related errors


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

Appendix: source

Thrown at operator/pallets/ethereum-client/src/lib.rs:229

        ) -> DispatchResult {
            ensure_root(origin)?;
            Self::process_checkpoint_update(&update)?;
            Ok(())
        }

        #[pallet::call_index(1)]
        #[pallet::weight({
			match update.next_sync_committee_update {
				None => T::WeightInfo::submit(),
				Some(_) => T::WeightInfo::submit_with_sync_committee(),
			}
		})]
        #[transactional]
        /// Submits a new finalized beacon header update. The update may contain the next
        /// sync committee.
        pub fn submit(origin: OriginFor<T>, update: Box<Update>) -> DispatchResultWithPostInfo {
            ensure_signed(origin)?;
            ensure!(!Self::operating_mode().is_halted(), Error::<T>::Halted);
            Self::process_update(&update)
        }

        /// Halt or resume all pallet operations. May only be called by root.
        #[pallet::call_index(3)]
        #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))]
        pub fn set_operating_mode(
            origin: OriginFor<T>,
            mode: BasicOperatingMode,
        ) -> DispatchResult {
            ensure_root(origin)?;
            OperatingMode::<T>::set(mode);
            Self::deposit_event(Event::OperatingModeChanged { mode });
            Ok(())
        }
    }

    impl<T: Config> Pallet<T> {

View on GitHub (pinned to edcb13dbbc)