Documentation Index
Fetch the complete documentation index at: https://docs.novacula.io/llms.txt
Use this file to discover all available pages before exploring further.
Igra is an EVM-compatible L2 anchored on the Kaspa DAG. Every Igra node is two processes: a kaspad sidecar that follows the underlying Kaspa network and an igra-reth execution layer (a Reth fork tailored to the Igra L2). They share a JWT secret over the Engine API the same way an Ethereum EL ↔ CL pair does; the Engine API is pod-internal and not user-overridable.
Igra is unusual: the L2 itself has no native peer-to-peer fan-out for chain-tip discovery, so the executor learns the tip from a kaspad sidecar plus a cross-reference against the public Igra explorer (postScrape).
Networks and resources
| Network | Upstream Kaspa | Notes |
|---|
mainnet | kaspad mainnet | Production. kaspad ports 16110 / 16111 / 17110 / 18110. |
galleon-testnet | kaspad testnet-10 | kaspad ports shifted by +100 (16210 / 16211 / 17210 / 18210) to match upstream peer-discovery defaults. |
Per-network resource defaults are pre-filled by the deploy wizard.
Clients
| Role | Client | Versions |
|---|
kaspad | kaspad (DAG node) | 2.3 |
el | igra-reth (Reth fork) | 2.3 |
Versions move in lock-step between the two roles.
Ports
| Name | Port | Owner | Notes |
|---|
| EL RPC (HTTP) | 8545 | igra-reth | Constant across networks |
| EL RPC (WebSocket) | 8546 | igra-reth | |
| EL metrics | 9001 | igra-reth | |
| Engine API | internal | igra-reth ↔ kaspad | JWT-secured, pod-internal |
| kaspad gRPC | 16110 (mainnet) / 16210 (galleon) | kaspad | |
| kaspad P2P | 16111 / 16211 | kaspad | |
| kaspad Borsh wRPC | 17110 / 17210 | kaspad | |
| kaspad JSON wRPC | 18110 / 18210 | kaspad | |
| kaspa-rest-proxy | 15110 | sidecar | REST proxy over kaspad’s wRPC; scraped by the executor for sync state |
The kaspa-rest-proxy sidecar is what feeds the per-node kaspad_* extras into telemetry.
Init steps
- JWT secret — shared between igra-reth and kaspad over the Engine API. The adapter uses a fixed pod-internal value (same pattern as Ethereum / Ink — pod-internal trust, not externally rotated).
Config overrides
Igra uses CLI argument overrides per role; there are no config-file overrides.
igra-reth — managed-flag allow-list for the EL role; user args validated per-flag.
kaspad — managed-flag allow-list for the kaspad sidecar; user args validated per-flag.
For the full managed + known flag lists, see packages/adapter/src/igra/index.ts configOverrideSchema() in the codebase. Anything off the managed list and off the known list is passed through verbatim.
Sync
- EL — syncs via the Engine API from the kaspad sidecar’s view of the L2 tip.
- Sync progress — derived against the public Igra explorer’s
eth_blockNumber via a per-cycle postScrape rather than from kaspad alone. This means syncProgress requires outbound HTTPS to the public explorer; if your executor’s network blocks that, the field will report stale.
Metrics
Both processes are scraped on each reporter tick. Common per-node fields (status, height, peers, syncProgress, disk) come from igra-reth. Chain-specific extras include:
kaspad_is_synced (boolean)
kaspad_server_version
kaspad_virtual_daa_score
kaspad_block_count
kaspad_header_count
Plus the EL-side extras from the igra-reth Prometheus exporter. See Node monitoring for how extras flow.
Common patterns
- RPC provider — accept defaults; expose
:8545 (HTTP) and :8546 (WS) through your own reverse proxy.
- Galleon testnet sandbox — useful for dApp integration testing; remember the +100 port shift if you’re networking specific kaspad ports out.