---
title: "Changelog"
description: "v0.6 is a breaking release. It runs only against the v0.6 consensus contracts (release tag v0.6-rc-1), and all validators upgrade together: receipt hashes,…"
source: https://docs.genlayer.com/validators/changelog
last_updated: 2026-10-20
---

# Changelog

## v0.6.0-rc.1

v0.6 is a breaking release. It runs only against the v0.6 consensus contracts (release tag `v0.6-rc-1`), and all validators upgrade together: receipt hashes, storage-fee votes, spendable contract balance and child budgets change.

### New features

- Check at start-up and in `doctor` that the consensus deployment matches the trusted protocol manifest of the network, and refuse a mismatch; new required `consensus.manifestpath` and `consensus.chainid`, optional `consensus.admissiontimeout` (default 15s)
- Serve as a tribunal juror: re-run the accused execution, commit and reveal the tribunal vote, and after a restart reveal a committed vote and vote in tribunals that opened while the node was down; log an error when this validator is the accused leader
- After a tribunal verdict, settle its penalty pages and its quarantine cause
- As leader, propose receipts that emit messages through the v0.6 message envelope
- Deliver the messages that accepted and finalized transactions still owe, in turns with the other validators that voted
- Retry an external message that the chain paused, with a backoff from 30 s up to 10 min
- Execute transactions under the v0.6 fee model: fee values pinned at activation, storage and receipt budgets, message fee limits and fee allocations; the leader proposes the storage fee the execution used
- When the chain rejects a leader receipt as over a fee or size limit, propose a leader timeout instead, so the leader gets no idleness strike
- Vote `DeterministicViolation`, instead of not voting, when the leader receipt is missing data or cannot be used, or reports a storage fee the execution did not use
- Prove activations and leader proposals with an ECVRF proof made with the operator key; a validator whose signer cannot make ECVRF proofs does not start
- After a restart, resume the duties this node accepted but did not finish: activate, propose, commit, reveal, appeal vote, message delivery and tribunal vote
- Deliver consensus events to the duty handlers at least once; new `node.streamer` settings `ack_wait_seconds` (30), `max_ack_pending` (256) and `buffer_size` (2048)
- Refuse to start when the transaction layout of the consensus contracts differs from the node
- Bind `ops.db` to `node.operatorAddress` on the first start, and refuse to start when it belongs to another operator (for example a copied data directory)
- Add opt-in operational keys for the duties that do not need the operator key (`consensus.operational_keys`: `enabled`, `pool_size` 1, `low_watermark` 0.05, `target_balance` 0.25, `interval` 5m); the node derives them from the operator key and tops them up from the operator account
- Add opt-in parallel replay of independent transactions (`genvm.replay.parallel_enabled`, default off; `workers` 4, `consensus_reserve_permits` 2, `replay_floor_permits` 1, `max_journal_bytes` 256 MiB)
- Roll back replayed state exactly on chain reorgs (`genvm.replay.reorg_history_blocks`, default 4096; `genvm.replay.max_reorg_journal_bytes`, default 256 MiB)
- Add the `gen_getLogs` event query endpoint, with a `status` filter (logs of appeal-cancelled rounds need `status: ["cancelled"]`) and the limits `node.rpc.getlogs_max_block_range` and `node.rpc.getlogs_max_results` (10,000 each)
- Add `gen_subscribe` and `gen_unsubscribe` on the RPC WebSocket, with the streams `transactions`, `leadership`, `epochs` and `newHeads`
- Add the `gen_getTransactionLifecycle` endpoint: projected status, resolution action, decision id and `executionGeneration`
- Add the `gen_getTransactionData` endpoint: the on-chain data of a transaction round, plus its `returnData` and `leaderPublicData` from the local trace store (`null` once pruned)
- Add a `fees` object to `gen_getTransactionReceipt`: deposit, distribution, locked prices, consumed counters (including `storageFeeUsed`), `allocations` and `allocationPolicy`
- Add events store retention (`node.events.retention_blocks`, default 1,000,000)
- Add trace store limits: `node.trace.retention_blocks` (1,000,000), `max_trace_bytes` (32 MB) and `max_debug_field_bytes` (256 KB per `gen_dbg_traceTransaction` field)
- Add the `node.rpc.contract_read_max_bytes` limit (16 MB) for `gen_getContractCode` and `gen_getContractState`
- Add `genvm.sync_permits_lag_threshold` (default 1000) to choose between the replay and live GenVM permits
- Add `rollup.rpc_response_header_timeout` (default 30s), `node.rpc.request_timeout` (default 180s) and `consensus.head_pin_freshness` (default 30s)
- Add `node.rpc.gen_call_max_debug_bytes` (default 1 MB) and `node.rpc.gen_call_max_debug_elements` (default 10,000) to limit `gen_call` debug output
- Add an opt-in allowlist for proxied `eth_*` and `zks_*` methods: disable the group and enable only the methods listed under it
- Add a `scope` (`all` default, `genvm`, `ops`) and a `snapshot.json` manifest to `POST /snapshot`
- Report the operator balance in `/health` and `doctor`: warn below `node.operatorBalanceWarnWei` (default 0.1 GEN), fail below `node.operatorBalanceCriticalWei` (default 0.01 GEN)
- Add a Validator Participation section to `doctor`: ban, self-stake, operator balance, sync and primed state
- Show `validator_address` and `validator_moniker` in `/health`, and report the health conditions in `doctor` and the logs
- Read the chain RPC API key from `GENLAYERNODE_ROLLUP_GENLAYERCHAINRPCKEY` and send it in the `rollup.genlayerchainrpckeyheader` header (default `X-AccessKey`)
- Publish signed checksums (`genlayer-node_<version>_SHA256SUMS` with a Sigstore bundle) and an `install.sh` script with each release
- Add gas, duty and fee metrics: `genlayer_node_gas_*`, `genlayer_node_consensus_submit_total`, `genlayer_node_consensus_revert_total`, `genlayer_node_operator_misconfigured_total`, `genlayer_node_fees_operator_insufficient_funds_total`, `genlayer_node_fees_settlement_events_total`, `genlayer_node_fees_distributed_wei_total`, `genlayer_node_fees_earned_wei_total` and `genlayer_node_fees_penalties_wei_total`
- Add metrics `genlayer_node_operator_condition_*`, `genlayer_node_external_message_delivery_total`, `genlayer_node_external_message_reimbursed_wei_total`, `genlayer_node_sync_consecutive_failures`, `genlayer_node_sync_stuck_block`, `genlayer_node_prime_blocked_insufficient_funds`, `genlayer_node_transact_keyed_replacements_total`, `genlayer_node_event_dispatch_*_total`, `genlayer_node_replay_*`, `genlayer_node_head_partition_*_total` and `genlayer_node_pubsub_messages_dropped_total`

### Misc

- Ship GenVM v0.6.0-rc10; the node uses the new GenVM manager protocol, so an older GenVM manager does not work (this matters only with `genvm.start_manager: false`)
- The GenVM runtime moves from `third_party/genvm` to `opt/genvm/<version>`: set `genvm.root_dir: ./opt/genvm/v0.6.0-rc10` (`install.sh` sets it for you)
- Refuse to start when the config file is missing, is not a regular file, or has an empty required field: `datadir`, both rollup URLs, `consensus.consensusaddress`, `consensus.manifestpath`, `consensus.chainid`, and `genvm.root_dir` (or `genvm.manager_url` when `start_manager: false`)
- Warn about unknown config keys (`Ignoring unknown config keys`)
- RPC groups move from `node.rpc.endpoints.groups.<group>` to `node.rpc.endpoints.<group>`, and method overrides to `node.rpc.endpoints.<group>.methods.<method>`; the node ignores the old form without an error and uses the defaults, so move your settings
- The `gen_dbg_*` methods are off unless `node.rpc.endpoints.genlayer_debug.enabled: true`; the example config also turns off the `zks_*` proxy
- Return `-32601` instead of `-32004` for a denied `eth_*` or `zks_*` method; a disabled `gen_*` method still returns `-32004`
- Replace the `/health` body: `status` is one of `unknown`, `healthy`, `suspect`, `warning`, `degraded` and `unavailable`, explained by a `conditions` catalog; `checks` and `genvm_modules` are removed
- `/health` returns HTTP 503 only for `unavailable`, so a node that catches up or is not primed yet now returns 200; a self-stake below the minimum or a critical operator balance sets `consensus.stake` or `consensus.operator_funds` to `unavailable`
- `gen_getTransactionStatus` returns the stored status only and ignores `timestamp` (use `gen_getTransactionLifecycle` for the projected status); `ReadyToFinalize` (11) is removed, so `ValidatorsTimeout`, `LeaderTimeout` and `LeaderRevealing` are now 11, 12 and 13
- `previousStatus` in `gen_getTransactionReceipt` is always `null`
- The `status` parameter of `gen_call`, `gen_getContractState` and `gen_getContractCode` takes `decided` instead of `accepted` (default `decided`); `accepted` returns `-32602`
- `genvm.permits` and `genvm.sync_permits` are now permit budgets (a nondeterministic run costs 8, a sync run 4): leave them empty or multiply your old values by 4 (8 → 32, 64 → 256)
- Split the database into `genvm.db` (chain data) and `ops.db` (this node's own records); `<datadir>/genlayer.db` is renamed to `genvm.db` at start-up, and start-up is refused when both exist
- `node.genlayerdb` is replaced by `node.genvmdb` and `node.opsdb`; move a custom database path by hand
- Prove VRF duties with the operator key registered before the transaction was created; after an operator key rotation, keep the old operator account in the keystore, with the same password, until its transactions are done
- Run the Docker image as the non-root user uid 10001; run `sudo chown -R 10001:10001 ./data` once before the first start
- Read WebDriver container stats only through `DOCKER_HOST`: the release compose adds a read-only Docker socket proxy and no longer mounts `docker.sock` into the node; a binary install sets `DOCKER_HOST`, else the collector is skipped
- The release compose file requires `NODE_PASSWORD` (the default `12345678` is removed) and gives it to the node as `GENLAYERNODE_PASSWORD`, not on the command line
- The release monitoring profile has no default `CENTRAL_*` endpoints or credentials: set all six in `.env`
- Clamp `consensus.chain_submit_buffer` at start-up so at least 5 s of the shortest on-chain phase window stays for execution, and log a warning when it does
- The `genlayer_node_disk_*` metrics report `directory="genvm.db"` and `directory="ops.db"` in place of `directory="genlayer.db"`; update dashboards and alerts
- Add a `reason` label (`http_unavailable`, `block_lag`, `rate_limited`) to `genlayer_rollup_rpc_ws_fallback_total`
- Signed GenVM web requests send the validator wallet address in the `genlayer-node-address` header, instead of the operator address
- Show contract revert errors with their argument names in logs
- Show module paths, not build-machine paths, in log `caller` fields and stack traces
- Update the release image base to Alpine 3.24.2, Grafana Alloy to v1.20.1 and the WebDriver image to 0.0.12, and add `tecnativa/docker-socket-proxy:0.3.0`

### Bug fixes

- Retry a chain HTTP request once after a dropped connection, a 502/503/504 or a rate limit; the transport does not retry timeouts and transaction sends
- Fall back to the WebSocket RPC when the HTTP RPC is down or does not answer in time, also for transaction submission and at start-up
- Report the RPC error, not a connection-closed error, when the WebSocket server closes right after it replies
- Keep syncing when the HTTP RPC lags the WebSocket head, instead of exiting after repeated `block not found`
- Keep every nonce owned until the chain settles it: a stuck nonce no longer blocks all later transactions until a restart, recorded transactions are sent again after a restart, and a nonce is freed or reused only on chain evidence
- Make the self-cancellation of a stuck nonce affordable on a small wallet, and outbid the previous cancellation when it is retried
- Finalize, idleness, epoch-advance and message-delivery transactions no longer cancel pending commit and reveal transactions
- Keep commit and reveal transactions on time when older pending transactions block them, and cancel transactions whose deadline passed or whose fee bumps are used up
- No longer mark a transaction rejected, and reuse its nonce, when the RPC does not show it as pending within 10 s
- Read the receipt before treating a timed-out transaction as failed, so a mined transaction is not sent again
- Fix a node crash (`concurrent map writes`) when several transactions fail at the same time, for example during parallel finalizations
- Keep committed votes and their salts across restarts and replayed events, so the reveal is not missed
- Retries no longer regenerate a commit vote or a proposed receipt, so a validator or leader whose first transaction already mined can still reveal
- A leader rotation delivered twice (for example at restart) no longer sends a second, reverting propose transaction
- A GenVM manager outage or restart during a duty no longer turns the transaction into a leader timeout; the duty waits for the manager within its phase
- Stop retrying a transaction that the operator wallet cannot pay for; when priming is blocked, log one error that names the operator wallet, and resume once it is funded
- Duty watchers no longer sleep through their turn when the chain clock runs ahead of the node clock
- Fail a transaction whose calldata cannot be decoded with an error receipt, instead of voting Timeout
- Stop a transient database read error or a missed sync event from making a synced node vote Timeout
- Vote Timeout instead of crashing when a node behind sync is missing transaction data
- Give intelligent contracts the real chain ID instead of `1`
- Set the contract `origin_address` to the transaction submitter instead of the activating validator
- Read EVM contract views for intelligent contracts at the activation block, so all validators see the same value
- Stop sending an extra transaction before each duty; read time-sensitive contract views at the pending block instead
- Drive pending tribunals to their end during epoch finalization, so an epoch no longer stays unfinalized behind them
- Re-run transactions that an appeal sends back for recomputation, from a clean round
- Stagger finalization: one validator at a time polls and submits, also for the predecessor drain and the epoch sweep, so validators stop reverting with `already finalized`
- Stop sending a duplicate finalize when the last reveal and the decision event arrive together
- Stop resubmitting a finalize that reverts permanently
- Epoch recovery sweep: force-process only stuck transactions, and bound each attempt, so a transaction that cannot finalize no longer stops epoch finalization
- Retry the epoch advance during each validator's turn, so epochs advance at their normal pace again
- Stop a validator from skipping an epoch's prime after a stale epoch read or a failed retry loop
- Stop paying for prime transactions that the contract ignores: after 5 in a row with no effect, only re-check until the next epoch
- Re-fetch blocks that a chain reorg replaced, so their consensus events are no longer lost
- Stop dropping consensus events that the log bloom check wrongly treated as false positives, and never move the sync cursor backwards (a synced node looked behind and lost its duties)
- Stop sync with an error that names the transaction, instead of silently skipping an accepted transaction that cannot be decoded
- Sync contract state for transactions accepted without a `TransactionAccepted` event, so contract reads stop failing with `pebble: not found`
- Do not restore contract state from an execution that an appeal replaced in the same block
- Fetch at most 16 transactions at a time during sync, so a node that catches up no longer floods its RPC provider
- Retry instead of rescanning from block 0 when the first-sync genesis lookup fails
- Wait for indexed data in `gen_call`, `gen_getContractState`, `gen_getContractCode` and `gen_dbg_traceTransaction` instead of failing while the node catches up (new `genvm.sync_wait_poll_interval`, default `100ms`)
- Stop crashes on empty or out-of-range data from the chain, and on malformed revert data
- Reject malformed GenVM storage changes instead of crashing the node
- Stop a crash from an oversized map-key length in contract calldata, and reject calldata with non-canonical length headers
- Fail the transaction instead of crashing on missing or malformed numbers in GenVM output and emitted messages
- Fix a GenVM cache race that could crash the node during sync, and data races on per-transaction and epoch state
- Fix a slow memory leak of finalized and canceled transactions
- Exit with a non-zero status after a panic, so Docker or systemd restarts the node
- Report the real error, not `context canceled`, when parallel work fails
- Stop logging `Can not process rotate leader` errors when the proposal of the replacement leader carries the rotation
- Allow full-mode nodes to start without a password
- Honor `node.rpc.host`; the RPC listener bound to all interfaces
- Raise the open-file limit to 65536 (or to the hard limit) at start-up, so GenVM stops failing with `Too many open files`
- Make `doctor` report a GenVM install that was moved after `setup.py` ran
- Omit `result` from JSON-RPC error responses
- Accept `gen_dbg_trie` transaction IDs with or without `0x`, and stop `gen_syncing` from reporting a huge `blocksBehind` when the synced block is ahead of the latest one

### Removed

- Remove the `node.environment` field and the development-only `node.dev.disableSubscription` switch; old configs still load, and the node logs the ignored keys
- Remove the `doctor --network` flag; `doctor` checks the deployment against the protocol manifest instead

### Security

- Keep the chain RPC API key out of logs, error responses, `doctor` output and the config dump; RPC URLs show only scheme and host
- Stop passing the `GENLAYERNODE_ROLLUP_*` variables (chain URLs and RPC key) and the operator token to GenVM processes
- Mask the operator token, the GenVM token and the chain RPC key in the config dump, and log RPC request params and results only at DEBUG
- Stop logging the node admin token in the GenVM manager request logs of the node
- Warn at start-up when `genvm.manager_url` is not a loopback address, because the requests carry the admin token
- Write `account new --export` and `account export` files straight to the target with owner-only permissions; the command fails if the file exists
- A validator refuses to start when its operator account cannot be resolved, instead of signing with a throwaway key
- Bound memory use: cap GenVM host-call frames at 64 MiB and the size of GenVM manager responses, and limit the concurrent GenVM runs that public RPC (`gen_call`, `gen_dbg_traceTransaction`) starts
- Stop a malformed leader payload from crashing validators
- Return generic messages for internal errors from the admin, ops and RPC APIs, and log the detail; a failed chain read in `gen_call` names only the read that failed
- Restrict the `destDir` of `POST /snapshot` to `node.admin.snapshot_dir` (default `<datadir>/snapshots`); other paths return `400`
- Reduce the `rpc_url` label of `genlayer_node_info` to scheme and host
- Limit the `namespace` label of `genlayer_node_ws_inbound_subscriptions_active` to known namespaces, so clients cannot create unbounded metric series
- Cache `/balance` for 5 s, so public requests cannot multiply chain RPC calls
- Stop failures of proxied public `eth_*` and `zks_*` requests from opening the chain RPC circuit breaker that guards validator duties
- Drop all Linux capabilities from the node container in the release compose file
- Build with a newer Go release that includes the standard-library security fixes
- Update `golang.org/x/net` to v0.60.0 and `golang.org/x/crypto` to v0.57.0

## v0.5.14

### Bug fixes

- Skip replay check when chain records no result

## v0.5.13

### Bug fixes

- Self-recover stalled sync gate
- Boot degraded when a module fails
- Stop dealing turns to non-actors

## v0.5.12

### Misc

- Update dependency ethers to ~5.8.0
- Update all non-major dependencies

### Bug fixes

- Self-recover from sync stall wedge
- Reclassify zkSync not-found errors

### Security

- Update module golang.org/x/net to v0.55.0
- Update module golang.org/x/crypto to v0.52.0

## v0.5.11

### New features

- Add node health state machine
- Scope admin tokens per role
- Add circuit breaker for RPC outages
- Add bearer auth for admin endpoints
- Unify CORS and WS origins allowlist
- Inbound WebSocket JSON-RPC endpoint

### Misc

- Tag runtime metrics by network
- Cap PreloadAccepted concurrency
- Improve historical sync by sync-mode cleanup
- Reframe /snapshot examples for SSH access; drop cloud refs
- Default inbound WS path to /ws
- Default WS example to single-listener
- Multiplex WS subscriptions
- Trace context cancellations on all watchers
- Remove unused WaitMined method

### Bug fixes

- Guard nil GasFeeCap on bump retry
- Ensure GenVM precompile cache before manager start
- Keep sync ticker running while Synced
- Create export file when --path is missing
- Autodetect GenVM permit capacity
- RPC debug error codes and id default
- Trust XFF + cap WS frame size
- Never halt sync on bloom mismatch
- Refresh version on skip-sync
- Route receipt polls to poll probes
- Handle -32602 decode-rejection and cap GasFeeCap
- Cap RPC body/batch and admin loopback bind

### Security

- Update module go.opentelemetry.io/otel to v1.41.0

## v0.5.10

### New features

- Resilient WS RPC for fallback path

### Bug fixes

- Close activator-binding race
- Exit finalize loop on post-Submit race
- Persist gas high-water across cycles
- Lift gas ceiling on retry-count
- Bound cancel gasFeeCap and lift bump ceiling on blocker lookup
- Fall back to WS on block-not-found
- Repair self-cancellation recovery
- Make chain-submit buffer configurable and stop collapsing on short step_timeout
- Add fault label to RPC error metric
- Unwedge replay and filter sync

### Misc

- Label RPC metrics with provider
- Add chain nonce and desync gauges metrics
- Log timestamps after acquireTransaction

## v0.5.9

### Bug fixes

- Count real provider failures on SLA
- Harden nonce management
- Check per-block bloom filters for multi-block ranges
- Pool HTTP transport for chain RPC
- Self-cancel stuck nonce on mempool replacement exhaustion
- Prevent sync panic and self-dependency cycle during tx replay
- Resume sync after WS reconnect

### Misc

- Use RFC3339Nano for zerolog timestamps
- Extract encoding functions into dedicated encoding package
- Move consensus entity types to entities package
- Add gen_dbg_traceTransaction API doc

## v0.5.8

### New features

- Add `gen_syncing` endpoint for sync status visibility
- Add bounded sync wait for RPC readiness
- Add per-IP per-method RPC rate limiting

### Bug fixes

- Defer GenVM precompile to container startup to avoid AVX-512 incompatibility
- Replace stuck transactions with gas bump
- Skip duty recovery when behind and handle chained missing tx data dependencies
- Add hiccup retry to sync pipeline
- Recover prime after reorg
- Fix RPC max block range exceeded in event router
- Return -32001 for missing contract errors
- Pass transaction value to GenVM
- Standardize RPC error codes per EIP-1474
- Retry tx lookup for RPC indexing lag

### Misc

- Consolidate genvm configs
- Add `gen_getTransactionStatus` docs
- Add `gen_syncing` API docs and clarify RPC config group vs method precedence

## v0.5.7

### New features

- Add LLM greyboxing with configurable chain order via YAML meta

### Bug fixes

- Use PendingAt for idle activator rotation
- Remove unnecessary workaround from view calls
- Restart sync pipeline after RPC failures
- Suppress shutdown errors in watchers
- Reduce FindAcceptanceBlock range to fit RPC limit

### Misc

- Include Alloy healthcheck script in release tarball
- Increase Alloy push intervals to 60s

## v0.5.6

### Bug fixes

- Add priority admission control

## v0.5.5

### New features

- Add network name to health endpoint
- Add network label to logger and all metrics
- Add metrics to rollup RPC transport and WebSocket

### Bug fixes

- Recover from cache miss on late lifecycle events
- Wait for queue head before finalize with recipient-aware queue management
- Suppress context canceled errors on shutdown
- Raise gas bump ceiling and retries
- Stuck nonce and finalize resilience
- Patch GenVM dylib references on macOS during download

### Misc

- Downgrade finalized-not-in-cache log to Debug

## v0.5.4

### New features

- Add `--network` flag to doctor command for multi-network validation

## v0.5.3

### New features

- Add network label to telemetry metrics and logs

## v0.5.2

### New features

- Add recovery for missing TxData

### Bug fixes

- Invalidate timeout cache on SetTimeouts
- Dedup propose on duplicate events
- Stop retrying on ValidatorSelectionFailed
- Prevent sync error race on ctx cancel
- Recover sync on missing TxData
- Reject stale block in idle check
- Increment leader revealed metric counter
- Sync commit idle timeout with contract timestamps

### Misc

- Use CtxLogger in HTTP handler constructors

## v0.5.1

### New features

- Add transaction manager for nonce resilience
- Add leader_results input and nondetDisagreementCallNo to gen_call
- Handle hanging transactions via processIdleness
- Add Morpheus as OpenAI-compatible LLM provider

### Misc

- Dedup duplicate NewTransaction events per block
- Add CanFinalize pre-check before finalization
- Make sync idempotent
- Per-recipient head-by-head idleness finalization

### Bug fixes

- Detect ZkSync nonce inconsistency error
- Capture RPC error message when data is not decodable
- Correct consensus address and genesis block
- Enrich context errors with last failure
- Fetch on-chain data in Accepted/Undetermined handlers

## v0.5.0

### New features

- Upgrade consensus contracts from v0.4 to v0.5
- Add gen_getContractCode endpoint
- Return full VMResult data from gen_call

### Bug fixes

- Check pending queue head before activation
- Enable and fix gen_call write simulation
- Exclude stack field from console output
- Move GenVM execution outside retry loop to avoid double GenVM execution on submitting failure
- Use ConsoleWriter for caller field filtering
- Remove nested retry from epoch finalization
- Add logging for silent tx submission failures
- Retry ProcessIdleness on failure in lastVoteWatcher
- Handle shutdown errors gracefully
- Remove --create-venv=false flag from post-install scripts
- Install Python dependencies globally to avoid venv build issues
- Update validator priming logic to use current epoch
- Epoch advance scheduler not running for epoch 0
- Prevent panic on closing done channel during event processing
- Handle new consensus ResultType
- New behavior for finalizing epochs

### Misc

- Inject txID into context for automatic log propagation
- Enable validator idle reveal idleness
- Add profiling with pyroscope
- Fix to handle zksync local-node compatibility

## v0.4.5

### New features

- Decouple epoch advance from finalization, allowing them to run as independent processes with separate retry mechanisms
- Implement sync waiting mechanism to ensure GenVM has latest state before contract execution
- Add `genlayer_node_info` Prometheus metric exposing node and protocol version

### Bug fixes

- Add canPrime check to verify epoch state before validator priming, preventing priming when epochs are out of sync
- Return user-friendly error instead of system error when sync times out
- Fix genvm executor process handling

### Misc

- Improve GenVM logging with context-aware logger
- Update health checker to use ZkSync connectivity checks
- Increase default genvm permits to 8 in config.yaml.example

## v0.4.4

### New features

- Improve logging with context-aware tracing and cleaner console output
- Refactor ZkSync client to split RPC and WSS connections for better reliability
- Move storage writing to genvm for improved performance

### Bug fixes

- Skip priming check for full nodes
- Add Docker socket mount for webdriver metrics collection in docker-compose configurations
- Prevent incorrect sync state by updating blocksBehind calculation
- Fix memory leak from threads package
- Fix memory leak in consensus processing
- Fix bug in latest transaction with effect calculation
- Fix wallet mutex using read lock instead of write lock when unlocking accounts

### Misc

- Fix signer for full nodes
- Improve logs for http servers
- Improve signer initialization for faster and more reliable transaction signing
- Add logs for previous activator on idleness checks
- Migrate zksync-go to go-ethereum

## v0.4.3

### Bug fixes

- Fix node storage handling for non-accepted transactions like LeaderTimeout
- Fix validator priming logic
- Fix default in release/.env.example

## v0.4.2

### Bug fixes

- Telemetry config and scraping
- Fix genvm readiness attempts

## v0.4.1

### New features

- Add show and list subcommands for account management
- Split authentication credentials for Prometheus and Loki
- Add IsPrimed health check for unprimed validators
- Add primed state and warning for unprimed validators

### Misc

- Refactor txcalldata decoding to a new encoding package
- Remove unused `pkg/cryptoutils/address.go`
- Update deployment configuration options for network and cleanup
- Refactor gas estimator

### Bug fixes

- Implement indefinite retry for validator priming until primed
- Implement health check and timeout handling for GenVM manager
- Fix undetermined transaction rotations when ProcessIdleness
- Improve message handling to prevent dropped events
- Add GenVM contracts cache and enhance sync progress logging
- Fix sync filtering process
- Improve messages around genlayerRPC chain connectivity
- Stop retrying activation after transaction is activated

## v0.4.0

### New features

- Integrate the latest GenLayer Consensus version v0.4 with Staking
    - Introduce validator wallet
    - Handle validator priming
    - Finalize epochs
    - Advance epochs when epochs finalize
- Handle automatic gas increase
- Implement ProcessIdleness and enhance event subscription
- Handle validator commit idleness for leader
- Implement leader idleness detection and rotation
- Add detailed ban information with epoch and permanent flag
- Handle unfinished transactions with batch finalization
- Add nonceSafe for granular transaction locking
- Add sanity check for operator address in validator wallet configuration
- Add missing fields from consensus transaction data to API response
- Add validator telemetry push monitoring
- Add actionable fix suggestions to WebDriver error messages in doctor command
- Add zkSync connectivity checks
- Add Staking Contract address comparison to doctor checks
- Add libertai as a new LLM provider
- Add transaction count metrics for consensus roles
- Implement consensus sync status metrics
- Add TimeoutsSet event router for dynamic timeout configuration
- Add enhanced transaction failure debugging with trace support
- Sync data with finalized and appeal started events
- Add timeout delay mechanism for RPC resilience
- Add status and blockNumber parameters to gen_call
- Enhance health endpoint with version info and validator with ban and permanent ban detection
- Update genvm version to v0.2.7
- Store and expose genvm execution information
- Add sign admin endpoint for genvm

### Bug fixes

- GenVM architecture on arm64
- Fix sync issue when there are no consensus events
- Use latest block instead of timestamp for transaction queries
- Update WebDriver check for Puppeteer implementation
- Resolve multi-transaction nonce issue
- Remove duplicated check logic and fix status check on specific block
- Leader rotation timeout and receipt cleanup
- Change transaction finalization to allow all nodes to finalize
- GenVM non determinism
- Add retry logic to prevent validator banning on transient errors
- GenVM sanity checks
- Cancel context and wait for group when genvm tester fails
- Decoding calldata into complex types
- Don't try activating already activated transactions
- Still process sync failed TX for DB consistency
- Add correct encoding for getState
- Only sync transactions with ResultCodeReturn and add sanity check
- Use block number for transaction data retrieval
- Validator votes idleness
- Leader idleness
- Accidental deadlock in genvm
- Lazy validators commit order

### Misc

- Simplify environment variable configuration using .env file
- Add environment variable override support for config values
- Update webdriver image to v0.0.9
- Update RPC and WebSocket endpoints in config.yaml.example
- Correct status for validatorTimeout after appeal time window
- Validate presence of abigen in dependency check
- Rename environment validation functions for clarity
- Use cockroachdb errors package for error handling
- Remove wallet.yaml file handling
- Rename archive to full

## v0.3.11

### New features

- Add validator telemetry push monitoring

### Bug fixes

- Validator banning on parallel transactions executions

### Misc

- Document health RPC endpoint

## v0.3.10

### New features

- Add actionable fix suggestions to WebDriver error messages in doctor command

### Bug fixes

- Add retry logic to prevent validator banning on transient errors

## v0.3.9

### New features

- Add doctor command zkSync connectivity checks

### Misc

- Simplify contract initialization with auto-discovery

### Bug fixes

- Remove response body size limit for WebDriver

## v0.3.8

### New features

- Add Staking Contract address comparison to doctor checks
- Add libertai as a new LLM provider

### Misc

- Enhance metrics logging by adding blocks behind calculation
- Print address for account not found
- Fix typo in telemetry configuration comment

### Bug fixes

- Enable CORS support for HTTP methods in the API
- Move sync success log after state update
- Don't panic with metrics + print panics

## v0.3.7

### New features

- Add transaction count metrics for consensus roles
- Implement consensus sync status metrics
- Add node uptime collector
- Add disk storage usage metrics for monitoring
- Add comprehensive metrics collection for ops visibility

## v0.3.6

### Misc

- Add enhanced transaction failure debugging with trace support

## v0.3.5

### New features

- Add Transport with exponential backoff retry logic
- Add timeout delay mechanism for RPC resilience
- Add status and blockNumber parameters to gen_call
- Enhance health endpoint with version info and validator ban detection
- Add balance endpoint for validator nodes
- Add gas estimation failover to all consensus transaction functions
- Implement gen_getContractState endpoint
- Add ionet as inference provider
- Add gen_getTransactionStatus endpoint
- Implement gen_getTransactionReceipt
- Add log upload system for validator diagnostics

### Misc

- Add comprehensive API documentation system and operations endpoints
- Move retry logic to infrastructure and update DI
- Improve timeout detection with type-based checking
- Enhance WebDriver health check validation

### Bug fixes

- Fix validator idleness commit flow
- Handle methods and groups configuration for RPC methods

## v0.3.4

### New features

- Added genesis block configuration support for faster node startup
- Enhanced `doctor` command with GenVM diagnostics integration
- Updated consensus contract addresses for network upgrade

### Misc

- Improved node synchronization performance with genesis block hints
- Enhanced validator configuration validation and error reporting

## v0.3.3

### New features

- Added [Comput3](https://docs.genlayer.com/validators/setup-guide#genvm-configuration) as a supported LLM provider for validators

## v0.3.2

### New features

- Add command `doctor` to check Consensus Contract configuration

### Misc

- Implement retry logic with double-checked locking for `GetTimeouts`
- Update ABI for consensus contracts.
- Decode error returns from the network to improve error handling.

## v0.3.1

### Misc

- Add logs details

## v0.3.0

### New features

- Added appeals functionality
- Added gen_getContractSchema
- Added admin checkpoint endpoint
- Added admin "stop at block" endpoint
- Handle leader timeout
- Handle validator timeout
- Added `version` command

### Bug fixes

- Mitigate TxAccepted events being dropped
- Waiting on event timeouts is now absolute
- Patch up genvm timeouts
- Add retry mechanism for genvm contracts interaction
- Listen to leader timeout event to finalize transaction

## v0.2.0-testnet007

### New features

- Activator idle replacement
- Leader idle replacement
- Validator idle replacement
- Check for genvm on startup
- Log file support for node
- Ability to export private key in account command

### Bug fixes

- Build info logs now display correctly
- Fixed config relative path
- Node now fails fast when accepted transaction processing fails

### Misc

- Updated module github.com/btcsuite/btcd to v0.24.2 (security)
- Improved sync speed on node startup

## v0.2.0-testnet005

### New features

- Discover Consensus main genesis from deployment (contracts)

### Bug fixes

- All accepted sync transactions are now processed atomically per block
- Fixed deadlock on cancelled context

## v0.2.0-testnet004

### Bug fixes

- Updated genvm to v0.0.18

## v0.2.0-testnet003

### New features

- Updated genvm to v0.0.17

## v0.2.0-testnet002

### New features

- Use different address to run e2e tests
- Updated consensus contract addresses in config

## v0.2.0-testnet001

### New features

- Updated genvm to v0.0.16

### Bug fixes

- Log level is no longer ignored
- Revived trie dumping and enhanced logging
- Always kill genvm modules

### Misc

- Updated module golang.org/x/net to v0.38.0 (security)
