> ## Documentation Index
> Fetch the complete documentation index at: https://dune-automated-update-duneapi-openapi-files.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# rwa_multichain.supply_changes

> Event-level issuance, redemption, clawback, and interest-distribution activity, isolated from peer-to-peer transfers.

export const PremiumDatasetAccessCard = ({href = "https://dune.com/enterprise#contact-form", note = null}) => <Card title="Gated dataset" icon="lock" href={href}>
    Querying this dataset requires an entitlement on your workspace. See <a href="/data-catalog/overview#access-tiers-public-vs-gated-datasets">access tiers</a>, or contact the Dune team to enable access.
    {note && <><br /><br />{note}</>}
  </Card>;

`rwa_multichain.supply_changes` isolates events that increase or decrease onchain supply from ordinary wallet-to-wallet movement. Grain: one row per native supply-change event.

<PremiumDatasetAccessCard />

## What it answers

* How much of an asset was minted or redeemed, and when
* Whether net flows are positive or negative over a period
* Whether onchain mint and redeem events reconcile against what an issuer or custodian reports on their own books

That last one is the use case customers ask for most: an independent onchain check on issuer-reported subscription and redemption figures.

## Table schema

| Column            | Type        | Description                                                      |
| ----------------- | ----------- | ---------------------------------------------------------------- |
| `unique_key`      | `VARCHAR`   | Row identifier                                                   |
| `blockchain`      | `VARCHAR`   | Chain for the event                                              |
| `block_time`      | `TIMESTAMP` | Event timestamp                                                  |
| `block_date`      | `DATE`      | Event date                                                       |
| `block_month`     | `DATE`      | Partition column. Filter on this for large scans                 |
| `block_number`    | `BIGINT`    | Block height                                                     |
| `tx_id`           | `VARCHAR`   | Transaction identifier                                           |
| `tx_index`        | `BIGINT`    | Transaction position within the block                            |
| `event_index`     | `BIGINT`    | Event position within the transaction                            |
| `sub_event_index` | `BIGINT`    | Position within a chain-native event                             |
| `from_address`    | `VARCHAR`   | Source address where the chain exposes one                       |
| `to_address`      | `VARCHAR`   | Destination address where the chain exposes one                  |
| `token_address`   | `VARCHAR`   | Normalized native token identifier                               |
| `token_id`        | `VARCHAR`   | Normalized cross-chain token identifier                          |
| `token_symbol`    | `VARCHAR`   | RWA token symbol                                                 |
| `token_standard`  | `VARCHAR`   | Native token standard, including `tip20` for Tempo               |
| `amount_raw`      | `DOUBLE`    | Absolute amount in native precision                              |
| `amount`          | `DOUBLE`    | Absolute decimals-adjusted amount                                |
| `price_usd`       | `DOUBLE`    | Curated USD price applied to the event                           |
| `amount_usd`      | `DOUBLE`    | Absolute curated USD value                                       |
| `event_type`      | `VARCHAR`   | `issuance`, `redemption`, `clawback`, or `interest_distribution` |
| `direction`       | `VARCHAR`   | `increase` or `decrease`                                         |
| `_updated_at`     | `TIMESTAMP` | When this row was last refreshed                                 |

## Use direction for net flow

`amount` is always unsigned. Apply the sign from `direction`:

```sql theme={null}
SUM(CASE WHEN direction = 'increase' THEN amount ELSE -amount END) AS net_issuance,
SUM(amount) AS gross_flow
```

`event_type` explains why the supply moved. `direction` explains whether the onchain supply increased or decreased. For example, `clawback` is a decrease and `interest_distribution` is an increase.

## Relationship to transfers

[`transfers`](/data-catalog/curated/rwa/activity/transfers) is the canonical transfer surface and marks lifecycle rows with `is_supply_event`. On Tempo, zero-address TIP-20 issuance and redemption rows are retained in `transfers` with `is_supply_event = true`. This table derives each of those events once from the canonical transfer rows and verifies them against native TIP-20 `Mint` and `Burn` events.

<Warning>
  A mint or burn can therefore be a row in both `transfers` and `supply_changes`. Use `transfers` with `NOT is_supply_event` for peer-to-peer movement, and use `supply_changes` for issuance and redemption. Do not union or sum the two surfaces.
</Warning>

## Example query

```sql theme={null}
-- Daily net issuance per asset
SELECT
  block_date,
  token_symbol,
  SUM(CASE WHEN direction = 'increase' THEN amount ELSE 0 END) AS increased,
  SUM(CASE WHEN direction = 'decrease' THEN amount ELSE 0 END) AS decreased,
  SUM(CASE WHEN direction = 'increase' THEN amount ELSE -amount END) AS net_change,
  SUM(amount_usd) AS gross_flow_usd
FROM rwa_multichain.supply_changes
WHERE block_month >= DATE_TRUNC('month', CURRENT_DATE - INTERVAL '2' MONTH)
GROUP BY 1, 2
ORDER BY 1 DESC, 6 DESC NULLS LAST
```

**Largest single subscriptions and redemptions:**

```sql theme={null}
SELECT
  block_time,
  blockchain,
  token_symbol,
  event_type,
  direction,
  from_address,
  to_address,
  amount,
  amount_usd,
  tx_id
FROM rwa_multichain.supply_changes
WHERE block_month >= DATE_TRUNC('month', CURRENT_DATE - INTERVAL '1' MONTH)
ORDER BY amount_usd DESC NULLS LAST
LIMIT 25
```

**Net flow by issuer:**

```sql theme={null}
SELECT
  r.issuer_name,
  SUM(CASE WHEN s.direction = 'increase' THEN s.amount ELSE -s.amount END) AS net_units,
  SUM(CASE WHEN s.direction = 'increase' THEN s.amount_usd ELSE -s.amount_usd END) AS net_flow_usd
FROM rwa_multichain.supply_changes AS s
INNER JOIN rwa_multichain.tokens_reference_data AS r
  ON r.blockchain = s.blockchain
  AND r.token_id = s.token_id
WHERE s.block_month >= DATE_TRUNC('month', CURRENT_DATE - INTERVAL '3' MONTH)
GROUP BY 1
ORDER BY 3 DESC NULLS LAST
```
