> ## 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 and selling, with regional availability notes.

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">#</th>
                <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](/docs/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>

## Cryptocurrencies

<SupportedCurrencies />
