Skip to main content

Forks — activation heights

Each fork introduces new tx types and consensus rules. Activation is by block height, configurable per environment via env vars:

ForkDefault mainnet heightEnv overrideTx types activatedSection
V27500 (active)OMBRA_FORK_HEIGHTFee split 70/25/5, PoTU burn, attestationsTokenomics
V318554 (active)OMBRA_FORK_HEIGHT_V3ART_MINT, ART_TRANSFER, ART_BURNNFT Mint
V4999_999_999 (inactive)OMBRA_FORK_HEIGHT_V4IMAGE_MINT, IMAGE_TRANSFER, IMAGE_BURNNFT Mint
V5999_999_999 (inactive)OMBRA_FORK_HEIGHT_V5AUDIO_MINT, AUDIO_TRANSFER, AUDIO_BURNNFT Mint
V6999_999_999 (inactive)OMBRA_FORK_HEIGHT_V6CHAT_TURN, AGENT_REQUEST/CLAIM/STEP/FINISHChat + Agent

Inactive forks have height 999_999_999 so the chain rejects post-fork tx types on mainnet. Operators activate by setting an env override.

Check current activation

curl https://api.ombra-net.com/api/chain/stats

Response includes height. Compare against the table above.

Behavior at activation

When block height crosses a fork threshold:

  1. New tx types become valid in mempool
  2. Older nodes (unaware of the fork) reject these txs → they get partitioned off
  3. State storage adds new record types for the fork
  4. SDK clients should refuse to construct fork tx if chainHeight < forkHeight (defensive)

Example check in TS:

const { height } = await client.chain.getStats();
const FORK_V6 = 65500; // current mainnet activation
if (height < FORK_V6) throw new Error("Fork V6 not yet active");

Why env overrides

Local testnet and CI deployments need to enable forks instantly. The OMBRA_FORK_HEIGHT_* env vars let operators set =1 for immediate activation at genesis. Mainnet operators coordinate a real height via social consensus, then publish the env value to all node runners.

Coordination

Activating a fork on mainnet requires:

  1. Software supports the fork (deployed node version)
  2. A majority of validators run that version
  3. All validators set the same OMBRA_FORK_HEIGHT_X=N value
  4. Once block N is produced, fork is locked in

Operators that miss the coordination get partitioned and stop validating.