All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
v3.10.0-rc.6 - 2026-03-27
- Add
--execution.stylus-target.allow-fallbackflag: if true, fall back to an alternative compiler when compilation of a Stylus program fails (default: true). [PR]
- Add
/livenessand/readinessHTTP health check endpoints to the transaction-filterer service. Readiness reports 503 until the sequencer client is connected. [PR] - Prevent MEL node startup if have non-MEL entries in consensus database. [PR]
- Add tip collection ArbOS state field and precompile to allow the chain owner to enable or disable collecting transaction tips. [PR]
- ArbOS 60:
ArbOwner.setWasmActivationGas/ArbWasm.activationGas— chain owners can set a constant gas charge burned before each Stylus contract activation (default 0). [PR]
- Disable cranelift fallback for non-onchain execution modes. [PR]
- Add recovery to all stopWaiter threads. [PR]
- Stylus: reject activation of wasm programs using the multi-value extension (functions with multiple return values, or block/loop/if with parameters) starting from ArbOS version 60. [PR]
- Upgrade to wasmer v7.1.0. [PR]
- Added consensus v60-rc.1 to Dockerfile. [PR]
- Fix nil-dereference and log format in
cmd/nitro/nitro.gowhen machine locator creation fails; return early instead of falling through to dereference nil locator. [PR] - Part 3 of integrating MEL into master. [PR]
- Re-enable download of previous consensus machine versions (v50, v51, v51.1, v60-alpha.1) in Docker build. [PR]
- Harden blocks reexecutor with panic recovery for concurrent trie access races. [PR]
- Do not access state in CollectTips for ArbOS < 60. [PR]
- Introduce
ValidationInputintermediate data structure with optional rkyv serialization in the validation crate. [PR] - Minor refactor in JIT, prover and validator crates. [PR]
- Moved float-related utilities from arbmath to a new package floatmath. [PR]
- Add TrackChild/StartAndTrackChild to StopWaiter for automatic LIFO child lifecycle management. [PR]
v3.10.0-rc.5 - 2026-03-27
- Group rollback for cascading redeem filtering using deferred statedb clone. [PR]
- Update Go to 1.25.8 in Dockerfile. [PR]
- Preflight the worst-case fragment read gas during multi-fragment Stylus activation, then charge the actual EXTCODECOPY-style cost after the fragment code is read. [PR]
- Enable http communication between block validator and validation server. [PR]
- Split
ResourceKindStorageAccessintoResourceKindStorageAccessReadandResourceKindStorageAccessWritefor finer-grained multi-dimensional gas metering. [PR] - Upgrade to wasmer7. [PR]
- Part 2 of integrating MEL into master. [PR]
- Once timeout attempts are exhausted, treat it as any other, possibly fatal failure. [PR]
- Use proper comparison for attempts. [PR]
- Fix bold StopWaiter usage: start child structs on their own StopWaiters instead of the parent's. Fix StopAndWait ordering. [PR]
- Fix multi-gas refunds in retryables (ArbOS60). [PR]
- Fix StopWaiter lifecycle ordering: stop children before parent in StopAndWait, and pass managed context to children in Start. [PR]
- Fix MEL feature flag bugs: nil message dereference in delayed sequencer, incorrect waitingForFinalizedBlock domain, and missing BatchPoster+MEL config validation. [PR]
- Fix ValidationSpawnerRetryWrapper lifecycle: reuse one wrapper per module root instead of creating and leaking one per validation. [PR]
- Fix BroadcastClients launching coordination goroutine on child Router's StopWaiter instead of its own. [PR]
- Fix ValidationServer and ExecutionSpawner missing StopAndWait for their children. [PR]
- Handle too-short AnyTrust certificate data as empty batches instead of crashing. [PR]
- ArbGasInfo.GetMultiGasPricingConstraints now returns resources in deterministic order. [PR]
- Move exponent validation in ArbOwner.SetMultiGasPricingConstraints outside the per-constraint loop. [PR]
- Add JWT authentication support to the Rust validation server. [PR]
- Move express lane service and tracker from
execution/gethexecto thetimeboostpackage. [PR] - Block sequencing until address filter rules are loaded. [PR]
v3.10.0-rc.4 - 2026-03-27
- Adds --execution.sequencer.transaction-filtering.disable-delayed-sequencing-filter to enable/disable filtering when sequencing delayed messages. [PR]
- Added
--node.block-validator.validation-spawning-allowed-timeouts(default3): maximum number of timeout errors allowed per validation before treating it as fatal. Timeout errors have their own counter, separate from--node.block-validator.validation-spawning-allowed-attempts. [PR]
- Peform DNS lookups with IPv4 before IPv6. [PR]
- messageSequencingMode messageRunModes. To be used when filtering transactions in the geth layer. [PR]
- Fix Message Extraction function to handle cases when number of batch posting reports are not equal to the number of batches. [PR]
- Make
PruneExecutionDBonly depend onexecutionDBby removingconsensusDBdependency. [PR]
- Remove aborted snap sync code. [PR]
- Part 1 of improving the MEL runner with latest, tested implementation. [PR]
- Use defer to release createBlocksMutex in sequencerWrapper to prevent deadlock on panic. [PR]
- Fix opening classic-msg database. [PR]
- Fix system test triggered panic in
updateFilterMapsHeads. [PR] - Fix address filter S3 syncer failing to parse hash list JSON when salt or hash values use
0x/0Xhex prefix. Go'sencoding/hex.DecodeStringdoes not handle the prefix, so it is now stripped before decoding. [PR] - Fix
debug_executionWitnessendpoint. [PR] - Improve block validator error message to suggest enabling staker in watchtower mode when wasmModuleRoot is not set from chain. [PR]
- If batchFetcher returns error use existing LegacyBatchGasCost value. [PR]
- Fix
rlp: expected Listerror when fetching transaction receipts for blocks with Arbitrum legacy receipt encoding. [PR] - Block validator no longer crashes on timeout errors during validation. Timeout errors are retried separately from other validation failures, up to a configurable limit. [PR]
- Make Validator request match clients request format. [PR]
- Cache precompiled wasm modules for repeated JIT validation. [PR]
- S3Syncer's context moved out from new to Initialize. [PR]
Bytes32'sDebugandDisplayis prefixed with 0x. [PR]- Allow validator's JitMachine to find jit path. [PR]
- Migrate Rust validation server to JSON RPC to match Go client communication. [PR]
- Move wavmio logic from JIT crate to caller-env (to be reused soon by SP1 validator). [PR]
- Make
ValidationInput.max_user_wasm_sizefield non-mandatory. [PR]
v3.10.0-rc.3 - 2026-02-23
- New dangerous parameters
--node.bold.dangerous.assume-validand--node.bold.dangerous.assume-valid-hashto have validator assume all messages up to given message have already been validated. [PR] - Filtered retryable submission redirect: when an ArbitrumSubmitRetryableTx is in the onchain filter, redirect beneficiary/feeRefundAddr and skip auto-redeem. [PR]
- Add consensus v51.1 to dockerfile. [PR]
- Fix expose-multigas feature when using a live tracer. [PR]
- Gracefully handle missing sequencerClient in TransactionFilterer. [PR]
- Fix filtered
ArbitrumDepositTx(L1-to-L2 ETH deposits) permanently stalling the delayed sequencer. [PR] - Version-gate FilteredTransactionsState so it is not opened on pre-v60 blocks. [PR]
- Introduce MachineLocator for Validator. [PR]
- Fix machine locator tests. [PR]
- Add support for consensus v60-alpha.1. [PR]
v3.10.0-rc.2 - 2026-02-23
- The new
--node.batch-poster.compression-levelsflag allows operators to specify different compression strategies based. [PR]backlog: The minimum backlog size (in number of batches) at which this configuration applies. First entry must be zero. [PR]level: The initial compression level applied to messages when they are added to a batch once the backlog reaches or exceeds the configured threshold. [PR]recompression-level: The recompression level to use for already compressed batches when the backlog meets or exceeds the threshold. [PR]- Example configuration:. [PR]
- Validation rules:. [PR]
- The
backlogvalues must be in strictly ascending order. [PR] - Both level and recompression-level must be weakly descending (non-increasing) across entries. [PR]
- recompression-level must be greater than or equal to level within each entry (recompression should be at least as good as initial compression). [PR]
- All levels must be in valid range: 0-11. [PR]
- Add
--execution.address-filter.enableflag to enable/disable address filtering. [PR] - Add
--execution.address-filter.poll-intervalflag to set the polling interval for the s3 syncer, e.g. 5m. [PR] - Add
--execution.address-filter.cache-sizeflag to set the LRU cache size for address lookups (default: 10000). [PR] - Add
--execution.address-filter.s3.*group of flags to configure S3 access:. [PR]- Add
--execution.address-filter.s3.bucketflag to specify the S3 bucket name for the hashed address list. [PR] - Add
--execution.address-filter.s3.regionflag to specify the AWS region. [PR] - Add
--execution.address-filter.s3.object-keyflag to specify the S3 object key for the hashed address list. [PR] - Add
--execution.address-filter.s3.access-keyflag to specify the AWS access key. [PR] - Add
--execution.address-filter.s3.secret-keyflag to specify the AWS secret key. [PR] - Add
--execution.address-filter.s3.chunk-size-mbflag to set S3 multipart download part size in MB (default: 32). [PR] - Add
--execution.address-filter.s3.concurrencyflag to set S3 multipart download concurrency (default: 10). [PR] - Add
--execution.address-filter.s3.max-retriesflag to set maximum retries for S3 part body download (default: 5). [PR]
- Add
- The
- Init config must not have
emptyset to true whengenesis-json-fileis provided. [PR] - Add
execution.sequencer.event-filter.pathto configure sequencer-side event-based transaction filtering via a JSON rules file. [PR] - Extend genesis.json with
serializedConfigandarbOSInit.initialL1BaseFeefields. [PR] - Remove
initial-l1-base-feeCLI flag from genesis-generator. [PR] - Added
--execution.address-filter.s3.endpointfor S3-compatible services (MinIO, localstack). [PR] - Add
--node.data-availability.rest-aggregator.connection-waithow long to wait for initial anytrust DA connection until it errors (re-attempts every 1 second) (to be deprecated, useda.anytrust*instead). [PR] - Add
--node.da.anytrust.rest-aggregator.connection-waithow long to wait for initial anytrust DA connection until it errors (re-attempts every 1 second). [PR] - Add
--anytrust.rest-aggregator.connection-waithow long to wait for initial anytrust DA connection until it errors (re-attempts every 1 second). [PR] - Add address-filter.address-checker-worker-count to configure the number of address checker workers. [PR]
- Add address-filter.address-checker-queue-size to configure the address checker queue capacity. [PR]
cc_brotlioptional feature which when enabled compilesbrotliautomatically using Rust build scripts. [PR]- transaction-filterer command, responsible to receive a transaction that should be filtered, and adding that transaction to the ArbFilteredTransactionsManager precompile. [PR]
- Increase Stylus smart contract size limit via merge-on-activate. [PR]
- New
--node.batch-poster.compression-levelsconfiguration flag that accepts a JSON array of compression configurations based on batch backlog thresholds. [PR] - Support for defining compression level, recompression level, and backlog threshold combinations. [PR]
- Validation rules to ensure compression levels don't increase with higher backlog thresholds. [PR]
- Add address filter service for compliance chains (
addressfilterpackage). This feature enables sequencers to block transactions involving filtered addresses by polling a hashed address list from S3. Key capabilities include:. [PR]- S3-based hashed list synchronization with ETag change detection for efficient polling. [PR]
- Lock-free HashStore using atomic pointer swaps for zero-blocking reads during updates. [PR]
- Configurable LRU cache for high-performance address lookups (default: 10k entries). [PR]
- Privacy-preserving design: addresses are never stored or transmitted in plaintext (SHA256 with salt). [PR]
- Forward-compatible hash list JSON format with
hashing_schememetadata field. [PR] - Configurable S3 download settings (part size, concurrency, retries). [PR]
- Added a new hook to
replay.wasmto enable an action just before the first IO (wavmio) instruction. It is expected that everywasmexecution environment will provide a modulehookswith a methodbeforeFirstIO. JIT and Arbitrator provers have noop implementations. [PR] - Introduce event filter module for filtering transaction logs based on event selectors and topic-encoded addresses. [PR]
- Execute onchain-filtered delayed transactions as no-ops: nonce is incremented, all gas is consumed, and a failed receipt is produced. The sender pays for the failed transaction as a penalty. [PR]
- Added a test for batch resizing without fallback (TestBatchResizingWithoutFallback_MessageTooLarge) that validates ErrMessageTooLarge triggers batch rebuild while staying on the same DA provider. [PR]
- Redis Pub/Sub–based executionSpawner implementation, including GetProof support, Redis-first interface selection, and the ability to run without any RPC dependency. [PR]
- Multi-gas constraints to L2-pricing simulator. [PR]
- L2 message accumulation in MEL and added MessageReader struct to extract recorded messages from preimages map. [PR]
- Hashed address filter implementation for address filter interfaces with shared LRU caching. [PR]
- sequencer metrics considering tx size:
arb/sequencer/block/txsizeandarb/sequencer/transactions/txsizehistograms. [PR] - sequencer queue metrics:
arb/sequencer/queue/length,arb/sequencer/queue/histogram,arb/sequencer/waitfortx. [PR] - sequencer block counter metrics:
arb/sequencer/block/gaslimited,arb/sequencer/block/datalimited,arb/sequencer/block/txexhausted. [PR] - Add filteredFundsRecipient ArbOS state field and precompile for use on chains with transaction filternig. [PR]
- arb_getL1Confirmations and arb_findBatchContainingBlock RPC APIs in Consensus side. [PR]
- Sequencer calls transaction-filterer command if delayed transaction was filtered. [PR]
- Config option genesis-json-file-directory which specifies the directory where genesis json files are located. [PR]
- Adding/removing ChainOwner and NativeTokenOwner emits corresponding events. [PR]
- Replace static batch poster compression configuration with dynamic, backlog-based compression level system. [PR]
- Generate
forward_stub.wasmat compile time using abuild.rsscript. Enables usingproveras a cargo dependency. [PR] - improve forwarding transaction log in case of error. [PR]
- Renamed
arbkeccakwasm module toarbcrypto. [PR] - For wasm compilation target, EC recovery is now expected to be provided by the external
arbcryptomodule. For JIT and arbitrator provers we inject Rust-based implementation. [PR] - genesis-generator will now read chain config and init message data directly from genesis.json. [PR]
- update ProgramPrepare to accept wasm and wasm_size. [PR]
- remove unecessary statedb, addressForLogging, codePtr, codeSize, time, program, runCtxPtr params from ProgramPrepare. [PR]
- Refactor openInitializeChainDb for Execution/Consensus split. [PR]
- Create new config and init package to expose and organize init and config nitro functionality. [PR]
- Nitro initialization uses the serialized chain config from genesis (instead of the deprecated
Configfield). [PR]
- Deprecate
--node.batch-poster.compression-levelflag in favor of--node.batch-poster.compression-levels. [PR]
- Fixes bold next batch index and message count computation to cap based on relative comparisons. [PR]
- Fix typed nil ExecutionSequencer in CreateConsensusNode causing crash in RPC client mode. [PR]
- Fix address filter bypass for aliased addressed, unsigned delayed messages (L1-to-L2). [PR]
- Fix calculation in the expected surplus in the sequencer metrics. [PR]
- Implement capacity endpoint for Rust Validator. [PR]
- Changed the max stylus contract fragments from uint16 to uint8 in ArbOwner and ArbOwnerPublic precompiles to not waste storage space. [PR]
- Add continuous mode to JIT validator. [PR]
- Introduce
JitMachine(equivalent to Go counterpartJitMachine). [PR] - Introduce graceful shutdown through signals. [PR]
- Move the server side of the validation communication protocol from
jittovalidationcrate. [PR] - Add client side implementation. Add tests. [PR]
- Merge wasm-libraries workspace with the main one. [PR]
- Add support for multiple module roots for Validator. [PR]
- Fix Validator continuous mode to run jit binary from inside tokio runtime. [PR]
- Add BurnMultiGas to Burner interface. [PR]
- Fix checking machine status in the Rust validation. [PR]
- Run the continuous mode unit test in CI. [PR]
- Add benchmarks comparing l2-pricing models. [PR]
v3.10.0-rc.1 - 2026-01-22
cmd/daserver->cmd/anytrustservercmd/datool->cmd/anytrusttool--node.data-availability.*->--node.da.anytrust.*--node.batch-poster.das-retention-period->--node.batch-poster.anytrust-retention-period--node.data-availability.rpc-aggregator.das-rpc-client.*->--node.data-availability.rpc-aggregator.rpc-client.*--node.batch-poster.max-size->--node.batch-poster.max-calldata-batch-size--node.da-provider.*->--node.da.external-provider.*anytrusttool--das-retention-period->--anytrust-retention-periodanytrusttool--das-rpc-client.*->--rpc-client.*daprovider--anytrust.parent-chain.node-url->--parent-chain-node-urldaprovider--anytrust.parent-chain.connection-attempts->--parent-chain-connection-attemptsdaprovider--anytrust.parent-chain.sequencer-inbox-address->--parent-chain-sequencer-inbox-addressdaserver--anytrust.parent-chain.node-url->--parent-chain-node-urldaserver--anytrust.parent-chain.connection-attempts->--parent-chain-connection-attemptsdaserver--anytrust.parent-chain.sequencer-inbox-address->--parent-chain-sequencer-inbox-address
- Enable Execution and Consensus to connect to the other via json-rpc [PR]
- Merge go-ethereum v1.16.7: [PR]
- Add log for genesis assertion validation: [PR]
- Precompiles for multi dimensional multi constraint pricer: [PR]
- Add return error in case of missing code for SetProgramCached: [PR]
- Guard zero batch count in inbox search and avoid validator underflow: [PR]
- Custom DA Complete Fraud Proof Support: [PR]
- Make uncompressed batch size limit configurable: [PR]
- Add new option to allow BlocksReExecutor to commit state to disk: [PR]
- Implement Execution/Consensus interface over RPC: [PR]
- Add comment about blob decoding failure: [PR]
- Add metric when validator stops validating because of low memory: [PR]
- Add address-based transaction filtering for sequencer. [PR]
- Add support for Geth state size tracking with a flag
--execution.caching.state-size-tracking. [PR] - Added a note to the
--node.feed.output.signedflag that this will use batch poster's wallet for signing. [PR] - Add GetMultiGasBaseFee precompile to retrieve fees per resource kind. [PR]
- Add
execution.caching.trie-cap-batch-sizeoption that sets batch size in bytes used in the TrieDB Cap operation (0 = use geth default). [PR] - Add
execution.caching.trie-commit-batch-sizeoption that sets batch size in bytes used in the TrieDB Commit operation (0 = use geth default). [PR] - Add database batch size checks to prevent panic on pebble batch overflow. [PR]
- new wasm import programPrepare. [PR]
- new wasm import programRequiresPrepare. [PR]
- Enable running JIT validation with native input mode. [PR]
- Enabled consensus node to communicate with ExecutionRecorder over RPC. [PR]
- Implement recording of txs for MEL validation. [PR]
- Added a new endpoint to arb namespace called arb_getMinRequiredNitroVersion that returns minimum required version of the nitro node software. [PR]
- Add new precompile ArbFilteredTransactionsManager to manage filtered transactions. [PR]
- Add transaction filterers to ArbOwner to limit access to ArbFilteredTransactionsManager. [PR]
- Limit ArbOwners' ability to create transaction filterers with TransactionFilteringFromTime. [PR]
- Arbos storage for multi dimensional constraints: [PR]
- Arbitrator workspace enhancements: [PR]
- Only sign important fields in feed: [PR]
- Post report-only batch after MaxEmptyBatchDelay: [PR]
- Remove bold/util/StopWaiter use util/StopWaiter instead: [PR]
- Enhance state management in StopWaiterSafe: [PR]
- Log critical error when fails to flush batch in setHead: [PR]
- Broadcaster refactor: [PR]
- Use stateless keccak where possible: [PR]
- Optimize ConcatByteSlices to avoid repeated reallocations: [PR]
- Centralize validator worker throttling in BlockValidator #NIT-3339: [PR]
- Do not require BatchMetadata for reading DelayedInbox: [PR]
- redis pubsub: add retries limit and option to disable retries: [PR]
- Extract saturating arithmetics: [PR]
- Add MaxTxSize check to ValidateExpressLaneTx(): [PR]
- Adjust pricing formula with weight normalisation by max weight: [PR]
- Make bids receiver buffer size configurable: [PR]
- Improve utility for ensuring batch posting and processing: [PR]
- Issue refunds based on multi-dimensinal base fee: [PR]
- Rename bold packages: [PR]
- Add isActiveSequencer to ExpressLaneTracker log messages: [PR]
- Remove
ExecutionRecorder.MarkValidand rely onExecutionClient.SetFinalityData: [PR] - Unify keccaking: [PR]
- Rename database variable names: [PR]
- [config] Multiple DA provider infrastructure: [PR]
- [config] Rename DAS to AnyTrust: [PR]
- For wasm compilation target, keccak256 hashing is now expected to be provided by an external module. For JIT and arbitrator provers we inject Rust-based implementation. [PR]
- Renamed execution subpackages and RPC structs, removing redundancy in names and making them more idiomatic. [PR]
- Reorganize and refactor JIT validator CLI configuration. [PR]
- Update
contracts-legacysubmodule pin tov2-mainbranch. [PR] - Rename database variable names [PR]
- Move whole Rust codebase from
arbitrator/tocrates/directory. Move workspace files to the root. [PR] - Align the
execution.ExecutionRecorderinterface API with the other execution interfaces. Makes it more suitable for RPC calling. [PR] - Fix fifo lock flakey tests and implementation for bold. [PR]
- Merged ethereum/go-ethereum v1.16.8. [PR]
- Treat
finality msg countas an intermittent issue. Only if it doesn't resolve itself within a short period of time, it will be logged as error. [PR] - Changed state-history default to zero for path archive. [PR]
- Make the
--craneliftflag turned on by default for JIT validator. [PR] - Remove manual gas math from ArbRetryableTx.Redeem by using static L2 pricing backlog update cost. [PR]
- remove gas dimension tracers, system tests, and mock contracts. Multigas is now in the stf. [PR]
- Remove bold/util/backend.go: [PR]
- Clarify Redis DAS signing key config: [PR]
- Enhance data poster internal state handling: [PR]
- Align ArbOwner precompile docs: [PR]
- Update GenesisBlockNum to first nitro block in chain info: [PR]
- Do not set init.empty to true when init.genesis-json-file is set: [PR]
- Show correct value in redis database number error: [PR]
- Fix timer leak in redislock refresh goroutine: [PR]
- Use RWLock in StopWaiter: [PR]
- Fix RecentWasms cache bug by using pointers in methods: [PR]
- Fix maintenance ticker leak: [PR]
- Prevent unintended mutation of latestHeader.Number [PR]
- Fix invalid DA cert branch in inbox: [PR]
- Solve reexecutor panic if header unavailable: [PR]
- Prevent unintended mutation of latestHeader.Number in ParentChainIsUsingEIP7623: [PR]
- Disable chunked-store in datool dumpkeyset [PR]
- Add sequencer message length check in for the
daprovider.Readerimplementations. [PR] - Fix nil pointer panic in
auctioneer_submitBidRPC method when receiving malformed bid data. [PR] - Fixed ValidateCertificate proof generation to panic on preimageType overflow (> 255) instead of silently using a fallback value, aligning with the Solidity one-step prover which reverts for this case. [PR]
- Update implementation of receipts and txs fetching in mel-replay. [PR]
- Added testing for recording and fetching of logs and txs needed for MEL validation. [PR]
- Fixed batch poster on L3s not waiting for transaction receipt before posting next batch, causing duplicate batch attempts and spurious error logs. [PR]
- [MEL] - Implement delayed message accumulation in native mode: [PR]
- [MEL] - Update melextraction package to use logs instead of receipts and implement logs and headers fetcher: [PR]
- [MEL] - Implement preimage recorder for
DelayedMessageDatabaseinterface: [PR] - [MEL] - Implement recording of preimages related to sequencer batches (DA providers): [PR]
- Add new boolean option to
BlocksReExecutorcalledCommitStateToDiskthat will allowBlocksReExecutor.Blocksrange to not only re-executes blocks but it will also commit their state to triedb on disk. [PR]