Skip to content

Sync embedded chain genesis files from sei-protocol/chain-configs #20

@bdchatham

Description

@bdchatham

Problem

sei-config embeds per-chain genesis files for pacific-1, arctic-1, and atlantic-2 (via go:embed under chains/<id>/genesis.json), and the SND controller's seictl sidecar writes these to disk during chain bootstrap (configure-genesis task — visible in logs as msg="writing embedded genesis" logger=seictl/task/genesis chainId=<chain>). There is no formal sync mechanism between sei-config's embedded copies and the canonical chain configurations maintained in sei-protocol/chain-configs. When chain-configs is updated (e.g., a chain upgrade adds a new parameter field), sei-config's embedded copies don't follow — until someone manually updates them by hand. Drift between the two repos is silent and only surfaces when something panics in production.

Impact

Yesterday (2026-05-22) the drift caused a real production panic: bringing up fresh archive nodes for arctic-1 and atlantic-2 failed with panic: unknown field "whitelisted_codehashes_bank_send" in types.Params, because the embedded genesis the sidecar wrote contained a parameter field newer than what the deployed seid binary (v6.5.0) recognized. The embedded copy was somewhere on the drift spectrum relative to canonical — but with no diff visibility, nobody knew which side was wrong. As long as this gap stays manual, every chain upgrade is a coordination tax (someone has to remember to update sei-config), every new chain requires a manual genesis copy-paste, and divergence is invisible until it bites at bootstrap time. The cost compounds with each chain the platform supports.

Relevant experts

  • kubernetes-specialist — the SND controller's sidecar consumes sei-config; understands the bootstrap path and how embedded genesis files are surfaced to seid.
  • platform-engineer — Go module dependency management and CI mechanics for the build-time fetch or submodule pattern that would implement the sync.

Proposed approach

Two reasonable paths the picker-upper can choose between:

  1. Build-time fetch. During sei-config's build/CI, fetch canonical genesis files from sei-protocol/chain-configs (HEAD or a pinned ref) and write them into the chains/<id>/genesis.json embed path. Reproducible, no runtime dependency on a remote repo, but the staleness window equals "time since last sei-config release."
  2. Submodule or vendored copy with auto-update. Use git submodule (or a vendored copy maintained by Renovate / Dependabot PRs) to mirror chain-configs into sei-config's tree. Tighter repo coupling but eliminates the manual-update step entirely.

Both should also include a CI check that fails (or auto-opens a sync PR) when an embedded file diverges from chain-configs HEAD — catching the "someone forgot to bump" case before it ships.

Acceptance criteria

  • Genesis files for pacific-1, arctic-1, atlantic-2 (and any other chains sei-config embeds) are sourced from sei-protocol/chain-configs as canonical upstream — not hand-written or hand-updated in sei-config.
  • A CI check detects when embedded copies have drifted from chain-configs and either fails the build or auto-opens a resync PR.
  • sei-config's README documents the sync path so future engineers update genesis in chain-configs (not sei-config directly).

Out of scope

  • The whitelisted_codehashes_bank_send panic itself — that's a separate seid binary version reconciliation problem (arctic-1/atlantic-2 archives currently disabled in clusters/prod/{arctic-1,atlantic-2}/kustomization.yaml pending the chain-image fix).
  • Non-genesis embedded chain params (e.g., default validator configs, operational overlays). Keep this issue focused on genesis to avoid the scope creep that contributed to closing Embedded canonical defaults for fresh chains — strategy needed #18.
  • The strategic "what does a fresh chain inherit" question covered by Embedded canonical defaults for fresh chains — strategy needed #18 (closed stale). Adjacent but distinct — that issue was about new chains; this one is about keeping existing chains' embedded files in sync with their upstream canonical source.

References

  • Yesterday's archive-bootstrap panic: panic: unknown field "whitelisted_codehashes_bank_send" in types.Params from arctic-1 / atlantic-2 archives attempted on v6.5.0 binaries.
  • Canonical source proposed for sync: sei-protocol/chain-configs.
  • Consumer of the embedded genesis: seictl sidecar's configure-genesis task (msg="writing embedded genesis" logger=seictl/task/genesis).
  • Related closed issue: Embedded canonical defaults for fresh chains — strategy needed #18 — "Embedded canonical defaults for fresh chains — strategy needed" (closed kind/stale, distinct scope: focused on new-chain defaults, not existing-chain sync).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions