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

# Supported chains and tokens

> Available source chains, destination chains, and tokens for deposits.

export const chainTokenSymbols = chain => {
  const lists = [chain.depositTokens, chain.supportedTokens].filter(Boolean);
  if (lists.some(l => l === 'all')) return 'All';
  const symbols = [...new Set(lists.flatMap(l => l.map(t => t.symbol)))];
  return symbols.join(', ') || '-';
};

export const DepositChainsTable = ({chains}) => <table className="min-w-full">
    <thead>
      <tr className="border-b border-gray-200 dark:border-gray-700">
        <th className="text-left py-2 pr-4 font-semibold">Name</th>
        <th className="text-center py-2 pr-4 font-semibold">Source</th>
        <th className="text-center py-2 pr-4 font-semibold">Destination</th>
        <th className="text-left py-2 font-semibold">Tokens</th>
      </tr>
    </thead>
    <tbody>
      {chains.map(chain => <tr key={chain.id} className="border-b border-gray-100 dark:border-gray-800">
          <td className="py-2 pr-4">{chain.name}</td>
          <td className="py-2 pr-4 text-center">{chain.deposit ? '✓' : '—'}</td>
          <td className="py-2 pr-4 text-center">{chain.destination ? '✓' : '—'}</td>
          <td className="py-2">{chainTokenSymbols(chain)}</td>
        </tr>)}
    </tbody>
  </table>;

export const DepositChains = () => {
  const [chains, setChains] = React.useState([]);
  const [loading, setLoading] = React.useState(true);
  const [error, setError] = React.useState(null);
  React.useEffect(() => {
    fetch("https://v1.orchestrator.rhinestone.dev/deposit-processor/chains").then(res => {
      if (!res.ok) throw new Error('Failed to fetch chains');
      return res.json();
    }).then(data => {
      const byName = new Map();
      Object.entries(data).forEach(([id, chain]) => {
        const kept = byName.get(chain.name);
        const isCanonicalNamespace = !id.startsWith('eip155:');
        const keptIsSynthetic = kept?.id.startsWith('eip155:');
        if (!kept || isCanonicalNamespace && keptIsSynthetic) {
          byName.set(chain.name, {
            ...chain,
            id
          });
        }
      });
      setChains([...byName.values()].sort((a, b) => a.name.localeCompare(b.name)));
      setLoading(false);
    }).catch(err => {
      setError(err.message);
      setLoading(false);
    });
  }, []);
  if (loading) {
    return <div className="text-gray-500 dark:text-gray-400 py-4">Loading chains...</div>;
  }
  if (error) {
    return <div className="text-red-500 dark:text-red-400 py-4">Error loading chains: {error}</div>;
  }
  const mainnets = chains.filter(chain => !chain.testnet);
  const testnets = chains.filter(chain => chain.testnet);
  return <>
      <h3>Mainnet</h3>
      <DepositChainsTable chains={mainnets} />
      <h3>Testnet</h3>
      <DepositChainsTable chains={testnets} />
    </>;
};

Rhinestone Deposits supports a wide range of EVM chains plus Solana. Each chain is enabled as a **source** (the user can send funds to it), a **destination** (funds can settle on it), or both.

* **Source** — users can transfer tokens on this chain and have them bridged to the target.
* **Destination** — accounts on this chain can be registered as the target where funds land.
* **Tokens** — `All` means any token Rhinestone can route; otherwise, only the listed tokens are accepted.

<DepositChains />

<Info>
  This data is also available programmatically via the [List supported chains
  and tokens](/api-reference/deposit-service/utilities/list-supported-chains-and-tokens) endpoint.
</Info>
