Skip to main content
Migration complete — 24 September 2026.Sui’s raw datasets are now served from gRPC-sourced ingestion, replacing JSON-RPC ahead of Sui’s deprecation of JSON-RPC. Table names, schemas, and the vast majority of columns are unchanged. A few nested JSON fields changed shape — if a query returns unexpected results, check the table-by-table guide below.

Overview

Sui is deprecating its JSON-RPC interface in favor of gRPC. As a result, sui.raw data is now gRPC-sourced, with the changes below.

Cutover timeline

Mainnet cutover — complete, 24 September 2026

sui.raw.* is now gRPC-sourced. Queries relying on the changed fields below must use the new shapes.

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: MoveCall → moveCall, SplitCoins → splitCoins, TransferObjects → transferObjects, MergeCoins → mergeCoins, MakeMoveVec → makeMoveVector, Publish → publish, Upgrade → upgrade.
  2. Field naming inside the command — type_arguments → typeArguments.
  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_arguments → typeArguments; 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 (MoveCall→moveCall, type_arguments→typeArguments) 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.sender → sender, data.gasData → gasPayment, data.transaction.transactions → kind.programmableTransaction.commands (plus the PTB command changes from transactions).
  • If you read the effects VARIANT: status flips to { "success": true/false }; executedEpoch → epoch; messageVersion → version; 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.sender → sender; data.gasData → gasPayment (and payment → objects); data.transaction.kind → kind.kind (value ProgrammableTransaction → PROGRAMMABLE_TRANSACTION); data.transaction.transactions → kind.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 [email protected] or your account team.