Igra Bootstrap

Last updated: 2026-02-05

Table of Contents


Overview

The ultimate purpose of the Igra L2 bootstrap process is deployment and configuration of the Core Contracts in a trustless, deterministic, and cryptographically committed way.

This document describes the complete bootstrap process, including:

  • Genesis state configuration

  • Deterministic deployment via CREATE2 (DDP)

  • One-time configuration transaction orchestrated by ConfTxExecutor and executed by AuthorizedMulticall

  • Ownership and permission setup

The approach is a single Configuration Transaction sent from a one-time Configurator EOA. The transaction deploys ConfTxExecutor (init-only) via DDP. ConfTxExecutor deploys AuthorizedMulticall, forwards configuration calls to it, triggers its self-destruct, and returns empty runtime code.


Genesis State

Bytecode note: bytecode snippets below are duplicated for convenience. The authoritative sources are the files in src/bootstrap/ (*.hex or *.hex.template). If any mismatch occurs, the src/bootstrap files are correct.

Accounts pre-configured via the Genesis

Address
Contract / Data
Notes

0x000000000000000097b100000000000000000000

Non-executable text message

"Igra" message

0x0000F90827F1C53a10cb7A02335B175320002935

EIP-2935 BLOCKHASH history

Stores historical block hashes

0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02

Modified EIP-4788 Beacon Roots

Stores historical L1 chain data

0xFe38D0727B928E19bE51673Ac0691Ca22C05B1B3

Extended EIP-4788 Reader

Getter for historical L1 chain data

0x4e59b44847b379578588920ca78fbf26c0b4956c

Deterministic Deployment Proxy

CREATE2 deployer for all contracts

0x0000000000000000000000000000000000000FEE

Minimal ERC-1967 proxy

Upgradable proxy for Fee contract

0x9063d52b68d8883c882a5d4c34b0e4d58ba4b356

ConfiguratorGetter

Runtime-only getter for the Configurator address

0x9a232acf6dd107483d3466494b8e0cd39da1828d

TsReferenceGetter

Runtime-only getter for REF_DAA_SCORE and REF_TIMESTAMP

Igra message

Address: 0x000000000000000097b100000000000000000000

Bytecode:

Behavior:

  • The "bytecode" is the UTF8-encoded text of the verse Deuteronomy 22:8 (Aramaic translation), prepended with 0x00 byte (EVM's "halt execution" opcode) to prevent accidental call execution.

ConfiguratorGetter

Address: 0x9063d52b68d8883c882a5d4c34b0e4d58ba4b356

Bytecode template (runtime only, placeholder must be replaced):

Behavior:

  • Returns the Configurator address as a 32-byte ABI word.

  • {configurator_address} is the precomputed one-time Configurator Account address (40 hex chars, no 0x).

TsReferenceGetter

Address: 0x9a232acf6dd107483d3466494b8e0cd39da1828d

Bytecode template (runtime only, placeholders must be replaced):

Behavior:

  • Returns (REF_DAA_SCORE, REF_TIMESTAMP) as (uint64,uint64) ABI-encoded values.

  • {ref_daa_score} and {ref_timestamp} are precomputed values (16 hex chars each, no 0x).

Fee Proxy

Address: 0x0000000000000000000000000000000000000FEE

Bytecode (runtime only):

Storage:

Behavior:

  • Minimal ERC-1967 compatible proxy (EIP-1167 style).

  • Reads implementation address from the ERC-1967 slot and DELEGATECALLs with identical calldata.

  • Bubbles return or revert data as-is.

EIP-2935 BLOCKHASH history contract

Address: 0x0000F90827F1C53a10cb7A02335B175320002935

Bytecode:

Behaviour:

Modified EIP-4788 Beacon Roots history contract

Address: 0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02

Bytecode:

Behavior:

Extended EIP-4788 Reader

Address: 0xFe38D0727B928E19bE51673Ac0691Ca22C05B1B3

Bytecode:

Behavior:

Deterministic Deployment Proxy (DDP)

Address: 0x4e59b44847b379578588920ca78fbf26c0b4956c

Bytecode:

Behavior:


Other Bootstrap Helper Contracts

In addition to contracts injected directly into the genesis (see "Genesis State"), the following contracts are deployed during the bootstrap process and serve as helper contracts:

  • ProxyUpgrader (deployable, reads configurator from ConfiguratorGetter, checks tx.origin, writes the ERC-1967 slot, selfdestructs)

  • AuthorizedMulticall (deployable, checks tx.origin, executes bytes[] calls atomically, selfdestructs)

    • Precomputed address: 0x72E934AE4917E1778043Ad28458190Ea019Df79A

    • Deployed via DDP with salt 0x97b1 (32 bytes zero-padded)

    • This address is hardcoded in ConfTxExecutor for efficiency

  • ConfTxExecutor (init-only, deploys and drives AuthorizedMulticall, returns empty runtime)

Sources and bytecode: src/bootstrap/proxyUpgrader/, src/bootstrap/authorizedMulticall/, src/bootstrap/confTxExecutor/.


Configurator (and its address)

This is a one-time-use EOA whose address is a cryptographic commitment to the exact Configuration Transaction. If any single byte in the Configuration Transaction changes (including any change to core-contract bytecode or parameters), the derived Configurator address changes as well.

Key points:

  • The Configurator address is computed after all configuration parameters are finalized.

  • It is embedded in genesis via the runtime bytecode of ConfiguratorGetter.

  • The Configuration Transaction is sent from this address.

  • Before sending the Configuration Transaction the address shall be funded to pay gas for that transaction.

Private key properties:

  • The private key is provably unknown. The public key (and address) is derived by ecrecover from a fixed signature (derived from keccak256(0x97b1)) over the precomputed Configuration Transaction.

  • Because no private key is known, only this single pre-computed transaction can be sent from this address.


Igra Core Contracts

These contracts are the core protocol components. Their deployment and configuration is the ultimate purpose of the bootstrap process.

  • Diamond (the diamond proxy) - src/diamond/Diamond.sol

  • System facets: DiamondCutFacet, DiamondLoupeFacet, OwnershipFacet - src/diamond/facets/

  • Attestations facets - src/attestation/facets/:

    • ConfigInit

    • Staking

    • Attester

    • Challenger

    • Config

  • L2Oracle (attestation system library; reads reference points from TsReferenceGetter) - src/common/L2Oracle.sol

  • IGRA Token and vesting contracts:

    • IgraToken - src/IgraToken.sol

    • VestingPools - src/VestingPools.sol

  • DAO Governance contracts:

    • IgraVotingPower - src/IgraVotingPower.sol

    • Governance - src/Governance.sol

These contracts are deployed via the DDP (CREATE2). Because CREATE2 binds address to bytecode, their addresses are a cryptographic commitment to their bytecode.


Deployment Order

This flow is aligned with docs/configurationTransaction.md and src/bootstrap contracts.

  1. Pre-compute addresses for:

    • ProxyUpgrader (CREATE2 via DDP)

    • AuthorizedMulticall (CREATE2 via DDP, fixed salt + fixed bytecode)

    • Configurator (one-time EOA)

    • ConfTxExecutor (CREATE2 via DDP)

  2. Genesis:

    • Inject runtime code for ConfiguratorGetter and TsReferenceGetter with precomputed values.

    • Inject minimal proxy runtime at 0x...0FEE and set its implementation slot to the precomputed ProxyUpgrader address.

  3. Deployer deploys core contracts via DDP:

    • When applicable, deploy contracts with the precomputed AuthorizedMulticall address as temporary owner/guardian.

  4. Configuration Transaction (single, atomic):

    • Configurator EOA sends a single transaction to DDP with ConfTxExecutor init code and arguments.

    • DDP deploys ConfTxExecutor, which executes:

      1. Deploy AuthorizedMulticall via DDP.

      2. Forward the bytes[] configuration payload to AuthorizedMulticall.

      3. Call AuthorizedMulticall with empty calldata to selfdestruct.

      4. Return empty runtime code.

    • ProxyUpgrader deployment, proxy upgrade call, and ProxyUpgrader selfdestruct are encoded in the forwarded bytes[] payload and executed by AuthorizedMulticall.


The Configuration Transaction

The Configuration Transaction is a single, atomic transaction sent by the Configurator EOA. It uses the DDP to deploy ConfTxExecutor whose constructor executes a scripted list of calls.

Key properties:

  • Init-only execution: ConfTxExecutor returns zero-length runtime code.

  • Contextful calls: all protocol configuration calls are executed with msg.sender == AuthorizedMulticall.

  • Deterministic addresses: Configurator, ConfTxExecutor and AuthorizedMulticall addresses are known before execution.

  • Atomicity: any failure reverts the entire transaction.

Constructor input is bytes[] data (no selector). Each entry is:

Because init code has no calldata, the args are appended to the init code and suffixed with a 2-byte big-endian length:

Any revert bubbles revert data and fails the entire transaction.


Complete Bootstrap Flow

Step 1: Genesis Block Creation

Genesis includes:

  • Runtime code for ConfiguratorGetter and TsReferenceGetter with precomputed values

  • Minimal proxy at 0x...0FEE with implementation slot set to the precomputed ProxyUpgrader address

  • Deterministic Deployment Proxy (DDP)

Step 2: Core Contract Deployments

Deployer deploys core contracts via DDP (CREATE2). When applicable, contracts are deployed with the precomputed AuthorizedMulticall address as temporary owner.

Step 3: Top Up Configurator address

The Configurator address is topped up with iKAS to pay gas for the Configuration Transaction.

Step 4: Configuration Transaction

Configurator EOA sends the configuration transaction to DDP. ConfTxExecutor runs, deploys helper contracts, forwards the configuration payload to AuthorizedMulticall, destroys helpers, and returns empty runtime code.

Step 5: Post-Bootstrap State

After successful configuration:

Contract
Owner
Notes

Fee (0xFee)

Governance

Releaser not set yet

Attestation (Diamond)

Governance

Fully configured diamond

StakeRewardsController

Governance

Emission rate not set yet

VestingPools

Governance

All pools added

IgraToken

-

MINTER = VestingPools

Governance

-

Autonomous (no voting power yet)


Pre-Governance Deployer Actions

After bootstrap, the deployer EOA must perform these actions before any governance proposals:

After these actions, attesters have voting power via IgraVotingPower (from staked IGRA token), and the Igra Association multisig can gain voting power by releasing IGRA token from their pool, enabling governance proposals.


Post-Bootstrap Governance Proposals

After deployer actions complete, the following configurations are assumed to be done via governance proposals:

1. Enable Fee Releases

Sets the Diamond (Attestation) as the authorized releaser for iKAS rewards and gas refunds.

2. Enable IGRA emission

Starts topping-up the reward pool for attesters with IGRA tokens. Value is in pips (1 pip = 0.01% APY).


Bootstrap Configuration File

All configurable parameters are defined in a bootstrap config file:

  • Configurator Address for ConfiguratorGetter

  • Reference points for TsReferenceGetter (l1ReferenceTimestamp, l1ReferenceDaaScore), used by L2Oracle

  • Emission rate for StakeRewardsController (emissionNumerator in pips)

  • Initial config params for ConfigInit (minStakeAmount, activationDelayBlocks, exitCooldownBlocks, etc.)

  • Initial attesters (addresses, stake amounts, vesting schedules)

  • Vesting pool definitions


Appendix: CREATE2 Address Calculation

For each contract, the address is calculated as:

The deployment transaction is sent to the Deterministic Deployment Proxy with:

  • data = salt + bytecode + constructorArgs


Appendix: Configurator Account Address Computation

The Configurator account address is computed as follows:

  1. Craft the configuration transaction with all calls defined and compute its hash txHash.

  2. Deterministically derive the signature values (v, r, s) from a fixed seed (e.g., 0x97b1).

  3. The sender address is derived as ecrecover(txHash, v, r, s).

  4. Include this address in the bytecode of ConfiguratorGetter (in genesis).

Before broadcasting the Configuration Transaction the computed address must be topped up with enough iKAS to pay for Configuration Transaction gas.

The Configuration Transaction succeeds because:

  • The signature is mathematically valid.

  • The derived address has balance for gas.

As no one knows the private key (only this specific transaction can ever be sent from this address), this creates a trustless, deterministic, and cryptographically committed Configuration Transaction.

Last updated