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
- Check the pallet operating mode before submitting: read `OperatingMode::<T>::get()` and only submit if it is not halted.
- If you are root/governance, dispatch the halt/resume extrinsic (call_index 3) with `OperatingMode::Normal` to resume operations, then retry `submit`.
- Coordinate with the protocol team — the halt is usually intentional; do not bypass it.
- 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
- Read OperatingMode before every submit
- Subscribe to operating-mode change events
- Pause relayers during known maintenance/halt windows
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
- TransfersDisabled
- InvalidAmount
- InsufficientSovereignBalance
- InvalidSyncCommitteeMerkleProof
- InvalidBlockRootsRootMerkleProof
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)