Release Notes
v1.77.1
🔶 Testnet | Source: GitHub Release
Sui Protocol Version in this release: 132
#26886: Bump protocol version
#27155: Bumps the max protocol version to 131 and adds the framework_tx_context_mut_restrictions feature flag. Starting at version 131, system-package functions that take &mut TxContext and return a mutable reference must also take a non-TxContext &mut parameter; publication is rejected otherwise. User packages are unaffected.
#26891: Adds a ForwardingAddressRegistry system object (0x2::forwarding_address, object ID 0xfa), created during epoch change when the create_forwarding_address_registry flag is enabled (devnet only for now). No user-facing API yet.
Nodes (Validators and Full nodes)
#26891: New end-of-epoch system transaction ForwardingAddressRegistryCreate.
gRPC
#26891: New FORWARDING_ADDRESS_REGISTRY_CREATE kind in the EndOfEpochTransactionKind proto enum.
GraphQL
#26891: New ForwardingAddressRegistryCreateTransaction member of the EndOfEpochTransactionKind union.
#27492: transactions(filter: {affectedObject: ...}) now correctly returns a FEATURE_UNAVAILABLE error when the tx_affected_objects pipeline isn't configured, instead of silently succeeding.
CLI
#27291: new logic for gas selection to allow usage of address balances. Note that if no gas coin is passed, it will smash all available gas coins into one.
Breaking change: --stateless is no longer available for send-funds command. Use --from-address-balance instead to send funds from AB to another address.
#27213: sui client verify-source <path> now rebuilds the package with the toolchain it was published with (downloading that release if needed) and reads the on-chain address to compare against from the package's own publication metadata — it no longer takes a package-id argument. --verify-deps, --skip-source, and --address-override are removed; to verify a dependency, run the command against that dependency's source. Pass --toolchain-version to rebuild with a different toolchain.
#27490: sui client gas now also displays address balance SUI balance.
#27395: A git dependency whose rev is an annotated tag now pins to the commit the tag points at instead of the tag object. Existing Move.lock files that pinned a tag object keep their old sha until repinned; you can use sui move update-deps to fix old lockfiles.
#27436: sui client verify-source now prints the metadata it verified against (original id, published-at, toolchain version, binary path) on success, and emits it as JSON under the global --json flag.
#27374: sui client verify-source now caps its cache of downloaded sui toolchains at the most-recently-used few (default 5, set SUI_BINARY_CACHE_LIMIT to change), evicting older ones after a download.
#27438: sui client verify-source --toolchain <path> rebuilds with a local sui binary instead of downloading a toolchain.
#27446: sui client verify-source reuses a suiup-cached release archive instead of re-downloading, when present.
Indexing Framework
#27360: Fixes a bug where the checkpoint broadcaster could keep running instead of shutting down promptly after a fatal ingestion error, if real-time checkpoint streaming was active and healthy at the same time.
Full Log: https://github.com/MystenLabs/sui/commits/testnet-v1.77.1
v1.76.1
✅ Mainnet | Source: GitHub Release
sui::scratch: A Per-Transaction Scratch Pad
Sui v1.76 introduces sui::scratch, an ephemeral, per-transaction key-value store. Think of it as a "scratch pad" you can write to for the duration of a transaction: all entries persist throughout the PTB (across commands), but are dropped at the end of the transaction.
It may be helpful to think of it like adding dynamic fields directly to TxContext. However, the entries are not persisted with any object, and every entry is dropped before the transaction ends. Nothing written to scratch outlives the transaction, and nothing is charged for storage.
The API
Each entry is identified by the pair of its key type and key value, hashed together the same way as a dynamic field name (see sui::dynamic_field::hash_type_and_key). So WrappedU8(1) and WrappedBool(true) are distinct keys even though they serialize to the same bytes, because the key type is part of the derived address.
The core operations mirror sui::dynamic_field, and are exposed as methods on TxContext:
add(key, value)inserts an entry. Aborts if the key is already present.read(key)returns a copy of the value. The entry stays in place.remove(key)removes the entry and returns its value. Aborts if the key is not present.exists_with_type(key)andexists(key)test for presence, with and without checking the type of the value respectively.- Additional helper functions and macros will be rolled out over the coming releases.
Use Cases
We foresee a common use of scratch being to constrain how a function is called within a single PTB. A few examples of per-PTB limits:
- Enforce that a function is called at most once (or up to any limit you choose) across the whole transaction.
- Enforce that a function is called at most once for a given set of object inputs.
- Enforce that a function is called at most once for a given set of type parameters.
For instance, a DEX could use scratch to allow at most one swap from token A to token B per PTB, keying an entry on the ordered (A, B) type pair and aborting on the second attempt. Because scratch is cleared at the end of every transaction, the next transaction starts fresh. There is no lingering state to reset or clean up.
Example
A minimal "call at most once per PTB" guard looks like this:
module example::once;
use sui::tx_context::TxContext;
#[error]
const EAlreadyCalled: vector<u8> = "Function has already been called in this PTB";
// A key type this module owns.
public struct Called() has copy, drop;
public fun do_thing(ctx: &mut TxContext /* ... */) {
// Abort if we have already run in this PTB; otherwise mark that we have.
assert!(!ctx.scratch_internal_exists!<Called>(Called()), EAlreadyCalled);
ctx.scratch_internal_add!<Called, bool>(Called(), true);
// ... rest of the logic ...
}
A Note on Access Control
Scratch entries are namespaced by their key type, and only the module that defines the key type K can access the entries keyed by it. Within the defining module, the scratch_internal_* macros used above handle the access control for you: under the hood they issue a sui::scratch::Permit<K> from a std::internal::Permit<K>, which can only be constructed by K's defining module.
For more granular control or for accessing entries outside of the defining module, you will need to pass the sui::scratch::Permit<K> explicitly. The non-macro forms (scratch_add, scratch_read, and so on) take a Permit<K> as an argument.
⚠️ This release introduces a new RPC Store for gRPC indexes, requiring a one-time, resumable reindexing process. Startup includes live object reindexing (which temporarily delays HTTP availability), followed by background historical indexing that does not impact normal RPC operations. The change improves balance indexing, standardizes the index database format, and enables the new filtered List and Subscription APIs. It could take close to ~1.5 hours for re-indexing to complete upon startup.
Sui Protocol Version in this release: 130
#27157: Protocol version 130. Unsettled object-funds withdraws are now recorded using per-account net amounts from transaction effects instead of running-max withdraw amounts, so withdraws that are offset by deposits in the same transaction no longer block other withdraws from the same account within the same consensus commit.
Nodes (Validators and Full nodes)
#27203: Improved the error message returned when a transaction's address balance withdrawal exceeds the available balance: it no longer exposes internal accumulator object IDs, and now names the coin type and owner address and clarifies that Coin objects owned by the address are not part of its address balance.
#27149: Removes the admission-queue-bypass-fraction validator config field; all transactions are now admitted through the gas-price priority queue. The removed field is ignored if still present in a config file, but should be deleted.
#27062: Validators automatically recover from checkpoint and transaction forks on restart when the network has certified the canonical outcome and a new binary version is deployed; forks caused by the running binary version, or without a certified outcome, halt the node awaiting a corrected binary or operator-supplied fork recovery overrides.
#27238: Full nodes (and sui-kv-rpc) can capture decoded gRPC request payloads on the new opt-in grpc_request tracing target: set RUST_LOG="info,grpc_request=trace", optionally with RUST_LOG_TAILS="grpc_request=/path/file.jsonl", to log each request's method and canonical-JSON payload. Unset by default, so log output is unchanged and no action is required.
gRPC
#27197: Adding filtered subscription APIs for checkpoints, transactions, and events
#27257: stabilizes the filtered List* apis as well as filter subscription apis
CLI
#27183: sui client chain-identifier now displays both Base58 and Hex format for the chain digest.
The Move package system now accepts both formats interchangeably: chain IDs in Move.toml [environments] section.
Indexing Framework
#27129: Pipelines are now grouped into cohorts by distance from the tip, each with its own ingestion service, so a lagging pipeline no longer throttles caught-up ones. New optional IngestionConfig.min_cohort_boundary (default 25,000 checkpoints) tunes the grouping; no action required.
#27238: The consistent store's gRPC service supports the same opt-in grpc_request capture target.
Full Log: https://github.com/MystenLabs/sui/commits/mainnet-v1.76.1
v1.75.2
✅ Mainnet | Source: GitHub Release
Sui Protocol Version in this release: 129
#27096: Introduces a new protocol version that adds explicit bounds for binary pools that were otherwise implicitly constrained before. No user-visible change.
#26914: adds insert_before and insert_after to sui::linked_table
#27067: use defining_ids in sui::coin
Nodes (Validators and Full nodes)
#27063: the state-sync archive fallback now supports gs:// (Google Cloud Storage) ingestion URLs. A new remote-store-headers option under state-archive-read-config attaches default HTTP headers to archive requests, which enables requester-pays GCS buckets via x-goog-user-project. Previously only file / s3 / http archive stores were supported.
#27026: New optional RUST_LOG_TAILS env var additionally writes individual tracing targets to dedicated files (format inferred from the file extension — .jsonl/.ndjson for JSON, otherwise text), leaving normal log output unchanged. Backward-compatible — unset by default, so log output is unchanged and no action is required.
gRPC
#27035: Opaque pagination cursors returned by the scanning apis list_transactions, list_events, and list_checkpoints have a new internal encoding. Cursors remain opaque and clients should continue treating them as such. Users should restart pagination from the beginning if they encounter a cursor-related error.
GraphQL
#27018: Introduce IAddressable.asTransactionObject as a generalization of Address.asTransactionObject.
#27004: GraphQL request payloads can be captured for replay by enabling the graphql_request tracing target at trace level — all kinds via RUST_LOG=graphql_request=trace, or a single operation kind via RUST_LOG="graphql_request[{kind=mutation}]=trace". Disabled by default.
#26731: Add cursor field to Checkpoint object
#27035: The opaque pagination cursor returned for a Transaction edge of the TransactionConnection have a new internal encoding. Cursors remain opaque and clients should continue treating them as such. Users should restart pagination from the beginning if they encounter a cursor-related error.
#26714: Support resumable checkpoints subscription in features staging
CLI
#27094: sui start respects the fullnode RPC socket address that's part of its network config, if one is provided.
Indexing Framework
#27026: The same RUST_LOG_TAILS env var is available to indexer binaries (e.g. sui-indexer-alt-graphql). Set it alongside RUST_LOG (e.g. RUST_LOG="info,graphql_request=trace" with RUST_LOG_TAILS="graphql_request=/var/log/sui/graphql_request.jsonl") to capture that target as NDJSON for replay while normal logs stay readable. Opt-in; no action required otherwise.
Full Log: https://github.com/MystenLabs/sui/commits/mainnet-v1.75.2
v1.74.1
✅ Mainnet | Source: GitHub Release
Sui Protocol Version in this release: 128
#27097: Introduces a new protocol version that adds explicit bounds for binary pools that were otherwise implicitly constrained before. No user-visible change.
#26896: added protocol version 127 enabling always_advance_dkg_to_resolution. Corrects version 126 which was incorrectly modified after being released to testnet.
#26901: Updated gas prices for range proof verification and Ristretto group operations in protocol version 127.
#26998: Enable Ristretto255 group operations and bulletproofs range proof verification on testnet.
#26996: Mainnet switches to timestamp-based epoch close at protocol version 127. No operator action required.
Nodes (Validators and Full nodes)
#26973: A node now reports and disconnects state-sync peers that are consistently unreachable even when it is not actively syncing from them; previously this could fail to happen. No operator action required.
#26989: Fixes a spurious panic that could occur during a normal node shutdown/restart. No action required.
gRPC
#26763: `SimulateTransaction` now accepts `gas_price=0` for gasless-tier-eligible transactions (both via the unresolved proto path and as pre-built BCS transactions) instead of returning an error.
CLI
#26991: adds sui move lint command
#27012: Renamed the --forking-mode flag to --skip-signing to more correctly represent what it does.
Full Log: https://github.com/MystenLabs/sui/commits/mainnet-v1.74.1
v1.73.2
✅ Mainnet | Source: GitHub Release
Sui Protocol Version in this release: 126
#26849: version 126 introduced that changes how insufficient funds for withdrawals are handled.
#26740: Testnet: advance epoch based on timestamp instead of validator votes.
#26246: New flag for dealing with party object extensions for incurring post execution writes
GraphQL
#26594: Support checkpoint lookup by digest
#26495: add asTransactionObject which allows user to query the status of address that is involved as an object in a particular transaction
CLI
#26521: Adds sui move format passthrough command for prettier-move auto-formatter.
#26697: sui start --with-faucet now responds to Ctrl+C / SIGINT and shuts down all subservices gracefully.
Indexing Framework
#26229: Validate streaming backoff config and use saturating fallback math so retries cannot stall without progress.
Full Log: https://github.com/MystenLabs/sui/commits/mainnet-v1.73.2
v1.72.5
✅ Mainnet | Source: GitHub Release