Protocol
Sui Protocol Version in this release: 142
#28590: Protocol version 141 counts accumulator writes, ID-only object changes and unchanged consensus objects toward the transaction effects size limit, and limits a transaction to 1024 accumulator events. The changes previously planned for version 141 move to version 142.
#28230: groth16::verify_groth16_proof now aborts with EInvalidVerifyingKey when the prepared verifying key does not contain exactly one more vk_gamma_abc element than the number of public inputs, instead of returning false.
#28241: Adds sui::clock::borrow(): &Clock to the Sui framework. It returns the Clock without it being a transaction input, at the same timestamp as a Clock passed into the same transaction, so functions can read the time without callers passing a Clock down. Available from protocol version 141 with the framework upgrade.
#28418: Adds sui::derived_object::release.
#28460: secp256r1_ecrecover now aborts with EFailToRecoverPubKey on a signature whose recovered x-coordinate r + n overflows, instead of returning a key that does not verify it. Honest signers never produce such a signature.
#28544: Refactor to enable binary limits to be configurable via protocol config rather than hardcoded constants.
#28136: Protocol version 141 enables defer_owned_object_double_spend on testnet and mainnet.
Nodes (Validators and Full nodes)
#28443: Full nodes with the embedded rpc-store make each checkpoint readable from their indexes as soon as it is indexed, instead of up to 500 ms later.
#28425: Adds the optional p2p-config.state-sync.checkpoint-content-hedge-delay-ms setting, which sends a slow checkpoint contents download to a second peer, hedges sooner around peers that are slow from this node, and prefers peers expected to answer soonest, plus metrics for checkpoint contents downloads by peer. Without the setting, behavior is unchanged.
#28559: Full nodes with the embedded RPC indexes enabled accept a new optional setting, authority-store-pruning-config.rpc-store-num-checkpoint-snapshots-to-retain (default 0, which keeps snapshots disabled). They also export new rpc_store_indexer_* metrics: live_sst_files_size, estimate_live_data_size, compaction_read_bytes, and compaction_write_bytes.
#28563: /health accepts an optional max_history_lag query parameter; when set, a full node reports unhealthy while its ledger-history indexes are more than that many checkpoints behind its live-object indexes, or if it has no RPC indexes at all.
#28566: State sync downloads checkpoint contents in pages when a full contents download does not complete.
gRPC
#28426: ListTransactions, ListEvents and ListCheckpoints requests whose after (ascending) or before (descending) cursor lies past the end of the requested checkpoint range now end with CheckpointBound instead of CursorBound, and their closing cursor resumes where the request's cursor does.
#28443: Checkpoint subscriptions on full nodes with the embedded rpc-store deliver checkpoints about 180 ms sooner on average.
#28412: Signature verification accepts both supported zkLogin circuits regardless of the network's current circuit activation rules.
#28471: VerifySignatureRequest accepts check_address_aliases to verify against address's current address aliases. The response sets address_aliases_checked when the check was applied.
#27712: sui-kv-rpc always serves ListCheckpoints/ListTransactions/ListEvents, and its served checkpoint height always includes the List API pipelines. The enable-list-apis and enable-experimental-query-apis config fields are ignored.
#28516: ListTransactions and ListEvents accept start_transaction_index and end_transaction_index, and ListEvents also accepts start_event_index and end_event_index, to start and end a query at a position inside its first and last checkpoint.
#28527: ListCheckpoints, ListTransactions, ListEvents, SubscribeTransactions and SubscribeEvents frames carry Watermark.cursor_position, the frame's resume point as a public ledger position. Use it to order frames and drop duplicates instead of comparing cursor bytes. kv-rpc List* requests with an invalid filter fail with INVALID_ARGUMENT even when nothing is left to scan. On a fullnode, a descending request whose start_checkpoint is below the pruning floor fails with BELOW_EARLIEST_AVAILABLE even when its before cursor is past the tip.
#28535: AffectedAddress transaction filters (list transactions, list checkpoints, and subscriptions) also match transactions sent by the address, including sponsored transactions that touch only shared objects. A filter whose AffectedAddress literals would expand it to more than 64 terms, summed across the terms that contain them (for example, seven AffectedAddress literals ANDed in one term), is rejected with INVALID_ARGUMENT. Sender(X) AND NOT AffectedAddress(X) now matches nothing, because AffectedAddress(X) includes transactions sent by X.
#28563: /health on the gRPC server accepts an optional max_history_lag query parameter (see Nodes).
#28541: ListTransactions and ListEvents reject cursors minted by servers older than 1.83, including such cursors a 1.83 server returned, and every List* method rejects cursors in the original cursor format, with INVALID_ARGUMENT; restart such a scan from a ledger position instead. Every List* frame's Watermark carries cursor_position.
GraphQL
#28426: transactions and events pages that are empty because the cursor lies past the beforeCheckpoint/afterCheckpoint bound now report hasNextPage: false (or hasPreviousPage: false), so clients that follow it no longer re-request the same page forever.
#28395: Signature verification accepts both supported zkLogin circuits and ML-DSA-65 multisig members independently of network activation rules. Scoped JWK and epoch checks still apply.
#28470: verifySignature accepts an optional checkAddressAliases argument. When it is true, the signature must be from one of author's current address aliases instead of from author itself.
#28483: transactions and events pages with both after and before cursors that contain nothing now report hasNextPage: false and hasPreviousPage: false with no cursors, so clients that follow them no longer re-request the same page forever.
#27666: transactions and events connections are always served by the ledger gRPC List APIs, so the service at --ledger-grpc-url must serve them (a kv-rpc archival service with the List APIs enabled, or a full node with rpc.enable-indexing). --enable-list-apis / --experimental-query-apis are ignored and will be removed in a future release. Previously-issued cursors remain valid.
#27723: GraphQL uses one pool of ledger-grpc-num-connections connections to the ledger gRPC service instead of two, and List API calls report under the graphql_ledger_grpc metrics instead of graphql_alpha_ledger_grpc.
#28534: transactions subscriptions filtered by affectedAddress include transactions that only change that address's address balance, or that change an object it owns through party (consensus address) ownership, matching paginated transactions queries.
#28535: Transaction lists filtered on affectedAddress also return transactions sent by the address.
#27611: Package resolution reads packages from the ledger gRPC endpoint (--ledger-grpc-url) instead of the kv_packages table.
#28515: Cursors in the protobuf format, which GraphQL issued before 1.83 (and in testnet and devnet 1.83.0), and cursors taken straight from the gRPC ledger service, are no longer accepted; restart pagination without a cursor.
#28528: Transaction and event cursors from pages that started from a pre-1.84 cursor format are rejected; restart pagination without a cursor. Page startCursor/endCursor values can differ from earlier releases for the same page.
CLI
#28479: sui start --with-graphql now enables GraphQL subscriptions on the local network's GraphQL service. Paginated transactions and events queries are served by the local fullnode, and GraphQL starts once the indexer has caught up.
#28481: The Move compiler no longer reports ID leak errors (that check is now disabled on mainnet).
#28480: acquires is no longer a reserved keyword in Move and can be used as an identifier.
#28507: sui keytool multi-sig-combine-partial-sig accepts the partial signatures in any order. Previously they had to match the order of the public keys or the combined signature failed verification.
#28569: The sui::clock test helpers are deprecated in favor of test_scenario::set_clock_timestamp and increment_clock_timestamp.
Rust SDK
#28471: Bumps to the sui-rust-sdk revision with check_address_aliases support.
#28507: MultiSig::combine in sui-types orders member signatures by committee index, so callers no longer need to pre-sort them.
Indexing Framework
#28444: - Breaking (Rust API): CommitterConfig::collect_interval_ms and CommitterConfig::collect_interval(), ConcurrentConfig::min_eager_rows, SequentialConfig::min_eager_rows, and the MIN_EAGER_ROWS constant of the concurrent, sequential and Postgres Handler traits are removed. Delete any uses. To keep batches large (for example for ClickHouse), set the new CommitterConfig::min_batch_rows and CommitterConfig::max_batch_delay_ms instead.
- Behavior: pipelines cut pending rows into a batch as soon as the committer has room for one, instead of every
collect_interval_msor oncemin_eager_rowswere pending. Batches grow only while the committer is busy. - New config:
min-batch-rows(default 0, off) andmax-batch-delay-ms(default 500): wait until this many rows are pending, or until the oldest has waited this long, before cutting a batch. - Deprecated config keys:
collect-interval-msandmin-eager-rowsare still accepted in config files but ignored, with a warning. Remove them. - Watermarks: concurrent pipelines write their watermark as soon as it advances;
watermark_interval_msis now the minimum time between two watermark writes rather than a fixed interval.