---
title: "Chains and tokens"
description: "READ BEFORE OFFERING A CHAIN: which chain/network/token combinations confirm on api.thru.la today, contract addresses and decimals, and the ones the API accepts but never confirms"
source: https://docs.thru.la/supported-chains.md
html: https://docs.thru.la/supported-chains
index: https://docs.thru.la/llms.txt
---
# Chains and tokens

The API accepts more chains and tokens than it can confirm. A payment on a combination that is not watched is created normally, shows an address, and **never confirms**, with no error anywhere. Offer your customers only the combinations marked **live** below.

There is no endpoint that lists payable combinations; this page is the list. It was last checked on 2026-09-19.

## Mainnet

| `chain` | `token` | Contract address or coin type | Decimals | Confirmations | Live on api.thru.la |
|---|---|---|---|---|---|
| `bnb` | `USDC` | `0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d` | 18 | 15 | **live** |
| `bnb` | `BNB` | native | 18 | 15 | **live** |
| `bnb` | `USDT` | `0x55d398326f99059fF775485246999027B3197955` | 18 | 15 | not yet |
| `sui` | `USDC` | `0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC` | 6 | 1 | **live** |
| `sui` | `SUI` | native | 9 | 1 | **live** |
| `sui` | `USDT` | `0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT` | 6 | 1 | not yet |
| `arc` | `USDC` | native (see Arc below) | 18 | 1 | **live** |
| `robinhood` | `USDG` | `0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168` | 6 | 20 | **live** |
| `robinhood` | `ETH` | native | 18 | 20 | **live** |
| `base` | `USDC` | `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` | 6 | 20 | not yet |
| `base` | `USDT` | `0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2` | 6 | 20 | not yet |
| `base` | `ETH` | native | 18 | 20 | not yet |
| `solana` | `USDC` | `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v` | 6 | 32 | not yet |
| `solana` | `USDT` | `Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB` | 6 | 32 | not yet |
| `solana` | `SOL` | native | 9 | 32 | not yet |
| `tron` | `USDT` | `TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t` | 6 | 19 | not yet |
| `tron` | `USDC` | `TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8` | 6 | 19 | not yet |
| `tron` | `TRX` | native | 6 | 19 | not yet |

So the stablecoins you can accept on mainnet today are **USDC on BNB Chain, USDC on Sui, USDC on Arc and USDG on Robinhood Chain**. "Not yet" rows are registered, so the API accepts them, but api.thru.la is not watching them, and a payment made with one would not be detected. Do not offer them until this page marks them live.

Native coins (BNB, SUI, ETH) are live but are charged in coins: thru does no currency conversion, so `"amount": "25"` with `"token": "BNB"` asks for 25 BNB. For dollar prices, use stablecoins.

## Testnet

| `chain` | `token` | Contract address or coin type | Decimals | Live on api.thru.la |
|---|---|---|---|---|
| `arc` | `USDC` | native | 18 | **live** |
| `bnb` | `BNB`, `USDC` (`0x64544969ed7EBf5f083679233325356EbE738930`) | | 18, 18 | not yet |
| `base` | `ETH`, `USDC` (`0x036CbD53842c5426634e7929541eC2318f3dCF7e`) | | 18, 6 | not yet |
| `sui` | `SUI`, `USDC` (`0xa1ec7fc00a6f40db9693ad1415d0c193ad3906494428cf252621037bd7117e29::usdc::USDC`) | | 9, 6 | not yet |
| `solana` | `SOL`, `USDC` (`4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU`) | | 9, 6 | not yet |
| `robinhood` | `ETH` only | native | 18 | not yet |
| `tron` | `TRX` only | native | 6 | not yet |

**Test on Arc testnet** (`"chain": "arc", "network": "testnet", "token": "USDC"`), with test USDC from Circle's faucet. It is the only testnet api.thru.la watches today.

## Rails a custom-amount product may use

A `custom_amount` product (`products`) charges the session amount **in units of the rail's token, 1:1**: `"amount": "37"` on a USDC rail asks for 37 USDC, and on a BNB rail it asks for 37 BNB. thru does no currency conversion, so for dollar-denominated credit list **stablecoin rails only**. `POST /v1/products` and `PATCH /v1/products/:id` refuse a rail (the product's own chain/token, every `networks` row and every `enabledChains` entry) whose token is not registered for that chain and network, or whose chain thru does not watch — with `<token> on <chain>/<network> is not a token thru detects` or `<chain> cannot be a rail on a custom_amount product`. As of the date above, the stablecoin rails that are live are:

- mainnet: `USDC` on `bnb`, `USDC` on `sui`, `USDC` on `arc`, `USDG` on `robinhood`;
- testnet: `USDC` on `arc`.

Native coins (BNB, SUI, ETH) pass the check and are charged in coins. Fixed-price products are not restricted.

## Chains the API accepts but never confirms

- `ethereum`, `polygon`, `arbitrum`, `optimism`, `avalanche`, `fantom`, `gnosis`, `linea`, `scroll`, `zksync`, `mantle`, `celo`, `blast` and `bsc` are accepted by `POST /v1/payments` (`201`), but no token is registered for them, so a payment on them never confirms. `ethereum` is the one people reach for first; it is not live. For BNB Smart Chain, use `bnb`, not `bsc`.
- A token that is not in the tables above is also accepted and never confirms. For example, `"token": "DAI"` on `bnb` creates a payment that will never be detected.

## Chains the API rejects

`aptos`, `bitcoin`, `litecoin`, `dogecoin`, `xrp`, `ton`, `near`, `cosmos`, `polkadot` and `cardano` return `400` on create, because thru has no wallet on them that could receive funds.

## Notes per chain

- **Arc.** USDC is Arc's native asset (it also pays gas), registered with 18 decimals and no contract address. Arc also exposes the same balance through an ERC-20 interface at `0x3600000000000000000000000000000000000000` with 6 decimals. That is the same money, not a second token, and thru does not watch it. Payers must send USDC as a normal wallet transfer of the native asset.
- **Native coins on EVM chains** (BNB, ETH on Robinhood Chain, USDC on Arc) are detected from the value of a top-level transaction. A native transfer made from inside a smart contract, which many smart-contract wallets and some exchange withdrawals do, is not detected. Tokens such as USDC on BNB Chain are detected from their transfer events and do not have this limitation.
- **BNB Chain** USDC and USDT use 18 decimals, not the 6 they use on most chains. Amounts in the API are in token units, so this matters only if you work with atomic amounts.
- **Robinhood Chain** has no USDC; its dollar stablecoin is USDG.
- `token` accepts the symbol or the contract address or coin type from these tables, and thru stores the symbol.

---

Related: [payments](https://docs.thru.la/payments.md) · [credit-topups](https://docs.thru.la/credit-topups.md) · [quickstart](https://docs.thru.la/quickstart.md)
