XGR Chain — Genesis & Network Configuration
Document ID: XGRCHAIN-GENESIS-CONFIG
Last updated: 2026-10-03
Audience: Node operators, protocol developers, auditors, infrastructure engineers
Release baseline: xgr-node v3.1.1
Release commit: 1a4844b311fb856cb8c2303a40fa8aa69b560544
Mainnet genesis source: xgr-network/XGR, branch main, genesis/mainnet/genesis.json
Node implementation: xgr-network/xgr-node
Scope: Genesis and network-defining XGRChain configuration
1. Purpose
This document describes the genesis and network-defining configuration of XGRChain.
The genesis configuration defines the initial chain state and the protocol parameters from which the network originates.
It covers:
- canonical genesis location,
- genesis structure,
- chain identity,
- genesis block fields,
- initial state,
- consensus configuration,
- initial validator set,
- PoA-to-PoS transition,
- PoS validator limits,
- epoch configuration,
- fork activation,
- gas and fee-related genesis fields,
- EngineRegistry configuration,
- bootnodes,
- runtime versus network-defining configuration,
- local/test-network boundaries,
- operator validation.
This document does not define:
- node service management,
- trie-pruning operations,
- validator onboarding procedures,
- XDaLa application semantics,
- XRC standards,
- interchain relayer configuration,
- Hyperlane routing or security modules,
- UI behavior.
Those topics are documented separately.
2. Canonical mainnet genesis
The canonical XGRChain mainnet genesis is maintained in:
Repository: xgr-network/XGR
Branch: main
Path: genesis/mainnet/genesis.json
Raw path:
https://raw.githubusercontent.com/xgr-network/XGR/main/genesis/mainnet/genesis.json
A node joining XGRChain mainnet must use the canonical network configuration.
The genesis file is not a local operator preference file.
It defines the network.
Changing consensus-critical genesis values creates a different chain or an incompatible node configuration.
3. Release version versus genesis version
The current public node release is:
xgr-node v3.1.1
This does not mean that XGRChain uses a new mainnet genesis.
The canonical mainnet genesis remains the published:
genesis/mainnet/genesis.json
The distinction is:
xgr-node v3.1.1
= software implementation baseline
genesis/mainnet/genesis.json
= canonical XGRChain mainnet network configuration
A software upgrade does not automatically imply:
- a new chain ID,
- a new genesis hash,
- a new initial allocation,
- a new validator genesis,
- a new PoS activation block.
4. Chain-configuration schema
The public node chain configuration uses the high-level structure:
{
"name": "xgrchain",
"genesis": {},
"params": {},
"bootnodes": []
}
Main sections:
| Section | Purpose |
|---|---|
name |
Human-readable chain name |
genesis |
Genesis block and initial state |
genesis.alloc |
Runtime genesis account allocation |
params |
Chain ID, forks, consensus and protocol parameters |
params.engine |
Consensus-engine configuration |
bootnodes |
Initial P2P discovery peers |
The published file additionally contains a top-level:
alloc
object mirroring:
genesis.alloc
For runtime genesis-state construction, genesis.alloc is the relevant allocation source.
5. Published mainnet structure
The current mainnet genesis has the following high-level form:
{
"name": "xgrchain",
"genesis": {
"nonce": "0x0000000000000000",
"timestamp": "0x0",
"extraData": "0x...",
"gasLimit": "0x3938700",
"difficulty": "0x1",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {},
"number": "0x0",
"gasUsed": "0x00000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"baseFee": "0x0",
"baseFeeEM": "0x0",
"baseFeeChangeDenom": "0x0"
},
"params": {
"forks": {},
"chainID": 1643,
"engine": {
"ibft": {}
},
"blockGasTarget": 0,
"engineRegistryAddress": "0x72cbbb5c95662510da052b98add933ff99ec820f",
"bootstrapEngineEOA": "0x0000000000000000000000000000000000000000",
"burnContract": null,
"burnContractDestinationAddress": "0x0000000000000000000000000000000000000000"
},
"bootnodes": [],
"alloc": {}
}
The concrete contents of these objects are network-defining.
6. Chain identity
Published mainnet identity:
| Field | Value |
|---|---|
| Network name | xgrchain |
| Chain ID | 1643 |
| Chain ID hex | 0x66b |
| Native asset | XGR |
| Native decimals | 18 |
| Execution environment | EVM-compatible |
| Transaction replay protection | EIP-155 |
| Consensus | IBFT |
| Current validator phase | Delegated PoS |
Transactions must use:
chainId = 1643
Changing the chain ID changes the transaction signing domain and defines an incompatible network.
7. Network-defining versus operational configuration
Not every node setting belongs in genesis.
Network-defining configuration
Examples:
- chain ID,
- genesis header,
- initial allocation,
- IBFT configuration,
- validator type schedule,
- PoS activation,
- validator limits,
- fork activation,
- EngineRegistry address.
Local operational configuration
Examples:
- data directory,
- RPC bind address,
- P2P bind address,
- log level,
- metrics endpoint,
- peer limits,
- trie sweeper,
- state-retention window,
- service management,
- reverse proxy,
- firewall.
External-service configuration
Examples:
- interchain relayer accounts,
- Hyperlane router addresses,
- Interchain Security Modules,
- relayer submission mode,
- checkpoint state,
- external chain RPC endpoints.
These layers must not be confused.
8. Genesis block header
Published mainnet genesis-header values:
| Field | Value |
|---|---|
nonce |
0x0000000000000000 |
timestamp |
0x0 |
gasLimit |
0x3938700 |
| Gas limit decimal | 60,000,000 |
difficulty |
0x1 |
mixHash |
0x0000000000000000000000000000000000000000000000000000000000000000 |
coinbase |
0x0000000000000000000000000000000000000000 |
number |
0x0 |
gasUsed |
0x00000 |
parentHash |
0x0000000000000000000000000000000000000000000000000000000000000000 |
baseFee |
0x0 |
baseFeeEM |
0x0 |
baseFeeChangeDenom |
0x0 |
The genesis block is the root of the chain.
Changing these fields changes the genesis block and therefore the resulting network.
9. Consensus engine
Consensus configuration is stored under:
params.engine.ibft
Published mainnet parameters:
| Field | Value |
|---|---|
blockTime |
2000000000 |
microEpochSize |
25 |
macroEpochMicroFactor |
40 |
microEpochInactivityDecayBps |
9000 |
microEpochNominalWeightUnits |
10000 |
blockTime is expressed in nanoseconds.
Therefore:
2000000000 ns = approximately 2 seconds
10. Consensus phase schedule
Published IBFT phase schedule:
| Phase | Type | Validator type | From | To | Deployment |
|---|---|---|---|---|---|
| Initial phase | PoA |
bls |
0 |
5446499 |
n/a |
| Delegated PoS | PoS |
bls |
5446500 |
n/a | 5446500 |
PoS activation:
5446500
PoS deployment:
5446500
IBFT remains the finality protocol.
The PoS transition changes validator participation and voting-power behavior.
11. PoS validator limits
The PoS entry specifies:
minValidatorCount = 4
maxValidatorCount = 25
These limits are part of the network's PoS configuration.
They should not be changed locally by an operator attempting to join mainnet.
12. Micro and macro epochs
Published PoS epoch parameters:
microEpochSize = 25
macroEpochMicroFactor = 40
Derived macro-epoch size:
25 × 40 = 1000 blocks
At the nominal two-second block target:
1000 blocks ≈ 2000 seconds
≈ 33 minutes 20 seconds
This is only an approximate wall-clock duration.
Consensus is based on block numbers, not elapsed wall-clock time.
13. Uptime parameters
Published parameters:
| Field | Value |
|---|---|
microEpochInactivityDecayBps |
9000 |
microEpochNominalWeightUnits |
10000 |
These parameters participate in deterministic PoS uptime and voting-power behavior.
They are therefore consensus-relevant network configuration.
14. feePoolSplit alignment
The published genesis does not explicitly contain:
feePoolSplit
inside params.forks.
However, xgr-node v3.1.1 aligns the effective FeePoolSplit fork with the first PoS fork.
For mainnet:
first PoS block = 5446500
Therefore:
effective FeePoolSplit activation = 5446500
If feePoolSplit is explicitly configured to a different height from the first PoS fork, node configuration validation fails.
This prevents PoS accounting and fee-pool activation from diverging.
15. Initial validator set
The genesis validator set is encoded in:
genesis.extraData
The IBFT genesis extra data contains:
32-byte vanity prefix
+
RLP-encoded Istanbul extra data
The published genesis contains five initial BLS validators:
| # | Validator address | BLS public key |
|---|---|---|
| 1 | 0x7913fdae82c678f42b98ca8076fe7d13b3edff15 |
0xb56b72d028aa6d063d36917f9f18a3ee4b216e22694a701814af4fd55e6cbbe99209fc1359012e4733987ebdd0123e88 |
| 2 | 0x7e8f8fd2a198f77df298041b48d79b0df4c8b1fa |
0xa32a09397128b801da5b88319bcca6cc33d4400e12ef7e1a94141b2360abd70306aaeb5599dd0d0984bb02f88fe20b71 |
| 3 | 0x82f0b6f1efbb3fc9bcde0ee5a08e01e76cc29e13 |
0x8b94120a8ae2a89a0f7deb09f266d90bf5d5152a6ee559977d7f3361a0ce1cc65b012f3a820c7f1c18a01cef9ba8ae90 |
| 4 | 0xc5cc7b4ee5b0f6524ecac177ed37b2b567180707 |
0x91bf571d3f5563976e560c5f7d9898f75a0829804ce5e212370834303c23953388f01e06d0a9da2615c5e7f1aaf10da7 |
| 5 | 0x98f8bc086454b8386788244eee9a43d5d0b4e63e |
0xa65579c3b300f0d8e94e77b3915ac09f309c0a109a3aa3bb66d8beb538d733026624bf9d096e2a3d52deff78a36513d1 |
These validators define the initial IBFT validator set.
After PoS activation, validator-set evolution follows the delegated-PoS protocol rules.
16. Genesis allocation
Initial balances are defined under:
genesis.alloc
Unit conversion:
1 XGR = 10^18 wei
Published allocations:
| Address | Balance in wei | Native XGR |
|---|---|---|
0x0000000000000000000000000000000000000000 |
0 |
0 |
0x00000000000000000000000000000000000000e1 |
1 |
0.000000000000000001 |
0x2A021a1B25DA25e14C4046e5BAc9375Ec3bebf8c |
2103833846420000000000000000 |
2,103,833,846.42 |
0x4675EdCa3c4637E68Ed1C1776a11EB5c9828F056 |
3141592653580000000000000000 |
3,141,592,653.58 |
0x7818A59b2D279Fe3444B75dcE1A443C1b124c161 |
1380649000000000000000000000 |
1,380,649,000 |
The published top-level alloc mirrors genesis.alloc.
Operators must not modify the canonical allocation when joining mainnet.
17. EVM fork schedule
Fork activation is configured under:
params.forks
A configured fork is active when:
blockNumber >= forkBlock
Active from block 0
| Fork / feature | Block |
|---|---|
homestead |
0 |
byzantium |
0 |
constantinople |
0 |
petersburg |
0 |
istanbul |
0 |
london |
0 |
londonfix |
0 |
EIP150 |
0 |
EIP155 |
0 |
EIP158 |
0 |
quorumcalcalignment |
0 |
txHashWithType |
0 |
Active from block 1208500
| Fork / EIP | Block |
|---|---|
EIP2930 |
1208500 |
EIP2929 |
1208500 |
EIP3860 |
1208500 |
EIP3651 |
1208500 |
All consensus nodes must resolve the same fork schedule.
18. Gas and fee-related genesis fields
Published values:
| Field | Value |
|---|---|
genesis.gasLimit |
0x3938700 |
| Gas limit decimal | 60,000,000 |
genesis.baseFee |
0x0 |
genesis.baseFeeEM |
0x0 |
genesis.baseFeeChangeDenom |
0x0 |
params.blockGasTarget |
0 |
params.burnContract |
null |
params.burnContractDestinationAddress |
0x0000000000000000000000000000000000000000 |
These are starting/network configuration values.
Effective runtime fee behavior also depends on:
- active fork state,
- XGR-specific base-fee logic,
- fee-pool logic,
- PoS activation,
- EngineRegistry configuration where supported.
The dedicated gas/fee documentation is authoritative for fee calculations.
19. EngineRegistry configuration
Published value:
0x72cbbb5c95662510da052b98add933ff99ec820f
Configuration field:
params.engineRegistryAddress
The public node loads a non-zero EngineRegistry address from chain configuration.
This provides deterministic network configuration for XGR-specific runtime logic that references the registry.
20. Bootstrap Engine EOA
Published configuration:
params.bootstrapEngineEOA =
0x0000000000000000000000000000000000000000
A zero address means that no non-zero bootstrap Engine EOA is configured through genesis.
The public node treats bootstrap authorization separately from normal account or consensus authority.
21. Native protocol precompiles
Some XGR protocol behavior is implemented as native node precompiles.
These are not necessarily represented as genesis accounts containing EVM bytecode.
For example, v3.1.1 registers the native interchain BLS12-381 verifier at:
0x0000000000000000000000000000000000002040
This address is an implementation-defined native precompile.
It is not configured through a normal genesis contract deployment.
Therefore:
eth_getCode(0x...2040)
does not need to return deployed contract bytecode for the precompile to exist.
22. Bootnodes
Published mainnet bootnode:
/ip4/217.154.225.157/tcp/1478/p2p/16Uiu2HAmGYfGAKCNzuzZPPauKk7FpqMk192hEmiQsqYTXvrga4Ck
Bootnodes provide initial peer discovery.
They do not:
- grant consensus authority,
- grant transaction permission,
- hold validator authority merely by being bootnodes.
A bootnode can be replaced operationally without changing transaction or execution semantics, but the published bootnode list remains part of the canonical network configuration used for initial discovery.
23. Runtime server configuration
Runtime server configuration controls the local node process.
Examples:
--chain
--data-dir
--jsonrpc
--grpc-address
--libp2p
--nat
--dns
--max-peers
--log-level
--log-to
--prometheus
--seal
These values control local operation.
They do not change the genesis chain identity unless the --chain file itself points to different network-defining configuration.
24. State Trie Sweeper is not genesis configuration
The Online State Trie Sweeper is configured at node-runtime level.
Configuration fields include:
trie_sweeper: true
trie_sweeper_retain_blocks: 10000
trie_sweeper_interval: 6h
Equivalent CLI controls are documented in the state-storage and node-operation documentation.
These settings affect:
- local historical-state retention,
- local trie database size,
- historical-state RPC availability.
They do not alter:
- genesis,
- chain ID,
- canonical state roots,
- block validity,
- consensus,
- staking,
- validator membership.
Two nodes may therefore participate in the same XGRChain while using different local trie-retention policies.
25. Interchain configuration is not mainnet genesis configuration
The XGR interchain stack uses separate deployment and runtime configuration.
Examples include:
- Hyperlane Mailboxes,
- XGR native router,
- remote-chain routers,
- Interchain Security Modules,
- validator registries,
- relayer accounts,
- relayer state and checkpoints.
These values are not part of the canonical genesis/mainnet/genesis.json described by this document.
The exception is any chain-level primitive implemented directly by the node, such as the native interchain BLS precompile.
The existence of such a primitive still does not make a particular bridge deployment part of genesis.
26. Runtime access-control schema fields
The node chain-parameter schema supports optional fields including:
contractDeployerAllowList
contractDeployerBlockList
transactionsAllowList
transactionsBlockList
bridgeAllowList
bridgeBlockList
The canonical published mainnet genesis does not configure these fields.
Therefore they must not be interpreted as active mainnet access-control policy merely because the node schema supports them.
27. Burn-contract configuration
Published values:
burnContract = null
and:
burnContractDestinationAddress =
0x0000000000000000000000000000000000000000
These values do not configure a burn-contract map through genesis.
They also do not represent the complete XGRChain fee-distribution mechanism.
28. Local and test networks
A local or test network can intentionally use different values, including:
- chain name,
- chain ID,
- initial balances,
- validator keys,
- IBFT extra data,
- bootnodes,
- block time,
- fork heights,
- PoS activation block,
- validator limits,
- epoch settings,
- EngineRegistry address,
- gas parameters.
Such a configuration defines a separate network.
Do not modify the public mainnet genesis and then expect the resulting node to participate correctly in XGRChain mainnet.
29. Mainnet node validation checklist
Before joining XGRChain mainnet, verify:
- chain file is the canonical published mainnet configuration,
name = xgrchain,chainID = 1643,- IBFT is configured,
blockTime = 2000000000,microEpochSize = 25,macroEpochMicroFactor = 40,microEpochInactivityDecayBps = 9000,microEpochNominalWeightUnits = 10000,- first consensus phase is PoA,
- PoA range ends at
5446499, - PoS begins at
5446500, - PoS deployment is
5446500, - PoS validator type is
bls, - minimum validator count is
4, - maximum validator count is
25, - genesis gas limit is
0x3938700, - initial allocations match the published file,
- fork schedule matches the published file,
- EngineRegistry address matches the published file,
- bootnode list matches the intended mainnet configuration.
30. Example node start
A minimal conceptual server command:
/opt/xgr/bin/xgrchain server \
--chain /etc/xgr/genesis.json \
--data-dir /var/lib/xgr/node
The appropriate additional flags depend on node role.
A validator and a public RPC node should not normally use identical runtime settings.
31. Configuration change classification
Changes can be classified as follows:
| Change | Network/consensus impact |
|---|---|
| Chain ID | Network-defining |
| Genesis allocation | Network-defining |
| Genesis header | Network-defining |
| IBFT type schedule | Consensus-critical |
| PoS activation | Consensus-critical |
| Validator limits | Consensus-critical |
| Epoch parameters | Consensus-critical |
| Fork activation | Consensus-critical |
| EngineRegistry address | Protocol/network configuration |
| Bootnode list | Discovery configuration |
| RPC bind address | Local only |
| Metrics | Local only |
| Log level | Local only |
| Trie sweeper | Local storage only |
| Trie retention window | Local storage only |
| Interchain relayer configuration | External service configuration |
| Public reverse proxy | Infrastructure only |
Operators must distinguish consensus changes from operational changes before deployment.
32. Current mainnet configuration summary
| Category | Current value |
|---|---|
| Node baseline | xgr-node v3.1.1 |
| Release commit | 1a4844b311fb856cb8c2303a40fa8aa69b560544 |
| Network | xgrchain |
| Chain ID | 1643 |
| Native asset | XGR |
| Decimals | 18 |
| Consensus | IBFT |
| Consensus validator type | BLS |
| PoA range | 0–5446499 |
| PoS activation | 5446500 |
| PoS deployment | 5446500 |
| PoS validator minimum | 4 |
| PoS validator maximum | 25 |
| Block time target | approximately 2 seconds |
| Micro epoch | 25 blocks |
| Macro epoch factor | 40 |
| Macro epoch | 1000 blocks |
| Inactivity decay | 9000 bps |
| Nominal uptime weight | 10000 |
| Genesis gas limit | 60,000,000 |
| EngineRegistry | 0x72cbbb5c95662510da052b98add933ff99ec820f |
| Bootstrap Engine EOA | zero address |
Effective feePoolSplit activation |
5446500 |
| Interchain BLS precompile | 0x2040 |
| Bootnodes | 1 published mainnet entry |
| Trie pruning | Runtime-only |
| Interchain relayers | External-service configuration |
33. Design principle
The XGRChain configuration model separates:
network identity
from:
local node operation
and from:
external services
Genesis determines the chain.
Consensus configuration determines how that chain reaches finality.
Runtime settings determine how one node operates.
External service configuration determines how systems such as interchain infrastructure interact with the chain.
These boundaries must remain explicit in production documentation and operations.