Skip to main content
Action required by 19 August 2026.Sui’s raw datasets are migrating from JSON-RPC-sourced ingestion to gRPC-sourced ingestion, ahead of Sui’s deprecation of JSON-RPC. Table names, schemas, and the vast majority of columns are unchanged. A few nested JSON fields change shape, so find the tables you query in the table-by-table guide and update affected queries beforehand.

Overview

Sui is deprecating its JSON-RPC interface in favor of gRPC. As a result, there are some changes to the sui.raw data.

Cutover timeline

1

Mainnet cutover — 19 August 2026

sui.raw.* switches to the gRPC source. Update affected queries beforehand.

Summary of Changes

Look up the table(s) you query. If a table isn’t listed, there are no changes.

checkpoints

No action required. One field becomes richer:
  • checkpoint_commitments — previously always an empty array ([]); now populated with the per-checkpoint commitment digest.
Everything else on checkpoints is unchanged.

transactions

The transaction column holds a single Programmable Transaction Block (PTB) command, surfaced through transaction_key (the command name) and transaction_value (the command body). Both change shape. What changes
  1. Command key casing — command names are camelCase instead of PascalCase, so transaction_key’s value changes: MoveCallmoveCall, SplitCoinssplitCoins, TransferObjectstransferObjects, MergeCoinsmergeCoins, MakeMoveVecmakeMoveVector, Publishpublish, Upgradeupgrade.
  2. Field naming inside the commandtype_argumentstypeArguments.
  3. Argument shape — arguments carry an explicit kind and use different key names.
The package, module, and function values inside a command are unchanged. What to do
  • Make transaction_key filters case-insensitive: LOWER(transaction_key) = 'movecall' (instead of = 'MoveCall'). An exact = 'MoveCall' match will silently return zero rows after cutover.
  • Update transaction_value path reads: type_argumentstypeArguments; adjust for the new argument encoding. package / module / function need no change.
Old (JSON-RPC):
New (gRPC):
The package, module, function, and type-argument values are unchanged — only the keys (MoveCallmoveCall, type_argumentstypeArguments) and the argument wrapper differ.
Before:
After:
A transaction_key = 'MoveCall' filter matches zero rows after the change (the value becomes 'moveCall') — no error is raised. Audit any query that filters or joins on transaction_key or reads transaction_value sub-fields.

transaction_blocks

This is the most affected table. The nested transaction and effects objects move to the native gRPC shape, and the top-level columns derived from them change accordingly. What to do
  • If you read the transaction VARIANT: data.sendersender, data.gasDatagasPayment, data.transaction.transactionskind.programmableTransaction.commands (plus the PTB command changes from transactions).
  • If you read the effects VARIANT: status flips to { "success": true/false }; executedEpochepoch; messageVersionversion; and mutated / created / sharedObjects / modifiedAtVersions are derived from changedObjects + unchangedConsensusObjects.
  • If you read the flattened top-level columns: check the column table below — most values are unchanged, but message_version, kind, and tx_signatures change.
Old (JSON-RPC) — sender, gas, and the PTB live under a data object, with txSignatures alongside:
New (gRPC) — flattened: sender, gasPayment, kind at the top level, no data wrapper, and a version/digest/bcs/expiration set:
Key path changes: data.sendersender; data.gasDatagasPayment (and paymentobjects); data.transaction.kindkind.kind (value ProgrammableTransactionPROGRAMMABLE_TRANSACTION); data.transaction.transactionskind.programmableTransaction.commands; data.messageVersion: "v1" → top-level version: 1.
status (execution result):
Top-level effects keys:To reconstruct the old mutated / created / sharedObjects / modifiedAtVersions arrays, derive them from changedObjects (grouped by id-operation / input-output state) and unchangedConsensusObjects.
Several top-level columns are extracted from inside transaction / effects. They remain populated across the cutover (Allium reads both the old and new source paths), but a few carry different values or nested shapes for gRPC rows:
These are the BCS-serialized transaction and effects. The gRPC and JSON-RPC APIs serialize them with different BCS envelopes / type versions, so the base64 bytes differ even though they decode to equivalent data.
  • raw_transaction — gRPC emits the inner TransactionData BCS; JSON-RPC emitted the full SenderSignedData envelope (transaction + signatures).
  • raw_effects — gRPC emits TransactionEffects in a newer BCS variant; the byte layout differs from the JSON-RPC form.
If you decode these fields with a BCS library, use a decoder aligned to the Sui gRPC (sui.rpc.v2) types.

events

Only parsed_json is affected, and only where an event’s Move type contains certain field kinds. Scalar fields, addresses, and numeric-string fields are unchanged. The event’s bcs field is byte-identical on both sources, so the underlying data is unchanged — only the parsed_json rendering differs. What changes
  1. vector<u8> (byte vectors) — a JSON array of byte integers under JSON-RPC, a base64 string under gRPC. Affected event types skew toward bridge / oracle events (e.g. Wormhole TransferRedeemed, Pyth PriceFeedUpdateEvent) that carry raw byte payloads.
  2. Single-field wrapper structs inside a vector — flattened by gRPC ([{ "name": "X" }][ "X" ]).
What to do
  • If you read a vector<u8> field, base64-decode the string to recover the bytes.
  • Watch for flattened single-field wrapper structs.
A byte-vector field (e.g. a Wormhole emitter address, a Pyth price-feed id, a payload):

object_changes

No action required. The changes here are additive or preserved:
  • Additive rows — a small number of additional object changes are surfaced: object-owned (dynamic-field) mutations, plus rare published rows that now carry a populated object_id / object_type where they were previously null. Row counts may be slightly higher on affected transactions (roughly ~1 in 100k rows); object_changes_count on transaction_blocks reflects this. No existing row’s values change.
  • owner — preserved. At the gRPC source, consensus-owned objects report { "AddressOwner": "0x…" } (dropping the ownership variant and its start_version). Allium restores the JSON-RPC form { "ConsensusAddressOwner": { "owner": "0x…", "start_version": … } } during ingestion. The owner field is unchanged for all ownership types (AddressOwner, ObjectOwner, Shared, ConsensusAddressOwner, Immutable).

balance_changes

sui.raw.balance_changes is unchanged — no action required.

Support

If this migration impacts your workflows or you need help, reach out to support@allium.so or your account team.