Protocol
This release introduces protocol version 32
On alphanet, this protocol version can be enabled no earlier than 2026-08-01 01:03 UTC (start of epoch 57).
#12366: The validator count limits and stake thresholds are governed by the protocol config; the deprecated on-chain system parameter fields are recorded as zero on newly created networks.
#12440: Enable the optimistic commit rule (StarfishSpeed) in Starfish consensus on testnet.
#12477: The minimum checkpoint interval is now amortized over a sliding window of 20 checkpoints on testnet (protocol version 32).
#12426: iota_system::genesis no longer supports timelocked stake allocations.
#12509: Publish package metadata with the module metadata stored as a dynamic field and allows view functions on Testnet.
#12511: Enables Move-based sponsor account authentication and the pre-consensus logic to authenticate only the sponsor Move authentication (if present) in mainnet.
#12457: The P-COOL flow is enabled on devnet from protocol version 32.
Nodes (Validators and Full nodes)
#12298: The default Starfish soft_leader_timeout is reduced from 100 ms to 5 ms; validators propose sooner when strong votes for the previous leader are slow to arrive. Operators can override it via consensus-config.parameters.soft_leader_timeout.
#12375: A certified Abstract Account transaction whose account object was deleted or cancelled due to shared-object congestion now executes to the proper failure effect.
#11645: - State sync moved from the archival store to a checkpoints bucket; nodes no longer write or read a separate state archive; historical checkpoints are now synced from a checkpoints archive via an ingestion URL.
state-archive-write-configandstate-archive-read-configiota-node config entries removed entirely.checkpoint-archive-configiota-node config entry added; it configures the state-sync fallback, with a requiredurl(the historical checkpoints archive to backfill from). Add this entry to your node configuration and pick the correct network:
checkpoint-archive-config:
url: "https://checkpoints.<mainnet|testnet|devnet>.iota.cafe/ingestion/historical"
download-concurrency: 5
#12046: Client-facing request handling (validator gRPC, JSON-RPC, gRPC read API) now runs on a dedicated tokio runtime, isolated from node-core work (consensus, execution, checkpoints) so a flood of incoming transactions can no longer starve consensus commits or checkpoint signing. The core runtime keeps one worker per CPU core; serving threads are sized per node role and added on top. New tokio_runtime_* metrics expose per-runtime saturation.
#12131: Full node gRPC traffic control now accounts for batch APIs per item — each item of ExecuteTransactions, SimulateTransactions, GetObjects, and GetTransactions counts as one request for the spam policy, and per-item client errors feed the error policy — so batching can no longer dilute a client's request rate or hide its errors. GetObjects / GetTransactions batches are now size-capped via the new max_get_objects_batch_size / max_get_transactions_batch_size config (default 1000).
#12137: The validator gRPC server now enforces a concurrency limit per service (Validator, ValidatorV2, ValidatorPeer) instead of one global limit, so a flood of client transaction submissions cannot crowd out validator-peer RPCs. The grpc_concurrency_limit config field is replaced by grpc_concurrency_limit_per_core (default 1000); the effective per-service limit is that value times the machine's CPU cores (previously effectively unlimited). With grpc_load_shed, excess requests are rejected with RESOURCE_EXHAUSTED.
#12368: 21 avg-only Starfish consensus histograms are exported as plain _sum/_count counter pairs under unchanged series names, and the consensus_transaction_synchronizer_fetch_latency, consensus_latency_to_process_stream, and consensus_suspended_block_header_time histograms are replaced by gauges exposing fixed per-node quantiles {0.05, 0.33, 0.5, 0.66, 0.95} (the first two keep per-peer _sum/_count means); the _bucket series of all 24 metrics are no longer exposed, so custom histogram_quantile() queries over them must be updated.
Indexer
#12328: Removed the deprecated --optimistic-pruner-batch-size / OPTIMISTIC_PRUNER_BATCH_SIZE argument
#12467: The IOTA Indexer can now be restored from a formal snapshot. See wiki for more information.
JSON-RPC
#12277: the OpenRPC schema component for signatures is renamed GenericSignature → UserSignature; the wire format (base64 string) is unchanged.
#12366: On newly created networks, the deprecated validator count/stake fields of the system state summary report zero; read the enforced values from the protocol config instead.
CLI
#12342: the keyScheme field in iota client new-address JSON output is now lowercase (e.g. ed25519 instead of ED25519).
#11645: - iota-tool drops the archive subcommands verify-archive, print-archive-manifest, update-archive-manifest, verify-archive-from-checksums, and dump-archive; its backfill-checkpoint-summaries command now takes a required --ingestion-url argument.
iota-data-ingestionremoves the archival task type from the ingestion config and the standalonearchival_ingestionbinary.iota-light-clientremoves thearchive-store-configoption and now requires a GraphQL URL to sync checkpoints.
#12461: Parallel iota move build invocations no longer corrupt the shared git dependency cache in ~/.move or print git lock errors; concurrent fetches of the same dependency now wait for each other.
Rust SDK
#12482: iota-vm-sdk gRPC object fetches now skip objects the node cannot serve instead of failing the whole fetch
gRPC
#12351: GetEpoch can now return epoch_close_proof, the certified proof of how an epoch closed, available even for old, pruned epochs.
#12131: Batch APIs are now tallied per item by the full node traffic control (spam rate and error policy), so batching cannot bypass rate limiting.