Skip to content

Configuration

The persistent reference profile splits immutable images, public deployment identity, runtime settings, and secrets. Do not collapse them into one checked-in environment file.

Gateway runtime

VariablePurpose
DATABASE_URLGateway PostgreSQL connection.
ARCHIVE_DATABASE_URLOptional read-only Zeko archive PostgreSQL connection used only by public explorer reads.
SEQUENCER_GRAPHQL_URLOptional internal sequencer GraphQL endpoint. When set, /v1/explorer/summary includes the exact commit-loop phase and schedule.
PROOF_API_KEYGraphQL mutation token and operator REST API key.
API_BINDListen address; use loopback/private networking.
API_EXECUTE_ONLYExecute SP1 and stop without proving or submission.
API_LOCAL_MOCK_SUBMITChain-31337-only empty-proof submission mode.
API_REQUIRE_PROOF_APPROVALPause every paid job after preflight. Must be true on testnet.
RPC_URLSepolia JSON-RPC endpoint.
SETTLEMENT_CONTRACT_ADDRESSSettlement proxy address.
BRIDGE_CONTRACT_ADDRESSBridge proxy address.
SETTLEMENT_PRIVATE_KEYSettlement submitter key.
BRIDGE_PRIVATE_KEYBridge submitter key.
WITHDRAW_PRIVATE_KEYLegacy withdraw submitter key; current preflight expects the same EOA as the other two.
NETWORK_PRIVATE_KEYSuccinct requester key.
PROOF_SYSTEMgroth16 for EVM testnet submission.
PROVER_TIMEOUT_SECSMaximum network proof wait; reference value 21600.
PROVER_MIN_AUCTION_PERIOD_SECSMinimum auction period requested from the network.
PROVER_MIN_REMAINING_SLOTSMinimum settlement lifetime required at approval.
PROVER_GAS_LIMITDeployment-wide maximum PGU. Required in approval mode.
PROVER_MAX_PRICE_PER_PGUDeployment-wide maximum price. Required in approval mode.
ETHEREUM_FINALITY_MODEfinalized reads Ethereum's consensus-finalized JSON-RPC tag and is required on testnet. confirmations is restricted to chain ID 31337.
ETHEREUM_CONFIRMATIONSDepth used only when ETHEREUM_FINALITY_MODE=confirmations; local E2E uses 1.
ETHEREUM_POLL_INTERVAL_SECSReceipt/indexer poll interval.
ETHEREUM_INDEXER_START_BLOCKContract deployment block.
BRIDGE_AUTO_PROVE_DEPOSITSQueue each complete finalized deposit batch automatically. Enable for the browser PoC.
BRIDGE_AUTO_PROVE_POLL_SECSAutomatic batch scan interval; reference value 5.
API_CORS_ALLOWED_ORIGINSComma-separated browser origins, or * for isolated local development.

ETHEREUM_PRIVATE_KEY is a development fallback for the three per-kind keys. Use credential files and the explicit variables in a persistent deployment.

Virtual Mina view

VariablePurpose
VIRTUAL_MINA_GENESIS_TIMESTAMPMust match settlement's virtual-slot genesis.
VIRTUAL_MINA_FORK_SLOTMust match settlement forkSlot.
VIRTUAL_MINA_ACCOUNT_CREATION_FEEMina-shaped response value.
VIRTUAL_MINA_INITIAL_STATE_HASHInitial best-chain fallback before indexing.
VIRTUAL_MINA_ACCOUNTS_PATHRead-only complete account array.
VIRTUAL_MINA_OUTER_PUBLIC_KEYOuter account that receives indexed proof-emitted actions.
VIRTUAL_MINA_INNER_PUBLIC_KEYInner account whose canonical archive actions supply pending withdrawals and recoverable leaf preimages.
VIRTUAL_MINA_FEE_PAYER_PUBLIC_KEYSettlement fee payer used when rebuilding the virtual Mina view from accepted Ethereum calldata.
WITHDRAWAL_RECOVERY_POLL_SECSArchive/root reconstruction interval; reference value 5.

The accounts file must contain the outer account and settlement fee payer with state and nonce matching the deployed genesis. Existing database rows are not overwritten at startup.

Sequencer

The Ethereum-enabled sequencer needs:

text
ZEKO_ETHEREUM_GATEWAY_TOKEN=<same logical secret as PROOF_API_KEY>
ZEKO_CIRCUITS_CONFIG=/config/circuits.json
ZEKO_SIGNATURE_KIND=testnet

and command-line values for gateway L1/archive URIs, three DA nodes/keys, quorum two, --inner-sync-period 30, and the proof-bound commit validity period. Set --slot-duration to the settlement contract's virtual slot duration; the Sepolia reference profile reads ZEKO_SLOT_DURATION_SECONDS and uses 12 seconds. Mina deployments retain the 180-second CLI default.

The Ethereum reference profile sets --commitment-period from ZEKO_COMMITMENT_PERIOD_SECONDS, defaulting to 900 seconds. This changes only the Ethereum Compose profile; the OCaml CLI and Mina deployment defaults stay unchanged. The sequencer exposes this live schedule through commitSchedule.

The Ethereum profile runs the sequencer with --deposit-delay-blocks 0 because the gateway only exposes consensus-finalized outer actions. Mina deployments keep the sequencer's existing block-delay behavior; no OCaml finality logic is changed by the Ethereum adapter.

An ERC-20-enabled sequencer supplies one universal registry configuration:

text
--ethereum-bridge-address 0x...
--ethereum-asset-registry-l2 B62...
--ethereum-shared-vault-l2 B62...
--ethereum-mft-standard-vk-id 9001
--ethereum-universal-bridge-vk-id 9002

The registry schema and depth are circuit constants. Schema V1 uses a depth-8 tree with a 256-record capacity. Individual asset records supply the Ethereum token, asset ID, dynamic MFT owner, circuit-derived token ID, at most nine decimals, and inventory cap through authenticated registry membership. Startup rejects a partial universal configuration. Registration rejects an owner equal to the shared vault and any record whose MFT or universal VK identifier differs from this configuration.

For this PoC, MINA_SIGNING_NETWORK_ID=testnet is the source value used to materialize ZEKO_SIGNATURE_KIND. Auro currently assigns that built-in signing domain to custom endpoints. Do not substitute the display name or zeko-testnet; signatures and circuit commitments must use the same salt.

Browser application

The standalone bridge-ui/ build reads public configuration from /runtime-config.json. It contains the gateway, sequencer/archive, and Actions URLs, Ethereum chain ID, display names, fee, and polling interval. It must contain minaSigningNetworkId: "testnet" and must never contain the gateway proof API key, Ethereum submitter key, or Succinct requester key. See bridge web application for the schema and deployment boundary.

The standalone explorer-ui/ build also reads /runtime-config.json. It contains only the public gateway base, bridge UI link, Sepolia explorer base, network display name, and polling interval. See the L2 and settlement explorer. The gateway's archive credentials stay server-side and must belong to a transaction-read-only role.

Immutable public files

The runtime config directory is mounted read-only:

FileSource
circuits.jsonExact OCaml circuit config built with the final bridge proxy.
bridge-genesis-ledger.jsonGenuine OCaml bridge export.
bridge-scenario.jsonPublic DA/sequencer/recipient identity and bridge checkpoint manifest.
virtual-mina-accounts.jsonOuter and fee-payer GraphQL account objects.
artifacts/manifest.jsonChain, proxy/implementation/registry-module addresses, registry identity, vkeys, VK identifier, DA mode, and holder address.

Changing any of the first three after building the Zeko/gateway images creates a different proof identity.

Secret files

The Compose profile expects separate files for:

  • proof API key and Succinct requester key
  • Ethereum submission key files
  • gateway/sequencer PostgreSQL passwords and RabbitMQ password
  • sequencer private key and signer token
  • three DA private keys and three signer tokens
  • bridge-recipient private key
  • signer TLS certificate and private key

Private files must be mode 0600 or 0400; the public TLS certificate may be 0644. Prefer NixOS/systemd credentials or an external secret manager over putting values in the Nix store or image layers.

Experimental Zeko settlement and native bridge glue for Ethereum.