You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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:
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."
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).
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.
Problem
sei-configembeds per-chain genesis files forpacific-1,arctic-1, andatlantic-2(viago:embedunderchains/<id>/genesis.json), and the SND controller's seictl sidecar writes these to disk during chain bootstrap (configure-genesistask — visible in logs asmsg="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-1andatlantic-2failed withpanic: 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:
sei-config's build/CI, fetch canonical genesis files fromsei-protocol/chain-configs(HEAD or a pinned ref) and write them into thechains/<id>/genesis.jsonembed path. Reproducible, no runtime dependency on a remote repo, but the staleness window equals "time since last sei-config release."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
pacific-1,arctic-1,atlantic-2(and any other chains sei-config embeds) are sourced fromsei-protocol/chain-configsas canonical upstream — not hand-written or hand-updated in sei-config.Out of scope
whitelisted_codehashes_bank_sendpanic itself — that's a separate seid binary version reconciliation problem (arctic-1/atlantic-2 archives currently disabled inclusters/prod/{arctic-1,atlantic-2}/kustomization.yamlpending the chain-image fix).References
panic: unknown field "whitelisted_codehashes_bank_send" in types.Paramsfrom arctic-1 / atlantic-2 archives attempted on v6.5.0 binaries.configure-genesistask (msg="writing embedded genesis" logger=seictl/task/genesis).kind/stale, distinct scope: focused on new-chain defaults, not existing-chain sync).