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

# Arc Token Transfers

> Unified token transfer activity for native USDC and ERC-20 assets on Arc.

export const TableSample = ({tableName, tableSchema}) => <>
    <div className="hidden dark:block">
      <iframe src={`https://dune.com/embeds/3419983/5785629?table_schema_t6f0df=${tableSchema}&table_name_t6f0df=${tableName}&darkMode=true`} style={{
  width: '100%',
  height: '500px',
  border: 'none',
  marginTop: '10px'
}} />
    </div>
    <div className="dark:hidden">
      <iframe src={`https://dune.com/embeds/3419983/5785629?table_schema_t6f0df=${tableSchema}&table_name_t6f0df=${tableName}`} style={{
  width: '100%',
  height: '500px',
  border: 'none',
  marginTop: '10px'
}} />
    </div>
  </>;

The `tokens_arc.transfers` table contains token movement data for assets on [Arc](https://www.arc.io), Circle's Layer-1 built for stablecoin payments. It brings native USDC movement and ERC-20 transfers into one table with a shared schema, prices, and normalized amounts.

This dataset includes:

* Native USDC movement, captured from Arc's EIP-7708 transfer logs
* ERC-20 transfer events for every other token on the chain
* Normalized amounts alongside raw base units
* USD valuation where a price is available for the token

<Info>
  Arc's gas token **is** USDC, so "native" rows on Arc are USDC movements rather than a separate gas asset. Native rows carry the zero address (`0x0000...0000`) in `contract_address`, following the same convention used across Dune's EVM balance and transfer tables.
</Info>

### Utility

The Arc transfers table gives you a single view of token movement on Arc, letting you:

* Track USDC flows between wallets and contracts, including gas-token movement
* Analyze transfer activity by token, counterparty, and day
* Measure USD volume for priced tokens
* Join to `tokens_arc.erc20` for token metadata, or to `prices_arc.minute` for pricing

### Methodology

Arc implements [EIP-7708](https://eips.ethereum.org/EIPS/eip-7708), which makes native value transfers emit a log rather than being visible only in traces. On Arc these logs are emitted by the system address `0xfffffffffffffffffffffffffffffffffffffffe` using the standard ERC-20 `Transfer` topic, with the amount in 18-decimal base units.

This table is built around that:

* **Native USDC** comes from the EIP-7708 system emitter at **18 decimals**, in place of the traces leg used on other EVM chains.
* **All other tokens** come from their own ERC-20 `Transfer` events.
* The **6-decimal USDC ERC-20 interface** at `0x3600000000000000000000000000000000000000` is **deliberately excluded**, because the EIP-7708 emitter already records the movements made through it. Including both would double-count the same transfer.

#### The two views of USDC

Arc exposes USDC two ways over the **same** pool of funds, and the distinction matters when you compare amounts:

| View                                                  | Decimals | Address                                      |
| ----------------------------------------------------- | -------- | -------------------------------------------- |
| Native (`eth_getBalance`, `msg.value`, EIP-7708 logs) | 18       | `0x0000000000000000000000000000000000000000` |
| USDC ERC-20 interface                                 | 6        | `0x3600000000000000000000000000000000000000` |

The two differ by exactly 10<sup>12</sup>: `eth_getBalance(addr) / 1e12 == balanceOf(addr)`. There is no wrapped USDC on Arc — the native asset satisfies `IERC20` directly. Because this table sources native movement from the EIP-7708 emitter, amounts for native USDC rows are normalized from the 18-decimal view.

<Warning>
  Some tokens on Arc use the ticker of a well-known asset without being that asset. Match on `contract_address`, not on `symbol`, when you care about which token you are measuring.
</Warning>

## Table Schema

| Column             | Type                       | Description                                              |
| ------------------ | -------------------------- | -------------------------------------------------------- |
| `unique_key`       | `VARCHAR`                  | Surrogate key identifying a unique transfer row          |
| `blockchain`       | `VARCHAR`                  | Blockchain name; always `arc`                            |
| `block_month`      | `DATE`                     | Month bucket derived from `block_date`; partition key    |
| `block_date`       | `DATE`                     | Date of the block                                        |
| `block_time`       | `TIMESTAMP WITH TIME ZONE` | Timestamp of the block                                   |
| `block_number`     | `BIGINT`                   | Block height                                             |
| `tx_hash`          | `VARBINARY`                | Transaction hash                                         |
| `evt_index`        | `INTEGER`                  | Log index of the transfer event within the block         |
| `trace_address`    | `ARRAY(BIGINT)`            | Trace address for the transfer when applicable           |
| `token_standard`   | `VARCHAR`                  | Token standard label: `native` or `erc20`                |
| `tx_from`          | `VARBINARY`                | Sender of the transaction containing the transfer        |
| `tx_to`            | `VARBINARY`                | Recipient of the transaction containing the transfer     |
| `tx_index`         | `BIGINT`                   | Index of the transaction within the block                |
| `from`             | `VARBINARY`                | Source address of the token movement                     |
| `to`               | `VARBINARY`                | Destination address of the token movement                |
| `contract_address` | `VARBINARY`                | Token contract address; the zero address for native USDC |
| `symbol`           | `VARCHAR`                  | Token symbol, from `tokens_arc.erc20`                    |
| `amount_raw`       | `UINT256`                  | Raw token amount in base units                           |
| `amount`           | `DOUBLE`                   | Amount normalized by the token's decimals                |
| `price_usd`        | `DOUBLE`                   | USD price used to compute `amount_usd`, when available   |
| `amount_usd`       | `DOUBLE`                   | USD value of the transfer, when a price is available     |
| `_updated_at`      | `TIMESTAMP WITH TIME ZONE` | Timestamp when the curated row was last written          |

<TableSample tableSchema="tokens_arc" tableName="transfers" />

## Sample Queries

**Daily USDC transfer volume**

Native USDC movement per day, with USD value:

```sql theme={null}
select
    block_date,
    count(*) as transfers,
    sum(amount) as usdc_volume,
    sum(amount_usd) as volume_usd
from tokens_arc.transfers
where token_standard = 'native'
    and block_date >= current_date - interval '30' day
group by 1
order by 1 desc
```

**Most active tokens by transfers and unique wallets**

Ranking tokens by activity, counting each address once whether it sent or received:

```sql theme={null}
with counts as (
    select
        contract_address,
        max(symbol) as symbol,
        count(*) as transfers
    from tokens_arc.transfers
    where block_date >= current_date - interval '7' day
    group by 1
), movements as (
    select contract_address, "from" as wallet from tokens_arc.transfers
    where block_date >= current_date - interval '7' day
    union all
    select contract_address, "to" as wallet from tokens_arc.transfers
    where block_date >= current_date - interval '7' day
), wallets as (
    select contract_address, count(distinct wallet) as wallets
    from movements
    -- exclude the zero address so mints and burns do not count as a participant
    where wallet != 0x0000000000000000000000000000000000000000
    group by 1
)
select
    c.contract_address,
    c.symbol,
    c.transfers,
    w.wallets
from counts c
left join wallets w on w.contract_address = c.contract_address
order by c.transfers desc
limit 25
```

**Transfer history for a single wallet**

Incoming and outgoing movement for one address:

```sql theme={null}
select
    block_time,
    symbol,
    contract_address,
    case when "to" = {{wallet}} then 'in' else 'out' end as direction,
    amount,
    amount_usd
from tokens_arc.transfers
where ("from" = {{wallet}} or "to" = {{wallet}})
    and block_date >= current_date - interval '90' day
order by block_time desc
```
