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

# Supported currencies

> See which cryptocurrencies MoonPay supports for buying, selling, and MoonPay Gateway.

export const SupportedCurrencies = () => {
  const [selectedFilter, setSelectedFilter] = useState("All");
  const [currencies, setCurrencies] = useState([]);
  const usStatesMap = {
    AL: "Alabama",
    AK: "Alaska",
    AZ: "Arizona",
    AR: "Arkansas",
    CA: "California",
    CO: "Colorado",
    CT: "Connecticut",
    DE: "Delaware",
    FL: "Florida",
    GA: "Georgia",
    HI: "Hawaii",
    ID: "Idaho",
    IL: "Illinois",
    IN: "Indiana",
    IA: "Iowa",
    KS: "Kansas",
    KY: "Kentucky",
    LA: "Louisiana",
    ME: "Maine",
    MD: "Maryland",
    MA: "Massachusetts",
    MI: "Michigan",
    MN: "Minnesota",
    MS: "Mississippi",
    MO: "Missouri",
    MT: "Montana",
    NE: "Nebraska",
    NV: "Nevada",
    NH: "New Hampshire",
    NJ: "New Jersey",
    NM: "New Mexico",
    NY: "New York",
    NC: "North Carolina",
    ND: "North Dakota",
    OH: "Ohio",
    OK: "Oklahoma",
    OR: "Oregon",
    PA: "Pennsylvania",
    RI: "Rhode Island",
    SC: "South Carolina",
    SD: "South Dakota",
    TN: "Tennessee",
    TX: "Texas",
    UT: "Utah",
    VT: "Vermont",
    VA: "Virginia",
    VI: "Virgin Islands",
    WA: "Washington",
    WV: "West Virginia",
    WI: "Wisconsin",
    WY: "Wyoming"
  };
  const countriesMap = {
    US: "United States",
    GB: "United Kingdom",
    CA: "Canada",
    AT: "Austria",
    BE: "Belgium",
    BG: "Bulgaria",
    HR: "Croatia",
    CY: "Cyprus",
    CZ: "Czechia",
    DK: "Denmark",
    EE: "Estonia",
    FI: "Finland",
    FR: "France",
    DE: "Germany",
    GR: "Greece",
    HU: "Hungary",
    IS: "Iceland",
    IE: "Ireland",
    IT: "Italy",
    LV: "Latvia",
    LI: "Liechtenstein",
    LT: "Lithuania",
    LU: "Luxembourg",
    MT: "Malta",
    NL: "Netherlands",
    NO: "Norway",
    PL: "Poland",
    PT: "Portugal",
    RO: "Romania",
    SK: "Slovakia",
    SI: "Slovenia",
    ES: "Spain",
    SE: "Sweden"
  };
  const eeaCodes = ["AT", "BE", "BG", "HR", "CY", "CZ", "DK", "EE", "FI", "FR", "DE", "GR", "HU", "IS", "IE", "IT", "LV", "LI", "LT", "LU", "MT", "NL", "NO", "PL", "PT", "RO", "SK", "SI", "ES", "SE"];
  function isCurrencyAllowed(c, filter) {
    var rg = c.restrictedGeos;
    switch (filter) {
      case "All":
        return true;
      case "United States":
        return !rg.includes("United States");
      case "New York":
        return !rg.includes("New York") && !rg.includes("United States");
      case "Texas":
        return !rg.includes("Texas") && !rg.includes("United States");
      case "Canada":
        return !rg.includes("Canada");
      case "United Kingdom":
        return !rg.includes("United Kingdom");
      case "EEA":
        return !rg.includes("EEA");
      default:
        return true;
    }
  }
  useEffect(() => {
    let cryptoMetadata = [];
    fetch("https://api.moonpay.com/v3/crypto-currency-meta-data").then(response => response.json()).then(meta => {
      cryptoMetadata = meta;
      return fetch("https://api.moonpay.com/v3/currencies");
    }).then(response => response.json()).then(data => {
      var filtered = data.filter(c => c.type !== "fiat" && !c.isSuspended);
      const processedCurrencies = filtered.map(c => {
        var {code, name: rawName, isSellSupported, isSwapBaseSupported, isSwapQuoteSupported, notAllowedUSStates = [], notAllowedCountries = [], icon, metadata, isSupportedInUS} = c;
        var blockedStates = notAllowedUSStates.slice();
        var blockedCountries = notAllowedCountries.slice();
        if (isSupportedInUS === false || blockedCountries.includes("US")) {
          if (!blockedCountries.includes("US")) blockedCountries.push("US");
        }
        var hasEEA = blockedCountries.some(cc => eeaCodes.includes(cc));
        if (hasEEA) {
          blockedCountries = blockedCountries.filter(cc => !eeaCodes.includes(cc));
        }
        var restrictedGeos = [];
        blockedStates.forEach(s => {
          if (s !== "VI" && usStatesMap[s]) restrictedGeos.push(usStatesMap[s]);
        });
        blockedCountries.forEach(cc => {
          if (countriesMap[cc]) restrictedGeos.push(countriesMap[cc]);
        });
        if (hasEEA) restrictedGeos.push("EEA");
        restrictedGeos = restrictedGeos.filter((x, i, a) => x && a.indexOf(x) === i);
        if (restrictedGeos.includes("United States")) {
          restrictedGeos = restrictedGeos.filter(x => x !== "New York" && x !== "Texas");
        }
        var name = rawName;
        var match = cryptoMetadata.find(m => m.code === code.toLowerCase());
        var whitePaperLink = null;
        if (match?.whitePaperLink && match.whitePaperLink !== "n/a") {
          whitePaperLink = match.whitePaperLink;
          if (rawName.includes("Tether")) {
            whitePaperLink = "https://tether.to/public/Relevant_Information_Document_-_Tether_International,_S.A._de_C.V..pdf";
          }
        }
        return {
          code,
          name,
          icon,
          networkCode: metadata?.networkCode || "",
          isSellSupported,
          isSwapBaseSupported,
          isSwapQuoteSupported,
          restrictedGeos,
          hasEEA,
          whitePaperLink
        };
      });
      setCurrencies(processedCurrencies);
    }).catch(console.error);
  }, []);
  function myFunction() {
    var txt = document.getElementById("myInput").value.toUpperCase();
    document.querySelectorAll("#currencyTable tbody tr").forEach(row => {
      var show = Array.from(row.cells).some(td => td.textContent.toUpperCase().includes(txt));
      row.style.display = show ? "" : "none";
    });
  }
  const buttonClassName = "dark:bg-white bg-[#d3d3d3] text-black px-4 py-2 text-center text-sm pointer rounded-xl hover:bg-[#4CAF50] hover:text-black";
  return <div>
      <div className="mb-[20px] flex flex-wrap gap-[10px] justify-between">
        <button type="button" onClick={() => setSelectedFilter("All")} className={`${buttonClassName} ${selectedFilter === "All" ? "bg-[#4CAF50] dark:bg-[#4CAF50] text-white" : ""}`}>
          Show All
        </button>
        <button type="button" onClick={() => setSelectedFilter("United States")} className={`${buttonClassName} ${selectedFilter === "United States" ? "bg-[#4CAF50] dark:bg-[#4CAF50] text-white" : ""}`}>
          United States
        </button>
        <button type="button" onClick={() => setSelectedFilter("New York")} className={`${buttonClassName} ${selectedFilter === "New York" ? "bg-[#4CAF50] dark:bg-[#4CAF50] text-white" : ""}`}>
          New York
        </button>
        <button type="button" onClick={() => setSelectedFilter("Canada")} className={`${buttonClassName} ${selectedFilter === "Canada" ? "bg-[#4CAF50] dark:bg-[#4CAF50] text-white" : ""}`}>
          Canada
        </button>
        <button type="button" onClick={() => setSelectedFilter("United Kingdom")} className={`${buttonClassName} ${selectedFilter === "United Kingdom" ? "bg-[#4CAF50] dark:bg-[#4CAF50] text-white" : ""}`}>
          United Kingdom
        </button>
        <button type="button" onClick={() => setSelectedFilter("EEA")} className={`${buttonClassName} ${selectedFilter === "EEA" ? "bg-[#4CAF50] dark:bg-[#4CAF50] text-white" : ""}`}>
          EEA
        </button>
      </div>

      <input id="myInput" type="text" className="bg-[url('https://www.w3schools.com/css/searchicon.png')] w-full bg-position-left bg-no-repeat font-mono py-2 px-4 rounded-xl border-2 border-gray-300 dark:border-none" onKeyUp={myFunction} placeholder="Search for names.." />

      <div id="contentWrapper">
        <div id="myTable" className="h-[800px] overflow-y-auto relative z-[99999999]">
          <table id="currencyTable">
            <thead>
              <tr>
                <th className="sticky top-0 dark:text-white text-left">Code</th>
                <th className="sticky top-0 dark:text-white text-left">Name</th>
                <th className="sticky top-0 dark:text-white text-left">
                  Network
                </th>
                <th className="sticky top-0 dark:text-white text-left">Buy</th>
                <th className="sticky top-0 dark:text-white text-left">Sell</th>
                <th className="sticky top-0 dark:text-white text-left">
                  Convert Base
                </th>
                <th className="sticky top-0 text-white text-left">
                  Convert Quote
                </th>
                <th className="sticky top-0 text-white text-left">
                  Restricted Geos
                </th>
              </tr>
            </thead>
            <tbody>
              {currencies.filter(c => isCurrencyAllowed(c, selectedFilter)).map(c => {
    var displayName = c.name;
    if (selectedFilter === "EEA" && c.hasEEA) displayName += "*";
    var buy = "✅";
    var sell = c.isSellSupported ? "✅" : "❌";
    var sb = c.isSwapBaseSupported ? "✅" : "❌";
    var sq = c.isSwapQuoteSupported ? "✅" : "❌";
    if (selectedFilter === "Canada") {
      sell = "❌";
    }
    return <tr>
                      <td className="flex items-center gap-2">
                        <img src={c.icon} alt={c.code} style={{
      width: "20px",
      height: "20px"
    }} />
                        <div className="font-mono">{c.code.toUpperCase()}</div>
                      </td>
                      <td>
                        {displayName}{" "}
                        {c.whitePaperLink && <div>
                            <a href={c.whitePaperLink} target="_blank">
                              (White Paper)
                            </a>
                          </div>}
                      </td>
                      <td>
                        <span style={{
      textTransform: "uppercase"
    }}>
                          {c.networkCode}
                        </span>
                      </td>
                      <td>{buy}</td>
                      <td>{sell}</td>
                      <td>{sb}</td>
                      <td>{sq}</td>
                      <td>{c.restrictedGeos.join(", ") || "-"}</td>
                    </tr>;
  })}
            </tbody>
          </table>
        </div>
        {selectedFilter === "EEA" && <div id="explanationContainer">
            <div id="eeaExplanation">
              Assets tagged with an asterisk (*) indicate that the white paper
              does not appear to comply with all European regulatory
              requirements.
            </div>
          </div>}
      </div>
    </div>;
};

<Note>
  * Customers in Canada cannot purchase Stablecoins.
  * Availability of Sell subject to further geographic restrictions. Check your account for availability.
  * Learn about the [MiCA sustainability indicators](/widget/sustainability-transparency) of supported assets.
  * **EEA includes:** Austria, Belgium, Bulgaria, Croatia, Cyprus, Czechia, Denmark, Estonia, Finland, France, Germany, Greece, Hungary, Iceland, Ireland, Italy, Latvia, Liechtenstein, Lithuania, Luxembourg, Malta, Netherlands, Norway, Poland, Portugal, Romania, Slovakia, Slovenia, Spain, Sweden
</Note>

## On-ramp and off-ramp

The following table lists the cryptocurrencies available through MoonPay's
on-ramp and off-ramp products. Availability varies by region.

<SupportedCurrencies />

## MoonPay Gateway

Offer DeFi tokens through a single MoonPay checkout.

MoonPay Gateway lets customers purchase supported DeFi tokens directly with
fiat. Behind the scenes, MoonPay completes the on-ramp and swaps into the
selected token, delivering it to the customer's destination wallet. Partners
offer this as one integrated purchase flow without building wallet
provisioning, swap routing, or transaction-signing infrastructure.

Gateway supports tokens on **Solana, Ethereum, Base, and HyperCore**.

### Why use Gateway

* **Offer more assets:** Add supported DeFi tokens to your existing catalog
  alongside the cryptocurrencies available through MoonPay's standard on-ramp.
* **Keep the purchase simple:** Customers pay with fiat and receive the selected
  token without separately buying a bridge asset or completing a swap.
* **Reuse your integration:** Discover and quote DeFi tokens through the same
  Platform API and complete purchases with the existing MoonPay payment
  buttons.
* **Leave the infrastructure to MoonPay:** MoonPay provisions the intermediate
  wallet, executes the swap, and handles authorization securely inside the
  payment frame.

### How Gateway works

1. Use the [List assets](/api-reference/platform/endpoints/assets/list) endpoint
   to discover supported DeFi tokens alongside standard assets.
2. [Request a quote](/api-reference/platform/endpoints/quotes/get) using the
   token's CAIP-19 identifier. The quote includes the estimated token amount,
   fees, slippage, and required disclosures.
3. Present an existing MoonPay payment button. MoonPay completes the fiat
   purchase, securely authorizes the swap, and delivers the token to the
   customer's destination wallet.
4. Implement the required customer disclosures for Gateway purchases. See the
   [Gateway (DeFi tokens)](/platform/overview/going-live#gateway-defi-tokens)
   Going Live requirements.

The Gateway catalog changes as tokens and networks evolve. Use the List assets
endpoint as the source of truth instead of hardcoding availability.

See, for example, [Pay with the buy button](/platform/guides/pay-with-buy-button)
to integrate the checkout experience. Gateway purchases also work with
[Apple Pay](/platform/guides/pay-with-apple-pay) and
[Google Pay](/platform/guides/pay-with-google-pay).
