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
ConfTxExecutorand executed byAuthorizedMulticallOwnership 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
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, no0x).
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, no0x).
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:
Stores the history of BLOCKHASHES for recent blocks.
Refer to EIP-2935 for details.
Modified EIP-4788 Beacon Roots history contract
Address: 0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02
Bytecode:
Behavior:
It is the modified EIP-4788 Beacon Root History contract used by Igra.
Stores recent
beaconRootandprevRanDaovalues to enable cryptographic linking L2 and L1 blocks.Refer to the documentation here.
Extended EIP-4788 Reader
Address: 0xFe38D0727B928E19bE51673Ac0691Ca22C05B1B3
Bytecode:
Behavior:
Forwards calls to the Modified EIP-4788 Beacon Roots history contract.
Refer to the documentation here.
Deterministic Deployment Proxy (DDP)
Address: 0x4e59b44847b379578588920ca78fbf26c0b4956c
Bytecode:
Behavior:
When CALLed, deploys a bytecode and the "salt" provided as
calldata, using CREATE2, at an address that depends on the bytecode and the "salt" only.Used to deploy contracts to known in advance addresses.
Refer to https://github.com/Zoltu/deterministic-deployment-proxy for further details.
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 fromConfiguratorGetter, checkstx.origin, writes the ERC-1967 slot, selfdestructs)AuthorizedMulticall(deployable, checkstx.origin, executesbytes[]calls atomically, selfdestructs)Precomputed address:
0x72E934AE4917E1778043Ad28458190Ea019Df79ADeployed via DDP with salt
0x97b1(32 bytes zero-padded)This address is hardcoded in
ConfTxExecutorfor efficiency
ConfTxExecutor(init-only, deploys and drivesAuthorizedMulticall, 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
ecrecoverfrom a fixed signature (derived fromkeccak256(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.solSystem facets:
DiamondCutFacet,DiamondLoupeFacet,OwnershipFacet-src/diamond/facets/Attestations facets -
src/attestation/facets/:ConfigInitStakingAttesterChallengerConfig
L2Oracle(attestation system library; reads reference points fromTsReferenceGetter) -src/common/L2Oracle.solIGRA Token and vesting contracts:
IgraToken-src/IgraToken.solVestingPools-src/VestingPools.sol
DAO Governance contracts:
IgraVotingPower-src/IgraVotingPower.solGovernance-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.
Pre-compute addresses for:
ProxyUpgrader(CREATE2 via DDP)AuthorizedMulticall(CREATE2 via DDP, fixed salt + fixed bytecode)Configurator (one-time EOA)
ConfTxExecutor(CREATE2 via DDP)
Genesis:
Inject runtime code for
ConfiguratorGetterandTsReferenceGetterwith precomputed values.Inject minimal proxy runtime at
0x...0FEEand set its implementation slot to the precomputedProxyUpgraderaddress.
Deployer deploys core contracts via DDP:
When applicable, deploy contracts with the precomputed
AuthorizedMulticalladdress as temporary owner/guardian.
Configuration Transaction (single, atomic):
Configurator EOA sends a single transaction to DDP with
ConfTxExecutorinit code and arguments.DDP deploys
ConfTxExecutor, which executes:Deploy
AuthorizedMulticallvia DDP.Forward the
bytes[]configuration payload toAuthorizedMulticall.Call
AuthorizedMulticallwith empty calldata to selfdestruct.Return empty runtime code.
ProxyUpgraderdeployment, proxy upgrade call, andProxyUpgraderselfdestruct are encoded in the forwardedbytes[]payload and executed byAuthorizedMulticall.
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:
ConfTxExecutorreturns 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
ConfiguratorGetterandTsReferenceGetterwith precomputed valuesMinimal proxy at
0x...0FEEwith implementation slot set to the precomputedProxyUpgraderaddressDeterministic 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:
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
ConfiguratorGetterReference points for
TsReferenceGetter(l1ReferenceTimestamp,l1ReferenceDaaScore), used byL2OracleEmission rate for
StakeRewardsController(emissionNumeratorin 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:
Craft the configuration transaction with all calls defined and compute its hash
txHash.Deterministically derive the signature values
(v, r, s)from a fixed seed (e.g.,0x97b1).The sender address is derived as
ecrecover(txHash, v, r, s).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