> ## 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.

# Bridges

> Cross-chain transfers that left Plasma or arrived on it, matched leg to leg.

A bridge moves value from one chain to another. Each move leaves an event on the chain it departs from and another on the chain it arrives at, and [`facts.bridge_transfers`](/docs/catalog/bridges/transfers) pairs those two events into one row. The table has no single `chain_id` column, because one transfer belongs to two chains: filter `source_chain_id = 'plasma'` for transfers leaving Plasma, `destination_chain_id = 'plasma'` for transfers arriving, or either for every transfer that touched the chain.

Every column is documented at [Bridges ▸ Transfers](/docs/catalog/bridges/transfers), including how an unmatched leg is recorded.

## Sample queries

<Warning>
  The table splits by day on `block_timestamp`. Bound that column in every query; without a bound the query reads the whole table.
</Warning>

<Tabs>
  <Tab title="Daily in and out">
    **Compare the value leaving Plasma with the value arriving each day.** Testing the source and destination columns separately inside the sum splits the same measure into the two directions.

    ```sql theme={null}
    select
        timestamp_trunc(block_timestamp, day) as day,
        sum(if(source_chain_id = 'plasma', transfer_amount_usd, 0)) as leaving_usd,
        sum(if(destination_chain_id = 'plasma', transfer_amount_usd, 0)) as arriving_usd
    from `facts.bridge_transfers`
    where block_timestamp >= timestamp('2026-08-16')
      and block_timestamp < timestamp('2026-08-23')
      and (source_chain_id = 'plasma' or destination_chain_id = 'plasma')
    group by day
    order by day
    ```
  </Tab>

  <Tab title="Where value went">
    **Find where the value leaving Plasma went.**

    ```sql theme={null}
    select
        destination_chain_id,
        count(*) as transfers,
        sum(transfer_amount_usd) as volume_usd
    from `facts.bridge_transfers`
    where block_timestamp >= timestamp('2026-08-16')
      and block_timestamp < timestamp('2026-08-23')
      and source_chain_id = 'plasma'
    group by destination_chain_id
    order by volume_usd desc
    limit 20
    ```
  </Tab>

  <Tab title="By bridge">
    **Rank the bridges by the Plasma value they carried.** `app_id` names the bridge that carried the transfer.

    ```sql theme={null}
    select
        apps.name,
        countif(transfers.source_chain_id = 'plasma') as leaving,
        countif(transfers.destination_chain_id = 'plasma') as arriving,
        sum(transfers.transfer_amount_usd) as volume_usd
    from `facts.bridge_transfers` as transfers
    join `dimensions.apps` as apps
        using (app_id)
    where transfers.block_timestamp >= timestamp('2026-08-16')
      and transfers.block_timestamp < timestamp('2026-08-23')
      and (transfers.source_chain_id = 'plasma' or transfers.destination_chain_id = 'plasma')
    group by apps.name
    order by volume_usd desc
    ```
  </Tab>
</Tabs>

## Notes

For any sum of value, use `transfer_amount_usd`: it prices the transfer once. `source_transfer_amount_usd` and `destination_transfer_amount_usd` price each leg on its own chain, and adding them counts one transfer twice; reach for them only when the question is the difference between the two ends.

Every row holds a full pair of columns for each side: chain, transaction hash, block, sender, recipient, token address and amount, prefixed `source_` or `destination_`. Some rows have only one leg: a transfer whose other side was never found still appears, carrying the leg it has, with `unmatched_reason` saying why the other is missing. Counting only matched pairs means requiring both chain columns to be present.

For daily totals, `metrics.bridge_tokens_daily` carries the answer per token at a fraction of the cost.
