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

# Polygon

> EVM asset identifiers, wallet registration, and offramp funding on Polygon.

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,
    avalanche: id => 'https://snowtrace.io/token/' + id
  };
  const CHAIN_LABEL = {
    stellar: 'Stellar',
    solana: 'Solana',
    monad: 'Monad',
    base: 'Base',
    polygon: 'Polygon',
    avalanche: 'Avalanche'
  };
  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/polygon.svg?fit=max&auto=format&n=XRSchVFGUgreQatD&q=85&s=a36e37d0817ee9af4811faee50b50459" alt="Polygon" width="64" noZoom style={{ float: "right", margin: "0 0 1rem 1.5rem" }} data-path="img/chains/polygon.svg" />

We support onramps and offramps on Polygon. Like Base, it is an EVM chain, so assets are plain ERC-20 contracts. The end-to-end flows are in the [Onramps](/v2/guides/testing-onramps) and [Offramps](/v2/guides/testing-offramps) guides.

## Supported operations

| Operation | Supported |
| - | - |
| Onramp (fiat → token) | ✓ |
| Offramp (token → fiat) | ✓ |
| Swap (token → token) | ✗ Swaps run on [Stellar](/v2/guides/chains/stellar), [Solana](/v2/guides/chains/solana) and [Monad](/v2/guides/chains/monad) |

We quote stablebonds on Polygon. Stablecoin (for example USDC) onramps and offramps run on Solana, Stellar and Monad.

## Asset identifiers

Polygon assets are identified by the **raw token contract address only**, for example `0xcC77c598d42f2f78Beb42C91d12B9d4041a5cE29`.

<Warning>
  **Do not prefix with a symbol.** A `SYMBOL:0x...` identifier (the Stellar-style format) fails on an EVM chain. Pass only the `0x...` address, the token's `asset` from [`GET /supported_assets?chain=polygon`](/v2/api-reference/assets/list-supported-assets).
</Warning>

## Stablebond addresses

Live token-contract addresses for every stablebond on Polygon, each linked to Polygonscan:

<ChainAssets chain="polygon" />

## Register a Polygon wallet

Register the wallet as a payment account with `accountDetails` of kind `address` and `chain` `polygon`. Set `$ORGANIZATION_ID` to the organization that owns the wallet: your own organization or a customer organization. See [Organizations in the route](/v2/overview#organizations-in-the-route).

```bash theme={null}
curl -X POST https://api.sand.etherfuse.com/organization/$ORGANIZATION_ID/payment_account \
  -H "Authorization: <api_key>" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "wallet",
    "label": "Polygon wallet",
    "accountDetails": {
      "kind": "address",
      "address": "0xf82567432381D1326484E5A9140ABCa4294f82D0",
      "chain": "polygon"
    }
  }'
```

Use the returned `id` as the `source` or `destination` of a [quote](/v2/api-reference/quotes/create-quote). An EVM address is valid on every EVM chain, so the account's `rails` can list more than one EVM chain. Set `sourceRail` or `destinationRail` to `polygon` in the quote to pick this chain.

## Offramps

On a Polygon offramp, the order's `fundingInstructions.rail` is `polygon`, and `fundingInstructions.destination` gives the `address` to send the token to. The source asset is an ERC-20 token. When `preparedTransaction` is present, its `transaction` is an unsigned EIP-1559 transaction, `0x`-prefixed hex, that calls the token's `transfer` from the customer's wallet. The customer signs it, submits it and pays the gas in POL. Otherwise, send the order's `source.amount` of `source.asset` to `address`. The prepared transaction uses the wallet's next nonce, so it goes stale if the wallet sends another transaction first. Then call [`POST /organization/{organizationId}/order/{id}/funding_instructions/refresh`](/v2/api-reference/orders/refresh-funding-instructions) and sign the new one. See [Offramps](/v2/guides/testing-offramps).

## Related

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

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


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.