Skip to main content
Version: dev

v4.0.0 (from v3.0.0)

Overview

Migration difficulty: TODO

Breaking changes

Node.js upgraded to v24

Node.js minimum version changed from v22 to v24.12.0.

Bot fee padding configuration renamed

The bot configuration for fee padding has been renamed from "base fee" to "min fee".

v3.x:

--bot.baseFeePadding <value>          ($BOT_BASE_FEE_PADDING)

v4.0.0:

--bot.minFeePadding <value>           ($BOT_MIN_FEE_PADDING)

Migration: Update your configuration to use the new flag name and environment variable.

L2Tips API restructured with checkpoint information

The getL2Tips() RPC endpoint now returns a restructured response with additional checkpoint tracking.

v3.x response:

{
"latest": { "number": 100, "hash": "0x..." },
"proven": { "number": 98, "hash": "0x..." },
"finalized": { "number": 95, "hash": "0x..." }
}

v4.0.0 response:

{
"proposed": { "number": 100, "hash": "0x..." },
"checkpointed": {
"block": { "number": 99, "hash": "0x..." },
"checkpoint": { "number": 10, "hash": "0x..." }
},
"proven": {
"block": { "number": 98, "hash": "0x..." },
"checkpoint": { "number": 9, "hash": "0x..." }
},
"finalized": {
"block": { "number": 95, "hash": "0x..." },
"checkpoint": { "number": 8, "hash": "0x..." }
}
}

Migration:

  • Replace tips.latest with tips.proposed
  • For checkpointed, proven, and finalized tips, access block info via .block (e.g., tips.proven.block.number)

Removed features

New features

Initial ETH per fee asset configuration

A new environment variable AZTEC_INITIAL_ETH_PER_FEE_ASSET has been added to configure the initial exchange rate between ETH and the fee asset (AZTEC) at contract deployment. This value uses 1e12 precision.

Default: 10000000 (0.00001 ETH per AZTEC)

Configuration:

--initialEthPerFeeAsset <value>       ($AZTEC_INITIAL_ETH_PER_FEE_ASSET)

This replaces the previous hardcoded default and allows network operators to set the starting price point for the fee asset.

reloadKeystore admin RPC endpoint

Node operators can now update validator attester keys, coinbase, and fee recipient without restarting the node by calling the new reloadKeystore admin RPC endpoint.

What is updated on reload:

  • Validator attester keys (add, remove, or replace)
  • Coinbase and fee recipient per validator
  • Publisher-to-validator mapping

What is NOT updated (requires restart):

  • L1 publisher signers
  • Prover keys
  • HA signer connections

New validators must use a publisher key already initialized at startup. Reload is rejected with a clear error if validation fails.

Admin API key authentication

The admin JSON-RPC endpoint now supports auto-generated API key authentication.

Behavior:

  • A cryptographically secure API key is auto-generated at first startup and displayed once via stdout
  • Only the SHA-256 hash is persisted to <dataDirectory>/admin/api_key_hash
  • The key is reused across restarts when --data-directory is set
  • Supports both x-api-key and Authorization: Bearer <key> headers
  • Health check endpoint (GET /status) is excluded from auth (for k8s probes)

Configuration:

--admin-api-key-hash <hex>                 ($AZTEC_ADMIN_API_KEY_HASH)    # Use a pre-generated SHA-256 key hash
--no-admin-api-key ($AZTEC_NO_ADMIN_API_KEY) # Disable auth entirely
--reset-admin-api-key ($AZTEC_RESET_ADMIN_API_KEY) # Force key regeneration

Helm charts: Admin API key auth is disabled by default (noAdminApiKey: true). Set to false in production values to enable.

Migration: No action required — auth is opt-out. To enable, ensure --no-admin-api-key is not set and note the key printed at startup.

Transaction pool error codes for RPC callers

Transaction submission via RPC now returns structured rejection codes when a transaction is rejected by the mempool:

  • LOW_PRIORITY_FEE — tx priority fee is too low
  • INSUFFICIENT_FEE_PAYER_BALANCE — fee payer doesn't have enough balance
  • NULLIFIER_CONFLICT — conflicting nullifier already in pool

Impact: Improved developer experience — callers can now programmatically handle specific rejection reasons.

Changed defaults

Troubleshooting

Next steps