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

# Solana

> Asset identifiers, gas handling, and swap support on Solana.

export const ChainAssets = ({chain}) => {
  const {useState, useEffect} = React;
  const [rows, setRows] = useState(null);
  const [error, setError] = useState(null);
  const EXPLORER = {
    solana: id => 'https://solscan.io/token/' + id,
    stellar: id => 'https://stellar.expert/explorer/public/asset/' + id,
    base: id => 'https://basescan.org/token/' + id,
    polygon: id => 'https://polygonscan.com/token/' + id,
    monad: id => 'https://monadvision.com/token/' + id
  };
  const CHAIN_LABEL = {
    stellar: 'Stellar',
    solana: 'Solana',
    monad: 'Monad',
    base: 'Base',
    polygon: 'Polygon'
  };
  const tokenLogo = s => 'https://stablebonds.s3.us-west-2.amazonaws.com/stablebond/spl-' + String(s).toLowerCase() + '.png';
  const hideOnError = e => {
    e.currentTarget.style.display = 'none';
  };
  useEffect(() => {
    let cancelled = false;
    fetch('https://api.etherfuse.com/lookup/stablebonds').then(r => {
      if (!r.ok) throw new Error('HTTP ' + r.status);
      return r.json();
    }).then(data => {
      if (cancelled) return;
      setRows(data.stablebonds || []);
    }).catch(e => {
      if (!cancelled) setError(e.message || 'failed to load');
    });
    return () => {
      cancelled = true;
    };
  }, []);
  const border = '1px solid rgba(128,128,128,0.25)';
  const cell = {
    padding: '6px 12px',
    borderBottom: border,
    textAlign: 'left',
    verticalAlign: 'middle'
  };
  const head = {
    ...cell,
    fontWeight: 600
  };
  const mono = {
    fontFamily: 'monospace',
    fontSize: '0.85em',
    wordBreak: 'break-all'
  };
  const inline = {
    display: 'inline-flex',
    alignItems: 'center',
    gap: '6px'
  };
  if (error) return <p>
        Couldn't load the live list. See <code>GET /lookup/stablebonds</code>.
      </p>;
  if (!rows) return <p>Loading live addresses…</p>;
  const items = (rows || []).filter(b => b.symbol !== 'MEX').map(b => {
    const entry = (b.blockchains || []).find(c => c.blockchain === chain);
    return entry ? {
      symbol: b.symbol,
      currency: b.bondCurrency,
      id: entry.tokenIdentifier
    } : null;
  }).filter(Boolean).sort((a, z) => String(a.symbol).localeCompare(String(z.symbol)));
  if (!items.length) return <p>No stablebonds are currently live on {CHAIN_LABEL[chain] || chain}.</p>;
  return <div>
      <table style={{
    width: '100%',
    borderCollapse: 'collapse',
    fontSize: '0.95em'
  }}>
        <thead>
          <tr>
            <th style={{
    ...head,
    width: '160px'
  }}>Asset</th>
            <th style={head}>Address</th>
          </tr>
        </thead>
        <tbody>
          {items.map(it => {
    const url = EXPLORER[chain] ? EXPLORER[chain](it.id) : null;
    return <tr key={it.symbol}>
                <td style={cell}>
                  <span style={inline}>
                    <img src={tokenLogo(it.symbol)} alt="" width={20} height={20} onError={hideOnError} />
                    <strong>{it.symbol}</strong>
                    <span style={{
      opacity: 0.6
    }}>· {it.currency}</span>
                  </span>
                </td>
                <td style={{
      ...cell,
      ...mono
    }}>
                  {url ? <a href={url} target="_blank" rel="noreferrer">
                      {it.id}
                    </a> : it.id}
                </td>
              </tr>;
  })}
        </tbody>
      </table>
      <p style={{
    fontSize: '0.8em',
    opacity: 0.65,
    marginTop: '8px'
  }}>
        Live from <code>GET https://api.etherfuse.com/lookup/stablebonds</code>. Production addresses — when quoting,
        use the <code>identifier</code> from <code>GET /ramp/assets</code> (sandbox differs).
      </p>
    </div>;
};

<img src="https://mintcdn.com/etherfuse/XRSchVFGUgreQatD/img/chains/solana.svg?fit=max&auto=format&n=XRSchVFGUgreQatD&q=85&s=6018dc319aab06dfc6ee3da2de48c522" alt="Solana" width="64" noZoom style={{ float: "right", margin: "0 0 1rem 1.5rem" }} data-path="img/chains/solana.svg" />

Solana is fully supported for onramps, offramps, and swaps. Of the supported networks it has the lightest per-transaction setup — there are no trustlines, and the network fees are negligible. The end-to-end flows live in the [Onramps](/guides/testing-onramps), [Offramps](/guides/testing-offramps), and [Swaps](/guides/testing-swaps) guides.

## Supported operations

| Operation              | Supported |
| ---------------------- | --------- |
| Onramp (fiat → token)  | ✓         |
| Offramp (token → fiat) | ✓         |
| Swap (token → token)   | ✓         |

## Asset identifiers

Solana assets use the **Base58 mint address** — e.g. `AvvetPGuuB5FD5m86fpw3LtDKyQoUFT1mG9WarNQLW4q`.

<Tip>
  Read the mint from [`GET /ramp/assets?blockchain=solana`](/api-reference/assets/list-assets) (or the public [`GET /lookup/stablebonds`](/api-reference/lookup/list-stablebonds)) rather than hardcoding it — mints differ between sandbox and production.
</Tip>

## Stablebond addresses

Live mint accounts for every stablebond on Solana, each linked to Solscan:

<ChainAssets chain="solana" />

## Wallet & gas

There's no trustline or account-reserve step on Solana, and associated token accounts are created as part of the transaction Etherfuse builds. Network fees are a tiny fraction of a cent, so there's no per-wallet funding requirement to plan for.

## Swaps: read the webhook payload, not the status sequence

Swap progress is delivered over the `swap_updated` webhook. **Which intermediate statuses fire varies by chain** — for example, Solana may not emit a distinct `funds_received` update the way some other chains do. Drive your logic off the **fields in the payload**, not off assuming a specific status will arrive:

* `sendTransaction` is present while you still need to send funds; once the funds are received it's dropped from the payload.
* On completion you get `sendTransactionHash` (your send) and `receiveTransactionHash` (Etherfuse's delivery to you).

See [Swaps](/guides/testing-swaps) and [Webhooks](/webhooks) for the full payload semantics.

## Related

<CardGroup cols={3}>
  <Card title="Onramps" icon="arrow-up-right-dots" href="/guides/testing-onramps" />

  <Card title="Offramps" icon="arrow-down" href="/guides/testing-offramps" />

  <Card title="Swaps" icon="right-left" href="/guides/testing-swaps" />
</CardGroup>
