> ## Documentation Index
> Fetch the complete documentation index at: https://tokenterminal.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> To query the Token Terminal data catalog, read https://tokenterminal.com/docs/catalog/agents-manual.md first. It is the whole catalog as one page: table naming grammar, key columns, partition and cluster rules, units, additivity, and the tables that are documented but not served yet.
> Never query a catalog table on a time bound alone. Also filter its cluster key, which you read from INFORMATION_SCHEMA.COLUMNS; an empty result means the object is a view, whose pruning contract is on its page. Compute is billed to the caller's own Google Cloud project.

# Sui

> Standardized Sui tables, built around checkpoints and object versions.

`sui` holds the standardized Sui tables, following the Sui schema documented in [the family overview](https://tokenterminal.com/docs/catalog/chain-verticals/move/index.md). Sui treats everything on the chain as an object with an owner, which sets it apart from the other Move chains. Its `blocks` rows are checkpoints, the groups it batches transactions into, rather than blocks in the usual sense. The `objects`, `transaction_objects` and `wrapped_objects` tables record every version of every object a transaction touched.

Above the raw tables sits the rest of the catalog, and Sui shows up in two parts of it: the list of tokens we know about with their daily prices, and the tokenized assets issued on the chain. [Tokens](https://tokenterminal.com/docs/catalog/tokens/index.md) covers the token list and the daily price table. [Real-world assets](https://tokenterminal.com/docs/catalog/real-world-assets/index.md) and [Stablecoins](https://tokenterminal.com/docs/catalog/stablecoins/index.md) cover the tokenized assets and their daily tables.

## Tables

<table>
  <thead>
    <tr>
      <th width="190">Table</th>
      <th width="90">Since</th>
      <th>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`blocks`</td>
      <td>2023-05</td>
      <td>One row per checkpoint.</td>
    </tr>

    <tr>
      <td>`transactions`</td>
      <td>2023-05</td>
      <td>One row per transaction, with its gas costs and effects attached.</td>
    </tr>

    <tr>
      <td>`events`</td>
      <td>2023-05</td>
      <td>One row per event a transaction emitted.</td>
    </tr>

    <tr>
      <td>`move_calls`</td>
      <td>2023-05</td>
      <td>One row per Move call command a transaction executed.</td>
    </tr>

    <tr>
      <td>`move_packages`</td>
      <td>2023-05</td>
      <td>One row per package version published on chain.</td>
    </tr>

    <tr>
      <td>`objects`</td>
      <td>2023-04</td>
      <td>One row per object version a transaction wrote, with the object contents.</td>
    </tr>

    <tr>
      <td>`transaction_objects`</td>
      <td>2023-05</td>
      <td>One row per object a transaction touched, without the contents.</td>
    </tr>

    <tr>
      <td>`wrapped_objects`</td>
      <td>2023-05</td>
      <td>One row per object wrapped inside another object.</td>
    </tr>

    <tr>
      <td>`transaction_expirations`</td>
      <td>2026-01</td>
      <td>One row per transaction that expires by a validity window rather than by epoch.</td>
    </tr>

    <tr>
      <td>`funds_withdrawals`</td>
      <td>2026-05</td>
      <td>One row per address-balance withdrawal a transaction reserved.</td>
    </tr>

    <tr>
      <td>`accumulator_writes`</td>
      <td>2026-05</td>
      <td>One row per accumulator a transaction merged into or split from.</td>
    </tr>
  </tbody>
</table>

`objects` starts a few weeks earlier than the rest, on 2023-04-12. Use `transaction_objects` when the question is which objects a transaction touched, and `objects` when what was in them matters.

> [!WARNING]
>
> Every table except `blocks` splits by day on `block_timestamp`, and `blocks` on `timestamp`. Bound that column in every query; without a bound the query reads the whole table.

**blocks**

Sui groups its transactions into checkpoints rather than blocks, and a checkpoint is what this table holds. `blocks` contains one row per checkpoint.

<table>
  <thead>
    <tr>
      <th width="280">Column</th>
      <th width="130">Type</th>
      <th>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The time of the checkpoint. Partition column.</td>
    </tr>

    <tr>
      <td>`number`</td>
      <td>INT64</td>
      <td>The checkpoint sequence number.</td>
    </tr>

    <tr>
      <td>`digest`</td>
      <td>STRING</td>
      <td>The digest of the checkpoint.</td>
    </tr>

    <tr>
      <td>`previous_digest`</td>
      <td>STRING</td>
      <td>The digest of the previous checkpoint.</td>
    </tr>

    <tr>
      <td>`epoch`</td>
      <td>STRING</td>
      <td>The epoch of the checkpoint.</td>
    </tr>

    <tr>
      <td>`network_total_transactions`</td>
      <td>INT64</td>
      <td>The cumulative network transaction count at the checkpoint.</td>
    </tr>

    <tr>
      <td>`timestamp_ms`</td>
      <td>INT64</td>
      <td>The checkpoint timestamp, in Unix milliseconds.</td>
    </tr>

    <tr>
      <td>`sequence_number`</td>
      <td>INT64</td>
      <td>The checkpoint sequence number.</td>
    </tr>

    <tr>
      <td>`validator_signature`</td>
      <td>STRING</td>
      <td>The combined signature of the validators that approved the checkpoint.</td>
    </tr>

    <tr>
      <td>`transaction_count`</td>
      <td>INT64</td>
      <td>The number of transactions in the checkpoint.</td>
    </tr>
  </tbody>
</table>

**Daily checkpoints and transactions**

**Count checkpoints and the transactions in them per day.**

```sql theme={null}
select
    date(timestamp) as day,
    count(*) as checkpoints,
    sum(transaction_count) as transactions
from `sui.blocks`
where timestamp >= timestamp('2026-08-20')
  and timestamp < timestamp('2026-08-21')
group by day
```

**transactions**

`transactions` contains one row per transaction, with what it cost to run and its effects, the chain's own record of everything the transaction changed, attached to the row.

<table>
  <thead>
    <tr>
      <th width="280">Column</th>
      <th width="130">Type</th>
      <th>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`block_timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The time of the containing checkpoint. Partition column.</td>
    </tr>

    <tr>
      <td>`block_number`</td>
      <td>INT64</td>
      <td>The sequence number of the containing checkpoint.</td>
    </tr>

    <tr>
      <td>`digest`</td>
      <td>STRING</td>
      <td>The digest of the transaction, the identifier used everywhere else.</td>
    </tr>

    <tr>
      <td>`checkpoint`</td>
      <td>INT64</td>
      <td>The checkpoint sequence number.</td>
    </tr>

    <tr>
      <td>`timestamp_ms`</td>
      <td>INT64</td>
      <td>The checkpoint timestamp, in Unix milliseconds.</td>
    </tr>

    <tr>
      <td>`sender`</td>
      <td>STRING</td>
      <td>The sending address.</td>
    </tr>

    <tr>
      <td>`transaction_kind`</td>
      <td>STRING</td>
      <td>The transaction kind, such as programmable transaction.</td>
    </tr>

    <tr>
      <td>`is_system_txn`</td>
      <td>BOOL</td>
      <td>Whether the transaction is a system transaction.</td>
    </tr>

    <tr>
      <td>`is_sponsored_tx`</td>
      <td>BOOL</td>
      <td>Whether the gas was paid by a sponsor.</td>
    </tr>

    <tr>
      <td>`status`</td>
      <td>STRING</td>
      <td>The execution status: `Success` or `Failure`.</td>
    </tr>

    <tr>
      <td>`computation_cost`</td>
      <td>BIGNUMERIC</td>
      <td>The computation cost, in MIST.</td>
    </tr>

    <tr>
      <td>`storage_cost`</td>
      <td>BIGNUMERIC</td>
      <td>The storage cost, in MIST.</td>
    </tr>

    <tr>
      <td>`storage_rebate`</td>
      <td>BIGNUMERIC</td>
      <td>The storage rebate, in MIST.</td>
    </tr>

    <tr>
      <td>`non_refundable_storage_fee`</td>
      <td>BIGNUMERIC</td>
      <td>The non-refundable part of the storage fee, in MIST.</td>
    </tr>

    <tr>
      <td>`total_gas_cost`</td>
      <td>BIGNUMERIC</td>
      <td>The total gas cost, in MIST.</td>
    </tr>

    <tr>
      <td>`gas_budget`</td>
      <td>BIGNUMERIC</td>
      <td>The gas budget set by the sender.</td>
    </tr>

    <tr>
      <td>`gas_price`</td>
      <td>BIGNUMERIC</td>
      <td>The gas price paid.</td>
    </tr>

    <tr>
      <td>`gas_owner`</td>
      <td>STRING</td>
      <td>The address paying the gas.</td>
    </tr>

    <tr>
      <td>`executed_epoch`</td>
      <td>INT64</td>
      <td>The epoch the transaction executed in.</td>
    </tr>

    <tr>
      <td>`expiration_epoch`</td>
      <td>INT64</td>
      <td>The last epoch the transaction can execute in. NULL for a transaction with no epoch limit.</td>
    </tr>

    <tr>
      <td>`transaction_json`</td>
      <td>STRING</td>
      <td>The sender, kind, expiration kind and gas data, as JSON text.</td>
    </tr>

    <tr>
      <td>`effects_json`</td>
      <td>STRING</td>
      <td>The transaction digest, events digest, Lamport version and dependencies from the execution effects, as JSON text.</td>
    </tr>

    <tr>
      <td>`balance_changes_json`</td>
      <td>STRING</td>
      <td>The balance changes, as JSON text.</td>
    </tr>

    <tr>
      <td>`signature_schemes`</td>
      <td>ARRAY\<STRING></td>
      <td>The scheme of each signature, in order: `Ed25519`, `Secp256k1`, `Secp256r1`, `Multisig`, `Bls12381`, `Zklogin`, `Passkey` or `Mldsa65`.</td>
    </tr>

    <tr>
      <td>`signatures`</td>
      <td>ARRAY\<STRING></td>
      <td>Each signature, serialized and base64-encoded, in order. The first byte is the scheme flag.</td>
    </tr>

    <tr>
      <td>`error_kind`</td>
      <td>STRING</td>
      <td>The error a failed transaction stopped on, such as `MoveAbort` or `InsufficientGas`. NULL on success.</td>
    </tr>

    <tr>
      <td>`error_command_index`</td>
      <td>INT64</td>
      <td>The index of the command that failed. NULL for errors outside a command, such as `InsufficientGas`.</td>
    </tr>

    <tr>
      <td>`abort_code`</td>
      <td>NUMERIC</td>
      <td>The abort code of a `MoveAbort`.</td>
    </tr>

    <tr>
      <td>`abort_package`</td>
      <td>STRING</td>
      <td>The package of the function that aborted.</td>
    </tr>

    <tr>
      <td>`abort_module`</td>
      <td>STRING</td>
      <td>The module of the function that aborted.</td>
    </tr>

    <tr>
      <td>`abort_function`</td>
      <td>STRING</td>
      <td>The name of the function that aborted.</td>
    </tr>

    <tr>
      <td>`gas_coins`</td>
      <td>ARRAY\<STRUCT\<object\_id STRING, version INT64, digest STRING>></td>
      <td>The coin objects paying for gas, at the version and digest the transaction read. Empty when gas is paid from an address balance.</td>
    </tr>

    <tr>
      <td>`gas_object_id`</td>
      <td>STRING</td>
      <td>The coin object charged for gas, which the other gas coins merge into.</td>
    </tr>

    <tr>
      <td>`command_count`</td>
      <td>INT64</td>
      <td>The number of commands in a programmable transaction.</td>
    </tr>

    <tr>
      <td>`input_count`</td>
      <td>INT64</td>
      <td>The number of inputs to a programmable transaction.</td>
    </tr>

    <tr>
      <td>`command_types`</td>
      <td>ARRAY\<STRING></td>
      <td>The type of each command, in order: `MoveCall`, `TransferObjects`, `SplitCoins`, `MergeCoins`, `Publish`, `MakeMoveVec` or `Upgrade`.</td>
    </tr>

    <tr>
      <td>`unchanged_consensus_object_ids`</td>
      <td>ARRAY\<STRING></td>
      <td>The shared objects the transaction read without changing them.</td>
    </tr>

    <tr>
      <td>`transaction_index`</td>
      <td>INT64</td>
      <td>The position of the transaction in its checkpoint. NULL until the source serves it, and before 2026-01-28.</td>
    </tr>
  </tbody>
</table>

**Daily transactions by kind**

**Count transactions and successes by transaction kind on one day.**

```sql theme={null}
select
    transaction_kind,
    count(*) as transactions,
    countif(status = 'Success') as successful
from `sui.transactions`
where block_timestamp >= timestamp('2026-08-20')
  and block_timestamp < timestamp('2026-08-21')
group by transaction_kind
order by transactions desc
```

**events**

An event is a note that published code writes when something happens inside it. `events` contains one row per event a transaction produced.

<table>
  <thead>
    <tr>
      <th width="280">Column</th>
      <th width="130">Type</th>
      <th>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`block_timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The time of the containing checkpoint. Partition column.</td>
    </tr>

    <tr>
      <td>`block_number`</td>
      <td>INT64</td>
      <td>The sequence number of the containing checkpoint.</td>
    </tr>

    <tr>
      <td>`transaction_digest`</td>
      <td>STRING</td>
      <td>The digest of the emitting transaction.</td>
    </tr>

    <tr>
      <td>`checkpoint`</td>
      <td>STRING</td>
      <td>The checkpoint sequence number as a string.</td>
    </tr>

    <tr>
      <td>`epoch`</td>
      <td>STRING</td>
      <td>The epoch of the event.</td>
    </tr>

    <tr>
      <td>`event_index`</td>
      <td>INT64</td>
      <td>The position of the event within the transaction.</td>
    </tr>

    <tr>
      <td>`package_id`</td>
      <td>STRING</td>
      <td>The package that defines the event type.</td>
    </tr>

    <tr>
      <td>`module`</td>
      <td>STRING</td>
      <td>The module that defines the event type.</td>
    </tr>

    <tr>
      <td>`sender`</td>
      <td>STRING</td>
      <td>The sender of the emitting transaction.</td>
    </tr>

    <tr>
      <td>`event_type`</td>
      <td>STRING</td>
      <td>The Move type of the event.</td>
    </tr>

    <tr>
      <td>`event_json`</td>
      <td>STRING</td>
      <td>The event payload, as JSON text.</td>
    </tr>
  </tbody>
</table>

**Events by module**

**Rank the modules emitting the most events on one day.**

```sql theme={null}
select
    module,
    count(*) as events
from `sui.events`
where block_timestamp >= timestamp('2026-08-20')
  and block_timestamp < timestamp('2026-08-21')
group by module
order by events desc
limit 20
```

**move\_calls**

A Sui transaction is a list of commands, and a Move call is the command that runs a function in published code. `move_calls` contains one row per such call, naming the code and function it ran.

<table>
  <thead>
    <tr>
      <th width="280">Column</th>
      <th width="130">Type</th>
      <th>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`block_timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The time of the containing checkpoint. Partition column.</td>
    </tr>

    <tr>
      <td>`block_number`</td>
      <td>INT64</td>
      <td>The sequence number of the containing checkpoint.</td>
    </tr>

    <tr>
      <td>`transaction_digest`</td>
      <td>STRING</td>
      <td>The digest of the calling transaction.</td>
    </tr>

    <tr>
      <td>`checkpoint`</td>
      <td>STRING</td>
      <td>The checkpoint sequence number as a string.</td>
    </tr>

    <tr>
      <td>`epoch`</td>
      <td>STRING</td>
      <td>The epoch of the call.</td>
    </tr>

    <tr>
      <td>`cmd_index`</td>
      <td>INT64</td>
      <td>The position of the command within the transaction.</td>
    </tr>

    <tr>
      <td>`package`</td>
      <td>STRING</td>
      <td>The called package.</td>
    </tr>

    <tr>
      <td>`module`</td>
      <td>STRING</td>
      <td>The called module.</td>
    </tr>

    <tr>
      <td>`function`</td>
      <td>STRING</td>
      <td>The called function.</td>
    </tr>
  </tbody>
</table>

**Most-called functions**

**Rank the most-called package functions on one day.**

```sql theme={null}
select
    package,
    module,
    function,
    count(*) as calls
from `sui.move_calls`
where block_timestamp >= timestamp('2026-08-20')
  and block_timestamp < timestamp('2026-08-21')
group by package, module, function
order by calls desc
limit 20
```

**move\_packages**

A package is a published bundle of Move code, and upgrading one publishes a new version of it rather than replacing what was there. `move_packages` contains one row per version.

<table>
  <thead>
    <tr>
      <th width="280">Column</th>
      <th width="130">Type</th>
      <th>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`block_timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The time of the containing checkpoint. Partition column.</td>
    </tr>

    <tr>
      <td>`block_number`</td>
      <td>INT64</td>
      <td>The sequence number of the containing checkpoint.</td>
    </tr>

    <tr>
      <td>`transaction_digest`</td>
      <td>STRING</td>
      <td>The digest of the publishing transaction.</td>
    </tr>

    <tr>
      <td>`checkpoint`</td>
      <td>STRING</td>
      <td>The checkpoint sequence number as a string.</td>
    </tr>

    <tr>
      <td>`epoch`</td>
      <td>STRING</td>
      <td>The epoch of the publish.</td>
    </tr>

    <tr>
      <td>`package_id`</td>
      <td>STRING</td>
      <td>The identifier of the package version.</td>
    </tr>

    <tr>
      <td>`package_version`</td>
      <td>INT64</td>
      <td>The version number of the package.</td>
    </tr>

    <tr>
      <td>`original_package_id`</td>
      <td>STRING</td>
      <td>The identifier of the first version of the package.</td>
    </tr>
  </tbody>
</table>

**Daily package publishes**

**Count package versions published per day over one week.**

```sql theme={null}
select
    date(block_timestamp) as day,
    count(*) as packages_published
from `sui.move_packages`
where block_timestamp >= timestamp('2026-08-16')
  and block_timestamp < timestamp('2026-08-23')
group by day
order by day
```

**objects**

On Sui, everything a user holds is an object with an owner, and changing one produces a new version of it rather than editing it in place. `objects` contains one row per object version a transaction wrote, with the object's contents on the row.

<table>
  <thead>
    <tr>
      <th width="280">Column</th>
      <th width="130">Type</th>
      <th>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`block_timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The time of the containing checkpoint. Partition column.</td>
    </tr>

    <tr>
      <td>`block_number`</td>
      <td>INT64</td>
      <td>The sequence number of the containing checkpoint.</td>
    </tr>

    <tr>
      <td>`transaction_digest`</td>
      <td>STRING</td>
      <td>The digest of the writing transaction.</td>
    </tr>

    <tr>
      <td>`checkpoint`</td>
      <td>STRING</td>
      <td>The checkpoint sequence number as a string.</td>
    </tr>

    <tr>
      <td>`object_id`</td>
      <td>STRING</td>
      <td>The identifier of the object.</td>
    </tr>

    <tr>
      <td>`version`</td>
      <td>INT64</td>
      <td>The version of the object after the write.</td>
    </tr>

    <tr>
      <td>`digest_hash`</td>
      <td>STRING</td>
      <td>The digest of the object version.</td>
    </tr>

    <tr>
      <td>`object_status`</td>
      <td>STRING</td>
      <td>The status of the write, such as created or mutated.</td>
    </tr>

    <tr>
      <td>`owner_type`</td>
      <td>STRING</td>
      <td>The ownership kind, such as address, object or shared.</td>
    </tr>

    <tr>
      <td>`owner_address`</td>
      <td>STRING</td>
      <td>The owning address, when address-owned.</td>
    </tr>

    <tr>
      <td>`initial_shared_version`</td>
      <td>INT64</td>
      <td>The version at which the object became shared.</td>
    </tr>

    <tr>
      <td>`storage_rebate`</td>
      <td>INT64</td>
      <td>The storage rebate held by the object.</td>
    </tr>

    <tr>
      <td>`has_public_transfer`</td>
      <td>BOOL</td>
      <td>Whether the object can be transferred publicly.</td>
    </tr>

    <tr>
      <td>`object_type`</td>
      <td>STRING</td>
      <td>The Move type of the object.</td>
    </tr>

    <tr>
      <td>`object_json`</td>
      <td>STRING</td>
      <td>The object contents, as JSON text.</td>
    </tr>
  </tbody>
</table>

**Object writes by status**

**Count object writes by status on one day.**

```sql theme={null}
select
    object_status,
    count(*) as objects
from `sui.objects`
where block_timestamp >= timestamp('2026-08-20')
  and block_timestamp < timestamp('2026-08-21')
group by object_status
order by objects desc
```

**transaction\_objects**

`transaction_objects` contains one row per object a transaction touched, without the contents. Use it when the question is which objects were involved rather than what was in them.

<table>
  <thead>
    <tr>
      <th width="280">Column</th>
      <th width="130">Type</th>
      <th>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`block_timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The time of the containing checkpoint. Partition column.</td>
    </tr>

    <tr>
      <td>`block_number`</td>
      <td>INT64</td>
      <td>The sequence number of the containing checkpoint.</td>
    </tr>

    <tr>
      <td>`transaction_digest`</td>
      <td>STRING</td>
      <td>The digest of the touching transaction.</td>
    </tr>

    <tr>
      <td>`checkpoint`</td>
      <td>STRING</td>
      <td>The checkpoint sequence number as a string.</td>
    </tr>

    <tr>
      <td>`object_id`</td>
      <td>STRING</td>
      <td>The identifier of the object.</td>
    </tr>

    <tr>
      <td>`version`</td>
      <td>INT64</td>
      <td>The version of the object after the transaction, or the transaction's version for a deleted object.</td>
    </tr>

    <tr>
      <td>`object_status`</td>
      <td>STRING</td>
      <td>`Created`, `Mutated` or `Deleted`. Before 2026-03-01 a created object is `Mutated`.</td>
    </tr>
  </tbody>
</table>

**Touched objects by status**

**Count objects touched by status on one day.**

```sql theme={null}
select
    object_status,
    count(*) as touches
from `sui.transaction_objects`
where block_timestamp >= timestamp('2026-08-20')
  and block_timestamp < timestamp('2026-08-21')
group by object_status
order by touches desc
```

**wrapped\_objects**

An object can be placed inside another object, which is called wrapping: a card held in a deck, say. The inner one then belongs to the outer one instead of to an address. `wrapped_objects` contains one row per object a transaction wrapped.

<table>
  <thead>
    <tr>
      <th width="280">Column</th>
      <th width="130">Type</th>
      <th>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`block_timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The time of the containing checkpoint. Partition column.</td>
    </tr>

    <tr>
      <td>`block_number`</td>
      <td>INT64</td>
      <td>The sequence number of the containing checkpoint.</td>
    </tr>

    <tr>
      <td>`transaction_digest`</td>
      <td>STRING</td>
      <td>The digest of the wrapping transaction.</td>
    </tr>

    <tr>
      <td>`checkpoint`</td>
      <td>STRING</td>
      <td>The checkpoint sequence number as a string.</td>
    </tr>

    <tr>
      <td>`object_id`</td>
      <td>STRING</td>
      <td>The identifier of the wrapped object.</td>
    </tr>

    <tr>
      <td>`root_object_id`</td>
      <td>STRING</td>
      <td>The identifier of the object it is wrapped inside.</td>
    </tr>

    <tr>
      <td>`root_object_version`</td>
      <td>INT64</td>
      <td>The version of the enclosing object.</td>
    </tr>
  </tbody>
</table>

**Daily wraps**

**Count objects wrapped per day over one week.**

```sql theme={null}
select
    date(block_timestamp) as day,
    count(*) as wrapped
from `sui.wrapped_objects`
where block_timestamp >= timestamp('2026-08-16')
  and block_timestamp < timestamp('2026-08-23')
group by day
order by day
```

**transaction\_expirations**

A Sui transaction can expire at the end of an epoch or outside a validity window of epochs and timestamps. `transaction_expirations` contains one row per transaction with a validity window.

<table>
  <thead>
    <tr>
      <th width="280">Column</th>
      <th width="130">Type</th>
      <th>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`block_timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The time of the containing checkpoint. Partition column.</td>
    </tr>

    <tr>
      <td>`block_number`</td>
      <td>INT64</td>
      <td>The sequence number of the containing checkpoint.</td>
    </tr>

    <tr>
      <td>`transaction_digest`</td>
      <td>STRING</td>
      <td>The digest of the transaction.</td>
    </tr>

    <tr>
      <td>`checkpoint`</td>
      <td>INT64</td>
      <td>The checkpoint sequence number.</td>
    </tr>

    <tr>
      <td>`expiration_kind`</td>
      <td>STRING</td>
      <td>`ValidDuring` or `Validity`, the same names as `expiration` in the `transaction_json` of `transactions`.</td>
    </tr>

    <tr>
      <td>`min_epoch`</td>
      <td>INT64</td>
      <td>The first epoch the transaction is valid in.</td>
    </tr>

    <tr>
      <td>`max_epoch`</td>
      <td>INT64</td>
      <td>The last epoch the transaction is valid in.</td>
    </tr>

    <tr>
      <td>`min_timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The earliest time the transaction is valid.</td>
    </tr>

    <tr>
      <td>`max_timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The latest time the transaction is valid.</td>
    </tr>

    <tr>
      <td>`chain`</td>
      <td>STRING</td>
      <td>The identifier of the chain the transaction is valid on.</td>
    </tr>

    <tr>
      <td>`nonce`</td>
      <td>INT64</td>
      <td>The nonce that makes the transaction unique within the window.</td>
    </tr>

    <tr>
      <td>`allowed_proposers_epoch`</td>
      <td>INT64</td>
      <td>For `Validity`, the epoch of the allowed proposers.</td>
    </tr>

    <tr>
      <td>`allowed_proposers`</td>
      <td>ARRAY\<INT64></td>
      <td>For `Validity`, the validators allowed to propose the transaction.</td>
    </tr>
  </tbody>
</table>

**Windowed transactions by kind**

**Count transactions with a validity window by kind on one day.**

```sql theme={null}
select
    expiration_kind,
    count(*) as transactions
from `sui.transaction_expirations`
where block_timestamp >= timestamp('2026-08-20')
  and block_timestamp < timestamp('2026-08-21')
group by expiration_kind
```

**funds\_withdrawals**

A transaction draws on an address balance, rather than on coin objects, by reserving a withdrawal as one of its inputs. `funds_withdrawals` contains one row per withdrawal input.

<table>
  <thead>
    <tr>
      <th width="280">Column</th>
      <th width="130">Type</th>
      <th>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`block_timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The time of the containing checkpoint. Partition column.</td>
    </tr>

    <tr>
      <td>`block_number`</td>
      <td>INT64</td>
      <td>The sequence number of the containing checkpoint.</td>
    </tr>

    <tr>
      <td>`transaction_digest`</td>
      <td>STRING</td>
      <td>The digest of the transaction.</td>
    </tr>

    <tr>
      <td>`checkpoint`</td>
      <td>INT64</td>
      <td>The checkpoint sequence number.</td>
    </tr>

    <tr>
      <td>`input_index`</td>
      <td>INT64</td>
      <td>The position of the withdrawal among the transaction's inputs.</td>
    </tr>

    <tr>
      <td>`amount`</td>
      <td>BIGNUMERIC</td>
      <td>The most the transaction may withdraw, in the coin's smallest unit.</td>
    </tr>

    <tr>
      <td>`coin_type`</td>
      <td>STRING</td>
      <td>The coin type withdrawn, such as `0x…0002::sui::SUI`.</td>
    </tr>

    <tr>
      <td>`source`</td>
      <td>STRING</td>
      <td>Whose balance pays: `Sender`, `Sponsor` or `SenderAllowance`.</td>
    </tr>

    <tr>
      <td>`funder`</td>
      <td>STRING</td>
      <td>For `SenderAllowance`, the address whose balance pays.</td>
    </tr>

    <tr>
      <td>`allowance`</td>
      <td>STRING</td>
      <td>For `SenderAllowance`, the allowance object the withdrawal draws on.</td>
    </tr>
  </tbody>
</table>

**Withdrawals by coin**

**Count withdrawal inputs and reserved amounts by coin type on one day.**

```sql theme={null}
select
    coin_type,
    count(*) as withdrawals,
    sum(amount) as reserved
from `sui.funds_withdrawals`
where block_timestamp >= timestamp('2026-08-20')
  and block_timestamp < timestamp('2026-08-21')
group by coin_type
order by withdrawals desc
```

**accumulator\_writes**

An accumulator is an object that many transactions add to and take from, such as an address balance of one coin. `accumulator_writes` contains one row per accumulator a transaction wrote, with the amount it merged or split.

<table>
  <thead>
    <tr>
      <th width="280">Column</th>
      <th width="130">Type</th>
      <th>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`block_timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The time of the containing checkpoint. Partition column.</td>
    </tr>

    <tr>
      <td>`block_number`</td>
      <td>INT64</td>
      <td>The sequence number of the containing checkpoint.</td>
    </tr>

    <tr>
      <td>`transaction_digest`</td>
      <td>STRING</td>
      <td>The digest of the transaction.</td>
    </tr>

    <tr>
      <td>`checkpoint`</td>
      <td>INT64</td>
      <td>The checkpoint sequence number.</td>
    </tr>

    <tr>
      <td>`object_id`</td>
      <td>STRING</td>
      <td>The identifier of the accumulator object.</td>
    </tr>

    <tr>
      <td>`address`</td>
      <td>STRING</td>
      <td>The address the accumulator belongs to.</td>
    </tr>

    <tr>
      <td>`accumulator_type`</td>
      <td>STRING</td>
      <td>The Move type of the accumulator, such as `0x…0002::balance::Balance<0x…0002::sui::SUI>`.</td>
    </tr>

    <tr>
      <td>`coin_type`</td>
      <td>STRING</td>
      <td>For an address balance, the coin type it holds. NULL for other accumulators.</td>
    </tr>

    <tr>
      <td>`operation`</td>
      <td>STRING</td>
      <td>`Merge`, which adds to the accumulator, or `Split`, which takes from it.</td>
    </tr>

    <tr>
      <td>`integer_value`</td>
      <td>BIGNUMERIC</td>
      <td>The amount merged or split, in the coin's smallest unit.</td>
    </tr>

    <tr>
      <td>`integer_tuple`</td>
      <td>ARRAY\<BIGNUMERIC></td>
      <td>For a pair-valued accumulator, the pair. Empty otherwise.</td>
    </tr>

    <tr>
      <td>`event_digests`</td>
      <td>ARRAY\<STRUCT\<event\_index INT64, digest STRING>></td>
      <td>For an event-stream accumulator, the events added. Empty otherwise.</td>
    </tr>
  </tbody>
</table>

**Address-balance flows by coin**

**Sum merges and splits into address balances by coin type on one day.**

```sql theme={null}
select
    coin_type,
    sum(if(operation = 'Merge', integer_value, 0)) as merged,
    sum(if(operation = 'Split', integer_value, 0)) as split
from `sui.accumulator_writes`
where block_timestamp >= timestamp('2026-08-20')
  and block_timestamp < timestamp('2026-08-21')
  and coin_type is not null
group by coin_type
order by merged desc
```

## Sample queries

**Transactions by kind**

**Count transactions and gas costs by transaction kind on one day.**

```sql theme={null}
select
    transaction_kind,
    count(*) as transactions,
    sum(total_gas_cost) as total_gas_cost_mist
from `sui.transactions`
where block_timestamp >= timestamp('2026-08-20')
  and block_timestamp < timestamp('2026-08-21')
group by transaction_kind
order by transactions desc
```

**Priced tokens, daily**

**Count the Sui tokens that have a daily USD price, day by day.**

```sql theme={null}
select
    date(timestamp) as day,
    count(distinct token_id) as priced_tokens
from `metrics_tokens.price_daily`
where timestamp >= timestamp('2026-08-16')
  and timestamp < timestamp('2026-08-23')
  and chain_id = 'sui'
group by day
order by day
```

**Tokenized assets by market cap**

**Rank the tokenized assets deployed on Sui by circulating market cap.**

```sql theme={null}
select
    assets.symbol,
    assets.asset_type,
    daily.market_cap_circulating
from `metrics_asset_tokens.market_cap_circulating_daily` as daily
join `dimensions.asset_tokens` as deployments
    using (asset_token_id)
join `dimensions.assets` as assets
    using (asset_id)
where daily.timestamp >= timestamp('2026-08-22')
  and daily.timestamp < timestamp('2026-08-23')
  and deployments.chain_id = 'sui'
order by daily.market_cap_circulating desc
limit 20
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.