> For the complete documentation index, see [llms.txt](https://docs.fonbnk.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.fonbnk.com/supported-countries-and-cryptocurrencies.md).

# Supported countries and cryptocurrencies

The countries, payment channels, carriers and assets that are live today.

{% hint style="warning" %}
This page is a snapshot for planning. The live answer is always [Get available currencies](/server-to-server/api-endpoints/get-available-currencies.md) — it reflects which providers are enabled and healthy right now, which this table cannot. Build against the endpoint, not against this page.
{% endhint %}

### Countries and payment channels

**On-ramp** means the user pays local currency. **Off-ramp** means the user receives it.

<table><thead><tr><th>Country</th><th>countryIsoCode</th><th>currencyIsoCode</th><th>On-ramp channels</th><th>Off-ramp channels</th><th width="260">Notes</th></tr></thead><tbody><tr><td>Nigeria</td><td>NG</td><td>NGN</td><td>bank</td><td>bank, airtime</td><td>On-ramp KYC needs a BVN on file — see KYC flow</td></tr><tr><td>Kenya</td><td>KE</td><td>KES</td><td>mobile_money</td><td>mobile_money, bank, paybill, buy_goods, airtime</td><td>paybill and buy_goods are off-ramp only</td></tr><tr><td>Ghana</td><td>GH</td><td>GHS</td><td>mobile_money</td><td>mobile_money, airtime</td><td></td></tr><tr><td>South Africa</td><td>ZA</td><td>ZAR</td><td>bank</td><td>bank, airtime</td><td>Bank transfers can take up to two business days, so a Friday order may only settle Monday or Tuesday. Currently the only country where off-ramp KYC is switched on. The live bank offer is <code>redirect</code>, not manual.</td></tr><tr><td>Tanzania</td><td>TZ</td><td>TZS</td><td>mobile_money</td><td>mobile_money, airtime</td><td></td></tr><tr><td>Uganda</td><td>UG</td><td>UGX</td><td>mobile_money</td><td>mobile_money, airtime</td><td></td></tr><tr><td>Zambia</td><td>ZM</td><td>ZMW</td><td>mobile_money</td><td>mobile_money, airtime</td><td></td></tr><tr><td>Brazil</td><td>BR</td><td>BRL</td><td>bank</td><td>bank</td><td></td></tr><tr><td>Philippines</td><td>PH</td><td>PHP</td><td>bank</td><td>bank</td><td></td></tr><tr><td>Ivory Coast</td><td>CI</td><td>XOF</td><td>mobile_money, digital_wallet</td><td>mobile_money, digital_wallet, airtime</td><td>Beta. Mobile money here is a <code>redirect</code> channel, not an STK push.</td></tr><tr><td>Senegal</td><td>SN</td><td>XOF</td><td>mobile_money, digital_wallet</td><td>mobile_money, digital_wallet, airtime</td><td>Beta</td></tr><tr><td>Benin</td><td>BJ</td><td>XOF</td><td>mobile_money</td><td>mobile_money, airtime</td><td></td></tr><tr><td>Burkina Faso</td><td>BF</td><td>XOF</td><td>mobile_money</td><td>mobile_money, airtime</td><td>Beta</td></tr><tr><td>Cameroon</td><td>CM</td><td>XAF</td><td>mobile_money</td><td>mobile_money, airtime</td><td></td></tr><tr><td>Gabon</td><td>GA</td><td>XAF</td><td>mobile_money</td><td>mobile_money</td><td>Beta</td></tr><tr><td>Republic of the Congo</td><td>CG</td><td>XAF</td><td>mobile_money</td><td>mobile_money</td><td></td></tr><tr><td>Democratic Republic of the Congo</td><td>CD</td><td>CDF</td><td>mobile_money</td><td>mobile_money</td><td>Beta</td></tr><tr><td>Gambia</td><td>GM</td><td>GMD</td><td>mobile_money, digital_wallet</td><td>mobile_money, digital_wallet</td><td>Beta</td></tr><tr><td>Rwanda</td><td>RW</td><td>RWF</td><td>—</td><td>airtime</td><td>Beta. Mobile money is configured but currently off</td></tr><tr><td>Malawi</td><td>MW</td><td>MWK</td><td>—</td><td>airtime</td><td>Beta</td></tr></tbody></table>

Things to note:

* **XOF and XAF are shared.** Several countries use the same currency code, so `currencyIsoCode` alone does not identify a country. Always send `countryIsoCode` too.
* **Airtime is off-ramp only, everywhere.** A user can be paid out in airtime; they cannot pay with it.
* **`digital_wallet` is a distinct channel** from `mobile_money`, and it is `redirect`-based. See [Fiat payment channels](/fiat-payment-channels.md).
* **Beta** means the country is live but young: fewer providers behind it, so an outage is more likely to take the whole country out rather than shift to another provider.
* A channel listed here can still answer `isDepositAllowed: false` at any moment if its provider is unhealthy. That is what the endpoint is for.

### Mobile carriers

The `code` column is what you pass as `carrierCode`. Mobile money, airtime and some digital wallet channels need it; bank does not. Some digital wallet offers carry no carriers at all.

| Country                    | Carrier codes                                      |
| -------------------------- | -------------------------------------------------- |
| Nigeria (NG)               | `ng_mtn`, `ng_airtel`, `ng_glo`, `ng_9mobile`      |
| Kenya (KE)                 | `ke_safaricom`, `ke_airtel`, `ke_telkom`           |
| Ghana (GH)                 | `gh_mtn`, `gh_vodafone`, `gh_airtel_tigo`          |
| South Africa (ZA)          | `za_vodacom`                                       |
| Tanzania (TZ)              | `tz_vodacom`, `tz_airtel`, `tz_tigo`, `tz_halotel` |
| Uganda (UG)                | `ug_mtn`, `ug_airtel`                              |
| Zambia (ZM)                | `zm_mtn`, `zm_airtel`, `zm_zamtel`                 |
| Ivory Coast (CI)           | `ci_mtn`, `ci_orange`, `ci_moov`, `ci_wave`        |
| Senegal (SN)               | `sn_orange`, `sn_expresso`, `sn_wave`              |
| Benin (BJ)                 | `bj_mtn`, `bj_moov`                                |
| Burkina Faso (BF)          | `bf_orange`, `bf_moov`                             |
| Cameroon (CM)              | `cm_mtn`, `cm_orange`                              |
| Gabon (GA)                 | `gb_airtel`                                        |
| Republic of the Congo (CG) | `cg_mtn`, `cg_airtel`                              |
| DR Congo (CD)              | `cd_vodacom`, `cd_orange`, `cd_airtel`             |
| Gambia (GM)                | `gm_africell`                                      |
| Rwanda (RW)                | `rw_mtn`, `rw_airtel`                              |
| Malawi (MW)                | `mw_airtel`, `mw_tnm`                              |

{% hint style="info" %}
Two traps in that table.

Gabon's carrier code really is `gb_airtel`, not `ga_airtel`. Send it exactly as the API returns it.

A carrier being configured for a country does not make it orderable. `sn_wave` is the current example: every Senegalese offer carrying it is switched off, so the live Senegalese wallet route does not use it. Take the carrier list from `carriers` on [Get available currencies](/server-to-server/api-endpoints/get-available-currencies.md), which is per channel, rather than from the country.
{% endhint %}

### Networks and assets

The `currencyCode` you pass to the API is `NETWORK_ASSET`, for example `POLYGON_USDT`.

| Network   | Assets                               |
| --------- | ------------------------------------ |
| ARBITRUM  | NATIVE, USDC, USDT                   |
| AVALANCHE | NATIVE, USDC, USDT                   |
| BASE      | NATIVE, USDC, XDUS                   |
| BNB       | NATIVE, USDC, USDT                   |
| CELO      | NATIVE, CUSD, USDC, USDT, CKES, CGHS |
| ETHEREUM  | NATIVE, USDC, USDT, RLUSD, XDUS      |
| LISK      | USDT                                 |
| OPTIMISM  | NATIVE, USDC, USDT                   |
| POLYGON   | NATIVE, USDC, USDT, XDUS             |
| SOLANA    | NATIVE, USDC, USDT                   |
| STELLAR   | NATIVE, USDC                         |
| TEMPO     | PATHUSD, USDC\_E                     |
| TON       | NATIVE, USDT, USDE                   |
| TRON      | NATIVE, USDT                         |
| XRP       | RLUSD                                |

`NATIVE` is the network's own coin — ETH on Ethereum, SOL on Solana, CELO on Celo, and so on. It has no contract address.

Almost every pair works in both directions, on-ramp and off-ramp. Two do not, as things stand:

* **STELLAR\_NATIVE** cannot be paid out, so it is off-ramp only — a user can sell XLM but not buy it.
* **TEMPO\_USDC\_E** cannot be deposited, so it is on-ramp only — a user can buy it but not sell it.

Both are one flag away from changing in either direction, which is the argument for reading `isDepositAllowed` and `isPayoutAllowed` per pair instead of trusting a list.

### Contract addresses

Production addresses. Sandbox uses different ones, so read `currencyDetails.contractAddress` from [Get available currencies](/server-to-server/api-endpoints/get-available-currencies.md) rather than hard-coding either set.

| currencyCode    | Contract                                                   |
| --------------- | ---------------------------------------------------------- |
| ARBITRUM\_USDC  | `0xaf88d065e77c8cC2239327C5EDb3A432268e5831`               |
| ARBITRUM\_USDT  | `0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9`               |
| AVALANCHE\_USDC | `0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E`               |
| AVALANCHE\_USDT | `0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7`               |
| BASE\_USDC      | `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`               |
| BASE\_XDUS      | `0x293d36b129F1E6538A036318499d83BD06eB17E9`               |
| BNB\_USDC       | `0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d`               |
| BNB\_USDT       | `0x55d398326f99059fF775485246999027B3197955`               |
| CELO\_CUSD      | `0x765DE816845861e75A25fCA122bb6898B8B1282a`               |
| CELO\_USDC      | `0xcebA9300f2b948710d2653dD7B07f33A8B32118C`               |
| CELO\_USDT      | `0x48065fbbe25f71c9282ddf5e1cd6d6a887483d5e`               |
| CELO\_CKES      | `0x456a3d042c0dbd3db53d5489e98dfb038553b0d0`               |
| CELO\_CGHS      | `0xfAeA5F3404bbA20D3cc2f8C4B0A888F55a3c7313`               |
| ETHEREUM\_USDC  | `0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48`               |
| ETHEREUM\_USDT  | `0xdac17f958d2ee523a2206206994597c13d831ec7`               |
| ETHEREUM\_RLUSD | `0x8292bb45bf1ee4d140127049757c2e0ff06317ed`               |
| ETHEREUM\_XDUS  | `0xa8719F9F4c23266a214112AAf4902c1000c02E7c`               |
| LISK\_USDT      | `0x05D032ac25d322df992303dCa074EE7392C117b9`               |
| OPTIMISM\_USDC  | `0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85`               |
| OPTIMISM\_USDT  | `0x94b008aA00579c1307B0EF2c499aD98a8ce58e58`               |
| POLYGON\_USDC   | `0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359`               |
| POLYGON\_USDT   | `0xc2132D05D31c914a87C6611C10748AEb04B58e8F`               |
| POLYGON\_XDUS   | `0xa8719F9F4c23266a214112AAf4902c1000c02E7c`               |
| SOLANA\_USDC    | `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v`             |
| SOLANA\_USDT    | `Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB`             |
| STELLAR\_USDC   | `GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN` |
| TEMPO\_PATHUSD  | `0x20c0000000000000000000000000000000000000`               |
| TEMPO\_USDC\_E  | `0x20c000000000000000000000b9537d11c60e8b50`               |
| TON\_USDT       | `EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs`         |
| TON\_USDE       | `EQAIb6KmdfdDR7CN1GBqVJuP25iCnLKCvBlJ07Evuu2dzP5f`         |
| TRON\_USDT      | `TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t`                       |
| XRP\_RLUSD      | `524C555344000000000000000000000000000000`                 |

{% hint style="info" %}
Some networks route by a memo or tag rather than by address alone — Stellar and TON are the ones the Pay Widget handles, via its `memo` [URL param](/widget-integration/url-params.md). Over the API, `blockchainMemo` is offered in `fieldsToCreateOrder` on every crypto payout; fill it in whenever the destination needs one. A transfer to an exchange without the right memo is usually unrecoverable.
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.fonbnk.com/supported-countries-and-cryptocurrencies.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
